2 * WavPack lossless audio decoder
3 * Copyright (c) 2006,2011 Konstantin Shishkov
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #define BITSTREAM_READER_LE
24 #include "libavutil/channel_layout.h"
29 #include "bytestream.h"
33 * WavPack lossless audio decoder
36 #define WV_MONO 0x00000004
37 #define WV_JOINT_STEREO 0x00000010
38 #define WV_FALSE_STEREO 0x40000000
40 #define WV_HYBRID_MODE 0x00000008
41 #define WV_HYBRID_SHAPE 0x00000008
42 #define WV_HYBRID_BITRATE 0x00000200
43 #define WV_HYBRID_BALANCE 0x00000400
45 #define WV_FLT_SHIFT_ONES 0x01
46 #define WV_FLT_SHIFT_SAME 0x02
47 #define WV_FLT_SHIFT_SENT 0x04
48 #define WV_FLT_ZERO_SENT 0x08
49 #define WV_FLT_ZERO_SIGN 0x10
75 typedef struct SavedContext {
84 typedef struct Decorr {
93 typedef struct WvChannel {
95 int slow_level, error_limit;
96 int bitrate_acc, bitrate_delta;
99 typedef struct WavpackFrameContext {
100 AVCodecContext *avctx;
102 int stereo, stereo_in;
107 uint32_t crc_extra_bits;
108 GetBitContext gb_extra_bits;
109 int data_size; // in bits
112 Decorr decorr[MAX_TERMS];
113 int zero, one, zeroes;
117 int hybrid, hybrid_bitrate;
118 int hybrid_maxclip, hybrid_minclip;
124 SavedContext sc, extra_sc;
125 } WavpackFrameContext;
127 #define WV_MAX_FRAME_DECODERS 14
129 typedef struct WavpackContext {
130 AVCodecContext *avctx;
132 WavpackFrameContext *fdec[WV_MAX_FRAME_DECODERS];
142 // exponent table copied from WavPack source
143 static const uint8_t wp_exp2_table[256] = {
144 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b,
145 0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15, 0x16, 0x16,
146 0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20, 0x21, 0x22, 0x23,
147 0x24, 0x24, 0x25, 0x26, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
148 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3a, 0x3b, 0x3c, 0x3d,
149 0x3e, 0x3f, 0x40, 0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x48, 0x49, 0x4a, 0x4b,
150 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
151 0x5b, 0x5c, 0x5d, 0x5e, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
152 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
153 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a,
154 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
155 0x9c, 0x9d, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad,
156 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0,
157 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc8, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf, 0xd0, 0xd2, 0xd3, 0xd4,
158 0xd6, 0xd7, 0xd8, 0xd9, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe8, 0xe9,
159 0xea, 0xec, 0xed, 0xee, 0xf0, 0xf1, 0xf2, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xff
162 static const uint8_t wp_log2_table [] = {
163 0x00, 0x01, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15,
164 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a,
165 0x2c, 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e,
166 0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
167 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
168 0x64, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75,
169 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
170 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
171 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4,
172 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb2,
173 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc0,
174 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcd, 0xce,
175 0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd8, 0xd9, 0xda, 0xdb,
176 0xdc, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe4, 0xe5, 0xe6, 0xe7, 0xe7,
177 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xee, 0xef, 0xf0, 0xf1, 0xf1, 0xf2, 0xf3, 0xf4,
178 0xf4, 0xf5, 0xf6, 0xf7, 0xf7, 0xf8, 0xf9, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xff, 0xff
181 static av_always_inline int wp_exp2(int16_t val)
190 res = wp_exp2_table[val & 0xFF] | 0x100;
192 res = (val > 9) ? (res << (val - 9)) : (res >> (9 - val));
193 return neg ? -res : res;
196 static av_always_inline int wp_log2(int32_t val)
205 bits = av_log2(val) + 1;
207 return (bits << 8) + wp_log2_table[(val << (9 - bits)) & 0xFF];
209 return (bits << 8) + wp_log2_table[(val >> (bits - 9)) & 0xFF];
212 #define LEVEL_DECAY(a) ((a + 0x80) >> 8)
214 // macros for manipulating median values
215 #define GET_MED(n) ((c->median[n] >> 4) + 1)
216 #define DEC_MED(n) c->median[n] -= ((c->median[n] + (128 >> n) - 2) / (128 >> n)) * 2
217 #define INC_MED(n) c->median[n] += ((c->median[n] + (128 >> n) ) / (128 >> n)) * 5
219 // macros for applying weight
220 #define UPDATE_WEIGHT_CLIP(weight, delta, samples, in) \
221 if (samples && in) { \
222 if ((samples ^ in) < 0) { \
224 if (weight < -1024) \
233 static av_always_inline int get_tail(GetBitContext *gb, int k)
240 e = (1 << (p + 1)) - k - 1;
241 res = p ? get_bits(gb, p) : 0;
243 res = (res << 1) - e + get_bits1(gb);
247 static void update_error_limit(WavpackFrameContext *ctx)
251 for (i = 0; i <= ctx->stereo_in; i++) {
252 ctx->ch[i].bitrate_acc += ctx->ch[i].bitrate_delta;
253 br[i] = ctx->ch[i].bitrate_acc >> 16;
254 sl[i] = LEVEL_DECAY(ctx->ch[i].slow_level);
256 if (ctx->stereo_in && ctx->hybrid_bitrate) {
257 int balance = (sl[1] - sl[0] + br[1] + 1) >> 1;
258 if (balance > br[0]) {
261 } else if (-balance > br[0]) {
265 br[1] = br[0] + balance;
266 br[0] = br[0] - balance;
269 for (i = 0; i <= ctx->stereo_in; i++) {
270 if (ctx->hybrid_bitrate) {
271 if (sl[i] - br[i] > -0x100)
272 ctx->ch[i].error_limit = wp_exp2(sl[i] - br[i] + 0x100);
274 ctx->ch[i].error_limit = 0;
276 ctx->ch[i].error_limit = wp_exp2(br[i]);
281 static int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb,
282 int channel, int *last)
285 int sign, base, add, ret;
286 WvChannel *c = &ctx->ch[channel];
290 if ((ctx->ch[0].median[0] < 2U) && (ctx->ch[1].median[0] < 2U) &&
291 !ctx->zero && !ctx->one) {
295 c->slow_level -= LEVEL_DECAY(c->slow_level);
299 t = get_unary_0_33(gb);
301 if (get_bits_left(gb) < t - 1)
303 t = get_bits(gb, t - 1) | (1 << (t - 1));
305 if (get_bits_left(gb) < 0)
310 memset(ctx->ch[0].median, 0, sizeof(ctx->ch[0].median));
311 memset(ctx->ch[1].median, 0, sizeof(ctx->ch[1].median));
312 c->slow_level -= LEVEL_DECAY(c->slow_level);
322 t = get_unary_0_33(gb);
323 if (get_bits_left(gb) < 0)
326 t2 = get_unary_0_33(gb);
328 if (get_bits_left(gb) < 0)
332 if (get_bits_left(gb) < t2 - 1)
334 t += get_bits(gb, t2 - 1) | (1 << (t2 - 1));
345 ctx->zero = !ctx->one;
348 if (ctx->hybrid && !channel)
349 update_error_limit(ctx);
353 add = GET_MED(0) - 1;
357 add = GET_MED(1) - 1;
361 base = GET_MED(0) + GET_MED(1);
362 add = GET_MED(2) - 1;
367 base = GET_MED(0) + GET_MED(1) + GET_MED(2) * (t - 2);
368 add = GET_MED(2) - 1;
373 if (!c->error_limit) {
374 ret = base + get_tail(gb, add);
375 if (get_bits_left(gb) <= 0)
378 int mid = (base * 2 + add + 1) >> 1;
379 while (add > c->error_limit) {
380 if (get_bits_left(gb) <= 0)
386 add = mid - base - 1;
387 mid = (base * 2 + add + 1) >> 1;
391 sign = get_bits1(gb);
392 if (ctx->hybrid_bitrate)
393 c->slow_level += wp_log2(ret) - LEVEL_DECAY(c->slow_level);
394 return sign ? ~ret : ret;
401 static inline int wv_get_value_integer(WavpackFrameContext *s, uint32_t *crc,
409 if (s->got_extra_bits &&
410 get_bits_left(&s->gb_extra_bits) >= s->extra_bits) {
411 S |= get_bits(&s->gb_extra_bits, s->extra_bits);
412 *crc = *crc * 9 + (S & 0xffff) * 3 + ((unsigned)S >> 16);
416 bit = (S & s->and) | s->or;
417 bit = ((S + bit) << s->shift) - bit;
420 bit = av_clip(bit, s->hybrid_minclip, s->hybrid_maxclip);
422 return bit << s->post_shift;
425 static float wv_get_value_float(WavpackFrameContext *s, uint32_t *crc, int S)
433 int exp = s->float_max_exp;
435 if (s->got_extra_bits) {
436 const int max_bits = 1 + 23 + 8 + 1;
437 const int left_bits = get_bits_left(&s->gb_extra_bits);
439 if (left_bits + 8 * FF_INPUT_BUFFER_PADDING_SIZE < max_bits)
444 S <<= s->float_shift;
448 if (S >= 0x1000000) {
449 if (s->got_extra_bits && get_bits1(&s->gb_extra_bits))
450 S = get_bits(&s->gb_extra_bits, 23);
455 int shift = 23 - av_log2(S);
456 exp = s->float_max_exp;
463 if ((s->float_flag & WV_FLT_SHIFT_ONES) ||
464 (s->got_extra_bits &&
465 (s->float_flag & WV_FLT_SHIFT_SAME) &&
466 get_bits1(&s->gb_extra_bits))) {
467 S |= (1 << shift) - 1;
468 } else if (s->got_extra_bits &&
469 (s->float_flag & WV_FLT_SHIFT_SENT)) {
470 S |= get_bits(&s->gb_extra_bits, shift);
474 exp = s->float_max_exp;
480 if (s->got_extra_bits && (s->float_flag & WV_FLT_ZERO_SENT)) {
481 if (get_bits1(&s->gb_extra_bits)) {
482 S = get_bits(&s->gb_extra_bits, 23);
483 if (s->float_max_exp >= 25)
484 exp = get_bits(&s->gb_extra_bits, 8);
485 sign = get_bits1(&s->gb_extra_bits);
487 if (s->float_flag & WV_FLT_ZERO_SIGN)
488 sign = get_bits1(&s->gb_extra_bits);
493 *crc = *crc * 27 + S * 9 + exp * 3 + sign;
495 value.u = (sign << 31) | (exp << 23) | S;
499 static void wv_reset_saved_context(WavpackFrameContext *s)
502 s->sc.crc = s->extra_sc.crc = 0xFFFFFFFF;
505 static inline int wv_check_crc(WavpackFrameContext *s, uint32_t crc,
506 uint32_t crc_extra_bits)
509 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
510 return AVERROR_INVALIDDATA;
512 if (s->got_extra_bits && crc_extra_bits != s->crc_extra_bits) {
513 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n");
514 return AVERROR_INVALIDDATA;
520 static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb,
521 void *dst, const int type)
525 int A, B, L, L2, R, R2;
527 uint32_t crc = s->sc.crc;
528 uint32_t crc_extra_bits = s->extra_sc.crc;
529 int16_t *dst16 = dst;
530 int32_t *dst32 = dst;
532 const int channel_pad = s->avctx->channels - 2;
534 s->one = s->zero = s->zeroes = 0;
536 L = wv_get_value(s, gb, 0, &last);
539 R = wv_get_value(s, gb, 1, &last);
542 for (i = 0; i < s->terms; i++) {
543 t = s->decorr[i].value;
547 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
548 B = 2 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1];
550 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
551 B = (3 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1]) >> 1;
553 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
554 s->decorr[i].samplesB[1] = s->decorr[i].samplesB[0];
557 A = s->decorr[i].samplesA[pos];
558 B = s->decorr[i].samplesB[pos];
561 if (type != AV_SAMPLE_FMT_S16) {
562 L2 = L + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
563 R2 = R + ((s->decorr[i].weightB * (int64_t)B + 512) >> 10);
565 L2 = L + ((s->decorr[i].weightA * A + 512) >> 10);
566 R2 = R + ((s->decorr[i].weightB * B + 512) >> 10);
569 s->decorr[i].weightA -= ((((L ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
571 s->decorr[i].weightB -= ((((R ^ B) >> 30) & 2) - 1) * s->decorr[i].delta;
572 s->decorr[i].samplesA[j] = L = L2;
573 s->decorr[i].samplesB[j] = R = R2;
574 } else if (t == -1) {
575 if (type != AV_SAMPLE_FMT_S16)
576 L2 = L + ((s->decorr[i].weightA * (int64_t)s->decorr[i].samplesA[0] + 512) >> 10);
578 L2 = L + ((s->decorr[i].weightA * s->decorr[i].samplesA[0] + 512) >> 10);
579 UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, s->decorr[i].samplesA[0], L);
581 if (type != AV_SAMPLE_FMT_S16)
582 R2 = R + ((s->decorr[i].weightB * (int64_t)L2 + 512) >> 10);
584 R2 = R + ((s->decorr[i].weightB * L2 + 512) >> 10);
585 UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, L2, R);
587 s->decorr[i].samplesA[0] = R;
589 if (type != AV_SAMPLE_FMT_S16)
590 R2 = R + ((s->decorr[i].weightB * (int64_t)s->decorr[i].samplesB[0] + 512) >> 10);
592 R2 = R + ((s->decorr[i].weightB * s->decorr[i].samplesB[0] + 512) >> 10);
593 UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, s->decorr[i].samplesB[0], R);
597 R2 = s->decorr[i].samplesA[0];
598 s->decorr[i].samplesA[0] = R;
601 if (type != AV_SAMPLE_FMT_S16)
602 L2 = L + ((s->decorr[i].weightA * (int64_t)R2 + 512) >> 10);
604 L2 = L + ((s->decorr[i].weightA * R2 + 512) >> 10);
605 UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, R2, L);
607 s->decorr[i].samplesB[0] = L;
612 L += (R -= (L >> 1));
613 crc = (crc * 3 + L) * 3 + R;
615 if (type == AV_SAMPLE_FMT_FLT) {
616 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, L);
617 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, R);
618 dstfl += channel_pad;
619 } else if (type == AV_SAMPLE_FMT_S32) {
620 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, L);
621 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, R);
622 dst32 += channel_pad;
624 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, L);
625 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, R);
626 dst16 += channel_pad;
629 } while (!last && count < s->samples);
631 wv_reset_saved_context(s);
632 if ((s->avctx->err_recognition & AV_EF_CRCCHECK) &&
633 wv_check_crc(s, crc, crc_extra_bits))
634 return AVERROR_INVALIDDATA;
639 static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb,
640 void *dst, const int type)
646 uint32_t crc = s->sc.crc;
647 uint32_t crc_extra_bits = s->extra_sc.crc;
648 int16_t *dst16 = dst;
649 int32_t *dst32 = dst;
651 const int channel_stride = s->avctx->channels;
653 s->one = s->zero = s->zeroes = 0;
655 T = wv_get_value(s, gb, 0, &last);
659 for (i = 0; i < s->terms; i++) {
660 t = s->decorr[i].value;
663 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
665 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
666 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
669 A = s->decorr[i].samplesA[pos];
672 if (type != AV_SAMPLE_FMT_S16)
673 S = T + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
675 S = T + ((s->decorr[i].weightA * A + 512) >> 10);
677 s->decorr[i].weightA -= ((((T ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
678 s->decorr[i].samplesA[j] = T = S;
683 if (type == AV_SAMPLE_FMT_FLT) {
684 *dstfl = wv_get_value_float(s, &crc_extra_bits, S);
685 dstfl += channel_stride;
686 } else if (type == AV_SAMPLE_FMT_S32) {
687 *dst32 = wv_get_value_integer(s, &crc_extra_bits, S);
688 dst32 += channel_stride;
690 *dst16 = wv_get_value_integer(s, &crc_extra_bits, S);
691 dst16 += channel_stride;
694 } while (!last && count < s->samples);
696 wv_reset_saved_context(s);
697 if ((s->avctx->err_recognition & AV_EF_CRCCHECK) &&
698 wv_check_crc(s, crc, crc_extra_bits))
699 return AVERROR_INVALIDDATA;
704 static av_cold int wv_alloc_frame_context(WavpackContext *c)
706 if (c->fdec_num == WV_MAX_FRAME_DECODERS)
709 c->fdec[c->fdec_num] = av_mallocz(sizeof(**c->fdec));
710 if (!c->fdec[c->fdec_num])
713 c->fdec[c->fdec_num - 1]->avctx = c->avctx;
714 wv_reset_saved_context(c->fdec[c->fdec_num - 1]);
719 static av_cold int wavpack_decode_init(AVCodecContext *avctx)
721 WavpackContext *s = avctx->priv_data;
724 if (avctx->bits_per_coded_sample <= 16)
725 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
727 avctx->sample_fmt = AV_SAMPLE_FMT_S32;
728 if (avctx->channels <= 2 && !avctx->channel_layout)
729 avctx->channel_layout = (avctx->channels == 2) ? AV_CH_LAYOUT_STEREO
732 s->multichannel = avctx->channels > 2;
733 /* lavf demuxer does not provide extradata, Matroska stores 0x403
734 * there, use this to detect decoding mode for multichannel */
736 if (s->multichannel && avctx->extradata && avctx->extradata_size == 2) {
737 int ver = AV_RL16(avctx->extradata);
738 if (ver >= 0x402 && ver <= 0x410)
747 static av_cold int wavpack_decode_end(AVCodecContext *avctx)
749 WavpackContext *s = avctx->priv_data;
752 for (i = 0; i < s->fdec_num; i++)
753 av_freep(&s->fdec[i]);
759 static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
760 void *data, int *got_frame_ptr,
761 const uint8_t *buf, int buf_size)
763 WavpackContext *wc = avctx->priv_data;
764 WavpackFrameContext *s;
766 void *samples = data;
768 int got_terms = 0, got_weights = 0, got_samples = 0,
769 got_entropy = 0, got_bs = 0, got_float = 0, got_hybrid = 0;
770 int i, j, id, size, ssize, weights, t;
771 int bpp, chan, chmask, orig_bpp;
778 if (block_no >= wc->fdec_num && wv_alloc_frame_context(wc) < 0) {
779 av_log(avctx, AV_LOG_ERROR, "Error creating frame decode context\n");
780 return AVERROR_INVALIDDATA;
783 s = wc->fdec[block_no];
785 av_log(avctx, AV_LOG_ERROR, "Context for block %d is not present\n",
787 return AVERROR_INVALIDDATA;
790 memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr));
791 memset(s->ch, 0, sizeof(s->ch));
793 s->and = s->or = s->shift = 0;
794 s->got_extra_bits = 0;
796 bytestream2_init(&gb, buf, buf_size);
799 s->samples = bytestream2_get_le32(&gb);
800 if (s->samples != wc->samples)
801 return AVERROR_INVALIDDATA;
808 s->samples = wc->samples;
810 s->frame_flags = bytestream2_get_le32(&gb);
811 bpp = av_get_bytes_per_sample(avctx->sample_fmt);
812 samples = (uint8_t *)samples + bpp * wc->ch_offset;
813 orig_bpp = ((s->frame_flags & 0x03) + 1) << 3;
815 s->stereo = !(s->frame_flags & WV_MONO);
816 s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo;
817 s->joint = s->frame_flags & WV_JOINT_STEREO;
818 s->hybrid = s->frame_flags & WV_HYBRID_MODE;
819 s->hybrid_bitrate = s->frame_flags & WV_HYBRID_BITRATE;
820 s->post_shift = bpp * 8 - orig_bpp + ((s->frame_flags >> 13) & 0x1f);
821 s->hybrid_maxclip = ((1LL << (orig_bpp - 1)) - 1);
822 s->hybrid_minclip = ((-1LL << (orig_bpp - 1)));
823 s->CRC = bytestream2_get_le32(&gb);
826 bytestream2_skip(&gb, 4); // skip block size;
828 wc->ch_offset += 1 + s->stereo;
830 // parse metadata blocks
831 while (bytestream2_get_bytes_left(&gb)) {
832 id = bytestream2_get_byte(&gb);
833 size = bytestream2_get_byte(&gb);
834 if (id & WP_IDF_LONG) {
835 size |= (bytestream2_get_byte(&gb)) << 8;
836 size |= (bytestream2_get_byte(&gb)) << 16;
838 size <<= 1; // size is specified in words
843 av_log(avctx, AV_LOG_ERROR,
844 "Got incorrect block %02X with size %i\n", id, size);
847 if (bytestream2_get_bytes_left(&gb) < ssize) {
848 av_log(avctx, AV_LOG_ERROR,
849 "Block size %i is out of bounds\n", size);
852 if (id & WP_IDF_IGNORE) {
853 bytestream2_skip(&gb, ssize);
856 switch (id & WP_IDF_MASK) {
858 if (size > MAX_TERMS) {
859 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation terms\n");
861 bytestream2_skip(&gb, ssize);
865 for (i = 0; i < s->terms; i++) {
866 uint8_t val = bytestream2_get_byte(&gb);
867 s->decorr[s->terms - i - 1].value = (val & 0x1F) - 5;
868 s->decorr[s->terms - i - 1].delta = val >> 5;
872 case WP_ID_DECWEIGHTS:
874 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
877 weights = size >> s->stereo_in;
878 if (weights > MAX_TERMS || weights > s->terms) {
879 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation weights\n");
880 bytestream2_skip(&gb, ssize);
883 for (i = 0; i < weights; i++) {
884 t = (int8_t)bytestream2_get_byte(&gb);
885 s->decorr[s->terms - i - 1].weightA = t << 3;
886 if (s->decorr[s->terms - i - 1].weightA > 0)
887 s->decorr[s->terms - i - 1].weightA +=
888 (s->decorr[s->terms - i - 1].weightA + 64) >> 7;
890 t = (int8_t)bytestream2_get_byte(&gb);
891 s->decorr[s->terms - i - 1].weightB = t << 3;
892 if (s->decorr[s->terms - i - 1].weightB > 0)
893 s->decorr[s->terms - i - 1].weightB +=
894 (s->decorr[s->terms - i - 1].weightB + 64) >> 7;
899 case WP_ID_DECSAMPLES:
901 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
905 for (i = s->terms - 1; (i >= 0) && (t < size); i--) {
906 if (s->decorr[i].value > 8) {
907 s->decorr[i].samplesA[0] =
908 wp_exp2(bytestream2_get_le16(&gb));
909 s->decorr[i].samplesA[1] =
910 wp_exp2(bytestream2_get_le16(&gb));
913 s->decorr[i].samplesB[0] =
914 wp_exp2(bytestream2_get_le16(&gb));
915 s->decorr[i].samplesB[1] =
916 wp_exp2(bytestream2_get_le16(&gb));
920 } else if (s->decorr[i].value < 0) {
921 s->decorr[i].samplesA[0] =
922 wp_exp2(bytestream2_get_le16(&gb));
923 s->decorr[i].samplesB[0] =
924 wp_exp2(bytestream2_get_le16(&gb));
927 for (j = 0; j < s->decorr[i].value; j++) {
928 s->decorr[i].samplesA[j] =
929 wp_exp2(bytestream2_get_le16(&gb));
931 s->decorr[i].samplesB[j] =
932 wp_exp2(bytestream2_get_le16(&gb));
935 t += s->decorr[i].value * 2 * (s->stereo_in + 1);
941 if (size != 6 * (s->stereo_in + 1)) {
942 av_log(avctx, AV_LOG_ERROR,
943 "Entropy vars size should be %i, got %i",
944 6 * (s->stereo_in + 1), size);
945 bytestream2_skip(&gb, ssize);
948 for (j = 0; j <= s->stereo_in; j++)
949 for (i = 0; i < 3; i++) {
950 s->ch[j].median[i] = wp_exp2(bytestream2_get_le16(&gb));
955 if (s->hybrid_bitrate) {
956 for (i = 0; i <= s->stereo_in; i++) {
957 s->ch[i].slow_level = wp_exp2(bytestream2_get_le16(&gb));
961 for (i = 0; i < (s->stereo_in + 1); i++) {
962 s->ch[i].bitrate_acc = bytestream2_get_le16(&gb) << 16;
966 for (i = 0; i < (s->stereo_in + 1); i++) {
967 s->ch[i].bitrate_delta =
968 wp_exp2((int16_t)bytestream2_get_le16(&gb));
971 for (i = 0; i < (s->stereo_in + 1); i++)
972 s->ch[i].bitrate_delta = 0;
976 case WP_ID_INT32INFO: {
979 av_log(avctx, AV_LOG_ERROR,
980 "Invalid INT32INFO, size = %i\n",
982 bytestream2_skip(&gb, ssize - 4);
985 bytestream2_get_buffer(&gb, val, 4);
987 s->extra_bits = val[0];
997 /* original WavPack decoder forces 32-bit lossy sound to be treated
998 * as 24-bit one in order to have proper clipping */
999 if (s->hybrid && bpp == 4 && s->post_shift < 8 && s->shift > 8) {
1002 s->hybrid_maxclip >>= 8;
1003 s->hybrid_minclip >>= 8;
1007 case WP_ID_FLOATINFO:
1009 av_log(avctx, AV_LOG_ERROR,
1010 "Invalid FLOATINFO, size = %i\n", size);
1011 bytestream2_skip(&gb, ssize);
1014 s->float_flag = bytestream2_get_byte(&gb);
1015 s->float_shift = bytestream2_get_byte(&gb);
1016 s->float_max_exp = bytestream2_get_byte(&gb);
1018 bytestream2_skip(&gb, 1);
1021 s->sc.offset = bytestream2_tell(&gb);
1022 s->sc.size = size * 8;
1023 init_get_bits(&s->gb, gb.buffer, size * 8);
1024 s->data_size = size * 8;
1025 bytestream2_skip(&gb, size);
1028 case WP_ID_EXTRABITS:
1030 av_log(avctx, AV_LOG_ERROR, "Invalid EXTRABITS, size = %i\n",
1032 bytestream2_skip(&gb, size);
1035 s->extra_sc.offset = bytestream2_tell(&gb);
1036 s->extra_sc.size = size * 8;
1037 init_get_bits(&s->gb_extra_bits, gb.buffer, size * 8);
1038 s->crc_extra_bits = get_bits_long(&s->gb_extra_bits, 32);
1039 bytestream2_skip(&gb, size);
1040 s->got_extra_bits = 1;
1042 case WP_ID_CHANINFO:
1044 av_log(avctx, AV_LOG_ERROR,
1045 "Insufficient channel information\n");
1046 return AVERROR_INVALIDDATA;
1048 chan = bytestream2_get_byte(&gb);
1051 chmask = bytestream2_get_byte(&gb);
1054 chmask = bytestream2_get_le16(&gb);
1057 chmask = bytestream2_get_le24(&gb);
1060 chmask = bytestream2_get_le32(&gb);;
1063 bytestream2_skip(&gb, 1);
1064 chan |= (bytestream2_get_byte(&gb) & 0xF) << 8;
1065 chmask = bytestream2_get_le16(&gb);
1068 av_log(avctx, AV_LOG_ERROR, "Invalid channel info size %d\n",
1070 chan = avctx->channels;
1071 chmask = avctx->channel_layout;
1073 if (chan != avctx->channels) {
1074 av_log(avctx, AV_LOG_ERROR,
1075 "Block reports total %d channels, "
1076 "decoder believes it's %d channels\n",
1077 chan, avctx->channels);
1078 return AVERROR_INVALIDDATA;
1080 if (!avctx->channel_layout)
1081 avctx->channel_layout = chmask;
1084 bytestream2_skip(&gb, size);
1086 if (id & WP_IDF_ODD)
1087 bytestream2_skip(&gb, 1);
1091 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n");
1092 return AVERROR_INVALIDDATA;
1095 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n");
1096 return AVERROR_INVALIDDATA;
1099 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n");
1100 return AVERROR_INVALIDDATA;
1103 av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n");
1104 return AVERROR_INVALIDDATA;
1106 if (s->hybrid && !got_hybrid) {
1107 av_log(avctx, AV_LOG_ERROR, "Hybrid config not found\n");
1108 return AVERROR_INVALIDDATA;
1111 av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n");
1112 return AVERROR_INVALIDDATA;
1114 if (!got_float && avctx->sample_fmt == AV_SAMPLE_FMT_FLT) {
1115 av_log(avctx, AV_LOG_ERROR, "Float information not found\n");
1116 return AVERROR_INVALIDDATA;
1118 if (s->got_extra_bits && avctx->sample_fmt != AV_SAMPLE_FMT_FLT) {
1119 const int size = get_bits_left(&s->gb_extra_bits);
1120 const int wanted = s->samples * s->extra_bits << s->stereo_in;
1121 if (size < wanted) {
1122 av_log(avctx, AV_LOG_ERROR, "Too small EXTRABITS\n");
1123 s->got_extra_bits = 0;
1128 if (avctx->sample_fmt == AV_SAMPLE_FMT_S16)
1129 samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_S16);
1130 else if (avctx->sample_fmt == AV_SAMPLE_FMT_S32)
1131 samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_S32);
1133 samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_FLT);
1135 if (samplecount < 0)
1140 const int channel_stride = avctx->channels;
1142 if (avctx->sample_fmt == AV_SAMPLE_FMT_S16)
1143 samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_S16);
1144 else if (avctx->sample_fmt == AV_SAMPLE_FMT_S32)
1145 samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_S32);
1147 samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_FLT);
1149 if (samplecount < 0)
1152 if (s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S16) {
1153 int16_t *dst = (int16_t *)samples + 1;
1154 int16_t *src = (int16_t *)samples;
1155 int cnt = samplecount;
1158 src += channel_stride;
1159 dst += channel_stride;
1161 } else if (s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S32) {
1162 int32_t *dst = (int32_t *)samples + 1;
1163 int32_t *src = (int32_t *)samples;
1164 int cnt = samplecount;
1167 src += channel_stride;
1168 dst += channel_stride;
1170 } else if (s->stereo) {
1171 float *dst = (float *)samples + 1;
1172 float *src = (float *)samples;
1173 int cnt = samplecount;
1176 src += channel_stride;
1177 dst += channel_stride;
1184 return samplecount * bpp;
1187 static void wavpack_decode_flush(AVCodecContext *avctx)
1189 WavpackContext *s = avctx->priv_data;
1192 for (i = 0; i < s->fdec_num; i++)
1193 wv_reset_saved_context(s->fdec[i]);
1196 static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
1197 int *got_frame_ptr, AVPacket *avpkt)
1199 WavpackContext *s = avctx->priv_data;
1200 const uint8_t *buf = avpkt->data;
1201 int buf_size = avpkt->size;
1202 AVFrame *frame = data;
1203 int frame_size, ret, frame_flags;
1204 int samplecount = 0;
1206 if (avpkt->size < 12 + s->multichannel * 4)
1207 return AVERROR_INVALIDDATA;
1212 /* determine number of samples */
1214 s->samples = AV_RL32(buf);
1216 frame_flags = AV_RL32(buf);
1218 if (s->multichannel) {
1219 s->samples = AV_RL32(buf + 4);
1220 frame_flags = AV_RL32(buf + 8);
1222 s->samples = AV_RL32(buf);
1223 frame_flags = AV_RL32(buf + 4);
1226 if (s->samples <= 0) {
1227 av_log(avctx, AV_LOG_ERROR, "Invalid number of samples: %d\n",
1229 return AVERROR_INVALIDDATA;
1232 if (frame_flags & 0x80) {
1233 avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
1234 } else if ((frame_flags & 0x03) <= 1) {
1235 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
1237 avctx->sample_fmt = AV_SAMPLE_FMT_S32;
1238 avctx->bits_per_raw_sample = ((frame_flags & 0x03) + 1) << 3;
1241 /* get output buffer */
1242 frame->nb_samples = s->samples;
1243 if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
1244 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1248 while (buf_size > 0) {
1249 if (!s->multichannel) {
1250 frame_size = buf_size;
1253 frame_size = AV_RL32(buf) - 12;
1257 if (buf_size < 12) // MKV files can have zero flags after last block
1259 frame_size = AV_RL32(buf + 8) + 12;
1262 if (frame_size < 0 || frame_size > buf_size) {
1263 av_log(avctx, AV_LOG_ERROR,
1264 "Block %d has invalid size (size %d vs. %d bytes left)\n",
1265 s->block, frame_size, buf_size);
1266 wavpack_decode_flush(avctx);
1267 return AVERROR_INVALIDDATA;
1269 if ((samplecount = wavpack_decode_block(avctx, s->block,
1270 frame->data[0], got_frame_ptr,
1271 buf, frame_size)) < 0) {
1272 wavpack_decode_flush(avctx);
1277 buf_size -= frame_size;
1283 AVCodec ff_wavpack_decoder = {
1285 .type = AVMEDIA_TYPE_AUDIO,
1286 .id = AV_CODEC_ID_WAVPACK,
1287 .priv_data_size = sizeof(WavpackContext),
1288 .init = wavpack_decode_init,
1289 .close = wavpack_decode_end,
1290 .decode = wavpack_decode_frame,
1291 .flush = wavpack_decode_flush,
1292 .capabilities = CODEC_CAP_SUBFRAMES | CODEC_CAP_DR1,
1293 .long_name = NULL_IF_CONFIG_SMALL("WavPack"),