wavpack.c
Go to the documentation of this file.
1 /*
2  * WavPack lossless audio decoder
3  * Copyright (c) 2006,2011 Konstantin Shishkov
4  *
5  * This file is part of FFmpeg.
6  *
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.
11  *
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.
16  *
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
20  */
21 
22 #define BITSTREAM_READER_LE
23 
25 #include "avcodec.h"
26 #include "get_bits.h"
27 #include "internal.h"
28 #include "unary.h"
29 
30 /**
31  * @file
32  * WavPack lossless audio decoder
33  */
34 
35 #define WV_MONO 0x00000004
36 #define WV_JOINT_STEREO 0x00000010
37 #define WV_FALSE_STEREO 0x40000000
38 
39 #define WV_HYBRID_MODE 0x00000008
40 #define WV_HYBRID_SHAPE 0x00000008
41 #define WV_HYBRID_BITRATE 0x00000200
42 #define WV_HYBRID_BALANCE 0x00000400
43 
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
49 
50 #define WV_MAX_SAMPLES 131072
51 
53  WP_IDF_MASK = 0x1F,
54  WP_IDF_IGNORE = 0x20,
55  WP_IDF_ODD = 0x40,
56  WP_IDF_LONG = 0x80
57 };
58 
59 enum WP_ID {
74 };
75 
76 typedef struct SavedContext {
77  int offset;
78  int size;
79  int bits_used;
80  uint32_t crc;
81 } SavedContext;
82 
83 #define MAX_TERMS 16
84 
85 typedef struct Decorr {
86  int delta;
87  int value;
88  int weightA;
89  int weightB;
90  int samplesA[8];
91  int samplesB[8];
92 } Decorr;
93 
94 typedef struct WvChannel {
95  int median[3];
96  int slow_level, error_limit;
97  int bitrate_acc, bitrate_delta;
98 } WvChannel;
99 
100 typedef struct WavpackFrameContext {
103  int stereo, stereo_in;
104  int joint;
105  uint32_t CRC;
108  uint32_t crc_extra_bits;
110  int data_size; // in bits
111  int samples;
112  int terms;
113  Decorr decorr[MAX_TERMS];
114  int zero, one, zeroes;
116  int and, or, shift;
118  int hybrid, hybrid_bitrate;
119  int hybrid_maxclip, hybrid_minclip;
123  WvChannel ch[2];
124  int pos;
125  SavedContext sc, extra_sc;
127 
128 #define WV_MAX_FRAME_DECODERS 14
129 
130 typedef struct WavpackContext {
132 
134  int fdec_num;
135 
137  int mkv_mode;
138  int block;
139  int samples;
142 
143 // exponent table copied from WavPack source
144 static const uint8_t wp_exp2_table [256] = {
145  0x00, 0x01, 0x01, 0x02, 0x03, 0x03, 0x04, 0x05, 0x06, 0x06, 0x07, 0x08, 0x08, 0x09, 0x0a, 0x0b,
146  0x0b, 0x0c, 0x0d, 0x0e, 0x0e, 0x0f, 0x10, 0x10, 0x11, 0x12, 0x13, 0x13, 0x14, 0x15, 0x16, 0x16,
147  0x17, 0x18, 0x19, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1d, 0x1e, 0x1f, 0x20, 0x20, 0x21, 0x22, 0x23,
148  0x24, 0x24, 0x25, 0x26, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
149  0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3a, 0x3b, 0x3c, 0x3d,
150  0x3e, 0x3f, 0x40, 0x41, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x48, 0x49, 0x4a, 0x4b,
151  0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,
152  0x5b, 0x5c, 0x5d, 0x5e, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69,
153  0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79,
154  0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x87, 0x88, 0x89, 0x8a,
155  0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x95, 0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b,
156  0x9c, 0x9d, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad,
157  0xaf, 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb6, 0xb7, 0xb8, 0xb9, 0xba, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0,
158  0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc8, 0xc9, 0xca, 0xcb, 0xcd, 0xce, 0xcf, 0xd0, 0xd2, 0xd3, 0xd4,
159  0xd6, 0xd7, 0xd8, 0xd9, 0xdb, 0xdc, 0xdd, 0xde, 0xe0, 0xe1, 0xe2, 0xe4, 0xe5, 0xe6, 0xe8, 0xe9,
160  0xea, 0xec, 0xed, 0xee, 0xf0, 0xf1, 0xf2, 0xf4, 0xf5, 0xf6, 0xf8, 0xf9, 0xfa, 0xfc, 0xfd, 0xff
161 };
162 
163 static const uint8_t wp_log2_table [] = {
164  0x00, 0x01, 0x03, 0x04, 0x06, 0x07, 0x09, 0x0a, 0x0b, 0x0d, 0x0e, 0x10, 0x11, 0x12, 0x14, 0x15,
165  0x16, 0x18, 0x19, 0x1a, 0x1c, 0x1d, 0x1e, 0x20, 0x21, 0x22, 0x24, 0x25, 0x26, 0x28, 0x29, 0x2a,
166  0x2c, 0x2d, 0x2e, 0x2f, 0x31, 0x32, 0x33, 0x34, 0x36, 0x37, 0x38, 0x39, 0x3b, 0x3c, 0x3d, 0x3e,
167  0x3f, 0x41, 0x42, 0x43, 0x44, 0x45, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
168  0x52, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5c, 0x5d, 0x5e, 0x5f, 0x60, 0x61, 0x62, 0x63,
169  0x64, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f, 0x70, 0x71, 0x72, 0x74, 0x75,
170  0x76, 0x77, 0x78, 0x79, 0x7a, 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 0x80, 0x81, 0x82, 0x83, 0x84, 0x85,
171  0x86, 0x87, 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 0x90, 0x91, 0x92, 0x93, 0x94, 0x95,
172  0x96, 0x97, 0x98, 0x99, 0x9a, 0x9b, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 0xa0, 0xa1, 0xa2, 0xa3, 0xa4,
173  0xa5, 0xa6, 0xa7, 0xa8, 0xa9, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 0xb0, 0xb1, 0xb2, 0xb2,
174  0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 0xb8, 0xb9, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 0xc0, 0xc0,
175  0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc6, 0xc7, 0xc8, 0xc9, 0xca, 0xcb, 0xcb, 0xcc, 0xcd, 0xce,
176  0xcf, 0xd0, 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd4, 0xd5, 0xd6, 0xd7, 0xd8, 0xd8, 0xd9, 0xda, 0xdb,
177  0xdc, 0xdc, 0xdd, 0xde, 0xdf, 0xe0, 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe4, 0xe5, 0xe6, 0xe7, 0xe7,
178  0xe8, 0xe9, 0xea, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xee, 0xef, 0xf0, 0xf1, 0xf1, 0xf2, 0xf3, 0xf4,
179  0xf4, 0xf5, 0xf6, 0xf7, 0xf7, 0xf8, 0xf9, 0xf9, 0xfa, 0xfb, 0xfc, 0xfc, 0xfd, 0xfe, 0xff, 0xff
180 };
181 
182 static av_always_inline int wp_exp2(int16_t val)
183 {
184  int res, neg = 0;
185 
186  if (val < 0) {
187  val = -val;
188  neg = 1;
189  }
190 
191  res = wp_exp2_table[val & 0xFF] | 0x100;
192  val >>= 8;
193  res = (val > 9) ? (res << (val - 9)) : (res >> (9 - val));
194  return neg ? -res : res;
195 }
196 
198 {
199  int bits;
200 
201  if (!val)
202  return 0;
203  if (val == 1)
204  return 256;
205  val += val >> 9;
206  bits = av_log2(val) + 1;
207  if (bits < 9)
208  return (bits << 8) + wp_log2_table[(val << (9 - bits)) & 0xFF];
209  else
210  return (bits << 8) + wp_log2_table[(val >> (bits - 9)) & 0xFF];
211 }
212 
213 #define LEVEL_DECAY(a) ((a + 0x80) >> 8)
214 
215 // macros for manipulating median values
216 #define GET_MED(n) ((c->median[n] >> 4) + 1)
217 #define DEC_MED(n) c->median[n] -= ((c->median[n] + (128 >> n) - 2) / (128 >> n)) * 2
218 #define INC_MED(n) c->median[n] += ((c->median[n] + (128 >> n) ) / (128 >> n)) * 5
219 
220 // macros for applying weight
221 #define UPDATE_WEIGHT_CLIP(weight, delta, samples, in) \
222  if (samples && in) { \
223  if ((samples ^ in) < 0) { \
224  weight -= delta; \
225  if (weight < -1024) \
226  weight = -1024; \
227  } else { \
228  weight += delta; \
229  if (weight > 1024) \
230  weight = 1024; \
231  } \
232  }
233 
234 
236 {
237  int p, e, res;
238 
239  if (k < 1)
240  return 0;
241  p = av_log2(k);
242  e = (1 << (p + 1)) - k - 1;
243  res = p ? get_bits(gb, p) : 0;
244  if (res >= e)
245  res = (res << 1) - e + get_bits1(gb);
246  return res;
247 }
248 
250 {
251  int i, br[2], sl[2];
252 
253  for (i = 0; i <= ctx->stereo_in; i++) {
254  ctx->ch[i].bitrate_acc += ctx->ch[i].bitrate_delta;
255  br[i] = ctx->ch[i].bitrate_acc >> 16;
256  sl[i] = LEVEL_DECAY(ctx->ch[i].slow_level);
257  }
258  if (ctx->stereo_in && ctx->hybrid_bitrate) {
259  int balance = (sl[1] - sl[0] + br[1] + 1) >> 1;
260  if (balance > br[0]) {
261  br[1] = br[0] << 1;
262  br[0] = 0;
263  } else if (-balance > br[0]) {
264  br[0] <<= 1;
265  br[1] = 0;
266  } else {
267  br[1] = br[0] + balance;
268  br[0] = br[0] - balance;
269  }
270  }
271  for (i = 0; i <= ctx->stereo_in; i++) {
272  if (ctx->hybrid_bitrate) {
273  if (sl[i] - br[i] > -0x100)
274  ctx->ch[i].error_limit = wp_exp2(sl[i] - br[i] + 0x100);
275  else
276  ctx->ch[i].error_limit = 0;
277  } else {
278  ctx->ch[i].error_limit = wp_exp2(br[i]);
279  }
280  }
281 }
282 
284  int channel, int *last)
285 {
286  int t, t2;
287  int sign, base, add, ret;
288  WvChannel *c = &ctx->ch[channel];
289 
290  *last = 0;
291 
292  if ((ctx->ch[0].median[0] < 2U) && (ctx->ch[1].median[0] < 2U) &&
293  !ctx->zero && !ctx->one) {
294  if (ctx->zeroes) {
295  ctx->zeroes--;
296  if (ctx->zeroes) {
298  return 0;
299  }
300  } else {
301  t = get_unary_0_33(gb);
302  if (t >= 2) {
303  if (get_bits_left(gb) < t - 1)
304  goto error;
305  t = get_bits(gb, t - 1) | (1 << (t-1));
306  } else {
307  if (get_bits_left(gb) < 0)
308  goto error;
309  }
310  ctx->zeroes = t;
311  if (ctx->zeroes) {
312  memset(ctx->ch[0].median, 0, sizeof(ctx->ch[0].median));
313  memset(ctx->ch[1].median, 0, sizeof(ctx->ch[1].median));
315  return 0;
316  }
317  }
318  }
319 
320  if (ctx->zero) {
321  t = 0;
322  ctx->zero = 0;
323  } else {
324  t = get_unary_0_33(gb);
325  if (get_bits_left(gb) < 0)
326  goto error;
327  if (t == 16) {
328  t2 = get_unary_0_33(gb);
329  if (t2 < 2) {
330  if (get_bits_left(gb) < 0)
331  goto error;
332  t += t2;
333  } else {
334  if (get_bits_left(gb) < t2 - 1)
335  goto error;
336  t += get_bits(gb, t2 - 1) | (1 << (t2 - 1));
337  }
338  }
339 
340  if (ctx->one) {
341  ctx->one = t & 1;
342  t = (t >> 1) + 1;
343  } else {
344  ctx->one = t & 1;
345  t >>= 1;
346  }
347  ctx->zero = !ctx->one;
348  }
349 
350  if (ctx->hybrid && !channel)
351  update_error_limit(ctx);
352 
353  if (!t) {
354  base = 0;
355  add = GET_MED(0) - 1;
356  DEC_MED(0);
357  } else if (t == 1) {
358  base = GET_MED(0);
359  add = GET_MED(1) - 1;
360  INC_MED(0);
361  DEC_MED(1);
362  } else if (t == 2) {
363  base = GET_MED(0) + GET_MED(1);
364  add = GET_MED(2) - 1;
365  INC_MED(0);
366  INC_MED(1);
367  DEC_MED(2);
368  } else {
369  base = GET_MED(0) + GET_MED(1) + GET_MED(2) * (t - 2);
370  add = GET_MED(2) - 1;
371  INC_MED(0);
372  INC_MED(1);
373  INC_MED(2);
374  }
375  if (!c->error_limit) {
376  if (add >= 0x2000000U) {
377  av_log(ctx->avctx, AV_LOG_ERROR, "k %d is too large\n", add);
378  goto error;
379  }
380  ret = base + get_tail(gb, add);
381  if (get_bits_left(gb) <= 0)
382  goto error;
383  } else {
384  int mid = (base * 2 + add + 1) >> 1;
385  while (add > c->error_limit) {
386  if (get_bits_left(gb) <= 0)
387  goto error;
388  if (get_bits1(gb)) {
389  add -= (mid - base);
390  base = mid;
391  } else
392  add = mid - base - 1;
393  mid = (base * 2 + add + 1) >> 1;
394  }
395  ret = mid;
396  }
397  sign = get_bits1(gb);
398  if (ctx->hybrid_bitrate)
399  c->slow_level += wp_log2(ret) - LEVEL_DECAY(c->slow_level);
400  return sign ? ~ret : ret;
401 
402 error:
403  *last = 1;
404  return 0;
405 }
406 
407 static inline int wv_get_value_integer(WavpackFrameContext *s, uint32_t *crc,
408  int S)
409 {
410  int bit;
411 
412  if (s->extra_bits){
413  S <<= s->extra_bits;
414 
415  if (s->got_extra_bits && get_bits_left(&s->gb_extra_bits) >= s->extra_bits) {
416  S |= get_bits(&s->gb_extra_bits, s->extra_bits);
417  *crc = *crc * 9 + (S & 0xffff) * 3 + ((unsigned)S >> 16);
418  }
419  }
420 
421  bit = (S & s->and) | s->or;
422  bit = ((S + bit) << s->shift) - bit;
423 
424  if (s->hybrid)
425  bit = av_clip(bit, s->hybrid_minclip, s->hybrid_maxclip);
426 
427  return bit << s->post_shift;
428 }
429 
430 static float wv_get_value_float(WavpackFrameContext *s, uint32_t *crc, int S)
431 {
432  union {
433  float f;
434  uint32_t u;
435  } value;
436 
437  unsigned int sign;
438  int exp = s->float_max_exp;
439 
440  if (s->got_extra_bits) {
441  const int max_bits = 1 + 23 + 8 + 1;
442  const int left_bits = get_bits_left(&s->gb_extra_bits);
443 
444  if (left_bits + 8 * FF_INPUT_BUFFER_PADDING_SIZE < max_bits)
445  return 0.0;
446  }
447 
448  if (S) {
449  S <<= s->float_shift;
450  sign = S < 0;
451  if (sign)
452  S = -S;
453  if (S >= 0x1000000) {
454  if (s->got_extra_bits && get_bits1(&s->gb_extra_bits))
455  S = get_bits(&s->gb_extra_bits, 23);
456  else
457  S = 0;
458  exp = 255;
459  } else if (exp) {
460  int shift = 23 - av_log2(S);
461  exp = s->float_max_exp;
462  if (exp <= shift)
463  shift = --exp;
464  exp -= shift;
465 
466  if (shift) {
467  S <<= shift;
468  if ((s->float_flag & WV_FLT_SHIFT_ONES) ||
470  get_bits1(&s->gb_extra_bits))) {
471  S |= (1 << shift) - 1;
472  } else if (s->got_extra_bits &&
473  (s->float_flag & WV_FLT_SHIFT_SENT)) {
474  S |= get_bits(&s->gb_extra_bits, shift);
475  }
476  }
477  } else {
478  exp = s->float_max_exp;
479  }
480  S &= 0x7fffff;
481  } else {
482  sign = 0;
483  exp = 0;
484  if (s->got_extra_bits && (s->float_flag & WV_FLT_ZERO_SENT)) {
485  if (get_bits1(&s->gb_extra_bits)) {
486  S = get_bits(&s->gb_extra_bits, 23);
487  if (s->float_max_exp >= 25)
488  exp = get_bits(&s->gb_extra_bits, 8);
489  sign = get_bits1(&s->gb_extra_bits);
490  } else {
491  if (s->float_flag & WV_FLT_ZERO_SIGN)
492  sign = get_bits1(&s->gb_extra_bits);
493  }
494  }
495  }
496 
497  *crc = *crc * 27 + S * 9 + exp * 3 + sign;
498 
499  value.u = (sign << 31) | (exp << 23) | S;
500  return value.f;
501 }
502 
504 {
505  s->pos = 0;
506  s->sc.crc = s->extra_sc.crc = 0xFFFFFFFF;
507 }
508 
509 static inline int wv_check_crc(WavpackFrameContext *s, uint32_t crc,
510  uint32_t crc_extra_bits)
511 {
512  if (crc != s->CRC) {
513  av_log(s->avctx, AV_LOG_ERROR, "CRC error\n");
514  return AVERROR_INVALIDDATA;
515  }
516  if (s->got_extra_bits && crc_extra_bits != s->crc_extra_bits) {
517  av_log(s->avctx, AV_LOG_ERROR, "Extra bits CRC error\n");
518  return AVERROR_INVALIDDATA;
519  }
520 
521  return 0;
522 }
523 
525  void *dst, const int type)
526 {
527  int i, j, count = 0;
528  int last, t;
529  int A, B, L, L2, R, R2;
530  int pos = s->pos;
531  uint32_t crc = s->sc.crc;
532  uint32_t crc_extra_bits = s->extra_sc.crc;
533  int16_t *dst16 = dst;
534  int32_t *dst32 = dst;
535  float *dstfl = dst;
536  const int channel_pad = s->avctx->channels - 2;
537 
538  s->one = s->zero = s->zeroes = 0;
539  do {
540  L = wv_get_value(s, gb, 0, &last);
541  if (last)
542  break;
543  R = wv_get_value(s, gb, 1, &last);
544  if (last)
545  break;
546  for (i = 0; i < s->terms; i++) {
547  t = s->decorr[i].value;
548  if (t > 0) {
549  if (t > 8) {
550  if (t & 1) {
551  A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
552  B = 2 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1];
553  } else {
554  A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
555  B = (3 * s->decorr[i].samplesB[0] - s->decorr[i].samplesB[1]) >> 1;
556  }
557  s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
558  s->decorr[i].samplesB[1] = s->decorr[i].samplesB[0];
559  j = 0;
560  } else {
561  A = s->decorr[i].samplesA[pos];
562  B = s->decorr[i].samplesB[pos];
563  j = (pos + t) & 7;
564  }
565  if (type != AV_SAMPLE_FMT_S16) {
566  L2 = L + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
567  R2 = R + ((s->decorr[i].weightB * (int64_t)B + 512) >> 10);
568  } else {
569  L2 = L + ((s->decorr[i].weightA * A + 512) >> 10);
570  R2 = R + ((s->decorr[i].weightB * B + 512) >> 10);
571  }
572  if (A && L) s->decorr[i].weightA -= ((((L ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
573  if (B && R) s->decorr[i].weightB -= ((((R ^ B) >> 30) & 2) - 1) * s->decorr[i].delta;
574  s->decorr[i].samplesA[j] = L = L2;
575  s->decorr[i].samplesB[j] = R = R2;
576  } else if (t == -1) {
577  if (type != AV_SAMPLE_FMT_S16)
578  L2 = L + ((s->decorr[i].weightA * (int64_t)s->decorr[i].samplesA[0] + 512) >> 10);
579  else
580  L2 = L + ((s->decorr[i].weightA * s->decorr[i].samplesA[0] + 512) >> 10);
581  UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, s->decorr[i].samplesA[0], L);
582  L = L2;
583  if (type != AV_SAMPLE_FMT_S16)
584  R2 = R + ((s->decorr[i].weightB * (int64_t)L2 + 512) >> 10);
585  else
586  R2 = R + ((s->decorr[i].weightB * L2 + 512) >> 10);
587  UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, L2, R);
588  R = R2;
589  s->decorr[i].samplesA[0] = R;
590  } else {
591  if (type != AV_SAMPLE_FMT_S16)
592  R2 = R + ((s->decorr[i].weightB * (int64_t)s->decorr[i].samplesB[0] + 512) >> 10);
593  else
594  R2 = R + ((s->decorr[i].weightB * s->decorr[i].samplesB[0] + 512) >> 10);
595  UPDATE_WEIGHT_CLIP(s->decorr[i].weightB, s->decorr[i].delta, s->decorr[i].samplesB[0], R);
596  R = R2;
597 
598  if (t == -3) {
599  R2 = s->decorr[i].samplesA[0];
600  s->decorr[i].samplesA[0] = R;
601  }
602 
603  if (type != AV_SAMPLE_FMT_S16)
604  L2 = L + ((s->decorr[i].weightA * (int64_t)R2 + 512) >> 10);
605  else
606  L2 = L + ((s->decorr[i].weightA * R2 + 512) >> 10);
607  UPDATE_WEIGHT_CLIP(s->decorr[i].weightA, s->decorr[i].delta, R2, L);
608  L = L2;
609  s->decorr[i].samplesB[0] = L;
610  }
611  }
612  pos = (pos + 1) & 7;
613  if (s->joint)
614  L += (R -= (L >> 1));
615  crc = (crc * 3 + L) * 3 + R;
616 
617  if (type == AV_SAMPLE_FMT_FLT) {
618  *dstfl++ = wv_get_value_float(s, &crc_extra_bits, L);
619  *dstfl++ = wv_get_value_float(s, &crc_extra_bits, R);
620  dstfl += channel_pad;
621  } else if (type == AV_SAMPLE_FMT_S32) {
622  *dst32++ = wv_get_value_integer(s, &crc_extra_bits, L);
623  *dst32++ = wv_get_value_integer(s, &crc_extra_bits, R);
624  dst32 += channel_pad;
625  } else {
626  *dst16++ = wv_get_value_integer(s, &crc_extra_bits, L);
627  *dst16++ = wv_get_value_integer(s, &crc_extra_bits, R);
628  dst16 += channel_pad;
629  }
630  count++;
631  } while (!last && count < s->samples);
632 
634  if ((s->avctx->err_recognition & AV_EF_CRCCHECK) &&
635  wv_check_crc(s, crc, crc_extra_bits))
636  return AVERROR_INVALIDDATA;
637 
638  return count * 2;
639 }
640 
642  void *dst, const int type)
643 {
644  int i, j, count = 0;
645  int last, t;
646  int A, S, T;
647  int pos = s->pos;
648  uint32_t crc = s->sc.crc;
649  uint32_t crc_extra_bits = s->extra_sc.crc;
650  int16_t *dst16 = dst;
651  int32_t *dst32 = dst;
652  float *dstfl = dst;
653  const int channel_stride = s->avctx->channels;
654 
655  s->one = s->zero = s->zeroes = 0;
656  do {
657  T = wv_get_value(s, gb, 0, &last);
658  S = 0;
659  if (last)
660  break;
661  for (i = 0; i < s->terms; i++) {
662  t = s->decorr[i].value;
663  if (t > 8) {
664  if (t & 1)
665  A = 2 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1];
666  else
667  A = (3 * s->decorr[i].samplesA[0] - s->decorr[i].samplesA[1]) >> 1;
668  s->decorr[i].samplesA[1] = s->decorr[i].samplesA[0];
669  j = 0;
670  } else {
671  A = s->decorr[i].samplesA[pos];
672  j = (pos + t) & 7;
673  }
674  if (type != AV_SAMPLE_FMT_S16)
675  S = T + ((s->decorr[i].weightA * (int64_t)A + 512) >> 10);
676  else
677  S = T + ((s->decorr[i].weightA * A + 512) >> 10);
678  if (A && T)
679  s->decorr[i].weightA -= ((((T ^ A) >> 30) & 2) - 1) * s->decorr[i].delta;
680  s->decorr[i].samplesA[j] = T = S;
681  }
682  pos = (pos + 1) & 7;
683  crc = crc * 3 + S;
684 
685  if (type == AV_SAMPLE_FMT_FLT) {
686  *dstfl = wv_get_value_float(s, &crc_extra_bits, S);
687  dstfl += channel_stride;
688  } else if (type == AV_SAMPLE_FMT_S32) {
689  *dst32 = wv_get_value_integer(s, &crc_extra_bits, S);
690  dst32 += channel_stride;
691  } else {
692  *dst16 = wv_get_value_integer(s, &crc_extra_bits, S);
693  dst16 += channel_stride;
694  }
695  count++;
696  } while (!last && count < s->samples);
697 
699  if ((s->avctx->err_recognition & AV_EF_CRCCHECK) &&
700  wv_check_crc(s, crc, crc_extra_bits))
701  return AVERROR_INVALIDDATA;
702 
703  return count;
704 }
705 
707 {
708 
710  return -1;
711 
712  c->fdec[c->fdec_num] = av_mallocz(sizeof(**c->fdec));
713  if (!c->fdec[c->fdec_num])
714  return -1;
715  c->fdec_num++;
716  c->fdec[c->fdec_num - 1]->avctx = c->avctx;
718 
719  return 0;
720 }
721 
723 {
724  WavpackContext *s = avctx->priv_data;
725 
726  s->avctx = avctx;
727  if (avctx->bits_per_coded_sample <= 16)
728  avctx->sample_fmt = AV_SAMPLE_FMT_S16;
729  else
730  avctx->sample_fmt = AV_SAMPLE_FMT_S32;
731  if (avctx->channels <= 2 && !avctx->channel_layout)
732  avctx->channel_layout = (avctx->channels == 2) ? AV_CH_LAYOUT_STEREO :
734 
735  s->multichannel = avctx->channels > 2;
736  /* lavf demuxer does not provide extradata, Matroska stores 0x403
737  there, use this to detect decoding mode for multichannel */
738  s->mkv_mode = 0;
739  if (s->multichannel && avctx->extradata && avctx->extradata_size == 2) {
740  int ver = AV_RL16(avctx->extradata);
741  if (ver >= 0x402 && ver <= 0x410)
742  s->mkv_mode = 1;
743  }
744 
745  s->fdec_num = 0;
746 
747  return 0;
748 }
749 
751 {
752  WavpackContext *s = avctx->priv_data;
753  int i;
754 
755  for (i = 0; i < s->fdec_num; i++)
756  av_freep(&s->fdec[i]);
757  s->fdec_num = 0;
758 
759  return 0;
760 }
761 
762 static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
763  void *data, int *got_frame_ptr,
764  const uint8_t *buf, int buf_size)
765 {
766  WavpackContext *wc = avctx->priv_data;
768  void *samples = data;
769  int samplecount;
770  int got_terms = 0, got_weights = 0, got_samples = 0,
771  got_entropy = 0, got_bs = 0, got_float = 0, got_hybrid = 0;
772  const uint8_t *orig_buf = buf;
773  const uint8_t *buf_end = buf + buf_size;
774  int i, j, id, size, ssize, weights, t;
775  int bpp, chan, chmask, orig_bpp;
776 
777  if (buf_size == 0) {
778  *got_frame_ptr = 0;
779  return 0;
780  }
781 
782  if (block_no >= wc->fdec_num && wv_alloc_frame_context(wc) < 0) {
783  av_log(avctx, AV_LOG_ERROR, "Error creating frame decode context\n");
784  return -1;
785  }
786 
787  s = wc->fdec[block_no];
788  if (!s) {
789  av_log(avctx, AV_LOG_ERROR, "Context for block %d is not present\n", block_no);
790  return -1;
791  }
792 
793  if (wc->ch_offset >= avctx->channels) {
794  av_log(avctx, AV_LOG_ERROR, "too many channels\n");
795  return -1;
796  }
797 
798  memset(s->decorr, 0, MAX_TERMS * sizeof(Decorr));
799  memset(s->ch, 0, sizeof(s->ch));
800  s->extra_bits = 0;
801  s->and = s->or = s->shift = 0;
802  s->got_extra_bits = 0;
803 
804  if (!wc->mkv_mode) {
805  s->samples = AV_RL32(buf); buf += 4;
806  if (!s->samples) {
807  *got_frame_ptr = 0;
808  return 0;
809  }
810  if (s->samples > wc->samples) {
811  av_log(avctx, AV_LOG_ERROR, "too many samples in block");
812  return -1;
813  }
814  } else {
815  s->samples = wc->samples;
816  }
817  s->frame_flags = AV_RL32(buf); buf += 4;
818  bpp = av_get_bytes_per_sample(avctx->sample_fmt);
819  samples = (uint8_t*)samples + bpp * wc->ch_offset;
820  orig_bpp = ((s->frame_flags & 0x03) + 1) << 3;
821 
822  s->stereo = !(s->frame_flags & WV_MONO);
823  s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo;
827  s->post_shift = bpp * 8 - orig_bpp + ((s->frame_flags >> 13) & 0x1f);
828  s->hybrid_maxclip = (( 1LL << (orig_bpp - 1)) - 1);
829  s->hybrid_minclip = ((-1LL << (orig_bpp - 1)));
830  s->CRC = AV_RL32(buf); buf += 4;
831  if (wc->mkv_mode)
832  buf += 4; //skip block size;
833 
834  wc->ch_offset += 1 + s->stereo;
835 
836  // parse metadata blocks
837  while (buf < buf_end) {
838  id = *buf++;
839  size = *buf++;
840  if (id & WP_IDF_LONG) {
841  size |= (*buf++) << 8;
842  size |= (*buf++) << 16;
843  }
844  size <<= 1; // size is specified in words
845  ssize = size;
846  if (id & WP_IDF_ODD)
847  size--;
848  if (size < 0) {
849  av_log(avctx, AV_LOG_ERROR, "Got incorrect block %02X with size %i\n", id, size);
850  break;
851  }
852  if (buf + ssize > buf_end) {
853  av_log(avctx, AV_LOG_ERROR, "Block size %i is out of bounds\n", size);
854  break;
855  }
856  if (id & WP_IDF_IGNORE) {
857  buf += ssize;
858  continue;
859  }
860  switch (id & WP_IDF_MASK) {
861  case WP_ID_DECTERMS:
862  if (size > MAX_TERMS) {
863  av_log(avctx, AV_LOG_ERROR, "Too many decorrelation terms\n");
864  s->terms = 0;
865  buf += ssize;
866  continue;
867  }
868  s->terms = size;
869  for (i = 0; i < s->terms; i++) {
870  s->decorr[s->terms - i - 1].value = (*buf & 0x1F) - 5;
871  s->decorr[s->terms - i - 1].delta = *buf >> 5;
872  buf++;
873  }
874  got_terms = 1;
875  break;
876  case WP_ID_DECWEIGHTS:
877  if (!got_terms) {
878  av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
879  continue;
880  }
881  weights = size >> s->stereo_in;
882  if (weights > MAX_TERMS || weights > s->terms) {
883  av_log(avctx, AV_LOG_ERROR, "Too many decorrelation weights\n");
884  buf += ssize;
885  continue;
886  }
887  for (i = 0; i < weights; i++) {
888  t = (int8_t)(*buf++);
889  s->decorr[s->terms - i - 1].weightA = t << 3;
890  if (s->decorr[s->terms - i - 1].weightA > 0)
891  s->decorr[s->terms - i - 1].weightA +=
892  (s->decorr[s->terms - i - 1].weightA + 64) >> 7;
893  if (s->stereo_in) {
894  t = (int8_t)(*buf++);
895  s->decorr[s->terms - i - 1].weightB = t << 3;
896  if (s->decorr[s->terms - i - 1].weightB > 0)
897  s->decorr[s->terms - i - 1].weightB +=
898  (s->decorr[s->terms - i - 1].weightB + 64) >> 7;
899  }
900  }
901  got_weights = 1;
902  break;
903  case WP_ID_DECSAMPLES:
904  if (!got_terms) {
905  av_log(avctx, AV_LOG_ERROR, "No decorrelation terms met\n");
906  continue;
907  }
908  t = 0;
909  for (i = s->terms - 1; (i >= 0) && (t < size) && buf <= buf_end; i--) {
910  if (s->decorr[i].value > 8) {
911  s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2;
912  s->decorr[i].samplesA[1] = wp_exp2(AV_RL16(buf)); buf += 2;
913  if (s->stereo_in) {
914  s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2;
915  s->decorr[i].samplesB[1] = wp_exp2(AV_RL16(buf)); buf += 2;
916  t += 4;
917  }
918  t += 4;
919  } else if (s->decorr[i].value < 0) {
920  s->decorr[i].samplesA[0] = wp_exp2(AV_RL16(buf)); buf += 2;
921  s->decorr[i].samplesB[0] = wp_exp2(AV_RL16(buf)); buf += 2;
922  t += 4;
923  } else {
924  for (j = 0; j < s->decorr[i].value && buf+1<buf_end; j++) {
925  s->decorr[i].samplesA[j] = wp_exp2(AV_RL16(buf)); buf += 2;
926  if (s->stereo_in) {
927  s->decorr[i].samplesB[j] = wp_exp2(AV_RL16(buf)); buf += 2;
928  }
929  }
930  t += s->decorr[i].value * 2 * (s->stereo_in + 1);
931  }
932  }
933  got_samples = 1;
934  break;
935  case WP_ID_ENTROPY:
936  if (size != 6 * (s->stereo_in + 1)) {
937  av_log(avctx, AV_LOG_ERROR, "Entropy vars size should be %i, "
938  "got %i", 6 * (s->stereo_in + 1), size);
939  buf += ssize;
940  continue;
941  }
942  for (j = 0; j <= s->stereo_in; j++) {
943  for (i = 0; i < 3; i++) {
944  s->ch[j].median[i] = wp_exp2(AV_RL16(buf));
945  buf += 2;
946  }
947  }
948  got_entropy = 1;
949  break;
950  case WP_ID_HYBRID:
951  if (s->hybrid_bitrate) {
952  for (i = 0; i <= s->stereo_in; i++) {
953  s->ch[i].slow_level = wp_exp2(AV_RL16(buf));
954  buf += 2;
955  size -= 2;
956  }
957  }
958  for (i = 0; i < (s->stereo_in + 1); i++) {
959  s->ch[i].bitrate_acc = AV_RL16(buf) << 16;
960  buf += 2;
961  size -= 2;
962  }
963  if (size > 0) {
964  for (i = 0; i < (s->stereo_in + 1); i++) {
965  s->ch[i].bitrate_delta = wp_exp2((int16_t)AV_RL16(buf));
966  buf += 2;
967  }
968  } else {
969  for (i = 0; i < (s->stereo_in + 1); i++)
970  s->ch[i].bitrate_delta = 0;
971  }
972  got_hybrid = 1;
973  break;
974  case WP_ID_INT32INFO:
975  if (size != 4) {
976  av_log(avctx, AV_LOG_ERROR, "Invalid INT32INFO, size = %i, sent_bits = %i\n", size, *buf);
977  buf += ssize;
978  continue;
979  }
980  if (buf[0])
981  s->extra_bits = buf[0];
982  else if (buf[1])
983  s->shift = buf[1];
984  else if (buf[2]){
985  s->and = s->or = 1;
986  s->shift = buf[2];
987  } else if(buf[3]) {
988  s->and = 1;
989  s->shift = buf[3];
990  }
991  /* original WavPack decoder forces 32-bit lossy sound to be treated
992  * as 24-bit one in order to have proper clipping
993  */
994  if (s->hybrid && bpp == 4 && s->post_shift < 8 && s->shift > 8) {
995  s->post_shift += 8;
996  s->shift -= 8;
997  s->hybrid_maxclip >>= 8;
998  s->hybrid_minclip >>= 8;
999  }
1000  buf += 4;
1001  break;
1002  case WP_ID_FLOATINFO:
1003  if (size != 4) {
1004  av_log(avctx, AV_LOG_ERROR, "Invalid FLOATINFO, size = %i\n", size);
1005  buf += ssize;
1006  continue;
1007  }
1008  s->float_flag = buf[0];
1009  s->float_shift = buf[1];
1010  s->float_max_exp = buf[2];
1011  buf += 4;
1012  got_float = 1;
1013  break;
1014  case WP_ID_DATA:
1015  s->sc.offset = buf - orig_buf;
1016  s->sc.size = size * 8;
1017  init_get_bits(&s->gb, buf, size * 8);
1018  s->data_size = size * 8;
1019  buf += size;
1020  got_bs = 1;
1021  break;
1022  case WP_ID_EXTRABITS:
1023  if (size <= 4) {
1024  av_log(avctx, AV_LOG_ERROR, "Invalid EXTRABITS, size = %i\n",
1025  size);
1026  buf += size;
1027  continue;
1028  }
1029  s->extra_sc.offset = buf - orig_buf;
1030  s->extra_sc.size = size * 8;
1031  init_get_bits(&s->gb_extra_bits, buf, size * 8);
1033  buf += size;
1034  s->got_extra_bits = 1;
1035  break;
1036  case WP_ID_CHANINFO:
1037  if (size <= 1) {
1038  av_log(avctx, AV_LOG_ERROR, "Insufficient channel information\n");
1039  return -1;
1040  }
1041  chan = *buf++;
1042  switch (size - 2) {
1043  case 0: chmask = *buf; break;
1044  case 1: chmask = AV_RL16(buf); break;
1045  case 2: chmask = AV_RL24(buf); break;
1046  case 3: chmask = AV_RL32(buf); break;
1047  case 5:
1048  chan |= (buf[1] & 0xF) << 8;
1049  chmask = AV_RL24(buf + 2);
1050  break;
1051  default:
1052  av_log(avctx, AV_LOG_ERROR, "Invalid channel info size %d\n",
1053  size);
1054  chan = avctx->channels;
1055  chmask = avctx->channel_layout;
1056  }
1057  if (chan != avctx->channels) {
1058  av_log(avctx, AV_LOG_ERROR, "Block reports total %d channels, "
1059  "decoder believes it's %d channels\n", chan,
1060  avctx->channels);
1061  return -1;
1062  }
1063  if (!avctx->channel_layout)
1064  avctx->channel_layout = chmask;
1065  buf += size - 1;
1066  break;
1067  default:
1068  buf += size;
1069  }
1070  if (id & WP_IDF_ODD)
1071  buf++;
1072  }
1073 
1074  if (!got_terms) {
1075  av_log(avctx, AV_LOG_ERROR, "No block with decorrelation terms\n");
1076  return -1;
1077  }
1078  if (!got_weights) {
1079  av_log(avctx, AV_LOG_ERROR, "No block with decorrelation weights\n");
1080  return -1;
1081  }
1082  if (!got_samples) {
1083  av_log(avctx, AV_LOG_ERROR, "No block with decorrelation samples\n");
1084  return -1;
1085  }
1086  if (!got_entropy) {
1087  av_log(avctx, AV_LOG_ERROR, "No block with entropy info\n");
1088  return -1;
1089  }
1090  if (s->hybrid && !got_hybrid) {
1091  av_log(avctx, AV_LOG_ERROR, "Hybrid config not found\n");
1092  return -1;
1093  }
1094  if (!got_bs) {
1095  av_log(avctx, AV_LOG_ERROR, "Packed samples not found\n");
1096  return -1;
1097  }
1098  if (!got_float && avctx->sample_fmt == AV_SAMPLE_FMT_FLT) {
1099  av_log(avctx, AV_LOG_ERROR, "Float information not found\n");
1100  return -1;
1101  }
1102  if (s->got_extra_bits && avctx->sample_fmt != AV_SAMPLE_FMT_FLT) {
1103  const int size = get_bits_left(&s->gb_extra_bits);
1104  const int wanted = s->samples * s->extra_bits << s->stereo_in;
1105  if (size < wanted) {
1106  av_log(avctx, AV_LOG_ERROR, "Too small EXTRABITS\n");
1107  s->got_extra_bits = 0;
1108  }
1109  }
1110 
1111  if (s->stereo_in) {
1112  if (avctx->sample_fmt == AV_SAMPLE_FMT_S16)
1113  samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_S16);
1114  else if (avctx->sample_fmt == AV_SAMPLE_FMT_S32)
1115  samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_S32);
1116  else
1117  samplecount = wv_unpack_stereo(s, &s->gb, samples, AV_SAMPLE_FMT_FLT);
1118 
1119  if (samplecount < 0)
1120  return -1;
1121 
1122  samplecount >>= 1;
1123  } else {
1124  const int channel_stride = avctx->channels;
1125 
1126  if (avctx->sample_fmt == AV_SAMPLE_FMT_S16)
1127  samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_S16);
1128  else if (avctx->sample_fmt == AV_SAMPLE_FMT_S32)
1129  samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_S32);
1130  else
1131  samplecount = wv_unpack_mono(s, &s->gb, samples, AV_SAMPLE_FMT_FLT);
1132 
1133  if (samplecount < 0)
1134  return -1;
1135 
1136  if (s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S16) {
1137  int16_t *dst = (int16_t*)samples + 1;
1138  int16_t *src = (int16_t*)samples;
1139  int cnt = samplecount;
1140  while (cnt--) {
1141  *dst = *src;
1142  src += channel_stride;
1143  dst += channel_stride;
1144  }
1145  } else if (s->stereo && avctx->sample_fmt == AV_SAMPLE_FMT_S32) {
1146  int32_t *dst = (int32_t*)samples + 1;
1147  int32_t *src = (int32_t*)samples;
1148  int cnt = samplecount;
1149  while (cnt--) {
1150  *dst = *src;
1151  src += channel_stride;
1152  dst += channel_stride;
1153  }
1154  } else if (s->stereo) {
1155  float *dst = (float*)samples + 1;
1156  float *src = (float*)samples;
1157  int cnt = samplecount;
1158  while (cnt--) {
1159  *dst = *src;
1160  src += channel_stride;
1161  dst += channel_stride;
1162  }
1163  }
1164  }
1165 
1166  *got_frame_ptr = 1;
1167 
1168  return samplecount * bpp;
1169 }
1170 
1172 {
1173  WavpackContext *s = avctx->priv_data;
1174  int i;
1175 
1176  for (i = 0; i < s->fdec_num; i++)
1178 }
1179 
1180 static int wavpack_decode_frame(AVCodecContext *avctx, void *data,
1181  int *got_frame_ptr, AVPacket *avpkt)
1182 {
1183  WavpackContext *s = avctx->priv_data;
1184  const uint8_t *buf = avpkt->data;
1185  int buf_size = avpkt->size;
1186  AVFrame *frame = data;
1187  int frame_size, ret, frame_flags;
1188  int samplecount = 0;
1189 
1190  s->block = 0;
1191  s->ch_offset = 0;
1192 
1193  /* determine number of samples */
1194  if (s->mkv_mode) {
1195  s->samples = AV_RL32(buf); buf += 4;
1196  frame_flags = AV_RL32(buf);
1197  } else {
1198  if (s->multichannel) {
1199  s->samples = AV_RL32(buf + 4);
1200  frame_flags = AV_RL32(buf + 8);
1201  } else {
1202  s->samples = AV_RL32(buf);
1203  frame_flags = AV_RL32(buf + 4);
1204  }
1205  }
1206  if (s->samples <= 0 || s->samples > WV_MAX_SAMPLES) {
1207  av_log(avctx, AV_LOG_ERROR, "Invalid number of samples: %d\n",
1208  s->samples);
1209  return AVERROR(EINVAL);
1210  }
1211 
1212  if (frame_flags & 0x80) {
1213  avctx->sample_fmt = AV_SAMPLE_FMT_FLT;
1214  } else if ((frame_flags & 0x03) <= 1) {
1215  avctx->sample_fmt = AV_SAMPLE_FMT_S16;
1216  } else {
1217  avctx->sample_fmt = AV_SAMPLE_FMT_S32;
1218  avctx->bits_per_raw_sample = ((frame_flags & 0x03) + 1) << 3;
1219  }
1220 
1221  /* get output buffer */
1222  frame->nb_samples = s->samples + 1;
1223  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
1224  return ret;
1225  frame->nb_samples = s->samples;
1226 
1227  while (buf_size > 0) {
1228  if (!s->multichannel) {
1229  frame_size = buf_size;
1230  } else {
1231  if (!s->mkv_mode) {
1232  frame_size = AV_RL32(buf) - 12; buf += 4; buf_size -= 4;
1233  } else {
1234  if (buf_size < 12) //MKV files can have zero flags after last block
1235  break;
1236  frame_size = AV_RL32(buf + 8) + 12;
1237  }
1238  }
1239  if (frame_size < 0 || frame_size > buf_size) {
1240  av_log(avctx, AV_LOG_ERROR, "Block %d has invalid size (size %d "
1241  "vs. %d bytes left)\n", s->block, frame_size, buf_size);
1242  wavpack_decode_flush(avctx);
1243  return AVERROR_INVALIDDATA;
1244  }
1245  if ((samplecount = wavpack_decode_block(avctx, s->block,
1246  frame->data[0], got_frame_ptr,
1247  buf, frame_size)) < 0) {
1248  wavpack_decode_flush(avctx);
1249  return AVERROR_INVALIDDATA;
1250  }
1251  s->block++;
1252  buf += frame_size; buf_size -= frame_size;
1253  }
1254 
1255  return avpkt->size;
1256 }
1257 
1259  .name = "wavpack",
1260  .type = AVMEDIA_TYPE_AUDIO,
1261  .id = AV_CODEC_ID_WAVPACK,
1262  .priv_data_size = sizeof(WavpackContext),
1267  .capabilities = CODEC_CAP_SUBFRAMES | CODEC_CAP_DR1,
1268  .long_name = NULL_IF_CONFIG_SMALL("WavPack"),
1269 };
static av_always_inline int wp_exp2(int16_t val)
Definition: wavpack.c:182
int delta
Definition: wavpack.c:86
void * av_mallocz(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:205
const char * s
Definition: avisynth_c.h:668
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
#define GET_MED(n)
Definition: wavpack.c:216
static int shift(int a, int b)
Definition: sonic.c:86
int median[3]
Definition: wavpack.c:95
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
static void wavpack_decode_flush(AVCodecContext *avctx)
Definition: wavpack.c:1171
enum AVCodecID id
Definition: mxfenc.c:89
struct WavpackFrameContext WavpackFrameContext
#define B
Definition: dsputil.c:2025
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:240
int slow_level
Definition: wavpack.c:96
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
Sinusoidal phase f
#define R2
Definition: simple_idct.c:155
#define DEC_MED(n)
Definition: wavpack.c:217
#define AV_RL16
WP_ID_Flags
Definition: wavpack.c:52
#define WV_FLT_SHIFT_SAME
Definition: wavpack.c:45
int weightB
Definition: wavpack.c:89
int samplesB[8]
Definition: wavpack.c:91
int bits_per_raw_sample
Bits per sample/pixel of internal libavcodec pixel/sample format.
#define AV_CH_LAYOUT_STEREO
signed 16 bits
Definition: samplefmt.h:52
Decorr decorr[MAX_TERMS]
Definition: wavpack.c:113
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
static int wv_get_value_integer(WavpackFrameContext *s, uint32_t *crc, int S)
Definition: wavpack.c:407
static int get_unary_0_33(GetBitContext *gb)
Get unary code terminated by a 0 with a maximum length of 33.
Definition: unary.h:46
#define WV_FLT_ZERO_SENT
Definition: wavpack.c:47
uint8_t bits
Definition: crc.c:216
enum AVSampleFormat sample_fmt
audio sample format
uint8_t
#define av_cold
Definition: attributes.h:78
AVCodec ff_wavpack_decoder
Definition: wavpack.c:1258
static av_always_inline int wp_log2(int32_t val)
Definition: wavpack.c:197
int value
Definition: wavpack.c:87
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
int multichannel
Definition: wavpack.c:136
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
F H1 F F H1 F F F F H1<-F-------F-------F v v v H2 H3 H2^^^F-------F-------F-> H1<-F-------F-------F|||||||||F H1 F|||||||||F H1 Funavailable fullpel samples(outside the picture for example) shall be equalto the closest available fullpel sampleSmaller pel interpolation:--------------------------if diag_mc is set then points which lie on a line between 2 vertically, horiziontally or diagonally adjacent halfpel points shall be interpolatedlinearls with rounding to nearest and halfway values rounded up.points which lie on 2 diagonals at the same time should only use the onediagonal not containing the fullpel point F--> O q O<--h1-> O q O<--F v\/v\/v O O O O O O O|/|\|q q q q q|/|\|O O O O O O O^/\^/\^h2--> O q O<--h3-> O q O<--h2 v\/v\/v O O O O O O O|\|/|q q q q q|\|/|O O O O O O O^/\^/\^F--> O q O<--h1-> O q O<--Fthe remaining points shall be bilinearly interpolated from theup to 4 surrounding halfpel and fullpel points, again rounding should be tonearest and halfway values rounded upcompliant Snow decoders MUST support 1-1/8 pel luma and 1/2-1/16 pel chromainterpolation at leastOverlapped block motion compensation:-------------------------------------FIXMELL band prediction:===================Each sample in the LL0 subband is predicted by the median of the left, top andleft+top-topleft samples, samples outside the subband shall be considered tobe 0.To reverse this prediction in the decoder apply the following.for(y=0;y< height;y++){for(x=0;x< width;x++){sample[y][x]+=median(sample[y-1][x], sample[y][x-1], sample[y-1][x]+sample[y][x-1]-sample[y-1][x-1]);}}sample[-1][*]=sample[*][-1]=0;width, height here are the width and height of the LL0 subband not of the finalvideoDequantizaton:==============FIXMEWavelet Transform:==================Snow supports 2 wavelet transforms, the symmetric biorthogonal 5/3 integertransform and a integer approximation of the symmetric biorthogonal 9/7daubechies wavelet.2D IDWT(inverse discrete wavelet transform)--------------------------------------------The 2D IDWT applies a 2D filter recursively, each time combining the4 lowest frequency subbands into a single subband until only 1 subbandremains.The 2D filter is done by first applying a 1D filter in the vertical directionand then applying it in the horizontal one.------------------------------------------------------------|LL0|HL0|||||||||||||---+---|HL1||L0|H0|HL1||LL1|HL1|||||LH0|HH0|||||||||||||-------+-------|-> L1 H1 LH1 HH1 LH1 HH1 LH1 HH1 L2
Definition: snow.txt:546
#define R
Definition: dsputil.c:2027
uint8_t * data
bitstream reader API header.
int bits_per_coded_sample
bits per sample/pixel from the demuxer (needed for huffyuv).
struct Decorr Decorr
#define A(x)
WavpackFrameContext * fdec[WV_MAX_FRAME_DECODERS]
Definition: wavpack.c:133
struct WvChannel WvChannel
frame
Definition: stft.m:14
static const uint8_t frame_size[4]
Definition: g723_1_data.h:58
#define U(x)
WP_ID
Definition: wavpack.c:59
#define WV_FLT_SHIFT_ONES
Definition: wavpack.c:44
static int get_bits_left(GetBitContext *gb)
Definition: get_bits.h:557
#define S(s, c, i)
struct WavpackContext WavpackContext
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Spectrum Plot time data
AVCodecContext * avctx
Definition: wavpack.c:101
#define zero
Definition: regdef.h:64
#define WV_HYBRID_MODE
Definition: wavpack.c:39
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
external API header
uint64_t channel_layout
Audio channel layout.
signed 32 bits
Definition: samplefmt.h:53
int weightA
Definition: wavpack.c:88
uint32_t crc
Definition: wavpack.c:80
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
#define WV_JOINT_STEREO
Definition: wavpack.c:36
#define WV_MAX_SAMPLES
Definition: wavpack.c:50
static int wavpack_decode_block(AVCodecContext *avctx, int block_no, void *data, int *got_frame_ptr, const uint8_t *buf, int buf_size)
Definition: wavpack.c:762
audio channel layout utility functions
int err_recognition
Error recognition; may misdetect some more or less valid parts as errors.
ret
Definition: avfilter.c:821
static void wv_reset_saved_context(WavpackFrameContext *s)
Definition: wavpack.c:503
static int wv_unpack_mono(WavpackFrameContext *s, GetBitContext *gb, void *dst, const int type)
Definition: wavpack.c:641
t
Definition: genspecsines3.m:6
int32_t
#define UPDATE_WEIGHT_CLIP(weight, delta, samples, in)
Definition: wavpack.c:221
#define WV_FLT_ZERO_SIGN
Definition: wavpack.c:48
#define AV_RL32
float u
#define L(x)
struct SavedContext SavedContext
int error_limit
Definition: wavpack.c:96
static void flush(AVCodecContext *avctx)
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
Definition: samplefmt.c:104
int bitrate_acc
Definition: wavpack.c:97
#define INC_MED(n)
Definition: wavpack.c:218
for k
static av_cold int wavpack_decode_end(AVCodecContext *avctx)
Definition: wavpack.c:750
1i.*Xphase exp()
AVS_Value src
Definition: avisynth_c.h:523
uint32_t crc_extra_bits
Definition: wavpack.c:108
or(d) export
main external API structure.
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
static float wv_get_value_float(WavpackFrameContext *s, uint32_t *crc, int S)
Definition: wavpack.c:430
int ff_get_buffer(AVCodecContext *avctx, AVFrame *frame, int flags)
Get a buffer for a frame.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
void * buf
Definition: avisynth_c.h:594
#define LEVEL_DECAY(a)
Definition: wavpack.c:213
static const uint8_t wp_log2_table[]
Definition: wavpack.c:163
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:273
SavedContext sc
Definition: wavpack.c:125
double value
Definition: eval.c:82
synthesis window for stochastic i
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:379
static const uint8_t wp_exp2_table[256]
Definition: wavpack.c:144
static int wavpack_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
Definition: wavpack.c:1180
int samplesA[8]
Definition: wavpack.c:90
static int wv_check_crc(WavpackFrameContext *s, uint32_t crc, uint32_t crc_extra_bits)
Definition: wavpack.c:509
#define WV_FALSE_STEREO
Definition: wavpack.c:37
static unsigned int get_bits_long(GetBitContext *s, int n)
Read 0-32 bits.
Definition: get_bits.h:306
#define WV_HYBRID_BITRATE
Definition: wavpack.c:41
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
#define type
static int wv_get_value(WavpackFrameContext *ctx, GetBitContext *gb, int channel, int *last)
Definition: wavpack.c:283
WvChannel ch[2]
Definition: wavpack.c:123
#define AV_RL24
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
static av_always_inline int get_tail(GetBitContext *gb, int k)
Definition: wavpack.c:235
#define CODEC_CAP_SUBFRAMES
Codec can output multiple frames per AVPacket Normally demuxers return one frame at a time...
#define WV_FLT_SHIFT_SENT
Definition: wavpack.c:46
static int wv_unpack_stereo(WavpackFrameContext *s, GetBitContext *gb, void *dst, const int type)
Definition: wavpack.c:524
Must be a power of two T
common internal api header.
int offset
Definition: wavpack.c:77
static double c[64]
int size
Definition: wavpack.c:78
int bits_used
Definition: wavpack.c:79
#define AV_EF_CRCCHECK
GetBitContext gb_extra_bits
Definition: wavpack.c:109
int channels
number of audio channels
#define av_log2
Definition: intmath.h:89
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
#define WV_MONO
Definition: wavpack.c:35
AVCodecContext * avctx
Definition: wavpack.c:131
#define MAX_TERMS
Definition: wavpack.c:83
Definition: wavpack.c:85
GetBitContext gb
Definition: wavpack.c:106
Filter the word “frame” indicates either a video frame or a group of audio samples
void INT64 INT64 count
Definition: avisynth_c.h:594
#define av_always_inline
Definition: attributes.h:41
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
static av_cold int wv_alloc_frame_context(WavpackContext *c)
Definition: wavpack.c:706
static av_cold int wavpack_decode_init(AVCodecContext *avctx)
Definition: wavpack.c:722
#define WV_MAX_FRAME_DECODERS
Definition: wavpack.c:128
int bitrate_delta
Definition: wavpack.c:97
#define AV_CH_LAYOUT_MONO
This structure stores compressed data.
int nb_samples
number of audio samples (per channel) described by this frame
Definition: frame.h:127
#define t2
Definition: regdef.h:30
static void update_error_limit(WavpackFrameContext *ctx)
Definition: wavpack.c:249
SavedContext extra_sc
Definition: wavpack.c:125