diff options
author | Paul B Mahol <onemda@gmail.com> | 2012-02-16 21:48:57 +0000 |
---|---|---|
committer | Justin Ruggles <justin.ruggles@gmail.com> | 2012-02-17 14:19:35 -0500 |
commit | 6d10c5bfc0e998aec69d0d59397bdb6bae458c76 (patch) | |
tree | 22557ab7f5133fea464fa819cd74d8a39decb06a | |
parent | f02edc4c06388bcd7b21130fac5ad8ef3fc8e948 (diff) | |
download | ffmpeg-6d10c5bfc0e998aec69d0d59397bdb6bae458c76.tar.gz |
cdxl: fix audio for some samples
There may be extra padding at and of chunk.
Signed-off-by: Paul B Mahol <onemda@gmail.com>
Signed-off-by: Justin Ruggles <justin.ruggles@gmail.com>
-rw-r--r-- | libavformat/cdxl.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/libavformat/cdxl.c b/libavformat/cdxl.c index f2956dd2f2..49077b4a36 100644 --- a/libavformat/cdxl.c +++ b/libavformat/cdxl.c @@ -62,9 +62,8 @@ static int cdxl_read_packet(AVFormatContext *s, AVPacket *pkt) { CDXLDemuxContext *cdxl = s->priv_data; AVIOContext *pb = s->pb; - uint32_t current_size; - uint16_t audio_size, palette_size; - int32_t video_size; + uint32_t current_size, video_size, image_size; + uint16_t audio_size, palette_size, width, height; int64_t pos; int ret; @@ -81,14 +80,17 @@ static int cdxl_read_packet(AVFormatContext *s, AVPacket *pkt) } current_size = AV_RB32(&cdxl->header[2]); + width = AV_RB16(&cdxl->header[14]); + height = AV_RB16(&cdxl->header[16]); palette_size = AV_RB16(&cdxl->header[20]); audio_size = AV_RB16(&cdxl->header[22]); + image_size = FFALIGN(width, 16) * height * cdxl->header[19] / 8; + video_size = palette_size + image_size; if (palette_size > 512) return AVERROR_INVALIDDATA; - if (current_size < audio_size + palette_size + CDXL_HEADER_SIZE) + if (current_size < (uint64_t)audio_size + video_size + CDXL_HEADER_SIZE) return AVERROR_INVALIDDATA; - video_size = current_size - audio_size - CDXL_HEADER_SIZE; if (cdxl->read_chunk && audio_size) { if (cdxl->audio_stream_index == -1) { @@ -121,8 +123,8 @@ static int cdxl_read_packet(AVFormatContext *s, AVPacket *pkt) st->codec->codec_type = AVMEDIA_TYPE_VIDEO; st->codec->codec_tag = 0; st->codec->codec_id = CODEC_ID_CDXL; - st->codec->width = AV_RB16(&cdxl->header[14]); - st->codec->height = AV_RB16(&cdxl->header[16]); + st->codec->width = width; + st->codec->height = height; cdxl->video_stream_index = st->index; avpriv_set_pts_info(st, 63, cdxl->fps.den, cdxl->fps.num); } @@ -141,6 +143,8 @@ static int cdxl_read_packet(AVFormatContext *s, AVPacket *pkt) cdxl->read_chunk = audio_size; } + if (!cdxl->read_chunk) + avio_skip(pb, current_size - audio_size - video_size - CDXL_HEADER_SIZE); return ret; } |