Mercurial > libavcodec.hg
annotate cook.c @ 12483:0159a19bfff7 libavcodec
aacdec: Rework channel mapping compatibility hacks.
For a PCE based configuration map the channels solely based on tags.
For an indexed configuration map the channels solely based on position.
This works with all known exotic samples including al17, elem_id0, bad_concat,
and lfe_is_sce.
author | alexc |
---|---|
date | Fri, 10 Sep 2010 18:01:48 +0000 |
parents | 8b28e74de2c0 |
children |
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 /** | |
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11560
diff
changeset
|
24 * @file |
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 | |
9206 | 49 #include "libavutil/lfg.h" |
50 #include "libavutil/random_seed.h" | |
2956 | 51 #include "avcodec.h" |
9428 | 52 #include "get_bits.h" |
2956 | 53 #include "dsputil.h" |
4430
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
54 #include "bytestream.h" |
11370 | 55 #include "fft.h" |
2956 | 56 |
57 #include "cookdata.h" | |
58 | |
59 /* the different Cook versions */ | |
4425 | 60 #define MONO 0x1000001 |
61 #define STEREO 0x1000002 | |
2956 | 62 #define JOINT_STEREO 0x1000003 |
63 #define MC_COOK 0x2000000 //multichannel Cook, not supported | |
64 | |
65 #define SUBBAND_SIZE 20 | |
9175 | 66 #define MAX_SUBPACKETS 5 |
2956 | 67 //#define COOKDEBUG |
68 | |
69 typedef struct { | |
4639 | 70 int *now; |
71 int *previous; | |
72 } cook_gains; | |
2956 | 73 |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
74 typedef struct { |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
75 int ch_idx; |
9565
5c1aeaf1bc12
Proper subpacket size check for cook multichannel files.
banan
parents:
9564
diff
changeset
|
76 int size; |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
77 int num_channels; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
78 int cookversion; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
79 int samples_per_frame; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
80 int subbands; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
81 int js_subband_start; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
82 int js_vlc_bits; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
83 int samples_per_channel; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
84 int log2_numvector_size; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
85 unsigned int channel_mask; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
86 VLC ccpl; ///< channel coupling |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
87 int joint_stereo; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
88 int bits_per_subpacket; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
89 int bits_per_subpdiv; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
90 int total_subbands; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
91 int numvector_size; ///< 1 << log2_numvector_size; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
92 |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
93 float mono_previous_buffer1[1024]; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
94 float mono_previous_buffer2[1024]; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
95 /** gain buffers */ |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
96 cook_gains gains1; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
97 cook_gains gains2; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
98 int gain_1[9]; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
99 int gain_2[9]; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
100 int gain_3[9]; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
101 int gain_4[9]; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
102 } COOKSubpacket; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
103 |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
104 typedef struct cook { |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
105 /* |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
106 * The following 5 functions provide the lowlevel arithmetic on |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
107 * the internal audio buffers. |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
108 */ |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
109 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
|
110 int* subband_coef_index, int* subband_coef_sign, |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
111 float* mlt_p); |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
112 |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
113 void (* decouple) (struct cook *q, |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
114 COOKSubpacket *p, |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
115 int subband, |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
116 float f1, float f2, |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
117 float *decode_buffer, |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
118 float *mlt_buffer1, float *mlt_buffer2); |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
119 |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
120 void (* imlt_window) (struct cook *q, float *buffer1, |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
121 cook_gains *gains_ptr, float *previous_buffer); |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
122 |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
123 void (* interpolate) (struct cook *q, float* buffer, |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
124 int gain_index, int gain_index_next); |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
125 |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
126 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
|
127 |
9174
4d8d8fe29d4d
save avctx in cook decoder context and use it for av_log
banan
parents:
9173
diff
changeset
|
128 AVCodecContext* avctx; |
2956 | 129 GetBitContext gb; |
130 /* stream data */ | |
131 int nb_channels; | |
132 int bit_rate; | |
133 int sample_rate; | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
134 int num_vectors; |
2956 | 135 int samples_per_channel; |
136 /* states */ | |
9206 | 137 AVLFG random_state; |
2956 | 138 |
139 /* transform data */ | |
10199 | 140 FFTContext mdct_ctx; |
2956 | 141 float* mlt_window; |
142 | |
143 /* VLC data */ | |
144 VLC envelope_quant_index[13]; | |
145 VLC sqvh[7]; //scalar quantization | |
146 | |
147 /* generatable tables and related variables */ | |
148 int gain_size_factor; | |
149 float gain_table[23]; | |
150 | |
151 /* data buffers */ | |
152 | |
153 uint8_t* decoded_bytes_buffer; | |
11369 | 154 DECLARE_ALIGNED(16, float,mono_mdct_output)[2048]; |
2956 | 155 float decode_buffer_1[1024]; |
156 float decode_buffer_2[1024]; | |
5342
887509b42d3f
moving automatic allocation of joint_decode/decode_buffer
mhoffman
parents:
5341
diff
changeset
|
157 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
|
158 |
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
|
159 const float *cplscales[5]; |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
160 int num_subpackets; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
161 COOKSubpacket subpacket[MAX_SUBPACKETS]; |
2956 | 162 } COOKContext; |
163 | |
6861 | 164 static float pow2tab[127]; |
165 static float rootpow2tab[127]; | |
166 | |
2956 | 167 /* debug functions */ |
168 | |
169 #ifdef COOKDEBUG | |
170 static void dump_float_table(float* table, int size, int delimiter) { | |
171 int i=0; | |
172 av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i); | |
173 for (i=0 ; i<size ; i++) { | |
174 av_log(NULL, AV_LOG_ERROR, "%5.1f, ", table[i]); | |
175 if ((i+1)%delimiter == 0) av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i+1); | |
176 } | |
177 } | |
178 | |
179 static void dump_int_table(int* table, int size, int delimiter) { | |
180 int i=0; | |
181 av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i); | |
182 for (i=0 ; i<size ; i++) { | |
183 av_log(NULL, AV_LOG_ERROR, "%d, ", table[i]); | |
184 if ((i+1)%delimiter == 0) av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i+1); | |
185 } | |
186 } | |
187 | |
188 static void dump_short_table(short* table, int size, int delimiter) { | |
189 int i=0; | |
190 av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i); | |
191 for (i=0 ; i<size ; i++) { | |
192 av_log(NULL, AV_LOG_ERROR, "%d, ", table[i]); | |
193 if ((i+1)%delimiter == 0) av_log(NULL,AV_LOG_ERROR,"\n[%d]: ",i+1); | |
194 } | |
195 } | |
196 | |
197 #endif | |
198 | |
199 /*************** init functions ***************/ | |
200 | |
201 /* table generator */ | |
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8766
diff
changeset
|
202 static av_cold void init_pow2table(void){ |
2956 | 203 int i; |
6860 | 204 for (i=-63 ; i<64 ; i++){ |
6861 | 205 pow2tab[63+i]= pow(2, i); |
206 rootpow2tab[63+i]=sqrt(pow(2, i)); | |
2956 | 207 } |
208 } | |
209 | |
210 /* table generator */ | |
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8766
diff
changeset
|
211 static av_cold void init_gain_table(COOKContext *q) { |
2956 | 212 int i; |
213 q->gain_size_factor = q->samples_per_channel/8; | |
214 for (i=0 ; i<23 ; i++) { | |
6861 | 215 q->gain_table[i] = pow(pow2tab[i+52] , |
2956 | 216 (1.0/(double)q->gain_size_factor)); |
217 } | |
218 } | |
219 | |
220 | |
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8766
diff
changeset
|
221 static av_cold int init_cook_vlc_tables(COOKContext *q) { |
2956 | 222 int i, result; |
223 | |
224 result = 0; | |
225 for (i=0 ; i<13 ; i++) { | |
4951 | 226 result |= init_vlc (&q->envelope_quant_index[i], 9, 24, |
2956 | 227 envelope_quant_index_huffbits[i], 1, 1, |
228 envelope_quant_index_huffcodes[i], 2, 2, 0); | |
229 } | |
9174
4d8d8fe29d4d
save avctx in cook decoder context and use it for av_log
banan
parents:
9173
diff
changeset
|
230 av_log(q->avctx,AV_LOG_DEBUG,"sqvh VLC init\n"); |
2956 | 231 for (i=0 ; i<7 ; i++) { |
4951 | 232 result |= init_vlc (&q->sqvh[i], vhvlcsize_tab[i], vhsize_tab[i], |
2956 | 233 cvh_huffbits[i], 1, 1, |
234 cvh_huffcodes[i], 2, 2, 0); | |
235 } | |
236 | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
237 for(i=0;i<q->num_subpackets;i++){ |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
238 if (q->subpacket[i].joint_stereo==1){ |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
239 result |= init_vlc (&q->subpacket[i].ccpl, 6, (1<<q->subpacket[i].js_vlc_bits)-1, |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
240 ccpl_huffbits[q->subpacket[i].js_vlc_bits-2], 1, 1, |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
241 ccpl_huffcodes[q->subpacket[i].js_vlc_bits-2], 2, 2, 0); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
242 av_log(q->avctx,AV_LOG_DEBUG,"subpacket %i Joint-stereo VLC used.\n",i); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
243 } |
2956 | 244 } |
245 | |
9174
4d8d8fe29d4d
save avctx in cook decoder context and use it for av_log
banan
parents:
9173
diff
changeset
|
246 av_log(q->avctx,AV_LOG_DEBUG,"VLC tables initialized.\n"); |
2956 | 247 return result; |
248 } | |
249 | |
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8766
diff
changeset
|
250 static av_cold int init_cook_mlt(COOKContext *q) { |
2956 | 251 int j; |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
252 int mlt_size = q->samples_per_channel; |
2956 | 253 |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
254 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
|
255 return -1; |
2956 | 256 |
257 /* 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
|
258 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
|
259 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
|
260 q->mlt_window[j] *= sqrt(2.0 / q->samples_per_channel); |
2956 | 261 |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
262 /* Initialize the MDCT. */ |
9658
67a20f0eb42c
Support for getting (i)MDCT output multiplied by a constant scaling factor.
serge
parents:
9648
diff
changeset
|
263 if (ff_mdct_init(&q->mdct_ctx, av_log2(mlt_size)+1, 1, 1.0)) { |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
264 av_free(q->mlt_window); |
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
265 return -1; |
2956 | 266 } |
9174
4d8d8fe29d4d
save avctx in cook decoder context and use it for av_log
banan
parents:
9173
diff
changeset
|
267 av_log(q->avctx,AV_LOG_DEBUG,"MDCT initialized, order = %d.\n", |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
268 av_log2(mlt_size)+1); |
2956 | 269 |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
270 return 0; |
2956 | 271 } |
272 | |
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
|
273 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
|
274 { |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
275 if (1) |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
276 return ptr; |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
277 } |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
278 |
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8766
diff
changeset
|
279 static av_cold 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
|
280 int i; |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
281 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
|
282 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
|
283 } |
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
284 |
2956 | 285 /*************** init functions end ***********/ |
286 | |
12072
313167689ce8
Move DECODE_BYTES_PAD* macros before Doxygen comments.
diego
parents:
12069
diff
changeset
|
287 #define DECODE_BYTES_PAD1(bytes) (3 - ((bytes)+3) % 4) |
313167689ce8
Move DECODE_BYTES_PAD* macros before Doxygen comments.
diego
parents:
12069
diff
changeset
|
288 #define DECODE_BYTES_PAD2(bytes) ((bytes) % 4 + DECODE_BYTES_PAD1(2 * (bytes))) |
313167689ce8
Move DECODE_BYTES_PAD* macros before Doxygen comments.
diego
parents:
12069
diff
changeset
|
289 |
2956 | 290 /** |
291 * Cook indata decoding, every 32 bits are XORed with 0x37c511f2. | |
292 * Why? No idea, some checksum/error detection method maybe. | |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
293 * |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
294 * Out buffer size: extra bytes are needed to cope with |
5408 | 295 * padding/misalignment. |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
296 * Subpackets passed to the decoder can contain two, consecutive |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
297 * half-subpackets, of identical but arbitrary size. |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
298 * 1234 1234 1234 1234 extraA extraB |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
299 * Case 1: AAAA BBBB 0 0 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
300 * Case 2: AAAA ABBB BB-- 3 3 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
301 * Case 3: AAAA AABB BBBB 2 2 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
302 * Case 4: AAAA AAAB BBBB BB-- 1 5 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
303 * |
2956 | 304 * Nice way to waste CPU cycles. |
305 * | |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
306 * @param inbuffer pointer to byte array of indata |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
307 * @param out pointer to byte array of outdata |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
308 * @param bytes number of bytes |
2956 | 309 */ |
310 | |
6232 | 311 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
|
312 int i, off; |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
313 uint32_t c; |
6232 | 314 const uint32_t* buf; |
2956 | 315 uint32_t* obuf = (uint32_t*) out; |
316 /* FIXME: 64 bit platforms would be able to do 64 bits at a time. | |
317 * I'm too lazy though, should be something like | |
318 * for(i=0 ; i<bitamount/64 ; i++) | |
12129 | 319 * (int64_t)out[i] = 0x37c511f237c511f2^av_be2ne64(int64_t)in[i]); |
2956 | 320 * Buffer alignment needs to be checked. */ |
321 | |
9183
7b62479a31ec
use intptr_t to cast pointers to int in codecs maintained by benjamin larsson
ramiro
parents:
9176
diff
changeset
|
322 off = (intptr_t)inbuffer & 3; |
6232 | 323 buf = (const uint32_t*) (inbuffer - off); |
12129 | 324 c = av_be2ne32((0x37c511f2 >> (off*8)) | (0x37c511f2 << (32-(off*8)))); |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
325 bytes += 3 + off; |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
326 for (i = 0; i < bytes/4; i++) |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
327 obuf[i] = c ^ buf[i]; |
2956 | 328 |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
329 return off; |
2956 | 330 } |
331 | |
332 /** | |
333 * Cook uninit | |
334 */ | |
335 | |
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8766
diff
changeset
|
336 static av_cold int cook_decode_close(AVCodecContext *avctx) |
2956 | 337 { |
338 int i; | |
339 COOKContext *q = avctx->priv_data; | |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
340 av_log(avctx,AV_LOG_DEBUG, "Deallocating memory.\n"); |
2956 | 341 |
342 /* Free allocated memory buffers. */ | |
343 av_free(q->mlt_window); | |
344 av_free(q->decoded_bytes_buffer); | |
345 | |
346 /* Free the transform. */ | |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
347 ff_mdct_end(&q->mdct_ctx); |
2956 | 348 |
349 /* Free the VLC tables. */ | |
350 for (i=0 ; i<13 ; i++) { | |
351 free_vlc(&q->envelope_quant_index[i]); | |
352 } | |
353 for (i=0 ; i<7 ; i++) { | |
354 free_vlc(&q->sqvh[i]); | |
355 } | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
356 for (i=0 ; i<q->num_subpackets ; i++) { |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
357 free_vlc(&q->subpacket[i].ccpl); |
2956 | 358 } |
359 | |
9174
4d8d8fe29d4d
save avctx in cook decoder context and use it for av_log
banan
parents:
9173
diff
changeset
|
360 av_log(avctx,AV_LOG_DEBUG,"Memory deallocated.\n"); |
2956 | 361 |
362 return 0; | |
363 } | |
364 | |
365 /** | |
4639 | 366 * Fill the gain array for the timedomain quantization. |
2956 | 367 * |
12113 | 368 * @param gb pointer to the GetBitContext |
369 * @param gaininfo[9] array of gain indexes | |
2956 | 370 */ |
371 | |
4639 | 372 static void decode_gain_info(GetBitContext *gb, int *gaininfo) |
373 { | |
374 int i, n; | |
2956 | 375 |
376 while (get_bits1(gb)) {} | |
4639 | 377 n = get_bits_count(gb) - 1; //amount of elements*2 to update |
2956 | 378 |
4639 | 379 i = 0; |
380 while (n--) { | |
381 int index = get_bits(gb, 3); | |
382 int gain = get_bits1(gb) ? get_bits(gb, 4) - 7 : -1; | |
383 | |
384 while (i <= index) gaininfo[i++] = gain; | |
2956 | 385 } |
4639 | 386 while (i <= 8) gaininfo[i++] = 0; |
2956 | 387 } |
388 | |
389 /** | |
390 * Create the quant index table needed for the envelope. | |
391 * | |
392 * @param q pointer to the COOKContext | |
393 * @param quant_index_table pointer to the array | |
394 */ | |
395 | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
396 static void decode_envelope(COOKContext *q, COOKSubpacket *p, int* quant_index_table) { |
2956 | 397 int i,j, vlc_index; |
398 | |
399 quant_index_table[0]= get_bits(&q->gb,6) - 6; //This is used later in categorize | |
400 | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
401 for (i=1 ; i < p->total_subbands ; i++){ |
2956 | 402 vlc_index=i; |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
403 if (i >= p->js_subband_start * 2) { |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
404 vlc_index-=p->js_subband_start; |
2956 | 405 } else { |
406 vlc_index/=2; | |
407 if(vlc_index < 1) vlc_index = 1; | |
408 } | |
409 if (vlc_index>13) vlc_index = 13; //the VLC tables >13 are identical to No. 13 | |
410 | |
411 j = get_vlc2(&q->gb, q->envelope_quant_index[vlc_index-1].table, | |
412 q->envelope_quant_index[vlc_index-1].bits,2); | |
413 quant_index_table[i] = quant_index_table[i-1] + j - 12; //differential encoding | |
414 } | |
415 } | |
416 | |
417 /** | |
418 * Calculate the category and category_index vector. | |
419 * | |
420 * @param q pointer to the COOKContext | |
421 * @param quant_index_table pointer to the array | |
422 * @param category pointer to the category array | |
423 * @param category_index pointer to the category_index array | |
424 */ | |
425 | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
426 static void categorize(COOKContext *q, COOKSubpacket *p, int* quant_index_table, |
2956 | 427 int* category, int* category_index){ |
4952
1900e2eaecda
Add another tmpbias variable, as bias' value will be used later
ramiro
parents:
4951
diff
changeset
|
428 int exp_idx, bias, tmpbias1, tmpbias2, bits_left, num_bits, index, v, i, j; |
2956 | 429 int exp_index2[102]; |
430 int exp_index1[102]; | |
431 | |
4955
bbe763044678
Use 1 array with double the size instead of 2 arrays with normal size
ramiro
parents:
4954
diff
changeset
|
432 int tmp_categorize_array[128*2]; |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
433 int tmp_categorize_array1_idx=p->numvector_size; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
434 int tmp_categorize_array2_idx=p->numvector_size; |
2956 | 435 |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
436 bits_left = p->bits_per_subpacket - get_bits_count(&q->gb); |
2956 | 437 |
438 if(bits_left > q->samples_per_channel) { | |
439 bits_left = q->samples_per_channel + | |
440 ((bits_left - q->samples_per_channel)*5)/8; | |
9174
4d8d8fe29d4d
save avctx in cook decoder context and use it for av_log
banan
parents:
9173
diff
changeset
|
441 //av_log(q->avctx, AV_LOG_ERROR, "bits_left = %d\n",bits_left); |
2956 | 442 } |
443 | |
444 memset(&exp_index1,0,102*sizeof(int)); | |
445 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
|
446 memset(&tmp_categorize_array,0,128*2*sizeof(int)); |
2956 | 447 |
448 bias=-32; | |
449 | |
450 /* Estimate bias. */ | |
451 for (i=32 ; i>0 ; i=i/2){ | |
452 num_bits = 0; | |
453 index = 0; | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
454 for (j=p->total_subbands ; j>0 ; j--){ |
4863 | 455 exp_idx = av_clip((i - quant_index_table[index] + bias) / 2, 0, 7); |
2956 | 456 index++; |
457 num_bits+=expbits_tab[exp_idx]; | |
458 } | |
459 if(num_bits >= bits_left - 32){ | |
460 bias+=i; | |
461 } | |
462 } | |
463 | |
464 /* Calculate total number of bits. */ | |
465 num_bits=0; | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
466 for (i=0 ; i<p->total_subbands ; i++) { |
4863 | 467 exp_idx = av_clip((bias - quant_index_table[i]) / 2, 0, 7); |
2956 | 468 num_bits += expbits_tab[exp_idx]; |
469 exp_index1[i] = exp_idx; | |
470 exp_index2[i] = exp_idx; | |
471 } | |
4952
1900e2eaecda
Add another tmpbias variable, as bias' value will be used later
ramiro
parents:
4951
diff
changeset
|
472 tmpbias1 = tmpbias2 = num_bits; |
2956 | 473 |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
474 for (j = 1 ; j < p->numvector_size ; j++) { |
4952
1900e2eaecda
Add another tmpbias variable, as bias' value will be used later
ramiro
parents:
4951
diff
changeset
|
475 if (tmpbias1 + tmpbias2 > 2*bits_left) { /* ---> */ |
2956 | 476 int max = -999999; |
477 index=-1; | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
478 for (i=0 ; i<p->total_subbands ; i++){ |
2956 | 479 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
|
480 v = (-2*exp_index1[i]) - quant_index_table[i] + bias; |
2956 | 481 if ( v >= max) { |
482 max = v; | |
483 index = i; | |
484 } | |
485 } | |
486 } | |
487 if(index==-1)break; | |
4955
bbe763044678
Use 1 array with double the size instead of 2 arrays with normal size
ramiro
parents:
4954
diff
changeset
|
488 tmp_categorize_array[tmp_categorize_array1_idx++] = index; |
4952
1900e2eaecda
Add another tmpbias variable, as bias' value will be used later
ramiro
parents:
4951
diff
changeset
|
489 tmpbias1 -= expbits_tab[exp_index1[index]] - |
4953 | 490 expbits_tab[exp_index1[index]+1]; |
2956 | 491 ++exp_index1[index]; |
492 } else { /* <--- */ | |
493 int min = 999999; | |
494 index=-1; | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
495 for (i=0 ; i<p->total_subbands ; i++){ |
2956 | 496 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
|
497 v = (-2*exp_index2[i])-quant_index_table[i]+bias; |
2956 | 498 if ( v < min) { |
499 min = v; | |
500 index = i; | |
501 } | |
502 } | |
503 } | |
504 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
|
505 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
|
506 tmpbias2 -= expbits_tab[exp_index2[index]] - |
4953 | 507 expbits_tab[exp_index2[index]-1]; |
2956 | 508 --exp_index2[index]; |
509 } | |
510 } | |
511 | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
512 for(i=0 ; i<p->total_subbands ; i++) |
2956 | 513 category[i] = exp_index2[i]; |
514 | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
515 for(i=0 ; i<p->numvector_size-1 ; i++) |
4955
bbe763044678
Use 1 array with double the size instead of 2 arrays with normal size
ramiro
parents:
4954
diff
changeset
|
516 category_index[i] = tmp_categorize_array[tmp_categorize_array2_idx++]; |
2956 | 517 |
518 } | |
519 | |
520 | |
521 /** | |
522 * Expand the category vector. | |
523 * | |
524 * @param q pointer to the COOKContext | |
525 * @param category pointer to the category array | |
526 * @param category_index pointer to the category_index array | |
527 */ | |
528 | |
4908
777f250df232
Fix multiple "¡Æinline/static¡Ç is not at beginning of declaration" warnings.
diego
parents:
4863
diff
changeset
|
529 static inline void expand_category(COOKContext *q, int* category, |
2956 | 530 int* category_index){ |
531 int i; | |
532 for(i=0 ; i<q->num_vectors ; i++){ | |
533 ++category[category_index[i]]; | |
534 } | |
535 } | |
536 | |
537 /** | |
538 * The real requantization of the mltcoefs | |
539 * | |
540 * @param q pointer to the COOKContext | |
541 * @param index index | |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
542 * @param quant_index quantisation index |
2956 | 543 * @param subband_coef_index array of indexes to quant_centroid_tab |
4674 | 544 * @param subband_coef_sign signs of coefficients |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
545 * @param mlt_p pointer into the mlt buffer |
2956 | 546 */ |
547 | |
5353
7e4703e16bbd
fixpoint: renaming all lowlevel arithmetic routines to xxx_float
mhoffman
parents:
5350
diff
changeset
|
548 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
|
549 int* subband_coef_index, int* subband_coef_sign, |
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
550 float* mlt_p){ |
2956 | 551 int i; |
552 float f1; | |
553 | |
554 for(i=0 ; i<SUBBAND_SIZE ; i++) { | |
555 if (subband_coef_index[i]) { | |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
556 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
|
557 if (subband_coef_sign[i]) f1 = -f1; |
2956 | 558 } else { |
4674 | 559 /* 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
|
560 f1 = dither_tab[index]; |
9206 | 561 if (av_lfg_get(&q->random_state) < 0x80000000) f1 = -f1; |
2956 | 562 } |
6861 | 563 mlt_p[i] = f1 * rootpow2tab[quant_index+63]; |
2956 | 564 } |
565 } | |
566 /** | |
4674 | 567 * Unpack the subband_coef_index and subband_coef_sign vectors. |
2956 | 568 * |
569 * @param q pointer to the COOKContext | |
570 * @param category pointer to the category array | |
571 * @param subband_coef_index array of indexes to quant_centroid_tab | |
4674 | 572 * @param subband_coef_sign signs of coefficients |
2956 | 573 */ |
574 | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
575 static int unpack_SQVH(COOKContext *q, COOKSubpacket *p, int category, int* subband_coef_index, |
4674 | 576 int* subband_coef_sign) { |
2956 | 577 int i,j; |
578 int vlc, vd ,tmp, result; | |
579 | |
580 vd = vd_tab[category]; | |
581 result = 0; | |
582 for(i=0 ; i<vpr_tab[category] ; i++){ | |
583 vlc = get_vlc2(&q->gb, q->sqvh[category].table, q->sqvh[category].bits, 3); | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
584 if (p->bits_per_subpacket < get_bits_count(&q->gb)){ |
2956 | 585 vlc = 0; |
586 result = 1; | |
587 } | |
588 for(j=vd-1 ; j>=0 ; j--){ | |
589 tmp = (vlc * invradix_tab[category])/0x100000; | |
590 subband_coef_index[vd*i+j] = vlc - tmp * (kmax_tab[category]+1); | |
591 vlc = tmp; | |
592 } | |
593 for(j=0 ; j<vd ; j++){ | |
594 if (subband_coef_index[i*vd + j]) { | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
595 if(get_bits_count(&q->gb) < p->bits_per_subpacket){ |
4674 | 596 subband_coef_sign[i*vd+j] = get_bits1(&q->gb); |
2956 | 597 } else { |
598 result=1; | |
4674 | 599 subband_coef_sign[i*vd+j]=0; |
2956 | 600 } |
601 } else { | |
4674 | 602 subband_coef_sign[i*vd+j]=0; |
2956 | 603 } |
604 } | |
605 } | |
606 return result; | |
607 } | |
608 | |
609 | |
610 /** | |
611 * Fill the mlt_buffer with mlt coefficients. | |
612 * | |
613 * @param q pointer to the COOKContext | |
614 * @param category pointer to the category array | |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
615 * @param quant_index_table pointer to the array |
2956 | 616 * @param mlt_buffer pointer to mlt coefficients |
617 */ | |
618 | |
619 | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
620 static void decode_vectors(COOKContext* q, COOKSubpacket* p, int* category, |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
621 int *quant_index_table, float* mlt_buffer){ |
2956 | 622 /* A zero in this table means that the subband coefficient is |
623 random noise coded. */ | |
4674 | 624 int subband_coef_index[SUBBAND_SIZE]; |
2956 | 625 /* A zero in this table means that the subband coefficient is a |
626 positive multiplicator. */ | |
4674 | 627 int subband_coef_sign[SUBBAND_SIZE]; |
2956 | 628 int band, j; |
629 int index=0; | |
630 | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
631 for(band=0 ; band<p->total_subbands ; band++){ |
2956 | 632 index = category[band]; |
633 if(category[band] < 7){ | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
634 if(unpack_SQVH(q, p, category[band], subband_coef_index, subband_coef_sign)){ |
2956 | 635 index=7; |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
636 for(j=0 ; j<p->total_subbands ; j++) category[band+j]=7; |
2956 | 637 } |
638 } | |
9173
fb675a9727f0
memset when category is >=7, part of cook multichannel
banan
parents:
9007
diff
changeset
|
639 if(index>=7) { |
2956 | 640 memset(subband_coef_index, 0, sizeof(subband_coef_index)); |
4674 | 641 memset(subband_coef_sign, 0, sizeof(subband_coef_sign)); |
2956 | 642 } |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
643 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
|
644 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
|
645 &mlt_buffer[band * SUBBAND_SIZE]); |
2956 | 646 } |
647 | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
648 if(p->total_subbands*SUBBAND_SIZE >= q->samples_per_channel){ |
2956 | 649 return; |
4674 | 650 } /* FIXME: should this be removed, or moved into loop above? */ |
2956 | 651 } |
652 | |
653 | |
654 /** | |
655 * function for decoding mono data | |
656 * | |
657 * @param q pointer to the COOKContext | |
4860 | 658 * @param mlt_buffer pointer to mlt coefficients |
2956 | 659 */ |
660 | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
661 static void mono_decode(COOKContext *q, COOKSubpacket *p, float* mlt_buffer) { |
2956 | 662 |
663 int category_index[128]; | |
664 int quant_index_table[102]; | |
665 int category[128]; | |
666 | |
667 memset(&category, 0, 128*sizeof(int)); | |
668 memset(&category_index, 0, 128*sizeof(int)); | |
669 | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
670 decode_envelope(q, p, quant_index_table); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
671 q->num_vectors = get_bits(&q->gb,p->log2_numvector_size); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
672 categorize(q, p, quant_index_table, category, category_index); |
2956 | 673 expand_category(q, category, category_index); |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
674 decode_vectors(q, p, category, quant_index_table, mlt_buffer); |
2956 | 675 } |
676 | |
677 | |
678 /** | |
679 * the actual requantization of the timedomain samples | |
680 * | |
681 * @param q pointer to the COOKContext | |
682 * @param buffer pointer to the timedomain buffer | |
683 * @param gain_index index for the block multiplier | |
684 * @param gain_index_next index for the next block multiplier | |
685 */ | |
686 | |
5353
7e4703e16bbd
fixpoint: renaming all lowlevel arithmetic routines to xxx_float
mhoffman
parents:
5350
diff
changeset
|
687 static void interpolate_float(COOKContext *q, float* buffer, |
2956 | 688 int gain_index, int gain_index_next){ |
689 int i; | |
690 float fc1, fc2; | |
6861 | 691 fc1 = pow2tab[gain_index+63]; |
2956 | 692 |
693 if(gain_index == gain_index_next){ //static gain | |
694 for(i=0 ; i<q->gain_size_factor ; i++){ | |
695 buffer[i]*=fc1; | |
696 } | |
697 return; | |
698 } else { //smooth gain | |
699 fc2 = q->gain_table[11 + (gain_index_next-gain_index)]; | |
700 for(i=0 ; i<q->gain_size_factor ; i++){ | |
701 buffer[i]*=fc1; | |
702 fc1*=fc2; | |
703 } | |
704 return; | |
705 } | |
706 } | |
707 | |
5345
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 * Apply transform window, overlap buffers. |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
710 * |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
711 * @param q pointer to the COOKContext |
12116
0ae85799341a
Improve variable names in imlt_window_float() and mlt_compensate_output().
diego
parents:
12113
diff
changeset
|
712 * @param inbuffer pointer to the mltcoefficients |
5345
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
713 * @param gains_ptr current and previous gains |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
714 * @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
|
715 */ |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
716 |
12116
0ae85799341a
Improve variable names in imlt_window_float() and mlt_compensate_output().
diego
parents:
12113
diff
changeset
|
717 static void imlt_window_float (COOKContext *q, float *inbuffer, |
5345
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
718 cook_gains *gains_ptr, float *previous_buffer) |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
719 { |
6861 | 720 const float fc = pow2tab[gains_ptr->previous[0] + 63]; |
5345
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
721 int i; |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
722 /* 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
|
723 * 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
|
724 * next frame, has the wrong sign. Hence the subtraction below. |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
725 * Almost sounds like a complex conjugate/reverse data/FFT effect. |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
726 */ |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
727 |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
728 /* Apply window and overlap */ |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
729 for(i = 0; i < q->samples_per_channel; i++){ |
12116
0ae85799341a
Improve variable names in imlt_window_float() and mlt_compensate_output().
diego
parents:
12113
diff
changeset
|
730 inbuffer[i] = inbuffer[i] * fc * q->mlt_window[i] - |
5345
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
731 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
|
732 } |
af1c85da8982
fixpoint: separate windowing arithmetic imlt_window_float
mhoffman
parents:
5344
diff
changeset
|
733 } |
2956 | 734 |
735 /** | |
4653 | 736 * The modulated lapped transform, this takes transform coefficients |
737 * and transforms them into timedomain samples. | |
738 * Apply transform window, overlap buffers, apply gain profile | |
739 * and buffer management. | |
2956 | 740 * |
741 * @param q pointer to the COOKContext | |
4653 | 742 * @param inbuffer pointer to the mltcoefficients |
4639 | 743 * @param gains_ptr current and previous gains |
2956 | 744 * @param previous_buffer pointer to the previous buffer to be used for overlapping |
745 */ | |
746 | |
4653 | 747 static void imlt_gain(COOKContext *q, float *inbuffer, |
748 cook_gains *gains_ptr, float* previous_buffer) | |
4639 | 749 { |
4653 | 750 float *buffer0 = q->mono_mdct_output; |
751 float *buffer1 = q->mono_mdct_output + q->samples_per_channel; | |
2956 | 752 int i; |
4639 | 753 |
4653 | 754 /* Inverse modified discrete cosine transform */ |
7547 | 755 ff_imdct_calc(&q->mdct_ctx, q->mono_mdct_output, inbuffer); |
4653 | 756 |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
757 q->imlt_window (q, buffer1, gains_ptr, previous_buffer); |
2956 | 758 |
4639 | 759 /* Apply gain profile */ |
760 for (i = 0; i < 8; i++) { | |
761 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
|
762 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
|
763 gains_ptr->now[i], gains_ptr->now[i + 1]); |
4639 | 764 } |
2956 | 765 |
766 /* Save away the current to be previous block. */ | |
4653 | 767 memcpy(previous_buffer, buffer0, sizeof(float)*q->samples_per_channel); |
2956 | 768 } |
769 | |
770 | |
771 /** | |
772 * function for getting the jointstereo coupling information | |
773 * | |
774 * @param q pointer to the COOKContext | |
775 * @param decouple_tab decoupling array | |
776 * | |
777 */ | |
778 | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
779 static void decouple_info(COOKContext *q, COOKSubpacket *p, int* decouple_tab){ |
2956 | 780 int length, i; |
781 | |
782 if(get_bits1(&q->gb)) { | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
783 if(cplband[p->js_subband_start] > cplband[p->subbands-1]) return; |
2956 | 784 |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
785 length = cplband[p->subbands-1] - cplband[p->js_subband_start] + 1; |
2956 | 786 for (i=0 ; i<length ; i++) { |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
787 decouple_tab[cplband[p->js_subband_start] + i] = get_vlc2(&q->gb, p->ccpl.table, p->ccpl.bits, 2); |
2956 | 788 } |
789 return; | |
790 } | |
791 | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
792 if(cplband[p->js_subband_start] > cplband[p->subbands-1]) return; |
2956 | 793 |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
794 length = cplband[p->subbands-1] - cplband[p->js_subband_start] + 1; |
2956 | 795 for (i=0 ; i<length ; i++) { |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
796 decouple_tab[cplband[p->js_subband_start] + i] = get_bits(&q->gb, p->js_vlc_bits); |
2956 | 797 } |
798 return; | |
799 } | |
800 | |
5344
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
801 /* |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
802 * 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
|
803 * |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
804 * @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
|
805 * @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
|
806 * @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
|
807 * @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
|
808 * @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
|
809 * @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
|
810 * @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
|
811 */ |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
812 static void decouple_float (COOKContext *q, |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
813 COOKSubpacket *p, |
5344
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
814 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
|
815 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
|
816 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
|
817 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
|
818 { |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
819 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
|
820 for (j=0 ; j<SUBBAND_SIZE ; j++) { |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
821 tmp_idx = ((p->js_subband_start + subband)*SUBBAND_SIZE)+j; |
5344
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
822 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
|
823 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
|
824 } |
b0d49997bd92
separate the actual math for recovering stereo from a signal channel, this is to allow fixpoint implementation
mhoffman
parents:
5343
diff
changeset
|
825 } |
2956 | 826 |
827 /** | |
828 * function for decoding joint stereo data | |
829 * | |
830 * @param q pointer to the COOKContext | |
831 * @param mlt_buffer1 pointer to left channel mlt coefficients | |
832 * @param mlt_buffer2 pointer to right channel mlt coefficients | |
833 */ | |
834 | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
835 static void joint_decode(COOKContext *q, COOKSubpacket *p, float* mlt_buffer1, |
2956 | 836 float* mlt_buffer2) { |
837 int i,j; | |
838 int decouple_tab[SUBBAND_SIZE]; | |
5342
887509b42d3f
moving automatic allocation of joint_decode/decode_buffer
mhoffman
parents:
5341
diff
changeset
|
839 float *decode_buffer = q->decode_buffer_0; |
5448 | 840 int idx, cpl_tmp; |
2956 | 841 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
|
842 const float* cplscale; |
2956 | 843 |
844 memset(decouple_tab, 0, sizeof(decouple_tab)); | |
845 memset(decode_buffer, 0, sizeof(decode_buffer)); | |
846 | |
847 /* Make sure the buffers are zeroed out. */ | |
848 memset(mlt_buffer1,0, 1024*sizeof(float)); | |
849 memset(mlt_buffer2,0, 1024*sizeof(float)); | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
850 decouple_info(q, p, decouple_tab); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
851 mono_decode(q, p, decode_buffer); |
2956 | 852 |
853 /* The two channels are stored interleaved in decode_buffer. */ | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
854 for (i=0 ; i<p->js_subband_start ; i++) { |
2956 | 855 for (j=0 ; j<SUBBAND_SIZE ; j++) { |
856 mlt_buffer1[i*20+j] = decode_buffer[i*40+j]; | |
857 mlt_buffer2[i*20+j] = decode_buffer[i*40+20+j]; | |
858 } | |
859 } | |
860 | |
861 /* When we reach js_subband_start (the higher frequencies) | |
862 the coefficients are stored in a coupling scheme. */ | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
863 idx = (1 << p->js_vlc_bits) - 1; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
864 for (i=p->js_subband_start ; i<p->subbands ; i++) { |
3009
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
865 cpl_tmp = cplband[i]; |
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
866 idx -=decouple_tab[cpl_tmp]; |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
867 cplscale = q->cplscales[p->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
|
868 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
|
869 f2 = cplscale[idx-1]; |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
870 q->decouple (q, p, i, f1, f2, decode_buffer, mlt_buffer1, mlt_buffer2); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
871 idx = (1 << p->js_vlc_bits) - 1; |
2956 | 872 } |
873 } | |
874 | |
875 /** | |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
876 * First part of subpacket decoding: |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
877 * decode raw stream bytes and read gain info. |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
878 * |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
879 * @param q pointer to the COOKContext |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
880 * @param inbuffer pointer to raw stream data |
12056
25e9cb2b9477
Fix misspelled parameter names in Doxygen documentation.
diego
parents:
11644
diff
changeset
|
881 * @param gains_ptr array of current/prev gain pointers |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
882 */ |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
883 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
884 static inline void |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
885 decode_bytes_and_gain(COOKContext *q, COOKSubpacket *p, const uint8_t *inbuffer, |
4639 | 886 cook_gains *gains_ptr) |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
887 { |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
888 int offset; |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
889 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
890 offset = decode_bytes(inbuffer, q->decoded_bytes_buffer, |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
891 p->bits_per_subpacket/8); |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
892 init_get_bits(&q->gb, q->decoded_bytes_buffer + offset, |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
893 p->bits_per_subpacket); |
4639 | 894 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
|
895 |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
896 /* Swap current and previous gains */ |
4639 | 897 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
|
898 } |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
899 |
5343
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
900 /** |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
901 * 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
|
902 * |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
903 * @param q pointer to the COOKContext |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
904 * @param chan channel to saturate |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
905 * @param out pointer to the output vector |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
906 */ |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
907 static void |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
908 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
|
909 { |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
910 int j; |
5348 | 911 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
|
912 /* Clip and convert floats to 16 bits. |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
913 */ |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
914 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
|
915 out[chan + q->nb_channels * j] = |
5523 | 916 av_clip_int16(lrintf(output[j])); |
5343
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
917 } |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
918 } |
1aa26b974dc3
separating saturation codes so that we can support other data formats
mhoffman
parents:
5342
diff
changeset
|
919 |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
920 /** |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
921 * Final part of subpacket decoding: |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
922 * Apply modulated lapped transform, gain compensation, |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
923 * clip and convert to integer. |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
924 * |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
925 * @param q pointer to the COOKContext |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
926 * @param decode_buffer pointer to the mlt coefficients |
12116
0ae85799341a
Improve variable names in imlt_window_float() and mlt_compensate_output().
diego
parents:
12113
diff
changeset
|
927 * @param gains_ptr array of current/prev gain pointers |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
928 * @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
|
929 * @param out pointer to the output buffer |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
930 * @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
|
931 */ |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
932 |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
933 static inline void |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
934 mlt_compensate_output(COOKContext *q, float *decode_buffer, |
12116
0ae85799341a
Improve variable names in imlt_window_float() and mlt_compensate_output().
diego
parents:
12113
diff
changeset
|
935 cook_gains *gains_ptr, float *previous_buffer, |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
936 int16_t *out, int chan) |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
937 { |
12116
0ae85799341a
Improve variable names in imlt_window_float() and mlt_compensate_output().
diego
parents:
12113
diff
changeset
|
938 imlt_gain(q, decode_buffer, gains_ptr, previous_buffer); |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
939 q->saturate_output (q, chan, out); |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
940 } |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
941 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
942 |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
943 /** |
2956 | 944 * Cook subpacket decoding. This function returns one decoded subpacket, |
945 * usually 1024 samples per channel. | |
946 * | |
947 * @param q pointer to the COOKContext | |
948 * @param inbuffer pointer to the inbuffer | |
949 * @param outbuffer pointer to the outbuffer | |
950 */ | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
951 static void decode_subpacket(COOKContext *q, COOKSubpacket* p, const uint8_t *inbuffer, int16_t *outbuffer) { |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
952 int sub_packet_size = p->size; |
2956 | 953 /* packet dump */ |
954 // for (i=0 ; i<sub_packet_size ; i++) { | |
9174
4d8d8fe29d4d
save avctx in cook decoder context and use it for av_log
banan
parents:
9173
diff
changeset
|
955 // av_log(q->avctx, AV_LOG_ERROR, "%02x", inbuffer[i]); |
2956 | 956 // } |
9174
4d8d8fe29d4d
save avctx in cook decoder context and use it for av_log
banan
parents:
9173
diff
changeset
|
957 // av_log(q->avctx, AV_LOG_ERROR, "\n"); |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
958 memset(q->decode_buffer_1,0,sizeof(q->decode_buffer_1)); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
959 decode_bytes_and_gain(q, p, inbuffer, &p->gains1); |
2956 | 960 |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
961 if (p->joint_stereo) { |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
962 joint_decode(q, p, q->decode_buffer_1, q->decode_buffer_2); |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
963 } else { |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
964 mono_decode(q, p, q->decode_buffer_1); |
2956 | 965 |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
966 if (p->num_channels == 2) { |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
967 decode_bytes_and_gain(q, p, inbuffer + sub_packet_size/2, &p->gains2); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
968 mono_decode(q, p, q->decode_buffer_2); |
4428
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
969 } |
eeb16216b454
decode_subpacket cleanup by Ian Braithwaite ian braithwaite dot dk.
banan
parents:
4425
diff
changeset
|
970 } |
3014
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
971 |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
972 mlt_compensate_output(q, q->decode_buffer_1, &p->gains1, |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
973 p->mono_previous_buffer1, outbuffer, p->ch_idx); |
2956 | 974 |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
975 if (p->num_channels == 2) { |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
976 if (p->joint_stereo) { |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
977 mlt_compensate_output(q, q->decode_buffer_2, &p->gains1, |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
978 p->mono_previous_buffer2, outbuffer, p->ch_idx + 1); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
979 } else { |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
980 mlt_compensate_output(q, q->decode_buffer_2, &p->gains2, |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
981 p->mono_previous_buffer2, outbuffer, p->ch_idx + 1); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
982 } |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
983 } |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
984 |
2956 | 985 } |
986 | |
987 | |
988 /** | |
989 * Cook frame decoding | |
990 * | |
991 * @param avctx pointer to the AVCodecContext | |
992 */ | |
993 | |
994 static int cook_decode_frame(AVCodecContext *avctx, | |
995 void *data, int *data_size, | |
9355
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9206
diff
changeset
|
996 AVPacket *avpkt) { |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9206
diff
changeset
|
997 const uint8_t *buf = avpkt->data; |
54bc8a2727b0
Implement avcodec_decode_video2(), _audio3() and _subtitle2() which takes an
rbultje
parents:
9206
diff
changeset
|
998 int buf_size = avpkt->size; |
2956 | 999 COOKContext *q = avctx->priv_data; |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1000 int i; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1001 int offset = 0; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1002 int chidx = 0; |
2956 | 1003 |
1004 if (buf_size < avctx->block_align) | |
1005 return buf_size; | |
1006 | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1007 /* estimate subpacket sizes */ |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1008 q->subpacket[0].size = avctx->block_align; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1009 |
9560 | 1010 for(i=1;i<q->num_subpackets;i++){ |
1011 q->subpacket[i].size = 2 * buf[avctx->block_align - q->num_subpackets + i]; | |
9564 | 1012 q->subpacket[0].size -= q->subpacket[i].size + 1; |
9565
5c1aeaf1bc12
Proper subpacket size check for cook multichannel files.
banan
parents:
9564
diff
changeset
|
1013 if (q->subpacket[0].size < 0) { |
5c1aeaf1bc12
Proper subpacket size check for cook multichannel files.
banan
parents:
9564
diff
changeset
|
1014 av_log(avctx,AV_LOG_DEBUG,"frame subpacket size total > avctx->block_align!\n"); |
5c1aeaf1bc12
Proper subpacket size check for cook multichannel files.
banan
parents:
9564
diff
changeset
|
1015 return -1; |
5c1aeaf1bc12
Proper subpacket size check for cook multichannel files.
banan
parents:
9564
diff
changeset
|
1016 } |
9560 | 1017 } |
9558 | 1018 |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1019 /* decode supbackets */ |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1020 *data_size = 0; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1021 for(i=0;i<q->num_subpackets;i++){ |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1022 q->subpacket[i].bits_per_subpacket = (q->subpacket[i].size*8)>>q->subpacket[i].bits_per_subpdiv; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1023 q->subpacket[i].ch_idx = chidx; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1024 av_log(avctx,AV_LOG_DEBUG,"subpacket[%i] size %i js %i %i block_align %i\n",i,q->subpacket[i].size,q->subpacket[i].joint_stereo,offset,avctx->block_align); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1025 decode_subpacket(q, &q->subpacket[i], buf + offset, (int16_t*)data); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1026 offset += q->subpacket[i].size; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1027 chidx += q->subpacket[i].num_channels; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1028 av_log(avctx,AV_LOG_DEBUG,"subpacket[%i] %i %i\n",i,q->subpacket[i].size * 8,get_bits_count(&q->gb)); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1029 } |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1030 *data_size = sizeof(int16_t) * q->nb_channels * q->samples_per_channel; |
2956 | 1031 |
4638
9f74306d4ac7
Don't output the first two frames, since they don't contain valid audio.
banan
parents:
4594
diff
changeset
|
1032 /* 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
|
1033 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
|
1034 |
2956 | 1035 return avctx->block_align; |
1036 } | |
3090 | 1037 |
2956 | 1038 #ifdef COOKDEBUG |
4430
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
1039 static void dump_cook_context(COOKContext *q) |
2956 | 1040 { |
1041 //int i=0; | |
9174
4d8d8fe29d4d
save avctx in cook decoder context and use it for av_log
banan
parents:
9173
diff
changeset
|
1042 #define PRINT(a,b) av_log(q->avctx,AV_LOG_ERROR," %s = %d\n", a, b); |
4d8d8fe29d4d
save avctx in cook decoder context and use it for av_log
banan
parents:
9173
diff
changeset
|
1043 av_log(q->avctx,AV_LOG_ERROR,"COOKextradata\n"); |
9557 | 1044 av_log(q->avctx,AV_LOG_ERROR,"cookversion=%x\n",q->subpacket[0].cookversion); |
1045 if (q->subpacket[0].cookversion > STEREO) { | |
1046 PRINT("js_subband_start",q->subpacket[0].js_subband_start); | |
1047 PRINT("js_vlc_bits",q->subpacket[0].js_vlc_bits); | |
2956 | 1048 } |
9174
4d8d8fe29d4d
save avctx in cook decoder context and use it for av_log
banan
parents:
9173
diff
changeset
|
1049 av_log(q->avctx,AV_LOG_ERROR,"COOKContext\n"); |
2956 | 1050 PRINT("nb_channels",q->nb_channels); |
1051 PRINT("bit_rate",q->bit_rate); | |
1052 PRINT("sample_rate",q->sample_rate); | |
9557 | 1053 PRINT("samples_per_channel",q->subpacket[0].samples_per_channel); |
1054 PRINT("samples_per_frame",q->subpacket[0].samples_per_frame); | |
1055 PRINT("subbands",q->subpacket[0].subbands); | |
2956 | 1056 PRINT("random_state",q->random_state); |
9557 | 1057 PRINT("js_subband_start",q->subpacket[0].js_subband_start); |
1058 PRINT("log2_numvector_size",q->subpacket[0].log2_numvector_size); | |
1059 PRINT("numvector_size",q->subpacket[0].numvector_size); | |
1060 PRINT("total_subbands",q->subpacket[0].total_subbands); | |
2956 | 1061 } |
1062 #endif | |
3090 | 1063 |
9176
e353d3a41e0b
Add cook channel count function, part of multichannel cook
banan
parents:
9175
diff
changeset
|
1064 static av_cold int cook_count_channels(unsigned int mask){ |
e353d3a41e0b
Add cook channel count function, part of multichannel cook
banan
parents:
9175
diff
changeset
|
1065 int i; |
e353d3a41e0b
Add cook channel count function, part of multichannel cook
banan
parents:
9175
diff
changeset
|
1066 int channels = 0; |
e353d3a41e0b
Add cook channel count function, part of multichannel cook
banan
parents:
9175
diff
changeset
|
1067 for(i = 0;i<32;i++){ |
e353d3a41e0b
Add cook channel count function, part of multichannel cook
banan
parents:
9175
diff
changeset
|
1068 if(mask & (1<<i)) |
e353d3a41e0b
Add cook channel count function, part of multichannel cook
banan
parents:
9175
diff
changeset
|
1069 ++channels; |
e353d3a41e0b
Add cook channel count function, part of multichannel cook
banan
parents:
9175
diff
changeset
|
1070 } |
e353d3a41e0b
Add cook channel count function, part of multichannel cook
banan
parents:
9175
diff
changeset
|
1071 return channels; |
e353d3a41e0b
Add cook channel count function, part of multichannel cook
banan
parents:
9175
diff
changeset
|
1072 } |
e353d3a41e0b
Add cook channel count function, part of multichannel cook
banan
parents:
9175
diff
changeset
|
1073 |
2956 | 1074 /** |
1075 * Cook initialization | |
1076 * | |
1077 * @param avctx pointer to the AVCodecContext | |
1078 */ | |
1079 | |
8766 | 1080 static av_cold int cook_decode_init(AVCodecContext *avctx) |
2956 | 1081 { |
1082 COOKContext *q = avctx->priv_data; | |
6232 | 1083 const uint8_t *edata_ptr = avctx->extradata; |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1084 const uint8_t *edata_ptr_end = edata_ptr + avctx->extradata_size; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1085 int extradata_size = avctx->extradata_size; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1086 int s = 0; |
9558 | 1087 unsigned int channel_mask = 0; |
9174
4d8d8fe29d4d
save avctx in cook decoder context and use it for av_log
banan
parents:
9173
diff
changeset
|
1088 q->avctx = avctx; |
2956 | 1089 |
1090 /* Take care of the codec specific extradata. */ | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1091 if (extradata_size <= 0) { |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1092 av_log(avctx,AV_LOG_ERROR,"Necessary extradata missing!\n"); |
2956 | 1093 return -1; |
1094 } | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1095 av_log(avctx,AV_LOG_DEBUG,"codecdata_length=%d\n",avctx->extradata_size); |
2956 | 1096 |
1097 /* Take data from the AVCodecContext (RM container). */ | |
1098 q->sample_rate = avctx->sample_rate; | |
1099 q->nb_channels = avctx->channels; | |
1100 q->bit_rate = avctx->bit_rate; | |
1101 | |
4692
3318e3f6470f
Small simplifications to subband coefficient handling and use av_random().
banan
parents:
4674
diff
changeset
|
1102 /* Initialize RNG. */ |
10597 | 1103 av_lfg_init(&q->random_state, 0); |
2956 | 1104 |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1105 while(edata_ptr < edata_ptr_end){ |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1106 /* 8 for mono, 16 for stereo, ? for multichannel |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1107 Swap to right endianness so we don't need to care later on. */ |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1108 if (extradata_size >= 8){ |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1109 q->subpacket[s].cookversion = bytestream_get_be32(&edata_ptr); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1110 q->subpacket[s].samples_per_frame = bytestream_get_be16(&edata_ptr); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1111 q->subpacket[s].subbands = bytestream_get_be16(&edata_ptr); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1112 extradata_size -= 8; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1113 } |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1114 if (avctx->extradata_size >= 8){ |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1115 bytestream_get_be32(&edata_ptr); //Unknown unused |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1116 q->subpacket[s].js_subband_start = bytestream_get_be16(&edata_ptr); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1117 q->subpacket[s].js_vlc_bits = bytestream_get_be16(&edata_ptr); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1118 extradata_size -= 8; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1119 } |
2956 | 1120 |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1121 /* Initialize extradata related variables. */ |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1122 q->subpacket[s].samples_per_channel = q->subpacket[s].samples_per_frame / q->nb_channels; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1123 q->subpacket[s].bits_per_subpacket = avctx->block_align * 8; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1124 |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1125 /* Initialize default data states. */ |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1126 q->subpacket[s].log2_numvector_size = 5; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1127 q->subpacket[s].total_subbands = q->subpacket[s].subbands; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1128 q->subpacket[s].num_channels = 1; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1129 |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1130 /* Initialize version-dependent variables */ |
2956 | 1131 |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1132 av_log(avctx,AV_LOG_DEBUG,"subpacket[%i].cookversion=%x\n",s,q->subpacket[s].cookversion); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1133 q->subpacket[s].joint_stereo = 0; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1134 switch (q->subpacket[s].cookversion) { |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1135 case MONO: |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1136 if (q->nb_channels != 1) { |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1137 av_log(avctx,AV_LOG_ERROR,"Container channels != 1, report sample!\n"); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1138 return -1; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1139 } |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1140 av_log(avctx,AV_LOG_DEBUG,"MONO\n"); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1141 break; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1142 case STEREO: |
9648
62d00a9c3824
Bugfix for bug introduced in the multichannel cook patchset.
banan
parents:
9565
diff
changeset
|
1143 if (q->nb_channels != 1) { |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1144 q->subpacket[s].bits_per_subpdiv = 1; |
9648
62d00a9c3824
Bugfix for bug introduced in the multichannel cook patchset.
banan
parents:
9565
diff
changeset
|
1145 q->subpacket[s].num_channels = 2; |
62d00a9c3824
Bugfix for bug introduced in the multichannel cook patchset.
banan
parents:
9565
diff
changeset
|
1146 } |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1147 av_log(avctx,AV_LOG_DEBUG,"STEREO\n"); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1148 break; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1149 case JOINT_STEREO: |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1150 if (q->nb_channels != 2) { |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1151 av_log(avctx,AV_LOG_ERROR,"Container channels != 2, report sample!\n"); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1152 return -1; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1153 } |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1154 av_log(avctx,AV_LOG_DEBUG,"JOINT_STEREO\n"); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1155 if (avctx->extradata_size >= 16){ |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1156 q->subpacket[s].total_subbands = q->subpacket[s].subbands + q->subpacket[s].js_subband_start; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1157 q->subpacket[s].joint_stereo = 1; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1158 q->subpacket[s].num_channels = 2; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1159 } |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1160 if (q->subpacket[s].samples_per_channel > 256) { |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1161 q->subpacket[s].log2_numvector_size = 6; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1162 } |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1163 if (q->subpacket[s].samples_per_channel > 512) { |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1164 q->subpacket[s].log2_numvector_size = 7; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1165 } |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1166 break; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1167 case MC_COOK: |
9558 | 1168 av_log(avctx,AV_LOG_DEBUG,"MULTI_CHANNEL\n"); |
1169 if(extradata_size >= 4) | |
1170 channel_mask |= q->subpacket[s].channel_mask = bytestream_get_be32(&edata_ptr); | |
1171 | |
1172 if(cook_count_channels(q->subpacket[s].channel_mask) > 1){ | |
1173 q->subpacket[s].total_subbands = q->subpacket[s].subbands + q->subpacket[s].js_subband_start; | |
1174 q->subpacket[s].joint_stereo = 1; | |
1175 q->subpacket[s].num_channels = 2; | |
1176 q->subpacket[s].samples_per_channel = q->subpacket[s].samples_per_frame >> 1; | |
1177 | |
1178 if (q->subpacket[s].samples_per_channel > 256) { | |
1179 q->subpacket[s].log2_numvector_size = 6; | |
1180 } | |
1181 if (q->subpacket[s].samples_per_channel > 512) { | |
1182 q->subpacket[s].log2_numvector_size = 7; | |
1183 } | |
1184 }else | |
1185 q->subpacket[s].samples_per_channel = q->subpacket[s].samples_per_frame; | |
1186 | |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1187 break; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1188 default: |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1189 av_log(avctx,AV_LOG_ERROR,"Unknown Cook version, report sample!\n"); |
2956 | 1190 return -1; |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1191 break; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1192 } |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1193 |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1194 if(s > 1 && q->subpacket[s].samples_per_channel != q->samples_per_channel) { |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1195 av_log(avctx,AV_LOG_ERROR,"different number of samples per channel!\n"); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1196 return -1; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1197 } else |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1198 q->samples_per_channel = q->subpacket[0].samples_per_channel; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1199 |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1200 |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1201 /* Initialize variable relations */ |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1202 q->subpacket[s].numvector_size = (1 << q->subpacket[s].log2_numvector_size); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1203 |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1204 /* Try to catch some obviously faulty streams, othervise it might be exploitable */ |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1205 if (q->subpacket[s].total_subbands > 53) { |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1206 av_log(avctx,AV_LOG_ERROR,"total_subbands > 53, report sample!\n"); |
2956 | 1207 return -1; |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1208 } |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1209 |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1210 if ((q->subpacket[s].js_vlc_bits > 6) || (q->subpacket[s].js_vlc_bits < 0)) { |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1211 av_log(avctx,AV_LOG_ERROR,"js_vlc_bits = %d, only >= 0 and <= 6 allowed!\n",q->subpacket[s].js_vlc_bits); |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1212 return -1; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1213 } |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1214 |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1215 if (q->subpacket[s].subbands > 50) { |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1216 av_log(avctx,AV_LOG_ERROR,"subbands > 50, report sample!\n"); |
2956 | 1217 return -1; |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1218 } |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1219 q->subpacket[s].gains1.now = q->subpacket[s].gain_1; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1220 q->subpacket[s].gains1.previous = q->subpacket[s].gain_2; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1221 q->subpacket[s].gains2.now = q->subpacket[s].gain_3; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1222 q->subpacket[s].gains2.previous = q->subpacket[s].gain_4; |
2956 | 1223 |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1224 q->num_subpackets++; |
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1225 s++; |
9561
20c79ce2cd5e
Make sure we only parse max amount of subpackets (5) in the cook decoder.
banan
parents:
9560
diff
changeset
|
1226 if (s > MAX_SUBPACKETS) { |
20c79ce2cd5e
Make sure we only parse max amount of subpackets (5) in the cook decoder.
banan
parents:
9560
diff
changeset
|
1227 av_log(avctx,AV_LOG_ERROR,"Too many subpackets > 5, report file!\n"); |
20c79ce2cd5e
Make sure we only parse max amount of subpackets (5) in the cook decoder.
banan
parents:
9560
diff
changeset
|
1228 return -1; |
20c79ce2cd5e
Make sure we only parse max amount of subpackets (5) in the cook decoder.
banan
parents:
9560
diff
changeset
|
1229 } |
9556
e8c7a09475d5
Factor out COOKSubpacket, in preparation for multichannel support.
banan
parents:
9428
diff
changeset
|
1230 } |
2956 | 1231 /* Generate tables */ |
6861 | 1232 init_pow2table(); |
2956 | 1233 init_gain_table(q); |
5347
59ec490fe985
fixpoint: move cplscales to context structure and provide hook for data format conversion
mhoffman
parents:
5346
diff
changeset
|
1234 init_cplscales_table(q); |
2956 | 1235 |
1236 if (init_cook_vlc_tables(q) != 0) | |
1237 return -1; | |
1238 | |
3303
68721b62a528
sanity checks, some might have been exploitable ...
michael
parents:
3106
diff
changeset
|
1239 |
68721b62a528
sanity checks, some might have been exploitable ...
michael
parents:
3106
diff
changeset
|
1240 if(avctx->block_align >= UINT_MAX/2) |
68721b62a528
sanity checks, some might have been exploitable ...
michael
parents:
3106
diff
changeset
|
1241 return -1; |
68721b62a528
sanity checks, some might have been exploitable ...
michael
parents:
3106
diff
changeset
|
1242 |
4424
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1243 /* Pad the databuffer with: |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1244 DECODE_BYTES_PAD1 or DECODE_BYTES_PAD2 for decode_bytes(), |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1245 FF_INPUT_BUFFER_PADDING_SIZE, for the bitstreamreader. */ |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1246 q->decoded_bytes_buffer = |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1247 av_mallocz(avctx->block_align |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1248 + DECODE_BYTES_PAD1(avctx->block_align) |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1249 + FF_INPUT_BUFFER_PADDING_SIZE); |
8c830bde8006
Cook stereo (MONO_COOK2) bugfix, by Ian Braithwaite.
banan
parents:
4423
diff
changeset
|
1250 if (q->decoded_bytes_buffer == NULL) |
2956 | 1251 return -1; |
1252 | |
1253 /* Initialize transform. */ | |
4650
31bf54d9353d
Replace custom modified discrete cosine transform with ffmpeg's own.
banan
parents:
4639
diff
changeset
|
1254 if ( init_cook_mlt(q) != 0 ) |
2956 | 1255 return -1; |
3014
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1256 |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1257 /* Initialize COOK signal arithmetic handling */ |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1258 if (1) { |
5353
7e4703e16bbd
fixpoint: renaming all lowlevel arithmetic routines to xxx_float
mhoffman
parents:
5350
diff
changeset
|
1259 q->scalar_dequant = scalar_dequant_float; |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1260 q->decouple = decouple_float; |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1261 q->imlt_window = imlt_window_float; |
5353
7e4703e16bbd
fixpoint: renaming all lowlevel arithmetic routines to xxx_float
mhoffman
parents:
5350
diff
changeset
|
1262 q->interpolate = interpolate_float; |
5346
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1263 q->saturate_output = saturate_output_float; |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1264 } |
b41036edcf2e
fixpoint: lowlevel functional abstraction for all buffer arithmetics
mhoffman
parents:
5345
diff
changeset
|
1265 |
3014
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1266 /* Try to catch some obviously faulty streams, othervise it might be exploitable */ |
3091
0284d5b34916
Fix broken cosmetics commit and add a check for valid headers.
banan
parents:
3090
diff
changeset
|
1267 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
|
1268 } else { |
4302
a0f83004d485
av_log(NULL,... -> av_log(avctx,.. where appropriate.
banan
parents:
3947
diff
changeset
|
1269 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
|
1270 return -1; |
0284d5b34916
Fix broken cosmetics commit and add a check for valid headers.
banan
parents:
3090
diff
changeset
|
1271 } |
3014
959b8ad880dc
Dual mono stereo strems sound ok now, added sanity checks and removed
rtognimp
parents:
3009
diff
changeset
|
1272 |
7451
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7095
diff
changeset
|
1273 avctx->sample_fmt = SAMPLE_FMT_S16; |
9558 | 1274 if (channel_mask) |
1275 avctx->channel_layout = channel_mask; | |
1276 else | |
1277 avctx->channel_layout = (avctx->channels==2) ? CH_LAYOUT_STEREO : CH_LAYOUT_MONO; | |
7451
85ab7655ad4d
Modify all codecs to report their supported input and output sample format(s).
pross
parents:
7095
diff
changeset
|
1278 |
3009
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
1279 #ifdef COOKDEBUG |
4430
407e7fd9b4f4
Get rid of the COOKextradata struct. And use valid C to parse the extradata.
banan
parents:
4429
diff
changeset
|
1280 dump_cook_context(q); |
3009
f5898b9b8a8a
Fix an out of array access and some minor cleanup of the code.
diego
parents:
2959
diff
changeset
|
1281 #endif |
2956 | 1282 return 0; |
1283 } | |
1284 | |
1285 | |
1286 AVCodec cook_decoder = | |
1287 { | |
1288 .name = "cook", | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
11370
diff
changeset
|
1289 .type = AVMEDIA_TYPE_AUDIO, |
2956 | 1290 .id = CODEC_ID_COOK, |
1291 .priv_data_size = sizeof(COOKContext), | |
1292 .init = cook_decode_init, | |
1293 .close = cook_decode_close, | |
1294 .decode = cook_decode_frame, | |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6903
diff
changeset
|
1295 .long_name = NULL_IF_CONFIG_SMALL("COOK"), |
2956 | 1296 }; |