Mercurial > libavcodec.hg
annotate cook.c @ 7351:1502ba3beb72 libavcodec
The codebook generator algorithm involves picking three
different codebook centroids ("high utility", "low
utility" and "closest to the low utility one"). This
change avoid the corner case of choosing two times the
same centroid.
author | vitor |
---|---|
date | Wed, 23 Jul 2008 03:54:31 +0000 |
parents | af6510f5f7e1 |
children | 85ab7655ad4d |
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; | |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
235 int mlt_size = q->samples_per_channel; |
2956 | 236 |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
237 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
|
238 return -1; |
2956 | 239 |
240 /* Initialize the MLT window: simple sine window. */ | |
7094
b0820b8bd4dd
Add generic ff_sine_window_init function and implement in codecs appropriately
superdump
parents:
7040
diff
changeset
|
241 ff_sine_window_init(q->mlt_window, mlt_size); |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
242 for(j=0 ; j<mlt_size ; j++) |
7094
b0820b8bd4dd
Add generic ff_sine_window_init function and implement in codecs appropriately
superdump
parents:
7040
diff
changeset
|
243 q->mlt_window[j] *= sqrt(2.0 / q->samples_per_channel); |
2956 | 244 |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
245 /* Initialize the MDCT. */ |
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
246 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
|
247 av_free(q->mlt_window); |
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
248 return -1; |
2956 | 249 } |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
250 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
|
251 av_log2(mlt_size)+1); |
2956 | 252 |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
253 return 0; |
2956 | 254 } |
255 | |
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
|
256 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
|
257 { |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
258 if (1) |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
259 return ptr; |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
260 } |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
261 |
5507 | 262 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
|
263 int i; |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
264 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
|
265 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
|
266 } |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
267 |
2956 | 268 /*************** init functions end ***********/ |
269 | |
270 /** | |
271 * Cook indata decoding, every 32 bits are XORed with 0x37c511f2. | |
272 * Why? No idea, some checksum/error detection method maybe. | |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
273 * |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
274 * Out buffer size: extra bytes are needed to cope with |
5408 | 275 * padding/misalignment. |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
276 * Subpackets passed to the decoder can contain two, consecutive |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
277 * half-subpackets, of identical but arbitrary size. |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
278 * 1234 1234 1234 1234 extraA extraB |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
279 * Case 1: AAAA BBBB 0 0 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
280 * Case 2: AAAA ABBB BB-- 3 3 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
281 * Case 3: AAAA AABB BBBB 2 2 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
282 * Case 4: AAAA AAAB BBBB BB-- 1 5 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
283 * |
2956 | 284 * Nice way to waste CPU cycles. |
285 * | |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
286 * @param inbuffer pointer to byte array of indata |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
287 * @param out pointer to byte array of outdata |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
288 * @param bytes number of bytes |
2956 | 289 */ |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
290 #define DECODE_BYTES_PAD1(bytes) (3 - ((bytes)+3) % 4) |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
291 #define DECODE_BYTES_PAD2(bytes) ((bytes) % 4 + DECODE_BYTES_PAD1(2 * (bytes))) |
2956 | 292 |
6232 | 293 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
|
294 int i, off; |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
295 uint32_t c; |
6232 | 296 const uint32_t* buf; |
2956 | 297 uint32_t* obuf = (uint32_t*) out; |
298 /* FIXME: 64 bit platforms would be able to do 64 bits at a time. | |
299 * I'm too lazy though, should be something like | |
300 * for(i=0 ; i<bitamount/64 ; i++) | |
301 * (int64_t)out[i] = 0x37c511f237c511f2^be2me_64(int64_t)in[i]); | |
302 * Buffer alignment needs to be checked. */ | |
303 | |
4429 | 304 off = (int)((long)inbuffer & 3); |
6232 | 305 buf = (const uint32_t*) (inbuffer - off); |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
306 c = be2me_32((0x37c511f2 >> (off*8)) | (0x37c511f2 << (32-(off*8)))); |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
307 bytes += 3 + off; |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
308 for (i = 0; i < bytes/4; i++) |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
309 obuf[i] = c ^ buf[i]; |
2956 | 310 |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
311 return off; |
2956 | 312 } |
313 | |
314 /** | |
315 * Cook uninit | |
316 */ | |
317 | |
318 static int cook_decode_close(AVCodecContext *avctx) | |
319 { | |
320 int i; | |
321 COOKContext *q = avctx->priv_data; | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
322 av_log(avctx,AV_LOG_DEBUG, "Deallocating memory.\n"); |
2956 | 323 |
324 /* Free allocated memory buffers. */ | |
325 av_free(q->mlt_window); | |
326 av_free(q->decoded_bytes_buffer); | |
327 | |
328 /* Free the transform. */ | |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
329 ff_mdct_end(&q->mdct_ctx); |
2956 | 330 |
331 /* Free the VLC tables. */ | |
332 for (i=0 ; i<13 ; i++) { | |
333 free_vlc(&q->envelope_quant_index[i]); | |
334 } | |
335 for (i=0 ; i<7 ; i++) { | |
336 free_vlc(&q->sqvh[i]); | |
337 } | |
338 if(q->nb_channels==2 && q->joint_stereo==1 ){ | |
339 free_vlc(&q->ccpl); | |
340 } | |
341 | |
342 av_log(NULL,AV_LOG_DEBUG,"Memory deallocated.\n"); | |
343 | |
344 return 0; | |
345 } | |
346 | |
347 /** | |
4639 | 348 * Fill the gain array for the timedomain quantization. |
2956 | 349 * |
350 * @param q pointer to the COOKContext | |
6903 | 351 * @param gaininfo[9] array of gain indexes |
2956 | 352 */ |
353 | |
4639 | 354 static void decode_gain_info(GetBitContext *gb, int *gaininfo) |
355 { | |
356 int i, n; | |
2956 | 357 |
358 while (get_bits1(gb)) {} | |
4639 | 359 n = get_bits_count(gb) - 1; //amount of elements*2 to update |
2956 | 360 |
4639 | 361 i = 0; |
362 while (n--) { | |
363 int index = get_bits(gb, 3); | |
364 int gain = get_bits1(gb) ? get_bits(gb, 4) - 7 : -1; | |
365 | |
366 while (i <= index) gaininfo[i++] = gain; | |
2956 | 367 } |
4639 | 368 while (i <= 8) gaininfo[i++] = 0; |
2956 | 369 } |
370 | |
371 /** | |
372 * Create the quant index table needed for the envelope. | |
373 * | |
374 * @param q pointer to the COOKContext | |
375 * @param quant_index_table pointer to the array | |
376 */ | |
377 | |
378 static void decode_envelope(COOKContext *q, int* quant_index_table) { | |
379 int i,j, vlc_index; | |
380 | |
381 quant_index_table[0]= get_bits(&q->gb,6) - 6; //This is used later in categorize | |
382 | |
383 for (i=1 ; i < q->total_subbands ; i++){ | |
384 vlc_index=i; | |
385 if (i >= q->js_subband_start * 2) { | |
386 vlc_index-=q->js_subband_start; | |
387 } else { | |
388 vlc_index/=2; | |
389 if(vlc_index < 1) vlc_index = 1; | |
390 } | |
391 if (vlc_index>13) vlc_index = 13; //the VLC tables >13 are identical to No. 13 | |
392 | |
393 j = get_vlc2(&q->gb, q->envelope_quant_index[vlc_index-1].table, | |
394 q->envelope_quant_index[vlc_index-1].bits,2); | |
395 quant_index_table[i] = quant_index_table[i-1] + j - 12; //differential encoding | |
396 } | |
397 } | |
398 | |
399 /** | |
400 * Calculate the category and category_index vector. | |
401 * | |
402 * @param q pointer to the COOKContext | |
403 * @param quant_index_table pointer to the array | |
404 * @param category pointer to the category array | |
405 * @param category_index pointer to the category_index array | |
406 */ | |
407 | |
408 static void categorize(COOKContext *q, int* quant_index_table, | |
409 int* category, int* category_index){ | |
4952
1900e2eaecda
Add another tmpbias variable, as bias' value will be used later
ramiro
parents:
4951
diff
changeset
|
410 int exp_idx, bias, tmpbias1, tmpbias2, bits_left, num_bits, index, v, i, j; |
2956 | 411 int exp_index2[102]; |
412 int exp_index1[102]; | |
413 | |
4955
bbe763044678
Use 1 array with double the size instead of 2 arrays with normal size
ramiro
parents:
4954
diff
changeset
|
414 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
|
415 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
|
416 int tmp_categorize_array2_idx=q->numvector_size; |
2956 | 417 |
418 bits_left = q->bits_per_subpacket - get_bits_count(&q->gb); | |
419 | |
420 if(bits_left > q->samples_per_channel) { | |
421 bits_left = q->samples_per_channel + | |
422 ((bits_left - q->samples_per_channel)*5)/8; | |
423 //av_log(NULL, AV_LOG_ERROR, "bits_left = %d\n",bits_left); | |
424 } | |
425 | |
426 memset(&exp_index1,0,102*sizeof(int)); | |
427 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
|
428 memset(&tmp_categorize_array,0,128*2*sizeof(int)); |
2956 | 429 |
430 bias=-32; | |
431 | |
432 /* Estimate bias. */ | |
433 for (i=32 ; i>0 ; i=i/2){ | |
434 num_bits = 0; | |
435 index = 0; | |
436 for (j=q->total_subbands ; j>0 ; j--){ | |
4863 | 437 exp_idx = av_clip((i - quant_index_table[index] + bias) / 2, 0, 7); |
2956 | 438 index++; |
439 num_bits+=expbits_tab[exp_idx]; | |
440 } | |
441 if(num_bits >= bits_left - 32){ | |
442 bias+=i; | |
443 } | |
444 } | |
445 | |
446 /* Calculate total number of bits. */ | |
447 num_bits=0; | |
448 for (i=0 ; i<q->total_subbands ; i++) { | |
4863 | 449 exp_idx = av_clip((bias - quant_index_table[i]) / 2, 0, 7); |
2956 | 450 num_bits += expbits_tab[exp_idx]; |
451 exp_index1[i] = exp_idx; | |
452 exp_index2[i] = exp_idx; | |
453 } | |
4952
1900e2eaecda
Add another tmpbias variable, as bias' value will be used later
ramiro
parents:
4951
diff
changeset
|
454 tmpbias1 = tmpbias2 = num_bits; |
2956 | 455 |
456 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
|
457 if (tmpbias1 + tmpbias2 > 2*bits_left) { /* ---> */ |
2956 | 458 int max = -999999; |
459 index=-1; | |
460 for (i=0 ; i<q->total_subbands ; i++){ | |
461 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
|
462 v = (-2*exp_index1[i]) - quant_index_table[i] + bias; |
2956 | 463 if ( v >= max) { |
464 max = v; | |
465 index = i; | |
466 } | |
467 } | |
468 } | |
469 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
|
470 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
|
471 tmpbias1 -= expbits_tab[exp_index1[index]] - |
4953 | 472 expbits_tab[exp_index1[index]+1]; |
2956 | 473 ++exp_index1[index]; |
474 } else { /* <--- */ | |
475 int min = 999999; | |
476 index=-1; | |
477 for (i=0 ; i<q->total_subbands ; i++){ | |
478 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
|
479 v = (-2*exp_index2[i])-quant_index_table[i]+bias; |
2956 | 480 if ( v < min) { |
481 min = v; | |
482 index = i; | |
483 } | |
484 } | |
485 } | |
486 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
|
487 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
|
488 tmpbias2 -= expbits_tab[exp_index2[index]] - |
4953 | 489 expbits_tab[exp_index2[index]-1]; |
2956 | 490 --exp_index2[index]; |
491 } | |
492 } | |
493 | |
494 for(i=0 ; i<q->total_subbands ; i++) | |
495 category[i] = exp_index2[i]; | |
496 | |
4955
bbe763044678
Use 1 array with double the size instead of 2 arrays with normal size
ramiro
parents:
4954
diff
changeset
|
497 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
|
498 category_index[i] = tmp_categorize_array[tmp_categorize_array2_idx++]; |
2956 | 499 |
500 } | |
501 | |
502 | |
503 /** | |
504 * Expand the category vector. | |
505 * | |
506 * @param q pointer to the COOKContext | |
507 * @param category pointer to the category array | |
508 * @param category_index pointer to the category_index array | |
509 */ | |
510 | |
4908
777f250df232
Fix multiple "¡Æinline/static¡Ç is not at beginning of declaration" warnings.
diego
parents:
4863
diff
changeset
|
511 static inline void expand_category(COOKContext *q, int* category, |
2956 | 512 int* category_index){ |
513 int i; | |
514 for(i=0 ; i<q->num_vectors ; i++){ | |
515 ++category[category_index[i]]; | |
516 } | |
517 } | |
518 | |
519 /** | |
520 * The real requantization of the mltcoefs | |
521 * | |
522 * @param q pointer to the COOKContext | |
523 * @param index index | |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
524 * @param quant_index quantisation index |
2956 | 525 * @param subband_coef_index array of indexes to quant_centroid_tab |
4674 | 526 * @param subband_coef_sign signs of coefficients |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
527 * @param mlt_p pointer into the mlt buffer |
2956 | 528 */ |
529 | |
5353
7e4703e16bbd
fixpoint: renaming all lowlevel arithmetic routines to xxx_float
mhoffman
parents:
5350
diff
changeset
|
530 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
|
531 int* subband_coef_index, int* subband_coef_sign, |
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
532 float* mlt_p){ |
2956 | 533 int i; |
534 float f1; | |
535 | |
536 for(i=0 ; i<SUBBAND_SIZE ; i++) { | |
537 if (subband_coef_index[i]) { | |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
538 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
|
539 if (subband_coef_sign[i]) f1 = -f1; |
2956 | 540 } else { |
4674 | 541 /* 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
|
542 f1 = dither_tab[index]; |
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
543 if (av_random(&q->random_state) < 0x80000000) f1 = -f1; |
2956 | 544 } |
6861 | 545 mlt_p[i] = f1 * rootpow2tab[quant_index+63]; |
2956 | 546 } |
547 } | |
548 /** | |
4674 | 549 * Unpack the subband_coef_index and subband_coef_sign vectors. |
2956 | 550 * |
551 * @param q pointer to the COOKContext | |
552 * @param category pointer to the category array | |
553 * @param subband_coef_index array of indexes to quant_centroid_tab | |
4674 | 554 * @param subband_coef_sign signs of coefficients |
2956 | 555 */ |
556 | |
557 static int unpack_SQVH(COOKContext *q, int category, int* subband_coef_index, | |
4674 | 558 int* subband_coef_sign) { |
2956 | 559 int i,j; |
560 int vlc, vd ,tmp, result; | |
561 | |
562 vd = vd_tab[category]; | |
563 result = 0; | |
564 for(i=0 ; i<vpr_tab[category] ; i++){ | |
565 vlc = get_vlc2(&q->gb, q->sqvh[category].table, q->sqvh[category].bits, 3); | |
566 if (q->bits_per_subpacket < get_bits_count(&q->gb)){ | |
567 vlc = 0; | |
568 result = 1; | |
569 } | |
570 for(j=vd-1 ; j>=0 ; j--){ | |
571 tmp = (vlc * invradix_tab[category])/0x100000; | |
572 subband_coef_index[vd*i+j] = vlc - tmp * (kmax_tab[category]+1); | |
573 vlc = tmp; | |
574 } | |
575 for(j=0 ; j<vd ; j++){ | |
576 if (subband_coef_index[i*vd + j]) { | |
577 if(get_bits_count(&q->gb) < q->bits_per_subpacket){ | |
4674 | 578 subband_coef_sign[i*vd+j] = get_bits1(&q->gb); |
2956 | 579 } else { |
580 result=1; | |
4674 | 581 subband_coef_sign[i*vd+j]=0; |
2956 | 582 } |
583 } else { | |
4674 | 584 subband_coef_sign[i*vd+j]=0; |
2956 | 585 } |
586 } | |
587 } | |
588 return result; | |
589 } | |
590 | |
591 | |
592 /** | |
593 * Fill the mlt_buffer with mlt coefficients. | |
594 * | |
595 * @param q pointer to the COOKContext | |
596 * @param category pointer to the category array | |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
597 * @param quant_index_table pointer to the array |
2956 | 598 * @param mlt_buffer pointer to mlt coefficients |
599 */ | |
600 | |
601 | |
602 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
|
603 int *quant_index_table, float* mlt_buffer){ |
2956 | 604 /* A zero in this table means that the subband coefficient is |
605 random noise coded. */ | |
4674 | 606 int subband_coef_index[SUBBAND_SIZE]; |
2956 | 607 /* A zero in this table means that the subband coefficient is a |
608 positive multiplicator. */ | |
4674 | 609 int subband_coef_sign[SUBBAND_SIZE]; |
2956 | 610 int band, j; |
611 int index=0; | |
612 | |
613 for(band=0 ; band<q->total_subbands ; band++){ | |
614 index = category[band]; | |
615 if(category[band] < 7){ | |
4674 | 616 if(unpack_SQVH(q, category[band], subband_coef_index, subband_coef_sign)){ |
2956 | 617 index=7; |
618 for(j=0 ; j<q->total_subbands ; j++) category[band+j]=7; | |
619 } | |
620 } | |
621 if(index==7) { | |
622 memset(subband_coef_index, 0, sizeof(subband_coef_index)); | |
4674 | 623 memset(subband_coef_sign, 0, sizeof(subband_coef_sign)); |
2956 | 624 } |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
625 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
|
626 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
|
627 &mlt_buffer[band * SUBBAND_SIZE]); |
2956 | 628 } |
629 | |
630 if(q->total_subbands*SUBBAND_SIZE >= q->samples_per_channel){ | |
631 return; | |
4674 | 632 } /* FIXME: should this be removed, or moved into loop above? */ |
2956 | 633 } |
634 | |
635 | |
636 /** | |
637 * function for decoding mono data | |
638 * | |
639 * @param q pointer to the COOKContext | |
4860 | 640 * @param mlt_buffer pointer to mlt coefficients |
2956 | 641 */ |
642 | |
643 static void mono_decode(COOKContext *q, float* mlt_buffer) { | |
644 | |
645 int category_index[128]; | |
646 int quant_index_table[102]; | |
647 int category[128]; | |
648 | |
649 memset(&category, 0, 128*sizeof(int)); | |
650 memset(&category_index, 0, 128*sizeof(int)); | |
651 | |
652 decode_envelope(q, quant_index_table); | |
3090 | 653 q->num_vectors = get_bits(&q->gb,q->log2_numvector_size); |
2956 | 654 categorize(q, quant_index_table, category, category_index); |
655 expand_category(q, category, category_index); | |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
656 decode_vectors(q, category, quant_index_table, mlt_buffer); |
2956 | 657 } |
658 | |
659 | |
660 /** | |
661 * the actual requantization of the timedomain samples | |
662 * | |
663 * @param q pointer to the COOKContext | |
664 * @param buffer pointer to the timedomain buffer | |
665 * @param gain_index index for the block multiplier | |
666 * @param gain_index_next index for the next block multiplier | |
667 */ | |
668 | |
5353
7e4703e16bbd
fixpoint: renaming all lowlevel arithmetic routines to xxx_float
mhoffman
parents:
5350
diff
changeset
|
669 static void interpolate_float(COOKContext *q, float* buffer, |
2956 | 670 int gain_index, int gain_index_next){ |
671 int i; | |
672 float fc1, fc2; | |
6861 | 673 fc1 = pow2tab[gain_index+63]; |
2956 | 674 |
675 if(gain_index == gain_index_next){ //static gain | |
676 for(i=0 ; i<q->gain_size_factor ; i++){ | |
677 buffer[i]*=fc1; | |
678 } | |
679 return; | |
680 } else { //smooth gain | |
681 fc2 = q->gain_table[11 + (gain_index_next-gain_index)]; | |
682 for(i=0 ; i<q->gain_size_factor ; i++){ | |
683 buffer[i]*=fc1; | |
684 fc1*=fc2; | |
685 } | |
686 return; | |
687 } | |
688 } | |
689 | |
5345
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
690 /** |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
691 * Apply transform window, overlap buffers. |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
692 * |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
693 * @param q pointer to the COOKContext |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
694 * @param inbuffer pointer to the mltcoefficients |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
695 * @param gains_ptr current and previous gains |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
696 * @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
|
697 */ |
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 static void imlt_window_float (COOKContext *q, float *buffer1, |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
700 cook_gains *gains_ptr, float *previous_buffer) |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
701 { |
6861 | 702 const float fc = pow2tab[gains_ptr->previous[0] + 63]; |
5345
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
703 int i; |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
704 /* 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
|
705 * 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
|
706 * next frame, has the wrong sign. Hence the subtraction below. |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
707 * Almost sounds like a complex conjugate/reverse data/FFT effect. |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
708 */ |
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 /* Apply window and overlap */ |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
711 for(i = 0; i < q->samples_per_channel; i++){ |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
712 buffer1[i] = buffer1[i] * fc * q->mlt_window[i] - |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
713 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
|
714 } |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
715 } |
2956 | 716 |
717 /** | |
4653 | 718 * The modulated lapped transform, this takes transform coefficients |
719 * and transforms them into timedomain samples. | |
720 * Apply transform window, overlap buffers, apply gain profile | |
721 * and buffer management. | |
2956 | 722 * |
723 * @param q pointer to the COOKContext | |
4653 | 724 * @param inbuffer pointer to the mltcoefficients |
4639 | 725 * @param gains_ptr current and previous gains |
2956 | 726 * @param previous_buffer pointer to the previous buffer to be used for overlapping |
727 */ | |
728 | |
4653 | 729 static void imlt_gain(COOKContext *q, float *inbuffer, |
730 cook_gains *gains_ptr, float* previous_buffer) | |
4639 | 731 { |
4653 | 732 float *buffer0 = q->mono_mdct_output; |
733 float *buffer1 = q->mono_mdct_output + q->samples_per_channel; | |
2956 | 734 int i; |
4639 | 735 |
4653 | 736 /* Inverse modified discrete cosine transform */ |
737 q->mdct_ctx.fft.imdct_calc(&q->mdct_ctx, q->mono_mdct_output, | |
738 inbuffer, q->mdct_tmp); | |
739 | |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
740 q->imlt_window (q, buffer1, gains_ptr, previous_buffer); |
2956 | 741 |
4639 | 742 /* Apply gain profile */ |
743 for (i = 0; i < 8; i++) { | |
744 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
|
745 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
|
746 gains_ptr->now[i], gains_ptr->now[i + 1]); |
4639 | 747 } |
2956 | 748 |
749 /* Save away the current to be previous block. */ | |
4653 | 750 memcpy(previous_buffer, buffer0, sizeof(float)*q->samples_per_channel); |
2956 | 751 } |
752 | |
753 | |
754 /** | |
755 * function for getting the jointstereo coupling information | |
756 * | |
757 * @param q pointer to the COOKContext | |
758 * @param decouple_tab decoupling array | |
759 * | |
760 */ | |
761 | |
762 static void decouple_info(COOKContext *q, int* decouple_tab){ | |
763 int length, i; | |
764 | |
765 if(get_bits1(&q->gb)) { | |
766 if(cplband[q->js_subband_start] > cplband[q->subbands-1]) return; | |
767 | |
768 length = cplband[q->subbands-1] - cplband[q->js_subband_start] + 1; | |
769 for (i=0 ; i<length ; i++) { | |
770 decouple_tab[cplband[q->js_subband_start] + i] = get_vlc2(&q->gb, q->ccpl.table, q->ccpl.bits, 2); | |
771 } | |
772 return; | |
773 } | |
774 | |
775 if(cplband[q->js_subband_start] > cplband[q->subbands-1]) return; | |
776 | |
777 length = cplband[q->subbands-1] - cplband[q->js_subband_start] + 1; | |
778 for (i=0 ; i<length ; i++) { | |
779 decouple_tab[cplband[q->js_subband_start] + i] = get_bits(&q->gb, q->js_vlc_bits); | |
780 } | |
781 return; | |
782 } | |
783 | |
5344
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
784 /* |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
785 * 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
|
786 * |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
787 * @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
|
788 * @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
|
789 * @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
|
790 * @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
|
791 * @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
|
792 * @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
|
793 * @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
|
794 */ |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
795 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
|
796 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
|
797 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
|
798 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
|
799 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
|
800 { |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
801 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
|
802 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
|
803 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
|
804 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
|
805 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
|
806 } |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
807 } |
2956 | 808 |
809 /** | |
810 * function for decoding joint stereo data | |
811 * | |
812 * @param q pointer to the COOKContext | |
813 * @param mlt_buffer1 pointer to left channel mlt coefficients | |
814 * @param mlt_buffer2 pointer to right channel mlt coefficients | |
815 */ | |
816 | |
817 static void joint_decode(COOKContext *q, float* mlt_buffer1, | |
818 float* mlt_buffer2) { | |
819 int i,j; | |
820 int decouple_tab[SUBBAND_SIZE]; | |
5342
887509b42d3f
moving automatic allocation of joint_decode/decode_buffer
mhoffman
parents:
5341
diff
changeset
|
821 float *decode_buffer = q->decode_buffer_0; |
5448 | 822 int idx, cpl_tmp; |
2956 | 823 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
|
824 const float* cplscale; |
2956 | 825 |
826 memset(decouple_tab, 0, sizeof(decouple_tab)); | |
827 memset(decode_buffer, 0, sizeof(decode_buffer)); | |
828 | |
829 /* Make sure the buffers are zeroed out. */ | |
830 memset(mlt_buffer1,0, 1024*sizeof(float)); | |
831 memset(mlt_buffer2,0, 1024*sizeof(float)); | |
832 decouple_info(q, decouple_tab); | |
833 mono_decode(q, decode_buffer); | |
834 | |
835 /* The two channels are stored interleaved in decode_buffer. */ | |
836 for (i=0 ; i<q->js_subband_start ; i++) { | |
837 for (j=0 ; j<SUBBAND_SIZE ; j++) { | |
838 mlt_buffer1[i*20+j] = decode_buffer[i*40+j]; | |
839 mlt_buffer2[i*20+j] = decode_buffer[i*40+20+j]; | |
840 } | |
841 } | |
842 | |
843 /* When we reach js_subband_start (the higher frequencies) | |
844 the coefficients are stored in a coupling scheme. */ | |
845 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
|
846 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
|
847 cpl_tmp = cplband[i]; |
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
848 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
|
849 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
|
850 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
|
851 f2 = cplscale[idx-1]; |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
852 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
|
853 idx = (1 << q->js_vlc_bits) - 1; |
2956 | 854 } |
855 } | |
856 | |
857 /** | |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
858 * First part of subpacket decoding: |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
859 * decode raw stream bytes and read gain info. |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
860 * |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
861 * @param q pointer to the COOKContext |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
862 * @param inbuffer pointer to raw stream data |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
863 * @param gain_ptr array of current/prev gain pointers |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
864 */ |
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 static inline void |
6232 | 867 decode_bytes_and_gain(COOKContext *q, const uint8_t *inbuffer, |
4639 | 868 cook_gains *gains_ptr) |
4424
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 int offset; |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
871 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
872 offset = decode_bytes(inbuffer, q->decoded_bytes_buffer, |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
873 q->bits_per_subpacket/8); |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
874 init_get_bits(&q->gb, q->decoded_bytes_buffer + offset, |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
875 q->bits_per_subpacket); |
4639 | 876 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
|
877 |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
878 /* Swap current and previous gains */ |
4639 | 879 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
|
880 } |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
881 |
5343
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
882 /** |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
883 * 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
|
884 * |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
885 * @param q pointer to the COOKContext |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
886 * @param chan channel to saturate |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
887 * @param out pointer to the output vector |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
888 */ |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
889 static void |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
890 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
|
891 { |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
892 int j; |
5348 | 893 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
|
894 /* Clip and convert floats to 16 bits. |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
895 */ |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
896 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
|
897 out[chan + q->nb_channels * j] = |
5523 | 898 av_clip_int16(lrintf(output[j])); |
5343
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
899 } |
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 |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
902 /** |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
903 * Final part of subpacket decoding: |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
904 * Apply modulated lapped transform, gain compensation, |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
905 * clip and convert to integer. |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
906 * |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
907 * @param q pointer to the COOKContext |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
908 * @param decode_buffer pointer to the mlt coefficients |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
909 * @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
|
910 * @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
|
911 * @param out pointer to the output buffer |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
912 * @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
|
913 */ |
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 static inline void |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
916 mlt_compensate_output(COOKContext *q, float *decode_buffer, |
4639 | 917 cook_gains *gains, float *previous_buffer, |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
918 int16_t *out, int chan) |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
919 { |
4653 | 920 imlt_gain(q, decode_buffer, gains, previous_buffer); |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
921 q->saturate_output (q, chan, out); |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
922 } |
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 /** |
2956 | 926 * Cook subpacket decoding. This function returns one decoded subpacket, |
927 * usually 1024 samples per channel. | |
928 * | |
929 * @param q pointer to the COOKContext | |
930 * @param inbuffer pointer to the inbuffer | |
931 * @param sub_packet_size subpacket size | |
932 * @param outbuffer pointer to the outbuffer | |
933 */ | |
934 | |
935 | |
6232 | 936 static int decode_subpacket(COOKContext *q, const uint8_t *inbuffer, |
2956 | 937 int sub_packet_size, int16_t *outbuffer) { |
938 /* packet dump */ | |
939 // for (i=0 ; i<sub_packet_size ; i++) { | |
940 // av_log(NULL, AV_LOG_ERROR, "%02x", inbuffer[i]); | |
941 // } | |
942 // av_log(NULL, AV_LOG_ERROR, "\n"); | |
943 | |
4639 | 944 decode_bytes_and_gain(q, inbuffer, &q->gains1); |
2956 | 945 |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
946 if (q->joint_stereo) { |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
947 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
|
948 } else { |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
949 mono_decode(q, q->decode_buffer_1); |
2956 | 950 |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
951 if (q->nb_channels == 2) { |
4639 | 952 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
|
953 mono_decode(q, q->decode_buffer_2); |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
954 } |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
955 } |
3014
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
956 |
4639 | 957 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
|
958 q->mono_previous_buffer1, outbuffer, 0); |
2956 | 959 |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
960 if (q->nb_channels == 2) { |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
961 if (q->joint_stereo) { |
4639 | 962 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
|
963 q->mono_previous_buffer2, outbuffer, 1); |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
964 } else { |
4639 | 965 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
|
966 q->mono_previous_buffer2, outbuffer, 1); |
2956 | 967 } |
968 } | |
2959
24805f4d1b84
This patch adds some support for non-joint stereo streams. It also
rtognimp
parents:
2956
diff
changeset
|
969 return q->samples_per_frame * sizeof(int16_t); |
2956 | 970 } |
971 | |
972 | |
973 /** | |
974 * Cook frame decoding | |
975 * | |
976 * @param avctx pointer to the AVCodecContext | |
977 */ | |
978 | |
979 static int cook_decode_frame(AVCodecContext *avctx, | |
980 void *data, int *data_size, | |
6232 | 981 const uint8_t *buf, int buf_size) { |
2956 | 982 COOKContext *q = avctx->priv_data; |
983 | |
984 if (buf_size < avctx->block_align) | |
985 return buf_size; | |
986 | |
987 *data_size = decode_subpacket(q, buf, avctx->block_align, data); | |
988 | |
4638
9f74306d4ac7
Don't output the first two frames, since they don't contain valid audio.
banan
parents:
4594
diff
changeset
|
989 /* 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
|
990 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
|
991 |
2956 | 992 return avctx->block_align; |
993 } | |
3090 | 994 |
2956 | 995 #ifdef COOKDEBUG |
4430
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
996 static void dump_cook_context(COOKContext *q) |
2956 | 997 { |
998 //int i=0; | |
999 #define PRINT(a,b) av_log(NULL,AV_LOG_ERROR," %s = %d\n", a, b); | |
1000 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
|
1001 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
|
1002 if (q->cookversion > STEREO) { |
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
1003 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
|
1004 PRINT("js_vlc_bits",q->js_vlc_bits); |
2956 | 1005 } |
1006 av_log(NULL,AV_LOG_ERROR,"COOKContext\n"); | |
1007 PRINT("nb_channels",q->nb_channels); | |
1008 PRINT("bit_rate",q->bit_rate); | |
1009 PRINT("sample_rate",q->sample_rate); | |
1010 PRINT("samples_per_channel",q->samples_per_channel); | |
1011 PRINT("samples_per_frame",q->samples_per_frame); | |
1012 PRINT("subbands",q->subbands); | |
1013 PRINT("random_state",q->random_state); | |
1014 PRINT("js_subband_start",q->js_subband_start); | |
3090 | 1015 PRINT("log2_numvector_size",q->log2_numvector_size); |
2956 | 1016 PRINT("numvector_size",q->numvector_size); |
1017 PRINT("total_subbands",q->total_subbands); | |
1018 } | |
1019 #endif | |
3090 | 1020 |
2956 | 1021 /** |
1022 * Cook initialization | |
1023 * | |
1024 * @param avctx pointer to the AVCodecContext | |
1025 */ | |
1026 | |
1027 static int cook_decode_init(AVCodecContext *avctx) | |
1028 { | |
1029 COOKContext *q = avctx->priv_data; | |
6232 | 1030 const uint8_t *edata_ptr = avctx->extradata; |
2956 | 1031 |
1032 /* Take care of the codec specific extradata. */ | |
1033 if (avctx->extradata_size <= 0) { | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1034 av_log(avctx,AV_LOG_ERROR,"Necessary extradata missing!\n"); |
2956 | 1035 return -1; |
1036 } else { | |
1037 /* 8 for mono, 16 for stereo, ? for multichannel | |
1038 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
|
1039 av_log(avctx,AV_LOG_DEBUG,"codecdata_length=%d\n",avctx->extradata_size); |
2956 | 1040 if (avctx->extradata_size >= 8){ |
4542 | 1041 q->cookversion = bytestream_get_be32(&edata_ptr); |
1042 q->samples_per_frame = bytestream_get_be16(&edata_ptr); | |
1043 q->subbands = bytestream_get_be16(&edata_ptr); | |
2956 | 1044 } |
1045 if (avctx->extradata_size >= 16){ | |
4542 | 1046 bytestream_get_be32(&edata_ptr); //Unknown unused |
1047 q->js_subband_start = bytestream_get_be16(&edata_ptr); | |
1048 q->js_vlc_bits = bytestream_get_be16(&edata_ptr); | |
2956 | 1049 } |
1050 } | |
1051 | |
1052 /* Take data from the AVCodecContext (RM container). */ | |
1053 q->sample_rate = avctx->sample_rate; | |
1054 q->nb_channels = avctx->channels; | |
1055 q->bit_rate = avctx->bit_rate; | |
1056 | |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
1057 /* Initialize RNG. */ |
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
1058 av_init_random(1, &q->random_state); |
2956 | 1059 |
1060 /* 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
|
1061 q->samples_per_channel = q->samples_per_frame / q->nb_channels; |
2956 | 1062 q->bits_per_subpacket = avctx->block_align * 8; |
1063 | |
1064 /* Initialize default data states. */ | |
3090 | 1065 q->log2_numvector_size = 5; |
2956 | 1066 q->total_subbands = q->subbands; |
1067 | |
1068 /* 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
|
1069 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
|
1070 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
|
1071 switch (q->cookversion) { |
4425 | 1072 case MONO: |
2956 | 1073 if (q->nb_channels != 1) { |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1074 av_log(avctx,AV_LOG_ERROR,"Container channels != 1, report sample!\n"); |
2956 | 1075 return -1; |
1076 } | |
4425 | 1077 av_log(avctx,AV_LOG_DEBUG,"MONO\n"); |
2956 | 1078 break; |
4425 | 1079 case STEREO: |
2956 | 1080 if (q->nb_channels != 1) { |
2959
24805f4d1b84
This patch adds some support for non-joint stereo streams. It also
rtognimp
parents:
2956
diff
changeset
|
1081 q->bits_per_subpacket = q->bits_per_subpacket/2; |
2956 | 1082 } |
4425 | 1083 av_log(avctx,AV_LOG_DEBUG,"STEREO\n"); |
2956 | 1084 break; |
1085 case JOINT_STEREO: | |
1086 if (q->nb_channels != 2) { | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1087 av_log(avctx,AV_LOG_ERROR,"Container channels != 2, report sample!\n"); |
2956 | 1088 return -1; |
1089 } | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1090 av_log(avctx,AV_LOG_DEBUG,"JOINT_STEREO\n"); |
2956 | 1091 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
|
1092 q->total_subbands = q->subbands + q->js_subband_start; |
2956 | 1093 q->joint_stereo = 1; |
1094 } | |
1095 if (q->samples_per_channel > 256) { | |
3091
0284d5b34916
Fix broken cosmetics commit and add a check for valid headers.
banan
parents:
3090
diff
changeset
|
1096 q->log2_numvector_size = 6; |
2956 | 1097 } |
1098 if (q->samples_per_channel > 512) { | |
3091
0284d5b34916
Fix broken cosmetics commit and add a check for valid headers.
banan
parents:
3090
diff
changeset
|
1099 q->log2_numvector_size = 7; |
2956 | 1100 } |
1101 break; | |
1102 case MC_COOK: | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1103 av_log(avctx,AV_LOG_ERROR,"MC_COOK not supported!\n"); |
2956 | 1104 return -1; |
1105 break; | |
1106 default: | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1107 av_log(avctx,AV_LOG_ERROR,"Unknown Cook version, report sample!\n"); |
2956 | 1108 return -1; |
1109 break; | |
1110 } | |
1111 | |
1112 /* Initialize variable relations */ | |
3090 | 1113 q->numvector_size = (1 << q->log2_numvector_size); |
2956 | 1114 |
1115 /* Generate tables */ | |
6861 | 1116 init_pow2table(); |
2956 | 1117 init_gain_table(q); |
5347
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
1118 init_cplscales_table(q); |
2956 | 1119 |
1120 if (init_cook_vlc_tables(q) != 0) | |
1121 return -1; | |
1122 | |
3303
68721b62a528
sanity checks, some might have been exploitable ...
michael
parents:
3106
diff
changeset
|
1123 |
68721b62a528
sanity checks, some might have been exploitable ...
michael
parents:
3106
diff
changeset
|
1124 if(avctx->block_align >= UINT_MAX/2) |
68721b62a528
sanity checks, some might have been exploitable ...
michael
parents:
3106
diff
changeset
|
1125 return -1; |
68721b62a528
sanity checks, some might have been exploitable ...
michael
parents:
3106
diff
changeset
|
1126 |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1127 /* Pad the databuffer with: |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1128 DECODE_BYTES_PAD1 or DECODE_BYTES_PAD2 for decode_bytes(), |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1129 FF_INPUT_BUFFER_PADDING_SIZE, for the bitstreamreader. */ |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1130 if (q->nb_channels==2 && q->joint_stereo==0) { |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1131 q->decoded_bytes_buffer = |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1132 av_mallocz(avctx->block_align/2 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1133 + DECODE_BYTES_PAD2(avctx->block_align/2) |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1134 + FF_INPUT_BUFFER_PADDING_SIZE); |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1135 } else { |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1136 q->decoded_bytes_buffer = |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1137 av_mallocz(avctx->block_align |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1138 + DECODE_BYTES_PAD1(avctx->block_align) |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1139 + FF_INPUT_BUFFER_PADDING_SIZE); |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1140 } |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1141 if (q->decoded_bytes_buffer == NULL) |
2956 | 1142 return -1; |
1143 | |
4639 | 1144 q->gains1.now = q->gain_1; |
1145 q->gains1.previous = q->gain_2; | |
1146 q->gains2.now = q->gain_3; | |
1147 q->gains2.previous = q->gain_4; | |
2956 | 1148 |
1149 /* Initialize transform. */ | |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
1150 if ( init_cook_mlt(q) != 0 ) |
2956 | 1151 return -1; |
3014
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1152 |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1153 /* Initialize COOK signal arithmetic handling */ |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1154 if (1) { |
5353
7e4703e16bbd
fixpoint: renaming all lowlevel arithmetic routines to xxx_float
mhoffman
parents:
5350
diff
changeset
|
1155 q->scalar_dequant = scalar_dequant_float; |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1156 q->decouple = decouple_float; |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1157 q->imlt_window = imlt_window_float; |
5353
7e4703e16bbd
fixpoint: renaming all lowlevel arithmetic routines to xxx_float
mhoffman
parents:
5350
diff
changeset
|
1158 q->interpolate = interpolate_float; |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1159 q->saturate_output = saturate_output_float; |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1160 } |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1161 |
3014
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1162 /* 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
|
1163 if (q->total_subbands > 53) { |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1164 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
|
1165 return -1; |
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1166 } |
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1167 if (q->subbands > 50) { |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1168 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
|
1169 return -1; |
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1170 } |
3091
0284d5b34916
Fix broken cosmetics commit and add a check for valid headers.
banan
parents:
3090
diff
changeset
|
1171 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
|
1172 } else { |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1173 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
|
1174 return -1; |
0284d5b34916
Fix broken cosmetics commit and add a check for valid headers.
banan
parents:
3090
diff
changeset
|
1175 } |
4431
85ac154efd99
Check that js_vlc_bits from the extradata is in a valid range.
banan
parents:
4430
diff
changeset
|
1176 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
|
1177 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
|
1178 return -1; |
85ac154efd99
Check that js_vlc_bits from the extradata is in a valid range.
banan
parents:
4430
diff
changeset
|
1179 } |
3014
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1180 |
3009
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
1181 #ifdef COOKDEBUG |
4430
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
1182 dump_cook_context(q); |
3009
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
1183 #endif |
2956 | 1184 return 0; |
1185 } | |
1186 | |
1187 | |
1188 AVCodec cook_decoder = | |
1189 { | |
1190 .name = "cook", | |
1191 .type = CODEC_TYPE_AUDIO, | |
1192 .id = CODEC_ID_COOK, | |
1193 .priv_data_size = sizeof(COOKContext), | |
1194 .init = cook_decode_init, | |
1195 .close = cook_decode_close, | |
1196 .decode = cook_decode_frame, | |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6903
diff
changeset
|
1197 .long_name = NULL_IF_CONFIG_SMALL("COOK"), |
2956 | 1198 }; |