h264: simplify calls to ff_er_add_slice().
[FFMpeg-mirror/mplayer-patches.git] / libavcodec / wavpack.c
blobca639ee54bf2de03688297b84dece8dd3799493f
1 /*
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
22 #define BITSTREAM_READER_LE
24 #include "libavutil/channel_layout.h"
25 #include "avcodec.h"
26 #include "get_bits.h"
27 #include "internal.h"
28 #include "unary.h"
30 /**
31 * @file
32 * WavPack lossless audio decoder
35 #define WV_MONO 0x00000004
36 #define WV_JOINT_STEREO 0x00000010
37 #define WV_FALSE_STEREO 0x40000000
39 #define WV_HYBRID_MODE 0x00000008
40 #define WV_HYBRID_SHAPE 0x00000008
41 #define WV_HYBRID_BITRATE 0x00000200
42 #define WV_HYBRID_BALANCE 0x00000400
44 #define WV_FLT_SHIFT_ONES 0x01
45 #define WV_FLT_SHIFT_SAME 0x02
46 #define WV_FLT_SHIFT_SENT 0x04
47 #define WV_FLT_ZERO_SENT 0x08
48 #define WV_FLT_ZERO_SIGN 0x10
50 enum WP_ID_Flags {
51 WP_IDF_MASK = 0x1F,
52 WP_IDF_IGNORE = 0x20,
53 WP_IDF_ODD = 0x40,
54 WP_IDF_LONG = 0x80
57 enum WP_ID {
58 WP_ID_DUMMY = 0,
59 WP_ID_ENCINFO,
60 WP_ID_DECTERMS,
61 WP_ID_DECWEIGHTS,
62 WP_ID_DECSAMPLES,
63 WP_ID_ENTROPY,
64 WP_ID_HYBRID,
65 WP_ID_SHAPING,
66 WP_ID_FLOATINFO,
67 WP_ID_INT32INFO,
68 WP_ID_DATA,
69 WP_ID_CORR,
70 WP_ID_EXTRABITS,
71 WP_ID_CHANINFO
74 typedef struct SavedContext {
75 int offset;
76 int size;
77 int bits_used;
78 uint32_t crc;
79 } SavedContext;
81 #define MAX_TERMS 16
83 typedef struct Decorr {
84 int delta;
85 int value;
86 int weightA;
87 int weightB;
88 int samplesA[8];
89 int samplesB[8];
90 } Decorr;
92 typedef struct WvChannel {
93 int median[3];
94 int slow_level, error_limit;
95 int bitrate_acc, bitrate_delta;
96 } WvChannel;
98 typedef struct WavpackFrameContext {
99 AVCodecContext *avctx;
100 int frame_flags;
101 int stereo, stereo_in;
102 int joint;
103 uint32_t CRC;
104 GetBitContext gb;
105 int got_extra_bits;
106 uint32_t crc_extra_bits;
107 GetBitContext gb_extra_bits;
108 int data_size; // in bits
109 int samples;
110 int terms;
111 Decorr decorr[MAX_TERMS];
112 int zero, one, zeroes;
113 int extra_bits;
114 int and, or, shift;
115 int post_shift;
116 int hybrid, hybrid_bitrate;
117 int hybrid_maxclip, hybrid_minclip;
118 int float_flag;
119 int float_shift;
120 int float_max_exp;
121 WvChannel ch[2];
122 int pos;
123 SavedContext sc, extra_sc;
124 } WavpackFrameContext;
126 #define WV_MAX_FRAME_DECODERS 14
128 typedef struct WavpackContext {
129 AVCodecContext *avctx;
131 WavpackFrameContext *fdec[WV_MAX_FRAME_DECODERS];
132 int fdec_num;
134 int multichannel;
135 int mkv_mode;
136 int block;
137 int samples;
138 int ch_offset;
139 } WavpackContext;
141 // exponent table copied from WavPack source
142 static const uint8_t wp_exp2_table [256] = {
143 0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b,
144 0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15, 0x16, 0x16,
145 0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20, 0x21, 0x22, 0x23,
146 0x24, 0x24, 0x25, 0x26, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
147 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3a, 0x3b, 0x3c, 0x3d,
148 0x3e, 0x3f, 0x40, 0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x48, 0x49, 0x4a, 0x4b,
149 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
150 0x5b, 0x5c, 0x5d, 0x5e, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
151 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
152 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a,
153 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
154 0x9c, 0x9d, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad,
155 0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0,
156 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc8, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf, 0xd0, 0xd2, 0xd3, 0xd4,
157 0xd6, 0xd7, 0xd8, 0xd9, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe8, 0xe9,
158 0xea, 0xec, 0xed, 0xee, 0xf0, 0xf1, 0xf2, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xff
161 static const uint8_t wp_log2_table [] = {
162 0x00, 0x01, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15,
163 0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a,
164 0x2c, 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e,
165 0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
166 0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
167 0x64, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75,
168 0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
169 0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
170 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4,
171 0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb2,
172 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc0,
173 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcd, 0xce,
174 0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd8, 0xd9, 0xda, 0xdb,
175 0xdc, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe4, 0xe5, 0xe6, 0xe7, 0xe7,
176 0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xee, 0xef, 0xf0, 0xf1, 0xf1, 0xf2, 0xf3, 0xf4,
177 0xf4, 0xf5, 0xf6, 0xf7, 0xf7, 0xf8, 0xf9, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xff, 0xff
180 static av_always_inline int wp_exp2(int16_t val)
182 int res, neg = 0;
184 if (val < 0) {
185 val = -val;
186 neg = 1;
189 res = wp_exp2_table[val & 0xFF] | 0x100;
190 val >>= 8;
191 res = (val > 9) ? (res << (val - 9)) : (res >> (9 - val));
192 return neg ? -res : res;
195 static av_always_inline int wp_log2(int32_t val)
197 int bits;
199 if (!val)
200 return 0;
201 if (val == 1)
202 return 256;
203 val += val >> 9;
204 bits = av_log2(val) + 1;
205 if (bits < 9)
206 return (bits << 8) + wp_log2_table[(val << (9 - bits)) & 0xFF];
207 else
208 return (bits << 8) + wp_log2_table[(val >> (bits - 9)) & 0xFF];
211 #define LEVEL_DECAY(a) ((a + 0x80) >> 8)
213 // macros for manipulating median values
214 #define GET_MED(n) ((c->median[n] >> 4) + 1)
215 #define DEC_MED(n) c->median[n] -= ((c->median[n] + (128 >> n) - 2) / (128 >> n)) * 2
216 #define INC_MED(n) c->median[n] += ((c->median[n] + (128 >> n) ) / (128 >> n)) * 5
218 // macros for applying weight
219 #define UPDATE_WEIGHT_CLIP(weight, delta, samples, in) \
220 if (samples && in) { \
221 if ((samples ^ in) < 0) { \
222 weight -= delta; \
223 if (weight < -1024) \
224 weight = -1024; \
225 } else { \
226 weight += delta; \
227 if (weight > 1024) \
228 weight = 1024; \
233 static av_always_inline int get_tail(GetBitContext *gb, int k)
235 int p, e, res;
237 if (k < 1)
238 return 0;
239 p = av_log2(k);
240 e = (1 << (p + 1)) - k - 1;
241 res = p ? get_bits(gb, p) : 0;
242 if (res >= e)
243 res = (res << 1) - e + get_bits1(gb);
244 return res;
247 static void update_error_limit(WavpackFrameContext *ctx)
249 int i, br[2], sl[2];
251 for (i = 0; i <= ctx->stereo_in; i++) {
252 ctx->ch[i].bitrate_acc += ctx->ch[i].bitrate_delta;
253 br[i] = ctx->ch[i].bitrate_acc >> 16;
254 sl[i] = LEVEL_DECAY(ctx->ch[i].slow_level);
256 if (ctx->stereo_in && ctx->hybrid_bitrate) {
257 int balance = (sl[1] - sl[0] + br[1] + 1) >> 1;
258 if (balance > br[0]) {
259 br[1] = br[0] << 1;
260 br[0] = 0;
261 } else if (-balance > br[0]) {
262 br[0] <<= 1;
263 br[1] = 0;
264 } else {
265 br[1] = br[0] + balance;
266 br[0] = br[0] - balance;
269 for (i = 0; i <= ctx->stereo_in; i++) {
270 if (ctx->hybrid_bitrate) {
271 if (sl[i] - br[i] > -0x100)
272 ctx->ch[i].error_limit = wp_exp2(sl[i] - br[i] + 0x100);
273 else
274 ctx->ch[i].error_limit = 0;
275 } else {
276 ctx->ch[i].error_limit = wp_exp2(br[i]);
281 static int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb,
282 int channel, int *last)
284 int t, t2;
285 int sign, base, add, ret;
286 WvChannel *c = &ctx->ch[channel];
288 *last = 0;
290 if ((ctx->ch[0].median[0] < 2U) && (ctx->ch[1].median[0] < 2U) &&
291 !ctx->zero && !ctx->one) {
292 if (ctx->zeroes) {
293 ctx->zeroes--;
294 if (ctx->zeroes) {
295 c->slow_level -= LEVEL_DECAY(c->slow_level);
296 return 0;
298 } else {
299 t = get_unary_0_33(gb);
300 if (t >= 2) {
301 if (get_bits_left(gb) < t - 1)
302 goto error;
303 t = get_bits(gb, t - 1) | (1 << (t-1));
304 } else {
305 if (get_bits_left(gb) < 0)
306 goto error;
308 ctx->zeroes = t;
309 if (ctx->zeroes) {
310 memset(ctx->ch[0].median, 0, sizeof(ctx->ch[0].median));
311 memset(ctx->ch[1].median, 0, sizeof(ctx->ch[1].median));
312 c->slow_level -= LEVEL_DECAY(c->slow_level);
313 return 0;
318 if (ctx->zero) {
319 t = 0;
320 ctx->zero = 0;
321 } else {
322 t = get_unary_0_33(gb);
323 if (get_bits_left(gb) < 0)
324 goto error;
325 if (t == 16) {
326 t2 = get_unary_0_33(gb);
327 if (t2 < 2) {
328 if (get_bits_left(gb) < 0)
329 goto error;
330 t += t2;
331 } else {
332 if (get_bits_left(gb) < t2 - 1)
333 goto error;
334 t += get_bits(gb, t2 - 1) | (1 << (t2 - 1));
338 if (ctx->one) {
339 ctx->one = t & 1;
340 t = (t >> 1) + 1;
341 } else {
342 ctx->one = t & 1;
343 t >>= 1;
345 ctx->zero = !ctx->one;
348 if (ctx->hybrid && !channel)
349 update_error_limit(ctx);
351 if (!t) {
352 base = 0;
353 add = GET_MED(0) - 1;
354 DEC_MED(0);
355 } else if (t == 1) {
356 base = GET_MED(0);
357 add = GET_MED(1) - 1;
358 INC_MED(0);
359 DEC_MED(1);
360 } else if (t == 2) {
361 base = GET_MED(0) + GET_MED(1);
362 add = GET_MED(2) - 1;
363 INC_MED(0);
364 INC_MED(1);
365 DEC_MED(2);
366 } else {
367 base = GET_MED(0) + GET_MED(1) + GET_MED(2) * (t - 2);
368 add = GET_MED(2) - 1;
369 INC_MED(0);
370 INC_MED(1);
371 INC_MED(2);
373 if (!c->error_limit) {
374 ret = base + get_tail(gb, add);
375 if (get_bits_left(gb) <= 0)
376 goto error;
377 } else {
378 int mid = (base * 2 + add + 1) >> 1;
379 while (add > c->error_limit) {
380 if (get_bits_left(gb) <= 0)
381 goto error;
382 if (get_bits1(gb)) {
383 add -= (mid - base);
384 base = mid;
385 } else
386 add = mid - base - 1;
387 mid = (base * 2 + add + 1) >> 1;
389 ret = mid;
391 sign = get_bits1(gb);
392 if (ctx->hybrid_bitrate)
393 c->slow_level += wp_log2(ret) - LEVEL_DECAY(c->slow_level);
394 return sign ? ~ret : ret;
396 error:
397 *last = 1;
398 return 0;
401 static inline int wv_get_value_integer(WavpackFrameContext *s, uint32_t *crc,
402 int S)
404 int bit;
406 if (s->extra_bits){
407 S <<= s->extra_bits;
409 if (s->got_extra_bits && get_bits_left(&s->gb_extra_bits) >= s->extra_bits) {
410 S |= get_bits(&s->gb_extra_bits, s->extra_bits);
411 *crc = *crc * 9 + (S & 0xffff) * 3 + ((unsigned)S >> 16);
415 bit = (S & s->and) | s->or;
416 bit = ((S + bit) << s->shift) - bit;
418 if (s->hybrid)
419 bit = av_clip(bit, s->hybrid_minclip, s->hybrid_maxclip);
421 return bit << s->post_shift;
424 static float wv_get_value_float(WavpackFrameContext *s, uint32_t *crc, int S)
426 union {
427 float f;
428 uint32_t u;
429 } value;
431 unsigned int sign;
432 int exp = s->float_max_exp;
434 if (s->got_extra_bits) {
435 const int max_bits = 1 + 23 + 8 + 1;
436 const int left_bits = get_bits_left(&s->gb_extra_bits);
438 if (left_bits + 8 * FF_INPUT_BUFFER_PADDING_SIZE < max_bits)
439 return 0.0;
442 if (S) {
443 S <<= s->float_shift;
444 sign = S < 0;
445 if (sign)
446 S = -S;
447 if (S >= 0x1000000) {
448 if (s->got_extra_bits && get_bits1(&s->gb_extra_bits))
449 S = get_bits(&s->gb_extra_bits, 23);
450 else
451 S = 0;
452 exp = 255;
453 } else if (exp) {
454 int shift = 23 - av_log2(S);
455 exp = s->float_max_exp;
456 if (exp <= shift)
457 shift = --exp;
458 exp -= shift;
460 if (shift) {
461 S <<= shift;
462 if ((s->float_flag & WV_FLT_SHIFT_ONES) ||
463 (s->got_extra_bits && (s->float_flag & WV_FLT_SHIFT_SAME) &&
464 get_bits1(&s->gb_extra_bits))) {
465 S |= (1 << shift) - 1;
466 } else if (s->got_extra_bits &&
467 (s->float_flag & WV_FLT_SHIFT_SENT)) {
468 S |= get_bits(&s->gb_extra_bits, shift);
471 } else {
472 exp = s->float_max_exp;
474 S &= 0x7fffff;
475 } else {
476 sign = 0;
477 exp = 0;
478 if (s->got_extra_bits && (s->float_flag & WV_FLT_ZERO_SENT)) {
479 if (get_bits1(&s->gb_extra_bits)) {
480 S = get_bits(&s->gb_extra_bits, 23);
481 if (s->float_max_exp >= 25)
482 exp = get_bits(&s->gb_extra_bits, 8);
483 sign = get_bits1(&s->gb_extra_bits);
484 } else {
485 if (s->float_flag & WV_FLT_ZERO_SIGN)
486 sign = get_bits1(&s->gb_extra_bits);
491 *crc = *crc * 27 + S * 9 + exp * 3 + sign;
493 value.u = (sign << 31) | (exp << 23) | S;
494 return value.f;
497 static void wv_reset_saved_context(WavpackFrameContext *s)
499 s->pos = 0;
500 s->sc.crc = s->extra_sc.crc = 0xFFFFFFFF;
503 static inline int wv_check_crc(WavpackFrameContext *s, uint32_t crc,
504 uint32_t crc_extra_bits)
506 if (crc != s->CRC) {
507 av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
508 return AVERROR_INVALIDDATA;
510 if (s->got_extra_bits && crc_extra_bits != s->crc_extra_bits) {
511 av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n");
512 return AVERROR_INVALIDDATA;
515 return 0;
518 static inline int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb,
519 void *dst, const int type)
521 int i, j, count = 0;
522 int last, t;
523 int A, B, L, L2, R, R2;
524 int pos = s->pos;
525 uint32_t crc = s->sc.crc;
526 uint32_t crc_extra_bits = s->extra_sc.crc;
527 int16_t *dst16 = dst;
528 int32_t *dst32 = dst;
529 float *dstfl = dst;
530 const int channel_pad = s->avctx->channels - 2;
532 s->one = s->zero = s->zeroes = 0;
533 do {
534 L = wv_get_value(s, gb, 0, &last);
535 if (last)
536 break;
537 R = wv_get_value(s, gb, 1, &last);
538 if (last)
539 break;
540 for (i = 0; i < s->terms; i++) {
541 t = s->decorr[i].value;
542 if (t > 0) {
543 if (t > 8) {
544 if (t & 1) {
545 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
546 B = 2 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1];
547 } else {
548 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
549 B = (3 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1]) >> 1;
551 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
552 s->decorr[i].samplesB[1] = s->decorr[i].samplesB[0];
553 j = 0;
554 } else {
555 A = s->decorr[i].samplesA[pos];
556 B = s->decorr[i].samplesB[pos];
557 j = (pos + t) & 7;
559 if (type != AV_SAMPLE_FMT_S16) {
560 L2 = L + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
561 R2 = R + ((s->decorr[i].weightB * (int64_t)B + 512) >> 10);
562 } else {
563 L2 = L + ((s->decorr[i].weightA * A + 512) >> 10);
564 R2 = R + ((s->decorr[i].weightB * B + 512) >> 10);
566 if (A && L) s->decorr[i].weightA -= ((((L ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
567 if (B && R) s->decorr[i].weightB -= ((((R ^ B) >> 30) & 2) - 1) * s->decorr[i].delta;
568 s->decorr[i].samplesA[j] = L = L2;
569 s->decorr[i].samplesB[j] = R = R2;
570 } else if (t == -1) {
571 if (type != AV_SAMPLE_FMT_S16)
572 L2 = L + ((s->decorr[i].weightA * (int64_t)s->decorr[i].samplesA[0] + 512) >> 10);
573 else
574 L2 = L + ((s->decorr[i].weightA * s->decorr[i].samplesA[0] + 512) >> 10);
575 UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, s->decorr[i].samplesA[0], L);
576 L = L2;
577 if (type != AV_SAMPLE_FMT_S16)
578 R2 = R + ((s->decorr[i].weightB * (int64_t)L2 + 512) >> 10);
579 else
580 R2 = R + ((s->decorr[i].weightB * L2 + 512) >> 10);
581 UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, L2, R);
582 R = R2;
583 s->decorr[i].samplesA[0] = R;
584 } else {
585 if (type != AV_SAMPLE_FMT_S16)
586 R2 = R + ((s->decorr[i].weightB * (int64_t)s->decorr[i].samplesB[0] + 512) >> 10);
587 else
588 R2 = R + ((s->decorr[i].weightB * s->decorr[i].samplesB[0] + 512) >> 10);
589 UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, s->decorr[i].samplesB[0], R);
590 R = R2;
592 if (t == -3) {
593 R2 = s->decorr[i].samplesA[0];
594 s->decorr[i].samplesA[0] = R;
597 if (type != AV_SAMPLE_FMT_S16)
598 L2 = L + ((s->decorr[i].weightA * (int64_t)R2 + 512) >> 10);
599 else
600 L2 = L + ((s->decorr[i].weightA * R2 + 512) >> 10);
601 UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, R2, L);
602 L = L2;
603 s->decorr[i].samplesB[0] = L;
606 pos = (pos + 1) & 7;
607 if (s->joint)
608 L += (R -= (L >> 1));
609 crc = (crc * 3 + L) * 3 + R;
611 if (type == AV_SAMPLE_FMT_FLT) {
612 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, L);
613 *dstfl++ = wv_get_value_float(s, &crc_extra_bits, R);
614 dstfl += channel_pad;
615 } else if (type == AV_SAMPLE_FMT_S32) {
616 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, L);
617 *dst32++ = wv_get_value_integer(s, &crc_extra_bits, R);
618 dst32 += channel_pad;
619 } else {
620 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, L);
621 *dst16++ = wv_get_value_integer(s, &crc_extra_bits, R);
622 dst16 += channel_pad;
624 count++;
625 } while (!last && count < s->samples);
627 wv_reset_saved_context(s);
628 if ((s->avctx->err_recognition & AV_EF_CRCCHECK) &&
629 wv_check_crc(s, crc, crc_extra_bits))
630 return AVERROR_INVALIDDATA;
632 return count * 2;
635 static inline int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb,
636 void *dst, const int type)
638 int i, j, count = 0;
639 int last, t;
640 int A, S, T;
641 int pos = s->pos;
642 uint32_t crc = s->sc.crc;
643 uint32_t crc_extra_bits = s->extra_sc.crc;
644 int16_t *dst16 = dst;
645 int32_t *dst32 = dst;
646 float *dstfl = dst;
647 const int channel_stride = s->avctx->channels;
649 s->one = s->zero = s->zeroes = 0;
650 do {
651 T = wv_get_value(s, gb, 0, &last);
652 S = 0;
653 if (last)
654 break;
655 for (i = 0; i < s->terms; i++) {
656 t = s->decorr[i].value;
657 if (t > 8) {
658 if (t & 1)
659 A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
660 else
661 A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
662 s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
663 j = 0;
664 } else {
665 A = s->decorr[i].samplesA[pos];
666 j = (pos + t) & 7;
668 if (type != AV_SAMPLE_FMT_S16)
669 S = T + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
670 else
671 S = T + ((s->decorr[i].weightA * A + 512) >> 10);
672 if (A && T)
673 s->decorr[i].weightA -= ((((T ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
674 s->decorr[i].samplesA[j] = T = S;
676 pos = (pos + 1) & 7;
677 crc = crc * 3 + S;
679 if (type == AV_SAMPLE_FMT_FLT) {
680 *dstfl = wv_get_value_float(s, &crc_extra_bits, S);
681 dstfl += channel_stride;
682 } else if (type == AV_SAMPLE_FMT_S32) {
683 *dst32 = wv_get_value_integer(s, &crc_extra_bits, S);
684 dst32 += channel_stride;
685 } else {
686 *dst16 = wv_get_value_integer(s, &crc_extra_bits, S);
687 dst16 += channel_stride;
689 count++;
690 } while (!last && count < s->samples);
692 wv_reset_saved_context(s);
693 if ((s->avctx->err_recognition & AV_EF_CRCCHECK) &&
694 wv_check_crc(s, crc, crc_extra_bits))
695 return AVERROR_INVALIDDATA;
697 return count;
700 static av_cold int wv_alloc_frame_context(WavpackContext *c)
703 if (c->fdec_num == WV_MAX_FRAME_DECODERS)
704 return -1;
706 c->fdec[c->fdec_num] = av_mallocz(sizeof(**c->fdec));
707 if (!c->fdec[c->fdec_num])
708 return -1;
709 c->fdec_num++;
710 c->fdec[c->fdec_num - 1]->avctx = c->avctx;
711 wv_reset_saved_context(c->fdec[c->fdec_num - 1]);
713 return 0;
716 static av_cold int wavpack_decode_init(AVCodecContext *avctx)
718 WavpackContext *s = avctx->priv_data;
720 s->avctx = avctx;
721 if (avctx->bits_per_coded_sample <= 16)
722 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
723 else
724 avctx->sample_fmt = AV_SAMPLE_FMT_S32;
725 if (avctx->channels <= 2 && !avctx->channel_layout)
726 avctx->channel_layout = (avctx->channels == 2) ? AV_CH_LAYOUT_STEREO :
727 AV_CH_LAYOUT_MONO;
729 s->multichannel = avctx->channels > 2;
730 /* lavf demuxer does not provide extradata, Matroska stores 0x403
731 there, use this to detect decoding mode for multichannel */
732 s->mkv_mode = 0;
733 if (s->multichannel && avctx->extradata && avctx->extradata_size == 2) {
734 int ver = AV_RL16(avctx->extradata);
735 if (ver >= 0x402 && ver <= 0x410)
736 s->mkv_mode = 1;
739 s->fdec_num = 0;
741 return 0;
744 static av_cold int wavpack_decode_end(AVCodecContext *avctx)
746 WavpackContext *s = avctx->priv_data;
747 int i;
749 for (i = 0; i < s->fdec_num; i++)
750 av_freep(&s->fdec[i]);
751 s->fdec_num = 0;
753 return 0;
756 static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
757 void *data, int *got_frame_ptr,
758 const uint8_t *buf, int buf_size)
760 WavpackContext *wc = avctx->priv_data;
761 WavpackFrameContext *s;
762 void *samples = data;
763 int samplecount;
764 int got_terms = 0, got_weights = 0, got_samples = 0,
765 got_entropy = 0, got_bs = 0, got_float = 0, got_hybrid = 0;
766 const uint8_t *orig_buf = buf;
767 const uint8_t *buf_end = buf + buf_size;
768 int i, j, id, size, ssize, weights, t;
769 int bpp, chan, chmask, orig_bpp;
771 if (buf_size == 0) {
772 *got_frame_ptr = 0;
773 return 0;
776 if (block_no >= wc->fdec_num && wv_alloc_frame_context(wc) < 0) {
777 av_log(avctx, AV_LOG_ERROR, "Error creating frame decode context\n");
778 return -1;
781 s = wc->fdec[block_no];
782 if (!s) {
783 av_log(avctx, AV_LOG_ERROR, "Context for block %d is not present\n", block_no);
784 return -1;
787 memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr));
788 memset(s->ch, 0, sizeof(s->ch));
789 s->extra_bits = 0;
790 s->and = s->or = s->shift = 0;
791 s->got_extra_bits = 0;
793 if (!wc->mkv_mode) {
794 s->samples = AV_RL32(buf); buf += 4;
795 if (!s->samples) {
796 *got_frame_ptr = 0;
797 return 0;
799 } else {
800 s->samples = wc->samples;
802 s->frame_flags = AV_RL32(buf); buf += 4;
803 bpp = av_get_bytes_per_sample(avctx->sample_fmt);
804 samples = (uint8_t*)samples + bpp * wc->ch_offset;
805 orig_bpp = ((s->frame_flags & 0x03) + 1) << 3;
807 s->stereo = !(s->frame_flags & WV_MONO);
808 s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo;
809 s->joint = s->frame_flags & WV_JOINT_STEREO;
810 s->hybrid = s->frame_flags & WV_HYBRID_MODE;
811 s->hybrid_bitrate = s->frame_flags & WV_HYBRID_BITRATE;
812 s->post_shift = bpp * 8 - orig_bpp + ((s->frame_flags >> 13) & 0x1f);
813 s->hybrid_maxclip = (( 1LL << (orig_bpp - 1)) - 1);
814 s->hybrid_minclip = ((-1LL << (orig_bpp - 1)));
815 s->CRC = AV_RL32(buf); buf += 4;
816 if (wc->mkv_mode)
817 buf += 4; //skip block size;
819 wc->ch_offset += 1 + s->stereo;
821 // parse metadata blocks
822 while (buf < buf_end) {
823 id = *buf++;
824 size = *buf++;
825 if (id & WP_IDF_LONG) {
826 size |= (*buf++) << 8;
827 size |= (*buf++) << 16;
829 size <<= 1; // size is specified in words
830 ssize = size;
831 if (id & WP_IDF_ODD)
832 size--;
833 if (size < 0) {
834 av_log(avctx, AV_LOG_ERROR, "Got incorrect block %02X with size %i\n", id, size);
835 break;
837 if (buf + ssize > buf_end) {
838 av_log(avctx, AV_LOG_ERROR, "Block size %i is out of bounds\n", size);
839 break;
841 if (id & WP_IDF_IGNORE) {
842 buf += ssize;
843 continue;
845 switch (id & WP_IDF_MASK) {
846 case WP_ID_DECTERMS:
847 if (size > MAX_TERMS) {
848 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation terms\n");
849 s->terms = 0;
850 buf += ssize;
851 continue;
853 s->terms = size;
854 for (i = 0; i < s->terms; i++) {
855 s->decorr[s->terms - i - 1].value = (*buf & 0x1F) - 5;
856 s->decorr[s->terms - i - 1].delta = *buf >> 5;
857 buf++;
859 got_terms = 1;
860 break;
861 case WP_ID_DECWEIGHTS:
862 if (!got_terms) {
863 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
864 continue;
866 weights = size >> s->stereo_in;
867 if (weights > MAX_TERMS || weights > s->terms) {
868 av_log(avctx, AV_LOG_ERROR, "Too many decorrelation weights\n");
869 buf += ssize;
870 continue;
872 for (i = 0; i < weights; i++) {
873 t = (int8_t)(*buf++);
874 s->decorr[s->terms - i - 1].weightA = t << 3;
875 if (s->decorr[s->terms - i - 1].weightA > 0)
876 s->decorr[s->terms - i - 1].weightA +=
877 (s->decorr[s->terms - i - 1].weightA + 64) >> 7;
878 if (s->stereo_in) {
879 t = (int8_t)(*buf++);
880 s->decorr[s->terms - i - 1].weightB = t << 3;
881 if (s->decorr[s->terms - i - 1].weightB > 0)
882 s->decorr[s->terms - i - 1].weightB +=
883 (s->decorr[s->terms - i - 1].weightB + 64) >> 7;
886 got_weights = 1;
887 break;
888 case WP_ID_DECSAMPLES:
889 if (!got_terms) {
890 av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
891 continue;
893 t = 0;
894 for (i = s->terms - 1; (i >= 0) && (t < size); i--) {
895 if (s->decorr[i].value > 8) {
896 s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2;
897 s->decorr[i].samplesA[1] = wp_exp2(AV_RL16(buf)); buf += 2;
898 if (s->stereo_in) {
899 s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2;
900 s->decorr[i].samplesB[1] = wp_exp2(AV_RL16(buf)); buf += 2;
901 t += 4;
903 t += 4;
904 } else if (s->decorr[i].value < 0) {
905 s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2;
906 s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2;
907 t += 4;
908 } else {
909 for (j = 0; j < s->decorr[i].value; j++) {
910 s->decorr[i].samplesA[j] = wp_exp2(AV_RL16(buf)); buf += 2;
911 if (s->stereo_in) {
912 s->decorr[i].samplesB[j] = wp_exp2(AV_RL16(buf)); buf += 2;
915 t += s->decorr[i].value * 2 * (s->stereo_in + 1);
918 got_samples = 1;
919 break;
920 case WP_ID_ENTROPY:
921 if (size != 6 * (s->stereo_in + 1)) {
922 av_log(avctx, AV_LOG_ERROR, "Entropy vars size should be %i, "
923 "got %i", 6 * (s->stereo_in + 1), size);
924 buf += ssize;
925 continue;
927 for (j = 0; j <= s->stereo_in; j++) {
928 for (i = 0; i < 3; i++) {
929 s->ch[j].median[i] = wp_exp2(AV_RL16(buf));
930 buf += 2;
933 got_entropy = 1;
934 break;
935 case WP_ID_HYBRID:
936 if (s->hybrid_bitrate) {
937 for (i = 0; i <= s->stereo_in; i++) {
938 s->ch[i].slow_level = wp_exp2(AV_RL16(buf));
939 buf += 2;
940 size -= 2;
943 for (i = 0; i < (s->stereo_in + 1); i++) {
944 s->ch[i].bitrate_acc = AV_RL16(buf) << 16;
945 buf += 2;
946 size -= 2;
948 if (size > 0) {
949 for (i = 0; i < (s->stereo_in + 1); i++) {
950 s->ch[i].bitrate_delta = wp_exp2((int16_t)AV_RL16(buf));
951 buf += 2;
953 } else {
954 for (i = 0; i < (s->stereo_in + 1); i++)
955 s->ch[i].bitrate_delta = 0;
957 got_hybrid = 1;
958 break;
959 case WP_ID_INT32INFO:
960 if (size != 4) {
961 av_log(avctx, AV_LOG_ERROR, "Invalid INT32INFO, size = %i, sent_bits = %i\n", size, *buf);
962 buf += ssize;
963 continue;
965 if (buf[0])
966 s->extra_bits = buf[0];
967 else if (buf[1])
968 s->shift = buf[1];
969 else if (buf[2]){
970 s->and = s->or = 1;
971 s->shift = buf[2];
972 } else if(buf[3]) {
973 s->and = 1;
974 s->shift = buf[3];
976 /* original WavPack decoder forces 32-bit lossy sound to be treated
977 * as 24-bit one in order to have proper clipping
979 if (s->hybrid && bpp == 4 && s->post_shift < 8 && s->shift > 8) {
980 s->post_shift += 8;
981 s->shift -= 8;
982 s->hybrid_maxclip >>= 8;
983 s->hybrid_minclip >>= 8;
985 buf += 4;
986 break;
987 case WP_ID_FLOATINFO:
988 if (size != 4) {
989 av_log(avctx, AV_LOG_ERROR, "Invalid FLOATINFO, size = %i\n", size);
990 buf += ssize;
991 continue;
993 s->float_flag = buf[0];
994 s->float_shift = buf[1];
995 s->float_max_exp = buf[2];
996 buf += 4;
997 got_float = 1;
998 break;
999 case WP_ID_DATA:
1000 s->sc.offset = buf - orig_buf;
1001 s->sc.size = size * 8;
1002 init_get_bits(&s->gb, buf, size * 8);
1003 s->data_size = size * 8;
1004 buf += size;
1005 got_bs = 1;
1006 break;
1007 case WP_ID_EXTRABITS:
1008 if (size <= 4) {
1009 av_log(avctx, AV_LOG_ERROR, "Invalid EXTRABITS, size = %i\n",
1010 size);
1011 buf += size;
1012 continue;
1014 s->extra_sc.offset = buf - orig_buf;
1015 s->extra_sc.size = size * 8;
1016 init_get_bits(&s->gb_extra_bits, buf, size * 8);
1017 s->crc_extra_bits = get_bits_long(&s->gb_extra_bits, 32);
1018 buf += size;
1019 s->got_extra_bits = 1;
1020 break;
1021 case WP_ID_CHANINFO:
1022 if (size <= 1) {
1023 av_log(avctx, AV_LOG_ERROR, "Insufficient channel information\n");
1024 return -1;
1026 chan = *buf++;
1027 switch (size - 2) {
1028 case 0: chmask = *buf; break;
1029 case 1: chmask = AV_RL16(buf); break;
1030 case 2: chmask = AV_RL24(buf); break;
1031 case 3: chmask = AV_RL32(buf); break;
1032 case 5:
1033 chan |= (buf[1] & 0xF) << 8;
1034 chmask = AV_RL24(buf + 2);
1035 break;
1036 default:
1037 av_log(avctx, AV_LOG_ERROR, "Invalid channel info size %d\n",
1038 size);
1039 chan = avctx->channels;
1040 chmask = avctx->channel_layout;
1042 if (chan != avctx->channels) {
1043 av_log(avctx, AV_LOG_ERROR, "Block reports total %d channels, "
1044 "decoder believes it's %d channels\n", chan,
1045 avctx->channels);
1046 return -1;
1048 if (!avctx->channel_layout)
1049 avctx->channel_layout = chmask;
1050 buf += size - 1;
1051 break;
1052 default:
1053 buf += size;
1055 if (id & WP_IDF_ODD)
1056 buf++;
1059 if (!got_terms) {
1060 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n");
1061 return -1;
1063 if (!got_weights) {
1064 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n");
1065 return -1;
1067 if (!got_samples) {
1068 av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n");
1069 return -1;
1071 if (!got_entropy) {
1072 av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n");
1073 return -1;
1075 if (s->hybrid && !got_hybrid) {
1076 av_log(avctx, AV_LOG_ERROR, "Hybrid config not found\n");
1077 return -1;
1079 if (!got_bs) {
1080 av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n");
1081 return -1;
1083 if (!got_float && avctx->sample_fmt == AV_SAMPLE_FMT_FLT) {
1084 av_log(avctx, AV_LOG_ERROR, "Float information not found\n");
1085 return -1;
1087 if (s->got_extra_bits && avctx->sample_fmt != AV_SAMPLE_FMT_FLT) {
1088 const int size = get_bits_left(&s->gb_extra_bits);
1089 const int wanted = s->samples * s->extra_bits << s->stereo_in;
1090 if (size < wanted) {
1091 av_log(avctx, AV_LOG_ERROR, "Too small EXTRABITS\n");
1092 s->got_extra_bits = 0;
1096 if (s->stereo_in) {
1097 if (avctx->sample_fmt == AV_SAMPLE_FMT_S16)
1098 samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_S16);
1099 else if (avctx->sample_fmt == AV_SAMPLE_FMT_S32)
1100 samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_S32);
1101 else
1102 samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_FLT);
1104 if (samplecount < 0)
1105 return -1;
1107 samplecount >>= 1;
1108 } else {
1109 const int channel_stride = avctx->channels;
1111 if (avctx->sample_fmt == AV_SAMPLE_FMT_S16)
1112 samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_S16);
1113 else if (avctx->sample_fmt == AV_SAMPLE_FMT_S32)
1114 samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_S32);
1115 else
1116 samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_FLT);
1118 if (samplecount < 0)
1119 return -1;
1121 if (s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S16) {
1122 int16_t *dst = (int16_t*)samples + 1;
1123 int16_t *src = (int16_t*)samples;
1124 int cnt = samplecount;
1125 while (cnt--) {
1126 *dst = *src;
1127 src += channel_stride;
1128 dst += channel_stride;
1130 } else if (s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S32) {
1131 int32_t *dst = (int32_t*)samples + 1;
1132 int32_t *src = (int32_t*)samples;
1133 int cnt = samplecount;
1134 while (cnt--) {
1135 *dst = *src;
1136 src += channel_stride;
1137 dst += channel_stride;
1139 } else if (s->stereo) {
1140 float *dst = (float*)samples + 1;
1141 float *src = (float*)samples;
1142 int cnt = samplecount;
1143 while (cnt--) {
1144 *dst = *src;
1145 src += channel_stride;
1146 dst += channel_stride;
1151 *got_frame_ptr = 1;
1153 return samplecount * bpp;
1156 static void wavpack_decode_flush(AVCodecContext *avctx)
1158 WavpackContext *s = avctx->priv_data;
1159 int i;
1161 for (i = 0; i < s->fdec_num; i++)
1162 wv_reset_saved_context(s->fdec[i]);
1165 static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
1166 int *got_frame_ptr, AVPacket *avpkt)
1168 WavpackContext *s = avctx->priv_data;
1169 const uint8_t *buf = avpkt->data;
1170 int buf_size = avpkt->size;
1171 AVFrame *frame = data;
1172 int frame_size, ret, frame_flags;
1173 int samplecount = 0;
1175 s->block = 0;
1176 s->ch_offset = 0;
1178 /* determine number of samples */
1179 if (s->mkv_mode) {
1180 s->samples = AV_RL32(buf); buf += 4;
1181 frame_flags = AV_RL32(buf);
1182 } else {
1183 if (s->multichannel) {
1184 s->samples = AV_RL32(buf + 4);
1185 frame_flags = AV_RL32(buf + 8);
1186 } else {
1187 s->samples = AV_RL32(buf);
1188 frame_flags = AV_RL32(buf + 4);
1191 if (s->samples <= 0) {
1192 av_log(avctx, AV_LOG_ERROR, "Invalid number of samples: %d\n",
1193 s->samples);
1194 return AVERROR(EINVAL);
1197 if (frame_flags & 0x80) {
1198 avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
1199 } else if ((frame_flags & 0x03) <= 1) {
1200 avctx->sample_fmt = AV_SAMPLE_FMT_S16;
1201 } else {
1202 avctx->sample_fmt = AV_SAMPLE_FMT_S32;
1203 avctx->bits_per_raw_sample = ((frame_flags & 0x03) + 1) << 3;
1206 /* get output buffer */
1207 frame->nb_samples = s->samples;
1208 if ((ret = ff_get_buffer(avctx, frame)) < 0) {
1209 av_log(avctx, AV_LOG_ERROR, "get_buffer() failed\n");
1210 return ret;
1213 while (buf_size > 0) {
1214 if (!s->multichannel) {
1215 frame_size = buf_size;
1216 } else {
1217 if (!s->mkv_mode) {
1218 frame_size = AV_RL32(buf) - 12; buf += 4; buf_size -= 4;
1219 } else {
1220 if (buf_size < 12) //MKV files can have zero flags after last block
1221 break;
1222 frame_size = AV_RL32(buf + 8) + 12;
1225 if (frame_size < 0 || frame_size > buf_size) {
1226 av_log(avctx, AV_LOG_ERROR, "Block %d has invalid size (size %d "
1227 "vs. %d bytes left)\n", s->block, frame_size, buf_size);
1228 wavpack_decode_flush(avctx);
1229 return -1;
1231 if ((samplecount = wavpack_decode_block(avctx, s->block,
1232 frame->data[0], got_frame_ptr,
1233 buf, frame_size)) < 0) {
1234 wavpack_decode_flush(avctx);
1235 return -1;
1237 s->block++;
1238 buf += frame_size; buf_size -= frame_size;
1241 return avpkt->size;
1244 AVCodec ff_wavpack_decoder = {
1245 .name = "wavpack",
1246 .type = AVMEDIA_TYPE_AUDIO,
1247 .id = AV_CODEC_ID_WAVPACK,
1248 .priv_data_size = sizeof(WavpackContext),
1249 .init = wavpack_decode_init,
1250 .close = wavpack_decode_end,
1251 .decode = wavpack_decode_frame,
1252 .flush = wavpack_decode_flush,
1253 .capabilities = CODEC_CAP_SUBFRAMES | CODEC_CAP_DR1,
1254 .long_name = NULL_IF_CONFIG_SMALL("WavPack"),