1 /*
2 * MPEG1/2 demuxer
3 * Copyright (c) 2000, 2001, 2002 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
25
26 #if CONFIG_VOBSUB_DEMUXER
29 #endif
30
31 #undef NDEBUG
32 #include <assert.h>
33
34 /*********************************************/
35 /* demux code */
36
37 #define MAX_SYNC_SIZE 100000
38
40 int pes1;
41 int pes2= (p[3] & 0xC0) == 0x80
42 && (p[4] & 0xC0) != 0x40
43 &&((p[4] & 0xC0) == 0x00 || (p[4]&0xC0)>>2 == (p[6]&0xF0));
44
45 for(p+=3; p<end && *p == 0xFF; p++);
46 if((*p&0xC0) == 0x40) p+=2;
47 if((*p&0xF0) == 0x20){
48 pes1= p[0]&p[2]&p[4]&1;
49 }else if((*p&0xF0) == 0x30){
50 pes1= p[0]&p[2]&p[4]&p[5]&p[7]&p[9]&1;
51 }else
52 pes1 = *p == 0x0F;
53
54 return pes1||pes2;
55 }
56
58 return (buf[1] & 0xC0) == 0x40 || (buf[1] & 0xF0) == 0x20;
59 }
60
62 {
63 uint32_t code= -1;
64 int sys=0, pspack=0, priv1=0, vid=0, audio=0, invalid=0;
65 int i;
66 int score=0;
67
69 code = (code<<8) + p->
buf[i];
70 if ((code & 0xffffff00) == 0x100) {
74
77 else if((code & 0xf0) ==
VIDEO_ID && pes) vid++;
78 // skip pes payload to avoid start code emulation for private
79 // and audio streams
80 else if((code & 0xe0) ==
AUDIO_ID && pes) {audio++; i+=
len;}
82 else if(code == 0x1fd && pes) vid++; //VC1
83
84 else if((code & 0xf0) ==
VIDEO_ID && !pes) invalid++;
85 else if((code & 0xe0) ==
AUDIO_ID && !pes) invalid++;
87 }
88 }
89
90 if(vid+audio > invalid+1) /* invalid VDR files nd short PES streams */
92
93 if(sys>invalid && sys*9 <= pspack*10)
95 if(pspack > invalid && (priv1+vid+audio)*10 >= pspack*9)
97 if((!!vid ^ !!audio) && (audio > 4 || vid > 1) && !sys && !pspack && p->
buf_size>2048 && vid + audio > invalid)
/* PES stream */
99
100 //02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1
101 //mp3_misidentified_2.mp3 has sys:0 priv1:0 pspack:0 vid:0 audio:6
102 //Have\ Yourself\ a\ Merry\ Little\ Christmas.mp3 0 0 0 5 0 1 len:21618
103 return score;
104 }
105
106
111 #if CONFIG_VOBSUB_DEMUXER
114 #endif
116
118 {
120 const char *sofdec = "Sofdec";
123
126
128 do {
131 } while (v == sofdec[i] && i++ < 6);
132
134
137
138 /* no need to do more */
139 return 0;
140 }
141
143 {
145
148
150 }
151
154 {
156 int val, n;
157
158 state = *header_state;
159 n = *size_ptr;
160 while (n > 0) {
162 break;
164 n--;
165 if (state == 0x000001) {
166 state = ((state << 8) | v) & 0xffffff;
168 goto found;
169 }
170 state = ((state << 8) | v) & 0xffffff;
171 }
172 val = -1;
173 found:
174 *header_state =
state;
175 *size_ptr = n;
176 return val;
177 }
178
179 /**
180 * Extract stream types from a program stream map
181 * According to ISO/IEC 13818-1 ('MPEG-2 Systems') table 2-35
182 *
183 * @return number of bytes occupied by PSM in the bitstream
184 */
186 {
187 int psm_length, ps_info_length, es_map_length;
188
193
194 /* skip program_stream_info */
197
198 /* at least one es available? */
199 while (es_map_length >= 4){
200 unsigned char type =
avio_r8(pb);
201 unsigned char es_id =
avio_r8(pb);
203 /* remember mapping from stream id to stream type */
205 /* skip program_stream_info */
207 es_map_length -= 4 + es_info_length;
208 }
210 return 2 + psm_length;
211 }
212
213 /* read the next PES header. Return its position in ppos
214 (if not NULL), and its start code, pts and dts.
215 */
217 int64_t *ppos, int *pstart_code,
218 int64_t *ppts, int64_t *pdts)
219 {
222 int pes_ext, ext2_len, id_ext, skip;
223 int64_t pts, dts;
225
226 error_redo:
228 redo:
229 /* next start code (should be immediately after) */
234 if (startcode < 0){
237 //FIXME we should remember header_state
239 }
240
242 goto redo;
244 goto redo;
247 goto redo;
248 }
252 while (len-- >= 6) {
256 m->
sofdec = !memcmp(buf,
"ofdec", 5);
257 len -= sizeof(buf);
258 break;
259 }
260 }
262 }
264 goto redo;
265 }
268 goto redo;
269 }
270
271 /* find matching stream */
272 if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
273 (startcode >= 0x1e0 && startcode <= 0x1ef) ||
274 (startcode == 0x1bd) || (startcode == 0x1fd)))
275 goto redo;
276 if (ppos) {
278 }
280 pts =
282 /* stuffing */
283 for(;;) {
284 if (len < 1)
285 goto error_redo;
287 len--;
288 /* XXX: for mpeg1, should test only bit 7 */
289 if (c != 0xff)
290 break;
291 }
292 if ((c & 0xc0) == 0x40) {
293 /* buffer scale & size */
296 len -= 2;
297 }
298 if ((c & 0xe0) == 0x20) {
300 len -= 4;
301 if (c & 0x10){
303 len -= 5;
304 }
305 } else if ((c & 0xc0) == 0x80) {
306 /* mpeg 2 PES */
309 len -= 2;
310 if (header_len > len)
311 goto error_redo;
312 len -= header_len;
313 if (flags & 0x80) {
315 header_len -= 5;
316 if (flags & 0x40) {
318 header_len -= 5;
319 }
320 }
321 if (flags & 0x3f && header_len == 0){
322 flags &= 0xC0;
324 }
325 if (flags & 0x01) { /* PES extension */
327 header_len--;
328 /* Skip PES private data, program packet sequence counter and P-STD buffer */
329 skip = (pes_ext >> 4) & 0xb;
330 skip += skip & 0x9;
331 if (pes_ext & 0x40 || skip > header_len){
333 pes_ext=skip=0;
334 }
336 header_len -= skip;
337
338 if (pes_ext & 0x01) { /* PES extension 2 */
340 header_len--;
341 if ((ext2_len & 0x7f) > 0) {
343 if ((id_ext & 0x80) == 0)
344 startcode = ((startcode & 0xff) << 8) | id_ext;
345 header_len--;
346 }
347 }
348 }
349 if(header_len < 0)
350 goto error_redo;
352 }
353 else if( c!= 0xf )
354 goto redo;
355
358 len--;
359 }
360 if(len<0)
361 goto error_redo;
363 int i;
366 s->
pb->
seekable /* index useless on streams anyway */) {
369 }
370 }
371 }
372
373 *pstart_code = startcode;
374 *ppts = pts;
375 *pdts = dts;
377 }
378
381 {
384 int len, startcode, i, es_type, ret;
385 int lpcm_header_len = -1; //Init to supress warning
386 int request_probe= 0;
389 int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work
390
391 redo:
393 if (len < 0)
395
396 if (startcode >= 0x80 && startcode <= 0xcf) {
397 if(len < 4)
398 goto skip;
399
400 /* audio: skip header */
403 len -= 3;
404 if (startcode >= 0xb0 && startcode <= 0xbf) {
405 /* MLP/TrueHD audio has a 4-byte header */
407 len--;
408 }
409 }
410
411 /* now find stream */
414 if (st->
id == startcode)
415 goto found;
416 }
417
441 } else if (startcode >= 0x1e0 && startcode <= 0x1ef) {
442 static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 };
443 unsigned char buf[8];
446 if(!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1))
448 else
449 request_probe= 1;
451 } else if (startcode >= 0x1c0 && startcode <= 0x1df) {
454 } else if (startcode >= 0x80 && startcode <= 0x87) {
457 } else if ( ( startcode >= 0x88 && startcode <= 0x8f)
458 ||( startcode >= 0x98 && startcode <= 0x9f)) {
459 /* 0x90 - 0x97 is reserved for SDDS in DVD specs */
462 } else if (startcode >= 0xa0 && startcode <= 0xaf) {
464 if(lpcm_header_len == 6) {
466 } else {
467 /* 16 bit form will be handled as AV_CODEC_ID_PCM_S16BE */
469 }
470 } else if (startcode >= 0xb0 && startcode <= 0xbf) {
473 } else if (startcode >= 0xc0 && startcode <= 0xcf) {
474 /* Used for both AC-3 and E-AC-3 in EVOB files */
477 } else if (startcode >= 0x20 && startcode <= 0x3f) {
480 } else if (startcode >= 0xfd55 && startcode <= 0xfd5f) {
483 } else {
484 skip:
485 /* skip packet */
487 goto redo;
488 }
489 /* no stream found: add a new stream */
491 if (!st)
492 goto skip;
499 found:
501 goto skip;
502 if (startcode >= 0xa0 && startcode <= 0xaf) {
504 if (len < 6)
505 goto skip;
507 len -=6;
508 } else {
509 int b1, freq;
510
511 /* for LPCM, we just skip the header and consider it is raw
512 audio data */
513 if (len <= 3)
514 goto skip;
515 avio_r8(s->
pb);
/* emphasis (1), muse(1), reserved(1), frame number(5) */
516 b1 =
avio_r8(s->
pb);
/* quant (2), freq(2), reserved(1), channels(3) */
517 avio_r8(s->
pb);
/* dynamic range control (0x80 = off) */
518 len -= 3;
519 freq = (b1 >> 4) & 3;
530 }
531 }
535 pkt->
pos = dummy_pos;
537 av_dlog(s,
"%d: pts=%0.3f dts=%0.3f size=%d\n",
540
541 return (ret < 0) ? ret : 0;
542 }
543
545 int64_t *ppos, int64_t pos_limit)
546 {
548 int64_t pos, pts, dts;
549
550 pos = *ppos;
553
554 for(;;) {
556 if (len < 0) {
557 av_dlog(s,
"none (ret=%d)\n", len);
559 }
560 if (startcode == s->
streams[stream_index]->
id &&
562 break;
563 }
565 }
566 av_dlog(s,
"pos=0x%"PRIx64
" dts=0x%"PRIx64
" %0.3f\n",
567 pos, dts, dts / 90000.0);
568 *ppos = pos;
569 return dts;
570 }
571
581 };
582
583 #if CONFIG_VOBSUB_DEMUXER
584
585 #define REF_STRING "# VobSub index file,"
586
588 {
589 if (!strncmp(p->
buf, REF_STRING,
sizeof(REF_STRING) - 1))
591 return 0;
592 }
593
595 {
596 int i, ret = 0, header_parsed = 0, langidx = 0;
598 char *sub_name =
NULL;
599 size_t fname_len;
600 char *ext, *header_str;
602 int64_t delay = 0;
604
606 fname_len = strlen(sub_name);
607 ext = sub_name - 3 + fname_len;
608 if (fname_len < 4 || *(ext - 1) != '.') {
610 "to guess the associated .SUB file\n");
613 }
614 memcpy(ext, !strncmp(ext, "IDX", 3) ? "SUB" : "sub", 3);
617 if (ret < 0) {
620 }
621
626
627 if (!len)
628 break;
629
630 line[strcspn(line, "\r\n")] = 0;
631
632 if (!strncmp(line, "id:", 3)) {
633 int n, stream_id = 0;
634 char id[64] = {0};
635
636 n = sscanf(line, "id: %63[^,], index: %u", id, &stream_id);
637 if (n != 2) {
639 "assuming 'id: und, index: 0'\n", line);
640 strcpy(id, "und");
641 stream_id = 0;
642 }
643
645 if (!st) {
648 }
654 header_parsed = 1;
655
656 } else if (st && !strncmp(line, "timestamp:", 10)) {
658 int hh, mm, ss, ms;
659 int64_t pos, timestamp;
660 const char *p = line + 10;
661
662 if (sscanf(p, "%02d:%02d:%02d:%03d, filepos: %"PRIx64,
663 &hh, &mm, &ss, &ms, &pos) != 5) {
665 "abort parsing\n", line);
666 break;
667 }
668 timestamp = (hh*3600LL + mm*60LL + ss) * 1000LL + ms + delay;
670
672 if (!sub) {
675 }
676 sub->pos = pos;
677 sub->pts = timestamp;
679
680 } else if (st && !strncmp(line, "alt:", 4)) {
681 const char *p = line + 4;
682
683 while (*p == ' ')
684 p++;
687 header_parsed = 1;
688
689 } else if (!strncmp(line, "delay:", 6)) {
690 int sign = 1, hh = 0, mm = 0, ss = 0, ms = 0;
691 const char *p = line + 6;
692
693 while (*p == ' ')
694 p++;
695 if (*p == '-' || *p == '+') {
696 sign = *p == '-' ? -1 : 1;
697 p++;
698 }
699 sscanf(p, "%d:%d:%d:%d", &hh, &mm, &ss, &ms);
700 delay = ((hh*3600LL + mm*60LL + ss) * 1000LL + ms) * sign;
701
702 } else if (!strncmp(line, "langidx:", 8)) {
703 const char *p = line + 8;
704
705 if (sscanf(p, "%d", &langidx) != 1)
707
708 } else if (!header_parsed) {
709 if (line[0] && line[0] != '#')
711 }
712 }
713
714 if (langidx < s->nb_streams)
716
718
723 }
729 }
731
734 return ret;
735 }
736
738 {
742 int ret, psize, len16 = -1;
744
746 if (ret < 0)
747 return ret;
748
749 /* compute maximum packet size using the next packet position. This is
750 * useful when the len in the header is non-sense */
753 } else {
755 psize = fsize < 0 ? 0xffff : fsize - idx_pkt.
pos;
756 }
757
759
763
764 do {
765 int n, to_read, startcode;
766 int64_t pts, dts;
767
769 if (ret < 0)
770 return ret;
771 to_read = ret & 0xffff;
772
773 /* this prevents reads above the current packet */
774 if (pkt->
size + to_read > psize)
775 break;
776
777 /* if the len is computed, we check for overread */
778 if (len16 != -1 && pkt->
size + to_read > len16)
779 break;
780
781 /* the current chunk doesn't match the stream index (unlikely) */
783 break;
784
786 if (ret < 0)
787 return ret;
788
790 if (n < to_read)
791 pkt->
size -= to_read - n;
792
793 /* first chunk contains the total len of the packet to raise */
794 if (len16 == -1 && n > 2)
796 }
while (len16 != -1 && pkt->
size != len16);
797
801
802 return 0;
803 }
804
806 int64_t min_ts, int64_t ts, int64_t max_ts,
int flags)
807 {
810 min_ts, ts, max_ts, flags);
811 }
812
814 {
817 if (vobsub->sub_ctx)
819 return 0;
820 }
821
829 .read_seek2 = vobsub_read_seek,
832 .extensions = "idx",
833 };
834 #endif