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
23 #include "bitstream.h"
28 * WavPack lossless audio decoder
31 #define WV_JOINT_STEREO 0x00000010
32 #define WV_FALSE_STEREO 0x40000000
60 typedef struct Decorr
{
69 typedef struct WavpackContext
{
70 AVCodecContext
*avctx
;
71 int stereo
, stereo_in
;
75 int data_size
; // in bits
79 Decorr decorr
[MAX_TERMS
];
80 int zero
, one
, zeroes
;
84 // exponent table copied from WavPack source
85 static const uint8_t wp_exp2_table
[256] = {
86 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b,
87 0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15, 0x16, 0x16,
88 0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20, 0x21, 0x22, 0x23,
89 0x24, 0x24, 0x25, 0x26, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
90 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3a, 0x3b, 0x3c, 0x3d,
91 0x3e, 0x3f, 0x40, 0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x48, 0x49, 0x4a, 0x4b,
92 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
93 0x5b, 0x5c, 0x5d, 0x5e, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
94 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
95 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a,
96 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
97 0x9c, 0x9d, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad,
98 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0,
99 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc8, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf, 0xd0, 0xd2, 0xd3, 0xd4,
100 0xd6, 0xd7, 0xd8, 0xd9, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe8, 0xe9,
101 0xea, 0xec, 0xed, 0xee, 0xf0, 0xf1, 0xf2, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xff
104 static av_always_inline
int wp_exp2(int16_t val
)
113 res
= wp_exp2_table
[val
& 0xFF] | 0x100;
115 res
= (val
> 9) ? (res
<< (val
- 9)) : (res
>> (9 - val
));
116 return neg
? -res
: res
;
119 // macros for manipulating median values
120 #define GET_MED(n) ((median[n] >> 4) + 1)
121 #define DEC_MED(n) median[n] -= ((median[n] + (128>>n) - 2) / (128>>n)) * 2
122 #define INC_MED(n) median[n] += ((median[n] + (128>>n)) / (128>>n)) * 5
124 // macros for applying weight
125 #define UPDATE_WEIGHT_CLIP(weight, delta, samples, in) \
127 if((samples ^ in) < 0){ \
129 if(weight < -1024) weight = -1024; \
132 if(weight > 1024) weight = 1024; \
137 static av_always_inline
int get_tail(GetBitContext
*gb
, int k
)
143 e
= (1 << (p
+ 1)) - k
- 1;
144 res
= p
? get_bits(gb
, p
) : 0;
146 res
= (res
<<1) - e
+ get_bits1(gb
);
151 static int wv_get_value(WavpackContext
*ctx
, GetBitContext
*gb
, int *median
, int *last
)
154 int sign
, base
, add
, ret
;
158 if((ctx
->median
[0] < 2U) && (ctx
->median
[3] < 2U) && !ctx
->zero
&& !ctx
->one
){
164 t
= get_unary_0_33(gb
);
165 if(t
>= 2) t
= get_bits(gb
, t
- 1) | (1 << (t
-1));
168 memset(ctx
->median
, 0, sizeof(ctx
->median
));
174 if(get_bits_count(gb
) >= ctx
->data_size
){
183 t
= get_unary_0_33(gb
);
184 if(get_bits_count(gb
) >= ctx
->data_size
){
189 t2
= get_unary_0_33(gb
);
191 else t
+= get_bits(gb
, t2
- 1) | (1 << (t2
- 1));
201 ctx
->zero
= !ctx
->one
;
206 add
= GET_MED(0) - 1;
210 add
= GET_MED(1) - 1;
214 base
= GET_MED(0) + GET_MED(1);
215 add
= GET_MED(2) - 1;
220 base
= GET_MED(0) + GET_MED(1) + GET_MED(2) * (t
- 2);
221 add
= GET_MED(2) - 1;
226 ret
= base
+ get_tail(gb
, add
);
227 sign
= get_bits1(gb
);
228 return sign
? ~ret
: ret
;
231 static int wv_unpack_stereo(WavpackContext
*s
, GetBitContext
*gb
, int16_t *dst
)
235 int A
, B
, L
, L2
, R
, R2
, bit
;
237 uint32_t crc
= 0xFFFFFFFF;
239 s
->one
= s
->zero
= s
->zeroes
= 0;
241 L
= wv_get_value(s
, gb
, s
->median
, &last
);
243 R
= wv_get_value(s
, gb
, s
->median
+ 3, &last
);
245 for(i
= 0; i
< s
->terms
; i
++){
246 t
= s
->decorr
[i
].value
;
251 A
= 2 * s
->decorr
[i
].samplesA
[0] - s
->decorr
[i
].samplesA
[1];
252 B
= 2 * s
->decorr
[i
].samplesB
[0] - s
->decorr
[i
].samplesB
[1];
254 A
= (3 * s
->decorr
[i
].samplesA
[0] - s
->decorr
[i
].samplesA
[1]) >> 1;
255 B
= (3 * s
->decorr
[i
].samplesB
[0] - s
->decorr
[i
].samplesB
[1]) >> 1;
257 s
->decorr
[i
].samplesA
[1] = s
->decorr
[i
].samplesA
[0];
258 s
->decorr
[i
].samplesB
[1] = s
->decorr
[i
].samplesB
[0];
261 A
= s
->decorr
[i
].samplesA
[pos
];
262 B
= s
->decorr
[i
].samplesB
[pos
];
265 L2
= L
+ ((s
->decorr
[i
].weightA
* A
+ 512) >> 10);
266 R2
= R
+ ((s
->decorr
[i
].weightB
* B
+ 512) >> 10);
267 if(A
&& L
) s
->decorr
[i
].weightA
-= ((((L
^ A
) >> 30) & 2) - 1) * s
->decorr
[i
].delta
;
268 if(B
&& R
) s
->decorr
[i
].weightB
-= ((((R
^ B
) >> 30) & 2) - 1) * s
->decorr
[i
].delta
;
269 s
->decorr
[i
].samplesA
[j
] = L
= L2
;
270 s
->decorr
[i
].samplesB
[j
] = R
= R2
;
272 L2
= L
+ ((s
->decorr
[i
].weightA
* s
->decorr
[i
].samplesA
[0] + 512) >> 10);
273 UPDATE_WEIGHT_CLIP(s
->decorr
[i
].weightA
, s
->decorr
[i
].delta
, s
->decorr
[i
].samplesA
[0], L
);
275 R2
= R
+ ((s
->decorr
[i
].weightB
* L2
+ 512) >> 10);
276 UPDATE_WEIGHT_CLIP(s
->decorr
[i
].weightB
, s
->decorr
[i
].delta
, L2
, R
);
278 s
->decorr
[i
].samplesA
[0] = R
;
280 R2
= R
+ ((s
->decorr
[i
].weightB
* s
->decorr
[i
].samplesB
[0] + 512) >> 10);
281 UPDATE_WEIGHT_CLIP(s
->decorr
[i
].weightB
, s
->decorr
[i
].delta
, s
->decorr
[i
].samplesB
[0], R
);
285 R2
= s
->decorr
[i
].samplesA
[0];
286 s
->decorr
[i
].samplesA
[0] = R
;
289 L2
= L
+ ((s
->decorr
[i
].weightA
* R2
+ 512) >> 10);
290 UPDATE_WEIGHT_CLIP(s
->decorr
[i
].weightA
, s
->decorr
[i
].delta
, R2
, L
);
292 s
->decorr
[i
].samplesB
[0] = L
;
297 L
+= (R
-= (L
>> 1));
298 crc
= (crc
* 3 + L
) * 3 + R
;
299 bit
= (L
& s
->and) | s
->or;
300 *dst
++ = ((L
+ bit
) << s
->shift
) - bit
;
301 bit
= (R
& s
->and) | s
->or;
302 *dst
++ = ((R
+ bit
) << s
->shift
) - bit
;
304 }while(!last
&& count
< s
->samples
);
307 av_log(s
->avctx
, AV_LOG_ERROR
, "CRC error\n");
313 static int wv_unpack_mono(WavpackContext
*s
, GetBitContext
*gb
, int16_t *dst
)
319 uint32_t crc
= 0xFFFFFFFF;
321 s
->one
= s
->zero
= s
->zeroes
= 0;
323 T
= wv_get_value(s
, gb
, s
->median
, &last
);
326 for(i
= 0; i
< s
->terms
; i
++){
327 t
= s
->decorr
[i
].value
;
330 A
= 2 * s
->decorr
[i
].samplesA
[0] - s
->decorr
[i
].samplesA
[1];
332 A
= (3 * s
->decorr
[i
].samplesA
[0] - s
->decorr
[i
].samplesA
[1]) >> 1;
333 s
->decorr
[i
].samplesA
[1] = s
->decorr
[i
].samplesA
[0];
336 A
= s
->decorr
[i
].samplesA
[pos
];
339 S
= T
+ ((s
->decorr
[i
].weightA
* A
+ 512) >> 10);
340 if(A
&& T
) s
->decorr
[i
].weightA
-= ((((T
^ A
) >> 30) & 2) - 1) * s
->decorr
[i
].delta
;
341 s
->decorr
[i
].samplesA
[j
] = T
= S
;
345 bit
= (S
& s
->and) | s
->or;
346 *dst
++ = ((S
+ bit
) << s
->shift
) - bit
;
348 }while(!last
&& count
< s
->samples
);
351 av_log(s
->avctx
, AV_LOG_ERROR
, "CRC error\n");
357 static av_cold
int wavpack_decode_init(AVCodecContext
*avctx
)
359 WavpackContext
*s
= avctx
->priv_data
;
362 s
->stereo
= (avctx
->channels
== 2);
367 static int wavpack_decode_frame(AVCodecContext
*avctx
,
368 void *data
, int *data_size
,
369 const uint8_t *buf
, int buf_size
)
371 WavpackContext
*s
= avctx
->priv_data
;
372 int16_t *samples
= data
;
374 int got_terms
= 0, got_weights
= 0, got_samples
= 0, got_entropy
= 0, got_bs
= 0;
375 const uint8_t* buf_end
= buf
+ buf_size
;
376 int i
, j
, id
, size
, ssize
, weights
, t
;
383 memset(s
->decorr
, 0, MAX_TERMS
* sizeof(Decorr
));
384 memset(s
->median
, 0, sizeof(s
->median
));
385 s
->and = s
->or = s
->shift
= 0;
387 s
->samples
= AV_RL32(buf
); buf
+= 4;
392 /* should not happen but who knows */
393 if(s
->samples
* 2 * avctx
->channels
> *data_size
){
394 av_log(avctx
, AV_LOG_ERROR
, "Packet size is too big to be handled in lavc!\n");
397 s
->stereo_in
= (AV_RL32(buf
) & WV_FALSE_STEREO
) ? 0 : s
->stereo
;
398 s
->joint
= AV_RL32(buf
) & WV_JOINT_STEREO
; buf
+= 4;
399 s
->CRC
= AV_RL32(buf
); buf
+= 4;
400 // parse metadata blocks
401 while(buf
< buf_end
){
404 if(id
& WP_IDF_LONG
) {
405 size
|= (*buf
++) << 8;
406 size
|= (*buf
++) << 16;
408 size
<<= 1; // size is specified in words
410 if(id
& WP_IDF_ODD
) size
--;
412 av_log(avctx
, AV_LOG_ERROR
, "Got incorrect block %02X with size %i\n", id
, size
);
415 if(buf
+ ssize
> buf_end
){
416 av_log(avctx
, AV_LOG_ERROR
, "Block size %i is out of bounds\n", size
);
419 if(id
& WP_IDF_IGNORE
){
423 switch(id
& WP_IDF_MASK
){
426 if(s
->terms
> MAX_TERMS
){
427 av_log(avctx
, AV_LOG_ERROR
, "Too many decorrelation terms\n");
431 for(i
= 0; i
< s
->terms
; i
++) {
432 s
->decorr
[s
->terms
- i
- 1].value
= (*buf
& 0x1F) - 5;
433 s
->decorr
[s
->terms
- i
- 1].delta
= *buf
>> 5;
438 case WP_ID_DECWEIGHTS
:
440 av_log(avctx
, AV_LOG_ERROR
, "No decorrelation terms met\n");
443 weights
= size
>> s
->stereo_in
;
444 if(weights
> MAX_TERMS
|| weights
> s
->terms
){
445 av_log(avctx
, AV_LOG_ERROR
, "Too many decorrelation weights\n");
449 for(i
= 0; i
< weights
; i
++) {
450 t
= (int8_t)(*buf
++);
451 s
->decorr
[s
->terms
- i
- 1].weightA
= t
<< 3;
452 if(s
->decorr
[s
->terms
- i
- 1].weightA
> 0)
453 s
->decorr
[s
->terms
- i
- 1].weightA
+= (s
->decorr
[s
->terms
- i
- 1].weightA
+ 64) >> 7;
455 t
= (int8_t)(*buf
++);
456 s
->decorr
[s
->terms
- i
- 1].weightB
= t
<< 3;
457 if(s
->decorr
[s
->terms
- i
- 1].weightB
> 0)
458 s
->decorr
[s
->terms
- i
- 1].weightB
+= (s
->decorr
[s
->terms
- i
- 1].weightB
+ 64) >> 7;
463 case WP_ID_DECSAMPLES
:
465 av_log(avctx
, AV_LOG_ERROR
, "No decorrelation terms met\n");
469 for(i
= s
->terms
- 1; (i
>= 0) && (t
< size
); i
--) {
470 if(s
->decorr
[i
].value
> 8){
471 s
->decorr
[i
].samplesA
[0] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
472 s
->decorr
[i
].samplesA
[1] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
474 s
->decorr
[i
].samplesB
[0] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
475 s
->decorr
[i
].samplesB
[1] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
479 }else if(s
->decorr
[i
].value
< 0){
480 s
->decorr
[i
].samplesA
[0] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
481 s
->decorr
[i
].samplesB
[0] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
484 for(j
= 0; j
< s
->decorr
[i
].value
; j
++){
485 s
->decorr
[i
].samplesA
[j
] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
487 s
->decorr
[i
].samplesB
[j
] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
490 t
+= s
->decorr
[i
].value
* 2 * (s
->stereo_in
+ 1);
496 if(size
!= 6 * (s
->stereo_in
+ 1)){
497 av_log(avctx
, AV_LOG_ERROR
, "Entropy vars size should be %i, got %i", 6 * (s
->stereo_in
+ 1), size
);
501 for(i
= 0; i
< 3 * (s
->stereo_in
+ 1); i
++){
502 s
->median
[i
] = wp_exp2(AV_RL16(buf
));
507 case WP_ID_INT32INFO
:
508 if(size
!= 4 || *buf
){
509 av_log(avctx
, AV_LOG_ERROR
, "Invalid INT32INFO, size = %i, sent_bits = %i\n", size
, *buf
);
525 init_get_bits(&s
->gb
, buf
, size
* 8);
526 s
->data_size
= size
* 8;
533 if(id
& WP_IDF_ODD
) buf
++;
536 av_log(avctx
, AV_LOG_ERROR
, "No block with decorrelation terms\n");
540 av_log(avctx
, AV_LOG_ERROR
, "No block with decorrelation weights\n");
544 av_log(avctx
, AV_LOG_ERROR
, "No block with decorrelation samples\n");
548 av_log(avctx
, AV_LOG_ERROR
, "No block with entropy info\n");
552 av_log(avctx
, AV_LOG_ERROR
, "Packed samples not found\n");
557 samplecount
= wv_unpack_stereo(s
, &s
->gb
, samples
);
559 samplecount
= wv_unpack_mono(s
, &s
->gb
, samples
);
561 int16_t *dst
= samples
+ samplecount
* 2;
562 int16_t *src
= samples
+ samplecount
;
563 int cnt
= samplecount
;
571 *data_size
= samplecount
* 2;
576 AVCodec wavpack_decoder
= {
580 sizeof(WavpackContext
),
584 wavpack_decode_frame
,
585 .long_name
= "WavPack",