Mercurial > libavformat.hg
diff mpegts.c @ 165:e4d2f704bf80 libavformat
- Looks a tiny bit harder in mpegps_probe() for a valid start code. This is
needed to detect some files produced by pvr-250/350 capture cards.
- Adds AC3 audio support to the mpegts demuxer, and makes it a little more
tolerant of bad files.
patch by (Isaac Richards <ijr at po dot cwru dot edu>)
| author | michaelni |
|---|---|
| date | Thu, 10 Jul 2003 09:04:04 +0000 |
| parents | 9bde37b1a5ce |
| children | 0543d27721c1 |
line wrap: on
line diff
--- a/mpegts.c Wed Jul 09 23:10:59 2003 +0000 +++ b/mpegts.c Thu Jul 10 09:04:04 2003 +0000 @@ -387,6 +387,7 @@ case STREAM_TYPE_AUDIO_MPEG2: case STREAM_TYPE_VIDEO_MPEG1: case STREAM_TYPE_VIDEO_MPEG2: + case STREAM_TYPE_AUDIO_AC3: add_pes_stream(ts->stream, pid); break; default: @@ -613,16 +614,19 @@ if (pes->header[0] == 0x00 && pes->header[1] == 0x00 && pes->header[2] == 0x01) { /* it must be an mpeg2 PES stream */ - /* XXX: add AC3 support */ code = pes->header[3] | 0x100; if (!((code >= 0x1c0 && code <= 0x1df) || - (code >= 0x1e0 && code <= 0x1ef))) + (code >= 0x1e0 && code <= 0x1ef) || + (code == 0x1bd))) goto skip; if (!pes->st) { /* allocate stream */ if (code >= 0x1c0 && code <= 0x1df) { codec_type = CODEC_TYPE_AUDIO; codec_id = CODEC_ID_MP2; + } else if (code == 0x1bd) { + codec_type = CODEC_TYPE_AUDIO; + codec_id = CODEC_ID_AC3; } else { codec_type = CODEC_TYPE_VIDEO; codec_id = CODEC_ID_MPEG1VIDEO; @@ -805,6 +809,8 @@ ByteIOContext *pb = &s->pb; uint8_t packet[TS_FEC_PACKET_SIZE]; int packet_num, len; + int i, found = 0; + int64_t pos; ts->stop_parse = 0; packet_num = 0; @@ -814,13 +820,32 @@ packet_num++; if (nb_packets != 0 && packet_num >= nb_packets) break; + pos = url_ftell(pb); len = get_buffer(pb, packet, ts->raw_packet_size); if (len != ts->raw_packet_size) return AVERROR_IO; /* check paquet sync byte */ - /* XXX: accept to resync ? */ if (packet[0] != 0x47) - return AVERROR_INVALIDDATA; + { + //printf("bad packet: 0x%x\n", packet[0]); + found = 0; + for (i = 0; i < ts->raw_packet_size; i++) + { + if (packet[i] == 0x47) + { + found = 1; + //printf("packet start at: %d\n", i); + break; + } + } + + if (found) + { + url_fseek(pb, pos + i, SEEK_SET); + continue; + } + return AVERROR_INVALIDDATA; + } handle_packet(s, packet); } return 0;
