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
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);
295 if(t >= 2) t = get_bits(gb, t - 1) | (1 << (t-1));
298 memset(ctx->ch[0].median, 0, sizeof(ctx->ch[0].median));
299 memset(ctx->ch[1].median, 0, sizeof(ctx->ch[1].median));
300 c->slow_level -= LEVEL_DECAY(c->slow_level);
306 if(get_bits_count(gb) >= ctx->data_size){
315 t = get_unary_0_33(gb);
316 if(get_bits_count(gb) >= ctx->data_size){
321 t2 = get_unary_0_33(gb);
323 else t += get_bits(gb, t2 - 1) | (1 << (t2 - 1));
333 ctx->zero = !ctx->one;
336 if(ctx->hybrid && !channel)
337 update_error_limit(ctx);
341 add = GET_MED(0) - 1;
345 add = GET_MED(1) - 1;
349 base = GET_MED(0) + GET_MED(1);
350 add = GET_MED(2) - 1;
355 base = GET_MED(0) + GET_MED(1) + GET_MED(2) * (t - 2);
356 add = GET_MED(2) - 1;
362 ret = base + get_tail(gb, add);
364 int mid = (base*2 + add + 1) >> 1;
365 while(add > c->error_limit){
370 add = mid - base - 1;
371 mid = (base*2 + add + 1) >> 1;
375 sign = get_bits1(gb);
376 if(ctx->hybrid_bitrate)
377 c->slow_level += wp_log2(ret) - LEVEL_DECAY(c->slow_level);
378 return sign ? ~ret : ret;
381 static inline int wv_get_value_integer(WavpackFrameContext *s, uint32_t *crc, int S)
388 if(s->got_extra_bits){
389 S |= get_bits(&s->gb_extra_bits, s->extra_bits);
390 *crc = *crc * 9 + (S&0xffff) * 3 + ((unsigned)S>>16);
393 bit = (S & s->and) | s->or;
394 return (((S + bit) << s->shift) - bit) << s->post_shift;
397 static float wv_get_value_float(WavpackFrameContext *s, uint32_t *crc, int S)
405 int exp = s->float_max_exp;
407 if(s->got_extra_bits){
408 const int max_bits = 1 + 23 + 8 + 1;
409 const int left_bits = get_bits_left(&s->gb_extra_bits);
411 if(left_bits + 8 * FF_INPUT_BUFFER_PADDING_SIZE < max_bits)
416 S <<= s->float_shift;
421 if(s->got_extra_bits && get_bits1(&s->gb_extra_bits)){
422 S = get_bits(&s->gb_extra_bits, 23);
428 int shift = 23 - av_log2(S);
429 exp = s->float_max_exp;
437 if((s->float_flag & WV_FLT_SHIFT_ONES) ||
438 (s->got_extra_bits && (s->float_flag & WV_FLT_SHIFT_SAME) && get_bits1(&s->gb_extra_bits)) ){
439 S |= (1 << shift) - 1;
440 } else if(s->got_extra_bits && (s->float_flag & WV_FLT_SHIFT_SENT)){
441 S |= get_bits(&s->gb_extra_bits, shift);
445 exp = s->float_max_exp;
451 if(s->got_extra_bits && (s->float_flag & WV_FLT_ZERO_SENT)){
452 if(get_bits1(&s->gb_extra_bits)){
453 S = get_bits(&s->gb_extra_bits, 23);
454 if(s->float_max_exp >= 25)
455 exp = get_bits(&s->gb_extra_bits, 8);
456 sign = get_bits1(&s->gb_extra_bits);
458 if(s->float_flag & WV_FLT_ZERO_SIGN)
459 sign = get_bits1(&s->gb_extra_bits);
464 *crc = *crc * 27 + S * 9 + exp * 3 + sign;
466 value.u = (sign << 31) | (exp << 23) | S;
470 static void wv_reset_saved_context(WavpackFrameContext *s)
474 s->sc.crc = s->extra_sc.crc = 0xFFFFFFFF;
477 static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, void *dst, const int type)
481 int A, B, L, L2, R, R2;
483 uint32_t crc = s->sc.crc;
484 uint32_t crc_extra_bits = s->extra_sc.crc;
485 int16_t *dst16 = dst;
486 int32_t *dst32 = dst;
488 const int channel_pad = s->avctx->channels - 2;
490 if(s->samples_left == s->samples)
491 s->one = s->zero = s->zeroes = 0;
493 L = wv_get_value(s, gb, 0, &last);
495 R = wv_get_value(s, gb, 1, &last);
497 for(i = 0; i < s->terms; i++){
498 t = s->decorr[i].value;
502 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
503 B = 2 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1];
505 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
506 B = (3 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1]) >> 1;
508 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
509 s->decorr[i].samplesB[1] = s->decorr[i].samplesB[0];
512 A = s->decorr[i].samplesA[pos];
513 B = s->decorr[i].samplesB[pos];
516 if(type != AV_SAMPLE_FMT_S16){
517 L2 = L + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
518 R2 = R + ((s->decorr[i].weightB * (int64_t)B + 512) >> 10);
520 L2 = L + ((s->decorr[i].weightA * A + 512) >> 10);
521 R2 = R + ((s->decorr[i].weightB * B + 512) >> 10);
523 if(A && L) s->decorr[i].weightA -= ((((L ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
524 if(B && R) s->decorr[i].weightB -= ((((R ^ B) >> 30) & 2) - 1) * s->decorr[i].delta;
525 s->decorr[i].samplesA[j] = L = L2;
526 s->decorr[i].samplesB[j] = R = R2;
528 if(type != AV_SAMPLE_FMT_S16)
529 L2 = L + ((s->decorr[i].weightA * (int64_t)s->decorr[i].samplesA[0] + 512) >> 10);
531 L2 = L + ((s->decorr[i].weightA * s->decorr[i].samplesA[0] + 512) >> 10);
532 UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, s->decorr[i].samplesA[0], L);
534 if(type != AV_SAMPLE_FMT_S16)
535 R2 = R + ((s->decorr[i].weightB * (int64_t)L2 + 512) >> 10);
537 R2 = R + ((s->decorr[i].weightB * L2 + 512) >> 10);
538 UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, L2, R);
540 s->decorr[i].samplesA[0] = R;
542 if(type != AV_SAMPLE_FMT_S16)
543 R2 = R + ((s->decorr[i].weightB * (int64_t)s->decorr[i].samplesB[0] + 512) >> 10);
545 R2 = R + ((s->decorr[i].weightB * s->decorr[i].samplesB[0] + 512) >> 10);
546 UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, s->decorr[i].samplesB[0], R);
550 R2 = s->decorr[i].samplesA[0];
551 s->decorr[i].samplesA[0] = R;
554 if(type != AV_SAMPLE_FMT_S16)
555 L2 = L + ((s->decorr[i].weightA * (int64_t)R2 + 512) >> 10);
557 L2 = L + ((s->decorr[i].weightA * R2 + 512) >> 10);
558 UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, R2, L);
560 s->decorr[i].samplesB[0] = L;
565 L += (R -= (L >> 1));
566 crc = (crc * 3 + L) * 3 + R;
568 if(type == AV_SAMPLE_FMT_FLT){
569 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, L);
570 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, R);
571 dstfl += channel_pad;
572 } else if(type == AV_SAMPLE_FMT_S32){
573 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, L);
574 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, R);
575 dst32 += channel_pad;
577 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, L);
578 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, R);
579 dst16 += channel_pad;
582 }while(!last && count < s->max_samples);
584 s->samples_left -= count;
585 if(!s->samples_left){
586 wv_reset_saved_context(s);
588 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
591 if(s->got_extra_bits && crc_extra_bits != s->crc_extra_bits){
592 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n");
598 s->sc.bits_used = get_bits_count(&s->gb);
599 if(s->got_extra_bits){
600 s->extra_sc.crc = crc_extra_bits;
601 s->extra_sc.bits_used = get_bits_count(&s->gb_extra_bits);
607 static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, void *dst, const int type)
613 uint32_t crc = s->sc.crc;
614 uint32_t crc_extra_bits = s->extra_sc.crc;
615 int16_t *dst16 = dst;
616 int32_t *dst32 = dst;
618 const int channel_stride = s->avctx->channels;
620 if(s->samples_left == s->samples)
621 s->one = s->zero = s->zeroes = 0;
623 T = wv_get_value(s, gb, 0, &last);
626 for(i = 0; i < s->terms; i++){
627 t = s->decorr[i].value;
630 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
632 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
633 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
636 A = s->decorr[i].samplesA[pos];
639 if(type != AV_SAMPLE_FMT_S16)
640 S = T + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
642 S = T + ((s->decorr[i].weightA * A + 512) >> 10);
643 if(A && T) s->decorr[i].weightA -= ((((T ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
644 s->decorr[i].samplesA[j] = T = S;
649 if(type == AV_SAMPLE_FMT_FLT){
650 *dstfl = wv_get_value_float(s, &crc_extra_bits, S);
651 dstfl += channel_stride;
652 }else if(type == AV_SAMPLE_FMT_S32){
653 *dst32 = wv_get_value_integer(s, &crc_extra_bits, S);
654 dst32 += channel_stride;
656 *dst16 = wv_get_value_integer(s, &crc_extra_bits, S);
657 dst16 += channel_stride;
660 }while(!last && count < s->max_samples);
662 s->samples_left -= count;
663 if(!s->samples_left){
664 wv_reset_saved_context(s);
666 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
669 if(s->got_extra_bits && crc_extra_bits != s->crc_extra_bits){
670 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n");
676 s->sc.bits_used = get_bits_count(&s->gb);
677 if(s->got_extra_bits){
678 s->extra_sc.crc = crc_extra_bits;
679 s->extra_sc.bits_used = get_bits_count(&s->gb_extra_bits);
685 static av_cold int wv_alloc_frame_context(WavpackContext *c)
688 if(c->fdec_num == WV_MAX_FRAME_DECODERS)
691 c->fdec[c->fdec_num] = av_mallocz(sizeof(**c->fdec));
692 if(!c->fdec[c->fdec_num])
695 c->fdec[c->fdec_num - 1]->avctx = c->avctx;
696 wv_reset_saved_context(c->fdec[c->fdec_num - 1]);
701 static av_cold int wavpack_decode_init(AVCodecContext *avctx)
703 WavpackContext *s = avctx->priv_data;
706 if(avctx->bits_per_coded_sample <= 16)
707 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
709 avctx->sample_fmt = AV_SAMPLE_FMT_S32;
710 if(avctx->channels <= 2 && !avctx->channel_layout)
711 avctx->channel_layout = (avctx->channels==2) ? AV_CH_LAYOUT_STEREO : AV_CH_LAYOUT_MONO;
713 s->multichannel = avctx->channels > 2;
714 /* lavf demuxer does not provide extradata, Matroska stores 0x403
715 there, use this to detect decoding mode for multichannel */
717 if(s->multichannel && avctx->extradata && avctx->extradata_size == 2){
718 int ver = AV_RL16(avctx->extradata);
719 if(ver >= 0x402 && ver <= 0x410)
728 static av_cold int wavpack_decode_end(AVCodecContext *avctx)
730 WavpackContext *s = avctx->priv_data;
733 for(i = 0; i < s->fdec_num; i++)
734 av_freep(&s->fdec[i]);
740 static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
741 void *data, int *data_size,
742 const uint8_t *buf, int buf_size)
744 WavpackContext *wc = avctx->priv_data;
745 WavpackFrameContext *s;
746 void *samples = data;
748 int got_terms = 0, got_weights = 0, got_samples = 0, got_entropy = 0, got_bs = 0, got_float = 0;
750 const uint8_t* orig_buf = buf;
751 const uint8_t* buf_end = buf + buf_size;
752 int i, j, id, size, ssize, weights, t;
753 int bpp, chan, chmask;
760 if(block_no >= wc->fdec_num && wv_alloc_frame_context(wc) < 0){
761 av_log(avctx, AV_LOG_ERROR, "Error creating frame decode context\n");
765 s = wc->fdec[block_no];
767 av_log(avctx, AV_LOG_ERROR, "Context for block %d is not present\n", block_no);
771 if(!s->samples_left){
772 memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr));
773 memset(s->ch, 0, sizeof(s->ch));
775 s->and = s->or = s->shift = 0;
776 s->got_extra_bits = 0;
780 s->samples = AV_RL32(buf); buf += 4;
786 s->samples = wc->samples;
788 s->frame_flags = AV_RL32(buf); buf += 4;
789 if(s->frame_flags&0x80){
791 avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
792 } else if((s->frame_flags&0x03) <= 1){
794 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
797 avctx->sample_fmt = AV_SAMPLE_FMT_S32;
799 samples = (uint8_t*)samples + bpp * wc->ch_offset;
801 s->stereo = !(s->frame_flags & WV_MONO);
802 s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo;
803 s->joint = s->frame_flags & WV_JOINT_STEREO;
804 s->hybrid = s->frame_flags & WV_HYBRID_MODE;
805 s->hybrid_bitrate = s->frame_flags & WV_HYBRID_BITRATE;
806 s->post_shift = 8 * (bpp-1-(s->frame_flags&0x03)) + ((s->frame_flags >> 13) & 0x1f);
807 s->CRC = AV_RL32(buf); buf += 4;
809 buf += 4; //skip block size;
811 wc->ch_offset += 1 + s->stereo;
813 s->max_samples = *data_size / (bpp * avctx->channels);
814 s->max_samples = FFMIN(s->max_samples, s->samples);
815 if(s->samples_left > 0){
816 s->max_samples = FFMIN(s->max_samples, s->samples_left);
820 // parse metadata blocks
821 while(buf < buf_end){
824 if(id & WP_IDF_LONG) {
825 size |= (*buf++) << 8;
826 size |= (*buf++) << 16;
828 size <<= 1; // size is specified in words
830 if(id & WP_IDF_ODD) size--;
832 av_log(avctx, AV_LOG_ERROR, "Got incorrect block %02X with size %i\n", id, size);
835 if(buf + ssize > buf_end){
836 av_log(avctx, AV_LOG_ERROR, "Block size %i is out of bounds\n", size);
839 if(id & WP_IDF_IGNORE){
843 switch(id & WP_IDF_MASK){
846 if(s->terms > MAX_TERMS){
847 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation terms\n");
851 for(i = 0; i < s->terms; i++) {
852 s->decorr[s->terms - i - 1].value = (*buf & 0x1F) - 5;
853 s->decorr[s->terms - i - 1].delta = *buf >> 5;
858 case WP_ID_DECWEIGHTS:
860 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
863 weights = size >> s->stereo_in;
864 if(weights > MAX_TERMS || weights > s->terms){
865 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation weights\n");
869 for(i = 0; i < weights; i++) {
870 t = (int8_t)(*buf++);
871 s->decorr[s->terms - i - 1].weightA = t << 3;
872 if(s->decorr[s->terms - i - 1].weightA > 0)
873 s->decorr[s->terms - i - 1].weightA += (s->decorr[s->terms - i - 1].weightA + 64) >> 7;
875 t = (int8_t)(*buf++);
876 s->decorr[s->terms - i - 1].weightB = t << 3;
877 if(s->decorr[s->terms - i - 1].weightB > 0)
878 s->decorr[s->terms - i - 1].weightB += (s->decorr[s->terms - i - 1].weightB + 64) >> 7;
883 case WP_ID_DECSAMPLES:
885 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
889 for(i = s->terms - 1; (i >= 0) && (t < size); i--) {
890 if(s->decorr[i].value > 8){
891 s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2;
892 s->decorr[i].samplesA[1] = wp_exp2(AV_RL16(buf)); buf += 2;
894 s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2;
895 s->decorr[i].samplesB[1] = wp_exp2(AV_RL16(buf)); buf += 2;
899 }else if(s->decorr[i].value < 0){
900 s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2;
901 s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2;
904 for(j = 0; j < s->decorr[i].value; j++){
905 s->decorr[i].samplesA[j] = wp_exp2(AV_RL16(buf)); buf += 2;
907 s->decorr[i].samplesB[j] = wp_exp2(AV_RL16(buf)); buf += 2;
910 t += s->decorr[i].value * 2 * (s->stereo_in + 1);
916 if(size != 6 * (s->stereo_in + 1)){
917 av_log(avctx, AV_LOG_ERROR, "Entropy vars size should be %i, got %i", 6 * (s->stereo_in + 1), size);
921 for(j = 0; j <= s->stereo_in; j++){
922 for(i = 0; i < 3; i++){
923 s->ch[j].median[i] = wp_exp2(AV_RL16(buf));
930 if(s->hybrid_bitrate){
931 for(i = 0; i <= s->stereo_in; i++){
932 s->ch[i].slow_level = wp_exp2(AV_RL16(buf));
937 for(i = 0; i < (s->stereo_in + 1); i++){
938 s->ch[i].bitrate_acc = AV_RL16(buf) << 16;
943 for(i = 0; i < (s->stereo_in + 1); i++){
944 s->ch[i].bitrate_delta = wp_exp2((int16_t)AV_RL16(buf));
948 for(i = 0; i < (s->stereo_in + 1); i++)
949 s->ch[i].bitrate_delta = 0;
953 case WP_ID_INT32INFO:
955 av_log(avctx, AV_LOG_ERROR, "Invalid INT32INFO, size = %i, sent_bits = %i\n", size, *buf);
960 s->extra_bits = buf[0];
972 case WP_ID_FLOATINFO:
974 av_log(avctx, AV_LOG_ERROR, "Invalid FLOATINFO, size = %i\n", size);
978 s->float_flag = buf[0];
979 s->float_shift = buf[1];
980 s->float_max_exp = buf[2];
985 s->sc.offset = buf - orig_buf;
986 s->sc.size = size * 8;
987 init_get_bits(&s->gb, buf, size * 8);
988 s->data_size = size * 8;
992 case WP_ID_EXTRABITS:
994 av_log(avctx, AV_LOG_ERROR, "Invalid EXTRABITS, size = %i\n", size);
998 s->extra_sc.offset = buf - orig_buf;
999 s->extra_sc.size = size * 8;
1000 init_get_bits(&s->gb_extra_bits, buf, size * 8);
1001 s->crc_extra_bits = get_bits_long(&s->gb_extra_bits, 32);
1003 s->got_extra_bits = 1;
1005 case WP_ID_CHANINFO:
1007 av_log(avctx, AV_LOG_ERROR, "Insufficient channel information\n");
1016 chmask = AV_RL16(buf);
1019 chmask = AV_RL24(buf);
1022 chmask = AV_RL32(buf);
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", size);
1030 chan = avctx->channels;
1031 chmask = avctx->channel_layout;
1033 if(chan != avctx->channels){
1034 av_log(avctx, AV_LOG_ERROR, "Block reports total %d channels, decoder believes it's %d channels\n",
1035 chan, avctx->channels);
1038 if(!avctx->channel_layout)
1039 avctx->channel_layout = chmask;
1045 if(id & WP_IDF_ODD) buf++;
1047 if(!s->samples_left){
1049 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n");
1053 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n");
1057 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n");
1061 av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n");
1064 if(s->hybrid && !got_hybrid){
1065 av_log(avctx, AV_LOG_ERROR, "Hybrid config not found\n");
1069 av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n");
1072 if(!got_float && avctx->sample_fmt == AV_SAMPLE_FMT_FLT){
1073 av_log(avctx, AV_LOG_ERROR, "Float information not found\n");
1076 if(s->got_extra_bits && avctx->sample_fmt != AV_SAMPLE_FMT_FLT){
1077 const int size = get_bits_left(&s->gb_extra_bits);
1078 const int wanted = s->samples * s->extra_bits << s->stereo_in;
1080 av_log(avctx, AV_LOG_ERROR, "Too small EXTRABITS\n");
1081 s->got_extra_bits = 0;
1084 s->samples_left = s->samples;
1086 init_get_bits(&s->gb, orig_buf + s->sc.offset, s->sc.size);
1087 skip_bits_long(&s->gb, s->sc.bits_used);
1088 if(s->got_extra_bits){
1089 init_get_bits(&s->gb_extra_bits, orig_buf + s->extra_sc.offset,
1091 skip_bits_long(&s->gb_extra_bits, s->extra_sc.bits_used);
1096 if(avctx->sample_fmt == AV_SAMPLE_FMT_S16)
1097 samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_S16);
1098 else if(avctx->sample_fmt == AV_SAMPLE_FMT_S32)
1099 samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_S32);
1101 samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_FLT);
1104 const int channel_stride = avctx->channels;
1106 if(avctx->sample_fmt == AV_SAMPLE_FMT_S16)
1107 samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_S16);
1108 else if(avctx->sample_fmt == AV_SAMPLE_FMT_S32)
1109 samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_S32);
1111 samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_FLT);
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;
1143 wc->samples_left = s->samples_left;
1145 return samplecount * bpp;
1148 static int wavpack_decode_frame(AVCodecContext *avctx,
1149 void *data, int *data_size,
1152 WavpackContext *s = avctx->priv_data;
1153 const uint8_t *buf = avpkt->data;
1154 int buf_size = avpkt->size;
1156 int samplecount = 0;
1159 s->samples_left = 0;
1163 s->samples = AV_RL32(buf); buf += 4;
1165 while(buf_size > 0){
1166 if(!s->multichannel){
1167 frame_size = buf_size;
1170 frame_size = AV_RL32(buf) - 12; buf += 4; buf_size -= 4;
1172 if(buf_size < 12) //MKV files can have zero flags after last block
1174 frame_size = AV_RL32(buf + 8) + 12;
1177 if(frame_size < 0 || frame_size > buf_size){
1178 av_log(avctx, AV_LOG_ERROR, "Block %d has invalid size (size %d vs. %d bytes left)\n",
1179 s->block, frame_size, buf_size);
1182 if((samplecount = wavpack_decode_block(avctx, s->block, data,
1183 data_size, buf, frame_size)) < 0)
1186 buf += frame_size; buf_size -= frame_size;
1188 *data_size = samplecount * avctx->channels;
1190 return s->samples_left > 0 ? 0 : avpkt->size;
1193 static void wavpack_decode_flush(AVCodecContext *avctx)
1195 WavpackContext *s = avctx->priv_data;
1198 for (i = 0; i < s->fdec_num; i++)
1199 wv_reset_saved_context(s->fdec[i]);
1202 AVCodec ff_wavpack_decoder = {
1204 .type = AVMEDIA_TYPE_AUDIO,
1205 .id = CODEC_ID_WAVPACK,
1206 .priv_data_size = sizeof(WavpackContext),
1207 .init = wavpack_decode_init,
1208 .close = wavpack_decode_end,
1209 .decode = wavpack_decode_frame,
1210 .flush = wavpack_decode_flush,
1211 .capabilities = CODEC_CAP_SUBFRAMES,
1212 .long_name = NULL_IF_CONFIG_SMALL("WavPack"),