summaryrefslogtreecommitdiff
path: root/libavformat/cdxl.c
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2012-02-16 21:48:57 +0000
committerJustin Ruggles <justin.ruggles@gmail.com>2012-02-17 14:19:35 -0500
commit6d10c5bfc0e998aec69d0d59397bdb6bae458c76 (patch)
tree22557ab7f5133fea464fa819cd74d8a39decb06a /libavformat/cdxl.c
parentf02edc4c06388bcd7b21130fac5ad8ef3fc8e948 (diff)
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>
Diffstat (limited to 'libavformat/cdxl.c')
-rw-r--r--libavformat/cdxl.c18
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;
}