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);
363 avctx
->sample_fmt
= SAMPLE_FMT_S16
;
368 static int wavpack_decode_frame(AVCodecContext
*avctx
,
369 void *data
, int *data_size
,
370 const uint8_t *buf
, int buf_size
)
372 WavpackContext
*s
= avctx
->priv_data
;
373 int16_t *samples
= data
;
375 int got_terms
= 0, got_weights
= 0, got_samples
= 0, got_entropy
= 0, got_bs
= 0;
376 const uint8_t* buf_end
= buf
+ buf_size
;
377 int i
, j
, id
, size
, ssize
, weights
, t
;
384 memset(s
->decorr
, 0, MAX_TERMS
* sizeof(Decorr
));
385 memset(s
->median
, 0, sizeof(s
->median
));
386 s
->and = s
->or = s
->shift
= 0;
388 s
->samples
= AV_RL32(buf
); buf
+= 4;
393 /* should not happen but who knows */
394 if(s
->samples
* 2 * avctx
->channels
> *data_size
){
395 av_log(avctx
, AV_LOG_ERROR
, "Packet size is too big to be handled in lavc!\n");
398 s
->stereo_in
= (AV_RL32(buf
) & WV_FALSE_STEREO
) ? 0 : s
->stereo
;
399 s
->joint
= AV_RL32(buf
) & WV_JOINT_STEREO
; buf
+= 4;
400 s
->CRC
= AV_RL32(buf
); buf
+= 4;
401 // parse metadata blocks
402 while(buf
< buf_end
){
405 if(id
& WP_IDF_LONG
) {
406 size
|= (*buf
++) << 8;
407 size
|= (*buf
++) << 16;
409 size
<<= 1; // size is specified in words
411 if(id
& WP_IDF_ODD
) size
--;
413 av_log(avctx
, AV_LOG_ERROR
, "Got incorrect block %02X with size %i\n", id
, size
);
416 if(buf
+ ssize
> buf_end
){
417 av_log(avctx
, AV_LOG_ERROR
, "Block size %i is out of bounds\n", size
);
420 if(id
& WP_IDF_IGNORE
){
424 switch(id
& WP_IDF_MASK
){
427 if(s
->terms
> MAX_TERMS
){
428 av_log(avctx
, AV_LOG_ERROR
, "Too many decorrelation terms\n");
432 for(i
= 0; i
< s
->terms
; i
++) {
433 s
->decorr
[s
->terms
- i
- 1].value
= (*buf
& 0x1F) - 5;
434 s
->decorr
[s
->terms
- i
- 1].delta
= *buf
>> 5;
439 case WP_ID_DECWEIGHTS
:
441 av_log(avctx
, AV_LOG_ERROR
, "No decorrelation terms met\n");
444 weights
= size
>> s
->stereo_in
;
445 if(weights
> MAX_TERMS
|| weights
> s
->terms
){
446 av_log(avctx
, AV_LOG_ERROR
, "Too many decorrelation weights\n");
450 for(i
= 0; i
< weights
; i
++) {
451 t
= (int8_t)(*buf
++);
452 s
->decorr
[s
->terms
- i
- 1].weightA
= t
<< 3;
453 if(s
->decorr
[s
->terms
- i
- 1].weightA
> 0)
454 s
->decorr
[s
->terms
- i
- 1].weightA
+= (s
->decorr
[s
->terms
- i
- 1].weightA
+ 64) >> 7;
456 t
= (int8_t)(*buf
++);
457 s
->decorr
[s
->terms
- i
- 1].weightB
= t
<< 3;
458 if(s
->decorr
[s
->terms
- i
- 1].weightB
> 0)
459 s
->decorr
[s
->terms
- i
- 1].weightB
+= (s
->decorr
[s
->terms
- i
- 1].weightB
+ 64) >> 7;
464 case WP_ID_DECSAMPLES
:
466 av_log(avctx
, AV_LOG_ERROR
, "No decorrelation terms met\n");
470 for(i
= s
->terms
- 1; (i
>= 0) && (t
< size
); i
--) {
471 if(s
->decorr
[i
].value
> 8){
472 s
->decorr
[i
].samplesA
[0] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
473 s
->decorr
[i
].samplesA
[1] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
475 s
->decorr
[i
].samplesB
[0] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
476 s
->decorr
[i
].samplesB
[1] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
480 }else if(s
->decorr
[i
].value
< 0){
481 s
->decorr
[i
].samplesA
[0] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
482 s
->decorr
[i
].samplesB
[0] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
485 for(j
= 0; j
< s
->decorr
[i
].value
; j
++){
486 s
->decorr
[i
].samplesA
[j
] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
488 s
->decorr
[i
].samplesB
[j
] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
491 t
+= s
->decorr
[i
].value
* 2 * (s
->stereo_in
+ 1);
497 if(size
!= 6 * (s
->stereo_in
+ 1)){
498 av_log(avctx
, AV_LOG_ERROR
, "Entropy vars size should be %i, got %i", 6 * (s
->stereo_in
+ 1), size
);
502 for(i
= 0; i
< 3 * (s
->stereo_in
+ 1); i
++){
503 s
->median
[i
] = wp_exp2(AV_RL16(buf
));
508 case WP_ID_INT32INFO
:
509 if(size
!= 4 || *buf
){
510 av_log(avctx
, AV_LOG_ERROR
, "Invalid INT32INFO, size = %i, sent_bits = %i\n", size
, *buf
);
526 init_get_bits(&s
->gb
, buf
, size
* 8);
527 s
->data_size
= size
* 8;
534 if(id
& WP_IDF_ODD
) buf
++;
537 av_log(avctx
, AV_LOG_ERROR
, "No block with decorrelation terms\n");
541 av_log(avctx
, AV_LOG_ERROR
, "No block with decorrelation weights\n");
545 av_log(avctx
, AV_LOG_ERROR
, "No block with decorrelation samples\n");
549 av_log(avctx
, AV_LOG_ERROR
, "No block with entropy info\n");
553 av_log(avctx
, AV_LOG_ERROR
, "Packed samples not found\n");
558 samplecount
= wv_unpack_stereo(s
, &s
->gb
, samples
);
560 samplecount
= wv_unpack_mono(s
, &s
->gb
, samples
);
562 int16_t *dst
= samples
+ samplecount
* 2;
563 int16_t *src
= samples
+ samplecount
;
564 int cnt
= samplecount
;
572 *data_size
= samplecount
* 2;
577 AVCodec wavpack_decoder
= {
581 sizeof(WavpackContext
),
585 wavpack_decode_frame
,
586 .long_name
= NULL_IF_CONFIG_SMALL("WavPack"),