Mercurial > libavcodec.hg
annotate cook.c @ 6920:d02af7474bff libavcodec
Prevent 128*1<<trellis from becoming 0 and creating 0 sized arrays.
fixes CID84 RUN2
CID85 RUN2
CID86 RUN2
CID87 RUN2
CID88 RUN2
CID89 RUN2
CID90 RUN2
CID91 RUN2
CID92 RUN2
CID93 RUN2
CID94 RUN2
CID95 RUN2
CID96 RUN2
CID97 RUN2
CID98 RUN2
CID99 RUN2
CID100 RUN2
CID101 RUN2
CID102 RUN2
CID103 RUN2
CID104 RUN2
CID105 RUN2
CID106 RUN2
author | michael |
---|---|
date | Wed, 28 May 2008 11:59:41 +0000 |
parents | 0f63fc62ea8b |
children | e943e1409077 |
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 * @file cook.c | |
4845
78bb9129231b
As usual Real actually took something existing and rebranded it.
banan
parents:
4692
diff
changeset
|
25 * Cook compatible decoder. Bastardization of the G.722.1 standard. |
2956 | 26 * This decoder handles RealNetworks, RealAudio G2 data. |
27 * Cook is identified by the codec name cook in RM files. | |
28 * | |
29 * To use this decoder, a calling application must supply the extradata | |
30 * bytes provided from the RM container; 8+ bytes for mono streams and | |
31 * 16+ for stereo streams (maybe more). | |
32 * | |
33 * Codec technicalities (all this assume a buffer length of 1024): | |
34 * Cook works with several different techniques to achieve its compression. | |
35 * In the timedomain the buffer is divided into 8 pieces and quantized. If | |
36 * two neighboring pieces have different quantization index a smooth | |
37 * quantization curve is used to get a smooth overlap between the different | |
38 * pieces. | |
39 * To get to the transformdomain Cook uses a modulated lapped transform. | |
40 * The transform domain has 50 subbands with 20 elements each. This | |
41 * means only a maximum of 50*20=1000 coefficients are used out of the 1024 | |
42 * available. | |
43 */ | |
44 | |
45 #include <math.h> | |
46 #include <stddef.h> | |
47 #include <stdio.h> | |
48 | |
6763 | 49 #include "libavutil/random.h" |
2956 | 50 #include "avcodec.h" |
51 #include "bitstream.h" | |
52 #include "dsputil.h" | |
4430
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
53 #include "bytestream.h" |
2956 | 54 |
55 #include "cookdata.h" | |
56 | |
57 /* the different Cook versions */ | |
4425 | 58 #define MONO 0x1000001 |
59 #define STEREO 0x1000002 | |
2956 | 60 #define JOINT_STEREO 0x1000003 |
61 #define MC_COOK 0x2000000 //multichannel Cook, not supported | |
62 | |
63 #define SUBBAND_SIZE 20 | |
64 //#define COOKDEBUG | |
65 | |
66 typedef struct { | |
4639 | 67 int *now; |
68 int *previous; | |
69 } cook_gains; | |
2956 | 70 |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
71 typedef struct cook { |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
72 /* |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
73 * The following 5 functions provide the lowlevel arithmetic on |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
74 * the internal audio buffers. |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
75 */ |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
76 void (* scalar_dequant)(struct cook *q, int index, int quant_index, |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
77 int* subband_coef_index, int* subband_coef_sign, |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
78 float* mlt_p); |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
79 |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
80 void (* decouple) (struct cook *q, |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
81 int subband, |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
82 float f1, float f2, |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
83 float *decode_buffer, |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
84 float *mlt_buffer1, float *mlt_buffer2); |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
85 |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
86 void (* imlt_window) (struct cook *q, float *buffer1, |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
87 cook_gains *gains_ptr, float *previous_buffer); |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
88 |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
89 void (* interpolate) (struct cook *q, float* buffer, |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
90 int gain_index, int gain_index_next); |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
91 |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
92 void (* saturate_output) (struct cook *q, int chan, int16_t *out); |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
93 |
2956 | 94 GetBitContext gb; |
95 /* stream data */ | |
96 int nb_channels; | |
97 int joint_stereo; | |
98 int bit_rate; | |
99 int sample_rate; | |
100 int samples_per_channel; | |
101 int samples_per_frame; | |
102 int subbands; | |
3090 | 103 int log2_numvector_size; |
104 int numvector_size; //1 << log2_numvector_size; | |
2956 | 105 int js_subband_start; |
106 int total_subbands; | |
107 int num_vectors; | |
108 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
|
109 int cookversion; |
2956 | 110 /* states */ |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
111 AVRandomState random_state; |
2956 | 112 |
113 /* transform data */ | |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
114 MDCTContext mdct_ctx; |
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
115 DECLARE_ALIGNED_16(FFTSample, mdct_tmp[1024]); /* temporary storage for imlt */ |
2956 | 116 float* mlt_window; |
117 | |
118 /* gain buffers */ | |
4639 | 119 cook_gains gains1; |
120 cook_gains gains2; | |
121 int gain_1[9]; | |
122 int gain_2[9]; | |
123 int gain_3[9]; | |
124 int gain_4[9]; | |
2956 | 125 |
126 /* VLC data */ | |
127 int js_vlc_bits; | |
128 VLC envelope_quant_index[13]; | |
129 VLC sqvh[7]; //scalar quantization | |
130 VLC ccpl; //channel coupling | |
131 | |
132 /* generatable tables and related variables */ | |
133 int gain_size_factor; | |
134 float gain_table[23]; | |
135 | |
136 /* data buffers */ | |
137 | |
138 uint8_t* decoded_bytes_buffer; | |
4542 | 139 DECLARE_ALIGNED_16(float,mono_mdct_output[2048]); |
2956 | 140 float mono_previous_buffer1[1024]; |
141 float mono_previous_buffer2[1024]; | |
142 float decode_buffer_1[1024]; | |
143 float decode_buffer_2[1024]; | |
5342
887509b42d3f
moving automatic allocation of joint_decode/decode_buffer
mhoffman
parents:
5341
diff
changeset
|
144 float decode_buffer_0[1060]; /* static allocation for joint decode */ |
5347
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
145 |
6197
2ca0a91b0b24
add const, fix warning: cook.c:276: warning: passing argument 2 of 'maybe_reformat_buffer32' discards qualifiers from pointer target type
bcoudurier
parents:
5523
diff
changeset
|
146 const float *cplscales[5]; |
2956 | 147 } COOKContext; |
148 | |
6861 | 149 static float pow2tab[127]; |
150 static float rootpow2tab[127]; | |
151 | |
2956 | 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 */ | |
6861 | 187 static void init_pow2table(void){ |
2956 | 188 int i; |
6860 | 189 for (i=-63 ; i<64 ; i++){ |
6861 | 190 pow2tab[63+i]= pow(2, i); |
191 rootpow2tab[63+i]=sqrt(pow(2, i)); | |
2956 | 192 } |
193 } | |
194 | |
195 /* table generator */ | |
196 static void init_gain_table(COOKContext *q) { | |
197 int i; | |
198 q->gain_size_factor = q->samples_per_channel/8; | |
199 for (i=0 ; i<23 ; i++) { | |
6861 | 200 q->gain_table[i] = pow(pow2tab[i+52] , |
2956 | 201 (1.0/(double)q->gain_size_factor)); |
202 } | |
203 } | |
204 | |
205 | |
206 static int init_cook_vlc_tables(COOKContext *q) { | |
207 int i, result; | |
208 | |
209 result = 0; | |
210 for (i=0 ; i<13 ; i++) { | |
4951 | 211 result |= init_vlc (&q->envelope_quant_index[i], 9, 24, |
2956 | 212 envelope_quant_index_huffbits[i], 1, 1, |
213 envelope_quant_index_huffcodes[i], 2, 2, 0); | |
214 } | |
215 av_log(NULL,AV_LOG_DEBUG,"sqvh VLC init\n"); | |
216 for (i=0 ; i<7 ; i++) { | |
4951 | 217 result |= init_vlc (&q->sqvh[i], vhvlcsize_tab[i], vhsize_tab[i], |
2956 | 218 cvh_huffbits[i], 1, 1, |
219 cvh_huffcodes[i], 2, 2, 0); | |
220 } | |
221 | |
222 if (q->nb_channels==2 && q->joint_stereo==1){ | |
4951 | 223 result |= init_vlc (&q->ccpl, 6, (1<<q->js_vlc_bits)-1, |
2956 | 224 ccpl_huffbits[q->js_vlc_bits-2], 1, 1, |
225 ccpl_huffcodes[q->js_vlc_bits-2], 2, 2, 0); | |
226 av_log(NULL,AV_LOG_DEBUG,"Joint-stereo VLC used.\n"); | |
227 } | |
228 | |
229 av_log(NULL,AV_LOG_DEBUG,"VLC tables initialized.\n"); | |
230 return result; | |
231 } | |
232 | |
233 static int init_cook_mlt(COOKContext *q) { | |
234 int j; | |
235 float alpha; | |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
236 int mlt_size = q->samples_per_channel; |
2956 | 237 |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
238 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
|
239 return -1; |
2956 | 240 |
241 /* Initialize the MLT window: simple sine window. */ | |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
242 alpha = M_PI / (2.0 * (float)mlt_size); |
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
243 for(j=0 ; j<mlt_size ; j++) |
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
244 q->mlt_window[j] = sin((j + 0.5) * alpha) * sqrt(2.0 / q->samples_per_channel); |
2956 | 245 |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
246 /* Initialize the MDCT. */ |
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
247 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
|
248 av_free(q->mlt_window); |
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
249 return -1; |
2956 | 250 } |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
251 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
|
252 av_log2(mlt_size)+1); |
2956 | 253 |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
254 return 0; |
2956 | 255 } |
256 | |
6197
2ca0a91b0b24
add const, fix warning: cook.c:276: warning: passing argument 2 of 'maybe_reformat_buffer32' discards qualifiers from pointer target type
bcoudurier
parents:
5523
diff
changeset
|
257 static const float *maybe_reformat_buffer32 (COOKContext *q, const float *ptr, int n) |
5347
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
258 { |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
259 if (1) |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
260 return ptr; |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
261 } |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
262 |
5507 | 263 static void init_cplscales_table (COOKContext *q) { |
5347
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
264 int i; |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
265 for (i=0;i<5;i++) |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
266 q->cplscales[i] = maybe_reformat_buffer32 (q, cplscales[i], (1<<(i+2))-1); |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
267 } |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
268 |
2956 | 269 /*************** init functions end ***********/ |
270 | |
271 /** | |
272 * Cook indata decoding, every 32 bits are XORed with 0x37c511f2. | |
273 * Why? No idea, some checksum/error detection method maybe. | |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
274 * |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
275 * Out buffer size: extra bytes are needed to cope with |
5408 | 276 * padding/misalignment. |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
277 * Subpackets passed to the decoder can contain two, consecutive |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
278 * half-subpackets, of identical but arbitrary size. |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
279 * 1234 1234 1234 1234 extraA extraB |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
280 * Case 1: AAAA BBBB 0 0 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
281 * Case 2: AAAA ABBB BB-- 3 3 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
282 * Case 3: AAAA AABB BBBB 2 2 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
283 * Case 4: AAAA AAAB BBBB BB-- 1 5 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
284 * |
2956 | 285 * Nice way to waste CPU cycles. |
286 * | |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
287 * @param inbuffer pointer to byte array of indata |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
288 * @param out pointer to byte array of outdata |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
289 * @param bytes number of bytes |
2956 | 290 */ |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
291 #define DECODE_BYTES_PAD1(bytes) (3 - ((bytes)+3) % 4) |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
292 #define DECODE_BYTES_PAD2(bytes) ((bytes) % 4 + DECODE_BYTES_PAD1(2 * (bytes))) |
2956 | 293 |
6232 | 294 static inline int decode_bytes(const uint8_t* inbuffer, uint8_t* out, int bytes){ |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
295 int i, off; |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
296 uint32_t c; |
6232 | 297 const uint32_t* buf; |
2956 | 298 uint32_t* obuf = (uint32_t*) out; |
299 /* FIXME: 64 bit platforms would be able to do 64 bits at a time. | |
300 * I'm too lazy though, should be something like | |
301 * for(i=0 ; i<bitamount/64 ; i++) | |
302 * (int64_t)out[i] = 0x37c511f237c511f2^be2me_64(int64_t)in[i]); | |
303 * Buffer alignment needs to be checked. */ | |
304 | |
4429 | 305 off = (int)((long)inbuffer & 3); |
6232 | 306 buf = (const uint32_t*) (inbuffer - off); |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
307 c = be2me_32((0x37c511f2 >> (off*8)) | (0x37c511f2 << (32-(off*8)))); |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
308 bytes += 3 + off; |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
309 for (i = 0; i < bytes/4; i++) |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
310 obuf[i] = c ^ buf[i]; |
2956 | 311 |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
312 return off; |
2956 | 313 } |
314 | |
315 /** | |
316 * Cook uninit | |
317 */ | |
318 | |
319 static int cook_decode_close(AVCodecContext *avctx) | |
320 { | |
321 int i; | |
322 COOKContext *q = avctx->priv_data; | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
323 av_log(avctx,AV_LOG_DEBUG, "Deallocating memory.\n"); |
2956 | 324 |
325 /* Free allocated memory buffers. */ | |
326 av_free(q->mlt_window); | |
327 av_free(q->decoded_bytes_buffer); | |
328 | |
329 /* Free the transform. */ | |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
330 ff_mdct_end(&q->mdct_ctx); |
2956 | 331 |
332 /* Free the VLC tables. */ | |
333 for (i=0 ; i<13 ; i++) { | |
334 free_vlc(&q->envelope_quant_index[i]); | |
335 } | |
336 for (i=0 ; i<7 ; i++) { | |
337 free_vlc(&q->sqvh[i]); | |
338 } | |
339 if(q->nb_channels==2 && q->joint_stereo==1 ){ | |
340 free_vlc(&q->ccpl); | |
341 } | |
342 | |
343 av_log(NULL,AV_LOG_DEBUG,"Memory deallocated.\n"); | |
344 | |
345 return 0; | |
346 } | |
347 | |
348 /** | |
4639 | 349 * Fill the gain array for the timedomain quantization. |
2956 | 350 * |
351 * @param q pointer to the COOKContext | |
6903 | 352 * @param gaininfo[9] array of gain indexes |
2956 | 353 */ |
354 | |
4639 | 355 static void decode_gain_info(GetBitContext *gb, int *gaininfo) |
356 { | |
357 int i, n; | |
2956 | 358 |
359 while (get_bits1(gb)) {} | |
4639 | 360 n = get_bits_count(gb) - 1; //amount of elements*2 to update |
2956 | 361 |
4639 | 362 i = 0; |
363 while (n--) { | |
364 int index = get_bits(gb, 3); | |
365 int gain = get_bits1(gb) ? get_bits(gb, 4) - 7 : -1; | |
366 | |
367 while (i <= index) gaininfo[i++] = gain; | |
2956 | 368 } |
4639 | 369 while (i <= 8) gaininfo[i++] = 0; |
2956 | 370 } |
371 | |
372 /** | |
373 * Create the quant index table needed for the envelope. | |
374 * | |
375 * @param q pointer to the COOKContext | |
376 * @param quant_index_table pointer to the array | |
377 */ | |
378 | |
379 static void decode_envelope(COOKContext *q, int* quant_index_table) { | |
380 int i,j, vlc_index; | |
381 | |
382 quant_index_table[0]= get_bits(&q->gb,6) - 6; //This is used later in categorize | |
383 | |
384 for (i=1 ; i < q->total_subbands ; i++){ | |
385 vlc_index=i; | |
386 if (i >= q->js_subband_start * 2) { | |
387 vlc_index-=q->js_subband_start; | |
388 } else { | |
389 vlc_index/=2; | |
390 if(vlc_index < 1) vlc_index = 1; | |
391 } | |
392 if (vlc_index>13) vlc_index = 13; //the VLC tables >13 are identical to No. 13 | |
393 | |
394 j = get_vlc2(&q->gb, q->envelope_quant_index[vlc_index-1].table, | |
395 q->envelope_quant_index[vlc_index-1].bits,2); | |
396 quant_index_table[i] = quant_index_table[i-1] + j - 12; //differential encoding | |
397 } | |
398 } | |
399 | |
400 /** | |
401 * Calculate the category and category_index vector. | |
402 * | |
403 * @param q pointer to the COOKContext | |
404 * @param quant_index_table pointer to the array | |
405 * @param category pointer to the category array | |
406 * @param category_index pointer to the category_index array | |
407 */ | |
408 | |
409 static void categorize(COOKContext *q, int* quant_index_table, | |
410 int* category, int* category_index){ | |
4952
1900e2eaecda
Add another tmpbias variable, as bias' value will be used later
ramiro
parents:
4951
diff
changeset
|
411 int exp_idx, bias, tmpbias1, tmpbias2, bits_left, num_bits, index, v, i, j; |
2956 | 412 int exp_index2[102]; |
413 int exp_index1[102]; | |
414 | |
4955
bbe763044678
Use 1 array with double the size instead of 2 arrays with normal size
ramiro
parents:
4954
diff
changeset
|
415 int tmp_categorize_array[128*2]; |
bbe763044678
Use 1 array with double the size instead of 2 arrays with normal size
ramiro
parents:
4954
diff
changeset
|
416 int tmp_categorize_array1_idx=q->numvector_size; |
bbe763044678
Use 1 array with double the size instead of 2 arrays with normal size
ramiro
parents:
4954
diff
changeset
|
417 int tmp_categorize_array2_idx=q->numvector_size; |
2956 | 418 |
419 bits_left = q->bits_per_subpacket - get_bits_count(&q->gb); | |
420 | |
421 if(bits_left > q->samples_per_channel) { | |
422 bits_left = q->samples_per_channel + | |
423 ((bits_left - q->samples_per_channel)*5)/8; | |
424 //av_log(NULL, AV_LOG_ERROR, "bits_left = %d\n",bits_left); | |
425 } | |
426 | |
427 memset(&exp_index1,0,102*sizeof(int)); | |
428 memset(&exp_index2,0,102*sizeof(int)); | |
4955
bbe763044678
Use 1 array with double the size instead of 2 arrays with normal size
ramiro
parents:
4954
diff
changeset
|
429 memset(&tmp_categorize_array,0,128*2*sizeof(int)); |
2956 | 430 |
431 bias=-32; | |
432 | |
433 /* Estimate bias. */ | |
434 for (i=32 ; i>0 ; i=i/2){ | |
435 num_bits = 0; | |
436 index = 0; | |
437 for (j=q->total_subbands ; j>0 ; j--){ | |
4863 | 438 exp_idx = av_clip((i - quant_index_table[index] + bias) / 2, 0, 7); |
2956 | 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++) { | |
4863 | 450 exp_idx = av_clip((bias - quant_index_table[i]) / 2, 0, 7); |
2956 | 451 num_bits += expbits_tab[exp_idx]; |
452 exp_index1[i] = exp_idx; | |
453 exp_index2[i] = exp_idx; | |
454 } | |
4952
1900e2eaecda
Add another tmpbias variable, as bias' value will be used later
ramiro
parents:
4951
diff
changeset
|
455 tmpbias1 = tmpbias2 = num_bits; |
2956 | 456 |
457 for (j = 1 ; j < q->numvector_size ; j++) { | |
4952
1900e2eaecda
Add another tmpbias variable, as bias' value will be used later
ramiro
parents:
4951
diff
changeset
|
458 if (tmpbias1 + tmpbias2 > 2*bits_left) { /* ---> */ |
2956 | 459 int max = -999999; |
460 index=-1; | |
461 for (i=0 ; i<q->total_subbands ; i++){ | |
462 if (exp_index1[i] < 7) { | |
4954
1fd90978db25
Add bias instead of -32 or 0, as is done in g.722.1
ramiro
parents:
4953
diff
changeset
|
463 v = (-2*exp_index1[i]) - quant_index_table[i] + bias; |
2956 | 464 if ( v >= max) { |
465 max = v; | |
466 index = i; | |
467 } | |
468 } | |
469 } | |
470 if(index==-1)break; | |
4955
bbe763044678
Use 1 array with double the size instead of 2 arrays with normal size
ramiro
parents:
4954
diff
changeset
|
471 tmp_categorize_array[tmp_categorize_array1_idx++] = index; |
4952
1900e2eaecda
Add another tmpbias variable, as bias' value will be used later
ramiro
parents:
4951
diff
changeset
|
472 tmpbias1 -= expbits_tab[exp_index1[index]] - |
4953 | 473 expbits_tab[exp_index1[index]+1]; |
2956 | 474 ++exp_index1[index]; |
475 } else { /* <--- */ | |
476 int min = 999999; | |
477 index=-1; | |
478 for (i=0 ; i<q->total_subbands ; i++){ | |
479 if(exp_index2[i] > 0){ | |
4954
1fd90978db25
Add bias instead of -32 or 0, as is done in g.722.1
ramiro
parents:
4953
diff
changeset
|
480 v = (-2*exp_index2[i])-quant_index_table[i]+bias; |
2956 | 481 if ( v < min) { |
482 min = v; | |
483 index = i; | |
484 } | |
485 } | |
486 } | |
487 if(index == -1)break; | |
4955
bbe763044678
Use 1 array with double the size instead of 2 arrays with normal size
ramiro
parents:
4954
diff
changeset
|
488 tmp_categorize_array[--tmp_categorize_array2_idx] = index; |
4952
1900e2eaecda
Add another tmpbias variable, as bias' value will be used later
ramiro
parents:
4951
diff
changeset
|
489 tmpbias2 -= expbits_tab[exp_index2[index]] - |
4953 | 490 expbits_tab[exp_index2[index]-1]; |
2956 | 491 --exp_index2[index]; |
492 } | |
493 } | |
494 | |
495 for(i=0 ; i<q->total_subbands ; i++) | |
496 category[i] = exp_index2[i]; | |
497 | |
4955
bbe763044678
Use 1 array with double the size instead of 2 arrays with normal size
ramiro
parents:
4954
diff
changeset
|
498 for(i=0 ; i<q->numvector_size-1 ; i++) |
bbe763044678
Use 1 array with double the size instead of 2 arrays with normal size
ramiro
parents:
4954
diff
changeset
|
499 category_index[i] = tmp_categorize_array[tmp_categorize_array2_idx++]; |
2956 | 500 |
501 } | |
502 | |
503 | |
504 /** | |
505 * Expand the category vector. | |
506 * | |
507 * @param q pointer to the COOKContext | |
508 * @param category pointer to the category array | |
509 * @param category_index pointer to the category_index array | |
510 */ | |
511 | |
4908
777f250df232
Fix multiple "¡Æinline/static¡Ç is not at beginning of declaration" warnings.
diego
parents:
4863
diff
changeset
|
512 static inline void expand_category(COOKContext *q, int* category, |
2956 | 513 int* category_index){ |
514 int i; | |
515 for(i=0 ; i<q->num_vectors ; i++){ | |
516 ++category[category_index[i]]; | |
517 } | |
518 } | |
519 | |
520 /** | |
521 * The real requantization of the mltcoefs | |
522 * | |
523 * @param q pointer to the COOKContext | |
524 * @param index index | |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
525 * @param quant_index quantisation index |
2956 | 526 * @param subband_coef_index array of indexes to quant_centroid_tab |
4674 | 527 * @param subband_coef_sign signs of coefficients |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
528 * @param mlt_p pointer into the mlt buffer |
2956 | 529 */ |
530 | |
5353
7e4703e16bbd
fixpoint: renaming all lowlevel arithmetic routines to xxx_float
mhoffman
parents:
5350
diff
changeset
|
531 static void scalar_dequant_float(COOKContext *q, int index, int quant_index, |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
532 int* subband_coef_index, int* subband_coef_sign, |
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
533 float* mlt_p){ |
2956 | 534 int i; |
535 float f1; | |
536 | |
537 for(i=0 ; i<SUBBAND_SIZE ; i++) { | |
538 if (subband_coef_index[i]) { | |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
539 f1 = quant_centroid_tab[index][subband_coef_index[i]]; |
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
540 if (subband_coef_sign[i]) f1 = -f1; |
2956 | 541 } else { |
4674 | 542 /* noise coding if subband_coef_index[i] == 0 */ |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
543 f1 = dither_tab[index]; |
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
544 if (av_random(&q->random_state) < 0x80000000) f1 = -f1; |
2956 | 545 } |
6861 | 546 mlt_p[i] = f1 * rootpow2tab[quant_index+63]; |
2956 | 547 } |
548 } | |
549 /** | |
4674 | 550 * Unpack the subband_coef_index and subband_coef_sign vectors. |
2956 | 551 * |
552 * @param q pointer to the COOKContext | |
553 * @param category pointer to the category array | |
554 * @param subband_coef_index array of indexes to quant_centroid_tab | |
4674 | 555 * @param subband_coef_sign signs of coefficients |
2956 | 556 */ |
557 | |
558 static int unpack_SQVH(COOKContext *q, int category, int* subband_coef_index, | |
4674 | 559 int* subband_coef_sign) { |
2956 | 560 int i,j; |
561 int vlc, vd ,tmp, result; | |
562 | |
563 vd = vd_tab[category]; | |
564 result = 0; | |
565 for(i=0 ; i<vpr_tab[category] ; i++){ | |
566 vlc = get_vlc2(&q->gb, q->sqvh[category].table, q->sqvh[category].bits, 3); | |
567 if (q->bits_per_subpacket < get_bits_count(&q->gb)){ | |
568 vlc = 0; | |
569 result = 1; | |
570 } | |
571 for(j=vd-1 ; j>=0 ; j--){ | |
572 tmp = (vlc * invradix_tab[category])/0x100000; | |
573 subband_coef_index[vd*i+j] = vlc - tmp * (kmax_tab[category]+1); | |
574 vlc = tmp; | |
575 } | |
576 for(j=0 ; j<vd ; j++){ | |
577 if (subband_coef_index[i*vd + j]) { | |
578 if(get_bits_count(&q->gb) < q->bits_per_subpacket){ | |
4674 | 579 subband_coef_sign[i*vd+j] = get_bits1(&q->gb); |
2956 | 580 } else { |
581 result=1; | |
4674 | 582 subband_coef_sign[i*vd+j]=0; |
2956 | 583 } |
584 } else { | |
4674 | 585 subband_coef_sign[i*vd+j]=0; |
2956 | 586 } |
587 } | |
588 } | |
589 return result; | |
590 } | |
591 | |
592 | |
593 /** | |
594 * Fill the mlt_buffer with mlt coefficients. | |
595 * | |
596 * @param q pointer to the COOKContext | |
597 * @param category pointer to the category array | |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
598 * @param quant_index_table pointer to the array |
2956 | 599 * @param mlt_buffer pointer to mlt coefficients |
600 */ | |
601 | |
602 | |
603 static void decode_vectors(COOKContext* q, int* category, | |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
604 int *quant_index_table, float* mlt_buffer){ |
2956 | 605 /* A zero in this table means that the subband coefficient is |
606 random noise coded. */ | |
4674 | 607 int subband_coef_index[SUBBAND_SIZE]; |
2956 | 608 /* A zero in this table means that the subband coefficient is a |
609 positive multiplicator. */ | |
4674 | 610 int subband_coef_sign[SUBBAND_SIZE]; |
2956 | 611 int band, j; |
612 int index=0; | |
613 | |
614 for(band=0 ; band<q->total_subbands ; band++){ | |
615 index = category[band]; | |
616 if(category[band] < 7){ | |
4674 | 617 if(unpack_SQVH(q, category[band], subband_coef_index, subband_coef_sign)){ |
2956 | 618 index=7; |
619 for(j=0 ; j<q->total_subbands ; j++) category[band+j]=7; | |
620 } | |
621 } | |
622 if(index==7) { | |
623 memset(subband_coef_index, 0, sizeof(subband_coef_index)); | |
4674 | 624 memset(subband_coef_sign, 0, sizeof(subband_coef_sign)); |
2956 | 625 } |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
626 q->scalar_dequant(q, index, quant_index_table[band], |
5350
503498b93901
cosmetics: adding some white space to align the arguments of a couple of functions
mhoffman
parents:
5348
diff
changeset
|
627 subband_coef_index, subband_coef_sign, |
503498b93901
cosmetics: adding some white space to align the arguments of a couple of functions
mhoffman
parents:
5348
diff
changeset
|
628 &mlt_buffer[band * SUBBAND_SIZE]); |
2956 | 629 } |
630 | |
631 if(q->total_subbands*SUBBAND_SIZE >= q->samples_per_channel){ | |
632 return; | |
4674 | 633 } /* FIXME: should this be removed, or moved into loop above? */ |
2956 | 634 } |
635 | |
636 | |
637 /** | |
638 * function for decoding mono data | |
639 * | |
640 * @param q pointer to the COOKContext | |
4860 | 641 * @param mlt_buffer pointer to mlt coefficients |
2956 | 642 */ |
643 | |
644 static void mono_decode(COOKContext *q, float* mlt_buffer) { | |
645 | |
646 int category_index[128]; | |
647 int quant_index_table[102]; | |
648 int category[128]; | |
649 | |
650 memset(&category, 0, 128*sizeof(int)); | |
651 memset(&category_index, 0, 128*sizeof(int)); | |
652 | |
653 decode_envelope(q, quant_index_table); | |
3090 | 654 q->num_vectors = get_bits(&q->gb,q->log2_numvector_size); |
2956 | 655 categorize(q, quant_index_table, category, category_index); |
656 expand_category(q, category, category_index); | |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
657 decode_vectors(q, category, quant_index_table, mlt_buffer); |
2956 | 658 } |
659 | |
660 | |
661 /** | |
662 * the actual requantization of the timedomain samples | |
663 * | |
664 * @param q pointer to the COOKContext | |
665 * @param buffer pointer to the timedomain buffer | |
666 * @param gain_index index for the block multiplier | |
667 * @param gain_index_next index for the next block multiplier | |
668 */ | |
669 | |
5353
7e4703e16bbd
fixpoint: renaming all lowlevel arithmetic routines to xxx_float
mhoffman
parents:
5350
diff
changeset
|
670 static void interpolate_float(COOKContext *q, float* buffer, |
2956 | 671 int gain_index, int gain_index_next){ |
672 int i; | |
673 float fc1, fc2; | |
6861 | 674 fc1 = pow2tab[gain_index+63]; |
2956 | 675 |
676 if(gain_index == gain_index_next){ //static gain | |
677 for(i=0 ; i<q->gain_size_factor ; i++){ | |
678 buffer[i]*=fc1; | |
679 } | |
680 return; | |
681 } else { //smooth gain | |
682 fc2 = q->gain_table[11 + (gain_index_next-gain_index)]; | |
683 for(i=0 ; i<q->gain_size_factor ; i++){ | |
684 buffer[i]*=fc1; | |
685 fc1*=fc2; | |
686 } | |
687 return; | |
688 } | |
689 } | |
690 | |
5345
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
691 /** |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
692 * Apply transform window, overlap buffers. |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
693 * |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
694 * @param q pointer to the COOKContext |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
695 * @param inbuffer pointer to the mltcoefficients |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
696 * @param gains_ptr current and previous gains |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
697 * @param previous_buffer pointer to the previous buffer to be used for overlapping |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
698 */ |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
699 |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
700 static void imlt_window_float (COOKContext *q, float *buffer1, |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
701 cook_gains *gains_ptr, float *previous_buffer) |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
702 { |
6861 | 703 const float fc = pow2tab[gains_ptr->previous[0] + 63]; |
5345
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
704 int i; |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
705 /* The weird thing here, is that the two halves of the time domain |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
706 * buffer are swapped. Also, the newest data, that we save away for |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
707 * next frame, has the wrong sign. Hence the subtraction below. |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
708 * Almost sounds like a complex conjugate/reverse data/FFT effect. |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
709 */ |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
710 |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
711 /* Apply window and overlap */ |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
712 for(i = 0; i < q->samples_per_channel; i++){ |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
713 buffer1[i] = buffer1[i] * fc * q->mlt_window[i] - |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
714 previous_buffer[i] * q->mlt_window[q->samples_per_channel - 1 - i]; |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
715 } |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
716 } |
2956 | 717 |
718 /** | |
4653 | 719 * The modulated lapped transform, this takes transform coefficients |
720 * and transforms them into timedomain samples. | |
721 * Apply transform window, overlap buffers, apply gain profile | |
722 * and buffer management. | |
2956 | 723 * |
724 * @param q pointer to the COOKContext | |
4653 | 725 * @param inbuffer pointer to the mltcoefficients |
4639 | 726 * @param gains_ptr current and previous gains |
2956 | 727 * @param previous_buffer pointer to the previous buffer to be used for overlapping |
728 */ | |
729 | |
4653 | 730 static void imlt_gain(COOKContext *q, float *inbuffer, |
731 cook_gains *gains_ptr, float* previous_buffer) | |
4639 | 732 { |
4653 | 733 float *buffer0 = q->mono_mdct_output; |
734 float *buffer1 = q->mono_mdct_output + q->samples_per_channel; | |
2956 | 735 int i; |
4639 | 736 |
4653 | 737 /* Inverse modified discrete cosine transform */ |
738 q->mdct_ctx.fft.imdct_calc(&q->mdct_ctx, q->mono_mdct_output, | |
739 inbuffer, q->mdct_tmp); | |
740 | |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
741 q->imlt_window (q, buffer1, gains_ptr, previous_buffer); |
2956 | 742 |
4639 | 743 /* Apply gain profile */ |
744 for (i = 0; i < 8; i++) { | |
745 if (gains_ptr->now[i] || gains_ptr->now[i + 1]) | |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
746 q->interpolate(q, &buffer1[q->gain_size_factor * i], |
5350
503498b93901
cosmetics: adding some white space to align the arguments of a couple of functions
mhoffman
parents:
5348
diff
changeset
|
747 gains_ptr->now[i], gains_ptr->now[i + 1]); |
4639 | 748 } |
2956 | 749 |
750 /* Save away the current to be previous block. */ | |
4653 | 751 memcpy(previous_buffer, buffer0, sizeof(float)*q->samples_per_channel); |
2956 | 752 } |
753 | |
754 | |
755 /** | |
756 * function for getting the jointstereo coupling information | |
757 * | |
758 * @param q pointer to the COOKContext | |
759 * @param decouple_tab decoupling array | |
760 * | |
761 */ | |
762 | |
763 static void decouple_info(COOKContext *q, int* decouple_tab){ | |
764 int length, i; | |
765 | |
766 if(get_bits1(&q->gb)) { | |
767 if(cplband[q->js_subband_start] > cplband[q->subbands-1]) return; | |
768 | |
769 length = cplband[q->subbands-1] - cplband[q->js_subband_start] + 1; | |
770 for (i=0 ; i<length ; i++) { | |
771 decouple_tab[cplband[q->js_subband_start] + i] = get_vlc2(&q->gb, q->ccpl.table, q->ccpl.bits, 2); | |
772 } | |
773 return; | |
774 } | |
775 | |
776 if(cplband[q->js_subband_start] > cplband[q->subbands-1]) return; | |
777 | |
778 length = cplband[q->subbands-1] - cplband[q->js_subband_start] + 1; | |
779 for (i=0 ; i<length ; i++) { | |
780 decouple_tab[cplband[q->js_subband_start] + i] = get_bits(&q->gb, q->js_vlc_bits); | |
781 } | |
782 return; | |
783 } | |
784 | |
5344
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
785 /* |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
786 * function decouples a pair of signals from a single signal via multiplication. |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
787 * |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
788 * @param q pointer to the COOKContext |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
789 * @param subband index of the current subband |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
790 * @param f1 multiplier for channel 1 extraction |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
791 * @param f2 multiplier for channel 2 extraction |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
792 * @param decode_buffer input buffer |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
793 * @param mlt_buffer1 pointer to left channel mlt coefficients |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
794 * @param mlt_buffer2 pointer to right channel mlt coefficients |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
795 */ |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
796 static void decouple_float (COOKContext *q, |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
797 int subband, |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
798 float f1, float f2, |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
799 float *decode_buffer, |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
800 float *mlt_buffer1, float *mlt_buffer2) |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
801 { |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
802 int j, tmp_idx; |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
803 for (j=0 ; j<SUBBAND_SIZE ; j++) { |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
804 tmp_idx = ((q->js_subband_start + subband)*SUBBAND_SIZE)+j; |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
805 mlt_buffer1[SUBBAND_SIZE*subband + j] = f1 * decode_buffer[tmp_idx]; |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
806 mlt_buffer2[SUBBAND_SIZE*subband + j] = f2 * decode_buffer[tmp_idx]; |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
807 } |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
808 } |
2956 | 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]; | |
5342
887509b42d3f
moving automatic allocation of joint_decode/decode_buffer
mhoffman
parents:
5341
diff
changeset
|
822 float *decode_buffer = q->decode_buffer_0; |
5448 | 823 int idx, cpl_tmp; |
2956 | 824 float f1,f2; |
6197
2ca0a91b0b24
add const, fix warning: cook.c:276: warning: passing argument 2 of 'maybe_reformat_buffer32' discards qualifiers from pointer target type
bcoudurier
parents:
5523
diff
changeset
|
825 const float* cplscale; |
2956 | 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]; |
5347
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
850 cplscale = q->cplscales[q->js_vlc_bits-2]; //choose decoupler table |
3009
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]; |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
853 q->decouple (q, i, f1, f2, decode_buffer, mlt_buffer1, mlt_buffer2); |
3009
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
854 idx = (1 << q->js_vlc_bits) - 1; |
2956 | 855 } |
856 } | |
857 | |
858 /** | |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
859 * First part of subpacket decoding: |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
860 * decode raw stream bytes and read gain info. |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
861 * |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
862 * @param q pointer to the COOKContext |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
863 * @param inbuffer pointer to raw stream data |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
864 * @param gain_ptr array of current/prev gain pointers |
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 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
867 static inline void |
6232 | 868 decode_bytes_and_gain(COOKContext *q, const uint8_t *inbuffer, |
4639 | 869 cook_gains *gains_ptr) |
4424
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 int offset; |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
872 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
873 offset = decode_bytes(inbuffer, q->decoded_bytes_buffer, |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
874 q->bits_per_subpacket/8); |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
875 init_get_bits(&q->gb, q->decoded_bytes_buffer + offset, |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
876 q->bits_per_subpacket); |
4639 | 877 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
|
878 |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
879 /* Swap current and previous gains */ |
4639 | 880 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
|
881 } |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
882 |
5343
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
883 /** |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
884 * Saturate the output signal to signed 16bit integers. |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
885 * |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
886 * @param q pointer to the COOKContext |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
887 * @param chan channel to saturate |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
888 * @param out pointer to the output vector |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
889 */ |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
890 static void |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
891 saturate_output_float (COOKContext *q, int chan, int16_t *out) |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
892 { |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
893 int j; |
5348 | 894 float *output = q->mono_mdct_output + q->samples_per_channel; |
5343
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
895 /* Clip and convert floats to 16 bits. |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
896 */ |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
897 for (j = 0; j < q->samples_per_channel; j++) { |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
898 out[chan + q->nb_channels * j] = |
5523 | 899 av_clip_int16(lrintf(output[j])); |
5343
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
900 } |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
901 } |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
902 |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
903 /** |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
904 * Final part of subpacket decoding: |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
905 * Apply modulated lapped transform, gain compensation, |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
906 * clip and convert to integer. |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
907 * |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
908 * @param q pointer to the COOKContext |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
909 * @param decode_buffer pointer to the mlt coefficients |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
910 * @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
|
911 * @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
|
912 * @param out pointer to the output buffer |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
913 * @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
|
914 */ |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
915 |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
916 static inline void |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
917 mlt_compensate_output(COOKContext *q, float *decode_buffer, |
4639 | 918 cook_gains *gains, float *previous_buffer, |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
919 int16_t *out, int chan) |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
920 { |
4653 | 921 imlt_gain(q, decode_buffer, gains, previous_buffer); |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
922 q->saturate_output (q, chan, out); |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
923 } |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
924 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
925 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
926 /** |
2956 | 927 * Cook subpacket decoding. This function returns one decoded subpacket, |
928 * usually 1024 samples per channel. | |
929 * | |
930 * @param q pointer to the COOKContext | |
931 * @param inbuffer pointer to the inbuffer | |
932 * @param sub_packet_size subpacket size | |
933 * @param outbuffer pointer to the outbuffer | |
934 */ | |
935 | |
936 | |
6232 | 937 static int decode_subpacket(COOKContext *q, const uint8_t *inbuffer, |
2956 | 938 int sub_packet_size, int16_t *outbuffer) { |
939 /* packet dump */ | |
940 // for (i=0 ; i<sub_packet_size ; i++) { | |
941 // av_log(NULL, AV_LOG_ERROR, "%02x", inbuffer[i]); | |
942 // } | |
943 // av_log(NULL, AV_LOG_ERROR, "\n"); | |
944 | |
4639 | 945 decode_bytes_and_gain(q, inbuffer, &q->gains1); |
2956 | 946 |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
947 if (q->joint_stereo) { |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
948 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
|
949 } else { |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
950 mono_decode(q, q->decode_buffer_1); |
2956 | 951 |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
952 if (q->nb_channels == 2) { |
4639 | 953 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
|
954 mono_decode(q, q->decode_buffer_2); |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
955 } |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
956 } |
3014
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
957 |
4639 | 958 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
|
959 q->mono_previous_buffer1, outbuffer, 0); |
2956 | 960 |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
961 if (q->nb_channels == 2) { |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
962 if (q->joint_stereo) { |
4639 | 963 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
|
964 q->mono_previous_buffer2, outbuffer, 1); |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
965 } else { |
4639 | 966 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
|
967 q->mono_previous_buffer2, outbuffer, 1); |
2956 | 968 } |
969 } | |
2959
24805f4d1b84
This patch adds some support for non-joint stereo streams. It also
rtognimp
parents:
2956
diff
changeset
|
970 return q->samples_per_frame * sizeof(int16_t); |
2956 | 971 } |
972 | |
973 | |
974 /** | |
975 * Cook frame decoding | |
976 * | |
977 * @param avctx pointer to the AVCodecContext | |
978 */ | |
979 | |
980 static int cook_decode_frame(AVCodecContext *avctx, | |
981 void *data, int *data_size, | |
6232 | 982 const uint8_t *buf, int buf_size) { |
2956 | 983 COOKContext *q = avctx->priv_data; |
984 | |
985 if (buf_size < avctx->block_align) | |
986 return buf_size; | |
987 | |
988 *data_size = decode_subpacket(q, buf, avctx->block_align, data); | |
989 | |
4638
9f74306d4ac7
Don't output the first two frames, since they don't contain valid audio.
banan
parents:
4594
diff
changeset
|
990 /* 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
|
991 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
|
992 |
2956 | 993 return avctx->block_align; |
994 } | |
3090 | 995 |
2956 | 996 #ifdef COOKDEBUG |
4430
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
997 static void dump_cook_context(COOKContext *q) |
2956 | 998 { |
999 //int i=0; | |
1000 #define PRINT(a,b) av_log(NULL,AV_LOG_ERROR," %s = %d\n", a, b); | |
1001 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
|
1002 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
|
1003 if (q->cookversion > STEREO) { |
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
1004 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
|
1005 PRINT("js_vlc_bits",q->js_vlc_bits); |
2956 | 1006 } |
1007 av_log(NULL,AV_LOG_ERROR,"COOKContext\n"); | |
1008 PRINT("nb_channels",q->nb_channels); | |
1009 PRINT("bit_rate",q->bit_rate); | |
1010 PRINT("sample_rate",q->sample_rate); | |
1011 PRINT("samples_per_channel",q->samples_per_channel); | |
1012 PRINT("samples_per_frame",q->samples_per_frame); | |
1013 PRINT("subbands",q->subbands); | |
1014 PRINT("random_state",q->random_state); | |
1015 PRINT("js_subband_start",q->js_subband_start); | |
3090 | 1016 PRINT("log2_numvector_size",q->log2_numvector_size); |
2956 | 1017 PRINT("numvector_size",q->numvector_size); |
1018 PRINT("total_subbands",q->total_subbands); | |
1019 } | |
1020 #endif | |
3090 | 1021 |
2956 | 1022 /** |
1023 * Cook initialization | |
1024 * | |
1025 * @param avctx pointer to the AVCodecContext | |
1026 */ | |
1027 | |
1028 static int cook_decode_init(AVCodecContext *avctx) | |
1029 { | |
1030 COOKContext *q = avctx->priv_data; | |
6232 | 1031 const uint8_t *edata_ptr = avctx->extradata; |
2956 | 1032 |
1033 /* Take care of the codec specific extradata. */ | |
1034 if (avctx->extradata_size <= 0) { | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1035 av_log(avctx,AV_LOG_ERROR,"Necessary extradata missing!\n"); |
2956 | 1036 return -1; |
1037 } else { | |
1038 /* 8 for mono, 16 for stereo, ? for multichannel | |
1039 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
|
1040 av_log(avctx,AV_LOG_DEBUG,"codecdata_length=%d\n",avctx->extradata_size); |
2956 | 1041 if (avctx->extradata_size >= 8){ |
4542 | 1042 q->cookversion = bytestream_get_be32(&edata_ptr); |
1043 q->samples_per_frame = bytestream_get_be16(&edata_ptr); | |
1044 q->subbands = bytestream_get_be16(&edata_ptr); | |
2956 | 1045 } |
1046 if (avctx->extradata_size >= 16){ | |
4542 | 1047 bytestream_get_be32(&edata_ptr); //Unknown unused |
1048 q->js_subband_start = bytestream_get_be16(&edata_ptr); | |
1049 q->js_vlc_bits = bytestream_get_be16(&edata_ptr); | |
2956 | 1050 } |
1051 } | |
1052 | |
1053 /* Take data from the AVCodecContext (RM container). */ | |
1054 q->sample_rate = avctx->sample_rate; | |
1055 q->nb_channels = avctx->channels; | |
1056 q->bit_rate = avctx->bit_rate; | |
1057 | |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
1058 /* Initialize RNG. */ |
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
1059 av_init_random(1, &q->random_state); |
2956 | 1060 |
1061 /* 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
|
1062 q->samples_per_channel = q->samples_per_frame / q->nb_channels; |
2956 | 1063 q->bits_per_subpacket = avctx->block_align * 8; |
1064 | |
1065 /* Initialize default data states. */ | |
3090 | 1066 q->log2_numvector_size = 5; |
2956 | 1067 q->total_subbands = q->subbands; |
1068 | |
1069 /* 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
|
1070 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
|
1071 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
|
1072 switch (q->cookversion) { |
4425 | 1073 case MONO: |
2956 | 1074 if (q->nb_channels != 1) { |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1075 av_log(avctx,AV_LOG_ERROR,"Container channels != 1, report sample!\n"); |
2956 | 1076 return -1; |
1077 } | |
4425 | 1078 av_log(avctx,AV_LOG_DEBUG,"MONO\n"); |
2956 | 1079 break; |
4425 | 1080 case STEREO: |
2956 | 1081 if (q->nb_channels != 1) { |
2959
24805f4d1b84
This patch adds some support for non-joint stereo streams. It also
rtognimp
parents:
2956
diff
changeset
|
1082 q->bits_per_subpacket = q->bits_per_subpacket/2; |
2956 | 1083 } |
4425 | 1084 av_log(avctx,AV_LOG_DEBUG,"STEREO\n"); |
2956 | 1085 break; |
1086 case JOINT_STEREO: | |
1087 if (q->nb_channels != 2) { | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1088 av_log(avctx,AV_LOG_ERROR,"Container channels != 2, report sample!\n"); |
2956 | 1089 return -1; |
1090 } | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1091 av_log(avctx,AV_LOG_DEBUG,"JOINT_STEREO\n"); |
2956 | 1092 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
|
1093 q->total_subbands = q->subbands + q->js_subband_start; |
2956 | 1094 q->joint_stereo = 1; |
1095 } | |
1096 if (q->samples_per_channel > 256) { | |
3091
0284d5b34916
Fix broken cosmetics commit and add a check for valid headers.
banan
parents:
3090
diff
changeset
|
1097 q->log2_numvector_size = 6; |
2956 | 1098 } |
1099 if (q->samples_per_channel > 512) { | |
3091
0284d5b34916
Fix broken cosmetics commit and add a check for valid headers.
banan
parents:
3090
diff
changeset
|
1100 q->log2_numvector_size = 7; |
2956 | 1101 } |
1102 break; | |
1103 case MC_COOK: | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1104 av_log(avctx,AV_LOG_ERROR,"MC_COOK not supported!\n"); |
2956 | 1105 return -1; |
1106 break; | |
1107 default: | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1108 av_log(avctx,AV_LOG_ERROR,"Unknown Cook version, report sample!\n"); |
2956 | 1109 return -1; |
1110 break; | |
1111 } | |
1112 | |
1113 /* Initialize variable relations */ | |
3090 | 1114 q->numvector_size = (1 << q->log2_numvector_size); |
2956 | 1115 |
1116 /* Generate tables */ | |
6861 | 1117 init_pow2table(); |
2956 | 1118 init_gain_table(q); |
5347
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
1119 init_cplscales_table(q); |
2956 | 1120 |
1121 if (init_cook_vlc_tables(q) != 0) | |
1122 return -1; | |
1123 | |
3303
68721b62a528
sanity checks, some might have been exploitable ...
michael
parents:
3106
diff
changeset
|
1124 |
68721b62a528
sanity checks, some might have been exploitable ...
michael
parents:
3106
diff
changeset
|
1125 if(avctx->block_align >= UINT_MAX/2) |
68721b62a528
sanity checks, some might have been exploitable ...
michael
parents:
3106
diff
changeset
|
1126 return -1; |
68721b62a528
sanity checks, some might have been exploitable ...
michael
parents:
3106
diff
changeset
|
1127 |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1128 /* Pad the databuffer with: |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1129 DECODE_BYTES_PAD1 or DECODE_BYTES_PAD2 for decode_bytes(), |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1130 FF_INPUT_BUFFER_PADDING_SIZE, for the bitstreamreader. */ |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1131 if (q->nb_channels==2 && q->joint_stereo==0) { |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1132 q->decoded_bytes_buffer = |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1133 av_mallocz(avctx->block_align/2 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1134 + DECODE_BYTES_PAD2(avctx->block_align/2) |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1135 + FF_INPUT_BUFFER_PADDING_SIZE); |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1136 } else { |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1137 q->decoded_bytes_buffer = |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1138 av_mallocz(avctx->block_align |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1139 + DECODE_BYTES_PAD1(avctx->block_align) |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1140 + FF_INPUT_BUFFER_PADDING_SIZE); |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1141 } |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1142 if (q->decoded_bytes_buffer == NULL) |
2956 | 1143 return -1; |
1144 | |
4639 | 1145 q->gains1.now = q->gain_1; |
1146 q->gains1.previous = q->gain_2; | |
1147 q->gains2.now = q->gain_3; | |
1148 q->gains2.previous = q->gain_4; | |
2956 | 1149 |
1150 /* Initialize transform. */ | |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
1151 if ( init_cook_mlt(q) != 0 ) |
2956 | 1152 return -1; |
3014
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1153 |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1154 /* Initialize COOK signal arithmetic handling */ |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1155 if (1) { |
5353
7e4703e16bbd
fixpoint: renaming all lowlevel arithmetic routines to xxx_float
mhoffman
parents:
5350
diff
changeset
|
1156 q->scalar_dequant = scalar_dequant_float; |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1157 q->decouple = decouple_float; |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1158 q->imlt_window = imlt_window_float; |
5353
7e4703e16bbd
fixpoint: renaming all lowlevel arithmetic routines to xxx_float
mhoffman
parents:
5350
diff
changeset
|
1159 q->interpolate = interpolate_float; |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1160 q->saturate_output = saturate_output_float; |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1161 } |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1162 |
3014
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1163 /* 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
|
1164 if (q->total_subbands > 53) { |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1165 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
|
1166 return -1; |
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1167 } |
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1168 if (q->subbands > 50) { |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1169 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
|
1170 return -1; |
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1171 } |
3091
0284d5b34916
Fix broken cosmetics commit and add a check for valid headers.
banan
parents:
3090
diff
changeset
|
1172 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
|
1173 } else { |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1174 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
|
1175 return -1; |
0284d5b34916
Fix broken cosmetics commit and add a check for valid headers.
banan
parents:
3090
diff
changeset
|
1176 } |
4431
85ac154efd99
Check that js_vlc_bits from the extradata is in a valid range.
banan
parents:
4430
diff
changeset
|
1177 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
|
1178 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
|
1179 return -1; |
85ac154efd99
Check that js_vlc_bits from the extradata is in a valid range.
banan
parents:
4430
diff
changeset
|
1180 } |
3014
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1181 |
3009
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
1182 #ifdef COOKDEBUG |
4430
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
1183 dump_cook_context(q); |
3009
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
1184 #endif |
2956 | 1185 return 0; |
1186 } | |
1187 | |
1188 | |
1189 AVCodec cook_decoder = | |
1190 { | |
1191 .name = "cook", | |
1192 .type = CODEC_TYPE_AUDIO, | |
1193 .id = CODEC_ID_COOK, | |
1194 .priv_data_size = sizeof(COOKContext), | |
1195 .init = cook_decode_init, | |
1196 .close = cook_decode_close, | |
1197 .decode = cook_decode_frame, | |
6710 | 1198 .long_name = "COOK", |
2956 | 1199 }; |