3 * Copyright (c) 2009 Vitor Sessak
5 * This file is part of FFmpeg.
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.
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.
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
29 #include "twinvq_data.h"
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)
39 * Parameters and tables that are different for each frame type
42 uint8_t sub
; ///< Number subblocks in each frame
43 const uint16_t *bark_tab
;
45 /** number of distinct bark scale envelope values */
46 uint8_t bark_env_size
;
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
53 /** main codebooks for spectrum data */
58 uint8_t cb_len_read
; ///< number of spectrum coefficients to read
62 * Parameters and tables that are different for every combination of
66 struct FrameMode fmode
[3]; ///< frame type-dependant parameters
68 uint16_t size
; ///< frame size in samples
69 uint8_t n_lsp
; ///< number of lsp coefficients
70 const float *lspcodebook
;
72 /* number of bits of the different LSP CB coefficients */
77 uint8_t lsp_split
; ///< number of CB entries for the LSP decoding
78 const int16_t *ppc_shape_cb
; ///< PPC shape CB
80 /** number of the bits for the PPC period value */
81 uint8_t ppc_period_bit
;
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
87 /** constant for peak period to peak width conversion */
88 uint16_t peak_per2wid
;
91 static const ModeTab mode_08_08
= {
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}
97 512 , 12, tab
.lsp08
, 1, 5, 3, 3, tab
.shape08
, 8, 28, 20, 6, 40
100 static const ModeTab mode_11_08
= {
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}
106 512 , 16, tab
.lsp11
, 1, 6, 4, 3, tab
.shape11
, 9, 36, 30, 7, 90
109 static const ModeTab mode_11_10
= {
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}
115 512 , 16, tab
.lsp11
, 1, 6, 4, 3, tab
.shape11
, 9, 36, 30, 7, 90
118 static const ModeTab mode_16_16
= {
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}
124 1024, 16, tab
.lsp16
, 1, 6, 4, 3, tab
.shape16
, 9, 56, 60, 7, 180
127 static const ModeTab mode_22_20
= {
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}
133 1024, 16, tab
.lsp22_1
, 1, 6, 4, 3, tab
.shape22_1
, 9, 56, 36, 7, 144
136 static const ModeTab mode_22_24
= {
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}
142 1024, 16, tab
.lsp22_1
, 1, 6, 4, 3, tab
.shape22_1
, 9, 56, 36, 7, 144
145 static const ModeTab mode_22_32
= {
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}
151 512 , 16, tab
.lsp22_2
, 1, 6, 4, 4, tab
.shape22_2
, 9, 56, 36, 7, 72
154 static const ModeTab mode_44_40
= {
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}
160 2048, 20, tab
.lsp44
, 1, 6, 4, 4, tab
.shape44
, 9, 84, 54, 7, 432
163 static const ModeTab mode_44_48
= {
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}
169 2048, 20, tab
.lsp44
, 1, 6, 4, 4, tab
.shape44
, 9, 84, 54, 7, 432
172 typedef struct TwinContext
{
173 AVCodecContext
*avctx
;
175 FFTContext mdct_ctx
[3];
180 float lsp_hist
[2][20]; ///< LSP coefficients of the last frame
181 float bark_hist
[3][2][40]; ///< BSE coefficients of last frame
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];
192 float *curr_frame
; ///< non-interleaved output
193 float *prev_frame
; ///< non-interleaved previous frame
194 int last_block_pos
[2];
202 #define PPC_SHAPE_CB_SIZE 64
203 #define SUB_AMP_MAX 4500.0
204 #define MULAW_MU 100.0
206 #define AMP_MAX 13000.0
207 #define SUB_GAIN_BITS 5
208 #define WINDOW_TYPE_BITS 4
211 /** @note not speed critical, hence not optimized */
212 static void memset_float(float *buf
, float val
, int size
)
219 * Evaluate a single LPC amplitude spectrum envelope coefficient from the line
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
228 * @todo reuse code from vorbis_dec.c: vorbis_floor0_decode
230 static float eval_lpc_spectrum(const float *lsp
, float cos_val
, int order
)
235 float two_cos_w
= 2.0f
*cos_val
;
237 for (j
= 0; j
+ 1 < order
; j
+= 2*2) {
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
;
242 q
*= lsp
[j
+2] - two_cos_w
;
243 p
*= lsp
[j
+3] - two_cos_w
;
246 p
*= p
* (2.0f
- two_cos_w
);
247 q
*= q
* (2.0f
+ two_cos_w
);
249 return 0.5 / (p
+ q
);
253 * Evaluates the LPC amplitude spectrum envelope from the line spectrum pairs.
255 static void eval_lpcenv(TwinContext
*tctx
, const float *cos_vals
, float *lpc
)
258 const ModeTab
*mtab
= tctx
->mtab
;
259 int size_s
= mtab
->size
/ mtab
->fmode
[FT_SHORT
].sub
;
261 for (i
= 0; i
< size_s
/2; i
++) {
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
);
268 static void interpolate(float *out
, float v1
, float v2
, int size
)
271 float step
= (v1
- v2
)/(size
+ 1);
273 for (i
= 0; i
< size
; i
++) {
279 static inline float get_cos(int idx
, int part
, const float *cos_tab
, int size
)
281 return part
? -cos_tab
[size
- idx
- 1] :
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.
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
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
)
305 const ModeTab
*mtab
= tctx
->mtab
;
306 const float *cos_tab
= tctx
->cos_tabs
[ftype
];
309 for (i
= 0; i
< size
; i
+= step
)
311 eval_lpc_spectrum(in
,
312 get_cos(i
, part
, cos_tab
, size
),
315 // Fill the 'iiiibiiii'
316 for (i
= step
; i
<= size
- 2*step
; i
+= step
) {
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);
322 eval_lpc_spectrum(in
,
323 get_cos(i
-step
/2, part
, cos_tab
, size
),
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);
330 interpolate(out
+ size
- 2*step
+ 1, out
[size
-step
], out
[size
- 2*step
], step
- 1);
333 static void eval_lpcenv_2parts(TwinContext
*tctx
, enum FrameType ftype
,
334 const float *buf
, float *lpc
,
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);
340 interpolate(lpc
+size
/2-step
+1, lpc
[size
/2], lpc
[size
/2-step
], step
);
342 memset_float(lpc
+ size
- 2*step
+ 1, lpc
[size
- 2*step
], 2*step
- 1);
346 * Inverse quantization. Read CB coefficients for cb1 and cb2 from the
347 * bitstream, sum the corresponding vectors and write the result to *out
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
)
357 for (i
= 0; i
< tctx
->n_div
[ftype
]; i
++) {
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
]);
365 int bits
= tctx
->bits_main_spec
[0][ftype
][bitstream_second_part
];
371 tmp0
= get_bits(gb
, bits
);
373 bits
= tctx
->bits_main_spec
[1][ftype
][bitstream_second_part
];
381 tmp1
= get_bits(gb
, bits
);
383 tab0
= cb0
+ tmp0
*cb_len
;
384 tab1
= cb1
+ tmp1
*cb_len
;
386 for (j
= 0; j
< length
; j
++)
387 out
[tctx
->permut
[ftype
][pos
+j
]] = sign0
*tab0
[j
] + sign1
*tab1
[j
];
394 static inline float mulawinv(float y
, float clip
, float mu
)
396 y
= av_clipf(y
/clip
, -1, 1);
397 return clip
* FFSIGN(y
) * (exp(log(1+mu
) * fabs(y
)) - 1) / mu
;
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:
406 * static int very_broken_op(int a, int b)
408 * static float test; // Ugh, force gcc to do the division first...
411 * return b * test + 0.5;
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.
420 static int very_broken_op(int a
, int b
)
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
];
437 * Sum to data a periodic peak of a given period, width and shape.
439 * @param period the period of the peak divised by 400.0
441 static void add_peak(int period
, int width
, const float *shape
,
442 float ppc_gain
, float *speech
, int len
)
446 const float *shape_end
= shape
+ len
;
449 // First peak centered around zero
450 for (i
= 0; i
< width
/2; i
++)
451 speech
[i
] += ppc_gain
* *shape
++;
453 for (i
= 1; i
< ROUNDED_DIV(len
,width
) ; i
++) {
454 center
= very_broken_op(period
, i
);
455 for (j
= -width
/2; j
< (width
+1)/2; j
++)
456 speech
[j
+center
] += ppc_gain
* *shape
++;
459 // For the last block, be careful not to go beyond the end of the buffer
460 center
= very_broken_op(period
, i
);
461 for (j
= -width
/2; j
< (width
+ 1)/2 && shape
< shape_end
; j
++)
462 speech
[j
+center
] += ppc_gain
* *shape
++;
465 static void decode_ppc(TwinContext
*tctx
, int period_coef
, const float *shape
,
466 float ppc_gain
, float *speech
)
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
;
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);
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
);
485 width
= (period
)* mtab
->peak_per2wid
/(400*mtab
->size
);
487 add_peak(period
, width
, shape
, ppc_gain
, speech
, mtab
->ppc_shape_len
);
490 static void dec_gain(TwinContext
*tctx
, GetBitContext
*gb
, enum FrameType ftype
,
493 const ModeTab
*mtab
= tctx
->mtab
;
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);
499 if (ftype
== FT_LONG
) {
500 for (i
= 0; i
< tctx
->avctx
->channels
; i
++)
501 out
[i
] = (1./(1<<13)) *
502 mulawinv(step
* 0.5 + step
* get_bits(gb
, GAIN_BITS
),
505 for (i
= 0; i
< tctx
->avctx
->channels
; i
++) {
506 float val
= (1./(1<<23)) *
507 mulawinv(step
* 0.5 + step
* get_bits(gb
, GAIN_BITS
),
510 for (j
= 0; j
< sub
; j
++) {
512 val
*mulawinv(sub_step
* 0.5 +
513 sub_step
* get_bits(gb
, SUB_GAIN_BITS
),
514 SUB_AMP_MAX
, MULAW_MU
);
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).
526 static void rearrange_lsp(int order
, float *lsp
, float min_dist
)
529 float min_dist2
= min_dist
* 0.5;
530 for (i
= 1; i
< order
; i
++)
531 if (lsp
[i
] - lsp
[i
-1] < min_dist
) {
532 float avg
= (lsp
[i
] + lsp
[i
-1]) * 0.5;
534 lsp
[i
-1] = avg
- min_dist2
;
535 lsp
[i
] = avg
+ min_dist2
;
539 static void bubblesort(float *lsp
, int lp_order
)
543 /* sort lsp in ascending order. float bubble agorithm,
544 O(n) if data already sorted, O(n^2) - otherwise */
545 for (i
= 0; i
< lp_order
- 1; i
++)
546 for (j
= i
; j
>= 0 && lsp
[j
] > lsp
[j
+1]; j
--)
547 FFSWAP(float, lsp
[j
], lsp
[j
+1]);
550 static void decode_lsp(TwinContext
*tctx
, int lpc_idx1
, uint8_t *lpc_idx2
,
551 int lpc_hist_idx
, float *lsp
, float *hist
)
553 const ModeTab
*mtab
= tctx
->mtab
;
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
;
560 const int8_t funny_rounding
[4] = {
562 mtab
->lsp_split
== 4 ? -2 : 1,
563 mtab
->lsp_split
== 4 ? -2 : 1,
568 for (i
= 0; i
< mtab
->lsp_split
; i
++) {
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
];
575 rearrange_lsp(mtab
->n_lsp
, lsp
, 0.0001);
577 for (i
= 0; i
< mtab
->n_lsp
; i
++) {
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
];
581 lsp
[i
] = lsp
[i
] * tmp1
+ tmp2
;
584 rearrange_lsp(mtab
->n_lsp
, lsp
, 0.0001);
585 rearrange_lsp(mtab
->n_lsp
, lsp
, 0.000095);
586 bubblesort(lsp
, mtab
->n_lsp
);
589 static void dec_lpc_spectrum_inv(TwinContext
*tctx
, float *lsp
,
590 enum FrameType ftype
, float *lpc
)
593 int size
= tctx
->mtab
->size
/ tctx
->mtab
->fmode
[ftype
].sub
;
595 for (i
= 0; i
< tctx
->mtab
->n_lsp
; i
++)
596 lsp
[i
] = 2*cos(lsp
[i
]);
600 eval_lpcenv_2parts(tctx
, ftype
, lsp
, lpc
, size
, 8);
603 eval_lpcenv_2parts(tctx
, ftype
, lsp
, lpc
, size
, 2);
606 eval_lpcenv(tctx
, lsp
, lpc
);
611 static void imdct_and_window(TwinContext
*tctx
, enum FrameType ftype
, int wtype
,
612 float *in
, float *prev
, int ch
)
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
;
619 int wsize
; // Window size
620 float *out
= tctx
->curr_frame
+ 2*ch
*mtab
->size
;
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
),
632 wsize
= types_sizes
[wtype_to_wsize
[wtype
]];
634 prev_buf
= prev
+ (size
- bsize
)/2;
636 for (j
= 0; j
< mtab
->fmode
[ftype
].sub
; j
++) {
637 int sub_wtype
= ftype
== FT_MEDIUM
? 8 : wtype
;
639 if (!j
&& wtype
== 4)
641 else if (j
== mtab
->fmode
[ftype
].sub
-1 && wtype
== 7)
644 wsize
= types_sizes
[wtype_to_wsize
[sub_wtype
]];
646 ff_imdct_half(&tctx
->mdct_ctx
[ftype
], buf1
+ bsize
*j
, in
+ bsize
*j
);
648 tctx
->dsp
.vector_fmul_window(out2
,
649 prev_buf
+ (bsize
-wsize
)/2,
651 ff_sine_windows
[av_log2(wsize
)],
656 memcpy(out2
, buf1
+ bsize
*j
+ wsize
/2, (bsize
- wsize
/2)*sizeof(float));
658 out2
+= ftype
== FT_MEDIUM
? (bsize
-wsize
)/2 : bsize
- wsize
;
660 prev_buf
= buf1
+ bsize
*j
+ bsize
/2;
663 tctx
->last_block_pos
[ch
] = (size
+ first_wsize
)/2;
666 static void imdct_output(TwinContext
*tctx
, enum FrameType ftype
, int wtype
,
669 const ModeTab
*mtab
= tctx
->mtab
;
670 float *prev_buf
= tctx
->prev_frame
+ tctx
->last_block_pos
[0];
673 for (i
= 0; i
< tctx
->avctx
->channels
; i
++) {
674 imdct_and_window(tctx
, ftype
, wtype
,
675 tctx
->spectrum
+ i
*mtab
->size
,
676 prev_buf
+ 2*i
*mtab
->size
,
680 if (tctx
->avctx
->channels
== 2) {
681 for (i
= 0; i
< mtab
->size
- tctx
->last_block_pos
[0]; i
++) {
682 float f1
= prev_buf
[ i
];
683 float f2
= prev_buf
[2*mtab
->size
+ i
];
685 out
[2*i
+ 1] = f1
- f2
;
687 for (j
= 0; i
< mtab
->size
; j
++,i
++) {
688 float f1
= tctx
->curr_frame
[ j
];
689 float f2
= tctx
->curr_frame
[2*mtab
->size
+ j
];
691 out
[2*i
+ 1] = f1
- f2
;
694 memcpy(out
, prev_buf
,
695 (mtab
->size
- tctx
->last_block_pos
[0]) * sizeof(*out
));
697 out
+= mtab
->size
- tctx
->last_block_pos
[0];
699 memcpy(out
, tctx
->curr_frame
,
700 (tctx
->last_block_pos
[0]) * sizeof(*out
));
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
)
708 const ModeTab
*mtab
= tctx
->mtab
;
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
;
716 for (i
= 0; i
< fw_cb_len
; i
++)
717 for (j
= 0; j
< bark_n_coef
; j
++, idx
++) {
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.;
724 if (st
< -1.) st
= 1.;
726 memset_float(out
, st
* gain
, mtab
->fmode
[ftype
].bark_tab
[idx
]);
727 out
+= mtab
->fmode
[ftype
].bark_tab
[idx
];
732 static void read_and_decode_spectrum(TwinContext
*tctx
, GetBitContext
*gb
,
733 float *out
, enum FrameType ftype
)
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
];
744 uint8_t lpc_idx1
[channels
];
745 uint8_t lpc_idx2
[channels
][tctx
->mtab
->lsp_split
];
746 uint8_t lpc_hist_idx
[channels
];
750 dequant(tctx
, gb
, out
, ftype
,
751 mtab
->fmode
[ftype
].cb0
, mtab
->fmode
[ftype
].cb1
,
752 mtab
->fmode
[ftype
].cb_len_read
);
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
++)
758 get_bits(gb
, mtab
->fmode
[ftype
].bark_n_bit
);
760 for (i
= 0; i
< channels
; i
++)
761 for (j
= 0; j
< sub
; j
++)
762 bark_use_hist
[i
][j
] = get_bits1(gb
);
764 dec_gain(tctx
, gb
, ftype
, gain
);
766 for (i
= 0; i
< channels
; i
++) {
767 lpc_hist_idx
[i
] = get_bits(gb
, tctx
->mtab
->lsp_bit0
);
768 lpc_idx1
[i
] = get_bits(gb
, tctx
->mtab
->lsp_bit1
);
770 for (j
= 0; j
< tctx
->mtab
->lsp_split
; j
++)
771 lpc_idx2
[i
][j
] = get_bits(gb
, tctx
->mtab
->lsp_bit2
);
774 if (ftype
== FT_LONG
) {
775 int cb_len_p
= (tctx
->n_div
[3] + mtab
->ppc_shape_len
*channels
- 1)/
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
);
781 for (i
= 0; i
< channels
; i
++) {
782 float *chunk
= out
+ mtab
->size
* i
;
783 float lsp
[tctx
->mtab
->n_lsp
];
785 for (j
= 0; j
< sub
; j
++) {
786 dec_bark_env(tctx
, bark1
[i
][j
], bark_use_hist
[i
][j
], i
,
787 tctx
->tmp_buf
, gain
[sub
*i
+j
], ftype
);
789 tctx
->dsp
.vector_fmul(chunk
+ block_size
*j
, tctx
->tmp_buf
,
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
);
799 mulawinv(pgain_step
*g_coef
+ pgain_step
/2, 25000., PGAIN_MU
);
801 decode_ppc(tctx
, p_coef
, ppc_shape
+ i
*mtab
->ppc_shape_len
, v
,
805 decode_lsp(tctx
, lpc_idx1
[i
], lpc_idx2
[i
], lpc_hist_idx
[i
], lsp
,
808 dec_lpc_spectrum_inv(tctx
, lsp
, ftype
, tctx
->tmp_buf
);
810 for (j
= 0; j
< mtab
->fmode
[ftype
].sub
; j
++) {
811 tctx
->dsp
.vector_fmul(chunk
, tctx
->tmp_buf
, block_size
);
817 static int twin_decode_frame(AVCodecContext
* avctx
, void *data
,
818 int *data_size
, AVPacket
*avpkt
)
820 const uint8_t *buf
= avpkt
->data
;
821 int buf_size
= avpkt
->size
;
822 TwinContext
*tctx
= avctx
->priv_data
;
824 const ModeTab
*mtab
= tctx
->mtab
;
826 enum FrameType ftype
;
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
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
);
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
);
844 if (window_type
> 8) {
845 av_log(avctx
, AV_LOG_ERROR
, "Invalid window type, broken sample?\n");
849 ftype
= wtype_to_ftype_table
[window_type
];
851 read_and_decode_spectrum(tctx
, &gb
, tctx
->spectrum
, ftype
);
853 imdct_output(tctx
, ftype
, window_type
, out
);
855 FFSWAP(float*, tctx
->curr_frame
, tctx
->prev_frame
);
857 if (tctx
->avctx
->frame_number
< 2) {
862 tctx
->dsp
.vector_clipf(out
, out
, -32700./(1<<15), 32700./(1<<15),
863 avctx
->channels
* mtab
->size
);
865 *data_size
= mtab
->size
*avctx
->channels
*4;
871 * Init IMDCT and windowing tables
873 static av_cold
void init_mdct_win(TwinContext
*tctx
)
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.;
882 for (i
= 0; i
< 3; i
++) {
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));
888 tctx
->tmp_buf
= av_malloc(mtab
->size
* sizeof(*tctx
->tmp_buf
));
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));
894 for (i
= 0; i
< 3; i
++) {
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
));
899 for (j
= 0; j
<= m
/8; j
++)
900 tctx
->cos_tabs
[i
][j
] = cos((2*j
+ 1)*freq
);
901 for (j
= 1; j
< m
/8; j
++)
902 tctx
->cos_tabs
[i
][m
/4-j
] = tctx
->cos_tabs
[i
][j
];
906 ff_sine_window_init(ff_sine_windows
[av_log2(size_m
) ], size_m
);
907 ff_sine_window_init(ff_sine_windows
[av_log2(size_s
/2) ], size_s
/2);
908 ff_sine_window_init(ff_sine_windows
[av_log2(mtab
->size
)], mtab
->size
);
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.
917 static void permutate_in_line(int16_t *tab
, int num_vect
, int num_blocks
,
919 const uint8_t line_len
[2], int length_div
,
920 enum FrameType ftype
)
925 for (i
= 0; i
< line_len
[0]; i
++) {
928 if (num_blocks
== 1 ||
929 (ftype
== FT_LONG
&& num_vect
% num_blocks
) ||
930 (ftype
!= FT_LONG
&& num_vect
& 1 ) ||
933 } else if (ftype
== FT_LONG
) {
938 for (j
= 0; j
< num_vect
&& (j
+num_vect
*i
< block_size
*num_blocks
); j
++)
939 tab
[i
*num_vect
+j
] = i
*num_vect
+ (j
+ shift
) % num_vect
;
944 * Interpret the input data as in the following table:
955 * and transpose it, giving the output
956 * aiqxbjr1cks2dlt3emu4fvn5gow6hp
958 static void transpose_perm(int16_t *out
, int16_t *in
, int num_vect
,
959 const uint8_t line_len
[2], int length_div
)
963 for (i
= 0; i
< num_vect
; i
++)
964 for (j
= 0; j
< line_len
[i
>= length_div
]; j
++)
965 out
[cont
++] = in
[j
*num_vect
+ i
];
968 static void linear_perm(int16_t *out
, int16_t *in
, int n_blocks
, int size
)
970 int block_size
= size
/n_blocks
;
973 for (i
= 0; i
< size
; i
++)
974 out
[i
] = block_size
* (in
[i
] % n_blocks
) + in
[i
] / n_blocks
;
977 static av_cold
void construct_perm_table(TwinContext
*tctx
,enum FrameType ftype
)
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
;
984 if (ftype
== FT_PPC
) {
985 size
= tctx
->avctx
->channels
;
986 block_size
= mtab
->ppc_shape_len
;
988 block_size
= mtab
->size
/ mtab
->fmode
[ftype
].sub
;
990 permutate_in_line(tmp_perm
, tctx
->n_div
[ftype
], size
,
991 block_size
, tctx
->length
[ftype
],
992 tctx
->length_change
[ftype
], ftype
);
994 transpose_perm(tctx
->permut
[ftype
], tmp_perm
, tctx
->n_div
[ftype
],
995 tctx
->length
[ftype
], tctx
->length_change
[ftype
]);
997 linear_perm(tctx
->permut
[ftype
], tctx
->permut
[ftype
], size
,
1001 static av_cold
void init_bitstream_params(TwinContext
*tctx
)
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
;
1008 int lsp_bits_per_block
= n_ch
*(mtab
->lsp_bit0
+ mtab
->lsp_bit1
+
1009 mtab
->lsp_split
*mtab
->lsp_bit2
);
1011 int ppc_bits
= n_ch
*(mtab
->pgain_bit
+ mtab
->ppc_shape_bit
+
1012 mtab
->ppc_period_bit
);
1014 int bsize_no_main_cb
[3];
1017 enum FrameType frametype
;
1019 for (i
= 0; i
< 3; i
++)
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);
1024 bsize_no_main_cb
[2] = bse_bits
[2] + lsp_bits_per_block
+ ppc_bits
+
1025 WINDOW_TYPE_BITS
+ n_ch
*GAIN_BITS
;
1027 for (i
= 0; i
< 2; i
++)
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
);
1032 // The remaining bits are all used for the main spectrum coefficients
1033 for (i
= 0; i
< 4; i
++) {
1036 int rounded_up
, rounded_down
, num_rounded_down
, num_rounded_up
;
1038 bit_size
= n_ch
* mtab
->ppc_shape_bit
;
1039 vect_size
= n_ch
* mtab
->ppc_shape_len
;
1041 bit_size
= total_fr_bits
- bsize_no_main_cb
[i
];
1042 vect_size
= n_ch
* mtab
->size
;
1045 tctx
->n_div
[i
] = (bit_size
+ 13) / 14;
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
;
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
;
1066 for (frametype
= FT_SHORT
; frametype
<= FT_PPC
; frametype
++)
1067 construct_perm_table(tctx
, frametype
);
1070 static av_cold
int twin_decode_init(AVCodecContext
*avctx
)
1072 TwinContext
*tctx
= avctx
->priv_data
;
1073 int isampf
= avctx
->sample_rate
/1000;
1074 int ibps
= avctx
->bit_rate
/(1000 * avctx
->channels
);
1076 tctx
->avctx
= avctx
;
1077 avctx
->sample_fmt
= SAMPLE_FMT_FLT
;
1079 if (avctx
->channels
> 2) {
1080 av_log(avctx
, AV_LOG_ERROR
, "Unsupported number of channels: %i\n",
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;
1096 av_log(avctx
, AV_LOG_ERROR
, "This version does not support %d kHz - %d kbit/s/ch mode.\n", isampf
, isampf
);
1100 dsputil_init(&tctx
->dsp
, avctx
);
1101 init_mdct_win(tctx
);
1102 init_bitstream_params(tctx
);
1104 memset_float(tctx
->bark_hist
[0][0], 0.1, FF_ARRAY_ELEMS(tctx
->bark_hist
));
1109 static av_cold
int twin_decode_close(AVCodecContext
*avctx
)
1111 TwinContext
*tctx
= avctx
->priv_data
;
1114 for (i
= 0; i
< 3; i
++) {
1115 ff_mdct_end(&tctx
->mdct_ctx
[i
]);
1116 av_free(tctx
->cos_tabs
[i
]);
1120 av_free(tctx
->curr_frame
);
1121 av_free(tctx
->spectrum
);
1122 av_free(tctx
->prev_frame
);
1123 av_free(tctx
->tmp_buf
);
1128 AVCodec twinvq_decoder
=
1133 sizeof(TwinContext
),
1138 .long_name
= NULL_IF_CONFIG_SMALL("VQF TwinVQ"),