From 6d10c5bfc0e998aec69d0d59397bdb6bae458c76 Mon Sep 17 00:00:00 2001 From: Paul B Mahol Date: Thu, 16 Feb 2012 21:48:57 +0000 Subject: [PATCH] cdxl: fix audio for some samples There may be extra padding at and of chunk. Signed-off-by: Paul B Mahol Signed-off-by: Justin Ruggles --- libavformat/cdxl.c | 18 +++++++++++------- 1 file 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; }