summaryrefslogtreecommitdiff
path: root/libavcodec/dvaudiodec.c
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2016-01-27 13:58:25 +0100
committerPaul B Mahol <onemda@gmail.com>2016-01-27 13:58:25 +0100
commit75a7565bcb69701823a922c6b2becb35fbd7983f (patch)
treecd3b3b0892139ad0720087e184b7ee3bcf073490 /libavcodec/dvaudiodec.c
parent74e8f4f674466d7f0b6810954c7b496286d56d6c (diff)
downloadffmpeg-75a7565bcb69701823a922c6b2becb35fbd7983f.tar.gz
avcodec/dvaudiodec: support cases when codec_tag is not set but block_align is
Support packets larger than block size, return single block size. Signed-off-by: Paul B Mahol <onemda@gmail.com>
Diffstat (limited to 'libavcodec/dvaudiodec.c')
-rw-r--r--libavcodec/dvaudiodec.c10
1 files changed, 6 insertions, 4 deletions
diff --git a/libavcodec/dvaudiodec.c b/libavcodec/dvaudiodec.c
index a0f3b191fb..0cbc2be48c 100644
--- a/libavcodec/dvaudiodec.c
+++ b/libavcodec/dvaudiodec.c
@@ -41,14 +41,16 @@ static av_cold int decode_init(AVCodecContext *avctx)
if (avctx->codec_tag == 0x0215) {
s->block_size = 7200;
- s->is_pal = 0;
} else if (avctx->codec_tag == 0x0216) {
s->block_size = 8640;
- s->is_pal = 1;
+ } else if (avctx->block_align == 7200 ||
+ avctx->block_align == 8640) {
+ s->block_size = avctx->block_align;
} else {
return AVERROR(EINVAL);
}
+ s->is_pal = s->block_size == 8640;
s->is_12bit = avctx->bits_per_raw_sample == 12;
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
avctx->channel_layout = AV_CH_LAYOUT_STEREO;
@@ -108,7 +110,7 @@ static int decode_frame(AVCodecContext *avctx, void *data,
int16_t *dst;
int ret, i;
- if (pkt->size != s->block_size)
+ if (pkt->size < s->block_size)
return AVERROR_INVALIDDATA;
frame->nb_samples = dv_get_audio_sample_count(pkt->data + 244, s->is_pal);
@@ -130,7 +132,7 @@ static int decode_frame(AVCodecContext *avctx, void *data,
*got_frame_ptr = 1;
- return pkt->size;
+ return s->block_size;
}
AVCodec ff_dvaudio_decoder = {