Mercurial > libavcodec.hg
annotate twinvq.c @ 10543:7ff7a34848bf libavcodec
10l trocadero: ZMBV encoder used zero score to detect whether block should be
XORed with source one or not, which went wrong with new block comparing code.
So track this condition explicitly.
author | kostya |
---|---|
date | Fri, 20 Nov 2009 07:22:41 +0000 |
parents | 6d653bb57c58 |
children | f2f4d6fe3f6d |
rev | line source |
---|---|
10075 | 1 /* |
2 * TwinVQ decoder | |
3 * Copyright (c) 2009 Vitor Sessak | |
4 * | |
5 * This file is part of FFmpeg. | |
6 * | |
7 * FFmpeg is free software; you can redistribute it and/or | |
8 * modify it under the terms of the GNU Lesser General Public | |
9 * License as published by the Free Software Foundation; either | |
10 * version 2.1 of the License, or (at your option) any later version. | |
11 * | |
12 * FFmpeg is distributed in the hope that it will be useful, | |
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
18 * License along with FFmpeg; if not, write to the Free Software | |
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
20 */ | |
21 | |
22 #include "avcodec.h" | |
23 #include "get_bits.h" | |
24 #include "dsputil.h" | |
25 | |
26 #include <math.h> | |
27 #include <stdint.h> | |
28 | |
29 #include "twinvq_data.h" | |
30 | |
31 enum FrameType { | |
32 FT_SHORT = 0, ///< Short frame (divided in n sub-blocks) | |
33 FT_MEDIUM, ///< Medium frame (divided in m<n sub-blocks) | |
34 FT_LONG, ///< Long frame (single sub-block + PPC) | |
35 FT_PPC, ///< Periodic Peak Component (part of the long frame) | |
36 }; | |
37 | |
38 /** | |
39 * Parameters and tables that are different for each frame type | |
40 */ | |
41 struct FrameMode { | |
42 uint8_t sub; ///< Number subblocks in each frame | |
43 const uint16_t *bark_tab; | |
44 | |
45 /** number of distinct bark scale envelope values */ | |
46 uint8_t bark_env_size; | |
47 | |
48 const int16_t *bark_cb; ///< codebook for the bark scale envelope (BSE) | |
49 uint8_t bark_n_coef;///< number of BSE CB coefficients to read | |
50 uint8_t bark_n_bit; ///< number of bits of the BSE coefs | |
51 | |
52 //@{ | |
53 /** main codebooks for spectrum data */ | |
54 const int16_t *cb0; | |
55 const int16_t *cb1; | |
56 //@} | |
57 | |
58 uint8_t cb_len_read; ///< number of spectrum coefficients to read | |
59 }; | |
60 | |
61 /** | |
62 * Parameters and tables that are different for every combination of | |
63 * bitrate/sample rate | |
64 */ | |
65 typedef struct { | |
66 struct FrameMode fmode[3]; ///< frame type-dependant parameters | |
67 | |
68 uint16_t size; ///< frame size in samples | |
69 uint8_t n_lsp; ///< number of lsp coefficients | |
70 const float *lspcodebook; | |
71 | |
72 /* number of bits of the different LSP CB coefficients */ | |
73 uint8_t lsp_bit0; | |
74 uint8_t lsp_bit1; | |
75 uint8_t lsp_bit2; | |
76 | |
77 uint8_t lsp_split; ///< number of CB entries for the LSP decoding | |
78 const int16_t *ppc_shape_cb; ///< PPC shape CB | |
79 | |
80 /** number of the bits for the PPC period value */ | |
81 uint8_t ppc_period_bit; | |
82 | |
83 uint8_t ppc_shape_bit; ///< number of bits of the PPC shape CB coeffs | |
84 uint8_t ppc_shape_len; ///< size of PPC shape CB | |
85 uint8_t pgain_bit; ///< bits for PPC gain | |
86 | |
87 /** constant for peak period to peak width conversion */ | |
88 uint16_t peak_per2wid; | |
89 } ModeTab; | |
90 | |
91 static const ModeTab mode_08_08 = { | |
92 { | |
93 { 8, bark_tab_s08_64, 10, tab.fcb08s , 1, 5, tab.cb0808s0, tab.cb0808s1, 18}, | |
94 { 2, bark_tab_m08_256, 20, tab.fcb08m , 2, 5, tab.cb0808m0, tab.cb0808m1, 16}, | |
95 { 1, bark_tab_l08_512, 30, tab.fcb08l , 3, 6, tab.cb0808l0, tab.cb0808l1, 17} | |
96 }, | |
97 512 , 12, tab.lsp08, 1, 5, 3, 3, tab.shape08 , 8, 28, 20, 6, 40 | |
98 }; | |
99 | |
100 static const ModeTab mode_11_08 = { | |
101 { | |
102 { 8, bark_tab_s11_64, 10, tab.fcb11s , 1, 5, tab.cb1108s0, tab.cb1108s1, 29}, | |
103 { 2, bark_tab_m11_256, 20, tab.fcb11m , 2, 5, tab.cb1108m0, tab.cb1108m1, 24}, | |
104 { 1, bark_tab_l11_512, 30, tab.fcb11l , 3, 6, tab.cb1108l0, tab.cb1108l1, 27} | |
105 }, | |
106 512 , 16, tab.lsp11, 1, 6, 4, 3, tab.shape11 , 9, 36, 30, 7, 90 | |
107 }; | |
108 | |
109 static const ModeTab mode_11_10 = { | |
110 { | |
111 { 8, bark_tab_s11_64, 10, tab.fcb11s , 1, 5, tab.cb1110s0, tab.cb1110s1, 21}, | |
112 { 2, bark_tab_m11_256, 20, tab.fcb11m , 2, 5, tab.cb1110m0, tab.cb1110m1, 18}, | |
113 { 1, bark_tab_l11_512, 30, tab.fcb11l , 3, 6, tab.cb1110l0, tab.cb1110l1, 20} | |
114 }, | |
115 512 , 16, tab.lsp11, 1, 6, 4, 3, tab.shape11 , 9, 36, 30, 7, 90 | |
116 }; | |
117 | |
118 static const ModeTab mode_16_16 = { | |
119 { | |
120 { 8, bark_tab_s16_128, 10, tab.fcb16s , 1, 5, tab.cb1616s0, tab.cb1616s1, 16}, | |
121 { 2, bark_tab_m16_512, 20, tab.fcb16m , 2, 5, tab.cb1616m0, tab.cb1616m1, 15}, | |
122 { 1, bark_tab_l16_1024,30, tab.fcb16l , 3, 6, tab.cb1616l0, tab.cb1616l1, 16} | |
123 }, | |
124 1024, 16, tab.lsp16, 1, 6, 4, 3, tab.shape16 , 9, 56, 60, 7, 180 | |
125 }; | |
126 | |
127 static const ModeTab mode_22_20 = { | |
128 { | |
129 { 8, bark_tab_s22_128, 10, tab.fcb22s_1, 1, 6, tab.cb2220s0, tab.cb2220s1, 18}, | |
130 { 2, bark_tab_m22_512, 20, tab.fcb22m_1, 2, 6, tab.cb2220m0, tab.cb2220m1, 17}, | |
131 { 1, bark_tab_l22_1024,32, tab.fcb22l_1, 4, 6, tab.cb2220l0, tab.cb2220l1, 18} | |
132 }, | |
133 1024, 16, tab.lsp22_1, 1, 6, 4, 3, tab.shape22_1, 9, 56, 36, 7, 144 | |
134 }; | |
135 | |
136 static const ModeTab mode_22_24 = { | |
137 { | |
138 { 8, bark_tab_s22_128, 10, tab.fcb22s_1, 1, 6, tab.cb2224s0, tab.cb2224s1, 15}, | |
139 { 2, bark_tab_m22_512, 20, tab.fcb22m_1, 2, 6, tab.cb2224m0, tab.cb2224m1, 14}, | |
140 { 1, bark_tab_l22_1024,32, tab.fcb22l_1, 4, 6, tab.cb2224l0, tab.cb2224l1, 15} | |
141 }, | |
142 1024, 16, tab.lsp22_1, 1, 6, 4, 3, tab.shape22_1, 9, 56, 36, 7, 144 | |
143 }; | |
144 | |
145 static const ModeTab mode_22_32 = { | |
146 { | |
147 { 4, bark_tab_s22_128, 10, tab.fcb22s_2, 1, 6, tab.cb2232s0, tab.cb2232s1, 11}, | |
148 { 2, bark_tab_m22_256, 20, tab.fcb22m_2, 2, 6, tab.cb2232m0, tab.cb2232m1, 11}, | |
149 { 1, bark_tab_l22_512, 32, tab.fcb22l_2, 4, 6, tab.cb2232l0, tab.cb2232l1, 12} | |
150 }, | |
151 512 , 16, tab.lsp22_2, 1, 6, 4, 4, tab.shape22_2, 9, 56, 36, 7, 72 | |
152 }; | |
153 | |
154 static const ModeTab mode_44_40 = { | |
155 { | |
156 {16, bark_tab_s44_128, 10, tab.fcb44s , 1, 6, tab.cb4440s0, tab.cb4440s1, 18}, | |
157 { 4, bark_tab_m44_512, 20, tab.fcb44m , 2, 6, tab.cb4440m0, tab.cb4440m1, 17}, | |
158 { 1, bark_tab_l44_2048,40, tab.fcb44l , 4, 6, tab.cb4440l0, tab.cb4440l1, 17} | |
159 }, | |
160 2048, 20, tab.lsp44, 1, 6, 4, 4, tab.shape44 , 9, 84, 54, 7, 432 | |
161 }; | |
162 | |
163 static const ModeTab mode_44_48 = { | |
164 { | |
165 {16, bark_tab_s44_128, 10, tab.fcb44s , 1, 6, tab.cb4448s0, tab.cb4448s1, 15}, | |
166 { 4, bark_tab_m44_512, 20, tab.fcb44m , 2, 6, tab.cb4448m0, tab.cb4448m1, 14}, | |
167 { 1, bark_tab_l44_2048,40, tab.fcb44l , 4, 6, tab.cb4448l0, tab.cb4448l1, 14} | |
168 }, | |
169 2048, 20, tab.lsp44, 1, 6, 4, 4, tab.shape44 , 9, 84, 54, 7, 432 | |
170 }; | |
171 | |
172 typedef struct TwinContext { | |
173 AVCodecContext *avctx; | |
174 DSPContext dsp; | |
10199 | 175 FFTContext mdct_ctx[3]; |
10075 | 176 |
177 const ModeTab *mtab; | |
178 | |
179 // history | |
180 float lsp_hist[2][20]; ///< LSP coefficients of the last frame | |
181 float bark_hist[3][2][40]; ///< BSE coefficients of last frame | |
182 | |
183 // bitstream parameters | |
184 int16_t permut[4][4096]; | |
185 uint8_t length[4][2]; ///< main codebook stride | |
186 uint8_t length_change[4]; | |
187 uint8_t bits_main_spec[2][4][2]; ///< bits for the main codebook | |
188 int bits_main_spec_change[4]; | |
189 int n_div[4]; | |
190 | |
191 float *spectrum; | |
192 float *curr_frame; ///< non-interleaved output | |
193 float *prev_frame; ///< non-interleaved previous frame | |
194 int last_block_pos[2]; | |
195 | |
196 float *cos_tabs[3]; | |
197 | |
198 // scratch buffers | |
199 float *tmp_buf; | |
200 } TwinContext; | |
201 | |
202 #define PPC_SHAPE_CB_SIZE 64 | |
203 #define SUB_AMP_MAX 4500.0 | |
204 #define MULAW_MU 100.0 | |
205 #define GAIN_BITS 8 | |
206 #define AMP_MAX 13000.0 | |
207 #define SUB_GAIN_BITS 5 | |
208 #define WINDOW_TYPE_BITS 4 | |
209 #define PGAIN_MU 200 | |
210 | |
211 /** @note not speed critical, hence not optimized */ | |
212 static void memset_float(float *buf, float val, int size) | |
213 { | |
214 while (size--) | |
215 *buf++ = val; | |
216 } | |
217 | |
218 /** | |
219 * Evaluate a single LPC amplitude spectrum envelope coefficient from the line | |
220 * spectrum pairs. | |
221 * | |
222 * @param lsp a vector of the cosinus of the LSP values | |
223 * @param cos_val cos(PI*i/N) where i is the index of the LPC amplitude | |
224 * @param order the order of the LSP (and the size of the *lsp buffer). Must | |
225 * be a multiple of four. | |
226 * @return the LPC value | |
227 * | |
228 * @todo reuse code from vorbis_dec.c: vorbis_floor0_decode | |
229 */ | |
230 static float eval_lpc_spectrum(const float *lsp, float cos_val, int order) | |
231 { | |
232 int j; | |
233 float p = 0.5f; | |
234 float q = 0.5f; | |
235 float two_cos_w = 2.0f*cos_val; | |
236 | |
10108 | 237 for (j = 0; j + 1 < order; j += 2*2) { |
10075 | 238 // Unroll the loop once since order is a multiple of four |
239 q *= lsp[j ] - two_cos_w; | |
240 p *= lsp[j+1] - two_cos_w; | |
241 | |
242 q *= lsp[j+2] - two_cos_w; | |
243 p *= lsp[j+3] - two_cos_w; | |
244 } | |
245 | |
246 p *= p * (2.0f - two_cos_w); | |
247 q *= q * (2.0f + two_cos_w); | |
248 | |
249 return 0.5 / (p + q); | |
250 } | |
251 | |
252 /** | |
253 * Evaluates the LPC amplitude spectrum envelope from the line spectrum pairs. | |
254 */ | |
255 static void eval_lpcenv(TwinContext *tctx, const float *cos_vals, float *lpc) | |
256 { | |
257 int i; | |
258 const ModeTab *mtab = tctx->mtab; | |
259 int size_s = mtab->size / mtab->fmode[FT_SHORT].sub; | |
260 | |
10108 | 261 for (i = 0; i < size_s/2; i++) { |
10075 | 262 float cos_i = tctx->cos_tabs[0][i]; |
263 lpc[i] = eval_lpc_spectrum(cos_vals, cos_i, mtab->n_lsp); | |
264 lpc[size_s-i-1] = eval_lpc_spectrum(cos_vals, -cos_i, mtab->n_lsp); | |
265 } | |
266 } | |
267 | |
268 static void interpolate(float *out, float v1, float v2, int size) | |
269 { | |
270 int i; | |
271 float step = (v1 - v2)/(size + 1); | |
272 | |
10108 | 273 for (i = 0; i < size; i++) { |
10075 | 274 v2 += step; |
275 out[i] = v2; | |
276 } | |
277 } | |
278 | |
279 static inline float get_cos(int idx, int part, const float *cos_tab, int size) | |
280 { | |
281 return part ? -cos_tab[size - idx - 1] : | |
282 cos_tab[ idx ]; | |
283 } | |
284 | |
285 /** | |
286 * Evaluates the LPC amplitude spectrum envelope from the line spectrum pairs. | |
287 * Probably for speed reasons, the coefficients are evaluated as | |
288 * siiiibiiiisiiiibiiiisiiiibiiiisiiiibiiiis ... | |
289 * where s is an evaluated value, i is a value interpolated from the others | |
290 * and b might be either calculated or interpolated, depending on an | |
291 * unexplained condition. | |
292 * | |
293 * @param step the size of a block "siiiibiiii" | |
294 * @param in the cosinus of the LSP data | |
295 * @param part is 0 for 0...PI (positive cossinus values) and 1 for PI...2PI | |
296 (negative cossinus values) | |
297 * @param size the size of the whole output | |
298 */ | |
299 static inline void eval_lpcenv_or_interp(TwinContext *tctx, | |
300 enum FrameType ftype, | |
301 float *out, const float *in, | |
302 int size, int step, int part) | |
303 { | |
304 int i; | |
305 const ModeTab *mtab = tctx->mtab; | |
306 const float *cos_tab = tctx->cos_tabs[ftype]; | |
307 | |
308 // Fill the 's' | |
10108 | 309 for (i = 0; i < size; i += step) |
10075 | 310 out[i] = |
311 eval_lpc_spectrum(in, | |
312 get_cos(i, part, cos_tab, size), | |
313 mtab->n_lsp); | |
314 | |
315 // Fill the 'iiiibiiii' | |
10108 | 316 for (i = step; i <= size - 2*step; i += step) { |
10075 | 317 if (out[i + step] + out[i - step] > 1.95*out[i] || |
318 out[i + step] >= out[i - step]) { | |
319 interpolate(out + i - step + 1, out[i], out[i-step], step - 1); | |
320 } else { | |
321 out[i - step/2] = | |
322 eval_lpc_spectrum(in, | |
323 get_cos(i-step/2, part, cos_tab, size), | |
324 mtab->n_lsp); | |
325 interpolate(out + i - step + 1, out[i-step/2], out[i-step ], step/2 - 1); | |
326 interpolate(out + i - step/2 + 1, out[i ], out[i-step/2], step/2 - 1); | |
327 } | |
328 } | |
329 | |
330 interpolate(out + size - 2*step + 1, out[size-step], out[size - 2*step], step - 1); | |
331 } | |
332 | |
333 static void eval_lpcenv_2parts(TwinContext *tctx, enum FrameType ftype, | |
334 const float *buf, float *lpc, | |
335 int size, int step) | |
336 { | |
337 eval_lpcenv_or_interp(tctx, ftype, lpc , buf, size/2, step, 0); | |
338 eval_lpcenv_or_interp(tctx, ftype, lpc + size/2, buf, size/2, 2*step, 1); | |
339 | |
340 interpolate(lpc+size/2-step+1, lpc[size/2], lpc[size/2-step], step); | |
341 | |
342 memset_float(lpc + size - 2*step + 1, lpc[size - 2*step], 2*step - 1); | |
343 } | |
344 | |
345 /** | |
346 * Inverse quantization. Read CB coefficients for cb1 and cb2 from the | |
347 * bitstream, sum the corresponding vectors and write the result to *out | |
348 * after permutation. | |
349 */ | |
350 static void dequant(TwinContext *tctx, GetBitContext *gb, float *out, | |
351 enum FrameType ftype, | |
352 const int16_t *cb0, const int16_t *cb1, int cb_len) | |
353 { | |
354 int pos = 0; | |
355 int i, j; | |
356 | |
10108 | 357 for (i = 0; i < tctx->n_div[ftype]; i++) { |
10075 | 358 int tmp0, tmp1; |
359 int sign0 = 1; | |
360 int sign1 = 1; | |
361 const int16_t *tab0, *tab1; | |
362 int length = tctx->length[ftype][i >= tctx->length_change[ftype]]; | |
363 int bitstream_second_part = (i >= tctx->bits_main_spec_change[ftype]); | |
364 | |
365 int bits = tctx->bits_main_spec[0][ftype][bitstream_second_part]; | |
366 if (bits == 7) { | |
367 if (get_bits1(gb)) | |
368 sign0 = -1; | |
369 bits = 6; | |
370 } | |
371 tmp0 = get_bits(gb, bits); | |
372 | |
373 bits = tctx->bits_main_spec[1][ftype][bitstream_second_part]; | |
374 | |
375 if (bits == 7) { | |
376 if (get_bits1(gb)) | |
377 sign1 = -1; | |
378 | |
379 bits = 6; | |
380 } | |
381 tmp1 = get_bits(gb, bits); | |
382 | |
383 tab0 = cb0 + tmp0*cb_len; | |
384 tab1 = cb1 + tmp1*cb_len; | |
385 | |
10108 | 386 for (j = 0; j < length; j++) |
10075 | 387 out[tctx->permut[ftype][pos+j]] = sign0*tab0[j] + sign1*tab1[j]; |
388 | |
389 pos += length; | |
390 } | |
391 | |
392 } | |
393 | |
394 static inline float mulawinv(float y, float clip, float mu) | |
395 { | |
396 y = av_clipf(y/clip, -1, 1); | |
397 return clip * FFSIGN(y) * (exp(log(1+mu) * fabs(y)) - 1) / mu; | |
398 } | |
399 | |
400 /** | |
401 * Evaluate a*b/400 rounded to the nearest integer. When, for example, | |
402 * a*b == 200 and the nearest integer is ill-defined, use a table to emulate | |
403 * the following broken float-based implementation used by the binary decoder: | |
404 * | |
405 * \code | |
406 * static int very_broken_op(int a, int b) | |
407 * { | |
408 * static float test; // Ugh, force gcc to do the division first... | |
409 * | |
410 * test = a/400.; | |
411 * return b * test + 0.5; | |
412 * } | |
413 * \endcode | |
414 * | |
415 * @note if this function is replaced by just ROUNDED_DIV(a*b,400.), the stddev | |
416 * between the original file (before encoding with Yamaha encoder) and the | |
417 * decoded output increases, which leads one to believe that the encoder expects | |
418 * exactly this broken calculation. | |
419 */ | |
420 static int very_broken_op(int a, int b) | |
421 { | |
422 int x = a*b + 200; | |
423 int size; | |
424 const uint8_t *rtab; | |
425 | |
426 if (x%400 || b%5) | |
427 return x/400; | |
428 | |
429 x /= 400; | |
430 | |
431 size = tabs[b/5].size; | |
432 rtab = tabs[b/5].tab; | |
433 return x - rtab[size*av_log2(2*(x - 1)/size)+(x - 1)%size]; | |
434 } | |
435 | |
436 /** | |
437 * Sum to data a periodic peak of a given period, width and shape. | |
438 * | |
439 * @param period the period of the peak divised by 400.0 | |
440 */ | |
441 static void add_peak(int period, int width, const float *shape, | |
442 float ppc_gain, float *speech, int len) | |
443 { | |
444 int i, j; | |
445 | |
446 const float *shape_end = shape + len; | |
447 int center; | |
448 | |
449 // First peak centered around zero | |
10108 | 450 for (i = 0; i < width/2; i++) |
10075 | 451 speech[i] += ppc_gain * *shape++; |
452 | |
10108 | 453 for (i = 1; i < ROUNDED_DIV(len,width) ; i++) { |
10075 | 454 center = very_broken_op(period, i); |
10108 | 455 for (j = -width/2; j < (width+1)/2; j++) |
10075 | 456 speech[j+center] += ppc_gain * *shape++; |
457 } | |
458 | |
459 // For the last block, be careful not to go beyond the end of the buffer | |
460 center = very_broken_op(period, i); | |
10108 | 461 for (j = -width/2; j < (width + 1)/2 && shape < shape_end; j++) |
10075 | 462 speech[j+center] += ppc_gain * *shape++; |
463 } | |
464 | |
465 static void decode_ppc(TwinContext *tctx, int period_coef, const float *shape, | |
466 float ppc_gain, float *speech) | |
467 { | |
468 const ModeTab *mtab = tctx->mtab; | |
469 int isampf = tctx->avctx->sample_rate/1000; | |
470 int ibps = tctx->avctx->bit_rate/(1000 * tctx->avctx->channels); | |
471 int min_period = ROUNDED_DIV( 40*2*mtab->size, isampf); | |
472 int max_period = ROUNDED_DIV(6*40*2*mtab->size, isampf); | |
473 int period_range = max_period - min_period; | |
474 | |
475 // This is actually the period multiplied by 400. It is just linearly coded | |
476 // between its maximum and minimum value. | |
477 int period = min_period + | |
478 ROUNDED_DIV(period_coef*period_range, (1 << mtab->ppc_period_bit) - 1); | |
479 int width; | |
480 | |
481 if (isampf == 22 && ibps == 32) { | |
482 // For some unknown reason, NTT decided to code this case differently... | |
483 width = ROUNDED_DIV((period + 800)* mtab->peak_per2wid, 400*mtab->size); | |
484 } else | |
485 width = (period )* mtab->peak_per2wid/(400*mtab->size); | |
486 | |
487 add_peak(period, width, shape, ppc_gain, speech, mtab->ppc_shape_len); | |
488 } | |
489 | |
490 static void dec_gain(TwinContext *tctx, GetBitContext *gb, enum FrameType ftype, | |
491 float *out) | |
492 { | |
493 const ModeTab *mtab = tctx->mtab; | |
494 int i, j; | |
495 int sub = mtab->fmode[ftype].sub; | |
496 float step = AMP_MAX / ((1 << GAIN_BITS) - 1); | |
497 float sub_step = SUB_AMP_MAX / ((1 << SUB_GAIN_BITS) - 1); | |
498 | |
499 if (ftype == FT_LONG) { | |
10108 | 500 for (i = 0; i < tctx->avctx->channels; i++) |
10075 | 501 out[i] = (1./(1<<13)) * |
502 mulawinv(step * 0.5 + step * get_bits(gb, GAIN_BITS), | |
503 AMP_MAX, MULAW_MU); | |
504 } else { | |
10108 | 505 for (i = 0; i < tctx->avctx->channels; i++) { |
10075 | 506 float val = (1./(1<<23)) * |
507 mulawinv(step * 0.5 + step * get_bits(gb, GAIN_BITS), | |
508 AMP_MAX, MULAW_MU); | |
509 | |
10108 | 510 for (j = 0; j < sub; j++) { |
10075 | 511 out[i*sub + j] = |
512 val*mulawinv(sub_step* 0.5 + | |
513 sub_step* get_bits(gb, SUB_GAIN_BITS), | |
514 SUB_AMP_MAX, MULAW_MU); | |
515 } | |
516 } | |
517 } | |
518 } | |
519 | |
520 /** | |
521 * Rearrange the LSP coefficients so that they have a minimum distance of | |
522 * min_dist. This function does it exactly as described in section of 3.2.4 | |
523 * of the G.729 specification (but interestingly is different from what the | |
524 * reference decoder actually does). | |
525 */ | |
526 static void rearrange_lsp(int order, float *lsp, float min_dist) | |
527 { | |
528 int i; | |
529 float min_dist2 = min_dist * 0.5; | |
10108 | 530 for (i = 1; i < order; i++) |
10075 | 531 if (lsp[i] - lsp[i-1] < min_dist) { |
532 float avg = (lsp[i] + lsp[i-1]) * 0.5; | |
533 | |
534 lsp[i-1] = avg - min_dist2; | |
535 lsp[i ] = avg + min_dist2; | |
536 } | |
537 } | |
538 | |
539 static void bubblesort(float *lsp, int lp_order) | |
540 { | |
541 int i,j; | |
542 | |
543 /* sort lsp in ascending order. float bubble agorithm, | |
544 O(n) if data already sorted, O(n^2) - otherwise */ | |
10108 | 545 for (i = 0; i < lp_order - 1; i++) |
546 for (j = i; j >= 0 && lsp[j] > lsp[j+1]; j--) | |
10075 | 547 FFSWAP(float, lsp[j], lsp[j+1]); |
548 } | |
549 | |
550 static void decode_lsp(TwinContext *tctx, int lpc_idx1, uint8_t *lpc_idx2, | |
551 int lpc_hist_idx, float *lsp, float *hist) | |
552 { | |
553 const ModeTab *mtab = tctx->mtab; | |
554 int i, j; | |
555 | |
556 const float *cb = mtab->lspcodebook; | |
557 const float *cb2 = cb + (1 << mtab->lsp_bit1)*mtab->n_lsp; | |
558 const float *cb3 = cb2 + (1 << mtab->lsp_bit2)*mtab->n_lsp; | |
559 | |
560 const int8_t funny_rounding[4] = { | |
561 -2, | |
562 mtab->lsp_split == 4 ? -2 : 1, | |
563 mtab->lsp_split == 4 ? -2 : 1, | |
564 0 | |
565 }; | |
566 | |
10108 | 567 j = 0; |
568 for (i = 0; i < mtab->lsp_split; i++) { | |
10075 | 569 int chunk_end = ((i + 1)*mtab->n_lsp + funny_rounding[i])/mtab->lsp_split; |
570 for (; j < chunk_end; j++) | |
571 lsp[j] = cb [lpc_idx1 * mtab->n_lsp + j] + | |
572 cb2[lpc_idx2[i] * mtab->n_lsp + j]; | |
573 } | |
574 | |
575 rearrange_lsp(mtab->n_lsp, lsp, 0.0001); | |
576 | |
10108 | 577 for (i = 0; i < mtab->n_lsp; i++) { |
10075 | 578 float tmp1 = 1. - cb3[lpc_hist_idx*mtab->n_lsp + i]; |
579 float tmp2 = hist[i] * cb3[lpc_hist_idx*mtab->n_lsp + i]; | |
580 hist[i] = lsp[i]; | |
581 lsp[i] = lsp[i] * tmp1 + tmp2; | |
582 } | |
583 | |
584 rearrange_lsp(mtab->n_lsp, lsp, 0.0001); | |
585 rearrange_lsp(mtab->n_lsp, lsp, 0.000095); | |
586 bubblesort(lsp, mtab->n_lsp); | |
587 } | |
588 | |
589 static void dec_lpc_spectrum_inv(TwinContext *tctx, float *lsp, | |
590 enum FrameType ftype, float *lpc) | |
591 { | |
592 int i; | |
593 int size = tctx->mtab->size / tctx->mtab->fmode[ftype].sub; | |
594 | |
10108 | 595 for (i = 0; i < tctx->mtab->n_lsp; i++) |
10075 | 596 lsp[i] = 2*cos(lsp[i]); |
597 | |
598 switch (ftype) { | |
599 case FT_LONG: | |
600 eval_lpcenv_2parts(tctx, ftype, lsp, lpc, size, 8); | |
601 break; | |
602 case FT_MEDIUM: | |
603 eval_lpcenv_2parts(tctx, ftype, lsp, lpc, size, 2); | |
604 break; | |
605 case FT_SHORT: | |
606 eval_lpcenv(tctx, lsp, lpc); | |
607 break; | |
608 } | |
609 } | |
610 | |
611 static void imdct_and_window(TwinContext *tctx, enum FrameType ftype, int wtype, | |
612 float *in, float *prev, int ch) | |
613 { | |
614 const ModeTab *mtab = tctx->mtab; | |
615 int bsize = mtab->size / mtab->fmode[ftype].sub; | |
616 int size = mtab->size; | |
617 float *buf1 = tctx->tmp_buf; | |
618 int j; | |
619 int wsize; // Window size | |
620 float *out = tctx->curr_frame + 2*ch*mtab->size; | |
621 float *out2 = out; | |
622 float *prev_buf; | |
623 int first_wsize; | |
624 | |
625 static const uint8_t wtype_to_wsize[] = {0, 0, 2, 2, 2, 1, 0, 1, 1}; | |
626 int types_sizes[] = { | |
627 mtab->size / mtab->fmode[FT_LONG ].sub, | |
628 mtab->size / mtab->fmode[FT_MEDIUM].sub, | |
629 mtab->size / (2*mtab->fmode[FT_SHORT ].sub), | |
630 }; | |
631 | |
632 wsize = types_sizes[wtype_to_wsize[wtype]]; | |
633 first_wsize = wsize; | |
634 prev_buf = prev + (size - bsize)/2; | |
635 | |
10108 | 636 for (j = 0; j < mtab->fmode[ftype].sub; j++) { |
10075 | 637 int sub_wtype = ftype == FT_MEDIUM ? 8 : wtype; |
638 | |
639 if (!j && wtype == 4) | |
640 sub_wtype = 4; | |
641 else if (j == mtab->fmode[ftype].sub-1 && wtype == 7) | |
642 sub_wtype = 7; | |
643 | |
644 wsize = types_sizes[wtype_to_wsize[sub_wtype]]; | |
645 | |
646 ff_imdct_half(&tctx->mdct_ctx[ftype], buf1 + bsize*j, in + bsize*j); | |
647 | |
648 tctx->dsp.vector_fmul_window(out2, | |
649 prev_buf + (bsize-wsize)/2, | |
650 buf1 + bsize*j, | |
10174
89cd870ca180
Add two more sizes to ff_sine_windows[] and also pad it with NULLs so
vitor
parents:
10108
diff
changeset
|
651 ff_sine_windows[av_log2(wsize)], |
10075 | 652 0.0, |
653 wsize/2); | |
654 out2 += wsize; | |
655 | |
656 memcpy(out2, buf1 + bsize*j + wsize/2, (bsize - wsize/2)*sizeof(float)); | |
657 | |
658 out2 += ftype == FT_MEDIUM ? (bsize-wsize)/2 : bsize - wsize; | |
659 | |
660 prev_buf = buf1 + bsize*j + bsize/2; | |
661 } | |
662 | |
663 tctx->last_block_pos[ch] = (size + first_wsize)/2; | |
664 } | |
665 | |
666 static void imdct_output(TwinContext *tctx, enum FrameType ftype, int wtype, | |
667 float *out) | |
668 { | |
669 const ModeTab *mtab = tctx->mtab; | |
670 float *prev_buf = tctx->prev_frame + tctx->last_block_pos[0]; | |
671 int i, j; | |
672 | |
10108 | 673 for (i = 0; i < tctx->avctx->channels; i++) { |
10075 | 674 imdct_and_window(tctx, ftype, wtype, |
675 tctx->spectrum + i*mtab->size, | |
676 prev_buf + 2*i*mtab->size, | |
677 i); | |
678 } | |
679 | |
680 if (tctx->avctx->channels == 2) { | |
10108 | 681 for (i = 0; i < mtab->size - tctx->last_block_pos[0]; i++) { |
10075 | 682 float f1 = prev_buf[ i]; |
683 float f2 = prev_buf[2*mtab->size + i]; | |
684 out[2*i ] = f1 + f2; | |
685 out[2*i + 1] = f1 - f2; | |
686 } | |
10108 | 687 for (j = 0; i < mtab->size; j++,i++) { |
10075 | 688 float f1 = tctx->curr_frame[ j]; |
689 float f2 = tctx->curr_frame[2*mtab->size + j]; | |
690 out[2*i ] = f1 + f2; | |
691 out[2*i + 1] = f1 - f2; | |
692 } | |
693 } else { | |
694 memcpy(out, prev_buf, | |
695 (mtab->size - tctx->last_block_pos[0]) * sizeof(*out)); | |
696 | |
697 out += mtab->size - tctx->last_block_pos[0]; | |
698 | |
699 memcpy(out, tctx->curr_frame, | |
700 (tctx->last_block_pos[0]) * sizeof(*out)); | |
701 } | |
702 | |
703 } | |
704 | |
705 static void dec_bark_env(TwinContext *tctx, const uint8_t *in, int use_hist, | |
706 int ch, float *out, float gain, enum FrameType ftype) | |
707 { | |
708 const ModeTab *mtab = tctx->mtab; | |
709 int i,j; | |
710 float *hist = tctx->bark_hist[ftype][ch]; | |
711 float val = ((const float []) {0.4, 0.35, 0.28})[ftype]; | |
712 int bark_n_coef = mtab->fmode[ftype].bark_n_coef; | |
713 int fw_cb_len = mtab->fmode[ftype].bark_env_size / bark_n_coef; | |
714 int idx = 0; | |
715 | |
10108 | 716 for (i = 0; i < fw_cb_len; i++) |
717 for (j = 0; j < bark_n_coef; j++, idx++) { | |
10075 | 718 float tmp2 = |
719 mtab->fmode[ftype].bark_cb[fw_cb_len*in[j] + i] * (1./4096); | |
720 float st = use_hist ? | |
721 (1. - val) * tmp2 + val*hist[idx] + 1. : tmp2 + 1.; | |
722 | |
723 hist[idx] = tmp2; | |
724 if (st < -1.) st = 1.; | |
725 | |
726 memset_float(out, st * gain, mtab->fmode[ftype].bark_tab[idx]); | |
727 out += mtab->fmode[ftype].bark_tab[idx]; | |
728 } | |
729 | |
730 } | |
731 | |
732 static void read_and_decode_spectrum(TwinContext *tctx, GetBitContext *gb, | |
733 float *out, enum FrameType ftype) | |
734 { | |
735 const ModeTab *mtab = tctx->mtab; | |
736 int channels = tctx->avctx->channels; | |
737 int sub = mtab->fmode[ftype].sub; | |
738 int block_size = mtab->size / sub; | |
739 float gain[channels*sub]; | |
740 float ppc_shape[mtab->ppc_shape_len * channels * 4]; | |
741 uint8_t bark1[channels][sub][mtab->fmode[ftype].bark_n_coef]; | |
742 uint8_t bark_use_hist[channels][sub]; | |
743 | |
744 uint8_t lpc_idx1[channels]; | |
745 uint8_t lpc_idx2[channels][tctx->mtab->lsp_split]; | |
746 uint8_t lpc_hist_idx[channels]; | |
747 | |
748 int i, j, k; | |
749 | |
750 dequant(tctx, gb, out, ftype, | |
751 mtab->fmode[ftype].cb0, mtab->fmode[ftype].cb1, | |
752 mtab->fmode[ftype].cb_len_read); | |
753 | |
10108 | 754 for (i = 0; i < channels; i++) |
755 for (j = 0; j < sub; j++) | |
756 for (k = 0; k < mtab->fmode[ftype].bark_n_coef; k++) | |
10075 | 757 bark1[i][j][k] = |
758 get_bits(gb, mtab->fmode[ftype].bark_n_bit); | |
759 | |
10108 | 760 for (i = 0; i < channels; i++) |
761 for (j = 0; j < sub; j++) | |
10075 | 762 bark_use_hist[i][j] = get_bits1(gb); |
763 | |
764 dec_gain(tctx, gb, ftype, gain); | |
765 | |
10108 | 766 for (i = 0; i < channels; i++) { |
10075 | 767 lpc_hist_idx[i] = get_bits(gb, tctx->mtab->lsp_bit0); |
768 lpc_idx1 [i] = get_bits(gb, tctx->mtab->lsp_bit1); | |
769 | |
10108 | 770 for (j = 0; j < tctx->mtab->lsp_split; j++) |
10075 | 771 lpc_idx2[i][j] = get_bits(gb, tctx->mtab->lsp_bit2); |
772 } | |
773 | |
774 if (ftype == FT_LONG) { | |
775 int cb_len_p = (tctx->n_div[3] + mtab->ppc_shape_len*channels - 1)/ | |
776 tctx->n_div[3]; | |
777 dequant(tctx, gb, ppc_shape, FT_PPC, mtab->ppc_shape_cb, | |
778 mtab->ppc_shape_cb + cb_len_p*PPC_SHAPE_CB_SIZE, cb_len_p); | |
779 } | |
780 | |
10108 | 781 for (i = 0; i < channels; i++) { |
10075 | 782 float *chunk = out + mtab->size * i; |
783 float lsp[tctx->mtab->n_lsp]; | |
784 | |
10108 | 785 for (j = 0; j < sub; j++) { |
10075 | 786 dec_bark_env(tctx, bark1[i][j], bark_use_hist[i][j], i, |
787 tctx->tmp_buf, gain[sub*i+j], ftype); | |
788 | |
789 tctx->dsp.vector_fmul(chunk + block_size*j, tctx->tmp_buf, | |
790 block_size); | |
791 | |
792 } | |
793 | |
794 if (ftype == FT_LONG) { | |
795 float pgain_step = 25000. / ((1 << mtab->pgain_bit) - 1); | |
796 int p_coef = get_bits(gb, tctx->mtab->ppc_period_bit); | |
797 int g_coef = get_bits(gb, tctx->mtab->pgain_bit); | |
798 float v = 1./8192* | |
799 mulawinv(pgain_step*g_coef+ pgain_step/2, 25000., PGAIN_MU); | |
800 | |
801 decode_ppc(tctx, p_coef, ppc_shape + i*mtab->ppc_shape_len, v, | |
802 chunk); | |
803 } | |
804 | |
805 decode_lsp(tctx, lpc_idx1[i], lpc_idx2[i], lpc_hist_idx[i], lsp, | |
806 tctx->lsp_hist[i]); | |
807 | |
808 dec_lpc_spectrum_inv(tctx, lsp, ftype, tctx->tmp_buf); | |
809 | |
10108 | 810 for (j = 0; j < mtab->fmode[ftype].sub; j++) { |
10075 | 811 tctx->dsp.vector_fmul(chunk, tctx->tmp_buf, block_size); |
812 chunk += block_size; | |
813 } | |
814 } | |
815 } | |
816 | |
817 static int twin_decode_frame(AVCodecContext * avctx, void *data, | |
818 int *data_size, AVPacket *avpkt) | |
819 { | |
820 const uint8_t *buf = avpkt->data; | |
821 int buf_size = avpkt->size; | |
822 TwinContext *tctx = avctx->priv_data; | |
823 GetBitContext gb; | |
824 const ModeTab *mtab = tctx->mtab; | |
825 float *out = data; | |
826 enum FrameType ftype; | |
827 int window_type; | |
828 static const enum FrameType wtype_to_ftype_table[] = { | |
829 FT_LONG, FT_LONG, FT_SHORT, FT_LONG, | |
830 FT_MEDIUM, FT_LONG, FT_LONG, FT_MEDIUM, FT_MEDIUM | |
831 }; | |
832 | |
833 if (buf_size*8 < avctx->bit_rate*mtab->size/avctx->sample_rate + 8) { | |
834 av_log(avctx, AV_LOG_ERROR, | |
835 "Frame too small (%d bytes). Truncated file?\n", buf_size); | |
836 *data_size = 0; | |
837 return buf_size; | |
838 } | |
839 | |
840 init_get_bits(&gb, buf, buf_size * 8); | |
841 skip_bits(&gb, get_bits(&gb, 8)); | |
842 window_type = get_bits(&gb, WINDOW_TYPE_BITS); | |
843 | |
844 if (window_type > 8) { | |
845 av_log(avctx, AV_LOG_ERROR, "Invalid window type, broken sample?\n"); | |
846 return -1; | |
847 } | |
848 | |
849 ftype = wtype_to_ftype_table[window_type]; | |
850 | |
851 read_and_decode_spectrum(tctx, &gb, tctx->spectrum, ftype); | |
852 | |
853 imdct_output(tctx, ftype, window_type, out); | |
854 | |
855 FFSWAP(float*, tctx->curr_frame, tctx->prev_frame); | |
856 | |
857 if (tctx->avctx->frame_number < 2) { | |
858 *data_size=0; | |
859 return buf_size; | |
860 } | |
861 | |
10104
0fa3d21b317e
SSE optimized vector_clipf(). 10% faster TwinVQ decoding.
vitor
parents:
10081
diff
changeset
|
862 tctx->dsp.vector_clipf(out, out, -32700./(1<<15), 32700./(1<<15), |
10106
a04aca5587a7
100l, revision 19728 added a bug that broke twinvq decoding. I forgot to
vitor
parents:
10104
diff
changeset
|
863 avctx->channels * mtab->size); |
10075 | 864 |
865 *data_size = mtab->size*avctx->channels*4; | |
866 | |
867 return buf_size; | |
868 } | |
869 | |
870 /** | |
871 * Init IMDCT and windowing tables | |
872 */ | |
873 static av_cold void init_mdct_win(TwinContext *tctx) | |
874 { | |
875 int i,j; | |
876 const ModeTab *mtab = tctx->mtab; | |
877 int size_s = mtab->size / mtab->fmode[FT_SHORT].sub; | |
878 int size_m = mtab->size / mtab->fmode[FT_MEDIUM].sub; | |
879 int channels = tctx->avctx->channels; | |
880 float norm = channels == 1 ? 2. : 1.; | |
881 | |
10108 | 882 for (i = 0; i < 3; i++) { |
10075 | 883 int bsize = tctx->mtab->size/tctx->mtab->fmode[i].sub; |
884 ff_mdct_init(&tctx->mdct_ctx[i], av_log2(bsize) + 1, 1, | |
885 -sqrt(norm/bsize) / (1<<15)); | |
886 } | |
887 | |
888 tctx->tmp_buf = av_malloc(mtab->size * sizeof(*tctx->tmp_buf)); | |
889 | |
890 tctx->spectrum = av_malloc(2*mtab->size*channels*sizeof(float)); | |
891 tctx->curr_frame = av_malloc(2*mtab->size*channels*sizeof(float)); | |
892 tctx->prev_frame = av_malloc(2*mtab->size*channels*sizeof(float)); | |
893 | |
10108 | 894 for (i = 0; i < 3; i++) { |
10075 | 895 int m = 4*mtab->size/mtab->fmode[i].sub; |
896 double freq = 2*M_PI/m; | |
897 tctx->cos_tabs[i] = av_malloc((m/4)*sizeof(*tctx->cos_tabs)); | |
898 | |
10108 | 899 for (j = 0; j <= m/8; j++) |
10075 | 900 tctx->cos_tabs[i][j] = cos((2*j + 1)*freq); |
10108 | 901 for (j = 1; j < m/8; j++) |
10075 | 902 tctx->cos_tabs[i][m/4-j] = tctx->cos_tabs[i][j]; |
903 } | |
904 | |
905 | |
10174
89cd870ca180
Add two more sizes to ff_sine_windows[] and also pad it with NULLs so
vitor
parents:
10108
diff
changeset
|
906 ff_sine_window_init(ff_sine_windows[av_log2(size_m) ], size_m ); |
89cd870ca180
Add two more sizes to ff_sine_windows[] and also pad it with NULLs so
vitor
parents:
10108
diff
changeset
|
907 ff_sine_window_init(ff_sine_windows[av_log2(size_s/2) ], size_s/2); |
89cd870ca180
Add two more sizes to ff_sine_windows[] and also pad it with NULLs so
vitor
parents:
10108
diff
changeset
|
908 ff_sine_window_init(ff_sine_windows[av_log2(mtab->size)], mtab->size); |
10075 | 909 } |
910 | |
911 /** | |
912 * Interpret the data as if it were a num_blocks x line_len[0] matrix and for | |
913 * each line do a cyclic permutation, i.e. | |
914 * abcdefghijklm -> defghijklmabc | |
915 * where the amount to be shifted is evaluated depending on the column. | |
916 */ | |
917 static void permutate_in_line(int16_t *tab, int num_vect, int num_blocks, | |
918 int block_size, | |
919 const uint8_t line_len[2], int length_div, | |
920 enum FrameType ftype) | |
921 | |
922 { | |
923 int i,j; | |
924 | |
10108 | 925 for (i = 0; i < line_len[0]; i++) { |
10075 | 926 int shift; |
927 | |
928 if (num_blocks == 1 || | |
929 (ftype == FT_LONG && num_vect % num_blocks) || | |
930 (ftype != FT_LONG && num_vect & 1 ) || | |
931 i == line_len[1]) { | |
932 shift = 0; | |
933 } else if (ftype == FT_LONG) { | |
934 shift = i; | |
935 } else | |
936 shift = i*i; | |
937 | |
10108 | 938 for (j = 0; j < num_vect && (j+num_vect*i < block_size*num_blocks); j++) |
10075 | 939 tab[i*num_vect+j] = i*num_vect + (j + shift) % num_vect; |
940 } | |
941 } | |
942 | |
943 /** | |
944 * Interpret the input data as in the following table: | |
945 * | |
946 * \verbatim | |
947 * | |
948 * abcdefgh | |
949 * ijklmnop | |
950 * qrstuvw | |
951 * x123456 | |
952 * | |
953 * \endverbatim | |
954 * | |
955 * and transpose it, giving the output | |
956 * aiqxbjr1cks2dlt3emu4fvn5gow6hp | |
957 */ | |
958 static void transpose_perm(int16_t *out, int16_t *in, int num_vect, | |
959 const uint8_t line_len[2], int length_div) | |
960 { | |
961 int i,j; | |
962 int cont= 0; | |
10108 | 963 for (i = 0; i < num_vect; i++) |
964 for (j = 0; j < line_len[i >= length_div]; j++) | |
10075 | 965 out[cont++] = in[j*num_vect + i]; |
966 } | |
967 | |
968 static void linear_perm(int16_t *out, int16_t *in, int n_blocks, int size) | |
969 { | |
970 int block_size = size/n_blocks; | |
971 int i; | |
972 | |
10108 | 973 for (i = 0; i < size; i++) |
10075 | 974 out[i] = block_size * (in[i] % n_blocks) + in[i] / n_blocks; |
975 } | |
976 | |
977 static av_cold void construct_perm_table(TwinContext *tctx,enum FrameType ftype) | |
978 { | |
979 int block_size; | |
980 const ModeTab *mtab = tctx->mtab; | |
981 int size = tctx->avctx->channels*mtab->fmode[ftype].sub; | |
982 int16_t *tmp_perm = (int16_t *) tctx->tmp_buf; | |
983 | |
984 if (ftype == FT_PPC) { | |
985 size = tctx->avctx->channels; | |
986 block_size = mtab->ppc_shape_len; | |
987 } else | |
988 block_size = mtab->size / mtab->fmode[ftype].sub; | |
989 | |
990 permutate_in_line(tmp_perm, tctx->n_div[ftype], size, | |
991 block_size, tctx->length[ftype], | |
992 tctx->length_change[ftype], ftype); | |
993 | |
994 transpose_perm(tctx->permut[ftype], tmp_perm, tctx->n_div[ftype], | |
995 tctx->length[ftype], tctx->length_change[ftype]); | |
996 | |
997 linear_perm(tctx->permut[ftype], tctx->permut[ftype], size, | |
998 size*block_size); | |
999 } | |
1000 | |
1001 static av_cold void init_bitstream_params(TwinContext *tctx) | |
1002 { | |
1003 const ModeTab *mtab = tctx->mtab; | |
1004 int n_ch = tctx->avctx->channels; | |
1005 int total_fr_bits = tctx->avctx->bit_rate*mtab->size/ | |
1006 tctx->avctx->sample_rate; | |
1007 | |
1008 int lsp_bits_per_block = n_ch*(mtab->lsp_bit0 + mtab->lsp_bit1 + | |
1009 mtab->lsp_split*mtab->lsp_bit2); | |
1010 | |
1011 int ppc_bits = n_ch*(mtab->pgain_bit + mtab->ppc_shape_bit + | |
1012 mtab->ppc_period_bit); | |
1013 | |
1014 int bsize_no_main_cb[3]; | |
1015 int bse_bits[3]; | |
1016 int i; | |
10500
6d653bb57c58
Use enum FrameType as parameter to construct_perm_table().
cehoyos
parents:
10199
diff
changeset
|
1017 enum FrameType frametype; |
10075 | 1018 |
10108 | 1019 for (i = 0; i < 3; i++) |
10075 | 1020 // +1 for history usage switch |
1021 bse_bits[i] = n_ch * | |
1022 (mtab->fmode[i].bark_n_coef * mtab->fmode[i].bark_n_bit + 1); | |
1023 | |
1024 bsize_no_main_cb[2] = bse_bits[2] + lsp_bits_per_block + ppc_bits + | |
1025 WINDOW_TYPE_BITS + n_ch*GAIN_BITS; | |
1026 | |
10108 | 1027 for (i = 0; i < 2; i++) |
10075 | 1028 bsize_no_main_cb[i] = |
1029 lsp_bits_per_block + n_ch*GAIN_BITS + WINDOW_TYPE_BITS + | |
1030 mtab->fmode[i].sub*(bse_bits[i] + n_ch*SUB_GAIN_BITS); | |
1031 | |
1032 // The remaining bits are all used for the main spectrum coefficients | |
10108 | 1033 for (i = 0; i < 4; i++) { |
10075 | 1034 int bit_size; |
1035 int vect_size; | |
1036 int rounded_up, rounded_down, num_rounded_down, num_rounded_up; | |
1037 if (i == 3) { | |
1038 bit_size = n_ch * mtab->ppc_shape_bit; | |
1039 vect_size = n_ch * mtab->ppc_shape_len; | |
1040 } else { | |
1041 bit_size = total_fr_bits - bsize_no_main_cb[i]; | |
1042 vect_size = n_ch * mtab->size; | |
1043 } | |
1044 | |
1045 tctx->n_div[i] = (bit_size + 13) / 14; | |
1046 | |
1047 rounded_up = (bit_size + tctx->n_div[i] - 1)/tctx->n_div[i]; | |
1048 rounded_down = (bit_size )/tctx->n_div[i]; | |
1049 num_rounded_down = rounded_up * tctx->n_div[i] - bit_size; | |
1050 num_rounded_up = tctx->n_div[i] - num_rounded_down; | |
1051 tctx->bits_main_spec[0][i][0] = (rounded_up + 1)/2; | |
1052 tctx->bits_main_spec[1][i][0] = (rounded_up )/2; | |
1053 tctx->bits_main_spec[0][i][1] = (rounded_down + 1)/2; | |
1054 tctx->bits_main_spec[1][i][1] = (rounded_down )/2; | |
1055 tctx->bits_main_spec_change[i] = num_rounded_up; | |
1056 | |
1057 rounded_up = (vect_size + tctx->n_div[i] - 1)/tctx->n_div[i]; | |
1058 rounded_down = (vect_size )/tctx->n_div[i]; | |
1059 num_rounded_down = rounded_up * tctx->n_div[i] - vect_size; | |
1060 num_rounded_up = tctx->n_div[i] - num_rounded_down; | |
1061 tctx->length[i][0] = rounded_up; | |
1062 tctx->length[i][1] = rounded_down; | |
1063 tctx->length_change[i] = num_rounded_up; | |
1064 } | |
1065 | |
10500
6d653bb57c58
Use enum FrameType as parameter to construct_perm_table().
cehoyos
parents:
10199
diff
changeset
|
1066 for (frametype = FT_SHORT; frametype <= FT_PPC; frametype++) |
6d653bb57c58
Use enum FrameType as parameter to construct_perm_table().
cehoyos
parents:
10199
diff
changeset
|
1067 construct_perm_table(tctx, frametype); |
10075 | 1068 } |
1069 | |
1070 static av_cold int twin_decode_init(AVCodecContext *avctx) | |
1071 { | |
1072 TwinContext *tctx = avctx->priv_data; | |
1073 int isampf = avctx->sample_rate/1000; | |
1074 int ibps = avctx->bit_rate/(1000 * avctx->channels); | |
1075 | |
1076 tctx->avctx = avctx; | |
1077 avctx->sample_fmt = SAMPLE_FMT_FLT; | |
1078 | |
1079 if (avctx->channels > 2) { | |
1080 av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %i\n", | |
1081 avctx->channels); | |
1082 return -1; | |
1083 } | |
1084 | |
1085 switch ((isampf << 8) + ibps) { | |
1086 case (8 <<8) + 8: tctx->mtab = &mode_08_08; break; | |
1087 case (11<<8) + 8: tctx->mtab = &mode_11_08; break; | |
1088 case (11<<8) + 10: tctx->mtab = &mode_11_10; break; | |
1089 case (16<<8) + 16: tctx->mtab = &mode_16_16; break; | |
1090 case (22<<8) + 20: tctx->mtab = &mode_22_20; break; | |
1091 case (22<<8) + 24: tctx->mtab = &mode_22_24; break; | |
1092 case (22<<8) + 32: tctx->mtab = &mode_22_32; break; | |
1093 case (44<<8) + 40: tctx->mtab = &mode_44_40; break; | |
1094 case (44<<8) + 48: tctx->mtab = &mode_44_48; break; | |
1095 default: | |
1096 av_log(avctx, AV_LOG_ERROR, "This version does not support %d kHz - %d kbit/s/ch mode.\n", isampf, isampf); | |
1097 return -1; | |
1098 } | |
1099 | |
1100 dsputil_init(&tctx->dsp, avctx); | |
1101 init_mdct_win(tctx); | |
1102 init_bitstream_params(tctx); | |
1103 | |
1104 memset_float(tctx->bark_hist[0][0], 0.1, FF_ARRAY_ELEMS(tctx->bark_hist)); | |
1105 | |
1106 return 0; | |
1107 } | |
1108 | |
1109 static av_cold int twin_decode_close(AVCodecContext *avctx) | |
1110 { | |
1111 TwinContext *tctx = avctx->priv_data; | |
1112 int i; | |
1113 | |
10108 | 1114 for (i = 0; i < 3; i++) { |
10075 | 1115 ff_mdct_end(&tctx->mdct_ctx[i]); |
1116 av_free(tctx->cos_tabs[i]); | |
1117 } | |
1118 | |
1119 | |
1120 av_free(tctx->curr_frame); | |
1121 av_free(tctx->spectrum); | |
1122 av_free(tctx->prev_frame); | |
1123 av_free(tctx->tmp_buf); | |
1124 | |
1125 return 0; | |
1126 } | |
1127 | |
1128 AVCodec twinvq_decoder = | |
1129 { | |
1130 "twinvq", | |
1131 CODEC_TYPE_AUDIO, | |
1132 CODEC_ID_TWINVQ, | |
1133 sizeof(TwinContext), | |
1134 twin_decode_init, | |
1135 NULL, | |
1136 twin_decode_close, | |
1137 twin_decode_frame, | |
1138 .long_name = NULL_IF_CONFIG_SMALL("VQF TwinVQ"), | |
1139 }; |