Fix coverity issue
[platform/core/multimedia/libmm-fileinfo.git] / mm_file.c
old mode 100755 (executable)
new mode 100644 (file)
index 7625b3d..0340a0b
--- a/mm_file.c
+++ b/mm_file.c
@@ -180,16 +180,16 @@ static MMAttrsConstructInfo g_content_attrs[] = {
 #define MMFILE_FORMAT_SO_FILE_NAME  LIBDIR"/libmmfile_formats.so"
 #define MMFILE_CODEC_SO_FILE_NAME   LIBDIR"/libmmfile_codecs.so"
 
-int (*mmfile_format_open)(MMFileFormatContext **formatContext, MMFileSourceType *fileSrc);
-int (*mmfile_format_read_stream)(MMFileFormatContext *formatContext);
-int (*mmfile_format_read_frame)(MMFileFormatContext *formatContext, unsigned int timestamp, MMFileFormatFrame *frame);
-int (*mmfile_format_read_tag)(MMFileFormatContext *formatContext);
-int (*mmfile_format_close)(MMFileFormatContext *formatContext);
-int (*mmfile_codec_open)(MMFileCodecContext **codecContext, int codecType, int codecId, MMFileCodecFrame *input);
-int (*mmfile_codec_decode)(MMFileCodecContext *codecContext, MMFileCodecFrame *output);
-int (*mmfile_codec_close)(MMFileCodecContext *codecContext);
-int (*mmfile_format_get_frame)(const char *path, double timestamp, bool is_accurate, unsigned char **frame, int *size, int *width, int *height);
-int (*mmfile_format_get_frame_from_memory)(const void *data, unsigned int datasize, double timestamp, bool is_accurate, unsigned char **frame, int *size, int *width, int *height);
+static int (*mmfile_format_open)(MMFileFormatContext **formatContext, MMFileSourceType *fileSrc);
+static int (*mmfile_format_read_stream)(MMFileFormatContext *formatContext);
+static int (*mmfile_format_read_frame)(MMFileFormatContext *formatContext, unsigned int timestamp, MMFileFormatFrame *frame);
+static int (*mmfile_format_read_tag)(MMFileFormatContext *formatContext);
+static int (*mmfile_format_close)(MMFileFormatContext *formatContext);
+static int (*mmfile_codec_open)(MMFileCodecContext **codecContext, int codecType, int codecId, MMFileCodecFrame *input);
+static int (*mmfile_codec_decode)(MMFileCodecContext *codecContext, MMFileCodecFrame *output);
+static int (*mmfile_codec_close)(MMFileCodecContext *codecContext);
+static int (*mmfile_format_get_frame)(const char *path, double timestamp, bool is_accurate, unsigned char **frame, int *size, int *width, int *height);
+static int (*mmfile_format_get_frame_from_memory)(const void *data, unsigned int datasize, double timestamp, bool is_accurate, unsigned char **frame, int *size, int *width, int *height);
 #endif
 
 #ifdef __MMFILE_DYN_LOADING__
@@ -211,7 +211,7 @@ static int _load_dynamic_functions(MMFILE_FUNC_HANDLE *pHandle)
 
        formatFuncHandle = dlopen(MMFILE_FORMAT_SO_FILE_NAME, RTLD_LAZY);
        if (!formatFuncHandle) {
-               debug_error(DEBUG, "error: %s\n", "libmmfile_formats.so open error");
+               debug_error(DEBUG, "error: %s %s\n", "libmmfile_formats.so open error", dlerror());
                ret = 0;
                goto exception;
        }
@@ -316,26 +316,27 @@ _info_set_attr_media(MMHandleType attrs, MMFileFormatContext *formatContext)
        int ret = 0;
 
        if (formatContext->commandType == MM_FILE_TAG) {
-               if (formatContext->title)                               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_TITLE, formatContext->title);
-               if (formatContext->artist)                              mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ARTIST, formatContext->artist);
-               if (formatContext->author)                      mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_AUTHOR, formatContext->author);
-               if (formatContext->composer && formatContext->author == NULL)
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_TITLE, formatContext->title);
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ARTIST, formatContext->artist);
+               if (formatContext->author)
+                       mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_AUTHOR, formatContext->author);
+               else
                        mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_AUTHOR, formatContext->composer);
-               if (formatContext->album)                               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ALBUM, formatContext->album);
-               if (formatContext->album_artist)                                mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ALBUM_ARTIST, formatContext->album_artist);
-               if (formatContext->copyright)                   mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_COPYRIGHT, formatContext->copyright);
-               if (formatContext->description)                 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_DESCRIPTION, formatContext->description);
-               if (formatContext->comment)                     mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_COMMENT, formatContext->comment);
-               if (formatContext->genre)                               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_GENRE, formatContext->genre);
-               if (formatContext->classification)              mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_CLASSIFICATION, formatContext->classification);
-               if (formatContext->year)                                mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_DATE, formatContext->year);
-               if (formatContext->tagTrackNum)         mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_TRACK_NUM, formatContext->tagTrackNum);
-               if (formatContext->rating)                              mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_RATING, formatContext->rating);
-               if (formatContext->conductor)                   mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_CONDUCTOR, formatContext->conductor);
-               if (formatContext->recDate)                     mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_RECDATE, formatContext->recDate);
-               if (formatContext->part_of_set)                 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_POS, formatContext->part_of_set);
-
-               if (formatContext->rotate)                              mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ROTATE, formatContext->rotate);
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ALBUM, formatContext->album);
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ALBUM_ARTIST, formatContext->album_artist);
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_COPYRIGHT, formatContext->copyright);
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_DESCRIPTION, formatContext->description);
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_COMMENT, formatContext->comment);
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_GENRE, formatContext->genre);
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_CLASSIFICATION, formatContext->classification);
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_DATE, formatContext->year);
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_TRACK_NUM, formatContext->tagTrackNum);
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_RATING, formatContext->rating);
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_CONDUCTOR, formatContext->conductor);
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_RECDATE, formatContext->recDate);
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_POS, formatContext->part_of_set);
+
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ROTATE, formatContext->rotate);
                mm_attrs_set_double_by_name(attrs, MM_FILE_TAG_LONGITUDE, formatContext->longitude);
                mm_attrs_set_double_by_name(attrs, MM_FILE_TAG_LATIDUE, formatContext->latitude);
                mm_attrs_set_double_by_name(attrs, MM_FILE_TAG_ALTIDUE, formatContext->altitude);
@@ -345,9 +346,9 @@ _info_set_attr_media(MMHandleType attrs, MMFileFormatContext *formatContext)
 
                mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL, formatContext->isSpherical);
                mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_STITCHED, formatContext->isStitched);
-               if (formatContext->stitchingSoftware)   mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_SPHERICAL_STITCHING_SOFTWARE, formatContext->stitchingSoftware);
-               if (formatContext->projectionType)              mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_SPHERICAL_PROJECTION_TYPE, formatContext->projectionType);
-               if (formatContext->stereoMode)                  mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_SPHERICAL_STEREO_MODE, formatContext->stereoMode);
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_SPHERICAL_STITCHING_SOFTWARE, formatContext->stitchingSoftware);
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_SPHERICAL_PROJECTION_TYPE, formatContext->projectionType);
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_SPHERICAL_STEREO_MODE, formatContext->stereoMode);
                mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_SOURCE_COUNT, formatContext->sourceCount);
                mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_INIT_VIEW_HEADING, formatContext->initViewHeading);
                mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_INIT_VIEW_PITCH, formatContext->initViewPitch);
@@ -365,7 +366,7 @@ _info_set_attr_media(MMHandleType attrs, MMFileFormatContext *formatContext)
                mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_AMBISONIC_ORDER, formatContext->ambisonicOrder);
 
                mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_STEREO_MODE, formatContext->stereoModeV2);
-               if (formatContext->metadataSourceV2)    mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_METADATA_SOURCE, formatContext->metadataSourceV2);
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_METADATA_SOURCE, formatContext->metadataSourceV2);
                mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_PROJ_TYPE, formatContext->projTypeV2);
                mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_POSE_YAW, formatContext->poseYawV2);
                mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_POSE_PITCH, formatContext->posePitchV2);
@@ -377,19 +378,18 @@ _info_set_attr_media(MMHandleType attrs, MMFileFormatContext *formatContext)
                mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_EQUI_BOUNDS_LEFT, formatContext->equiBoundsLeftV2);
                mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_EQUI_BOUNDS_RIGHT, formatContext->equiBoundsRightV2);
 
-               if ((formatContext->syncLyricsNum > 0) && (formatContext->syncLyrics))
-                       mm_attrs_set_data_by_name(attrs, MM_FILE_TAG_SYNCLYRICS, formatContext->syncLyrics, formatContext->syncLyricsNum);
+               mm_attrs_set_data_by_name(attrs, MM_FILE_TAG_SYNCLYRICS, formatContext->syncLyrics, formatContext->syncLyricsNum);
 
-               if (formatContext->unsyncLyrics)                mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_UNSYNCLYRICS, formatContext->unsyncLyrics);
+               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_UNSYNCLYRICS, formatContext->unsyncLyrics);
 
                if (formatContext->artwork && formatContext->artworkSize > 0) {
                        void *artworkCopy = NULL;
                        artworkCopy = mmfile_malloc((formatContext->artworkSize));
-                       if (NULL != artworkCopy) {
+                       if (artworkCopy) {
                                memcpy(artworkCopy, formatContext->artwork, formatContext->artworkSize);
                                mm_attrs_set_data_by_name(attrs, MM_FILE_TAG_ARTWORK, artworkCopy, formatContext->artworkSize);
                                mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_ARTWORK_SIZE, formatContext->artworkSize);
-                               if (formatContext->artworkMime) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ARTWORK_MIME, formatContext->artworkMime);
+                               mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ARTWORK_MIME, formatContext->artworkMime);
                        }
                }
        } else if (formatContext->commandType == MM_FILE_CONTENTS) {
@@ -415,7 +415,7 @@ _info_set_attr_media(MMHandleType attrs, MMFileFormatContext *formatContext)
                                void *thumbNailCopy = NULL;
                                thumbNailCopy = mmfile_malloc(formatContext->thumbNail->frameSize);
 
-                               if (NULL != thumbNailCopy) {
+                               if (thumbNailCopy) {
                                        memcpy(thumbNailCopy, formatContext->thumbNail->frameData, formatContext->thumbNail->frameSize);
                                        mm_attrs_set_data_by_name(attrs, MM_FILE_CONTENT_VIDEO_THUMBNAIL, thumbNailCopy, formatContext->thumbNail->frameSize);
                                        mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_VIDEO_WIDTH, formatContext->thumbNail->frameWidth);
@@ -446,22 +446,133 @@ _info_set_attr_media(MMHandleType attrs, MMFileFormatContext *formatContext)
        return ret;
 }
 
+/**
+ * @param      frameContext    [in]    frame for decoding.
+ * @param      videoStream             [in]    information of video codec for frameContext.
+ * @param      decodedFrame    [inout] frame after decoding frameContext.
+ */
+static int
+__decode_contents_frame(MMFileFormatFrame *frameContext, MMFileFormatStream *videoStream, MMFileCodecFrame *decodedFrame)
+{
+       int ret = FILEINFO_ERROR_NONE;
+       MMFileCodecContext *codecContext = NULL;
+       MMFileCodecFrame codecFrame = {0, };
+
+       if (!frameContext || !videoStream || !decodedFrame) {
+               debug_error(DEBUG, "error: invalid parameters (%p %p %p)\n", frameContext, videoStream, decodedFrame);
+               return FILEINFO_ERROR_FILE_INTERNAL;
+       }
+
+       codecFrame.frameDataSize = frameContext->frameSize;
+       codecFrame.width = frameContext->frameWidth;
+       codecFrame.height = frameContext->frameHeight;
+       codecFrame.frameData = frameContext->frameData;
+       codecFrame.configLen = frameContext->configLenth;
+       codecFrame.configData = frameContext->configData;
+       codecFrame.version = videoStream->version;
+
+       if (MMFILE_FORMAT_FAIL == mmfile_codec_open(&codecContext, MMFILE_VIDEO_DECODE, videoStream->codecId, &codecFrame)) {
+               debug_error(DEBUG, "error: mmfile_codec_open\n");
+               mmfile_codec_close(codecContext);
+               return FILEINFO_ERROR_FILE_INTERNAL;
+       }
+
+       if (MMFILE_FORMAT_FAIL == mmfile_codec_decode(codecContext, decodedFrame)) {
+               debug_error(DEBUG, "error: mmfile_codec_decode\n");
+               ret = FILEINFO_ERROR_FILE_INTERNAL;
+       }
+
+       mmfile_codec_close(codecContext);
+
+       return ret;
+}
+
+static int
+__get_contents_thumbnail(MMFileFormatContext *formatContext)
+{
+       int ret = FILEINFO_ERROR_NONE;
+       MMFileFormatFrame frameContext = {0, };
+       MMFileCodecFrame decodedFrame = {0, };
+       MMFileFormatFrame *thumbnail = NULL;
+
+       if (!formatContext) {
+               debug_error(DEBUG, "error: invalid parameter (%p)\n", formatContext);
+               return FILEINFO_ERROR_FILE_INTERNAL;
+       }
+
+       if (MMFILE_FORMAT_FAIL == mmfile_format_read_frame(formatContext, _SEEK_POINT_, &frameContext)) {
+               debug_error(DEBUG, "error: mmfile_format_read_frame\n");
+               ret = FILEINFO_ERROR_FILE_INTERNAL;
+               goto exception;
+       }
+
+       /* set video thumbnail */
+       thumbnail = mmfile_malloc(sizeof(MMFileFormatFrame));
+       if (!thumbnail) {
+               debug_error(DEBUG, "error: mmfile_malloc\n");
+               ret = FILEINFO_ERROR_FILE_INTERNAL;
+               goto exception;
+       }
+
+       if (frameContext.bCompressed) {
+               ret = __decode_contents_frame(&frameContext, formatContext->streams[MMFILE_VIDEO_STREAM], &decodedFrame);
+               if (FILEINFO_ERROR_NONE != ret) {
+                       debug_error(DEBUG, "error: __decode_contents_thumbnail\n");
+                       goto exception;
+               }
+
+               /* after decoding frameContext is done, it is no needed */
+               mmfile_free(frameContext.frameData);
+               mmfile_free(frameContext.configData);
+
+               thumbnail->frameSize = decodedFrame.frameDataSize;
+               thumbnail->frameWidth = decodedFrame.width;
+               thumbnail->frameHeight = decodedFrame.height;
+               thumbnail->frameData = decodedFrame.frameData;
+               thumbnail->configLenth = 0;
+               thumbnail->configData = NULL;
+       } else {
+               thumbnail->frameSize = frameContext.frameSize;
+               thumbnail->frameWidth = frameContext.frameWidth;
+               thumbnail->frameHeight = frameContext.frameHeight;
+               thumbnail->frameData = frameContext.frameData;
+               thumbnail->configLenth = 0;
+               thumbnail->configData = NULL;
+       }
+
+#ifdef __MMFILE_TEST_MODE__
+       mmfile_format_print_frame(thumbnail);
+#endif
+
+       formatContext->thumbNail = thumbnail;
+
+       /* because #MMFILE_FORMAT_SUCCESS is different with #FILEINFO_ERROR_NONE */
+       return FILEINFO_ERROR_NONE;
+exception:
+       if (frameContext.bCompressed) {
+               mmfile_free(decodedFrame.frameData);
+               mmfile_free(decodedFrame.configData);
+       }
+
+       mmfile_free(thumbnail);
+       mmfile_free(frameContext.frameData);
+       mmfile_free(frameContext.configData);
+
+       return ret;
+}
+
 static int
 _get_contents_info(MMHandleType attrs, MMFileSourceType *src, MMFILE_PARSE_INFO *parse)
 {
        MMFileFormatContext *formatContext = NULL;
-       MMFileCodecContext  *codecContext = NULL;
-       MMFileFormatFrame    frameContext = {0, };
-       MMFileCodecFrame     codecFrame = {0, };
-       MMFileCodecFrame     decodedFrame = {0, };
-
        int ret = 0;
 
-       if (!src || !parse)
+       if (!src || !parse) {
+               debug_error(DEBUG, "error: invalid parameters (%p, %p)\n", src, parse);
                return FILEINFO_ERROR_FILE_INTERNAL;
+       }
 
-       ret = mmfile_format_open(&formatContext, src);
-       if (MMFILE_FORMAT_FAIL == ret || formatContext == NULL) {
+       if (MMFILE_FORMAT_FAIL == mmfile_format_open(&formatContext, src) || formatContext == NULL) {
                debug_error(DEBUG, "error: mmfile_format_open\n");
                ret = FILEINFO_ERROR_FILE_INTERNAL;
                goto exception;
@@ -470,8 +581,8 @@ _get_contents_info(MMHandleType attrs, MMFileSourceType *src, MMFILE_PARSE_INFO
        if (parse->type >= MM_FILE_PARSE_TYPE_NORMAL) {
                if (parse->type == MM_FILE_PARSE_TYPE_SAFE)
                        formatContext->cdis = 1;
-               ret = mmfile_format_read_stream(formatContext);
-               if (MMFILE_FORMAT_FAIL == ret) {
+
+               if (MMFILE_FORMAT_FAIL == mmfile_format_read_stream(formatContext)) {
                        debug_error(DEBUG, "error: mmfile_format_read_stream\n");
                        ret = FILEINFO_ERROR_FILE_INTERNAL;
                        goto exception;
@@ -481,87 +592,26 @@ _get_contents_info(MMHandleType attrs, MMFileSourceType *src, MMFILE_PARSE_INFO
                parse->video_track_num = formatContext->videoTotalTrackNum;
 
                /* check uhqa content*/
-               if (formatContext->streams[MMFILE_AUDIO_STREAM] != NULL) {
+               if (formatContext->streams[MMFILE_AUDIO_STREAM] != NULL)
                        parse->is_uhqa = formatContext->streams[MMFILE_AUDIO_STREAM]->is_uhqa;
-               } else {
+               else
                        parse->is_uhqa = FALSE;
-               }
-
-               if (parse->type >= MM_FILE_PARSE_TYPE_ALL) {
-                       if (formatContext->videoTotalTrackNum > 0) {
 
+               if (parse->type >= MM_FILE_PARSE_TYPE_ALL && formatContext->videoTotalTrackNum > 0) {
 /*why below code needed?
 This API is for extracting some attributes not metadata(TAG). mm_file_create_content_attrs() use this API.
 but MMFileUtilGetMetaDataFromMP4() Extract just TAG info. That is needed for mm_file_create_tag_attrs()*/
 #if 0
-                               if (parse->type != MM_FILE_PARSE_TYPE_SAFE) {
-                                       if (formatContext->formatType == MM_FILE_FORMAT_3GP || formatContext->formatType == MM_FILE_FORMAT_MP4) {
-                                               MMFileUtilGetMetaDataFromMP4(formatContext);
-                                       }
+                       if (parse->type != MM_FILE_PARSE_TYPE_SAFE) {
+                               if (formatContext->formatType == MM_FILE_FORMAT_3GP || formatContext->formatType == MM_FILE_FORMAT_MP4) {
+                                       MMFileUtilGetMetaDataFromMP4(formatContext);
                                }
+                       }
 #endif
-                               MMFileFormatStream *videoStream = formatContext->streams[MMFILE_VIDEO_STREAM];
-                               unsigned int timestamp = _SEEK_POINT_;
-
-                               ret = mmfile_format_read_frame(formatContext, timestamp, &frameContext);
-                               if (MMFILE_FORMAT_FAIL == ret) {
-                                       debug_error(DEBUG, "error: mmfile_format_read_frame\n");
-                                       ret = FILEINFO_ERROR_FILE_INTERNAL;
-                                       goto warning;
-                               }
-
-                               if (frameContext.bCompressed) {
-                                       codecFrame.frameDataSize = frameContext.frameSize;
-                                       codecFrame.width = frameContext.frameWidth;
-                                       codecFrame.height = frameContext.frameHeight;
-                                       codecFrame.frameData = frameContext.frameData;
-                                       codecFrame.configLen = frameContext.configLenth;
-                                       codecFrame.configData = frameContext.configData;
-                                       codecFrame.version = videoStream->version;
-
-                                       ret = mmfile_codec_open(&codecContext, MMFILE_VIDEO_DECODE, videoStream->codecId, &codecFrame);
-                                       if (MMFILE_FORMAT_FAIL == ret) {
-                                               debug_error(DEBUG, "error: mmfile_codec_open\n");
-                                               ret = FILEINFO_ERROR_FILE_INTERNAL;
-                                               goto warning;
-                                       }
-
-                                       ret = mmfile_codec_decode(codecContext, &decodedFrame);
-                                       if (MMFILE_FORMAT_FAIL == ret) {
-                                               debug_error(DEBUG, "error: mmfile_codec_decode\n");
-                                               ret = FILEINFO_ERROR_FILE_INTERNAL;
-                                               goto warning;
-                                       }
-
-                                       /* set video thumbnail */
-                                       formatContext->thumbNail = mmfile_malloc(sizeof(MMFileFormatFrame));
-                                       if (NULL == formatContext->thumbNail) {
-                                               debug_error(DEBUG, "error: mmfile_malloc\n");
-                                               ret = FILEINFO_ERROR_FILE_INTERNAL;
-                                               goto warning;
-                                       }
-
-                                       formatContext->thumbNail->frameSize = decodedFrame.frameDataSize;
-                                       formatContext->thumbNail->frameWidth = decodedFrame.width;
-                                       formatContext->thumbNail->frameHeight = decodedFrame.height;
-                                       formatContext->thumbNail->frameData = decodedFrame.frameData;
-                                       formatContext->thumbNail->configLenth = 0;
-                                       formatContext->thumbNail->configData = NULL;
-                               } else {
-                                       formatContext->thumbNail = mmfile_malloc(sizeof(MMFileFormatFrame));
-                                       if (NULL == formatContext->thumbNail) {
-                                               debug_error(DEBUG, "error: mmfile_format_read_frame\n");
-                                               ret = FILEINFO_ERROR_FILE_INTERNAL;
-                                               goto warning;
-                                       }
-
-                                       formatContext->thumbNail->frameSize = frameContext.frameSize;
-                                       formatContext->thumbNail->frameWidth = frameContext.frameWidth;
-                                       formatContext->thumbNail->frameHeight = frameContext.frameHeight;
-                                       formatContext->thumbNail->frameData = frameContext.frameData;
-                                       formatContext->thumbNail->configLenth = 0;
-                                       formatContext->thumbNail->configData = NULL;
-                               }
+                       ret = __get_contents_thumbnail(formatContext);
+                       if (FILEINFO_ERROR_NONE != ret) {
+                               debug_error(DEBUG, "error: __get_contents_thumbnail\n");
+                               ret = FILEINFO_ERROR_NONE;
                        }
                }
        } else {
@@ -572,125 +622,20 @@ but MMFileUtilGetMetaDataFromMP4() Extract just TAG info. That is needed for mm_
                parse->video_track_num = formatContext->videoTotalTrackNum;
        }
 
-#ifdef __MMFILE_TEST_MODE__
-       mmfile_format_print_frame(&frameContext);
-#endif
-
        formatContext->commandType = MM_FILE_CONTENTS;
 
        if (parse->type >= MM_FILE_PARSE_TYPE_NORMAL)
                _info_set_attr_media(attrs, formatContext);
 
-       if (frameContext.bCompressed) {
-               mmfile_free(frameContext.frameData);
-               mmfile_free(frameContext.configData);
-
-               if (decodedFrame.frameData) {
-                       mmfile_free(decodedFrame.frameData);
-                       formatContext->thumbNail->frameData = NULL;
-               }
-               if (decodedFrame.configData) {
-                       mmfile_free(decodedFrame.configData);
-                       formatContext->thumbNail->configData = NULL;
-               }
-       } else {
-               if (frameContext.frameData) {
-                       mmfile_free(frameContext.frameData);
-                       formatContext->thumbNail->frameData = NULL;
-               }
-               if (frameContext.configData) {
-                       mmfile_free(frameContext.configData);
-                       formatContext->thumbNail->configData = NULL;
-               }
-       }
-
-       if (formatContext)  {
-               mmfile_format_close(formatContext);
-       }
-       if (codecContext)   {
-               mmfile_codec_close(codecContext);
+       if (formatContext->thumbNail) {
+               mmfile_free(formatContext->thumbNail->frameData);
+               mmfile_free(formatContext->thumbNail->configData);
+               mmfile_free(formatContext->thumbNail);
        }
 
-       return FILEINFO_ERROR_NONE;
-
-warning:
-       formatContext->commandType = MM_FILE_CONTENTS;
-
-       if (frameContext.bCompressed) {
-               mmfile_free(frameContext.frameData);
-               mmfile_free(frameContext.configData);
-
-               if (decodedFrame.frameData) {
-                       mmfile_free(decodedFrame.frameData);
-                       if (formatContext->thumbNail)
-                               formatContext->thumbNail->frameData = NULL;
-               }
-
-               if (decodedFrame.configData) {
-                       mmfile_free(decodedFrame.configData);
-                       if (formatContext->thumbNail)
-                               formatContext->thumbNail->configData = NULL;
-               }
-       } else {
-               if (frameContext.frameData) {
-                       mmfile_free(frameContext.frameData);
-                       if (formatContext->thumbNail)
-                               formatContext->thumbNail->frameData = NULL;
-               }
-
-               if (frameContext.configData) {
-                       mmfile_free(frameContext.configData);
-                       if (formatContext->thumbNail)
-                               formatContext->thumbNail->configData = NULL;
-               }
-       }
-
-       if (parse->type >= MM_FILE_PARSE_TYPE_NORMAL)
-               _info_set_attr_media(attrs, formatContext);
-
-       if (formatContext)  {
-               mmfile_format_close(formatContext);
-       }
-       if (codecContext)   {
-               mmfile_codec_close(codecContext);
-       }
-       return FILEINFO_ERROR_NONE;
-
-
 exception:
-       if (frameContext.bCompressed) {
-                       mmfile_free(frameContext.frameData);
-                       mmfile_free(frameContext.configData);
-
-               if (decodedFrame.frameData) {
-                       mmfile_free(decodedFrame.frameData);
-                       if (formatContext->thumbNail)
-                               formatContext->thumbNail->frameData = NULL;
-               }
-
-               if (decodedFrame.configData) {
-                       mmfile_free(decodedFrame.configData);
-                       if (formatContext->thumbNail)
-                               formatContext->thumbNail->configData = NULL;
-               }
-       } else {
-               if (frameContext.frameData) {
-                       mmfile_free(frameContext.frameData);
-                       if (formatContext->thumbNail)
-                               formatContext->thumbNail->frameData = NULL;
-               }
-
-               if (frameContext.configData) {
-                       mmfile_free(frameContext.configData);
-                       if (formatContext->thumbNail)
-                               formatContext->thumbNail->configData = NULL;
-               }
-       }
-
-       if (formatContext)  {
+       if (formatContext)
                mmfile_format_close(formatContext);
-       }
-       /* if (codecContext)   { mmfile_codec_close(codecContext); } */ /*dead code*/
 
        return ret;
 }
@@ -739,10 +684,11 @@ exception:
 /**
  * global functions.
  */
-int mm_file_get_attrs(MMHandleType attrs, char **err_attr_name, const char *first_attribute_name, ...)
+int mm_file_get_attrs(MMHandleType attrs, const char *first_attribute_name, ...)
 {
        int ret = FILEINFO_ERROR_NONE;
        va_list var_args;
+       char *err_attr_name = NULL;
 
        if (!attrs) {
                debug_error(DEBUG, "Invalid arguments [attrs 0]\n");
@@ -756,12 +702,13 @@ int mm_file_get_attrs(MMHandleType attrs, char **err_attr_name, const char *firs
 
        /* get requested attributes */
        va_start(var_args, first_attribute_name);
-       ret = mm_attrs_get_valist(attrs, err_attr_name, first_attribute_name, var_args);
+       ret = mm_attrs_get_valist(attrs, &err_attr_name, first_attribute_name, var_args);
        va_end(var_args);
 
        if (ret != FILEINFO_ERROR_NONE) {
                if (err_attr_name) {
-                       debug_error(DEBUG, "failed to get %s\n", *err_attr_name);
+                       debug_error(DEBUG, "failed to get %s\n", err_attr_name);
+                       free(err_attr_name);
                }
        }