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
33
34 #define DEINT_ID_GENR MKTAG('g', 'e', 'n', 'r') ///< interleaving for Cooker/ATRAC
35 #define DEINT_ID_INT0 MKTAG('I', 'n', 't', '0')
///< no interleaving needed
36 #define DEINT_ID_INT4 MKTAG('I', 'n', 't', '4')
///< interleaving for 28.8
37 #define DEINT_ID_SIPR MKTAG('s', 'i', 'p', 'r')
///< interleaving for Sipro
38 #define DEINT_ID_VBRF MKTAG('v', 'b', 'r', 'f')
///< VBR case for AAC
39 #define DEINT_ID_VBRS MKTAG('v', 'b', 'r', 's')
///< VBR case for AAC
40
42 AVPacket pkt;
///< place to store merged video frame / reordered audio data
44 int videobufpos;
///< position for the next slice in the video buffer
47 int64_t
pktpos;
///< first slice position in file
48 /// Audio descrambling matrix parameters
55 };
56
65
67 {
68 int i;
70
74 if (i < buf_size - 1)
76 }
77 if (buf_size > 0) *q = '0円';
78 }
79
81 {
83 }
84
86 {
87 if (size >= 1<<24)
88 return -1;
94 return 0;
95 }
96
98 {
100 int i;
101
104 get_strl(pb, buf,
sizeof(buf), len);
106 }
107 }
108
110 {
113 return rms;
114 }
115
117 {
119 }
120
123 {
127
128 /* ra type header */
130 if (version == 3) {
131 unsigned bytes_per_minute;
138 if ((startpos + header_size) >=
avio_tell(pb) + 2) {
139 // fourcc (should always be "lpcJ")
142 }
143 // Skip extra header crap (this should never happen)
144 if ((startpos + header_size) >
avio_tell(pb))
146 if (bytes_per_minute)
154 } else {
155 int flavor, sub_packet_h, coded_framesize, sub_packet_size;
156 int codecdata_length;
157 unsigned bytes_per_minute;
158 /* old version (4) */
164 flavor=
avio_rb16(pb);
/* add codec info / flavor */
168 if (version == 4) {
169 if (bytes_per_minute)
171 }
177 if (version == 5) {
179 }
183 if (version == 5) {
186 buf[4] = 0;
187 } else {
188 get_str8(pb, buf,
sizeof(buf));
/* desc */
190 get_str8(pb, buf,
sizeof(buf));
/* desc */
191 }
196
200 break;
205 break;
210 if (read_all) {
211 codecdata_length = 0;
212 } else {
214 if (version == 5)
219 return -1;
220 }
221 }
222
225 if (flavor > 3) {
227 flavor);
228 return -1;
229 }
231 } else {
232 if(sub_packet_size <= 0){
234 return -1;
235 }
237 }
240
241 break;
244 if (version == 5)
249 return -1;
250 }
251 if (codecdata_length >= 1) {
255 }
256 break;
257 default:
259 }
263 sub_packet_h <= 1 ||
266 break;
271 break;
276 break;
277 default:
280 }
290 }
291
292 if (read_all) {
297 }
298 }
299 return 0;
300 }
301
302 int
305 {
308 int64_t codec_pos;
310
314 if (v ==
MKTAG(0xfd,
'a',
'r',
'.')) {
315 /* ra type header */
317 return -1;
318 }
else if (v ==
MKBETAG(
'L',
'S',
'D',
':')) {
322
327 } else if(mime && !strcmp(mime, "logical-fileinfo")){
328 int stream_count, rule_count, property_count, i;
332 goto skip;
333 }
339 for(i=0; i<property_count; i++){
344 goto skip; //FIXME skip just this one
345 }
350 break;
352 }
353 }
354 } else {
355 int fps;
357 fail1:
359 goto skip;
360 }
366 goto fail1;
369 avio_skip(pb, 2);
// looks like bits per sample
374
377
378 if (fps > 0) {
380 0x10000, fps, (1 << 30) - 1);
381 #if FF_API_R_FRAME_RATE
383 #endif
387 }
388 }
389
390 skip:
391 /* skip codec info */
394
395 return 0;
396 }
397
398 /** this function assumes that the demuxer has already seeked to the start
399 * of the INDX chunk, and will bail out if not. */
401 {
403 unsigned int size, n_pkts, str_id, next_off,
n, pos, pts;
405
406 do {
408 return -1;
410 if (size < 20)
411 return -1;
419 break;
420 }
423 "Invalid stream index %d for index at pos %"PRId64"\n",
425 goto skip;
428 "Nr. of packets in packet index for stream index %d "
429 "exceeds filesize (%"PRId64" at %"PRId64" = %"PRId64")\n",
432 goto skip;
433 }
434
435 for (n = 0; n < n_pkts; n++) {
440
442 }
443
444 skip:
445 if (next_off &&
avio_tell(pb) < next_off &&
448 "Non-linear index detected, not supported\n");
449 return -1;
450 }
451 } while (next_off);
452
453 return 0;
454 }
455
457 {
460
463 if (!st)
464 return -1;
467 }
468
470 {
475 int tag_size;
477 unsigned int data_off = 0, indx_off = 0;
478 char buf[128], mime[128];
480
482 if (tag ==
MKTAG(
'.',
'r',
'a', 0xfd)) {
483 /* very old .ra format */
485 }
else if (tag !=
MKTAG(
'.',
'R',
'M',
'F')) {
487 }
488
491
492 for(;;) {
494 return -1;
498 av_dlog(s,
"tag=%c%c%c%c (%08x) size=%d\n",
499 (tag ) & 0xff,
500 (tag >> 8) & 0xff,
501 (tag >> 16) & 0xff,
502 (tag >> 24) & 0xff,
503 tag,
504 tag_size);
505 if (tag_size < 10 && tag !=
MKTAG(
'D',
'A',
'T',
'A'))
506 return -1;
507 switch(tag) {
508 case MKTAG(
'P',
'R',
'O',
'P'):
509 /* file header */
518 indx_off =
avio_rb32(pb);
/* index offset */
519 data_off =
avio_rb32(pb);
/* data offset */
522 break;
523 case MKTAG(
'C',
'O',
'N',
'T'):
525 break;
526 case MKTAG(
'M',
'D',
'P',
'R'):
528 if (!st)
535 start_time =
avio_rb32(pb);
/* start time */
540 if(duration>0)
542 get_str8(pb, buf,
sizeof(buf));
/* desc */
543 get_str8(pb, mime,
sizeof(mime));
/* mimetype */
548 return -1;
549 break;
550 case MKTAG(
'D',
'A',
'T',
'A'):
551 goto header_end;
552 default:
553 /* unknown tag: skip it */
555 break;
556 }
557 }
558 header_end:
563
564 if (!data_off)
567 avio_seek(pb, indx_off, SEEK_SET) >= 0) {
570 }
571
572 return 0;
573 }
574
576 {
578
580 (*len)-=2;
581 n &= 0x7FFF;
582 if (n >= 0x4000) {
583 return n - 0x4000;
584 } else {
586 (*len)-=2;
587 return (n << 16) | n1;
588 }
589 }
590
591 /* multiple of 20 bytes for ra144 (ugly) */
592 #define RAW_PACKET_SIZE 1000
593
598 uint32_t
state=0xFFFFFFFF;
599
607 *flags= 0;
608 }else{
609 state= (state<<8) +
avio_r8(pb);
610
611 if(state ==
MKBETAG(
'I',
'N',
'D',
'X')){
612 int n_pkts, expected_len;
616 expected_len = 20 + n_pkts * 14;
617 if (len == 20)
618 /* some files don't add index entries to chunk size... */
619 len = expected_len;
620 else if (len != expected_len)
622 "Index size %d (%d pkts) is wrong, should be %d.\n",
623 len, n_pkts, expected_len);
624 len -= 14; // we already read part of the index header
625 if(len<0)
626 continue;
627 goto skip;
628 }
else if (state ==
MKBETAG(
'D',
'A',
'T',
'A')) {
630 "DATA tag in middle of chunk, file may be broken.\n");
631 }
632
633 if(state > (unsigned)0xFFFF || state <= 12)
634 continue;
635 len=state - 12;
636 state= 0xFFFFFFFF;
637
641 *flags =
avio_r8(pb);
/* flags */
642 }
646 break;
647 }
649 skip:
650 /* skip packet if unknown number */
653 continue;
654 }
655 *stream_index= i;
656
658 }
659 return -1;
660 }
661
665 int64_t *timestamp)
666 {
667 int hdr;
668 int seq = 0, pic_num = 0, len2 = 0, pos = 0; //init to silcense compiler warning
671
673 type = hdr >> 6;
674
675 if(type != 3){ // not frame as a part of packet
677 }
678 if(type != 1){ // not whole frame
682 }
683 if(len<0) {
685 return -1;
686 }
688 if(type&1){ // frame, not slice
689 if(type == 3){ // frame as a part of packet
690 len= len2;
691 *timestamp = pos;
692 }
695 return -1;
696 }
706 return ret < 0 ? ret :
AVERROR(EIO);
707 }
708 return 0;
709 }
710 //now we have to deal with single slice
711
712 *pseq = seq;
713 if((seq & 0x7F) == 1 || vst->
curpic_num != pic_num){
717 }
718 vst->
slices = ((hdr & 0x3F) << 1) + 1;
728 }
729 if(type == 2)
730 len =
FFMIN(len, pos);
731
734 return 1;
735 }
742 return 1;
743 }
748
755 #if FF_API_DESTRUCT_PACKET
757 vst->
pkt.destruct = NULL;
759 #endif
760 if(vst->
slices != vst->
cur_slice)
//FIXME find out how to set slices correct from the begin
767 return 0;
768 }
769
770 return 1;
771 }
772
773 static inline void
775 {
777 int j;
778
781 for (j=0;j<pkt->
size;j+=2) {
782 FFSWAP(
int, ptr[0], ptr[1]);
783 ptr += 2;
784 }
785 }
786 }
787
790 if (ret != n) {
791 if (ret >= 0) memset(dst + ret, 0, n - ret);
792 else memset(dst , 0, n);
794 }
796 }
797
798 int
801 int *seq,
int flags, int64_t timestamp)
802 {
805
809 if(ret)
810 return ret < 0 ? ret : -1; //got partial frame or error
815 int x;
821
822 if (flags & 2)
824 if (!y)
826
829 for (x = 0; x < h/2; x++)
831 break;
833 for (x = 0; x < w/sps; x++)
835 break;
838 break;
839 }
840
842 return -1;
845
851 int x;
859 } else
860 return -1;
861 } else {
864 }
865 } else
867
869
870 #if 0
873 int seq= 128*(pkt->
data[2]&0x7F) + (pkt->
data[3]>>1);
875
876 seq |= (timestamp&~0x3FFF);
877 if(seq - timestamp > 0x2000) seq -= 0x4000;
878 if(seq - timestamp < -0x2000) seq += 0x4000;
879 }
880 }
881 #endif
882
883 pkt->
pts = timestamp;
884 if (flags & 2)
886
888 }
889
890 int
893 {
895
897
901 else {
907 }
912 } else
915
917 }
918
920 {
922 AVStream *st = NULL;
// init to silence compiler warning
924 int64_t timestamp, pos;
926
927 for (;;) {
929 // If there are queued audio packet return them first
932 if(res < 0)
934 flags = 0;
935 } else {
938
944 flags = (seq++ == 1) ? 2 : 0;
946 } else {
947 len=
sync(s, ×tamp, &flags, &i, &pos);
948 if (len > 0)
950 }
951
954
956 &seq, flags, timestamp);
957 if (res < -1)
959 if((flags&2) && (seq&0x7F) == 1)
961 if (res)
962 continue;
963 }
964
968 } else
969 break;
970 }
971
972 return 0;
973 }
974
976 {
977 int i;
978
981
982 return 0;
983 }
984
986 {
987 /* check file header */
988 if ((p->
buf[0] ==
'.' && p->
buf[1] ==
'R' &&
989 p->
buf[2] ==
'M' && p->
buf[3] ==
'F' &&
990 p->
buf[4] == 0 && p->
buf[5] == 0) ||
991 (p->
buf[0] ==
'.' && p->
buf[1] ==
'r' &&
992 p->
buf[2] ==
'a' && p->
buf[3] == 0xfd))
994 else
995 return 0;
996 }
997
999 int64_t *ppos, int64_t pos_limit)
1000 {
1002 int64_t pos, dts;
1004
1005 pos = *ppos;
1006
1009
1012
1014 for(;;){
1015 int seq=1;
1017
1018 len=
sync(s, &dts, &flags, &stream_index2, &pos);
1019 if(len<0)
1021
1022 st = s->
streams[stream_index2];
1025 if(!(h & 0x40)){
1027 }
1028 }
1029
1030 if((flags&2) && (seq&0x7F) == 1){
1031 av_dlog(s,
"%d %d-%d %"PRId64
" %d\n",
1032 flags, stream_index2, stream_index, dts, seq);
1034 if(stream_index2 == stream_index)
1035 break;
1036 }
1037
1039 }
1040 *ppos = pos;
1041 return dts;
1042 }
1043
1045 int64_t pts,
int flags)
1046 {
1048
1050 return -1;
1052 return 0;
1053 }
1054
1055
1066 };
1067
1074 };