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
40 #define WV_FLT_SHIFT_ONES 0x01
41 #define WV_FLT_SHIFT_SAME 0x02
42 #define WV_FLT_SHIFT_SENT 0x04
43 #define WV_FLT_ZERO_SENT 0x08
44 #define WV_FLT_ZERO_SIGN 0x10
72 typedef struct Decorr
{
81 typedef struct WvChannel
{
83 int slow_level
, error_limit
;
84 int bitrate_acc
, bitrate_delta
;
87 typedef struct WavpackContext
{
88 AVCodecContext
*avctx
;
90 int stereo
, stereo_in
;
95 uint32_t crc_extra_bits
;
96 GetBitContext gb_extra_bits
;
97 int data_size
; // in bits
100 Decorr decorr
[MAX_TERMS
];
101 int zero
, one
, zeroes
;
105 int hybrid
, hybrid_bitrate
;
112 // exponent table copied from WavPack source
113 static const uint8_t wp_exp2_table
[256] = {
114 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b,
115 0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15, 0x16, 0x16,
116 0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20, 0x21, 0x22, 0x23,
117 0x24, 0x24, 0x25, 0x26, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
118 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3a, 0x3b, 0x3c, 0x3d,
119 0x3e, 0x3f, 0x40, 0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x48, 0x49, 0x4a, 0x4b,
120 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
121 0x5b, 0x5c, 0x5d, 0x5e, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
122 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
123 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a,
124 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
125 0x9c, 0x9d, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad,
126 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0,
127 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc8, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf, 0xd0, 0xd2, 0xd3, 0xd4,
128 0xd6, 0xd7, 0xd8, 0xd9, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe8, 0xe9,
129 0xea, 0xec, 0xed, 0xee, 0xf0, 0xf1, 0xf2, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xff
132 static const uint8_t wp_log2_table
[] = {
133 0x00, 0x01, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15,
134 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a,
135 0x2c, 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e,
136 0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
137 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
138 0x64, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75,
139 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
140 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
141 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4,
142 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb2,
143 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc0,
144 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcd, 0xce,
145 0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd8, 0xd9, 0xda, 0xdb,
146 0xdc, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe4, 0xe5, 0xe6, 0xe7, 0xe7,
147 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xee, 0xef, 0xf0, 0xf1, 0xf1, 0xf2, 0xf3, 0xf4,
148 0xf4, 0xf5, 0xf6, 0xf7, 0xf7, 0xf8, 0xf9, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xff, 0xff
151 static av_always_inline
int wp_exp2(int16_t val
)
160 res
= wp_exp2_table
[val
& 0xFF] | 0x100;
162 res
= (val
> 9) ? (res
<< (val
- 9)) : (res
>> (9 - val
));
163 return neg
? -res
: res
;
166 static av_always_inline
int wp_log2(int32_t val
)
175 bits
= av_log2(val
) + 1;
177 return (bits
<< 8) + wp_log2_table
[(val
<< (9 - bits
)) & 0xFF];
179 return (bits
<< 8) + wp_log2_table
[(val
>> (bits
- 9)) & 0xFF];
182 #define LEVEL_DECAY(a) ((a + 0x80) >> 8)
184 // macros for manipulating median values
185 #define GET_MED(n) ((c->median[n] >> 4) + 1)
186 #define DEC_MED(n) c->median[n] -= ((c->median[n] + (128>>n) - 2) / (128>>n)) * 2
187 #define INC_MED(n) c->median[n] += ((c->median[n] + (128>>n)) / (128>>n)) * 5
189 // macros for applying weight
190 #define UPDATE_WEIGHT_CLIP(weight, delta, samples, in) \
192 if((samples ^ in) < 0){ \
194 if(weight < -1024) weight = -1024; \
197 if(weight > 1024) weight = 1024; \
202 static av_always_inline
int get_tail(GetBitContext
*gb
, int k
)
208 e
= (1 << (p
+ 1)) - k
- 1;
209 res
= p
? get_bits(gb
, p
) : 0;
211 res
= (res
<<1) - e
+ get_bits1(gb
);
216 static void update_error_limit(WavpackContext
*ctx
)
220 for(i
= 0; i
<= ctx
->stereo_in
; i
++){
221 ctx
->ch
[i
].bitrate_acc
+= ctx
->ch
[i
].bitrate_delta
;
222 br
[i
] = ctx
->ch
[i
].bitrate_acc
>> 16;
223 sl
[i
] = LEVEL_DECAY(ctx
->ch
[i
].slow_level
);
225 if(ctx
->stereo_in
&& ctx
->hybrid_bitrate
){
226 int balance
= (sl
[1] - sl
[0] + br
[1] + 1) >> 1;
230 }else if(-balance
> br
[0]){
234 br
[1] = br
[0] + balance
;
235 br
[0] = br
[0] - balance
;
238 for(i
= 0; i
<= ctx
->stereo_in
; i
++){
239 if(ctx
->hybrid_bitrate
){
240 if(sl
[i
] - br
[i
] > -0x100)
241 ctx
->ch
[i
].error_limit
= wp_exp2(sl
[i
] - br
[i
] + 0x100);
243 ctx
->ch
[i
].error_limit
= 0;
245 ctx
->ch
[i
].error_limit
= wp_exp2(br
[i
]);
250 static int wv_get_value(WavpackContext
*ctx
, GetBitContext
*gb
, int channel
, int *last
)
253 int sign
, base
, add
, ret
;
254 WvChannel
*c
= &ctx
->ch
[channel
];
258 if((ctx
->ch
[0].median
[0] < 2U) && (ctx
->ch
[1].median
[0] < 2U) && !ctx
->zero
&& !ctx
->one
){
262 c
->slow_level
-= LEVEL_DECAY(c
->slow_level
);
266 t
= get_unary_0_33(gb
);
267 if(t
>= 2) t
= get_bits(gb
, t
- 1) | (1 << (t
-1));
270 memset(ctx
->ch
[0].median
, 0, sizeof(ctx
->ch
[0].median
));
271 memset(ctx
->ch
[1].median
, 0, sizeof(ctx
->ch
[1].median
));
272 c
->slow_level
-= LEVEL_DECAY(c
->slow_level
);
278 if(get_bits_count(gb
) >= ctx
->data_size
){
287 t
= get_unary_0_33(gb
);
288 if(get_bits_count(gb
) >= ctx
->data_size
){
293 t2
= get_unary_0_33(gb
);
295 else t
+= get_bits(gb
, t2
- 1) | (1 << (t2
- 1));
305 ctx
->zero
= !ctx
->one
;
308 if(ctx
->hybrid
&& !channel
)
309 update_error_limit(ctx
);
313 add
= GET_MED(0) - 1;
317 add
= GET_MED(1) - 1;
321 base
= GET_MED(0) + GET_MED(1);
322 add
= GET_MED(2) - 1;
327 base
= GET_MED(0) + GET_MED(1) + GET_MED(2) * (t
- 2);
328 add
= GET_MED(2) - 1;
334 ret
= base
+ get_tail(gb
, add
);
336 int mid
= (base
*2 + add
+ 1) >> 1;
337 while(add
> c
->error_limit
){
342 add
= mid
- base
- 1;
343 mid
= (base
*2 + add
+ 1) >> 1;
347 sign
= get_bits1(gb
);
348 if(ctx
->hybrid_bitrate
)
349 c
->slow_level
+= wp_log2(ret
) - LEVEL_DECAY(c
->slow_level
);
350 return sign
? ~ret
: ret
;
353 static inline int wv_get_value_integer(WavpackContext
*s
, uint32_t *crc
, int S
)
360 if(s
->got_extra_bits
){
361 S
|= get_bits(&s
->gb_extra_bits
, s
->extra_bits
);
362 *crc
= *crc
* 9 + (S
&0xffff) * 3 + ((unsigned)S
>>16);
365 bit
= (S
& s
->and) | s
->or;
366 return (((S
+ bit
) << s
->shift
) - bit
) << s
->post_shift
;
369 static float wv_get_value_float(WavpackContext
*s
, uint32_t *crc
, int S
)
377 int exp
= s
->float_max_exp
;
379 if(s
->got_extra_bits
){
380 const int max_bits
= 1 + 23 + 8 + 1;
381 const int left_bits
= s
->gb_extra_bits
.size_in_bits
- get_bits_count(&s
->gb_extra_bits
);
383 if(left_bits
+ 8 * FF_INPUT_BUFFER_PADDING_SIZE
< max_bits
)
388 S
<<= s
->float_shift
;
393 if(s
->got_extra_bits
&& get_bits1(&s
->gb_extra_bits
)){
394 S
= get_bits(&s
->gb_extra_bits
, 23);
400 int shift
= 23 - av_log2(S
);
401 exp
= s
->float_max_exp
;
409 if((s
->float_flag
& WV_FLT_SHIFT_ONES
) ||
410 (s
->got_extra_bits
&& (s
->float_flag
& WV_FLT_SHIFT_SAME
) && get_bits1(&s
->gb_extra_bits
)) ){
411 S
|= (1 << shift
) - 1;
412 } else if(s
->got_extra_bits
&& (s
->float_flag
& WV_FLT_SHIFT_SENT
)){
413 S
|= get_bits(&s
->gb_extra_bits
, shift
);
417 exp
= s
->float_max_exp
;
423 if(s
->got_extra_bits
&& (s
->float_flag
& WV_FLT_ZERO_SENT
)){
424 if(get_bits1(&s
->gb_extra_bits
)){
425 S
= get_bits(&s
->gb_extra_bits
, 23);
426 if(s
->float_max_exp
>= 25)
427 exp
= get_bits(&s
->gb_extra_bits
, 8);
428 sign
= get_bits1(&s
->gb_extra_bits
);
430 if(s
->float_flag
& WV_FLT_ZERO_SIGN
)
431 sign
= get_bits1(&s
->gb_extra_bits
);
436 *crc
= *crc
* 27 + S
* 9 + exp
* 3 + sign
;
438 value
.u
= (sign
<< 31) | (exp
<< 23) | S
;
442 static inline int wv_unpack_stereo(WavpackContext
*s
, GetBitContext
*gb
, void *dst
, const int type
)
446 int A
, B
, L
, L2
, R
, R2
;
448 uint32_t crc
= 0xFFFFFFFF;
449 uint32_t crc_extra_bits
= 0xFFFFFFFF;
450 int16_t *dst16
= dst
;
451 int32_t *dst32
= dst
;
454 s
->one
= s
->zero
= s
->zeroes
= 0;
456 L
= wv_get_value(s
, gb
, 0, &last
);
458 R
= wv_get_value(s
, gb
, 1, &last
);
460 for(i
= 0; i
< s
->terms
; i
++){
461 t
= s
->decorr
[i
].value
;
465 A
= 2 * s
->decorr
[i
].samplesA
[0] - s
->decorr
[i
].samplesA
[1];
466 B
= 2 * s
->decorr
[i
].samplesB
[0] - s
->decorr
[i
].samplesB
[1];
468 A
= (3 * s
->decorr
[i
].samplesA
[0] - s
->decorr
[i
].samplesA
[1]) >> 1;
469 B
= (3 * s
->decorr
[i
].samplesB
[0] - s
->decorr
[i
].samplesB
[1]) >> 1;
471 s
->decorr
[i
].samplesA
[1] = s
->decorr
[i
].samplesA
[0];
472 s
->decorr
[i
].samplesB
[1] = s
->decorr
[i
].samplesB
[0];
475 A
= s
->decorr
[i
].samplesA
[pos
];
476 B
= s
->decorr
[i
].samplesB
[pos
];
479 if(type
!= SAMPLE_FMT_S16
){
480 L2
= L
+ ((s
->decorr
[i
].weightA
* (int64_t)A
+ 512) >> 10);
481 R2
= R
+ ((s
->decorr
[i
].weightB
* (int64_t)B
+ 512) >> 10);
483 L2
= L
+ ((s
->decorr
[i
].weightA
* A
+ 512) >> 10);
484 R2
= R
+ ((s
->decorr
[i
].weightB
* B
+ 512) >> 10);
486 if(A
&& L
) s
->decorr
[i
].weightA
-= ((((L
^ A
) >> 30) & 2) - 1) * s
->decorr
[i
].delta
;
487 if(B
&& R
) s
->decorr
[i
].weightB
-= ((((R
^ B
) >> 30) & 2) - 1) * s
->decorr
[i
].delta
;
488 s
->decorr
[i
].samplesA
[j
] = L
= L2
;
489 s
->decorr
[i
].samplesB
[j
] = R
= R2
;
491 if(type
!= SAMPLE_FMT_S16
)
492 L2
= L
+ ((s
->decorr
[i
].weightA
* (int64_t)s
->decorr
[i
].samplesA
[0] + 512) >> 10);
494 L2
= L
+ ((s
->decorr
[i
].weightA
* s
->decorr
[i
].samplesA
[0] + 512) >> 10);
495 UPDATE_WEIGHT_CLIP(s
->decorr
[i
].weightA
, s
->decorr
[i
].delta
, s
->decorr
[i
].samplesA
[0], L
);
497 if(type
!= SAMPLE_FMT_S16
)
498 R2
= R
+ ((s
->decorr
[i
].weightB
* (int64_t)L2
+ 512) >> 10);
500 R2
= R
+ ((s
->decorr
[i
].weightB
* L2
+ 512) >> 10);
501 UPDATE_WEIGHT_CLIP(s
->decorr
[i
].weightB
, s
->decorr
[i
].delta
, L2
, R
);
503 s
->decorr
[i
].samplesA
[0] = R
;
505 if(type
!= SAMPLE_FMT_S16
)
506 R2
= R
+ ((s
->decorr
[i
].weightB
* (int64_t)s
->decorr
[i
].samplesB
[0] + 512) >> 10);
508 R2
= R
+ ((s
->decorr
[i
].weightB
* s
->decorr
[i
].samplesB
[0] + 512) >> 10);
509 UPDATE_WEIGHT_CLIP(s
->decorr
[i
].weightB
, s
->decorr
[i
].delta
, s
->decorr
[i
].samplesB
[0], R
);
513 R2
= s
->decorr
[i
].samplesA
[0];
514 s
->decorr
[i
].samplesA
[0] = R
;
517 if(type
!= SAMPLE_FMT_S16
)
518 L2
= L
+ ((s
->decorr
[i
].weightA
* (int64_t)R2
+ 512) >> 10);
520 L2
= L
+ ((s
->decorr
[i
].weightA
* R2
+ 512) >> 10);
521 UPDATE_WEIGHT_CLIP(s
->decorr
[i
].weightA
, s
->decorr
[i
].delta
, R2
, L
);
523 s
->decorr
[i
].samplesB
[0] = L
;
528 L
+= (R
-= (L
>> 1));
529 crc
= (crc
* 3 + L
) * 3 + R
;
531 if(type
== SAMPLE_FMT_FLT
){
532 *dstfl
++ = wv_get_value_float(s
, &crc_extra_bits
, L
);
533 *dstfl
++ = wv_get_value_float(s
, &crc_extra_bits
, R
);
534 } else if(type
== SAMPLE_FMT_S32
){
535 *dst32
++ = wv_get_value_integer(s
, &crc_extra_bits
, L
);
536 *dst32
++ = wv_get_value_integer(s
, &crc_extra_bits
, R
);
538 *dst16
++ = wv_get_value_integer(s
, &crc_extra_bits
, L
);
539 *dst16
++ = wv_get_value_integer(s
, &crc_extra_bits
, R
);
542 }while(!last
&& count
< s
->samples
);
545 av_log(s
->avctx
, AV_LOG_ERROR
, "CRC error\n");
548 if(s
->got_extra_bits
&& crc_extra_bits
!= s
->crc_extra_bits
){
549 av_log(s
->avctx
, AV_LOG_ERROR
, "Extra bits CRC error\n");
555 static inline int wv_unpack_mono(WavpackContext
*s
, GetBitContext
*gb
, void *dst
, const int type
)
561 uint32_t crc
= 0xFFFFFFFF;
562 uint32_t crc_extra_bits
= 0xFFFFFFFF;
563 int16_t *dst16
= dst
;
564 int32_t *dst32
= dst
;
567 s
->one
= s
->zero
= s
->zeroes
= 0;
569 T
= wv_get_value(s
, gb
, 0, &last
);
572 for(i
= 0; i
< s
->terms
; i
++){
573 t
= s
->decorr
[i
].value
;
576 A
= 2 * s
->decorr
[i
].samplesA
[0] - s
->decorr
[i
].samplesA
[1];
578 A
= (3 * s
->decorr
[i
].samplesA
[0] - s
->decorr
[i
].samplesA
[1]) >> 1;
579 s
->decorr
[i
].samplesA
[1] = s
->decorr
[i
].samplesA
[0];
582 A
= s
->decorr
[i
].samplesA
[pos
];
585 if(type
!= SAMPLE_FMT_S16
)
586 S
= T
+ ((s
->decorr
[i
].weightA
* (int64_t)A
+ 512) >> 10);
588 S
= T
+ ((s
->decorr
[i
].weightA
* A
+ 512) >> 10);
589 if(A
&& T
) s
->decorr
[i
].weightA
-= ((((T
^ A
) >> 30) & 2) - 1) * s
->decorr
[i
].delta
;
590 s
->decorr
[i
].samplesA
[j
] = T
= S
;
595 if(type
== SAMPLE_FMT_FLT
)
596 *dstfl
++ = wv_get_value_float(s
, &crc_extra_bits
, S
);
597 else if(type
== SAMPLE_FMT_S32
)
598 *dst32
++ = wv_get_value_integer(s
, &crc_extra_bits
, S
);
600 *dst16
++ = wv_get_value_integer(s
, &crc_extra_bits
, S
);
602 }while(!last
&& count
< s
->samples
);
605 av_log(s
->avctx
, AV_LOG_ERROR
, "CRC error\n");
608 if(s
->got_extra_bits
&& crc_extra_bits
!= s
->crc_extra_bits
){
609 av_log(s
->avctx
, AV_LOG_ERROR
, "Extra bits CRC error\n");
615 static av_cold
int wavpack_decode_init(AVCodecContext
*avctx
)
617 WavpackContext
*s
= avctx
->priv_data
;
620 s
->stereo
= (avctx
->channels
== 2);
621 if(avctx
->bits_per_coded_sample
<= 16)
622 avctx
->sample_fmt
= SAMPLE_FMT_S16
;
624 avctx
->sample_fmt
= SAMPLE_FMT_S32
;
625 avctx
->channel_layout
= (avctx
->channels
==2) ? CH_LAYOUT_STEREO
: CH_LAYOUT_MONO
;
630 static int wavpack_decode_frame(AVCodecContext
*avctx
,
631 void *data
, int *data_size
,
634 const uint8_t *buf
= avpkt
->data
;
635 int buf_size
= avpkt
->size
;
636 WavpackContext
*s
= avctx
->priv_data
;
637 void *samples
= data
;
639 int got_terms
= 0, got_weights
= 0, got_samples
= 0, got_entropy
= 0, got_bs
= 0, got_float
= 0;
641 const uint8_t* buf_end
= buf
+ buf_size
;
642 int i
, j
, id
, size
, ssize
, weights
, t
;
650 memset(s
->decorr
, 0, MAX_TERMS
* sizeof(Decorr
));
651 memset(s
->ch
, 0, sizeof(s
->ch
));
653 s
->and = s
->or = s
->shift
= 0;
654 s
->got_extra_bits
= 0;
656 s
->samples
= AV_RL32(buf
); buf
+= 4;
661 s
->frame_flags
= AV_RL32(buf
); buf
+= 4;
662 if(s
->frame_flags
&0x80){
664 avctx
->sample_fmt
= SAMPLE_FMT_FLT
;
665 } else if((s
->frame_flags
&0x03) <= 1){
667 avctx
->sample_fmt
= SAMPLE_FMT_S16
;
670 avctx
->sample_fmt
= SAMPLE_FMT_S32
;
672 s
->stereo_in
= (s
->frame_flags
& WV_FALSE_STEREO
) ? 0 : s
->stereo
;
673 s
->joint
= s
->frame_flags
& WV_JOINT_STEREO
;
674 s
->hybrid
= s
->frame_flags
& WV_HYBRID_MODE
;
675 s
->hybrid_bitrate
= s
->frame_flags
& WV_HYBRID_BITRATE
;
676 s
->post_shift
= 8 * (bpp
-1-(s
->frame_flags
&0x03)) + ((s
->frame_flags
>> 13) & 0x1f);
677 s
->CRC
= AV_RL32(buf
); buf
+= 4;
679 /* should not happen but who knows */
680 if(s
->samples
* bpp
* avctx
->channels
> *data_size
){
681 av_log(avctx
, AV_LOG_ERROR
, "Packet size is too big to be handled in lavc!\n");
685 // parse metadata blocks
686 while(buf
< buf_end
){
689 if(id
& WP_IDF_LONG
) {
690 size
|= (*buf
++) << 8;
691 size
|= (*buf
++) << 16;
693 size
<<= 1; // size is specified in words
695 if(id
& WP_IDF_ODD
) size
--;
697 av_log(avctx
, AV_LOG_ERROR
, "Got incorrect block %02X with size %i\n", id
, size
);
700 if(buf
+ ssize
> buf_end
){
701 av_log(avctx
, AV_LOG_ERROR
, "Block size %i is out of bounds\n", size
);
704 if(id
& WP_IDF_IGNORE
){
708 switch(id
& WP_IDF_MASK
){
711 if(s
->terms
> MAX_TERMS
){
712 av_log(avctx
, AV_LOG_ERROR
, "Too many decorrelation terms\n");
716 for(i
= 0; i
< s
->terms
; i
++) {
717 s
->decorr
[s
->terms
- i
- 1].value
= (*buf
& 0x1F) - 5;
718 s
->decorr
[s
->terms
- i
- 1].delta
= *buf
>> 5;
723 case WP_ID_DECWEIGHTS
:
725 av_log(avctx
, AV_LOG_ERROR
, "No decorrelation terms met\n");
728 weights
= size
>> s
->stereo_in
;
729 if(weights
> MAX_TERMS
|| weights
> s
->terms
){
730 av_log(avctx
, AV_LOG_ERROR
, "Too many decorrelation weights\n");
734 for(i
= 0; i
< weights
; i
++) {
735 t
= (int8_t)(*buf
++);
736 s
->decorr
[s
->terms
- i
- 1].weightA
= t
<< 3;
737 if(s
->decorr
[s
->terms
- i
- 1].weightA
> 0)
738 s
->decorr
[s
->terms
- i
- 1].weightA
+= (s
->decorr
[s
->terms
- i
- 1].weightA
+ 64) >> 7;
740 t
= (int8_t)(*buf
++);
741 s
->decorr
[s
->terms
- i
- 1].weightB
= t
<< 3;
742 if(s
->decorr
[s
->terms
- i
- 1].weightB
> 0)
743 s
->decorr
[s
->terms
- i
- 1].weightB
+= (s
->decorr
[s
->terms
- i
- 1].weightB
+ 64) >> 7;
748 case WP_ID_DECSAMPLES
:
750 av_log(avctx
, AV_LOG_ERROR
, "No decorrelation terms met\n");
754 for(i
= s
->terms
- 1; (i
>= 0) && (t
< size
); i
--) {
755 if(s
->decorr
[i
].value
> 8){
756 s
->decorr
[i
].samplesA
[0] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
757 s
->decorr
[i
].samplesA
[1] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
759 s
->decorr
[i
].samplesB
[0] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
760 s
->decorr
[i
].samplesB
[1] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
764 }else if(s
->decorr
[i
].value
< 0){
765 s
->decorr
[i
].samplesA
[0] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
766 s
->decorr
[i
].samplesB
[0] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
769 for(j
= 0; j
< s
->decorr
[i
].value
; j
++){
770 s
->decorr
[i
].samplesA
[j
] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
772 s
->decorr
[i
].samplesB
[j
] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
775 t
+= s
->decorr
[i
].value
* 2 * (s
->stereo_in
+ 1);
781 if(size
!= 6 * (s
->stereo_in
+ 1)){
782 av_log(avctx
, AV_LOG_ERROR
, "Entropy vars size should be %i, got %i", 6 * (s
->stereo_in
+ 1), size
);
786 for(j
= 0; j
<= s
->stereo_in
; j
++){
787 for(i
= 0; i
< 3; i
++){
788 s
->ch
[j
].median
[i
] = wp_exp2(AV_RL16(buf
));
795 if(s
->hybrid_bitrate
){
796 for(i
= 0; i
<= s
->stereo_in
; i
++){
797 s
->ch
[i
].slow_level
= wp_exp2(AV_RL16(buf
));
802 for(i
= 0; i
< (s
->stereo_in
+ 1); i
++){
803 s
->ch
[i
].bitrate_acc
= AV_RL16(buf
) << 16;
808 for(i
= 0; i
< (s
->stereo_in
+ 1); i
++){
809 s
->ch
[i
].bitrate_delta
= wp_exp2((int16_t)AV_RL16(buf
));
813 for(i
= 0; i
< (s
->stereo_in
+ 1); i
++)
814 s
->ch
[i
].bitrate_delta
= 0;
818 case WP_ID_INT32INFO
:
820 av_log(avctx
, AV_LOG_ERROR
, "Invalid INT32INFO, size = %i, sent_bits = %i\n", size
, *buf
);
825 s
->extra_bits
= buf
[0];
837 case WP_ID_FLOATINFO
:
839 av_log(avctx
, AV_LOG_ERROR
, "Invalid FLOATINFO, size = %i\n", size
);
843 s
->float_flag
= buf
[0];
844 s
->float_shift
= buf
[1];
845 s
->float_max_exp
= buf
[2];
850 init_get_bits(&s
->gb
, buf
, size
* 8);
851 s
->data_size
= size
* 8;
855 case WP_ID_EXTRABITS
:
857 av_log(avctx
, AV_LOG_ERROR
, "Invalid EXTRABITS, size = %i\n", size
);
861 init_get_bits(&s
->gb_extra_bits
, buf
, size
* 8);
862 s
->crc_extra_bits
= get_bits_long(&s
->gb_extra_bits
, 32);
864 s
->got_extra_bits
= 1;
869 if(id
& WP_IDF_ODD
) buf
++;
872 av_log(avctx
, AV_LOG_ERROR
, "No block with decorrelation terms\n");
876 av_log(avctx
, AV_LOG_ERROR
, "No block with decorrelation weights\n");
880 av_log(avctx
, AV_LOG_ERROR
, "No block with decorrelation samples\n");
884 av_log(avctx
, AV_LOG_ERROR
, "No block with entropy info\n");
887 if(s
->hybrid
&& !got_hybrid
){
888 av_log(avctx
, AV_LOG_ERROR
, "Hybrid config not found\n");
892 av_log(avctx
, AV_LOG_ERROR
, "Packed samples not found\n");
895 if(!got_float
&& avctx
->sample_fmt
== SAMPLE_FMT_FLT
){
896 av_log(avctx
, AV_LOG_ERROR
, "Float information not found\n");
899 if(s
->got_extra_bits
&& avctx
->sample_fmt
!= SAMPLE_FMT_FLT
){
900 const int size
= s
->gb_extra_bits
.size_in_bits
- get_bits_count(&s
->gb_extra_bits
);
901 const int wanted
= s
->samples
* s
->extra_bits
<< s
->stereo_in
;
903 av_log(avctx
, AV_LOG_ERROR
, "Too small EXTRABITS\n");
904 s
->got_extra_bits
= 0;
909 if(avctx
->sample_fmt
== SAMPLE_FMT_S16
)
910 samplecount
= wv_unpack_stereo(s
, &s
->gb
, samples
, SAMPLE_FMT_S16
);
911 else if(avctx
->sample_fmt
== SAMPLE_FMT_S32
)
912 samplecount
= wv_unpack_stereo(s
, &s
->gb
, samples
, SAMPLE_FMT_S32
);
914 samplecount
= wv_unpack_stereo(s
, &s
->gb
, samples
, SAMPLE_FMT_FLT
);
917 if(avctx
->sample_fmt
== SAMPLE_FMT_S16
)
918 samplecount
= wv_unpack_mono(s
, &s
->gb
, samples
, SAMPLE_FMT_S16
);
919 else if(avctx
->sample_fmt
== SAMPLE_FMT_S32
)
920 samplecount
= wv_unpack_mono(s
, &s
->gb
, samples
, SAMPLE_FMT_S32
);
922 samplecount
= wv_unpack_mono(s
, &s
->gb
, samples
, SAMPLE_FMT_FLT
);
924 if(s
->stereo
&& avctx
->sample_fmt
== SAMPLE_FMT_S16
){
925 int16_t *dst
= (int16_t*)samples
+ samplecount
* 2;
926 int16_t *src
= (int16_t*)samples
+ samplecount
;
927 int cnt
= samplecount
;
933 }else if(s
->stereo
&& avctx
->sample_fmt
== SAMPLE_FMT_S32
){
934 int32_t *dst
= (int32_t*)samples
+ samplecount
* 2;
935 int32_t *src
= (int32_t*)samples
+ samplecount
;
936 int cnt
= samplecount
;
943 float *dst
= (float*)samples
+ samplecount
* 2;
944 float *src
= (float*)samples
+ samplecount
;
945 int cnt
= samplecount
;
953 *data_size
= samplecount
* bpp
;
958 AVCodec wavpack_decoder
= {
962 sizeof(WavpackContext
),
966 wavpack_decode_frame
,
967 .long_name
= NULL_IF_CONFIG_SMALL("WavPack"),