4 * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
6 * Contact: Haejeong Kim <backto.kim@samsung.com>
8 * Licensed under the Apache License, Version 2.0 (the "License");
9 * you may not use this file except in compliance with the License.
10 * You may obtain a copy of the License at
12 * http://www.apache.org/licenses/LICENSE-2.0
14 * Unless required by applicable law or agreed to in writing, software
15 * distributed under the License is distributed on an "AS IS" BASIS,
16 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17 * See the License for the specific language governing permissions and
18 * limitations under the License.
24 #include <unistd.h> /*for access*/
25 #include <string.h> /*for strXXX*/
28 /* exported MM header files */
33 /* internal MM header files */
34 #include <mm_attrs_private.h>
37 /* internal MM File headers */
38 #include "mm_file_formats.h"
39 #include "mm_file_format_frame.h"
40 #include "mm_file_codecs.h"
41 #include "mm_file_utils.h"
52 gettimeofday(&tv,NULL);
53 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
63 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
66 #define _SEEK_POINT_ 3000 /*1000 = 1 seconds*/
68 #define MM_FILE_TAG_SYNCLYRICS "tag-synclyrics" /**< Synchronized Lyrics Information*/
78 MM_FILE_PARSE_TYPE_SIMPLE, /*parse audio/video track num only*/
79 MM_FILE_PARSE_TYPE_NORMAL, /*parse infomation without thumbnail*/
80 MM_FILE_PARSE_TYPE_ALL, /*parse all infomation*/
81 MM_FILE_PARSE_TYPE_SAFE, /*parse infomation without both thumbnail and stream full-searching*/
92 void *formatFuncHandle;
93 void *codecFuncHandle;
101 static mmf_attrs_construct_info_t g_tag_attrs[] = {
102 {(char *)"tag-artist", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
103 {(char *)"tag-title", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
104 {(char *)"tag-album", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
105 {(char *)"tag-album-artist", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
106 {(char *)"tag-genre", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
107 {(char *)"tag-author", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
108 {(char *)"tag-copyright", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
109 {(char *)"tag-date", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
110 {(char *)"tag-description", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
111 {(char *)"tag-comment", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
112 {(char *)"tag-artwork", MMF_VALUE_TYPE_DATA, MM_ATTRS_FLAG_RW, (void *)NULL},
113 {(char *)"tag-artwork-size", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
114 {(char *)"tag-artwork-mime", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
115 {(char *)"tag-track-num", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
116 {(char *)"tag-classification", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
117 {(char *)"tag-rating", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
118 {(char *)"tag-longitude", MM_ATTRS_TYPE_DOUBLE, MM_ATTRS_FLAG_RW, (void *)0},
119 {(char *)"tag-latitude", MM_ATTRS_TYPE_DOUBLE, MM_ATTRS_FLAG_RW, (void *)0},
120 {(char *)"tag-altitude", MM_ATTRS_TYPE_DOUBLE, MM_ATTRS_FLAG_RW, (void *)0},
121 {(char *)"tag-conductor", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
122 {(char *)"tag-unsynclyrics", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
123 {(char *)"tag-synclyrics-num", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
124 {(char *)"tag-synclyrics", MMF_VALUE_TYPE_DATA, MM_ATTRS_FLAG_RW, (void *)NULL},
125 {(char *)"tag-recdate", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
126 {(char *)"tag-rotate", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
127 {(char *)"tag-cdis", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
128 {(char *)"tag-smta", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
131 static mmf_attrs_construct_info_t g_content_attrs[] = {
132 {(char *)"content-duration", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
133 {(char *)"content-video-codec", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
134 {(char *)"content-video-bitrate", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
135 {(char *)"content-video-fps", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
136 {(char *)"content-video-width", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
137 {(char *)"content-video-height", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
138 {(char *)"content-video-thumbnail", MMF_VALUE_TYPE_DATA, MM_ATTRS_FLAG_RW, (void *)NULL},
139 {(char *)"content-video-track-index", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
140 {(char *)"content-video-track-count", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
141 {(char *)"content-audio-codec", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
142 {(char *)"content-audio-bitrate", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
143 {(char *)"content-audio-channels", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
144 {(char *)"content-audio-samplerate", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
145 {(char *)"content-audio-track-index", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
146 {(char *)"content-audio-track-count", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
147 {(char *)"content-audio-bitpersample", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
150 #ifdef __MMFILE_DYN_LOADING__
151 #define MMFILE_FORMAT_SO_FILE_NAME "libmmfile_formats.so"
152 #define MMFILE_CODEC_SO_FILE_NAME "libmmfile_codecs.so"
154 int (*mmfile_format_open) (MMFileFormatContext **formatContext, MMFileSourceType *fileSrc);
155 int (*mmfile_format_read_stream) (MMFileFormatContext *formatContext);
156 int (*mmfile_format_read_frame) (MMFileFormatContext *formatContext, unsigned int timestamp, MMFileFormatFrame *frame);
157 int (*mmfile_format_read_tag) (MMFileFormatContext *formatContext);
158 int (*mmfile_format_close) (MMFileFormatContext *formatContext);
159 int (*mmfile_codec_open) (MMFileCodecContext **codecContext, int codecType, int codecId, MMFileCodecFrame *input);
160 int (*mmfile_codec_decode) (MMFileCodecContext *codecContext, MMFileCodecFrame *output);
161 int (*mmfile_codec_close) (MMFileCodecContext *codecContext);
162 int (*mmfile_format_get_frame) (const char* path, double timestamp, bool is_accurate, unsigned char **frame, int *size, int *width, int *height);
163 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);
166 #ifdef __MMFILE_DYN_LOADING__
167 static int _load_dynamic_functions (MMFILE_FUNC_HANDLE* pHandle)
169 // static int dll_func_initialized = 0; //disabled
173 /* Get from function argument */
174 void *formatFuncHandle = NULL;
175 void *codecFuncHandle = NULL;
178 if (dll_func_initialized) {
183 formatFuncHandle = dlopen (MMFILE_FORMAT_SO_FILE_NAME, RTLD_LAZY);
184 if (!formatFuncHandle) {
185 debug_error ("error: %s\n", dlerror());
190 mmfile_format_open = dlsym (formatFuncHandle, "mmfile_format_open");
191 mmfile_format_read_stream = dlsym (formatFuncHandle, "mmfile_format_read_stream");
192 mmfile_format_read_frame = dlsym (formatFuncHandle, "mmfile_format_read_frame");
193 mmfile_format_read_tag = dlsym (formatFuncHandle, "mmfile_format_read_tag");
194 mmfile_format_close = dlsym (formatFuncHandle, "mmfile_format_close");
196 if ( !mmfile_format_open ||
197 !mmfile_format_read_stream ||
198 !mmfile_format_read_frame ||
199 !mmfile_format_read_tag ||
200 !mmfile_format_close) {
202 debug_error ("error: %s\n", dlerror());
207 /*closed at app termination.*/
208 //dlclose (formatFuncHandle);
210 codecFuncHandle = dlopen (MMFILE_CODEC_SO_FILE_NAME, RTLD_LAZY | RTLD_GLOBAL);
211 if (!codecFuncHandle) {
212 debug_error ("error: %s\n", dlerror());
217 mmfile_codec_open = dlsym (codecFuncHandle, "mmfile_codec_open");
218 mmfile_codec_decode = dlsym (codecFuncHandle, "mmfile_codec_decode");
219 mmfile_codec_close = dlsym (codecFuncHandle, "mmfile_codec_close");
221 if ( !mmfile_codec_open || !mmfile_codec_decode || !mmfile_codec_close) {
222 debug_error ("error: %s\n", dlerror());
227 /*closed at app termination.*/
228 //dlclose (codecFuncHandle);
230 // dll_func_initialized = 1; // disabled
232 pHandle->codecFuncHandle = codecFuncHandle;
233 pHandle->formatFuncHandle = formatFuncHandle;
238 if (formatFuncHandle) dlclose (formatFuncHandle);
239 if (codecFuncHandle) dlclose (codecFuncHandle);
244 static void _unload_dynamic_functions (MMFILE_FUNC_HANDLE* pHandle)
246 #ifdef __MMFILE_TEST_MODE__
250 if (pHandle->formatFuncHandle)
252 dlclose (pHandle->formatFuncHandle);
254 if (pHandle->codecFuncHandle)
256 dlclose (pHandle->codecFuncHandle);
259 #ifdef __MMFILE_TEST_MODE__
265 #endif /* __MMFILE_DYN_LOADING__ */
271 _is_file_exist (const char *filename)
275 const char* to_access = (strstr(filename,"file://")!=NULL)? filename+7:filename;
276 ret = access (to_access, R_OK );
278 debug_error ("file [%s] not found.\n", to_access);
285 _info_set_attr_media (mmf_attrs_t *attrs, MMFileFormatContext *formatContext)
288 MMHandleType hattrs = CAST_MM_HANDLE(attrs);
290 if (formatContext->commandType == MM_FILE_TAG)
292 if (formatContext->title) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_TITLE, formatContext->title);
293 if (formatContext->artist) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_ARTIST, formatContext->artist);
294 if (formatContext->author) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_AUTHOR, formatContext->author);
295 if (formatContext->composer && formatContext->author == NULL)
296 mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_AUTHOR, formatContext->composer);
297 if (formatContext->album) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_ALBUM, formatContext->album);
298 if (formatContext->album_artist) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_ALBUM_ARTIST, formatContext->album_artist);
299 if (formatContext->copyright) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_COPYRIGHT, formatContext->copyright);
300 if (formatContext->description) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_DESCRIPTION, formatContext->description);
301 if (formatContext->comment) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_COMMENT, formatContext->comment);
302 if (formatContext->genre) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_GENRE, formatContext->genre);
303 if (formatContext->classification) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_CLASSIFICATION, formatContext->classification);
304 if (formatContext->year) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_DATE, formatContext->year);
305 if (formatContext->tagTrackNum) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_TRACK_NUM, formatContext->tagTrackNum);
306 if (formatContext->rating) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_RATING, formatContext->rating);
307 if (formatContext->conductor) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_CONDUCTOR, formatContext->conductor);
308 if (formatContext->recDate) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_RECDATE, formatContext->recDate);
309 if (formatContext->rotate) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_ROTATE, formatContext->rotate);
310 mm_attrs_set_double_by_name(hattrs, MM_FILE_TAG_LONGITUDE, formatContext->longitude);
311 mm_attrs_set_double_by_name(hattrs, MM_FILE_TAG_LATIDUE, formatContext->latitude);
312 mm_attrs_set_double_by_name(hattrs, MM_FILE_TAG_ALTIDUE, formatContext->altitude);
313 mm_attrs_set_int_by_name(hattrs, MM_FILE_TAG_SYNCLYRICS_NUM, formatContext->syncLyricsNum);
314 mm_attrs_set_int_by_name(hattrs, MM_FILE_TAG_CDIS, formatContext->cdis);
315 mm_attrs_set_int_by_name(hattrs, MM_FILE_TAG_SMTA, formatContext->smta);
317 if ((formatContext->syncLyricsNum > 0) && (formatContext->syncLyrics))
318 mm_attrs_set_data_by_name (hattrs, MM_FILE_TAG_SYNCLYRICS, formatContext->syncLyrics, formatContext->syncLyricsNum);
320 if (formatContext->unsyncLyrics) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_UNSYNCLYRICS, formatContext->unsyncLyrics);
322 if (formatContext->artwork && formatContext->artworkSize > 0) {
323 void *artworkCopy = NULL;
324 artworkCopy = mmfile_malloc ((formatContext->artworkSize));
325 if ( NULL != artworkCopy ) {
326 memcpy (artworkCopy, formatContext->artwork, formatContext->artworkSize);
327 mm_attrs_set_data_by_name (hattrs, MM_FILE_TAG_ARTWORK,artworkCopy, formatContext->artworkSize);
328 mm_attrs_set_int_by_name (hattrs, MM_FILE_TAG_ARTWORK_SIZE, formatContext->artworkSize);
329 if (formatContext->artworkMime) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_ARTWORK_MIME, formatContext->artworkMime);
333 else if (formatContext->commandType == MM_FILE_CONTENTS)
336 mm_attrs_set_int_by_name (hattrs, MM_FILE_CONTENT_DURATION, formatContext->duration);
337 mm_attrs_set_int_by_name (hattrs, MM_FILE_CONTENT_AUDIO_TRACK_COUNT, formatContext->audioTotalTrackNum);
338 mm_attrs_set_int_by_name (hattrs, MM_FILE_CONTENT_VIDEO_TRACK_COUNT, formatContext->videoTotalTrackNum);
340 if (formatContext->videoTotalTrackNum > 0 &&
341 formatContext->nbStreams > 0 &&
342 formatContext->streams[MMFILE_VIDEO_STREAM]) {
344 MMFileFormatStream *videoStream = formatContext->streams[MMFILE_VIDEO_STREAM];
346 mm_attrs_set_int_by_name (hattrs, MM_FILE_CONTENT_VIDEO_CODEC, videoStream->codecId);
347 mm_attrs_set_int_by_name (hattrs, MM_FILE_CONTENT_VIDEO_BITRATE, videoStream->bitRate);
348 mm_attrs_set_int_by_name (hattrs, MM_FILE_CONTENT_VIDEO_FPS, videoStream->framePerSec);
349 mm_attrs_set_int_by_name (hattrs, MM_FILE_CONTENT_VIDEO_WIDTH, videoStream->width);
350 mm_attrs_set_int_by_name (hattrs, MM_FILE_CONTENT_VIDEO_HEIGHT, videoStream->height);
352 if (formatContext->thumbNail && formatContext->thumbNail->frameData) {
353 void *thumbNailCopy = NULL;
354 thumbNailCopy = mmfile_malloc (formatContext->thumbNail->frameSize);
356 if (NULL != thumbNailCopy) {
357 memcpy (thumbNailCopy, formatContext->thumbNail->frameData, formatContext->thumbNail->frameSize);
358 mm_attrs_set_data_by_name (hattrs, MM_FILE_CONTENT_VIDEO_THUMBNAIL, thumbNailCopy, formatContext->thumbNail->frameSize);
359 mm_attrs_set_int_by_name (hattrs, MM_FILE_CONTENT_VIDEO_WIDTH, formatContext->thumbNail->frameWidth);
360 mm_attrs_set_int_by_name (hattrs, MM_FILE_CONTENT_VIDEO_HEIGHT, formatContext->thumbNail->frameHeight);
365 if (formatContext->audioTotalTrackNum > 0 &&
366 formatContext->nbStreams > 0 &&
367 formatContext->streams[MMFILE_AUDIO_STREAM]) {
369 MMFileFormatStream *audioStream = formatContext->streams[MMFILE_AUDIO_STREAM];
371 mm_attrs_set_int_by_name (hattrs, MM_FILE_CONTENT_AUDIO_CODEC, audioStream->codecId);
372 mm_attrs_set_int_by_name (hattrs, MM_FILE_CONTENT_AUDIO_CHANNELS, audioStream->nbChannel);
373 mm_attrs_set_int_by_name (hattrs, MM_FILE_CONTENT_AUDIO_BITRATE, audioStream->bitRate);
374 mm_attrs_set_int_by_name (hattrs, MM_FILE_CONTENT_AUDIO_SAMPLERATE, audioStream->samplePerSec);
375 mm_attrs_set_int_by_name (hattrs, MM_FILE_CONTENT_AUDIO_BITPERSAMPLE, audioStream->bitPerSample);
384 ret = mmf_attrs_commit ((MMHandleType)hattrs);
390 _get_contents_info (mmf_attrs_t *attrs, MMFileSourceType *src, MMFILE_PARSE_INFO *parse)
392 MMFileFormatContext *formatContext = NULL;
393 MMFileCodecContext *codecContext = NULL;
394 MMFileFormatFrame frameContext = {0,};
395 MMFileCodecFrame codecFrame = {0,};
396 MMFileCodecFrame decodedFrame = {0,};
401 return MM_ERROR_FILE_INTERNAL;
403 ret = mmfile_format_open (&formatContext, src);
404 if (MMFILE_FORMAT_FAIL == ret || formatContext == NULL) {
405 debug_error ("error: mmfile_format_open\n");
406 ret = MM_ERROR_FILE_INTERNAL;
410 if (parse->type >= MM_FILE_PARSE_TYPE_NORMAL) {
411 if (parse->type == MM_FILE_PARSE_TYPE_SAFE)
412 formatContext->cdis = 1;
413 ret = mmfile_format_read_stream (formatContext);
414 if (MMFILE_FORMAT_FAIL == ret) {
415 debug_error ("error: mmfile_format_read_stream\n");
416 ret = MM_ERROR_FILE_INTERNAL;
420 parse->audio_track_num = formatContext->audioTotalTrackNum;
421 parse->video_track_num = formatContext->videoTotalTrackNum;
423 /* check uhqa content*/
424 if (parse->is_uhqa = formatContext->streams[MMFILE_AUDIO_STREAM] != NULL)
425 parse->is_uhqa = formatContext->streams[MMFILE_AUDIO_STREAM]->is_uhqa;
427 if (parse->type >= MM_FILE_PARSE_TYPE_ALL) {
428 if (formatContext->videoTotalTrackNum > 0) {
430 if (parse->type != MM_FILE_PARSE_TYPE_SAFE) {
431 if (formatContext->formatType == MM_FILE_FORMAT_3GP ||formatContext->formatType == MM_FILE_FORMAT_MP4) {
432 MMFileUtilGetMetaDataFromMP4 (formatContext);
435 MMFileFormatStream *videoStream = formatContext->streams[MMFILE_VIDEO_STREAM];
436 unsigned int timestamp = _SEEK_POINT_;
438 ret = mmfile_format_read_frame (formatContext, timestamp, &frameContext);
439 if (MMFILE_FORMAT_FAIL == ret) {
440 debug_error ("error: mmfile_format_read_frame\n");
441 ret = MM_ERROR_FILE_INTERNAL;
445 if (frameContext.bCompressed) {
446 codecFrame.frameDataSize = frameContext.frameSize;
447 codecFrame.width = frameContext.frameWidth;
448 codecFrame.height = frameContext.frameHeight;
449 codecFrame.frameData = frameContext.frameData;
450 codecFrame.configLen = frameContext.configLenth;
451 codecFrame.configData = frameContext.configData;
452 codecFrame.version = videoStream->version;
454 ret = mmfile_codec_open (&codecContext, MMFILE_VIDEO_DECODE, videoStream->codecId, &codecFrame);
455 if (MMFILE_FORMAT_FAIL == ret) {
456 debug_error ("error: mmfile_codec_open\n");
457 ret = MM_ERROR_FILE_INTERNAL;
461 ret = mmfile_codec_decode (codecContext, &decodedFrame);
462 if (MMFILE_FORMAT_FAIL == ret) {
463 debug_error ("error: mmfile_codec_decode\n");
464 ret = MM_ERROR_FILE_INTERNAL;
468 /* set video thumbnail */
469 formatContext->thumbNail = mmfile_malloc (sizeof(MMFileFormatFrame));
470 if (NULL == formatContext->thumbNail) {
471 debug_error ("error: mmfile_malloc\n");
472 ret = MM_ERROR_FILE_INTERNAL;
476 formatContext->thumbNail->frameSize = decodedFrame.frameDataSize;
477 formatContext->thumbNail->frameWidth = decodedFrame.width;
478 formatContext->thumbNail->frameHeight = decodedFrame.height;
479 formatContext->thumbNail->frameData = decodedFrame.frameData;
480 formatContext->thumbNail->configLenth = 0;
481 formatContext->thumbNail->configData = NULL;
483 formatContext->thumbNail = mmfile_malloc (sizeof(MMFileFormatFrame));
484 if (NULL == formatContext->thumbNail) {
485 debug_error ("error: mmfile_format_read_frame\n");
486 ret = MM_ERROR_FILE_INTERNAL;
490 formatContext->thumbNail->frameSize = frameContext.frameSize;
491 formatContext->thumbNail->frameWidth = frameContext.frameWidth;
492 formatContext->thumbNail->frameHeight = frameContext.frameHeight;
493 formatContext->thumbNail->frameData = frameContext.frameData;
494 formatContext->thumbNail->configLenth = 0;
495 formatContext->thumbNail->configData = NULL;
501 * if MM_FILE_PARSE_TYPE_SIMPLE, just get number of each stream.
503 parse->audio_track_num = formatContext->audioTotalTrackNum;
504 parse->video_track_num = formatContext->videoTotalTrackNum;
507 #ifdef __MMFILE_TEST_MODE__
508 mmfile_format_print_frame (&frameContext);
511 formatContext->commandType = MM_FILE_CONTENTS;
513 if (parse->type >= MM_FILE_PARSE_TYPE_NORMAL)
514 _info_set_attr_media (attrs, formatContext);
516 if (frameContext.bCompressed) {
517 if (frameContext.frameData) mmfile_free (frameContext.frameData);
518 if (frameContext.configData) mmfile_free (frameContext.configData);
520 if (decodedFrame.frameData) {
521 mmfile_free (decodedFrame.frameData);
522 formatContext->thumbNail->frameData = NULL;
524 if (decodedFrame.configData) {
525 mmfile_free (decodedFrame.configData);
526 formatContext->thumbNail->configData = NULL;
529 if (frameContext.frameData) {
530 mmfile_free (frameContext.frameData);
531 formatContext->thumbNail->frameData = NULL;
533 if (frameContext.configData) {
534 mmfile_free (frameContext.configData);
535 formatContext->thumbNail->configData = NULL;
539 if (formatContext) { mmfile_format_close (formatContext); }
540 if (codecContext) { mmfile_codec_close (codecContext); }
542 return MM_ERROR_NONE;
545 formatContext->commandType = MM_FILE_CONTENTS;
547 if (frameContext.bCompressed) {
548 if (frameContext.frameData)
549 mmfile_free (frameContext.frameData);
551 if (frameContext.configData)
552 mmfile_free (frameContext.configData);
554 if (decodedFrame.frameData) {
555 mmfile_free (decodedFrame.frameData);
556 formatContext->thumbNail->frameData = NULL;
559 if (decodedFrame.configData) {
560 mmfile_free (decodedFrame.configData);
561 formatContext->thumbNail->configData = NULL;
564 if (frameContext.frameData) {
565 mmfile_free (frameContext.frameData);
566 formatContext->thumbNail->frameData = NULL;
569 if (frameContext.configData) {
570 mmfile_free (frameContext.configData);
571 formatContext->thumbNail->configData = NULL;
575 if (parse->type >= MM_FILE_PARSE_TYPE_NORMAL)
576 _info_set_attr_media (attrs, formatContext);
578 if (formatContext) { mmfile_format_close (formatContext); }
579 if (codecContext) { mmfile_codec_close (codecContext); }
580 return MM_ERROR_NONE;
584 if (frameContext.bCompressed) {
585 if (frameContext.frameData)
586 mmfile_free (frameContext.frameData);
588 if (frameContext.configData)
589 mmfile_free (frameContext.configData);
591 if (decodedFrame.frameData) {
592 mmfile_free (decodedFrame.frameData);
593 formatContext->thumbNail->frameData = NULL;
596 if (decodedFrame.configData) {
597 mmfile_free (decodedFrame.configData);
598 formatContext->thumbNail->configData = NULL;
601 if (frameContext.frameData) {
602 mmfile_free (frameContext.frameData);
603 formatContext->thumbNail->frameData = NULL;
606 if (frameContext.configData) {
607 mmfile_free (frameContext.configData);
608 formatContext->thumbNail->configData = NULL;
612 if (formatContext) { mmfile_format_close (formatContext); }
613 // if (codecContext) { mmfile_codec_close (codecContext); } /*dead code*/
620 _get_tag_info (mmf_attrs_t *attrs, MMFileSourceType *src)
622 MMFileFormatContext *formatContext = NULL;
625 ret = mmfile_format_open (&formatContext, src);
626 if (MMFILE_FORMAT_FAIL == ret || formatContext == NULL) {
627 debug_error ("error: mmfile_format_open\n");
628 ret = MM_ERROR_FILE_INTERNAL;
632 ret = mmfile_format_read_tag (formatContext);
633 if (MMFILE_FORMAT_FAIL == ret) {
634 debug_warning ("reading tag is fail\n");
635 ret = MM_ERROR_FILE_INTERNAL;
639 formatContext->commandType = MM_FILE_TAG;
641 _info_set_attr_media (attrs, formatContext);
643 if (formatContext) { mmfile_format_close (formatContext); }
645 return MM_ERROR_NONE;
649 if (formatContext) { mmfile_format_close (formatContext); }
651 return MM_ERROR_FILE_INTERNAL;
658 int mm_file_get_attrs(MMHandleType attrs, char **err_attr_name, const char *first_attribute_name, ...)
660 int ret = MM_ERROR_NONE;
665 debug_error ("Invalid arguments [attrs 0]\n");
666 return MM_ERROR_INVALID_ARGUMENT;
669 if ( first_attribute_name == NULL)
671 debug_error ("Invalid arguments [first_attribute_name null]\n");
672 return MM_ERROR_INVALID_ARGUMENT;
675 /* get requested attributes */
676 va_start (var_args, first_attribute_name);
677 ret = mm_attrs_get_valist(attrs, err_attr_name, first_attribute_name, var_args);
680 if (ret != MM_ERROR_NONE)
684 debug_error ("failed to get %s\n", *err_attr_name);
691 int mm_file_get_synclyrics_info(MMHandleType tag_attrs, int index, unsigned long *time_info, char **lyrics)
693 int ret = MM_ERROR_NONE;
694 AvSynclyricsInfo* sync_lyric_item = NULL;
695 GList *synclyrics_list = NULL;
697 #ifdef __MMFILE_TEST_MODE__
701 if ( (mmf_attrs_t*)tag_attrs == NULL) {
702 debug_error ("invalid handle");
703 return MM_ERROR_INVALID_ARGUMENT;
706 ret = mm_attrs_get_data_by_name (tag_attrs, MM_FILE_TAG_SYNCLYRICS, (void **)&synclyrics_list);
707 if(ret != MM_ERROR_NONE) {
708 #ifdef __MMFILE_TEST_MODE__
709 debug_warning ( "get data fail");
714 if(synclyrics_list != NULL) {
716 sync_lyric_item = (AvSynclyricsInfo*)g_list_nth_data(synclyrics_list, index);
718 if(sync_lyric_item == NULL) {
719 #ifdef __MMFILE_TEST_MODE__
720 debug_warning ( "synclyric item is NULL");
722 return MM_ERROR_COMMON_ATTR_NOT_EXIST;
725 *time_info = sync_lyric_item->time_info;
726 *lyrics = sync_lyric_item->lyric_info;
729 #ifdef __MMFILE_TEST_MODE__
730 debug_warning ( "synclyrics_list is NULL");
732 return MM_ERROR_COMMON_ATTR_NOT_EXIST;
739 int mm_file_create_tag_attrs(MMHandleType *tag_attrs, const char *filename)
741 int ret = MM_ERROR_NONE;
742 mmf_attrs_t *attrs = NULL;
743 MMFileSourceType src;
745 #ifdef __MMFILE_TEST_MODE__
749 /* Check argument here */
750 if (tag_attrs == NULL) {
751 debug_error ("Invalid arguments [tag null]\n");
752 return MM_ERROR_INVALID_ARGUMENT;
754 if (filename == NULL) {
755 debug_error ("Invalid arguments [filename null]\n");
756 return MM_ERROR_INVALID_ARGUMENT;
758 if ( strlen (filename) == 0) {
759 debug_error ("Invalid arguments [filename size 0]\n");
760 return MM_ERROR_INVALID_ARGUMENT;
764 #ifdef __MMFILE_DYN_LOADING__
765 MMFILE_FUNC_HANDLE func_handle;
767 ret = _load_dynamic_functions (&func_handle);
769 debug_error ("load library error\n");
770 return MM_ERROR_FILE_INTERNAL;
774 /*set source file infomation*/
775 MM_FILE_SET_MEDIA_FILE_SRC (src, filename);
777 ret = _is_file_exist (filename);
779 ret = MM_ERROR_FILE_NOT_FOUND;
784 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data ("tag", g_tag_attrs, ARRAY_SIZE (g_tag_attrs), NULL, NULL);
786 debug_error ("attribute internal error.\n");
787 ret = MM_ERROR_FILE_INTERNAL;
791 ret = _get_tag_info (attrs, &src);
792 if (ret != MM_ERROR_NONE) {
793 mmf_attrs_free ((MMHandleType)attrs);
795 debug_error ("failed to get tag: %s\n", filename);
798 *tag_attrs = (MMHandleType)attrs;
801 #ifdef __MMFILE_DYN_LOADING__
802 _unload_dynamic_functions (&func_handle);
805 #ifdef __MMFILE_TEST_MODE__
814 int mm_file_destroy_tag_attrs(MMHandleType tag_attrs)
816 void *artwork = NULL;
817 GList *synclyrics_list = NULL;
818 int ret = MM_ERROR_NONE;
820 #ifdef __MMFILE_TEST_MODE__
824 if ( (mmf_attrs_t*)tag_attrs == NULL) {
825 debug_error ("invalid handle.\n");
826 return MM_ERROR_INVALID_ARGUMENT;
829 ret = mm_attrs_get_data_by_name (tag_attrs, MM_FILE_TAG_ARTWORK, &artwork);
831 if (artwork != NULL) {
832 mmfile_free (artwork);
835 ret = mm_attrs_get_data_by_name (tag_attrs, MM_FILE_TAG_SYNCLYRICS, (void **)&synclyrics_list);
837 if(synclyrics_list != NULL) {
838 mm_file_free_synclyrics_list(synclyrics_list);
841 mmf_attrs_free (tag_attrs);
843 #ifdef __MMFILE_TEST_MODE__
851 int mm_file_create_content_attrs (MMHandleType *contents_attrs, const char *filename)
853 mmf_attrs_t *attrs = NULL;
854 MMFileSourceType src = {0,};
855 MMFILE_PARSE_INFO parse = {0,};
858 #ifdef __MMFILE_TEST_MODE__
862 /* Check argument here */
863 if (contents_attrs == NULL) {
864 debug_error ("Invalid arguments [contents null]\n");
865 return MM_ERROR_INVALID_ARGUMENT;
867 if (filename == NULL) {
868 debug_error ("Invalid arguments [filename null]\n");
869 return MM_ERROR_INVALID_ARGUMENT;
871 if ( strlen (filename) == 0) {
872 debug_error ("Invalid arguments [filename size 0]\n");
873 return MM_ERROR_INVALID_ARGUMENT;
877 #ifdef __MMFILE_DYN_LOADING__
878 MMFILE_FUNC_HANDLE func_handle;
885 ret = _load_dynamic_functions (&func_handle);
887 debug_error ("load library error\n");
888 return MM_ERROR_FILE_INTERNAL;
892 debug_msg("_load_dynamic_functions() = %lld\n", gettime() - ti);
897 /*set source file infomation*/
898 MM_FILE_SET_MEDIA_FILE_SRC (src, filename);
900 ret = _is_file_exist (filename);
902 ret = MM_ERROR_FILE_NOT_FOUND;
907 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data ("content", g_content_attrs, ARRAY_SIZE (g_content_attrs), NULL, NULL);
909 debug_error ("attribute internal error.\n");
910 ret = MM_ERROR_FILE_INTERNAL;
915 parse.type = MM_FILE_PARSE_TYPE_ALL;
916 ret = _get_contents_info (attrs, &src, &parse);
917 if (ret != MM_ERROR_NONE) {
918 mmf_attrs_free ((MMHandleType)attrs);
920 debug_error ("failed to get contents: %s\n", filename);
923 *contents_attrs = (MMHandleType) attrs;
927 #ifdef __MMFILE_DYN_LOADING__
933 _unload_dynamic_functions (&func_handle);
936 debug_msg("_unload_dynamic_functions() = %lld\n", gettime() - ti);
941 #ifdef __MMFILE_TEST_MODE__
950 int mm_file_create_tag_attrs_from_memory (MMHandleType *tag_attrs, const void *data, unsigned int size, int format)
952 mmf_attrs_t *attrs = NULL;
953 MMFileSourceType src;
954 MMFILE_PARSE_INFO parse = {0,};
957 #ifdef __MMFILE_TEST_MODE__
961 /* Check argument here */
962 if (tag_attrs == NULL || data == NULL) {
963 debug_error ("Invalid arguments\n");
964 return MM_ERROR_INVALID_ARGUMENT;
967 #ifdef __MMFILE_DYN_LOADING__
968 MMFILE_FUNC_HANDLE func_handle;
970 ret = _load_dynamic_functions (&func_handle);
972 debug_error ("load library error\n");
973 return MM_ERROR_FILE_INTERNAL;
977 MM_FILE_SET_MEDIA_MEM_SRC (src, data, size, format);
980 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data ("tag", g_tag_attrs, ARRAY_SIZE (g_tag_attrs), NULL, NULL);
982 debug_error ("attribute internal error.\n");
983 ret = MM_ERROR_FILE_INTERNAL;
987 parse.type = MM_FILE_PARSE_TYPE_ALL;
988 ret = _get_tag_info (attrs, &src);
989 if (ret != MM_ERROR_NONE) {
990 mmf_attrs_free ((MMHandleType)attrs);
992 debug_error ("failed to get tag");
995 *tag_attrs = (MMHandleType)attrs;
998 #ifdef __MMFILE_DYN_LOADING__
999 _unload_dynamic_functions (&func_handle);
1002 #ifdef __MMFILE_TEST_MODE__
1011 int mm_file_create_content_attrs_from_memory (MMHandleType *contents_attrs, const void *data, unsigned int size, int format)
1013 mmf_attrs_t *attrs = NULL;
1014 MMFileSourceType src;
1015 MMFILE_PARSE_INFO parse = {0,};
1018 #ifdef __MMFILE_TEST_MODE__
1022 /* Check argument here */
1023 if (contents_attrs == NULL || data == NULL) {
1024 debug_error ("Invalid arguments\n");
1025 return MM_ERROR_INVALID_ARGUMENT;
1028 #ifdef __MMFILE_DYN_LOADING__
1029 MMFILE_FUNC_HANDLE func_handle;
1031 ret = _load_dynamic_functions (&func_handle);
1033 debug_error ("load library error\n");
1034 return MM_ERROR_FILE_INTERNAL;
1038 MM_FILE_SET_MEDIA_MEM_SRC (src, data, size, format);
1041 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data ("content", g_content_attrs, ARRAY_SIZE (g_content_attrs), NULL, NULL);
1043 debug_error ("attribute internal error.\n");
1044 ret = MM_ERROR_FILE_INTERNAL;
1048 parse.type = MM_FILE_PARSE_TYPE_ALL;
1049 ret = _get_contents_info (attrs, &src, &parse);
1050 if (ret != MM_ERROR_NONE) {
1051 mmf_attrs_free ((MMHandleType)attrs);
1053 debug_error ("failed to get contents");
1056 *contents_attrs = (MMHandleType)attrs;
1059 #ifdef __MMFILE_DYN_LOADING__
1060 _unload_dynamic_functions (&func_handle);
1063 #ifdef __MMFILE_TEST_MODE__
1072 int mm_file_destroy_content_attrs (MMHandleType contents_attrs)
1074 void *thumbnail = NULL;
1075 int ret = MM_ERROR_NONE;
1077 #ifdef __MMFILE_TEST_MODE__
1081 if ((mmf_attrs_t*)contents_attrs == NULL) {
1082 debug_error ("invalid handle.\n");
1083 return MM_ERROR_INVALID_ARGUMENT;
1086 ret = mm_attrs_get_data_by_name(contents_attrs, MM_FILE_CONTENT_VIDEO_THUMBNAIL, &thumbnail);
1087 if (thumbnail != NULL) {
1088 mmfile_free (thumbnail);
1091 mmf_attrs_free (contents_attrs);
1093 #ifdef __MMFILE_TEST_MODE__
1102 int mm_file_get_stream_info(const char* filename, int *audio_stream_num, int *video_stream_num)
1104 MMFileSourceType src = {0,};
1105 MMFILE_PARSE_INFO parse = {0,};
1109 #ifdef __MMFILE_TEST_MODE__
1113 if (filename == NULL || strlen (filename) == 0 || audio_stream_num == NULL || video_stream_num == NULL) {
1114 debug_error ("Invalid arguments\n");
1115 return MM_ERROR_INVALID_ARGUMENT;
1118 #ifdef __MMFILE_DYN_LOADING__
1119 MMFILE_FUNC_HANDLE func_handle;
1121 ret = _load_dynamic_functions (&func_handle);
1123 debug_error ("load library error\n");
1124 return MM_ERROR_FILE_INTERNAL;
1128 /*set source file infomation*/
1129 MM_FILE_SET_MEDIA_FILE_SRC (src, filename);
1131 ret = _is_file_exist (filename);
1133 ret = MM_ERROR_FILE_NOT_FOUND;
1137 parse.type = MM_FILE_PARSE_TYPE_SIMPLE;
1138 ret = _get_contents_info (NULL, &src, &parse);
1139 if (ret != MM_ERROR_NONE) {
1140 debug_error ("failed to get stream info: %s\n", filename);
1142 if(parse.audio_track_num == 0 && parse.video_track_num == 0) {
1143 debug_error ("empty header. retry to get stream info: %s\n", filename);
1144 parse.type = MM_FILE_PARSE_TYPE_NORMAL;
1145 ret = _get_contents_info (NULL, &src, &parse);
1149 /*set number of each stream*/
1150 *audio_stream_num = parse.audio_track_num;
1151 *video_stream_num = parse.video_track_num;
1154 #ifdef __MMFILE_DYN_LOADING__
1155 _unload_dynamic_functions (&func_handle);
1158 #ifdef __MMFILE_TEST_MODE__
1166 int mm_file_create_content_attrs_simple(MMHandleType *contents_attrs, const char *filename)
1168 mmf_attrs_t *attrs = NULL;
1169 MMFileSourceType src = {0,};
1170 MMFILE_PARSE_INFO parse = {0,};
1173 #ifdef __MMFILE_TEST_MODE__
1177 #ifdef __MMFILE_DYN_LOADING__
1178 MMFILE_FUNC_HANDLE func_handle;
1180 ret = _load_dynamic_functions (&func_handle);
1182 debug_error ("load library error\n");
1183 return MM_ERROR_FILE_INTERNAL;
1186 if (filename == NULL) {
1187 ret = MM_ERROR_INVALID_ARGUMENT;
1190 if (strlen (filename) == 0) {
1191 ret = MM_ERROR_INVALID_ARGUMENT;
1196 /*set source file infomation*/
1197 MM_FILE_SET_MEDIA_FILE_SRC (src, filename);
1199 ret = _is_file_exist (filename);
1201 ret = MM_ERROR_FILE_NOT_FOUND;
1206 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data ("content", g_content_attrs, ARRAY_SIZE (g_content_attrs), NULL, NULL);
1208 debug_error ("attribute internal error.\n");
1209 ret = MM_ERROR_FILE_INTERNAL;
1213 parse.type = MM_FILE_PARSE_TYPE_NORMAL;
1214 ret = _get_contents_info (attrs, &src, &parse);
1215 if (ret != MM_ERROR_NONE) {
1216 mmf_attrs_free ((MMHandleType)attrs);
1218 debug_error ("failed to get contents: %s\n", filename);
1221 *contents_attrs = (MMHandleType) attrs;
1224 #ifdef __MMFILE_DYN_LOADING__
1225 _unload_dynamic_functions (&func_handle);
1228 #ifdef __MMFILE_TEST_MODE__
1236 int mm_file_create_content_attrs_safe(MMHandleType *contents_attrs, const char *filename)
1238 mmf_attrs_t *attrs = NULL;
1239 MMFileSourceType src = {0,};
1240 MMFILE_PARSE_INFO parse = {0,};
1243 #ifdef __MMFILE_TEST_MODE__
1247 #ifdef __MMFILE_DYN_LOADING__
1248 MMFILE_FUNC_HANDLE func_handle;
1250 ret = _load_dynamic_functions (&func_handle);
1252 debug_error ("load library error\n");
1253 return MM_ERROR_FILE_INTERNAL;
1256 if (filename == NULL) {
1257 ret = MM_ERROR_INVALID_ARGUMENT;
1260 if (strlen (filename) == 0) {
1261 ret = MM_ERROR_INVALID_ARGUMENT;
1266 /*set source file infomation*/
1267 MM_FILE_SET_MEDIA_FILE_SRC (src, filename);
1269 ret = _is_file_exist (filename);
1271 ret = MM_ERROR_FILE_NOT_FOUND;
1276 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data ("content", g_content_attrs, ARRAY_SIZE (g_content_attrs), NULL, NULL);
1278 debug_error ("attribute internal error.\n");
1279 ret = MM_ERROR_FILE_INTERNAL;
1283 parse.type = MM_FILE_PARSE_TYPE_SAFE;
1284 ret = _get_contents_info (attrs, &src, &parse);
1285 if (ret != MM_ERROR_NONE) {
1286 mmf_attrs_free ((MMHandleType)attrs);
1288 debug_error ("failed to get contents: %s\n", filename);
1291 *contents_attrs = (MMHandleType) attrs;
1294 #ifdef __MMFILE_DYN_LOADING__
1295 _unload_dynamic_functions (&func_handle);
1298 #ifdef __MMFILE_TEST_MODE__
1306 int mm_file_get_video_frame(const char* path, double timestamp, bool is_accurate, unsigned char **frame, int *size, int *width, int *height)
1309 void *formatFuncHandle = NULL;
1312 debug_error ("Invalid arguments [Path is Null]\n");
1313 return MM_ERROR_INVALID_ARGUMENT;
1316 #ifdef __MMFILE_DYN_LOADING__
1317 /* Get from function argument */
1318 formatFuncHandle = dlopen (MMFILE_FORMAT_SO_FILE_NAME, RTLD_LAZY);
1319 if (!formatFuncHandle) {
1320 debug_error ("error : dlopen");
1324 mmfile_format_get_frame = dlsym (formatFuncHandle, "mmfile_format_get_frame");
1325 if ( !mmfile_format_get_frame ) {
1326 debug_error ("error : load library");
1331 #ifdef __MMFILE_TEST_MODE__
1332 debug_msg("file path [%s] is_accurate [%d]", path, is_accurate);
1335 ret = mmfile_format_get_frame(path, timestamp, is_accurate, frame, size, width, height);
1336 if (ret == MMFILE_FORMAT_FAIL) {
1337 debug_error ("error : get frame");
1341 if (formatFuncHandle) dlclose (formatFuncHandle);
1343 return MM_ERROR_NONE;
1346 if (formatFuncHandle) dlclose (formatFuncHandle);
1348 return MM_ERROR_FILE_INTERNAL;
1352 int mm_file_get_video_frame_from_memory(const void *data, unsigned int datasize, double timestamp, bool is_accurate, unsigned char **frame, int *size, int *width, int *height)
1355 void *formatFuncHandle = NULL;
1358 debug_error ("Invalid arguments [data is Null]\n");
1359 return MM_ERROR_INVALID_ARGUMENT;
1362 if (datasize == 0) {
1363 debug_error ("Invalid arguments [datasize is zero]\n");
1364 return MM_ERROR_INVALID_ARGUMENT;
1367 #ifdef __MMFILE_DYN_LOADING__
1368 /* Get from function argument */
1369 formatFuncHandle = dlopen (MMFILE_FORMAT_SO_FILE_NAME, RTLD_LAZY);
1370 if (!formatFuncHandle) {
1371 debug_error ("error : dlopen");
1375 mmfile_format_get_frame_from_memory = dlsym (formatFuncHandle, "mmfile_format_get_frame_from_memory");
1376 if ( !mmfile_format_get_frame_from_memory ) {
1377 debug_error ("error : load library");
1382 #ifdef __MMFILE_TEST_MODE__
1383 debug_msg("data [%p], data_size[%d], is_accurate [%d]", data, datasize, is_accurate);
1386 ret = mmfile_format_get_frame_from_memory(data, datasize, timestamp, is_accurate, frame, size, width, height);
1387 if (ret == MMFILE_FORMAT_FAIL) {
1388 debug_error ("error : get frame");
1392 if (formatFuncHandle) dlclose (formatFuncHandle);
1394 return MM_ERROR_NONE;
1397 if (formatFuncHandle) dlclose (formatFuncHandle);
1399 return MM_ERROR_FILE_INTERNAL;
1403 int mm_file_check_uhqa(const char* filename, bool *is_uhqa)
1405 mmf_attrs_t *attrs = NULL;
1406 MMFileSourceType src = {0,};
1407 MMFILE_PARSE_INFO parse = {0,};
1410 #ifdef __MMFILE_DYN_LOADING__
1411 MMFILE_FUNC_HANDLE func_handle;
1413 ret = _load_dynamic_functions (&func_handle);
1415 debug_error ("load library error\n");
1416 return MM_ERROR_FILE_INTERNAL;
1419 if (filename == NULL) {
1420 ret = MM_ERROR_INVALID_ARGUMENT;
1423 if (strlen (filename) == 0) {
1424 ret = MM_ERROR_INVALID_ARGUMENT;
1429 /*set source file infomation*/
1430 MM_FILE_SET_MEDIA_FILE_SRC (src, filename);
1432 ret = _is_file_exist (filename);
1434 ret = MM_ERROR_FILE_NOT_FOUND;
1439 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data ("content", g_content_attrs, ARRAY_SIZE (g_content_attrs), NULL, NULL);
1441 debug_error ("attribute internal error.\n");
1442 ret = MM_ERROR_FILE_INTERNAL;
1446 parse.type = MM_FILE_PARSE_TYPE_NORMAL;
1447 ret = _get_contents_info (attrs, &src, &parse);
1448 if (ret == MM_ERROR_NONE) {
1449 *is_uhqa = parse.is_uhqa;
1451 debug_error ("_get_contents_info failed\n");
1455 mmf_attrs_free ((MMHandleType)attrs);
1459 #ifdef __MMFILE_DYN_LOADING__
1460 _unload_dynamic_functions (&func_handle);
1463 #ifdef __MMFILE_TEST_MODE__