mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-04-14 00:58:38 +02:00
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>
This commit is contained in:
parent
f02edc4c06
commit
6d10c5bfc0
@ -62,9 +62,8 @@ static int cdxl_read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
{
|
{
|
||||||
CDXLDemuxContext *cdxl = s->priv_data;
|
CDXLDemuxContext *cdxl = s->priv_data;
|
||||||
AVIOContext *pb = s->pb;
|
AVIOContext *pb = s->pb;
|
||||||
uint32_t current_size;
|
uint32_t current_size, video_size, image_size;
|
||||||
uint16_t audio_size, palette_size;
|
uint16_t audio_size, palette_size, width, height;
|
||||||
int32_t video_size;
|
|
||||||
int64_t pos;
|
int64_t pos;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
@ -81,14 +80,17 @@ static int cdxl_read_packet(AVFormatContext *s, AVPacket *pkt)
|
|||||||
}
|
}
|
||||||
|
|
||||||
current_size = AV_RB32(&cdxl->header[2]);
|
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]);
|
palette_size = AV_RB16(&cdxl->header[20]);
|
||||||
audio_size = AV_RB16(&cdxl->header[22]);
|
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)
|
if (palette_size > 512)
|
||||||
return AVERROR_INVALIDDATA;
|
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;
|
return AVERROR_INVALIDDATA;
|
||||||
video_size = current_size - audio_size - CDXL_HEADER_SIZE;
|
|
||||||
|
|
||||||
if (cdxl->read_chunk && audio_size) {
|
if (cdxl->read_chunk && audio_size) {
|
||||||
if (cdxl->audio_stream_index == -1) {
|
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_type = AVMEDIA_TYPE_VIDEO;
|
||||||
st->codec->codec_tag = 0;
|
st->codec->codec_tag = 0;
|
||||||
st->codec->codec_id = CODEC_ID_CDXL;
|
st->codec->codec_id = CODEC_ID_CDXL;
|
||||||
st->codec->width = AV_RB16(&cdxl->header[14]);
|
st->codec->width = width;
|
||||||
st->codec->height = AV_RB16(&cdxl->header[16]);
|
st->codec->height = height;
|
||||||
cdxl->video_stream_index = st->index;
|
cdxl->video_stream_index = st->index;
|
||||||
avpriv_set_pts_info(st, 63, cdxl->fps.den, cdxl->fps.num);
|
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;
|
cdxl->read_chunk = audio_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!cdxl->read_chunk)
|
||||||
|
avio_skip(pb, current_size - audio_size - video_size - CDXL_HEADER_SIZE);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user