s2 = prev->s2;
for (i = 0; i < BLOCK_SAMPLES; i++) {
d = get_sbits(&gb, 4);
- s0 = ((d * (1 << COEFF_BITS)) * scale + c->coeff[0] * s1 + c->coeff[1] * s2) >> COEFF_BITS;
+ s0 = d * scale + ((c->coeff[0] * s1 + c->coeff[1] * s2) >> COEFF_BITS);
s2 = s1;
s1 = av_clip_int16(s0);
*out++ = s1;
const uint8_t *buf = avpkt->data;
const uint8_t *buf_end = buf + avpkt->size;
int num_blocks, ch, ret;
+ size_t new_extradata_size;
+ uint8_t *new_extradata;
+
+ new_extradata = av_packet_get_side_data(avpkt, AV_PKT_DATA_NEW_EXTRADATA,
+ &new_extradata_size);
+ if (new_extradata && new_extradata_size > 0) {
+ int header_size;
+ if ((ret = ff_adx_decode_header(avctx, new_extradata,
+ new_extradata_size, &header_size,
+ c->coeff)) < 0) {
+ av_log(avctx, AV_LOG_ERROR, "error parsing new ADX extradata\n");
+ return AVERROR_INVALIDDATA;
+ }
+
+ c->eof = 0;
+ }
if (c->eof) {
*got_frame_ptr = 0;
.init = adx_decode_init,
.decode = adx_decode_frame,
.flush = adx_decode_flush,
- .capabilities = AV_CODEC_CAP_DR1,
+ .capabilities = AV_CODEC_CAP_CHANNEL_CONF |
+ AV_CODEC_CAP_DR1,
.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S16P,
AV_SAMPLE_FMT_NONE },
};