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);
55 /***********************************************************************/
56 /* MP3 Header Check API */
57 /***********************************************************************/
59 int MMFileFormatIsValidMP3(MMFileIOHandle *pFileIO, const char *mmfileuri, int frameCnt)
61 #define _MMFILE_MP3_HEADER_LENGTH 4
62 #define _MMFILE_MP3_BUFFER_LENGTH 8200
64 MMFileIOHandle *fp = pFileIO;
65 unsigned char buffer[_MMFILE_MP3_BUFFER_LENGTH] = {0, };
66 long long filesize = 0;
67 unsigned int sizeID3 = 0;
68 int readed = 0, i = 0, j = 0;;
69 unsigned int startoffset = 0;
72 int ret = 0, count = 0, offset = 0;
75 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
76 if (ret == MMFILE_IO_FAILED) {
77 debug_error(DEBUG, "error: mmfile_open\n");
82 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
84 mmfile_seek(fp, 0L, MMFILE_SEEK_END);
85 filesize = mmfile_tell(fp);
86 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
88 if (filesize < _MMFILE_MP3_HEADER_LENGTH) {
89 debug_error(DEBUG, "header is too small.\n");
94 /* Search the existance of ID3 tag */
95 ret = _MMFileSearchID3Tag(fp, &sizeID3);
97 debug_error(RELEASE, "Error in searching the ID3 tag\n");
103 /* set begin and end point at the file */
104 startoffset += sizeID3;
105 endoffset = startoffset + 102400;
106 if (endoffset > filesize - _MMFILE_MP3_HEADER_LENGTH)
107 endoffset = filesize - _MMFILE_MP3_HEADER_LENGTH;
113 while (i < endoffset) {
114 mmfile_seek(fp, i, MMFILE_SEEK_SET);
115 readed = mmfile_read(fp, buffer, _MMFILE_MP3_BUFFER_LENGTH);
116 if (readed < _MMFILE_MP3_HEADER_LENGTH) {
117 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
123 for (j = 0; (j <= readed - _MMFILE_MP3_HEADER_LENGTH); j = j + offset) {
124 frameSize = _MMFileIsMP3Header(buffer + j);
130 if ((j + frameSize) >= (endoffset - (i + _MMFILE_MP3_HEADER_LENGTH))) {
134 if ((j + frameSize) >= (readed - _MMFILE_MP3_HEADER_LENGTH)) {
135 debug_msg(RELEASE, "MP3 coner hit %d %d\n", j, frameSize);
139 frameSize = _MMFileIsMP3Header(buffer + j + frameSize);
144 if (count == frameCnt) {
146 debug_msg(RELEASE, "Header Detected at %d\n", i + j);
155 /*If j is zero, this loop is infinite */
162 debug_msg(RELEASE, "Header Not Detected at: %d\n", i + j);
164 if (pFileIO == NULL && fp != NULL)
172 /***********************************************************************/
173 /* AAC Header Check API */
174 /***********************************************************************/
176 int MMFileFormatIsValidAAC(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
178 #define _MMFILE_AAC_HEADER_LENGTH 4
179 #define _MMFILE_AAC_BUFFER_LENGTH 8200
181 MMFileIOHandle *fp = pFileIO;
182 unsigned char buffer[_MMFILE_AAC_BUFFER_LENGTH] = {0, };
183 unsigned int sizeID3 = 0;
184 long long filesize = 0;
185 int readed = 0, i = 0, j = 0;
189 unsigned int sync = 0;
193 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
194 if (ret == MMFILE_IO_FAILED) {
195 debug_error(DEBUG, "error: mmfile_open\n");
200 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
202 /* Initialize the members of handle */
203 mmfile_seek(fp, 0, MMFILE_SEEK_END);
204 filesize = mmfile_tell(fp);
205 mmfile_seek(fp, 0, MMFILE_SEEK_SET);
207 if (filesize < _MMFILE_AAC_HEADER_LENGTH) {
208 debug_error(DEBUG, "header is too small.\n");
213 /* Search the existance of ID3 tag */
214 ret = _MMFileSearchID3Tag(fp, &sizeID3);
216 debug_error(RELEASE, "Error in searching the ID3 tag\n");
222 /* set begin and end point at the file */
223 startoffset += sizeID3;
224 endoffset = startoffset + 10240;
225 if (endoffset > filesize - _MMFILE_AAC_HEADER_LENGTH)
226 endoffset = filesize - _MMFILE_AAC_HEADER_LENGTH;
230 while (i < endoffset) {
231 mmfile_seek(fp, i, MMFILE_SEEK_SET);
233 readed = mmfile_read(fp, buffer, _MMFILE_AAC_BUFFER_LENGTH);
235 if (readed < _MMFILE_AAC_HEADER_LENGTH) {
236 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
241 debug_msg(RELEASE, "read error. size = %d. i = %d\n", readed, i);
243 for (j = 0; (j < readed - _MMFILE_AAC_HEADER_LENGTH); j++) {
245 sync = ((buffer[j] << 8) | (buffer[j + 1]));
247 if ((sync & 0xFFF6) == 0xFFF0) {
248 frameSize = (((buffer[j + 3] & 0x03) << 11) | (buffer[j + 4] << 3) | ((buffer[j + 5] & 0xE0) >> 5));
250 if (frameSize == 0) {
254 if ((j + frameSize) >= (endoffset - (i + 2))) {
257 if ((j + frameSize) >= (readed - 2)) {
258 debug_msg(RELEASE, "AAC coner hit %d %d\n", j, frameSize);
262 sync = ((buffer[j + frameSize] << 8) | (buffer[j + frameSize + 1]));
264 if ((sync & 0xFFF6) == 0xFFF0) {
266 debug_msg(RELEASE, "AAC ADTS Header Detected at %d\n", i + j);
269 } else if (!memcmp((buffer + j), "ADIF", 4)) {
271 debug_msg(RELEASE, "AAC ADIF Header Detected at %d\n", i + j);
275 /*If j is zero, this loop is infinite */
283 debug_msg(RELEASE, "Header Detected Failed\n");
285 if (pFileIO == NULL && fp != NULL)
293 /***********************************************************************/
294 /* OGG Header Check API */
295 /***********************************************************************/
297 int MMFileFormatIsValidOGG(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
299 #define _MMFILE_OGG_HEADER_LENGTH 4
300 #define _MMFILE_OGG_BUFFER_LENGTH 512
301 #define _MMFILE_OGG_CHECK_LIMIT (_MMFILE_OGG_HEADER_LENGTH * 1000)
303 MMFileIOHandle *fp = pFileIO;
304 unsigned char buffer[_MMFILE_OGG_BUFFER_LENGTH] = {0, };
305 unsigned int sizeID3 = 0;
306 long long filesize = 0;
307 int readed = 0, i = 0, j = 0;
314 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
315 if (ret == MMFILE_IO_FAILED) {
316 debug_error(DEBUG, "error: mmfile_open\n");
322 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
324 /* Initialize the members of handle */
325 mmfile_seek(fp, 0, MMFILE_SEEK_END);
326 filesize = mmfile_tell(fp);
327 mmfile_seek(fp, 0, MMFILE_SEEK_SET);
329 if (filesize < _MMFILE_OGG_HEADER_LENGTH) {
330 debug_error(DEBUG, "header is too small.\n");
335 /* Search the existance of ID3 tag */
336 ret = _MMFileSearchID3Tag(fp, &sizeID3);
338 debug_error(RELEASE, "Error in searching the ID3 tag\n");
344 /* set begin and end point at the file */
345 startoffset += sizeID3;
346 endoffset = filesize - _MMFILE_OGG_HEADER_LENGTH;
348 check_limit = (endoffset > _MMFILE_OGG_CHECK_LIMIT) ? _MMFILE_OGG_CHECK_LIMIT : endoffset;
351 while (i <= check_limit) {
352 mmfile_seek(fp, i, MMFILE_SEEK_SET);
353 readed = mmfile_read(fp, buffer, _MMFILE_OGG_BUFFER_LENGTH);
354 if (readed < _MMFILE_OGG_HEADER_LENGTH) {
355 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
360 for (j = 0; (j <= readed - _MMFILE_OGG_HEADER_LENGTH); j++) {
361 if (1 == _MMFileIsOGGHeader(buffer + j)) {
363 debug_msg(RELEASE, "Header Detected at %d\n", i + j);
368 memset(buffer, 0x00, _MMFILE_OGG_BUFFER_LENGTH);
374 if (pFileIO == NULL && fp != NULL)
382 /***********************************************************************/
383 /* MIDI Header Check API */
384 /***********************************************************************/
386 int MMFileFormatIsValidMID(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
388 #define _MMFILE_MIDI_HEADER_LENGTH 4
389 #define _MMFILE_MIDI_BUFFER_LENGTH 512
390 #define _MMFILE_MIDI_CHECK_LIMIT (_MMFILE_MIDI_HEADER_LENGTH * 1024)
392 MMFileIOHandle *fp = pFileIO;
393 unsigned char buffer[_MMFILE_MIDI_BUFFER_LENGTH] = {0, };
394 long long filesize = 0;
395 int readed = 0, i = 0, j = 0;
402 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
403 if (ret == MMFILE_IO_FAILED) {
404 debug_error(DEBUG, "error: mmfile_open\n");
409 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
411 /* Initialize the members of handle */
412 mmfile_seek(fp, 0, MMFILE_SEEK_END);
413 filesize = mmfile_tell(fp);
414 mmfile_seek(fp, 0, MMFILE_SEEK_SET);
416 if (filesize < _MMFILE_MIDI_HEADER_LENGTH) {
417 debug_error(DEBUG, "header is too small.\n");
424 /* set begin and end point at the file */
426 endoffset = filesize - _MMFILE_MIDI_HEADER_LENGTH;
428 check_limit = (endoffset > _MMFILE_MIDI_CHECK_LIMIT) ? _MMFILE_MIDI_CHECK_LIMIT : endoffset;
431 while (i <= check_limit) {
432 mmfile_seek(fp, i, MMFILE_SEEK_SET);
433 readed = mmfile_read(fp, buffer, _MMFILE_MIDI_BUFFER_LENGTH);
434 if (readed < _MMFILE_MIDI_HEADER_LENGTH) {
435 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
440 for (j = 0; (j <= readed - _MMFILE_MIDI_HEADER_LENGTH); j++) {
441 if (1 == _MMFileIsMIDHeader(buffer + j)) {
443 debug_msg(RELEASE, "Header Detected at %d\n", i + j);
448 memset(buffer, 0x00, _MMFILE_MIDI_BUFFER_LENGTH);
454 if (pFileIO == NULL && fp != NULL)
461 /***********************************************************************/
462 /* WAV Header Check API */
463 /***********************************************************************/
465 int MMFileFormatIsValidWAV(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
467 #define _MMFILE_WAV_HEADER_LENGTH 15
469 MMFileIOHandle *fp = pFileIO;
470 unsigned char buffer[_MMFILE_WAV_HEADER_LENGTH] = {0, };
475 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
476 if (ret == MMFILE_IO_FAILED) {
477 debug_error(DEBUG, "error: mmfile_open\n");
482 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
484 readed = mmfile_read(fp, buffer, _MMFILE_WAV_HEADER_LENGTH);
486 if (_MMFILE_WAV_HEADER_LENGTH != readed) {
487 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
492 if (1 == _MMFileIsWAVHeader(buffer)) {
493 debug_msg(RELEASE, "Header Detected\n");
499 if (pFileIO == NULL && fp != NULL)
507 /***********************************************************************/
508 /* MP4 Header Check API */
509 /***********************************************************************/
511 int MMFileFormatIsValidMP4(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
513 #define _MMFILE_MP4_HEADER_LENGTH 4
514 #define _MMFILE_MP4_CHECK_LIMIT (1024*10) /*10Kbyte*/
515 MMFileIOHandle *fp = pFileIO;
516 unsigned char buffer[_MMFILE_MP4_HEADER_LENGTH] = {0, };
517 long long filesize = 0;
519 unsigned int startoffset = 0;
521 unsigned int check_limit = 0;
524 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
525 if (ret == MMFILE_IO_FAILED) {
526 debug_error(DEBUG, "error: mmfile_open\n");
531 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
533 /* Initialize the members of handle */
534 mmfile_seek(fp, 0, MMFILE_SEEK_END);
535 filesize = mmfile_tell(fp);
536 mmfile_seek(fp, 0, MMFILE_SEEK_SET);
538 if (filesize < _MMFILE_MP4_HEADER_LENGTH) {
539 debug_error(DEBUG, "header is too small.\n");
546 /**@note weak check*/
547 check_limit = (filesize > _MMFILE_MP4_CHECK_LIMIT) ? _MMFILE_MP4_CHECK_LIMIT : filesize;
548 for (startoffset = 0; check_limit - (startoffset + _MMFILE_MP4_HEADER_LENGTH) > 0; startoffset++) {
549 mmfile_seek(fp, startoffset, MMFILE_SEEK_SET);
551 readed = mmfile_read(fp, buffer, _MMFILE_MP4_HEADER_LENGTH);
552 if (readed != _MMFILE_MP4_HEADER_LENGTH) {
553 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
559 if (1 == _MMFileIsMP4Header(buffer)) {
560 debug_msg(RELEASE, "MP4 Header Detected\n");
567 if (pFileIO == NULL && fp != NULL)
574 /***********************************************************************/
575 /* AVI Header Check API */
576 /***********************************************************************/
578 int MMFileFormatIsValidAVI(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
580 #define _MMFILE_AVI_HEADER_LENGTH 12
582 MMFileIOHandle *fp = pFileIO;
583 unsigned char buffer[_MMFILE_AVI_HEADER_LENGTH] = {0, };
588 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
589 if (ret == MMFILE_IO_FAILED) {
590 debug_error(DEBUG, "error: mmfile_open\n");
595 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
597 readed = mmfile_read(fp, buffer, _MMFILE_AVI_HEADER_LENGTH);
599 if (_MMFILE_AVI_HEADER_LENGTH != readed) {
600 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
605 if (1 == _MMFileIsAVIHeader(buffer)) {
606 debug_msg(RELEASE, "Header Detected \n");
612 if (pFileIO == NULL && fp != NULL)
620 /***********************************************************************/
621 /* ASF Header Check API */
622 /***********************************************************************/
624 int MMFileFormatIsValidASF(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
626 #define _MMFILE_ASF_HEADER_LENGTH 16
627 MMFileIOHandle *fp = pFileIO;
628 unsigned char buffer[_MMFILE_ASF_HEADER_LENGTH] = {0, };
633 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
634 if (ret == MMFILE_IO_FAILED) {
635 debug_error(DEBUG, "error: mmfile_open\n");
640 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
642 readed = mmfile_read(fp, buffer, _MMFILE_ASF_HEADER_LENGTH);
644 if (_MMFILE_ASF_HEADER_LENGTH != readed) {
645 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
650 if (1 == _MMFileIsASFHeader(buffer)) {
651 debug_msg(RELEASE, "Header Detected\n");
657 if (pFileIO == NULL && fp != NULL)
663 /***********************************************************************/
664 /* WMA Header Check API */
665 /***********************************************************************/
667 int MMFileFormatIsValidWMA(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
669 #define _MMFILE_ASF_HEADER_LENGTH 16
670 MMFileIOHandle *fp = pFileIO;
671 unsigned char buffer[_MMFILE_ASF_HEADER_LENGTH] = {0, };
676 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
677 if (ret == MMFILE_IO_FAILED) {
678 debug_error(DEBUG, "error: mmfile_open\n");
683 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
685 readed = mmfile_read(fp, buffer, _MMFILE_ASF_HEADER_LENGTH);
687 if (_MMFILE_ASF_HEADER_LENGTH != readed) {
688 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
694 if (1 == _MMFileIsASFHeader(buffer)) {
695 debug_msg(RELEASE, "Header Detected\n");
701 if (pFileIO == NULL && fp != NULL)
709 /***********************************************************************/
710 /* WMV Header Check API */
711 /***********************************************************************/
713 int MMFileFormatIsValidWMV(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
715 #define _MMFILE_ASF_HEADER_LENGTH 16
716 MMFileIOHandle *fp = pFileIO;
717 unsigned char buffer[_MMFILE_ASF_HEADER_LENGTH] = {0, };
722 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
723 if (ret == MMFILE_IO_FAILED) {
724 debug_error(DEBUG, "error: mmfile_open\n");
729 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
731 readed = mmfile_read(fp, buffer, _MMFILE_ASF_HEADER_LENGTH);
733 if (_MMFILE_ASF_HEADER_LENGTH != readed) {
734 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
739 if (1 == _MMFileIsASFHeader(buffer)) {
740 debug_msg(RELEASE, "Header Detected\n");
746 if (pFileIO == NULL && fp != NULL)
753 /***********************************************************************/
754 /* MMF Header Check API */
755 /***********************************************************************/
757 int MMFileFormatIsValidMMF(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
759 #define _MMFILE_MMF_HEADER_LENGTH 18
761 MMFileIOHandle *fp = pFileIO;
762 unsigned char buffer[_MMFILE_MMF_HEADER_LENGTH] = {0, };
767 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
768 if (ret == MMFILE_IO_FAILED) {
769 debug_error(DEBUG, "error: mmfile_open\n");
774 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
776 readed = mmfile_read(fp, buffer, _MMFILE_MMF_HEADER_LENGTH);
778 if (_MMFILE_MMF_HEADER_LENGTH != readed) {
779 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
784 if (1 == _MMFileIsMMFHeader(buffer)) {
785 debug_msg(RELEASE, "Header Detected\n");
791 if (pFileIO == NULL && fp != NULL)
799 /***********************************************************************/
800 /* MMF Header Check API */
801 /***********************************************************************/
803 int MMFileFormatIsValidIMY(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
805 #define _MMFILE_IMY_HEADER_LENGTH 13
807 MMFileIOHandle *fp = pFileIO;
808 unsigned char buffer[_MMFILE_IMY_HEADER_LENGTH] = {0, };
813 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
814 if (ret == MMFILE_IO_FAILED) {
815 debug_error(DEBUG, "error: mmfile_open\n");
820 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
822 readed = mmfile_read(fp, buffer, _MMFILE_IMY_HEADER_LENGTH);
824 if (_MMFILE_IMY_HEADER_LENGTH != readed) {
825 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
830 if (1 == _MMFileIsIMYHeader(buffer)) {
831 debug_msg(RELEASE, "Header Detected\n");
837 if (pFileIO == NULL && fp != NULL)
845 /***********************************************************************/
846 /* AMR Header Check API */
847 /***********************************************************************/
849 int MMFileFormatIsValidAMR(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
851 #define _MMFILE_AMR_MAX_HEADER_SIZE 15
852 #define _MMFILE_AMR_MIN_HEADER_SIZE 6
854 MMFileIOHandle *fp = pFileIO;
855 unsigned char buffer[_MMFILE_AMR_MAX_HEADER_SIZE] = {0, };
860 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
861 if (ret == MMFILE_IO_FAILED) {
862 debug_error(DEBUG, "error: mmfile_open\n");
867 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
869 readed = mmfile_read(fp, buffer, _MMFILE_AMR_MAX_HEADER_SIZE);
871 if (_MMFILE_AMR_MAX_HEADER_SIZE != readed) {
872 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
877 if (1 == _MMFileIsAMRHeader(buffer)) {
878 debug_msg(RELEASE, "Header Detected\n");
884 if (pFileIO == NULL && fp != NULL)
890 /***********************************************************************/
891 /* Matroska Header Check API */
892 /***********************************************************************/
894 int MMFileFormatIsValidMatroska(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
896 #define _MMFILE_EBML_MARKER_LENGTH 4
897 #define _MMFILE_MKV_READ_BUFFER_LENGTH 2048
899 MMFileIOHandle *fp = pFileIO;
900 unsigned char buffer[_MMFILE_MKV_READ_BUFFER_LENGTH] = {0, };
904 unsigned int size = 1, n = 1, total = 0;
905 char probe_data[] = { 'm', 'a', 't', 'r', 'o', 's', 'k', 'a' };
908 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
909 if (ret == MMFILE_IO_FAILED) {
910 debug_error(DEBUG, "error: mmfile_open\n");
915 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
917 readed = mmfile_read(fp, buffer, _MMFILE_MKV_READ_BUFFER_LENGTH);
919 if (_MMFILE_MKV_READ_BUFFER_LENGTH != readed) {
920 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
926 if (buffer[0] != 0x1A || buffer[1] != 0x45 || buffer[2] != 0xDF || buffer[3] != 0xA3) {
927 debug_msg(RELEASE, "This is not a EBML format\n");
932 /* length of header */
935 debug_msg(RELEASE, "Initial total header size = [0x%x]\n", total);
937 while (size <= 8 && !(total & len_mask)) {
938 debug_msg(DEBUG, "This case can not be handled yet....");
943 debug_msg(RELEASE, "Final total header size = [%d]\n", total);
946 debug_msg(DEBUG, "This case can not be handled yet....");
951 total &= (len_mask - 1);
954 total = (total << 8) | buffer[4 + n++];
955 debug_msg(DEBUG, "This case can not be handled yet....");
958 /* Does the probe data contain the whole header? */
959 if (_MMFILE_MKV_READ_BUFFER_LENGTH < 4 + size + total)
962 for (n = 4 + size ; n <= 4 + size + total - sizeof(probe_data); n++) {
963 if (!memcmp(&buffer[n], probe_data, sizeof(probe_data))) {
964 debug_msg(RELEASE, "String matroska found!!!\n");
971 if (pFileIO == NULL && fp != NULL)
977 /***********************************************************************/
978 /* QT Header Check API */
979 /***********************************************************************/
981 int MMFileFormatIsValidQT(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
986 /***********************************************************************/
987 /* Flac Header Check API */
988 /***********************************************************************/
990 int MMFileFormatIsValidFLAC(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
992 #define _MMFILE_FLAC_HEADER_LENGTH 5 /*fLaC*/
994 MMFileIOHandle *fp = pFileIO;
995 unsigned char buffer[_MMFILE_FLAC_HEADER_LENGTH] = {0, };
1000 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
1001 if (ret == MMFILE_IO_FAILED) {
1002 debug_error(DEBUG, "error: mmfile_open\n");
1007 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
1009 readed = mmfile_read(fp, buffer, _MMFILE_FLAC_HEADER_LENGTH);
1011 if (_MMFILE_FLAC_HEADER_LENGTH != readed) {
1012 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
1017 if (1 == _MMFileIsFLACHeader(buffer)) {
1018 debug_msg(RELEASE, "Header Detected\n");
1024 if (pFileIO == NULL && fp != NULL)
1030 /***********************************************************************/
1031 /* FLV(flash video) Header Check API */
1032 /***********************************************************************/
1034 int MMFileFormatIsValidFLV(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
1036 #define _MMFILE_FLV_HEADER_LENGTH 4 /*FLV*/
1038 MMFileIOHandle *fp = pFileIO;
1039 unsigned char buffer[_MMFILE_FLV_HEADER_LENGTH] = {0, };
1044 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
1045 if (ret == MMFILE_IO_FAILED) {
1046 debug_error(DEBUG, "error: mmfile_open\n");
1051 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
1053 readed = mmfile_read(fp, buffer, _MMFILE_FLV_HEADER_LENGTH);
1055 if (_MMFILE_FLV_HEADER_LENGTH != readed) {
1056 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
1061 if (1 == _MMFileIsFLVHeader(buffer)) {
1062 debug_msg(RELEASE, "Header Detected\n");
1068 if (pFileIO == NULL && fp != NULL)
1075 /***********************************************************************/
1076 /* REAL Header Check API */
1077 /***********************************************************************/
1079 int MMFileFormatIsValidREAL(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
1081 #define _MMFILE_RMVB_HEADER_LENGTH 4 /*RMF*/
1083 MMFileIOHandle *fp = pFileIO;
1084 unsigned char buffer[_MMFILE_RMVB_HEADER_LENGTH] = {0, };
1089 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
1090 if (ret == MMFILE_IO_FAILED) {
1091 debug_error(DEBUG, "error: mmfile_open\n");
1096 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
1098 readed = mmfile_read(fp, buffer, _MMFILE_RMVB_HEADER_LENGTH);
1100 if (_MMFILE_RMVB_HEADER_LENGTH != readed) {
1101 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
1106 if (1 == _MMFileIsREALHeader(buffer)) {
1107 debug_msg(RELEASE, "Header Detected\n");
1114 if (pFileIO == NULL && fp != NULL)
1120 /***********************************************************************/
1121 /* MPEGTS Header Check API */
1122 /***********************************************************************/
1123 #define MPEGTS_NONE 0x00
1124 #define MPEGTS_FECE 0x10
1125 #define MPEGTS_DVHS 0x20
1126 #define MPEGTS_PACKET 0x40
1128 #define TS_PACKET_SIZE 188
1129 #define TS_DVHS_PACKET_SIZE 192
1130 #define TS_FEC_PACKET_SIZE 204
1131 #define TS_MAX_PACKET_SIZE 204
1134 int MMFileFormatIsValidMPEGTS(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
1136 MMFileIOHandle *fp = pFileIO;
1137 unsigned char buffer[TS_MAX_PACKET_SIZE] = {0, };
1142 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
1143 if (ret == MMFILE_IO_FAILED) {
1144 debug_error(DEBUG, "error: mmfile_open\n");
1149 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
1151 readed = mmfile_read(fp, buffer, TS_MAX_PACKET_SIZE);
1153 if (TS_MAX_PACKET_SIZE != readed) {
1154 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
1159 if (_MMFileIsMPEGTSHeader(fp) != MPEGTS_NONE) {
1160 debug_msg(RELEASE, "Header Detected\n");
1166 if (pFileIO == NULL && fp != NULL)
1172 /***********************************************************************/
1173 /* MPEG-PS Header Check API */
1174 /***********************************************************************/
1176 int MMFileFormatIsValidMPEGPS(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
1178 #define _MMFILE_MPEGPS_HEADER_LENGTH 4
1180 MMFileIOHandle *fp = pFileIO;
1181 unsigned char buffer[_MMFILE_MPEGPS_HEADER_LENGTH] = {0, };
1186 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
1187 if (ret == MMFILE_IO_FAILED) {
1188 debug_error(DEBUG, "error: mmfile_open\n");
1193 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
1195 readed = mmfile_read(fp, buffer, _MMFILE_MPEGPS_HEADER_LENGTH);
1197 if (_MMFILE_MPEGPS_HEADER_LENGTH != readed) {
1198 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
1203 if (1 == _MMFileIsMPEGPSHeader(buffer)) {
1204 debug_msg(RELEASE, "Header Detected\n");
1210 if (pFileIO == NULL && fp != NULL)
1216 /***********************************************************************/
1217 /* MPEG AUDIO Header Check API */
1218 /***********************************************************************/
1220 int MMFileFormatIsValidMPEGAUDIO(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
1222 #define _MMFILE_MPEGAUDIO_HEADER_LENGTH 4
1224 MMFileIOHandle *fp = pFileIO;
1225 unsigned char buffer[_MMFILE_MPEGAUDIO_HEADER_LENGTH] = {0, };
1230 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
1231 if (ret == MMFILE_IO_FAILED) {
1232 debug_error(DEBUG, "error: mmfile_open\n");
1237 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
1239 readed = mmfile_read(fp, buffer, _MMFILE_MPEGAUDIO_HEADER_LENGTH);
1241 if (_MMFILE_MPEGAUDIO_HEADER_LENGTH != readed) {
1242 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
1247 if (1 == _MMFileIsMPEGAUDIOHeader(buffer)) {
1248 debug_msg(RELEASE, "Header Detected\n");
1254 if (pFileIO == NULL && fp != NULL)
1260 /***********************************************************************/
1261 /* MPEG VIDEO Header Check API */
1262 /***********************************************************************/
1264 int MMFileFormatIsValidMPEGVIDEO(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
1266 #define _MMFILE_MPEGVIDEO_HEADER_LENGTH 4
1268 MMFileIOHandle *fp = pFileIO;
1269 unsigned char buffer[_MMFILE_MPEGVIDEO_HEADER_LENGTH] = {0, };
1274 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
1275 if (ret == MMFILE_IO_FAILED) {
1276 debug_error(DEBUG, "error: mmfile_open\n");
1281 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
1283 readed = mmfile_read(fp, buffer, _MMFILE_MPEGVIDEO_HEADER_LENGTH);
1285 if (_MMFILE_MPEGVIDEO_HEADER_LENGTH != readed) {
1286 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
1291 if (1 == _MMFileIsMPEGVIDEOHeader(buffer)) {
1292 debug_msg(RELEASE, "Header Detected\n");
1298 if (pFileIO == NULL && fp != NULL)
1304 /***********************************************************************/
1305 /* AIFF Header Check API */
1306 /***********************************************************************/
1308 int MMFileFormatIsValidAIFF(MMFileIOHandle *pFileIO, const char *mmfileuri, int dummy)
1310 #define _MMFILE_AIFF_HEADER_LENGTH 13
1312 MMFileIOHandle *fp = pFileIO;
1313 unsigned char buffer[_MMFILE_AIFF_HEADER_LENGTH] = {0, };
1318 ret = mmfile_open(&fp, mmfileuri, MMFILE_RDONLY);
1319 if (ret == MMFILE_IO_FAILED) {
1320 debug_error(DEBUG, "error: mmfile_open\n");
1325 mmfile_seek(fp, 0L, MMFILE_SEEK_SET);
1327 readed = mmfile_read(fp, buffer, _MMFILE_AIFF_HEADER_LENGTH);
1329 if (_MMFILE_AIFF_HEADER_LENGTH != readed) {
1330 debug_error(RELEASE, "read error. size = %d. Maybe end of file.\n", readed);
1335 if (1 == _MMFileIsAIFFHeader(buffer)) {
1336 debug_msg(RELEASE, "Header Detected\n");
1342 if (pFileIO == NULL && fp != NULL)
1349 /***********************************************************************/
1350 /* Implementation of Internal Functions */
1351 /***********************************************************************/
1352 static int _MMFileIsASFHeader(void *header)
1354 /* ID: 30 26 B2 75 8E 66 CF 11 A6 D9 00 AA 00 62 CE 6C */
1355 unsigned char *s = header;
1357 if ((*(s + 0) == 0x30) &&
1358 (*(s + 1) == 0x26) &&
1359 (*(s + 2) == 0xB2) &&
1360 (*(s + 3) == 0x75) &&
1361 (*(s + 4) == 0x8E) &&
1362 (*(s + 5) == 0x66) &&
1363 (*(s + 6) == 0xCF) &&
1364 (*(s + 7) == 0x11) &&
1365 (*(s + 8) == 0xA6) &&
1366 (*(s + 9) == 0xD9) &&
1367 (*(s + 10) == 0x00) &&
1368 (*(s + 11) == 0xAA) &&
1369 (*(s + 12) == 0x00) &&
1370 (*(s + 13) == 0x62) &&
1371 (*(s + 14) == 0xCE) &&
1372 (*(s + 15) == 0x6C)) {
1380 static int _MMFileIsAMRHeader(void *header)
1382 #define _MMFILE_AMR_SINGLE_CH_HEADER_SIZE 6
1383 #define _MMFILE_AMR_SINGLE_CH_HEADER "#!AMR\n"
1385 #define _MMFILE_AMR_WB_SINGLE_CH_HEADER_SIZE 9
1386 #define _MMFILE_AMR_WB_SINGLE_CH_HEADER "#!AMR-WB\n"
1388 #define _MMFILE_AMR_MULTI_CH_HEADER_SIZE 12
1389 #define _MMFILE_AMR_MULTI_CH_HEADER "#!AMR_MC1.0\n"
1391 #define _MMFILE_AMR_WB_MULTI_CH_HEADER_SIZE 15
1392 #define _MMFILE_AMR_WB_MULTI_CH_HEADER "#!AMR-WB_MC1.0\n"
1394 unsigned char *s = header;
1396 if (!memcmp(s, _MMFILE_AMR_SINGLE_CH_HEADER, _MMFILE_AMR_SINGLE_CH_HEADER_SIZE) ||
1397 !memcmp(s, _MMFILE_AMR_WB_SINGLE_CH_HEADER, _MMFILE_AMR_WB_SINGLE_CH_HEADER_SIZE) ||
1398 !memcmp(s, _MMFILE_AMR_MULTI_CH_HEADER, _MMFILE_AMR_MULTI_CH_HEADER_SIZE) ||
1399 !memcmp(s, _MMFILE_AMR_WB_MULTI_CH_HEADER, _MMFILE_AMR_WB_MULTI_CH_HEADER_SIZE)) {
1407 static int _MMFileIsIMYHeader(void *header)
1409 unsigned char *s = header;
1411 if (!memcmp(s, "BEGIN:IMELODY", 13)) {
1418 static int _MMFileIsMIDHeader(void *header)
1420 unsigned char *s = header;
1422 if (!memcmp(s, "MThd", 4)) { /*general MIDI*/
1424 } else if (!memcmp(s, "XMF_", 4)) { /*XMF*/
1426 } else if (!memcmp(s, "IREZ", 4)) {
1427 return 1; /*RMF format*/
1433 static int _MMFileIsMMFHeader(void *header)
1435 #define _MMFILE_MMF_TYPE_POSITION ((char)0x11)
1436 unsigned char *s = header;
1438 if (!memcmp(s, "MMMD", 4)) {
1439 /* warning: comparison is always true due to limited range of data type */
1440 if (*(s + _MMFILE_MMF_TYPE_POSITION) <= 0x2F) {
1442 } else if (((*(s + _MMFILE_MMF_TYPE_POSITION) >= 0x30) && (*(s + _MMFILE_MMF_TYPE_POSITION) <= 0x38)) /* MA3, MA5 type */
1443 || ((*(s + _MMFILE_MMF_TYPE_POSITION) >= 0x40) && (*(s + _MMFILE_MMF_TYPE_POSITION) <= 0x48))
1444 || ((*(s + _MMFILE_MMF_TYPE_POSITION) >= 0x50) && (*(s + _MMFILE_MMF_TYPE_POSITION) <= 0x58))
1445 || ((*(s + _MMFILE_MMF_TYPE_POSITION) == 0xF0))) {
1455 static int _MMFileIsAVIHeader(void *header)
1457 unsigned char *s = header;
1459 if (!memcmp(s, "RIFF", 4) && !memcmp(s + 8, "AVI", 3)) {
1467 static int _MMFileIsWAVHeader(void *header)
1469 unsigned char *s = header;
1471 if (!memcmp(s, "RIFF", 4) && !memcmp(s + 8, "WAVE", 4)) {
1480 static int _MMFileIsMP4Header(void *header)
1482 unsigned char *s = header;
1484 if (!memcmp(s, "moov", 4) ||
1485 !memcmp(s, "mdat", 4) ||
1486 !memcmp(s, "ftyp", 4) ||
1487 !memcmp(s, "free", 4) ||
1488 !memcmp(s, "uuid", 4) ||
1489 !memcmp(s, "skip", 4) ||
1491 !memcmp(s, "PICT", 4) ||
1492 !memcmp(s, "wide", 4) ||
1493 !memcmp(s, "prfl", 4)) {
1500 static int _MMFileIsOGGHeader(void *header)
1502 unsigned char *s = header;
1504 if (!memcmp(s, "OggS", 4)) {
1511 static int _MMFileIsREALHeader(void *header)
1513 unsigned char *s = header;
1515 if (!memcmp(s, ".RMF", 4)) {
1522 static int _MMFileIsMPEGTSHeader(MMFileIOHandle *fp)
1524 unsigned char header[TS_MAX_PACKET_SIZE] = {0, };
1525 unsigned char *s = NULL;
1527 mmfile_seek(fp, 0, MMFILE_SEEK_SET);
1528 mmfile_read(fp, header, sizeof(header));
1530 s = (unsigned char *)memchr(header, 0x47, sizeof(header));
1533 unsigned char buffer[TS_PACKET_SIZE] = {0, };
1534 unsigned int startoffset = s - header + 1;
1536 mmfile_seek(fp, startoffset, MMFILE_SEEK_SET);
1537 mmfile_read(fp, buffer, sizeof(buffer));
1539 if (buffer[sizeof(buffer) - 1] & 0x47) {
1540 return MPEGTS_PACKET;
1542 unsigned char dvhs_buf[TS_DVHS_PACKET_SIZE] = {0, };
1544 mmfile_seek(fp, startoffset, MMFILE_SEEK_SET);
1545 mmfile_read(fp, dvhs_buf, sizeof(dvhs_buf));
1547 if (dvhs_buf[sizeof(dvhs_buf) - 1] & 0x47) {
1550 unsigned char fec_buf[TS_FEC_PACKET_SIZE] = {0, };
1552 mmfile_seek(fp, startoffset, MMFILE_SEEK_SET);
1553 mmfile_read(fp, fec_buf, sizeof(fec_buf));
1555 if (fec_buf[sizeof(fec_buf) - 1] & 0x47) {
1565 static int _MMFileIsMPEGPSHeader(void *header)
1567 unsigned char *s = header;
1569 if ((*(s + 0) == 0x00) &&
1570 (*(s + 1) == 0x00) &&
1571 (*(s + 2) == 0x01) &&
1572 (*(s + 3) == 0xba)) { /* mpeg-ps header */
1579 static int _MMFileIsMPEGAUDIOHeader(void *header)
1581 unsigned char *s = header;
1583 if ((*(s + 0) == 0xFF) &&
1584 ((*(s + 1) == 0xFE) || (*(s + 1) == 0xFF))) { /* mpeg audio layer 1 header ,FE: protected by CRC ,FF: not protected */
1591 static int _MMFileIsMPEGVIDEOHeader(void *header)
1593 unsigned char *s = header;
1595 if ((*(s + 0) == 0x00) &&
1596 (*(s + 1) == 0x00) &&
1597 (*(s + 2) == 0x01) &&
1598 (*(s + 3) == 0xb3)) { /* mpeg1 video header */
1605 static int _MMFileIsMP3Header(void *header)
1607 unsigned long head = 0;
1608 unsigned char *headc = header;
1609 unsigned int bitrate, layer, length/*, mode*/;
1610 unsigned int coef, samplerate, version/*, channels*/;
1611 static const unsigned int mp3types_bitrates[2][3][16] = {
1612 { {0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 320, 352, 384, 416, 448,},
1613 {0, 32, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320, 384,},
1614 {0, 32, 40, 48, 56, 64, 80, 96, 112, 128, 160, 192, 224, 256, 320,}
1616 { {0, 32, 48, 56, 64, 80, 96, 112, 128, 144, 160, 176, 192, 224, 256,},
1617 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,},
1618 {0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96, 112, 128, 144, 160,}
1622 static const unsigned int mp3types_freqs[3][3] = {
1623 {11025, 12000, 8000},
1624 {22050, 24000, 16000},
1625 {44100, 48000, 32000}
1628 static const unsigned int mp3FrameCoef[4][4] = {
1636 head = (*(headc + 0) << 24 | *(headc + 1) << 16 | *(headc + 2) << 8 | *(headc + 3));
1638 if ((head & 0xffe00000) != 0xffe00000) {
1642 /* we don't need extension, copyright, original or
1643 * emphasis for the frame length */
1647 /*mode = head & 0x3;*/
1651 length = head & 0x1;
1654 /* sampling frequency */
1655 samplerate = head & 0x3;
1656 if (samplerate == 3) {
1662 bitrate = head & 0xF;
1664 if (bitrate == 15) {
1668 /* ignore error correction, too */
1672 layer = 4 - (head & 0x3);
1678 /* version 0=MPEG2.5; 2=MPEG2; 3=MPEG1 */
1679 version = head & 0x3;
1685 /*channels = (mode == 3) ? 1 : 2;*/
1686 samplerate = mp3types_freqs[version > 0 ? version - 1 : 0][samplerate];
1689 bitrate = mp3types_bitrates[version == 3 ? 0 : 1][layer - 1][bitrate];
1690 coef = mp3FrameCoef[version][layer];
1692 length = length * 4;
1694 length = length + ((coef * bitrate * 1000) / samplerate);
1700 static int _MMFileSearchID3Tag(MMFileIOHandle *fp, unsigned int *offset)
1702 #define _MMFILE_MP3_TAGV2_HEADER_LEN 10
1703 #define _MMFILE_GET_INT_NUMBER(buff) (int)((((int)(buff)[0]) << 24) | (((int)(buff)[1]) << 16) | (((int)(buff)[2]) << 8) | (((int)(buff)[3])))
1705 unsigned char tagHeader[_MMFILE_MP3_TAGV2_HEADER_LEN] = {0, };
1706 unsigned int tagInfoSize = 0;
1707 unsigned int acc_tagsize = 0;
1716 mmfile_seek(fp, 0, MMFILE_SEEK_SET);
1720 readed = mmfile_read(fp, tagHeader, _MMFILE_MP3_TAGV2_HEADER_LEN);
1721 if (readed != _MMFILE_MP3_TAGV2_HEADER_LEN) {
1722 debug_error(RELEASE, "read error occured.\n");
1726 if (memcmp(tagHeader, "ID3", 3) == 0) {
1727 debug_msg(RELEASE, "'ID3' found.\n");
1729 debug_msg(RELEASE, "'ID3' not found.\n");
1733 /**@note weak id3v2 tag checking*/
1734 if (tagHeader[3] != 0xFF && tagHeader[4] != 0xFF &&
1735 (tagHeader[6] & 0x80) == 0 && (tagHeader[7] & 0x80) == 0 &&
1736 (tagHeader[8] & 0x80) == 0 && (tagHeader[9] & 0x80) == 0) {
1737 debug_msg(RELEASE, "good ID3V2 tag.\n");
1739 debug_warning(DEBUG, "It's bad ID3V2 tag.\n");
1743 tagVersion = tagHeader[3];
1745 if (tagVersion > 4) {
1746 debug_msg(RELEASE, "Tag version not supported\n");
1750 encSize = _MMFILE_GET_INT_NUMBER(&tagHeader[6]);
1751 tagInfoSize = _MMFILE_MP3_TAGV2_HEADER_LEN;
1752 tagInfoSize += (((encSize & 0x0000007F) >> 0) | ((encSize & 0x00007F00) >> 1) | ((encSize & 0x007F0000) >> 2) | ((encSize & 0x7F000000) >> 3));
1754 /**@note unfortunately, some contents has many id3 tag.*/
1755 acc_tagsize += tagInfoSize;
1756 debug_msg(RELEASE, "tag size: %u, offset: %u\n", tagInfoSize, acc_tagsize);
1758 mmfile_seek(fp, acc_tagsize, MMFILE_SEEK_SET);
1759 *offset = acc_tagsize;
1763 goto _START_TAG_SEARCH;
1769 static int _MMFileIsFLACHeader(void *header)
1771 unsigned char *s = header;
1773 if (!memcmp(s, "fLaC", 4)) {
1780 static int _MMFileIsFLVHeader(void *header)
1782 unsigned char *s = header;
1784 if (!memcmp(s, "FLV", 3)) {
1791 static int _MMFileIsAIFFHeader(void *header)
1793 unsigned char *s = header;
1795 if (!memcmp(s, "FORM", 4) && !memcmp(s + 8, "AIFF", 4)) {