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 */
31 /* internal MM header files */
32 #include <mm_attrs_private.h>
34 /* internal MM File headers */
35 #include "mm_file_debug.h"
36 #include "mm_file_formats.h"
37 #include "mm_file_format_frame.h"
38 #include "mm_file_codecs.h"
39 #include "mm_file_utils.h"
44 /*#define CHECK_TIME */
50 gettimeofday(&tv, NULL);
51 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
61 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
64 #define _SEEK_POINT_ 3000 /*1000 = 1 seconds*/
66 #define MM_FILE_TAG_SYNCLYRICS "tag-synclyrics" /**< Synchronized Lyrics Information*/
76 MM_FILE_PARSE_TYPE_SIMPLE, /*parse audio/video track num only*/
77 MM_FILE_PARSE_TYPE_NORMAL, /*parse infomation without thumbnail*/
78 MM_FILE_PARSE_TYPE_ALL, /*parse all infomation*/
79 MM_FILE_PARSE_TYPE_SAFE, /*parse infomation without both thumbnail and stream full-searching*/
90 void *formatFuncHandle;
91 void *codecFuncHandle;
99 static mmf_attrs_construct_info_t g_tag_attrs[] = {
100 {(char *)"tag-artist", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
101 {(char *)"tag-title", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
102 {(char *)"tag-album", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
103 {(char *)"tag-album-artist", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
104 {(char *)"tag-genre", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
105 {(char *)"tag-author", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
106 {(char *)"tag-copyright", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
107 {(char *)"tag-date", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
108 {(char *)"tag-description", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
109 {(char *)"tag-comment", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
110 {(char *)"tag-artwork", MMF_VALUE_TYPE_DATA, MM_ATTRS_FLAG_RW, (void *)NULL},
111 {(char *)"tag-artwork-size", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
112 {(char *)"tag-artwork-mime", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
113 {(char *)"tag-track-num", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
114 {(char *)"tag-classification", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
115 {(char *)"tag-rating", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
116 {(char *)"tag-longitude", MM_ATTRS_TYPE_DOUBLE, MM_ATTRS_FLAG_RW, (void *)0},
117 {(char *)"tag-latitude", MM_ATTRS_TYPE_DOUBLE, MM_ATTRS_FLAG_RW, (void *)0},
118 {(char *)"tag-altitude", MM_ATTRS_TYPE_DOUBLE, MM_ATTRS_FLAG_RW, (void *)0},
119 {(char *)"tag-conductor", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
120 {(char *)"tag-unsynclyrics", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
121 {(char *)"tag-synclyrics-num", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
122 {(char *)"tag-synclyrics", MMF_VALUE_TYPE_DATA, MM_ATTRS_FLAG_RW, (void *)NULL},
123 {(char *)"tag-recdate", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
124 {(char *)"tag-rotate", MMF_VALUE_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
125 {(char *)"tag-cdis", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
126 {(char *)"tag-smta", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
127 {(char *)"tag-360", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
128 {(char *)"tag-stitched_info", 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-format", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
135 {(char *)"content-video-bitrate", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
136 {(char *)"content-video-fps", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
137 {(char *)"content-video-width", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
138 {(char *)"content-video-height", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
139 {(char *)"content-video-thumbnail", MMF_VALUE_TYPE_DATA, MM_ATTRS_FLAG_RW, (void *)NULL},
140 {(char *)"content-video-track-index", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
141 {(char *)"content-video-track-count", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
142 {(char *)"content-audio-codec", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
143 {(char *)"content-audio-bitrate", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
144 {(char *)"content-audio-channels", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
145 {(char *)"content-audio-samplerate", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
146 {(char *)"content-audio-track-index", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
147 {(char *)"content-audio-track-count", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
148 {(char *)"content-audio-bitpersample", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
151 #ifdef __MMFILE_DYN_LOADING__
152 #define MMFILE_FORMAT_SO_FILE_NAME LIBDIR"/libmmfile_formats.so"
153 #define MMFILE_CODEC_SO_FILE_NAME LIBDIR"/libmmfile_codecs.so"
155 int (*mmfile_format_open)(MMFileFormatContext **formatContext, MMFileSourceType *fileSrc);
156 int (*mmfile_format_read_stream)(MMFileFormatContext *formatContext);
157 int (*mmfile_format_read_frame)(MMFileFormatContext *formatContext, unsigned int timestamp, MMFileFormatFrame *frame);
158 int (*mmfile_format_read_tag)(MMFileFormatContext *formatContext);
159 int (*mmfile_format_close)(MMFileFormatContext *formatContext);
160 int (*mmfile_codec_open)(MMFileCodecContext **codecContext, int codecType, int codecId, MMFileCodecFrame *input);
161 int (*mmfile_codec_decode)(MMFileCodecContext *codecContext, MMFileCodecFrame *output);
162 int (*mmfile_codec_close)(MMFileCodecContext *codecContext);
163 int (*mmfile_format_get_frame)(const char *path, double timestamp, bool is_accurate, unsigned char **frame, int *size, int *width, int *height);
164 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);
167 #ifdef __MMFILE_DYN_LOADING__
168 static int _load_dynamic_functions(MMFILE_FUNC_HANDLE *pHandle)
170 /* static int dll_func_initialized = 0; //disabled */
174 /* Get from function argument */
175 void *formatFuncHandle = NULL;
176 void *codecFuncHandle = NULL;
179 if (dll_func_initialized) {
184 formatFuncHandle = dlopen(MMFILE_FORMAT_SO_FILE_NAME, RTLD_LAZY);
185 if (!formatFuncHandle) {
186 debug_error("error: %s\n", "libmmfile_formats.so open error");
191 mmfile_format_open = dlsym(formatFuncHandle, "mmfile_format_open");
192 mmfile_format_read_stream = dlsym(formatFuncHandle, "mmfile_format_read_stream");
193 mmfile_format_read_frame = dlsym(formatFuncHandle, "mmfile_format_read_frame");
194 mmfile_format_read_tag = dlsym(formatFuncHandle, "mmfile_format_read_tag");
195 mmfile_format_close = dlsym(formatFuncHandle, "mmfile_format_close");
197 if (!mmfile_format_open ||
198 !mmfile_format_read_stream ||
199 !mmfile_format_read_frame ||
200 !mmfile_format_read_tag ||
201 !mmfile_format_close) {
203 debug_error("error: %s\n", "format function load error");
208 /*closed at app termination.*/
209 /*dlclose (formatFuncHandle); */
211 codecFuncHandle = dlopen(MMFILE_CODEC_SO_FILE_NAME, RTLD_LAZY | RTLD_GLOBAL);
212 if (!codecFuncHandle) {
213 debug_error("error: %s\n", "libmmfile_codecs.so open error");
218 mmfile_codec_open = dlsym(codecFuncHandle, "mmfile_codec_open");
219 mmfile_codec_decode = dlsym(codecFuncHandle, "mmfile_codec_decode");
220 mmfile_codec_close = dlsym(codecFuncHandle, "mmfile_codec_close");
222 if (!mmfile_codec_open || !mmfile_codec_decode || !mmfile_codec_close) {
223 debug_error("error: %s\n", "codec function load error");
228 /*closed at app termination.*/
229 /*dlclose (codecFuncHandle); */
231 /* dll_func_initialized = 1; // disabled */
233 pHandle->codecFuncHandle = codecFuncHandle;
234 pHandle->formatFuncHandle = formatFuncHandle;
239 if (formatFuncHandle) dlclose(formatFuncHandle);
240 if (codecFuncHandle) dlclose(codecFuncHandle);
245 static void _unload_dynamic_functions(MMFILE_FUNC_HANDLE *pHandle)
247 #ifdef __MMFILE_TEST_MODE__
251 if (pHandle->formatFuncHandle) {
252 dlclose(pHandle->formatFuncHandle);
254 if (pHandle->codecFuncHandle) {
255 dlclose(pHandle->codecFuncHandle);
258 #ifdef __MMFILE_TEST_MODE__
264 #endif /* __MMFILE_DYN_LOADING__ */
270 _is_file_exist(const char *filename)
274 const char *to_access = (strstr(filename, "file://") != NULL) ? filename + 7 : filename;
275 ret = access(to_access, R_OK);
277 debug_error("file [%s] not found.\n", to_access);
284 _info_set_attr_media(mmf_attrs_t *attrs, MMFileFormatContext *formatContext)
287 MMHandleType hattrs = CAST_MM_HANDLE(attrs);
289 if (formatContext->commandType == MM_FILE_TAG) {
290 if (formatContext->title) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_TITLE, formatContext->title);
291 if (formatContext->artist) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_ARTIST, formatContext->artist);
292 if (formatContext->author) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_AUTHOR, formatContext->author);
293 if (formatContext->composer && formatContext->author == NULL)
294 mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_AUTHOR, formatContext->composer);
295 if (formatContext->album) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_ALBUM, formatContext->album);
296 if (formatContext->album_artist) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_ALBUM_ARTIST, formatContext->album_artist);
297 if (formatContext->copyright) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_COPYRIGHT, formatContext->copyright);
298 if (formatContext->description) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_DESCRIPTION, formatContext->description);
299 if (formatContext->comment) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_COMMENT, formatContext->comment);
300 if (formatContext->genre) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_GENRE, formatContext->genre);
301 if (formatContext->classification) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_CLASSIFICATION, formatContext->classification);
302 if (formatContext->year) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_DATE, formatContext->year);
303 if (formatContext->tagTrackNum) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_TRACK_NUM, formatContext->tagTrackNum);
304 if (formatContext->rating) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_RATING, formatContext->rating);
305 if (formatContext->conductor) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_CONDUCTOR, formatContext->conductor);
306 if (formatContext->recDate) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_RECDATE, formatContext->recDate);
307 if (formatContext->rotate) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_ROTATE, formatContext->rotate);
308 mm_attrs_set_double_by_name(hattrs, MM_FILE_TAG_LONGITUDE, formatContext->longitude);
309 mm_attrs_set_double_by_name(hattrs, MM_FILE_TAG_LATIDUE, formatContext->latitude);
310 mm_attrs_set_double_by_name(hattrs, MM_FILE_TAG_ALTIDUE, formatContext->altitude);
311 mm_attrs_set_int_by_name(hattrs, MM_FILE_TAG_SYNCLYRICS_NUM, formatContext->syncLyricsNum);
312 mm_attrs_set_int_by_name(hattrs, MM_FILE_TAG_CDIS, formatContext->cdis);
313 mm_attrs_set_int_by_name(hattrs, MM_FILE_TAG_SMTA, formatContext->smta);
315 mm_attrs_set_int_by_name(hattrs, MM_FILE_TAG_360, formatContext->is_360);
316 mm_attrs_set_int_by_name(hattrs, MM_FILE_TAG_STITCHED_INFO, formatContext->stitched_info);
318 if ((formatContext->syncLyricsNum > 0) && (formatContext->syncLyrics))
319 mm_attrs_set_data_by_name(hattrs, MM_FILE_TAG_SYNCLYRICS, formatContext->syncLyrics, formatContext->syncLyricsNum);
321 if (formatContext->unsyncLyrics) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_UNSYNCLYRICS, formatContext->unsyncLyrics);
323 if (formatContext->artwork && formatContext->artworkSize > 0) {
324 void *artworkCopy = NULL;
325 artworkCopy = mmfile_malloc((formatContext->artworkSize));
326 if (NULL != artworkCopy) {
327 memcpy(artworkCopy, formatContext->artwork, formatContext->artworkSize);
328 mm_attrs_set_data_by_name(hattrs, MM_FILE_TAG_ARTWORK, artworkCopy, formatContext->artworkSize);
329 mm_attrs_set_int_by_name(hattrs, MM_FILE_TAG_ARTWORK_SIZE, formatContext->artworkSize);
330 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) {
335 mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_DURATION, formatContext->duration);
336 mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_AUDIO_TRACK_COUNT, formatContext->audioTotalTrackNum);
337 mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_VIDEO_TRACK_COUNT, formatContext->videoTotalTrackNum);
339 if (formatContext->videoTotalTrackNum > 0 &&
340 formatContext->nbStreams > 0 &&
341 formatContext->streams[MMFILE_VIDEO_STREAM]) {
343 MMFileFormatStream *videoStream = formatContext->streams[MMFILE_VIDEO_STREAM];
345 mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_VIDEO_FORMAT, formatContext->formatType);
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);
382 ret = mmf_attrs_commit((MMHandleType)hattrs);
388 _get_contents_info(mmf_attrs_t *attrs, MMFileSourceType *src, MMFILE_PARSE_INFO *parse)
390 MMFileFormatContext *formatContext = NULL;
391 MMFileCodecContext *codecContext = NULL;
392 MMFileFormatFrame frameContext = {0, };
393 MMFileCodecFrame codecFrame = {0, };
394 MMFileCodecFrame decodedFrame = {0, };
399 return FILEINFO_ERROR_FILE_INTERNAL;
401 ret = mmfile_format_open(&formatContext, src);
402 if (MMFILE_FORMAT_FAIL == ret || formatContext == NULL) {
403 debug_error("error: mmfile_format_open\n");
404 ret = FILEINFO_ERROR_FILE_INTERNAL;
408 if (parse->type >= MM_FILE_PARSE_TYPE_NORMAL) {
409 if (parse->type == MM_FILE_PARSE_TYPE_SAFE)
410 formatContext->cdis = 1;
411 ret = mmfile_format_read_stream(formatContext);
412 if (MMFILE_FORMAT_FAIL == ret) {
413 debug_error("error: mmfile_format_read_stream\n");
414 ret = FILEINFO_ERROR_FILE_INTERNAL;
418 parse->audio_track_num = formatContext->audioTotalTrackNum;
419 parse->video_track_num = formatContext->videoTotalTrackNum;
421 /* check uhqa content*/
422 if (formatContext->streams[MMFILE_AUDIO_STREAM] != NULL) {
423 parse->is_uhqa = formatContext->streams[MMFILE_AUDIO_STREAM]->is_uhqa;
425 parse->is_uhqa = FALSE;
428 if (parse->type >= MM_FILE_PARSE_TYPE_ALL) {
429 if (formatContext->videoTotalTrackNum > 0) {
431 if (parse->type != MM_FILE_PARSE_TYPE_SAFE) {
432 if (formatContext->formatType == MM_FILE_FORMAT_3GP || formatContext->formatType == MM_FILE_FORMAT_MP4) {
433 MMFileUtilGetMetaDataFromMP4(formatContext);
436 MMFileFormatStream *videoStream = formatContext->streams[MMFILE_VIDEO_STREAM];
437 unsigned int timestamp = _SEEK_POINT_;
439 ret = mmfile_format_read_frame(formatContext, timestamp, &frameContext);
440 if (MMFILE_FORMAT_FAIL == ret) {
441 debug_error("error: mmfile_format_read_frame\n");
442 ret = FILEINFO_ERROR_FILE_INTERNAL;
446 if (frameContext.bCompressed) {
447 codecFrame.frameDataSize = frameContext.frameSize;
448 codecFrame.width = frameContext.frameWidth;
449 codecFrame.height = frameContext.frameHeight;
450 codecFrame.frameData = frameContext.frameData;
451 codecFrame.configLen = frameContext.configLenth;
452 codecFrame.configData = frameContext.configData;
453 codecFrame.version = videoStream->version;
455 ret = mmfile_codec_open(&codecContext, MMFILE_VIDEO_DECODE, videoStream->codecId, &codecFrame);
456 if (MMFILE_FORMAT_FAIL == ret) {
457 debug_error("error: mmfile_codec_open\n");
458 ret = FILEINFO_ERROR_FILE_INTERNAL;
462 ret = mmfile_codec_decode(codecContext, &decodedFrame);
463 if (MMFILE_FORMAT_FAIL == ret) {
464 debug_error("error: mmfile_codec_decode\n");
465 ret = FILEINFO_ERROR_FILE_INTERNAL;
469 /* set video thumbnail */
470 formatContext->thumbNail = mmfile_malloc(sizeof(MMFileFormatFrame));
471 if (NULL == formatContext->thumbNail) {
472 debug_error("error: mmfile_malloc\n");
473 ret = FILEINFO_ERROR_FILE_INTERNAL;
477 formatContext->thumbNail->frameSize = decodedFrame.frameDataSize;
478 formatContext->thumbNail->frameWidth = decodedFrame.width;
479 formatContext->thumbNail->frameHeight = decodedFrame.height;
480 formatContext->thumbNail->frameData = decodedFrame.frameData;
481 formatContext->thumbNail->configLenth = 0;
482 formatContext->thumbNail->configData = NULL;
484 formatContext->thumbNail = mmfile_malloc(sizeof(MMFileFormatFrame));
485 if (NULL == formatContext->thumbNail) {
486 debug_error("error: mmfile_format_read_frame\n");
487 ret = FILEINFO_ERROR_FILE_INTERNAL;
491 formatContext->thumbNail->frameSize = frameContext.frameSize;
492 formatContext->thumbNail->frameWidth = frameContext.frameWidth;
493 formatContext->thumbNail->frameHeight = frameContext.frameHeight;
494 formatContext->thumbNail->frameData = frameContext.frameData;
495 formatContext->thumbNail->configLenth = 0;
496 formatContext->thumbNail->configData = NULL;
502 * if MM_FILE_PARSE_TYPE_SIMPLE, just get number of each stream.
504 parse->audio_track_num = formatContext->audioTotalTrackNum;
505 parse->video_track_num = formatContext->videoTotalTrackNum;
508 #ifdef __MMFILE_TEST_MODE__
509 mmfile_format_print_frame(&frameContext);
512 formatContext->commandType = MM_FILE_CONTENTS;
514 if (parse->type >= MM_FILE_PARSE_TYPE_NORMAL)
515 _info_set_attr_media(attrs, formatContext);
517 if (frameContext.bCompressed) {
518 if (frameContext.frameData) mmfile_free(frameContext.frameData);
519 if (frameContext.configData) mmfile_free(frameContext.configData);
521 if (decodedFrame.frameData) {
522 mmfile_free(decodedFrame.frameData);
523 formatContext->thumbNail->frameData = NULL;
525 if (decodedFrame.configData) {
526 mmfile_free(decodedFrame.configData);
527 formatContext->thumbNail->configData = NULL;
530 if (frameContext.frameData) {
531 mmfile_free(frameContext.frameData);
532 formatContext->thumbNail->frameData = NULL;
534 if (frameContext.configData) {
535 mmfile_free(frameContext.configData);
536 formatContext->thumbNail->configData = NULL;
541 mmfile_format_close(formatContext);
544 mmfile_codec_close(codecContext);
547 return FILEINFO_ERROR_NONE;
550 formatContext->commandType = MM_FILE_CONTENTS;
552 if (frameContext.bCompressed) {
553 if (frameContext.frameData)
554 mmfile_free(frameContext.frameData);
556 if (frameContext.configData)
557 mmfile_free(frameContext.configData);
559 if (decodedFrame.frameData) {
560 mmfile_free(decodedFrame.frameData);
561 if (formatContext->thumbNail)
562 formatContext->thumbNail->frameData = NULL;
565 if (decodedFrame.configData) {
566 mmfile_free(decodedFrame.configData);
567 if (formatContext->thumbNail)
568 formatContext->thumbNail->configData = NULL;
571 if (frameContext.frameData) {
572 mmfile_free(frameContext.frameData);
573 if (formatContext->thumbNail)
574 formatContext->thumbNail->frameData = NULL;
577 if (frameContext.configData) {
578 mmfile_free(frameContext.configData);
579 if (formatContext->thumbNail)
580 formatContext->thumbNail->configData = NULL;
584 if (parse->type >= MM_FILE_PARSE_TYPE_NORMAL)
585 _info_set_attr_media(attrs, formatContext);
588 mmfile_format_close(formatContext);
591 mmfile_codec_close(codecContext);
593 return FILEINFO_ERROR_NONE;
597 if (frameContext.bCompressed) {
598 if (frameContext.frameData)
599 mmfile_free(frameContext.frameData);
601 if (frameContext.configData)
602 mmfile_free(frameContext.configData);
604 if (decodedFrame.frameData) {
605 mmfile_free(decodedFrame.frameData);
606 if (formatContext->thumbNail)
607 formatContext->thumbNail->frameData = NULL;
610 if (decodedFrame.configData) {
611 mmfile_free(decodedFrame.configData);
612 if (formatContext->thumbNail)
613 formatContext->thumbNail->configData = NULL;
616 if (frameContext.frameData) {
617 mmfile_free(frameContext.frameData);
618 if (formatContext->thumbNail)
619 formatContext->thumbNail->frameData = NULL;
622 if (frameContext.configData) {
623 mmfile_free(frameContext.configData);
624 if (formatContext->thumbNail)
625 formatContext->thumbNail->configData = NULL;
630 mmfile_format_close(formatContext);
632 /* if (codecContext) { mmfile_codec_close(codecContext); } */ /*dead code*/
639 _get_tag_info(mmf_attrs_t *attrs, MMFileSourceType *src)
641 MMFileFormatContext *formatContext = NULL;
644 ret = mmfile_format_open(&formatContext, src);
645 if (MMFILE_FORMAT_FAIL == ret || formatContext == NULL) {
646 debug_error("error: mmfile_format_open\n");
647 ret = FILEINFO_ERROR_FILE_INTERNAL;
651 ret = mmfile_format_read_tag(formatContext);
652 if (MMFILE_FORMAT_FAIL == ret) {
653 debug_warning("reading tag is fail\n");
654 ret = FILEINFO_ERROR_FILE_INTERNAL;
658 formatContext->commandType = MM_FILE_TAG;
660 _info_set_attr_media(attrs, formatContext);
663 mmfile_format_close(formatContext);
666 return FILEINFO_ERROR_NONE;
671 mmfile_format_close(formatContext);
674 return FILEINFO_ERROR_FILE_INTERNAL;
681 int mm_file_get_attrs(MMHandleType attrs, char **err_attr_name, const char *first_attribute_name, ...)
683 int ret = FILEINFO_ERROR_NONE;
687 debug_error("Invalid arguments [attrs 0]\n");
688 return FILEINFO_ERROR_INVALID_ARGUMENT;
691 if (first_attribute_name == NULL) {
692 debug_error("Invalid arguments [first_attribute_name null]\n");
693 return FILEINFO_ERROR_INVALID_ARGUMENT;
696 /* get requested attributes */
697 va_start(var_args, first_attribute_name);
698 ret = mm_attrs_get_valist(attrs, err_attr_name, first_attribute_name, var_args);
701 if (ret != FILEINFO_ERROR_NONE) {
703 debug_error("failed to get %s\n", *err_attr_name);
710 int mm_file_get_synclyrics_info(MMHandleType tag_attrs, int index, unsigned long *time_info, char **lyrics)
712 int ret = FILEINFO_ERROR_NONE;
713 AvSynclyricsInfo *sync_lyric_item = NULL;
714 GList *synclyrics_list = NULL;
716 #ifdef __MMFILE_TEST_MODE__
720 if ((mmf_attrs_t *)tag_attrs == NULL) {
721 debug_error("invalid handle");
722 return FILEINFO_ERROR_INVALID_ARGUMENT;
725 ret = mm_attrs_get_data_by_name(tag_attrs, MM_FILE_TAG_SYNCLYRICS, (void **)&synclyrics_list);
726 if (ret != FILEINFO_ERROR_NONE) {
727 #ifdef __MMFILE_TEST_MODE__
728 debug_warning("get data fail");
733 if (synclyrics_list != NULL) {
735 sync_lyric_item = (AvSynclyricsInfo *)g_list_nth_data(synclyrics_list, index);
737 if (sync_lyric_item == NULL) {
738 #ifdef __MMFILE_TEST_MODE__
739 debug_warning("synclyric item is NULL");
741 return FILEINFO_ERROR_ATTR_NOT_EXIST;
744 *time_info = sync_lyric_item->time_info;
745 *lyrics = sync_lyric_item->lyric_info;
748 #ifdef __MMFILE_TEST_MODE__
749 debug_warning("synclyrics_list is NULL");
751 return FILEINFO_ERROR_ATTR_NOT_EXIST;
758 int mm_file_create_tag_attrs(MMHandleType *tag_attrs, const char *filename)
760 int ret = FILEINFO_ERROR_NONE;
761 mmf_attrs_t *attrs = NULL;
762 MMFileSourceType src;
764 #ifdef __MMFILE_TEST_MODE__
768 /* Check argument here */
769 if (tag_attrs == NULL) {
770 debug_error("Invalid arguments [tag null]\n");
771 return FILEINFO_ERROR_INVALID_ARGUMENT;
773 if (filename == NULL) {
774 debug_error("Invalid arguments [filename null]\n");
775 return FILEINFO_ERROR_INVALID_ARGUMENT;
777 if (strlen(filename) == 0) {
778 debug_error("Invalid arguments [filename size 0]\n");
779 return FILEINFO_ERROR_INVALID_ARGUMENT;
783 #ifdef __MMFILE_DYN_LOADING__
784 MMFILE_FUNC_HANDLE func_handle;
786 ret = _load_dynamic_functions(&func_handle);
788 debug_error("load library error\n");
789 return FILEINFO_ERROR_FILE_INTERNAL;
793 /*set source file infomation*/
794 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
796 ret = _is_file_exist(filename);
798 ret = FILEINFO_ERROR_FILE_NOT_FOUND;
803 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data("tag", g_tag_attrs, ARRAY_SIZE(g_tag_attrs), NULL, NULL);
805 debug_error("attribute internal error.\n");
806 ret = FILEINFO_ERROR_FILE_INTERNAL;
810 ret = _get_tag_info(attrs, &src);
811 if (ret != FILEINFO_ERROR_NONE) {
812 mmf_attrs_free((MMHandleType)attrs);
814 debug_error("failed to get tag: %s\n", filename);
817 *tag_attrs = (MMHandleType)attrs;
820 #ifdef __MMFILE_DYN_LOADING__
821 _unload_dynamic_functions(&func_handle);
824 #ifdef __MMFILE_TEST_MODE__
833 int mm_file_destroy_tag_attrs(MMHandleType tag_attrs)
835 void *artwork = NULL;
836 GList *synclyrics_list = NULL;
837 int ret = FILEINFO_ERROR_NONE;
839 #ifdef __MMFILE_TEST_MODE__
843 if ((mmf_attrs_t *)tag_attrs == NULL) {
844 debug_error("invalid handle.\n");
845 return FILEINFO_ERROR_INVALID_ARGUMENT;
848 ret = mm_attrs_get_data_by_name(tag_attrs, MM_FILE_TAG_ARTWORK, &artwork);
850 if (artwork != NULL) {
851 mmfile_free(artwork);
854 ret = mm_attrs_get_data_by_name(tag_attrs, MM_FILE_TAG_SYNCLYRICS, (void **)&synclyrics_list);
856 if (synclyrics_list != NULL) {
857 mm_file_free_synclyrics_list(synclyrics_list);
860 mmf_attrs_free(tag_attrs);
862 #ifdef __MMFILE_TEST_MODE__
870 int mm_file_create_content_attrs(MMHandleType *contents_attrs, const char *filename)
872 mmf_attrs_t *attrs = NULL;
873 MMFileSourceType src = {0, };
874 MMFILE_PARSE_INFO parse = {0, };
877 #ifdef __MMFILE_TEST_MODE__
881 /* Check argument here */
882 if (contents_attrs == NULL) {
883 debug_error("Invalid arguments [contents null]\n");
884 return FILEINFO_ERROR_INVALID_ARGUMENT;
886 if (filename == NULL) {
887 debug_error("Invalid arguments [filename null]\n");
888 return FILEINFO_ERROR_INVALID_ARGUMENT;
890 if (strlen(filename) == 0) {
891 debug_error("Invalid arguments [filename size 0]\n");
892 return FILEINFO_ERROR_INVALID_ARGUMENT;
896 #ifdef __MMFILE_DYN_LOADING__
897 MMFILE_FUNC_HANDLE func_handle;
904 ret = _load_dynamic_functions(&func_handle);
906 debug_error("load library error\n");
907 return FILEINFO_ERROR_FILE_INTERNAL;
911 debug_msg("_load_dynamic_functions() = %lld\n", gettime() - ti);
916 /*set source file infomation*/
917 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
919 ret = _is_file_exist(filename);
921 ret = FILEINFO_ERROR_FILE_NOT_FOUND;
926 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data("content", g_content_attrs, ARRAY_SIZE(g_content_attrs), NULL, NULL);
928 debug_error("attribute internal error.\n");
929 ret = FILEINFO_ERROR_FILE_INTERNAL;
934 parse.type = MM_FILE_PARSE_TYPE_ALL;
935 ret = _get_contents_info(attrs, &src, &parse);
936 if (ret != FILEINFO_ERROR_NONE) {
937 mmf_attrs_free((MMHandleType)attrs);
939 debug_error("failed to get contents: %s\n", filename);
942 *contents_attrs = (MMHandleType) attrs;
946 #ifdef __MMFILE_DYN_LOADING__
952 _unload_dynamic_functions(&func_handle);
955 debug_msg("_unload_dynamic_functions() = %lld\n", gettime() - ti);
960 #ifdef __MMFILE_TEST_MODE__
969 int mm_file_create_tag_attrs_from_memory(MMHandleType *tag_attrs, const void *data, unsigned int size, int format)
971 mmf_attrs_t *attrs = NULL;
972 MMFileSourceType src;
973 /*MMFILE_PARSE_INFO parse = {0, };*/
976 #ifdef __MMFILE_TEST_MODE__
980 /* Check argument here */
981 if (tag_attrs == NULL || data == NULL) {
982 debug_error("Invalid arguments\n");
983 return FILEINFO_ERROR_INVALID_ARGUMENT;
986 #ifdef __MMFILE_DYN_LOADING__
987 MMFILE_FUNC_HANDLE func_handle;
989 ret = _load_dynamic_functions(&func_handle);
991 debug_error("load library error\n");
992 return FILEINFO_ERROR_FILE_INTERNAL;
996 MM_FILE_SET_MEDIA_MEM_SRC(src, data, size, format);
999 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data("tag", g_tag_attrs, ARRAY_SIZE(g_tag_attrs), NULL, NULL);
1001 debug_error("attribute internal error.\n");
1002 ret = FILEINFO_ERROR_FILE_INTERNAL;
1006 /*parse.type = MM_FILE_PARSE_TYPE_ALL;*/
1007 ret = _get_tag_info(attrs, &src);
1008 if (ret != FILEINFO_ERROR_NONE) {
1009 mmf_attrs_free((MMHandleType)attrs);
1011 debug_error("failed to get tag");
1014 *tag_attrs = (MMHandleType)attrs;
1017 #ifdef __MMFILE_DYN_LOADING__
1018 _unload_dynamic_functions(&func_handle);
1021 #ifdef __MMFILE_TEST_MODE__
1030 int mm_file_create_content_attrs_from_memory(MMHandleType *contents_attrs, const void *data, unsigned int size, int format)
1032 mmf_attrs_t *attrs = NULL;
1033 MMFileSourceType src;
1034 MMFILE_PARSE_INFO parse = {0, };
1037 #ifdef __MMFILE_TEST_MODE__
1041 /* Check argument here */
1042 if (contents_attrs == NULL || data == NULL) {
1043 debug_error("Invalid arguments\n");
1044 return FILEINFO_ERROR_INVALID_ARGUMENT;
1047 #ifdef __MMFILE_DYN_LOADING__
1048 MMFILE_FUNC_HANDLE func_handle;
1050 ret = _load_dynamic_functions(&func_handle);
1052 debug_error("load library error\n");
1053 return FILEINFO_ERROR_FILE_INTERNAL;
1057 MM_FILE_SET_MEDIA_MEM_SRC(src, data, size, format);
1060 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data("content", g_content_attrs, ARRAY_SIZE(g_content_attrs), NULL, NULL);
1062 debug_error("attribute internal error.\n");
1063 ret = FILEINFO_ERROR_FILE_INTERNAL;
1067 parse.type = MM_FILE_PARSE_TYPE_ALL;
1068 ret = _get_contents_info(attrs, &src, &parse);
1069 if (ret != FILEINFO_ERROR_NONE) {
1070 mmf_attrs_free((MMHandleType)attrs);
1072 debug_error("failed to get contents");
1075 *contents_attrs = (MMHandleType)attrs;
1078 #ifdef __MMFILE_DYN_LOADING__
1079 _unload_dynamic_functions(&func_handle);
1082 #ifdef __MMFILE_TEST_MODE__
1091 int mm_file_destroy_content_attrs(MMHandleType contents_attrs)
1093 void *thumbnail = NULL;
1094 int ret = FILEINFO_ERROR_NONE;
1096 #ifdef __MMFILE_TEST_MODE__
1100 if ((mmf_attrs_t *)contents_attrs == NULL) {
1101 debug_error("invalid handle.\n");
1102 return FILEINFO_ERROR_INVALID_ARGUMENT;
1105 ret = mm_attrs_get_data_by_name(contents_attrs, MM_FILE_CONTENT_VIDEO_THUMBNAIL, &thumbnail);
1106 if (thumbnail != NULL) {
1107 mmfile_free(thumbnail);
1110 mmf_attrs_free(contents_attrs);
1112 #ifdef __MMFILE_TEST_MODE__
1121 int mm_file_get_stream_info(const char *filename, int *audio_stream_num, int *video_stream_num)
1123 MMFileSourceType src = {0, };
1124 MMFILE_PARSE_INFO parse = {0, };
1128 #ifdef __MMFILE_TEST_MODE__
1132 if (filename == NULL || strlen(filename) == 0 || audio_stream_num == NULL || video_stream_num == NULL) {
1133 debug_error("Invalid arguments\n");
1134 return FILEINFO_ERROR_INVALID_ARGUMENT;
1137 #ifdef __MMFILE_DYN_LOADING__
1138 MMFILE_FUNC_HANDLE func_handle;
1140 ret = _load_dynamic_functions(&func_handle);
1142 debug_error("load library error\n");
1143 return FILEINFO_ERROR_FILE_INTERNAL;
1147 /*set source file infomation*/
1148 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
1150 ret = _is_file_exist(filename);
1152 ret = FILEINFO_ERROR_FILE_NOT_FOUND;
1156 parse.type = MM_FILE_PARSE_TYPE_SIMPLE;
1157 ret = _get_contents_info(NULL, &src, &parse);
1158 if (ret != FILEINFO_ERROR_NONE) {
1159 debug_error("failed to get stream info: %s\n", filename);
1161 if (parse.audio_track_num == 0 && parse.video_track_num == 0) {
1162 debug_error("empty header. retry to get stream info: %s\n", filename);
1163 parse.type = MM_FILE_PARSE_TYPE_NORMAL;
1164 ret = _get_contents_info(NULL, &src, &parse);
1168 /*set number of each stream*/
1169 *audio_stream_num = parse.audio_track_num;
1170 *video_stream_num = parse.video_track_num;
1173 #ifdef __MMFILE_DYN_LOADING__
1174 _unload_dynamic_functions(&func_handle);
1177 #ifdef __MMFILE_TEST_MODE__
1185 int mm_file_create_content_attrs_simple(MMHandleType *contents_attrs, const char *filename)
1187 mmf_attrs_t *attrs = NULL;
1188 MMFileSourceType src = {0, };
1189 MMFILE_PARSE_INFO parse = {0, };
1192 #ifdef __MMFILE_TEST_MODE__
1196 #ifdef __MMFILE_DYN_LOADING__
1197 MMFILE_FUNC_HANDLE func_handle;
1199 ret = _load_dynamic_functions(&func_handle);
1201 debug_error("load library error\n");
1202 return FILEINFO_ERROR_FILE_INTERNAL;
1205 if (filename == NULL) {
1206 ret = FILEINFO_ERROR_INVALID_ARGUMENT;
1209 if (strlen(filename) == 0) {
1210 ret = FILEINFO_ERROR_INVALID_ARGUMENT;
1215 /*set source file infomation*/
1216 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
1218 ret = _is_file_exist(filename);
1220 ret = FILEINFO_ERROR_FILE_NOT_FOUND;
1225 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data("content", g_content_attrs, ARRAY_SIZE(g_content_attrs), NULL, NULL);
1227 debug_error("attribute internal error.\n");
1228 ret = FILEINFO_ERROR_FILE_INTERNAL;
1232 parse.type = MM_FILE_PARSE_TYPE_NORMAL;
1233 ret = _get_contents_info(attrs, &src, &parse);
1234 if (ret != FILEINFO_ERROR_NONE) {
1235 mmf_attrs_free((MMHandleType)attrs);
1237 debug_error("failed to get contents: %s\n", filename);
1240 *contents_attrs = (MMHandleType) attrs;
1243 #ifdef __MMFILE_DYN_LOADING__
1244 _unload_dynamic_functions(&func_handle);
1247 #ifdef __MMFILE_TEST_MODE__
1255 int mm_file_create_content_attrs_safe(MMHandleType *contents_attrs, const char *filename)
1257 mmf_attrs_t *attrs = NULL;
1258 MMFileSourceType src = {0, };
1259 MMFILE_PARSE_INFO parse = {0, };
1262 #ifdef __MMFILE_TEST_MODE__
1266 #ifdef __MMFILE_DYN_LOADING__
1267 MMFILE_FUNC_HANDLE func_handle;
1269 ret = _load_dynamic_functions(&func_handle);
1271 debug_error("load library error\n");
1272 return FILEINFO_ERROR_FILE_INTERNAL;
1275 if (filename == NULL) {
1276 ret = FILEINFO_ERROR_INVALID_ARGUMENT;
1279 if (strlen(filename) == 0) {
1280 ret = FILEINFO_ERROR_INVALID_ARGUMENT;
1285 /*set source file infomation*/
1286 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
1288 ret = _is_file_exist(filename);
1290 ret = FILEINFO_ERROR_FILE_NOT_FOUND;
1295 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data("content", g_content_attrs, ARRAY_SIZE(g_content_attrs), NULL, NULL);
1297 debug_error("attribute internal error.\n");
1298 ret = FILEINFO_ERROR_FILE_INTERNAL;
1302 parse.type = MM_FILE_PARSE_TYPE_SAFE;
1303 ret = _get_contents_info(attrs, &src, &parse);
1304 if (ret != FILEINFO_ERROR_NONE) {
1305 mmf_attrs_free((MMHandleType)attrs);
1307 debug_error("failed to get contents: %s\n", filename);
1310 *contents_attrs = (MMHandleType) attrs;
1313 #ifdef __MMFILE_DYN_LOADING__
1314 _unload_dynamic_functions(&func_handle);
1317 #ifdef __MMFILE_TEST_MODE__
1325 int mm_file_get_video_frame(const char *path, double timestamp, bool is_accurate, unsigned char **frame, int *size, int *width, int *height)
1328 void *formatFuncHandle = NULL;
1331 debug_error("Invalid arguments [Path is Null]\n");
1332 return FILEINFO_ERROR_INVALID_ARGUMENT;
1335 #ifdef __MMFILE_DYN_LOADING__
1336 /* Get from function argument */
1337 formatFuncHandle = dlopen(MMFILE_FORMAT_SO_FILE_NAME, RTLD_LAZY);
1338 if (!formatFuncHandle) {
1339 debug_error("error : dlopen");
1343 mmfile_format_get_frame = dlsym(formatFuncHandle, "mmfile_format_get_frame");
1344 if (!mmfile_format_get_frame) {
1345 debug_error("error : load library");
1350 #ifdef __MMFILE_TEST_MODE__
1351 debug_msg("file path [%s] is_accurate [%d]", path, is_accurate);
1354 ret = mmfile_format_get_frame(path, timestamp, is_accurate, frame, size, width, height);
1355 if (ret == MMFILE_FORMAT_FAIL) {
1356 debug_error("error : get frame");
1360 if (formatFuncHandle) dlclose(formatFuncHandle);
1362 return FILEINFO_ERROR_NONE;
1365 if (formatFuncHandle) dlclose(formatFuncHandle);
1367 return FILEINFO_ERROR_FILE_INTERNAL;
1371 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)
1374 void *formatFuncHandle = NULL;
1377 debug_error("Invalid arguments [data is Null]\n");
1378 return FILEINFO_ERROR_INVALID_ARGUMENT;
1381 if (datasize == 0) {
1382 debug_error("Invalid arguments [datasize is zero]\n");
1383 return FILEINFO_ERROR_INVALID_ARGUMENT;
1386 #ifdef __MMFILE_DYN_LOADING__
1387 /* Get from function argument */
1388 formatFuncHandle = dlopen(MMFILE_FORMAT_SO_FILE_NAME, RTLD_LAZY);
1389 if (!formatFuncHandle) {
1390 debug_error("error : dlopen");
1394 mmfile_format_get_frame_from_memory = dlsym(formatFuncHandle, "mmfile_format_get_frame_from_memory");
1395 if (!mmfile_format_get_frame_from_memory) {
1396 debug_error("error : load library");
1401 #ifdef __MMFILE_TEST_MODE__
1402 debug_msg("data [%p], data_size[%d], is_accurate [%d]", data, datasize, is_accurate);
1405 ret = mmfile_format_get_frame_from_memory(data, datasize, timestamp, is_accurate, frame, size, width, height);
1406 if (ret == MMFILE_FORMAT_FAIL) {
1407 debug_error("error : get frame");
1411 if (formatFuncHandle) dlclose(formatFuncHandle);
1413 return FILEINFO_ERROR_NONE;
1416 if (formatFuncHandle) dlclose(formatFuncHandle);
1418 return FILEINFO_ERROR_FILE_INTERNAL;
1422 int mm_file_check_uhqa(const char *filename, bool *is_uhqa)
1424 mmf_attrs_t *attrs = NULL;
1425 MMFileSourceType src = {0, };
1426 MMFILE_PARSE_INFO parse = {0, };
1429 #ifdef __MMFILE_DYN_LOADING__
1430 MMFILE_FUNC_HANDLE func_handle;
1432 ret = _load_dynamic_functions(&func_handle);
1434 debug_error("load library error\n");
1435 return FILEINFO_ERROR_FILE_INTERNAL;
1438 if (filename == NULL) {
1439 ret = FILEINFO_ERROR_INVALID_ARGUMENT;
1442 if (strlen(filename) == 0) {
1443 ret = FILEINFO_ERROR_INVALID_ARGUMENT;
1448 /*set source file infomation*/
1449 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
1451 ret = _is_file_exist(filename);
1453 ret = FILEINFO_ERROR_FILE_NOT_FOUND;
1458 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data("content", g_content_attrs, ARRAY_SIZE(g_content_attrs), NULL, NULL);
1460 debug_error("attribute internal error.\n");
1461 ret = FILEINFO_ERROR_FILE_INTERNAL;
1465 parse.type = MM_FILE_PARSE_TYPE_NORMAL;
1466 ret = _get_contents_info(attrs, &src, &parse);
1467 if (ret == FILEINFO_ERROR_NONE) {
1468 *is_uhqa = parse.is_uhqa;
1470 debug_error("_get_contents_info failed\n");
1474 mmf_attrs_free((MMHandleType)attrs);
1478 #ifdef __MMFILE_DYN_LOADING__
1479 _unload_dynamic_functions(&func_handle);
1482 #ifdef __MMFILE_TEST_MODE__