- ret = mm_camcorder_get_attributes(handle, NULL, MMCAM_TAG_GPS_ENABLE, &gps_enable, NULL);
- if (ret == MM_ERROR_NONE && gps_enable) {
- ExifByte GpsVersion[4]={2,2,0,0};
-
- _mmcam_dbg_log("Tag for GPS is ENABLED.");
-
- ret = mm_exif_set_add_entry(ed, EXIF_IFD_GPS, EXIF_TAG_GPS_VERSION_ID,
- EXIF_FORMAT_BYTE, 4, (unsigned char *)&GpsVersion);
- if (ret != MM_ERROR_NONE) {
- EXIF_SET_ERR(ret, EXIF_TAG_GPS_VERSION_ID);
- }
-
- /*41. Latitude*/
- ret = mm_camcorder_get_attributes(handle, &err_name,
- MMCAM_TAG_LATITUDE, &f_latitude,
- MMCAM_TAG_LONGITUDE, &f_longitude,
- MMCAM_TAG_ALTITUDE, &f_altitude, NULL);
- if (ret != MM_ERROR_NONE) {
- _mmcam_dbg_err("failed to get gps info [%x][%s]", ret, err_name);
- SAFE_FREE(err_name);
- goto exit;
- }
-
- _mmcam_dbg_log("f_latitude [%f]", f_latitude);
- if (f_latitude != INVALID_GPS_VALUE) {
- unsigned char *b = NULL;
- unsigned int deg;
- unsigned int min;
- unsigned int sec;
- ExifRational rData;
-
- if (f_latitude < 0) {
- ret = mm_exif_set_add_entry(ed, EXIF_IFD_GPS, EXIF_TAG_GPS_LATITUDE_REF,
- EXIF_FORMAT_ASCII, 2, (unsigned char *)"S");
- if (ret != MM_ERROR_NONE) {
- EXIF_SET_ERR(ret, EXIF_TAG_GPS_LATITUDE_REF);
- }
- f_latitude = -f_latitude;
- } else if (f_latitude > 0) {
- ret = mm_exif_set_add_entry(ed, EXIF_IFD_GPS, EXIF_TAG_GPS_LATITUDE_REF,
- EXIF_FORMAT_ASCII, 2, (unsigned char *)"N");
- if (ret != MM_ERROR_NONE) {
- EXIF_SET_ERR(ret, EXIF_TAG_GPS_LATITUDE_REF);
- }
- }
-
- deg = (unsigned int)(f_latitude);
- min = (unsigned int)((f_latitude-deg)*60);
- sec = (unsigned int)(((f_latitude-deg)*3600)-min*60);
-
- _mmcam_dbg_log("f_latitude deg[%d], min[%d], sec[%d]", deg, min, sec);
- b = malloc(3 * sizeof(ExifRational));
- if (b) {
- rData.numerator = deg;
- rData.denominator = 1;
- exif_set_rational(b, exif_data_get_byte_order(ed), rData);
- rData.numerator = min;
- exif_set_rational(b+8, exif_data_get_byte_order(ed), rData);
- rData.numerator = sec;
- exif_set_rational(b+16, exif_data_get_byte_order(ed), rData);
-
- ret = mm_exif_set_add_entry(ed, EXIF_IFD_GPS, EXIF_TAG_GPS_LATITUDE,
- EXIF_FORMAT_RATIONAL, 3, (unsigned char *)b);
- free(b);
- if (ret != MM_ERROR_NONE) {
- EXIF_SET_ERR(ret, EXIF_TAG_GPS_LATITUDE);
- }
- } else {
- _mmcam_dbg_warn("malloc failed");
- }
- }
-
- /*42. Longitude*/
- _mmcam_dbg_log("f_longitude [%f]", f_longitude);
- if (f_longitude != INVALID_GPS_VALUE) {
- unsigned char *b = NULL;
- unsigned int deg;
- unsigned int min;
- unsigned int sec;
- ExifRational rData;
-
- if (f_longitude < 0) {
- ret = mm_exif_set_add_entry(ed, EXIF_IFD_GPS, EXIF_TAG_GPS_LONGITUDE_REF,
- EXIF_FORMAT_ASCII, 2, (unsigned char *)"W");
- if (ret != MM_ERROR_NONE) {
- EXIF_SET_ERR(ret, EXIF_TAG_GPS_LONGITUDE_REF);
- }
- f_longitude = -f_longitude;
- } else if (f_longitude > 0) {
- ret = mm_exif_set_add_entry(ed, EXIF_IFD_GPS, EXIF_TAG_GPS_LONGITUDE_REF,
- EXIF_FORMAT_ASCII, 2, (unsigned char *)"E");
- if (ret != MM_ERROR_NONE) {
- EXIF_SET_ERR(ret, EXIF_TAG_GPS_LONGITUDE_REF);
- }
- }
-
- deg = (unsigned int)(f_longitude);
- min = (unsigned int)((f_longitude-deg)*60);
- sec = (unsigned int)(((f_longitude-deg)*3600)-min*60);
-
- _mmcam_dbg_log("f_longitude deg[%d], min[%d], sec[%d]", deg, min, sec);
- b = malloc(3 * sizeof(ExifRational));
- if (b) {
- rData.numerator = deg;
- rData.denominator = 1;
- exif_set_rational(b, exif_data_get_byte_order(ed), rData);
- rData.numerator = min;
- exif_set_rational(b+8, exif_data_get_byte_order(ed), rData);
- rData.numerator = sec;
- exif_set_rational(b+16, exif_data_get_byte_order(ed), rData);
- ret = mm_exif_set_add_entry(ed, EXIF_IFD_GPS, EXIF_TAG_GPS_LONGITUDE,
- EXIF_FORMAT_RATIONAL, 3, (unsigned char *)b);
- free(b);
- if (ret != MM_ERROR_NONE) {
- EXIF_SET_ERR(ret, EXIF_TAG_GPS_LONGITUDE);
- }
- } else {
- _mmcam_dbg_warn("malloc failed");
- }
- }
-
- /*43. Altitude*/
- _mmcam_dbg_log("f_altitude [%f]", f_altitude);
- if (f_altitude != INVALID_GPS_VALUE) {
- ExifByte alt_ref = 0;
- unsigned char *b = NULL;
- ExifRational rData;
- b = malloc(sizeof(ExifRational));
- if (b) {
- if (f_altitude < 0) {
- alt_ref = 1;
- f_altitude = -f_altitude;
- }
-
- ret = mm_exif_set_add_entry(ed, EXIF_IFD_GPS, EXIF_TAG_GPS_ALTITUDE_REF,
- EXIF_FORMAT_BYTE, 1, (unsigned char *)&alt_ref);
- if (ret != MM_ERROR_NONE) {
- _mmcam_dbg_err("error [%x], tag [%x]", ret, EXIF_TAG_GPS_ALTITUDE_REF);
- if (ret == MM_ERROR_CAMCORDER_LOW_MEMORY) {
- free(b);
- b = NULL;
- goto exit;
- }
- }
-
- rData.numerator = (unsigned int)(f_altitude + 0.5)*100;
- rData.denominator = 100;
- exif_set_rational(b, exif_data_get_byte_order(ed), rData);
- ret = mm_exif_set_add_entry(ed, EXIF_IFD_GPS, EXIF_TAG_GPS_ALTITUDE,
- EXIF_FORMAT_RATIONAL, 1, (unsigned char *)b);
- free(b);
- if (ret != MM_ERROR_NONE) {
- EXIF_SET_ERR(ret, EXIF_TAG_GPS_ALTITUDE);
- }
- } else {
- _mmcam_dbg_warn("malloc failed");
- }
- }
-
- /*44. EXIF_TAG_GPS_TIME_STAMP*/
- {
- double gps_timestamp = INVALID_GPS_VALUE;
- mm_camcorder_get_attributes(handle, NULL, "tag-gps-time-stamp", &gps_timestamp, NULL);
- _mmcam_dbg_log("Gps timestamp [%f]", gps_timestamp);
- if (gps_timestamp > 0.0) {
- unsigned char *b = NULL;
- unsigned int hour;
- unsigned int min;
- unsigned int microsec;
- ExifRational rData;
-
- hour = (unsigned int)(gps_timestamp / 3600);
- min = (unsigned int)((gps_timestamp - 3600 * hour) / 60);
- microsec = (unsigned int)(((double)((double)gps_timestamp -(double)(3600 * hour)) -(double)(60 * min)) * 1000000);
-
- _mmcam_dbg_log("Gps timestamp hour[%d], min[%d], microsec[%d]", hour, min, microsec);
- b = malloc(3 * sizeof(ExifRational));
- if (b) {
- rData.numerator = hour;
- rData.denominator = 1;
- exif_set_rational(b, exif_data_get_byte_order(ed), rData);
-
- rData.numerator = min;
- rData.denominator = 1;
- exif_set_rational(b + 8, exif_data_get_byte_order(ed), rData);
-
- rData.numerator = microsec;
- rData.denominator = 1000000;
- exif_set_rational(b + 16, exif_data_get_byte_order(ed), rData);
-
- ret = mm_exif_set_add_entry(ed, EXIF_IFD_GPS, EXIF_TAG_GPS_TIME_STAMP,
- EXIF_FORMAT_RATIONAL, 3, b);
- free(b);
- if (ret != MM_ERROR_NONE) {
- EXIF_SET_ERR(ret, EXIF_TAG_GPS_TIME_STAMP);
- }
- } else {
- _mmcam_dbg_warn( "malloc failed." );
- }
- }
- }
-
- /*45. EXIF_TAG_GPS_DATE_STAMP*/
- {
- unsigned char *date_stamp = NULL;
- int date_stamp_len = 0;
-
- mm_camcorder_get_attributes(handle, NULL, "tag-gps-date-stamp", &date_stamp, &date_stamp_len, NULL);
-
- if (date_stamp) {
- _mmcam_dbg_log("Date stamp [%s]", date_stamp);
-
- /* cause it should include NULL char */
- ret = mm_exif_set_add_entry(ed, EXIF_IFD_GPS, EXIF_TAG_GPS_DATE_STAMP,
- EXIF_FORMAT_ASCII, date_stamp_len + 1, date_stamp);
- if (ret != MM_ERROR_NONE) {
- EXIF_SET_ERR(ret, EXIF_TAG_GPS_DATE_STAMP);
- }
- }
- }
-
- /*46. EXIF_TAG_GPS_PROCESSING_METHOD */
- {
- unsigned char *processing_method = NULL;
- int processing_method_len = 0;
-
- mm_camcorder_get_attributes(handle, NULL, "tag-gps-processing-method", &processing_method, &processing_method_len, NULL);
-
- if (processing_method) {
- _mmcam_dbg_log("Processing method [%s]", processing_method);
-
- ret = mm_exif_set_add_entry(ed, EXIF_IFD_GPS, EXIF_TAG_GPS_PROCESSING_METHOD,
- EXIF_FORMAT_UNDEFINED, processing_method_len, processing_method);
- if (ret != MM_ERROR_NONE) {
- EXIF_SET_ERR(ret, EXIF_TAG_GPS_PROCESSING_METHOD);
- }
- }
- }
- } else {
- _mmcam_dbg_log( "Tag for GPS is DISABLED." );
- }
-
-
- /*47. EXIF_TAG_MAKER_NOTE*/
- ret = mm_exif_set_add_entry(ed, EXIF_IFD_EXIF, EXIF_TAG_MAKER_NOTE,
- EXIF_FORMAT_UNDEFINED, 8, (unsigned char *)"SAMSUNG");
- if (ret != MM_ERROR_NONE) {
- EXIF_SET_ERR(ret, EXIF_TAG_MAKER_NOTE);
- }
-
- /* create and link samsung maker note */
- ret = mm_exif_mnote_create(ed);
- if (ret != MM_ERROR_NONE){
- EXIF_SET_ERR(ret, EXIF_TAG_MAKER_NOTE);
- } else {
- _mmcam_dbg_log("Samsung makernote created");
-
- /* add samsung maker note entries (param : data, tag, index, subtag index1, subtag index2) */
- ret = mm_exif_mnote_set_add_entry(ed, MNOTE_SAMSUNG_TAG_MNOTE_VERSION, 0, _MNOTE_VALUE_NONE, _MNOTE_VALUE_NONE);
- if (ret != MM_ERROR_NONE) {
- _mmcam_dbg_err("mm_exif_mnote_set_add_entry error! [%x]", ret);
- }
- /*
- ret = mm_exif_mnote_set_add_entry(ed, MNOTE_SAMSUNG_TAG_DEVICE_ID, 2, _MNOTE_VALUE_NONE, _MNOTE_VALUE_NONE);
- if (ret != MM_ERROR_NONE) {
- _mmcam_dbg_err("mm_exif_mnote_set_add_entry error! [%x]", ret);
- }
-
- ret = mm_exif_mnote_set_add_entry(ed, MNOTE_SAMSUNG_TAG_SERIAL_NUM, _MNOTE_VALUE_NONE, _MNOTE_VALUE_NONE, _MNOTE_VALUE_NONE);
- if (ret != MM_ERROR_NONE) {
- _mmcam_dbg_err("mm_exif_mnote_set_add_entry error! [%x]", ret);
- }
-
- ret = mm_exif_mnote_set_add_entry(ed, MNOTE_SAMSUNG_TAG_COLOR_SPACE, 1, _MNOTE_VALUE_NONE, _MNOTE_VALUE_NONE);
- if (ret != MM_ERROR_NONE) {
- _mmcam_dbg_err("mm_exif_mnote_set_add_entry error! [%x]", ret);
- }
- */
- ret = mm_exif_mnote_set_add_entry(ed, MNOTE_SAMSUNG_TAG_FACE_DETECTION, 0, _MNOTE_VALUE_NONE, _MNOTE_VALUE_NONE);
- if (ret != MM_ERROR_NONE) {
- _mmcam_dbg_err("mm_exif_mnote_set_add_entry error! ret=%x", ret);
- }
- /*
- ret = mm_exif_mnote_set_add_entry(ed, MNOTE_SAMSUNG_TAG_MODEL_ID, _MNOTE_VALUE_NONE, 3, 2);
- if (ret != MM_ERROR_NONE) {
- _mmcam_dbg_err("mm_exif_mnote_set_add_entry error! [%x]", ret);
- }
- */
- }