Commit 00063843 authored by foo86's avatar foo86 Committed by James Almer

avcodec/dca: add support for 20-bit XLL

Fixes ticket #6063.
Reviewed-by: 's avatarPaul B Mahol <onemda@gmail.com>
Signed-off-by: 's avatarJames Almer <jamrial@gmail.com>
parent 20e8be0c
...@@ -143,7 +143,7 @@ static int chs_parse_header(DCAXllDecoder *s, DCAXllChSet *c, DCAExssAsset *asse ...@@ -143,7 +143,7 @@ static int chs_parse_header(DCAXllDecoder *s, DCAXllChSet *c, DCAExssAsset *asse
// Storage unit width // Storage unit width
c->storage_bit_res = get_bits(&s->gb, 5) + 1; 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); avpriv_request_sample(s->avctx, "%d-bit XLL storage resolution", c->storage_bit_res);
return AVERROR_PATCHWELCOME; return AVERROR_PATCHWELCOME;
} }
...@@ -1415,9 +1415,12 @@ int ff_dca_xll_filter_frame(DCAXllDecoder *s, AVFrame *frame) ...@@ -1415,9 +1415,12 @@ int ff_dca_xll_filter_frame(DCAXllDecoder *s, AVFrame *frame)
switch (p->storage_bit_res) { switch (p->storage_bit_res) {
case 16: case 16:
avctx->sample_fmt = AV_SAMPLE_FMT_S16P; avctx->sample_fmt = AV_SAMPLE_FMT_S16P;
shift = 16 - p->pcm_bit_res;
break; break;
case 20:
case 24: case 24:
avctx->sample_fmt = AV_SAMPLE_FMT_S32P; avctx->sample_fmt = AV_SAMPLE_FMT_S32P;
shift = 24 - p->pcm_bit_res;
break; break;
default: default:
return AVERROR(EINVAL); return AVERROR(EINVAL);
...@@ -1438,7 +1441,6 @@ int ff_dca_xll_filter_frame(DCAXllDecoder *s, AVFrame *frame) ...@@ -1438,7 +1441,6 @@ int ff_dca_xll_filter_frame(DCAXllDecoder *s, AVFrame *frame)
s->output_mask); s->output_mask);
} }
shift = p->storage_bit_res - p->pcm_bit_res;
for (i = 0; i < avctx->channels; i++) { for (i = 0; i < avctx->channels; i++) {
int32_t *samples = s->output_samples[ch_remap[i]]; int32_t *samples = s->output_samples[ch_remap[i]];
if (frame->format == AV_SAMPLE_FMT_S16P) { if (frame->format == AV_SAMPLE_FMT_S16P) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment