avcodec/wavarc: fix 16bit 0CPY mode

This commit is contained in:
Paul B Mahol 2023-02-07 20:56:32 +01:00
parent 93a9ee7afd
commit c56f5be678

View File

@ -36,7 +36,6 @@ typedef struct WavArcContext {
int nb_samples; int nb_samples;
int offset; int offset;
int align; int align;
int add;
int eof; int eof;
int skip; int skip;
@ -83,19 +82,16 @@ static av_cold int wavarc_init(AVCodecContext *avctx)
case MKTAG('0','C','P','Y'): case MKTAG('0','C','P','Y'):
s->nb_samples = 640; s->nb_samples = 640;
s->offset = 0; s->offset = 0;
s->add = 0;
break; break;
case MKTAG('1','D','I','F'): case MKTAG('1','D','I','F'):
s->nb_samples = 256; s->nb_samples = 256;
s->offset = 4; s->offset = 4;
s->add = 0x80;
break; break;
case MKTAG('2','S','L','P'): case MKTAG('2','S','L','P'):
case MKTAG('3','N','L','P'): case MKTAG('3','N','L','P'):
case MKTAG('4','A','L','P'): case MKTAG('4','A','L','P'):
s->nb_samples = 570; s->nb_samples = 570;
s->offset = 70; s->offset = 70;
s->add = 0x80;
break; break;
default: default:
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
@ -157,12 +153,23 @@ static void do_stereo(WavArcContext *s, int ch, int correlated, int len)
static int decode_0cpy(AVCodecContext *avctx, static int decode_0cpy(AVCodecContext *avctx,
WavArcContext *s, GetBitContext *gb) WavArcContext *s, GetBitContext *gb)
{ {
int bits = s->align * 8; const int bits = s->align * 8;
s->nb_samples = FFMIN(640, get_bits_left(gb) / bits); s->nb_samples = FFMIN(640, get_bits_left(gb) / bits);
for (int n = 0; n < s->nb_samples; n++) { switch (avctx->sample_fmt) {
for (int ch = 0; ch < avctx->ch_layout.nb_channels; ch++) case AV_SAMPLE_FMT_U8P:
s->samples[ch][n] = get_bits(gb, bits); for (int n = 0; n < s->nb_samples; n++) {
for (int ch = 0; ch < avctx->ch_layout.nb_channels; ch++)
s->samples[ch][n] = get_bits(gb, 8) - 0x80;
}
break;
case AV_SAMPLE_FMT_S16P:
for (int n = 0; n < s->nb_samples; n++) {
for (int ch = 0; ch < avctx->ch_layout.nb_channels; ch++)
s->samples[ch][n] = sign_extend(av_bswap16(get_bits(gb, 16)), 16);
}
break;
} }
return 0; return 0;
} }
@ -441,7 +448,7 @@ fail:
const int *src = s->samples[ch] + s->offset; const int *src = s->samples[ch] + s->offset;
for (int n = 0; n < frame->nb_samples; n++) for (int n = 0; n < frame->nb_samples; n++)
dst[n] = src[n] * (1 << s->shift) + s->add; dst[n] = src[n] * (1 << s->shift) + 0x80U;
} }
break; break;
case AV_SAMPLE_FMT_S16P: case AV_SAMPLE_FMT_S16P: