2 * WavPack lossless audio decoder
3 * Copyright (c) 2006 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
27 * @file libavcodec/wavpack.c
28 * WavPack lossless audio decoder
31 #define WV_MONO 0x00000004
32 #define WV_JOINT_STEREO 0x00000010
33 #define WV_FALSE_STEREO 0x40000000
35 #define WV_HYBRID_MODE 0x00000008
36 #define WV_HYBRID_SHAPE 0x00000008
37 #define WV_HYBRID_BITRATE 0x00000200
38 #define WV_HYBRID_BALANCE 0x00000400
66 typedef struct Decorr {
75 typedef struct WvChannel {
77 int slow_level, error_limit;
78 int bitrate_acc, bitrate_delta;
81 typedef struct WavpackContext {
82 AVCodecContext *avctx;
84 int stereo, stereo_in;
89 uint32_t crc_extra_bits;
90 GetBitContext gb_extra_bits;
91 int data_size; // in bits
94 Decorr decorr[MAX_TERMS];
95 int zero, one, zeroes;
99 int hybrid, hybrid_bitrate;
103 // exponent table copied from WavPack source
104 static const uint8_t wp_exp2_table [256] = {
105 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b,
106 0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15, 0x16, 0x16,
107 0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20, 0x21, 0x22, 0x23,
108 0x24, 0x24, 0x25, 0x26, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
109 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3a, 0x3b, 0x3c, 0x3d,
110 0x3e, 0x3f, 0x40, 0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x48, 0x49, 0x4a, 0x4b,
111 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
112 0x5b, 0x5c, 0x5d, 0x5e, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
113 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
114 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a,
115 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
116 0x9c, 0x9d, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad,
117 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0,
118 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc8, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf, 0xd0, 0xd2, 0xd3, 0xd4,
119 0xd6, 0xd7, 0xd8, 0xd9, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe8, 0xe9,
120 0xea, 0xec, 0xed, 0xee, 0xf0, 0xf1, 0xf2, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xff
123 static const uint8_t wp_log2_table [] = {
124 0x00, 0x01, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15,
125 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a,
126 0x2c, 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e,
127 0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
128 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
129 0x64, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75,
130 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
131 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
132 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4,
133 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb2,
134 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc0,
135 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcd, 0xce,
136 0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd8, 0xd9, 0xda, 0xdb,
137 0xdc, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe4, 0xe5, 0xe6, 0xe7, 0xe7,
138 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xee, 0xef, 0xf0, 0xf1, 0xf1, 0xf2, 0xf3, 0xf4,
139 0xf4, 0xf5, 0xf6, 0xf7, 0xf7, 0xf8, 0xf9, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xff, 0xff
142 static av_always_inline int wp_exp2(int16_t val)
151 res = wp_exp2_table[val & 0xFF] | 0x100;
153 res = (val > 9) ? (res << (val - 9)) : (res >> (9 - val));
154 return neg ? -res : res;
157 static av_always_inline int wp_log2(int32_t val)
166 bits = av_log2(val) + 1;
168 return (bits << 8) + wp_log2_table[(val << (9 - bits)) & 0xFF];
170 return (bits << 8) + wp_log2_table[(val >> (bits - 9)) & 0xFF];
173 #define LEVEL_DECAY(a) ((a + 0x80) >> 8)
175 // macros for manipulating median values
176 #define GET_MED(n) ((c->median[n] >> 4) + 1)
177 #define DEC_MED(n) c->median[n] -= ((c->median[n] + (128>>n) - 2) / (128>>n)) * 2
178 #define INC_MED(n) c->median[n] += ((c->median[n] + (128>>n)) / (128>>n)) * 5
180 // macros for applying weight
181 #define UPDATE_WEIGHT_CLIP(weight, delta, samples, in) \
183 if((samples ^ in) < 0){ \
185 if(weight < -1024) weight = -1024; \
188 if(weight > 1024) weight = 1024; \
193 static av_always_inline int get_tail(GetBitContext *gb, int k)
199 e = (1 << (p + 1)) - k - 1;
200 res = p ? get_bits(gb, p) : 0;
202 res = (res<<1) - e + get_bits1(gb);
207 static void update_error_limit(WavpackContext *ctx)
211 for(i = 0; i <= ctx->stereo_in; i++){
212 ctx->ch[i].bitrate_acc += ctx->ch[i].bitrate_delta;
213 br[i] = ctx->ch[i].bitrate_acc >> 16;
214 sl[i] = LEVEL_DECAY(ctx->ch[i].slow_level);
216 if(ctx->stereo_in && ctx->hybrid_bitrate){
217 int balance = (sl[1] - sl[0] + br[1] + 1) >> 1;
221 }else if(-balance > br[0]){
225 br[1] = br[0] + balance;
226 br[0] = br[0] - balance;
229 for(i = 0; i <= ctx->stereo_in; i++){
230 if(ctx->hybrid_bitrate){
231 if(sl[i] - br[i] > -0x100)
232 ctx->ch[i].error_limit = wp_exp2(sl[i] - br[i] + 0x100);
234 ctx->ch[i].error_limit = 0;
236 ctx->ch[i].error_limit = wp_exp2(br[i]);
241 static int wv_get_value(WavpackContext *ctx, GetBitContext *gb, int channel, int *last)
244 int sign, base, add, ret;
245 WvChannel *c = &ctx->ch[channel];
249 if((ctx->ch[0].median[0] < 2U) && (ctx->ch[1].median[0] < 2U) && !ctx->zero && !ctx->one){
253 c->slow_level -= LEVEL_DECAY(c->slow_level);
257 t = get_unary_0_33(gb);
258 if(t >= 2) t = get_bits(gb, t - 1) | (1 << (t-1));
261 memset(ctx->ch[0].median, 0, sizeof(ctx->ch[0].median));
262 memset(ctx->ch[1].median, 0, sizeof(ctx->ch[1].median));
263 c->slow_level -= LEVEL_DECAY(c->slow_level);
269 if(get_bits_count(gb) >= ctx->data_size){
278 t = get_unary_0_33(gb);
279 if(get_bits_count(gb) >= ctx->data_size){
284 t2 = get_unary_0_33(gb);
286 else t += get_bits(gb, t2 - 1) | (1 << (t2 - 1));
296 ctx->zero = !ctx->one;
299 if(ctx->hybrid && !channel)
300 update_error_limit(ctx);
304 add = GET_MED(0) - 1;
308 add = GET_MED(1) - 1;
312 base = GET_MED(0) + GET_MED(1);
313 add = GET_MED(2) - 1;
318 base = GET_MED(0) + GET_MED(1) + GET_MED(2) * (t - 2);
319 add = GET_MED(2) - 1;
325 ret = base + get_tail(gb, add);
327 int mid = (base*2 + add + 1) >> 1;
328 while(add > c->error_limit){
333 add = mid - base - 1;
334 mid = (base*2 + add + 1) >> 1;
338 sign = get_bits1(gb);
339 if(ctx->hybrid_bitrate)
340 c->slow_level += wp_log2(ret) - LEVEL_DECAY(c->slow_level);
341 return sign ? ~ret : ret;
344 static inline int wv_unpack_stereo(WavpackContext *s, GetBitContext *gb, void *dst, const int hires)
348 int A, B, L, L2, R, R2, bit;
350 uint32_t crc = 0xFFFFFFFF;
351 uint32_t crc_extra_bits = 0xFFFFFFFF;
352 int16_t *dst16 = dst;
353 int32_t *dst32 = dst;
355 s->one = s->zero = s->zeroes = 0;
357 L = wv_get_value(s, gb, 0, &last);
359 R = wv_get_value(s, gb, 1, &last);
361 for(i = 0; i < s->terms; i++){
362 t = s->decorr[i].value;
367 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
368 B = 2 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1];
370 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
371 B = (3 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1]) >> 1;
373 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
374 s->decorr[i].samplesB[1] = s->decorr[i].samplesB[0];
377 A = s->decorr[i].samplesA[pos];
378 B = s->decorr[i].samplesB[pos];
382 L2 = L + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
383 R2 = R + ((s->decorr[i].weightB * (int64_t)B + 512) >> 10);
385 L2 = L + ((s->decorr[i].weightA * A + 512) >> 10);
386 R2 = R + ((s->decorr[i].weightB * B + 512) >> 10);
388 if(A && L) s->decorr[i].weightA -= ((((L ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
389 if(B && R) s->decorr[i].weightB -= ((((R ^ B) >> 30) & 2) - 1) * s->decorr[i].delta;
390 s->decorr[i].samplesA[j] = L = L2;
391 s->decorr[i].samplesB[j] = R = R2;
394 L2 = L + ((s->decorr[i].weightA * (int64_t)s->decorr[i].samplesA[0] + 512) >> 10);
396 L2 = L + ((s->decorr[i].weightA * s->decorr[i].samplesA[0] + 512) >> 10);
397 UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, s->decorr[i].samplesA[0], L);
400 R2 = R + ((s->decorr[i].weightB * (int64_t)L2 + 512) >> 10);
402 R2 = R + ((s->decorr[i].weightB * L2 + 512) >> 10);
403 UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, L2, R);
405 s->decorr[i].samplesA[0] = R;
408 R2 = R + ((s->decorr[i].weightB * (int64_t)s->decorr[i].samplesB[0] + 512) >> 10);
410 R2 = R + ((s->decorr[i].weightB * s->decorr[i].samplesB[0] + 512) >> 10);
411 UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, s->decorr[i].samplesB[0], R);
415 R2 = s->decorr[i].samplesA[0];
416 s->decorr[i].samplesA[0] = R;
420 L2 = L + ((s->decorr[i].weightA * (int64_t)R2 + 512) >> 10);
422 L2 = L + ((s->decorr[i].weightA * R2 + 512) >> 10);
423 UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, R2, L);
425 s->decorr[i].samplesB[0] = L;
430 L += (R -= (L >> 1));
431 crc = (crc * 3 + L) * 3 + R;
436 if(s->got_extra_bits){
437 L |= get_bits(&s->gb_extra_bits, s->extra_bits);
438 crc_extra_bits = crc_extra_bits * 9 + (L&0xffff) * 3 + ((unsigned)L>>16);
440 R |= get_bits(&s->gb_extra_bits, s->extra_bits);
441 crc_extra_bits = crc_extra_bits * 9 + (R&0xffff) * 3 + ((unsigned)R>>16);
444 bit = (L & s->and) | s->or;
446 *dst32++ = (((L + bit) << s->shift) - bit) << s->post_shift;
448 *dst16++ = (((L + bit) << s->shift) - bit) << s->post_shift;
449 bit = (R & s->and) | s->or;
451 *dst32++ = (((R + bit) << s->shift) - bit) << s->post_shift;
453 *dst16++ = (((R + bit) << s->shift) - bit) << s->post_shift;
455 }while(!last && count < s->samples);
458 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
461 if(s->got_extra_bits && crc_extra_bits != s->crc_extra_bits){
462 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n");
468 static inline int wv_unpack_mono(WavpackContext *s, GetBitContext *gb, void *dst, const int hires)
474 uint32_t crc = 0xFFFFFFFF;
475 uint32_t crc_extra_bits = 0xFFFFFFFF;
476 int16_t *dst16 = dst;
477 int32_t *dst32 = dst;
479 s->one = s->zero = s->zeroes = 0;
481 T = wv_get_value(s, gb, 0, &last);
484 for(i = 0; i < s->terms; i++){
485 t = s->decorr[i].value;
488 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
490 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
491 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
494 A = s->decorr[i].samplesA[pos];
498 S = T + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
500 S = T + ((s->decorr[i].weightA * A + 512) >> 10);
501 if(A && T) s->decorr[i].weightA -= ((((T ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
502 s->decorr[i].samplesA[j] = T = S;
509 if(s->got_extra_bits){
510 S |= get_bits(&s->gb_extra_bits, s->extra_bits);
511 crc_extra_bits = crc_extra_bits * 9 + (S&0xffff) * 3 + ((unsigned)S>>16);
515 bit = (S & s->and) | s->or;
517 *dst32++ = (((S + bit) << s->shift) - bit) << s->post_shift;
519 *dst16++ = (((S + bit) << s->shift) - bit) << s->post_shift;
521 }while(!last && count < s->samples);
524 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
527 if(s->got_extra_bits && crc_extra_bits != s->crc_extra_bits){
528 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n");
534 static av_cold int wavpack_decode_init(AVCodecContext *avctx)
536 WavpackContext *s = avctx->priv_data;
539 s->stereo = (avctx->channels == 2);
540 if(avctx->bits_per_coded_sample <= 16)
541 avctx->sample_fmt = SAMPLE_FMT_S16;
543 avctx->sample_fmt = SAMPLE_FMT_S32;
544 avctx->channel_layout = (avctx->channels==2) ? CH_LAYOUT_STEREO : CH_LAYOUT_MONO;
549 static int wavpack_decode_frame(AVCodecContext *avctx,
550 void *data, int *data_size,
553 const uint8_t *buf = avpkt->data;
554 int buf_size = avpkt->size;
555 WavpackContext *s = avctx->priv_data;
556 void *samples = data;
558 int got_terms = 0, got_weights = 0, got_samples = 0, got_entropy = 0, got_bs = 0;
560 const uint8_t* buf_end = buf + buf_size;
561 int i, j, id, size, ssize, weights, t;
569 memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr));
570 memset(s->ch, 0, sizeof(s->ch));
572 s->and = s->or = s->shift = 0;
573 s->got_extra_bits = 0;
575 s->samples = AV_RL32(buf); buf += 4;
580 s->frame_flags = AV_RL32(buf); buf += 4;
581 if((s->frame_flags&0x03) <= 1){
583 avctx->sample_fmt = SAMPLE_FMT_S16;
586 avctx->sample_fmt = SAMPLE_FMT_S32;
588 s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo;
589 s->joint = s->frame_flags & WV_JOINT_STEREO;
590 s->hybrid = s->frame_flags & WV_HYBRID_MODE;
591 s->hybrid_bitrate = s->frame_flags & WV_HYBRID_BITRATE;
592 s->post_shift = 8 * (bpp-1-(s->frame_flags&0x03)) + ((s->frame_flags >> 13) & 0x1f);
593 s->CRC = AV_RL32(buf); buf += 4;
595 /* should not happen but who knows */
596 if(s->samples * bpp * avctx->channels > *data_size){
597 av_log(avctx, AV_LOG_ERROR, "Packet size is too big to be handled in lavc!\n");
601 // parse metadata blocks
602 while(buf < buf_end){
605 if(id & WP_IDF_LONG) {
606 size |= (*buf++) << 8;
607 size |= (*buf++) << 16;
609 size <<= 1; // size is specified in words
611 if(id & WP_IDF_ODD) size--;
613 av_log(avctx, AV_LOG_ERROR, "Got incorrect block %02X with size %i\n", id, size);
616 if(buf + ssize > buf_end){
617 av_log(avctx, AV_LOG_ERROR, "Block size %i is out of bounds\n", size);
620 if(id & WP_IDF_IGNORE){
624 switch(id & WP_IDF_MASK){
627 if(s->terms > MAX_TERMS){
628 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation terms\n");
632 for(i = 0; i < s->terms; i++) {
633 s->decorr[s->terms - i - 1].value = (*buf & 0x1F) - 5;
634 s->decorr[s->terms - i - 1].delta = *buf >> 5;
639 case WP_ID_DECWEIGHTS:
641 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
644 weights = size >> s->stereo_in;
645 if(weights > MAX_TERMS || weights > s->terms){
646 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation weights\n");
650 for(i = 0; i < weights; i++) {
651 t = (int8_t)(*buf++);
652 s->decorr[s->terms - i - 1].weightA = t << 3;
653 if(s->decorr[s->terms - i - 1].weightA > 0)
654 s->decorr[s->terms - i - 1].weightA += (s->decorr[s->terms - i - 1].weightA + 64) >> 7;
656 t = (int8_t)(*buf++);
657 s->decorr[s->terms - i - 1].weightB = t << 3;
658 if(s->decorr[s->terms - i - 1].weightB > 0)
659 s->decorr[s->terms - i - 1].weightB += (s->decorr[s->terms - i - 1].weightB + 64) >> 7;
664 case WP_ID_DECSAMPLES:
666 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
670 for(i = s->terms - 1; (i >= 0) && (t < size); i--) {
671 if(s->decorr[i].value > 8){
672 s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2;
673 s->decorr[i].samplesA[1] = wp_exp2(AV_RL16(buf)); buf += 2;
675 s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2;
676 s->decorr[i].samplesB[1] = wp_exp2(AV_RL16(buf)); buf += 2;
680 }else if(s->decorr[i].value < 0){
681 s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2;
682 s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2;
685 for(j = 0; j < s->decorr[i].value; j++){
686 s->decorr[i].samplesA[j] = wp_exp2(AV_RL16(buf)); buf += 2;
688 s->decorr[i].samplesB[j] = wp_exp2(AV_RL16(buf)); buf += 2;
691 t += s->decorr[i].value * 2 * (s->stereo_in + 1);
697 if(size != 6 * (s->stereo_in + 1)){
698 av_log(avctx, AV_LOG_ERROR, "Entropy vars size should be %i, got %i", 6 * (s->stereo_in + 1), size);
702 for(j = 0; j <= s->stereo_in; j++){
703 for(i = 0; i < 3; i++){
704 s->ch[j].median[i] = wp_exp2(AV_RL16(buf));
711 if(s->hybrid_bitrate){
712 for(i = 0; i <= s->stereo_in; i++){
713 s->ch[i].slow_level = wp_exp2(AV_RL16(buf));
718 for(i = 0; i < (s->stereo_in + 1); i++){
719 s->ch[i].bitrate_acc = AV_RL16(buf) << 16;
724 for(i = 0; i < (s->stereo_in + 1); i++){
725 s->ch[i].bitrate_delta = wp_exp2((int16_t)AV_RL16(buf));
729 for(i = 0; i < (s->stereo_in + 1); i++)
730 s->ch[i].bitrate_delta = 0;
734 case WP_ID_INT32INFO:
736 av_log(avctx, AV_LOG_ERROR, "Invalid INT32INFO, size = %i, sent_bits = %i\n", size, *buf);
741 s->extra_bits = buf[0];
754 init_get_bits(&s->gb, buf, size * 8);
755 s->data_size = size * 8;
759 case WP_ID_EXTRABITS:
761 av_log(avctx, AV_LOG_ERROR, "Invalid EXTRABITS, size = %i\n", size);
765 init_get_bits(&s->gb_extra_bits, buf, size * 8);
766 s->crc_extra_bits = get_bits_long(&s->gb_extra_bits, 32);
768 s->got_extra_bits = 1;
773 if(id & WP_IDF_ODD) buf++;
776 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n");
780 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n");
784 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n");
788 av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n");
791 if(s->hybrid && !got_hybrid){
792 av_log(avctx, AV_LOG_ERROR, "Hybrid config not found\n");
796 av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n");
802 samplecount = wv_unpack_stereo(s, &s->gb, samples, 0);
804 samplecount = wv_unpack_stereo(s, &s->gb, samples, 1);
807 samplecount = wv_unpack_mono(s, &s->gb, samples, 0);
809 samplecount = wv_unpack_mono(s, &s->gb, samples, 1);
810 if(s->stereo && bpp == 2){
811 int16_t *dst = (int16_t*)samples + samplecount * 2;
812 int16_t *src = (int16_t*)samples + samplecount;
813 int cnt = samplecount;
819 }else if(s->stereo){ //32-bit output
820 int32_t *dst = (int32_t*)samples + samplecount * 2;
821 int32_t *src = (int32_t*)samples + samplecount;
822 int cnt = samplecount;
830 *data_size = samplecount * bpp;
835 AVCodec wavpack_decoder = {
839 sizeof(WavpackContext),
843 wavpack_decode_frame,
844 .long_name = NULL_IF_CONFIG_SMALL("WavPack"),