summaryrefslogtreecommitdiff
path: root/libavcodec
diff options
context:
space:
mode:
authorPaul B Mahol <onemda@gmail.com>2023-02-07 20:56:32 +0100
committerPaul B Mahol <onemda@gmail.com>2023-02-07 20:58:59 +0100
commitc56f5be6782014fee165d361de1f548eaac7a272 (patch)
treec846a709dc3b5bd2a97b1c95e37b521627f0877e /libavcodec
parent93a9ee7afd7bf2e019490117f1bada30724a0200 (diff)
avcodec/wavarc: fix 16bit 0CPY mode
Diffstat (limited to 'libavcodec')
-rw-r--r--libavcodec/wavarc.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/libavcodec/wavarc.c b/libavcodec/wavarc.c
index 2d6a58ffb0..b626daa66e 100644
--- a/libavcodec/wavarc.c
+++ b/libavcodec/wavarc.c
@@ -36,7 +36,6 @@ typedef struct WavArcContext {
int nb_samples;
int offset;
int align;
- int add;
int eof;
int skip;
@@ -83,19 +82,16 @@ static av_cold int wavarc_init(AVCodecContext *avctx)
case MKTAG('0','C','P','Y'):
s->nb_samples = 640;
s->offset = 0;
- s->add = 0;
break;
case MKTAG('1','D','I','F'):
s->nb_samples = 256;
s->offset = 4;
- s->add = 0x80;
break;
case MKTAG('2','S','L','P'):
case MKTAG('3','N','L','P'):
case MKTAG('4','A','L','P'):
s->nb_samples = 570;
s->offset = 70;
- s->add = 0x80;
break;
default:
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,
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);
- 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, bits);
+ switch (avctx->sample_fmt) {
+ case AV_SAMPLE_FMT_U8P:
+ 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;
}
@@ -441,7 +448,7 @@ fail:
const int *src = s->samples[ch] + s->offset;
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;
case AV_SAMPLE_FMT_S16P: