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},
130 static mmf_attrs_construct_info_t g_content_attrs[] = {
131 {(char *)"content-duration", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
132 {(char *)"content-video-codec", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
133 {(char *)"content-video-bitrate", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
134 {(char *)"content-video-fps", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
135 {(char *)"content-video-width", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
136 {(char *)"content-video-height", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
137 {(char *)"content-video-thumbnail", MMF_VALUE_TYPE_DATA, MM_ATTRS_FLAG_RW, (void *)NULL},
138 {(char *)"content-video-track-index", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
139 {(char *)"content-video-track-count", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
140 {(char *)"content-audio-codec", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
141 {(char *)"content-audio-bitrate", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
142 {(char *)"content-audio-channels", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
143 {(char *)"content-audio-samplerate", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
144 {(char *)"content-audio-track-index", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
145 {(char *)"content-audio-track-count", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
146 {(char *)"content-audio-bitpersample", MMF_VALUE_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
149 #ifdef __MMFILE_DYN_LOADING__
150 #define MMFILE_FORMAT_SO_FILE_NAME LIBDIR"/libmmfile_formats.so"
151 #define MMFILE_CODEC_SO_FILE_NAME LIBDIR"/libmmfile_codecs.so"
153 int (*mmfile_format_open)(MMFileFormatContext **formatContext, MMFileSourceType *fileSrc);
154 int (*mmfile_format_read_stream)(MMFileFormatContext *formatContext);
155 int (*mmfile_format_read_frame)(MMFileFormatContext *formatContext, unsigned int timestamp, MMFileFormatFrame *frame);
156 int (*mmfile_format_read_tag)(MMFileFormatContext *formatContext);
157 int (*mmfile_format_close)(MMFileFormatContext *formatContext);
158 int (*mmfile_codec_open)(MMFileCodecContext **codecContext, int codecType, int codecId, MMFileCodecFrame *input);
159 int (*mmfile_codec_decode)(MMFileCodecContext *codecContext, MMFileCodecFrame *output);
160 int (*mmfile_codec_close)(MMFileCodecContext *codecContext);
161 int (*mmfile_format_get_frame)(const char *path, double timestamp, bool is_accurate, unsigned char **frame, int *size, int *width, int *height);
162 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);
165 #ifdef __MMFILE_DYN_LOADING__
166 static int _load_dynamic_functions(MMFILE_FUNC_HANDLE *pHandle)
168 /* static int dll_func_initialized = 0; //disabled */
172 /* Get from function argument */
173 void *formatFuncHandle = NULL;
174 void *codecFuncHandle = NULL;
177 if (dll_func_initialized) {
182 formatFuncHandle = dlopen(MMFILE_FORMAT_SO_FILE_NAME, RTLD_LAZY);
183 if (!formatFuncHandle) {
184 debug_error("error: %s\n", "libmmfile_formats.so open error");
189 mmfile_format_open = dlsym(formatFuncHandle, "mmfile_format_open");
190 mmfile_format_read_stream = dlsym(formatFuncHandle, "mmfile_format_read_stream");
191 mmfile_format_read_frame = dlsym(formatFuncHandle, "mmfile_format_read_frame");
192 mmfile_format_read_tag = dlsym(formatFuncHandle, "mmfile_format_read_tag");
193 mmfile_format_close = dlsym(formatFuncHandle, "mmfile_format_close");
195 if (!mmfile_format_open ||
196 !mmfile_format_read_stream ||
197 !mmfile_format_read_frame ||
198 !mmfile_format_read_tag ||
199 !mmfile_format_close) {
201 debug_error("error: %s\n", "format function load error");
206 /*closed at app termination.*/
207 /*dlclose (formatFuncHandle); */
209 codecFuncHandle = dlopen(MMFILE_CODEC_SO_FILE_NAME, RTLD_LAZY | RTLD_GLOBAL);
210 if (!codecFuncHandle) {
211 debug_error("error: %s\n", "libmmfile_codecs.so open error");
216 mmfile_codec_open = dlsym(codecFuncHandle, "mmfile_codec_open");
217 mmfile_codec_decode = dlsym(codecFuncHandle, "mmfile_codec_decode");
218 mmfile_codec_close = dlsym(codecFuncHandle, "mmfile_codec_close");
220 if (!mmfile_codec_open || !mmfile_codec_decode || !mmfile_codec_close) {
221 debug_error("error: %s\n", "codec function load error");
226 /*closed at app termination.*/
227 /*dlclose (codecFuncHandle); */
229 /* dll_func_initialized = 1; // disabled */
231 pHandle->codecFuncHandle = codecFuncHandle;
232 pHandle->formatFuncHandle = formatFuncHandle;
237 if (formatFuncHandle) dlclose(formatFuncHandle);
238 if (codecFuncHandle) dlclose(codecFuncHandle);
243 static void _unload_dynamic_functions(MMFILE_FUNC_HANDLE *pHandle)
245 #ifdef __MMFILE_TEST_MODE__
249 if (pHandle->formatFuncHandle) {
250 dlclose(pHandle->formatFuncHandle);
252 if (pHandle->codecFuncHandle) {
253 dlclose(pHandle->codecFuncHandle);
256 #ifdef __MMFILE_TEST_MODE__
262 #endif /* __MMFILE_DYN_LOADING__ */
268 _is_file_exist(const char *filename)
272 const char *to_access = (strstr(filename, "file://") != NULL) ? filename + 7 : filename;
273 ret = access(to_access, R_OK);
275 debug_error("file [%s] not found.\n", to_access);
282 _info_set_attr_media(mmf_attrs_t *attrs, MMFileFormatContext *formatContext)
285 MMHandleType hattrs = CAST_MM_HANDLE(attrs);
287 if (formatContext->commandType == MM_FILE_TAG) {
288 if (formatContext->title) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_TITLE, formatContext->title);
289 if (formatContext->artist) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_ARTIST, formatContext->artist);
290 if (formatContext->author) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_AUTHOR, formatContext->author);
291 if (formatContext->composer && formatContext->author == NULL)
292 mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_AUTHOR, formatContext->composer);
293 if (formatContext->album) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_ALBUM, formatContext->album);
294 if (formatContext->album_artist) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_ALBUM_ARTIST, formatContext->album_artist);
295 if (formatContext->copyright) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_COPYRIGHT, formatContext->copyright);
296 if (formatContext->description) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_DESCRIPTION, formatContext->description);
297 if (formatContext->comment) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_COMMENT, formatContext->comment);
298 if (formatContext->genre) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_GENRE, formatContext->genre);
299 if (formatContext->classification) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_CLASSIFICATION, formatContext->classification);
300 if (formatContext->year) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_DATE, formatContext->year);
301 if (formatContext->tagTrackNum) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_TRACK_NUM, formatContext->tagTrackNum);
302 if (formatContext->rating) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_RATING, formatContext->rating);
303 if (formatContext->conductor) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_CONDUCTOR, formatContext->conductor);
304 if (formatContext->recDate) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_RECDATE, formatContext->recDate);
305 if (formatContext->rotate) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_ROTATE, formatContext->rotate);
306 mm_attrs_set_double_by_name(hattrs, MM_FILE_TAG_LONGITUDE, formatContext->longitude);
307 mm_attrs_set_double_by_name(hattrs, MM_FILE_TAG_LATIDUE, formatContext->latitude);
308 mm_attrs_set_double_by_name(hattrs, MM_FILE_TAG_ALTIDUE, formatContext->altitude);
309 mm_attrs_set_int_by_name(hattrs, MM_FILE_TAG_SYNCLYRICS_NUM, formatContext->syncLyricsNum);
310 mm_attrs_set_int_by_name(hattrs, MM_FILE_TAG_CDIS, formatContext->cdis);
311 mm_attrs_set_int_by_name(hattrs, MM_FILE_TAG_SMTA, formatContext->smta);
313 mm_attrs_set_int_by_name(hattrs, MM_FILE_TAG_360, formatContext->is_360);
315 if ((formatContext->syncLyricsNum > 0) && (formatContext->syncLyrics))
316 mm_attrs_set_data_by_name(hattrs, MM_FILE_TAG_SYNCLYRICS, formatContext->syncLyrics, formatContext->syncLyricsNum);
318 if (formatContext->unsyncLyrics) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_UNSYNCLYRICS, formatContext->unsyncLyrics);
320 if (formatContext->artwork && formatContext->artworkSize > 0) {
321 void *artworkCopy = NULL;
322 artworkCopy = mmfile_malloc((formatContext->artworkSize));
323 if (NULL != artworkCopy) {
324 memcpy(artworkCopy, formatContext->artwork, formatContext->artworkSize);
325 mm_attrs_set_data_by_name(hattrs, MM_FILE_TAG_ARTWORK, artworkCopy, formatContext->artworkSize);
326 mm_attrs_set_int_by_name(hattrs, MM_FILE_TAG_ARTWORK_SIZE, formatContext->artworkSize);
327 if (formatContext->artworkMime) mm_attrs_set_string_by_name(hattrs, MM_FILE_TAG_ARTWORK_MIME, formatContext->artworkMime);
330 } else if (formatContext->commandType == MM_FILE_CONTENTS) {
332 mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_DURATION, formatContext->duration);
333 mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_AUDIO_TRACK_COUNT, formatContext->audioTotalTrackNum);
334 mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_VIDEO_TRACK_COUNT, formatContext->videoTotalTrackNum);
336 if (formatContext->videoTotalTrackNum > 0 &&
337 formatContext->nbStreams > 0 &&
338 formatContext->streams[MMFILE_VIDEO_STREAM]) {
340 MMFileFormatStream *videoStream = formatContext->streams[MMFILE_VIDEO_STREAM];
342 mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_VIDEO_CODEC, videoStream->codecId);
343 mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_VIDEO_BITRATE, videoStream->bitRate);
344 mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_VIDEO_FPS, videoStream->framePerSec);
345 mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_VIDEO_WIDTH, videoStream->width);
346 mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_VIDEO_HEIGHT, videoStream->height);
348 if (formatContext->thumbNail && formatContext->thumbNail->frameData) {
349 void *thumbNailCopy = NULL;
350 thumbNailCopy = mmfile_malloc(formatContext->thumbNail->frameSize);
352 if (NULL != thumbNailCopy) {
353 memcpy(thumbNailCopy, formatContext->thumbNail->frameData, formatContext->thumbNail->frameSize);
354 mm_attrs_set_data_by_name(hattrs, MM_FILE_CONTENT_VIDEO_THUMBNAIL, thumbNailCopy, formatContext->thumbNail->frameSize);
355 mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_VIDEO_WIDTH, formatContext->thumbNail->frameWidth);
356 mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_VIDEO_HEIGHT, formatContext->thumbNail->frameHeight);
361 if (formatContext->audioTotalTrackNum > 0 &&
362 formatContext->nbStreams > 0 &&
363 formatContext->streams[MMFILE_AUDIO_STREAM]) {
365 MMFileFormatStream *audioStream = formatContext->streams[MMFILE_AUDIO_STREAM];
367 mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_AUDIO_CODEC, audioStream->codecId);
368 mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_AUDIO_CHANNELS, audioStream->nbChannel);
369 mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_AUDIO_BITRATE, audioStream->bitRate);
370 mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_AUDIO_SAMPLERATE, audioStream->samplePerSec);
371 mm_attrs_set_int_by_name(hattrs, MM_FILE_CONTENT_AUDIO_BITPERSAMPLE, audioStream->bitPerSample);
378 ret = mmf_attrs_commit((MMHandleType)hattrs);
384 _get_contents_info(mmf_attrs_t *attrs, MMFileSourceType *src, MMFILE_PARSE_INFO *parse)
386 MMFileFormatContext *formatContext = NULL;
387 MMFileCodecContext *codecContext = NULL;
388 MMFileFormatFrame frameContext = {0, };
389 MMFileCodecFrame codecFrame = {0, };
390 MMFileCodecFrame decodedFrame = {0, };
395 return FILEINFO_ERROR_FILE_INTERNAL;
397 ret = mmfile_format_open(&formatContext, src);
398 if (MMFILE_FORMAT_FAIL == ret || formatContext == NULL) {
399 debug_error("error: mmfile_format_open\n");
400 ret = FILEINFO_ERROR_FILE_INTERNAL;
404 if (parse->type >= MM_FILE_PARSE_TYPE_NORMAL) {
405 if (parse->type == MM_FILE_PARSE_TYPE_SAFE)
406 formatContext->cdis = 1;
407 ret = mmfile_format_read_stream(formatContext);
408 if (MMFILE_FORMAT_FAIL == ret) {
409 debug_error("error: mmfile_format_read_stream\n");
410 ret = FILEINFO_ERROR_FILE_INTERNAL;
414 parse->audio_track_num = formatContext->audioTotalTrackNum;
415 parse->video_track_num = formatContext->videoTotalTrackNum;
417 /* check uhqa content*/
418 if (formatContext->streams[MMFILE_AUDIO_STREAM] != NULL) {
419 parse->is_uhqa = formatContext->streams[MMFILE_AUDIO_STREAM]->is_uhqa;
421 parse->is_uhqa = FALSE;
424 if (parse->type >= MM_FILE_PARSE_TYPE_ALL) {
425 if (formatContext->videoTotalTrackNum > 0) {
427 if (parse->type != MM_FILE_PARSE_TYPE_SAFE) {
428 if (formatContext->formatType == MM_FILE_FORMAT_3GP || formatContext->formatType == MM_FILE_FORMAT_MP4) {
429 MMFileUtilGetMetaDataFromMP4(formatContext);
432 MMFileFormatStream *videoStream = formatContext->streams[MMFILE_VIDEO_STREAM];
433 unsigned int timestamp = _SEEK_POINT_;
435 ret = mmfile_format_read_frame(formatContext, timestamp, &frameContext);
436 if (MMFILE_FORMAT_FAIL == ret) {
437 debug_error("error: mmfile_format_read_frame\n");
438 ret = FILEINFO_ERROR_FILE_INTERNAL;
442 if (frameContext.bCompressed) {
443 codecFrame.frameDataSize = frameContext.frameSize;
444 codecFrame.width = frameContext.frameWidth;
445 codecFrame.height = frameContext.frameHeight;
446 codecFrame.frameData = frameContext.frameData;
447 codecFrame.configLen = frameContext.configLenth;
448 codecFrame.configData = frameContext.configData;
449 codecFrame.version = videoStream->version;
451 ret = mmfile_codec_open(&codecContext, MMFILE_VIDEO_DECODE, videoStream->codecId, &codecFrame);
452 if (MMFILE_FORMAT_FAIL == ret) {
453 debug_error("error: mmfile_codec_open\n");
454 ret = FILEINFO_ERROR_FILE_INTERNAL;
458 ret = mmfile_codec_decode(codecContext, &decodedFrame);
459 if (MMFILE_FORMAT_FAIL == ret) {
460 debug_error("error: mmfile_codec_decode\n");
461 ret = FILEINFO_ERROR_FILE_INTERNAL;
465 /* set video thumbnail */
466 formatContext->thumbNail = mmfile_malloc(sizeof(MMFileFormatFrame));
467 if (NULL == formatContext->thumbNail) {
468 debug_error("error: mmfile_malloc\n");
469 ret = FILEINFO_ERROR_FILE_INTERNAL;
473 formatContext->thumbNail->frameSize = decodedFrame.frameDataSize;
474 formatContext->thumbNail->frameWidth = decodedFrame.width;
475 formatContext->thumbNail->frameHeight = decodedFrame.height;
476 formatContext->thumbNail->frameData = decodedFrame.frameData;
477 formatContext->thumbNail->configLenth = 0;
478 formatContext->thumbNail->configData = NULL;
480 formatContext->thumbNail = mmfile_malloc(sizeof(MMFileFormatFrame));
481 if (NULL == formatContext->thumbNail) {
482 debug_error("error: mmfile_format_read_frame\n");
483 ret = FILEINFO_ERROR_FILE_INTERNAL;
487 formatContext->thumbNail->frameSize = frameContext.frameSize;
488 formatContext->thumbNail->frameWidth = frameContext.frameWidth;
489 formatContext->thumbNail->frameHeight = frameContext.frameHeight;
490 formatContext->thumbNail->frameData = frameContext.frameData;
491 formatContext->thumbNail->configLenth = 0;
492 formatContext->thumbNail->configData = NULL;
498 * if MM_FILE_PARSE_TYPE_SIMPLE, just get number of each stream.
500 parse->audio_track_num = formatContext->audioTotalTrackNum;
501 parse->video_track_num = formatContext->videoTotalTrackNum;
504 #ifdef __MMFILE_TEST_MODE__
505 mmfile_format_print_frame(&frameContext);
508 formatContext->commandType = MM_FILE_CONTENTS;
510 if (parse->type >= MM_FILE_PARSE_TYPE_NORMAL)
511 _info_set_attr_media(attrs, formatContext);
513 if (frameContext.bCompressed) {
514 if (frameContext.frameData) mmfile_free(frameContext.frameData);
515 if (frameContext.configData) mmfile_free(frameContext.configData);
517 if (decodedFrame.frameData) {
518 mmfile_free(decodedFrame.frameData);
519 formatContext->thumbNail->frameData = NULL;
521 if (decodedFrame.configData) {
522 mmfile_free(decodedFrame.configData);
523 formatContext->thumbNail->configData = NULL;
526 if (frameContext.frameData) {
527 mmfile_free(frameContext.frameData);
528 formatContext->thumbNail->frameData = NULL;
530 if (frameContext.configData) {
531 mmfile_free(frameContext.configData);
532 formatContext->thumbNail->configData = NULL;
537 mmfile_format_close(formatContext);
540 mmfile_codec_close(codecContext);
543 return FILEINFO_ERROR_NONE;
546 formatContext->commandType = MM_FILE_CONTENTS;
548 if (frameContext.bCompressed) {
549 if (frameContext.frameData)
550 mmfile_free(frameContext.frameData);
552 if (frameContext.configData)
553 mmfile_free(frameContext.configData);
555 if (decodedFrame.frameData) {
556 mmfile_free(decodedFrame.frameData);
557 if (formatContext->thumbNail)
558 formatContext->thumbNail->frameData = NULL;
561 if (decodedFrame.configData) {
562 mmfile_free(decodedFrame.configData);
563 if (formatContext->thumbNail)
564 formatContext->thumbNail->configData = NULL;
567 if (frameContext.frameData) {
568 mmfile_free(frameContext.frameData);
569 if (formatContext->thumbNail)
570 formatContext->thumbNail->frameData = NULL;
573 if (frameContext.configData) {
574 mmfile_free(frameContext.configData);
575 if (formatContext->thumbNail)
576 formatContext->thumbNail->configData = NULL;
580 if (parse->type >= MM_FILE_PARSE_TYPE_NORMAL)
581 _info_set_attr_media(attrs, formatContext);
584 mmfile_format_close(formatContext);
587 mmfile_codec_close(codecContext);
589 return FILEINFO_ERROR_NONE;
593 if (frameContext.bCompressed) {
594 if (frameContext.frameData)
595 mmfile_free(frameContext.frameData);
597 if (frameContext.configData)
598 mmfile_free(frameContext.configData);
600 if (decodedFrame.frameData) {
601 mmfile_free(decodedFrame.frameData);
602 if (formatContext->thumbNail)
603 formatContext->thumbNail->frameData = NULL;
606 if (decodedFrame.configData) {
607 mmfile_free(decodedFrame.configData);
608 if (formatContext->thumbNail)
609 formatContext->thumbNail->configData = NULL;
612 if (frameContext.frameData) {
613 mmfile_free(frameContext.frameData);
614 if (formatContext->thumbNail)
615 formatContext->thumbNail->frameData = NULL;
618 if (frameContext.configData) {
619 mmfile_free(frameContext.configData);
620 if (formatContext->thumbNail)
621 formatContext->thumbNail->configData = NULL;
626 mmfile_format_close(formatContext);
628 /* if (codecContext) { mmfile_codec_close(codecContext); } */ /*dead code*/
635 _get_tag_info(mmf_attrs_t *attrs, MMFileSourceType *src)
637 MMFileFormatContext *formatContext = NULL;
640 ret = mmfile_format_open(&formatContext, src);
641 if (MMFILE_FORMAT_FAIL == ret || formatContext == NULL) {
642 debug_error("error: mmfile_format_open\n");
643 ret = FILEINFO_ERROR_FILE_INTERNAL;
647 ret = mmfile_format_read_tag(formatContext);
648 if (MMFILE_FORMAT_FAIL == ret) {
649 debug_warning("reading tag is fail\n");
650 ret = FILEINFO_ERROR_FILE_INTERNAL;
654 formatContext->commandType = MM_FILE_TAG;
656 _info_set_attr_media(attrs, formatContext);
659 mmfile_format_close(formatContext);
662 return FILEINFO_ERROR_NONE;
667 mmfile_format_close(formatContext);
670 return FILEINFO_ERROR_FILE_INTERNAL;
677 int mm_file_get_attrs(MMHandleType attrs, char **err_attr_name, const char *first_attribute_name, ...)
679 int ret = FILEINFO_ERROR_NONE;
683 debug_error("Invalid arguments [attrs 0]\n");
684 return FILEINFO_ERROR_INVALID_ARGUMENT;
687 if (first_attribute_name == NULL) {
688 debug_error("Invalid arguments [first_attribute_name null]\n");
689 return FILEINFO_ERROR_INVALID_ARGUMENT;
692 /* get requested attributes */
693 va_start(var_args, first_attribute_name);
694 ret = mm_attrs_get_valist(attrs, err_attr_name, first_attribute_name, var_args);
697 if (ret != FILEINFO_ERROR_NONE) {
699 debug_error("failed to get %s\n", *err_attr_name);
706 int mm_file_get_synclyrics_info(MMHandleType tag_attrs, int index, unsigned long *time_info, char **lyrics)
708 int ret = FILEINFO_ERROR_NONE;
709 AvSynclyricsInfo *sync_lyric_item = NULL;
710 GList *synclyrics_list = NULL;
712 #ifdef __MMFILE_TEST_MODE__
716 if ((mmf_attrs_t *)tag_attrs == NULL) {
717 debug_error("invalid handle");
718 return FILEINFO_ERROR_INVALID_ARGUMENT;
721 ret = mm_attrs_get_data_by_name(tag_attrs, MM_FILE_TAG_SYNCLYRICS, (void **)&synclyrics_list);
722 if (ret != FILEINFO_ERROR_NONE) {
723 #ifdef __MMFILE_TEST_MODE__
724 debug_warning("get data fail");
729 if (synclyrics_list != NULL) {
731 sync_lyric_item = (AvSynclyricsInfo *)g_list_nth_data(synclyrics_list, index);
733 if (sync_lyric_item == NULL) {
734 #ifdef __MMFILE_TEST_MODE__
735 debug_warning("synclyric item is NULL");
737 return FILEINFO_ERROR_ATTR_NOT_EXIST;
740 *time_info = sync_lyric_item->time_info;
741 *lyrics = sync_lyric_item->lyric_info;
744 #ifdef __MMFILE_TEST_MODE__
745 debug_warning("synclyrics_list is NULL");
747 return FILEINFO_ERROR_ATTR_NOT_EXIST;
754 int mm_file_create_tag_attrs(MMHandleType *tag_attrs, const char *filename)
756 int ret = FILEINFO_ERROR_NONE;
757 mmf_attrs_t *attrs = NULL;
758 MMFileSourceType src;
760 #ifdef __MMFILE_TEST_MODE__
764 /* Check argument here */
765 if (tag_attrs == NULL) {
766 debug_error("Invalid arguments [tag null]\n");
767 return FILEINFO_ERROR_INVALID_ARGUMENT;
769 if (filename == NULL) {
770 debug_error("Invalid arguments [filename null]\n");
771 return FILEINFO_ERROR_INVALID_ARGUMENT;
773 if (strlen(filename) == 0) {
774 debug_error("Invalid arguments [filename size 0]\n");
775 return FILEINFO_ERROR_INVALID_ARGUMENT;
779 #ifdef __MMFILE_DYN_LOADING__
780 MMFILE_FUNC_HANDLE func_handle;
782 ret = _load_dynamic_functions(&func_handle);
784 debug_error("load library error\n");
785 return FILEINFO_ERROR_FILE_INTERNAL;
789 /*set source file infomation*/
790 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
792 ret = _is_file_exist(filename);
794 ret = FILEINFO_ERROR_FILE_NOT_FOUND;
799 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data("tag", g_tag_attrs, ARRAY_SIZE(g_tag_attrs), NULL, NULL);
801 debug_error("attribute internal error.\n");
802 ret = FILEINFO_ERROR_FILE_INTERNAL;
806 ret = _get_tag_info(attrs, &src);
807 if (ret != FILEINFO_ERROR_NONE) {
808 mmf_attrs_free((MMHandleType)attrs);
810 debug_error("failed to get tag: %s\n", filename);
813 *tag_attrs = (MMHandleType)attrs;
816 #ifdef __MMFILE_DYN_LOADING__
817 _unload_dynamic_functions(&func_handle);
820 #ifdef __MMFILE_TEST_MODE__
829 int mm_file_destroy_tag_attrs(MMHandleType tag_attrs)
831 void *artwork = NULL;
832 GList *synclyrics_list = NULL;
833 int ret = FILEINFO_ERROR_NONE;
835 #ifdef __MMFILE_TEST_MODE__
839 if ((mmf_attrs_t *)tag_attrs == NULL) {
840 debug_error("invalid handle.\n");
841 return FILEINFO_ERROR_INVALID_ARGUMENT;
844 ret = mm_attrs_get_data_by_name(tag_attrs, MM_FILE_TAG_ARTWORK, &artwork);
846 if (artwork != NULL) {
847 mmfile_free(artwork);
850 ret = mm_attrs_get_data_by_name(tag_attrs, MM_FILE_TAG_SYNCLYRICS, (void **)&synclyrics_list);
852 if (synclyrics_list != NULL) {
853 mm_file_free_synclyrics_list(synclyrics_list);
856 mmf_attrs_free(tag_attrs);
858 #ifdef __MMFILE_TEST_MODE__
866 int mm_file_create_content_attrs(MMHandleType *contents_attrs, const char *filename)
868 mmf_attrs_t *attrs = NULL;
869 MMFileSourceType src = {0, };
870 MMFILE_PARSE_INFO parse = {0, };
873 #ifdef __MMFILE_TEST_MODE__
877 /* Check argument here */
878 if (contents_attrs == NULL) {
879 debug_error("Invalid arguments [contents null]\n");
880 return FILEINFO_ERROR_INVALID_ARGUMENT;
882 if (filename == NULL) {
883 debug_error("Invalid arguments [filename null]\n");
884 return FILEINFO_ERROR_INVALID_ARGUMENT;
886 if (strlen(filename) == 0) {
887 debug_error("Invalid arguments [filename size 0]\n");
888 return FILEINFO_ERROR_INVALID_ARGUMENT;
892 #ifdef __MMFILE_DYN_LOADING__
893 MMFILE_FUNC_HANDLE func_handle;
900 ret = _load_dynamic_functions(&func_handle);
902 debug_error("load library error\n");
903 return FILEINFO_ERROR_FILE_INTERNAL;
907 debug_msg("_load_dynamic_functions() = %lld\n", gettime() - ti);
912 /*set source file infomation*/
913 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
915 ret = _is_file_exist(filename);
917 ret = FILEINFO_ERROR_FILE_NOT_FOUND;
922 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data("content", g_content_attrs, ARRAY_SIZE(g_content_attrs), NULL, NULL);
924 debug_error("attribute internal error.\n");
925 ret = FILEINFO_ERROR_FILE_INTERNAL;
930 parse.type = MM_FILE_PARSE_TYPE_ALL;
931 ret = _get_contents_info(attrs, &src, &parse);
932 if (ret != FILEINFO_ERROR_NONE) {
933 mmf_attrs_free((MMHandleType)attrs);
935 debug_error("failed to get contents: %s\n", filename);
938 *contents_attrs = (MMHandleType) attrs;
942 #ifdef __MMFILE_DYN_LOADING__
948 _unload_dynamic_functions(&func_handle);
951 debug_msg("_unload_dynamic_functions() = %lld\n", gettime() - ti);
956 #ifdef __MMFILE_TEST_MODE__
965 int mm_file_create_tag_attrs_from_memory(MMHandleType *tag_attrs, const void *data, unsigned int size, int format)
967 mmf_attrs_t *attrs = NULL;
968 MMFileSourceType src;
969 /*MMFILE_PARSE_INFO parse = {0, };*/
972 #ifdef __MMFILE_TEST_MODE__
976 /* Check argument here */
977 if (tag_attrs == NULL || data == NULL) {
978 debug_error("Invalid arguments\n");
979 return FILEINFO_ERROR_INVALID_ARGUMENT;
982 #ifdef __MMFILE_DYN_LOADING__
983 MMFILE_FUNC_HANDLE func_handle;
985 ret = _load_dynamic_functions(&func_handle);
987 debug_error("load library error\n");
988 return FILEINFO_ERROR_FILE_INTERNAL;
992 MM_FILE_SET_MEDIA_MEM_SRC(src, data, size, format);
995 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data("tag", g_tag_attrs, ARRAY_SIZE(g_tag_attrs), NULL, NULL);
997 debug_error("attribute internal error.\n");
998 ret = FILEINFO_ERROR_FILE_INTERNAL;
1002 /*parse.type = MM_FILE_PARSE_TYPE_ALL;*/
1003 ret = _get_tag_info(attrs, &src);
1004 if (ret != FILEINFO_ERROR_NONE) {
1005 mmf_attrs_free((MMHandleType)attrs);
1007 debug_error("failed to get tag");
1010 *tag_attrs = (MMHandleType)attrs;
1013 #ifdef __MMFILE_DYN_LOADING__
1014 _unload_dynamic_functions(&func_handle);
1017 #ifdef __MMFILE_TEST_MODE__
1026 int mm_file_create_content_attrs_from_memory(MMHandleType *contents_attrs, const void *data, unsigned int size, int format)
1028 mmf_attrs_t *attrs = NULL;
1029 MMFileSourceType src;
1030 MMFILE_PARSE_INFO parse = {0, };
1033 #ifdef __MMFILE_TEST_MODE__
1037 /* Check argument here */
1038 if (contents_attrs == NULL || data == NULL) {
1039 debug_error("Invalid arguments\n");
1040 return FILEINFO_ERROR_INVALID_ARGUMENT;
1043 #ifdef __MMFILE_DYN_LOADING__
1044 MMFILE_FUNC_HANDLE func_handle;
1046 ret = _load_dynamic_functions(&func_handle);
1048 debug_error("load library error\n");
1049 return FILEINFO_ERROR_FILE_INTERNAL;
1053 MM_FILE_SET_MEDIA_MEM_SRC(src, data, size, format);
1056 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data("content", g_content_attrs, ARRAY_SIZE(g_content_attrs), NULL, NULL);
1058 debug_error("attribute internal error.\n");
1059 ret = FILEINFO_ERROR_FILE_INTERNAL;
1063 parse.type = MM_FILE_PARSE_TYPE_ALL;
1064 ret = _get_contents_info(attrs, &src, &parse);
1065 if (ret != FILEINFO_ERROR_NONE) {
1066 mmf_attrs_free((MMHandleType)attrs);
1068 debug_error("failed to get contents");
1071 *contents_attrs = (MMHandleType)attrs;
1074 #ifdef __MMFILE_DYN_LOADING__
1075 _unload_dynamic_functions(&func_handle);
1078 #ifdef __MMFILE_TEST_MODE__
1087 int mm_file_destroy_content_attrs(MMHandleType contents_attrs)
1089 void *thumbnail = NULL;
1090 int ret = FILEINFO_ERROR_NONE;
1092 #ifdef __MMFILE_TEST_MODE__
1096 if ((mmf_attrs_t *)contents_attrs == NULL) {
1097 debug_error("invalid handle.\n");
1098 return FILEINFO_ERROR_INVALID_ARGUMENT;
1101 ret = mm_attrs_get_data_by_name(contents_attrs, MM_FILE_CONTENT_VIDEO_THUMBNAIL, &thumbnail);
1102 if (thumbnail != NULL) {
1103 mmfile_free(thumbnail);
1106 mmf_attrs_free(contents_attrs);
1108 #ifdef __MMFILE_TEST_MODE__
1117 int mm_file_get_stream_info(const char *filename, int *audio_stream_num, int *video_stream_num)
1119 MMFileSourceType src = {0, };
1120 MMFILE_PARSE_INFO parse = {0, };
1124 #ifdef __MMFILE_TEST_MODE__
1128 if (filename == NULL || strlen(filename) == 0 || audio_stream_num == NULL || video_stream_num == NULL) {
1129 debug_error("Invalid arguments\n");
1130 return FILEINFO_ERROR_INVALID_ARGUMENT;
1133 #ifdef __MMFILE_DYN_LOADING__
1134 MMFILE_FUNC_HANDLE func_handle;
1136 ret = _load_dynamic_functions(&func_handle);
1138 debug_error("load library error\n");
1139 return FILEINFO_ERROR_FILE_INTERNAL;
1143 /*set source file infomation*/
1144 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
1146 ret = _is_file_exist(filename);
1148 ret = FILEINFO_ERROR_FILE_NOT_FOUND;
1152 parse.type = MM_FILE_PARSE_TYPE_SIMPLE;
1153 ret = _get_contents_info(NULL, &src, &parse);
1154 if (ret != FILEINFO_ERROR_NONE) {
1155 debug_error("failed to get stream info: %s\n", filename);
1157 if (parse.audio_track_num == 0 && parse.video_track_num == 0) {
1158 debug_error("empty header. retry to get stream info: %s\n", filename);
1159 parse.type = MM_FILE_PARSE_TYPE_NORMAL;
1160 ret = _get_contents_info(NULL, &src, &parse);
1164 /*set number of each stream*/
1165 *audio_stream_num = parse.audio_track_num;
1166 *video_stream_num = parse.video_track_num;
1169 #ifdef __MMFILE_DYN_LOADING__
1170 _unload_dynamic_functions(&func_handle);
1173 #ifdef __MMFILE_TEST_MODE__
1181 int mm_file_create_content_attrs_simple(MMHandleType *contents_attrs, const char *filename)
1183 mmf_attrs_t *attrs = NULL;
1184 MMFileSourceType src = {0, };
1185 MMFILE_PARSE_INFO parse = {0, };
1188 #ifdef __MMFILE_TEST_MODE__
1192 #ifdef __MMFILE_DYN_LOADING__
1193 MMFILE_FUNC_HANDLE func_handle;
1195 ret = _load_dynamic_functions(&func_handle);
1197 debug_error("load library error\n");
1198 return FILEINFO_ERROR_FILE_INTERNAL;
1201 if (filename == NULL) {
1202 ret = FILEINFO_ERROR_INVALID_ARGUMENT;
1205 if (strlen(filename) == 0) {
1206 ret = FILEINFO_ERROR_INVALID_ARGUMENT;
1211 /*set source file infomation*/
1212 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
1214 ret = _is_file_exist(filename);
1216 ret = FILEINFO_ERROR_FILE_NOT_FOUND;
1221 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data("content", g_content_attrs, ARRAY_SIZE(g_content_attrs), NULL, NULL);
1223 debug_error("attribute internal error.\n");
1224 ret = FILEINFO_ERROR_FILE_INTERNAL;
1228 parse.type = MM_FILE_PARSE_TYPE_NORMAL;
1229 ret = _get_contents_info(attrs, &src, &parse);
1230 if (ret != FILEINFO_ERROR_NONE) {
1231 mmf_attrs_free((MMHandleType)attrs);
1233 debug_error("failed to get contents: %s\n", filename);
1236 *contents_attrs = (MMHandleType) attrs;
1239 #ifdef __MMFILE_DYN_LOADING__
1240 _unload_dynamic_functions(&func_handle);
1243 #ifdef __MMFILE_TEST_MODE__
1251 int mm_file_create_content_attrs_safe(MMHandleType *contents_attrs, const char *filename)
1253 mmf_attrs_t *attrs = NULL;
1254 MMFileSourceType src = {0, };
1255 MMFILE_PARSE_INFO parse = {0, };
1258 #ifdef __MMFILE_TEST_MODE__
1262 #ifdef __MMFILE_DYN_LOADING__
1263 MMFILE_FUNC_HANDLE func_handle;
1265 ret = _load_dynamic_functions(&func_handle);
1267 debug_error("load library error\n");
1268 return FILEINFO_ERROR_FILE_INTERNAL;
1271 if (filename == NULL) {
1272 ret = FILEINFO_ERROR_INVALID_ARGUMENT;
1275 if (strlen(filename) == 0) {
1276 ret = FILEINFO_ERROR_INVALID_ARGUMENT;
1281 /*set source file infomation*/
1282 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
1284 ret = _is_file_exist(filename);
1286 ret = FILEINFO_ERROR_FILE_NOT_FOUND;
1291 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data("content", g_content_attrs, ARRAY_SIZE(g_content_attrs), NULL, NULL);
1293 debug_error("attribute internal error.\n");
1294 ret = FILEINFO_ERROR_FILE_INTERNAL;
1298 parse.type = MM_FILE_PARSE_TYPE_SAFE;
1299 ret = _get_contents_info(attrs, &src, &parse);
1300 if (ret != FILEINFO_ERROR_NONE) {
1301 mmf_attrs_free((MMHandleType)attrs);
1303 debug_error("failed to get contents: %s\n", filename);
1306 *contents_attrs = (MMHandleType) attrs;
1309 #ifdef __MMFILE_DYN_LOADING__
1310 _unload_dynamic_functions(&func_handle);
1313 #ifdef __MMFILE_TEST_MODE__
1321 int mm_file_get_video_frame(const char *path, double timestamp, bool is_accurate, unsigned char **frame, int *size, int *width, int *height)
1324 void *formatFuncHandle = NULL;
1327 debug_error("Invalid arguments [Path is Null]\n");
1328 return FILEINFO_ERROR_INVALID_ARGUMENT;
1331 #ifdef __MMFILE_DYN_LOADING__
1332 /* Get from function argument */
1333 formatFuncHandle = dlopen(MMFILE_FORMAT_SO_FILE_NAME, RTLD_LAZY);
1334 if (!formatFuncHandle) {
1335 debug_error("error : dlopen");
1339 mmfile_format_get_frame = dlsym(formatFuncHandle, "mmfile_format_get_frame");
1340 if (!mmfile_format_get_frame) {
1341 debug_error("error : load library");
1346 #ifdef __MMFILE_TEST_MODE__
1347 debug_msg("file path [%s] is_accurate [%d]", path, is_accurate);
1350 ret = mmfile_format_get_frame(path, timestamp, is_accurate, frame, size, width, height);
1351 if (ret == MMFILE_FORMAT_FAIL) {
1352 debug_error("error : get frame");
1356 if (formatFuncHandle) dlclose(formatFuncHandle);
1358 return FILEINFO_ERROR_NONE;
1361 if (formatFuncHandle) dlclose(formatFuncHandle);
1363 return FILEINFO_ERROR_FILE_INTERNAL;
1367 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)
1370 void *formatFuncHandle = NULL;
1373 debug_error("Invalid arguments [data is Null]\n");
1374 return FILEINFO_ERROR_INVALID_ARGUMENT;
1377 if (datasize == 0) {
1378 debug_error("Invalid arguments [datasize is zero]\n");
1379 return FILEINFO_ERROR_INVALID_ARGUMENT;
1382 #ifdef __MMFILE_DYN_LOADING__
1383 /* Get from function argument */
1384 formatFuncHandle = dlopen(MMFILE_FORMAT_SO_FILE_NAME, RTLD_LAZY);
1385 if (!formatFuncHandle) {
1386 debug_error("error : dlopen");
1390 mmfile_format_get_frame_from_memory = dlsym(formatFuncHandle, "mmfile_format_get_frame_from_memory");
1391 if (!mmfile_format_get_frame_from_memory) {
1392 debug_error("error : load library");
1397 #ifdef __MMFILE_TEST_MODE__
1398 debug_msg("data [%p], data_size[%d], is_accurate [%d]", data, datasize, is_accurate);
1401 ret = mmfile_format_get_frame_from_memory(data, datasize, timestamp, is_accurate, frame, size, width, height);
1402 if (ret == MMFILE_FORMAT_FAIL) {
1403 debug_error("error : get frame");
1407 if (formatFuncHandle) dlclose(formatFuncHandle);
1409 return FILEINFO_ERROR_NONE;
1412 if (formatFuncHandle) dlclose(formatFuncHandle);
1414 return FILEINFO_ERROR_FILE_INTERNAL;
1418 int mm_file_check_uhqa(const char *filename, bool *is_uhqa)
1420 mmf_attrs_t *attrs = NULL;
1421 MMFileSourceType src = {0, };
1422 MMFILE_PARSE_INFO parse = {0, };
1425 #ifdef __MMFILE_DYN_LOADING__
1426 MMFILE_FUNC_HANDLE func_handle;
1428 ret = _load_dynamic_functions(&func_handle);
1430 debug_error("load library error\n");
1431 return FILEINFO_ERROR_FILE_INTERNAL;
1434 if (filename == NULL) {
1435 ret = FILEINFO_ERROR_INVALID_ARGUMENT;
1438 if (strlen(filename) == 0) {
1439 ret = FILEINFO_ERROR_INVALID_ARGUMENT;
1444 /*set source file infomation*/
1445 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
1447 ret = _is_file_exist(filename);
1449 ret = FILEINFO_ERROR_FILE_NOT_FOUND;
1454 attrs = (mmf_attrs_t *) mmf_attrs_new_from_data("content", g_content_attrs, ARRAY_SIZE(g_content_attrs), NULL, NULL);
1456 debug_error("attribute internal error.\n");
1457 ret = FILEINFO_ERROR_FILE_INTERNAL;
1461 parse.type = MM_FILE_PARSE_TYPE_NORMAL;
1462 ret = _get_contents_info(attrs, &src, &parse);
1463 if (ret == FILEINFO_ERROR_NONE) {
1464 *is_uhqa = parse.is_uhqa;
1466 debug_error("_get_contents_info failed\n");
1470 mmf_attrs_free((MMHandleType)attrs);
1474 #ifdef __MMFILE_DYN_LOADING__
1475 _unload_dynamic_functions(&func_handle);
1478 #ifdef __MMFILE_TEST_MODE__