2 * WavPack lossless audio decoder
3 * Copyright (c) 2006,2011 Konstantin Shishkov
5 * This file is part of FFmpeg.
7 * FFmpeg 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 * FFmpeg 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 FFmpeg; 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/audioconvert.h"
31 * WavPack lossless audio decoder
34 #define WV_MONO 0x00000004
35 #define WV_JOINT_STEREO 0x00000010
36 #define WV_FALSE_STEREO 0x40000000
38 #define WV_HYBRID_MODE 0x00000008
39 #define WV_HYBRID_SHAPE 0x00000008
40 #define WV_HYBRID_BITRATE 0x00000200
41 #define WV_HYBRID_BALANCE 0x00000400
43 #define WV_FLT_SHIFT_ONES 0x01
44 #define WV_FLT_SHIFT_SAME 0x02
45 #define WV_FLT_SHIFT_SENT 0x04
46 #define WV_FLT_ZERO_SENT 0x08
47 #define WV_FLT_ZERO_SIGN 0x10
73 typedef struct SavedContext {
82 typedef struct Decorr {
91 typedef struct WvChannel {
93 int slow_level, error_limit;
94 int bitrate_acc, bitrate_delta;
97 typedef struct WavpackFrameContext {
98 AVCodecContext *avctx;
100 int stereo, stereo_in;
105 uint32_t crc_extra_bits;
106 GetBitContext gb_extra_bits;
107 int data_size; // in bits
110 Decorr decorr[MAX_TERMS];
111 int zero, one, zeroes;
115 int hybrid, hybrid_bitrate, hybrid_maxclip;
121 SavedContext sc, extra_sc;
122 } WavpackFrameContext;
124 #define WV_MAX_FRAME_DECODERS 14
126 typedef struct WavpackContext {
127 AVCodecContext *avctx;
130 WavpackFrameContext *fdec[WV_MAX_FRAME_DECODERS];
140 // exponent table copied from WavPack source
141 static const uint8_t wp_exp2_table [256] = {
142 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b,
143 0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15, 0x16, 0x16,
144 0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20, 0x21, 0x22, 0x23,
145 0x24, 0x24, 0x25, 0x26, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
146 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3a, 0x3b, 0x3c, 0x3d,
147 0x3e, 0x3f, 0x40, 0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x48, 0x49, 0x4a, 0x4b,
148 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
149 0x5b, 0x5c, 0x5d, 0x5e, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
150 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
151 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a,
152 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
153 0x9c, 0x9d, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad,
154 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0,
155 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc8, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf, 0xd0, 0xd2, 0xd3, 0xd4,
156 0xd6, 0xd7, 0xd8, 0xd9, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe8, 0xe9,
157 0xea, 0xec, 0xed, 0xee, 0xf0, 0xf1, 0xf2, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xff
160 static const uint8_t wp_log2_table [] = {
161 0x00, 0x01, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15,
162 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a,
163 0x2c, 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e,
164 0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
165 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
166 0x64, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75,
167 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
168 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
169 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4,
170 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb2,
171 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc0,
172 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcd, 0xce,
173 0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd8, 0xd9, 0xda, 0xdb,
174 0xdc, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe4, 0xe5, 0xe6, 0xe7, 0xe7,
175 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xee, 0xef, 0xf0, 0xf1, 0xf1, 0xf2, 0xf3, 0xf4,
176 0xf4, 0xf5, 0xf6, 0xf7, 0xf7, 0xf8, 0xf9, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xff, 0xff
179 static av_always_inline int wp_exp2(int16_t val)
188 res = wp_exp2_table[val & 0xFF] | 0x100;
190 res = (val > 9) ? (res << (val - 9)) : (res >> (9 - val));
191 return neg ? -res : res;
194 static av_always_inline int wp_log2(int32_t val)
203 bits = av_log2(val) + 1;
205 return (bits << 8) + wp_log2_table[(val << (9 - bits)) & 0xFF];
207 return (bits << 8) + wp_log2_table[(val >> (bits - 9)) & 0xFF];
210 #define LEVEL_DECAY(a) ((a + 0x80) >> 8)
212 // macros for manipulating median values
213 #define GET_MED(n) ((c->median[n] >> 4) + 1)
214 #define DEC_MED(n) c->median[n] -= ((c->median[n] + (128 >> n) - 2) / (128 >> n)) * 2
215 #define INC_MED(n) c->median[n] += ((c->median[n] + (128 >> n) ) / (128 >> n)) * 5
217 // macros for applying weight
218 #define UPDATE_WEIGHT_CLIP(weight, delta, samples, in) \
219 if (samples && in) { \
220 if ((samples ^ in) < 0) { \
222 if (weight < -1024) \
232 static av_always_inline int get_tail(GetBitContext *gb, int k)
239 e = (1 << (p + 1)) - k - 1;
240 res = p ? get_bits(gb, p) : 0;
242 res = (res << 1) - e + get_bits1(gb);
246 static void update_error_limit(WavpackFrameContext *ctx)
250 for (i = 0; i <= ctx->stereo_in; i++) {
251 ctx->ch[i].bitrate_acc += ctx->ch[i].bitrate_delta;
252 br[i] = ctx->ch[i].bitrate_acc >> 16;
253 sl[i] = LEVEL_DECAY(ctx->ch[i].slow_level);
255 if (ctx->stereo_in && ctx->hybrid_bitrate) {
256 int balance = (sl[1] - sl[0] + br[1] + 1) >> 1;
257 if (balance > br[0]) {
260 } else if (-balance > br[0]) {
264 br[1] = br[0] + balance;
265 br[0] = br[0] - balance;
268 for (i = 0; i <= ctx->stereo_in; i++) {
269 if (ctx->hybrid_bitrate) {
270 if (sl[i] - br[i] > -0x100)
271 ctx->ch[i].error_limit = wp_exp2(sl[i] - br[i] + 0x100);
273 ctx->ch[i].error_limit = 0;
275 ctx->ch[i].error_limit = wp_exp2(br[i]);
280 static int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb,
281 int channel, int *last)
284 int sign, base, add, ret;
285 WvChannel *c = &ctx->ch[channel];
289 if ((ctx->ch[0].median[0] < 2U) && (ctx->ch[1].median[0] < 2U) &&
290 !ctx->zero && !ctx->one) {
294 c->slow_level -= LEVEL_DECAY(c->slow_level);
298 t = get_unary_0_33(gb);
300 if (get_bits_left(gb) < t - 1)
302 t = get_bits(gb, t - 1) | (1 << (t-1));
304 if (get_bits_left(gb) < 0)
309 memset(ctx->ch[0].median, 0, sizeof(ctx->ch[0].median));
310 memset(ctx->ch[1].median, 0, sizeof(ctx->ch[1].median));
311 c->slow_level -= LEVEL_DECAY(c->slow_level);
321 t = get_unary_0_33(gb);
322 if (get_bits_left(gb) < 0)
325 t2 = get_unary_0_33(gb);
327 if (get_bits_left(gb) < 0)
331 if (get_bits_left(gb) < t2 - 1)
333 t += get_bits(gb, t2 - 1) | (1 << (t2 - 1));
344 ctx->zero = !ctx->one;
347 if (ctx->hybrid && !channel)
348 update_error_limit(ctx);
352 add = GET_MED(0) - 1;
356 add = GET_MED(1) - 1;
360 base = GET_MED(0) + GET_MED(1);
361 add = GET_MED(2) - 1;
366 base = GET_MED(0) + GET_MED(1) + GET_MED(2) * (t - 2);
367 add = GET_MED(2) - 1;
372 if (!c->error_limit) {
373 ret = base + get_tail(gb, add);
374 if (get_bits_left(gb) <= 0)
377 int mid = (base * 2 + add + 1) >> 1;
378 while (add > c->error_limit) {
379 if (get_bits_left(gb) <= 0)
385 add = mid - base - 1;
386 mid = (base * 2 + add + 1) >> 1;
390 sign = get_bits1(gb);
391 if (ctx->hybrid_bitrate)
392 c->slow_level += wp_log2(ret) - LEVEL_DECAY(c->slow_level);
393 return sign ? ~ret : ret;
400 static inline int wv_get_value_integer(WavpackFrameContext *s, uint32_t *crc,
408 if (s->got_extra_bits && get_bits_left(&s->gb_extra_bits) >= s->extra_bits) {
409 S |= get_bits(&s->gb_extra_bits, s->extra_bits);
410 *crc = *crc * 9 + (S & 0xffff) * 3 + ((unsigned)S >> 16);
414 bit = (S & s->and) | s->or;
415 bit = (((S + bit) << s->shift) - bit);
418 bit = av_clip(bit, -s->hybrid_maxclip - 1, s->hybrid_maxclip);
420 return bit << s->post_shift;
423 static float wv_get_value_float(WavpackFrameContext *s, uint32_t *crc, int S)
431 int exp = s->float_max_exp;
433 if (s->got_extra_bits) {
434 const int max_bits = 1 + 23 + 8 + 1;
435 const int left_bits = get_bits_left(&s->gb_extra_bits);
437 if (left_bits + 8 * FF_INPUT_BUFFER_PADDING_SIZE < max_bits)
442 S <<= s->float_shift;
446 if (S >= 0x1000000) {
447 if (s->got_extra_bits && get_bits1(&s->gb_extra_bits))
448 S = get_bits(&s->gb_extra_bits, 23);
453 int shift = 23 - av_log2(S);
454 exp = s->float_max_exp;
461 if ((s->float_flag & WV_FLT_SHIFT_ONES) ||
462 (s->got_extra_bits && (s->float_flag & WV_FLT_SHIFT_SAME) &&
463 get_bits1(&s->gb_extra_bits))) {
464 S |= (1 << shift) - 1;
465 } else if (s->got_extra_bits &&
466 (s->float_flag & WV_FLT_SHIFT_SENT)) {
467 S |= get_bits(&s->gb_extra_bits, shift);
471 exp = s->float_max_exp;
477 if (s->got_extra_bits && (s->float_flag & WV_FLT_ZERO_SENT)) {
478 if (get_bits1(&s->gb_extra_bits)) {
479 S = get_bits(&s->gb_extra_bits, 23);
480 if (s->float_max_exp >= 25)
481 exp = get_bits(&s->gb_extra_bits, 8);
482 sign = get_bits1(&s->gb_extra_bits);
484 if (s->float_flag & WV_FLT_ZERO_SIGN)
485 sign = get_bits1(&s->gb_extra_bits);
490 *crc = *crc * 27 + S * 9 + exp * 3 + sign;
492 value.u = (sign << 31) | (exp << 23) | S;
496 static void wv_reset_saved_context(WavpackFrameContext *s)
499 s->sc.crc = s->extra_sc.crc = 0xFFFFFFFF;
502 static inline int wv_check_crc(WavpackFrameContext *s, uint32_t crc,
503 uint32_t crc_extra_bits)
506 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
507 return AVERROR_INVALIDDATA;
509 if (s->got_extra_bits && crc_extra_bits != s->crc_extra_bits) {
510 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n");
511 return AVERROR_INVALIDDATA;
517 static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb,
518 void *dst, const int type)
522 int A, B, L, L2, R, R2;
524 uint32_t crc = s->sc.crc;
525 uint32_t crc_extra_bits = s->extra_sc.crc;
526 int16_t *dst16 = dst;
527 int32_t *dst32 = dst;
529 const int channel_pad = s->avctx->channels - 2;
531 s->one = s->zero = s->zeroes = 0;
533 L = wv_get_value(s, gb, 0, &last);
536 R = wv_get_value(s, gb, 1, &last);
539 for (i = 0; i < s->terms; i++) {
540 t = s->decorr[i].value;
544 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
545 B = 2 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1];
547 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
548 B = (3 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1]) >> 1;
550 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
551 s->decorr[i].samplesB[1] = s->decorr[i].samplesB[0];
554 A = s->decorr[i].samplesA[pos];
555 B = s->decorr[i].samplesB[pos];
558 if (type != AV_SAMPLE_FMT_S16) {
559 L2 = L + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
560 R2 = R + ((s->decorr[i].weightB * (int64_t)B + 512) >> 10);
562 L2 = L + ((s->decorr[i].weightA * A + 512) >> 10);
563 R2 = R + ((s->decorr[i].weightB * B + 512) >> 10);
565 if (A && L) s->decorr[i].weightA -= ((((L ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
566 if (B && R) s->decorr[i].weightB -= ((((R ^ B) >> 30) & 2) - 1) * s->decorr[i].delta;
567 s->decorr[i].samplesA[j] = L = L2;
568 s->decorr[i].samplesB[j] = R = R2;
569 } else if (t == -1) {
570 if (type != AV_SAMPLE_FMT_S16)
571 L2 = L + ((s->decorr[i].weightA * (int64_t)s->decorr[i].samplesA[0] + 512) >> 10);
573 L2 = L + ((s->decorr[i].weightA * s->decorr[i].samplesA[0] + 512) >> 10);
574 UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, s->decorr[i].samplesA[0], L);
576 if (type != AV_SAMPLE_FMT_S16)
577 R2 = R + ((s->decorr[i].weightB * (int64_t)L2 + 512) >> 10);
579 R2 = R + ((s->decorr[i].weightB * L2 + 512) >> 10);
580 UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, L2, R);
582 s->decorr[i].samplesA[0] = R;
584 if (type != AV_SAMPLE_FMT_S16)
585 R2 = R + ((s->decorr[i].weightB * (int64_t)s->decorr[i].samplesB[0] + 512) >> 10);
587 R2 = R + ((s->decorr[i].weightB * s->decorr[i].samplesB[0] + 512) >> 10);
588 UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, s->decorr[i].samplesB[0], R);
592 R2 = s->decorr[i].samplesA[0];
593 s->decorr[i].samplesA[0] = R;
596 if (type != AV_SAMPLE_FMT_S16)
597 L2 = L + ((s->decorr[i].weightA * (int64_t)R2 + 512) >> 10);
599 L2 = L + ((s->decorr[i].weightA * R2 + 512) >> 10);
600 UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, R2, L);
602 s->decorr[i].samplesB[0] = L;
607 L += (R -= (L >> 1));
608 crc = (crc * 3 + L) * 3 + R;
610 if (type == AV_SAMPLE_FMT_FLT) {
611 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, L);
612 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, R);
613 dstfl += channel_pad;
614 } else if (type == AV_SAMPLE_FMT_S32) {
615 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, L);
616 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, R);
617 dst32 += channel_pad;
619 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, L);
620 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, R);
621 dst16 += channel_pad;
624 } while (!last && count < s->samples);
626 wv_reset_saved_context(s);
627 if ((s->avctx->err_recognition & AV_EF_CRCCHECK) &&
628 wv_check_crc(s, crc, crc_extra_bits))
629 return AVERROR_INVALIDDATA;
634 static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb,
635 void *dst, const int type)
641 uint32_t crc = s->sc.crc;
642 uint32_t crc_extra_bits = s->extra_sc.crc;
643 int16_t *dst16 = dst;
644 int32_t *dst32 = dst;
646 const int channel_stride = s->avctx->channels;
648 s->one = s->zero = s->zeroes = 0;
650 T = wv_get_value(s, gb, 0, &last);
654 for (i = 0; i < s->terms; i++) {
655 t = s->decorr[i].value;
658 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
660 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
661 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
664 A = s->decorr[i].samplesA[pos];
667 if (type != AV_SAMPLE_FMT_S16)
668 S = T + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
670 S = T + ((s->decorr[i].weightA * A + 512) >> 10);
672 s->decorr[i].weightA -= ((((T ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
673 s->decorr[i].samplesA[j] = T = S;
678 if (type == AV_SAMPLE_FMT_FLT) {
679 *dstfl = wv_get_value_float(s, &crc_extra_bits, S);
680 dstfl += channel_stride;
681 } else if (type == AV_SAMPLE_FMT_S32) {
682 *dst32 = wv_get_value_integer(s, &crc_extra_bits, S);
683 dst32 += channel_stride;
685 *dst16 = wv_get_value_integer(s, &crc_extra_bits, S);
686 dst16 += channel_stride;
689 } while (!last && count < s->samples);
691 wv_reset_saved_context(s);
692 if ((s->avctx->err_recognition & AV_EF_CRCCHECK) &&
693 wv_check_crc(s, crc, crc_extra_bits))
694 return AVERROR_INVALIDDATA;
699 static av_cold int wv_alloc_frame_context(WavpackContext *c)
702 if (c->fdec_num == WV_MAX_FRAME_DECODERS)
705 c->fdec[c->fdec_num] = av_mallocz(sizeof(**c->fdec));
706 if (!c->fdec[c->fdec_num])
709 c->fdec[c->fdec_num - 1]->avctx = c->avctx;
710 wv_reset_saved_context(c->fdec[c->fdec_num - 1]);
715 static av_cold int wavpack_decode_init(AVCodecContext *avctx)
717 WavpackContext *s = avctx->priv_data;
720 if (avctx->bits_per_coded_sample <= 16)
721 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
723 avctx->sample_fmt = AV_SAMPLE_FMT_S32;
724 if (avctx->channels <= 2 && !avctx->channel_layout)
725 avctx->channel_layout = (avctx->channels == 2) ? AV_CH_LAYOUT_STEREO :
728 s->multichannel = avctx->channels > 2;
729 /* lavf demuxer does not provide extradata, Matroska stores 0x403
730 there, use this to detect decoding mode for multichannel */
732 if (s->multichannel && avctx->extradata && avctx->extradata_size == 2) {
733 int ver = AV_RL16(avctx->extradata);
734 if (ver >= 0x402 && ver <= 0x410)
740 avcodec_get_frame_defaults(&s->frame);
741 avctx->coded_frame = &s->frame;
746 static av_cold int wavpack_decode_end(AVCodecContext *avctx)
748 WavpackContext *s = avctx->priv_data;
751 for (i = 0; i < s->fdec_num; i++)
752 av_freep(&s->fdec[i]);
758 static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
759 void *data, int *got_frame_ptr,
760 const uint8_t *buf, int buf_size)
762 WavpackContext *wc = avctx->priv_data;
763 WavpackFrameContext *s;
764 void *samples = data;
766 int got_terms = 0, got_weights = 0, got_samples = 0,
767 got_entropy = 0, got_bs = 0, got_float = 0, got_hybrid = 0;
768 const uint8_t *orig_buf = buf;
769 const uint8_t *buf_end = buf + buf_size;
770 int i, j, id, size, ssize, weights, t;
771 int bpp, chan, chmask;
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");
783 s = wc->fdec[block_no];
785 av_log(avctx, AV_LOG_ERROR, "Context for block %d is not present\n", block_no);
789 memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr));
790 memset(s->ch, 0, sizeof(s->ch));
792 s->and = s->or = s->shift = 0;
793 s->got_extra_bits = 0;
796 s->samples = AV_RL32(buf); buf += 4;
802 s->samples = wc->samples;
804 s->frame_flags = AV_RL32(buf); buf += 4;
805 bpp = av_get_bytes_per_sample(avctx->sample_fmt);
806 samples = (uint8_t*)samples + bpp * wc->ch_offset;
808 s->stereo = !(s->frame_flags & WV_MONO);
809 s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo;
810 s->joint = s->frame_flags & WV_JOINT_STEREO;
811 s->hybrid = s->frame_flags & WV_HYBRID_MODE;
812 s->hybrid_bitrate = s->frame_flags & WV_HYBRID_BITRATE;
813 s->hybrid_maxclip = (1LL << ((((s->frame_flags & 0x03) + 1) << 3) - 1)) - 1;
814 s->post_shift = 8 * (bpp - 1 - (s->frame_flags & 0x03)) +
815 ((s->frame_flags >> 13) & 0x1f);
816 s->CRC = AV_RL32(buf); buf += 4;
818 buf += 4; //skip block size;
820 wc->ch_offset += 1 + s->stereo;
822 // parse metadata blocks
823 while (buf < buf_end) {
826 if (id & WP_IDF_LONG) {
827 size |= (*buf++) << 8;
828 size |= (*buf++) << 16;
830 size <<= 1; // size is specified in words
835 av_log(avctx, AV_LOG_ERROR, "Got incorrect block %02X with size %i\n", id, size);
838 if (buf + ssize > buf_end) {
839 av_log(avctx, AV_LOG_ERROR, "Block size %i is out of bounds\n", size);
842 if (id & WP_IDF_IGNORE) {
846 switch (id & WP_IDF_MASK) {
848 if (size > MAX_TERMS) {
849 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation terms\n");
855 for (i = 0; i < s->terms; i++) {
856 s->decorr[s->terms - i - 1].value = (*buf & 0x1F) - 5;
857 s->decorr[s->terms - i - 1].delta = *buf >> 5;
862 case WP_ID_DECWEIGHTS:
864 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
867 weights = size >> s->stereo_in;
868 if (weights > MAX_TERMS || weights > s->terms) {
869 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation weights\n");
873 for (i = 0; i < weights; i++) {
874 t = (int8_t)(*buf++);
875 s->decorr[s->terms - i - 1].weightA = t << 3;
876 if (s->decorr[s->terms - i - 1].weightA > 0)
877 s->decorr[s->terms - i - 1].weightA +=
878 (s->decorr[s->terms - i - 1].weightA + 64) >> 7;
880 t = (int8_t)(*buf++);
881 s->decorr[s->terms - i - 1].weightB = t << 3;
882 if (s->decorr[s->terms - i - 1].weightB > 0)
883 s->decorr[s->terms - i - 1].weightB +=
884 (s->decorr[s->terms - i - 1].weightB + 64) >> 7;
889 case WP_ID_DECSAMPLES:
891 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
895 for (i = s->terms - 1; (i >= 0) && (t < size); i--) {
896 if (s->decorr[i].value > 8) {
897 s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2;
898 s->decorr[i].samplesA[1] = wp_exp2(AV_RL16(buf)); buf += 2;
900 s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2;
901 s->decorr[i].samplesB[1] = wp_exp2(AV_RL16(buf)); buf += 2;
905 } else if (s->decorr[i].value < 0) {
906 s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2;
907 s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2;
910 for (j = 0; j < s->decorr[i].value; j++) {
911 s->decorr[i].samplesA[j] = wp_exp2(AV_RL16(buf)); buf += 2;
913 s->decorr[i].samplesB[j] = wp_exp2(AV_RL16(buf)); buf += 2;
916 t += s->decorr[i].value * 2 * (s->stereo_in + 1);
922 if (size != 6 * (s->stereo_in + 1)) {
923 av_log(avctx, AV_LOG_ERROR, "Entropy vars size should be %i, "
924 "got %i", 6 * (s->stereo_in + 1), size);
928 for (j = 0; j <= s->stereo_in; j++) {
929 for (i = 0; i < 3; i++) {
930 s->ch[j].median[i] = wp_exp2(AV_RL16(buf));
937 if (s->hybrid_bitrate) {
938 for (i = 0; i <= s->stereo_in; i++) {
939 s->ch[i].slow_level = wp_exp2(AV_RL16(buf));
944 for (i = 0; i < (s->stereo_in + 1); i++) {
945 s->ch[i].bitrate_acc = AV_RL16(buf) << 16;
950 for (i = 0; i < (s->stereo_in + 1); i++) {
951 s->ch[i].bitrate_delta = wp_exp2((int16_t)AV_RL16(buf));
955 for (i = 0; i < (s->stereo_in + 1); i++)
956 s->ch[i].bitrate_delta = 0;
960 case WP_ID_INT32INFO:
962 av_log(avctx, AV_LOG_ERROR, "Invalid INT32INFO, size = %i, sent_bits = %i\n", size, *buf);
967 s->extra_bits = buf[0];
979 case WP_ID_FLOATINFO:
981 av_log(avctx, AV_LOG_ERROR, "Invalid FLOATINFO, size = %i\n", size);
985 s->float_flag = buf[0];
986 s->float_shift = buf[1];
987 s->float_max_exp = buf[2];
992 s->sc.offset = buf - orig_buf;
993 s->sc.size = size * 8;
994 init_get_bits(&s->gb, buf, size * 8);
995 s->data_size = size * 8;
999 case WP_ID_EXTRABITS:
1001 av_log(avctx, AV_LOG_ERROR, "Invalid EXTRABITS, size = %i\n",
1006 s->extra_sc.offset = buf - orig_buf;
1007 s->extra_sc.size = size * 8;
1008 init_get_bits(&s->gb_extra_bits, buf, size * 8);
1009 s->crc_extra_bits = get_bits_long(&s->gb_extra_bits, 32);
1011 s->got_extra_bits = 1;
1013 case WP_ID_CHANINFO:
1015 av_log(avctx, AV_LOG_ERROR, "Insufficient channel information\n");
1020 case 0: chmask = *buf; break;
1021 case 1: chmask = AV_RL16(buf); break;
1022 case 2: chmask = AV_RL24(buf); break;
1023 case 3: chmask = AV_RL32(buf); break;
1025 chan |= (buf[1] & 0xF) << 8;
1026 chmask = AV_RL24(buf + 2);
1029 av_log(avctx, AV_LOG_ERROR, "Invalid channel info size %d\n",
1031 chan = avctx->channels;
1032 chmask = avctx->channel_layout;
1034 if (chan != avctx->channels) {
1035 av_log(avctx, AV_LOG_ERROR, "Block reports total %d channels, "
1036 "decoder believes it's %d channels\n", chan,
1040 if (!avctx->channel_layout)
1041 avctx->channel_layout = chmask;
1047 if (id & WP_IDF_ODD)
1052 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n");
1056 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n");
1060 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n");
1064 av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n");
1067 if (s->hybrid && !got_hybrid) {
1068 av_log(avctx, AV_LOG_ERROR, "Hybrid config not found\n");
1072 av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n");
1075 if (!got_float && avctx->sample_fmt == AV_SAMPLE_FMT_FLT) {
1076 av_log(avctx, AV_LOG_ERROR, "Float information not found\n");
1079 if (s->got_extra_bits && avctx->sample_fmt != AV_SAMPLE_FMT_FLT) {
1080 const int size = get_bits_left(&s->gb_extra_bits);
1081 const int wanted = s->samples * s->extra_bits << s->stereo_in;
1082 if (size < wanted) {
1083 av_log(avctx, AV_LOG_ERROR, "Too small EXTRABITS\n");
1084 s->got_extra_bits = 0;
1089 if (avctx->sample_fmt == AV_SAMPLE_FMT_S16)
1090 samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_S16);
1091 else if (avctx->sample_fmt == AV_SAMPLE_FMT_S32)
1092 samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_S32);
1094 samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_FLT);
1096 if (samplecount < 0)
1101 const int channel_stride = avctx->channels;
1103 if (avctx->sample_fmt == AV_SAMPLE_FMT_S16)
1104 samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_S16);
1105 else if (avctx->sample_fmt == AV_SAMPLE_FMT_S32)
1106 samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_S32);
1108 samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_FLT);
1110 if (samplecount < 0)
1113 if (s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S16) {
1114 int16_t *dst = (int16_t*)samples + 1;
1115 int16_t *src = (int16_t*)samples;
1116 int cnt = samplecount;
1119 src += channel_stride;
1120 dst += channel_stride;
1122 } else if (s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S32) {
1123 int32_t *dst = (int32_t*)samples + 1;
1124 int32_t *src = (int32_t*)samples;
1125 int cnt = samplecount;
1128 src += channel_stride;
1129 dst += channel_stride;
1131 } else if (s->stereo) {
1132 float *dst = (float*)samples + 1;
1133 float *src = (float*)samples;
1134 int cnt = samplecount;
1137 src += channel_stride;
1138 dst += channel_stride;
1145 return samplecount * bpp;
1148 static void wavpack_decode_flush(AVCodecContext *avctx)
1150 WavpackContext *s = avctx->priv_data;
1153 for (i = 0; i < s->fdec_num; i++)
1154 wv_reset_saved_context(s->fdec[i]);
1157 static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
1158 int *got_frame_ptr, AVPacket *avpkt)
1160 WavpackContext *s = avctx->priv_data;
1161 const uint8_t *buf = avpkt->data;
1162 int buf_size = avpkt->size;
1163 int frame_size, ret, frame_flags;
1164 int samplecount = 0;
1169 /* determine number of samples */
1171 s->samples = AV_RL32(buf); buf += 4;
1172 frame_flags = AV_RL32(buf);
1174 if (s->multichannel) {
1175 s->samples = AV_RL32(buf + 4);
1176 frame_flags = AV_RL32(buf + 8);
1178 s->samples = AV_RL32(buf);
1179 frame_flags = AV_RL32(buf + 4);
1182 if (s->samples <= 0) {
1183 av_log(avctx, AV_LOG_ERROR, "Invalid number of samples: %d\n",
1185 return AVERROR(EINVAL);
1188 if (frame_flags & 0x80) {
1189 avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
1190 } else if ((frame_flags & 0x03) <= 1) {
1191 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
1193 avctx->sample_fmt = AV_SAMPLE_FMT_S32;
1196 /* get output buffer */
1197 s->frame.nb_samples = s->samples;
1198 if ((ret = avctx->get_buffer(avctx, &s->frame)) < 0) {
1199 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1203 while (buf_size > 0) {
1204 if (!s->multichannel) {
1205 frame_size = buf_size;
1208 frame_size = AV_RL32(buf) - 12; buf += 4; buf_size -= 4;
1210 if (buf_size < 12) //MKV files can have zero flags after last block
1212 frame_size = AV_RL32(buf + 8) + 12;
1215 if (frame_size < 0 || frame_size > buf_size) {
1216 av_log(avctx, AV_LOG_ERROR, "Block %d has invalid size (size %d "
1217 "vs. %d bytes left)\n", s->block, frame_size, buf_size);
1218 wavpack_decode_flush(avctx);
1221 if ((samplecount = wavpack_decode_block(avctx, s->block,
1222 s->frame.data[0], got_frame_ptr,
1223 buf, frame_size)) < 0) {
1224 wavpack_decode_flush(avctx);
1228 buf += frame_size; buf_size -= frame_size;
1232 *(AVFrame *)data = s->frame;
1237 AVCodec ff_wavpack_decoder = {
1239 .type = AVMEDIA_TYPE_AUDIO,
1240 .id = CODEC_ID_WAVPACK,
1241 .priv_data_size = sizeof(WavpackContext),
1242 .init = wavpack_decode_init,
1243 .close = wavpack_decode_end,
1244 .decode = wavpack_decode_frame,
1245 .flush = wavpack_decode_flush,
1246 .capabilities = CODEC_CAP_SUBFRAMES | CODEC_CAP_DR1,
1247 .long_name = NULL_IF_CONFIG_SMALL("WavPack"),