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_utils.h"
43 #define ARRAY_SIZE(arr) (sizeof(arr) / sizeof((arr)[0]))
46 #define _SEEK_POINT_ 3000 /*1000 = 1 seconds*/
48 #define MM_FILE_TAG_SYNCLYRICS "tag-synclyrics" /**< Synchronized Lyrics Information*/
58 MM_FILE_PARSE_TYPE_SIMPLE, /*parse audio/video track num only*/
59 MM_FILE_PARSE_TYPE_NORMAL, /*parse infomation without thumbnail*/
60 MM_FILE_PARSE_TYPE_ALL, /*parse all infomation*/
61 MM_FILE_PARSE_TYPE_SAFE, /*parse infomation without both thumbnail and stream full-searching*/
72 void *formatFuncHandle;
80 static MMAttrsConstructInfo g_tag_attrs[] = {
81 {(char *)"tag-artist", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
82 {(char *)"tag-title", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
83 {(char *)"tag-album", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
84 {(char *)"tag-album-artist", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
85 {(char *)"tag-genre", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
86 {(char *)"tag-author", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
87 {(char *)"tag-copyright", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
88 {(char *)"tag-date", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
89 {(char *)"tag-description", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
90 {(char *)"tag-comment", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
91 {(char *)"tag-artwork", MM_ATTRS_TYPE_DATA, MM_ATTRS_FLAG_RW, (void *)NULL},
92 {(char *)"tag-artwork-size", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
93 {(char *)"tag-artwork-mime", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
94 {(char *)"tag-track-num", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
95 {(char *)"tag-classification", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
96 {(char *)"tag-rating", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
97 {(char *)"tag-longitude", MM_ATTRS_TYPE_DOUBLE, MM_ATTRS_FLAG_RW, (void *)0},
98 {(char *)"tag-latitude", MM_ATTRS_TYPE_DOUBLE, MM_ATTRS_FLAG_RW, (void *)0},
99 {(char *)"tag-altitude", MM_ATTRS_TYPE_DOUBLE, MM_ATTRS_FLAG_RW, (void *)0},
100 {(char *)"tag-conductor", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
101 {(char *)"tag-unsynclyrics", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
102 {(char *)"tag-synclyrics-num", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
103 {(char *)"tag-synclyrics", MM_ATTRS_TYPE_DATA, MM_ATTRS_FLAG_RW, (void *)NULL},
104 {(char *)"tag-recdate", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
105 {(char *)"tag-part-of-set", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
106 {(char *)"tag-rotate", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
107 {(char *)"tag-cdis", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
108 {(char *)"tag-smta", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
109 {(char *)"tag-spherical", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
110 {(char *)"tag-stitched", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
111 {(char *)"tag-stitching-software", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
112 {(char *)"tag-projection-type", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
113 {(char *)"tag-stereo-mode", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
114 {(char *)"tag-source-count", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
115 {(char *)"tag-init-view-heading", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
116 {(char *)"tag-init-view-pitch", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
117 {(char *)"tag-init-view-roll", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
118 {(char *)"tag-timestamp", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
119 {(char *)"tag-full-pano-width", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
120 {(char *)"tag-full-pano-height", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
121 {(char *)"tag-cropped-area-image-width", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
122 {(char *)"tag-cropped-area-image-height", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
123 {(char *)"tag-cropped-area-left", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
124 {(char *)"tag-cropped-area-top", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
125 {(char *)"tag-ambisonic-type", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
126 {(char *)"tag-ambisonic-format", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
127 {(char *)"tag-ambisonic-order", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
128 {(char *)"stereo-mode-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
129 {(char *)"metadata-source-v2", MM_ATTRS_TYPE_STRING, MM_ATTRS_FLAG_RW, (void *)NULL},
130 {(char *)"proj-type-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
131 {(char *)"pose-yaw-degrees-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
132 {(char *)"pose-pitch-degrees-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
133 {(char *)"pose-roll-degrees-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
134 {(char *)"cbmp-layout-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
135 {(char *)"cbmp-padding-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
136 {(char *)"equi-projection-bounds-top-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
137 {(char *)"equi-projection-bounds-bottom-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
138 {(char *)"equi-projection-bounds-left-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
139 {(char *)"equi-projection-bounds-right-v2", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
142 static MMAttrsConstructInfo g_content_attrs[] = {
143 {(char *)"content-duration", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
144 {(char *)"content-video-codec", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
145 {(char *)"content-video-format", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
146 {(char *)"content-video-bitrate", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
147 {(char *)"content-video-fps", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
148 {(char *)"content-video-width", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
149 {(char *)"content-video-height", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
150 {(char *)"content-video-thumbnail", MM_ATTRS_TYPE_DATA, MM_ATTRS_FLAG_RW, (void *)NULL},
151 {(char *)"content-video-track-index", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
152 {(char *)"content-video-track-count", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
153 {(char *)"content-audio-codec", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
154 {(char *)"content-audio-bitrate", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
155 {(char *)"content-audio-channels", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
156 {(char *)"content-audio-samplerate", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
157 {(char *)"content-audio-track-index", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
158 {(char *)"content-audio-track-count", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
159 {(char *)"content-audio-bitpersample", MM_ATTRS_TYPE_INT, MM_ATTRS_FLAG_RW, (void *)0},
162 #ifdef __MMFILE_DYN_LOADING__
163 #define MMFILE_FORMAT_SO_FILE_NAME LIBDIR"/libmmfile_formats.so"
165 static int (*mmfile_format_open)(MMFileFormatContext **formatContext, MMFileSourceType *fileSrc);
166 static int (*mmfile_format_read_stream)(MMFileFormatContext *formatContext);
167 static int (*mmfile_format_read_frame)(MMFileFormatContext *formatContext, unsigned int timestamp, MMFileFormatFrame *frame);
168 static int (*mmfile_format_read_tag)(MMFileFormatContext *formatContext);
169 static int (*mmfile_format_close)(MMFileFormatContext *formatContext);
170 static int (*mmfile_format_get_frame)(const char *path, double timestamp, bool is_accurate, unsigned char **frame, int *size, int *width, int *height);
171 static int (*mmfile_format_get_frame_from_memory)(const void *data, unsigned int datasize, double timestamp, bool is_accurate, unsigned char **frame, int *size, int *width, int *height);
174 #ifdef __MMFILE_DYN_LOADING__
175 static int _load_dynamic_functions(MMFILE_FUNC_HANDLE *pHandle)
177 void *formatFuncHandle = NULL;
179 formatFuncHandle = dlopen(MMFILE_FORMAT_SO_FILE_NAME, RTLD_LAZY);
180 mm_file_retvm_if_fails(DEBUG, formatFuncHandle, FILEINFO_ERROR_FILE_INTERNAL);
182 mmfile_format_open = dlsym(formatFuncHandle, "mmfile_format_open");
183 mmfile_format_read_stream = dlsym(formatFuncHandle, "mmfile_format_read_stream");
184 mmfile_format_read_frame = dlsym(formatFuncHandle, "mmfile_format_read_frame");
185 mmfile_format_read_tag = dlsym(formatFuncHandle, "mmfile_format_read_tag");
186 mmfile_format_close = dlsym(formatFuncHandle, "mmfile_format_close");
188 if (!mmfile_format_open ||
189 !mmfile_format_read_stream ||
190 !mmfile_format_read_frame ||
191 !mmfile_format_read_tag ||
192 !mmfile_format_close) {
194 debug_error(DEBUG, "error: %s\n", "format function load error");
198 pHandle->formatFuncHandle = formatFuncHandle;
200 return FILEINFO_ERROR_NONE;
203 if (formatFuncHandle)
204 dlclose(formatFuncHandle);
206 return FILEINFO_ERROR_FILE_INTERNAL;
209 static void _unload_dynamic_functions(MMFILE_FUNC_HANDLE *pHandle)
211 debug_fenter(RELEASE);
213 if (pHandle->formatFuncHandle)
214 dlclose(pHandle->formatFuncHandle);
216 debug_fleave(RELEASE);
219 #endif /* __MMFILE_DYN_LOADING__ */
224 static int _is_file_readable(const char *filename)
226 mm_file_retvm_if_fails(DEBUG, filename, FILEINFO_ERROR_INVALID_ARGUMENT);
228 if (access(filename, R_OK) == -1) {
229 if (errno == EACCES || errno == EPERM) {
230 debug_error(DEBUG, "Permission denied [%s]", filename);
231 return FILEINFO_ERROR_PERMISSION_DENIED;
233 debug_error(DEBUG, "Not exist file [%s]", filename);
234 return FILEINFO_ERROR_FILE_NOT_FOUND;
238 return FILEINFO_ERROR_NONE;
241 static int _info_set_attr_media(MMHandleType attrs, MMFileFormatContext *formatContext)
245 if (formatContext->commandType == MM_FILE_TAG) {
246 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_TITLE, formatContext->title);
247 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ARTIST, formatContext->artist);
248 if (formatContext->author)
249 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_AUTHOR, formatContext->author);
251 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_AUTHOR, formatContext->composer);
252 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ALBUM, formatContext->album);
253 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ALBUM_ARTIST, formatContext->album_artist);
254 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_COPYRIGHT, formatContext->copyright);
255 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_DESCRIPTION, formatContext->description);
256 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_COMMENT, formatContext->comment);
257 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_GENRE, formatContext->genre);
258 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_CLASSIFICATION, formatContext->classification);
259 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_DATE, formatContext->year);
260 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_TRACK_NUM, formatContext->tagTrackNum);
261 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_RATING, formatContext->rating);
262 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_CONDUCTOR, formatContext->conductor);
263 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_RECDATE, formatContext->recDate);
264 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_POS, formatContext->part_of_set);
266 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ROTATE, formatContext->rotate);
267 mm_attrs_set_double_by_name(attrs, MM_FILE_TAG_LONGITUDE, formatContext->longitude);
268 mm_attrs_set_double_by_name(attrs, MM_FILE_TAG_LATIDUE, formatContext->latitude);
269 mm_attrs_set_double_by_name(attrs, MM_FILE_TAG_ALTIDUE, formatContext->altitude);
270 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SYNCLYRICS_NUM, formatContext->syncLyricsNum);
271 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_CDIS, formatContext->cdis);
272 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SMTA, formatContext->smta);
274 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL, formatContext->isSpherical);
275 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_STITCHED, formatContext->isStitched);
276 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_SPHERICAL_STITCHING_SOFTWARE, formatContext->stitchingSoftware);
277 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_SPHERICAL_PROJECTION_TYPE, formatContext->projectionType);
278 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_SPHERICAL_STEREO_MODE, formatContext->stereoMode);
279 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_SOURCE_COUNT, formatContext->sourceCount);
280 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_INIT_VIEW_HEADING, formatContext->initViewHeading);
281 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_INIT_VIEW_PITCH, formatContext->initViewPitch);
282 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_INIT_VIEW_ROLL, formatContext->initViewRoll);
283 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_TIMESTAMP, formatContext->timestamp);
284 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_FULL_PANO_WIDTH, formatContext->fullPanoWidth);
285 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_FULL_PANO_HEIGHT, formatContext->fullPanoHeight);
286 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_IMAGE_WIDTH, formatContext->croppedAreaImageWidth);
287 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_IMAGE_HEIGHT, formatContext->croppedAreaImageHeight);
288 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_LEFT, formatContext->croppedAreaLeft);
289 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_CROPPED_AREA_TOP, formatContext->croppedAreaTop);
291 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_AMBISONIC_TYPE, formatContext->ambisonicType);
292 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_AMBISONIC_FORMAT, formatContext->ambisonicFormat);
293 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_AMBISONIC_ORDER, formatContext->ambisonicOrder);
295 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_STEREO_MODE, formatContext->stereoModeV2);
296 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_METADATA_SOURCE, formatContext->metadataSourceV2);
297 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_PROJ_TYPE, formatContext->projTypeV2);
298 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_POSE_YAW, formatContext->poseYawV2);
299 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_POSE_PITCH, formatContext->posePitchV2);
300 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_POSE_ROLL, formatContext->poseRollV2);
301 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_CBMP_LAYOUT, formatContext->cbmpLayoutV2);
302 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_CBMP_PADDING, formatContext->cbmpPaddingV2);
303 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_EQUI_BOUNDS_TOP, formatContext->equiBoundsTopV2);
304 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_EQUI_BOUNDS_BOTTOM, formatContext->equiBoundsBottomV2);
305 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_EQUI_BOUNDS_LEFT, formatContext->equiBoundsLeftV2);
306 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_SPHERICAL_V2_EQUI_BOUNDS_RIGHT, formatContext->equiBoundsRightV2);
308 mm_attrs_set_data_by_name(attrs, MM_FILE_TAG_SYNCLYRICS, formatContext->syncLyrics, formatContext->syncLyricsNum);
310 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_UNSYNCLYRICS, formatContext->unsyncLyrics);
312 if (formatContext->artwork && formatContext->artworkSize > 0) {
313 void *artworkCopy = g_memdup2(formatContext->artwork, formatContext->artworkSize);
315 mm_attrs_set_data_by_name(attrs, MM_FILE_TAG_ARTWORK, artworkCopy, formatContext->artworkSize);
316 mm_attrs_set_int_by_name(attrs, MM_FILE_TAG_ARTWORK_SIZE, formatContext->artworkSize);
317 mm_attrs_set_string_by_name(attrs, MM_FILE_TAG_ARTWORK_MIME, formatContext->artworkMime);
319 } else if (formatContext->commandType == MM_FILE_CONTENTS) {
321 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_DURATION, formatContext->duration);
322 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_AUDIO_TRACK_COUNT, formatContext->audioTotalTrackNum);
323 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_VIDEO_TRACK_COUNT, formatContext->videoTotalTrackNum);
325 if (formatContext->videoTotalTrackNum > 0 &&
326 formatContext->nbStreams > 0 &&
327 formatContext->streams[MMFILE_VIDEO_STREAM]) {
329 MMFileFormatStream *videoStream = formatContext->streams[MMFILE_VIDEO_STREAM];
331 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_VIDEO_FORMAT, formatContext->formatType);
332 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_VIDEO_CODEC, videoStream->codecId);
333 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_VIDEO_BITRATE, videoStream->bitRate);
334 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_VIDEO_FPS, videoStream->framePerSec);
335 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_VIDEO_WIDTH, videoStream->width);
336 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_VIDEO_HEIGHT, videoStream->height);
338 if (formatContext->thumbNail && formatContext->thumbNail->frameData) {
339 void *thumbNailCopy = NULL;
340 thumbNailCopy = g_memdup2(formatContext->thumbNail->frameData, formatContext->thumbNail->frameSize);
342 mm_attrs_set_data_by_name(attrs, MM_FILE_CONTENT_VIDEO_THUMBNAIL, thumbNailCopy, formatContext->thumbNail->frameSize);
343 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_VIDEO_WIDTH, formatContext->thumbNail->frameWidth);
344 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_VIDEO_HEIGHT, formatContext->thumbNail->frameHeight);
348 if (formatContext->audioTotalTrackNum > 0 &&
349 formatContext->nbStreams > 0 &&
350 formatContext->streams[MMFILE_AUDIO_STREAM]) {
352 MMFileFormatStream *audioStream = formatContext->streams[MMFILE_AUDIO_STREAM];
354 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_AUDIO_CODEC, audioStream->codecId);
355 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_AUDIO_CHANNELS, audioStream->nbChannel);
356 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_AUDIO_BITRATE, audioStream->bitRate);
357 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_AUDIO_SAMPLERATE, audioStream->samplePerSec);
358 mm_attrs_set_int_by_name(attrs, MM_FILE_CONTENT_AUDIO_BITPERSAMPLE, audioStream->bitPerSample);
365 mm_attrs_commit_all(attrs);
371 __get_contents_thumbnail(MMFileFormatContext *formatContext)
373 int ret = FILEINFO_ERROR_NONE;
374 MMFileFormatFrame frameContext = {0, };
375 MMFileFormatFrame *thumbnail = NULL;
377 mm_file_retvm_if_fails(DEBUG, formatContext, FILEINFO_ERROR_FILE_INTERNAL);
379 if (MMFILE_FORMAT_FAIL == mmfile_format_read_frame(formatContext, _SEEK_POINT_, &frameContext)) {
380 debug_error(DEBUG, "error: mmfile_format_read_frame\n");
381 ret = FILEINFO_ERROR_FILE_INTERNAL;
385 /* set video thumbnail */
386 thumbnail = g_new0(MMFileFormatFrame, 1);
388 thumbnail->frameSize = frameContext.frameSize;
389 thumbnail->frameWidth = frameContext.frameWidth;
390 thumbnail->frameHeight = frameContext.frameHeight;
391 thumbnail->frameData = frameContext.frameData;
392 thumbnail->frameDataFree = frameContext.frameDataFree;
393 thumbnail->configLenth = 0;
394 thumbnail->configData = NULL;
396 #ifdef __MMFILE_TEST_MODE__
397 mmfile_format_print_frame(thumbnail);
400 formatContext->thumbNail = thumbnail;
402 /* because #MMFILE_FORMAT_SUCCESS is different with #FILEINFO_ERROR_NONE */
403 return FILEINFO_ERROR_NONE;
405 mmfile_free(thumbnail);
406 if (frameContext.frameDataFree)
407 frameContext.frameDataFree(frameContext.frameData);
409 mmfile_free(frameContext.frameData);
410 mmfile_free(frameContext.configData);
416 _get_contents_info(MMHandleType attrs, MMFileSourceType *src, MMFILE_PARSE_INFO *parse)
418 MMFileFormatContext *formatContext = NULL;
421 mm_file_retvm_if_fails(DEBUG, src, FILEINFO_ERROR_FILE_INTERNAL);
422 mm_file_retvm_if_fails(DEBUG, parse, FILEINFO_ERROR_FILE_INTERNAL);
424 if (MMFILE_FORMAT_FAIL == mmfile_format_open(&formatContext, src) || formatContext == NULL) {
425 debug_error(DEBUG, "error: mmfile_format_open\n");
426 ret = FILEINFO_ERROR_FILE_INTERNAL;
430 if (parse->type >= MM_FILE_PARSE_TYPE_NORMAL) {
431 if (parse->type == MM_FILE_PARSE_TYPE_SAFE)
432 formatContext->cdis = 1;
434 if (MMFILE_FORMAT_FAIL == mmfile_format_read_stream(formatContext)) {
435 debug_error(DEBUG, "error: mmfile_format_read_stream\n");
436 ret = FILEINFO_ERROR_FILE_INTERNAL;
440 parse->audio_track_num = formatContext->audioTotalTrackNum;
441 parse->video_track_num = formatContext->videoTotalTrackNum;
443 /* check uhqa content*/
444 if (formatContext->streams[MMFILE_AUDIO_STREAM] != NULL)
445 parse->is_uhqa = formatContext->streams[MMFILE_AUDIO_STREAM]->is_uhqa;
447 parse->is_uhqa = false;
449 if (parse->type >= MM_FILE_PARSE_TYPE_ALL && formatContext->videoTotalTrackNum > 0) {
450 /*why below code needed?
451 This API is for extracting some attributes not metadata(TAG). mm_file_create_content_attrs() use this API.
452 but MMFileUtilGetMetaDataFromMP4() Extract just TAG info. That is needed for mm_file_create_tag_attrs()*/
454 if (parse->type != MM_FILE_PARSE_TYPE_SAFE) {
455 if (formatContext->formatType == MM_FILE_FORMAT_3GP || formatContext->formatType == MM_FILE_FORMAT_MP4) {
456 MMFileUtilGetMetaDataFromMP4(formatContext);
460 ret = __get_contents_thumbnail(formatContext);
461 if (FILEINFO_ERROR_NONE != ret) {
462 debug_error(DEBUG, "error: __get_contents_thumbnail\n");
463 ret = FILEINFO_ERROR_NONE;
468 * if MM_FILE_PARSE_TYPE_SIMPLE, just get number of each stream.
470 parse->audio_track_num = formatContext->audioTotalTrackNum;
471 parse->video_track_num = formatContext->videoTotalTrackNum;
474 formatContext->commandType = MM_FILE_CONTENTS;
476 if (parse->type >= MM_FILE_PARSE_TYPE_NORMAL)
477 _info_set_attr_media(attrs, formatContext);
479 if (formatContext->thumbNail) {
480 if (formatContext->thumbNail->frameDataFree)
481 formatContext->thumbNail->frameDataFree(formatContext->thumbNail->frameData);
483 mmfile_free(formatContext->thumbNail->frameData);
484 mmfile_free(formatContext->thumbNail->configData);
485 mmfile_free(formatContext->thumbNail);
490 mmfile_format_close(formatContext);
497 _get_tag_info(MMHandleType attrs, MMFileSourceType *src, bool extract_albumart)
499 MMFileFormatContext *formatContext = NULL;
502 ret = mmfile_format_open(&formatContext, src);
503 if (MMFILE_FORMAT_FAIL == ret || formatContext == NULL) {
504 debug_error(DEBUG, "error: mmfile_format_open\n");
505 ret = FILEINFO_ERROR_FILE_INTERNAL;
509 /* Set albumart flag */
510 formatContext->extract_artwork = extract_albumart;
512 ret = mmfile_format_read_tag(formatContext);
513 if (MMFILE_FORMAT_FAIL == ret) {
514 debug_warning(DEBUG, "reading tag is fail\n");
515 ret = FILEINFO_ERROR_FILE_INTERNAL;
519 formatContext->commandType = MM_FILE_TAG;
521 _info_set_attr_media(attrs, formatContext);
524 mmfile_format_close(formatContext);
527 return FILEINFO_ERROR_NONE;
532 mmfile_format_close(formatContext);
535 return FILEINFO_ERROR_FILE_INTERNAL;
542 int mm_file_get_attrs(MMHandleType attrs, const char *first_attribute_name, ...)
544 int ret = FILEINFO_ERROR_NONE;
546 char *err_attr_name = NULL;
548 mm_file_retvm_if_fails(DEBUG, attrs, FILEINFO_ERROR_INVALID_ARGUMENT);
549 mm_file_retvm_if_fails(DEBUG, first_attribute_name, FILEINFO_ERROR_INVALID_ARGUMENT);
551 /* get requested attributes */
552 va_start(var_args, first_attribute_name);
553 ret = mm_attrs_get_valist(attrs, &err_attr_name, first_attribute_name, var_args);
556 if (ret != FILEINFO_ERROR_NONE) {
558 debug_error(DEBUG, "failed to get %s\n", err_attr_name);
566 int mm_file_get_synclyrics_info(MMHandleType tag_attrs, int index, unsigned long *time_info, char **lyrics)
568 int ret = FILEINFO_ERROR_NONE;
569 AvSynclyricsInfo *sync_lyric_item = NULL;
570 GList *synclyrics_list = NULL;
572 debug_fenter(RELEASE);
574 mm_file_retvm_if_fails(DEBUG, tag_attrs, FILEINFO_ERROR_INVALID_ARGUMENT);
576 ret = mm_attrs_get_data_by_name(tag_attrs, MM_FILE_TAG_SYNCLYRICS, (void **)&synclyrics_list);
577 if (ret != FILEINFO_ERROR_NONE) {
578 debug_warning(RELEASE, "get data fail");
582 mm_file_retvm_if_fails(RELEASE, synclyrics_list, FILEINFO_ERROR_ATTR_NOT_EXIST);
584 sync_lyric_item = (AvSynclyricsInfo *)g_list_nth_data(synclyrics_list, index);
586 mm_file_retvm_if_fails(RELEASE, sync_lyric_item, FILEINFO_ERROR_ATTR_NOT_EXIST);
588 *time_info = sync_lyric_item->time_info;
589 *lyrics = sync_lyric_item->lyric_info;
594 static int __mm_file_create_tag_attrs(MMHandleType *tag_attrs, const char *filename, bool extract_albumart)
596 int ret = FILEINFO_ERROR_NONE;
597 MMHandleType attrs = NULL;
598 MMFileSourceType src;
600 debug_fenter(RELEASE);
602 mm_file_retvm_if_fails(DEBUG, tag_attrs, FILEINFO_ERROR_INVALID_ARGUMENT);
604 ret = _is_file_readable(filename);
605 if (ret != FILEINFO_ERROR_NONE)
608 #ifdef __MMFILE_DYN_LOADING__
609 MMFILE_FUNC_HANDLE func_handle;
611 ret = _load_dynamic_functions(&func_handle);
612 if (ret != FILEINFO_ERROR_NONE) {
613 debug_error(DEBUG, "load library error\n");
618 /*set source file infomation*/
619 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
622 ret = mm_attrs_new(g_tag_attrs, ARRAY_SIZE(g_tag_attrs), "tag", NULL, NULL, &attrs);
624 debug_error(DEBUG, "attribute internal error.\n");
625 ret = FILEINFO_ERROR_FILE_INTERNAL;
629 ret = _get_tag_info(attrs, &src, extract_albumart);
630 if (ret != FILEINFO_ERROR_NONE) {
631 mm_attrs_free(attrs);
633 debug_error(DEBUG, "failed to get tag: %s\n", filename);
639 #ifdef __MMFILE_DYN_LOADING__
640 _unload_dynamic_functions(&func_handle);
643 debug_fleave(RELEASE);
648 int mm_file_create_tag_attrs(MMHandleType *tag_attrs, const char *filename)
650 return __mm_file_create_tag_attrs(tag_attrs, filename, true);
653 int mm_file_create_tag_attrs_no_albumart(MMHandleType *tag_attrs, const char *filename)
655 return __mm_file_create_tag_attrs(tag_attrs, filename, false);
658 int mm_file_destroy_tag_attrs(MMHandleType tag_attrs)
660 void *artwork = NULL;
661 GList *synclyrics_list = NULL;
662 int ret = FILEINFO_ERROR_NONE;
664 debug_fenter(RELEASE);
666 mm_file_retvm_if_fails(DEBUG, tag_attrs, FILEINFO_ERROR_INVALID_ARGUMENT);
668 ret = mm_attrs_get_data_by_name(tag_attrs, MM_FILE_TAG_ARTWORK, &artwork);
669 mmfile_free(artwork);
671 ret = mm_attrs_get_data_by_name(tag_attrs, MM_FILE_TAG_SYNCLYRICS, (void **)&synclyrics_list);
672 mm_file_free_synclyrics_list(synclyrics_list);
673 mm_attrs_free(tag_attrs);
675 debug_fleave(RELEASE);
680 static int __create_content_attrs(MMHandleType *contents_attrs, const char *filename, MMFILE_PARSE_TYPE parse_type)
682 MMHandleType attrs = NULL;
683 MMFileSourceType src = {0, };
684 MMFILE_PARSE_INFO parse = {0, };
687 debug_fenter(RELEASE);
689 mm_file_retvm_if_fails(DEBUG, contents_attrs, FILEINFO_ERROR_INVALID_ARGUMENT);
691 ret = _is_file_readable(filename);
692 if (ret != FILEINFO_ERROR_NONE)
695 #ifdef __MMFILE_DYN_LOADING__
696 MMFILE_FUNC_HANDLE func_handle;
698 ret = _load_dynamic_functions(&func_handle);
699 if (ret != FILEINFO_ERROR_NONE) {
700 debug_error(DEBUG, "load library error\n");
704 /*set source file infomation*/
705 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
708 ret = mm_attrs_new(g_content_attrs, ARRAY_SIZE(g_content_attrs), "content", NULL, NULL, &attrs);
710 debug_error(DEBUG, "attribute internal error.\n");
711 ret = FILEINFO_ERROR_FILE_INTERNAL;
716 parse.type = parse_type;
717 ret = _get_contents_info(attrs, &src, &parse);
718 if (ret != FILEINFO_ERROR_NONE) {
719 mm_attrs_free(attrs);
721 debug_error(DEBUG, "failed to get contents: %s\n", filename);
724 *contents_attrs = attrs;
728 #ifdef __MMFILE_DYN_LOADING__
729 _unload_dynamic_functions(&func_handle);
732 debug_fleave(RELEASE);
738 int mm_file_create_content_attrs(MMHandleType *contents_attrs, const char *filename)
740 return __create_content_attrs(contents_attrs, filename, MM_FILE_PARSE_TYPE_ALL);
744 static int __mm_file_create_tag_attrs_from_memory(MMHandleType *tag_attrs, const void *data, unsigned int size, int format, bool extract_albumart)
746 MMHandleType attrs = NULL;
747 MMFileSourceType src;
748 /*MMFILE_PARSE_INFO parse = {0, };*/
751 debug_fenter(RELEASE);
753 mm_file_retvm_if_fails(DEBUG, tag_attrs, FILEINFO_ERROR_INVALID_ARGUMENT);
754 mm_file_retvm_if_fails(DEBUG, data, FILEINFO_ERROR_INVALID_ARGUMENT);
756 #ifdef __MMFILE_DYN_LOADING__
757 MMFILE_FUNC_HANDLE func_handle;
759 ret = _load_dynamic_functions(&func_handle);
760 if (ret != FILEINFO_ERROR_NONE) {
761 debug_error(DEBUG, "load library error\n");
766 MM_FILE_SET_MEDIA_MEM_SRC(src, data, size, format);
769 ret = mm_attrs_new(g_tag_attrs, ARRAY_SIZE(g_tag_attrs), "tag", NULL, NULL, &attrs);
771 debug_error(DEBUG, "attribute internal error.\n");
772 ret = FILEINFO_ERROR_FILE_INTERNAL;
776 /*parse.type = MM_FILE_PARSE_TYPE_ALL;*/
777 ret = _get_tag_info(attrs, &src, extract_albumart);
778 if (ret != FILEINFO_ERROR_NONE) {
779 mm_attrs_free(attrs);
781 debug_error(DEBUG, "failed to get tag");
787 #ifdef __MMFILE_DYN_LOADING__
788 _unload_dynamic_functions(&func_handle);
791 debug_fleave(RELEASE);
796 int mm_file_create_tag_attrs_from_memory(MMHandleType *tag_attrs, const void *data, unsigned int size, int format)
798 return __mm_file_create_tag_attrs_from_memory(tag_attrs, data, size, format, true);
801 int mm_file_create_tag_attrs_no_albumart_from_memory(MMHandleType *tag_attrs, const void *data, unsigned int size, int format)
803 return __mm_file_create_tag_attrs_from_memory(tag_attrs, data, size, format, false);
806 int mm_file_create_content_attrs_from_memory(MMHandleType *contents_attrs, const void *data, unsigned int size, int format)
808 MMHandleType attrs = NULL;
809 MMFileSourceType src;
810 MMFILE_PARSE_INFO parse = {0, };
813 debug_fenter(RELEASE);
815 mm_file_retvm_if_fails(DEBUG, contents_attrs, FILEINFO_ERROR_INVALID_ARGUMENT);
816 mm_file_retvm_if_fails(DEBUG, data, FILEINFO_ERROR_INVALID_ARGUMENT);
818 #ifdef __MMFILE_DYN_LOADING__
819 MMFILE_FUNC_HANDLE func_handle;
821 ret = _load_dynamic_functions(&func_handle);
822 if (ret != FILEINFO_ERROR_NONE) {
823 debug_error(DEBUG, "load library error\n");
828 MM_FILE_SET_MEDIA_MEM_SRC(src, data, size, format);
831 ret = mm_attrs_new(g_content_attrs, ARRAY_SIZE(g_content_attrs), "content", NULL, NULL, &attrs);
833 debug_error(DEBUG, "attribute internal error.\n");
834 ret = FILEINFO_ERROR_FILE_INTERNAL;
838 parse.type = MM_FILE_PARSE_TYPE_ALL;
839 ret = _get_contents_info(attrs, &src, &parse);
840 if (ret != FILEINFO_ERROR_NONE) {
841 mm_attrs_free(attrs);
843 debug_error(DEBUG, "failed to get contents");
846 *contents_attrs = attrs;
849 #ifdef __MMFILE_DYN_LOADING__
850 _unload_dynamic_functions(&func_handle);
853 debug_fleave(RELEASE);
860 int mm_file_destroy_content_attrs(MMHandleType contents_attrs)
862 void *thumbnail = NULL;
863 int ret = FILEINFO_ERROR_NONE;
865 debug_fenter(RELEASE);
867 mm_file_retvm_if_fails(DEBUG, contents_attrs, FILEINFO_ERROR_INVALID_ARGUMENT);
869 ret = mm_attrs_get_data_by_name(contents_attrs, MM_FILE_CONTENT_VIDEO_THUMBNAIL, &thumbnail);
870 mmfile_free(thumbnail);
872 mm_attrs_free(contents_attrs);
874 debug_fleave(RELEASE);
881 int mm_file_get_stream_info(const char *filename, int *audio_stream_num, int *video_stream_num)
883 MMFileSourceType src = {0, };
884 MMFILE_PARSE_INFO parse = {0, };
888 debug_fenter(RELEASE);
890 mm_file_retvm_if_fails(DEBUG, audio_stream_num, FILEINFO_ERROR_INVALID_ARGUMENT);
891 mm_file_retvm_if_fails(DEBUG, video_stream_num, FILEINFO_ERROR_INVALID_ARGUMENT);
893 ret = _is_file_readable(filename);
894 if (ret != FILEINFO_ERROR_NONE)
897 #ifdef __MMFILE_DYN_LOADING__
898 MMFILE_FUNC_HANDLE func_handle;
900 ret = _load_dynamic_functions(&func_handle);
901 if (ret != FILEINFO_ERROR_NONE) {
902 debug_error(DEBUG, "load library error\n");
907 /*set source file infomation*/
908 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
911 parse.type = MM_FILE_PARSE_TYPE_SIMPLE;
912 ret = _get_contents_info(NULL, &src, &parse);
913 if (ret != FILEINFO_ERROR_NONE) {
914 debug_error(DEBUG, "failed to get stream info: %s\n", filename);
916 if (parse.audio_track_num == 0 && parse.video_track_num == 0) {
917 debug_error(DEBUG, "empty header. retry to get stream info: %s\n", filename);
918 parse.type = MM_FILE_PARSE_TYPE_NORMAL;
919 ret = _get_contents_info(NULL, &src, &parse);
923 /*set number of each stream*/
924 *audio_stream_num = parse.audio_track_num;
925 *video_stream_num = parse.video_track_num;
927 #ifdef __MMFILE_DYN_LOADING__
928 _unload_dynamic_functions(&func_handle);
931 debug_fleave(RELEASE);
937 int mm_file_create_content_attrs_simple(MMHandleType *contents_attrs, const char *filename)
939 return __create_content_attrs(contents_attrs, filename, MM_FILE_PARSE_TYPE_NORMAL);
943 int mm_file_create_content_attrs_safe(MMHandleType *contents_attrs, const char *filename)
945 return __create_content_attrs(contents_attrs, filename, MM_FILE_PARSE_TYPE_SAFE);
949 int mm_file_get_video_frame(const char *path, double timestamp, bool is_accurate, unsigned char **frame, int *size, int *width, int *height)
952 void *formatFuncHandle = NULL;
954 mm_file_retvm_if_fails(DEBUG, path, FILEINFO_ERROR_INVALID_ARGUMENT);
956 #ifdef __MMFILE_DYN_LOADING__
957 /* Get from function argument */
958 formatFuncHandle = dlopen(MMFILE_FORMAT_SO_FILE_NAME, RTLD_LAZY);
959 if (!formatFuncHandle) {
960 debug_error(DEBUG, "error : dlopen");
964 mmfile_format_get_frame = dlsym(formatFuncHandle, "mmfile_format_get_frame");
965 if (!mmfile_format_get_frame) {
966 debug_error(DEBUG, "error : load library");
971 debug_msg(RELEASE, "file path [%s] is_accurate [%d]", path, is_accurate);
973 ret = mmfile_format_get_frame(path, timestamp, is_accurate, frame, size, width, height);
974 if (ret == MMFILE_FORMAT_FAIL) {
975 debug_error(DEBUG, "error : get frame");
979 if (formatFuncHandle)
980 dlclose(formatFuncHandle);
982 return FILEINFO_ERROR_NONE;
985 if (formatFuncHandle)
986 dlclose(formatFuncHandle);
988 return FILEINFO_ERROR_FILE_INTERNAL;
992 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)
995 void *formatFuncHandle = NULL;
997 mm_file_retvm_if_fails(DEBUG, data, FILEINFO_ERROR_INVALID_ARGUMENT);
998 mm_file_retvm_if_fails(DEBUG, datasize != 0, FILEINFO_ERROR_INVALID_ARGUMENT);
1000 #ifdef __MMFILE_DYN_LOADING__
1001 /* Get from function argument */
1002 formatFuncHandle = dlopen(MMFILE_FORMAT_SO_FILE_NAME, RTLD_LAZY);
1003 if (!formatFuncHandle) {
1004 debug_error(DEBUG, "error : dlopen");
1008 mmfile_format_get_frame_from_memory = dlsym(formatFuncHandle, "mmfile_format_get_frame_from_memory");
1009 if (!mmfile_format_get_frame_from_memory) {
1010 debug_error(DEBUG, "error : load library");
1015 debug_msg(RELEASE, "data [%p], data_size[%d], is_accurate [%d]", data, datasize, is_accurate);
1017 ret = mmfile_format_get_frame_from_memory(data, datasize, timestamp, is_accurate, frame, size, width, height);
1018 if (ret == MMFILE_FORMAT_FAIL) {
1019 debug_error(DEBUG, "error : get frame");
1023 if (formatFuncHandle)
1024 dlclose(formatFuncHandle);
1026 return FILEINFO_ERROR_NONE;
1029 if (formatFuncHandle)
1030 dlclose(formatFuncHandle);
1032 return FILEINFO_ERROR_FILE_INTERNAL;
1036 int mm_file_check_uhqa(const char *filename, bool *is_uhqa)
1038 MMHandleType attrs = NULL;
1039 MMFileSourceType src = {0, };
1040 MMFILE_PARSE_INFO parse = {0, };
1043 ret = _is_file_readable(filename);
1044 if (ret != FILEINFO_ERROR_NONE)
1047 #ifdef __MMFILE_DYN_LOADING__
1048 MMFILE_FUNC_HANDLE func_handle;
1050 ret = _load_dynamic_functions(&func_handle);
1051 if (ret != FILEINFO_ERROR_NONE) {
1052 debug_error(DEBUG, "load library error\n");
1057 /*set source file infomation*/
1058 MM_FILE_SET_MEDIA_FILE_SRC(src, filename);
1061 ret = mm_attrs_new(g_content_attrs, ARRAY_SIZE(g_content_attrs), "content", NULL, NULL, &attrs);
1063 debug_error(DEBUG, "attribute internal error.\n");
1064 ret = FILEINFO_ERROR_FILE_INTERNAL;
1068 parse.type = MM_FILE_PARSE_TYPE_NORMAL;
1069 ret = _get_contents_info(attrs, &src, &parse);
1070 if (ret == FILEINFO_ERROR_NONE) {
1071 *is_uhqa = parse.is_uhqa;
1073 debug_error(DEBUG, "_get_contents_info failed\n");
1077 mm_attrs_free(attrs);
1080 #ifdef __MMFILE_DYN_LOADING__
1081 _unload_dynamic_functions(&func_handle);
1084 debug_fleave(RELEASE);