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 */
32 /* internal MM File headers */
33 #include "mm_file_debug.h"
34 #include "mm_file_formats.h"
35 #include "mm_file_format_frame.h"
36 #include "mm_file_codecs.h"
37 #include "mm_file_utils.h"
42 /*#define CHECK_TIME */
48 gettimeofday(&tv, NULL);
49 return (int64_t)tv.tv_sec * 1000000 + tv.tv_usec;
59 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
62 #define _SEEK_POINT_ 3000 /*1000 = 1 seconds*/
64 #define MM_FILE_TAG_SYNCLYRICS "tag-synclyrics" /**< Synchronized Lyrics Information*/
74 MM_FILE_PARSE_TYPE_SIMPLE, /*parse audio/video track num only*/
75 MM_FILE_PARSE_TYPE_NORMAL, /*parse infomation without thumbnail*/
76 MM_FILE_PARSE_TYPE_ALL, /*parse all infomation*/
77 MM_FILE_PARSE_TYPE_SAFE, /*parse infomation without both thumbnail and stream full-searching*/
88 void *formatFuncHandle;
89 void *codecFuncHandle;
97 static MMAttrsConstructInfo g_tag_attrs[] = {
98 {(char *)"tag-artist", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
99 {(char *)"tag-title", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
100 {(char *)"tag-album", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
101 {(char *)"tag-album-artist", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
102 {(char *)"tag-genre", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
103 {(char *)"tag-author", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
104 {(char *)"tag-copyright", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
105 {(char *)"tag-date", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
106 {(char *)"tag-description", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
107 {(char *)"tag-comment", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
108 {(char *)"tag-artwork", MM_ATTRS_TYPE_DATA, MM_ATTRS_FLAG_RW, (void *)NULL},
109 {(char *)"tag-artwork-size", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
110 {(char *)"tag-artwork-mime", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
111 {(char *)"tag-track-num", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
112 {(char *)"tag-classification", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
113 {(char *)"tag-rating", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
114 {(char *)"tag-longitude", MM_ATTRS_TYPE_DOUBLE, MM_ATTRS_FLAG_RW, (void *)0},
115 {(char *)"tag-latitude", MM_ATTRS_TYPE_DOUBLE, MM_ATTRS_FLAG_RW, (void *)0},
116 {(char *)"tag-altitude", MM_ATTRS_TYPE_DOUBLE, MM_ATTRS_FLAG_RW, (void *)0},
117 {(char *)"tag-conductor", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
118 {(char *)"tag-unsynclyrics", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
119 {(char *)"tag-synclyrics-num", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
120 {(char *)"tag-synclyrics", MM_ATTRS_TYPE_DATA, MM_ATTRS_FLAG_RW, (void *)NULL},
121 {(char *)"tag-recdate", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
122 {(char *)"tag-part-of-set", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
123 {(char *)"tag-rotate", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
124 {(char *)"tag-cdis", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
125 {(char *)"tag-smta", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
126 {(char *)"tag-spherical", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
127 {(char *)"tag-stitched", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
128 {(char *)"tag-stitching-software", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
129 {(char *)"tag-projection-type", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
130 {(char *)"tag-stereo-mode", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
131 {(char *)"tag-source-count", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
132 {(char *)"tag-init-view-heading", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
133 {(char *)"tag-init-view-pitch", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
134 {(char *)"tag-init-view-roll", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
135 {(char *)"tag-timestamp", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
136 {(char *)"tag-full-pano-width", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
137 {(char *)"tag-full-pano-height", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
138 {(char *)"tag-cropped-area-image-width", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
139 {(char *)"tag-cropped-area-image-height", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
140 {(char *)"tag-cropped-area-left", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
141 {(char *)"tag-cropped-area-top", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
142 {(char *)"tag-ambisonic-type", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
143 {(char *)"tag-ambisonic-format", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
144 {(char *)"tag-ambisonic-order", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
145 {(char *)"stereo-mode-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
146 {(char *)"metadata-source-v2", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
147 {(char *)"proj-type-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
148 {(char *)"pose-yaw-degrees-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
149 {(char *)"pose-pitch-degrees-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
150 {(char *)"pose-roll-degrees-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
151 {(char *)"cbmp-layout-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
152 {(char *)"cbmp-padding-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
153 {(char *)"equi-projection-bounds-top-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
154 {(char *)"equi-projection-bounds-bottom-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
155 {(char *)"equi-projection-bounds-left-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
156 {(char *)"equi-projection-bounds-right-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
159 static MMAttrsConstructInfo g_content_attrs[] = {
160 {(char *)"content-duration", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
161 {(char *)"content-video-codec", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
162 {(char *)"content-video-format", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
163 {(char *)"content-video-bitrate", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
164 {(char *)"content-video-fps", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
165 {(char *)"content-video-width", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
166 {(char *)"content-video-height", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
167 {(char *)"content-video-thumbnail", MM_ATTRS_TYPE_DATA, MM_ATTRS_FLAG_RW, (void *)NULL},
168 {(char *)"content-video-track-index", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
169 {(char *)"content-video-track-count", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
170 {(char *)"content-audio-codec", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
171 {(char *)"content-audio-bitrate", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
172 {(char *)"content-audio-channels", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
173 {(char *)"content-audio-samplerate", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
174 {(char *)"content-audio-track-index", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
175 {(char *)"content-audio-track-count", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
176 {(char *)"content-audio-bitpersample", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
179 #ifdef __MMFILE_DYN_LOADING__
180 #define MMFILE_FORMAT_SO_FILE_NAME LIBDIR"/libmmfile_formats.so"
181 #define MMFILE_CODEC_SO_FILE_NAME LIBDIR"/libmmfile_codecs.so"
183 int (*mmfile_format_open)(MMFileFormatContext **formatContext, MMFileSourceType *fileSrc);
184 int (*mmfile_format_read_stream)(MMFileFormatContext *formatContext);
185 int (*mmfile_format_read_frame)(MMFileFormatContext *formatContext, unsigned int timestamp, MMFileFormatFrame *frame);
186 int (*mmfile_format_read_tag)(MMFileFormatContext *formatContext);
187 int (*mmfile_format_close)(MMFileFormatContext *formatContext);
188 int (*mmfile_codec_open)(MMFileCodecContext **codecContext, int codecType, int codecId, MMFileCodecFrame *input);
189 int (*mmfile_codec_decode)(MMFileCodecContext *codecContext, MMFileCodecFrame *output);
190 int (*mmfile_codec_close)(MMFileCodecContext *codecContext);
191 int (*mmfile_format_get_frame)(const char *path, double timestamp, bool is_accurate, unsigned char **frame, int *size, int *width, int *height);
192 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);
195 #ifdef __MMFILE_DYN_LOADING__
196 static int _load_dynamic_functions(MMFILE_FUNC_HANDLE *pHandle)
198 /* static int dll_func_initialized = 0; //disabled */
202 /* Get from function argument */
203 void *formatFuncHandle = NULL;
204 void *codecFuncHandle = NULL;
207 if (dll_func_initialized) {
212 formatFuncHandle = dlopen(MMFILE_FORMAT_SO_FILE_NAME, RTLD_LAZY);
213 if (!formatFuncHandle) {
214 debug_error(DEBUG, "error: %s\n", "libmmfile_formats.so open error");
219 mmfile_format_open = dlsym(formatFuncHandle, "mmfile_format_open");
220 mmfile_format_read_stream = dlsym(formatFuncHandle, "mmfile_format_read_stream");
221 mmfile_format_read_frame = dlsym(formatFuncHandle, "mmfile_format_read_frame");
222 mmfile_format_read_tag = dlsym(formatFuncHandle, "mmfile_format_read_tag");
223 mmfile_format_close = dlsym(formatFuncHandle, "mmfile_format_close");
225 if (!mmfile_format_open ||
226 !mmfile_format_read_stream ||
227 !mmfile_format_read_frame ||
228 !mmfile_format_read_tag ||
229 !mmfile_format_close) {
231 debug_error(DEBUG, "error: %s\n", "format function load error");
236 /*closed at app termination.*/
237 /*dlclose (formatFuncHandle); */
239 codecFuncHandle = dlopen(MMFILE_CODEC_SO_FILE_NAME, RTLD_LAZY | RTLD_GLOBAL);
240 if (!codecFuncHandle) {
241 debug_error(DEBUG, "error: %s\n", "libmmfile_codecs.so open error");
246 mmfile_codec_open = dlsym(codecFuncHandle, "mmfile_codec_open");
247 mmfile_codec_decode = dlsym(codecFuncHandle, "mmfile_codec_decode");
248 mmfile_codec_close = dlsym(codecFuncHandle, "mmfile_codec_close");
250 if (!mmfile_codec_open || !mmfile_codec_decode || !mmfile_codec_close) {
251 debug_error(DEBUG, "error: %s\n", "codec function load error");
256 /*closed at app termination.*/
257 /*dlclose (codecFuncHandle); */
259 /* dll_func_initialized = 1; // disabled */
261 pHandle->codecFuncHandle = codecFuncHandle;
262 pHandle->formatFuncHandle = formatFuncHandle;
267 if (formatFuncHandle) dlclose(formatFuncHandle);
268 if (codecFuncHandle) dlclose(codecFuncHandle);
273 static void _unload_dynamic_functions(MMFILE_FUNC_HANDLE *pHandle)
275 debug_fenter(RELEASE);
277 if (pHandle->formatFuncHandle) {
278 dlclose(pHandle->formatFuncHandle);
280 if (pHandle->codecFuncHandle) {
281 dlclose(pHandle->codecFuncHandle);
284 debug_fleave(RELEASE);
288 #endif /* __MMFILE_DYN_LOADING__ */
294 _is_file_exist(const char *filename)
296 int ret = FILEINFO_ERROR_NONE;
298 const char *to_access = (strstr(filename, "file://") != NULL) ? filename + 7 : filename;
299 ret = access(to_access, R_OK);
301 if (errno == EACCES || errno == EPERM) {
302 debug_error(DEBUG, "Permission denied [%s]", to_access);
303 ret = FILEINFO_ERROR_PERMISSION_DENIED;
305 debug_error(DEBUG, "Not exist file [%s]", to_access);
306 ret = FILEINFO_ERROR_FILE_NOT_FOUND;
314 _info_set_attr_media(MMHandleType attrs, MMFileFormatContext *formatContext)
318 if (formatContext->commandType == MM_FILE_TAG) {
319 if (formatContext->title) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_TITLE, formatContext->title);
320 if (formatContext->artist) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ARTIST, formatContext->artist);
321 if (formatContext->author) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_AUTHOR, formatContext->author);
322 if (formatContext->composer && formatContext->author == NULL)
323 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_AUTHOR, formatContext->composer);
324 if (formatContext->album) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ALBUM, formatContext->album);
325 if (formatContext->album_artist) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ALBUM_ARTIST, formatContext->album_artist);
326 if (formatContext->copyright) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_COPYRIGHT, formatContext->copyright);
327 if (formatContext->description) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_DESCRIPTION, formatContext->description);
328 if (formatContext->comment) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_COMMENT, formatContext->comment);
329 if (formatContext->genre) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_GENRE, formatContext->genre);
330 if (formatContext->classification) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_CLASSIFICATION, formatContext->classification);
331 if (formatContext->year) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_DATE, formatContext->year);
332 if (formatContext->tagTrackNum) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_TRACK_NUM, formatContext->tagTrackNum);
333 if (formatContext->rating) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_RATING, formatContext->rating);
334 if (formatContext->conductor) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_CONDUCTOR, formatContext->conductor);
335 if (formatContext->recDate) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_RECDATE, formatContext->recDate);
336 if (formatContext->part_of_set) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_POS, formatContext->part_of_set);
338 if (formatContext->rotate) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ROTATE, formatContext->rotate);
339 mm_attrs_set_double_by_name(attrs, MM_FILE_TAG_LONGITUDE, formatContext->longitude);
340 mm_attrs_set_double_by_name(attrs, MM_FILE_TAG_LATIDUE, formatContext->latitude);
341 mm_attrs_set_double_by_name(attrs, MM_FILE_TAG_ALTIDUE, formatContext->altitude);
342 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SYNCLYRICS_NUM, formatContext->syncLyricsNum);
343 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_CDIS, formatContext->cdis);
344 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SMTA, formatContext->smta);
346 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL, formatContext->isSpherical);
347 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_STITCHED, formatContext->isStitched);
348 if (formatContext->stitchingSoftware) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_SPHERICAL_STITCHING_SOFTWARE, formatContext->stitchingSoftware);
349 if (formatContext->projectionType) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_SPHERICAL_PROJECTION_TYPE, formatContext->projectionType);
350 if (formatContext->stereoMode) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_SPHERICAL_STEREO_MODE, formatContext->stereoMode);
351 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_SOURCE_COUNT, formatContext->sourceCount);
352 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_INIT_VIEW_HEADING, formatContext->initViewHeading);
353 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_INIT_VIEW_PITCH, formatContext->initViewPitch);
354 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_INIT_VIEW_ROLL, formatContext->initViewRoll);
355 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_TIMESTAMP, formatContext->timestamp);
356 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_FULL_PANO_WIDTH, formatContext->fullPanoWidth);
357 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_FULL_PANO_HEIGHT, formatContext->fullPanoHeight);
358 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_IMAGE_WIDTH, formatContext->croppedAreaImageWidth);
359 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_IMAGE_HEIGHT, formatContext->croppedAreaImageHeight);
360 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_LEFT, formatContext->croppedAreaLeft);
361 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_TOP, formatContext->croppedAreaTop);
363 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_AMBISONIC_TYPE, formatContext->ambisonicType);
364 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_AMBISONIC_FORMAT, formatContext->ambisonicFormat);
365 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_AMBISONIC_ORDER, formatContext->ambisonicOrder);
367 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_STEREO_MODE, formatContext->stereoModeV2);
368 if (formatContext->metadataSourceV2) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_METADATA_SOURCE, formatContext->metadataSourceV2);
369 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_PROJ_TYPE, formatContext->projTypeV2);
370 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_POSE_YAW, formatContext->poseYawV2);
371 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_POSE_PITCH, formatContext->posePitchV2);
372 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_POSE_ROLL, formatContext->poseRollV2);
373 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_CBMP_LAYOUT, formatContext->cbmpLayoutV2);
374 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_CBMP_PADDING, formatContext->cbmpPaddingV2);
375 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_EQUI_BOUNDS_TOP, formatContext->equiBoundsTopV2);
376 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_EQUI_BOUNDS_BOTTOM, formatContext->equiBoundsBottomV2);
377 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_EQUI_BOUNDS_LEFT, formatContext->equiBoundsLeftV2);
378 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_EQUI_BOUNDS_RIGHT, formatContext->equiBoundsRightV2);
380 if ((formatContext->syncLyricsNum > 0) && (formatContext->syncLyrics))
381 mm_attrs_set_data_by_name(attrs, MM_FILE_TAG_SYNCLYRICS, formatContext->syncLyrics, formatContext->syncLyricsNum);
383 if (formatContext->unsyncLyrics) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_UNSYNCLYRICS, formatContext->unsyncLyrics);
385 if (formatContext->artwork && formatContext->artworkSize > 0) {
386 void *artworkCopy = NULL;
387 artworkCopy = mmfile_malloc((formatContext->artworkSize));
388 if (NULL != artworkCopy) {
389 memcpy(artworkCopy, formatContext->artwork, formatContext->artworkSize);
390 mm_attrs_set_data_by_name(attrs, MM_FILE_TAG_ARTWORK, artworkCopy, formatContext->artworkSize);
391 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_ARTWORK_SIZE, formatContext->artworkSize);
392 if (formatContext->artworkMime) mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ARTWORK_MIME, formatContext->artworkMime);
395 } else if (formatContext->commandType == MM_FILE_CONTENTS) {
397 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_DURATION, formatContext->duration);
398 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_AUDIO_TRACK_COUNT, formatContext->audioTotalTrackNum);
399 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_VIDEO_TRACK_COUNT, formatContext->videoTotalTrackNum);
401 if (formatContext->videoTotalTrackNum > 0 &&
402 formatContext->nbStreams > 0 &&
403 formatContext->streams[MMFILE_VIDEO_STREAM]) {
405 MMFileFormatStream *videoStream = formatContext->streams[MMFILE_VIDEO_STREAM];
407 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_VIDEO_FORMAT, formatContext->formatType);
408 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_VIDEO_CODEC, videoStream->codecId);
409 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_VIDEO_BITRATE, videoStream->bitRate);
410 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_VIDEO_FPS, videoStream->framePerSec);
411 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_VIDEO_WIDTH, videoStream->width);
412 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_VIDEO_HEIGHT, videoStream->height);
414 if (formatContext->thumbNail && formatContext->thumbNail->frameData) {
415 void *thumbNailCopy = NULL;
416 thumbNailCopy = mmfile_malloc(formatContext->thumbNail->frameSize);
418 if (NULL != thumbNailCopy) {
419 memcpy(thumbNailCopy, formatContext->thumbNail->frameData, formatContext->thumbNail->frameSize);
420 mm_attrs_set_data_by_name(attrs, MM_FILE_CONTENT_VIDEO_THUMBNAIL, thumbNailCopy, formatContext->thumbNail->frameSize);
421 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_VIDEO_WIDTH, formatContext->thumbNail->frameWidth);
422 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_VIDEO_HEIGHT, formatContext->thumbNail->frameHeight);
427 if (formatContext->audioTotalTrackNum > 0 &&
428 formatContext->nbStreams > 0 &&
429 formatContext->streams[MMFILE_AUDIO_STREAM]) {
431 MMFileFormatStream *audioStream = formatContext->streams[MMFILE_AUDIO_STREAM];
433 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_AUDIO_CODEC, audioStream->codecId);
434 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_AUDIO_CHANNELS, audioStream->nbChannel);
435 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_AUDIO_BITRATE, audioStream->bitRate);
436 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_AUDIO_SAMPLERATE, audioStream->samplePerSec);
437 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_AUDIO_BITPERSAMPLE, audioStream->bitPerSample);
444 mm_attrs_commit_all(attrs);
450 _get_contents_info(MMHandleType attrs, MMFileSourceType *src, MMFILE_PARSE_INFO *parse)
452 MMFileFormatContext *formatContext = NULL;
453 MMFileCodecContext *codecContext = NULL;
454 MMFileFormatFrame frameContext = {0, };
455 MMFileCodecFrame codecFrame = {0, };
456 MMFileCodecFrame decodedFrame = {0, };
461 return FILEINFO_ERROR_FILE_INTERNAL;
463 ret = mmfile_format_open(&formatContext, src);
464 if (MMFILE_FORMAT_FAIL == ret || formatContext == NULL) {
465 debug_error(DEBUG, "error: mmfile_format_open\n");
466 ret = FILEINFO_ERROR_FILE_INTERNAL;
470 if (parse->type >= MM_FILE_PARSE_TYPE_NORMAL) {
471 if (parse->type == MM_FILE_PARSE_TYPE_SAFE)
472 formatContext->cdis = 1;
473 ret = mmfile_format_read_stream(formatContext);
474 if (MMFILE_FORMAT_FAIL == ret) {
475 debug_error(DEBUG, "error: mmfile_format_read_stream\n");
476 ret = FILEINFO_ERROR_FILE_INTERNAL;
480 parse->audio_track_num = formatContext->audioTotalTrackNum;
481 parse->video_track_num = formatContext->videoTotalTrackNum;
483 /* check uhqa content*/
484 if (formatContext->streams[MMFILE_AUDIO_STREAM] != NULL) {
485 parse->is_uhqa = formatContext->streams[MMFILE_AUDIO_STREAM]->is_uhqa;
487 parse->is_uhqa = FALSE;
490 if (parse->type >= MM_FILE_PARSE_TYPE_ALL) {
491 if (formatContext->videoTotalTrackNum > 0) {
493 /*why below code needed?
494 This API is for extracting some attributes not metadata(TAG). mm_file_create_content_attrs() use this API.
495 but MMFileUtilGetMetaDataFromMP4() Extract just TAG info. That is needed for mm_file_create_tag_attrs()*/
497 if (parse->type != MM_FILE_PARSE_TYPE_SAFE) {
498 if (formatContext->formatType == MM_FILE_FORMAT_3GP || formatContext->formatType == MM_FILE_FORMAT_MP4) {
499 MMFileUtilGetMetaDataFromMP4(formatContext);
503 MMFileFormatStream *videoStream = formatContext->streams[MMFILE_VIDEO_STREAM];
504 unsigned int timestamp = _SEEK_POINT_;
506 ret = mmfile_format_read_frame(formatContext, timestamp, &frameContext);
507 if (MMFILE_FORMAT_FAIL == ret) {
508 debug_error(DEBUG, "error: mmfile_format_read_frame\n");
509 ret = FILEINFO_ERROR_FILE_INTERNAL;
513 if (frameContext.bCompressed) {
514 codecFrame.frameDataSize = frameContext.frameSize;
515 codecFrame.width = frameContext.frameWidth;
516 codecFrame.height = frameContext.frameHeight;
517 codecFrame.frameData = frameContext.frameData;
518 codecFrame.configLen = frameContext.configLenth;
519 codecFrame.configData = frameContext.configData;
520 codecFrame.version = videoStream->version;
522 ret = mmfile_codec_open(&codecContext, MMFILE_VIDEO_DECODE, videoStream->codecId, &codecFrame);
523 if (MMFILE_FORMAT_FAIL == ret) {
524 debug_error(DEBUG, "error: mmfile_codec_open\n");
525 ret = FILEINFO_ERROR_FILE_INTERNAL;
529 ret = mmfile_codec_decode(codecContext, &decodedFrame);
530 if (MMFILE_FORMAT_FAIL == ret) {
531 debug_error(DEBUG, "error: mmfile_codec_decode\n");
532 ret = FILEINFO_ERROR_FILE_INTERNAL;
536 /* set video thumbnail */
537 formatContext->thumbNail = mmfile_malloc(sizeof(MMFileFormatFrame));
538 if (NULL == formatContext->thumbNail) {
539 debug_error(DEBUG, "error: mmfile_malloc\n");
540 ret = FILEINFO_ERROR_FILE_INTERNAL;
544 formatContext->thumbNail->frameSize = decodedFrame.frameDataSize;
545 formatContext->thumbNail->frameWidth = decodedFrame.width;
546 formatContext->thumbNail->frameHeight = decodedFrame.height;
547 formatContext->thumbNail->frameData = decodedFrame.frameData;
548 formatContext->thumbNail->configLenth = 0;
549 formatContext->thumbNail->configData = NULL;
551 formatContext->thumbNail = mmfile_malloc(sizeof(MMFileFormatFrame));
552 if (NULL == formatContext->thumbNail) {
553 debug_error(DEBUG, "error: mmfile_format_read_frame\n");
554 ret = FILEINFO_ERROR_FILE_INTERNAL;
558 formatContext->thumbNail->frameSize = frameContext.frameSize;
559 formatContext->thumbNail->frameWidth = frameContext.frameWidth;
560 formatContext->thumbNail->frameHeight = frameContext.frameHeight;
561 formatContext->thumbNail->frameData = frameContext.frameData;
562 formatContext->thumbNail->configLenth = 0;
563 formatContext->thumbNail->configData = NULL;
569 * if MM_FILE_PARSE_TYPE_SIMPLE, just get number of each stream.
571 parse->audio_track_num = formatContext->audioTotalTrackNum;
572 parse->video_track_num = formatContext->videoTotalTrackNum;
575 #ifdef __MMFILE_TEST_MODE__
576 mmfile_format_print_frame(&frameContext);
579 formatContext->commandType = MM_FILE_CONTENTS;
581 if (parse->type >= MM_FILE_PARSE_TYPE_NORMAL)
582 _info_set_attr_media(attrs, formatContext);
584 if (frameContext.bCompressed) {
585 mmfile_free(frameContext.frameData);
586 mmfile_free(frameContext.configData);
588 if (decodedFrame.frameData) {
589 mmfile_free(decodedFrame.frameData);
590 formatContext->thumbNail->frameData = NULL;
592 if (decodedFrame.configData) {
593 mmfile_free(decodedFrame.configData);
594 formatContext->thumbNail->configData = NULL;
597 if (frameContext.frameData) {
598 mmfile_free(frameContext.frameData);
599 formatContext->thumbNail->frameData = NULL;
601 if (frameContext.configData) {
602 mmfile_free(frameContext.configData);
603 formatContext->thumbNail->configData = NULL;
608 mmfile_format_close(formatContext);
611 mmfile_codec_close(codecContext);
614 return FILEINFO_ERROR_NONE;
617 formatContext->commandType = MM_FILE_CONTENTS;
619 if (frameContext.bCompressed) {
620 mmfile_free(frameContext.frameData);
621 mmfile_free(frameContext.configData);
623 if (decodedFrame.frameData) {
624 mmfile_free(decodedFrame.frameData);
625 if (formatContext->thumbNail)
626 formatContext->thumbNail->frameData = NULL;
629 if (decodedFrame.configData) {
630 mmfile_free(decodedFrame.configData);
631 if (formatContext->thumbNail)
632 formatContext->thumbNail->configData = NULL;
635 if (frameContext.frameData) {
636 mmfile_free(frameContext.frameData);
637 if (formatContext->thumbNail)
638 formatContext->thumbNail->frameData = NULL;
641 if (frameContext.configData) {
642 mmfile_free(frameContext.configData);
643 if (formatContext->thumbNail)
644 formatContext->thumbNail->configData = NULL;
648 if (parse->type >= MM_FILE_PARSE_TYPE_NORMAL)
649 _info_set_attr_media(attrs, formatContext);
652 mmfile_format_close(formatContext);
655 mmfile_codec_close(codecContext);
657 return FILEINFO_ERROR_NONE;
661 if (frameContext.bCompressed) {
662 mmfile_free(frameContext.frameData);
663 mmfile_free(frameContext.configData);
665 if (decodedFrame.frameData) {
666 mmfile_free(decodedFrame.frameData);
667 if (formatContext->thumbNail)
668 formatContext->thumbNail->frameData = NULL;
671 if (decodedFrame.configData) {
672 mmfile_free(decodedFrame.configData);
673 if (formatContext->thumbNail)
674 formatContext->thumbNail->configData = NULL;
677 if (frameContext.frameData) {
678 mmfile_free(frameContext.frameData);
679 if (formatContext->thumbNail)
680 formatContext->thumbNail->frameData = NULL;
683 if (frameContext.configData) {
684 mmfile_free(frameContext.configData);
685 if (formatContext->thumbNail)
686 formatContext->thumbNail->configData = NULL;
691 mmfile_format_close(formatContext);
693 /* if (codecContext) { mmfile_codec_close(codecContext); } */ /*dead code*/
700 _get_tag_info(MMHandleType attrs, MMFileSourceType *src)
702 MMFileFormatContext *formatContext = NULL;
705 ret = mmfile_format_open(&formatContext, src);
706 if (MMFILE_FORMAT_FAIL == ret || formatContext == NULL) {
707 debug_error(DEBUG, "error: mmfile_format_open\n");
708 ret = FILEINFO_ERROR_FILE_INTERNAL;
712 ret = mmfile_format_read_tag(formatContext);
713 if (MMFILE_FORMAT_FAIL == ret) {
714 debug_warning(DEBUG, "reading tag is fail\n");
715 ret = FILEINFO_ERROR_FILE_INTERNAL;
719 formatContext->commandType = MM_FILE_TAG;
721 _info_set_attr_media(attrs, formatContext);
724 mmfile_format_close(formatContext);
727 return FILEINFO_ERROR_NONE;
732 mmfile_format_close(formatContext);
735 return FILEINFO_ERROR_FILE_INTERNAL;
742 int mm_file_get_attrs(MMHandleType attrs, char **err_attr_name, const char *first_attribute_name, ...)
744 int ret = FILEINFO_ERROR_NONE;
748 debug_error(DEBUG, "Invalid arguments [attrs 0]\n");
749 return FILEINFO_ERROR_INVALID_ARGUMENT;
752 if (first_attribute_name == NULL) {
753 debug_error(DEBUG, "Invalid arguments [first_attribute_name null]\n");
754 return FILEINFO_ERROR_INVALID_ARGUMENT;
757 /* get requested attributes */
758 va_start(var_args, first_attribute_name);
759 ret = mm_attrs_get_valist(attrs, err_attr_name, first_attribute_name, var_args);
762 if (ret != FILEINFO_ERROR_NONE) {
764 debug_error(DEBUG, "failed to get %s\n", *err_attr_name);
771 int mm_file_get_synclyrics_info(MMHandleType tag_attrs, int index, unsigned long *time_info, char **lyrics)
773 int ret = FILEINFO_ERROR_NONE;
774 AvSynclyricsInfo *sync_lyric_item = NULL;
775 GList *synclyrics_list = NULL;
777 debug_fenter(RELEASE);
779 if (tag_attrs == NULL) {
780 debug_error(DEBUG, "invalid handle");
781 return FILEINFO_ERROR_INVALID_ARGUMENT;
784 ret = mm_attrs_get_data_by_name(tag_attrs, MM_FILE_TAG_SYNCLYRICS, (void **)&synclyrics_list);
785 if (ret != FILEINFO_ERROR_NONE) {
786 debug_warning(RELEASE, "get data fail");
790 if (synclyrics_list != NULL) {
792 sync_lyric_item = (AvSynclyricsInfo *)g_list_nth_data(synclyrics_list, index);
794 if (sync_lyric_item == NULL) {
795 debug_warning(RELEASE, "synclyric item is NULL");
796 return FILEINFO_ERROR_ATTR_NOT_EXIST;
799 *time_info = sync_lyric_item->time_info;
800 *lyrics = sync_lyric_item->lyric_info;
803 debug_warning(RELEASE, "synclyrics_list is NULL");
804 return FILEINFO_ERROR_ATTR_NOT_EXIST;
811 int mm_file_create_tag_attrs(MMHandleType *tag_attrs, const char *filename)
813 int ret = FILEINFO_ERROR_NONE;
814 MMHandleType attrs = NULL;
815 MMFileSourceType src;
817 debug_fenter(RELEASE);
819 /* Check argument here */
820 if (tag_attrs == NULL) {
821 debug_error(DEBUG, "Invalid arguments [tag null]\n");
822 return FILEINFO_ERROR_INVALID_ARGUMENT;
824 if (filename == NULL) {
825 debug_error(DEBUG, "Invalid arguments [filename null]\n");
826 return FILEINFO_ERROR_INVALID_ARGUMENT;
828 if (strlen(filename) == 0) {
829 debug_error(DEBUG, "Invalid arguments [filename size 0]\n");
830 return FILEINFO_ERROR_INVALID_ARGUMENT;
834 #ifdef __MMFILE_DYN_LOADING__
835 MMFILE_FUNC_HANDLE func_handle;
837 ret = _load_dynamic_functions(&func_handle);
839 debug_error(DEBUG, "load library error\n");
840 return FILEINFO_ERROR_FILE_INTERNAL;
844 /*set source file infomation*/
845 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
847 ret = _is_file_exist(filename);
848 if (ret != FILEINFO_ERROR_NONE) {
853 ret = mm_attrs_new(g_tag_attrs, ARRAY_SIZE(g_tag_attrs), "tag", NULL, NULL, &attrs);
855 debug_error(DEBUG, "attribute internal error.\n");
856 ret = FILEINFO_ERROR_FILE_INTERNAL;
860 ret = _get_tag_info(attrs, &src);
861 if (ret != FILEINFO_ERROR_NONE) {
862 mm_attrs_free(attrs);
864 debug_error(DEBUG, "failed to get tag: %s\n", filename);
870 #ifdef __MMFILE_DYN_LOADING__
871 _unload_dynamic_functions(&func_handle);
874 debug_fleave(RELEASE);
881 int mm_file_destroy_tag_attrs(MMHandleType tag_attrs)
883 void *artwork = NULL;
884 GList *synclyrics_list = NULL;
885 int ret = FILEINFO_ERROR_NONE;
887 debug_fenter(RELEASE);
889 if (tag_attrs == NULL) {
890 debug_error(DEBUG, "invalid handle.\n");
891 return FILEINFO_ERROR_INVALID_ARGUMENT;
894 ret = mm_attrs_get_data_by_name(tag_attrs, MM_FILE_TAG_ARTWORK, &artwork);
895 mmfile_free(artwork);
897 ret = mm_attrs_get_data_by_name(tag_attrs, MM_FILE_TAG_SYNCLYRICS, (void **)&synclyrics_list);
898 mm_file_free_synclyrics_list(synclyrics_list);
899 mm_attrs_free(tag_attrs);
901 debug_fleave(RELEASE);
907 int mm_file_create_content_attrs(MMHandleType *contents_attrs, const char *filename)
909 MMHandleType attrs = NULL;
910 MMFileSourceType src = {0, };
911 MMFILE_PARSE_INFO parse = {0, };
914 debug_fenter(RELEASE);
916 /* Check argument here */
917 if (contents_attrs == NULL) {
918 debug_error(DEBUG, "Invalid arguments [contents null]\n");
919 return FILEINFO_ERROR_INVALID_ARGUMENT;
921 if (filename == NULL) {
922 debug_error(DEBUG, "Invalid arguments [filename null]\n");
923 return FILEINFO_ERROR_INVALID_ARGUMENT;
925 if (strlen(filename) == 0) {
926 debug_error(DEBUG, "Invalid arguments [filename size 0]\n");
927 return FILEINFO_ERROR_INVALID_ARGUMENT;
931 #ifdef __MMFILE_DYN_LOADING__
932 MMFILE_FUNC_HANDLE func_handle;
939 ret = _load_dynamic_functions(&func_handle);
941 debug_error(DEBUG, "load library error\n");
942 return FILEINFO_ERROR_FILE_INTERNAL;
946 debug_msg(DEBUG, "_load_dynamic_functions() = %lld\n", gettime() - ti);
951 /*set source file infomation*/
952 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
954 ret = _is_file_exist(filename);
955 if (ret != FILEINFO_ERROR_NONE) {
960 ret = mm_attrs_new(g_content_attrs, ARRAY_SIZE(g_content_attrs), "content", NULL, NULL, &attrs);
962 debug_error(DEBUG, "attribute internal error.\n");
963 ret = FILEINFO_ERROR_FILE_INTERNAL;
968 parse.type = MM_FILE_PARSE_TYPE_ALL;
969 ret = _get_contents_info(attrs, &src, &parse);
970 if (ret != FILEINFO_ERROR_NONE) {
971 mm_attrs_free(attrs);
973 debug_error(DEBUG, "failed to get contents: %s\n", filename);
976 *contents_attrs = attrs;
980 #ifdef __MMFILE_DYN_LOADING__
986 _unload_dynamic_functions(&func_handle);
989 debug_msg(DEBUG, "_unload_dynamic_functions() = %lld\n", gettime() - ti);
994 debug_fleave(RELEASE);
1001 int mm_file_create_tag_attrs_from_memory(MMHandleType *tag_attrs, const void *data, unsigned int size, int format)
1003 MMHandleType attrs = NULL;
1004 MMFileSourceType src;
1005 /*MMFILE_PARSE_INFO parse = {0, };*/
1008 debug_fenter(RELEASE);
1010 /* Check argument here */
1011 if (tag_attrs == NULL || data == NULL) {
1012 debug_error(DEBUG, "Invalid arguments\n");
1013 return FILEINFO_ERROR_INVALID_ARGUMENT;
1016 #ifdef __MMFILE_DYN_LOADING__
1017 MMFILE_FUNC_HANDLE func_handle;
1019 ret = _load_dynamic_functions(&func_handle);
1021 debug_error(DEBUG, "load library error\n");
1022 return FILEINFO_ERROR_FILE_INTERNAL;
1026 MM_FILE_SET_MEDIA_MEM_SRC(src, data, size, format);
1029 ret = mm_attrs_new(g_tag_attrs, ARRAY_SIZE(g_tag_attrs), "tag", NULL, NULL, &attrs);
1031 debug_error(DEBUG, "attribute internal error.\n");
1032 ret = FILEINFO_ERROR_FILE_INTERNAL;
1036 /*parse.type = MM_FILE_PARSE_TYPE_ALL;*/
1037 ret = _get_tag_info(attrs, &src);
1038 if (ret != FILEINFO_ERROR_NONE) {
1039 mm_attrs_free(attrs);
1041 debug_error(DEBUG, "failed to get tag");
1047 #ifdef __MMFILE_DYN_LOADING__
1048 _unload_dynamic_functions(&func_handle);
1051 debug_fleave(RELEASE);
1058 int mm_file_create_content_attrs_from_memory(MMHandleType *contents_attrs, const void *data, unsigned int size, int format)
1060 MMHandleType attrs = NULL;
1061 MMFileSourceType src;
1062 MMFILE_PARSE_INFO parse = {0, };
1065 debug_fenter(RELEASE);
1067 /* Check argument here */
1068 if (contents_attrs == NULL || data == NULL) {
1069 debug_error(DEBUG, "Invalid arguments\n");
1070 return FILEINFO_ERROR_INVALID_ARGUMENT;
1073 #ifdef __MMFILE_DYN_LOADING__
1074 MMFILE_FUNC_HANDLE func_handle;
1076 ret = _load_dynamic_functions(&func_handle);
1078 debug_error(DEBUG, "load library error\n");
1079 return FILEINFO_ERROR_FILE_INTERNAL;
1083 MM_FILE_SET_MEDIA_MEM_SRC(src, data, size, format);
1086 ret = mm_attrs_new(g_content_attrs, ARRAY_SIZE(g_content_attrs), "content", NULL, NULL, &attrs);
1088 debug_error(DEBUG, "attribute internal error.\n");
1089 ret = FILEINFO_ERROR_FILE_INTERNAL;
1093 parse.type = MM_FILE_PARSE_TYPE_ALL;
1094 ret = _get_contents_info(attrs, &src, &parse);
1095 if (ret != FILEINFO_ERROR_NONE) {
1096 mm_attrs_free(attrs);
1098 debug_error(DEBUG, "failed to get contents");
1101 *contents_attrs = attrs;
1104 #ifdef __MMFILE_DYN_LOADING__
1105 _unload_dynamic_functions(&func_handle);
1108 debug_fleave(RELEASE);
1115 int mm_file_destroy_content_attrs(MMHandleType contents_attrs)
1117 void *thumbnail = NULL;
1118 int ret = FILEINFO_ERROR_NONE;
1120 debug_fenter(RELEASE);
1122 if (contents_attrs == NULL) {
1123 debug_error(DEBUG, "invalid handle.\n");
1124 return FILEINFO_ERROR_INVALID_ARGUMENT;
1127 ret = mm_attrs_get_data_by_name(contents_attrs, MM_FILE_CONTENT_VIDEO_THUMBNAIL, &thumbnail);
1128 mmfile_free(thumbnail);
1130 mm_attrs_free(contents_attrs);
1132 debug_fleave(RELEASE);
1139 int mm_file_get_stream_info(const char *filename, int *audio_stream_num, int *video_stream_num)
1141 MMFileSourceType src = {0, };
1142 MMFILE_PARSE_INFO parse = {0, };
1146 debug_fenter(RELEASE);
1148 if (filename == NULL || strlen(filename) == 0 || audio_stream_num == NULL || video_stream_num == NULL) {
1149 debug_error(DEBUG, "Invalid arguments\n");
1150 return FILEINFO_ERROR_INVALID_ARGUMENT;
1153 #ifdef __MMFILE_DYN_LOADING__
1154 MMFILE_FUNC_HANDLE func_handle;
1156 ret = _load_dynamic_functions(&func_handle);
1158 debug_error(DEBUG, "load library error\n");
1159 return FILEINFO_ERROR_FILE_INTERNAL;
1163 /*set source file infomation*/
1164 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
1166 ret = _is_file_exist(filename);
1167 if (ret != FILEINFO_ERROR_NONE) {
1171 parse.type = MM_FILE_PARSE_TYPE_SIMPLE;
1172 ret = _get_contents_info(NULL, &src, &parse);
1173 if (ret != FILEINFO_ERROR_NONE) {
1174 debug_error(DEBUG, "failed to get stream info: %s\n", filename);
1176 if (parse.audio_track_num == 0 && parse.video_track_num == 0) {
1177 debug_error(DEBUG, "empty header. retry to get stream info: %s\n", filename);
1178 parse.type = MM_FILE_PARSE_TYPE_NORMAL;
1179 ret = _get_contents_info(NULL, &src, &parse);
1183 /*set number of each stream*/
1184 *audio_stream_num = parse.audio_track_num;
1185 *video_stream_num = parse.video_track_num;
1188 #ifdef __MMFILE_DYN_LOADING__
1189 _unload_dynamic_functions(&func_handle);
1192 debug_fleave(RELEASE);
1198 int mm_file_create_content_attrs_simple(MMHandleType *contents_attrs, const char *filename)
1200 MMHandleType attrs = NULL;
1201 MMFileSourceType src = {0, };
1202 MMFILE_PARSE_INFO parse = {0, };
1205 debug_fenter(RELEASE);
1207 #ifdef __MMFILE_DYN_LOADING__
1208 MMFILE_FUNC_HANDLE func_handle;
1210 ret = _load_dynamic_functions(&func_handle);
1212 debug_error(DEBUG, "load library error\n");
1213 return FILEINFO_ERROR_FILE_INTERNAL;
1216 if (filename == NULL) {
1217 ret = FILEINFO_ERROR_INVALID_ARGUMENT;
1220 if (strlen(filename) == 0) {
1221 ret = FILEINFO_ERROR_INVALID_ARGUMENT;
1226 /*set source file infomation*/
1227 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
1229 ret = _is_file_exist(filename);
1230 if (ret != FILEINFO_ERROR_NONE) {
1235 ret = mm_attrs_new(g_content_attrs, ARRAY_SIZE(g_content_attrs), "content", NULL, NULL, &attrs);
1237 debug_error(DEBUG, "attribute internal error.\n");
1238 ret = FILEINFO_ERROR_FILE_INTERNAL;
1242 parse.type = MM_FILE_PARSE_TYPE_NORMAL;
1243 ret = _get_contents_info(attrs, &src, &parse);
1244 if (ret != FILEINFO_ERROR_NONE) {
1245 mm_attrs_free(attrs);
1247 debug_error(DEBUG, "failed to get contents: %s\n", filename);
1250 *contents_attrs = attrs;
1253 #ifdef __MMFILE_DYN_LOADING__
1254 _unload_dynamic_functions(&func_handle);
1257 debug_fleave(RELEASE);
1263 int mm_file_create_content_attrs_safe(MMHandleType *contents_attrs, const char *filename)
1265 MMHandleType attrs = NULL;
1266 MMFileSourceType src = {0, };
1267 MMFILE_PARSE_INFO parse = {0, };
1270 debug_fenter(RELEASE);
1272 #ifdef __MMFILE_DYN_LOADING__
1273 MMFILE_FUNC_HANDLE func_handle;
1275 ret = _load_dynamic_functions(&func_handle);
1277 debug_error(DEBUG, "load library error\n");
1278 return FILEINFO_ERROR_FILE_INTERNAL;
1281 if (filename == NULL) {
1282 ret = FILEINFO_ERROR_INVALID_ARGUMENT;
1285 if (strlen(filename) == 0) {
1286 ret = FILEINFO_ERROR_INVALID_ARGUMENT;
1291 /*set source file infomation*/
1292 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
1294 ret = _is_file_exist(filename);
1295 if (ret != FILEINFO_ERROR_NONE) {
1300 ret = mm_attrs_new(g_content_attrs, ARRAY_SIZE(g_content_attrs), "content", NULL, NULL, &attrs);
1302 debug_error(DEBUG, "attribute internal error.\n");
1303 ret = FILEINFO_ERROR_FILE_INTERNAL;
1307 parse.type = MM_FILE_PARSE_TYPE_SAFE;
1308 ret = _get_contents_info(attrs, &src, &parse);
1309 if (ret != FILEINFO_ERROR_NONE) {
1310 mm_attrs_free(attrs);
1312 debug_error(DEBUG, "failed to get contents: %s\n", filename);
1315 *contents_attrs = attrs;
1318 #ifdef __MMFILE_DYN_LOADING__
1319 _unload_dynamic_functions(&func_handle);
1322 debug_fleave(RELEASE);
1328 int mm_file_get_video_frame(const char *path, double timestamp, bool is_accurate, unsigned char **frame, int *size, int *width, int *height)
1331 void *formatFuncHandle = NULL;
1334 debug_error(DEBUG, "Invalid arguments [Path is Null]\n");
1335 return FILEINFO_ERROR_INVALID_ARGUMENT;
1338 #ifdef __MMFILE_DYN_LOADING__
1339 /* Get from function argument */
1340 formatFuncHandle = dlopen(MMFILE_FORMAT_SO_FILE_NAME, RTLD_LAZY);
1341 if (!formatFuncHandle) {
1342 debug_error(DEBUG, "error : dlopen");
1346 mmfile_format_get_frame = dlsym(formatFuncHandle, "mmfile_format_get_frame");
1347 if (!mmfile_format_get_frame) {
1348 debug_error(DEBUG, "error : load library");
1353 debug_msg(RELEASE, "file path [%s] is_accurate [%d]", path, is_accurate);
1355 ret = mmfile_format_get_frame(path, timestamp, is_accurate, frame, size, width, height);
1356 if (ret == MMFILE_FORMAT_FAIL) {
1357 debug_error(DEBUG, "error : get frame");
1361 if (formatFuncHandle) dlclose(formatFuncHandle);
1363 return FILEINFO_ERROR_NONE;
1366 if (formatFuncHandle) dlclose(formatFuncHandle);
1368 return FILEINFO_ERROR_FILE_INTERNAL;
1372 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)
1375 void *formatFuncHandle = NULL;
1378 debug_error(DEBUG, "Invalid arguments [data is Null]\n");
1379 return FILEINFO_ERROR_INVALID_ARGUMENT;
1382 if (datasize == 0) {
1383 debug_error(DEBUG, "Invalid arguments [datasize is zero]\n");
1384 return FILEINFO_ERROR_INVALID_ARGUMENT;
1387 #ifdef __MMFILE_DYN_LOADING__
1388 /* Get from function argument */
1389 formatFuncHandle = dlopen(MMFILE_FORMAT_SO_FILE_NAME, RTLD_LAZY);
1390 if (!formatFuncHandle) {
1391 debug_error(DEBUG, "error : dlopen");
1395 mmfile_format_get_frame_from_memory = dlsym(formatFuncHandle, "mmfile_format_get_frame_from_memory");
1396 if (!mmfile_format_get_frame_from_memory) {
1397 debug_error(DEBUG, "error : load library");
1402 debug_msg(RELEASE, "data [%p], data_size[%d], is_accurate [%d]", data, datasize, is_accurate);
1404 ret = mmfile_format_get_frame_from_memory(data, datasize, timestamp, is_accurate, frame, size, width, height);
1405 if (ret == MMFILE_FORMAT_FAIL) {
1406 debug_error(DEBUG, "error : get frame");
1410 if (formatFuncHandle) dlclose(formatFuncHandle);
1412 return FILEINFO_ERROR_NONE;
1415 if (formatFuncHandle) dlclose(formatFuncHandle);
1417 return FILEINFO_ERROR_FILE_INTERNAL;
1421 int mm_file_check_uhqa(const char *filename, bool *is_uhqa)
1423 MMHandleType attrs = NULL;
1424 MMFileSourceType src = {0, };
1425 MMFILE_PARSE_INFO parse = {0, };
1428 #ifdef __MMFILE_DYN_LOADING__
1429 MMFILE_FUNC_HANDLE func_handle;
1431 ret = _load_dynamic_functions(&func_handle);
1433 debug_error(DEBUG, "load library error\n");
1434 return FILEINFO_ERROR_FILE_INTERNAL;
1437 if (filename == NULL) {
1438 ret = FILEINFO_ERROR_INVALID_ARGUMENT;
1441 if (strlen(filename) == 0) {
1442 ret = FILEINFO_ERROR_INVALID_ARGUMENT;
1447 /*set source file infomation*/
1448 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
1450 ret = _is_file_exist(filename);
1451 if (ret != FILEINFO_ERROR_NONE) {
1456 ret = mm_attrs_new(g_content_attrs, ARRAY_SIZE(g_content_attrs), "content", NULL, NULL, &attrs);
1458 debug_error(DEBUG, "attribute internal error.\n");
1459 ret = FILEINFO_ERROR_FILE_INTERNAL;
1463 parse.type = MM_FILE_PARSE_TYPE_NORMAL;
1464 ret = _get_contents_info(attrs, &src, &parse);
1465 if (ret == FILEINFO_ERROR_NONE) {
1466 *is_uhqa = parse.is_uhqa;
1468 debug_error(DEBUG, "_get_contents_info failed\n");
1472 mm_attrs_free(attrs);
1476 #ifdef __MMFILE_DYN_LOADING__
1477 _unload_dynamic_functions(&func_handle);
1480 debug_fleave(RELEASE);