Code refactoring 98/189598/2 accepted/tizen/5.0/unified/20181102.013512 accepted/tizen/unified/20180920.063832 submit/tizen/20180919.063447 submit/tizen_5.0/20181101.000002
authorhj kim <backto.kim@samsung.com>
Wed, 19 Sep 2018 05:52:53 +0000 (14:52 +0900)
committerhj kim <backto.kim@samsung.com>
Wed, 19 Sep 2018 06:06:41 +0000 (15:06 +0900)
Change-Id: Id176b97081d51452420743bf9680c91e88db85b1

include/metadata_extractor_private.h
src/metadata_extractor.c

index a26fe52..fd9a03c 100755 (executable)
@@ -32,6 +32,7 @@ extern "C" {
 #define LOG_TAG "CAPI_MEDIA_METADATA_EXTRACTOR"
 
 #define SAFE_FREE(src)      { if (src) {free(src); src = NULL; } }
+#define ME_STRING_VALID(str)   ((str != NULL && strlen(str) > 0) ? TRUE : FALSE)
 
 #define metadata_extractor_debug(fmt, arg...) do { \
                LOGD(""fmt"", ##arg);     \
index 51b7a96..2de7779 100755 (executable)
@@ -23,7 +23,6 @@
 
 #define META_MAX_LEN   256
 
-
 typedef enum {
        METADATA_TYPE_STREAM    = 0,
        METADATA_TYPE_ATTR,
@@ -37,78 +36,12 @@ static int __metadata_extractor_create_tag_attr(metadata_extractor_s *metadata,
 static int __metadata_extractor_create_content_attrs_from_buffer(metadata_extractor_s *metadata, const void *buffer, int size);
 static int __metadata_extractor_create_tag_attrs_from_buffer(metadata_extractor_s *metadata, const void *buffer, int size);
 static int __metadata_extractor_get_artwork(metadata_extractor_s *metadata, void **artwork, int *artwork_size);
-static int __metadata_extractor_get_artwork_mime(metadata_extractor_s *metadata, char **artwork_mime);
 static int __metadata_extractor_get_video_thumbnail(metadata_extractor_s *metadata, void **thumbnail, int *thumbnail_len);
-static int __metadata_extractor_get_duration(metadata_extractor_s *metadata, int *duration);
-static int __metadata_extractor_get_audio_bitrate(metadata_extractor_s *metadata, int *bitrate);
-static int __metadata_extractor_get_audio_channel(metadata_extractor_s *metadata, int *channel);
-static int __metadata_extractor_get_audio_samplerate(metadata_extractor_s *metadata, int *samplerate);
 static int __metadata_extractor_get_audio_track_count(metadata_extractor_s *metadata, int *track_cnt);
-static int __metadata_extractor_get_video_bitrate(metadata_extractor_s *metadata, int *bitrate);
-static int __metadata_extractor_get_video_FPS(metadata_extractor_s *metadata, int *fps);
-static int __metadata_extractor_get_video_width(metadata_extractor_s *metadata, int *width);
-static int __metadata_extractor_get_video_height(metadata_extractor_s *metadata, int *height);
 static int __metadata_extractor_get_video_track_count(metadata_extractor_s *metadata, int *track_cnt);
-static int __metadata_extractor_get_artist(metadata_extractor_s *metadata, char **artist);
-static int __metadata_extractor_get_title(metadata_extractor_s *metadata, char **title);
-static int __metadata_extractor_get_album(metadata_extractor_s *metadata, char **album);
-static int __metadata_extractor_get_album_artist(metadata_extractor_s *metadata, char **album_artist);
-static int __metadata_extractor_get_genre(metadata_extractor_s *metadata, char **genre);
-static int __metadata_extractor_get_author(metadata_extractor_s *metadata, char **author);
-static int __metadata_extractor_get_copyright(metadata_extractor_s *metadata, char **copyright);
-static int __metadata_extractor_get_date(metadata_extractor_s *metadata, char **date);
-static int __metadata_extractor_get_description(metadata_extractor_s *metadata, char **description);
-static int __metadata_extractor_get_comment(metadata_extractor_s *metadata, char **comment);
-static int __metadata_extractor_get_track_num(metadata_extractor_s *metadata, char **track_num);
-static int __metadata_extractor_get_classification(metadata_extractor_s *metadata, char **classification);
-static int __metadata_extractor_get_rating(metadata_extractor_s *metadata, char **rating);
-static int __metadata_extractor_get_longitude(metadata_extractor_s *metadata, double *longitude);
-static int __metadata_extractor_get_latitude(metadata_extractor_s *metadata, double *latitude);
-static int __metadata_extractor_get_altitude(metadata_extractor_s *metadata, double *altitude);
-static int __metadata_extractor_get_conductor(metadata_extractor_s *metadata, char **conductor);
-static int __metadata_extractor_get_unsynclyrics(metadata_extractor_s *metadata, char **unsynclyrics);
-static int __metadata_extractor_get_recording_date(metadata_extractor_s *metadata, char **rec_date);
-static int __metadata_extractor_get_rotate(metadata_extractor_s *metadata, char **rotate);
-static int __metadata_extractor_get_synclyrics_pair_num(metadata_extractor_s *metadata, int *synclyrics_num);
 static int __metadata_extractor_destroy_handle(metadata_extractor_s *metadata);
 static int __metadata_extractor_get_audio_codec(metadata_extractor_s *metadata, char **audio_codec);
 static int __metadata_extractor_get_video_codec(metadata_extractor_s *metadata, char **video_codec);
-static int __metadata_extractor_get_is_360(metadata_extractor_s *metadata, int *is_360);
-
-#ifdef SUPPORT_GSPHERICAL_METADATA
-static int __metadata_extractor_get_is_stitched_v1(metadata_extractor_s *metadata, int *is_stitched);
-static int __metadata_extractor_get_projection_type_v1(metadata_extractor_s *metadata, char **projection_type);
-static int __metadata_extractor_get_stitching_software_v1(metadata_extractor_s *metadata, char **stitching_software);
-static int __metadata_extractor_get_stereo_mode_v1(metadata_extractor_s *metadata, char **stereo_mode);
-static int __metadata_extractor_get_source_count_v1(metadata_extractor_s *metadata, int *source_count);
-static int __metadata_extractor_get_initial_view_heading_degrees_v1(metadata_extractor_s *metadata, int32_t *initial_view_heading_degrees);
-static int __metadata_extractor_get_initial_view_pitch_degrees_v1(metadata_extractor_s *metadata, int32_t *initial_view_pitch_degrees);
-static int __metadata_extractor_get_initial_view_roll_degrees_v1(metadata_extractor_s *metadata, int32_t *initial_view_roll_degrees);
-static int __metadata_extractor_get_timestamp_v1(metadata_extractor_s *metadata, int *timestamp);
-static int __metadata_extractor_get_full_pano_width_pixels_v1(metadata_extractor_s *metadata, int *full_pano_width_pixels);
-static int __metadata_extractor_get_full_pano_height_pixels_v1(metadata_extractor_s *metadata, int *full_pano_height_pixels);
-static int __metadata_extractor_get_cropped_area_image_width_v1(metadata_extractor_s *metadata, int *cropped_area_image_width);
-static int __metadata_extractor_get_cropped_area_image_height_v1(metadata_extractor_s *metadata, int *cropped_area_image_height);
-static int __metadata_extractor_get_cropped_area_left_v1(metadata_extractor_s *metadata, int *cropped_area_left);
-static int __metadata_extractor_get_cropped_area_top_v1(metadata_extractor_s *metadata, int *cropped_area_top);
-
-static int __metadata_extractor_get_stereo_mode_v2(metadata_extractor_s *metadata, int *stereo_mode_v2);
-static int __metadata_extractor_get_proj_type_v2(metadata_extractor_s *metadata, int *proj_type_v2);
-static int __metadata_extractor_get_metadata_source_v2(metadata_extractor_s *metadata, char **metadata_source_v2);
-static int __metadata_extractor_get_pose_yaw_degrees_v2(metadata_extractor_s *metadata, int *pose_yaw_degrees_v2);
-static int __metadata_extractor_get_pose_pitch_degrees_v2(metadata_extractor_s *metadata, int *pose_pitch_degrees_v2);
-static int __metadata_extractor_get_pose_roll_degrees_v2(metadata_extractor_s *metadata, int *pose_roll_degrees_v2);
-static int __metadata_extractor_get_cbmp_layout_v2(metadata_extractor_s *metadata, int *cbmp_layout_v2);
-static int __metadata_extractor_get_cbmp_padding_v2(metadata_extractor_s *metadata, int *cbmp_padding_v2);
-static int __metadata_extractor_get_equi_projection_bounds_top_v2(metadata_extractor_s *metadata, int *equi_projection_bounds_top_v2);
-static int __metadata_extractor_get_equi_projection_bounds_bottom_v2(metadata_extractor_s *metadata, int *equi_projection_bounds_bottom_v2);
-static int __metadata_extractor_get_equi_projection_bounds_left_v2(metadata_extractor_s *metadata, int *equi_projection_bounds_left_v2);
-static int __metadata_extractor_get_equi_projection_bounds_right_v2(metadata_extractor_s *metadata, int *equi_projection_bounds_right_v2);
-
-static int __metadata_extractor_get_ambisonic_type(metadata_extractor_s *metadata, int *ambisonic_type);
-static int __metadata_extractor_get_ambisonic_format(metadata_extractor_s *metadata, int *ambisonic_format);
-static int __metadata_extractor_get_ambisonic_order(metadata_extractor_s *metadata, int *ambisonic_order);
-#endif
 
 static int __metadata_extractor_check_and_extract_meta(metadata_extractor_s *metadata, metadata_extractor_type_e metadata_type)
 {
@@ -161,1285 +94,401 @@ static int __metadata_extractor_check_and_extract_meta(metadata_extractor_s *met
        } else {
                metadata_extractor_error("INVALID_PARAMETER(%d)", metadata_type);
                return METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER;
-       }
-
-       return ret;
-}
-
-static int __metadata_extractor_get_stream_info(metadata_extractor_s *metadata, const char *path)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       int _audio_track_cnt = 0;
-       int _video_track_cnt = 0;
-
-       ret = mm_file_get_stream_info(path, &_audio_track_cnt, &_video_track_cnt);
-
-       if (ret != FILEINFO_ERROR_NONE) {
-               if (ret == FILEINFO_ERROR_FILE_NOT_FOUND) {
-                       metadata_extractor_error("FILE_NOT_EXISTS(0x%08x)", METADATA_EXTRACTOR_ERROR_FILE_EXISTS);
-                       return METADATA_EXTRACTOR_ERROR_FILE_EXISTS;
-               } else {
-                       metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
-                       return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
-               }
-       }
-
-       metadata->audio_track_cnt = _audio_track_cnt;
-       metadata->video_track_cnt = _video_track_cnt;
-
-       return ret;
-}
-
-static int __metadata_extractor_create_content_attrs(metadata_extractor_s *metadata, const char *path)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       MMHandleType content = 0;
-       char *err_attr_name = NULL;
-
-       int _audio_track_cnt = 0;
-       int _video_track_cnt = 0;
-
-       ret = mm_file_create_content_attrs(&content, path);
-
-       if (ret != FILEINFO_ERROR_NONE) {
-               if (ret == FILEINFO_ERROR_FILE_NOT_FOUND) {
-                       metadata_extractor_error("FILE_NOT_EXISTS(0x%08x)", METADATA_EXTRACTOR_ERROR_FILE_EXISTS);
-                       return METADATA_EXTRACTOR_ERROR_FILE_EXISTS;
-               } else {
-                       metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
-                       return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
-               }
-       }
-
-       ret = mm_file_get_attrs(content, &err_attr_name,
-                                       MM_FILE_CONTENT_VIDEO_TRACK_COUNT, &_video_track_cnt,
-                                       MM_FILE_CONTENT_AUDIO_TRACK_COUNT, &_audio_track_cnt,
-                                       NULL);
-
-       if (ret != FILEINFO_ERROR_NONE) {
-               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
-               SAFE_FREE(err_attr_name);
-               mm_file_destroy_content_attrs(content);
-               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
-       }
-
-       metadata->attr_h = content;
-       metadata->audio_track_cnt = _audio_track_cnt;
-       metadata->video_track_cnt = _video_track_cnt;
-
-       return ret;
-
-}
-
-
-static int __metadata_extractor_create_tag_attr(metadata_extractor_s *metadata, const char *path)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       MMHandleType tag = 0;
-
-       ret = mm_file_create_tag_attrs(&tag, path);
-
-       if (ret != FILEINFO_ERROR_NONE) {
-               if (ret == FILEINFO_ERROR_FILE_NOT_FOUND) {
-                       metadata_extractor_error("FILE_NOT_EXISTS(0x%08x)", METADATA_EXTRACTOR_ERROR_FILE_EXISTS);
-                       return METADATA_EXTRACTOR_ERROR_FILE_EXISTS;
-               } else {
-                       metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
-                       return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
-               }
-       }
-
-       metadata->tag_h = tag;
-
-       return ret;
-
-}
-
-static int __metadata_extractor_create_content_attrs_from_buffer(metadata_extractor_s *metadata, const void *buffer, int size)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       MMHandleType content = 0;
-       char *err_attr_name = NULL;
-
-       int _audio_track_cnt = 0;
-       int _video_track_cnt = 0;
-
-       ret = mm_file_create_content_attrs_from_memory(&content, buffer, size, 0);
-
-       if (ret != FILEINFO_ERROR_NONE) {
-               if (ret == FILEINFO_ERROR_FILE_NOT_FOUND) {
-                       metadata_extractor_error("FILE_NOT_EXISTS(0x%08x)", METADATA_EXTRACTOR_ERROR_FILE_EXISTS);
-                       return METADATA_EXTRACTOR_ERROR_FILE_EXISTS;
-               } else {
-                       metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
-                       return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
-               }
-       }
-
-       ret = mm_file_get_attrs(content, &err_attr_name,
-                                       MM_FILE_CONTENT_VIDEO_TRACK_COUNT, &_video_track_cnt,
-                                       MM_FILE_CONTENT_AUDIO_TRACK_COUNT, &_audio_track_cnt,
-                                       NULL);
-
-       if (ret != FILEINFO_ERROR_NONE) {
-               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
-               SAFE_FREE(err_attr_name);
-               mm_file_destroy_content_attrs(content);
-               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
-       }
-
-       metadata->attr_h = content;
-       metadata->audio_track_cnt = _audio_track_cnt;
-       metadata->video_track_cnt = _video_track_cnt;
-
-       return ret;
-
-}
-
-static int __metadata_extractor_create_tag_attrs_from_buffer(metadata_extractor_s *metadata, const void *buffer, int size)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       MMHandleType tag = 0;
-
-       ret = mm_file_create_tag_attrs_from_memory(&tag, buffer, size, 0);
-
-       if (ret != FILEINFO_ERROR_NONE) {
-               if (ret == FILEINFO_ERROR_FILE_NOT_FOUND) {
-                       metadata_extractor_error("FILE_NOT_EXISTS(0x%08x)", METADATA_EXTRACTOR_ERROR_FILE_EXISTS);
-                       return METADATA_EXTRACTOR_ERROR_FILE_EXISTS;
-               } else {
-                       metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
-                       return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
-               }
-       }
-
-       metadata->tag_h = tag;
-
-       return ret;
-
-}
-
-static int __metadata_extractor_get_duration(metadata_extractor_s *metadata, int *duration)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _duration = 0;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->attr_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, MM_FILE_CONTENT_DURATION, &_duration, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *duration = _duration;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_audio_bitrate(metadata_extractor_s *metadata, int *bitrate)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _audio_bitrate = 0;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->attr_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       if (metadata->audio_track_cnt > 0) {
-               ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, MM_FILE_CONTENT_AUDIO_BITRATE, &_audio_bitrate, NULL);
-               metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-       }
-
-       *bitrate = _audio_bitrate;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_audio_channel(metadata_extractor_s *metadata, int *channel)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _audio_channel = 0;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->attr_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       if (metadata->audio_track_cnt > 0) {
-               ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, MM_FILE_CONTENT_AUDIO_CHANNELS, &_audio_channel, NULL);
-               metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-       }
-
-       *channel = _audio_channel;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_audio_samplerate(metadata_extractor_s *metadata, int *samplerate)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _audio_samplerate = 0;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->attr_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       if (metadata->audio_track_cnt > 0) {
-               ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, MM_FILE_CONTENT_AUDIO_SAMPLERATE, &_audio_samplerate, NULL);
-               metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-       }
-
-       *samplerate = _audio_samplerate;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_audio_bitpersample(metadata_extractor_s *metadata, int *bitpersample)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _audio_bit_per_sample = 0;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->attr_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       if (metadata->audio_track_cnt > 0) {
-               ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, MM_FILE_CONTENT_AUDIO_BITPERSAMPLE, &_audio_bit_per_sample, NULL);
-               metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-       }
-
-       *bitpersample = _audio_bit_per_sample;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_audio_track_count(metadata_extractor_s *metadata, int *track_cnt)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-
-       metadata_extractor_retvm_if(!metadata, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       *track_cnt = metadata->audio_track_cnt;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_video_bitrate(metadata_extractor_s *metadata, int *bitrate)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _video_bitrate = 0;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->attr_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       if (metadata->video_track_cnt > 0) {
-               ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, MM_FILE_CONTENT_VIDEO_BITRATE, &_video_bitrate, NULL);
-               metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-       }
-       *bitrate = _video_bitrate;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_video_FPS(metadata_extractor_s *metadata, int *fps)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _video_fps = 0;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->attr_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       if (metadata->video_track_cnt > 0) {
-               ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, MM_FILE_CONTENT_VIDEO_FPS, &_video_fps, NULL);
-               metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-       }
-
-       *fps = _video_fps;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_video_width(metadata_extractor_s *metadata, int *width)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _video_width = 0;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->attr_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       if (metadata->video_track_cnt > 0) {
-               ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, MM_FILE_CONTENT_VIDEO_WIDTH, &_video_width, NULL);
-               metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-       }
-
-       *width = _video_width;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_video_height(metadata_extractor_s *metadata, int *height)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _video_height = 0;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->attr_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       if (metadata->video_track_cnt > 0) {
-               ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, MM_FILE_CONTENT_VIDEO_HEIGHT, &_video_height, NULL);
-               metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-       }
-
-       *height = _video_height;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_video_thumbnail(metadata_extractor_s *metadata, void **thumbnail, int *thumbnail_len)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       void *_video_thumbnail = NULL;
-       int _video_thumbnail_len = 0;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->attr_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       if (metadata->video_track_cnt > 0) {
-               ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, MM_FILE_CONTENT_VIDEO_THUMBNAIL, &_video_thumbnail, &_video_thumbnail_len, NULL);
-               metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-       }
-
-       *thumbnail = _video_thumbnail;
-       *thumbnail_len = _video_thumbnail_len;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_video_track_count(metadata_extractor_s *metadata, int *track_cnt)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-
-       metadata_extractor_retvm_if(!metadata, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       *track_cnt = metadata->video_track_cnt;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_artist(metadata_extractor_s *metadata, char **artist)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_artist = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_ARTIST, &_artist, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *artist = _artist;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_title(metadata_extractor_s *metadata, char **title)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_title = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_TITLE, &_title, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *title = _title;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_album(metadata_extractor_s *metadata, char **album)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_album = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_ALBUM, &_album, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *album = _album;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_album_artist(metadata_extractor_s *metadata, char **album_artist)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_album_artist = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_ALBUM_ARTIST, &_album_artist, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *album_artist = _album_artist;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_genre(metadata_extractor_s *metadata, char **genre)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_genre = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_GENRE, &_genre, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *genre = _genre;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_author(metadata_extractor_s *metadata, char **author)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_author = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_AUTHOR, &_author, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *author = _author;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_copyright(metadata_extractor_s *metadata, char **copyright)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_copyright = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_COPYRIGHT, &_copyright, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *copyright = _copyright;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_date(metadata_extractor_s *metadata, char **date)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_date = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_DATE, &_date, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *date = _date;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_description(metadata_extractor_s *metadata, char **description)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_description = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_DESCRIPTION, &_description, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *description = _description;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_comment(metadata_extractor_s *metadata, char **comment)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_comment = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_COMMENT, &_comment, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *comment = _comment;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_artwork(metadata_extractor_s *metadata, void **artwork, int *artwork_size)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       void *_artwork = NULL;
-       int _artwork_size = 0;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_ARTWORK_SIZE, &_artwork_size, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       if (_artwork_size > 0) {
-               ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_ARTWORK, &_artwork, &_tag_len, NULL);
-               metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-       }
-
-       *artwork = _artwork;
-       *artwork_size = _artwork_size;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_artwork_mime(metadata_extractor_s *metadata, char **artwork_mime)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_artwork_mime = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_ARTWORK_MIME, &_artwork_mime, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *artwork_mime = _artwork_mime;
-
-       return ret;
-}
-
-
-static int __metadata_extractor_get_track_num(metadata_extractor_s *metadata, char **track_num)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_track_num = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_TRACK_NUM, &_track_num, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *track_num = _track_num;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_classification(metadata_extractor_s *metadata, char **classification)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_classification = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_CLASSIFICATION, &_classification, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *classification = _classification;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_rating(metadata_extractor_s *metadata, char **rating)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_rating = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_RATING, &_rating, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *rating = _rating;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_longitude(metadata_extractor_s *metadata, double *longitude)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       double _longitude = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_LONGITUDE, &_longitude, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *longitude = _longitude;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_latitude(metadata_extractor_s *metadata, double *latitude)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       double _latitude = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_LATIDUE, &_latitude, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *latitude = _latitude;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_altitude(metadata_extractor_s *metadata, double *altitude)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       double _altitude = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_ALTIDUE, &_altitude, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *altitude = _altitude;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_conductor(metadata_extractor_s *metadata, char **conductor)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_conductor = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_CONDUCTOR, &_conductor, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *conductor = _conductor;
-
-       return ret;
-}
-static int __metadata_extractor_get_unsynclyrics(metadata_extractor_s *metadata, char **unsynclyrics)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_unsynclyrics = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_UNSYNCLYRICS, &_unsynclyrics, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *unsynclyrics = _unsynclyrics;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_recording_date(metadata_extractor_s *metadata, char **rec_date)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_rec_date = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_RECDATE, &_rec_date, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *rec_date = _rec_date;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_rotate(metadata_extractor_s *metadata, char **rotate)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_rotate = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_ROTATE, &_rotate, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *rotate = _rotate;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_synclyrics_pair_num(metadata_extractor_s *metadata, int *synclyrics_num)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _synclyrics_num = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SYNCLYRICS_NUM, &_synclyrics_num, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *synclyrics_num = _synclyrics_num;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_audio_codec(metadata_extractor_s *metadata, char **audio_codec)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int audio_codec_idx = 0;
-       int audio_codec_cnt = 45;
-
-       const char *AudioCodecTypeString[] = {
-               "AMR", "G723.1", "MP3", "OGG", "AAC", "WMA", "MMF", "ADPCM", "WAVE", "WAVE NEW", "MIDI", "IMELODY", "MXMF", "MPEG1-Layer1 codec", "MPEG1-Layer2 codec",
-               "G711", "G722", "G722.1",       "G722.2  (AMR-WB)", "G723 wideband speech", "G726 (ADPCM)", "G728 speech",      "G729", "G729a",        "G729.1",
-               "Real",
-               "AAC-Low complexity",   "AAC-Main profile", "AAC-Scalable sample rate", "AAC-Long term prediction", "AAC-High Efficiency v1",   "AAC-High efficiency v2",
-               "DolbyDigital", "Apple Lossless",       "Sony proprietary", "SPEEX",    "Vorbis",       "AIFF", "AU",   "None (will be deprecated)",
-               "PCM",  "ALAW", "MULAW",        "MS ADPCM", "FLAC"
-       };
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->attr_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       if (metadata->audio_track_cnt > 0) {
-               ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, MM_FILE_CONTENT_AUDIO_CODEC, &audio_codec_idx, NULL);
-               metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-       }
-
-       if (audio_codec_idx < audio_codec_cnt)
-               *audio_codec = strdup(AudioCodecTypeString[audio_codec_idx]);
-       else {
-               metadata_extractor_error("Invalid Audio Codec [%d]", audio_codec_idx);
-               *audio_codec = NULL;
-       }
-
-       return ret;
-}
-
-static int __metadata_extractor_get_video_codec(metadata_extractor_s *metadata, char **video_codec)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int video_codec_idx = 0;
-       int video_codec_cnt = 29;
-
-       const char *VideoCodecTypeString[] = {
-               "None (will be deprecated)",
-               "H263", "H264", "H26L", "MPEG4", "MPEG1", "WMV", "DIVX", "XVID", "H261", "H262/MPEG2-part2", "H263v2",  "H263v3",
-               "Motion JPEG", "MPEG2", "MPEG4 part-2 Simple profile",  "MPEG4 part-2 Advanced Simple profile", "MPEG4 part-2 Main profile",
-               "MPEG4 part-2 Core profile", "MPEG4 part-2 Adv Coding Eff profile", "MPEG4 part-2 Adv RealTime Simple profile",
-               "MPEG4 part-10 (h.264)",        "Real", "VC-1", "AVS",  "Cinepak",      "Indeo",        "Theora", "Flv"
-       };
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->attr_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       if (metadata->video_track_cnt > 0) {
-               ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, MM_FILE_CONTENT_VIDEO_CODEC, &video_codec_idx, NULL);
-               metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-       }
-
-       if (video_codec_idx < video_codec_cnt)
-               *video_codec = strdup(VideoCodecTypeString[video_codec_idx]);
-       else {
-               metadata_extractor_error("Invalid Video Codec[%d]", video_codec_idx);
-               *video_codec = NULL;
-       }
-
-       return ret;
-}
-
-static int __metadata_extractor_get_is_360(metadata_extractor_s *metadata, int *is_360)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _is_360 = 0;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL, &_is_360, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *is_360 = _is_360;
-
-       return ret;
-}
-
-#ifdef SUPPORT_GSPHERICAL_METADATA
-static int __metadata_extractor_get_is_stitched_v1(metadata_extractor_s *metadata, int *is_stitched)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _is_stitched = 0;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_STITCHED, &_is_stitched, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *is_stitched = _is_stitched;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_projection_type_v1(metadata_extractor_s *metadata, char **projection_type)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_projection_type = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_PROJECTION_TYPE, &_projection_type, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *projection_type = _projection_type;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_stitching_software_v1(metadata_extractor_s *metadata, char **stitching_software)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_stitching_software = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_STITCHING_SOFTWARE, &_stitching_software, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *stitching_software = _stitching_software;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_stereo_mode_v1(metadata_extractor_s *metadata, char **stereo_mode)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       char *_stereo_mode = NULL;
-       int _tag_len = 0;
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_STEREO_MODE, &_stereo_mode, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *stereo_mode = _stereo_mode;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_source_count_v1(metadata_extractor_s *metadata, int *source_count)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _source_count = 0;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_SOURCE_COUNT, &_source_count, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *source_count = _source_count;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_initial_view_heading_degrees_v1(metadata_extractor_s *metadata, int32_t *initial_view_heading_degrees)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _initial_view_heading_degrees = -1;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_INIT_VIEW_HEADING, &_initial_view_heading_degrees, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *initial_view_heading_degrees = _initial_view_heading_degrees;
-
-       return ret;
-}
-
-static int __metadata_extractor_get_initial_view_pitch_degrees_v1(metadata_extractor_s *metadata, int32_t *initial_view_pitch_degrees)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _initial_view_pitch_degrees = -1;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_INIT_VIEW_PITCH, &_initial_view_pitch_degrees, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *initial_view_pitch_degrees = _initial_view_pitch_degrees;
+       }
 
        return ret;
 }
 
-static int __metadata_extractor_get_initial_view_roll_degrees_v1(metadata_extractor_s *metadata, int32_t *initial_view_roll_degrees)
+static int __metadata_extractor_get_stream_info(metadata_extractor_s *metadata, const char *path)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _initial_view_roll_degrees = -1;
+       int _audio_track_cnt = 0;
+       int _video_track_cnt = 0;
 
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       ret = mm_file_get_stream_info(path, &_audio_track_cnt, &_video_track_cnt);
 
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_INIT_VIEW_ROLL, &_initial_view_roll_degrees, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
+       if (ret != FILEINFO_ERROR_NONE) {
+               if (ret == FILEINFO_ERROR_FILE_NOT_FOUND) {
+                       metadata_extractor_error("FILE_NOT_EXISTS(0x%08x)", METADATA_EXTRACTOR_ERROR_FILE_EXISTS);
+                       return METADATA_EXTRACTOR_ERROR_FILE_EXISTS;
+               } else {
+                       metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+                       return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+               }
+       }
 
-       *initial_view_roll_degrees = _initial_view_roll_degrees;
+       metadata->audio_track_cnt = _audio_track_cnt;
+       metadata->video_track_cnt = _video_track_cnt;
 
        return ret;
 }
 
-static int __metadata_extractor_get_timestamp_v1(metadata_extractor_s *metadata, int *timestamp)
+static int __metadata_extractor_create_content_attrs(metadata_extractor_s *metadata, const char *path)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       MMHandleType content = 0;
        char *err_attr_name = NULL;
-       int _timestamp = 0;
 
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_TIMESTAMP, &_timestamp, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *timestamp = _timestamp;
+       int _audio_track_cnt = 0;
+       int _video_track_cnt = 0;
 
-       return ret;
-}
+       ret = mm_file_create_content_attrs(&content, path);
 
-static int __metadata_extractor_get_full_pano_width_pixels_v1(metadata_extractor_s *metadata, int *full_pano_width_pixels)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _full_pano_width_pixels = 0;
+       if (ret != FILEINFO_ERROR_NONE) {
+               if (ret == FILEINFO_ERROR_FILE_NOT_FOUND) {
+                       metadata_extractor_error("FILE_NOT_EXISTS(0x%08x)", METADATA_EXTRACTOR_ERROR_FILE_EXISTS);
+                       return METADATA_EXTRACTOR_ERROR_FILE_EXISTS;
+               } else {
+                       metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+                       return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+               }
+       }
 
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       ret = mm_file_get_attrs(content, &err_attr_name,
+                                       MM_FILE_CONTENT_VIDEO_TRACK_COUNT, &_video_track_cnt,
+                                       MM_FILE_CONTENT_AUDIO_TRACK_COUNT, &_audio_track_cnt,
+                                       NULL);
 
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_FULL_PANO_WIDTH, &_full_pano_width_pixels, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               mm_file_destroy_content_attrs(content);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
 
-       *full_pano_width_pixels = _full_pano_width_pixels;
+       metadata->attr_h = content;
+       metadata->audio_track_cnt = _audio_track_cnt;
+       metadata->video_track_cnt = _video_track_cnt;
 
        return ret;
-}
-
-static int __metadata_extractor_get_full_pano_height_pixels_v1(metadata_extractor_s *metadata, int *full_pano_height_pixels)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _full_pano_height_pixels = 0;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
 
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_FULL_PANO_HEIGHT, &_full_pano_height_pixels, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *full_pano_height_pixels = _full_pano_height_pixels;
-
-       return ret;
 }
 
-static int __metadata_extractor_get_cropped_area_image_width_v1(metadata_extractor_s *metadata, int *cropped_area_image_width)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _cropped_area_image_width = 0;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_IMAGE_WIDTH, &_cropped_area_image_width, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *cropped_area_image_width = _cropped_area_image_width;
-
-       return ret;
-}
 
-static int __metadata_extractor_get_cropped_area_image_height_v1(metadata_extractor_s *metadata, int *cropped_area_image_height)
+static int __metadata_extractor_create_tag_attr(metadata_extractor_s *metadata, const char *path)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _cropped_area_image_height = 0;
+       MMHandleType tag = 0;
 
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       ret = mm_file_create_tag_attrs(&tag, path);
 
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_IMAGE_HEIGHT, &_cropped_area_image_height, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
+       if (ret != FILEINFO_ERROR_NONE) {
+               if (ret == FILEINFO_ERROR_FILE_NOT_FOUND) {
+                       metadata_extractor_error("FILE_NOT_EXISTS(0x%08x)", METADATA_EXTRACTOR_ERROR_FILE_EXISTS);
+                       return METADATA_EXTRACTOR_ERROR_FILE_EXISTS;
+               } else {
+                       metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+                       return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+               }
+       }
 
-       *cropped_area_image_height = _cropped_area_image_height;
+       metadata->tag_h = tag;
 
        return ret;
-}
-
-static int __metadata_extractor_get_cropped_area_left_v1(metadata_extractor_s *metadata, int *cropped_area_left)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _cropped_area_left = 0;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_LEFT, &_cropped_area_left, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *cropped_area_left = _cropped_area_left;
 
-       return ret;
 }
 
-static int __metadata_extractor_get_cropped_area_top_v1(metadata_extractor_s *metadata, int *cropped_area_top)
+static int __metadata_extractor_create_content_attrs_from_buffer(metadata_extractor_s *metadata, const void *buffer, int size)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
+       MMHandleType content = 0;
        char *err_attr_name = NULL;
-       int _cropped_area_top = 0;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_TOP, &_cropped_area_top, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
 
-       *cropped_area_top = _cropped_area_top;
+       int _audio_track_cnt = 0;
+       int _video_track_cnt = 0;
 
-       return ret;
-}
+       ret = mm_file_create_content_attrs_from_memory(&content, buffer, size, 0);
 
-static int __metadata_extractor_get_ambisonic_type(metadata_extractor_s *metadata, int *ambisonic_type)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _ambisonic_type = -1;
-       *ambisonic_type = -1;
+       if (ret != FILEINFO_ERROR_NONE) {
+               if (ret == FILEINFO_ERROR_FILE_NOT_FOUND) {
+                       metadata_extractor_error("FILE_NOT_EXISTS(0x%08x)", METADATA_EXTRACTOR_ERROR_FILE_EXISTS);
+                       return METADATA_EXTRACTOR_ERROR_FILE_EXISTS;
+               } else {
+                       metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+                       return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+               }
+       }
 
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       ret = mm_file_get_attrs(content, &err_attr_name,
+                                       MM_FILE_CONTENT_VIDEO_TRACK_COUNT, &_video_track_cnt,
+                                       MM_FILE_CONTENT_AUDIO_TRACK_COUNT, &_audio_track_cnt,
+                                       NULL);
 
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_AMBISONIC_TYPE, &_ambisonic_type, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
+       if (ret != FILEINFO_ERROR_NONE) {
+               metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+               SAFE_FREE(err_attr_name);
+               mm_file_destroy_content_attrs(content);
+               return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+       }
 
-       *ambisonic_type = _ambisonic_type;
+       metadata->attr_h = content;
+       metadata->audio_track_cnt = _audio_track_cnt;
+       metadata->video_track_cnt = _video_track_cnt;
 
        return ret;
-}
-
-static int __metadata_extractor_get_ambisonic_format(metadata_extractor_s *metadata, int *ambisonic_format)
-{
-       int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _ambisonic_format = -1;
-       *ambisonic_format = -1;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_AMBISONIC_FORMAT, &_ambisonic_format, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
-
-       *ambisonic_format = _ambisonic_format;
 
-       return ret;
 }
 
-static int __metadata_extractor_get_ambisonic_order(metadata_extractor_s *metadata, int *ambisonic_order)
+static int __metadata_extractor_create_tag_attrs_from_buffer(metadata_extractor_s *metadata, const void *buffer, int size)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _ambisonic_order = -1;
-       *ambisonic_order = -1;
+       MMHandleType tag = 0;
 
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       ret = mm_file_create_tag_attrs_from_memory(&tag, buffer, size, 0);
 
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_AMBISONIC_ORDER, &_ambisonic_order, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
+       if (ret != FILEINFO_ERROR_NONE) {
+               if (ret == FILEINFO_ERROR_FILE_NOT_FOUND) {
+                       metadata_extractor_error("FILE_NOT_EXISTS(0x%08x)", METADATA_EXTRACTOR_ERROR_FILE_EXISTS);
+                       return METADATA_EXTRACTOR_ERROR_FILE_EXISTS;
+               } else {
+                       metadata_extractor_error("METADATA_EXTRACTOR_ERROR_OPERATION_FAILED(0x%08x)", ret);
+                       return METADATA_EXTRACTOR_ERROR_OPERATION_FAILED;
+               }
+       }
 
-       *ambisonic_order = _ambisonic_order;
+       metadata->tag_h = tag;
 
        return ret;
+
 }
 
-static int __metadata_extractor_get_stereo_mode_v2(metadata_extractor_s *metadata, int *stereo_mode_v2)
+static int __metadata_extractor_get_attr_int(metadata_extractor_s *metadata, const char *attribute_name, int *attr)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
        char *err_attr_name = NULL;
-       int _stereo_mode_v2 = -1;
-       *stereo_mode_v2 = -1;
+       int _attr = 0;
 
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       metadata_extractor_retvm_if(metadata == NULL, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       metadata_extractor_retvm_if(metadata->attr_h == NULL, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Attr handle is null");
+       metadata_extractor_retvm_if(!ME_STRING_VALID(attribute_name), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Invalid attribute_name");
+       metadata_extractor_retvm_if(attr == NULL, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "attr is null");
 
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_V2_STEREO_MODE, &_stereo_mode_v2, NULL);
+       ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, attribute_name, &_attr, NULL);
        metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
 
-       *stereo_mode_v2 = _stereo_mode_v2;
+       *attr = _attr;
 
        return ret;
 }
 
-static int __metadata_extractor_get_metadata_source_v2(metadata_extractor_s *metadata, char **metadata_source_v2)
+static int __metadata_extractor_get_audio_attr_int(metadata_extractor_s *metadata, const char *attribute_name, int *attr)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
        char *err_attr_name = NULL;
-       char *_metadata_source_v2 = NULL;
-       int _tag_len = 0;
+       int _attr = 0;
 
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_V2_METADATA_SOURCE, &_metadata_source_v2, &_tag_len, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
+       metadata_extractor_retvm_if(metadata == NULL, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       metadata_extractor_retvm_if(metadata->attr_h == NULL, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Attr handle is null");
+       metadata_extractor_retvm_if(!ME_STRING_VALID(attribute_name), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Invalid attribute_name");
+       metadata_extractor_retvm_if(attr == NULL, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "attr is null");
+
+       if (metadata->audio_track_cnt > 0) {
+               ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, attribute_name, &_attr, NULL);
+               metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
+       }
 
-       *metadata_source_v2 = _metadata_source_v2;
+       *attr = _attr;
 
        return ret;
 }
 
-static int __metadata_extractor_get_proj_type_v2(metadata_extractor_s *metadata, int *proj_type_v2)
+static int __metadata_extractor_get_video_attr_int(metadata_extractor_s *metadata, const char *attribute_name, int *attr)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
        char *err_attr_name = NULL;
-       int _proj_type_v2 = -1;
-       *proj_type_v2 = -1;
+       int _attr = 0;
 
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       metadata_extractor_retvm_if(metadata == NULL, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       metadata_extractor_retvm_if(metadata->attr_h == NULL, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Attr handle is null");
+       metadata_extractor_retvm_if(!ME_STRING_VALID(attribute_name), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Invalid attribute_name");
+       metadata_extractor_retvm_if(attr == NULL, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "attr is null");
 
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_V2_PROJ_TYPE, &_proj_type_v2, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
+       if (metadata->video_track_cnt > 0) {
+               ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, attribute_name, &_attr, NULL);
+               metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
+       }
 
-       *proj_type_v2 = _proj_type_v2;
+       *attr = _attr;
 
        return ret;
 }
 
-static int __metadata_extractor_get_pose_yaw_degrees_v2(metadata_extractor_s *metadata, int *pose_yaw_degrees_v2)
+static int __metadata_extractor_get_audio_track_count(metadata_extractor_s *metadata, int *track_cnt)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _pose_yaw_degrees_v2 = -1;
-       *pose_yaw_degrees_v2 = -1;
 
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
-
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_V2_POSE_YAW, &_pose_yaw_degrees_v2, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
+       metadata_extractor_retvm_if(!metadata, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
 
-       *pose_yaw_degrees_v2 = _pose_yaw_degrees_v2;
+       *track_cnt = metadata->audio_track_cnt;
 
        return ret;
 }
 
-static int __metadata_extractor_get_pose_pitch_degrees_v2(metadata_extractor_s *metadata, int *pose_pitch_degrees_v2)
+static int __metadata_extractor_get_video_thumbnail(metadata_extractor_s *metadata, void **thumbnail, int *thumbnail_len)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
        char *err_attr_name = NULL;
-       int _pose_pitch_degrees_v2 = -1;
-       *pose_pitch_degrees_v2 = -1;
+       void *_video_thumbnail = NULL;
+       int _video_thumbnail_len = 0;
 
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       metadata_extractor_retvm_if((!metadata) || (!metadata->attr_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
 
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_V2_POSE_PITCH, &_pose_pitch_degrees_v2, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
+       if (metadata->video_track_cnt > 0) {
+               ret = mm_file_get_attrs(metadata->attr_h, &err_attr_name, MM_FILE_CONTENT_VIDEO_THUMBNAIL, &_video_thumbnail, &_video_thumbnail_len, NULL);
+               metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
+       }
 
-       *pose_pitch_degrees_v2 = _pose_pitch_degrees_v2;
+       *thumbnail = _video_thumbnail;
+       *thumbnail_len = _video_thumbnail_len;
 
        return ret;
 }
 
-static int __metadata_extractor_get_pose_roll_degrees_v2(metadata_extractor_s *metadata, int *pose_roll_degrees_v2)
+static int __metadata_extractor_get_video_track_count(metadata_extractor_s *metadata, int *track_cnt)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _pose_roll_degrees_v2 = -1;
-       *pose_roll_degrees_v2 = -1;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
 
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_V2_POSE_ROLL, &_pose_roll_degrees_v2, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
+       metadata_extractor_retvm_if(!metadata, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
 
-       *pose_roll_degrees_v2 = _pose_roll_degrees_v2;
+       *track_cnt = metadata->video_track_cnt;
 
        return ret;
 }
 
-static int __metadata_extractor_get_cbmp_layout_v2(metadata_extractor_s *metadata, int *cbmp_layout_v2)
+static int __metadata_extractor_get_tag_str(metadata_extractor_s *metadata, const char *attribute_name, char **tag)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
        char *err_attr_name = NULL;
-       int _cbmp_layout_v2 = -1;
-       *cbmp_layout_v2 = -1;
+       char *_tag = NULL;
+       int _tag_len = 0;
 
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       metadata_extractor_retvm_if(metadata == NULL, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       metadata_extractor_retvm_if(metadata->tag_h == NULL, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Tag handle is null");
+       metadata_extractor_retvm_if(!ME_STRING_VALID(attribute_name), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Invalid attribute_name");
+       metadata_extractor_retvm_if(tag == NULL, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "tag is null");
 
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_V2_CBMP_LAYOUT, &_cbmp_layout_v2, NULL);
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, attribute_name, &_tag, &_tag_len, NULL);
        metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
 
-       *cbmp_layout_v2 = _cbmp_layout_v2;
+       *tag = _tag;
 
        return ret;
 }
 
-static int __metadata_extractor_get_cbmp_padding_v2(metadata_extractor_s *metadata, int *cbmp_padding_v2)
+static int __metadata_extractor_get_tag_int(metadata_extractor_s *metadata, const char *attribute_name, int *tag)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
        char *err_attr_name = NULL;
-       int _cbmp_padding_v2 = -1;
-       *cbmp_padding_v2 = -1;
+       int _tag = 0;
 
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       metadata_extractor_retvm_if(metadata == NULL, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       metadata_extractor_retvm_if(metadata->tag_h == NULL, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Tag handle is null");
+       metadata_extractor_retvm_if(!ME_STRING_VALID(attribute_name), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Invalid attribute_name");
+       metadata_extractor_retvm_if(tag == NULL, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "tag is null");
 
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_V2_CBMP_PADDING, &_cbmp_padding_v2, NULL);
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, attribute_name, &_tag, NULL);
        metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
 
-       *cbmp_padding_v2 = _cbmp_padding_v2;
+       *tag = _tag;
 
        return ret;
 }
 
-static int __metadata_extractor_get_equi_projection_bounds_top_v2(metadata_extractor_s *metadata, int *equi_projection_bounds_top_v2)
+static int __metadata_extractor_get_tag_double(metadata_extractor_s *metadata, const char *attribute_name, double *tag)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
        char *err_attr_name = NULL;
-       int _equi_projection_bounds_top_v2 = -1;
-       *equi_projection_bounds_top_v2 = -1;
+       double _tag = 0;
 
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       metadata_extractor_retvm_if(metadata == NULL, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       metadata_extractor_retvm_if(metadata->tag_h == NULL, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Tag handle is null");
+       metadata_extractor_retvm_if(!ME_STRING_VALID(attribute_name), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Invalid attribute_name");
+       metadata_extractor_retvm_if(tag == NULL, METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "tag is null");
 
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_V2_EQUI_BOUNDS_TOP, &_equi_projection_bounds_top_v2, NULL);
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, attribute_name, &_tag, NULL);
        metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
 
-       *equi_projection_bounds_top_v2 = _equi_projection_bounds_top_v2;
+       *tag = _tag;
 
        return ret;
 }
 
-static int __metadata_extractor_get_equi_projection_bounds_bottom_v2(metadata_extractor_s *metadata, int *equi_projection_bounds_bottom_v2)
+static int __metadata_extractor_get_artwork(metadata_extractor_s *metadata, void **artwork, int *artwork_size)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
        char *err_attr_name = NULL;
-       int _equi_projection_bounds_bottom_v2 = -1;
-       *equi_projection_bounds_bottom_v2 = -1;
-
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       void *_artwork = NULL;
+       int _artwork_size = 0;
+       int _tag_len = 0;
 
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_V2_EQUI_BOUNDS_BOTTOM, &_equi_projection_bounds_bottom_v2, NULL);
+       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_ARTWORK_SIZE, &_artwork_size, NULL);
        metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
 
-       *equi_projection_bounds_bottom_v2 = _equi_projection_bounds_bottom_v2;
+       if (_artwork_size > 0) {
+               ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_ARTWORK, &_artwork, &_tag_len, NULL);
+               metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
+       }
+
+       *artwork = _artwork;
+       *artwork_size = _artwork_size;
 
        return ret;
 }
 
-static int __metadata_extractor_get_equi_projection_bounds_left_v2(metadata_extractor_s *metadata, int *equi_projection_bounds_left_v2)
+static int __metadata_extractor_get_audio_codec(metadata_extractor_s *metadata, char **audio_codec)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _equi_projection_bounds_left_v2 = -1;
-       *equi_projection_bounds_left_v2 = -1;
+       int audio_codec_idx = 0;
+       int audio_codec_cnt = 45;
 
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       const char *AudioCodecTypeString[] = {
+               "AMR", "G723.1", "MP3", "OGG", "AAC", "WMA", "MMF", "ADPCM", "WAVE", "WAVE NEW", "MIDI", "IMELODY", "MXMF", "MPEG1-Layer1 codec", "MPEG1-Layer2 codec",
+               "G711", "G722", "G722.1",       "G722.2  (AMR-WB)", "G723 wideband speech", "G726 (ADPCM)", "G728 speech",      "G729", "G729a",        "G729.1",
+               "Real",
+               "AAC-Low complexity",   "AAC-Main profile", "AAC-Scalable sample rate", "AAC-Long term prediction", "AAC-High Efficiency v1",   "AAC-High efficiency v2",
+               "DolbyDigital", "Apple Lossless",       "Sony proprietary", "SPEEX",    "Vorbis",       "AIFF", "AU",   "None (will be deprecated)",
+               "PCM",  "ALAW", "MULAW",        "MS ADPCM", "FLAC"
+       };
 
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_V2_EQUI_BOUNDS_LEFT, &_equi_projection_bounds_left_v2, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
+       ret = __metadata_extractor_get_audio_attr_int(metadata, MM_FILE_CONTENT_AUDIO_CODEC, &audio_codec_idx);
+       metadata_extractor_retvm_if(ret != METADATA_EXTRACTOR_ERROR_NONE, ret, "Fail to get codec idx");
 
-       *equi_projection_bounds_left_v2 = _equi_projection_bounds_left_v2;
+       if (audio_codec_idx < audio_codec_cnt)
+               *audio_codec = strdup(AudioCodecTypeString[audio_codec_idx]);
+       else {
+               metadata_extractor_error("Invalid Audio Codec [%d]", audio_codec_idx);
+               *audio_codec = NULL;
+       }
 
        return ret;
 }
 
-static int __metadata_extractor_get_equi_projection_bounds_right_v2(metadata_extractor_s *metadata, int *equi_projection_bounds_right_v2)
+static int __metadata_extractor_get_video_codec(metadata_extractor_s *metadata, char **video_codec)
 {
        int ret = METADATA_EXTRACTOR_ERROR_NONE;
-       char *err_attr_name = NULL;
-       int _equi_projection_bounds_right_v2 = -1;
-       *equi_projection_bounds_right_v2 = -1;
+       int video_codec_idx = 0;
+       int video_codec_cnt = 29;
 
-       metadata_extractor_retvm_if((!metadata) || (!metadata->tag_h), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Handle is null");
+       const char *VideoCodecTypeString[] = {
+               "None (will be deprecated)",
+               "H263", "H264", "H26L", "MPEG4", "MPEG1", "WMV", "DIVX", "XVID", "H261", "H262/MPEG2-part2", "H263v2",  "H263v3",
+               "Motion JPEG", "MPEG2", "MPEG4 part-2 Simple profile",  "MPEG4 part-2 Advanced Simple profile", "MPEG4 part-2 Main profile",
+               "MPEG4 part-2 Core profile", "MPEG4 part-2 Adv Coding Eff profile", "MPEG4 part-2 Adv RealTime Simple profile",
+               "MPEG4 part-10 (h.264)",        "Real", "VC-1", "AVS",  "Cinepak",      "Indeo",        "Theora", "Flv"
+       };
 
-       ret = mm_file_get_attrs(metadata->tag_h, &err_attr_name, MM_FILE_TAG_SPHERICAL_V2_EQUI_BOUNDS_RIGHT, &_equi_projection_bounds_right_v2, NULL);
-       metadata_extractor_retv_free_if(ret != FILEINFO_ERROR_NONE, METADATA_EXTRACTOR_ERROR_OPERATION_FAILED, err_attr_name);
+       ret = __metadata_extractor_get_video_attr_int(metadata, MM_FILE_CONTENT_AUDIO_CODEC, &video_codec_idx);
+       metadata_extractor_retvm_if(ret != METADATA_EXTRACTOR_ERROR_NONE, ret, "Fail to get codec idx");
 
-       *equi_projection_bounds_right_v2 = _equi_projection_bounds_right_v2;
+       if (video_codec_idx < video_codec_cnt)
+               *video_codec = strdup(VideoCodecTypeString[video_codec_idx]);
+       else {
+               metadata_extractor_error("Invalid Video Codec[%d]", video_codec_idx);
+               *video_codec = NULL;
+       }
 
        return ret;
 }
-#endif
 
 static int __metadata_extractor_destroy_handle(metadata_extractor_s *metadata)
 {
@@ -1555,7 +604,7 @@ int metadata_extractor_get_synclyrics(metadata_extractor_h metadata, int index,
        if (ret != METADATA_EXTRACTOR_ERROR_NONE)
                return ret;
 
-       ret = __metadata_extractor_get_synclyrics_pair_num(_metadata, &_synclyrics_num);
+       ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SYNCLYRICS_NUM, &_synclyrics_num);
        if (ret != METADATA_EXTRACTOR_ERROR_NONE)
                return ret;
 
@@ -1621,7 +670,7 @@ int metadata_extractor_get_metadata(metadata_extractor_h metadata, metadata_extr
        switch ((int)attribute) {  /*TODO (m.alieksieie): Remove casting after ACR*/
        case METADATA_DURATION: {
                is_string = 0;
-               ret = __metadata_extractor_get_duration(_metadata, &i_value);
+               ret = __metadata_extractor_get_attr_int(_metadata, MM_FILE_CONTENT_DURATION, &i_value);
                break;
        }
        case METADATA_VIDEO_CODEC: {
@@ -1631,22 +680,22 @@ int metadata_extractor_get_metadata(metadata_extractor_h metadata, metadata_extr
        }
        case METADATA_VIDEO_BITRATE: {
                is_string = 0;
-               ret = __metadata_extractor_get_video_bitrate(_metadata, &i_value);
+               ret = __metadata_extractor_get_video_attr_int(_metadata, MM_FILE_CONTENT_VIDEO_BITRATE, &i_value);
                break;
        }
        case METADATA_VIDEO_FPS: {
                is_string = 0;
-               ret = __metadata_extractor_get_video_FPS(_metadata, &i_value);
+               ret = __metadata_extractor_get_video_attr_int(_metadata, MM_FILE_CONTENT_VIDEO_FPS, &i_value);
                break;
        }
        case METADATA_VIDEO_WIDTH: {
                is_string = 0;
-               ret = __metadata_extractor_get_video_width(_metadata, &i_value);
+               ret = __metadata_extractor_get_video_attr_int(_metadata, MM_FILE_CONTENT_VIDEO_WIDTH, &i_value);
                break;
        }
        case METADATA_VIDEO_HEIGHT: {
                is_string = 0;
-               ret = __metadata_extractor_get_video_height(_metadata, &i_value);
+               ret = __metadata_extractor_get_video_attr_int(_metadata, MM_FILE_CONTENT_VIDEO_HEIGHT, &i_value);
                break;
        }
        case METADATA_HAS_VIDEO: {
@@ -1661,22 +710,22 @@ int metadata_extractor_get_metadata(metadata_extractor_h metadata, metadata_extr
        }
        case METADATA_AUDIO_BITRATE: {
                is_string = 0;
-               ret = __metadata_extractor_get_audio_bitrate(_metadata, &i_value);
+               ret = __metadata_extractor_get_audio_attr_int(_metadata, MM_FILE_CONTENT_AUDIO_BITRATE, &i_value);
                break;
        }
        case METADATA_AUDIO_CHANNELS: {
                is_string = 0;
-               ret = __metadata_extractor_get_audio_channel(_metadata, &i_value);
+               ret = __metadata_extractor_get_audio_attr_int(_metadata, MM_FILE_CONTENT_AUDIO_CHANNELS, &i_value);
                break;
        }
        case METADATA_AUDIO_SAMPLERATE: {
                is_string = 0;
-               ret = __metadata_extractor_get_audio_samplerate(_metadata, &i_value);
+               ret = __metadata_extractor_get_audio_attr_int(_metadata, MM_FILE_CONTENT_AUDIO_SAMPLERATE, &i_value);
                break;
        }
        case METADATA_AUDIO_BITPERSAMPLE: {
                is_string = 0;
-               ret = __metadata_extractor_get_audio_bitpersample(_metadata, &i_value);
+               ret = __metadata_extractor_get_audio_attr_int(_metadata, MM_FILE_CONTENT_AUDIO_BITPERSAMPLE, &i_value);
                break;
        }
        case METADATA_HAS_AUDIO: {
@@ -1686,263 +735,263 @@ int metadata_extractor_get_metadata(metadata_extractor_h metadata, metadata_extr
        }
        case METADATA_ARTIST: {
                is_string = 1;
-               ret = __metadata_extractor_get_artist(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_ARTIST, &s_value);
                break;
        }
        case METADATA_TITLE: {
                is_string = 1;
-               ret = __metadata_extractor_get_title(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_TITLE, &s_value);
                break;
        }
        case METADATA_ALBUM: {
                is_string = 1;
-               ret = __metadata_extractor_get_album(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_ALBUM, &s_value);
                break;
        }
        case METADATA_ALBUM_ARTIST: {
                is_string = 1;
-               ret = __metadata_extractor_get_album_artist(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_ALBUM_ARTIST, &s_value);
                break;
        }
        case METADATA_GENRE: {
                is_string = 1;
-               ret = __metadata_extractor_get_genre(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_GENRE, &s_value);
                break;
        }
        case METADATA_AUTHOR: {
                is_string = 1;
-               ret = __metadata_extractor_get_author(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_AUTHOR, &s_value);
                break;
        }
        case METADATA_COPYRIGHT: {
                is_string = 1;
-               ret = __metadata_extractor_get_copyright(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_COPYRIGHT, &s_value);
                break;
        }
        case METADATA_DATE: {
                is_string = 1;
-               ret = __metadata_extractor_get_date(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_DATE, &s_value);
                break;
        }
        case METADATA_DESCRIPTION: {
                is_string = 1;
-               ret = __metadata_extractor_get_description(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_DESCRIPTION, &s_value);
                break;
        }
        case METADATA_COMMENT: {
                is_string = 1;
-               ret = __metadata_extractor_get_comment(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_COMMENT, &s_value);
                break;
        }
        case METADATA_TRACK_NUM: {
                is_string = 1;
-               ret = __metadata_extractor_get_track_num(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_TRACK_NUM, &s_value);
                break;
        }
        case METADATA_CLASSIFICATION: {
                is_string = 1;
-               ret = __metadata_extractor_get_classification(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_CLASSIFICATION, &s_value);
                break;
        }
        case METADATA_RATING: {
                is_string = 1;
-               ret = __metadata_extractor_get_rating(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_RATING, &s_value);
                break;
        }
        case METADATA_LONGITUDE: {
                is_double = 1;
-               ret = __metadata_extractor_get_longitude(_metadata, &d_value);
+               ret = __metadata_extractor_get_tag_double(_metadata, MM_FILE_TAG_LONGITUDE, &d_value);
                break;
        }
        case METADATA_LATITUDE: {
                is_double = 1;
-               ret = __metadata_extractor_get_latitude(_metadata, &d_value);
+               ret = __metadata_extractor_get_tag_double(_metadata, MM_FILE_TAG_LATIDUE, &d_value);
                break;
        }
        case METADATA_ALTITUDE: {
                is_double = 1;
-               ret = __metadata_extractor_get_altitude(_metadata, &d_value);
+               ret = __metadata_extractor_get_tag_double(_metadata, MM_FILE_TAG_ALTIDUE, &d_value);
                break;
        }
        case METADATA_CONDUCTOR: {
                is_string = 1;
-               ret = __metadata_extractor_get_conductor(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_CONDUCTOR, &s_value);
                break;
        }
        case METADATA_UNSYNCLYRICS: {
                is_string = 1;
-               ret = __metadata_extractor_get_unsynclyrics(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_UNSYNCLYRICS, &s_value);
                break;
        }
        case METADATA_SYNCLYRICS_NUM: {
                is_string = 0;
-               ret = __metadata_extractor_get_synclyrics_pair_num(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SYNCLYRICS_NUM, &i_value);
                break;
        }
        case METADATA_RECDATE: {
                is_string = 1;
-               ret = __metadata_extractor_get_recording_date(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_RECDATE, &s_value);
                break;
        }
        case METADATA_ROTATE: {
                is_string = 1;
-               ret = __metadata_extractor_get_rotate(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_ROTATE, &s_value);
                break;
        }
        case METADATA_360: {
                is_string = 0;
-               ret = __metadata_extractor_get_is_360(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL, &i_value);
                break;
        }
 #ifdef SUPPORT_GSPHERICAL_METADATA
        case METADATA_360_V1_STITCHED: {
                is_string = 0;
-               ret = __metadata_extractor_get_is_stitched_v1(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_STITCHED, &i_value);
                break;
        }
        case METADATA_360_V1_PROJECTION_TYPE: {
                is_string = 1;
-               ret = __metadata_extractor_get_projection_type_v1(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_SPHERICAL_PROJECTION_TYPE, &s_value);
                break;
        }
        case METADATA_360_V1_STITCHING_SOFTWARE: {
                is_string = 1;
-               ret = __metadata_extractor_get_stitching_software_v1(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_SPHERICAL_STITCHING_SOFTWARE, &s_value);
                break;
        }
        case METADATA_360_V1_STEREO_MODE: {
                is_string = 1;
-               ret = __metadata_extractor_get_stereo_mode_v1(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_SPHERICAL_STEREO_MODE, &s_value);
                break;
        }
        case METADATA_360_V1_SOURCE_COUNT: {
                is_string = 0;
-               ret = __metadata_extractor_get_source_count_v1(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_SOURCE_COUNT, &i_value);
                break;
        }
        case METADATA_360_V1_INIT_VIEW_HEADING: {
                is_string = 0;
-               ret = __metadata_extractor_get_initial_view_heading_degrees_v1(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_INIT_VIEW_HEADING, &i_value);
                break;
        }
        case METADATA_360_V1_INIT_VIEW_PITCH: {
                is_string = 0;
-               ret = __metadata_extractor_get_initial_view_pitch_degrees_v1(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_INIT_VIEW_PITCH, &i_value);
                break;
        }
        case METADATA_360_V1_INIT_VIEW_ROLL: {
                is_string = 0;
-               ret = __metadata_extractor_get_initial_view_roll_degrees_v1(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_INIT_VIEW_ROLL, &i_value);
                break;
        }
        case METADATA_360_V1_TIMESTAMP: {
                is_string = 0;
-               ret = __metadata_extractor_get_timestamp_v1(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_TIMESTAMP, &i_value);
                break;
        }
        case METADATA_360_V1_FULL_PANO_WIDTH: {
                is_string = 0;
-               ret = __metadata_extractor_get_full_pano_width_pixels_v1(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_FULL_PANO_WIDTH, &i_value);
                break;
        }
        case METADATA_360_V1_FULL_PANO_HEIGHT: {
                is_string = 0;
-               ret = __metadata_extractor_get_full_pano_height_pixels_v1(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_FULL_PANO_HEIGHT, &i_value);
                break;
        }
        case METADATA_360_V1_CROPPED_AREA_IMAGE_WIDTH: {
                is_string = 0;
-               ret = __metadata_extractor_get_cropped_area_image_width_v1(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_IMAGE_WIDTH, &i_value);
                break;
        }
        case METADATA_360_V1_CROPPED_AREA_IMAGE_HEIGHT: {
                is_string = 0;
-               ret = __metadata_extractor_get_cropped_area_image_height_v1(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_IMAGE_HEIGHT, &i_value);
                break;
        }
        case METADATA_360_V1_CROPPED_AREA_LEFT: {
                is_string = 0;
-               ret = __metadata_extractor_get_cropped_area_left_v1(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_LEFT, &i_value);
                break;
        }
        case METADATA_360_V1_CROPPED_AREA_TOP: {
                is_string = 0;
-               ret = __metadata_extractor_get_cropped_area_top_v1(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_TOP, &i_value);
                break;
        }
        case METADATA_360_V2_STEREO_MODE: {
                is_string = 0;
-               ret = __metadata_extractor_get_stereo_mode_v2(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_V2_STEREO_MODE, &i_value);
                break;
        }
        case METADATA_360_V2_METADATA_SOURCE: {
                is_string = 1;
-               ret = __metadata_extractor_get_metadata_source_v2(_metadata, &s_value);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_SPHERICAL_V2_METADATA_SOURCE, &s_value);
                break;
        }
        case METADATA_360_V2_PROJ_TYPE: {
                is_string = 0;
-               ret = __metadata_extractor_get_proj_type_v2(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_V2_PROJ_TYPE, &i_value);
                break;
        }
        case METADATA_360_V2_POSE_YAW: {
                is_string = 0;
-               ret = __metadata_extractor_get_pose_yaw_degrees_v2(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_V2_POSE_YAW, &i_value);
                break;
        }
        case METADATA_360_V2_POSE_PITCH: {
                is_string = 0;
-               ret = __metadata_extractor_get_pose_pitch_degrees_v2(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_V2_POSE_PITCH, &i_value);
                break;
        }
        case METADATA_360_V2_POSE_ROLL: {
                is_string = 0;
-               ret = __metadata_extractor_get_pose_roll_degrees_v2(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_V2_POSE_ROLL, &i_value);
                break;
        }
        case METADATA_360_V2_CBMP_LAYOUT: {
                is_string = 0;
-               ret = __metadata_extractor_get_cbmp_layout_v2(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_V2_CBMP_LAYOUT, &i_value);
                break;
        }
        case METADATA_360_V2_CBMP_PADDING: {
                is_string = 0;
-               ret = __metadata_extractor_get_cbmp_padding_v2(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_V2_CBMP_PADDING, &i_value);
                break;
        }
        case METADATA_360_V2_EQUI_BOUNDS_TOP: {
                is_string = 0;
-               ret = __metadata_extractor_get_equi_projection_bounds_top_v2(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_V2_EQUI_BOUNDS_TOP, &i_value);
                break;
        }
        case METADATA_360_V2_EQUI_BOUNDS_BOTTOM: {
                is_string = 0;
-               ret = __metadata_extractor_get_equi_projection_bounds_bottom_v2(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_V2_EQUI_BOUNDS_BOTTOM, &i_value);
                break;
        }
        case METADATA_360_V2_EQUI_BOUNDS_LEFT: {
                is_string = 0;
-               ret = __metadata_extractor_get_equi_projection_bounds_left_v2(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_V2_EQUI_BOUNDS_LEFT, &i_value);
                break;
        }
        case METADATA_360_V2_EQUI_BOUNDS_RIGHT: {
                is_string = 0;
-               ret = __metadata_extractor_get_equi_projection_bounds_right_v2(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_SPHERICAL_V2_EQUI_BOUNDS_RIGHT, &i_value);
                break;
        }
        case METADATA_AMBISONIC_TYPE: {
                is_string = 0;
-               ret = __metadata_extractor_get_ambisonic_type(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_AMBISONIC_TYPE, &i_value);
                break;
        }
        case METADATA_AMBISONIC_FORMAT: {
                is_string = 0;
-               ret = __metadata_extractor_get_ambisonic_format(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_AMBISONIC_FORMAT, &i_value);
                break;
        }
        case METADATA_AMBISONIC_ORDER: {
                is_string = 0;
-               ret = __metadata_extractor_get_ambisonic_order(_metadata, &i_value);
+               ret = __metadata_extractor_get_tag_int(_metadata, MM_FILE_TAG_AMBISONIC_ORDER, &i_value);
                break;
        }
 #endif
@@ -1997,15 +1046,13 @@ int metadata_extractor_get_artwork(metadata_extractor_h metadata, void **artwork
        metadata_extractor_retvm_if((!_metadata) || ((!_metadata->path) && (!_metadata->buffer)), METADATA_EXTRACTOR_ERROR_INVALID_PARAMETER, "Invalid parameter");
 
        ret = __metadata_extractor_check_and_extract_meta(_metadata, METADATA_TYPE_TAG);
-       if (ret != METADATA_EXTRACTOR_ERROR_NONE)
-               return ret;
+       metadata_extractor_retvm_if(ret != METADATA_EXTRACTOR_ERROR_NONE, ret, "Error in __metadata_extractor_check_and_extract_meta()");
 
        ret = __metadata_extractor_get_artwork(_metadata, &_artwork, &_artwork_size);
-       if (ret != METADATA_EXTRACTOR_ERROR_NONE)
-               return ret;
+       metadata_extractor_retvm_if(ret != METADATA_EXTRACTOR_ERROR_NONE, ret, "Fail to get artwork");
 
        if ((_artwork_size > 0) && (_artwork != NULL)) {
-               ret = __metadata_extractor_get_artwork_mime(_metadata, &_artwork_mime);
+               ret = __metadata_extractor_get_tag_str(_metadata, MM_FILE_TAG_ARTWORK_MIME, &_artwork_mime);
                if (ret != METADATA_EXTRACTOR_ERROR_NONE) {
                        *artwork = NULL;
                        *size = 0;