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