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
21 #define ALT_BITSTREAM_READER_LE
25 #include "libavutil/audioconvert.h"
29 * WavPack lossless audio decoder
32 #define WV_MONO 0x00000004
33 #define WV_JOINT_STEREO 0x00000010
34 #define WV_FALSE_STEREO 0x40000000
36 #define WV_HYBRID_MODE 0x00000008
37 #define WV_HYBRID_SHAPE 0x00000008
38 #define WV_HYBRID_BITRATE 0x00000200
39 #define WV_HYBRID_BALANCE 0x00000400
41 #define WV_FLT_SHIFT_ONES 0x01
42 #define WV_FLT_SHIFT_SAME 0x02
43 #define WV_FLT_SHIFT_SENT 0x04
44 #define WV_FLT_ZERO_SENT 0x08
45 #define WV_FLT_ZERO_SIGN 0x10
71 typedef struct SavedContext {
80 typedef struct Decorr {
89 typedef struct WvChannel {
91 int slow_level, error_limit;
92 int bitrate_acc, bitrate_delta;
95 typedef struct WavpackFrameContext {
96 AVCodecContext *avctx;
98 int stereo, stereo_in;
103 uint32_t crc_extra_bits;
104 GetBitContext gb_extra_bits;
105 int data_size; // in bits
108 Decorr decorr[MAX_TERMS];
109 int zero, one, zeroes;
113 int hybrid, hybrid_bitrate;
121 SavedContext sc, extra_sc;
122 } WavpackFrameContext;
124 #define WV_MAX_FRAME_DECODERS 14
126 typedef struct WavpackContext {
127 AVCodecContext *avctx;
129 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) \
220 if((samples ^ in) < 0){ \
222 if(weight < -1024) weight = -1024; \
225 if(weight > 1024) weight = 1024; \
230 static av_always_inline int get_tail(GetBitContext *gb, int k)
236 e = (1 << (p + 1)) - k - 1;
237 res = p ? get_bits(gb, p) : 0;
239 res = (res<<1) - e + get_bits1(gb);
244 static void update_error_limit(WavpackFrameContext *ctx)
248 for(i = 0; i <= ctx->stereo_in; i++){
249 ctx->ch[i].bitrate_acc += ctx->ch[i].bitrate_delta;
250 br[i] = ctx->ch[i].bitrate_acc >> 16;
251 sl[i] = LEVEL_DECAY(ctx->ch[i].slow_level);
253 if(ctx->stereo_in && ctx->hybrid_bitrate){
254 int balance = (sl[1] - sl[0] + br[1] + 1) >> 1;
258 }else if(-balance > br[0]){
262 br[1] = br[0] + balance;
263 br[0] = br[0] - balance;
266 for(i = 0; i <= ctx->stereo_in; i++){
267 if(ctx->hybrid_bitrate){
268 if(sl[i] - br[i] > -0x100)
269 ctx->ch[i].error_limit = wp_exp2(sl[i] - br[i] + 0x100);
271 ctx->ch[i].error_limit = 0;
273 ctx->ch[i].error_limit = wp_exp2(br[i]);
278 static int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb, int channel, int *last)
281 int sign, base, add, ret;
282 WvChannel *c = &ctx->ch[channel];
286 if((ctx->ch[0].median[0] < 2U) && (ctx->ch[1].median[0] < 2U) && !ctx->zero && !ctx->one){
290 c->slow_level -= LEVEL_DECAY(c->slow_level);
294 t = get_unary_0_33(gb);
296 if(get_bits_left(gb) < t-1)
298 t = get_bits(gb, t - 1) | (1 << (t-1));
300 if(get_bits_left(gb) < 0)
305 memset(ctx->ch[0].median, 0, sizeof(ctx->ch[0].median));
306 memset(ctx->ch[1].median, 0, sizeof(ctx->ch[1].median));
307 c->slow_level -= LEVEL_DECAY(c->slow_level);
317 t = get_unary_0_33(gb);
318 if(get_bits_left(gb) < 0)
321 t2 = get_unary_0_33(gb);
323 if(get_bits_left(gb) < 0)
327 if(get_bits_left(gb) < t2 - 1)
329 t += get_bits(gb, t2 - 1) | (1 << (t2 - 1));
340 ctx->zero = !ctx->one;
343 if(ctx->hybrid && !channel)
344 update_error_limit(ctx);
348 add = GET_MED(0) - 1;
352 add = GET_MED(1) - 1;
356 base = GET_MED(0) + GET_MED(1);
357 add = GET_MED(2) - 1;
362 base = GET_MED(0) + GET_MED(1) + GET_MED(2) * (t - 2);
363 add = GET_MED(2) - 1;
369 ret = base + get_tail(gb, add);
370 if (get_bits_left(gb) <= 0)
373 int mid = (base*2 + add + 1) >> 1;
374 while(add > c->error_limit){
375 if(get_bits_left(gb) <= 0)
381 add = mid - base - 1;
382 mid = (base*2 + add + 1) >> 1;
386 sign = get_bits1(gb);
387 if(ctx->hybrid_bitrate)
388 c->slow_level += wp_log2(ret) - LEVEL_DECAY(c->slow_level);
389 return sign ? ~ret : ret;
396 static inline int wv_get_value_integer(WavpackFrameContext *s, uint32_t *crc, int S)
403 if(s->got_extra_bits && get_bits_left(&s->gb_extra_bits) >= s->extra_bits){
404 S |= get_bits(&s->gb_extra_bits, s->extra_bits);
405 *crc = *crc * 9 + (S&0xffff) * 3 + ((unsigned)S>>16);
408 bit = (S & s->and) | s->or;
409 return (((S + bit) << s->shift) - bit) << s->post_shift;
412 static float wv_get_value_float(WavpackFrameContext *s, uint32_t *crc, int S)
420 int exp = s->float_max_exp;
422 if(s->got_extra_bits){
423 const int max_bits = 1 + 23 + 8 + 1;
424 const int left_bits = get_bits_left(&s->gb_extra_bits);
426 if(left_bits + 8 * FF_INPUT_BUFFER_PADDING_SIZE < max_bits)
431 S <<= s->float_shift;
436 if(s->got_extra_bits && get_bits1(&s->gb_extra_bits)){
437 S = get_bits(&s->gb_extra_bits, 23);
443 int shift = 23 - av_log2(S);
444 exp = s->float_max_exp;
452 if((s->float_flag & WV_FLT_SHIFT_ONES) ||
453 (s->got_extra_bits && (s->float_flag & WV_FLT_SHIFT_SAME) && get_bits1(&s->gb_extra_bits)) ){
454 S |= (1 << shift) - 1;
455 } else if(s->got_extra_bits && (s->float_flag & WV_FLT_SHIFT_SENT)){
456 S |= get_bits(&s->gb_extra_bits, shift);
460 exp = s->float_max_exp;
466 if(s->got_extra_bits && (s->float_flag & WV_FLT_ZERO_SENT)){
467 if(get_bits1(&s->gb_extra_bits)){
468 S = get_bits(&s->gb_extra_bits, 23);
469 if(s->float_max_exp >= 25)
470 exp = get_bits(&s->gb_extra_bits, 8);
471 sign = get_bits1(&s->gb_extra_bits);
473 if(s->float_flag & WV_FLT_ZERO_SIGN)
474 sign = get_bits1(&s->gb_extra_bits);
479 *crc = *crc * 27 + S * 9 + exp * 3 + sign;
481 value.u = (sign << 31) | (exp << 23) | S;
485 static void wv_reset_saved_context(WavpackFrameContext *s)
488 s->sc.crc = s->extra_sc.crc = 0xFFFFFFFF;
491 static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, void *dst, const int type)
495 int A, B, L, L2, R, R2;
497 uint32_t crc = s->sc.crc;
498 uint32_t crc_extra_bits = s->extra_sc.crc;
499 int16_t *dst16 = dst;
500 int32_t *dst32 = dst;
502 const int channel_pad = s->avctx->channels - 2;
504 if(s->samples_left == s->samples)
505 s->one = s->zero = s->zeroes = 0;
507 L = wv_get_value(s, gb, 0, &last);
509 R = wv_get_value(s, gb, 1, &last);
511 for(i = 0; i < s->terms; i++){
512 t = s->decorr[i].value;
516 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
517 B = 2 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1];
519 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
520 B = (3 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1]) >> 1;
522 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
523 s->decorr[i].samplesB[1] = s->decorr[i].samplesB[0];
526 A = s->decorr[i].samplesA[pos];
527 B = s->decorr[i].samplesB[pos];
530 if(type != AV_SAMPLE_FMT_S16){
531 L2 = L + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
532 R2 = R + ((s->decorr[i].weightB * (int64_t)B + 512) >> 10);
534 L2 = L + ((s->decorr[i].weightA * A + 512) >> 10);
535 R2 = R + ((s->decorr[i].weightB * B + 512) >> 10);
537 if(A && L) s->decorr[i].weightA -= ((((L ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
538 if(B && R) s->decorr[i].weightB -= ((((R ^ B) >> 30) & 2) - 1) * s->decorr[i].delta;
539 s->decorr[i].samplesA[j] = L = L2;
540 s->decorr[i].samplesB[j] = R = R2;
542 if(type != AV_SAMPLE_FMT_S16)
543 L2 = L + ((s->decorr[i].weightA * (int64_t)s->decorr[i].samplesA[0] + 512) >> 10);
545 L2 = L + ((s->decorr[i].weightA * s->decorr[i].samplesA[0] + 512) >> 10);
546 UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, s->decorr[i].samplesA[0], L);
548 if(type != AV_SAMPLE_FMT_S16)
549 R2 = R + ((s->decorr[i].weightB * (int64_t)L2 + 512) >> 10);
551 R2 = R + ((s->decorr[i].weightB * L2 + 512) >> 10);
552 UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, L2, R);
554 s->decorr[i].samplesA[0] = R;
556 if(type != AV_SAMPLE_FMT_S16)
557 R2 = R + ((s->decorr[i].weightB * (int64_t)s->decorr[i].samplesB[0] + 512) >> 10);
559 R2 = R + ((s->decorr[i].weightB * s->decorr[i].samplesB[0] + 512) >> 10);
560 UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, s->decorr[i].samplesB[0], R);
564 R2 = s->decorr[i].samplesA[0];
565 s->decorr[i].samplesA[0] = R;
568 if(type != AV_SAMPLE_FMT_S16)
569 L2 = L + ((s->decorr[i].weightA * (int64_t)R2 + 512) >> 10);
571 L2 = L + ((s->decorr[i].weightA * R2 + 512) >> 10);
572 UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, R2, L);
574 s->decorr[i].samplesB[0] = L;
579 L += (R -= (L >> 1));
580 crc = (crc * 3 + L) * 3 + R;
582 if(type == AV_SAMPLE_FMT_FLT){
583 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, L);
584 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, R);
585 dstfl += channel_pad;
586 } else if(type == AV_SAMPLE_FMT_S32){
587 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, L);
588 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, R);
589 dst32 += channel_pad;
591 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, L);
592 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, R);
593 dst16 += channel_pad;
596 }while(!last && count < s->max_samples);
601 s->samples_left -= count;
602 if(!s->samples_left){
604 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
607 if(s->got_extra_bits && crc_extra_bits != s->crc_extra_bits){
608 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n");
611 wv_reset_saved_context(s);
615 s->sc.bits_used = get_bits_count(&s->gb);
616 if(s->got_extra_bits){
617 s->extra_sc.crc = crc_extra_bits;
618 s->extra_sc.bits_used = get_bits_count(&s->gb_extra_bits);
624 static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, void *dst, const int type)
630 uint32_t crc = s->sc.crc;
631 uint32_t crc_extra_bits = s->extra_sc.crc;
632 int16_t *dst16 = dst;
633 int32_t *dst32 = dst;
635 const int channel_stride = s->avctx->channels;
637 if(s->samples_left == s->samples)
638 s->one = s->zero = s->zeroes = 0;
640 T = wv_get_value(s, gb, 0, &last);
643 for(i = 0; i < s->terms; i++){
644 t = s->decorr[i].value;
647 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
649 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
650 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
653 A = s->decorr[i].samplesA[pos];
656 if(type != AV_SAMPLE_FMT_S16)
657 S = T + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
659 S = T + ((s->decorr[i].weightA * A + 512) >> 10);
660 if(A && T) s->decorr[i].weightA -= ((((T ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
661 s->decorr[i].samplesA[j] = T = S;
666 if(type == AV_SAMPLE_FMT_FLT){
667 *dstfl = wv_get_value_float(s, &crc_extra_bits, S);
668 dstfl += channel_stride;
669 }else if(type == AV_SAMPLE_FMT_S32){
670 *dst32 = wv_get_value_integer(s, &crc_extra_bits, S);
671 dst32 += channel_stride;
673 *dst16 = wv_get_value_integer(s, &crc_extra_bits, S);
674 dst16 += channel_stride;
677 }while(!last && count < s->max_samples);
682 s->samples_left -= count;
683 if(!s->samples_left){
685 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
688 if(s->got_extra_bits && crc_extra_bits != s->crc_extra_bits){
689 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n");
692 wv_reset_saved_context(s);
696 s->sc.bits_used = get_bits_count(&s->gb);
697 if(s->got_extra_bits){
698 s->extra_sc.crc = crc_extra_bits;
699 s->extra_sc.bits_used = get_bits_count(&s->gb_extra_bits);
705 static av_cold int wv_alloc_frame_context(WavpackContext *c)
708 if(c->fdec_num == WV_MAX_FRAME_DECODERS)
711 c->fdec[c->fdec_num] = av_mallocz(sizeof(**c->fdec));
712 if(!c->fdec[c->fdec_num])
715 c->fdec[c->fdec_num - 1]->avctx = c->avctx;
716 wv_reset_saved_context(c->fdec[c->fdec_num - 1]);
721 static av_cold int wavpack_decode_init(AVCodecContext *avctx)
723 WavpackContext *s = avctx->priv_data;
726 if(avctx->bits_per_coded_sample <= 16)
727 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
729 avctx->sample_fmt = AV_SAMPLE_FMT_S32;
730 if(avctx->channels <= 2 && !avctx->channel_layout)
731 avctx->channel_layout = (avctx->channels==2) ? AV_CH_LAYOUT_STEREO : AV_CH_LAYOUT_MONO;
733 s->multichannel = avctx->channels > 2;
734 /* lavf demuxer does not provide extradata, Matroska stores 0x403
735 there, use this to detect decoding mode for multichannel */
737 if(s->multichannel && avctx->extradata && avctx->extradata_size == 2){
738 int ver = AV_RL16(avctx->extradata);
739 if(ver >= 0x402 && ver <= 0x410)
748 static av_cold int wavpack_decode_end(AVCodecContext *avctx)
750 WavpackContext *s = avctx->priv_data;
753 for(i = 0; i < s->fdec_num; i++)
754 av_freep(&s->fdec[i]);
760 static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
761 void *data, int *data_size,
762 const uint8_t *buf, int buf_size)
764 WavpackContext *wc = avctx->priv_data;
765 WavpackFrameContext *s;
766 void *samples = data;
768 int got_terms = 0, got_weights = 0, got_samples = 0, got_entropy = 0, got_bs = 0, got_float = 0;
770 const uint8_t* orig_buf = buf;
771 const uint8_t* buf_end = buf + buf_size;
772 int i, j, id, size, ssize, weights, t;
773 int bpp, chan, chmask;
780 if(block_no >= wc->fdec_num && wv_alloc_frame_context(wc) < 0){
781 av_log(avctx, AV_LOG_ERROR, "Error creating frame decode context\n");
785 s = wc->fdec[block_no];
787 av_log(avctx, AV_LOG_ERROR, "Context for block %d is not present\n", block_no);
791 if(!s->samples_left){
792 memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr));
793 memset(s->ch, 0, sizeof(s->ch));
795 s->and = s->or = s->shift = 0;
796 s->got_extra_bits = 0;
800 s->samples = AV_RL32(buf); buf += 4;
806 s->samples = wc->samples;
808 s->frame_flags = AV_RL32(buf); buf += 4;
809 if(s->frame_flags&0x80){
811 avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
812 } else if((s->frame_flags&0x03) <= 1){
814 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
817 avctx->sample_fmt = AV_SAMPLE_FMT_S32;
819 samples = (uint8_t*)samples + bpp * wc->ch_offset;
821 s->stereo = !(s->frame_flags & WV_MONO);
822 s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo;
823 s->joint = s->frame_flags & WV_JOINT_STEREO;
824 s->hybrid = s->frame_flags & WV_HYBRID_MODE;
825 s->hybrid_bitrate = s->frame_flags & WV_HYBRID_BITRATE;
826 s->post_shift = 8 * (bpp-1-(s->frame_flags&0x03)) + ((s->frame_flags >> 13) & 0x1f);
827 s->CRC = AV_RL32(buf); buf += 4;
829 buf += 4; //skip block size;
831 wc->ch_offset += 1 + s->stereo;
833 s->max_samples = *data_size / (bpp * avctx->channels);
834 s->max_samples = FFMIN(s->max_samples, s->samples);
835 if(s->samples_left > 0){
836 s->max_samples = FFMIN(s->max_samples, s->samples_left);
840 // parse metadata blocks
841 while(buf < buf_end){
844 if(id & WP_IDF_LONG) {
845 size |= (*buf++) << 8;
846 size |= (*buf++) << 16;
848 size <<= 1; // size is specified in words
850 if(id & WP_IDF_ODD) size--;
852 av_log(avctx, AV_LOG_ERROR, "Got incorrect block %02X with size %i\n", id, size);
855 if(buf + ssize > buf_end){
856 av_log(avctx, AV_LOG_ERROR, "Block size %i is out of bounds\n", size);
859 if(id & WP_IDF_IGNORE){
863 switch(id & WP_IDF_MASK){
865 if(size > MAX_TERMS){
866 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation terms\n");
872 for(i = 0; i < s->terms; i++) {
873 s->decorr[s->terms - i - 1].value = (*buf & 0x1F) - 5;
874 s->decorr[s->terms - i - 1].delta = *buf >> 5;
879 case WP_ID_DECWEIGHTS:
881 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
884 weights = size >> s->stereo_in;
885 if(weights > MAX_TERMS || weights > s->terms){
886 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation weights\n");
890 for(i = 0; i < weights; i++) {
891 t = (int8_t)(*buf++);
892 s->decorr[s->terms - i - 1].weightA = t << 3;
893 if(s->decorr[s->terms - i - 1].weightA > 0)
894 s->decorr[s->terms - i - 1].weightA += (s->decorr[s->terms - i - 1].weightA + 64) >> 7;
896 t = (int8_t)(*buf++);
897 s->decorr[s->terms - i - 1].weightB = t << 3;
898 if(s->decorr[s->terms - i - 1].weightB > 0)
899 s->decorr[s->terms - i - 1].weightB += (s->decorr[s->terms - i - 1].weightB + 64) >> 7;
904 case WP_ID_DECSAMPLES:
906 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
910 for(i = s->terms - 1; (i >= 0) && (t < size); i--) {
911 if(s->decorr[i].value > 8){
912 s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2;
913 s->decorr[i].samplesA[1] = wp_exp2(AV_RL16(buf)); buf += 2;
915 s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2;
916 s->decorr[i].samplesB[1] = wp_exp2(AV_RL16(buf)); buf += 2;
920 }else if(s->decorr[i].value < 0){
921 s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2;
922 s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2;
925 for(j = 0; j < s->decorr[i].value; j++){
926 s->decorr[i].samplesA[j] = wp_exp2(AV_RL16(buf)); buf += 2;
928 s->decorr[i].samplesB[j] = wp_exp2(AV_RL16(buf)); buf += 2;
931 t += s->decorr[i].value * 2 * (s->stereo_in + 1);
937 if(size != 6 * (s->stereo_in + 1)){
938 av_log(avctx, AV_LOG_ERROR, "Entropy vars size should be %i, got %i", 6 * (s->stereo_in + 1), size);
942 for(j = 0; j <= s->stereo_in; j++){
943 for(i = 0; i < 3; i++){
944 s->ch[j].median[i] = wp_exp2(AV_RL16(buf));
951 if(s->hybrid_bitrate){
952 for(i = 0; i <= s->stereo_in; i++){
953 s->ch[i].slow_level = wp_exp2(AV_RL16(buf));
958 for(i = 0; i < (s->stereo_in + 1); i++){
959 s->ch[i].bitrate_acc = AV_RL16(buf) << 16;
964 for(i = 0; i < (s->stereo_in + 1); i++){
965 s->ch[i].bitrate_delta = wp_exp2((int16_t)AV_RL16(buf));
969 for(i = 0; i < (s->stereo_in + 1); i++)
970 s->ch[i].bitrate_delta = 0;
974 case WP_ID_INT32INFO:
976 av_log(avctx, AV_LOG_ERROR, "Invalid INT32INFO, size = %i, sent_bits = %i\n", size, *buf);
981 s->extra_bits = buf[0];
993 case WP_ID_FLOATINFO:
995 av_log(avctx, AV_LOG_ERROR, "Invalid FLOATINFO, size = %i\n", size);
999 s->float_flag = buf[0];
1000 s->float_shift = buf[1];
1001 s->float_max_exp = buf[2];
1006 s->sc.offset = buf - orig_buf;
1007 s->sc.size = size * 8;
1008 init_get_bits(&s->gb, buf, size * 8);
1009 s->data_size = size * 8;
1013 case WP_ID_EXTRABITS:
1015 av_log(avctx, AV_LOG_ERROR, "Invalid EXTRABITS, size = %i\n", size);
1019 s->extra_sc.offset = buf - orig_buf;
1020 s->extra_sc.size = size * 8;
1021 init_get_bits(&s->gb_extra_bits, buf, size * 8);
1022 s->crc_extra_bits = get_bits_long(&s->gb_extra_bits, 32);
1024 s->got_extra_bits = 1;
1026 case WP_ID_CHANINFO:
1028 av_log(avctx, AV_LOG_ERROR, "Insufficient channel information\n");
1037 chmask = AV_RL16(buf);
1040 chmask = AV_RL24(buf);
1043 chmask = AV_RL32(buf);
1046 chan |= (buf[1] & 0xF) << 8;
1047 chmask = AV_RL24(buf + 2);
1050 av_log(avctx, AV_LOG_ERROR, "Invalid channel info size %d\n", size);
1051 chan = avctx->channels;
1052 chmask = avctx->channel_layout;
1054 if(chan != avctx->channels){
1055 av_log(avctx, AV_LOG_ERROR, "Block reports total %d channels, decoder believes it's %d channels\n",
1056 chan, avctx->channels);
1059 if(!avctx->channel_layout)
1060 avctx->channel_layout = chmask;
1066 if(id & WP_IDF_ODD) buf++;
1068 if(!s->samples_left){
1070 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n");
1074 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n");
1078 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n");
1082 av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n");
1085 if(s->hybrid && !got_hybrid){
1086 av_log(avctx, AV_LOG_ERROR, "Hybrid config not found\n");
1090 av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n");
1093 if(!got_float && avctx->sample_fmt == AV_SAMPLE_FMT_FLT){
1094 av_log(avctx, AV_LOG_ERROR, "Float information not found\n");
1097 if(s->got_extra_bits && avctx->sample_fmt != AV_SAMPLE_FMT_FLT){
1098 const int size = get_bits_left(&s->gb_extra_bits);
1099 const int wanted = s->samples * s->extra_bits << s->stereo_in;
1101 av_log(avctx, AV_LOG_ERROR, "Too small EXTRABITS\n");
1102 s->got_extra_bits = 0;
1105 s->samples_left = s->samples;
1107 init_get_bits(&s->gb, orig_buf + s->sc.offset, s->sc.size);
1108 skip_bits_long(&s->gb, s->sc.bits_used);
1109 if(s->got_extra_bits){
1110 init_get_bits(&s->gb_extra_bits, orig_buf + s->extra_sc.offset,
1112 skip_bits_long(&s->gb_extra_bits, s->extra_sc.bits_used);
1117 if(avctx->sample_fmt == AV_SAMPLE_FMT_S16)
1118 samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_S16);
1119 else if(avctx->sample_fmt == AV_SAMPLE_FMT_S32)
1120 samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_S32);
1122 samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_FLT);
1124 if (samplecount < 0)
1129 const int channel_stride = avctx->channels;
1131 if(avctx->sample_fmt == AV_SAMPLE_FMT_S16)
1132 samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_S16);
1133 else if(avctx->sample_fmt == AV_SAMPLE_FMT_S32)
1134 samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_S32);
1136 samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_FLT);
1138 if (samplecount < 0)
1141 if(s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S16){
1142 int16_t *dst = (int16_t*)samples + 1;
1143 int16_t *src = (int16_t*)samples;
1144 int cnt = samplecount;
1147 src += channel_stride;
1148 dst += channel_stride;
1150 }else if(s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S32){
1151 int32_t *dst = (int32_t*)samples + 1;
1152 int32_t *src = (int32_t*)samples;
1153 int cnt = samplecount;
1156 src += channel_stride;
1157 dst += channel_stride;
1159 }else if(s->stereo){
1160 float *dst = (float*)samples + 1;
1161 float *src = (float*)samples;
1162 int cnt = samplecount;
1165 src += channel_stride;
1166 dst += channel_stride;
1171 wc->samples_left = s->samples_left;
1173 return samplecount * bpp;
1176 static int wavpack_decode_frame(AVCodecContext *avctx,
1177 void *data, int *data_size,
1180 WavpackContext *s = avctx->priv_data;
1181 const uint8_t *buf = avpkt->data;
1182 int buf_size = avpkt->size;
1184 int samplecount = 0;
1187 s->samples_left = 0;
1191 s->samples = AV_RL32(buf); buf += 4;
1193 while(buf_size > 0){
1194 if(!s->multichannel){
1195 frame_size = buf_size;
1198 frame_size = AV_RL32(buf) - 12; buf += 4; buf_size -= 4;
1200 if(buf_size < 12) //MKV files can have zero flags after last block
1202 frame_size = AV_RL32(buf + 8) + 12;
1205 if(frame_size < 0 || frame_size > buf_size){
1206 av_log(avctx, AV_LOG_ERROR, "Block %d has invalid size (size %d vs. %d bytes left)\n",
1207 s->block, frame_size, buf_size);
1210 if((samplecount = wavpack_decode_block(avctx, s->block, data,
1211 data_size, buf, frame_size)) < 0)
1214 buf += frame_size; buf_size -= frame_size;
1216 *data_size = samplecount * avctx->channels;
1218 return s->samples_left > 0 ? 0 : avpkt->size;
1221 AVCodec ff_wavpack_decoder = {
1225 sizeof(WavpackContext),
1226 wavpack_decode_init,
1229 wavpack_decode_frame,
1230 .capabilities = CODEC_CAP_SUBFRAMES,
1231 .long_name = NULL_IF_CONFIG_SMALL("WavPack"),