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