1 /*
2 * "Real" compatible demuxer.
3 * Copyright (c) 2000, 2001 Fabrice Bellard
4 *
5 * This file is part of FFmpeg.
6 *
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
11 *
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
16 *
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 */
21
22 #include <inttypes.h>
23
35
36 #define DEINT_ID_GENR MKTAG('g', 'e', 'n', 'r') ///< interleaving for Cooker/ATRAC
37 #define DEINT_ID_INT0 MKTAG('I', 'n', 't', '0')
///< no interleaving needed
38 #define DEINT_ID_INT4 MKTAG('I', 'n', 't', '4')
///< interleaving for 28.8
39 #define DEINT_ID_SIPR MKTAG('s', 'i', 'p', 'r')
///< interleaving for Sipro
40 #define DEINT_ID_VBRF MKTAG('v', 'b', 'r', 'f')
///< VBR case for AAC
41 #define DEINT_ID_VBRS MKTAG('v', 'b', 'r', 's')
///< VBR case for AAC
42
44 AVPacket pkt;
///< place to store merged video frame / reordered audio data
46 int videobufpos;
///< position for the next slice in the video buffer
49 int64_t
pktpos;
///< first slice position in file
50 /// Audio descrambling matrix parameters
57 };
58
67
69
71 {
72 int i;
74
78 if (i < buf_size - 1)
80 }
81 if (buf_size > 0) *q = '0円';
82 }
83
85 {
87 }
88
90 {
91 if (size >= 1<<24) {
93 return -1;
94 }
97 return 0;
98 }
99
101 {
103 int i;
104
107 get_strl(pb, buf,
sizeof(buf), len);
109 }
110 }
111
113 {
115 if (!rms)
118 return rms;
119 }
120
122 {
124 }
125
128 {
132
133 /* ra type header */
135 if (version == 3) {
136 unsigned bytes_per_minute;
143 if ((startpos + header_size) >=
avio_tell(pb) + 2) {
144 // fourcc (should always be "lpcJ")
147 }
148 // Skip extra header crap (this should never happen)
149 if ((startpos + header_size) >
avio_tell(pb))
151 if (bytes_per_minute)
159 } else {
160 int flavor, sub_packet_h, coded_framesize, sub_packet_size;
161 int codecdata_length;
162 unsigned bytes_per_minute;
163 /* old version (4) */
169 flavor=
avio_rb16(pb);
/* add codec info / flavor */
173 if (version == 4) {
174 if (bytes_per_minute)
176 }
182 if (version == 5) {
184 }
188 if (version == 5) {
191 buf[4] = 0;
192 } else {
194 get_str8(pb, buf,
sizeof(buf));
/* desc */
196 get_str8(pb, buf,
sizeof(buf));
/* desc */
197 }
202
206 break;
211 break;
216 if (read_all) {
217 codecdata_length = 0;
218 } else {
220 if (version == 5)
225 return -1;
226 }
227 }
228
231 if (flavor > 3) {
233 flavor);
234 return -1;
235 }
237 } else {
238 if(sub_packet_size <= 0){
240 return -1;
241 }
243 }
246
247 break;
250 if (version == 5)
255 return -1;
256 }
257 if (codecdata_length >= 1) {
261 }
262 break;
263 }
267 sub_packet_h <= 1 ||
273 }
274 break;
281 break;
286 break;
287 default:
290 }
300 }
301
302 if (read_all) {
307 }
308 }
309 return 0;
310 }
311
314 unsigned int codec_data_size,
const uint8_t *mime)
315 {
318 int64_t codec_pos;
320
321 if (codec_data_size > INT_MAX)
323
327
328 if (v ==
MKBETAG(
'M',
'L',
'T',
'I')) {
330 int number_of_mdpr;
331 int i;
332 for (i = 0; i<number_of_streams; i++)
335 if (number_of_mdpr != 1) {
337 }
340 }
341
342 if (v ==
MKTAG(0xfd,
'a',
'r',
'.')) {
343 /* ra type header */
345 return -1;
346 }
else if (v ==
MKBETAG(
'L',
'S',
'D',
':')) {
350
355 } else if(mime && !strcmp(mime, "logical-fileinfo")){
356 int stream_count, rule_count, property_count, i;
360 goto skip;
361 }
367 for(i=0; i<property_count; i++){
372 goto skip; //FIXME skip just this one
373 }
378 break;
380 }
381 }
382 } else {
383 int fps;
385 fail1:
387 goto skip;
388 }
394 goto fail1;
397 avio_skip(pb, 2);
// looks like bits per sample
402
405
406 if (fps > 0) {
408 0x10000, fps, (1 << 30) - 1);
409 #if FF_API_R_FRAME_RATE
411 #endif
415 }
416 }
417
418 skip:
419 /* skip codec info */
421 if (codec_data_size >= size) {
423 } else {
425 }
426
427 return 0;
428 }
429
430 /** this function assumes that the demuxer has already seeked to the start
431 * of the INDX chunk, and will bail out if not. */
433 {
435 unsigned int size, n_pkts, str_id, next_off,
n, pos,
pts;
437
438 do {
440 return -1;
442 if (size < 20)
443 return -1;
451 break;
452 }
455 "Invalid stream index %d for index at pos %"PRId64"\n",
457 goto skip;
460 "Nr. of packets in packet index for stream index %d "
461 "exceeds filesize (%"PRId64" at %"PRId64" = %"PRId64")\n",
464 goto skip;
465 }
466
467 for (n = 0; n < n_pkts; n++) {
472
474 }
475
476 skip:
477 if (next_off &&
avio_tell(pb) < next_off &&
480 "Non-linear index detected, not supported\n");
481 return -1;
482 }
483 } while (next_off);
484
485 return 0;
486 }
487
489 {
492
495 if (!st)
496 return -1;
501 }
502
504 {
509 int tag_size;
511 unsigned int data_off = 0, indx_off = 0;
512 char buf[128], mime[128];
515
517 if (tag ==
MKTAG(
'.',
'r',
'a', 0xfd)) {
518 /* very old .ra format */
520 }
else if (tag !=
MKTAG(
'.',
'R',
'M',
'F')) {
522 }
523
526
527 for(;;) {
529 goto fail;
533 av_dlog(s,
"tag=%c%c%c%c (%08x) size=%d\n",
534 (tag ) & 0xff,
535 (tag >> 8) & 0xff,
536 (tag >> 16) & 0xff,
537 (tag >> 24) & 0xff,
538 tag,
539 tag_size);
540 if (tag_size < 10 && tag !=
MKTAG(
'D',
'A',
'T',
'A'))
541 goto fail;
542 switch(tag) {
543 case MKTAG(
'P',
'R',
'O',
'P'):
544 /* file header */
553 indx_off =
avio_rb32(pb);
/* index offset */
554 data_off =
avio_rb32(pb);
/* data offset */
557 break;
558 case MKTAG(
'C',
'O',
'N',
'T'):
560 break;
561 case MKTAG(
'M',
'D',
'P',
'R'):
563 if (!st) {
565 goto fail;
566 }
572 start_time =
avio_rb32(pb);
/* start time */
577 if(duration>0)
579 get_str8(pb, buf,
sizeof(buf));
/* desc */
580 get_str8(pb, mime,
sizeof(mime));
/* mimetype */
587 goto fail;
588 break;
589 case MKTAG(
'D',
'A',
'T',
'A'):
590 goto header_end;
591 default:
592 /* unknown tag: skip it */
594 break;
595 }
596 }
597 header_end:
602
603 if (!data_off)
606 avio_seek(pb, indx_off, SEEK_SET) >= 0) {
609 }
610
611 return 0;
612
613 fail:
616 }
617
619 {
621
623 (*len)-=2;
624 n &= 0x7FFF;
625 if (n >= 0x4000) {
626 return n - 0x4000;
627 } else {
629 (*len)-=2;
630 return (n << 16) | n1;
631 }
632 }
633
634 /* multiple of 20 bytes for ra144 (ugly) */
635 #define RAW_PACKET_SIZE 1000
636
641 uint32_t
state=0xFFFFFFFF;
642
650 *flags= 0;
651 }else{
652 state= (state<<8) +
avio_r8(pb);
653
654 if(state ==
MKBETAG(
'I',
'N',
'D',
'X')){
655 int n_pkts, expected_len;
659 expected_len = 20 + n_pkts * 14;
660 if (len == 20)
661 /* some files don't add index entries to chunk size... */
662 len = expected_len;
663 else if (len != expected_len)
665 "Index size %d (%d pkts) is wrong, should be %d.\n",
666 len, n_pkts, expected_len);
667 len -= 14; // we already read part of the index header
668 if(len<0)
669 continue;
670 goto skip;
671 }
else if (state ==
MKBETAG(
'D',
'A',
'T',
'A')) {
673 "DATA tag in middle of chunk, file may be broken.\n");
674 }
675
676 if(state > (unsigned)0xFFFF || state <= 12)
677 continue;
678 len=state - 12;
679 state= 0xFFFFFFFF;
680
684 *flags =
avio_r8(pb);
/* flags */
685 }
689 break;
690 }
692 skip:
693 /* skip packet if unknown number */
696 continue;
697 }
698 *stream_index= i;
699
701 }
702 return -1;
703 }
704
708 int64_t *timestamp)
709 {
710 int hdr;
711 int seq = 0, pic_num = 0, len2 = 0, pos = 0; //init to silence compiler warning
714
716 type = hdr >> 6;
717
718 if(type != 3){ // not frame as a part of packet
720 }
721 if(type != 1){ // not whole frame
725 }
726 if(len<0) {
728 return -1;
729 }
731 if(type&1){ // frame, not slice
732 if(type == 3){ // frame as a part of packet
733 len= len2;
734 *timestamp = pos;
735 }
738 return -1;
739 }
749 return ret < 0 ? ret :
AVERROR(EIO);
750 }
751 return 0;
752 }
753 //now we have to deal with single slice
754
755 *pseq = seq;
756 if((seq & 0x7F) == 1 || vst->
curpic_num != pic_num){
760 }
761 vst->
slices = ((hdr & 0x3F) << 1) + 1;
771 }
772 if(type == 2)
773 len =
FFMIN(len, pos);
774
777 return 1;
778 }
785 return 1;
786 }
791
798 #if FF_API_DESTRUCT_PACKET
802 #endif
803 if(vst->
slices != vst->
cur_slice)
//FIXME find out how to set slices correct from the begin
810 return 0;
811 }
812
813 return 1;
814 }
815
816 static inline void
818 {
820 int j;
821
824 for (j=0;j<pkt->
size;j+=2) {
825 FFSWAP(
int, ptr[0], ptr[1]);
826 ptr += 2;
827 }
828 }
829 }
830
833 if (ret != n) {
834 if (ret >= 0) memset(dst + ret, 0, n - ret);
835 else memset(dst , 0, n);
837 }
839 }
840
841 int
844 int *seq,
int flags, int64_t timestamp)
845 {
848
852 if(ret)
853 return ret < 0 ? ret : -1; //got partial frame or error
858 int x;
864
865 if (flags & 2)
867 if (!y)
869
872 for (x = 0; x < h/2; x++)
874 break;
876 for (x = 0; x < w/sps; x++)
878 break;
881 break;
882 }
883
885 return -1;
888
894 int x;
902 } else
903 return -1;
904 } else {
906 return ret;
908 }
909 } else {
912 }
913
915
916 #if 0
919 int seq= 128*(pkt->
data[2]&0x7F) + (pkt->
data[3]>>1);
921
922 seq |= (timestamp&~0x3FFF);
923 if(seq - timestamp > 0x2000) seq -= 0x4000;
924 if(seq - timestamp < -0x2000) seq += 0x4000;
925 }
926 }
927 #endif
928
929 pkt->
pts = timestamp;
930 if (flags & 2)
932
934 }
935
936 int
939 {
941
943
947 if (ret < 0)
949 } else {
951 if (ret < 0)
956 }
961 } else
964
966 }
967
969 {
971 AVStream *st =
NULL;
// init to silence compiler warning
972 int i,
len, res, seq = 1;
973 int64_t timestamp, pos;
975
976 for (;;) {
978 // If there are queued audio packet return them first
981 if(res < 0)
982 return res;
983 flags = 0;
984 } else {
987
993 flags = (seq++ == 1) ? 2 : 0;
995 } else {
996 len =
rm_sync(s, ×tamp, &flags, &i, &pos);
997 if (len > 0)
999 }
1000
1003
1005 &seq, flags, timestamp);
1006 if (res < -1)
1007 return res;
1008 if((flags&2) && (seq&0x7F) == 1)
1010 if (res)
1011 continue;
1012 }
1013
1017 } else
1018 break;
1019 }
1020
1021 return 0;
1022 }
1023
1025 {
1026 int i;
1027
1030
1031 return 0;
1032 }
1033
1035 {
1036 /* check file header */
1037 if ((p->
buf[0] ==
'.' && p->
buf[1] ==
'R' &&
1038 p->
buf[2] ==
'M' && p->
buf[3] ==
'F' &&
1039 p->
buf[4] == 0 && p->
buf[5] == 0) ||
1040 (p->
buf[0] ==
'.' && p->
buf[1] ==
'r' &&
1041 p->
buf[2] ==
'a' && p->
buf[3] == 0xfd))
1043 else
1044 return 0;
1045 }
1046
1048 int64_t *ppos, int64_t pos_limit)
1049 {
1051 int64_t pos, dts;
1053
1054 pos = *ppos;
1055
1058
1061
1063 for(;;){
1064 int seq=1;
1066
1067 len =
rm_sync(s, &dts, &flags, &stream_index2, &pos);
1068 if(len<0)
1070
1071 st = s->
streams[stream_index2];
1074 if(!(h & 0x40)){
1076 }
1077 }
1078
1079 if((flags&2) && (seq&0x7F) == 1){
1080 av_dlog(s,
"%d %d-%d %"PRId64
" %d\n",
1081 flags, stream_index2, stream_index, dts, seq);
1083 if(stream_index2 == stream_index)
1084 break;
1085 }
1086
1088 }
1089 *ppos = pos;
1090 return dts;
1091 }
1092
1095 {
1097
1099 return -1;
1101 return 0;
1102 }
1103
1104
1115 };
1116
1123 };