Mercurial > libavcodec.hg
annotate cook.c @ 4650:31bf54d9353d libavcodec
Replace custom modified discrete cosine transform with ffmpeg's own.
This does alter the decoded output, but not by much.
The new output is closer to that produced by Real's "official" decoder,
and the decoder runs slightly faster.
Patch by Ian Braithwaite ian at braithwaite dot dk
author | banan |
---|---|
date | Sun, 11 Mar 2007 20:30:06 +0000 |
parents | 33fc84eae7c3 |
children | 1d88da25349b |
rev | line source |
---|---|
2956 | 1 /* |
2 * COOK compatible decoder | |
3 * Copyright (c) 2003 Sascha Sommer | |
4 * Copyright (c) 2005 Benjamin Larsson | |
5 * | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3619
diff
changeset
|
6 * This file is part of FFmpeg. |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3619
diff
changeset
|
7 * |
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3619
diff
changeset
|
8 * FFmpeg is free software; you can redistribute it and/or |
2956 | 9 * modify it under the terms of the GNU Lesser General Public |
10 * License as published by the Free Software Foundation; either | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3619
diff
changeset
|
11 * version 2.1 of the License, or (at your option) any later version. |
2956 | 12 * |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3619
diff
changeset
|
13 * FFmpeg is distributed in the hope that it will be useful, |
2956 | 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 | |
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3619
diff
changeset
|
19 * License along with FFmpeg; if not, write to the Free Software |
3036
0b546eab515d
Update licensing information: The FSF changed postal address.
diego
parents:
3019
diff
changeset
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
2956 | 21 * |
22 */ | |
23 | |
24 /** | |
25 * @file cook.c | |
26 * Cook compatible decoder. | |
27 * This decoder handles RealNetworks, RealAudio G2 data. | |
28 * Cook is identified by the codec name cook in RM files. | |
29 * | |
30 * To use this decoder, a calling application must supply the extradata | |
31 * bytes provided from the RM container; 8+ bytes for mono streams and | |
32 * 16+ for stereo streams (maybe more). | |
33 * | |
34 * Codec technicalities (all this assume a buffer length of 1024): | |
35 * Cook works with several different techniques to achieve its compression. | |
36 * In the timedomain the buffer is divided into 8 pieces and quantized. If | |
37 * two neighboring pieces have different quantization index a smooth | |
38 * quantization curve is used to get a smooth overlap between the different | |
39 * pieces. | |
40 * To get to the transformdomain Cook uses a modulated lapped transform. | |
41 * The transform domain has 50 subbands with 20 elements each. This | |
42 * means only a maximum of 50*20=1000 coefficients are used out of the 1024 | |
43 * available. | |
44 */ | |
45 | |
46 #include <math.h> | |
47 #include <stddef.h> | |
48 #include <stdio.h> | |
49 | |
50 #include "avcodec.h" | |
51 #include "bitstream.h" | |
52 #include "dsputil.h" | |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
53 #include "common.h" |
4430
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
54 #include "bytestream.h" |
2956 | 55 |
56 #include "cookdata.h" | |
57 | |
58 /* the different Cook versions */ | |
4425 | 59 #define MONO 0x1000001 |
60 #define STEREO 0x1000002 | |
2956 | 61 #define JOINT_STEREO 0x1000003 |
62 #define MC_COOK 0x2000000 //multichannel Cook, not supported | |
63 | |
64 #define SUBBAND_SIZE 20 | |
65 //#define COOKDEBUG | |
66 | |
67 typedef struct { | |
4639 | 68 int *now; |
69 int *previous; | |
70 } cook_gains; | |
2956 | 71 |
72 typedef struct { | |
73 GetBitContext gb; | |
74 /* stream data */ | |
75 int nb_channels; | |
76 int joint_stereo; | |
77 int bit_rate; | |
78 int sample_rate; | |
79 int samples_per_channel; | |
80 int samples_per_frame; | |
81 int subbands; | |
3090 | 82 int log2_numvector_size; |
83 int numvector_size; //1 << log2_numvector_size; | |
2956 | 84 int js_subband_start; |
85 int total_subbands; | |
86 int num_vectors; | |
87 int bits_per_subpacket; | |
4430
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
88 int cookversion; |
2956 | 89 /* states */ |
90 int random_state; | |
91 | |
92 /* transform data */ | |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
93 MDCTContext mdct_ctx; |
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
94 DECLARE_ALIGNED_16(FFTSample, mdct_tmp[1024]); /* temporary storage for imlt */ |
2956 | 95 float* mlt_window; |
96 | |
97 /* gain buffers */ | |
4639 | 98 cook_gains gains1; |
99 cook_gains gains2; | |
100 int gain_1[9]; | |
101 int gain_2[9]; | |
102 int gain_3[9]; | |
103 int gain_4[9]; | |
2956 | 104 |
105 /* VLC data */ | |
106 int js_vlc_bits; | |
107 VLC envelope_quant_index[13]; | |
108 VLC sqvh[7]; //scalar quantization | |
109 VLC ccpl; //channel coupling | |
110 | |
111 /* generatable tables and related variables */ | |
112 int gain_size_factor; | |
113 float gain_table[23]; | |
114 float pow2tab[127]; | |
115 float rootpow2tab[127]; | |
116 | |
117 /* data buffers */ | |
118 | |
119 uint8_t* decoded_bytes_buffer; | |
4542 | 120 DECLARE_ALIGNED_16(float,mono_mdct_output[2048]); |
2956 | 121 float mono_previous_buffer1[1024]; |
122 float mono_previous_buffer2[1024]; | |
123 float decode_buffer_1[1024]; | |
124 float decode_buffer_2[1024]; | |
125 } COOKContext; | |
126 | |
127 /* debug functions */ | |
128 | |
129 #ifdef COOKDEBUG | |
130 static void dump_float_table(float* table, int size, int delimiter) { | |
131 int i=0; | |
132 av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i); | |
133 for (i=0 ; i<size ; i++) { | |
134 av_log(NULL, AV_LOG_ERROR, "%5.1f, ", table[i]); | |
135 if ((i+1)%delimiter == 0) av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i+1); | |
136 } | |
137 } | |
138 | |
139 static void dump_int_table(int* table, int size, int delimiter) { | |
140 int i=0; | |
141 av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i); | |
142 for (i=0 ; i<size ; i++) { | |
143 av_log(NULL, AV_LOG_ERROR, "%d, ", table[i]); | |
144 if ((i+1)%delimiter == 0) av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i+1); | |
145 } | |
146 } | |
147 | |
148 static void dump_short_table(short* table, int size, int delimiter) { | |
149 int i=0; | |
150 av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i); | |
151 for (i=0 ; i<size ; i++) { | |
152 av_log(NULL, AV_LOG_ERROR, "%d, ", table[i]); | |
153 if ((i+1)%delimiter == 0) av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i+1); | |
154 } | |
155 } | |
156 | |
157 #endif | |
158 | |
159 /*************** init functions ***************/ | |
160 | |
161 /* table generator */ | |
162 static void init_pow2table(COOKContext *q){ | |
163 int i; | |
164 q->pow2tab[63] = 1.0; | |
165 for (i=1 ; i<64 ; i++){ | |
3106
9cbd63cca826
Don't use pow/powf functions where we just need integer arithmetic.
al
parents:
3091
diff
changeset
|
166 q->pow2tab[63+i]=(float)((uint64_t)1<<i); |
9cbd63cca826
Don't use pow/powf functions where we just need integer arithmetic.
al
parents:
3091
diff
changeset
|
167 q->pow2tab[63-i]=1.0/(float)((uint64_t)1<<i); |
2956 | 168 } |
169 } | |
170 | |
171 /* table generator */ | |
172 static void init_rootpow2table(COOKContext *q){ | |
173 int i; | |
174 q->rootpow2tab[63] = 1.0; | |
175 for (i=1 ; i<64 ; i++){ | |
3106
9cbd63cca826
Don't use pow/powf functions where we just need integer arithmetic.
al
parents:
3091
diff
changeset
|
176 q->rootpow2tab[63+i]=sqrt((float)((uint64_t)1<<i)); |
9cbd63cca826
Don't use pow/powf functions where we just need integer arithmetic.
al
parents:
3091
diff
changeset
|
177 q->rootpow2tab[63-i]=sqrt(1.0/(float)((uint64_t)1<<i)); |
2956 | 178 } |
179 } | |
180 | |
181 /* table generator */ | |
182 static void init_gain_table(COOKContext *q) { | |
183 int i; | |
184 q->gain_size_factor = q->samples_per_channel/8; | |
185 for (i=0 ; i<23 ; i++) { | |
186 q->gain_table[i] = pow((double)q->pow2tab[i+52] , | |
187 (1.0/(double)q->gain_size_factor)); | |
188 } | |
189 } | |
190 | |
191 | |
192 static int init_cook_vlc_tables(COOKContext *q) { | |
193 int i, result; | |
194 | |
195 result = 0; | |
196 for (i=0 ; i<13 ; i++) { | |
197 result &= init_vlc (&q->envelope_quant_index[i], 9, 24, | |
198 envelope_quant_index_huffbits[i], 1, 1, | |
199 envelope_quant_index_huffcodes[i], 2, 2, 0); | |
200 } | |
201 av_log(NULL,AV_LOG_DEBUG,"sqvh VLC init\n"); | |
202 for (i=0 ; i<7 ; i++) { | |
203 result &= init_vlc (&q->sqvh[i], vhvlcsize_tab[i], vhsize_tab[i], | |
204 cvh_huffbits[i], 1, 1, | |
205 cvh_huffcodes[i], 2, 2, 0); | |
206 } | |
207 | |
208 if (q->nb_channels==2 && q->joint_stereo==1){ | |
209 result &= init_vlc (&q->ccpl, 6, (1<<q->js_vlc_bits)-1, | |
210 ccpl_huffbits[q->js_vlc_bits-2], 1, 1, | |
211 ccpl_huffcodes[q->js_vlc_bits-2], 2, 2, 0); | |
212 av_log(NULL,AV_LOG_DEBUG,"Joint-stereo VLC used.\n"); | |
213 } | |
214 | |
215 av_log(NULL,AV_LOG_DEBUG,"VLC tables initialized.\n"); | |
216 return result; | |
217 } | |
218 | |
219 static int init_cook_mlt(COOKContext *q) { | |
220 int j; | |
221 float alpha; | |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
222 int mlt_size = q->samples_per_channel; |
2956 | 223 |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
224 if ((q->mlt_window = av_malloc(sizeof(float)*mlt_size)) == 0) |
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
225 return -1; |
2956 | 226 |
227 /* Initialize the MLT window: simple sine window. */ | |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
228 alpha = M_PI / (2.0 * (float)mlt_size); |
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
229 for(j=0 ; j<mlt_size ; j++) |
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
230 q->mlt_window[j] = sin((j + 0.5) * alpha) * sqrt(2.0 / q->samples_per_channel); |
2956 | 231 |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
232 /* Initialize the MDCT. */ |
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
233 if (ff_mdct_init(&q->mdct_ctx, av_log2(mlt_size)+1, 1)) { |
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
234 av_free(q->mlt_window); |
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
235 return -1; |
2956 | 236 } |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
237 av_log(NULL,AV_LOG_DEBUG,"MDCT initialized, order = %d.\n", |
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
238 av_log2(mlt_size)+1); |
2956 | 239 |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
240 return 0; |
2956 | 241 } |
242 | |
243 /*************** init functions end ***********/ | |
244 | |
245 /** | |
246 * Cook indata decoding, every 32 bits are XORed with 0x37c511f2. | |
247 * Why? No idea, some checksum/error detection method maybe. | |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
248 * |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
249 * Out buffer size: extra bytes are needed to cope with |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
250 * padding/missalignment. |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
251 * Subpackets passed to the decoder can contain two, consecutive |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
252 * half-subpackets, of identical but arbitrary size. |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
253 * 1234 1234 1234 1234 extraA extraB |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
254 * Case 1: AAAA BBBB 0 0 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
255 * Case 2: AAAA ABBB BB-- 3 3 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
256 * Case 3: AAAA AABB BBBB 2 2 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
257 * Case 4: AAAA AAAB BBBB BB-- 1 5 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
258 * |
2956 | 259 * Nice way to waste CPU cycles. |
260 * | |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
261 * @param inbuffer pointer to byte array of indata |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
262 * @param out pointer to byte array of outdata |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
263 * @param bytes number of bytes |
2956 | 264 */ |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
265 #define DECODE_BYTES_PAD1(bytes) (3 - ((bytes)+3) % 4) |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
266 #define DECODE_BYTES_PAD2(bytes) ((bytes) % 4 + DECODE_BYTES_PAD1(2 * (bytes))) |
2956 | 267 |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
268 static inline int decode_bytes(uint8_t* inbuffer, uint8_t* out, int bytes){ |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
269 int i, off; |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
270 uint32_t c; |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
271 uint32_t* buf; |
2956 | 272 uint32_t* obuf = (uint32_t*) out; |
273 /* FIXME: 64 bit platforms would be able to do 64 bits at a time. | |
274 * I'm too lazy though, should be something like | |
275 * for(i=0 ; i<bitamount/64 ; i++) | |
276 * (int64_t)out[i] = 0x37c511f237c511f2^be2me_64(int64_t)in[i]); | |
277 * Buffer alignment needs to be checked. */ | |
278 | |
4429 | 279 off = (int)((long)inbuffer & 3); |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
280 buf = (uint32_t*) (inbuffer - off); |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
281 c = be2me_32((0x37c511f2 >> (off*8)) | (0x37c511f2 << (32-(off*8)))); |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
282 bytes += 3 + off; |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
283 for (i = 0; i < bytes/4; i++) |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
284 obuf[i] = c ^ buf[i]; |
2956 | 285 |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
286 return off; |
2956 | 287 } |
288 | |
289 /** | |
290 * Cook uninit | |
291 */ | |
292 | |
293 static int cook_decode_close(AVCodecContext *avctx) | |
294 { | |
295 int i; | |
296 COOKContext *q = avctx->priv_data; | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
297 av_log(avctx,AV_LOG_DEBUG, "Deallocating memory.\n"); |
2956 | 298 |
299 /* Free allocated memory buffers. */ | |
300 av_free(q->mlt_window); | |
301 av_free(q->decoded_bytes_buffer); | |
302 | |
303 /* Free the transform. */ | |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
304 ff_mdct_end(&q->mdct_ctx); |
2956 | 305 |
306 /* Free the VLC tables. */ | |
307 for (i=0 ; i<13 ; i++) { | |
308 free_vlc(&q->envelope_quant_index[i]); | |
309 } | |
310 for (i=0 ; i<7 ; i++) { | |
311 free_vlc(&q->sqvh[i]); | |
312 } | |
313 if(q->nb_channels==2 && q->joint_stereo==1 ){ | |
314 free_vlc(&q->ccpl); | |
315 } | |
316 | |
317 av_log(NULL,AV_LOG_DEBUG,"Memory deallocated.\n"); | |
318 | |
319 return 0; | |
320 } | |
321 | |
322 /** | |
4639 | 323 * Fill the gain array for the timedomain quantization. |
2956 | 324 * |
325 * @param q pointer to the COOKContext | |
4639 | 326 * @param gaininfo[9] array of gain indices |
2956 | 327 */ |
328 | |
4639 | 329 static void decode_gain_info(GetBitContext *gb, int *gaininfo) |
330 { | |
331 int i, n; | |
2956 | 332 |
333 while (get_bits1(gb)) {} | |
4639 | 334 n = get_bits_count(gb) - 1; //amount of elements*2 to update |
2956 | 335 |
4639 | 336 i = 0; |
337 while (n--) { | |
338 int index = get_bits(gb, 3); | |
339 int gain = get_bits1(gb) ? get_bits(gb, 4) - 7 : -1; | |
340 | |
341 while (i <= index) gaininfo[i++] = gain; | |
2956 | 342 } |
4639 | 343 while (i <= 8) gaininfo[i++] = 0; |
2956 | 344 } |
345 | |
346 /** | |
347 * Create the quant index table needed for the envelope. | |
348 * | |
349 * @param q pointer to the COOKContext | |
350 * @param quant_index_table pointer to the array | |
351 */ | |
352 | |
353 static void decode_envelope(COOKContext *q, int* quant_index_table) { | |
354 int i,j, vlc_index; | |
355 int bitbias; | |
356 | |
357 bitbias = get_bits_count(&q->gb); | |
358 quant_index_table[0]= get_bits(&q->gb,6) - 6; //This is used later in categorize | |
359 | |
360 for (i=1 ; i < q->total_subbands ; i++){ | |
361 vlc_index=i; | |
362 if (i >= q->js_subband_start * 2) { | |
363 vlc_index-=q->js_subband_start; | |
364 } else { | |
365 vlc_index/=2; | |
366 if(vlc_index < 1) vlc_index = 1; | |
367 } | |
368 if (vlc_index>13) vlc_index = 13; //the VLC tables >13 are identical to No. 13 | |
369 | |
370 j = get_vlc2(&q->gb, q->envelope_quant_index[vlc_index-1].table, | |
371 q->envelope_quant_index[vlc_index-1].bits,2); | |
372 quant_index_table[i] = quant_index_table[i-1] + j - 12; //differential encoding | |
373 } | |
374 } | |
375 | |
376 /** | |
377 * Create the quant value table. | |
378 * | |
379 * @param q pointer to the COOKContext | |
380 * @param quant_value_table pointer to the array | |
381 */ | |
382 | |
383 static void inline dequant_envelope(COOKContext *q, int* quant_index_table, | |
384 float* quant_value_table){ | |
385 | |
386 int i; | |
387 for(i=0 ; i < q->total_subbands ; i++){ | |
388 quant_value_table[i] = q->rootpow2tab[quant_index_table[i]+63]; | |
389 } | |
390 } | |
391 | |
392 /** | |
393 * Calculate the category and category_index vector. | |
394 * | |
395 * @param q pointer to the COOKContext | |
396 * @param quant_index_table pointer to the array | |
397 * @param category pointer to the category array | |
398 * @param category_index pointer to the category_index array | |
399 */ | |
400 | |
401 static void categorize(COOKContext *q, int* quant_index_table, | |
402 int* category, int* category_index){ | |
403 int exp_idx, bias, tmpbias, bits_left, num_bits, index, v, i, j; | |
404 int exp_index2[102]; | |
405 int exp_index1[102]; | |
406 | |
407 int tmp_categorize_array1[128]; | |
408 int tmp_categorize_array1_idx=0; | |
409 int tmp_categorize_array2[128]; | |
410 int tmp_categorize_array2_idx=0; | |
411 int category_index_size=0; | |
412 | |
413 bits_left = q->bits_per_subpacket - get_bits_count(&q->gb); | |
414 | |
415 if(bits_left > q->samples_per_channel) { | |
416 bits_left = q->samples_per_channel + | |
417 ((bits_left - q->samples_per_channel)*5)/8; | |
418 //av_log(NULL, AV_LOG_ERROR, "bits_left = %d\n",bits_left); | |
419 } | |
420 | |
421 memset(&exp_index1,0,102*sizeof(int)); | |
422 memset(&exp_index2,0,102*sizeof(int)); | |
423 memset(&tmp_categorize_array1,0,128*sizeof(int)); | |
424 memset(&tmp_categorize_array2,0,128*sizeof(int)); | |
425 | |
426 bias=-32; | |
427 | |
428 /* Estimate bias. */ | |
429 for (i=32 ; i>0 ; i=i/2){ | |
430 num_bits = 0; | |
431 index = 0; | |
432 for (j=q->total_subbands ; j>0 ; j--){ | |
433 exp_idx = (i - quant_index_table[index] + bias) / 2; | |
434 if (exp_idx<0){ | |
435 exp_idx=0; | |
436 } else if(exp_idx >7) { | |
437 exp_idx=7; | |
438 } | |
439 index++; | |
440 num_bits+=expbits_tab[exp_idx]; | |
441 } | |
442 if(num_bits >= bits_left - 32){ | |
443 bias+=i; | |
444 } | |
445 } | |
446 | |
447 /* Calculate total number of bits. */ | |
448 num_bits=0; | |
449 for (i=0 ; i<q->total_subbands ; i++) { | |
450 exp_idx = (bias - quant_index_table[i]) / 2; | |
451 if (exp_idx<0) { | |
452 exp_idx=0; | |
453 } else if(exp_idx >7) { | |
454 exp_idx=7; | |
455 } | |
456 num_bits += expbits_tab[exp_idx]; | |
457 exp_index1[i] = exp_idx; | |
458 exp_index2[i] = exp_idx; | |
459 } | |
460 tmpbias = bias = num_bits; | |
461 | |
462 for (j = 1 ; j < q->numvector_size ; j++) { | |
463 if (tmpbias + bias > 2*bits_left) { /* ---> */ | |
464 int max = -999999; | |
465 index=-1; | |
466 for (i=0 ; i<q->total_subbands ; i++){ | |
467 if (exp_index1[i] < 7) { | |
468 v = (-2*exp_index1[i]) - quant_index_table[i] - 32; | |
469 if ( v >= max) { | |
470 max = v; | |
471 index = i; | |
472 } | |
473 } | |
474 } | |
475 if(index==-1)break; | |
476 tmp_categorize_array1[tmp_categorize_array1_idx++] = index; | |
477 tmpbias -= expbits_tab[exp_index1[index]] - | |
478 expbits_tab[exp_index1[index]+1]; | |
479 ++exp_index1[index]; | |
480 } else { /* <--- */ | |
481 int min = 999999; | |
482 index=-1; | |
483 for (i=0 ; i<q->total_subbands ; i++){ | |
484 if(exp_index2[i] > 0){ | |
485 v = (-2*exp_index2[i])-quant_index_table[i]; | |
486 if ( v < min) { | |
487 min = v; | |
488 index = i; | |
489 } | |
490 } | |
491 } | |
492 if(index == -1)break; | |
493 tmp_categorize_array2[tmp_categorize_array2_idx++] = index; | |
494 tmpbias -= expbits_tab[exp_index2[index]] - | |
495 expbits_tab[exp_index2[index]-1]; | |
496 --exp_index2[index]; | |
497 } | |
498 } | |
499 | |
500 for(i=0 ; i<q->total_subbands ; i++) | |
501 category[i] = exp_index2[i]; | |
502 | |
503 /* Concatenate the two arrays. */ | |
504 for(i=tmp_categorize_array2_idx-1 ; i >= 0; i--) | |
505 category_index[category_index_size++] = tmp_categorize_array2[i]; | |
506 | |
507 for(i=0;i<tmp_categorize_array1_idx;i++) | |
508 category_index[category_index_size++ ] = tmp_categorize_array1[i]; | |
509 | |
510 /* FIXME: mc_sich_ra8_20.rm triggers this, not sure with what we | |
511 should fill the remaining bytes. */ | |
512 for(i=category_index_size;i<q->numvector_size;i++) | |
513 category_index[i]=0; | |
514 | |
515 } | |
516 | |
517 | |
518 /** | |
519 * Expand the category vector. | |
520 * | |
521 * @param q pointer to the COOKContext | |
522 * @param category pointer to the category array | |
523 * @param category_index pointer to the category_index array | |
524 */ | |
525 | |
526 static void inline expand_category(COOKContext *q, int* category, | |
527 int* category_index){ | |
528 int i; | |
529 for(i=0 ; i<q->num_vectors ; i++){ | |
530 ++category[category_index[i]]; | |
531 } | |
532 } | |
533 | |
534 /** | |
535 * The real requantization of the mltcoefs | |
536 * | |
537 * @param q pointer to the COOKContext | |
538 * @param index index | |
539 * @param band current subband | |
540 * @param quant_value_table pointer to the array | |
541 * @param subband_coef_index array of indexes to quant_centroid_tab | |
542 * @param subband_coef_noise use random noise instead of predetermined value | |
543 * @param mlt_buffer pointer to the mlt buffer | |
544 */ | |
545 | |
546 | |
547 static void scalar_dequant(COOKContext *q, int index, int band, | |
548 float* quant_value_table, int* subband_coef_index, | |
549 int* subband_coef_noise, float* mlt_buffer){ | |
550 int i; | |
551 float f1; | |
552 | |
553 for(i=0 ; i<SUBBAND_SIZE ; i++) { | |
554 if (subband_coef_index[i]) { | |
555 if (subband_coef_noise[i]) { | |
556 f1 = -quant_centroid_tab[index][subband_coef_index[i]]; | |
557 } else { | |
558 f1 = quant_centroid_tab[index][subband_coef_index[i]]; | |
559 } | |
560 } else { | |
561 /* noise coding if subband_coef_noise[i] == 0 */ | |
562 q->random_state = q->random_state * 214013 + 2531011; //typical RNG numbers | |
563 f1 = randsign[(q->random_state/0x1000000)&1] * dither_tab[index]; //>>31 | |
564 } | |
565 mlt_buffer[band*20+ i] = f1 * quant_value_table[band]; | |
566 } | |
567 } | |
568 /** | |
569 * Unpack the subband_coef_index and subband_coef_noise vectors. | |
570 * | |
571 * @param q pointer to the COOKContext | |
572 * @param category pointer to the category array | |
573 * @param subband_coef_index array of indexes to quant_centroid_tab | |
574 * @param subband_coef_noise use random noise instead of predetermined value | |
575 */ | |
576 | |
577 static int unpack_SQVH(COOKContext *q, int category, int* subband_coef_index, | |
578 int* subband_coef_noise) { | |
579 int i,j; | |
580 int vlc, vd ,tmp, result; | |
581 int ub; | |
582 int cb; | |
583 | |
584 vd = vd_tab[category]; | |
585 result = 0; | |
586 for(i=0 ; i<vpr_tab[category] ; i++){ | |
587 ub = get_bits_count(&q->gb); | |
588 vlc = get_vlc2(&q->gb, q->sqvh[category].table, q->sqvh[category].bits, 3); | |
589 cb = get_bits_count(&q->gb); | |
590 if (q->bits_per_subpacket < get_bits_count(&q->gb)){ | |
591 vlc = 0; | |
592 result = 1; | |
593 } | |
594 for(j=vd-1 ; j>=0 ; j--){ | |
595 tmp = (vlc * invradix_tab[category])/0x100000; | |
596 subband_coef_index[vd*i+j] = vlc - tmp * (kmax_tab[category]+1); | |
597 vlc = tmp; | |
598 } | |
599 for(j=0 ; j<vd ; j++){ | |
600 if (subband_coef_index[i*vd + j]) { | |
601 if(get_bits_count(&q->gb) < q->bits_per_subpacket){ | |
602 subband_coef_noise[i*vd+j] = get_bits1(&q->gb); | |
603 } else { | |
604 result=1; | |
605 subband_coef_noise[i*vd+j]=0; | |
606 } | |
607 } else { | |
608 subband_coef_noise[i*vd+j]=0; | |
609 } | |
610 } | |
611 } | |
612 return result; | |
613 } | |
614 | |
615 | |
616 /** | |
617 * Fill the mlt_buffer with mlt coefficients. | |
618 * | |
619 * @param q pointer to the COOKContext | |
620 * @param category pointer to the category array | |
621 * @param quant_value_table pointer to the array | |
622 * @param mlt_buffer pointer to mlt coefficients | |
623 */ | |
624 | |
625 | |
626 static void decode_vectors(COOKContext* q, int* category, | |
627 float* quant_value_table, float* mlt_buffer){ | |
628 /* A zero in this table means that the subband coefficient is | |
629 random noise coded. */ | |
630 int subband_coef_noise[SUBBAND_SIZE]; | |
631 /* A zero in this table means that the subband coefficient is a | |
632 positive multiplicator. */ | |
633 int subband_coef_index[SUBBAND_SIZE]; | |
634 int band, j; | |
635 int index=0; | |
636 | |
637 for(band=0 ; band<q->total_subbands ; band++){ | |
638 index = category[band]; | |
639 if(category[band] < 7){ | |
640 if(unpack_SQVH(q, category[band], subband_coef_index, subband_coef_noise)){ | |
641 index=7; | |
642 for(j=0 ; j<q->total_subbands ; j++) category[band+j]=7; | |
643 } | |
644 } | |
645 if(index==7) { | |
646 memset(subband_coef_index, 0, sizeof(subband_coef_index)); | |
647 memset(subband_coef_noise, 0, sizeof(subband_coef_noise)); | |
648 } | |
649 scalar_dequant(q, index, band, quant_value_table, subband_coef_index, | |
650 subband_coef_noise, mlt_buffer); | |
651 } | |
652 | |
653 if(q->total_subbands*SUBBAND_SIZE >= q->samples_per_channel){ | |
654 return; | |
655 } | |
656 } | |
657 | |
658 | |
659 /** | |
660 * function for decoding mono data | |
661 * | |
662 * @param q pointer to the COOKContext | |
663 * @param mlt_buffer1 pointer to left channel mlt coefficients | |
664 * @param mlt_buffer2 pointer to right channel mlt coefficients | |
665 */ | |
666 | |
667 static void mono_decode(COOKContext *q, float* mlt_buffer) { | |
668 | |
669 int category_index[128]; | |
670 float quant_value_table[102]; | |
671 int quant_index_table[102]; | |
672 int category[128]; | |
673 | |
674 memset(&category, 0, 128*sizeof(int)); | |
675 memset(&quant_value_table, 0, 102*sizeof(int)); | |
676 memset(&category_index, 0, 128*sizeof(int)); | |
677 | |
678 decode_envelope(q, quant_index_table); | |
3090 | 679 q->num_vectors = get_bits(&q->gb,q->log2_numvector_size); |
2956 | 680 dequant_envelope(q, quant_index_table, quant_value_table); |
681 categorize(q, quant_index_table, category, category_index); | |
682 expand_category(q, category, category_index); | |
683 decode_vectors(q, category, quant_value_table, mlt_buffer); | |
684 } | |
685 | |
686 | |
687 /** | |
688 * The modulated lapped transform, this takes transform coefficients | |
689 * and transforms them into timedomain samples. This is done through | |
690 * an FFT-based algorithm with pre- and postrotation steps. | |
691 * A window and reorder step is also included. | |
692 * | |
693 * @param q pointer to the COOKContext | |
694 * @param inbuffer pointer to the mltcoefficients | |
695 * @param outbuffer pointer to the timedomain buffer | |
696 * @param mlt_tmp pointer to temporary storage space | |
697 */ | |
698 | |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
699 static void cook_imlt(COOKContext *q, float* inbuffer, float* outbuffer) |
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
700 { |
2956 | 701 int i; |
702 | |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
703 q->mdct_ctx.fft.imdct_calc(&q->mdct_ctx, outbuffer, inbuffer, q->mdct_tmp); |
2956 | 704 |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
705 for(i = 0; i < q->samples_per_channel; i++){ |
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
706 float tmp = outbuffer[i]; |
2956 | 707 |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
708 outbuffer[i] = q->mlt_window[i] * outbuffer[q->samples_per_channel + i]; |
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
709 outbuffer[q->samples_per_channel + i] = q->mlt_window[q->samples_per_channel - 1 - i] * -tmp; |
2956 | 710 } |
711 } | |
712 | |
713 | |
714 /** | |
715 * the actual requantization of the timedomain samples | |
716 * | |
717 * @param q pointer to the COOKContext | |
718 * @param buffer pointer to the timedomain buffer | |
719 * @param gain_index index for the block multiplier | |
720 * @param gain_index_next index for the next block multiplier | |
721 */ | |
722 | |
723 static void interpolate(COOKContext *q, float* buffer, | |
724 int gain_index, int gain_index_next){ | |
725 int i; | |
726 float fc1, fc2; | |
727 fc1 = q->pow2tab[gain_index+63]; | |
728 | |
729 if(gain_index == gain_index_next){ //static gain | |
730 for(i=0 ; i<q->gain_size_factor ; i++){ | |
731 buffer[i]*=fc1; | |
732 } | |
733 return; | |
734 } else { //smooth gain | |
735 fc2 = q->gain_table[11 + (gain_index_next-gain_index)]; | |
736 for(i=0 ; i<q->gain_size_factor ; i++){ | |
737 buffer[i]*=fc1; | |
738 fc1*=fc2; | |
739 } | |
740 return; | |
741 } | |
742 } | |
743 | |
744 | |
745 /** | |
746 * mlt overlapping and buffer management | |
747 * | |
748 * @param q pointer to the COOKContext | |
4639 | 749 * @param gains_ptr current and previous gains |
2956 | 750 * @param previous_buffer pointer to the previous buffer to be used for overlapping |
751 */ | |
752 | |
4639 | 753 static void gain_compensate(COOKContext *q, cook_gains *gains_ptr, |
754 float* previous_buffer) | |
755 { | |
756 const float fc = q->pow2tab[gains_ptr->previous[0] + 63]; | |
757 float *buffer = q->mono_mdct_output; | |
2956 | 758 int i; |
4639 | 759 |
760 /* Overlap with the previous block. */ | |
761 for(i=0 ; i<q->samples_per_channel ; i++) { | |
762 buffer[i] *= fc; | |
763 buffer[i] += previous_buffer[i]; | |
2956 | 764 } |
765 | |
4639 | 766 /* Apply gain profile */ |
767 for (i = 0; i < 8; i++) { | |
768 if (gains_ptr->now[i] || gains_ptr->now[i + 1]) | |
769 interpolate(q, &buffer[q->gain_size_factor * i], | |
770 gains_ptr->now[i], gains_ptr->now[i + 1]); | |
771 } | |
2956 | 772 |
773 /* Save away the current to be previous block. */ | |
774 memcpy(previous_buffer, buffer+q->samples_per_channel, | |
775 sizeof(float)*q->samples_per_channel); | |
776 } | |
777 | |
778 | |
779 /** | |
780 * function for getting the jointstereo coupling information | |
781 * | |
782 * @param q pointer to the COOKContext | |
783 * @param decouple_tab decoupling array | |
784 * | |
785 */ | |
786 | |
787 static void decouple_info(COOKContext *q, int* decouple_tab){ | |
788 int length, i; | |
789 | |
790 if(get_bits1(&q->gb)) { | |
791 if(cplband[q->js_subband_start] > cplband[q->subbands-1]) return; | |
792 | |
793 length = cplband[q->subbands-1] - cplband[q->js_subband_start] + 1; | |
794 for (i=0 ; i<length ; i++) { | |
795 decouple_tab[cplband[q->js_subband_start] + i] = get_vlc2(&q->gb, q->ccpl.table, q->ccpl.bits, 2); | |
796 } | |
797 return; | |
798 } | |
799 | |
800 if(cplband[q->js_subband_start] > cplband[q->subbands-1]) return; | |
801 | |
802 length = cplband[q->subbands-1] - cplband[q->js_subband_start] + 1; | |
803 for (i=0 ; i<length ; i++) { | |
804 decouple_tab[cplband[q->js_subband_start] + i] = get_bits(&q->gb, q->js_vlc_bits); | |
805 } | |
806 return; | |
807 } | |
808 | |
809 | |
810 /** | |
811 * function for decoding joint stereo data | |
812 * | |
813 * @param q pointer to the COOKContext | |
814 * @param mlt_buffer1 pointer to left channel mlt coefficients | |
815 * @param mlt_buffer2 pointer to right channel mlt coefficients | |
816 */ | |
817 | |
818 static void joint_decode(COOKContext *q, float* mlt_buffer1, | |
819 float* mlt_buffer2) { | |
820 int i,j; | |
821 int decouple_tab[SUBBAND_SIZE]; | |
3009
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
822 float decode_buffer[1060]; |
2956 | 823 int idx, cpl_tmp,tmp_idx; |
824 float f1,f2; | |
825 float* cplscale; | |
826 | |
827 memset(decouple_tab, 0, sizeof(decouple_tab)); | |
828 memset(decode_buffer, 0, sizeof(decode_buffer)); | |
829 | |
830 /* Make sure the buffers are zeroed out. */ | |
831 memset(mlt_buffer1,0, 1024*sizeof(float)); | |
832 memset(mlt_buffer2,0, 1024*sizeof(float)); | |
833 decouple_info(q, decouple_tab); | |
834 mono_decode(q, decode_buffer); | |
835 | |
836 /* The two channels are stored interleaved in decode_buffer. */ | |
837 for (i=0 ; i<q->js_subband_start ; i++) { | |
838 for (j=0 ; j<SUBBAND_SIZE ; j++) { | |
839 mlt_buffer1[i*20+j] = decode_buffer[i*40+j]; | |
840 mlt_buffer2[i*20+j] = decode_buffer[i*40+20+j]; | |
841 } | |
842 } | |
843 | |
844 /* When we reach js_subband_start (the higher frequencies) | |
845 the coefficients are stored in a coupling scheme. */ | |
846 idx = (1 << q->js_vlc_bits) - 1; | |
3009
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
847 for (i=q->js_subband_start ; i<q->subbands ; i++) { |
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
848 cpl_tmp = cplband[i]; |
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
849 idx -=decouple_tab[cpl_tmp]; |
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
850 cplscale = (float*)cplscales[q->js_vlc_bits-2]; //choose decoupler table |
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
851 f1 = cplscale[decouple_tab[cpl_tmp]]; |
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
852 f2 = cplscale[idx-1]; |
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
853 for (j=0 ; j<SUBBAND_SIZE ; j++) { |
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
854 tmp_idx = ((q->js_subband_start + i)*20)+j; |
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
855 mlt_buffer1[20*i + j] = f1 * decode_buffer[tmp_idx]; |
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
856 mlt_buffer2[20*i + j] = f2 * decode_buffer[tmp_idx]; |
2956 | 857 } |
3009
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
858 idx = (1 << q->js_vlc_bits) - 1; |
2956 | 859 } |
860 } | |
861 | |
862 /** | |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
863 * First part of subpacket decoding: |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
864 * decode raw stream bytes and read gain info. |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
865 * |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
866 * @param q pointer to the COOKContext |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
867 * @param inbuffer pointer to raw stream data |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
868 * @param gain_ptr array of current/prev gain pointers |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
869 */ |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
870 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
871 static inline void |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
872 decode_bytes_and_gain(COOKContext *q, uint8_t *inbuffer, |
4639 | 873 cook_gains *gains_ptr) |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
874 { |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
875 int offset; |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
876 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
877 offset = decode_bytes(inbuffer, q->decoded_bytes_buffer, |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
878 q->bits_per_subpacket/8); |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
879 init_get_bits(&q->gb, q->decoded_bytes_buffer + offset, |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
880 q->bits_per_subpacket); |
4639 | 881 decode_gain_info(&q->gb, gains_ptr->now); |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
882 |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
883 /* Swap current and previous gains */ |
4639 | 884 FFSWAP(int *, gains_ptr->now, gains_ptr->previous); |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
885 } |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
886 |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
887 /** |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
888 * Final part of subpacket decoding: |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
889 * Apply modulated lapped transform, gain compensation, |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
890 * clip and convert to integer. |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
891 * |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
892 * @param q pointer to the COOKContext |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
893 * @param decode_buffer pointer to the mlt coefficients |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
894 * @param gain_ptr array of current/prev gain pointers |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
895 * @param previous_buffer pointer to the previous buffer to be used for overlapping |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
896 * @param out pointer to the output buffer |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
897 * @param chan 0: left or single channel, 1: right channel |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
898 */ |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
899 |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
900 static inline void |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
901 mlt_compensate_output(COOKContext *q, float *decode_buffer, |
4639 | 902 cook_gains *gains, float *previous_buffer, |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
903 int16_t *out, int chan) |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
904 { |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
905 int j; |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
906 |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
907 cook_imlt(q, decode_buffer, q->mono_mdct_output); |
4639 | 908 gain_compensate(q, gains, previous_buffer); |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
909 |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
910 /* Clip and convert floats to 16 bits. |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
911 */ |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
912 for (j = 0; j < q->samples_per_channel; j++) { |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
913 out[chan + q->nb_channels * j] = |
4594 | 914 av_clip(lrintf(q->mono_mdct_output[j]), -32768, 32767); |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
915 } |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
916 } |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
917 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
918 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
919 /** |
2956 | 920 * Cook subpacket decoding. This function returns one decoded subpacket, |
921 * usually 1024 samples per channel. | |
922 * | |
923 * @param q pointer to the COOKContext | |
924 * @param inbuffer pointer to the inbuffer | |
925 * @param sub_packet_size subpacket size | |
926 * @param outbuffer pointer to the outbuffer | |
927 */ | |
928 | |
929 | |
930 static int decode_subpacket(COOKContext *q, uint8_t *inbuffer, | |
931 int sub_packet_size, int16_t *outbuffer) { | |
932 /* packet dump */ | |
933 // for (i=0 ; i<sub_packet_size ; i++) { | |
934 // av_log(NULL, AV_LOG_ERROR, "%02x", inbuffer[i]); | |
935 // } | |
936 // av_log(NULL, AV_LOG_ERROR, "\n"); | |
937 | |
4639 | 938 decode_bytes_and_gain(q, inbuffer, &q->gains1); |
2956 | 939 |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
940 if (q->joint_stereo) { |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
941 joint_decode(q, q->decode_buffer_1, q->decode_buffer_2); |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
942 } else { |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
943 mono_decode(q, q->decode_buffer_1); |
2956 | 944 |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
945 if (q->nb_channels == 2) { |
4639 | 946 decode_bytes_and_gain(q, inbuffer + sub_packet_size/2, &q->gains2); |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
947 mono_decode(q, q->decode_buffer_2); |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
948 } |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
949 } |
3014
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
950 |
4639 | 951 mlt_compensate_output(q, q->decode_buffer_1, &q->gains1, |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
952 q->mono_previous_buffer1, outbuffer, 0); |
2956 | 953 |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
954 if (q->nb_channels == 2) { |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
955 if (q->joint_stereo) { |
4639 | 956 mlt_compensate_output(q, q->decode_buffer_2, &q->gains1, |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
957 q->mono_previous_buffer2, outbuffer, 1); |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
958 } else { |
4639 | 959 mlt_compensate_output(q, q->decode_buffer_2, &q->gains2, |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
960 q->mono_previous_buffer2, outbuffer, 1); |
2956 | 961 } |
962 } | |
2959
24805f4d1b84
This patch adds some support for non-joint stereo streams. It also
rtognimp
parents:
2956
diff
changeset
|
963 return q->samples_per_frame * sizeof(int16_t); |
2956 | 964 } |
965 | |
966 | |
967 /** | |
968 * Cook frame decoding | |
969 * | |
970 * @param avctx pointer to the AVCodecContext | |
971 */ | |
972 | |
973 static int cook_decode_frame(AVCodecContext *avctx, | |
974 void *data, int *data_size, | |
975 uint8_t *buf, int buf_size) { | |
976 COOKContext *q = avctx->priv_data; | |
977 | |
978 if (buf_size < avctx->block_align) | |
979 return buf_size; | |
980 | |
981 *data_size = decode_subpacket(q, buf, avctx->block_align, data); | |
982 | |
4638
9f74306d4ac7
Don't output the first two frames, since they don't contain valid audio.
banan
parents:
4594
diff
changeset
|
983 /* Discard the first two frames: no valid audio. */ |
9f74306d4ac7
Don't output the first two frames, since they don't contain valid audio.
banan
parents:
4594
diff
changeset
|
984 if (avctx->frame_number < 2) *data_size = 0; |
9f74306d4ac7
Don't output the first two frames, since they don't contain valid audio.
banan
parents:
4594
diff
changeset
|
985 |
2956 | 986 return avctx->block_align; |
987 } | |
3090 | 988 |
2956 | 989 #ifdef COOKDEBUG |
4430
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
990 static void dump_cook_context(COOKContext *q) |
2956 | 991 { |
992 //int i=0; | |
993 #define PRINT(a,b) av_log(NULL,AV_LOG_ERROR," %s = %d\n", a, b); | |
994 av_log(NULL,AV_LOG_ERROR,"COOKextradata\n"); | |
4430
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
995 av_log(NULL,AV_LOG_ERROR,"cookversion=%x\n",q->cookversion); |
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
996 if (q->cookversion > STEREO) { |
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
997 PRINT("js_subband_start",q->js_subband_start); |
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
998 PRINT("js_vlc_bits",q->js_vlc_bits); |
2956 | 999 } |
1000 av_log(NULL,AV_LOG_ERROR,"COOKContext\n"); | |
1001 PRINT("nb_channels",q->nb_channels); | |
1002 PRINT("bit_rate",q->bit_rate); | |
1003 PRINT("sample_rate",q->sample_rate); | |
1004 PRINT("samples_per_channel",q->samples_per_channel); | |
1005 PRINT("samples_per_frame",q->samples_per_frame); | |
1006 PRINT("subbands",q->subbands); | |
1007 PRINT("random_state",q->random_state); | |
1008 PRINT("js_subband_start",q->js_subband_start); | |
3090 | 1009 PRINT("log2_numvector_size",q->log2_numvector_size); |
2956 | 1010 PRINT("numvector_size",q->numvector_size); |
1011 PRINT("total_subbands",q->total_subbands); | |
1012 } | |
1013 #endif | |
3090 | 1014 |
2956 | 1015 /** |
1016 * Cook initialization | |
1017 * | |
1018 * @param avctx pointer to the AVCodecContext | |
1019 */ | |
1020 | |
1021 static int cook_decode_init(AVCodecContext *avctx) | |
1022 { | |
1023 COOKContext *q = avctx->priv_data; | |
4430
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
1024 uint8_t *edata_ptr = avctx->extradata; |
2956 | 1025 |
1026 /* Take care of the codec specific extradata. */ | |
1027 if (avctx->extradata_size <= 0) { | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1028 av_log(avctx,AV_LOG_ERROR,"Necessary extradata missing!\n"); |
2956 | 1029 return -1; |
1030 } else { | |
1031 /* 8 for mono, 16 for stereo, ? for multichannel | |
1032 Swap to right endianness so we don't need to care later on. */ | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1033 av_log(avctx,AV_LOG_DEBUG,"codecdata_length=%d\n",avctx->extradata_size); |
2956 | 1034 if (avctx->extradata_size >= 8){ |
4542 | 1035 q->cookversion = bytestream_get_be32(&edata_ptr); |
1036 q->samples_per_frame = bytestream_get_be16(&edata_ptr); | |
1037 q->subbands = bytestream_get_be16(&edata_ptr); | |
2956 | 1038 } |
1039 if (avctx->extradata_size >= 16){ | |
4542 | 1040 bytestream_get_be32(&edata_ptr); //Unknown unused |
1041 q->js_subband_start = bytestream_get_be16(&edata_ptr); | |
1042 q->js_vlc_bits = bytestream_get_be16(&edata_ptr); | |
2956 | 1043 } |
1044 } | |
1045 | |
1046 /* Take data from the AVCodecContext (RM container). */ | |
1047 q->sample_rate = avctx->sample_rate; | |
1048 q->nb_channels = avctx->channels; | |
1049 q->bit_rate = avctx->bit_rate; | |
1050 | |
1051 /* Initialize state. */ | |
1052 q->random_state = 1; | |
1053 | |
1054 /* Initialize extradata related variables. */ | |
4430
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
1055 q->samples_per_channel = q->samples_per_frame / q->nb_channels; |
2956 | 1056 q->bits_per_subpacket = avctx->block_align * 8; |
1057 | |
1058 /* Initialize default data states. */ | |
3090 | 1059 q->log2_numvector_size = 5; |
2956 | 1060 q->total_subbands = q->subbands; |
1061 | |
1062 /* Initialize version-dependent variables */ | |
4430
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
1063 av_log(NULL,AV_LOG_DEBUG,"q->cookversion=%x\n",q->cookversion); |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
1064 q->joint_stereo = 0; |
4430
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
1065 switch (q->cookversion) { |
4425 | 1066 case MONO: |
2956 | 1067 if (q->nb_channels != 1) { |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1068 av_log(avctx,AV_LOG_ERROR,"Container channels != 1, report sample!\n"); |
2956 | 1069 return -1; |
1070 } | |
4425 | 1071 av_log(avctx,AV_LOG_DEBUG,"MONO\n"); |
2956 | 1072 break; |
4425 | 1073 case STEREO: |
2956 | 1074 if (q->nb_channels != 1) { |
2959
24805f4d1b84
This patch adds some support for non-joint stereo streams. It also
rtognimp
parents:
2956
diff
changeset
|
1075 q->bits_per_subpacket = q->bits_per_subpacket/2; |
2956 | 1076 } |
4425 | 1077 av_log(avctx,AV_LOG_DEBUG,"STEREO\n"); |
2956 | 1078 break; |
1079 case JOINT_STEREO: | |
1080 if (q->nb_channels != 2) { | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1081 av_log(avctx,AV_LOG_ERROR,"Container channels != 2, report sample!\n"); |
2956 | 1082 return -1; |
1083 } | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1084 av_log(avctx,AV_LOG_DEBUG,"JOINT_STEREO\n"); |
2956 | 1085 if (avctx->extradata_size >= 16){ |
4430
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
1086 q->total_subbands = q->subbands + q->js_subband_start; |
2956 | 1087 q->joint_stereo = 1; |
1088 } | |
1089 if (q->samples_per_channel > 256) { | |
3091
0284d5b34916
Fix broken cosmetics commit and add a check for valid headers.
banan
parents:
3090
diff
changeset
|
1090 q->log2_numvector_size = 6; |
2956 | 1091 } |
1092 if (q->samples_per_channel > 512) { | |
3091
0284d5b34916
Fix broken cosmetics commit and add a check for valid headers.
banan
parents:
3090
diff
changeset
|
1093 q->log2_numvector_size = 7; |
2956 | 1094 } |
1095 break; | |
1096 case MC_COOK: | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1097 av_log(avctx,AV_LOG_ERROR,"MC_COOK not supported!\n"); |
2956 | 1098 return -1; |
1099 break; | |
1100 default: | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1101 av_log(avctx,AV_LOG_ERROR,"Unknown Cook version, report sample!\n"); |
2956 | 1102 return -1; |
1103 break; | |
1104 } | |
1105 | |
1106 /* Initialize variable relations */ | |
3090 | 1107 q->numvector_size = (1 << q->log2_numvector_size); |
2956 | 1108 |
1109 /* Generate tables */ | |
1110 init_rootpow2table(q); | |
1111 init_pow2table(q); | |
1112 init_gain_table(q); | |
1113 | |
1114 if (init_cook_vlc_tables(q) != 0) | |
1115 return -1; | |
1116 | |
3303
68721b62a528
sanity checks, some might have been exploitable ...
michael
parents:
3106
diff
changeset
|
1117 |
68721b62a528
sanity checks, some might have been exploitable ...
michael
parents:
3106
diff
changeset
|
1118 if(avctx->block_align >= UINT_MAX/2) |
68721b62a528
sanity checks, some might have been exploitable ...
michael
parents:
3106
diff
changeset
|
1119 return -1; |
68721b62a528
sanity checks, some might have been exploitable ...
michael
parents:
3106
diff
changeset
|
1120 |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1121 /* Pad the databuffer with: |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1122 DECODE_BYTES_PAD1 or DECODE_BYTES_PAD2 for decode_bytes(), |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1123 FF_INPUT_BUFFER_PADDING_SIZE, for the bitstreamreader. */ |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1124 if (q->nb_channels==2 && q->joint_stereo==0) { |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1125 q->decoded_bytes_buffer = |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1126 av_mallocz(avctx->block_align/2 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1127 + DECODE_BYTES_PAD2(avctx->block_align/2) |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1128 + FF_INPUT_BUFFER_PADDING_SIZE); |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1129 } else { |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1130 q->decoded_bytes_buffer = |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1131 av_mallocz(avctx->block_align |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1132 + DECODE_BYTES_PAD1(avctx->block_align) |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1133 + FF_INPUT_BUFFER_PADDING_SIZE); |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1134 } |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1135 if (q->decoded_bytes_buffer == NULL) |
2956 | 1136 return -1; |
1137 | |
4639 | 1138 q->gains1.now = q->gain_1; |
1139 q->gains1.previous = q->gain_2; | |
1140 q->gains2.now = q->gain_3; | |
1141 q->gains2.previous = q->gain_4; | |
2956 | 1142 |
1143 /* Initialize transform. */ | |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
1144 if ( init_cook_mlt(q) != 0 ) |
2956 | 1145 return -1; |
3014
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1146 |
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1147 /* Try to catch some obviously faulty streams, othervise it might be exploitable */ |
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1148 if (q->total_subbands > 53) { |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1149 av_log(avctx,AV_LOG_ERROR,"total_subbands > 53, report sample!\n"); |
3014
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1150 return -1; |
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1151 } |
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1152 if (q->subbands > 50) { |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1153 av_log(avctx,AV_LOG_ERROR,"subbands > 50, report sample!\n"); |
3014
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1154 return -1; |
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1155 } |
3091
0284d5b34916
Fix broken cosmetics commit and add a check for valid headers.
banan
parents:
3090
diff
changeset
|
1156 if ((q->samples_per_channel == 256) || (q->samples_per_channel == 512) || (q->samples_per_channel == 1024)) { |
0284d5b34916
Fix broken cosmetics commit and add a check for valid headers.
banan
parents:
3090
diff
changeset
|
1157 } else { |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1158 av_log(avctx,AV_LOG_ERROR,"unknown amount of samples_per_channel = %d, report sample!\n",q->samples_per_channel); |
3091
0284d5b34916
Fix broken cosmetics commit and add a check for valid headers.
banan
parents:
3090
diff
changeset
|
1159 return -1; |
0284d5b34916
Fix broken cosmetics commit and add a check for valid headers.
banan
parents:
3090
diff
changeset
|
1160 } |
4431
85ac154efd99
Check that js_vlc_bits from the extradata is in a valid range.
banan
parents:
4430
diff
changeset
|
1161 if ((q->js_vlc_bits > 6) || (q->js_vlc_bits < 0)) { |
85ac154efd99
Check that js_vlc_bits from the extradata is in a valid range.
banan
parents:
4430
diff
changeset
|
1162 av_log(avctx,AV_LOG_ERROR,"q->js_vlc_bits = %d, only >= 0 and <= 6 allowed!\n",q->js_vlc_bits); |
85ac154efd99
Check that js_vlc_bits from the extradata is in a valid range.
banan
parents:
4430
diff
changeset
|
1163 return -1; |
85ac154efd99
Check that js_vlc_bits from the extradata is in a valid range.
banan
parents:
4430
diff
changeset
|
1164 } |
3014
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1165 |
3009
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
1166 #ifdef COOKDEBUG |
4430
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
1167 dump_cook_context(q); |
3009
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
1168 #endif |
2956 | 1169 return 0; |
1170 } | |
1171 | |
1172 | |
1173 AVCodec cook_decoder = | |
1174 { | |
1175 .name = "cook", | |
1176 .type = CODEC_TYPE_AUDIO, | |
1177 .id = CODEC_ID_COOK, | |
1178 .priv_data_size = sizeof(COOKContext), | |
1179 .init = cook_decode_init, | |
1180 .close = cook_decode_close, | |
1181 .decode = cook_decode_frame, | |
1182 }; |