Change image buf type
[platform/core/multimedia/libmm-fileinfo.git] / utils / include / mm_file_utils.h
1 /*
2  * libmm-fileinfo
3  *
4  * Copyright (c) 2000 - 2011 Samsung Electronics Co., Ltd. All rights reserved.
5  *
6  * Contact: Haejeong Kim <backto.kim@samsung.com>
7  *
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
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  *
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.
19  *
20  */
21
22 #ifndef _MM_FILE_UTILS_H_
23 #define _MM_FILE_UTILS_H_
24
25 #ifdef __cplusplus
26 extern "C" {
27 #endif
28
29 #include <string.h>
30 #include <stdio.h>
31 #include <stdbool.h>
32 #include <stdlib.h>
33
34 #include <sys/types.h>
35 #include <sys/stat.h>
36 #include <fcntl.h>
37 #include <glib.h>
38
39 #include "mm_file_formats.h"
40
41 #define MMFILE_UTIL_FAIL                -1
42 #define MMFILE_UTIL_SUCCESS     0
43
44 #define MMFILE_IO_FAILED                MMFILE_UTIL_FAIL
45 #define MMFILE_IO_SUCCESS               MMFILE_UTIL_SUCCESS
46 #define CAST_MM_HANDLE(x)                       (MMHandleType)(x)
47
48 #define MMFILE_SAFE_FREE(src)   {if (src) {free(src); src = NULL; } }
49
50 #ifndef TRUE
51 #define TRUE    (1 == 1)
52 #endif
53 #ifndef FALSE
54 #define FALSE   (!TRUE)
55 #endif
56
57 #define MM_FILE_INI_PATH        "/etc/multimedia/mm_file_config.ini"
58
59
60 /*////////////////////////////////////////////////////////////////////// */
61 /*                     ENDIAN UTIL API                                // */
62 /*////////////////////////////////////////////////////////////////////// */
63 inline unsigned int     mmfile_io_be_uint32(unsigned int value);
64 inline unsigned int     mmfile_io_le_uint32(unsigned int value);
65 inline int              mmfile_io_be_int32(unsigned int value);
66 inline int              mmfile_io_le_int32(unsigned int value);
67 inline unsigned short   mmfile_io_be_uint16(unsigned short value);
68 inline unsigned short   mmfile_io_le_uint16(unsigned short value);
69 inline short            mmfile_io_be_int16(unsigned short value);
70 inline short            mmfile_io_le_int16(unsigned short value);
71 inline float            mmfile_io_be_float32(float value);
72
73 typedef struct MMFileIOHandle {
74         struct MMFileIOFunc *iofunc;
75         int     flags;         /* file flags */
76         void   *privateData;
77         char   *fileName;
78 } MMFileIOHandle;
79
80 /*////////////////////////////////////////////////////////////////////// */
81 /*                     FILE HEADER CHECK API                          // */
82 /*////////////////////////////////////////////////////////////////////// */
83 int MMFileFormatIsValidMP3(MMFileIOHandle *pFileIO, const char *mmfileuri, int frameCnt);
84 int MMFileFormatIsValidAAC(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
85 int MMFileFormatIsValidASF(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
86 int MMFileFormatIsValidMP4(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
87 int MMFileFormatIsValidAVI(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
88 int MMFileFormatIsValidAMR(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
89 int MMFileFormatIsValidWAV(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
90 int MMFileFormatIsValidMMF(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
91 int MMFileFormatIsValidMID(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
92 int MMFileFormatIsValidIMY(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
93 int MMFileFormatIsValidWMA(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
94 int MMFileFormatIsValidWMV(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
95 int MMFileFormatIsValidOGG(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
96 int MMFileFormatIsValidREAL(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
97 int MMFileFormatIsValidMatroska(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
98 int MMFileFormatIsValidQT(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
99 int MMFileFormatIsValidFLAC(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
100 int MMFileFormatIsValidFLV(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
101 int MMFileFormatIsValidMPEGTS(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
102 int MMFileFormatIsValidMPEGPS(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
103 int MMFileFormatIsValidMPEGVIDEO(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
104 int MMFileFormatIsValidMPEGAUDIO(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
105 int MMFileFormatIsValidAIFF(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
106 int MMFileFormatIsValidAPE(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy);
107
108
109
110 /*////////////////////////////////////////////////////////////////////// */
111 /*                       IO HANDLER API                               // */
112 /*////////////////////////////////////////////////////////////////////// */
113 #define MMFILE_URI_MAX_LEN     512
114 #define MMFILE_FILE_URI        "file://"
115 #define MMFILE_FILE_URI_LEN    7
116 #define MMFILE_MEM_URI         "mem://"
117 #define MMFILE_MEM_URI_LEN     6
118 #define MMFILE_MMAP_URI        "mmap://"
119 #define MMFILE_MMAP_URI_LEN    7
120 #define MMFILE_AVIO_BUFFER_LEN          32768
121
122 #define MMFILE_RDONLY           O_RDONLY
123
124 #define MMFILE_SEEK_SET         SEEK_SET
125 #define MMFILE_SEEK_CUR         SEEK_CUR
126 #define MMFILE_SEEK_END         SEEK_END
127
128 typedef struct MMFileIOFunc {
129         const char      *handleName;
130         int     (*mmfile_open)(MMFileIOHandle *h, const char *filename, int flags);
131         int     (*mmfile_read)(MMFileIOHandle *h, unsigned char *buf, int size);
132         int     (*mmfile_write)(MMFileIOHandle *h, unsigned char *buf, int size);
133         int64_t(*mmfile_seek)(MMFileIOHandle *h, int64_t pos, int whence);
134         long long(*mmfile_tell)(MMFileIOHandle *h);
135         int     (*mmfile_close)(MMFileIOHandle *h);
136         struct MMFileIOFunc *next;
137 } MMFileIOFunc;
138
139
140 int mmfile_register_io_func(MMFileIOFunc *iofunc);
141 int mmfile_register_io_all();
142
143 int                     mmfile_open(MMFileIOHandle **h, const char *filename, int flags);
144 int                     mmfile_read(MMFileIOHandle *h, unsigned char *buf, int size);
145 int                     mmfile_write(MMFileIOHandle *h, unsigned char *buf, int size);
146 int64_t         mmfile_seek(MMFileIOHandle *h, int64_t pos, int whence);
147 long long       mmfile_tell(MMFileIOHandle *h);
148 long long       mmfile_get_size(MMFileIOHandle *h);
149 int                     mmfile_close(MMFileIOHandle *h);
150
151
152
153 /*////////////////////////////////////////////////////////////////////// */
154 /*                            MIME  API                               // */
155 /*////////////////////////////////////////////////////////////////////// */
156 #define MMFILE_FILE_FMT_MAX_LEN 25
157 #define MMFILE_MIMETYPE_MAX_LEN 40
158 #define MMFILE_FILE_EXT_MAX_LEN 7
159
160 int mmfile_util_get_ffmpeg_format(const char *mime, char *ffmpegFormat);
161 int mmfile_util_get_mimetype(int formatId, char *mimeType, int buf_size);
162
163
164 /*////////////////////////////////////////////////////////////////////// */
165 /*                            PRINT API                               // */
166 /*////////////////////////////////////////////////////////////////////// */
167 void mmfile_format_print_contents(MMFileFormatContext *in);
168 void mmfile_format_print_tags(MMFileFormatContext *in);
169 void mmfile_format_print_frame(MMFileFormatFrame *in);
170
171
172 /*////////////////////////////////////////////////////////////////////// */
173 /*                            STRING API                              // */
174 /*////////////////////////////////////////////////////////////////////// */
175 char *mmfile_get_charset(const char *str);
176 char *mmfile_string_convert(const char *str, unsigned int len, const char *to_codeset, const char *from_codeset, gsize *bytes_read, unsigned int *bytes_written);
177
178
179 /*////////////////////////////////////////////////////////////////////// */
180 /*                            LOCALE API                              // */
181 /*////////////////////////////////////////////////////////////////////// */
182 char *MMFileUtilGetLocale();
183
184
185
186
187 /*////////////////////////////////////////////////////////////////////// */
188 /*                            IMAGE API                               // */
189 /*////////////////////////////////////////////////////////////////////// */
190 typedef enum {
191         MMFILE_PIXEL_FORMAT_YUV420 = 0,
192         MMFILE_PIXEL_FORMAT_YUV422 = 1,
193         MMFILE_PIXEL_FORMAT_RGB565 = 2,
194         MMFILE_PIXEL_FORMAT_RGB888 = 3,
195         MMFILE_PIXEL_FORMAT_MAX,
196 } eMMFilePixelFormat;
197
198 int mmfile_util_image_convert(unsigned char *src, eMMFilePixelFormat src_fmt, int src_width, int src_height, unsigned char *dst, eMMFilePixelFormat dst_fmt, int dst_width, int dst_height);
199
200
201 #ifdef __MMFILE_MEM_TRACE__
202 /*////////////////////////////////////////////////////////////////////// */
203 /*                            MEMORY DEBUG API                        // */
204 /*////////////////////////////////////////////////////////////////////// */
205 char *mmfile_string_convert_debug(const char *str, unsigned int len, const char *to_codeset, const char *from_codeset,
206                                                                 int *bytes_read,
207                                                                 int *bytes_written,
208                                                                 const char *func,
209                                                                 unsigned int line);
210
211
212 #define mmfile_string_convert(str, len, to_codeset, from_codeset, bytes_read, bytes_written) mmfile_string_convert_debug((str), (len), (to_codeset), (from_codeset), (bytes_read), (bytes_written), __func__, __LINE__)
213 #endif
214
215 #define mmfile_free(ptr)  do { g_free((ptr)); (ptr) = NULL; } while (0)
216
217
218
219 /*////////////////////////////////////////////////////////////////////// */
220 /*                            TAG API                                 // */
221 /*////////////////////////////////////////////////////////////////////// */
222
223 #define MM_FILE_REVERSE_BYTE_ORDER_INT(i) ((int)((((i)&0xFF000000)>>24) | (((i)&0x00FF0000)>>8) | (((i)&0x0000FF00)<<8) | (((i)&0x000000FF)<<24)))
224 #define MM_FILE_REVERSE_BYTE_ORDER_SHORT(s) ((short)((((s)&0xFF00)>>8) | (((s)&0x00FF)<<8)))
225
226 #define _STRNCPY_EX(dst, src, size)   { if ((size > 0)) {strncpy((char*)(dst), (char*)(src), (size)); *((dst) + (size)) = '\0'; } }
227
228 inline static int __AvMemstr(unsigned char *mem, unsigned char *str, int str_len, int search_range)
229 {
230         int offset = 0;
231         unsigned char *pSrc = mem;
232
233         for (offset = 0; offset < search_range; offset++) {
234                 pSrc = mem + offset;
235                 if (memcmp(pSrc, str, str_len) == 0)
236                         return offset;
237         }
238
239         return -1;
240 }
241
242 #define IS_ID3V2_TAG(x) (((x))[0] == 0x49 && ((x))[1] == 0x44 && ((x))[2] == 0x33)
243 #define IS_INCLUDE_URL(x)       (((x))[0] == 0x2D && ((x))[1] == 0x2D && ((x))[2] == 0x3E)
244 #define IS_INCLUDE_URL_UTF16(x) (((x))[0] == 0x2D && ((x))[1] == NULL && ((x))[2] == 0x2D && ((x))[3] == NULL && ((x))[4] == 0x3E && ((x))[5] == NULL)
245 #define IS_ENCODEDBY_UTF16(x)   (((x))[0] == 0xFF && ((x))[1] == 0xFE)
246 #define IS_ENCODEDBY_UTF16_R(x) (((x))[0] == 0xFE && ((x))[1] == 0xFF)
247
248 #define NEWLINE_OF_UTF16(x)     (((x))[0] == 0xFF && ((x))[1] == 0xFE && ((x))[2] == 0x00 && ((x))[3] == 0x00)
249 #define NEWLINE_OF_UTF16_R(x)   (((x))[0] == 0xFE && ((x))[1] == 0xFF && ((x))[2] == 0x00 && ((x))[3] == 0x00)
250
251
252 #define MP3_TAGv2_HEADER_LEN 10
253 #define MP3_TAGv2_23_TXT_HEADER_LEN 10
254 #define MP3_TAGv2_22_TXT_HEADER_LEN 6
255 #define TAGV1_SEEK_GAP 10
256
257
258 typedef enum {
259         AV_ID3V2_PICTURE_TYPE_MIN,
260         AV_ID3V2_PICTURE_TYPE_OTHER = AV_ID3V2_PICTURE_TYPE_MIN,
261         AV_ID3V2_PICTURE_TYPE_PNG_ONLY_FILEICON,
262         AV_ID3V2_PICTURE_TYPE_OTHER_FILEICON,
263         AV_ID3V2_PICTURE_TYPE_FRONT_COVER,
264         AV_ID3V2_PICTURE_TYPE_BACK_COVER,
265         AV_ID3V2_PICTURE_TYPE_LEAFLET_PAGE,
266         AV_ID3V2_PICTURE_TYPE_MEDIA_SIDEOFCD,
267         AV_ID3V2_PICTURE_TYPE_LEAD_ARTIST,
268         AV_ID3V2_PICTURE_TYPE_ARTIST_PERFORMER,
269         AV_ID3V2_PICTURE_TYPE_CONDUCTOR,
270         AV_ID3V2_PICTURE_TYPE_BAND_ORCHESTRA,
271         AV_ID3V2_PICTURE_TYPE_COMPOSER,
272         AV_ID3V2_PICTURE_TYPE_LYRICIST_TEXTWRITER,
273         AV_ID3V2_PICTURE_TYPE_RECORDING_LOCATION,
274         AV_ID3V2_PICTURE_TYPE_DURING_RECORDING,
275         AV_ID3V2_PICTURE_TYPE_DURING_PERFORMANCE,
276         AV_ID3V2_PICTURE_TYPE_MOVIE_VIDEO_SCREEN_CAPTURE,
277         AV_ID3V2_PICTURE_TYPE_BRIGHT_COLOURED_FISH,
278         AV_ID3V2_PICTURE_TYPE_ILLUSTRATION,
279         AV_ID3V2_PICTURE_TYPE_BAND_ARTIST_LOGOTYPE,
280         AV_ID3V2_PICTURE_TYPE_PUBLISHER_STUDIO_LOGOTYPE,
281
282         AV_ID3V2_PICTURE_TYPE_MAX,
283         AV_ID3V2_PICTURE_TYPE_UNKNOWN   = AV_ID3V2_PICTURE_TYPE_MAX /* Unknown picture type */
284
285 } AvID3v2PictureType;
286
287
288 #define MP3TAGINFO_SIZE                                                 128         /* file end 128 byte  */
289 #define MP3_ID3_TITLE_LENGTH                                    30
290 #define MP3_ID3_ARTIST_LENGTH                                   30
291 #define MP3_ID3_ALBUM_LENGTH                                    30
292 #define MP3_ID3_YEAR_LENGTH                                             4
293 #define MP3_ID3_DESCRIPTION_LENGTH                              30
294 #define MP3_ID3_GENRE_LENGTH                                    30
295
296 #define MP3_ID3_TRACKNUM_LENGTH                                 30
297 #define MP3_ID3_ENCBY_LENGTH                                    30
298 #define MP3_ID3_URL_LENGTH                                              100
299 #define MP3_ID3_FRAMEID_LENGTH                                  30
300 #define MP3_ID3_ORIGINARTIST_LENGTH                             30
301 #define MP3_ID3_COMPOSER_LENGTH                                 100
302 #define MP3_ID3_IMAGE_DESCRIPTION_MAX_LENGTH    65
303 #define MP3_ID3_IMAGE_MIME_TYPE_MAX_LENGTH              31
304 #define MP3_ID3_IMAGE_EXT_MAX_LENGTH                    4
305 #define TCC_FM_PATH_MOUNT_MMC                                   "/Mount/Mmc"
306
307
308
309 typedef enum {
310         AV_ID3V2_ISO_8859 = 0,
311         AV_ID3V2_UTF16,
312         AV_ID3V2_UTF16_BE,
313         AV_ID3V2_UTF8,
314         AV_ID3V2_MAX
315
316 } AvID3v2EncodingType;
317
318
319 typedef struct {
320         unsigned char   *pImageBuf;
321         char    *imageDescription;
322         char    imageMIMEType[MP3_ID3_IMAGE_MIME_TYPE_MAX_LENGTH];
323         char    imageExt[MP3_ID3_IMAGE_EXT_MAX_LENGTH];
324         int             pictureType;
325         int             imageLen;
326         int             imgDesLen;
327         int             imgMimetypeLen;
328         bool    bURLInfo;
329
330 } AvTagVer2ImageInfo;
331
332 typedef enum {
333         AV_ID3TAG_TITLE = 0,                    /*Title/songname/ */
334         AV_ID3TAG_ARTIST,                               /*Lead performer(s)/Soloist(s), */
335         AV_ID3TAG_ALBUM,
336         AV_ID3TAG_GENRE,
337         AV_ID3TAG_TRACKNUM,                     /*Track number/Position in set */
338         AV_ID3TAG_COMPOSER,
339         AV_ID3TAG_COPYRIGHT,
340         AV_ID3TAG_ALBUM_ARTIST,
341         AV_ID3TAG_CONDUCTOR,                    /*[#TPE3 Conductor/performer refinement], ADDED: 2010-01-xx*/
342         AV_ID3TAG_YEAR,
343         AV_ID3TAG_COMMENT,
344         AV_ID3TAG_ENCBY,                                /*Encoded by */
345         AV_ID3TAG_URL,                                  /*User defined URL link frame for ID3V2 Tag */
346         AV_ID3TAG_ORIGIN_ARTIST,                /*Original artist(s)/performer(s) */
347         AV_ID3TAG_RECDATE,                              /*Recording dates */
348         AV_ID3TAG_PART_OF_SET,
349         AV_ID3TAG_UNSYNCLYRICS,         /*Unsychronised lyrics/text transcription */
350         AV_ID3TAG_CONTENT_GROUP,                /* for PC Studio Podcast */
351         AV_ID3TAG_PICTURE,
352         AV_ID3TAG_SYNCLYRICS,                   /*Sychronised lyrics/text */
353         AV_ID3TAG_MAX,
354 } AvID3TagList;
355
356 typedef struct {
357         int             tagLen;
358         char    tagVersion;
359 } AvTagVer2AdditionalData;
360
361 typedef struct {
362         int length;
363         char *value;
364         bool marked;
365 } AvID3TagInfo;
366
367 typedef struct {
368 /* To send resolution info to appl from OEM */
369         int     width;
370         int     height;
371
372         unsigned int    bitRate;
373         unsigned int    sampleRate;
374         unsigned int    channels;
375         long long               duration;
376
377 /* for mp3 Info */
378         char                    *pToc;                  /* VBR??? SeekPosition?? ????? ???? TOC ??????? ?????? ??\EF\BF???? char ?��, 100 ????? ???? */
379         unsigned int    mpegVersion;    /* 1 : mpeg 1,    2 : mpeg 2, 3 : mpeg2.5 */
380         unsigned int    layer;                  /* 1 : layer1, 2 : layer2, 3 : layer3 */
381         unsigned int    channelIndex;   /* 0 : stereo, 1 : joint_stereo, 2 : dual_channel, 3 : mono */
382         unsigned int    objectType;
383         unsigned int    headerType;
384         long long               fileLen;                /* mp3 ?????? ??u ???? */
385         long                    headerPos;              /* mp3 ????\EF\BF?o?????? ??????? ??? */
386         long long               datafileLen;    /* ID3Tag???? ??????? ???? mp3 frame???? ????,  VBR??? XHEADDATA ?? bytes ?? ?????? */
387         int                             frameSize;              /* mp3 frame ?? ???? ??? */
388         int                             frameNum;               /* mp3 ????? ???????? ?? ?????��\EF\BF? */
389         bool                    bVbr;                   /* VBR mp3? */
390         bool                    bPadding;               /* Padding? */
391         bool                    bV1tagFound;
392
393         AvID3TagInfo tagInfo[AV_ID3TAG_MAX];
394         GList           *pSyncLyrics;
395
396         AvTagVer2ImageInfo                      imageInfo;      /*Album art   attached feature */
397         AvTagVer2AdditionalData         tagV2Info; /*Needed data for ID3 tag parsing */
398
399 /*for ID3V1 Tag */
400         unsigned char   genre;
401
402 } AvFileContentInfo;
403
404 typedef struct {
405         int             videocodec;
406         int             audiocodec;
407         int             width;
408         int             height;
409 } AvExtraInfo;
410
411 typedef struct {
412         unsigned long   time_info;
413         char                            *lyric_info;
414 } AvSynclyricsInfo;
415
416 void mm_file_free_synclyrics_list(GList *synclyrics_list);
417
418 inline static void mm_file_free_AvFileContentInfo(AvFileContentInfo *pInfo)
419 {
420         int i = 0;
421
422         if (!pInfo)
423                 return;
424
425         for (i = 0; i < AV_ID3TAG_MAX; i++)
426                 mmfile_free(pInfo->tagInfo[i].value);
427
428         mmfile_free(pInfo->pToc);
429         mmfile_free(pInfo->imageInfo.pImageBuf);
430         mmfile_free(pInfo->imageInfo.imageDescription);
431         if (strlen(pInfo->imageInfo.imageMIMEType) > 0)
432                 memset(pInfo->imageInfo.imageMIMEType, 0, MP3_ID3_IMAGE_MIME_TYPE_MAX_LENGTH);
433 }
434
435
436 bool    mm_file_id3tag_parse_v110(AvFileContentInfo *pInfo, unsigned char *buffer);  /*20050401 Condol : for MP3 content Info. */
437 bool    mm_file_id3tag_parse_v222(AvFileContentInfo *pInfo, unsigned char *buffer);
438 bool    mm_file_id3tag_parse_v223(AvFileContentInfo *pInfo, unsigned char *buffer);
439 bool    mm_file_id3tag_parse_v224(AvFileContentInfo *pInfo, unsigned char *buffer);
440 void    mm_file_id3tag_restore_content_info(AvFileContentInfo *pInfo);
441 int MMFileUtilGetMetaDataFromMKV(MMFileFormatContext *formatContext);
442 int MMFileUtilGetMetaDataFromMP4(MMFileFormatContext *formatContext);
443 int ParseSpatialVideoMetadataFromXMLString(const char *xmlStr, MMFileFormatContext *formatContext);
444
445
446 #ifdef __cplusplus
447 }
448 #endif
449
450 #endif /*_MMFILE_UTILS_H_*/
451