X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fwavpack.c;h=599e36ccc55bc70a86e49cd7e4623bfe9508c140;hb=cab63a8b594cdc365bb2581a12b3ac8e6dd480b2;hp=7136e7aa16b55662d11195035f0cf52def826336;hpb=7b44c9918086c6aeacf7ef9f902af38b97f43170;p=ffmpeg diff --git a/libavcodec/wavpack.c b/libavcodec/wavpack.c index 7136e7aa16b..599e36ccc55 100644 --- a/libavcodec/wavpack.c +++ b/libavcodec/wavpack.c @@ -33,6 +33,8 @@ * WavPack lossless audio decoder */ +#define WV_HEADER_SIZE 32 + #define WV_MONO 0x00000004 #define WV_JOINT_STEREO 0x00000010 #define WV_FALSE_STEREO 0x40000000 @@ -41,6 +43,10 @@ #define WV_HYBRID_SHAPE 0x00000008 #define WV_HYBRID_BITRATE 0x00000200 #define WV_HYBRID_BALANCE 0x00000400 +#define WV_INITIAL_BLOCK 0x00000800 +#define WV_FINAL_BLOCK 0x00001000 + +#define WV_SINGLE_BLOCK (WV_INITIAL_BLOCK | WV_FINAL_BLOCK) #define WV_FLT_SHIFT_ONES 0x01 #define WV_FLT_SHIFT_SAME 0x02 @@ -49,7 +55,7 @@ #define WV_FLT_ZERO_SIGN 0x10 enum WP_ID_Flags { - WP_IDF_MASK = 0x1F, + WP_IDF_MASK = 0x3F, WP_IDF_IGNORE = 0x20, WP_IDF_ODD = 0x40, WP_IDF_LONG = 0x80 @@ -69,7 +75,8 @@ enum WP_ID { WP_ID_DATA, WP_ID_CORR, WP_ID_EXTRABITS, - WP_ID_CHANINFO + WP_ID_CHANINFO, + WP_ID_SAMPLE_RATE = 0x27, }; typedef struct SavedContext { @@ -132,13 +139,16 @@ typedef struct WavpackContext { WavpackFrameContext *fdec[WV_MAX_FRAME_DECODERS]; int fdec_num; - int multichannel; - int mkv_mode; int block; int samples; int ch_offset; } WavpackContext; +static const int wv_rates[16] = { + 6000, 8000, 9600, 11025, 12000, 16000, 22050, 24000, + 32000, 44100, 48000, 64000, 88200, 96000, 192000, 0 +}; + // exponent table copied from WavPack source static const uint8_t wp_exp2_table[256] = { 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b, @@ -436,7 +446,7 @@ static float wv_get_value_float(WavpackFrameContext *s, uint32_t *crc, int S) const int max_bits = 1 + 23 + 8 + 1; const int left_bits = get_bits_left(&s->gb_extra_bits); - if (left_bits + 8 * FF_INPUT_BUFFER_PADDING_SIZE < max_bits) + if (left_bits + 8 * AV_INPUT_BUFFER_PADDING_SIZE < max_bits) return 0.0; } @@ -518,7 +528,7 @@ static inline int wv_check_crc(WavpackFrameContext *s, uint32_t crc, } static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, - void *dst, const int type) + void *dst_l, void *dst_r, const int type) { int i, j, count = 0; int last, t; @@ -526,10 +536,12 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, int pos = s->pos; uint32_t crc = s->sc.crc; uint32_t crc_extra_bits = s->extra_sc.crc; - int16_t *dst16 = dst; - int32_t *dst32 = dst; - float *dstfl = dst; - const int channel_pad = s->avctx->channels - 2; + int16_t *dst16_l = dst_l; + int16_t *dst16_r = dst_r; + int32_t *dst32_l = dst_l; + int32_t *dst32_r = dst_r; + float *dstfl_l = dst_l; + float *dstfl_r = dst_r; s->one = s->zero = s->zeroes = 0; do { @@ -558,7 +570,7 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, B = s->decorr[i].samplesB[pos]; j = (pos + t) & 7; } - if (type != AV_SAMPLE_FMT_S16) { + if (type != AV_SAMPLE_FMT_S16P) { L2 = L + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10); R2 = R + ((s->decorr[i].weightB * (int64_t)B + 512) >> 10); } else { @@ -572,13 +584,13 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, s->decorr[i].samplesA[j] = L = L2; s->decorr[i].samplesB[j] = R = R2; } else if (t == -1) { - if (type != AV_SAMPLE_FMT_S16) + if (type != AV_SAMPLE_FMT_S16P) L2 = L + ((s->decorr[i].weightA * (int64_t)s->decorr[i].samplesA[0] + 512) >> 10); else L2 = L + ((s->decorr[i].weightA * s->decorr[i].samplesA[0] + 512) >> 10); UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, s->decorr[i].samplesA[0], L); L = L2; - if (type != AV_SAMPLE_FMT_S16) + if (type != AV_SAMPLE_FMT_S16P) R2 = R + ((s->decorr[i].weightB * (int64_t)L2 + 512) >> 10); else R2 = R + ((s->decorr[i].weightB * L2 + 512) >> 10); @@ -586,7 +598,7 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, R = R2; s->decorr[i].samplesA[0] = R; } else { - if (type != AV_SAMPLE_FMT_S16) + if (type != AV_SAMPLE_FMT_S16P) R2 = R + ((s->decorr[i].weightB * (int64_t)s->decorr[i].samplesB[0] + 512) >> 10); else R2 = R + ((s->decorr[i].weightB * s->decorr[i].samplesB[0] + 512) >> 10); @@ -598,7 +610,7 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, s->decorr[i].samplesA[0] = R; } - if (type != AV_SAMPLE_FMT_S16) + if (type != AV_SAMPLE_FMT_S16P) L2 = L + ((s->decorr[i].weightA * (int64_t)R2 + 512) >> 10); else L2 = L + ((s->decorr[i].weightA * R2 + 512) >> 10); @@ -612,18 +624,15 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, L += (R -= (L >> 1)); crc = (crc * 3 + L) * 3 + R; - if (type == AV_SAMPLE_FMT_FLT) { - *dstfl++ = wv_get_value_float(s, &crc_extra_bits, L); - *dstfl++ = wv_get_value_float(s, &crc_extra_bits, R); - dstfl += channel_pad; - } else if (type == AV_SAMPLE_FMT_S32) { - *dst32++ = wv_get_value_integer(s, &crc_extra_bits, L); - *dst32++ = wv_get_value_integer(s, &crc_extra_bits, R); - dst32 += channel_pad; + if (type == AV_SAMPLE_FMT_FLTP) { + *dstfl_l++ = wv_get_value_float(s, &crc_extra_bits, L); + *dstfl_r++ = wv_get_value_float(s, &crc_extra_bits, R); + } else if (type == AV_SAMPLE_FMT_S32P) { + *dst32_l++ = wv_get_value_integer(s, &crc_extra_bits, L); + *dst32_r++ = wv_get_value_integer(s, &crc_extra_bits, R); } else { - *dst16++ = wv_get_value_integer(s, &crc_extra_bits, L); - *dst16++ = wv_get_value_integer(s, &crc_extra_bits, R); - dst16 += channel_pad; + *dst16_l++ = wv_get_value_integer(s, &crc_extra_bits, L); + *dst16_r++ = wv_get_value_integer(s, &crc_extra_bits, R); } count++; } while (!last && count < s->samples); @@ -633,7 +642,7 @@ static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, wv_check_crc(s, crc, crc_extra_bits)) return AVERROR_INVALIDDATA; - return count * 2; + return 0; } static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, @@ -648,7 +657,6 @@ static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, int16_t *dst16 = dst; int32_t *dst32 = dst; float *dstfl = dst; - const int channel_stride = s->avctx->channels; s->one = s->zero = s->zeroes = 0; do { @@ -669,7 +677,7 @@ static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, A = s->decorr[i].samplesA[pos]; j = (pos + t) & 7; } - if (type != AV_SAMPLE_FMT_S16) + if (type != AV_SAMPLE_FMT_S16P) S = T + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10); else S = T + ((s->decorr[i].weightA * A + 512) >> 10); @@ -680,25 +688,24 @@ static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, pos = (pos + 1) & 7; crc = crc * 3 + S; - if (type == AV_SAMPLE_FMT_FLT) { - *dstfl = wv_get_value_float(s, &crc_extra_bits, S); - dstfl += channel_stride; - } else if (type == AV_SAMPLE_FMT_S32) { - *dst32 = wv_get_value_integer(s, &crc_extra_bits, S); - dst32 += channel_stride; + if (type == AV_SAMPLE_FMT_FLTP) { + *dstfl++ = wv_get_value_float(s, &crc_extra_bits, S); + } else if (type == AV_SAMPLE_FMT_S32P) { + *dst32++ = wv_get_value_integer(s, &crc_extra_bits, S); } else { - *dst16 = wv_get_value_integer(s, &crc_extra_bits, S); - dst16 += channel_stride; + *dst16++ = wv_get_value_integer(s, &crc_extra_bits, S); } count++; } while (!last && count < s->samples); wv_reset_saved_context(s); - if ((s->avctx->err_recognition & AV_EF_CRCCHECK) && - wv_check_crc(s, crc, crc_extra_bits)) - return AVERROR_INVALIDDATA; + if (s->avctx->err_recognition & AV_EF_CRCCHECK) { + int ret = wv_check_crc(s, crc, crc_extra_bits); + if (ret < 0 && s->avctx->err_recognition & AV_EF_EXPLODE) + return ret; + } - return count; + return 0; } static av_cold int wv_alloc_frame_context(WavpackContext *c) @@ -721,23 +728,6 @@ static av_cold int wavpack_decode_init(AVCodecContext *avctx) WavpackContext *s = avctx->priv_data; s->avctx = avctx; - if (avctx->bits_per_coded_sample <= 16) - avctx->sample_fmt = AV_SAMPLE_FMT_S16; - else - avctx->sample_fmt = AV_SAMPLE_FMT_S32; - if (avctx->channels <= 2 && !avctx->channel_layout) - avctx->channel_layout = (avctx->channels == 2) ? AV_CH_LAYOUT_STEREO - : AV_CH_LAYOUT_MONO; - - s->multichannel = avctx->channels > 2; - /* lavf demuxer does not provide extradata, Matroska stores 0x403 - * there, use this to detect decoding mode for multichannel */ - s->mkv_mode = 0; - if (s->multichannel && avctx->extradata && avctx->extradata_size == 2) { - int ver = AV_RL16(avctx->extradata); - if (ver >= 0x402 && ver <= 0x410) - s->mkv_mode = 1; - } s->fdec_num = 0; @@ -757,23 +747,18 @@ static av_cold int wavpack_decode_end(AVCodecContext *avctx) } static int wavpack_decode_block(AVCodecContext *avctx, int block_no, - void *data, int *got_frame_ptr, - const uint8_t *buf, int buf_size) + AVFrame *frame, const uint8_t *buf, int buf_size) { WavpackContext *wc = avctx->priv_data; WavpackFrameContext *s; GetByteContext gb; - void *samples = data; - int samplecount; + void *samples_l, *samples_r; + int ret; int got_terms = 0, got_weights = 0, got_samples = 0, got_entropy = 0, got_bs = 0, got_float = 0, got_hybrid = 0; int i, j, id, size, ssize, weights, t; - int bpp, chan, chmask, orig_bpp; - - if (buf_size == 0) { - *got_frame_ptr = 0; - return 0; - } + int bpp, chan = 0, chmask = 0, orig_bpp, sample_rate = 0; + int multiblock; if (block_no >= wc->fdec_num && wv_alloc_frame_context(wc) < 0) { av_log(avctx, AV_LOG_ERROR, "Error creating frame decode context\n"); @@ -795,22 +780,16 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, bytestream2_init(&gb, buf, buf_size); - if (!wc->mkv_mode) { - s->samples = bytestream2_get_le32(&gb); - if (s->samples != wc->samples) - return AVERROR_INVALIDDATA; - - if (!s->samples) { - *got_frame_ptr = 0; - return 0; - } - } else { - s->samples = wc->samples; + s->samples = bytestream2_get_le32(&gb); + if (s->samples != wc->samples) { + av_log(avctx, AV_LOG_ERROR, "Mismatching number of samples in " + "a sequence: %d and %d\n", wc->samples, s->samples); + return AVERROR_INVALIDDATA; } s->frame_flags = bytestream2_get_le32(&gb); bpp = av_get_bytes_per_sample(avctx->sample_fmt); - samples = (uint8_t *)samples + bpp * wc->ch_offset; orig_bpp = ((s->frame_flags & 0x03) + 1) << 3; + multiblock = (s->frame_flags & WV_SINGLE_BLOCK) != WV_SINGLE_BLOCK; s->stereo = !(s->frame_flags & WV_MONO); s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo; @@ -822,11 +801,6 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, s->hybrid_minclip = ((-1LL << (orig_bpp - 1))); s->CRC = bytestream2_get_le32(&gb); - if (wc->mkv_mode) - bytestream2_skip(&gb, 4); // skip block size; - - wc->ch_offset += 1 + s->stereo; - // parse metadata blocks while (bytestream2_get_bytes_left(&gb)) { id = bytestream2_get_byte(&gb); @@ -849,10 +823,6 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, "Block size %i is out of bounds\n", size); break; } - if (id & WP_IDF_IGNORE) { - bytestream2_skip(&gb, ssize); - continue; - } switch (id & WP_IDF_MASK) { case WP_ID_DECTERMS: if (size > MAX_TERMS) { @@ -1070,15 +1040,13 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, chan = avctx->channels; chmask = avctx->channel_layout; } - if (chan != avctx->channels) { - av_log(avctx, AV_LOG_ERROR, - "Block reports total %d channels, " - "decoder believes it's %d channels\n", - chan, avctx->channels); + break; + case WP_ID_SAMPLE_RATE: + if (size != 3) { + av_log(avctx, AV_LOG_ERROR, "Invalid custom sample rate.\n"); return AVERROR_INVALIDDATA; } - if (!avctx->channel_layout) - avctx->channel_layout = chmask; + sample_rate = bytestream2_get_le24(&gb); break; default: bytestream2_skip(&gb, size); @@ -1111,11 +1079,11 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n"); return AVERROR_INVALIDDATA; } - if (!got_float && avctx->sample_fmt == AV_SAMPLE_FMT_FLT) { + if (!got_float && avctx->sample_fmt == AV_SAMPLE_FMT_FLTP) { av_log(avctx, AV_LOG_ERROR, "Float information not found\n"); return AVERROR_INVALIDDATA; } - if (s->got_extra_bits && avctx->sample_fmt != AV_SAMPLE_FMT_FLT) { + if (s->got_extra_bits && avctx->sample_fmt != AV_SAMPLE_FMT_FLTP) { const int size = get_bits_left(&s->gb_extra_bits); const int wanted = s->samples * s->extra_bits << s->stereo_in; if (size < wanted) { @@ -1124,64 +1092,61 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, } } - if (s->stereo_in) { - if (avctx->sample_fmt == AV_SAMPLE_FMT_S16) - samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_S16); - else if (avctx->sample_fmt == AV_SAMPLE_FMT_S32) - samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_S32); - else - samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_FLT); - - if (samplecount < 0) - return samplecount; - - samplecount >>= 1; - } else { - const int channel_stride = avctx->channels; - - if (avctx->sample_fmt == AV_SAMPLE_FMT_S16) - samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_S16); - else if (avctx->sample_fmt == AV_SAMPLE_FMT_S32) - samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_S32); - else - samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_FLT); - - if (samplecount < 0) - return samplecount; - - if (s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S16) { - int16_t *dst = (int16_t *)samples + 1; - int16_t *src = (int16_t *)samples; - int cnt = samplecount; - while (cnt--) { - *dst = *src; - src += channel_stride; - dst += channel_stride; - } - } else if (s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S32) { - int32_t *dst = (int32_t *)samples + 1; - int32_t *src = (int32_t *)samples; - int cnt = samplecount; - while (cnt--) { - *dst = *src; - src += channel_stride; - dst += channel_stride; - } - } else if (s->stereo) { - float *dst = (float *)samples + 1; - float *src = (float *)samples; - int cnt = samplecount; - while (cnt--) { - *dst = *src; - src += channel_stride; - dst += channel_stride; + if (!wc->ch_offset) { + int sr = (s->frame_flags >> 23) & 0xf; + if (sr == 0xf) { + if (!sample_rate) { + av_log(avctx, AV_LOG_ERROR, "Custom sample rate missing.\n"); + return AVERROR_INVALIDDATA; } + avctx->sample_rate = sample_rate; + } else + avctx->sample_rate = wv_rates[sr]; + + if (multiblock) { + if (chan) + avctx->channels = chan; + if (chmask) + avctx->channel_layout = chmask; + } else { + avctx->channels = s->stereo ? 2 : 1; + avctx->channel_layout = s->stereo ? AV_CH_LAYOUT_STEREO : + AV_CH_LAYOUT_MONO; + } + + /* get output buffer */ + frame->nb_samples = s->samples; + if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) { + av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); + return ret; } } - *got_frame_ptr = 1; + if (wc->ch_offset + s->stereo >= avctx->channels) { + av_log(avctx, AV_LOG_WARNING, "Too many channels coded in a packet.\n"); + return (avctx->err_recognition & AV_EF_EXPLODE) ? AVERROR_INVALIDDATA : 0; + } + + samples_l = frame->extended_data[wc->ch_offset]; + if (s->stereo) + samples_r = frame->extended_data[wc->ch_offset + 1]; + + wc->ch_offset += 1 + s->stereo; - return samplecount * bpp; + if (s->stereo_in) { + ret = wv_unpack_stereo(s, &s->gb, samples_l, samples_r, avctx->sample_fmt); + if (ret < 0) + return ret; + } else { + ret = wv_unpack_mono(s, &s->gb, samples_l, avctx->sample_fmt); + if (ret < 0) + return ret; + + if (s->stereo) + memcpy(samples_r, samples_l, bpp * s->samples); + } + + return 0; } static void wavpack_decode_flush(AVCodecContext *avctx) @@ -1201,28 +1166,16 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data, int buf_size = avpkt->size; AVFrame *frame = data; int frame_size, ret, frame_flags; - int samplecount = 0; - if (avpkt->size < 12 + s->multichannel * 4) + if (avpkt->size <= WV_HEADER_SIZE) return AVERROR_INVALIDDATA; s->block = 0; s->ch_offset = 0; /* determine number of samples */ - if (s->mkv_mode) { - s->samples = AV_RL32(buf); - buf += 4; - frame_flags = AV_RL32(buf); - } else { - if (s->multichannel) { - s->samples = AV_RL32(buf + 4); - frame_flags = AV_RL32(buf + 8); - } else { - s->samples = AV_RL32(buf); - frame_flags = AV_RL32(buf + 4); - } - } + s->samples = AV_RL32(buf + 20); + frame_flags = AV_RL32(buf + 24); if (s->samples <= 0) { av_log(avctx, AV_LOG_ERROR, "Invalid number of samples: %d\n", s->samples); @@ -1230,58 +1183,50 @@ static int wavpack_decode_frame(AVCodecContext *avctx, void *data, } if (frame_flags & 0x80) { - avctx->sample_fmt = AV_SAMPLE_FMT_FLT; + avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; } else if ((frame_flags & 0x03) <= 1) { - avctx->sample_fmt = AV_SAMPLE_FMT_S16; + avctx->sample_fmt = AV_SAMPLE_FMT_S16P; } else { - avctx->sample_fmt = AV_SAMPLE_FMT_S32; + avctx->sample_fmt = AV_SAMPLE_FMT_S32P; avctx->bits_per_raw_sample = ((frame_flags & 0x03) + 1) << 3; } - /* get output buffer */ - frame->nb_samples = s->samples; - if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) { - av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n"); - return ret; - } - while (buf_size > 0) { - if (!s->multichannel) { - frame_size = buf_size; - } else { - if (!s->mkv_mode) { - frame_size = AV_RL32(buf) - 12; - buf += 4; - buf_size -= 4; - } else { - if (buf_size < 12) // MKV files can have zero flags after last block - break; - frame_size = AV_RL32(buf + 8) + 12; - } - } - if (frame_size < 0 || frame_size > buf_size) { + if (buf_size <= WV_HEADER_SIZE) + break; + frame_size = AV_RL32(buf + 4) - 12; + buf += 20; + buf_size -= 20; + if (frame_size <= 0 || frame_size > buf_size) { av_log(avctx, AV_LOG_ERROR, "Block %d has invalid size (size %d vs. %d bytes left)\n", s->block, frame_size, buf_size); wavpack_decode_flush(avctx); return AVERROR_INVALIDDATA; } - if ((samplecount = wavpack_decode_block(avctx, s->block, - frame->data[0], got_frame_ptr, - buf, frame_size)) < 0) { + if ((ret = wavpack_decode_block(avctx, s->block, + frame, buf, frame_size)) < 0) { wavpack_decode_flush(avctx); - return samplecount; + return ret; } s->block++; buf += frame_size; buf_size -= frame_size; } + if (s->ch_offset != avctx->channels) { + av_log(avctx, AV_LOG_ERROR, "Not enough channels coded in a packet.\n"); + return AVERROR_INVALIDDATA; + } + + *got_frame_ptr = 1; + return avpkt->size; } AVCodec ff_wavpack_decoder = { .name = "wavpack", + .long_name = NULL_IF_CONFIG_SMALL("WavPack"), .type = AVMEDIA_TYPE_AUDIO, .id = AV_CODEC_ID_WAVPACK, .priv_data_size = sizeof(WavpackContext), @@ -1289,6 +1234,5 @@ AVCodec ff_wavpack_decoder = { .close = wavpack_decode_end, .decode = wavpack_decode_frame, .flush = wavpack_decode_flush, - .capabilities = CODEC_CAP_DR1, - .long_name = NULL_IF_CONFIG_SMALL("WavPack"), + .capabilities = AV_CODEC_CAP_DR1, };