Mercurial > libavcodec.hg
comparison cook.c @ 2956:5f51b1e0bed6 libavcodec
Cook compatibe decoder, patch by Benjamin Larsson
Add cook demucing, change rm demuxer so that it reorders audio packets
before sending them to the decoder, and send minimum decodeable sized
packets; pass only real codec extradata fo the decoder
Fix 28_8 decoder for the new demuxer strategy
author | rtognimp |
---|---|
date | Fri, 09 Dec 2005 16:08:18 +0000 |
parents | |
children | 24805f4d1b84 |
comparison
equal
deleted
inserted
replaced
2955:64f38f1be88f | 2956:5f51b1e0bed6 |
---|---|
1 /* | |
2 * COOK compatible decoder | |
3 * Copyright (c) 2003 Sascha Sommer | |
4 * Copyright (c) 2005 Benjamin Larsson | |
5 * | |
6 * This library is free software; you can redistribute it and/or | |
7 * modify it under the terms of the GNU Lesser General Public | |
8 * License as published by the Free Software Foundation; either | |
9 * version 2 of the License, or (at your option) any later version. | |
10 * | |
11 * This library is distributed in the hope that it will be useful, | |
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
14 * Lesser General Public License for more details. | |
15 * | |
16 * You should have received a copy of the GNU Lesser General Public | |
17 * License along with this library; if not, write to the Free Software | |
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
19 * | |
20 */ | |
21 | |
22 /** | |
23 * @file cook.c | |
24 * Cook compatible decoder. | |
25 * This decoder handles RealNetworks, RealAudio G2 data. | |
26 * Cook is identified by the codec name cook in RM files. | |
27 * | |
28 * To use this decoder, a calling application must supply the extradata | |
29 * bytes provided from the RM container; 8+ bytes for mono streams and | |
30 * 16+ for stereo streams (maybe more). | |
31 * | |
32 * Codec technicalities (all this assume a buffer length of 1024): | |
33 * Cook works with several different techniques to achieve its compression. | |
34 * In the timedomain the buffer is divided into 8 pieces and quantized. If | |
35 * two neighboring pieces have different quantization index a smooth | |
36 * quantization curve is used to get a smooth overlap between the different | |
37 * pieces. | |
38 * To get to the transformdomain Cook uses a modulated lapped transform. | |
39 * The transform domain has 50 subbands with 20 elements each. This | |
40 * means only a maximum of 50*20=1000 coefficients are used out of the 1024 | |
41 * available. | |
42 */ | |
43 | |
44 #include <math.h> | |
45 #include <stddef.h> | |
46 #include <stdio.h> | |
47 | |
48 #define ALT_BITSTREAM_READER | |
49 #include "avcodec.h" | |
50 #include "bitstream.h" | |
51 #include "dsputil.h" | |
52 | |
53 #include "cookdata.h" | |
54 | |
55 /* the different Cook versions */ | |
56 #define MONO_COOK1 0x1000001 | |
57 #define MONO_COOK2 0x1000002 | |
58 #define JOINT_STEREO 0x1000003 | |
59 #define MC_COOK 0x2000000 //multichannel Cook, not supported | |
60 | |
61 #define SUBBAND_SIZE 20 | |
62 //#define COOKDEBUG | |
63 | |
64 typedef struct { | |
65 int size; | |
66 int qidx_table1[8]; | |
67 int qidx_table2[8]; | |
68 } COOKgain; | |
69 | |
70 typedef struct __attribute__((__packed__)){ | |
71 /* codec data start */ | |
72 uint32_t cookversion; //in network order, bigendian | |
73 uint16_t samples_per_frame; //amount of samples per frame per channel, bigendian | |
74 uint16_t subbands; //amount of bands used in the frequency domain, bigendian | |
75 /* Mono extradata ends here. */ | |
76 uint32_t unused; | |
77 uint16_t js_subband_start; //bigendian | |
78 uint16_t js_vlc_bits; //bigendian | |
79 /* Stereo extradata ends here. */ | |
80 } COOKextradata; | |
81 | |
82 | |
83 typedef struct { | |
84 GetBitContext gb; | |
85 /* stream data */ | |
86 int nb_channels; | |
87 int joint_stereo; | |
88 int bit_rate; | |
89 int sample_rate; | |
90 int samples_per_channel; | |
91 int samples_per_frame; | |
92 int subbands; | |
93 int numvector_bits; | |
94 int numvector_size; //1 << numvector_bits; | |
95 int js_subband_start; | |
96 int total_subbands; | |
97 int num_vectors; | |
98 int bits_per_subpacket; | |
99 /* states */ | |
100 int random_state; | |
101 | |
102 /* transform data */ | |
103 FFTContext fft_ctx; | |
104 FFTSample mlt_tmp[1024] __attribute__((aligned(16))); /* temporary storage for imlt */ | |
105 float* mlt_window; | |
106 float* mlt_precos; | |
107 float* mlt_presin; | |
108 float* mlt_postcos; | |
109 int fft_size; | |
110 int fft_order; | |
111 int mlt_size; //modulated lapped transform size | |
112 | |
113 /* gain buffers */ | |
114 COOKgain* gain_now_ptr; | |
115 COOKgain* gain_previous_ptr; | |
116 COOKgain gain_copy; | |
117 COOKgain gain_current; | |
118 COOKgain gain_now; | |
119 COOKgain gain_previous; | |
120 | |
121 /* VLC data */ | |
122 int js_vlc_bits; | |
123 VLC envelope_quant_index[13]; | |
124 VLC sqvh[7]; //scalar quantization | |
125 VLC ccpl; //channel coupling | |
126 | |
127 /* generatable tables and related variables */ | |
128 int gain_size_factor; | |
129 float gain_table[23]; | |
130 float pow2tab[127]; | |
131 float rootpow2tab[127]; | |
132 | |
133 /* data buffers */ | |
134 uint8_t* frame_reorder_buffer; | |
135 int* frame_reorder_index; | |
136 int frame_reorder_counter; | |
137 int frame_reorder_complete; | |
138 int frame_reorder_index_size; | |
139 | |
140 uint8_t* decoded_bytes_buffer; | |
141 float mono_mdct_output[2048] __attribute__((aligned(16))); | |
142 float* previous_buffer_ptr[2]; | |
143 float mono_previous_buffer1[1024]; | |
144 float mono_previous_buffer2[1024]; | |
145 float* decode_buf_ptr[4]; | |
146 float decode_buffer_1[1024]; | |
147 float decode_buffer_2[1024]; | |
148 float decode_buffer_3[1024]; | |
149 float decode_buffer_4[1024]; | |
150 } COOKContext; | |
151 | |
152 /* debug functions */ | |
153 | |
154 #ifdef COOKDEBUG | |
155 static void dump_float_table(float* table, int size, int delimiter) { | |
156 int i=0; | |
157 av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i); | |
158 for (i=0 ; i<size ; i++) { | |
159 av_log(NULL, AV_LOG_ERROR, "%5.1f, ", table[i]); | |
160 if ((i+1)%delimiter == 0) av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i+1); | |
161 } | |
162 } | |
163 | |
164 static void dump_int_table(int* table, int size, int delimiter) { | |
165 int i=0; | |
166 av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i); | |
167 for (i=0 ; i<size ; i++) { | |
168 av_log(NULL, AV_LOG_ERROR, "%d, ", table[i]); | |
169 if ((i+1)%delimiter == 0) av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i+1); | |
170 } | |
171 } | |
172 | |
173 static void dump_short_table(short* table, int size, int delimiter) { | |
174 int i=0; | |
175 av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i); | |
176 for (i=0 ; i<size ; i++) { | |
177 av_log(NULL, AV_LOG_ERROR, "%d, ", table[i]); | |
178 if ((i+1)%delimiter == 0) av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i+1); | |
179 } | |
180 } | |
181 | |
182 #endif | |
183 | |
184 /*************** init functions ***************/ | |
185 | |
186 /* table generator */ | |
187 static void init_pow2table(COOKContext *q){ | |
188 int i; | |
189 q->pow2tab[63] = 1.0; | |
190 for (i=1 ; i<64 ; i++){ | |
191 q->pow2tab[63+i]=(float)pow(2.0,(double)i); | |
192 q->pow2tab[63-i]=1.0/(float)pow(2.0,(double)i); | |
193 } | |
194 } | |
195 | |
196 /* table generator */ | |
197 static void init_rootpow2table(COOKContext *q){ | |
198 int i; | |
199 q->rootpow2tab[63] = 1.0; | |
200 for (i=1 ; i<64 ; i++){ | |
201 q->rootpow2tab[63+i]=sqrt((float)powf(2.0,(float)i)); | |
202 q->rootpow2tab[63-i]=sqrt(1.0/(float)powf(2.0,(float)i)); | |
203 } | |
204 } | |
205 | |
206 /* table generator */ | |
207 static void init_gain_table(COOKContext *q) { | |
208 int i; | |
209 q->gain_size_factor = q->samples_per_channel/8; | |
210 for (i=0 ; i<23 ; i++) { | |
211 q->gain_table[i] = pow((double)q->pow2tab[i+52] , | |
212 (1.0/(double)q->gain_size_factor)); | |
213 } | |
214 memset(&q->gain_copy, 0, sizeof(COOKgain)); | |
215 memset(&q->gain_current, 0, sizeof(COOKgain)); | |
216 memset(&q->gain_now, 0, sizeof(COOKgain)); | |
217 memset(&q->gain_previous, 0, sizeof(COOKgain)); | |
218 } | |
219 | |
220 | |
221 static int init_cook_vlc_tables(COOKContext *q) { | |
222 int i, result; | |
223 | |
224 result = 0; | |
225 for (i=0 ; i<13 ; i++) { | |
226 result &= init_vlc (&q->envelope_quant_index[i], 9, 24, | |
227 envelope_quant_index_huffbits[i], 1, 1, | |
228 envelope_quant_index_huffcodes[i], 2, 2, 0); | |
229 } | |
230 av_log(NULL,AV_LOG_DEBUG,"sqvh VLC init\n"); | |
231 for (i=0 ; i<7 ; i++) { | |
232 result &= init_vlc (&q->sqvh[i], vhvlcsize_tab[i], vhsize_tab[i], | |
233 cvh_huffbits[i], 1, 1, | |
234 cvh_huffcodes[i], 2, 2, 0); | |
235 } | |
236 | |
237 if (q->nb_channels==2 && q->joint_stereo==1){ | |
238 result &= init_vlc (&q->ccpl, 6, (1<<q->js_vlc_bits)-1, | |
239 ccpl_huffbits[q->js_vlc_bits-2], 1, 1, | |
240 ccpl_huffcodes[q->js_vlc_bits-2], 2, 2, 0); | |
241 av_log(NULL,AV_LOG_DEBUG,"Joint-stereo VLC used.\n"); | |
242 } | |
243 | |
244 av_log(NULL,AV_LOG_DEBUG,"VLC tables initialized.\n"); | |
245 return result; | |
246 } | |
247 | |
248 static int init_cook_mlt(COOKContext *q) { | |
249 int j; | |
250 float alpha; | |
251 | |
252 /* Allocate the buffers, could be replaced with a static [512] | |
253 array if needed. */ | |
254 q->mlt_size = q->samples_per_channel; | |
255 q->mlt_window = av_malloc(sizeof(float)*q->mlt_size); | |
256 q->mlt_precos = av_malloc(sizeof(float)*q->mlt_size/2); | |
257 q->mlt_presin = av_malloc(sizeof(float)*q->mlt_size/2); | |
258 q->mlt_postcos = av_malloc(sizeof(float)*q->mlt_size/2); | |
259 | |
260 /* Initialize the MLT window: simple sine window. */ | |
261 alpha = M_PI / (2.0 * (float)q->mlt_size); | |
262 for(j=0 ; j<q->mlt_size ; j++) { | |
263 q->mlt_window[j] = sin((j + 512.0/(float)q->mlt_size) * alpha); | |
264 } | |
265 | |
266 /* pre/post twiddle factors */ | |
267 for (j=0 ; j<q->mlt_size/2 ; j++){ | |
268 q->mlt_precos[j] = cos( ((j+0.25)*M_PI)/q->mlt_size); | |
269 q->mlt_presin[j] = sin( ((j+0.25)*M_PI)/q->mlt_size); | |
270 q->mlt_postcos[j] = (float)sqrt(2.0/(float)q->mlt_size)*cos( ((float)j*M_PI) /q->mlt_size); //sqrt(2/MLT_size) = scalefactor | |
271 } | |
272 | |
273 /* Initialize the FFT. */ | |
274 ff_fft_init(&q->fft_ctx, av_log2(q->mlt_size)-1, 0); | |
275 av_log(NULL,AV_LOG_DEBUG,"FFT initialized, order = %d.\n", | |
276 av_log2(q->samples_per_channel)-1); | |
277 | |
278 return (int)(q->mlt_window && q->mlt_precos && q->mlt_presin && q->mlt_postcos); | |
279 } | |
280 | |
281 /*************** init functions end ***********/ | |
282 | |
283 /** | |
284 * Cook indata decoding, every 32 bits are XORed with 0x37c511f2. | |
285 * Why? No idea, some checksum/error detection method maybe. | |
286 * Nice way to waste CPU cycles. | |
287 * | |
288 * @param in pointer to 32bit array of indata | |
289 * @param bits amount of bits | |
290 * @param out pointer to 32bit array of outdata | |
291 */ | |
292 | |
293 static inline void decode_bytes(uint8_t* inbuffer, uint8_t* out, int bytes){ | |
294 int i; | |
295 uint32_t* buf = (uint32_t*) inbuffer; | |
296 uint32_t* obuf = (uint32_t*) out; | |
297 /* FIXME: 64 bit platforms would be able to do 64 bits at a time. | |
298 * I'm too lazy though, should be something like | |
299 * for(i=0 ; i<bitamount/64 ; i++) | |
300 * (int64_t)out[i] = 0x37c511f237c511f2^be2me_64(int64_t)in[i]); | |
301 * Buffer alignment needs to be checked. */ | |
302 | |
303 | |
304 for(i=0 ; i<bytes/4 ; i++){ | |
305 #ifdef WORDS_BIGENDIAN | |
306 obuf[i] = 0x37c511f2^buf[i]; | |
307 #else | |
308 obuf[i] = 0xf211c537^buf[i]; | |
309 #endif | |
310 } | |
311 } | |
312 | |
313 /** | |
314 * Cook uninit | |
315 */ | |
316 | |
317 static int cook_decode_close(AVCodecContext *avctx) | |
318 { | |
319 int i; | |
320 COOKContext *q = avctx->priv_data; | |
321 av_log(NULL,AV_LOG_DEBUG, "Deallocating memory.\n"); | |
322 | |
323 /* Free allocated memory buffers. */ | |
324 av_free(q->mlt_window); | |
325 av_free(q->mlt_precos); | |
326 av_free(q->mlt_presin); | |
327 av_free(q->mlt_postcos); | |
328 av_free(q->frame_reorder_index); | |
329 av_free(q->frame_reorder_buffer); | |
330 av_free(q->decoded_bytes_buffer); | |
331 | |
332 /* Free the transform. */ | |
333 ff_fft_end(&q->fft_ctx); | |
334 | |
335 /* Free the VLC tables. */ | |
336 for (i=0 ; i<13 ; i++) { | |
337 free_vlc(&q->envelope_quant_index[i]); | |
338 } | |
339 for (i=0 ; i<7 ; i++) { | |
340 free_vlc(&q->sqvh[i]); | |
341 } | |
342 if(q->nb_channels==2 && q->joint_stereo==1 ){ | |
343 free_vlc(&q->ccpl); | |
344 } | |
345 | |
346 av_log(NULL,AV_LOG_DEBUG,"Memory deallocated.\n"); | |
347 | |
348 return 0; | |
349 } | |
350 | |
351 /** | |
352 * Fill the COOKgain structure for the timedomain quantization. | |
353 * | |
354 * @param q pointer to the COOKContext | |
355 * @param gaininfo pointer to the COOKgain | |
356 */ | |
357 | |
358 static void decode_gain_info(GetBitContext *gb, COOKgain* gaininfo) { | |
359 int i; | |
360 | |
361 while (get_bits1(gb)) {} | |
362 | |
363 gaininfo->size = get_bits_count(gb) - 1; //amount of elements*2 to update | |
364 | |
365 if (get_bits_count(gb) - 1 <= 0) return; | |
366 | |
367 for (i=0 ; i<gaininfo->size ; i++){ | |
368 gaininfo->qidx_table1[i] = get_bits(gb,3); | |
369 if (get_bits1(gb)) { | |
370 gaininfo->qidx_table2[i] = get_bits(gb,4) - 7; //convert to signed | |
371 } else { | |
372 gaininfo->qidx_table2[i] = -1; | |
373 } | |
374 } | |
375 } | |
376 | |
377 /** | |
378 * Create the quant index table needed for the envelope. | |
379 * | |
380 * @param q pointer to the COOKContext | |
381 * @param quant_index_table pointer to the array | |
382 */ | |
383 | |
384 static void decode_envelope(COOKContext *q, int* quant_index_table) { | |
385 int i,j, vlc_index; | |
386 int bitbias; | |
387 | |
388 bitbias = get_bits_count(&q->gb); | |
389 quant_index_table[0]= get_bits(&q->gb,6) - 6; //This is used later in categorize | |
390 | |
391 for (i=1 ; i < q->total_subbands ; i++){ | |
392 vlc_index=i; | |
393 if (i >= q->js_subband_start * 2) { | |
394 vlc_index-=q->js_subband_start; | |
395 } else { | |
396 vlc_index/=2; | |
397 if(vlc_index < 1) vlc_index = 1; | |
398 } | |
399 if (vlc_index>13) vlc_index = 13; //the VLC tables >13 are identical to No. 13 | |
400 | |
401 j = get_vlc2(&q->gb, q->envelope_quant_index[vlc_index-1].table, | |
402 q->envelope_quant_index[vlc_index-1].bits,2); | |
403 quant_index_table[i] = quant_index_table[i-1] + j - 12; //differential encoding | |
404 } | |
405 } | |
406 | |
407 /** | |
408 * Create the quant value table. | |
409 * | |
410 * @param q pointer to the COOKContext | |
411 * @param quant_value_table pointer to the array | |
412 */ | |
413 | |
414 static void inline dequant_envelope(COOKContext *q, int* quant_index_table, | |
415 float* quant_value_table){ | |
416 | |
417 int i; | |
418 for(i=0 ; i < q->total_subbands ; i++){ | |
419 quant_value_table[i] = q->rootpow2tab[quant_index_table[i]+63]; | |
420 } | |
421 } | |
422 | |
423 /** | |
424 * Calculate the category and category_index vector. | |
425 * | |
426 * @param q pointer to the COOKContext | |
427 * @param quant_index_table pointer to the array | |
428 * @param category pointer to the category array | |
429 * @param category_index pointer to the category_index array | |
430 */ | |
431 | |
432 static void categorize(COOKContext *q, int* quant_index_table, | |
433 int* category, int* category_index){ | |
434 int exp_idx, bias, tmpbias, bits_left, num_bits, index, v, i, j; | |
435 int exp_index2[102]; | |
436 int exp_index1[102]; | |
437 | |
438 int tmp_categorize_array1[128]; | |
439 int tmp_categorize_array1_idx=0; | |
440 int tmp_categorize_array2[128]; | |
441 int tmp_categorize_array2_idx=0; | |
442 int category_index_size=0; | |
443 | |
444 bits_left = q->bits_per_subpacket - get_bits_count(&q->gb); | |
445 | |
446 if(bits_left > q->samples_per_channel) { | |
447 bits_left = q->samples_per_channel + | |
448 ((bits_left - q->samples_per_channel)*5)/8; | |
449 //av_log(NULL, AV_LOG_ERROR, "bits_left = %d\n",bits_left); | |
450 } | |
451 | |
452 memset(&exp_index1,0,102*sizeof(int)); | |
453 memset(&exp_index2,0,102*sizeof(int)); | |
454 memset(&tmp_categorize_array1,0,128*sizeof(int)); | |
455 memset(&tmp_categorize_array2,0,128*sizeof(int)); | |
456 | |
457 bias=-32; | |
458 | |
459 /* Estimate bias. */ | |
460 for (i=32 ; i>0 ; i=i/2){ | |
461 num_bits = 0; | |
462 index = 0; | |
463 for (j=q->total_subbands ; j>0 ; j--){ | |
464 exp_idx = (i - quant_index_table[index] + bias) / 2; | |
465 if (exp_idx<0){ | |
466 exp_idx=0; | |
467 } else if(exp_idx >7) { | |
468 exp_idx=7; | |
469 } | |
470 index++; | |
471 num_bits+=expbits_tab[exp_idx]; | |
472 } | |
473 if(num_bits >= bits_left - 32){ | |
474 bias+=i; | |
475 } | |
476 } | |
477 | |
478 /* Calculate total number of bits. */ | |
479 num_bits=0; | |
480 for (i=0 ; i<q->total_subbands ; i++) { | |
481 exp_idx = (bias - quant_index_table[i]) / 2; | |
482 if (exp_idx<0) { | |
483 exp_idx=0; | |
484 } else if(exp_idx >7) { | |
485 exp_idx=7; | |
486 } | |
487 num_bits += expbits_tab[exp_idx]; | |
488 exp_index1[i] = exp_idx; | |
489 exp_index2[i] = exp_idx; | |
490 } | |
491 tmpbias = bias = num_bits; | |
492 | |
493 for (j = 1 ; j < q->numvector_size ; j++) { | |
494 if (tmpbias + bias > 2*bits_left) { /* ---> */ | |
495 int max = -999999; | |
496 index=-1; | |
497 for (i=0 ; i<q->total_subbands ; i++){ | |
498 if (exp_index1[i] < 7) { | |
499 v = (-2*exp_index1[i]) - quant_index_table[i] - 32; | |
500 if ( v >= max) { | |
501 max = v; | |
502 index = i; | |
503 } | |
504 } | |
505 } | |
506 if(index==-1)break; | |
507 tmp_categorize_array1[tmp_categorize_array1_idx++] = index; | |
508 tmpbias -= expbits_tab[exp_index1[index]] - | |
509 expbits_tab[exp_index1[index]+1]; | |
510 ++exp_index1[index]; | |
511 } else { /* <--- */ | |
512 int min = 999999; | |
513 index=-1; | |
514 for (i=0 ; i<q->total_subbands ; i++){ | |
515 if(exp_index2[i] > 0){ | |
516 v = (-2*exp_index2[i])-quant_index_table[i]; | |
517 if ( v < min) { | |
518 min = v; | |
519 index = i; | |
520 } | |
521 } | |
522 } | |
523 if(index == -1)break; | |
524 tmp_categorize_array2[tmp_categorize_array2_idx++] = index; | |
525 tmpbias -= expbits_tab[exp_index2[index]] - | |
526 expbits_tab[exp_index2[index]-1]; | |
527 --exp_index2[index]; | |
528 } | |
529 } | |
530 | |
531 for(i=0 ; i<q->total_subbands ; i++) | |
532 category[i] = exp_index2[i]; | |
533 | |
534 /* Concatenate the two arrays. */ | |
535 for(i=tmp_categorize_array2_idx-1 ; i >= 0; i--) | |
536 category_index[category_index_size++] = tmp_categorize_array2[i]; | |
537 | |
538 for(i=0;i<tmp_categorize_array1_idx;i++) | |
539 category_index[category_index_size++ ] = tmp_categorize_array1[i]; | |
540 | |
541 /* FIXME: mc_sich_ra8_20.rm triggers this, not sure with what we | |
542 should fill the remaining bytes. */ | |
543 for(i=category_index_size;i<q->numvector_size;i++) | |
544 category_index[i]=0; | |
545 | |
546 } | |
547 | |
548 | |
549 /** | |
550 * Expand the category vector. | |
551 * | |
552 * @param q pointer to the COOKContext | |
553 * @param category pointer to the category array | |
554 * @param category_index pointer to the category_index array | |
555 */ | |
556 | |
557 static void inline expand_category(COOKContext *q, int* category, | |
558 int* category_index){ | |
559 int i; | |
560 for(i=0 ; i<q->num_vectors ; i++){ | |
561 ++category[category_index[i]]; | |
562 } | |
563 } | |
564 | |
565 /** | |
566 * The real requantization of the mltcoefs | |
567 * | |
568 * @param q pointer to the COOKContext | |
569 * @param index index | |
570 * @param band current subband | |
571 * @param quant_value_table pointer to the array | |
572 * @param subband_coef_index array of indexes to quant_centroid_tab | |
573 * @param subband_coef_noise use random noise instead of predetermined value | |
574 * @param mlt_buffer pointer to the mlt buffer | |
575 */ | |
576 | |
577 | |
578 static void scalar_dequant(COOKContext *q, int index, int band, | |
579 float* quant_value_table, int* subband_coef_index, | |
580 int* subband_coef_noise, float* mlt_buffer){ | |
581 int i; | |
582 float f1; | |
583 | |
584 for(i=0 ; i<SUBBAND_SIZE ; i++) { | |
585 if (subband_coef_index[i]) { | |
586 if (subband_coef_noise[i]) { | |
587 f1 = -quant_centroid_tab[index][subband_coef_index[i]]; | |
588 } else { | |
589 f1 = quant_centroid_tab[index][subband_coef_index[i]]; | |
590 } | |
591 } else { | |
592 /* noise coding if subband_coef_noise[i] == 0 */ | |
593 q->random_state = q->random_state * 214013 + 2531011; //typical RNG numbers | |
594 f1 = randsign[(q->random_state/0x1000000)&1] * dither_tab[index]; //>>31 | |
595 } | |
596 mlt_buffer[band*20+ i] = f1 * quant_value_table[band]; | |
597 } | |
598 } | |
599 /** | |
600 * Unpack the subband_coef_index and subband_coef_noise vectors. | |
601 * | |
602 * @param q pointer to the COOKContext | |
603 * @param category pointer to the category array | |
604 * @param subband_coef_index array of indexes to quant_centroid_tab | |
605 * @param subband_coef_noise use random noise instead of predetermined value | |
606 */ | |
607 | |
608 static int unpack_SQVH(COOKContext *q, int category, int* subband_coef_index, | |
609 int* subband_coef_noise) { | |
610 int i,j; | |
611 int vlc, vd ,tmp, result; | |
612 int ub; | |
613 int cb; | |
614 | |
615 vd = vd_tab[category]; | |
616 result = 0; | |
617 for(i=0 ; i<vpr_tab[category] ; i++){ | |
618 ub = get_bits_count(&q->gb); | |
619 vlc = get_vlc2(&q->gb, q->sqvh[category].table, q->sqvh[category].bits, 3); | |
620 cb = get_bits_count(&q->gb); | |
621 if (q->bits_per_subpacket < get_bits_count(&q->gb)){ | |
622 vlc = 0; | |
623 result = 1; | |
624 } | |
625 for(j=vd-1 ; j>=0 ; j--){ | |
626 tmp = (vlc * invradix_tab[category])/0x100000; | |
627 subband_coef_index[vd*i+j] = vlc - tmp * (kmax_tab[category]+1); | |
628 vlc = tmp; | |
629 } | |
630 for(j=0 ; j<vd ; j++){ | |
631 if (subband_coef_index[i*vd + j]) { | |
632 if(get_bits_count(&q->gb) < q->bits_per_subpacket){ | |
633 subband_coef_noise[i*vd+j] = get_bits1(&q->gb); | |
634 } else { | |
635 result=1; | |
636 subband_coef_noise[i*vd+j]=0; | |
637 } | |
638 } else { | |
639 subband_coef_noise[i*vd+j]=0; | |
640 } | |
641 } | |
642 } | |
643 return result; | |
644 } | |
645 | |
646 | |
647 /** | |
648 * Fill the mlt_buffer with mlt coefficients. | |
649 * | |
650 * @param q pointer to the COOKContext | |
651 * @param category pointer to the category array | |
652 * @param quant_value_table pointer to the array | |
653 * @param mlt_buffer pointer to mlt coefficients | |
654 */ | |
655 | |
656 | |
657 static void decode_vectors(COOKContext* q, int* category, | |
658 float* quant_value_table, float* mlt_buffer){ | |
659 /* A zero in this table means that the subband coefficient is | |
660 random noise coded. */ | |
661 int subband_coef_noise[SUBBAND_SIZE]; | |
662 /* A zero in this table means that the subband coefficient is a | |
663 positive multiplicator. */ | |
664 int subband_coef_index[SUBBAND_SIZE]; | |
665 int band, j; | |
666 int index=0; | |
667 | |
668 for(band=0 ; band<q->total_subbands ; band++){ | |
669 index = category[band]; | |
670 if(category[band] < 7){ | |
671 if(unpack_SQVH(q, category[band], subband_coef_index, subband_coef_noise)){ | |
672 index=7; | |
673 for(j=0 ; j<q->total_subbands ; j++) category[band+j]=7; | |
674 } | |
675 } | |
676 if(index==7) { | |
677 memset(subband_coef_index, 0, sizeof(subband_coef_index)); | |
678 memset(subband_coef_noise, 0, sizeof(subband_coef_noise)); | |
679 } | |
680 scalar_dequant(q, index, band, quant_value_table, subband_coef_index, | |
681 subband_coef_noise, mlt_buffer); | |
682 } | |
683 | |
684 if(q->total_subbands*SUBBAND_SIZE >= q->samples_per_channel){ | |
685 return; | |
686 } | |
687 } | |
688 | |
689 | |
690 /** | |
691 * function for decoding mono data | |
692 * | |
693 * @param q pointer to the COOKContext | |
694 * @param mlt_buffer1 pointer to left channel mlt coefficients | |
695 * @param mlt_buffer2 pointer to right channel mlt coefficients | |
696 */ | |
697 | |
698 static void mono_decode(COOKContext *q, float* mlt_buffer) { | |
699 | |
700 int category_index[128]; | |
701 float quant_value_table[102]; | |
702 int quant_index_table[102]; | |
703 int category[128]; | |
704 | |
705 memset(&category, 0, 128*sizeof(int)); | |
706 memset(&quant_value_table, 0, 102*sizeof(int)); | |
707 memset(&category_index, 0, 128*sizeof(int)); | |
708 | |
709 decode_envelope(q, quant_index_table); | |
710 q->num_vectors = get_bits(&q->gb,q->numvector_bits); | |
711 dequant_envelope(q, quant_index_table, quant_value_table); | |
712 categorize(q, quant_index_table, category, category_index); | |
713 expand_category(q, category, category_index); | |
714 decode_vectors(q, category, quant_value_table, mlt_buffer); | |
715 } | |
716 | |
717 | |
718 /** | |
719 * The modulated lapped transform, this takes transform coefficients | |
720 * and transforms them into timedomain samples. This is done through | |
721 * an FFT-based algorithm with pre- and postrotation steps. | |
722 * A window and reorder step is also included. | |
723 * | |
724 * @param q pointer to the COOKContext | |
725 * @param inbuffer pointer to the mltcoefficients | |
726 * @param outbuffer pointer to the timedomain buffer | |
727 * @param mlt_tmp pointer to temporary storage space | |
728 */ | |
729 | |
730 static void cook_imlt(COOKContext *q, float* inbuffer, float* outbuffer, | |
731 float* mlt_tmp){ | |
732 int i; | |
733 | |
734 /* prerotation */ | |
735 for(i=0 ; i<q->mlt_size ; i+=2){ | |
736 outbuffer[i] = (q->mlt_presin[i/2] * inbuffer[q->mlt_size-1-i]) + | |
737 (q->mlt_precos[i/2] * inbuffer[i]); | |
738 outbuffer[i+1] = (q->mlt_precos[i/2] * inbuffer[q->mlt_size-1-i]) - | |
739 (q->mlt_presin[i/2] * inbuffer[i]); | |
740 } | |
741 | |
742 /* FFT */ | |
743 ff_fft_permute(&q->fft_ctx, (FFTComplex *) outbuffer); | |
744 ff_fft_calc (&q->fft_ctx, (FFTComplex *) outbuffer); | |
745 | |
746 /* postrotation */ | |
747 for(i=0 ; i<q->mlt_size ; i+=2){ | |
748 mlt_tmp[i] = (q->mlt_postcos[(q->mlt_size-1-i)/2] * outbuffer[i+1]) + | |
749 (q->mlt_postcos[i/2] * outbuffer[i]); | |
750 mlt_tmp[q->mlt_size-1-i] = (q->mlt_postcos[(q->mlt_size-1-i)/2] * outbuffer[i]) - | |
751 (q->mlt_postcos[i/2] * outbuffer[i+1]); | |
752 } | |
753 | |
754 /* window and reorder */ | |
755 for(i=0 ; i<q->mlt_size/2 ; i++){ | |
756 outbuffer[i] = mlt_tmp[q->mlt_size/2-1-i] * q->mlt_window[i]; | |
757 outbuffer[q->mlt_size-1-i]= mlt_tmp[q->mlt_size/2-1-i] * | |
758 q->mlt_window[q->mlt_size-1-i]; | |
759 outbuffer[q->mlt_size+i]= mlt_tmp[q->mlt_size/2+i] * | |
760 q->mlt_window[q->mlt_size-1-i]; | |
761 outbuffer[2*q->mlt_size-1-i]= -(mlt_tmp[q->mlt_size/2+i] * | |
762 q->mlt_window[i]); | |
763 } | |
764 } | |
765 | |
766 | |
767 /** | |
768 * the actual requantization of the timedomain samples | |
769 * | |
770 * @param q pointer to the COOKContext | |
771 * @param buffer pointer to the timedomain buffer | |
772 * @param gain_index index for the block multiplier | |
773 * @param gain_index_next index for the next block multiplier | |
774 */ | |
775 | |
776 static void interpolate(COOKContext *q, float* buffer, | |
777 int gain_index, int gain_index_next){ | |
778 int i; | |
779 float fc1, fc2; | |
780 fc1 = q->pow2tab[gain_index+63]; | |
781 | |
782 if(gain_index == gain_index_next){ //static gain | |
783 for(i=0 ; i<q->gain_size_factor ; i++){ | |
784 buffer[i]*=fc1; | |
785 } | |
786 return; | |
787 } else { //smooth gain | |
788 fc2 = q->gain_table[11 + (gain_index_next-gain_index)]; | |
789 for(i=0 ; i<q->gain_size_factor ; i++){ | |
790 buffer[i]*=fc1; | |
791 fc1*=fc2; | |
792 } | |
793 return; | |
794 } | |
795 } | |
796 | |
797 /** | |
798 * timedomain requantization of the timedomain samples | |
799 * | |
800 * @param q pointer to the COOKContext | |
801 * @param buffer pointer to the timedomain buffer | |
802 * @param gain_now current gain structure | |
803 * @param gain_previous previous gain structure | |
804 */ | |
805 | |
806 static void gain_window(COOKContext *q, float* buffer, COOKgain* gain_now, | |
807 COOKgain* gain_previous){ | |
808 int i, index; | |
809 int gain_index[9]; | |
810 int tmp_gain_index; | |
811 | |
812 gain_index[8]=0; | |
813 index = gain_previous->size; | |
814 for (i=7 ; i>=0 ; i--) { | |
815 if(index && gain_previous->qidx_table1[index-1]==i) { | |
816 gain_index[i] = gain_previous->qidx_table2[index-1]; | |
817 index--; | |
818 } else { | |
819 gain_index[i]=gain_index[i+1]; | |
820 } | |
821 } | |
822 /* This is applied to the to be previous data buffer. */ | |
823 for(i=0;i<8;i++){ | |
824 interpolate(q, &buffer[q->samples_per_channel+q->gain_size_factor*i], | |
825 gain_index[i], gain_index[i+1]); | |
826 } | |
827 | |
828 tmp_gain_index = gain_index[0]; | |
829 index = gain_now->size; | |
830 for (i=7 ; i>=0 ; i--) { | |
831 if(index && gain_now->qidx_table1[index-1]==i) { | |
832 gain_index[i]= gain_now->qidx_table2[index-1]; | |
833 index--; | |
834 } else { | |
835 gain_index[i]=gain_index[i+1]; | |
836 } | |
837 } | |
838 | |
839 /* This is applied to the to be current block. */ | |
840 for(i=0;i<8;i++){ | |
841 interpolate(q, &buffer[i*q->gain_size_factor], | |
842 tmp_gain_index+gain_index[i], | |
843 tmp_gain_index+gain_index[i+1]); | |
844 } | |
845 } | |
846 | |
847 | |
848 /** | |
849 * mlt overlapping and buffer management | |
850 * | |
851 * @param q pointer to the COOKContext | |
852 * @param buffer pointer to the timedomain buffer | |
853 * @param gain_now current gain structure | |
854 * @param gain_previous previous gain structure | |
855 * @param previous_buffer pointer to the previous buffer to be used for overlapping | |
856 * | |
857 */ | |
858 | |
859 static void gain_compensate(COOKContext *q, float* buffer, COOKgain* gain_now, | |
860 COOKgain* gain_previous, float* previous_buffer) { | |
861 int i; | |
862 if((gain_now->size || gain_previous->size)) { | |
863 gain_window(q, buffer, gain_now, gain_previous); | |
864 } | |
865 | |
866 /* Overlap with the previous block. */ | |
867 for(i=0 ; i<q->samples_per_channel ; i++) buffer[i]+=previous_buffer[i]; | |
868 | |
869 /* Save away the current to be previous block. */ | |
870 memcpy(previous_buffer, buffer+q->samples_per_channel, | |
871 sizeof(float)*q->samples_per_channel); | |
872 } | |
873 | |
874 | |
875 /** | |
876 * function for getting the jointstereo coupling information | |
877 * | |
878 * @param q pointer to the COOKContext | |
879 * @param decouple_tab decoupling array | |
880 * | |
881 */ | |
882 | |
883 static void decouple_info(COOKContext *q, int* decouple_tab){ | |
884 int length, i; | |
885 | |
886 if(get_bits1(&q->gb)) { | |
887 if(cplband[q->js_subband_start] > cplband[q->subbands-1]) return; | |
888 | |
889 length = cplband[q->subbands-1] - cplband[q->js_subband_start] + 1; | |
890 for (i=0 ; i<length ; i++) { | |
891 decouple_tab[cplband[q->js_subband_start] + i] = get_vlc2(&q->gb, q->ccpl.table, q->ccpl.bits, 2); | |
892 } | |
893 return; | |
894 } | |
895 | |
896 if(cplband[q->js_subband_start] > cplband[q->subbands-1]) return; | |
897 | |
898 length = cplband[q->subbands-1] - cplband[q->js_subband_start] + 1; | |
899 for (i=0 ; i<length ; i++) { | |
900 decouple_tab[cplband[q->js_subband_start] + i] = get_bits(&q->gb, q->js_vlc_bits); | |
901 } | |
902 return; | |
903 } | |
904 | |
905 | |
906 /** | |
907 * function for decoding joint stereo data | |
908 * | |
909 * @param q pointer to the COOKContext | |
910 * @param mlt_buffer1 pointer to left channel mlt coefficients | |
911 * @param mlt_buffer2 pointer to right channel mlt coefficients | |
912 */ | |
913 | |
914 static void joint_decode(COOKContext *q, float* mlt_buffer1, | |
915 float* mlt_buffer2) { | |
916 int i,j; | |
917 int decouple_tab[SUBBAND_SIZE]; | |
918 float decode_buffer[2048]; //Only 1060 might be needed. | |
919 int idx, cpl_tmp,tmp_idx; | |
920 float f1,f2; | |
921 float* cplscale; | |
922 | |
923 memset(decouple_tab, 0, sizeof(decouple_tab)); | |
924 memset(decode_buffer, 0, sizeof(decode_buffer)); | |
925 | |
926 /* Make sure the buffers are zeroed out. */ | |
927 memset(mlt_buffer1,0, 1024*sizeof(float)); | |
928 memset(mlt_buffer2,0, 1024*sizeof(float)); | |
929 decouple_info(q, decouple_tab); | |
930 mono_decode(q, decode_buffer); | |
931 | |
932 /* The two channels are stored interleaved in decode_buffer. */ | |
933 for (i=0 ; i<q->js_subband_start ; i++) { | |
934 for (j=0 ; j<SUBBAND_SIZE ; j++) { | |
935 mlt_buffer1[i*20+j] = decode_buffer[i*40+j]; | |
936 mlt_buffer2[i*20+j] = decode_buffer[i*40+20+j]; | |
937 } | |
938 } | |
939 | |
940 /* When we reach js_subband_start (the higher frequencies) | |
941 the coefficients are stored in a coupling scheme. */ | |
942 idx = (1 << q->js_vlc_bits) - 1; | |
943 if (q->js_subband_start < q->subbands) { | |
944 for (i=0 ; i<q->subbands ; i++) { | |
945 cpl_tmp = cplband[i + q->js_subband_start]; | |
946 idx -=decouple_tab[cpl_tmp]; | |
947 cplscale = (float*)cplscales[q->js_vlc_bits-2]; //choose decoupler table | |
948 f1 = cplscale[decouple_tab[cpl_tmp]]; | |
949 f2 = cplscale[idx-1]; | |
950 for (j=0 ; j<SUBBAND_SIZE ; j++) { | |
951 tmp_idx = ((2*q->js_subband_start + i)*20)+j; | |
952 mlt_buffer1[20*(i+q->js_subband_start) + j] = f1 * decode_buffer[tmp_idx]; | |
953 mlt_buffer2[20*(i+q->js_subband_start) + j] = f2 * decode_buffer[tmp_idx]; | |
954 } | |
955 idx = (1 << q->js_vlc_bits) - 1; | |
956 } | |
957 } | |
958 } | |
959 | |
960 /** | |
961 * Cook subpacket decoding. This function returns one decoded subpacket, | |
962 * usually 1024 samples per channel. | |
963 * | |
964 * @param q pointer to the COOKContext | |
965 * @param inbuffer pointer to the inbuffer | |
966 * @param sub_packet_size subpacket size | |
967 * @param outbuffer pointer to the outbuffer | |
968 * @param pos the subpacket number in the frame | |
969 */ | |
970 | |
971 | |
972 static int decode_subpacket(COOKContext *q, uint8_t *inbuffer, | |
973 int sub_packet_size, int16_t *outbuffer) { | |
974 int i,j; | |
975 int value; | |
976 float* tmp_ptr; | |
977 | |
978 /* packet dump */ | |
979 // for (i=0 ; i<sub_packet_size ; i++) { | |
980 // av_log(NULL, AV_LOG_ERROR, "%02x", inbuffer[i]); | |
981 // } | |
982 // av_log(NULL, AV_LOG_ERROR, "\n"); | |
983 | |
984 decode_bytes(inbuffer, q->decoded_bytes_buffer, sub_packet_size); | |
985 init_get_bits(&q->gb, q->decoded_bytes_buffer, sub_packet_size*8); | |
986 decode_gain_info(&q->gb, &q->gain_current); | |
987 memcpy(&q->gain_copy, &q->gain_current ,sizeof(COOKgain)); //This copy does not seem to be used. FIXME | |
988 //fprintf(stdout,"cu bits ds = %d\n",get_bits_count(&q->gb)); | |
989 if(q->nb_channels==2 && q->joint_stereo==1){ | |
990 joint_decode(q, q->decode_buf_ptr[0], q->decode_buf_ptr[2]); | |
991 | |
992 /* Swap buffer pointers. */ | |
993 tmp_ptr = q->decode_buf_ptr[1]; | |
994 q->decode_buf_ptr[1] = q->decode_buf_ptr[0]; | |
995 q->decode_buf_ptr[0] = tmp_ptr; | |
996 tmp_ptr = q->decode_buf_ptr[3]; | |
997 q->decode_buf_ptr[3] = q->decode_buf_ptr[2]; | |
998 q->decode_buf_ptr[2] = tmp_ptr; | |
999 | |
1000 /* FIXME: Rethink the gainbuffer handling, maybe a rename? | |
1001 now/previous swap */ | |
1002 q->gain_now_ptr = &q->gain_now; | |
1003 q->gain_previous_ptr = &q->gain_previous; | |
1004 for (i=0 ; i<q->nb_channels ; i++){ | |
1005 | |
1006 cook_imlt(q, q->decode_buf_ptr[i*2], q->mono_mdct_output, q->mlt_tmp); | |
1007 gain_compensate(q, q->mono_mdct_output, q->gain_now_ptr, | |
1008 q->gain_previous_ptr, q->previous_buffer_ptr[0]); | |
1009 | |
1010 /* Swap out the previous buffer. */ | |
1011 tmp_ptr = q->previous_buffer_ptr[0]; | |
1012 q->previous_buffer_ptr[0] = q->previous_buffer_ptr[1]; | |
1013 q->previous_buffer_ptr[1] = tmp_ptr; | |
1014 | |
1015 /* Clip and convert the floats to 16 bits. */ | |
1016 for (j=0 ; j<q->samples_per_frame ; j++){ | |
1017 value = lrintf(q->mono_mdct_output[j]); | |
1018 if(value < -32768) value = -32768; | |
1019 else if(value > 32767) value = 32767; | |
1020 outbuffer[2*j+i] = value; | |
1021 } | |
1022 } | |
1023 | |
1024 memcpy(&q->gain_now, &q->gain_previous, sizeof(COOKgain)); | |
1025 memcpy(&q->gain_previous, &q->gain_current, sizeof(COOKgain)); | |
1026 | |
1027 } else if (q->nb_channels==2 && q->joint_stereo==0) { | |
1028 for (i=0 ; i<q->nb_channels ; i++){ | |
1029 mono_decode(q, q->decode_buf_ptr[0]); | |
1030 | |
1031 av_log(NULL,AV_LOG_ERROR,"Non-joint-stereo files are not supported at the moment, do not report as a bug!\n"); | |
1032 tmp_ptr = q->decode_buf_ptr[0]; | |
1033 q->decode_buf_ptr[0] = q->decode_buf_ptr[1]; | |
1034 q->decode_buf_ptr[1] = q->decode_buf_ptr[2]; | |
1035 q->decode_buf_ptr[2] = q->decode_buf_ptr[3]; | |
1036 q->decode_buf_ptr[3] = tmp_ptr; | |
1037 | |
1038 q->gain_now_ptr = &q->gain_now; | |
1039 q->gain_previous_ptr = &q->gain_previous; | |
1040 | |
1041 cook_imlt(q, q->decode_buf_ptr[0], q->mono_mdct_output,q->mlt_tmp); | |
1042 gain_compensate(q, q->mono_mdct_output, q->gain_now_ptr, | |
1043 q->gain_previous_ptr, q->previous_buffer_ptr[0]); | |
1044 /* Swap out the previous buffer. */ | |
1045 tmp_ptr = q->previous_buffer_ptr[0]; | |
1046 q->previous_buffer_ptr[0] = q->previous_buffer_ptr[1]; | |
1047 q->previous_buffer_ptr[1] = tmp_ptr; | |
1048 | |
1049 for (j=0 ; j<q->samples_per_frame ; j++){ | |
1050 value = lrintf(q->mono_mdct_output[j]); | |
1051 if(value < -32768) value = -32768; | |
1052 else if(value > 32767) value = 32767; | |
1053 outbuffer[2*j+i] = value; | |
1054 } | |
1055 memcpy(&q->gain_now, &q->gain_previous, sizeof(COOKgain)); | |
1056 memcpy(&q->gain_previous, &q->gain_current, sizeof(COOKgain)); | |
1057 } | |
1058 } else { | |
1059 mono_decode(q, q->decode_buf_ptr[0]); | |
1060 | |
1061 /* Swap buffer pointers. */ | |
1062 tmp_ptr = q->decode_buf_ptr[1]; | |
1063 q->decode_buf_ptr[1] = q->decode_buf_ptr[0]; | |
1064 q->decode_buf_ptr[0] = tmp_ptr; | |
1065 | |
1066 /* FIXME: Rethink the gainbuffer handling, maybe a rename? | |
1067 now/previous swap */ | |
1068 q->gain_now_ptr = &q->gain_now; | |
1069 q->gain_previous_ptr = &q->gain_previous; | |
1070 | |
1071 cook_imlt(q, q->decode_buf_ptr[0], q->mono_mdct_output,q->mlt_tmp); | |
1072 gain_compensate(q, q->mono_mdct_output, q->gain_now_ptr, | |
1073 q->gain_previous_ptr, q->mono_previous_buffer1); | |
1074 | |
1075 /* Clip and convert the floats to 16 bits */ | |
1076 for (j=0 ; j<q->samples_per_frame ; j++){ | |
1077 value = lrintf(q->mono_mdct_output[j]); | |
1078 if(value < -32768) value = -32768; | |
1079 else if(value > 32767) value = 32767; | |
1080 outbuffer[j] = value; | |
1081 } | |
1082 memcpy(&q->gain_now, &q->gain_previous, sizeof(COOKgain)); | |
1083 memcpy(&q->gain_previous, &q->gain_current, sizeof(COOKgain)); | |
1084 } | |
1085 /* FIXME: Shouldn't the total number of bytes be returned? */ | |
1086 return /*q->nb_channels*/ q->samples_per_frame * sizeof(int16_t); | |
1087 } | |
1088 | |
1089 | |
1090 /** | |
1091 * Cook frame decoding | |
1092 * | |
1093 * @param avctx pointer to the AVCodecContext | |
1094 */ | |
1095 | |
1096 static int cook_decode_frame(AVCodecContext *avctx, | |
1097 void *data, int *data_size, | |
1098 uint8_t *buf, int buf_size) { | |
1099 /* This stuff is quite messy, the Cook packets are sent unordered | |
1100 * and need to be ordered before they are sent to the rest of the | |
1101 * decoder. The order can be found in the q->frame_reorder_index. | |
1102 * Currently decoding of the last packets is not handled at | |
1103 * all. FIXME */ | |
1104 | |
1105 COOKContext *q = avctx->priv_data; | |
1106 | |
1107 if (buf_size < avctx->block_align) | |
1108 return buf_size; | |
1109 | |
1110 *data_size = decode_subpacket(q, buf, avctx->block_align, data); | |
1111 | |
1112 return avctx->block_align; | |
1113 } | |
1114 #ifdef COOKDEBUG | |
1115 static void dump_cook_context(COOKContext *q, COOKextradata *e) | |
1116 { | |
1117 //int i=0; | |
1118 #define PRINT(a,b) av_log(NULL,AV_LOG_ERROR," %s = %d\n", a, b); | |
1119 av_log(NULL,AV_LOG_ERROR,"COOKextradata\n"); | |
1120 av_log(NULL,AV_LOG_ERROR,"cookversion=%x\n",e->cookversion); | |
1121 if (e->cookversion > MONO_COOK2) { | |
1122 PRINT("js_subband_start",e->js_subband_start); | |
1123 PRINT("js_vlc_bits",e->js_vlc_bits); | |
1124 } | |
1125 av_log(NULL,AV_LOG_ERROR,"COOKContext\n"); | |
1126 PRINT("nb_channels",q->nb_channels); | |
1127 PRINT("bit_rate",q->bit_rate); | |
1128 PRINT("sample_rate",q->sample_rate); | |
1129 PRINT("samples_per_channel",q->samples_per_channel); | |
1130 PRINT("samples_per_frame",q->samples_per_frame); | |
1131 PRINT("subbands",q->subbands); | |
1132 PRINT("random_state",q->random_state); | |
1133 PRINT("mlt_size",q->mlt_size); | |
1134 PRINT("js_subband_start",q->js_subband_start); | |
1135 PRINT("numvector_bits",q->numvector_bits); | |
1136 PRINT("numvector_size",q->numvector_size); | |
1137 PRINT("total_subbands",q->total_subbands); | |
1138 PRINT("frame_reorder_counter",q->frame_reorder_counter); | |
1139 PRINT("frame_reorder_index_size",q->frame_reorder_index_size); | |
1140 } | |
1141 #endif | |
1142 /** | |
1143 * Cook initialization | |
1144 * | |
1145 * @param avctx pointer to the AVCodecContext | |
1146 */ | |
1147 | |
1148 static int cook_decode_init(AVCodecContext *avctx) | |
1149 { | |
1150 COOKextradata *e = avctx->extradata; | |
1151 COOKContext *q = avctx->priv_data; | |
1152 | |
1153 /* Take care of the codec specific extradata. */ | |
1154 if (avctx->extradata_size <= 0) { | |
1155 av_log(NULL,AV_LOG_ERROR,"Necessary extradata missing!\n"); | |
1156 return -1; | |
1157 } else { | |
1158 /* 8 for mono, 16 for stereo, ? for multichannel | |
1159 Swap to right endianness so we don't need to care later on. */ | |
1160 av_log(NULL,AV_LOG_DEBUG,"codecdata_length=%d\n",avctx->extradata_size); | |
1161 if (avctx->extradata_size >= 8){ | |
1162 e->cookversion = be2me_32(e->cookversion); | |
1163 e->samples_per_frame = be2me_16(e->samples_per_frame); | |
1164 e->subbands = be2me_16(e->subbands); | |
1165 } | |
1166 if (avctx->extradata_size >= 16){ | |
1167 e->js_subband_start = be2me_16(e->js_subband_start); | |
1168 e->js_vlc_bits = be2me_16(e->js_vlc_bits); | |
1169 } | |
1170 } | |
1171 | |
1172 /* Take data from the AVCodecContext (RM container). */ | |
1173 q->sample_rate = avctx->sample_rate; | |
1174 q->nb_channels = avctx->channels; | |
1175 q->bit_rate = avctx->bit_rate; | |
1176 | |
1177 /* Initialize state. */ | |
1178 q->random_state = 1; | |
1179 | |
1180 /* Initialize extradata related variables. */ | |
1181 q->samples_per_channel = e->samples_per_frame / q->nb_channels; | |
1182 q->samples_per_frame = e->samples_per_frame; | |
1183 q->subbands = e->subbands; | |
1184 q->bits_per_subpacket = avctx->block_align * 8; | |
1185 | |
1186 /* Initialize default data states. */ | |
1187 q->js_subband_start = 0; | |
1188 q->numvector_bits = 5; | |
1189 q->total_subbands = q->subbands; | |
1190 | |
1191 /* Initialize version-dependent variables */ | |
1192 av_log(NULL,AV_LOG_DEBUG,"e->cookversion=%x\n",e->cookversion); | |
1193 switch (e->cookversion) { | |
1194 case MONO_COOK1: | |
1195 if (q->nb_channels != 1) { | |
1196 av_log(NULL,AV_LOG_ERROR,"Container channels != 1, report sample!\n"); | |
1197 return -1; | |
1198 } | |
1199 av_log(NULL,AV_LOG_DEBUG,"MONO_COOK1\n"); | |
1200 break; | |
1201 case MONO_COOK2: | |
1202 if (q->nb_channels != 1) { | |
1203 q->joint_stereo = 0; | |
1204 av_log(NULL,AV_LOG_ERROR,"Non-joint-stereo files are not supported at the moment!\n"); | |
1205 return -1; | |
1206 } | |
1207 av_log(NULL,AV_LOG_DEBUG,"MONO_COOK2\n"); | |
1208 break; | |
1209 case JOINT_STEREO: | |
1210 if (q->nb_channels != 2) { | |
1211 av_log(NULL,AV_LOG_ERROR,"Container channels != 2, report sample!\n"); | |
1212 return -1; | |
1213 } | |
1214 av_log(NULL,AV_LOG_DEBUG,"JOINT_STEREO\n"); | |
1215 if (avctx->extradata_size >= 16){ | |
1216 q->total_subbands = q->subbands + e->js_subband_start; | |
1217 q->js_subband_start = e->js_subband_start; | |
1218 q->joint_stereo = 1; | |
1219 q->js_vlc_bits = e->js_vlc_bits; | |
1220 } | |
1221 if (q->samples_per_channel > 256) { | |
1222 q->numvector_bits++; // q->numvector_bits = 6 | |
1223 } | |
1224 if (q->samples_per_channel > 512) { | |
1225 q->numvector_bits++; // q->numvector_bits = 7 | |
1226 } | |
1227 break; | |
1228 case MC_COOK: | |
1229 av_log(NULL,AV_LOG_ERROR,"MC_COOK not supported!\n"); | |
1230 return -1; | |
1231 break; | |
1232 default: | |
1233 av_log(NULL,AV_LOG_ERROR,"Unknown Cook version, report sample!\n"); | |
1234 return -1; | |
1235 break; | |
1236 } | |
1237 | |
1238 /* Initialize variable relations */ | |
1239 q->mlt_size = q->samples_per_channel; | |
1240 q->numvector_size = (1 << q->numvector_bits); | |
1241 | |
1242 /* Generate tables */ | |
1243 init_rootpow2table(q); | |
1244 init_pow2table(q); | |
1245 init_gain_table(q); | |
1246 | |
1247 if (init_cook_vlc_tables(q) != 0) | |
1248 return -1; | |
1249 | |
1250 /* Pad the databuffer with FF_INPUT_BUFFER_PADDING_SIZE, | |
1251 this is for the bitstreamreader. */ | |
1252 if ((q->decoded_bytes_buffer = av_mallocz((avctx->block_align+(4-avctx->block_align%4) + FF_INPUT_BUFFER_PADDING_SIZE)*sizeof(uint8_t))) == NULL) | |
1253 return -1; | |
1254 | |
1255 q->decode_buf_ptr[0] = q->decode_buffer_1; | |
1256 q->decode_buf_ptr[1] = q->decode_buffer_2; | |
1257 q->decode_buf_ptr[2] = q->decode_buffer_3; | |
1258 q->decode_buf_ptr[3] = q->decode_buffer_4; | |
1259 | |
1260 q->previous_buffer_ptr[0] = q->mono_previous_buffer1; | |
1261 q->previous_buffer_ptr[1] = q->mono_previous_buffer2; | |
1262 | |
1263 memset(q->decode_buffer_1,0,1024*sizeof(float)); | |
1264 memset(q->decode_buffer_2,0,1024*sizeof(float)); | |
1265 memset(q->decode_buffer_3,0,1024*sizeof(float)); | |
1266 memset(q->decode_buffer_4,0,1024*sizeof(float)); | |
1267 | |
1268 /* Initialize transform. */ | |
1269 if ( init_cook_mlt(q) == 0 ) | |
1270 return -1; | |
1271 | |
1272 //dump_cook_context(q,e); | |
1273 return 0; | |
1274 } | |
1275 | |
1276 | |
1277 AVCodec cook_decoder = | |
1278 { | |
1279 .name = "cook", | |
1280 .type = CODEC_TYPE_AUDIO, | |
1281 .id = CODEC_ID_COOK, | |
1282 .priv_data_size = sizeof(COOKContext), | |
1283 .init = cook_decode_init, | |
1284 .close = cook_decode_close, | |
1285 .decode = cook_decode_frame, | |
1286 }; |