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.
22 #include <string.h> /*memcmp*/
23 #include <stdlib.h> /*malloc*/
24 #include "mm_file_debug.h"
25 #include "mm_file_utils.h"
27 /* Description of return value
32 /***********************************************************************/
33 /* Internal functions */
34 /***********************************************************************/
35 static int _MMFileSearchID3Tag(MMFileIOHandle *fp, unsigned int *offset);
36 static int _MMFileIsMP3Header(void *header);
37 static int _MMFileIsOGGHeader(void *header);
38 static int _MMFileIsREALHeader(void *header);
39 static int _MMFileIsMP4Header(void *header);
40 static int _MMFileIsWAVHeader(void *header);
41 static int _MMFileIsAVIHeader(void *header);
42 static int _MMFileIsMIDHeader(void *header);
43 static int _MMFileIsMMFHeader(void *header);
44 static int _MMFileIsIMYHeader(void *header);
45 static int _MMFileIsASFHeader(void *header);
46 static int _MMFileIsAMRHeader(void *header);
47 static int _MMFileIsFLACHeader(void *header);
48 static int _MMFileIsFLVHeader(void *header);
49 static int _MMFileIsMPEGTSHeader(MMFileIOHandle *fp);
50 static int _MMFileIsMPEGPSHeader(void *header);
51 static int _MMFileIsMPEGAUDIOHeader(void *header);
52 static int _MMFileIsMPEGVIDEOHeader(void *header);
53 static int _MMFileIsAIFFHeader(void *header);
54 static int _MMFileIsAPEHeader(void *header);
56 /***********************************************************************/
57 /* MP3 Header Check API */
58 /***********************************************************************/
60 int MMFileFormatIsValidMP3(MMFileIOHandle *pFileIO, const char *mmfileuri, int frameCnt)
62 #define _MMFILE_MP3_HEADER_LENGTH 4
63 #define _MMFILE_MP3_BUFFER_LENGTH 8200
65 MMFileIOHandle *fp = pFileIO;
66 unsigned char buffer[_MMFILE_MP3_BUFFER_LENGTH] = {0, };
67 long long filesize = 0;
68 unsigned int sizeID3 = 0;
69 int readed = 0, i = 0, j = 0;;
70 unsigned int startoffset = 0;
73 int ret = 0, count = 0, offset = 0;
76 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
77 if (ret == MMFILE_IO_FAILED) {
78 debug_error(DEBUG, "error: mmfile_open\n");
83 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
85 mmfile_seek(fp, 0L, MMFILE_SEEK_END);
86 filesize = mmfile_tell(fp);
87 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
89 if (filesize < _MMFILE_MP3_HEADER_LENGTH) {
90 debug_error(DEBUG, "header is too small.\n");
95 /* Search the existance of ID3 tag */
96 ret = _MMFileSearchID3Tag(fp, &sizeID3);
98 debug_error(RELEASE, "Error in searching the ID3 tag\n");
104 /* set begin and end point at the file */
105 startoffset += sizeID3;
106 endoffset = startoffset + 102400;
107 if (endoffset > filesize - _MMFILE_MP3_HEADER_LENGTH)
108 endoffset = filesize - _MMFILE_MP3_HEADER_LENGTH;
114 while (i < endoffset) {
115 mmfile_seek(fp, i, MMFILE_SEEK_SET);
116 readed = mmfile_read(fp, buffer, _MMFILE_MP3_BUFFER_LENGTH);
117 if (readed < _MMFILE_MP3_HEADER_LENGTH) {
118 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
124 for (j = 0; (j <= readed - _MMFILE_MP3_HEADER_LENGTH); j = j + offset) {
125 frameSize = _MMFileIsMP3Header(buffer + j);
131 if ((j + frameSize) >= (endoffset - (i + _MMFILE_MP3_HEADER_LENGTH))) {
135 if ((j + frameSize) >= (readed - _MMFILE_MP3_HEADER_LENGTH)) {
136 debug_msg(RELEASE, "MP3 coner hit %d %d\n", j, frameSize);
140 frameSize = _MMFileIsMP3Header(buffer + j + frameSize);
145 if (count == frameCnt) {
147 debug_msg(RELEASE, "Header Detected at %d\n", i + j);
156 /*If j is zero, this loop is infinite */
163 debug_msg(RELEASE, "Header Not Detected at: %d\n", i + j);
165 if (pFileIO == NULL && fp != NULL)
173 /***********************************************************************/
174 /* AAC Header Check API */
175 /***********************************************************************/
177 int MMFileFormatIsValidAAC(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
179 #define _MMFILE_AAC_HEADER_LENGTH 4
180 #define _MMFILE_AAC_BUFFER_LENGTH 8200
182 MMFileIOHandle *fp = pFileIO;
183 unsigned char buffer[_MMFILE_AAC_BUFFER_LENGTH] = {0, };
184 unsigned int sizeID3 = 0;
185 long long filesize = 0;
186 int readed = 0, i = 0, j = 0;
190 unsigned int sync = 0;
194 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
195 if (ret == MMFILE_IO_FAILED) {
196 debug_error(DEBUG, "error: mmfile_open\n");
201 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
203 /* Initialize the members of handle */
204 mmfile_seek(fp, 0, MMFILE_SEEK_END);
205 filesize = mmfile_tell(fp);
206 mmfile_seek(fp, 0, MMFILE_SEEK_SET);
208 if (filesize < _MMFILE_AAC_HEADER_LENGTH) {
209 debug_error(DEBUG, "header is too small.\n");
214 /* Search the existance of ID3 tag */
215 ret = _MMFileSearchID3Tag(fp, &sizeID3);
217 debug_error(RELEASE, "Error in searching the ID3 tag\n");
223 /* set begin and end point at the file */
224 startoffset += sizeID3;
225 endoffset = startoffset + 10240;
226 if (endoffset > filesize - _MMFILE_AAC_HEADER_LENGTH)
227 endoffset = filesize - _MMFILE_AAC_HEADER_LENGTH;
231 while (i < endoffset) {
232 mmfile_seek(fp, i, MMFILE_SEEK_SET);
234 readed = mmfile_read(fp, buffer, _MMFILE_AAC_BUFFER_LENGTH);
236 if (readed < _MMFILE_AAC_HEADER_LENGTH) {
237 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
242 debug_msg(RELEASE, "read error. size = %d. i = %d\n", readed, i);
244 for (j = 0; (j < readed - _MMFILE_AAC_HEADER_LENGTH); j++) {
246 sync = ((buffer[j] << 8) | (buffer[j + 1]));
248 if ((sync & 0xFFF6) == 0xFFF0) {
249 frameSize = (((buffer[j + 3] & 0x03) << 11) | (buffer[j + 4] << 3) | ((buffer[j + 5] & 0xE0) >> 5));
251 if (frameSize == 0) {
255 if ((j + frameSize) >= (endoffset - (i + 2))) {
258 if ((j + frameSize) >= (readed - 2)) {
259 debug_msg(RELEASE, "AAC coner hit %d %d\n", j, frameSize);
263 sync = ((buffer[j + frameSize] << 8) | (buffer[j + frameSize + 1]));
265 if ((sync & 0xFFF6) == 0xFFF0) {
267 debug_msg(RELEASE, "AAC ADTS Header Detected at %d\n", i + j);
270 } else if (!memcmp((buffer + j), "ADIF", 4)) {
272 debug_msg(RELEASE, "AAC ADIF Header Detected at %d\n", i + j);
276 /*If j is zero, this loop is infinite */
284 debug_msg(RELEASE, "Header Detected Failed\n");
286 if (pFileIO == NULL && fp != NULL)
294 /***********************************************************************/
295 /* OGG Header Check API */
296 /***********************************************************************/
298 int MMFileFormatIsValidOGG(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
300 #define _MMFILE_OGG_HEADER_LENGTH 4
301 #define _MMFILE_OGG_BUFFER_LENGTH 512
302 #define _MMFILE_OGG_CHECK_LIMIT (_MMFILE_OGG_HEADER_LENGTH * 1000)
304 MMFileIOHandle *fp = pFileIO;
305 unsigned char buffer[_MMFILE_OGG_BUFFER_LENGTH] = {0, };
306 unsigned int sizeID3 = 0;
307 long long filesize = 0;
308 int readed = 0, i = 0, j = 0;
315 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
316 if (ret == MMFILE_IO_FAILED) {
317 debug_error(DEBUG, "error: mmfile_open\n");
323 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
325 /* Initialize the members of handle */
326 mmfile_seek(fp, 0, MMFILE_SEEK_END);
327 filesize = mmfile_tell(fp);
328 mmfile_seek(fp, 0, MMFILE_SEEK_SET);
330 if (filesize < _MMFILE_OGG_HEADER_LENGTH) {
331 debug_error(DEBUG, "header is too small.\n");
336 /* Search the existance of ID3 tag */
337 ret = _MMFileSearchID3Tag(fp, &sizeID3);
339 debug_error(RELEASE, "Error in searching the ID3 tag\n");
345 /* set begin and end point at the file */
346 startoffset += sizeID3;
347 endoffset = filesize - _MMFILE_OGG_HEADER_LENGTH;
349 check_limit = (endoffset > _MMFILE_OGG_CHECK_LIMIT) ? _MMFILE_OGG_CHECK_LIMIT : endoffset;
352 while (i <= check_limit) {
353 mmfile_seek(fp, i, MMFILE_SEEK_SET);
354 readed = mmfile_read(fp, buffer, _MMFILE_OGG_BUFFER_LENGTH);
355 if (readed < _MMFILE_OGG_HEADER_LENGTH) {
356 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
361 for (j = 0; (j <= readed - _MMFILE_OGG_HEADER_LENGTH); j++) {
362 if (1 == _MMFileIsOGGHeader(buffer + j)) {
364 debug_msg(RELEASE, "Header Detected at %d\n", i + j);
369 memset(buffer, 0x00, _MMFILE_OGG_BUFFER_LENGTH);
375 if (pFileIO == NULL && fp != NULL)
383 /***********************************************************************/
384 /* MIDI Header Check API */
385 /***********************************************************************/
387 int MMFileFormatIsValidMID(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
389 #define _MMFILE_MIDI_HEADER_LENGTH 4
390 #define _MMFILE_MIDI_BUFFER_LENGTH 512
391 #define _MMFILE_MIDI_CHECK_LIMIT (_MMFILE_MIDI_HEADER_LENGTH * 1024)
393 MMFileIOHandle *fp = pFileIO;
394 unsigned char buffer[_MMFILE_MIDI_BUFFER_LENGTH] = {0, };
395 long long filesize = 0;
396 int readed = 0, i = 0, j = 0;
403 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
404 if (ret == MMFILE_IO_FAILED) {
405 debug_error(DEBUG, "error: mmfile_open\n");
410 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
412 /* Initialize the members of handle */
413 mmfile_seek(fp, 0, MMFILE_SEEK_END);
414 filesize = mmfile_tell(fp);
415 mmfile_seek(fp, 0, MMFILE_SEEK_SET);
417 if (filesize < _MMFILE_MIDI_HEADER_LENGTH) {
418 debug_error(DEBUG, "header is too small.\n");
425 /* set begin and end point at the file */
427 endoffset = filesize - _MMFILE_MIDI_HEADER_LENGTH;
429 check_limit = (endoffset > _MMFILE_MIDI_CHECK_LIMIT) ? _MMFILE_MIDI_CHECK_LIMIT : endoffset;
432 while (i <= check_limit) {
433 mmfile_seek(fp, i, MMFILE_SEEK_SET);
434 readed = mmfile_read(fp, buffer, _MMFILE_MIDI_BUFFER_LENGTH);
435 if (readed < _MMFILE_MIDI_HEADER_LENGTH) {
436 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
441 for (j = 0; (j <= readed - _MMFILE_MIDI_HEADER_LENGTH); j++) {
442 if (1 == _MMFileIsMIDHeader(buffer + j)) {
444 debug_msg(RELEASE, "Header Detected at %d\n", i + j);
449 memset(buffer, 0x00, _MMFILE_MIDI_BUFFER_LENGTH);
455 if (pFileIO == NULL && fp != NULL)
462 /***********************************************************************/
463 /* WAV Header Check API */
464 /***********************************************************************/
466 int MMFileFormatIsValidWAV(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
468 #define _MMFILE_WAV_HEADER_LENGTH 15
470 MMFileIOHandle *fp = pFileIO;
471 unsigned char buffer[_MMFILE_WAV_HEADER_LENGTH] = {0, };
476 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
477 if (ret == MMFILE_IO_FAILED) {
478 debug_error(DEBUG, "error: mmfile_open\n");
483 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
485 readed = mmfile_read(fp, buffer, _MMFILE_WAV_HEADER_LENGTH);
487 if (_MMFILE_WAV_HEADER_LENGTH != readed) {
488 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
493 if (1 == _MMFileIsWAVHeader(buffer)) {
494 debug_msg(RELEASE, "Header Detected\n");
500 if (pFileIO == NULL && fp != NULL)
508 /***********************************************************************/
509 /* MP4 Header Check API */
510 /***********************************************************************/
512 int MMFileFormatIsValidMP4(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
514 #define _MMFILE_MP4_HEADER_LENGTH 4
515 #define _MMFILE_MP4_CHECK_LIMIT (1024*10) /*10Kbyte*/
516 MMFileIOHandle *fp = pFileIO;
517 unsigned char buffer[_MMFILE_MP4_HEADER_LENGTH] = {0, };
518 long long filesize = 0;
520 unsigned int startoffset = 0;
522 unsigned int check_limit = 0;
525 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
526 if (ret == MMFILE_IO_FAILED) {
527 debug_error(DEBUG, "error: mmfile_open\n");
532 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
534 /* Initialize the members of handle */
535 mmfile_seek(fp, 0, MMFILE_SEEK_END);
536 filesize = mmfile_tell(fp);
537 mmfile_seek(fp, 0, MMFILE_SEEK_SET);
539 if (filesize < _MMFILE_MP4_HEADER_LENGTH) {
540 debug_error(DEBUG, "header is too small.\n");
547 /**@note weak check*/
548 check_limit = (filesize > _MMFILE_MP4_CHECK_LIMIT) ? _MMFILE_MP4_CHECK_LIMIT : filesize;
549 for (startoffset = 0; check_limit - (startoffset + _MMFILE_MP4_HEADER_LENGTH) > 0; startoffset++) {
550 mmfile_seek(fp, startoffset, MMFILE_SEEK_SET);
552 readed = mmfile_read(fp, buffer, _MMFILE_MP4_HEADER_LENGTH);
553 if (readed != _MMFILE_MP4_HEADER_LENGTH) {
554 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
560 if (1 == _MMFileIsMP4Header(buffer)) {
561 debug_msg(RELEASE, "MP4 Header Detected\n");
568 if (pFileIO == NULL && fp != NULL)
575 /***********************************************************************/
576 /* AVI Header Check API */
577 /***********************************************************************/
579 int MMFileFormatIsValidAVI(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
581 #define _MMFILE_AVI_HEADER_LENGTH 12
583 MMFileIOHandle *fp = pFileIO;
584 unsigned char buffer[_MMFILE_AVI_HEADER_LENGTH] = {0, };
589 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
590 if (ret == MMFILE_IO_FAILED) {
591 debug_error(DEBUG, "error: mmfile_open\n");
596 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
598 readed = mmfile_read(fp, buffer, _MMFILE_AVI_HEADER_LENGTH);
600 if (_MMFILE_AVI_HEADER_LENGTH != readed) {
601 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
606 if (1 == _MMFileIsAVIHeader(buffer)) {
607 debug_msg(RELEASE, "Header Detected \n");
613 if (pFileIO == NULL && fp != NULL)
621 /***********************************************************************/
622 /* ASF Header Check API */
623 /***********************************************************************/
625 int MMFileFormatIsValidASF(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
627 #define _MMFILE_ASF_HEADER_LENGTH 16
628 MMFileIOHandle *fp = pFileIO;
629 unsigned char buffer[_MMFILE_ASF_HEADER_LENGTH] = {0, };
634 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
635 if (ret == MMFILE_IO_FAILED) {
636 debug_error(DEBUG, "error: mmfile_open\n");
641 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
643 readed = mmfile_read(fp, buffer, _MMFILE_ASF_HEADER_LENGTH);
645 if (_MMFILE_ASF_HEADER_LENGTH != readed) {
646 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
651 if (1 == _MMFileIsASFHeader(buffer)) {
652 debug_msg(RELEASE, "Header Detected\n");
658 if (pFileIO == NULL && fp != NULL)
664 /***********************************************************************/
665 /* WMA Header Check API */
666 /***********************************************************************/
668 int MMFileFormatIsValidWMA(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
670 #define _MMFILE_ASF_HEADER_LENGTH 16
671 MMFileIOHandle *fp = pFileIO;
672 unsigned char buffer[_MMFILE_ASF_HEADER_LENGTH] = {0, };
677 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
678 if (ret == MMFILE_IO_FAILED) {
679 debug_error(DEBUG, "error: mmfile_open\n");
684 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
686 readed = mmfile_read(fp, buffer, _MMFILE_ASF_HEADER_LENGTH);
688 if (_MMFILE_ASF_HEADER_LENGTH != readed) {
689 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
695 if (1 == _MMFileIsASFHeader(buffer)) {
696 debug_msg(RELEASE, "Header Detected\n");
702 if (pFileIO == NULL && fp != NULL)
710 /***********************************************************************/
711 /* WMV Header Check API */
712 /***********************************************************************/
714 int MMFileFormatIsValidWMV(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
716 #define _MMFILE_ASF_HEADER_LENGTH 16
717 MMFileIOHandle *fp = pFileIO;
718 unsigned char buffer[_MMFILE_ASF_HEADER_LENGTH] = {0, };
723 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
724 if (ret == MMFILE_IO_FAILED) {
725 debug_error(DEBUG, "error: mmfile_open\n");
730 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
732 readed = mmfile_read(fp, buffer, _MMFILE_ASF_HEADER_LENGTH);
734 if (_MMFILE_ASF_HEADER_LENGTH != readed) {
735 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
740 if (1 == _MMFileIsASFHeader(buffer)) {
741 debug_msg(RELEASE, "Header Detected\n");
747 if (pFileIO == NULL && fp != NULL)
754 /***********************************************************************/
755 /* MMF Header Check API */
756 /***********************************************************************/
758 int MMFileFormatIsValidMMF(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
760 #define _MMFILE_MMF_HEADER_LENGTH 18
762 MMFileIOHandle *fp = pFileIO;
763 unsigned char buffer[_MMFILE_MMF_HEADER_LENGTH] = {0, };
768 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
769 if (ret == MMFILE_IO_FAILED) {
770 debug_error(DEBUG, "error: mmfile_open\n");
775 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
777 readed = mmfile_read(fp, buffer, _MMFILE_MMF_HEADER_LENGTH);
779 if (_MMFILE_MMF_HEADER_LENGTH != readed) {
780 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
785 if (1 == _MMFileIsMMFHeader(buffer)) {
786 debug_msg(RELEASE, "Header Detected\n");
792 if (pFileIO == NULL && fp != NULL)
800 /***********************************************************************/
801 /* MMF Header Check API */
802 /***********************************************************************/
804 int MMFileFormatIsValidIMY(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
806 #define _MMFILE_IMY_HEADER_LENGTH 13
808 MMFileIOHandle *fp = pFileIO;
809 unsigned char buffer[_MMFILE_IMY_HEADER_LENGTH] = {0, };
814 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
815 if (ret == MMFILE_IO_FAILED) {
816 debug_error(DEBUG, "error: mmfile_open\n");
821 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
823 readed = mmfile_read(fp, buffer, _MMFILE_IMY_HEADER_LENGTH);
825 if (_MMFILE_IMY_HEADER_LENGTH != readed) {
826 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
831 if (1 == _MMFileIsIMYHeader(buffer)) {
832 debug_msg(RELEASE, "Header Detected\n");
838 if (pFileIO == NULL && fp != NULL)
846 /***********************************************************************/
847 /* AMR Header Check API */
848 /***********************************************************************/
850 int MMFileFormatIsValidAMR(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
852 #define _MMFILE_AMR_MAX_HEADER_SIZE 15
853 #define _MMFILE_AMR_MIN_HEADER_SIZE 6
855 MMFileIOHandle *fp = pFileIO;
856 unsigned char buffer[_MMFILE_AMR_MAX_HEADER_SIZE] = {0, };
861 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
862 if (ret == MMFILE_IO_FAILED) {
863 debug_error(DEBUG, "error: mmfile_open\n");
868 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
870 readed = mmfile_read(fp, buffer, _MMFILE_AMR_MAX_HEADER_SIZE);
872 if (_MMFILE_AMR_MAX_HEADER_SIZE != readed) {
873 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
878 if (1 == _MMFileIsAMRHeader(buffer)) {
879 debug_msg(RELEASE, "Header Detected\n");
885 if (pFileIO == NULL && fp != NULL)
891 /***********************************************************************/
892 /* Matroska Header Check API */
893 /***********************************************************************/
895 int MMFileFormatIsValidMatroska(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
897 #define _MMFILE_EBML_MARKER_LENGTH 4
898 #define _MMFILE_MKV_READ_BUFFER_LENGTH 2048
900 MMFileIOHandle *fp = pFileIO;
901 unsigned char buffer[_MMFILE_MKV_READ_BUFFER_LENGTH] = {0, };
905 unsigned int size = 1, n = 1, total = 0;
906 char probe_data[] = { 'm', 'a', 't', 'r', 'o', 's', 'k', 'a' };
909 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
910 if (ret == MMFILE_IO_FAILED) {
911 debug_error(DEBUG, "error: mmfile_open\n");
916 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
918 readed = mmfile_read(fp, buffer, _MMFILE_MKV_READ_BUFFER_LENGTH);
920 if (_MMFILE_MKV_READ_BUFFER_LENGTH != readed) {
921 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
927 if (buffer[0] != 0x1A || buffer[1] != 0x45 || buffer[2] != 0xDF || buffer[3] != 0xA3) {
928 debug_msg(RELEASE, "This is not a EBML format\n");
933 /* length of header */
936 debug_msg(RELEASE, "Initial total header size = [0x%x]\n", total);
938 while (size <= 8 && !(total & len_mask)) {
939 debug_msg(DEBUG, "This case can not be handled yet....");
944 debug_msg(RELEASE, "Final total header size = [%d]\n", total);
947 debug_msg(DEBUG, "This case can not be handled yet....");
952 total &= (len_mask - 1);
955 total = (total << 8) | buffer[4 + n++];
956 debug_msg(DEBUG, "This case can not be handled yet....");
959 /* Does the probe data contain the whole header? */
960 if (_MMFILE_MKV_READ_BUFFER_LENGTH < 4 + size + total)
963 for (n = 4 + size ; n <= 4 + size + total - sizeof(probe_data); n++) {
964 if (!memcmp(&buffer[n], probe_data, sizeof(probe_data))) {
965 debug_msg(RELEASE, "String matroska found!!!\n");
972 if (pFileIO == NULL && fp != NULL)
978 /***********************************************************************/
979 /* QT Header Check API */
980 /***********************************************************************/
982 int MMFileFormatIsValidQT(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
987 /***********************************************************************/
988 /* Flac Header Check API */
989 /***********************************************************************/
991 int MMFileFormatIsValidFLAC(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
993 #define _MMFILE_FLAC_HEADER_LENGTH 5 /*fLaC*/
995 MMFileIOHandle *fp = pFileIO;
996 unsigned char buffer[_MMFILE_FLAC_HEADER_LENGTH] = {0, };
1001 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
1002 if (ret == MMFILE_IO_FAILED) {
1003 debug_error(DEBUG, "error: mmfile_open\n");
1008 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
1010 readed = mmfile_read(fp, buffer, _MMFILE_FLAC_HEADER_LENGTH);
1012 if (_MMFILE_FLAC_HEADER_LENGTH != readed) {
1013 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
1018 if (1 == _MMFileIsFLACHeader(buffer)) {
1019 debug_msg(RELEASE, "Header Detected\n");
1025 if (pFileIO == NULL && fp != NULL)
1031 /***********************************************************************/
1032 /* FLV(flash video) Header Check API */
1033 /***********************************************************************/
1035 int MMFileFormatIsValidFLV(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
1037 #define _MMFILE_FLV_HEADER_LENGTH 4 /*FLV*/
1039 MMFileIOHandle *fp = pFileIO;
1040 unsigned char buffer[_MMFILE_FLV_HEADER_LENGTH] = {0, };
1045 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
1046 if (ret == MMFILE_IO_FAILED) {
1047 debug_error(DEBUG, "error: mmfile_open\n");
1052 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
1054 readed = mmfile_read(fp, buffer, _MMFILE_FLV_HEADER_LENGTH);
1056 if (_MMFILE_FLV_HEADER_LENGTH != readed) {
1057 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
1062 if (1 == _MMFileIsFLVHeader(buffer)) {
1063 debug_msg(RELEASE, "Header Detected\n");
1069 if (pFileIO == NULL && fp != NULL)
1076 /***********************************************************************/
1077 /* REAL Header Check API */
1078 /***********************************************************************/
1080 int MMFileFormatIsValidREAL(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
1082 #define _MMFILE_RMVB_HEADER_LENGTH 4 /*RMF*/
1084 MMFileIOHandle *fp = pFileIO;
1085 unsigned char buffer[_MMFILE_RMVB_HEADER_LENGTH] = {0, };
1090 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
1091 if (ret == MMFILE_IO_FAILED) {
1092 debug_error(DEBUG, "error: mmfile_open\n");
1097 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
1099 readed = mmfile_read(fp, buffer, _MMFILE_RMVB_HEADER_LENGTH);
1101 if (_MMFILE_RMVB_HEADER_LENGTH != readed) {
1102 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
1107 if (1 == _MMFileIsREALHeader(buffer)) {
1108 debug_msg(RELEASE, "Header Detected\n");
1115 if (pFileIO == NULL && fp != NULL)
1121 /***********************************************************************/
1122 /* MPEGTS Header Check API */
1123 /***********************************************************************/
1124 #define MPEGTS_NONE 0x00
1125 #define MPEGTS_FECE 0x10
1126 #define MPEGTS_DVHS 0x20
1127 #define MPEGTS_PACKET 0x40
1129 #define TS_PACKET_SIZE 188
1130 #define TS_DVHS_PACKET_SIZE 192
1131 #define TS_FEC_PACKET_SIZE 204
1132 #define TS_MAX_PACKET_SIZE 204
1135 int MMFileFormatIsValidMPEGTS(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
1137 MMFileIOHandle *fp = pFileIO;
1138 unsigned char buffer[TS_MAX_PACKET_SIZE] = {0, };
1143 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
1144 if (ret == MMFILE_IO_FAILED) {
1145 debug_error(DEBUG, "error: mmfile_open\n");
1150 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
1152 readed = mmfile_read(fp, buffer, TS_MAX_PACKET_SIZE);
1154 if (TS_MAX_PACKET_SIZE != readed) {
1155 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
1160 if (_MMFileIsMPEGTSHeader(fp) != MPEGTS_NONE) {
1161 debug_msg(RELEASE, "Header Detected\n");
1167 if (pFileIO == NULL && fp != NULL)
1173 /***********************************************************************/
1174 /* MPEG-PS Header Check API */
1175 /***********************************************************************/
1177 int MMFileFormatIsValidMPEGPS(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
1179 #define _MMFILE_MPEGPS_HEADER_LENGTH 4
1181 MMFileIOHandle *fp = pFileIO;
1182 unsigned char buffer[_MMFILE_MPEGPS_HEADER_LENGTH] = {0, };
1187 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
1188 if (ret == MMFILE_IO_FAILED) {
1189 debug_error(DEBUG, "error: mmfile_open\n");
1194 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
1196 readed = mmfile_read(fp, buffer, _MMFILE_MPEGPS_HEADER_LENGTH);
1198 if (_MMFILE_MPEGPS_HEADER_LENGTH != readed) {
1199 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
1204 if (1 == _MMFileIsMPEGPSHeader(buffer)) {
1205 debug_msg(RELEASE, "Header Detected\n");
1211 if (pFileIO == NULL && fp != NULL)
1217 /***********************************************************************/
1218 /* MPEG AUDIO Header Check API */
1219 /***********************************************************************/
1221 int MMFileFormatIsValidMPEGAUDIO(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
1223 #define _MMFILE_MPEGAUDIO_HEADER_LENGTH 4
1225 MMFileIOHandle *fp = pFileIO;
1226 unsigned char buffer[_MMFILE_MPEGAUDIO_HEADER_LENGTH] = {0, };
1231 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
1232 if (ret == MMFILE_IO_FAILED) {
1233 debug_error(DEBUG, "error: mmfile_open\n");
1238 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
1240 readed = mmfile_read(fp, buffer, _MMFILE_MPEGAUDIO_HEADER_LENGTH);
1242 if (_MMFILE_MPEGAUDIO_HEADER_LENGTH != readed) {
1243 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
1248 if (1 == _MMFileIsMPEGAUDIOHeader(buffer)) {
1249 debug_msg(RELEASE, "Header Detected\n");
1255 if (pFileIO == NULL && fp != NULL)
1261 /***********************************************************************/
1262 /* MPEG VIDEO Header Check API */
1263 /***********************************************************************/
1265 int MMFileFormatIsValidMPEGVIDEO(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
1267 #define _MMFILE_MPEGVIDEO_HEADER_LENGTH 4
1269 MMFileIOHandle *fp = pFileIO;
1270 unsigned char buffer[_MMFILE_MPEGVIDEO_HEADER_LENGTH] = {0, };
1275 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
1276 if (ret == MMFILE_IO_FAILED) {
1277 debug_error(DEBUG, "error: mmfile_open\n");
1282 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
1284 readed = mmfile_read(fp, buffer, _MMFILE_MPEGVIDEO_HEADER_LENGTH);
1286 if (_MMFILE_MPEGVIDEO_HEADER_LENGTH != readed) {
1287 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
1292 if (1 == _MMFileIsMPEGVIDEOHeader(buffer)) {
1293 debug_msg(RELEASE, "Header Detected\n");
1299 if (pFileIO == NULL && fp != NULL)
1305 /***********************************************************************/
1306 /* AIFF Header Check API */
1307 /***********************************************************************/
1309 int MMFileFormatIsValidAIFF(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
1311 #define _MMFILE_AIFF_HEADER_LENGTH 13
1313 MMFileIOHandle *fp = pFileIO;
1314 unsigned char buffer[_MMFILE_AIFF_HEADER_LENGTH] = {0, };
1319 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
1320 if (ret == MMFILE_IO_FAILED) {
1321 debug_error(DEBUG, "error: mmfile_open\n");
1326 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
1328 readed = mmfile_read(fp, buffer, _MMFILE_AIFF_HEADER_LENGTH);
1330 if (_MMFILE_AIFF_HEADER_LENGTH != readed) {
1331 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
1336 if (1 == _MMFileIsAIFFHeader(buffer)) {
1337 debug_msg(RELEASE, "Header Detected\n");
1343 if (pFileIO == NULL && fp != NULL)
1350 int MMFileFormatIsValidAPE(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
1352 #define _MMFILE_APE_HEADER_LENGTH 4 /*APE*/
1354 MMFileIOHandle *fp = pFileIO;
1355 unsigned char buffer[_MMFILE_APE_HEADER_LENGTH] = {0, };
1360 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
1361 if (ret == MMFILE_IO_FAILED) {
1362 debug_error(DEBUG, "error: mmfile_open\n");
1367 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
1369 readed = mmfile_read(fp, buffer, _MMFILE_APE_HEADER_LENGTH);
1371 if (_MMFILE_APE_HEADER_LENGTH != readed) {
1372 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
1377 if (1 == _MMFileIsAPEHeader(buffer)) {
1378 debug_msg(RELEASE, "Header Detected\n");
1384 if (pFileIO == NULL && fp != NULL)
1390 /***********************************************************************/
1391 /* Implementation of Internal Functions */
1392 /***********************************************************************/
1393 static int _MMFileIsASFHeader(void *header)
1395 /* ID: 30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C */
1396 unsigned char *s = header;
1398 if ((*(s + 0) == 0x30) &&
1399 (*(s + 1) == 0x26) &&
1400 (*(s + 2) == 0xB2) &&
1401 (*(s + 3) == 0x75) &&
1402 (*(s + 4) == 0x8E) &&
1403 (*(s + 5) == 0x66) &&
1404 (*(s + 6) == 0xCF) &&
1405 (*(s + 7) == 0x11) &&
1406 (*(s + 8) == 0xA6) &&
1407 (*(s + 9) == 0xD9) &&
1408 (*(s + 10) == 0x00) &&
1409 (*(s + 11) == 0xAA) &&
1410 (*(s + 12) == 0x00) &&
1411 (*(s + 13) == 0x62) &&
1412 (*(s + 14) == 0xCE) &&
1413 (*(s + 15) == 0x6C)) {
1421 static int _MMFileIsAMRHeader(void *header)
1423 #define _MMFILE_AMR_SINGLE_CH_HEADER_SIZE 6
1424 #define _MMFILE_AMR_SINGLE_CH_HEADER "#!AMR\n"
1426 #define _MMFILE_AMR_WB_SINGLE_CH_HEADER_SIZE 9
1427 #define _MMFILE_AMR_WB_SINGLE_CH_HEADER "#!AMR-WB\n"
1429 #define _MMFILE_AMR_MULTI_CH_HEADER_SIZE 12
1430 #define _MMFILE_AMR_MULTI_CH_HEADER "#!AMR_MC1.0\n"
1432 #define _MMFILE_AMR_WB_MULTI_CH_HEADER_SIZE 15
1433 #define _MMFILE_AMR_WB_MULTI_CH_HEADER "#!AMR-WB_MC1.0\n"
1435 unsigned char *s = header;
1437 if (!memcmp(s, _MMFILE_AMR_SINGLE_CH_HEADER, _MMFILE_AMR_SINGLE_CH_HEADER_SIZE) ||
1438 !memcmp(s, _MMFILE_AMR_WB_SINGLE_CH_HEADER, _MMFILE_AMR_WB_SINGLE_CH_HEADER_SIZE) ||
1439 !memcmp(s, _MMFILE_AMR_MULTI_CH_HEADER, _MMFILE_AMR_MULTI_CH_HEADER_SIZE) ||
1440 !memcmp(s, _MMFILE_AMR_WB_MULTI_CH_HEADER, _MMFILE_AMR_WB_MULTI_CH_HEADER_SIZE)) {
1448 static int _MMFileIsIMYHeader(void *header)
1450 unsigned char *s = header;
1452 if (!memcmp(s, "BEGIN:IMELODY", 13)) {
1459 static int _MMFileIsMIDHeader(void *header)
1461 unsigned char *s = header;
1463 if (!memcmp(s, "MThd", 4)) { /*general MIDI*/
1465 } else if (!memcmp(s, "XMF_", 4)) { /*XMF*/
1467 } else if (!memcmp(s, "IREZ", 4)) {
1468 return 1; /*RMF format*/
1474 static int _MMFileIsMMFHeader(void *header)
1476 #define _MMFILE_MMF_TYPE_POSITION ((char)0x11)
1477 unsigned char *s = header;
1479 if (!memcmp(s, "MMMD", 4)) {
1480 /* warning: comparison is always true due to limited range of data type */
1481 if (*(s + _MMFILE_MMF_TYPE_POSITION) <= 0x2F) {
1483 } else if (((*(s + _MMFILE_MMF_TYPE_POSITION) >= 0x30) && (*(s + _MMFILE_MMF_TYPE_POSITION) <= 0x38)) /* MA3, MA5 type */
1484 || ((*(s + _MMFILE_MMF_TYPE_POSITION) >= 0x40) && (*(s + _MMFILE_MMF_TYPE_POSITION) <= 0x48))
1485 || ((*(s + _MMFILE_MMF_TYPE_POSITION) >= 0x50) && (*(s + _MMFILE_MMF_TYPE_POSITION) <= 0x58))
1486 || ((*(s + _MMFILE_MMF_TYPE_POSITION) == 0xF0))) {
1496 static int _MMFileIsAVIHeader(void *header)
1498 unsigned char *s = header;
1500 if (!memcmp(s, "RIFF", 4) && !memcmp(s + 8, "AVI", 3)) {
1508 static int _MMFileIsWAVHeader(void *header)
1510 unsigned char *s = header;
1512 if (!memcmp(s, "RIFF", 4) && !memcmp(s + 8, "WAVE", 4)) {
1521 static int _MMFileIsMP4Header(void *header)
1523 unsigned char *s = header;
1525 if (!memcmp(s, "moov", 4) ||
1526 !memcmp(s, "mdat", 4) ||
1527 !memcmp(s, "ftyp", 4) ||
1528 !memcmp(s, "free", 4) ||
1529 !memcmp(s, "uuid", 4) ||
1530 !memcmp(s, "skip", 4) ||
1532 !memcmp(s, "PICT", 4) ||
1533 !memcmp(s, "wide", 4) ||
1534 !memcmp(s, "prfl", 4)) {
1541 static int _MMFileIsOGGHeader(void *header)
1543 unsigned char *s = header;
1545 if (!memcmp(s, "OggS", 4)) {
1552 static int _MMFileIsREALHeader(void *header)
1554 unsigned char *s = header;
1556 if (!memcmp(s, ".RMF", 4)) {
1563 static int _MMFileIsMPEGTSHeader(MMFileIOHandle *fp)
1565 unsigned char header[TS_MAX_PACKET_SIZE] = {0, };
1566 unsigned char *s = NULL;
1568 mmfile_seek(fp, 0, MMFILE_SEEK_SET);
1569 mmfile_read(fp, header, sizeof(header));
1571 s = (unsigned char *)memchr(header, 0x47, sizeof(header));
1574 unsigned char buffer[TS_PACKET_SIZE] = {0, };
1575 unsigned int startoffset = s - header + 1;
1577 mmfile_seek(fp, startoffset, MMFILE_SEEK_SET);
1578 mmfile_read(fp, buffer, sizeof(buffer));
1580 if (buffer[sizeof(buffer) - 1] & 0x47) {
1581 return MPEGTS_PACKET;
1583 unsigned char dvhs_buf[TS_DVHS_PACKET_SIZE] = {0, };
1585 mmfile_seek(fp, startoffset, MMFILE_SEEK_SET);
1586 mmfile_read(fp, dvhs_buf, sizeof(dvhs_buf));
1588 if (dvhs_buf[sizeof(dvhs_buf) - 1] & 0x47) {
1591 unsigned char fec_buf[TS_FEC_PACKET_SIZE] = {0, };
1593 mmfile_seek(fp, startoffset, MMFILE_SEEK_SET);
1594 mmfile_read(fp, fec_buf, sizeof(fec_buf));
1596 if (fec_buf[sizeof(fec_buf) - 1] & 0x47) {
1606 static int _MMFileIsMPEGPSHeader(void *header)
1608 unsigned char *s = header;
1610 if ((*(s + 0) == 0x00) &&
1611 (*(s + 1) == 0x00) &&
1612 (*(s + 2) == 0x01) &&
1613 (*(s + 3) == 0xba)) { /* mpeg-ps header */
1620 static int _MMFileIsMPEGAUDIOHeader(void *header)
1622 unsigned char *s = header;
1624 if ((*(s + 0) == 0xFF) &&
1625 ((*(s + 1) == 0xFE) || (*(s + 1) == 0xFF))) { /* mpeg audio layer 1 header ,FE: protected by CRC ,FF: not protected */
1632 static int _MMFileIsMPEGVIDEOHeader(void *header)
1634 unsigned char *s = header;
1636 if ((*(s + 0) == 0x00) &&
1637 (*(s + 1) == 0x00) &&
1638 (*(s + 2) == 0x01) &&
1639 (*(s + 3) == 0xb3)) { /* mpeg1 video header */
1646 static int _MMFileIsMP3Header(void *header)
1648 unsigned long head = 0;
1649 unsigned char *headc = header;
1650 unsigned int bitrate, layer, length/*, mode*/;
1651 unsigned int coef, samplerate, version/*, channels*/;
1652 static const unsigned int mp3types_bitrates[2][3][16] = {
1653 { {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448,},
1654 {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384,},
1655 {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320,}
1657 { {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256,},
1658 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,},
1659 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,}
1663 static const unsigned int mp3types_freqs[3][3] = {
1664 {11025, 12000, 8000},
1665 {22050, 24000, 16000},
1666 {44100, 48000, 32000}
1669 static const unsigned int mp3FrameCoef[4][4] = {
1677 head = (*(headc + 0) << 24 | *(headc + 1) << 16 | *(headc + 2) << 8 | *(headc + 3));
1679 if ((head & 0xffe00000) != 0xffe00000) {
1683 /* we don't need extension, copyright, original or
1684 * emphasis for the frame length */
1688 /*mode = head & 0x3;*/
1692 length = head & 0x1;
1695 /* sampling frequency */
1696 samplerate = head & 0x3;
1697 if (samplerate == 3) {
1703 bitrate = head & 0xF;
1705 if (bitrate == 15) {
1709 /* ignore error correction, too */
1713 layer = 4 - (head & 0x3);
1719 /* version 0=MPEG2.5; 2=MPEG2; 3=MPEG1 */
1720 version = head & 0x3;
1726 /*channels = (mode == 3) ? 1 : 2;*/
1727 samplerate = mp3types_freqs[version > 0 ? version - 1 : 0][samplerate];
1730 bitrate = mp3types_bitrates[version == 3 ? 0 : 1][layer - 1][bitrate];
1731 coef = mp3FrameCoef[version][layer];
1733 length = length * 4;
1735 length = length + ((coef * bitrate * 1000) / samplerate);
1741 static int _MMFileSearchID3Tag(MMFileIOHandle *fp, unsigned int *offset)
1743 #define _MMFILE_MP3_TAGV2_HEADER_LEN 10
1744 #define _MMFILE_GET_INT_NUMBER(buff) (int)((((int)(buff)[0]) << 24) | (((int)(buff)[1]) << 16) | (((int)(buff)[2]) << 8) | (((int)(buff)[3])))
1746 unsigned char tagHeader[_MMFILE_MP3_TAGV2_HEADER_LEN] = {0, };
1747 unsigned int tagInfoSize = 0;
1748 unsigned int acc_tagsize = 0;
1757 mmfile_seek(fp, 0, MMFILE_SEEK_SET);
1761 readed = mmfile_read(fp, tagHeader, _MMFILE_MP3_TAGV2_HEADER_LEN);
1762 if (readed != _MMFILE_MP3_TAGV2_HEADER_LEN) {
1763 debug_error(RELEASE, "read error occured.\n");
1767 if (memcmp(tagHeader, "ID3", 3) == 0) {
1768 debug_msg(RELEASE, "'ID3' found.\n");
1770 debug_msg(RELEASE, "'ID3' not found.\n");
1774 /**@note weak id3v2 tag checking*/
1775 if (tagHeader[3] != 0xFF && tagHeader[4] != 0xFF &&
1776 (tagHeader[6] & 0x80) == 0 && (tagHeader[7] & 0x80) == 0 &&
1777 (tagHeader[8] & 0x80) == 0 && (tagHeader[9] & 0x80) == 0) {
1778 debug_msg(RELEASE, "good ID3V2 tag.\n");
1780 debug_warning(DEBUG, "It's bad ID3V2 tag.\n");
1784 tagVersion = tagHeader[3];
1786 if (tagVersion > 4) {
1787 debug_msg(RELEASE, "Tag version not supported\n");
1791 encSize = _MMFILE_GET_INT_NUMBER(&tagHeader[6]);
1792 tagInfoSize = _MMFILE_MP3_TAGV2_HEADER_LEN;
1793 tagInfoSize += (((encSize & 0x0000007F) >> 0) | ((encSize & 0x00007F00) >> 1) | ((encSize & 0x007F0000) >> 2) | ((encSize & 0x7F000000) >> 3));
1795 /**@note unfortunately, some contents has many id3 tag.*/
1796 acc_tagsize += tagInfoSize;
1797 debug_msg(RELEASE, "tag size: %u, offset: %u\n", tagInfoSize, acc_tagsize);
1799 mmfile_seek(fp, acc_tagsize, MMFILE_SEEK_SET);
1800 *offset = acc_tagsize;
1804 goto _START_TAG_SEARCH;
1810 static int _MMFileIsFLACHeader(void *header)
1812 unsigned char *s = header;
1814 if (!memcmp(s, "fLaC", 4)) {
1821 static int _MMFileIsFLVHeader(void *header)
1823 unsigned char *s = header;
1825 if (!memcmp(s, "FLV", 3)) {
1832 static int _MMFileIsAIFFHeader(void *header)
1834 unsigned char *s = header;
1836 if (!memcmp(s, "FORM", 4) && !memcmp(s + 8, "AIFF", 4)) {
1842 static int _MMFileIsAPEHeader(void *header)
1844 unsigned char *s = header;
1846 if (!memcmp(s, "MAC ", 4)) {