diff --git a/libavcodec/dca_xll.c b/libavcodec/dca_xll.c
index 1d616c2..325af29 100644
|
a
|
b
|
static int chs_parse_header(DCAXllDecoder *s, DCAXllChSet *c, DCAExssAsset *asse
|
| 143 | 143 | |
| 144 | 144 | // Storage unit width |
| 145 | 145 | c->storage_bit_res = get_bits(&s->gb, 5) + 1; |
| 146 | | if (c->storage_bit_res != 16 && c->storage_bit_res != 24) { |
| | 146 | if (c->storage_bit_res != 16 && c->storage_bit_res != 20 && c->storage_bit_res != 24) { |
| 147 | 147 | avpriv_request_sample(s->avctx, "%d-bit XLL storage resolution", c->storage_bit_res); |
| 148 | 148 | return AVERROR_PATCHWELCOME; |
| 149 | 149 | } |
| … |
… |
int ff_dca_xll_filter_frame(DCAXllDecoder *s, AVFrame *frame)
|
| 1416 | 1416 | case 16: |
| 1417 | 1417 | avctx->sample_fmt = AV_SAMPLE_FMT_S16P; |
| 1418 | 1418 | break; |
| | 1419 | case 20: |
| 1419 | 1420 | case 24: |
| 1420 | 1421 | avctx->sample_fmt = AV_SAMPLE_FMT_S32P; |
| 1421 | 1422 | break; |
| … |
… |
int ff_dca_xll_filter_frame(DCAXllDecoder *s, AVFrame *frame)
|
| 1445 | 1446 | int16_t *plane = (int16_t *)frame->extended_data[i]; |
| 1446 | 1447 | for (k = 0; k < nsamples; k++) |
| 1447 | 1448 | plane[k] = av_clip_int16(samples[k] * (1 << shift)); |
| | 1449 | } else if (p->storage_bit_res == 20) { |
| | 1450 | int32_t *plane = (int32_t *)frame->extended_data[i]; |
| | 1451 | for (k = 0; k < nsamples; k++) |
| | 1452 | plane[k] = av_clip_intp2(samples[k] * (1 << shift), 19) * (1 << 12); |
| 1448 | 1453 | } else { |
| 1449 | 1454 | int32_t *plane = (int32_t *)frame->extended_data[i]; |
| 1450 | 1455 | for (k = 0; k < nsamples; k++) |