From acb2ec192bfac5e147edfc765679abf6fba93129 Mon Sep 17 00:00:00 2001 From: Minje Ahn Date: Fri, 31 Jan 2020 08:49:21 +0900 Subject: [PATCH] Code cleanup 1. Improve image metadata extraction function 2. Reduce function call related to metadata of integer type 3. Separate GPS metadata extraction function (ExifTag enum set issue) Change-Id: I664bb02c3b0180abe9145f2a74561e59c159763c Signed-off-by: Minje Ahn (cherry picked from commit a542c2927bebb242a31a63c65b51333524036411) --- src/common/media-svc-util.c | 274 +++++++++++++++++--------------------------- 1 file changed, 106 insertions(+), 168 deletions(-) diff --git a/src/common/media-svc-util.c b/src/common/media-svc-util.c index 1035042..742998c 100644 --- a/src/common/media-svc-util.c +++ b/src/common/media-svc-util.c @@ -187,89 +187,94 @@ static int __media_svc_split_to_double(char *input, double *arr) return MS_MEDIA_ERR_NONE; } -static int __media_svc_get_exif_info(ExifData *ed, char *buf, int *i_value, double *d_value, long tagtype) +/* GPS information is not ExifTag member */ +static int __media_svc_get_exif_gps_double(ExifData *ed, double *value, long tagtype) { + int ret = MS_MEDIA_ERR_NONE; ExifEntry *entry; - ExifTag tag; - - if (ed == NULL) - return MS_MEDIA_ERR_INVALID_PARAMETER; + char gps_buf[MEDIA_SVC_METADATA_LEN_MAX + 1] = {0, }; + double tmp_arr[3] = { 0.0, 0.0, 0.0 }; - tag = tagtype; + media_svc_retv_if(!ed, MS_MEDIA_ERR_INVALID_PARAMETER); + media_svc_retv_if(!value, MS_MEDIA_ERR_INVALID_PARAMETER); - entry = exif_data_get_entry(ed, tag); + entry = exif_data_get_entry(ed, tagtype); if (entry) { - /* Get the contents of the tag in human-readable form */ - if (tag == EXIF_TAG_ORIENTATION || - tag == EXIF_TAG_PIXEL_X_DIMENSION || - tag == EXIF_TAG_PIXEL_Y_DIMENSION || - tag == EXIF_TAG_ISO_SPEED_RATINGS) { - - if (i_value == NULL) { - media_svc_debug("i_value is NULL"); - return MS_MEDIA_ERR_INVALID_PARAMETER; - } - - ExifByteOrder mByteOrder = exif_data_get_byte_order(ed); - short exif_value = exif_get_short(entry->data, mByteOrder); - *i_value = (int)exif_value; - - } else if (tag == EXIF_TAG_GPS_LATITUDE || tag == EXIF_TAG_GPS_LONGITUDE || tag == EXIF_TAG_GPS_ALTITUDE) { - - if (d_value == NULL) { - media_svc_debug("d_value is NULL"); - return MS_MEDIA_ERR_INVALID_PARAMETER; - } - - /* Get the contents of the tag in human-readable form */ - char gps_buf[MEDIA_SVC_METADATA_LEN_MAX + 1] = {0, }; - exif_entry_get_value(entry, gps_buf, sizeof(gps_buf)); - gps_buf[strlen(gps_buf)] = '\0'; - int ret = MS_MEDIA_ERR_NONE; - - double tmp_arr[3] = { 0.0, 0.0, 0.0 }; + exif_entry_get_value(entry, gps_buf, sizeof(gps_buf)); + gps_buf[strlen(gps_buf)] = '\0'; - ret = __media_svc_split_to_double(gps_buf, tmp_arr); - media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret); + ret = __media_svc_split_to_double(gps_buf, tmp_arr); + media_svc_retv_if(ret != MS_MEDIA_ERR_NONE, ret); - *d_value = tmp_arr[0] + tmp_arr[1] / 60 + tmp_arr[2] / 3600; - } else if (tag == EXIF_TAG_EXPOSURE_TIME) { - - if (buf == NULL) { - media_svc_debug("buf is NULL"); - return MS_MEDIA_ERR_INVALID_PARAMETER; - } - - ExifByteOrder mByteOrder = exif_data_get_byte_order(ed); - ExifRational mRational = exif_get_rational(entry->data, mByteOrder); - long numerator = mRational.numerator; - long denominator = mRational.denominator; - snprintf(buf, MEDIA_SVC_METADATA_LEN_MAX, "%ld/%ld", numerator, denominator); - - } else if (tag == EXIF_TAG_FNUMBER) { + *value = tmp_arr[0] + tmp_arr[1] / 60 + tmp_arr[2] / 3600; + } - if (d_value == NULL) { - media_svc_debug("d_value is NULL"); - return MS_MEDIA_ERR_INVALID_PARAMETER; - } + return MS_MEDIA_ERR_NONE; +} - ExifByteOrder mByteOrder = exif_data_get_byte_order(ed); - ExifRational mRational = exif_get_rational(entry->data, mByteOrder); - long numerator = mRational.numerator; - long denominator = mRational.denominator; +static int __media_svc_get_exif_gps_str(ExifData *ed, char *value, long tagtype) +{ + ExifEntry *entry; - *d_value = ((numerator*1.0)/(denominator*1.0)); + media_svc_retv_if(!ed, MS_MEDIA_ERR_INVALID_PARAMETER); + media_svc_retv_if(!value, MS_MEDIA_ERR_INVALID_PARAMETER); - } else { + entry = exif_data_get_entry(ed, tagtype); + if (entry) { + exif_entry_get_value(entry, value, MEDIA_SVC_METADATA_LEN_MAX); + value[strlen(value)] = '\0'; + } - if (buf == NULL) { - media_svc_debug("buf is NULL"); - return MS_MEDIA_ERR_INVALID_PARAMETER; - } + return MS_MEDIA_ERR_NONE; +} - exif_entry_get_value(entry, buf, MEDIA_SVC_METADATA_LEN_MAX); - buf[strlen(buf)] = '\0'; - } +static int __media_svc_get_exif_info(ExifData *ed, char *buf, int *i_value, double *d_value, ExifTag tagtype) +{ + ExifEntry *entry; + ExifByteOrder mByteOrder; + ExifRational mRational; + long numerator, denominator; + + media_svc_retv_if(!ed, MS_MEDIA_ERR_INVALID_PARAMETER); + + entry = exif_data_get_entry(ed, tagtype); + media_svc_retv_if(!entry, MS_MEDIA_ERR_NONE); + + switch (tagtype) { + case EXIF_TAG_ORIENTATION: + case EXIF_TAG_PIXEL_X_DIMENSION: + case EXIF_TAG_PIXEL_Y_DIMENSION: + case EXIF_TAG_ISO_SPEED_RATINGS: + media_svc_retvm_if(!i_value, MS_MEDIA_ERR_INVALID_PARAMETER, "i_value is NULL"); + + mByteOrder = exif_data_get_byte_order(ed); + short exif_value = exif_get_short(entry->data, mByteOrder); + *i_value = (int)exif_value; + break; + case EXIF_TAG_EXPOSURE_TIME: + media_svc_retvm_if(!buf, MS_MEDIA_ERR_INVALID_PARAMETER, "buf is NULL"); + + mByteOrder = exif_data_get_byte_order(ed); + mRational = exif_get_rational(entry->data, mByteOrder); + numerator = mRational.numerator; + denominator = mRational.denominator; + snprintf(buf, MEDIA_SVC_METADATA_LEN_MAX, "%ld/%ld", numerator, denominator); + break; + case EXIF_TAG_FNUMBER: + media_svc_retvm_if(!d_value, MS_MEDIA_ERR_INVALID_PARAMETER, "d_value is NULL"); + + mByteOrder = exif_data_get_byte_order(ed); + mRational = exif_get_rational(entry->data, mByteOrder); + numerator = mRational.numerator; + denominator = mRational.denominator; + + *d_value = ((numerator*1.0)/(denominator*1.0)); + break; + default: + media_svc_retvm_if(!buf, MS_MEDIA_ERR_INVALID_PARAMETER, "buf is NULL"); + + exif_entry_get_value(entry, buf, MEDIA_SVC_METADATA_LEN_MAX); + buf[strlen(buf)] = '\0'; } return MS_MEDIA_ERR_NONE; @@ -1030,23 +1035,20 @@ int _media_svc_extract_image_metadata(media_svc_content_info_s *content_info) content_info->media_meta.height = 0; memset(buf, 0x00, sizeof(buf)); - if (__media_svc_get_exif_info(ed, NULL, NULL, &value, EXIF_TAG_GPS_LATITUDE) == MS_MEDIA_ERR_NONE) { - if (__media_svc_get_exif_info(ed, buf, NULL, NULL, EXIF_TAG_GPS_LATITUDE_REF) == MS_MEDIA_ERR_NONE) { - if (strlen(buf) > 0) { - if (strcmp(buf, "S") == 0) - value = -1 * value; - } + if (__media_svc_get_exif_gps_double(ed, &value, EXIF_TAG_GPS_LATITUDE) == MS_MEDIA_ERR_NONE) { + if (__media_svc_get_exif_gps_str(ed, buf, EXIF_TAG_GPS_LATITUDE_REF) == MS_MEDIA_ERR_NONE) { + if (!g_strcmp0(buf, "S")) + value *= -1; content_info->media_meta.latitude = value; } } memset(buf, 0x00, sizeof(buf)); - if (__media_svc_get_exif_info(ed, NULL, NULL, &value, EXIF_TAG_GPS_LONGITUDE) == MS_MEDIA_ERR_NONE) { - if (__media_svc_get_exif_info(ed, buf, NULL, NULL, EXIF_TAG_GPS_LONGITUDE_REF) == MS_MEDIA_ERR_NONE) { - if (strlen(buf) > 0) { - if (strcmp(buf, "W") == 0) - value = -1 * value; - } + if (__media_svc_get_exif_gps_double(ed, &value, EXIF_TAG_GPS_LONGITUDE) == MS_MEDIA_ERR_NONE) { + if (__media_svc_get_exif_gps_str(ed, buf, EXIF_TAG_GPS_LONGITUDE_REF) == MS_MEDIA_ERR_NONE) { + if (!g_strcmp0(buf, "W")) + value *= -1; + content_info->media_meta.longitude = value; } } @@ -1133,7 +1135,8 @@ int _media_svc_extract_image_metadata(media_svc_content_info_s *content_info) content_info->media_meta.height = exif_height; } - if (ed != NULL) exif_data_unref(ed); + if (ed) + exif_data_unref(ed); GET_WIDTH_HEIGHT: @@ -1217,9 +1220,7 @@ int _media_svc_extract_music_metadata_for_update(media_svc_content_info_s *conte if (mmf_error == FILEINFO_ERROR_NONE && size > 0) content_info->media_meta.copyright = g_strdup(p); - mmf_error = mm_file_destroy_tag_attrs(tag); - if (mmf_error != FILEINFO_ERROR_NONE) - media_svc_error("fail to free tag attr - err(%x)", mmf_error); + mm_file_destroy_tag_attrs(tag); return MS_MEDIA_ERR_NONE; } @@ -1466,94 +1467,31 @@ int _media_svc_extract_media_metadata(sqlite3 *handle, bool is_direct, media_svc else mmf_error = mm_file_create_content_attrs_simple(&content, content_info->path); - if (mmf_error == FILEINFO_ERROR_NONE) { - /*Common attribute*/ - mmf_error = mm_file_get_attrs(content, MM_FILE_CONTENT_DURATION, &content_info->media_meta.duration, NULL); - if (mmf_error != FILEINFO_ERROR_NONE) { - media_svc_debug("fail to get duration attr - err(%x)", mmf_error); - } else { - /*media_svc_debug("duration : %d", content_info->media_meta.duration); */ - } - - /*Sound/Music attribute*/ - if ((content_info->media_type == MEDIA_SVC_MEDIA_TYPE_SOUND) || (content_info->media_type == MEDIA_SVC_MEDIA_TYPE_MUSIC)) { - - mmf_error = mm_file_get_attrs(content, MM_FILE_CONTENT_AUDIO_BITRATE, &content_info->media_meta.bitrate, NULL); - if (mmf_error != FILEINFO_ERROR_NONE) { - media_svc_debug("fail to get audio bitrate attr - err(%x)", mmf_error); - } else { - /*media_svc_debug("bit rate : %d", content_info->media_meta.bitrate); */ - } - - mmf_error = mm_file_get_attrs(content, MM_FILE_CONTENT_AUDIO_SAMPLERATE, &content_info->media_meta.samplerate, NULL); - if (mmf_error != FILEINFO_ERROR_NONE) { - media_svc_debug("fail to get sample rate attr - err(%x)", mmf_error); - } else { - /*media_svc_debug("sample rate : %d", content_info->media_meta.samplerate); */ - } - - mmf_error = mm_file_get_attrs(content, MM_FILE_CONTENT_AUDIO_CHANNELS, &content_info->media_meta.channel, NULL); - if (mmf_error != FILEINFO_ERROR_NONE) { - media_svc_debug("fail to get audio channels attr - err(%x)", mmf_error); - } else { - /*media_svc_debug("channel : %d", content_info->media_meta.channel); */ - } - - mmf_error = mm_file_get_attrs(content, MM_FILE_CONTENT_AUDIO_BITPERSAMPLE, &content_info->media_meta.bitpersample, NULL); - if (mmf_error != FILEINFO_ERROR_NONE) { - media_svc_debug("fail to get audio bit per sample attr - err(%x)", mmf_error); - } else { - media_svc_debug("bitpersample : %d", content_info->media_meta.bitpersample); - } - } else if (content_info->media_type == MEDIA_SVC_MEDIA_TYPE_VIDEO) { /*Video attribute*/ - int audio_bitrate = 0; - int video_bitrate = 0; - - mmf_error = mm_file_get_attrs(content, MM_FILE_CONTENT_AUDIO_BITRATE, &audio_bitrate, NULL); - if (mmf_error != FILEINFO_ERROR_NONE) { - media_svc_debug("fail to get audio bitrate attr - err(%x)", mmf_error); - } else { - /*media_svc_debug("audio bit rate : %d", audio_bitrate); */ - } + media_svc_retvm_if(mmf_error != FILEINFO_ERROR_NONE, MS_MEDIA_ERR_NONE, "mm_file_create_content_attrs failed"); - mmf_error = mm_file_get_attrs(content, MM_FILE_CONTENT_VIDEO_BITRATE, &video_bitrate, NULL); - if (mmf_error != FILEINFO_ERROR_NONE) { - media_svc_debug("fail to get audio bitrate attr - err(%x)", mmf_error); - } else { - /*media_svc_debug("video bit rate : %d", video_bitrate); */ - } + if (content_info->media_type == MEDIA_SVC_MEDIA_TYPE_VIDEO) { + int audio_bitrate = 0; + int video_bitrate = 0; - content_info->media_meta.bitrate = audio_bitrate + video_bitrate; - - mmf_error = mm_file_get_attrs(content, MM_FILE_CONTENT_VIDEO_WIDTH, &content_info->media_meta.width, NULL); - if (mmf_error != FILEINFO_ERROR_NONE) { - media_svc_debug("fail to get video width attr - err(%x)", mmf_error); - } else { - /*media_svc_debug("width : %d", content_info->media_meta.width); */ - } + mm_file_get_attrs(content, MM_FILE_CONTENT_DURATION, &content_info->media_meta.duration, + MM_FILE_CONTENT_AUDIO_BITRATE, &audio_bitrate, + MM_FILE_CONTENT_VIDEO_BITRATE, &video_bitrate, + MM_FILE_CONTENT_VIDEO_WIDTH, &content_info->media_meta.width, + MM_FILE_CONTENT_VIDEO_HEIGHT, &content_info->media_meta.height, + NULL); - mmf_error = mm_file_get_attrs(content, MM_FILE_CONTENT_VIDEO_HEIGHT, &content_info->media_meta.height, NULL); - if (mmf_error != FILEINFO_ERROR_NONE) { - media_svc_debug("fail to get video height attr - err(%x)", mmf_error); - } else { - /*media_svc_debug("height : %d", content_info->media_meta.height); */ - } - } else { - media_svc_error("Not support type"); - mmf_error = mm_file_destroy_content_attrs(content); - if (mmf_error != FILEINFO_ERROR_NONE) - media_svc_error("fail to free content attr - err(%x)", mmf_error); - - return MS_MEDIA_ERR_INVALID_PARAMETER; - } - - mmf_error = mm_file_destroy_content_attrs(content); - if (mmf_error != FILEINFO_ERROR_NONE) - media_svc_error("fail to free content attr - err(%x)", mmf_error); + content_info->media_meta.bitrate = audio_bitrate + video_bitrate; } else { - media_svc_error("error in mm_file_create_content_attrs [%d]", mmf_error); + mm_file_get_attrs(content, MM_FILE_CONTENT_DURATION, &content_info->media_meta.duration, + MM_FILE_CONTENT_AUDIO_BITRATE, &content_info->media_meta.bitrate, + MM_FILE_CONTENT_AUDIO_SAMPLERATE, &content_info->media_meta.samplerate, + MM_FILE_CONTENT_AUDIO_CHANNELS, &content_info->media_meta.channel, + MM_FILE_CONTENT_AUDIO_BITPERSAMPLE, &content_info->media_meta.bitpersample, + NULL); } + mm_file_destroy_content_attrs(content); + return MS_MEDIA_ERR_NONE; } -- 2.7.4