mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
avcodec/dca: add support for 20-bit XLL
Fixes ticket #6063. Reviewed-by: Paul B Mahol <onemda@gmail.com> Signed-off-by: James Almer <jamrial@gmail.com>
This commit is contained in:
parent
20e8be0c20
commit
000638431c
@ -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)
|
|||||||
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)
|
|||||||
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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user