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
51
60
62
63 /* the different Cook versions */
64 #define MONO 0x1000001
65 #define STEREO 0x1000002
66 #define JOINT_STEREO 0x1000003
67 #define MC_COOK 0x2000000
68
69 #define SUBBAND_SIZE 20
70 #define MAX_SUBPACKETS 5
71
72 #define QUANT_VLC_BITS 9
73 #define COUPLING_VLC_BITS 6
74
79
97
100
108
110 /*
111 * The following 5 functions provide the lowlevel arithmetic on
112 * the internal audio buffers.
113 */
115 int *subband_coef_index, int *subband_coef_sign,
116 float *mlt_p);
117
120 int subband,
121 float f1, float f2,
122 float *decode_buffer,
123 float *mlt_buffer1, float *mlt_buffer2);
124
126 cook_gains *gains_ptr,
float *previous_buffer);
127
129 int gain_index, int gain_index_next);
130
132
136 /* stream data */
139 /* states */
142
143 /* transform data */
147
148 /* VLC data */
151
152 /* generate tables and related variables */
155
156 /* data buffers */
157
163
167 } COOKContext;
168
171
172 /*************** init functions ***************/
173
174 /* table generator */
176 {
177 /* fast way of computing 2^i and 2^(0.5*i) for -63 <= i < 64 */
179 static const float exp2_tab[2] = {1,
M_SQRT2};
180 float exp2_val =
powf(2, -63);
181 float root_val =
powf(2, -32);
182 for (
i = -63;
i < 64;
i++) {
184 root_val *= 2;
187 exp2_val *= 2;
188 }
189 }
190
191 /* table generator */
193 {
195 q->gain_size_factor = q->samples_per_channel / 8;
196 for (
i = 0;
i < 31;
i++)
198 (1.0 / (double) q->gain_size_factor));
199 }
200
202 const void *syms,
int symbol_size,
int offset,
203 void *logctx)
204 {
206 unsigned num = 0;
207
208 for (
int i = 0;
i < 16;
i++)
209 for (
unsigned count = num + counts[
i]; num < count; num++)
211
213 syms, symbol_size, symbol_size,
215 }
216
218 {
220
222 for (
i = 0;
i < 13;
i++) {
226 }
228 for (
i = 0;
i < 7;
i++) {
229 int sym_size = 1 + (
i == 3);
233 }
234
235 for (
i = 0;
i < q->num_subpackets;
i++) {
236 if (q->subpacket[
i].joint_stereo == 1) {
240 0, q->avctx);
242 }
243 }
244
247 }
248
250 {
252 int mlt_size = q->samples_per_channel;
253 const float scale = 1.0 / 32768.0;
254
255 if (!(q->mlt_window =
av_malloc_array(mlt_size,
sizeof(*q->mlt_window))))
257
258 /* Initialize the MLT window: simple sine window. */
260 for (j = 0; j < mlt_size; j++)
261 q->mlt_window[j] *= sqrt(2.0 / q->samples_per_channel);
262
263 /* Initialize the MDCT. */
268
269 return 0;
270 }
271
273 {
275 for (
i = 0;
i < 5;
i++)
277 }
278
279 /*************** init functions end ***********/
280
281 #define DECODE_BYTES_PAD1(bytes) (3 - ((bytes) + 3) % 4)
282 #define DECODE_BYTES_PAD2(bytes) ((bytes) % 4 + DECODE_BYTES_PAD1(2 * (bytes)))
283
284 /**
285 * Cook indata decoding, every 32 bits are XORed with 0x37c511f2.
286 * Why? No idea, some checksum/error detection method maybe.
287 *
288 * Out buffer size: extra bytes are needed to cope with
289 * padding/misalignment.
290 * Subpackets passed to the decoder can contain two, consecutive
291 * half-subpackets, of identical but arbitrary size.
292 * 1234 1234 1234 1234 extraA extraB
293 * Case 1: AAAA BBBB 0 0
294 * Case 2: AAAA ABBB BB-- 3 3
295 * Case 3: AAAA AABB BBBB 2 2
296 * Case 4: AAAA AAAB BBBB BB-- 1 5
297 *
298 * Nice way to waste CPU cycles.
299 *
300 * @param inbuffer pointer to byte array of indata
301 * @param out pointer to byte array of outdata
302 * @param bytes number of bytes
303 */
305 {
306 static const uint32_t
tab[4] = {
309 };
312 const uint32_t *buf;
313 uint32_t *obuf = (uint32_t *)
out;
314 /* FIXME: 64 bit platforms would be able to do 64 bits at a time.
315 * I'm too lazy though, should be something like
316 * for (i = 0; i < bitamount / 64; i++)
317 * (int64_t) out[i] = 0x37c511f237c511f2 ^ av_be2ne64(int64_t) in[i]);
318 * Buffer alignment needs to be checked. */
319
320 off = (intptr_t) inbuffer & 3;
321 buf = (const uint32_t *) (inbuffer - off);
323 bytes += 3 + off;
324 for (
i = 0;
i < bytes / 4;
i++)
325 obuf[
i] =
c ^ buf[
i];
326
327 return off;
328 }
329
331 {
335
336 /* Free allocated memory buffers. */
339
340 /* Free the transform. */
342
343 /* Free the VLC tables. */
344 for (
i = 0;
i < 13;
i++)
346 for (
i = 0;
i < 7;
i++)
348 for (
i = 0;
i < q->num_subpackets;
i++)
350
352
353 return 0;
354 }
355
356 /**
357 * Fill the gain array for the timedomain quantization.
358 *
359 * @param gb pointer to the GetBitContext
360 * @param gaininfo array[9] of gain indexes
361 */
363 {
365
367
369 while (n--) {
372
374 gaininfo[
i++] = gain;
375 }
378 }
379
380 /**
381 * Create the quant index table needed for the envelope.
382 *
383 * @param q pointer to the COOKContext
384 * @param quant_index_table pointer to the array
385 */
387 int *quant_index_table)
388 {
390
391 quant_index_table[0] =
get_bits(&q->gb, 6) - 6;
// This is used later in categorize
392
393 for (
i = 1;
i <
p->total_subbands;
i++) {
395 if (
i >=
p->js_subband_start * 2) {
396 vlc_index -=
p->js_subband_start;
397 } else {
398 vlc_index /= 2;
399 if (vlc_index < 1)
400 vlc_index = 1;
401 }
402 if (vlc_index > 13)
403 vlc_index = 13; // the VLC tables >13 are identical to No. 13
404
405 j =
get_vlc2(&q->gb, q->envelope_quant_index[vlc_index - 1].table,
407 quant_index_table[
i] = quant_index_table[
i - 1] + j;
// differential encoding
408 if (quant_index_table[
i] > 63 || quant_index_table[
i] < -63) {
410 "Invalid quantizer %d at position %d, outside [-63, 63] range\n",
411 quant_index_table[
i],
i);
413 }
414 }
415
416 return 0;
417 }
418
419 /**
420 * Calculate the category and category_index vector.
421 *
422 * @param q pointer to the COOKContext
423 * @param quant_index_table pointer to the array
424 * @param category pointer to the category array
425 * @param category_index pointer to the category_index array
426 */
429 {
431 int exp_index2[102] = { 0 };
432 int exp_index1[102] = { 0 };
433
434 int tmp_categorize_array[128 * 2] = { 0 };
435 int tmp_categorize_array1_idx =
p->numvector_size;
436 int tmp_categorize_array2_idx =
p->numvector_size;
437
439
442 ((
bits_left - q->samples_per_channel) * 5) / 8;
443
445
446 /* Estimate bias. */
447 for (
i = 32;
i > 0;
i =
i / 2) {
448 num_bits = 0;
450 for (j =
p->total_subbands; j > 0; j--) {
454 }
457 }
458
459 /* Calculate total number of bits. */
460 num_bits = 0;
461 for (
i = 0;
i <
p->total_subbands;
i++) {
464 exp_index1[
i] = exp_idx;
465 exp_index2[
i] = exp_idx;
466 }
467 tmpbias1 = tmpbias2 = num_bits;
468
469 for (j = 1; j <
p->numvector_size; j++) {
470 if (tmpbias1 + tmpbias2 > 2 *
bits_left) {
/* ---> */
473 for (
i = 0;
i <
p->total_subbands;
i++) {
474 if (exp_index1[
i] < 7) {
475 v = (-2 * exp_index1[
i]) - quant_index_table[
i] +
bias;
479 }
480 }
481 }
483 break;
484 tmp_categorize_array[tmp_categorize_array1_idx++] =
index;
488 } else { /* <--- */
491 for (
i = 0;
i <
p->total_subbands;
i++) {
492 if (exp_index2[
i] > 0) {
493 v = (-2 * exp_index2[
i]) - quant_index_table[
i] +
bias;
497 }
498 }
499 }
501 break;
502 tmp_categorize_array[--tmp_categorize_array2_idx] =
index;
506 }
507 }
508
509 for (
i = 0;
i <
p->total_subbands;
i++)
511
512 for (
i = 0;
i <
p->numvector_size - 1;
i++)
513 category_index[
i] = tmp_categorize_array[tmp_categorize_array2_idx++];
514 }
515
516
517 /**
518 * Expand the category vector.
519 *
520 * @param q pointer to the COOKContext
521 * @param category pointer to the category array
522 * @param category_index pointer to the category_index array
523 */
525 int *category_index)
526 {
528 for (
i = 0;
i < q->num_vectors;
i++)
529 {
530 int idx = category_index[
i];
533 }
534 }
535
536 /**
537 * The real requantization of the mltcoefs
538 *
539 * @param q pointer to the COOKContext
540 * @param index index
541 * @param quant_index quantisation index
542 * @param subband_coef_index array of indexes to quant_centroid_tab
543 * @param subband_coef_sign signs of coefficients
544 * @param mlt_p pointer into the mlt buffer
545 */
547 int *subband_coef_index, int *subband_coef_sign,
548 float *mlt_p)
549 {
551 float f1;
552
554 if (subband_coef_index[
i]) {
556 if (subband_coef_sign[
i])
557 f1 = -f1;
558 } else {
559 /* noise coding if subband_coef_index[i] == 0 */
561 if (
av_lfg_get(&q->random_state) < 0x80000000)
562 f1 = -f1;
563 }
565 }
566 }
567 /**
568 * Unpack the subband_coef_index and subband_coef_sign vectors.
569 *
570 * @param q pointer to the COOKContext
571 * @param category pointer to the category array
572 * @param subband_coef_index array of indexes to quant_centroid_tab
573 * @param subband_coef_sign signs of coefficients
574 */
576 int *subband_coef_index, int *subband_coef_sign)
577 {
580
586 vlc = 0;
588 }
589 for (j = vd - 1; j >= 0; j--) {
593 }
594 for (j = 0; j < vd; j++) {
595 if (subband_coef_index[
i * vd + j]) {
597 subband_coef_sign[
i * vd + j] =
get_bits1(&q->gb);
598 } else {
600 subband_coef_sign[
i * vd + j] = 0;
601 }
602 } else {
603 subband_coef_sign[
i * vd + j] = 0;
604 }
605 }
606 }
608 }
609
610
611 /**
612 * Fill the mlt_buffer with mlt coefficients.
613 *
614 * @param q pointer to the COOKContext
615 * @param category pointer to the category array
616 * @param quant_index_table pointer to the array
617 * @param mlt_buffer pointer to mlt coefficients
618 */
620 int *quant_index_table, float *mlt_buffer)
621 {
622 /* A zero in this table means that the subband coefficient is
623 random noise coded. */
625 /* A zero in this table means that the subband coefficient is a
626 positive multiplicator. */
628 int band, j;
630
631 for (band = 0; band <
p->total_subbands; band++) {
636 for (j = 0; j <
p->total_subbands; j++)
638 }
639 }
641 memset(subband_coef_index, 0, sizeof(subband_coef_index));
642 memset(subband_coef_sign, 0, sizeof(subband_coef_sign));
643 }
644 q->scalar_dequant(q,
index, quant_index_table[band],
645 subband_coef_index, subband_coef_sign,
647 }
648
649 /* FIXME: should this be removed, or moved into loop above? */
650 if (
p->total_subbands *
SUBBAND_SIZE >= q->samples_per_channel)
651 return;
652 }
653
654
656 {
657 int category_index[128] = { 0 };
659 int quant_index_table[102];
661
663 return res;
664 q->num_vectors =
get_bits(&q->gb,
p->log2_numvector_size);
667 for (
i=0;
i<
p->total_subbands;
i++) {
670 }
672
673 return 0;
674 }
675
676
677 /**
678 * the actual requantization of the timedomain samples
679 *
680 * @param q pointer to the COOKContext
681 * @param buffer pointer to the timedomain buffer
682 * @param gain_index index for the block multiplier
683 * @param gain_index_next index for the next block multiplier
684 */
686 int gain_index, int gain_index_next)
687 {
689 float fc1, fc2;
690 fc1 =
pow2tab[gain_index + 63];
691
692 if (gain_index == gain_index_next) { // static gain
693 for (
i = 0;
i < q->gain_size_factor;
i++)
695 } else { // smooth gain
696 fc2 = q->gain_table[15 + (gain_index_next - gain_index)];
697 for (
i = 0;
i < q->gain_size_factor;
i++) {
699 fc1 *= fc2;
700 }
701 }
702 }
703
704 /**
705 * Apply transform window, overlap buffers.
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 */
713 cook_gains *gains_ptr,
float *previous_buffer)
714 {
717 /* The weird thing here, is that the two halves of the time domain
718 * buffer are swapped. Also, the newest data, that we save away for
719 * next frame, has the wrong sign. Hence the subtraction below.
720 * Almost sounds like a complex conjugate/reverse data/FFT effect.
721 */
722
723 /* Apply window and overlap */
724 for (
i = 0;
i < q->samples_per_channel;
i++)
725 inbuffer[
i] = inbuffer[
i] *
fc * q->mlt_window[
i] -
726 previous_buffer[
i] * q->mlt_window[q->samples_per_channel - 1 -
i];
727 }
728
729 /**
730 * The modulated lapped transform, this takes transform coefficients
731 * and transforms them into timedomain samples.
732 * Apply transform window, overlap buffers, apply gain profile
733 * and buffer management.
734 *
735 * @param q pointer to the COOKContext
736 * @param inbuffer pointer to the mltcoefficients
737 * @param gains_ptr current and previous gains
738 * @param previous_buffer pointer to the previous buffer to be used for overlapping
739 */
741 cook_gains *gains_ptr,
float *previous_buffer)
742 {
743 float *buffer0 = q->mono_mdct_output;
744 float *buffer1 = q->mono_mdct_output + q->samples_per_channel;
746
747 /* Inverse modified discrete cosine transform */
748 q->mdct_fn(q->mdct_ctx, q->mono_mdct_output, inbuffer, sizeof(float));
749
750 q->imlt_window(q, buffer1, gains_ptr, previous_buffer);
751
752 /* Apply gain profile */
753 for (
i = 0;
i < 8;
i++)
754 if (gains_ptr->
now[
i] || gains_ptr->
now[
i + 1])
755 q->interpolate(q, &buffer1[q->gain_size_factor *
i],
756 gains_ptr->
now[
i], gains_ptr->
now[
i + 1]);
757
758 /* Save away the current to be previous block. */
759 memcpy(previous_buffer, buffer0,
760 q->samples_per_channel * sizeof(*previous_buffer));
761 }
762
763
764 /**
765 * function for getting the jointstereo coupling information
766 *
767 * @param q pointer to the COOKContext
768 * @param decouple_tab decoupling array
769 */
771 {
774 int start =
cplband[
p->js_subband_start];
776 int length = end - start + 1;
777
778 if (start > end)
779 return 0;
780
781 if (vlc)
782 for (
i = 0;
i < length;
i++)
783 decouple_tab[start +
i] =
get_vlc2(&q->gb,
784 p->channel_coupling.table,
786 else
787 for (
i = 0;
i < length;
i++) {
788 int v =
get_bits(&q->gb,
p->js_vlc_bits);
789 if (v == (1<<
p->js_vlc_bits)-1) {
792 }
793 decouple_tab[start +
i] = v;
794 }
795 return 0;
796 }
797
798 /**
799 * function decouples a pair of signals from a single signal via multiplication.
800 *
801 * @param q pointer to the COOKContext
802 * @param subband index of the current subband
803 * @param f1 multiplier for channel 1 extraction
804 * @param f2 multiplier for channel 2 extraction
805 * @param decode_buffer input buffer
806 * @param mlt_buffer1 pointer to left channel mlt coefficients
807 * @param mlt_buffer2 pointer to right channel mlt coefficients
808 */
811 int subband,
812 float f1, float f2,
813 float *decode_buffer,
814 float *mlt_buffer1, float *mlt_buffer2)
815 {
816 int j, tmp_idx;
818 tmp_idx = ((
p->js_subband_start + subband) *
SUBBAND_SIZE) + j;
819 mlt_buffer1[
SUBBAND_SIZE * subband + j] = f1 * decode_buffer[tmp_idx];
820 mlt_buffer2[
SUBBAND_SIZE * subband + j] = f2 * decode_buffer[tmp_idx];
821 }
822 }
823
824 /**
825 * function for decoding joint stereo data
826 *
827 * @param q pointer to the COOKContext
828 * @param mlt_buffer1 pointer to left channel mlt coefficients
829 * @param mlt_buffer2 pointer to right channel mlt coefficients
830 */
832 float *mlt_buffer_left, float *mlt_buffer_right)
833 {
836 float *decode_buffer = q->decode_buffer_0;
837 int idx, cpl_tmp;
838 float f1, f2;
839 const float *cplscale;
840
841 memset(decode_buffer, 0, sizeof(q->decode_buffer_0));
842
843 /* Make sure the buffers are zeroed out. */
844 memset(mlt_buffer_left, 0, 1024 * sizeof(*mlt_buffer_left));
845 memset(mlt_buffer_right, 0, 1024 * sizeof(*mlt_buffer_right));
847 return res;
849 return res;
850 /* The two channels are stored interleaved in decode_buffer. */
851 for (
i = 0;
i <
p->js_subband_start;
i++) {
853 mlt_buffer_left[
i * 20 + j] = decode_buffer[
i * 40 + j];
854 mlt_buffer_right[
i * 20 + j] = decode_buffer[
i * 40 + 20 + j];
855 }
856 }
857
858 /* When we reach js_subband_start (the higher frequencies)
859 the coefficients are stored in a coupling scheme. */
860 idx = (1 <<
p->js_vlc_bits) - 1;
861 for (
i =
p->js_subband_start; i < p->
subbands;
i++) {
863 idx -= decouple_tab[cpl_tmp];
864 cplscale = q->cplscales[
p->js_vlc_bits - 2];
// choose decoupler table
865 f1 = cplscale[decouple_tab[cpl_tmp] + 1];
866 f2 = cplscale[idx];
867 q->decouple(q,
p,
i, f1, f2, decode_buffer,
868 mlt_buffer_left, mlt_buffer_right);
869 idx = (1 <<
p->js_vlc_bits) - 1;
870 }
871
872 return 0;
873 }
874
875 /**
876 * First part of subpacket decoding:
877 * decode raw stream bytes and read gain info.
878 *
879 * @param q pointer to the COOKContext
880 * @param inbuffer pointer to raw stream data
881 * @param gains_ptr array of current/prev gain pointers
882 */
884 const uint8_t *inbuffer,
886 {
888
890 p->bits_per_subpacket / 8);
892 p->bits_per_subpacket);
894
895 /* Swap current and previous gains */
897 }
898
899 /**
900 * Saturate the output signal and interleave.
901 *
902 * @param q pointer to the COOKContext
903 * @param out pointer to the output vector
904 */
906 {
907 q->adsp.vector_clipf(
out, q->mono_mdct_output + q->samples_per_channel,
908 FFALIGN(q->samples_per_channel, 8), -1.0f, 1.0f);
909 }
910
911
912 /**
913 * Final part of subpacket decoding:
914 * Apply modulated lapped transform, gain compensation,
915 * clip and convert to integer.
916 *
917 * @param q pointer to the COOKContext
918 * @param decode_buffer pointer to the mlt coefficients
919 * @param gains_ptr array of current/prev gain pointers
920 * @param previous_buffer pointer to the previous buffer to be used for overlapping
921 * @param out pointer to the output buffer
922 */
924 cook_gains *gains_ptr,
float *previous_buffer,
926 {
927 imlt_gain(q, decode_buffer, gains_ptr, previous_buffer);
929 q->saturate_output(q,
out);
930 }
931
932
933 /**
934 * Cook subpacket decoding. This function returns one decoded subpacket,
935 * usually 1024 samples per channel.
936 *
937 * @param q pointer to the COOKContext
938 * @param inbuffer pointer to the inbuffer
939 * @param outbuffer pointer to the outbuffer
940 */
942 const uint8_t *inbuffer, float **outbuffer)
943 {
944 int sub_packet_size =
p->size;
945 int res;
946
947 memset(q->decode_buffer_1, 0, sizeof(q->decode_buffer_1));
949
950 if (
p->joint_stereo) {
951 if ((res =
joint_decode(q,
p, q->decode_buffer_1, q->decode_buffer_2)) < 0)
952 return res;
953 } else {
955 return res;
956
957 if (
p->num_channels == 2) {
960 return res;
961 }
962 }
963
965 p->mono_previous_buffer1,
966 outbuffer ? outbuffer[
p->ch_idx] :
NULL);
967
968 if (
p->num_channels == 2) {
971 p->mono_previous_buffer2,
972 outbuffer ? outbuffer[
p->ch_idx + 1] :
NULL);
973 else
975 p->mono_previous_buffer2,
976 outbuffer ? outbuffer[
p->ch_idx + 1] :
NULL);
977 }
978
979 return 0;
980 }
981
982
984 int *got_frame_ptr,
AVPacket *avpkt)
985 {
986 const uint8_t *buf = avpkt->
data;
987 int buf_size = avpkt->
size;
992 int chidx = 0;
993
994 if (buf_size < avctx->block_align)
995 return buf_size;
996
997 /* get output buffer */
998 if (q->discarded_packets >= 2) {
999 frame->nb_samples = q->samples_per_channel;
1003 }
1004
1005 /* estimate subpacket sizes */
1007
1008 for (
i = 1;
i < q->num_subpackets;
i++) {
1010 q->subpacket[0].size -= q->subpacket[
i].size + 1;
1011 if (q->subpacket[0].size < 0) {
1013 "frame subpacket size total > avctx->block_align!\n");
1015 }
1016 }
1017
1018 /* decode supbackets */
1019 for (
i = 0;
i < q->num_subpackets;
i++) {
1020 q->subpacket[
i].bits_per_subpacket = (q->subpacket[
i].size * 8) >>
1021 q->subpacket[
i].bits_per_subpdiv;
1022 q->subpacket[
i].ch_idx = chidx;
1024 "subpacket[%i] size %i js %i %i block_align %i\n",
1025 i, q->subpacket[
i].size, q->subpacket[
i].joint_stereo,
offset,
1027
1030 offset += q->subpacket[
i].size;
1031 chidx += q->subpacket[
i].num_channels;
1034 }
1035
1036 /* Discard the first two frames: no valid audio. */
1037 if (q->discarded_packets < 2) {
1038 q->discarded_packets++;
1039 *got_frame_ptr = 0;
1041 }
1042
1043 *got_frame_ptr = 1;
1044
1046 }
1047
1049 {
1050 //int i=0;
1051 #define PRINT(a, b) ff_dlog(q->avctx, " %s = %d\n", a, b);
1052 ff_dlog(q->avctx,
"COOKextradata\n");
1053 ff_dlog(q->avctx,
"cookversion=%x\n", q->subpacket[0].cookversion);
1054 if (q->subpacket[0].cookversion >
STEREO) {
1055 PRINT(
"js_subband_start", q->subpacket[0].js_subband_start);
1056 PRINT(
"js_vlc_bits", q->subpacket[0].js_vlc_bits);
1057 }
1058 ff_dlog(q->avctx,
"COOKContext\n");
1059 PRINT(
"nb_channels", q->avctx->ch_layout.nb_channels);
1060 PRINT(
"bit_rate", (
int)q->avctx->bit_rate);
1061 PRINT(
"sample_rate", q->avctx->sample_rate);
1062 PRINT(
"samples_per_channel", q->subpacket[0].samples_per_channel);
1063 PRINT(
"subbands", q->subpacket[0].subbands);
1064 PRINT(
"js_subband_start", q->subpacket[0].js_subband_start);
1065 PRINT(
"log2_numvector_size", q->subpacket[0].log2_numvector_size);
1066 PRINT(
"numvector_size", q->subpacket[0].numvector_size);
1067 PRINT(
"total_subbands", q->subpacket[0].total_subbands);
1068 }
1069
1070 /**
1071 * Cook initialization
1072 *
1073 * @param avctx pointer to the AVCodecContext
1074 */
1076 {
1081 unsigned int channel_mask = 0;
1082 int samples_per_frame = 0;
1085
1087
1088 /* Take care of the codec specific extradata. */
1092 }
1094
1096
1097 /* Take data from the AVCodecContext (RM container). */
1101 }
1102
1105
1106 /* Initialize RNG. */
1108
1110
1115 }
1116 /* 8 for mono, 16 for stereo, ? for multichannel
1117 Swap to right endianness so we don't need to care later on. */
1118 q->subpacket[
s].cookversion = bytestream2_get_be32(&
gb);
1119 samples_per_frame = bytestream2_get_be16(&
gb);
1120 q->subpacket[
s].subbands = bytestream2_get_be16(&
gb);
1121 bytestream2_get_be32(&
gb);
// Unknown unused
1122 q->subpacket[
s].js_subband_start = bytestream2_get_be16(&
gb);
1123 if (q->subpacket[
s].js_subband_start >= 51) {
1126 }
1127 q->subpacket[
s].js_vlc_bits = bytestream2_get_be16(&
gb);
1128
1129 /* Initialize extradata related variables. */
1130 q->subpacket[
s].samples_per_channel = samples_per_frame /
channels;
1132
1133 /* Initialize default data states. */
1134 q->subpacket[
s].log2_numvector_size = 5;
1135 q->subpacket[
s].total_subbands = q->subpacket[
s].subbands;
1136 q->subpacket[
s].num_channels = 1;
1137
1138 /* Initialize version-dependent variables */
1139
1141 q->subpacket[
s].cookversion);
1142 q->subpacket[
s].joint_stereo = 0;
1143 switch (q->subpacket[
s].cookversion) {
1148 }
1150 break;
1153 q->subpacket[
s].bits_per_subpdiv = 1;
1154 q->subpacket[
s].num_channels = 2;
1155 }
1157 break;
1162 }
1165 q->subpacket[
s].total_subbands = q->subpacket[
s].subbands +
1166 q->subpacket[
s].js_subband_start;
1167 q->subpacket[
s].joint_stereo = 1;
1168 q->subpacket[
s].num_channels = 2;
1169 }
1170 if (q->subpacket[
s].samples_per_channel > 256) {
1171 q->subpacket[
s].log2_numvector_size = 6;
1172 }
1173 if (q->subpacket[
s].samples_per_channel > 512) {
1174 q->subpacket[
s].log2_numvector_size = 7;
1175 }
1176 break;
1179 channel_mask |= q->subpacket[
s].channel_mask = bytestream2_get_be32(&
gb);
1180
1182 q->subpacket[
s].total_subbands = q->subpacket[
s].subbands +
1183 q->subpacket[
s].js_subband_start;
1184 q->subpacket[
s].joint_stereo = 1;
1185 q->subpacket[
s].num_channels = 2;
1186 q->subpacket[
s].samples_per_channel = samples_per_frame >> 1;
1187
1188 if (q->subpacket[
s].samples_per_channel > 256) {
1189 q->subpacket[
s].log2_numvector_size = 6;
1190 }
1191 if (q->subpacket[
s].samples_per_channel > 512) {
1192 q->subpacket[
s].log2_numvector_size = 7;
1193 }
1194 } else
1195 q->subpacket[
s].samples_per_channel = samples_per_frame;
1196
1197 break;
1198 default:
1200 q->subpacket[
s].cookversion);
1202 }
1203
1204 if (
s > 1 && q->subpacket[
s].samples_per_channel != q->samples_per_channel) {
1207 } else
1208 q->samples_per_channel = q->subpacket[0].samples_per_channel;
1209
1210
1211 /* Initialize variable relations */
1212 q->subpacket[
s].numvector_size = (1 << q->subpacket[
s].log2_numvector_size);
1213
1214 /* Try to catch some obviously faulty streams, otherwise it might be exploitable */
1215 if (q->subpacket[
s].total_subbands > 53) {
1218 }
1219
1220 if ((q->subpacket[
s].js_vlc_bits > 6) ||
1221 (q->subpacket[
s].js_vlc_bits < 2 * q->subpacket[
s].joint_stereo)) {
1223 q->subpacket[
s].js_vlc_bits, 2 * q->subpacket[
s].joint_stereo);
1225 }
1226
1227 if (q->subpacket[
s].subbands > 50) {
1230 }
1231 if (q->subpacket[
s].subbands == 0) {
1234 }
1235 q->subpacket[
s].gains1.now = q->subpacket[
s].gain_1;
1236 q->subpacket[
s].gains1.previous = q->subpacket[
s].gain_2;
1237 q->subpacket[
s].gains2.now = q->subpacket[
s].gain_3;
1238 q->subpacket[
s].gains2.previous = q->subpacket[
s].gain_4;
1239
1240 if (q->num_subpackets + q->subpacket[
s].num_channels >
channels) {
1243 }
1244
1245 q->num_subpackets++;
1247 }
1248
1249 /* Try to catch some obviously faulty streams, otherwise it might be exploitable */
1250 if (q->samples_per_channel != 256 && q->samples_per_channel != 512 &&
1251 q->samples_per_channel != 1024) {
1253 q->samples_per_channel);
1255 }
1256
1257 /* Generate tables */
1261
1264
1265 /* Pad the databuffer with:
1266 DECODE_BYTES_PAD1 or DECODE_BYTES_PAD2 for decode_bytes(),
1267 AV_INPUT_BUFFER_PADDING_SIZE, for the bitstreamreader. */
1268 q->decoded_bytes_buffer =
1272 if (!q->decoded_bytes_buffer)
1274
1275 /* Initialize transform. */
1278
1279 /* Initialize COOK signal arithmetic handling */
1280 if (1) {
1286 }
1287
1290 if (channel_mask)
1292 else
1294
1295
1297
1298 return 0;
1299 }
1300
1306 .priv_data_size = sizeof(COOKContext),
1313 };