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>
34
35 /*********************************************/
36 /* demux code */
37
38 #define MAX_SYNC_SIZE 100000
39
41 int pes1;
42 int pes2= (p[3] & 0xC0) == 0x80
43 && (p[4] & 0xC0) != 0x40
44 &&((p[4] & 0xC0) == 0x00 || (p[4]&0xC0)>>2 == (p[6]&0xF0));
45
46 for(p+=3; p<end && *p == 0xFF; p++);
47 if((*p&0xC0) == 0x40) p+=2;
48 if((*p&0xF0) == 0x20){
49 pes1= p[0]&p[2]&p[4]&1;
50 }else if((*p&0xF0) == 0x30){
51 pes1= p[0]&p[2]&p[4]&p[5]&p[7]&p[9]&1;
52 }else
53 pes1 = *p == 0x0F;
54
55 return pes1||pes2;
56 }
57
59 return (buf[1] & 0xC0) == 0x40 || (buf[1] & 0xF0) == 0x20;
60 }
61
63 {
64 uint32_t code= -1;
65 int sys=0, pspack=0, priv1=0, vid=0, audio=0, invalid=0;
66 int i;
67 int score=0;
68
70 code = (code<<8) + p->
buf[i];
71 if ((code & 0xffffff00) == 0x100) {
75
78 else if((code & 0xf0) ==
VIDEO_ID && pes) vid++;
79 // skip pes payload to avoid start code emulation for private
80 // and audio streams
81 else if((code & 0xe0) ==
AUDIO_ID && pes) {audio++; i+=
len;}
83 else if(code == 0x1fd && pes) vid++; //VC1
84
85 else if((code & 0xf0) ==
VIDEO_ID && !pes) invalid++;
86 else if((code & 0xe0) ==
AUDIO_ID && !pes) invalid++;
88 }
89 }
90
91 if(vid+audio > invalid+1) /* invalid VDR files nd short PES streams */
93
94 if(sys>invalid && sys*9 <= pspack*10)
96 if(pspack > invalid && (priv1+vid+audio)*10 >= pspack*9)
98 if((!!vid ^ !!audio) && (audio > 4 || vid > 1) && !sys && !pspack && p->
buf_size>2048 && vid + audio > invalid)
/* PES stream */
100
101 //02-Penguin.flac has sys:0 priv1:0 pspack:0 vid:0 audio:1
102 //mp3_misidentified_2.mp3 has sys:0 priv1:0 pspack:0 vid:0 audio:6
103 //Have\ Yourself\ a\ Merry\ Little\ Christmas.mp3 0 0 0 5 0 1 len:21618
104 return score;
105 }
106
107
114 #if CONFIG_VOBSUB_DEMUXER
117 #endif
119
121 {
125
128
130 if (!memcmp("IMKH", buffer, 4)) {
132 } else if (!memcmp("Sofdec", buffer, 6)) {
134 } else
136
137 /* no need to do more */
138 return 0;
139 }
140
142 {
144
147
149 }
150
153 {
156
157 state = *header_state;
158 n = *size_ptr;
159 while (n > 0) {
161 break;
163 n--;
164 if (state == 0x000001) {
165 state = ((state << 8) | v) & 0xffffff;
167 goto found;
168 }
169 state = ((state << 8) | v) & 0xffffff;
170 }
171 val = -1;
172 found:
173 *header_state =
state;
176 }
177
178 /**
179 * Extract stream types from a program stream map
180 * According to ISO/IEC 13818-1 ('MPEG-2 Systems') table 2-35
181 *
182 * @return number of bytes occupied by PSM in the bitstream
183 */
185 {
186 int psm_length, ps_info_length, es_map_length;
187
192
193 /* skip program_stream_info */
196
197 /* at least one es available? */
198 while (es_map_length >= 4){
200 unsigned char es_id =
avio_r8(pb);
202 /* remember mapping from stream id to stream type */
204 /* skip program_stream_info */
206 es_map_length -= 4 + es_info_length;
207 }
209 return 2 + psm_length;
210 }
211
212 /* read the next PES header. Return its position in ppos
213 (if not NULL), and its start code, pts and dts.
214 */
216 int64_t *ppos, int *pstart_code,
217 int64_t *ppts, int64_t *pdts)
218 {
221 int pes_ext, ext2_len, id_ext, skip;
222 int64_t pts, dts;
224
225 error_redo:
227 redo:
228 /* next start code (should be immediately after) */
233 if (startcode < 0){
236 //FIXME we should remember header_state
238 }
239
241 goto redo;
243 goto redo;
246 goto redo;
247 }
250 /* Need to detect whether this from a DVD or a 'Sofdec' stream */
252 int bytesread = 0;
254
255 if (ps2buf) {
257
258 if (bytesread != len) {
260 } else {
262 if (len >= 6)
263 p = memchr(ps2buf, 'S', len - 5);
264
265 if (p)
266 m->
sofdec = !memcmp(p+1,
"ofdec", 5);
267
269
271 if (len == 980 && ps2buf[0] == 0) {
272 /* PCI structure? */
273 uint32_t startpts =
AV_RB32(ps2buf + 0x0d);
274 uint32_t endpts =
AV_RB32(ps2buf + 0x11);
275 uint8_t hours = ((ps2buf[0x19] >> 4) * 10) + (ps2buf[0x19] & 0x0f);
276 uint8_t mins = ((ps2buf[0x1a] >> 4) * 10) + (ps2buf[0x1a] & 0x0f);
277 uint8_t secs = ((ps2buf[0x1b] >> 4) * 10) + (ps2buf[0x1b] & 0x0f);
278
279 m->
dvd = (hours <= 23 &&
280 mins <= 59 &&
281 secs <= 59 &&
282 (ps2buf[0x19] & 0x0f) < 10 &&
283 (ps2buf[0x1a] & 0x0f) < 10 &&
284 (ps2buf[0x1b] & 0x0f) < 10 &&
285 endpts >= startpts);
286 } else if (len == 1018 && ps2buf[0] == 1) {
287 /* DSI structure? */
288 uint8_t hours = ((ps2buf[0x1d] >> 4) * 10) + (ps2buf[0x1d] & 0x0f);
289 uint8_t mins = ((ps2buf[0x1e] >> 4) * 10) + (ps2buf[0x1e] & 0x0f);
290 uint8_t secs = ((ps2buf[0x1f] >> 4) * 10) + (ps2buf[0x1f] & 0x0f);
291
292 m->
dvd = (hours <= 23 &&
293 mins <= 59 &&
294 secs <= 59 &&
295 (ps2buf[0x1d] & 0x0f) < 10 &&
296 (ps2buf[0x1e] & 0x0f) < 10 &&
297 (ps2buf[0x1f] & 0x0f) < 10);
298 }
299 }
300 }
301
303
304 /* If this isn't a DVD packet or no memory
305 * could be allocated, just ignore it.
306 * If we did, move back to the start of the
307 * packet (plus 'length' field) */
309 /* Skip back failed.
310 * This packet will be lost but that can't be helped
311 * if we can't skip back
312 */
313 goto redo;
314 }
315 } else {
316 /* No memory */
318 goto redo;
319 }
320 }
else if (!m->
dvd) {
323 goto redo;
324 }
325 }
328 goto redo;
329 }
330
331 /* find matching stream */
332 if (!((startcode >= 0x1c0 && startcode <= 0x1df) ||
333 (startcode >= 0x1e0 && startcode <= 0x1ef) ||
334 (startcode == 0x1bd) ||
336 (startcode == 0x1fd)))
337 goto redo;
338 if (ppos) {
340 }
342 pts =
345 {
346 /* stuffing */
347 for(;;) {
348 if (len < 1)
349 goto error_redo;
351 len--;
352 /* XXX: for mpeg1, should test only bit 7 */
353 if (c != 0xff)
354 break;
355 }
356 if ((c & 0xc0) == 0x40) {
357 /* buffer scale & size */
360 len -= 2;
361 }
362 if ((c & 0xe0) == 0x20) {
364 len -= 4;
365 if (c & 0x10){
367 len -= 5;
368 }
369 } else if ((c & 0xc0) == 0x80) {
370 /* mpeg 2 PES */
373 len -= 2;
374 if (header_len > len)
375 goto error_redo;
376 len -= header_len;
377 if (flags & 0x80) {
379 header_len -= 5;
380 if (flags & 0x40) {
382 header_len -= 5;
383 }
384 }
385 if (flags & 0x3f && header_len == 0){
386 flags &= 0xC0;
388 }
389 if (flags & 0x01) { /* PES extension */
391 header_len--;
392 /* Skip PES private data, program packet sequence counter and P-STD buffer */
393 skip = (pes_ext >> 4) & 0xb;
394 skip += skip & 0x9;
395 if (pes_ext & 0x40 || skip > header_len){
397 pes_ext=skip=0;
398 }
400 header_len -= skip;
401
402 if (pes_ext & 0x01) { /* PES extension 2 */
404 header_len--;
405 if ((ext2_len & 0x7f) > 0) {
407 if ((id_ext & 0x80) == 0)
408 startcode = ((startcode & 0xff) << 8) | id_ext;
409 header_len--;
410 }
411 }
412 }
413 if(header_len < 0)
414 goto error_redo;
416 }
417 else if( c!= 0xf )
418 goto redo;
419 }
420
423 len--;
424 }
425 if(len<0)
426 goto error_redo;
428 int i;
431 s->
pb->
seekable /* index useless on streams anyway */) {
434 }
435 }
436 }
437
438 *pstart_code = startcode;
439 *ppts = pts;
440 *pdts = dts;
442 }
443
446 {
449 int len, startcode, i, es_type,
ret;
450 int lpcm_header_len = -1; //Init to supress warning
451 int request_probe= 0;
454 int64_t pts, dts, dummy_pos; //dummy_pos is needed for the index building to work
455
456 redo:
458 if (len < 0)
460
461 if (startcode >= 0x80 && startcode <= 0xcf) {
462 if(len < 4)
463 goto skip;
464
465 /* audio: skip header */
468 len -= 3;
469 if (startcode >= 0xb0 && startcode <= 0xbf) {
470 /* MLP/TrueHD audio has a 4-byte header */
472 len--;
473 }
474 }
475
476 /* now find stream */
479 if (st->
id == startcode)
480 goto found;
481 }
482
506 }
else if(m->
imkh_cctv && es_type == 0x91){
509 } else if (startcode >= 0x1e0 && startcode <= 0x1ef) {
510 static const unsigned char avs_seqh[4] = { 0, 0, 1, 0xb0 };
511 unsigned char buf[8];
514 if(!memcmp(buf, avs_seqh, 4) && (buf[6] != 0 || buf[7] != 1))
516 else
517 request_probe= 1;
522 } else if (startcode >= 0x1c0 && startcode <= 0x1df) {
525 } else if (startcode >= 0x80 && startcode <= 0x87) {
528 } else if ( ( startcode >= 0x88 && startcode <= 0x8f)
529 ||( startcode >= 0x98 && startcode <= 0x9f)) {
530 /* 0x90 - 0x97 is reserved for SDDS in DVD specs */
533 } else if (startcode >= 0xa0 && startcode <= 0xaf) {
535 if(lpcm_header_len == 6) {
537 } else {
538 /* 16 bit form will be handled as AV_CODEC_ID_PCM_S16BE */
540 }
541 } else if (startcode >= 0xb0 && startcode <= 0xbf) {
544 } else if (startcode >= 0xc0 && startcode <= 0xcf) {
545 /* Used for both AC-3 and E-AC-3 in EVOB files */
548 } else if (startcode >= 0x20 && startcode <= 0x3f) {
551 } else if (startcode >= 0xfd55 && startcode <= 0xfd5f) {
554 } else {
555 skip:
556 /* skip packet */
558 goto redo;
559 }
560 /* no stream found: add a new stream */
562 if (!st)
563 goto skip;
571 }
575 found:
577 goto skip;
578 if (startcode >= 0xa0 && startcode <= 0xaf) {
580 if (len < 6)
581 goto skip;
583 len -=6;
584 } else {
585 int b1, freq;
586
587 /* for LPCM, we just skip the header and consider it is raw
588 audio data */
589 if (len <= 3)
590 goto skip;
591 avio_r8(s->
pb);
/* emphasis (1), muse(1), reserved(1), frame number(5) */
592 b1 =
avio_r8(s->
pb);
/* quant (2), freq(2), reserved(1), channels(3) */
593 avio_r8(s->
pb);
/* dynamic range control (0x80 = off) */
594 len -= 3;
595 freq = (b1 >> 4) & 3;
606 }
607 }
611 pkt->
pos = dummy_pos;
613 av_dlog(s,
"%d: pts=%0.3f dts=%0.3f size=%d\n",
616
617 return (ret < 0) ? ret : 0;
618 }
619
621 int64_t *ppos, int64_t pos_limit)
622 {
624 int64_t pos, pts, dts;
625
626 pos = *ppos;
629
630 for(;;) {
632 if (len < 0) {
633 av_dlog(s,
"none (ret=%d)\n", len);
635 }
636 if (startcode == s->
streams[stream_index]->
id &&
638 break;
639 }
641 }
642 av_dlog(s,
"pos=0x%"PRIx64
" dts=0x%"PRIx64
" %0.3f\n",
643 pos, dts, dts / 90000.0);
644 *ppos = pos;
645 return dts;
646 }
647
657 };
658
659 #if CONFIG_VOBSUB_DEMUXER
660
661 #define REF_STRING "# VobSub index file,"
662
664 {
665 if (!strncmp(p->
buf, REF_STRING,
sizeof(REF_STRING) - 1))
667 return 0;
668 }
669
671 {
672 int i,
ret = 0, header_parsed = 0, langidx = 0;
674 char *sub_name = NULL;
675 size_t fname_len;
676 char *ext, *header_str;
678 int64_t delay = 0;
680
682 fname_len = strlen(sub_name);
683 ext = sub_name - 3 + fname_len;
684 if (fname_len < 4 || *(ext - 1) != '.') {
686 "to guess the associated .SUB file\n");
689 }
690 memcpy(ext, !strncmp(ext, "IDX", 3) ? "SUB" : "sub", 3);
693 if (ret < 0) {
696 }
697
702
703 if (!len)
704 break;
705
706 line[strcspn(line, "\r\n")] = 0;
707
708 if (!strncmp(line, "id:", 3)) {
709 int n, stream_id = 0;
710 char id[64] = {0};
711
712 n = sscanf(line, "id: %63[^,], index: %u", id, &stream_id);
713 if (n != 2) {
715 "assuming 'id: und, index: 0'\n", line);
716 strcpy(id, "und");
717 stream_id = 0;
718 }
719
721 if (!st) {
724 }
730 header_parsed = 1;
731
732 } else if (st && !strncmp(line, "timestamp:", 10)) {
734 int hh, mm, ss, ms;
735 int64_t pos, timestamp;
736 const char *p = line + 10;
737
738 if (sscanf(p, "%02d:%02d:%02d:%03d, filepos: %"SCNx64,
739 &hh, &mm, &ss, &ms, &pos) != 5) {
741 "abort parsing\n", line);
742 break;
743 }
744 timestamp = (hh*3600LL + mm*60LL + ss) * 1000LL + ms + delay;
746
748 if (!sub) {
751 }
752 sub->pos = pos;
753 sub->pts = timestamp;
755
756 } else if (st && !strncmp(line, "alt:", 4)) {
757 const char *p = line + 4;
758
759 while (*p == ' ')
760 p++;
763 header_parsed = 1;
764
765 } else if (!strncmp(line, "delay:", 6)) {
766 int sign = 1, hh = 0, mm = 0, ss = 0, ms = 0;
767 const char *p = line + 6;
768
769 while (*p == ' ')
770 p++;
771 if (*p == '-' || *p == '+') {
772 sign = *p == '-' ? -1 : 1;
773 p++;
774 }
775 sscanf(p, "%d:%d:%d:%d", &hh, &mm, &ss, &ms);
776 delay = ((hh*3600LL + mm*60LL + ss) * 1000LL + ms) * sign;
777
778 } else if (!strncmp(line, "langidx:", 8)) {
779 const char *p = line + 8;
780
781 if (sscanf(p, "%d", &langidx) != 1)
783
784 } else if (!header_parsed) {
785 if (line[0] && line[0] != '#')
787 }
788 }
789
790 if (langidx < s->nb_streams)
792
794
799 }
805 }
807
811 }
812
813 #define FAIL(r) do { ret = r; goto fail; } while (0)
814
816 {
820 int ret, psize, len16 = -1;
822
824 if (ret < 0)
826
827 /* compute maximum packet size using the next packet position. This is
828 * useful when the len in the header is non-sense */
831 } else {
833 psize = fsize < 0 ? 0xffff : fsize - idx_pkt.
pos;
834 }
835
837
841
842 do {
843 int n, to_read, startcode;
844 int64_t pts, dts;
845
847 if (ret < 0)
849 to_read = ret & 0xffff;
850
851 /* this prevents reads above the current packet */
852 if (pkt->
size + to_read > psize)
853 break;
854
855 /* if the len is computed, we check for overread */
856 if (len16 != -1 && pkt->
size + to_read > len16)
857 break;
858
859 /* the current chunk doesn't match the stream index (unlikely) */
861 break;
862
864 if (ret < 0)
866
868 if (n < to_read)
869 pkt->
size -= to_read -
n;
870
871 /* first chunk contains the total len of the packet to raise */
872 if (len16 == -1 && n > 2)
874 }
while (len16 != -1 && pkt->
size != len16);
875
879
881 return 0;
882
883 fail:
886 }
887
889 int64_t min_ts, int64_t ts, int64_t max_ts,
int flags)
890 {
893 min_ts, ts, max_ts, flags);
894 }
895
897 {
900 if (vobsub->sub_ctx)
902 return 0;
903 }
904
912 .read_seek2 = vobsub_read_seek,
915 .extensions = "idx",
916 };
917 #endif