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