cook.c
Go to the documentation of this file.
1 /*
2  * COOK compatible decoder
3  * Copyright (c) 2003 Sascha Sommer
4  * Copyright (c) 2005 Benjamin Larsson
5  *
6  * This file is part of FFmpeg.
7  *
8  * FFmpeg is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 2.1 of the License, or (at your option) any later version.
12  *
13  * FFmpeg is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with FFmpeg; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21  */
22 
23 /**
24  * @file
25  * Cook compatible decoder. Bastardization of the G.722.1 standard.
26  * This decoder handles RealNetworks, RealAudio G2 data.
27  * Cook is identified by the codec name cook in RM files.
28  *
29  * To use this decoder, a calling application must supply the extradata
30  * bytes provided from the RM container; 8+ bytes for mono streams and
31  * 16+ for stereo streams (maybe more).
32  *
33  * Codec technicalities (all this assume a buffer length of 1024):
34  * Cook works with several different techniques to achieve its compression.
35  * In the timedomain the buffer is divided into 8 pieces and quantized. If
36  * two neighboring pieces have different quantization index a smooth
37  * quantization curve is used to get a smooth overlap between the different
38  * pieces.
39  * To get to the transformdomain Cook uses a modulated lapped transform.
40  * The transform domain has 50 subbands with 20 elements each. This
41  * means only a maximum of 50*20=1000 coefficients are used out of the 1024
42  * available.
43  */
44 
46 #include "libavutil/lfg.h"
47 #include "avcodec.h"
48 #include "get_bits.h"
49 #include "dsputil.h"
50 #include "bytestream.h"
51 #include "fft.h"
52 #include "internal.h"
53 #include "sinewin.h"
54 
55 #include "cookdata.h"
56 
57 /* the different Cook versions */
58 #define MONO 0x1000001
59 #define STEREO 0x1000002
60 #define JOINT_STEREO 0x1000003
61 #define MC_COOK 0x2000000 // multichannel Cook, not supported
62 
63 #define SUBBAND_SIZE 20
64 #define MAX_SUBPACKETS 5
65 
66 typedef struct {
67  int *now;
68  int *previous;
69 } cook_gains;
70 
71 typedef struct {
72  int ch_idx;
73  int size;
76  int subbands;
81  unsigned int channel_mask;
87  int numvector_size; // 1 << log2_numvector_size;
88 
89  float mono_previous_buffer1[1024];
90  float mono_previous_buffer2[1024];
91 
94  int gain_1[9];
95  int gain_2[9];
96  int gain_3[9];
97  int gain_4[9];
99 
100 typedef struct cook {
101  /*
102  * The following 5 functions provide the lowlevel arithmetic on
103  * the internal audio buffers.
104  */
105  void (*scalar_dequant)(struct cook *q, int index, int quant_index,
106  int *subband_coef_index, int *subband_coef_sign,
107  float *mlt_p);
108 
109  void (*decouple)(struct cook *q,
110  COOKSubpacket *p,
111  int subband,
112  float f1, float f2,
113  float *decode_buffer,
114  float *mlt_buffer1, float *mlt_buffer2);
115 
116  void (*imlt_window)(struct cook *q, float *buffer1,
117  cook_gains *gains_ptr, float *previous_buffer);
118 
119  void (*interpolate)(struct cook *q, float *buffer,
120  int gain_index, int gain_index_next);
121 
122  void (*saturate_output)(struct cook *q, float *out);
123 
127  /* stream data */
130  /* states */
133 
134  /* transform data */
136  float* mlt_window;
137 
138  /* VLC data */
140  VLC sqvh[7]; // scalar quantization
141 
142  /* generatable tables and related variables */
144  float gain_table[23];
145 
146  /* data buffers */
147 
149  DECLARE_ALIGNED(32, float, mono_mdct_output)[2048];
150  float decode_buffer_1[1024];
151  float decode_buffer_2[1024];
152  float decode_buffer_0[1060]; /* static allocation for joint decode */
153 
154  const float *cplscales[5];
157 } COOKContext;
158 
159 static float pow2tab[127];
160 static float rootpow2tab[127];
161 
162 /*************** init functions ***************/
163 
164 /* table generator */
165 static av_cold void init_pow2table(void)
166 {
167  int i;
168  for (i = -63; i < 64; i++) {
169  pow2tab[63 + i] = pow(2, i);
170  rootpow2tab[63 + i] = sqrt(pow(2, i));
171  }
172 }
173 
174 /* table generator */
176 {
177  int i;
179  for (i = 0; i < 23; i++)
180  q->gain_table[i] = pow(pow2tab[i + 52],
181  (1.0 / (double) q->gain_size_factor));
182 }
183 
184 
186 {
187  int i, result;
188 
189  result = 0;
190  for (i = 0; i < 13; i++) {
191  result |= init_vlc(&q->envelope_quant_index[i], 9, 24,
193  envelope_quant_index_huffcodes[i], 2, 2, 0);
194  }
195  av_log(q->avctx, AV_LOG_DEBUG, "sqvh VLC init\n");
196  for (i = 0; i < 7; i++) {
197  result |= init_vlc(&q->sqvh[i], vhvlcsize_tab[i], vhsize_tab[i],
198  cvh_huffbits[i], 1, 1,
199  cvh_huffcodes[i], 2, 2, 0);
200  }
201 
202  for (i = 0; i < q->num_subpackets; i++) {
203  if (q->subpacket[i].joint_stereo == 1) {
204  result |= init_vlc(&q->subpacket[i].channel_coupling, 6,
205  (1 << q->subpacket[i].js_vlc_bits) - 1,
206  ccpl_huffbits[q->subpacket[i].js_vlc_bits - 2], 1, 1,
207  ccpl_huffcodes[q->subpacket[i].js_vlc_bits - 2], 2, 2, 0);
208  av_log(q->avctx, AV_LOG_DEBUG, "subpacket %i Joint-stereo VLC used.\n", i);
209  }
210  }
211 
212  av_log(q->avctx, AV_LOG_DEBUG, "VLC tables initialized.\n");
213  return result;
214 }
215 
217 {
218  int j, ret;
219  int mlt_size = q->samples_per_channel;
220 
221  if ((q->mlt_window = av_malloc(mlt_size * sizeof(*q->mlt_window))) == 0)
222  return AVERROR(ENOMEM);
223 
224  /* Initialize the MLT window: simple sine window. */
225  ff_sine_window_init(q->mlt_window, mlt_size);
226  for (j = 0; j < mlt_size; j++)
227  q->mlt_window[j] *= sqrt(2.0 / q->samples_per_channel);
228 
229  /* Initialize the MDCT. */
230  if ((ret = ff_mdct_init(&q->mdct_ctx, av_log2(mlt_size) + 1, 1, 1.0 / 32768.0))) {
231  av_free(q->mlt_window);
232  return ret;
233  }
234  av_log(q->avctx, AV_LOG_DEBUG, "MDCT initialized, order = %d.\n",
235  av_log2(mlt_size) + 1);
236 
237  return 0;
238 }
239 
241 {
242  int i;
243  for (i = 0; i < 5; i++)
244  q->cplscales[i] = cplscales[i];
245 }
246 
247 /*************** init functions end ***********/
248 
249 #define DECODE_BYTES_PAD1(bytes) (3 - ((bytes) + 3) % 4)
250 #define DECODE_BYTES_PAD2(bytes) ((bytes) % 4 + DECODE_BYTES_PAD1(2 * (bytes)))
251 
252 /**
253  * Cook indata decoding, every 32 bits are XORed with 0x37c511f2.
254  * Why? No idea, some checksum/error detection method maybe.
255  *
256  * Out buffer size: extra bytes are needed to cope with
257  * padding/misalignment.
258  * Subpackets passed to the decoder can contain two, consecutive
259  * half-subpackets, of identical but arbitrary size.
260  * 1234 1234 1234 1234 extraA extraB
261  * Case 1: AAAA BBBB 0 0
262  * Case 2: AAAA ABBB BB-- 3 3
263  * Case 3: AAAA AABB BBBB 2 2
264  * Case 4: AAAA AAAB BBBB BB-- 1 5
265  *
266  * Nice way to waste CPU cycles.
267  *
268  * @param inbuffer pointer to byte array of indata
269  * @param out pointer to byte array of outdata
270  * @param bytes number of bytes
271  */
272 static inline int decode_bytes(const uint8_t *inbuffer, uint8_t *out, int bytes)
273 {
274  static const uint32_t tab[4] = {
275  AV_BE2NE32C(0x37c511f2u), AV_BE2NE32C(0xf237c511u),
276  AV_BE2NE32C(0x11f237c5u), AV_BE2NE32C(0xc511f237u),
277  };
278  int i, off;
279  uint32_t c;
280  const uint32_t *buf;
281  uint32_t *obuf = (uint32_t *) out;
282  /* FIXME: 64 bit platforms would be able to do 64 bits at a time.
283  * I'm too lazy though, should be something like
284  * for (i = 0; i < bitamount / 64; i++)
285  * (int64_t) out[i] = 0x37c511f237c511f2 ^ av_be2ne64(int64_t) in[i]);
286  * Buffer alignment needs to be checked. */
287 
288  off = (intptr_t) inbuffer & 3;
289  buf = (const uint32_t *) (inbuffer - off);
290  c = tab[off];
291  bytes += 3 + off;
292  for (i = 0; i < bytes / 4; i++)
293  obuf[i] = c ^ buf[i];
294 
295  return off;
296 }
297 
299 {
300  int i;
301  COOKContext *q = avctx->priv_data;
302  av_log(avctx, AV_LOG_DEBUG, "Deallocating memory.\n");
303 
304  /* Free allocated memory buffers. */
305  av_free(q->mlt_window);
307 
308  /* Free the transform. */
309  ff_mdct_end(&q->mdct_ctx);
310 
311  /* Free the VLC tables. */
312  for (i = 0; i < 13; i++)
314  for (i = 0; i < 7; i++)
315  ff_free_vlc(&q->sqvh[i]);
316  for (i = 0; i < q->num_subpackets; i++)
318 
319  av_log(avctx, AV_LOG_DEBUG, "Memory deallocated.\n");
320 
321  return 0;
322 }
323 
324 /**
325  * Fill the gain array for the timedomain quantization.
326  *
327  * @param gb pointer to the GetBitContext
328  * @param gaininfo array[9] of gain indexes
329  */
330 static void decode_gain_info(GetBitContext *gb, int *gaininfo)
331 {
332  int i, n;
333 
334  while (get_bits1(gb)) {
335  /* NOTHING */
336  }
337 
338  n = get_bits_count(gb) - 1; // amount of elements*2 to update
339 
340  i = 0;
341  while (n--) {
342  int index = get_bits(gb, 3);
343  int gain = get_bits1(gb) ? get_bits(gb, 4) - 7 : -1;
344 
345  while (i <= index)
346  gaininfo[i++] = gain;
347  }
348  while (i <= 8)
349  gaininfo[i++] = 0;
350 }
351 
352 /**
353  * Create the quant index table needed for the envelope.
354  *
355  * @param q pointer to the COOKContext
356  * @param quant_index_table pointer to the array
357  */
359  int *quant_index_table)
360 {
361  int i, j, vlc_index;
362 
363  quant_index_table[0] = get_bits(&q->gb, 6) - 6; // This is used later in categorize
364 
365  for (i = 1; i < p->total_subbands; i++) {
366  vlc_index = i;
367  if (i >= p->js_subband_start * 2) {
368  vlc_index -= p->js_subband_start;
369  } else {
370  vlc_index /= 2;
371  if (vlc_index < 1)
372  vlc_index = 1;
373  }
374  if (vlc_index > 13)
375  vlc_index = 13; // the VLC tables >13 are identical to No. 13
376 
377  j = get_vlc2(&q->gb, q->envelope_quant_index[vlc_index - 1].table,
378  q->envelope_quant_index[vlc_index - 1].bits, 2);
379  quant_index_table[i] = quant_index_table[i - 1] + j - 12; // differential encoding
380  if (quant_index_table[i] > 63 || quant_index_table[i] < -63) {
382  "Invalid quantizer %d at position %d, outside [-63, 63] range\n",
383  quant_index_table[i], i);
384  return AVERROR_INVALIDDATA;
385  }
386  }
387 
388  return 0;
389 }
390 
391 /**
392  * Calculate the category and category_index vector.
393  *
394  * @param q pointer to the COOKContext
395  * @param quant_index_table pointer to the array
396  * @param category pointer to the category array
397  * @param category_index pointer to the category_index array
398  */
399 static void categorize(COOKContext *q, COOKSubpacket *p, const int *quant_index_table,
400  int *category, int *category_index)
401 {
402  int exp_idx, bias, tmpbias1, tmpbias2, bits_left, num_bits, index, v, i, j;
403  int exp_index2[102] = { 0 };
404  int exp_index1[102] = { 0 };
405 
406  int tmp_categorize_array[128 * 2] = { 0 };
407  int tmp_categorize_array1_idx = p->numvector_size;
408  int tmp_categorize_array2_idx = p->numvector_size;
409 
410  bits_left = p->bits_per_subpacket - get_bits_count(&q->gb);
411 
412  if (bits_left > q->samples_per_channel)
413  bits_left = q->samples_per_channel +
414  ((bits_left - q->samples_per_channel) * 5) / 8;
415 
416  bias = -32;
417 
418  /* Estimate bias. */
419  for (i = 32; i > 0; i = i / 2) {
420  num_bits = 0;
421  index = 0;
422  for (j = p->total_subbands; j > 0; j--) {
423  exp_idx = av_clip((i - quant_index_table[index] + bias) / 2, 0, 7);
424  index++;
425  num_bits += expbits_tab[exp_idx];
426  }
427  if (num_bits >= bits_left - 32)
428  bias += i;
429  }
430 
431  /* Calculate total number of bits. */
432  num_bits = 0;
433  for (i = 0; i < p->total_subbands; i++) {
434  exp_idx = av_clip((bias - quant_index_table[i]) / 2, 0, 7);
435  num_bits += expbits_tab[exp_idx];
436  exp_index1[i] = exp_idx;
437  exp_index2[i] = exp_idx;
438  }
439  tmpbias1 = tmpbias2 = num_bits;
440 
441  for (j = 1; j < p->numvector_size; j++) {
442  if (tmpbias1 + tmpbias2 > 2 * bits_left) { /* ---> */
443  int max = -999999;
444  index = -1;
445  for (i = 0; i < p->total_subbands; i++) {
446  if (exp_index1[i] < 7) {
447  v = (-2 * exp_index1[i]) - quant_index_table[i] + bias;
448  if (v >= max) {
449  max = v;
450  index = i;
451  }
452  }
453  }
454  if (index == -1)
455  break;
456  tmp_categorize_array[tmp_categorize_array1_idx++] = index;
457  tmpbias1 -= expbits_tab[exp_index1[index]] -
458  expbits_tab[exp_index1[index] + 1];
459  ++exp_index1[index];
460  } else { /* <--- */
461  int min = 999999;
462  index = -1;
463  for (i = 0; i < p->total_subbands; i++) {
464  if (exp_index2[i] > 0) {
465  v = (-2 * exp_index2[i]) - quant_index_table[i] + bias;
466  if (v < min) {
467  min = v;
468  index = i;
469  }
470  }
471  }
472  if (index == -1)
473  break;
474  tmp_categorize_array[--tmp_categorize_array2_idx] = index;
475  tmpbias2 -= expbits_tab[exp_index2[index]] -
476  expbits_tab[exp_index2[index] - 1];
477  --exp_index2[index];
478  }
479  }
480 
481  for (i = 0; i < p->total_subbands; i++)
482  category[i] = exp_index2[i];
483 
484  for (i = 0; i < p->numvector_size - 1; i++)
485  category_index[i] = tmp_categorize_array[tmp_categorize_array2_idx++];
486 }
487 
488 
489 /**
490  * Expand the category vector.
491  *
492  * @param q pointer to the COOKContext
493  * @param category pointer to the category array
494  * @param category_index pointer to the category_index array
495  */
496 static inline void expand_category(COOKContext *q, int *category,
497  int *category_index)
498 {
499  int i;
500  for (i = 0; i < q->num_vectors; i++)
501  {
502  int idx = category_index[i];
503  if (++category[idx] >= FF_ARRAY_ELEMS(dither_tab))
504  --category[idx];
505  }
506 }
507 
508 /**
509  * The real requantization of the mltcoefs
510  *
511  * @param q pointer to the COOKContext
512  * @param index index
513  * @param quant_index quantisation index
514  * @param subband_coef_index array of indexes to quant_centroid_tab
515  * @param subband_coef_sign signs of coefficients
516  * @param mlt_p pointer into the mlt buffer
517  */
518 static void scalar_dequant_float(COOKContext *q, int index, int quant_index,
519  int *subband_coef_index, int *subband_coef_sign,
520  float *mlt_p)
521 {
522  int i;
523  float f1;
524 
525  for (i = 0; i < SUBBAND_SIZE; i++) {
526  if (subband_coef_index[i]) {
527  f1 = quant_centroid_tab[index][subband_coef_index[i]];
528  if (subband_coef_sign[i])
529  f1 = -f1;
530  } else {
531  /* noise coding if subband_coef_index[i] == 0 */
532  f1 = dither_tab[index];
533  if (av_lfg_get(&q->random_state) < 0x80000000)
534  f1 = -f1;
535  }
536  mlt_p[i] = f1 * rootpow2tab[quant_index + 63];
537  }
538 }
539 /**
540  * Unpack the subband_coef_index and subband_coef_sign vectors.
541  *
542  * @param q pointer to the COOKContext
543  * @param category pointer to the category array
544  * @param subband_coef_index array of indexes to quant_centroid_tab
545  * @param subband_coef_sign signs of coefficients
546  */
547 static int unpack_SQVH(COOKContext *q, COOKSubpacket *p, int category,
548  int *subband_coef_index, int *subband_coef_sign)
549 {
550  int i, j;
551  int vlc, vd, tmp, result;
552 
553  vd = vd_tab[category];
554  result = 0;
555  for (i = 0; i < vpr_tab[category]; i++) {
556  vlc = get_vlc2(&q->gb, q->sqvh[category].table, q->sqvh[category].bits, 3);
557  if (p->bits_per_subpacket < get_bits_count(&q->gb)) {
558  vlc = 0;
559  result = 1;
560  }
561  for (j = vd - 1; j >= 0; j--) {
562  tmp = (vlc * invradix_tab[category]) / 0x100000;
563  subband_coef_index[vd * i + j] = vlc - tmp * (kmax_tab[category] + 1);
564  vlc = tmp;
565  }
566  for (j = 0; j < vd; j++) {
567  if (subband_coef_index[i * vd + j]) {
568  if (get_bits_count(&q->gb) < p->bits_per_subpacket) {
569  subband_coef_sign[i * vd + j] = get_bits1(&q->gb);
570  } else {
571  result = 1;
572  subband_coef_sign[i * vd + j] = 0;
573  }
574  } else {
575  subband_coef_sign[i * vd + j] = 0;
576  }
577  }
578  }
579  return result;
580 }
581 
582 
583 /**
584  * Fill the mlt_buffer with mlt coefficients.
585  *
586  * @param q pointer to the COOKContext
587  * @param category pointer to the category array
588  * @param quant_index_table pointer to the array
589  * @param mlt_buffer pointer to mlt coefficients
590  */
591 static void decode_vectors(COOKContext *q, COOKSubpacket *p, int *category,
592  int *quant_index_table, float *mlt_buffer)
593 {
594  /* A zero in this table means that the subband coefficient is
595  random noise coded. */
596  int subband_coef_index[SUBBAND_SIZE];
597  /* A zero in this table means that the subband coefficient is a
598  positive multiplicator. */
599  int subband_coef_sign[SUBBAND_SIZE];
600  int band, j;
601  int index = 0;
602 
603  for (band = 0; band < p->total_subbands; band++) {
604  index = category[band];
605  if (category[band] < 7) {
606  if (unpack_SQVH(q, p, category[band], subband_coef_index, subband_coef_sign)) {
607  index = 7;
608  for (j = 0; j < p->total_subbands; j++)
609  category[band + j] = 7;
610  }
611  }
612  if (index >= 7) {
613  memset(subband_coef_index, 0, sizeof(subband_coef_index));
614  memset(subband_coef_sign, 0, sizeof(subband_coef_sign));
615  }
616  q->scalar_dequant(q, index, quant_index_table[band],
617  subband_coef_index, subband_coef_sign,
618  &mlt_buffer[band * SUBBAND_SIZE]);
619  }
620 
621  /* FIXME: should this be removed, or moved into loop above? */
623  return;
624 }
625 
626 
627 static int mono_decode(COOKContext *q, COOKSubpacket *p, float *mlt_buffer)
628 {
629  int category_index[128] = { 0 };
630  int category[128] = { 0 };
631  int quant_index_table[102];
632  int res, i;
633 
634  if ((res = decode_envelope(q, p, quant_index_table)) < 0)
635  return res;
637  categorize(q, p, quant_index_table, category, category_index);
638  expand_category(q, category, category_index);
639  for (i=0; i<p->total_subbands; i++) {
640  if (category[i] > 7)
641  return AVERROR_INVALIDDATA;
642  }
643  decode_vectors(q, p, category, quant_index_table, mlt_buffer);
644 
645  return 0;
646 }
647 
648 
649 /**
650  * the actual requantization of the timedomain samples
651  *
652  * @param q pointer to the COOKContext
653  * @param buffer pointer to the timedomain buffer
654  * @param gain_index index for the block multiplier
655  * @param gain_index_next index for the next block multiplier
656  */
657 static void interpolate_float(COOKContext *q, float *buffer,
658  int gain_index, int gain_index_next)
659 {
660  int i;
661  float fc1, fc2;
662  fc1 = pow2tab[gain_index + 63];
663 
664  if (gain_index == gain_index_next) { // static gain
665  for (i = 0; i < q->gain_size_factor; i++)
666  buffer[i] *= fc1;
667  } else { // smooth gain
668  fc2 = q->gain_table[11 + (gain_index_next - gain_index)];
669  for (i = 0; i < q->gain_size_factor; i++) {
670  buffer[i] *= fc1;
671  fc1 *= fc2;
672  }
673  }
674 }
675 
676 /**
677  * Apply transform window, overlap buffers.
678  *
679  * @param q pointer to the COOKContext
680  * @param inbuffer pointer to the mltcoefficients
681  * @param gains_ptr current and previous gains
682  * @param previous_buffer pointer to the previous buffer to be used for overlapping
683  */
684 static void imlt_window_float(COOKContext *q, float *inbuffer,
685  cook_gains *gains_ptr, float *previous_buffer)
686 {
687  const float fc = pow2tab[gains_ptr->previous[0] + 63];
688  int i;
689  /* The weird thing here, is that the two halves of the time domain
690  * buffer are swapped. Also, the newest data, that we save away for
691  * next frame, has the wrong sign. Hence the subtraction below.
692  * Almost sounds like a complex conjugate/reverse data/FFT effect.
693  */
694 
695  /* Apply window and overlap */
696  for (i = 0; i < q->samples_per_channel; i++)
697  inbuffer[i] = inbuffer[i] * fc * q->mlt_window[i] -
698  previous_buffer[i] * q->mlt_window[q->samples_per_channel - 1 - i];
699 }
700 
701 /**
702  * The modulated lapped transform, this takes transform coefficients
703  * and transforms them into timedomain samples.
704  * Apply transform window, overlap buffers, apply gain profile
705  * and buffer management.
706  *
707  * @param q pointer to the COOKContext
708  * @param inbuffer pointer to the mltcoefficients
709  * @param gains_ptr current and previous gains
710  * @param previous_buffer pointer to the previous buffer to be used for overlapping
711  */
712 static void imlt_gain(COOKContext *q, float *inbuffer,
713  cook_gains *gains_ptr, float *previous_buffer)
714 {
715  float *buffer0 = q->mono_mdct_output;
716  float *buffer1 = q->mono_mdct_output + q->samples_per_channel;
717  int i;
718 
719  /* Inverse modified discrete cosine transform */
720  q->mdct_ctx.imdct_calc(&q->mdct_ctx, q->mono_mdct_output, inbuffer);
721 
722  q->imlt_window(q, buffer1, gains_ptr, previous_buffer);
723 
724  /* Apply gain profile */
725  for (i = 0; i < 8; i++)
726  if (gains_ptr->now[i] || gains_ptr->now[i + 1])
727  q->interpolate(q, &buffer1[q->gain_size_factor * i],
728  gains_ptr->now[i], gains_ptr->now[i + 1]);
729 
730  /* Save away the current to be previous block. */
731  memcpy(previous_buffer, buffer0,
732  q->samples_per_channel * sizeof(*previous_buffer));
733 }
734 
735 
736 /**
737  * function for getting the jointstereo coupling information
738  *
739  * @param q pointer to the COOKContext
740  * @param decouple_tab decoupling array
741  */
742 static int decouple_info(COOKContext *q, COOKSubpacket *p, int *decouple_tab)
743 {
744  int i;
745  int vlc = get_bits1(&q->gb);
746  int start = cplband[p->js_subband_start];
747  int end = cplband[p->subbands - 1];
748  int length = end - start + 1;
749 
750  if (start > end)
751  return 0;
752 
753  if (vlc)
754  for (i = 0; i < length; i++)
755  decouple_tab[start + i] = get_vlc2(&q->gb,
757  p->channel_coupling.bits, 2);
758  else
759  for (i = 0; i < length; i++) {
760  int v = get_bits(&q->gb, p->js_vlc_bits);
761  if (v == (1<<p->js_vlc_bits)-1) {
762  av_log(q->avctx, AV_LOG_ERROR, "decouple value too large\n");
763  return AVERROR_INVALIDDATA;
764  }
765  decouple_tab[start + i] = v;
766  }
767  return 0;
768 }
769 
770 /**
771  * function decouples a pair of signals from a single signal via multiplication.
772  *
773  * @param q pointer to the COOKContext
774  * @param subband index of the current subband
775  * @param f1 multiplier for channel 1 extraction
776  * @param f2 multiplier for channel 2 extraction
777  * @param decode_buffer input buffer
778  * @param mlt_buffer1 pointer to left channel mlt coefficients
779  * @param mlt_buffer2 pointer to right channel mlt coefficients
780  */
782  COOKSubpacket *p,
783  int subband,
784  float f1, float f2,
785  float *decode_buffer,
786  float *mlt_buffer1, float *mlt_buffer2)
787 {
788  int j, tmp_idx;
789  for (j = 0; j < SUBBAND_SIZE; j++) {
790  tmp_idx = ((p->js_subband_start + subband) * SUBBAND_SIZE) + j;
791  mlt_buffer1[SUBBAND_SIZE * subband + j] = f1 * decode_buffer[tmp_idx];
792  mlt_buffer2[SUBBAND_SIZE * subband + j] = f2 * decode_buffer[tmp_idx];
793  }
794 }
795 
796 /**
797  * function for decoding joint stereo data
798  *
799  * @param q pointer to the COOKContext
800  * @param mlt_buffer1 pointer to left channel mlt coefficients
801  * @param mlt_buffer2 pointer to right channel mlt coefficients
802  */
804  float *mlt_buffer_left, float *mlt_buffer_right)
805 {
806  int i, j, res;
807  int decouple_tab[SUBBAND_SIZE] = { 0 };
808  float *decode_buffer = q->decode_buffer_0;
809  int idx, cpl_tmp;
810  float f1, f2;
811  const float *cplscale;
812 
813  memset(decode_buffer, 0, sizeof(q->decode_buffer_0));
814 
815  /* Make sure the buffers are zeroed out. */
816  memset(mlt_buffer_left, 0, 1024 * sizeof(*mlt_buffer_left));
817  memset(mlt_buffer_right, 0, 1024 * sizeof(*mlt_buffer_right));
818  if ((res = decouple_info(q, p, decouple_tab)) < 0)
819  return res;
820  if ((res = mono_decode(q, p, decode_buffer)) < 0)
821  return res;
822  /* The two channels are stored interleaved in decode_buffer. */
823  for (i = 0; i < p->js_subband_start; i++) {
824  for (j = 0; j < SUBBAND_SIZE; j++) {
825  mlt_buffer_left[i * 20 + j] = decode_buffer[i * 40 + j];
826  mlt_buffer_right[i * 20 + j] = decode_buffer[i * 40 + 20 + j];
827  }
828  }
829 
830  /* When we reach js_subband_start (the higher frequencies)
831  the coefficients are stored in a coupling scheme. */
832  idx = (1 << p->js_vlc_bits) - 1;
833  for (i = p->js_subband_start; i < p->subbands; i++) {
834  cpl_tmp = cplband[i];
835  idx -= decouple_tab[cpl_tmp];
836  cplscale = q->cplscales[p->js_vlc_bits - 2]; // choose decoupler table
837  f1 = cplscale[decouple_tab[cpl_tmp] + 1];
838  f2 = cplscale[idx];
839  q->decouple(q, p, i, f1, f2, decode_buffer,
840  mlt_buffer_left, mlt_buffer_right);
841  idx = (1 << p->js_vlc_bits) - 1;
842  }
843 
844  return 0;
845 }
846 
847 /**
848  * First part of subpacket decoding:
849  * decode raw stream bytes and read gain info.
850  *
851  * @param q pointer to the COOKContext
852  * @param inbuffer pointer to raw stream data
853  * @param gains_ptr array of current/prev gain pointers
854  */
856  const uint8_t *inbuffer,
857  cook_gains *gains_ptr)
858 {
859  int offset;
860 
861  offset = decode_bytes(inbuffer, q->decoded_bytes_buffer,
862  p->bits_per_subpacket / 8);
863  init_get_bits(&q->gb, q->decoded_bytes_buffer + offset,
864  p->bits_per_subpacket);
865  decode_gain_info(&q->gb, gains_ptr->now);
866 
867  /* Swap current and previous gains */
868  FFSWAP(int *, gains_ptr->now, gains_ptr->previous);
869 }
870 
871 /**
872  * Saturate the output signal and interleave.
873  *
874  * @param q pointer to the COOKContext
875  * @param out pointer to the output vector
876  */
877 static void saturate_output_float(COOKContext *q, float *out)
878 {
879  q->dsp.vector_clipf(out, q->mono_mdct_output + q->samples_per_channel,
880  -1.0f, 1.0f, FFALIGN(q->samples_per_channel, 8));
881 }
882 
883 
884 /**
885  * Final part of subpacket decoding:
886  * Apply modulated lapped transform, gain compensation,
887  * clip and convert to integer.
888  *
889  * @param q pointer to the COOKContext
890  * @param decode_buffer pointer to the mlt coefficients
891  * @param gains_ptr array of current/prev gain pointers
892  * @param previous_buffer pointer to the previous buffer to be used for overlapping
893  * @param out pointer to the output buffer
894  */
895 static inline void mlt_compensate_output(COOKContext *q, float *decode_buffer,
896  cook_gains *gains_ptr, float *previous_buffer,
897  float *out)
898 {
899  imlt_gain(q, decode_buffer, gains_ptr, previous_buffer);
900  if (out)
901  q->saturate_output(q, out);
902 }
903 
904 
905 /**
906  * Cook subpacket decoding. This function returns one decoded subpacket,
907  * usually 1024 samples per channel.
908  *
909  * @param q pointer to the COOKContext
910  * @param inbuffer pointer to the inbuffer
911  * @param outbuffer pointer to the outbuffer
912  */
914  const uint8_t *inbuffer, float **outbuffer)
915 {
916  int sub_packet_size = p->size;
917  int res;
918 
919  memset(q->decode_buffer_1, 0, sizeof(q->decode_buffer_1));
920  decode_bytes_and_gain(q, p, inbuffer, &p->gains1);
921 
922  if (p->joint_stereo) {
923  if ((res = joint_decode(q, p, q->decode_buffer_1, q->decode_buffer_2)) < 0)
924  return res;
925  } else {
926  if ((res = mono_decode(q, p, q->decode_buffer_1)) < 0)
927  return res;
928 
929  if (p->num_channels == 2) {
930  decode_bytes_and_gain(q, p, inbuffer + sub_packet_size / 2, &p->gains2);
931  if ((res = mono_decode(q, p, q->decode_buffer_2)) < 0)
932  return res;
933  }
934  }
935 
938  outbuffer ? outbuffer[p->ch_idx] : NULL);
939 
940  if (p->num_channels == 2) {
941  if (p->joint_stereo)
944  outbuffer ? outbuffer[p->ch_idx + 1] : NULL);
945  else
948  outbuffer ? outbuffer[p->ch_idx + 1] : NULL);
949  }
950 
951  return 0;
952 }
953 
954 
956  int *got_frame_ptr, AVPacket *avpkt)
957 {
958  AVFrame *frame = data;
959  const uint8_t *buf = avpkt->data;
960  int buf_size = avpkt->size;
961  COOKContext *q = avctx->priv_data;
962  float **samples = NULL;
963  int i, ret;
964  int offset = 0;
965  int chidx = 0;
966 
967  if (buf_size < avctx->block_align)
968  return buf_size;
969 
970  /* get output buffer */
971  if (q->discarded_packets >= 2) {
972  frame->nb_samples = q->samples_per_channel;
973  if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
974  return ret;
975  samples = (float **)frame->extended_data;
976  }
977 
978  /* estimate subpacket sizes */
979  q->subpacket[0].size = avctx->block_align;
980 
981  for (i = 1; i < q->num_subpackets; i++) {
982  q->subpacket[i].size = 2 * buf[avctx->block_align - q->num_subpackets + i];
983  q->subpacket[0].size -= q->subpacket[i].size + 1;
984  if (q->subpacket[0].size < 0) {
985  av_log(avctx, AV_LOG_DEBUG,
986  "frame subpacket size total > avctx->block_align!\n");
987  return AVERROR_INVALIDDATA;
988  }
989  }
990 
991  /* decode supbackets */
992  for (i = 0; i < q->num_subpackets; i++) {
993  q->subpacket[i].bits_per_subpacket = (q->subpacket[i].size * 8) >>
995  q->subpacket[i].ch_idx = chidx;
996  av_log(avctx, AV_LOG_DEBUG,
997  "subpacket[%i] size %i js %i %i block_align %i\n",
998  i, q->subpacket[i].size, q->subpacket[i].joint_stereo, offset,
999  avctx->block_align);
1000 
1001  if ((ret = decode_subpacket(q, &q->subpacket[i], buf + offset, samples)) < 0)
1002  return ret;
1003  offset += q->subpacket[i].size;
1004  chidx += q->subpacket[i].num_channels;
1005  av_log(avctx, AV_LOG_DEBUG, "subpacket[%i] %i %i\n",
1006  i, q->subpacket[i].size * 8, get_bits_count(&q->gb));
1007  }
1008 
1009  /* Discard the first two frames: no valid audio. */
1010  if (q->discarded_packets < 2) {
1011  q->discarded_packets++;
1012  *got_frame_ptr = 0;
1013  return avctx->block_align;
1014  }
1015 
1016  *got_frame_ptr = 1;
1017 
1018  return avctx->block_align;
1019 }
1020 
1021 #ifdef DEBUG
1022 static void dump_cook_context(COOKContext *q)
1023 {
1024  //int i=0;
1025 #define PRINT(a, b) av_dlog(q->avctx, " %s = %d\n", a, b);
1026  av_dlog(q->avctx, "COOKextradata\n");
1027  av_dlog(q->avctx, "cookversion=%x\n", q->subpacket[0].cookversion);
1028  if (q->subpacket[0].cookversion > STEREO) {
1029  PRINT("js_subband_start", q->subpacket[0].js_subband_start);
1030  PRINT("js_vlc_bits", q->subpacket[0].js_vlc_bits);
1031  }
1032  av_dlog(q->avctx, "COOKContext\n");
1033  PRINT("nb_channels", q->avctx->channels);
1034  PRINT("bit_rate", q->avctx->bit_rate);
1035  PRINT("sample_rate", q->avctx->sample_rate);
1036  PRINT("samples_per_channel", q->subpacket[0].samples_per_channel);
1037  PRINT("subbands", q->subpacket[0].subbands);
1038  PRINT("js_subband_start", q->subpacket[0].js_subband_start);
1039  PRINT("log2_numvector_size", q->subpacket[0].log2_numvector_size);
1040  PRINT("numvector_size", q->subpacket[0].numvector_size);
1041  PRINT("total_subbands", q->subpacket[0].total_subbands);
1042 }
1043 #endif
1044 
1045 /**
1046  * Cook initialization
1047  *
1048  * @param avctx pointer to the AVCodecContext
1049  */
1051 {
1052  COOKContext *q = avctx->priv_data;
1053  const uint8_t *edata_ptr = avctx->extradata;
1054  const uint8_t *edata_ptr_end = edata_ptr + avctx->extradata_size;
1055  int extradata_size = avctx->extradata_size;
1056  int s = 0;
1057  unsigned int channel_mask = 0;
1058  int samples_per_frame = 0;
1059  int ret;
1060  q->avctx = avctx;
1061 
1062  /* Take care of the codec specific extradata. */
1063  if (extradata_size <= 0) {
1064  av_log(avctx, AV_LOG_ERROR, "Necessary extradata missing!\n");
1065  return AVERROR_INVALIDDATA;
1066  }
1067  av_log(avctx, AV_LOG_DEBUG, "codecdata_length=%d\n", avctx->extradata_size);
1068 
1069  /* Take data from the AVCodecContext (RM container). */
1070  if (!avctx->channels) {
1071  av_log(avctx, AV_LOG_ERROR, "Invalid number of channels\n");
1072  return AVERROR_INVALIDDATA;
1073  }
1074 
1075  /* Initialize RNG. */
1076  av_lfg_init(&q->random_state, 0);
1077 
1078  ff_dsputil_init(&q->dsp, avctx);
1079 
1080  while (edata_ptr < edata_ptr_end) {
1081  /* 8 for mono, 16 for stereo, ? for multichannel
1082  Swap to right endianness so we don't need to care later on. */
1083  if (extradata_size >= 8) {
1084  q->subpacket[s].cookversion = bytestream_get_be32(&edata_ptr);
1085  samples_per_frame = bytestream_get_be16(&edata_ptr);
1086  q->subpacket[s].subbands = bytestream_get_be16(&edata_ptr);
1087  extradata_size -= 8;
1088  }
1089  if (extradata_size >= 8) {
1090  bytestream_get_be32(&edata_ptr); // Unknown unused
1091  q->subpacket[s].js_subband_start = bytestream_get_be16(&edata_ptr);
1092  if (q->subpacket[s].js_subband_start >= 51) {
1093  av_log(avctx, AV_LOG_ERROR, "js_subband_start %d is too large\n", q->subpacket[s].js_subband_start);
1094  return AVERROR_INVALIDDATA;
1095  }
1096 
1097  q->subpacket[s].js_vlc_bits = bytestream_get_be16(&edata_ptr);
1098  extradata_size -= 8;
1099  }
1100 
1101  /* Initialize extradata related variables. */
1102  q->subpacket[s].samples_per_channel = samples_per_frame / avctx->channels;
1103  q->subpacket[s].bits_per_subpacket = avctx->block_align * 8;
1104 
1105  /* Initialize default data states. */
1108  q->subpacket[s].num_channels = 1;
1109 
1110  /* Initialize version-dependent variables */
1111 
1112  av_log(avctx, AV_LOG_DEBUG, "subpacket[%i].cookversion=%x\n", s,
1113  q->subpacket[s].cookversion);
1114  q->subpacket[s].joint_stereo = 0;
1115  switch (q->subpacket[s].cookversion) {
1116  case MONO:
1117  if (avctx->channels != 1) {
1118  avpriv_request_sample(avctx, "Container channels != 1");
1119  return AVERROR_PATCHWELCOME;
1120  }
1121  av_log(avctx, AV_LOG_DEBUG, "MONO\n");
1122  break;
1123  case STEREO:
1124  if (avctx->channels != 1) {
1125  q->subpacket[s].bits_per_subpdiv = 1;
1126  q->subpacket[s].num_channels = 2;
1127  }
1128  av_log(avctx, AV_LOG_DEBUG, "STEREO\n");
1129  break;
1130  case JOINT_STEREO:
1131  if (avctx->channels != 2) {
1132  avpriv_request_sample(avctx, "Container channels != 2");
1133  return AVERROR_PATCHWELCOME;
1134  }
1135  av_log(avctx, AV_LOG_DEBUG, "JOINT_STEREO\n");
1136  if (avctx->extradata_size >= 16) {
1139  q->subpacket[s].joint_stereo = 1;
1140  q->subpacket[s].num_channels = 2;
1141  }
1142  if (q->subpacket[s].samples_per_channel > 256) {
1144  }
1145  if (q->subpacket[s].samples_per_channel > 512) {
1147  }
1148  break;
1149  case MC_COOK:
1150  av_log(avctx, AV_LOG_DEBUG, "MULTI_CHANNEL\n");
1151  if (extradata_size >= 4)
1152  channel_mask |= q->subpacket[s].channel_mask = bytestream_get_be32(&edata_ptr);
1153 
1157  q->subpacket[s].joint_stereo = 1;
1158  q->subpacket[s].num_channels = 2;
1159  q->subpacket[s].samples_per_channel = samples_per_frame >> 1;
1160 
1161  if (q->subpacket[s].samples_per_channel > 256) {
1163  }
1164  if (q->subpacket[s].samples_per_channel > 512) {
1166  }
1167  } else
1168  q->subpacket[s].samples_per_channel = samples_per_frame;
1169 
1170  break;
1171  default:
1172  avpriv_request_sample(avctx, "Cook version %d",
1173  q->subpacket[s].cookversion);
1174  return AVERROR_PATCHWELCOME;
1175  }
1176 
1177  if (s > 1 && q->subpacket[s].samples_per_channel != q->samples_per_channel) {
1178  av_log(avctx, AV_LOG_ERROR, "different number of samples per channel!\n");
1179  return AVERROR_INVALIDDATA;
1180  } else
1182 
1183 
1184  /* Initialize variable relations */
1186 
1187  /* Try to catch some obviously faulty streams, othervise it might be exploitable */
1188  if (q->subpacket[s].total_subbands > 53) {
1189  avpriv_request_sample(avctx, "total_subbands > 53");
1190  return AVERROR_PATCHWELCOME;
1191  }
1192 
1193  if ((q->subpacket[s].js_vlc_bits > 6) ||
1194  (q->subpacket[s].js_vlc_bits < 2 * q->subpacket[s].joint_stereo)) {
1195  av_log(avctx, AV_LOG_ERROR, "js_vlc_bits = %d, only >= %d and <= 6 allowed!\n",
1196  q->subpacket[s].js_vlc_bits, 2 * q->subpacket[s].joint_stereo);
1197  return AVERROR_INVALIDDATA;
1198  }
1199 
1200  if (q->subpacket[s].subbands > 50) {
1201  avpriv_request_sample(avctx, "subbands > 50");
1202  return AVERROR_PATCHWELCOME;
1203  }
1204  if (q->subpacket[s].subbands == 0) {
1205  avpriv_request_sample(avctx, "subbands = 0");
1206  return AVERROR_PATCHWELCOME;
1207  }
1208  q->subpacket[s].gains1.now = q->subpacket[s].gain_1;
1210  q->subpacket[s].gains2.now = q->subpacket[s].gain_3;
1212 
1213  if (q->num_subpackets + q->subpacket[s].num_channels > q->avctx->channels) {
1214  av_log(avctx, AV_LOG_ERROR, "Too many subpackets %d for channels %d\n", q->num_subpackets, q->avctx->channels);
1215  return AVERROR_INVALIDDATA;
1216  }
1217 
1218  q->num_subpackets++;
1219  s++;
1220  if (s > MAX_SUBPACKETS) {
1221  avpriv_request_sample(avctx, "subpackets > %d", MAX_SUBPACKETS);
1222  return AVERROR_PATCHWELCOME;
1223  }
1224  }
1225  /* Generate tables */
1226  init_pow2table();
1227  init_gain_table(q);
1229 
1230  if ((ret = init_cook_vlc_tables(q)))
1231  return ret;
1232 
1233 
1234  if (avctx->block_align >= UINT_MAX / 2)
1235  return AVERROR(EINVAL);
1236 
1237  /* Pad the databuffer with:
1238  DECODE_BYTES_PAD1 or DECODE_BYTES_PAD2 for decode_bytes(),
1239  FF_INPUT_BUFFER_PADDING_SIZE, for the bitstreamreader. */
1241  av_mallocz(avctx->block_align
1242  + DECODE_BYTES_PAD1(avctx->block_align)
1244  if (q->decoded_bytes_buffer == NULL)
1245  return AVERROR(ENOMEM);
1246 
1247  /* Initialize transform. */
1248  if ((ret = init_cook_mlt(q)))
1249  return ret;
1250 
1251  /* Initialize COOK signal arithmetic handling */
1252  if (1) {
1254  q->decouple = decouple_float;
1258  }
1259 
1260  /* Try to catch some obviously faulty streams, othervise it might be exploitable */
1261  if (q->samples_per_channel != 256 && q->samples_per_channel != 512 &&
1262  q->samples_per_channel != 1024) {
1263  avpriv_request_sample(avctx, "samples_per_channel = %d",
1264  q->samples_per_channel);
1265  return AVERROR_PATCHWELCOME;
1266  }
1267 
1268  avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
1269  if (channel_mask)
1270  avctx->channel_layout = channel_mask;
1271  else
1272  avctx->channel_layout = (avctx->channels == 2) ? AV_CH_LAYOUT_STEREO : AV_CH_LAYOUT_MONO;
1273 
1274 #ifdef DEBUG
1275  dump_cook_context(q);
1276 #endif
1277  return 0;
1278 }
1279 
1281  .name = "cook",
1282  .type = AVMEDIA_TYPE_AUDIO,
1283  .id = AV_CODEC_ID_COOK,
1284  .priv_data_size = sizeof(COOKContext),
1288  .capabilities = CODEC_CAP_DR1,
1289  .long_name = NULL_IF_CONFIG_SMALL("Cook / Cooker / Gecko (RealAudio G2)"),
1290  .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
1292 };
VLC envelope_quant_index[13]
Definition: cook.c:139
int joint_stereo
Definition: cook.c:83
static void mlt_compensate_output(COOKContext *q, float *decode_buffer, cook_gains *gains_ptr, float *previous_buffer, float *out)
Final part of subpacket decoding: Apply modulated lapped transform, gain compensation, clip and convert to integer.
Definition: cook.c:895
Definition: lfg.h:25
static av_cold void init_cplscales_table(COOKContext *q)
Definition: cook.c:240
float decode_buffer_2[1024]
Definition: cook.c:151
static const int cplband[51]
Definition: cookdata.h:504
Definition: start.py:1
DSPContext dsp
Definition: cook.c:125
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
av_cold void ff_dsputil_init(DSPContext *c, AVCodecContext *avctx)
Definition: dsputil.c:2675
float v
void(* imlt_window)(struct cook *q, float *buffer1, cook_gains *gains_ptr, float *previous_buffer)
Definition: cook.c:116
const char * s
Definition: avisynth_c.h:668
#define AVERROR_INVALIDDATA
Invalid data found when processing input.
Definition: error.h:59
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
void(* interpolate)(struct cook *q, float *buffer, int gain_index, int gain_index_next)
Definition: cook.c:119
int gain_size_factor
Definition: cook.c:143
VLC channel_coupling
Definition: cook.c:82
FFTContext mdct_ctx
Definition: cook.c:135
static const uint16_t envelope_quant_index_huffcodes[13][24]
Definition: cookdata.h:97
static unsigned int get_bits(GetBitContext *s, int n)
Read 1-25 bits.
Definition: get_bits.h:240
int * previous
Definition: cook.c:68
int gain_1[9]
Definition: cook.c:94
if max(w)>1 w=0.9 *w/max(w)
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
static const int kmax_tab[7]
Definition: cookdata.h:57
static const int expbits_tab[8]
Definition: cookdata.h:35
static void categorize(COOKContext *q, COOKSubpacket *p, const int *quant_index_table, int *category, int *category_index)
Calculate the category and category_index vector.
Definition: cook.c:399
int subbands
Definition: cook.c:76
static av_cold void init_pow2table(void)
Definition: cook.c:165
int num_subpackets
Definition: cook.c:155
#define FF_ARRAY_ELEMS(a)
av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (%s)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic?ac->func_descr_generic:ac->func_descr)
#define AV_CH_LAYOUT_STEREO
struct cook COOKContext
int block_align
number of bytes per packet if constant and known or 0 Used by some WAV based audio codecs...
int samples_per_channel
Definition: cook.c:79
#define FFALIGN(x, a)
Definition: common.h:63
static const uint8_t *const ccpl_huffbits[5]
Definition: cookdata.h:496
static const int vhsize_tab[7]
Definition: cookdata.h:73
static const float quant_centroid_tab[7][14]
Definition: cookdata.h:43
static void imlt_gain(COOKContext *q, float *inbuffer, cook_gains *gains_ptr, float *previous_buffer)
The modulated lapped transform, this takes transform coefficients and transforms them into timedomain...
Definition: cook.c:712
void(* scalar_dequant)(struct cook *q, int index, int quant_index, int *subband_coef_index, int *subband_coef_sign, float *mlt_p)
Definition: cook.c:105
float gain_table[23]
Definition: cook.c:144
AVCodec ff_cook_decoder
Definition: cook.c:1280
static av_cold void init_gain_table(COOKContext *q)
Definition: cook.c:175
void void avpriv_request_sample(void *avc, const char *msg,...) av_printf_format(2
Log a generic warning message about a missing feature.
int numvector_size
Definition: cook.c:87
enum AVSampleFormat sample_fmt
audio sample format
uint8_t
int total_subbands
Definition: cook.c:86
#define av_cold
Definition: attributes.h:78
int js_subband_start
Definition: cook.c:77
static int decouple_info(COOKContext *q, COOKSubpacket *p, int *decouple_tab)
function for getting the jointstereo coupling information
Definition: cook.c:742
float mono_previous_buffer1[1024]
Definition: cook.c:89
static void decode_vectors(COOKContext *q, COOKSubpacket *p, int *category, int *quant_index_table, float *mlt_buffer)
Fill the mlt_buffer with mlt coefficients.
Definition: cook.c:591
static void expand_category(COOKContext *q, int *category, int *category_index)
Expand the category vector.
Definition: cook.c:496
end end
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
int bits_per_subpdiv
Definition: cook.c:85
#define CODEC_CAP_DR1
Codec uses get_buffer() for allocating buffers and supports custom allocators.
cook_gains gains1
Definition: cook.c:92
uint8_t * data
static int get_bits_count(const GetBitContext *s)
Definition: get_bits.h:193
bitstream reader API header.
integer sqrt
Definition: avutil.txt:2
static int decode_subpacket(COOKContext *q, COOKSubpacket *p, const uint8_t *inbuffer, float **outbuffer)
Cook subpacket decoding.
Definition: cook.c:913
static int cook_decode_frame(AVCodecContext *avctx, void *data, int *got_frame_ptr, AVPacket *avpkt)
Definition: cook.c:955
float, planar
Definition: samplefmt.h:60
frame
Definition: stft.m:14
f2
Definition: genspecsines3.m:4
static void decode_bytes_and_gain(COOKContext *q, COOKSubpacket *p, const uint8_t *inbuffer, cook_gains *gains_ptr)
First part of subpacket decoding: decode raw stream bytes and read gain info.
Definition: cook.c:855
#define DECODE_BYTES_PAD1(bytes)
Definition: cook.c:249
void(* vector_clipf)(float *dst, const float *src, float min, float max, int len)
Definition: dsputil.h:215
static const int vd_tab[7]
Definition: cookdata.h:61
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:183
VLC sqvh[7]
Definition: cook.c:140
static const float dither_tab[9]
Definition: cookdata.h:39
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
Spectrum Plot time data
#define JOINT_STEREO
Definition: cook.c:60
int av_get_channel_layout_nb_channels(uint64_t channel_layout)
Return the number of channels in the channel layout.
#define AV_BE2NE32C(x)
Definition: bswap.h:103
static const uint16_t *const ccpl_huffcodes[5]
Definition: cookdata.h:491
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
float mono_previous_buffer2[1024]
Definition: cook.c:90
const char * name
Name of the codec implementation.
static int decode_envelope(COOKContext *q, COOKSubpacket *p, int *quant_index_table)
Create the quant index table needed for the envelope.
Definition: cook.c:358
void(* imdct_calc)(struct FFTContext *s, FFTSample *output, const FFTSample *input)
Definition: fft.h:81
#define ff_mdct_init
Definition: fft.h:147
static const uint8_t offset[127][2]
Definition: vf_spp.c:70
external API header
int gain_2[9]
Definition: cook.c:95
Definition: get_bits.h:63
uint64_t channel_layout
Audio channel layout.
static void saturate_output_float(COOKContext *q, float *out)
Saturate the output signal and interleave.
Definition: cook.c:877
static const int vhvlcsize_tab[7]
Definition: cookdata.h:77
#define FF_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
int gain_3[9]
Definition: cook.c:96
const float * cplscales[5]
Definition: cook.c:154
int log2_numvector_size
Definition: cook.c:80
static int unpack_SQVH(COOKContext *q, COOKSubpacket *p, int category, int *subband_coef_index, int *subband_coef_sign)
Unpack the subband_coef_index and subband_coef_sign vectors.
Definition: cook.c:547
Definition: fft.h:62
int bit_rate
the average bitrate
static av_cold int init_cook_mlt(COOKContext *q)
Definition: cook.c:216
audio channel layout utility functions
COOKSubpacket subpacket[MAX_SUBPACKETS]
Definition: cook.c:156
int gain_4[9]
Definition: cook.c:97
static int mono_decode(COOKContext *q, COOKSubpacket *p, float *mlt_buffer)
Definition: cook.c:627
ret
Definition: avfilter.c:821
void(* decouple)(struct cook *q, COOKSubpacket *p, int subband, float f1, float f2, float *decode_buffer, float *mlt_buffer1, float *mlt_buffer2)
Definition: cook.c:109
static av_cold int cook_decode_init(AVCodecContext *avctx)
Cook initialization.
Definition: cook.c:1050
cook_gains gains2
Definition: cook.c:93
static av_always_inline int get_vlc2(GetBitContext *s, VLC_TYPE(*table)[2], int bits, int max_depth)
Parse a vlc code.
Definition: get_bits.h:524
float decode_buffer_1[1024]
Definition: cook.c:150
static const uint16_t *const cvh_huffcodes[7]
Definition: cookdata.h:425
int bits
Definition: get_bits.h:64
AVLFG random_state
Definition: cook.c:131
void ff_sine_window_init(float *window, int n)
Generate a sine window.
#define AVERROR_PATCHWELCOME
Not yet implemented in FFmpeg, patches welcome.
Definition: error.h:62
NULL
Definition: eval.c:55
static void interpolate_float(COOKContext *q, float *buffer, int gain_index, int gain_index_next)
the actual requantization of the timedomain samples
Definition: cook.c:657
typedef void(RENAME(mix_any_func_type))
static av_cold int init_cook_vlc_tables(COOKContext *q)
Definition: cook.c:185
int sample_rate
samples per second
main external API structure.
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
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
#define init_vlc(vlc, nb_bits, nb_codes,bits, bits_wrap, bits_size,codes, codes_wrap, codes_size,flags)
Definition: get_bits.h:426
static unsigned int av_lfg_get(AVLFG *c)
Get the next random unsigned 32-bit number using an ALFG.
Definition: lfg.h:38
int num_vectors
Definition: cook.c:128
void * buf
Definition: avisynth_c.h:594
int * now
Definition: cook.c:67
static unsigned int get_bits1(GetBitContext *s)
Definition: get_bits.h:273
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
static int joint_decode(COOKContext *q, COOKSubpacket *p, float *mlt_buffer_left, float *mlt_buffer_right)
function for decoding joint stereo data
Definition: cook.c:803
#define SUBBAND_SIZE
Definition: cook.c:63
static av_cold int cook_decode_close(AVCodecContext *avctx)
Definition: cook.c:298
int index
Definition: gxfenc.c:89
#define MONO
Definition: cook.c:58
synthesis window for stochastic i
static float pow2tab[127]
Definition: cook.c:159
static int init_get_bits(GetBitContext *s, const uint8_t *buffer, int bit_size)
Initialize GetBitContext.
Definition: get_bits.h:379
av_cold void av_lfg_init(AVLFG *c, unsigned int seed)
Definition: lfg.c:30
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
AVCodecContext * avctx
Definition: cook.c:124
float * mlt_window
Definition: cook.c:136
void(* saturate_output)(struct cook *q, float *out)
Definition: cook.c:122
static float rootpow2tab[127]
Definition: cook.c:160
static const uint8_t envelope_quant_index_huffbits[13][24]
Definition: cookdata.h:81
static const uint8_t *const cvh_huffbits[7]
Definition: cookdata.h:430
int ch_idx
Definition: cook.c:72
int bits_per_subpacket
Definition: cook.c:84
#define PRINT(a, b)
static int decode_bytes(const uint8_t *inbuffer, uint8_t *out, int bytes)
Cook indata decoding, every 32 bits are XORed with 0x37c511f2.
Definition: cook.c:272
static void scalar_dequant_float(COOKContext *q, int index, int quant_index, int *subband_coef_index, int *subband_coef_sign, float *mlt_p)
The real requantization of the mltcoefs.
Definition: cook.c:518
int num_channels
Definition: cook.c:74
common internal api header.
#define STEREO
Definition: cook.c:59
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
Definition: log.h:162
#define ff_mdct_end
Definition: fft.h:148
static double c[64]
AVSampleFormat
Audio Sample Formats.
Definition: samplefmt.h:49
the buffer and buffer reference mechanism is intended to as much as expensive copies of that data while still allowing the filters to produce correct results The data is stored in buffers represented by AVFilterBuffer structures They must not be accessed but through references stored in AVFilterBufferRef structures Several references can point to the same buffer
DSP utils.
int discarded_packets
Definition: cook.c:132
#define MAX_SUBPACKETS
Definition: cook.c:64
static const int invradix_tab[7]
Definition: cookdata.h:53
DECLARE_ALIGNED(32, float, mono_mdct_output)[2048]
int channels
number of audio channels
#define av_log2
Definition: intmath.h:89
#define MC_COOK
Definition: cook.c:61
int js_vlc_bits
Definition: cook.c:78
VLC_TYPE(* table)[2]
code, bits
Definition: get_bits.h:65
int samples_per_channel
Definition: cook.c:129
static const struct twinvq_data tab
Filter the word “frame” indicates either a video frame or a group of audio samples
GetBitContext gb
Definition: cook.c:126
static void decode_gain_info(GetBitContext *gb, int *gaininfo)
Fill the gain array for the timedomain quantization.
Definition: cook.c:330
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=av_sample_fmt_is_planar(in_fmt);out_planar=av_sample_fmt_is_planar(out_fmt);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> out
static int decode(AVCodecContext *avctx, void *data, int *got_frame, AVPacket *avpkt)
Definition: crystalhd.c:868
#define FFSWAP(type, a, b)
Definition: common.h:61
const char int length
Definition: avisynth_c.h:668
static void imlt_window_float(COOKContext *q, float *inbuffer, cook_gains *gains_ptr, float *previous_buffer)
Apply transform window, overlap buffers.
Definition: cook.c:684
int cookversion
Definition: cook.c:75
static void decouple_float(COOKContext *q, COOKSubpacket *p, int subband, float f1, float f2, float *decode_buffer, float *mlt_buffer1, float *mlt_buffer2)
function decouples a pair of signals from a single signal via multiplication.
Definition: cook.c:781
static const int vpr_tab[7]
Definition: cookdata.h:65
uint8_t ** extended_data
pointers to the data planes/channels.
Definition: frame.h:117
#define AV_CH_LAYOUT_MONO
float min
This structure stores compressed data.
void ff_free_vlc(VLC *vlc)
Definition: bitstream.c:344
int size
Definition: cook.c:73
f1
Definition: genspecsines3.m:3
int nb_samples
number of audio samples (per channel) described by this frame
Definition: frame.h:127
unsigned int channel_mask
Definition: cook.c:81
float decode_buffer_0[1060]
Definition: cook.c:152
DSPContext.
Definition: dsputil.h:127
Cook AKA RealAudio G2 compatible decoderdata.
Definition: cook.c:100
uint8_t * decoded_bytes_buffer
Definition: cook.c:148