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);
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)
473
s->sc.crc = s->extra_sc.crc = 0xFFFFFFFF;
476
static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, void *dst, const int type)
480
int A, B, L, L2, R, R2;
482
uint32_t crc = s->sc.crc;
483
uint32_t crc_extra_bits = s->extra_sc.crc;
484
int16_t *dst16 = dst;
485
int32_t *dst32 = dst;
487
const int channel_pad = s->avctx->channels - 2;
489
if(s->samples_left == s->samples)
490
s->one = s->zero = s->zeroes = 0;
492
L = wv_get_value(s, gb, 0, &last);
494
R = wv_get_value(s, gb, 1, &last);
496
for(i = 0; i < s->terms; i++){
497
t = s->decorr[i].value;
501
A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
502
B = 2 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1];
504
A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
505
B = (3 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1]) >> 1;
507
s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
508
s->decorr[i].samplesB[1] = s->decorr[i].samplesB[0];
511
A = s->decorr[i].samplesA[pos];
512
B = s->decorr[i].samplesB[pos];
515
if(type != AV_SAMPLE_FMT_S16){
516
L2 = L + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
517
R2 = R + ((s->decorr[i].weightB * (int64_t)B + 512) >> 10);
519
L2 = L + ((s->decorr[i].weightA * A + 512) >> 10);
520
R2 = R + ((s->decorr[i].weightB * B + 512) >> 10);
522
if(A && L) s->decorr[i].weightA -= ((((L ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
523
if(B && R) s->decorr[i].weightB -= ((((R ^ B) >> 30) & 2) - 1) * s->decorr[i].delta;
524
s->decorr[i].samplesA[j] = L = L2;
525
s->decorr[i].samplesB[j] = R = R2;
527
if(type != AV_SAMPLE_FMT_S16)
528
L2 = L + ((s->decorr[i].weightA * (int64_t)s->decorr[i].samplesA[0] + 512) >> 10);
530
L2 = L + ((s->decorr[i].weightA * s->decorr[i].samplesA[0] + 512) >> 10);
531
UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, s->decorr[i].samplesA[0], L);
533
if(type != AV_SAMPLE_FMT_S16)
534
R2 = R + ((s->decorr[i].weightB * (int64_t)L2 + 512) >> 10);
536
R2 = R + ((s->decorr[i].weightB * L2 + 512) >> 10);
537
UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, L2, R);
539
s->decorr[i].samplesA[0] = R;
541
if(type != AV_SAMPLE_FMT_S16)
542
R2 = R + ((s->decorr[i].weightB * (int64_t)s->decorr[i].samplesB[0] + 512) >> 10);
544
R2 = R + ((s->decorr[i].weightB * s->decorr[i].samplesB[0] + 512) >> 10);
545
UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, s->decorr[i].samplesB[0], R);
549
R2 = s->decorr[i].samplesA[0];
550
s->decorr[i].samplesA[0] = R;
553
if(type != AV_SAMPLE_FMT_S16)
554
L2 = L + ((s->decorr[i].weightA * (int64_t)R2 + 512) >> 10);
556
L2 = L + ((s->decorr[i].weightA * R2 + 512) >> 10);
557
UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, R2, L);
559
s->decorr[i].samplesB[0] = L;
564
L += (R -= (L >> 1));
565
crc = (crc * 3 + L) * 3 + R;
567
if(type == AV_SAMPLE_FMT_FLT){
568
*dstfl++ = wv_get_value_float(s, &crc_extra_bits, L);
569
*dstfl++ = wv_get_value_float(s, &crc_extra_bits, R);
570
dstfl += channel_pad;
571
} else if(type == AV_SAMPLE_FMT_S32){
572
*dst32++ = wv_get_value_integer(s, &crc_extra_bits, L);
573
*dst32++ = wv_get_value_integer(s, &crc_extra_bits, R);
574
dst32 += channel_pad;
576
*dst16++ = wv_get_value_integer(s, &crc_extra_bits, L);
577
*dst16++ = wv_get_value_integer(s, &crc_extra_bits, R);
578
dst16 += channel_pad;
581
}while(!last && count < s->max_samples);
583
s->samples_left -= count;
584
if(!s->samples_left){
586
av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
589
if(s->got_extra_bits && crc_extra_bits != s->crc_extra_bits){
590
av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n");
593
wv_reset_saved_context(s);
597
s->sc.bits_used = get_bits_count(&s->gb);
598
if(s->got_extra_bits){
599
s->extra_sc.crc = crc_extra_bits;
600
s->extra_sc.bits_used = get_bits_count(&s->gb_extra_bits);
606
static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, void *dst, const int type)
612
uint32_t crc = s->sc.crc;
613
uint32_t crc_extra_bits = s->extra_sc.crc;
614
int16_t *dst16 = dst;
615
int32_t *dst32 = dst;
617
const int channel_stride = s->avctx->channels;
619
if(s->samples_left == s->samples)
620
s->one = s->zero = s->zeroes = 0;
622
T = wv_get_value(s, gb, 0, &last);
625
for(i = 0; i < s->terms; i++){
626
t = s->decorr[i].value;
629
A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
631
A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
632
s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
635
A = s->decorr[i].samplesA[pos];
638
if(type != AV_SAMPLE_FMT_S16)
639
S = T + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
641
S = T + ((s->decorr[i].weightA * A + 512) >> 10);
642
if(A && T) s->decorr[i].weightA -= ((((T ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
643
s->decorr[i].samplesA[j] = T = S;
648
if(type == AV_SAMPLE_FMT_FLT){
649
*dstfl = wv_get_value_float(s, &crc_extra_bits, S);
650
dstfl += channel_stride;
651
}else if(type == AV_SAMPLE_FMT_S32){
652
*dst32 = wv_get_value_integer(s, &crc_extra_bits, S);
653
dst32 += channel_stride;
655
*dst16 = wv_get_value_integer(s, &crc_extra_bits, S);
656
dst16 += channel_stride;
659
}while(!last && count < s->max_samples);
661
s->samples_left -= count;
662
if(!s->samples_left){
664
av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
667
if(s->got_extra_bits && crc_extra_bits != s->crc_extra_bits){
668
av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n");
671
wv_reset_saved_context(s);
675
s->sc.bits_used = get_bits_count(&s->gb);
676
if(s->got_extra_bits){
677
s->extra_sc.crc = crc_extra_bits;
678
s->extra_sc.bits_used = get_bits_count(&s->gb_extra_bits);
684
static av_cold int wv_alloc_frame_context(WavpackContext *c)
687
if(c->fdec_num == WV_MAX_FRAME_DECODERS)
690
c->fdec[c->fdec_num] = av_mallocz(sizeof(**c->fdec));
691
if(!c->fdec[c->fdec_num])
694
c->fdec[c->fdec_num - 1]->avctx = c->avctx;
695
wv_reset_saved_context(c->fdec[c->fdec_num - 1]);
700
static av_cold int wavpack_decode_init(AVCodecContext *avctx)
702
WavpackContext *s = avctx->priv_data;
705
if(avctx->bits_per_coded_sample <= 16)
706
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
708
avctx->sample_fmt = AV_SAMPLE_FMT_S32;
709
if(avctx->channels <= 2 && !avctx->channel_layout)
710
avctx->channel_layout = (avctx->channels==2) ? AV_CH_LAYOUT_STEREO : AV_CH_LAYOUT_MONO;
712
s->multichannel = avctx->channels > 2;
713
/* lavf demuxer does not provide extradata, Matroska stores 0x403
714
there, use this to detect decoding mode for multichannel */
716
if(s->multichannel && avctx->extradata && avctx->extradata_size == 2){
717
int ver = AV_RL16(avctx->extradata);
718
if(ver >= 0x402 && ver <= 0x410)
727
static av_cold int wavpack_decode_end(AVCodecContext *avctx)
729
WavpackContext *s = avctx->priv_data;
732
for(i = 0; i < s->fdec_num; i++)
733
av_freep(&s->fdec[i]);
739
static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
740
void *data, int *data_size,
741
const uint8_t *buf, int buf_size)
743
WavpackContext *wc = avctx->priv_data;
744
WavpackFrameContext *s;
745
void *samples = data;
747
int got_terms = 0, got_weights = 0, got_samples = 0, got_entropy = 0, got_bs = 0, got_float = 0;
749
const uint8_t* orig_buf = buf;
750
const uint8_t* buf_end = buf + buf_size;
751
int i, j, id, size, ssize, weights, t;
752
int bpp, chan, chmask;
759
if(block_no >= wc->fdec_num && wv_alloc_frame_context(wc) < 0){
760
av_log(avctx, AV_LOG_ERROR, "Error creating frame decode context\n");
764
s = wc->fdec[block_no];
766
av_log(avctx, AV_LOG_ERROR, "Context for block %d is not present\n", block_no);
770
if(!s->samples_left){
771
memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr));
772
memset(s->ch, 0, sizeof(s->ch));
774
s->and = s->or = s->shift = 0;
775
s->got_extra_bits = 0;
779
s->samples = AV_RL32(buf); buf += 4;
785
s->samples = wc->samples;
787
s->frame_flags = AV_RL32(buf); buf += 4;
788
if(s->frame_flags&0x80){
790
avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
791
} else if((s->frame_flags&0x03) <= 1){
793
avctx->sample_fmt = AV_SAMPLE_FMT_S16;
796
avctx->sample_fmt = AV_SAMPLE_FMT_S32;
798
samples = (uint8_t*)samples + bpp * wc->ch_offset;
800
s->stereo = !(s->frame_flags & WV_MONO);
801
s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo;
802
s->joint = s->frame_flags & WV_JOINT_STEREO;
803
s->hybrid = s->frame_flags & WV_HYBRID_MODE;
804
s->hybrid_bitrate = s->frame_flags & WV_HYBRID_BITRATE;
805
s->post_shift = 8 * (bpp-1-(s->frame_flags&0x03)) + ((s->frame_flags >> 13) & 0x1f);
806
s->CRC = AV_RL32(buf); buf += 4;
808
buf += 4; //skip block size;
810
wc->ch_offset += 1 + s->stereo;
812
s->max_samples = *data_size / (bpp * avctx->channels);
813
s->max_samples = FFMIN(s->max_samples, s->samples);
814
if(s->samples_left > 0){
815
s->max_samples = FFMIN(s->max_samples, s->samples_left);
819
// parse metadata blocks
820
while(buf < buf_end){
823
if(id & WP_IDF_LONG) {
824
size |= (*buf++) << 8;
825
size |= (*buf++) << 16;
827
size <<= 1; // size is specified in words
829
if(id & WP_IDF_ODD) size--;
831
av_log(avctx, AV_LOG_ERROR, "Got incorrect block %02X with size %i\n", id, size);
834
if(buf + ssize > buf_end){
835
av_log(avctx, AV_LOG_ERROR, "Block size %i is out of bounds\n", size);
838
if(id & WP_IDF_IGNORE){
842
switch(id & WP_IDF_MASK){
845
if(s->terms > MAX_TERMS){
846
av_log(avctx, AV_LOG_ERROR, "Too many decorrelation terms\n");
850
for(i = 0; i < s->terms; i++) {
851
s->decorr[s->terms - i - 1].value = (*buf & 0x1F) - 5;
852
s->decorr[s->terms - i - 1].delta = *buf >> 5;
857
case WP_ID_DECWEIGHTS:
859
av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
862
weights = size >> s->stereo_in;
863
if(weights > MAX_TERMS || weights > s->terms){
864
av_log(avctx, AV_LOG_ERROR, "Too many decorrelation weights\n");
868
for(i = 0; i < weights; i++) {
869
t = (int8_t)(*buf++);
870
s->decorr[s->terms - i - 1].weightA = t << 3;
871
if(s->decorr[s->terms - i - 1].weightA > 0)
872
s->decorr[s->terms - i - 1].weightA += (s->decorr[s->terms - i - 1].weightA + 64) >> 7;
874
t = (int8_t)(*buf++);
875
s->decorr[s->terms - i - 1].weightB = t << 3;
876
if(s->decorr[s->terms - i - 1].weightB > 0)
877
s->decorr[s->terms - i - 1].weightB += (s->decorr[s->terms - i - 1].weightB + 64) >> 7;
882
case WP_ID_DECSAMPLES:
884
av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
888
for(i = s->terms - 1; (i >= 0) && (t < size); i--) {
889
if(s->decorr[i].value > 8){
890
s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2;
891
s->decorr[i].samplesA[1] = wp_exp2(AV_RL16(buf)); buf += 2;
893
s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2;
894
s->decorr[i].samplesB[1] = wp_exp2(AV_RL16(buf)); buf += 2;
898
}else if(s->decorr[i].value < 0){
899
s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2;
900
s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2;
903
for(j = 0; j < s->decorr[i].value; j++){
904
s->decorr[i].samplesA[j] = wp_exp2(AV_RL16(buf)); buf += 2;
906
s->decorr[i].samplesB[j] = wp_exp2(AV_RL16(buf)); buf += 2;
909
t += s->decorr[i].value * 2 * (s->stereo_in + 1);
915
if(size != 6 * (s->stereo_in + 1)){
916
av_log(avctx, AV_LOG_ERROR, "Entropy vars size should be %i, got %i", 6 * (s->stereo_in + 1), size);
920
for(j = 0; j <= s->stereo_in; j++){
921
for(i = 0; i < 3; i++){
922
s->ch[j].median[i] = wp_exp2(AV_RL16(buf));
929
if(s->hybrid_bitrate){
930
for(i = 0; i <= s->stereo_in; i++){
931
s->ch[i].slow_level = wp_exp2(AV_RL16(buf));
936
for(i = 0; i < (s->stereo_in + 1); i++){
937
s->ch[i].bitrate_acc = AV_RL16(buf) << 16;
942
for(i = 0; i < (s->stereo_in + 1); i++){
943
s->ch[i].bitrate_delta = wp_exp2((int16_t)AV_RL16(buf));
947
for(i = 0; i < (s->stereo_in + 1); i++)
948
s->ch[i].bitrate_delta = 0;
952
case WP_ID_INT32INFO:
954
av_log(avctx, AV_LOG_ERROR, "Invalid INT32INFO, size = %i, sent_bits = %i\n", size, *buf);
959
s->extra_bits = buf[0];
971
case WP_ID_FLOATINFO:
973
av_log(avctx, AV_LOG_ERROR, "Invalid FLOATINFO, size = %i\n", size);
977
s->float_flag = buf[0];
978
s->float_shift = buf[1];
979
s->float_max_exp = buf[2];
984
s->sc.offset = buf - orig_buf;
985
s->sc.size = size * 8;
986
init_get_bits(&s->gb, buf, size * 8);
987
s->data_size = size * 8;
991
case WP_ID_EXTRABITS:
993
av_log(avctx, AV_LOG_ERROR, "Invalid EXTRABITS, size = %i\n", size);
997
s->extra_sc.offset = buf - orig_buf;
998
s->extra_sc.size = size * 8;
999
init_get_bits(&s->gb_extra_bits, buf, size * 8);
1000
s->crc_extra_bits = get_bits_long(&s->gb_extra_bits, 32);
1002
s->got_extra_bits = 1;
1004
case WP_ID_CHANINFO:
1006
av_log(avctx, AV_LOG_ERROR, "Insufficient channel information\n");
1015
chmask = AV_RL16(buf);
1018
chmask = AV_RL24(buf);
1021
chmask = AV_RL32(buf);
1024
chan |= (buf[1] & 0xF) << 8;
1025
chmask = AV_RL24(buf + 2);
1028
av_log(avctx, AV_LOG_ERROR, "Invalid channel info size %d\n", size);
1029
chan = avctx->channels;
1030
chmask = avctx->channel_layout;
1032
if(chan != avctx->channels){
1033
av_log(avctx, AV_LOG_ERROR, "Block reports total %d channels, decoder believes it's %d channels\n",
1034
chan, avctx->channels);
1037
if(!avctx->channel_layout)
1038
avctx->channel_layout = chmask;
1044
if(id & WP_IDF_ODD) buf++;
1046
if(!s->samples_left){
1048
av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n");
1052
av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n");
1056
av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n");
1060
av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n");
1063
if(s->hybrid && !got_hybrid){
1064
av_log(avctx, AV_LOG_ERROR, "Hybrid config not found\n");
1068
av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n");
1071
if(!got_float && avctx->sample_fmt == AV_SAMPLE_FMT_FLT){
1072
av_log(avctx, AV_LOG_ERROR, "Float information not found\n");
1075
if(s->got_extra_bits && avctx->sample_fmt != AV_SAMPLE_FMT_FLT){
1076
const int size = get_bits_left(&s->gb_extra_bits);
1077
const int wanted = s->samples * s->extra_bits << s->stereo_in;
1079
av_log(avctx, AV_LOG_ERROR, "Too small EXTRABITS\n");
1080
s->got_extra_bits = 0;
1083
s->samples_left = s->samples;
1085
init_get_bits(&s->gb, orig_buf + s->sc.offset, s->sc.size);
1086
skip_bits_long(&s->gb, s->sc.bits_used);
1087
if(s->got_extra_bits){
1088
init_get_bits(&s->gb_extra_bits, orig_buf + s->extra_sc.offset,
1090
skip_bits_long(&s->gb_extra_bits, s->extra_sc.bits_used);
1095
if(avctx->sample_fmt == AV_SAMPLE_FMT_S16)
1096
samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_S16);
1097
else if(avctx->sample_fmt == AV_SAMPLE_FMT_S32)
1098
samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_S32);
1100
samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_FLT);
1103
const int channel_stride = avctx->channels;
1105
if(avctx->sample_fmt == AV_SAMPLE_FMT_S16)
1106
samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_S16);
1107
else if(avctx->sample_fmt == AV_SAMPLE_FMT_S32)
1108
samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_S32);
1110
samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_FLT);
1112
if(s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S16){
1113
int16_t *dst = (int16_t*)samples + 1;
1114
int16_t *src = (int16_t*)samples;
1115
int cnt = samplecount;
1118
src += channel_stride;
1119
dst += channel_stride;
1121
}else if(s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S32){
1122
int32_t *dst = (int32_t*)samples + 1;
1123
int32_t *src = (int32_t*)samples;
1124
int cnt = samplecount;
1127
src += channel_stride;
1128
dst += channel_stride;
1130
}else if(s->stereo){
1131
float *dst = (float*)samples + 1;
1132
float *src = (float*)samples;
1133
int cnt = samplecount;
1136
src += channel_stride;
1137
dst += channel_stride;
1142
wc->samples_left = s->samples_left;
1144
return samplecount * bpp;
1147
static int wavpack_decode_frame(AVCodecContext *avctx,
1148
void *data, int *data_size,
1151
WavpackContext *s = avctx->priv_data;
1152
const uint8_t *buf = avpkt->data;
1153
int buf_size = avpkt->size;
1155
int samplecount = 0;
1158
s->samples_left = 0;
1162
s->samples = AV_RL32(buf); buf += 4;
1164
while(buf_size > 0){
1165
if(!s->multichannel){
1166
frame_size = buf_size;
1169
frame_size = AV_RL32(buf) - 12; buf += 4; buf_size -= 4;
1171
if(buf_size < 12) //MKV files can have zero flags after last block
1173
frame_size = AV_RL32(buf + 8) + 12;
1176
if(frame_size < 0 || frame_size > buf_size){
1177
av_log(avctx, AV_LOG_ERROR, "Block %d has invalid size (size %d vs. %d bytes left)\n",
1178
s->block, frame_size, buf_size);
1181
if((samplecount = wavpack_decode_block(avctx, s->block, data,
1182
data_size, buf, frame_size)) < 0)
1185
buf += frame_size; buf_size -= frame_size;
1187
*data_size = samplecount * avctx->channels;
1189
return s->samples_left > 0 ? 0 : avpkt->size;
1192
AVCodec ff_wavpack_decoder = {
1196
sizeof(WavpackContext),
1197
wavpack_decode_init,
1200
wavpack_decode_frame,
1201
.capabilities = CODEC_CAP_SUBFRAMES,
1202
.long_name = NULL_IF_CONFIG_SMALL("WavPack"),