summaryrefslogtreecommitdiffstats
path: root/camera/exynos_exif.c
diff options
context:
space:
mode:
Diffstat (limited to 'camera/exynos_exif.c')
-rw-r--r--camera/exynos_exif.c54
1 files changed, 29 insertions, 25 deletions
diff --git a/camera/exynos_exif.c b/camera/exynos_exif.c
index 0f6c4f1..bb97a17 100644
--- a/camera/exynos_exif.c
+++ b/camera/exynos_exif.c
@@ -133,8 +133,8 @@ int exynos_exif_attributes_create_gps(struct exynos_camera *exynos_camera,
return 0;
}
- gps_latitude = (long) (gps_latitude_float * 10000) / 1;
- gps_longitude = (long) (gps_longitude_float * 10000) / 1;
+ gps_latitude = (long) (gps_latitude_float * 10000000) / 1;
+ gps_longitude = (long) (gps_longitude_float * 10000000) / 1;
gps_altitude = (long) (gps_altitude_float * 100) / 1;
gps_timestamp = (long) gps_timestamp_int;
@@ -159,26 +159,26 @@ int exynos_exif_attributes_create_gps(struct exynos_camera *exynos_camera,
exif_attributes->gps_altitude_ref = 1;
- gps_latitude_abs = fabs(gps_latitude / 10000.0);
- gps_longitude_abs = fabs(gps_longitude / 10000.0);
- gps_altitude_abs = fabs(gps_altitude / 100.0);
+ gps_latitude_abs = fabs(gps_latitude);
+ gps_longitude_abs = fabs(gps_longitude);
+ gps_altitude_abs = fabs(gps_altitude);
exif_attributes->gps_latitude[0].num = (uint32_t) gps_latitude_abs;
- exif_attributes->gps_latitude[0].den = 1;
+ exif_attributes->gps_latitude[0].den = 10000000;
exif_attributes->gps_latitude[1].num = 0;
exif_attributes->gps_latitude[1].den = 1;
exif_attributes->gps_latitude[2].num = 0;
exif_attributes->gps_latitude[2].den = 1;
exif_attributes->gps_longitude[0].num = (uint32_t) gps_longitude_abs;
- exif_attributes->gps_longitude[0].den = 1;
+ exif_attributes->gps_longitude[0].den = 10000000;
exif_attributes->gps_longitude[1].num = 0;
exif_attributes->gps_longitude[1].den = 1;
exif_attributes->gps_longitude[2].num = 0;
exif_attributes->gps_longitude[2].den = 1;
exif_attributes->gps_altitude.num = (uint32_t) gps_altitude_abs;
- exif_attributes->gps_altitude.den = 1;
+ exif_attributes->gps_altitude.den = 100;
gmtime_r(&gps_timestamp, &time_info);
@@ -207,6 +207,7 @@ int exynos_exif_attributes_create_params(struct exynos_camera *exynos_camera,
int exposure_time;
int iso_speed;
int exposure;
+ int flash_results;
int rc;
@@ -274,6 +275,13 @@ int exynos_exif_attributes_create_params(struct exynos_camera *exynos_camera,
exif_attributes->iso_speed_rating = iso_speed;
+ rc = exynos_v4l2_g_ctrl(exynos_camera, 0, V4L2_CID_CAMERA_EXIF_FLASH,
+ &flash_results);
+ if (rc < 0)
+ ALOGE("%s: g ctrl failed!", __func__);
+
+ exif_attributes->flash = flash_results;
+
rc = exynos_v4l2_g_ctrl(exynos_camera, 0, V4L2_CID_CAMERA_EXIF_BV,
(int *) &bv);
if (rc < 0) {
@@ -330,11 +338,6 @@ bv_ioctl:
break;
}
- if (exynos_camera->flash_mode == FLASH_MODE_BASE)
- exif_attributes->flash = EXIF_DEF_FLASH;
- else
- exif_attributes->flash = exynos_camera->flash_mode;
-
if (exynos_camera->whitebalance == WHITE_BALANCE_AUTO ||
exynos_camera->whitebalance == WHITE_BALANCE_BASE)
exif_attributes->white_balance = EXIF_WB_AUTO;
@@ -394,7 +397,7 @@ int exynos_exif_write_data(void *exif_data, unsigned short tag,
*offset += count * length;
} else {
memcpy(pointer, data, count * length);
- pointer += count * length;
+ pointer += 4;
}
size = (int) pointer - (int) exif_data;
@@ -412,7 +415,7 @@ int exynos_exif_create(struct exynos_camera *exynos_camera,
unsigned char exif_marker[] = { 0x45, 0x78, 0x69, 0x66, 0x00, 0x00 };
unsigned char tiff_marker[] = { 0x49, 0x49, 0x2A, 0x00, 0x08, 0x00, 0x00, 0x00 };
- unsigned char user_comment_code[] = { 0x00, 0x00, 0x00, 0x49, 0x49, 0x43, 0x53, 0x41 };
+ unsigned char user_comment_code[] = { 0x41, 0x53, 0x43, 0x49, 0x49, 0x0, 0x0, 0x0 };
unsigned char exif_ascii_prefix[] = { 0x41, 0x53, 0x43, 0x49, 0x49, 0x0, 0x0, 0x0 };
camera_memory_t *exif_data_memory;
@@ -553,7 +556,7 @@ int exynos_exif_create(struct exynos_camera *exynos_camera,
pointer += count;
count = exynos_exif_write_data(pointer, EXIF_TAG_EXIF_VERSION,
- EXIF_TYPE_UNDEFINED, 1, NULL, NULL, &exif_attributes->exif_version, sizeof(exif_attributes->exif_version));
+ EXIF_TYPE_UNDEFINED, 4, NULL, NULL, &exif_attributes->exif_version, sizeof(char));
pointer += count;
count = exynos_exif_write_data(pointer, EXIF_TAG_DATE_TIME_ORG,
@@ -617,15 +620,15 @@ int exynos_exif_create(struct exynos_camera *exynos_camera,
pointer += count;
count = exynos_exif_write_data(pointer, EXIF_TAG_EXPOSURE_MODE,
- EXIF_TYPE_LONG, 1, NULL, NULL, &exif_attributes->exposure_mode, sizeof(exif_attributes->exposure_mode));
+ EXIF_TYPE_SHORT, 1, NULL, NULL, &exif_attributes->exposure_mode, sizeof(exif_attributes->exposure_mode));
pointer += count;
count = exynos_exif_write_data(pointer, EXIF_TAG_WHITE_BALANCE,
- EXIF_TYPE_LONG, 1, NULL, NULL, &exif_attributes->white_balance, sizeof(exif_attributes->white_balance));
+ EXIF_TYPE_SHORT, 1, NULL, NULL, &exif_attributes->white_balance, sizeof(exif_attributes->white_balance));
pointer += count;
count = exynos_exif_write_data(pointer, EXIF_TAG_SCENCE_CAPTURE_TYPE,
- EXIF_TYPE_LONG, 1, NULL, NULL, &exif_attributes->scene_capture_type, sizeof(exif_attributes->scene_capture_type));
+ EXIF_TYPE_SHORT, 1, NULL, NULL, &exif_attributes->scene_capture_type, sizeof(exif_attributes->scene_capture_type));
pointer += count;
value = 0;
@@ -651,11 +654,11 @@ int exynos_exif_create(struct exynos_camera *exynos_camera,
offset += NUM_SIZE + value * IFD_SIZE + OFFSET_SIZE;
count = exynos_exif_write_data(pointer, EXIF_TAG_GPS_VERSION_ID,
- EXIF_TYPE_LONG, 4, NULL, NULL, &exif_attributes->gps_version_id, 1);
+ EXIF_TYPE_BYTE, 4, NULL, NULL, &exif_attributes->gps_version_id, sizeof(char));
pointer += count;
count = exynos_exif_write_data(pointer, EXIF_TAG_GPS_LATITUDE_REF,
- EXIF_TYPE_ASCII, 2, NULL, NULL, &exif_attributes->gps_latitude_ref, 1);
+ EXIF_TYPE_ASCII, 2, NULL, NULL, &exif_attributes->gps_latitude_ref, sizeof(char));
pointer += count;
count = exynos_exif_write_data(pointer, EXIF_TAG_GPS_LATITUDE,
@@ -663,14 +666,15 @@ int exynos_exif_create(struct exynos_camera *exynos_camera,
pointer += count;
count = exynos_exif_write_data(pointer, EXIF_TAG_GPS_LONGITUDE_REF,
- EXIF_TYPE_ASCII, 2, NULL, NULL, &exif_attributes->gps_longitude_ref, 1);
+ EXIF_TYPE_ASCII, 2, NULL, NULL, &exif_attributes->gps_longitude_ref, sizeof(char));
pointer += count;
count = exynos_exif_write_data(pointer, EXIF_TAG_GPS_LONGITUDE,
EXIF_TYPE_RATIONAL, 3, &offset, exif_ifd_start, &exif_attributes->gps_longitude, sizeof(exif_attributes->gps_longitude[0]));
+ pointer += count;
count = exynos_exif_write_data(pointer, EXIF_TAG_GPS_ALTITUDE_REF,
- EXIF_TYPE_BYTE, 1, NULL, NULL, &exif_attributes->gps_altitude_ref, 1);
+ EXIF_TYPE_BYTE, 1, NULL, NULL, &exif_attributes->gps_altitude_ref, sizeof(char));
pointer += count;
count = exynos_exif_write_data(pointer, EXIF_TAG_GPS_ALTITUDE,
@@ -690,7 +694,7 @@ int exynos_exif_create(struct exynos_camera *exynos_camera,
memcpy((void *) ((int) data + (int) sizeof(exif_ascii_prefix)), exif_attributes->gps_processing_method, value);
count = exynos_exif_write_data(pointer, EXIF_TAG_GPS_PROCESSING_METHOD,
- EXIF_TYPE_UNDEFINED, value + sizeof(exif_ascii_prefix), &offset, exif_ifd_start, data, 1);
+ EXIF_TYPE_UNDEFINED, value + sizeof(exif_ascii_prefix), &offset, exif_ifd_start, data, sizeof(char));
pointer += count;
free(data);
@@ -729,7 +733,7 @@ int exynos_exif_create(struct exynos_camera *exynos_camera,
pointer += count;
count = exynos_exif_write_data(pointer, EXIF_TAG_COMPRESSION_SCHEME,
- EXIF_TYPE_LONG, 1, NULL, NULL, &exif_attributes->compression_scheme, sizeof(exif_attributes->compression_scheme));
+ EXIF_TYPE_SHORT, 1, NULL, NULL, &exif_attributes->compression_scheme, sizeof(exif_attributes->compression_scheme));
pointer += count;
count = exynos_exif_write_data(pointer, EXIF_TAG_ORIENTATION,