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
54
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
70
88
89 float mono_previous_buffer1[1024];
90 float mono_previous_buffer2[1024];
91
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,
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
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 */
137
138 /* VLC data */
139 VLC envelope_quant_index[13];
140 VLC sqvh[7];
// scalar quantization
141
142 /* generatable tables and related variables */
144 float gain_table[23];
145
146 /* data buffers */
147
150 float decode_buffer_1[1024];
151 float decode_buffer_2[1024];
152 float decode_buffer_0[1060];
/* static allocation for joint decode */
153
158
161
162 /*************** init functions ***************/
163
164 /* table generator */
166 {
167 int i;
168 for (i = -63; i < 64; i++) {
171 }
172 }
173
174 /* table generator */
176 {
177 int i;
179 for (i = 0; i < 23; i++)
182 }
183
184
186 {
187 int i, result;
188
189 result = 0;
190 for (i = 0; i < 13; i++) {
194 }
196 for (i = 0; i < 7; i++) {
200 }
201
209 }
210 }
211
213 return result;
214 }
215
217 {
220
223
224 /* Initialize the MLT window: simple sine window. */
226 for (j = 0; j < mlt_size; j++)
228
229 /* Initialize the MDCT. */
233 }
236
237 return 0;
238 }
239
241 {
242 int i;
243 for (i = 0; i < 5; 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 */
273 {
274 static const uint32_t
tab[4] = {
277 };
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);
292 for (i = 0; i < bytes / 4; i++)
293 obuf[i] = c ^ buf[i];
294
296 }
297
299 {
300 int i;
303
304 /* Free allocated memory buffers. */
307
308 /* Free the transform. */
310
311 /* Free the VLC tables. */
312 for (i = 0; i < 13; i++)
314 for (i = 0; i < 7; i++)
318
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 */
331 {
333
335 /* NOTHING */
336 }
337
339
340 i = 0;
341 while (n--) {
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
366 vlc_index = i;
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
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);
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 */
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 };
409
411
415
416 bias = -32;
417
418 /* Estimate bias. */
419 for (i = 32; i > 0; i = i / 2) {
420 num_bits = 0;
421 index = 0;
423 exp_idx = av_clip((i - quant_index_table[index] + bias) / 2, 0, 7);
424 index++;
426 }
427 if (num_bits >= bits_left - 32)
428 bias += i;
429 }
430
431 /* Calculate total number of bits. */
432 num_bits = 0;
434 exp_idx = av_clip((bias - quant_index_table[i]) / 2, 0, 7);
436 exp_index1[i] = exp_idx;
437 exp_index2[i] = exp_idx;
438 }
439 tmpbias1 = tmpbias2 = num_bits;
440
442 if (tmpbias1 + tmpbias2 > 2 * bits_left) { /* ---> */
443 int max = -999999;
444 index = -1;
446 if (exp_index1[i] < 7) {
447 v = (-2 * exp_index1[i]) - quant_index_table[i] + bias;
448 if (v >= max) {
450 index = i;
451 }
452 }
453 }
454 if (index == -1)
455 break;
456 tmp_categorize_array[tmp_categorize_array1_idx++] =
index;
460 } else { /* <--- */
462 index = -1;
464 if (exp_index2[i] > 0) {
465 v = (-2 * exp_index2[i]) - quant_index_table[i] + bias;
466 if (v < min) {
468 index = i;
469 }
470 }
471 }
472 if (index == -1)
473 break;
474 tmp_categorize_array[--tmp_categorize_array2_idx] =
index;
478 }
479 }
480
482 category[i] = exp_index2[i];
483
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 */
497 int *category_index)
498 {
499 int i;
501 {
502 int idx = category_index[i];
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 */
519 int *subband_coef_index, int *subband_coef_sign,
520 float *mlt_p)
521 {
522 int i;
523 float f1;
524
526 if (subband_coef_index[i]) {
528 if (subband_coef_sign[i])
529 f1 = -f1;
530 } else {
531 /* noise coding if subband_coef_index[i] == 0 */
534 f1 = -f1;
535 }
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 */
548 int *subband_coef_index, int *subband_coef_sign)
549 {
550 int i, j;
551 int vlc, vd, tmp, result;
552
554 result = 0;
555 for (i = 0; i <
vpr_tab[category]; i++) {
558 vlc = 0;
559 result = 1;
560 }
561 for (j = vd - 1; j >= 0; j--) {
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]) {
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 */
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. */
597 /* A zero in this table means that the subband coefficient is a
598 positive multiplicator. */
602
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;
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 }
617 subband_coef_index, subband_coef_sign,
619 }
620
621 /* FIXME: should this be removed, or moved into loop above? */
623 return;
624 }
625
626
628 {
629 int category_index[128] = { 0 };
630 int category[128] = { 0 };
631 int quant_index_table[102];
633
637 categorize(q, p, quant_index_table, category, category_index);
640 if (category[i] > 7)
642 }
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 */
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
666 buffer[i] *= fc1;
667 } else { // smooth gain
668 fc2 = q->
gain_table[11 + (gain_index_next - gain_index)];
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 */
685 cook_gains *gains_ptr,
float *previous_buffer)
686 {
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 */
697 inbuffer[i] = inbuffer[i] * fc * q->
mlt_window[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 */
713 cook_gains *gains_ptr,
float *previous_buffer)
714 {
717 int i;
718
719 /* Inverse modified discrete cosine transform */
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])
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,
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 */
743 {
744 int i;
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++)
758 else
759 for (i = 0; i <
length; i++) {
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 */
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;
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 {
809 int idx, cpl_tmp;
810 float f1, f2;
811 const float *cplscale;
812
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));
822 /* The two channels are stored interleaved in decode_buffer. */
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. */
835 idx -= decouple_tab[cpl_tmp];
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);
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 */
858 {
860
866
867 /* Swap current and previous gains */
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 */
878 {
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 */
896 cook_gains *gains_ptr,
float *previous_buffer,
898 {
899 imlt_gain(q, decode_buffer, gains_ptr, previous_buffer);
900 if (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;
918
921
925 } else {
928
933 }
934 }
935
938 outbuffer ? outbuffer[p->
ch_idx] : NULL);
939
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 {
960 int buf_size = avpkt->
size;
962 float **samples = NULL;
965 int chidx = 0;
966
967 if (buf_size < avctx->block_align)
968 return buf_size;
969
970 /* get output buffer */
976 }
977
978 /* estimate subpacket sizes */
980
986 "frame subpacket size total > avctx->block_align!\n");
988 }
989 }
990
991 /* decode supbackets */
997 "subpacket[%i] size %i js %i %i block_align %i\n",
1000
1002 return ret;
1007 }
1008
1009 /* Discard the first two frames: no valid audio. */
1012 *got_frame_ptr = 0;
1014 }
1015
1016 *got_frame_ptr = 1;
1017
1019 }
1020
1021 #ifdef DEBUG
1023 {
1024 //int i=0;
1025 #define PRINT(a, b) av_dlog(q->avctx, " %s = %d\n", a, b);
1031 }
1042 }
1043 #endif
1044
1045 /**
1046 * Cook initialization
1047 *
1048 * @param avctx pointer to the AVCodecContext
1049 */
1051 {
1057 unsigned int channel_mask = 0;
1058 int samples_per_frame = 0;
1061
1062 /* Take care of the codec specific extradata. */
1063 if (extradata_size <= 0) {
1066 }
1068
1069 /* Take data from the AVCodecContext (RM container). */
1073 }
1074
1075 /* Initialize RNG. */
1077
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) {
1085 samples_per_frame = bytestream_get_be16(&edata_ptr);
1087 extradata_size -= 8;
1088 }
1089 if (extradata_size >= 8) {
1090 bytestream_get_be32(&edata_ptr); // Unknown unused
1095 }
1096
1098 extradata_size -= 8;
1099 }
1100
1101 /* Initialize extradata related variables. */
1104
1105 /* Initialize default data states. */
1109
1110 /* Initialize version-dependent variables */
1111
1120 }
1122 break;
1127 }
1129 break;
1134 }
1141 }
1144 }
1147 }
1148 break;
1151 if (extradata_size >= 4)
1153
1160
1163 }
1166 }
1167 } else
1169
1170 break;
1171 default:
1175 }
1176
1180 } else
1182
1183
1184 /* Initialize variable relations */
1186
1187 /* Try to catch some obviously faulty streams, othervise it might be exploitable */
1191 }
1192
1198 }
1199
1203 }
1207 }
1212
1216 }
1217
1219 s++;
1223 }
1224 }
1225 /* Generate tables */
1229
1232
1233
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. */
1246
1247 /* Initialize transform. */
1250
1251 /* Initialize COOK signal arithmetic handling */
1252 if (1) {
1258 }
1259
1260 /* Try to catch some obviously faulty streams, othervise it might be exploitable */
1266 }
1267
1269 if (channel_mask)
1271 else
1273
1274 #ifdef DEBUG
1275 dump_cook_context(q);
1276 #endif
1277 return 0;
1278 }
1279
1292 };