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
;
364 avctx
->channel_layout
= (avctx
->channels
==2) ? CH_LAYOUT_STEREO
: CH_LAYOUT_MONO
;
369 static int wavpack_decode_frame(AVCodecContext
*avctx
,
370 void *data
, int *data_size
,
371 const uint8_t *buf
, int buf_size
)
373 WavpackContext
*s
= avctx
->priv_data
;
374 int16_t *samples
= data
;
376 int got_terms
= 0, got_weights
= 0, got_samples
= 0, got_entropy
= 0, got_bs
= 0;
377 const uint8_t* buf_end
= buf
+ buf_size
;
378 int i
, j
, id
, size
, ssize
, weights
, t
;
385 memset(s
->decorr
, 0, MAX_TERMS
* sizeof(Decorr
));
386 memset(s
->median
, 0, sizeof(s
->median
));
387 s
->and = s
->or = s
->shift
= 0;
389 s
->samples
= AV_RL32(buf
); buf
+= 4;
394 /* should not happen but who knows */
395 if(s
->samples
* 2 * avctx
->channels
> *data_size
){
396 av_log(avctx
, AV_LOG_ERROR
, "Packet size is too big to be handled in lavc!\n");
399 s
->stereo_in
= (AV_RL32(buf
) & WV_FALSE_STEREO
) ? 0 : s
->stereo
;
400 s
->joint
= AV_RL32(buf
) & WV_JOINT_STEREO
; buf
+= 4;
401 s
->CRC
= AV_RL32(buf
); buf
+= 4;
402 // parse metadata blocks
403 while(buf
< buf_end
){
406 if(id
& WP_IDF_LONG
) {
407 size
|= (*buf
++) << 8;
408 size
|= (*buf
++) << 16;
410 size
<<= 1; // size is specified in words
412 if(id
& WP_IDF_ODD
) size
--;
414 av_log(avctx
, AV_LOG_ERROR
, "Got incorrect block %02X with size %i\n", id
, size
);
417 if(buf
+ ssize
> buf_end
){
418 av_log(avctx
, AV_LOG_ERROR
, "Block size %i is out of bounds\n", size
);
421 if(id
& WP_IDF_IGNORE
){
425 switch(id
& WP_IDF_MASK
){
428 if(s
->terms
> MAX_TERMS
){
429 av_log(avctx
, AV_LOG_ERROR
, "Too many decorrelation terms\n");
433 for(i
= 0; i
< s
->terms
; i
++) {
434 s
->decorr
[s
->terms
- i
- 1].value
= (*buf
& 0x1F) - 5;
435 s
->decorr
[s
->terms
- i
- 1].delta
= *buf
>> 5;
440 case WP_ID_DECWEIGHTS
:
442 av_log(avctx
, AV_LOG_ERROR
, "No decorrelation terms met\n");
445 weights
= size
>> s
->stereo_in
;
446 if(weights
> MAX_TERMS
|| weights
> s
->terms
){
447 av_log(avctx
, AV_LOG_ERROR
, "Too many decorrelation weights\n");
451 for(i
= 0; i
< weights
; i
++) {
452 t
= (int8_t)(*buf
++);
453 s
->decorr
[s
->terms
- i
- 1].weightA
= t
<< 3;
454 if(s
->decorr
[s
->terms
- i
- 1].weightA
> 0)
455 s
->decorr
[s
->terms
- i
- 1].weightA
+= (s
->decorr
[s
->terms
- i
- 1].weightA
+ 64) >> 7;
457 t
= (int8_t)(*buf
++);
458 s
->decorr
[s
->terms
- i
- 1].weightB
= t
<< 3;
459 if(s
->decorr
[s
->terms
- i
- 1].weightB
> 0)
460 s
->decorr
[s
->terms
- i
- 1].weightB
+= (s
->decorr
[s
->terms
- i
- 1].weightB
+ 64) >> 7;
465 case WP_ID_DECSAMPLES
:
467 av_log(avctx
, AV_LOG_ERROR
, "No decorrelation terms met\n");
471 for(i
= s
->terms
- 1; (i
>= 0) && (t
< size
); i
--) {
472 if(s
->decorr
[i
].value
> 8){
473 s
->decorr
[i
].samplesA
[0] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
474 s
->decorr
[i
].samplesA
[1] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
476 s
->decorr
[i
].samplesB
[0] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
477 s
->decorr
[i
].samplesB
[1] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
481 }else if(s
->decorr
[i
].value
< 0){
482 s
->decorr
[i
].samplesA
[0] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
483 s
->decorr
[i
].samplesB
[0] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
486 for(j
= 0; j
< s
->decorr
[i
].value
; j
++){
487 s
->decorr
[i
].samplesA
[j
] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
489 s
->decorr
[i
].samplesB
[j
] = wp_exp2(AV_RL16(buf
)); buf
+= 2;
492 t
+= s
->decorr
[i
].value
* 2 * (s
->stereo_in
+ 1);
498 if(size
!= 6 * (s
->stereo_in
+ 1)){
499 av_log(avctx
, AV_LOG_ERROR
, "Entropy vars size should be %i, got %i", 6 * (s
->stereo_in
+ 1), size
);
503 for(i
= 0; i
< 3 * (s
->stereo_in
+ 1); i
++){
504 s
->median
[i
] = wp_exp2(AV_RL16(buf
));
509 case WP_ID_INT32INFO
:
510 if(size
!= 4 || *buf
){
511 av_log(avctx
, AV_LOG_ERROR
, "Invalid INT32INFO, size = %i, sent_bits = %i\n", size
, *buf
);
527 init_get_bits(&s
->gb
, buf
, size
* 8);
528 s
->data_size
= size
* 8;
535 if(id
& WP_IDF_ODD
) buf
++;
538 av_log(avctx
, AV_LOG_ERROR
, "No block with decorrelation terms\n");
542 av_log(avctx
, AV_LOG_ERROR
, "No block with decorrelation weights\n");
546 av_log(avctx
, AV_LOG_ERROR
, "No block with decorrelation samples\n");
550 av_log(avctx
, AV_LOG_ERROR
, "No block with entropy info\n");
554 av_log(avctx
, AV_LOG_ERROR
, "Packed samples not found\n");
559 samplecount
= wv_unpack_stereo(s
, &s
->gb
, samples
);
561 samplecount
= wv_unpack_mono(s
, &s
->gb
, samples
);
563 int16_t *dst
= samples
+ samplecount
* 2;
564 int16_t *src
= samples
+ samplecount
;
565 int cnt
= samplecount
;
573 *data_size
= samplecount
* 2;
578 AVCodec wavpack_decoder
= {
582 sizeof(WavpackContext
),
586 wavpack_decode_frame
,
587 .long_name
= NULL_IF_CONFIG_SMALL("WavPack"),