diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2012-07-31 20:54:33 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2012-08-04 19:37:24 +0200 |
commit | 759901f817cb481c989af7bec48f24377ec25735 (patch) | |
tree | c5697fdd979fbc5b6ad6ec7521206b39b45e7982 | |
parent | ce7cf600be62d81cddefb302c2f098672130774b (diff) | |
download | ffmpeg-759901f817cb481c989af7bec48f24377ec25735.tar.gz |
mpegdemux: support MLP/AOB
Fixes issue1731
Based-on-patch-by: carl
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
-rw-r--r-- | libavformat/mpeg.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/libavformat/mpeg.c b/libavformat/mpeg.c index 904399c113..f01e905982 100644 --- a/libavformat/mpeg.c +++ b/libavformat/mpeg.c @@ -375,6 +375,7 @@ static int mpegps_read_packet(AVFormatContext *s, MpegDemuxContext *m = s->priv_data; AVStream *st; int len, startcode, i, es_type, ret; + int lpcm_header_len; int request_probe= 0; enum CodecID codec_id = CODEC_ID_NONE; enum AVMediaType type; @@ -391,8 +392,7 @@ static int mpegps_read_packet(AVFormatContext *s, /* audio: skip header */ avio_r8(s->pb); - avio_r8(s->pb); - avio_r8(s->pb); + lpcm_header_len = avio_rb16(s->pb); len -= 3; if (startcode >= 0xb0 && startcode <= 0xbf) { /* MLP/TrueHD audio has a 4-byte header */ @@ -458,8 +458,12 @@ static int mpegps_read_packet(AVFormatContext *s, codec_id = CODEC_ID_DTS; } else if (startcode >= 0xa0 && startcode <= 0xaf) { type = AVMEDIA_TYPE_AUDIO; - /* 16 bit form will be handled as CODEC_ID_PCM_S16BE */ - codec_id = CODEC_ID_PCM_DVD; + if(lpcm_header_len == 6) { + codec_id = CODEC_ID_MLP; + } else { + /* 16 bit form will be handled as CODEC_ID_PCM_S16BE */ + codec_id = CODEC_ID_PCM_DVD; + } } else if (startcode >= 0xb0 && startcode <= 0xbf) { type = AVMEDIA_TYPE_AUDIO; codec_id = CODEC_ID_TRUEHD; @@ -493,6 +497,12 @@ static int mpegps_read_packet(AVFormatContext *s, if(st->discard >= AVDISCARD_ALL) goto skip; if (startcode >= 0xa0 && startcode <= 0xaf) { + if (lpcm_header_len == 6) { + if (len < 6) + goto skip; + avio_skip(s->pb, 6); + len -=6; + } else { int b1, freq; /* for LPCM, we just skip the header and consider it is raw @@ -514,6 +524,7 @@ static int mpegps_read_packet(AVFormatContext *s, st->codec->codec_id = CODEC_ID_PCM_S16BE; else if (st->codec->bits_per_coded_sample == 28) return AVERROR(EINVAL); + } } ret = av_get_packet(s->pb, pkt, len); pkt->pts = pts; |