X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fdca_xll.c;h=1320aaf28ff89e0c764ef8cb2a53b39c94fc7bdc;hb=638eceed4752dbde9114718d53f199e07848f1c2;hp=1d616c298c8ef019c9edabc4f5a1bd8c2a9e6f13;hpb=af8b174711f3afff7d495ac00fe5bf9be98d3b70;p=ffmpeg diff --git a/libavcodec/dca_xll.c b/libavcodec/dca_xll.c index 1d616c298c8..1320aaf28ff 100644 --- a/libavcodec/dca_xll.c +++ b/libavcodec/dca_xll.c @@ -143,7 +143,7 @@ static int chs_parse_header(DCAXllDecoder *s, DCAXllChSet *c, DCAExssAsset *asse // Storage unit width c->storage_bit_res = get_bits(&s->gb, 5) + 1; - if (c->storage_bit_res != 16 && c->storage_bit_res != 24) { + if (c->storage_bit_res != 16 && c->storage_bit_res != 20 && c->storage_bit_res != 24) { avpriv_request_sample(s->avctx, "%d-bit XLL storage resolution", c->storage_bit_res); return AVERROR_PATCHWELCOME; } @@ -1415,9 +1415,12 @@ int ff_dca_xll_filter_frame(DCAXllDecoder *s, AVFrame *frame) switch (p->storage_bit_res) { case 16: avctx->sample_fmt = AV_SAMPLE_FMT_S16P; + shift = 16 - p->pcm_bit_res; break; + case 20: case 24: avctx->sample_fmt = AV_SAMPLE_FMT_S32P; + shift = 24 - p->pcm_bit_res; break; default: return AVERROR(EINVAL); @@ -1438,7 +1441,6 @@ int ff_dca_xll_filter_frame(DCAXllDecoder *s, AVFrame *frame) s->output_mask); } - shift = p->storage_bit_res - p->pcm_bit_res; for (i = 0; i < avctx->channels; i++) { int32_t *samples = s->output_samples[ch_remap[i]]; if (frame->format == AV_SAMPLE_FMT_S16P) {