3 * Copyright (c) 2009 Vitor Sessak
5 * This file is part of Libav.
7 * Libav 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 * Libav 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 Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
32 #include "twinvq_data.h"
35 FT_SHORT
= 0, ///< Short frame (divided in n sub-blocks)
36 FT_MEDIUM
, ///< Medium frame (divided in m<n sub-blocks)
37 FT_LONG
, ///< Long frame (single sub-block + PPC)
38 FT_PPC
, ///< Periodic Peak Component (part of the long frame)
42 * Parameters and tables that are different for each frame type
45 uint8_t sub
; ///< Number subblocks in each frame
46 const uint16_t *bark_tab
;
48 /** number of distinct bark scale envelope values */
49 uint8_t bark_env_size
;
51 const int16_t *bark_cb
; ///< codebook for the bark scale envelope (BSE)
52 uint8_t bark_n_coef
;///< number of BSE CB coefficients to read
53 uint8_t bark_n_bit
; ///< number of bits of the BSE coefs
56 /** main codebooks for spectrum data */
61 uint8_t cb_len_read
; ///< number of spectrum coefficients to read
65 * Parameters and tables that are different for every combination of
69 struct FrameMode fmode
[3]; ///< frame type-dependant parameters
71 uint16_t size
; ///< frame size in samples
72 uint8_t n_lsp
; ///< number of lsp coefficients
73 const float *lspcodebook
;
75 /* number of bits of the different LSP CB coefficients */
80 uint8_t lsp_split
; ///< number of CB entries for the LSP decoding
81 const int16_t *ppc_shape_cb
; ///< PPC shape CB
83 /** number of the bits for the PPC period value */
84 uint8_t ppc_period_bit
;
86 uint8_t ppc_shape_bit
; ///< number of bits of the PPC shape CB coeffs
87 uint8_t ppc_shape_len
; ///< size of PPC shape CB
88 uint8_t pgain_bit
; ///< bits for PPC gain
90 /** constant for peak period to peak width conversion */
91 uint16_t peak_per2wid
;
94 static const ModeTab mode_08_08
= {
96 { 8, bark_tab_s08_64
, 10, tab
.fcb08s
, 1, 5, tab
.cb0808s0
, tab
.cb0808s1
, 18},
97 { 2, bark_tab_m08_256
, 20, tab
.fcb08m
, 2, 5, tab
.cb0808m0
, tab
.cb0808m1
, 16},
98 { 1, bark_tab_l08_512
, 30, tab
.fcb08l
, 3, 6, tab
.cb0808l0
, tab
.cb0808l1
, 17}
100 512 , 12, tab
.lsp08
, 1, 5, 3, 3, tab
.shape08
, 8, 28, 20, 6, 40
103 static const ModeTab mode_11_08
= {
105 { 8, bark_tab_s11_64
, 10, tab
.fcb11s
, 1, 5, tab
.cb1108s0
, tab
.cb1108s1
, 29},
106 { 2, bark_tab_m11_256
, 20, tab
.fcb11m
, 2, 5, tab
.cb1108m0
, tab
.cb1108m1
, 24},
107 { 1, bark_tab_l11_512
, 30, tab
.fcb11l
, 3, 6, tab
.cb1108l0
, tab
.cb1108l1
, 27}
109 512 , 16, tab
.lsp11
, 1, 6, 4, 3, tab
.shape11
, 9, 36, 30, 7, 90
112 static const ModeTab mode_11_10
= {
114 { 8, bark_tab_s11_64
, 10, tab
.fcb11s
, 1, 5, tab
.cb1110s0
, tab
.cb1110s1
, 21},
115 { 2, bark_tab_m11_256
, 20, tab
.fcb11m
, 2, 5, tab
.cb1110m0
, tab
.cb1110m1
, 18},
116 { 1, bark_tab_l11_512
, 30, tab
.fcb11l
, 3, 6, tab
.cb1110l0
, tab
.cb1110l1
, 20}
118 512 , 16, tab
.lsp11
, 1, 6, 4, 3, tab
.shape11
, 9, 36, 30, 7, 90
121 static const ModeTab mode_16_16
= {
123 { 8, bark_tab_s16_128
, 10, tab
.fcb16s
, 1, 5, tab
.cb1616s0
, tab
.cb1616s1
, 16},
124 { 2, bark_tab_m16_512
, 20, tab
.fcb16m
, 2, 5, tab
.cb1616m0
, tab
.cb1616m1
, 15},
125 { 1, bark_tab_l16_1024
,30, tab
.fcb16l
, 3, 6, tab
.cb1616l0
, tab
.cb1616l1
, 16}
127 1024, 16, tab
.lsp16
, 1, 6, 4, 3, tab
.shape16
, 9, 56, 60, 7, 180
130 static const ModeTab mode_22_20
= {
132 { 8, bark_tab_s22_128
, 10, tab
.fcb22s_1
, 1, 6, tab
.cb2220s0
, tab
.cb2220s1
, 18},
133 { 2, bark_tab_m22_512
, 20, tab
.fcb22m_1
, 2, 6, tab
.cb2220m0
, tab
.cb2220m1
, 17},
134 { 1, bark_tab_l22_1024
,32, tab
.fcb22l_1
, 4, 6, tab
.cb2220l0
, tab
.cb2220l1
, 18}
136 1024, 16, tab
.lsp22_1
, 1, 6, 4, 3, tab
.shape22_1
, 9, 56, 36, 7, 144
139 static const ModeTab mode_22_24
= {
141 { 8, bark_tab_s22_128
, 10, tab
.fcb22s_1
, 1, 6, tab
.cb2224s0
, tab
.cb2224s1
, 15},
142 { 2, bark_tab_m22_512
, 20, tab
.fcb22m_1
, 2, 6, tab
.cb2224m0
, tab
.cb2224m1
, 14},
143 { 1, bark_tab_l22_1024
,32, tab
.fcb22l_1
, 4, 6, tab
.cb2224l0
, tab
.cb2224l1
, 15}
145 1024, 16, tab
.lsp22_1
, 1, 6, 4, 3, tab
.shape22_1
, 9, 56, 36, 7, 144
148 static const ModeTab mode_22_32
= {
150 { 4, bark_tab_s22_128
, 10, tab
.fcb22s_2
, 1, 6, tab
.cb2232s0
, tab
.cb2232s1
, 11},
151 { 2, bark_tab_m22_256
, 20, tab
.fcb22m_2
, 2, 6, tab
.cb2232m0
, tab
.cb2232m1
, 11},
152 { 1, bark_tab_l22_512
, 32, tab
.fcb22l_2
, 4, 6, tab
.cb2232l0
, tab
.cb2232l1
, 12}
154 512 , 16, tab
.lsp22_2
, 1, 6, 4, 4, tab
.shape22_2
, 9, 56, 36, 7, 72
157 static const ModeTab mode_44_40
= {
159 {16, bark_tab_s44_128
, 10, tab
.fcb44s
, 1, 6, tab
.cb4440s0
, tab
.cb4440s1
, 18},
160 { 4, bark_tab_m44_512
, 20, tab
.fcb44m
, 2, 6, tab
.cb4440m0
, tab
.cb4440m1
, 17},
161 { 1, bark_tab_l44_2048
,40, tab
.fcb44l
, 4, 6, tab
.cb4440l0
, tab
.cb4440l1
, 17}
163 2048, 20, tab
.lsp44
, 1, 6, 4, 4, tab
.shape44
, 9, 84, 54, 7, 432
166 static const ModeTab mode_44_48
= {
168 {16, bark_tab_s44_128
, 10, tab
.fcb44s
, 1, 6, tab
.cb4448s0
, tab
.cb4448s1
, 15},
169 { 4, bark_tab_m44_512
, 20, tab
.fcb44m
, 2, 6, tab
.cb4448m0
, tab
.cb4448m1
, 14},
170 { 1, bark_tab_l44_2048
,40, tab
.fcb44l
, 4, 6, tab
.cb4448l0
, tab
.cb4448l1
, 14}
172 2048, 20, tab
.lsp44
, 1, 6, 4, 4, tab
.shape44
, 9, 84, 54, 7, 432
175 typedef struct TwinContext
{
176 AVCodecContext
*avctx
;
178 FFTContext mdct_ctx
[3];
183 float lsp_hist
[2][20]; ///< LSP coefficients of the last frame
184 float bark_hist
[3][2][40]; ///< BSE coefficients of last frame
186 // bitstream parameters
187 int16_t permut
[4][4096];
188 uint8_t length
[4][2]; ///< main codebook stride
189 uint8_t length_change
[4];
190 uint8_t bits_main_spec
[2][4][2]; ///< bits for the main codebook
191 int bits_main_spec_change
[4];
195 float *curr_frame
; ///< non-interleaved output
196 float *prev_frame
; ///< non-interleaved previous frame
197 int last_block_pos
[2];
205 #define PPC_SHAPE_CB_SIZE 64
206 #define PPC_SHAPE_LEN_MAX 60
207 #define SUB_AMP_MAX 4500.0
208 #define MULAW_MU 100.0
210 #define AMP_MAX 13000.0
211 #define SUB_GAIN_BITS 5
212 #define WINDOW_TYPE_BITS 4
214 #define LSP_COEFS_MAX 20
215 #define LSP_SPLIT_MAX 4
216 #define CHANNELS_MAX 2
217 #define SUBBLOCKS_MAX 16
218 #define BARK_N_COEF_MAX 4
220 /** @note not speed critical, hence not optimized */
221 static void memset_float(float *buf
, float val
, int size
)
228 * Evaluate a single LPC amplitude spectrum envelope coefficient from the line
231 * @param lsp a vector of the cosinus of the LSP values
232 * @param cos_val cos(PI*i/N) where i is the index of the LPC amplitude
233 * @param order the order of the LSP (and the size of the *lsp buffer). Must
234 * be a multiple of four.
235 * @return the LPC value
237 * @todo reuse code from Vorbis decoder: vorbis_floor0_decode
239 static float eval_lpc_spectrum(const float *lsp
, float cos_val
, int order
)
244 float two_cos_w
= 2.0f
*cos_val
;
246 for (j
= 0; j
+ 1 < order
; j
+= 2*2) {
247 // Unroll the loop once since order is a multiple of four
248 q
*= lsp
[j
] - two_cos_w
;
249 p
*= lsp
[j
+1] - two_cos_w
;
251 q
*= lsp
[j
+2] - two_cos_w
;
252 p
*= lsp
[j
+3] - two_cos_w
;
255 p
*= p
* (2.0f
- two_cos_w
);
256 q
*= q
* (2.0f
+ two_cos_w
);
258 return 0.5 / (p
+ q
);
262 * Evaluate the LPC amplitude spectrum envelope from the line spectrum pairs.
264 static void eval_lpcenv(TwinContext
*tctx
, const float *cos_vals
, float *lpc
)
267 const ModeTab
*mtab
= tctx
->mtab
;
268 int size_s
= mtab
->size
/ mtab
->fmode
[FT_SHORT
].sub
;
270 for (i
= 0; i
< size_s
/2; i
++) {
271 float cos_i
= tctx
->cos_tabs
[0][i
];
272 lpc
[i
] = eval_lpc_spectrum(cos_vals
, cos_i
, mtab
->n_lsp
);
273 lpc
[size_s
-i
-1] = eval_lpc_spectrum(cos_vals
, -cos_i
, mtab
->n_lsp
);
277 static void interpolate(float *out
, float v1
, float v2
, int size
)
280 float step
= (v1
- v2
)/(size
+ 1);
282 for (i
= 0; i
< size
; i
++) {
288 static inline float get_cos(int idx
, int part
, const float *cos_tab
, int size
)
290 return part ?
-cos_tab
[size
- idx
- 1] :
295 * Evaluate the LPC amplitude spectrum envelope from the line spectrum pairs.
296 * Probably for speed reasons, the coefficients are evaluated as
297 * siiiibiiiisiiiibiiiisiiiibiiiisiiiibiiiis ...
298 * where s is an evaluated value, i is a value interpolated from the others
299 * and b might be either calculated or interpolated, depending on an
300 * unexplained condition.
302 * @param step the size of a block "siiiibiiii"
303 * @param in the cosinus of the LSP data
304 * @param part is 0 for 0...PI (positive cossinus values) and 1 for PI...2PI
305 (negative cossinus values)
306 * @param size the size of the whole output
308 static inline void eval_lpcenv_or_interp(TwinContext
*tctx
,
309 enum FrameType ftype
,
310 float *out
, const float *in
,
311 int size
, int step
, int part
)
314 const ModeTab
*mtab
= tctx
->mtab
;
315 const float *cos_tab
= tctx
->cos_tabs
[ftype
];
318 for (i
= 0; i
< size
; i
+= step
)
320 eval_lpc_spectrum(in
,
321 get_cos(i
, part
, cos_tab
, size
),
324 // Fill the 'iiiibiiii'
325 for (i
= step
; i
<= size
- 2*step
; i
+= step
) {
326 if (out
[i
+ step
] + out
[i
- step
] > 1.95*out
[i
] ||
327 out
[i
+ step
] >= out
[i
- step
]) {
328 interpolate(out
+ i
- step
+ 1, out
[i
], out
[i
-step
], step
- 1);
331 eval_lpc_spectrum(in
,
332 get_cos(i
-step
/2, part
, cos_tab
, size
),
334 interpolate(out
+ i
- step
+ 1, out
[i
-step
/2], out
[i
-step
], step
/2 - 1);
335 interpolate(out
+ i
- step
/2 + 1, out
[i
], out
[i
-step
/2], step
/2 - 1);
339 interpolate(out
+ size
- 2*step
+ 1, out
[size
-step
], out
[size
- 2*step
], step
- 1);
342 static void eval_lpcenv_2parts(TwinContext
*tctx
, enum FrameType ftype
,
343 const float *buf
, float *lpc
,
346 eval_lpcenv_or_interp(tctx
, ftype
, lpc
, buf
, size
/2, step
, 0);
347 eval_lpcenv_or_interp(tctx
, ftype
, lpc
+ size
/2, buf
, size
/2, 2*step
, 1);
349 interpolate(lpc
+size
/2-step
+1, lpc
[size
/2], lpc
[size
/2-step
], step
);
351 memset_float(lpc
+ size
- 2*step
+ 1, lpc
[size
- 2*step
], 2*step
- 1);
355 * Inverse quantization. Read CB coefficients for cb1 and cb2 from the
356 * bitstream, sum the corresponding vectors and write the result to *out
359 static void dequant(TwinContext
*tctx
, GetBitContext
*gb
, float *out
,
360 enum FrameType ftype
,
361 const int16_t *cb0
, const int16_t *cb1
, int cb_len
)
366 for (i
= 0; i
< tctx
->n_div
[ftype
]; i
++) {
370 const int16_t *tab0
, *tab1
;
371 int length
= tctx
->length
[ftype
][i
>= tctx
->length_change
[ftype
]];
372 int bitstream_second_part
= (i
>= tctx
->bits_main_spec_change
[ftype
]);
374 int bits
= tctx
->bits_main_spec
[0][ftype
][bitstream_second_part
];
380 tmp0
= get_bits(gb
, bits
);
382 bits
= tctx
->bits_main_spec
[1][ftype
][bitstream_second_part
];
390 tmp1
= get_bits(gb
, bits
);
392 tab0
= cb0
+ tmp0
*cb_len
;
393 tab1
= cb1
+ tmp1
*cb_len
;
395 for (j
= 0; j
< length
; j
++)
396 out
[tctx
->permut
[ftype
][pos
+j
]] = sign0
*tab0
[j
] + sign1
*tab1
[j
];
403 static inline float mulawinv(float y
, float clip
, float mu
)
405 y
= av_clipf(y
/clip
, -1, 1);
406 return clip
* FFSIGN(y
) * (exp(log(1+mu
) * fabs(y
)) - 1) / mu
;
410 * Evaluate a*b/400 rounded to the nearest integer. When, for example,
411 * a*b == 200 and the nearest integer is ill-defined, use a table to emulate
412 * the following broken float-based implementation used by the binary decoder:
415 * static int very_broken_op(int a, int b)
417 * static float test; // Ugh, force gcc to do the division first...
420 * return b * test + 0.5;
424 * @note if this function is replaced by just ROUNDED_DIV(a*b,400.), the stddev
425 * between the original file (before encoding with Yamaha encoder) and the
426 * decoded output increases, which leads one to believe that the encoder expects
427 * exactly this broken calculation.
429 static int very_broken_op(int a
, int b
)
440 size
= tabs
[b
/5].size
;
441 rtab
= tabs
[b
/5].tab
;
442 return x
- rtab
[size
*av_log2(2*(x
- 1)/size
)+(x
- 1)%size
];
446 * Sum to data a periodic peak of a given period, width and shape.
448 * @param period the period of the peak divised by 400.0
450 static void add_peak(int period
, int width
, const float *shape
,
451 float ppc_gain
, float *speech
, int len
)
455 const float *shape_end
= shape
+ len
;
458 // First peak centered around zero
459 for (i
= 0; i
< width
/2; i
++)
460 speech
[i
] += ppc_gain
* *shape
++;
462 for (i
= 1; i
< ROUNDED_DIV(len
,width
) ; i
++) {
463 center
= very_broken_op(period
, i
);
464 for (j
= -width
/2; j
< (width
+1)/2; j
++)
465 speech
[j
+center
] += ppc_gain
* *shape
++;
468 // For the last block, be careful not to go beyond the end of the buffer
469 center
= very_broken_op(period
, i
);
470 for (j
= -width
/2; j
< (width
+ 1)/2 && shape
< shape_end
; j
++)
471 speech
[j
+center
] += ppc_gain
* *shape
++;
474 static void decode_ppc(TwinContext
*tctx
, int period_coef
, const float *shape
,
475 float ppc_gain
, float *speech
)
477 const ModeTab
*mtab
= tctx
->mtab
;
478 int isampf
= tctx
->avctx
->sample_rate
/1000;
479 int ibps
= tctx
->avctx
->bit_rate
/(1000 * tctx
->avctx
->channels
);
480 int min_period
= ROUNDED_DIV( 40*2*mtab
->size
, isampf
);
481 int max_period
= ROUNDED_DIV(6*40*2*mtab
->size
, isampf
);
482 int period_range
= max_period
- min_period
;
484 // This is actually the period multiplied by 400. It is just linearly coded
485 // between its maximum and minimum value.
486 int period
= min_period
+
487 ROUNDED_DIV(period_coef
*period_range
, (1 << mtab
->ppc_period_bit
) - 1);
490 if (isampf
== 22 && ibps
== 32) {
491 // For some unknown reason, NTT decided to code this case differently...
492 width
= ROUNDED_DIV((period
+ 800)* mtab
->peak_per2wid
, 400*mtab
->size
);
494 width
= (period
)* mtab
->peak_per2wid
/(400*mtab
->size
);
496 add_peak(period
, width
, shape
, ppc_gain
, speech
, mtab
->ppc_shape_len
);
499 static void dec_gain(TwinContext
*tctx
, GetBitContext
*gb
, enum FrameType ftype
,
502 const ModeTab
*mtab
= tctx
->mtab
;
504 int sub
= mtab
->fmode
[ftype
].sub
;
505 float step
= AMP_MAX
/ ((1 << GAIN_BITS
) - 1);
506 float sub_step
= SUB_AMP_MAX
/ ((1 << SUB_GAIN_BITS
) - 1);
508 if (ftype
== FT_LONG
) {
509 for (i
= 0; i
< tctx
->avctx
->channels
; i
++)
510 out
[i
] = (1./(1<<13)) *
511 mulawinv(step
* 0.5 + step
* get_bits(gb
, GAIN_BITS
),
514 for (i
= 0; i
< tctx
->avctx
->channels
; i
++) {
515 float val
= (1./(1<<23)) *
516 mulawinv(step
* 0.5 + step
* get_bits(gb
, GAIN_BITS
),
519 for (j
= 0; j
< sub
; j
++) {
521 val
*mulawinv(sub_step
* 0.5 +
522 sub_step
* get_bits(gb
, SUB_GAIN_BITS
),
523 SUB_AMP_MAX
, MULAW_MU
);
530 * Rearrange the LSP coefficients so that they have a minimum distance of
531 * min_dist. This function does it exactly as described in section of 3.2.4
532 * of the G.729 specification (but interestingly is different from what the
533 * reference decoder actually does).
535 static void rearrange_lsp(int order
, float *lsp
, float min_dist
)
538 float min_dist2
= min_dist
* 0.5;
539 for (i
= 1; i
< order
; i
++)
540 if (lsp
[i
] - lsp
[i
-1] < min_dist
) {
541 float avg
= (lsp
[i
] + lsp
[i
-1]) * 0.5;
543 lsp
[i
-1] = avg
- min_dist2
;
544 lsp
[i
] = avg
+ min_dist2
;
548 static void decode_lsp(TwinContext
*tctx
, int lpc_idx1
, uint8_t *lpc_idx2
,
549 int lpc_hist_idx
, float *lsp
, float *hist
)
551 const ModeTab
*mtab
= tctx
->mtab
;
554 const float *cb
= mtab
->lspcodebook
;
555 const float *cb2
= cb
+ (1 << mtab
->lsp_bit1
)*mtab
->n_lsp
;
556 const float *cb3
= cb2
+ (1 << mtab
->lsp_bit2
)*mtab
->n_lsp
;
558 const int8_t funny_rounding
[4] = {
560 mtab
->lsp_split
== 4 ?
-2 : 1,
561 mtab
->lsp_split
== 4 ?
-2 : 1,
566 for (i
= 0; i
< mtab
->lsp_split
; i
++) {
567 int chunk_end
= ((i
+ 1)*mtab
->n_lsp
+ funny_rounding
[i
])/mtab
->lsp_split
;
568 for (; j
< chunk_end
; j
++)
569 lsp
[j
] = cb
[lpc_idx1
* mtab
->n_lsp
+ j
] +
570 cb2
[lpc_idx2
[i
] * mtab
->n_lsp
+ j
];
573 rearrange_lsp(mtab
->n_lsp
, lsp
, 0.0001);
575 for (i
= 0; i
< mtab
->n_lsp
; i
++) {
576 float tmp1
= 1. - cb3
[lpc_hist_idx
*mtab
->n_lsp
+ i
];
577 float tmp2
= hist
[i
] * cb3
[lpc_hist_idx
*mtab
->n_lsp
+ i
];
579 lsp
[i
] = lsp
[i
] * tmp1
+ tmp2
;
582 rearrange_lsp(mtab
->n_lsp
, lsp
, 0.0001);
583 rearrange_lsp(mtab
->n_lsp
, lsp
, 0.000095);
584 ff_sort_nearly_sorted_floats(lsp
, mtab
->n_lsp
);
587 static void dec_lpc_spectrum_inv(TwinContext
*tctx
, float *lsp
,
588 enum FrameType ftype
, float *lpc
)
591 int size
= tctx
->mtab
->size
/ tctx
->mtab
->fmode
[ftype
].sub
;
593 for (i
= 0; i
< tctx
->mtab
->n_lsp
; i
++)
594 lsp
[i
] = 2*cos(lsp
[i
]);
598 eval_lpcenv_2parts(tctx
, ftype
, lsp
, lpc
, size
, 8);
601 eval_lpcenv_2parts(tctx
, ftype
, lsp
, lpc
, size
, 2);
604 eval_lpcenv(tctx
, lsp
, lpc
);
609 static void imdct_and_window(TwinContext
*tctx
, enum FrameType ftype
, int wtype
,
610 float *in
, float *prev
, int ch
)
612 FFTContext
*mdct
= &tctx
->mdct_ctx
[ftype
];
613 const ModeTab
*mtab
= tctx
->mtab
;
614 int bsize
= mtab
->size
/ mtab
->fmode
[ftype
].sub
;
615 int size
= mtab
->size
;
616 float *buf1
= tctx
->tmp_buf
;
618 int wsize
; // Window size
619 float *out
= tctx
->curr_frame
+ 2*ch
*mtab
->size
;
624 static const uint8_t wtype_to_wsize
[] = {0, 0, 2, 2, 2, 1, 0, 1, 1};
625 int types_sizes
[] = {
626 mtab
->size
/ mtab
->fmode
[FT_LONG
].sub
,
627 mtab
->size
/ mtab
->fmode
[FT_MEDIUM
].sub
,
628 mtab
->size
/ (2*mtab
->fmode
[FT_SHORT
].sub
),
631 wsize
= types_sizes
[wtype_to_wsize
[wtype
]];
633 prev_buf
= prev
+ (size
- bsize
)/2;
635 for (j
= 0; j
< mtab
->fmode
[ftype
].sub
; j
++) {
636 int sub_wtype
= ftype
== FT_MEDIUM ?
8 : wtype
;
638 if (!j
&& wtype
== 4)
640 else if (j
== mtab
->fmode
[ftype
].sub
-1 && wtype
== 7)
643 wsize
= types_sizes
[wtype_to_wsize
[sub_wtype
]];
645 mdct
->imdct_half(mdct
, buf1
+ bsize
*j
, in
+ bsize
*j
);
647 tctx
->dsp
.vector_fmul_window(out2
,
648 prev_buf
+ (bsize
-wsize
)/2,
650 ff_sine_windows
[av_log2(wsize
)],
654 memcpy(out2
, buf1
+ bsize
*j
+ wsize
/2, (bsize
- wsize
/2)*sizeof(float));
656 out2
+= ftype
== FT_MEDIUM ?
(bsize
-wsize
)/2 : bsize
- wsize
;
658 prev_buf
= buf1
+ bsize
*j
+ bsize
/2;
661 tctx
->last_block_pos
[ch
] = (size
+ first_wsize
)/2;
664 static void imdct_output(TwinContext
*tctx
, enum FrameType ftype
, int wtype
,
667 const ModeTab
*mtab
= tctx
->mtab
;
668 float *prev_buf
= tctx
->prev_frame
+ tctx
->last_block_pos
[0];
671 for (i
= 0; i
< tctx
->avctx
->channels
; i
++) {
672 imdct_and_window(tctx
, ftype
, wtype
,
673 tctx
->spectrum
+ i
*mtab
->size
,
674 prev_buf
+ 2*i
*mtab
->size
,
678 if (tctx
->avctx
->channels
== 2) {
679 for (i
= 0; i
< mtab
->size
- tctx
->last_block_pos
[0]; i
++) {
680 float f1
= prev_buf
[ i
];
681 float f2
= prev_buf
[2*mtab
->size
+ i
];
683 out
[2*i
+ 1] = f1
- f2
;
685 for (j
= 0; i
< mtab
->size
; j
++,i
++) {
686 float f1
= tctx
->curr_frame
[ j
];
687 float f2
= tctx
->curr_frame
[2*mtab
->size
+ j
];
689 out
[2*i
+ 1] = f1
- f2
;
692 memcpy(out
, prev_buf
,
693 (mtab
->size
- tctx
->last_block_pos
[0]) * sizeof(*out
));
695 out
+= mtab
->size
- tctx
->last_block_pos
[0];
697 memcpy(out
, tctx
->curr_frame
,
698 (tctx
->last_block_pos
[0]) * sizeof(*out
));
703 static void dec_bark_env(TwinContext
*tctx
, const uint8_t *in
, int use_hist
,
704 int ch
, float *out
, float gain
, enum FrameType ftype
)
706 const ModeTab
*mtab
= tctx
->mtab
;
708 float *hist
= tctx
->bark_hist
[ftype
][ch
];
709 float val
= ((const float []) {0.4, 0.35, 0.28})[ftype
];
710 int bark_n_coef
= mtab
->fmode
[ftype
].bark_n_coef
;
711 int fw_cb_len
= mtab
->fmode
[ftype
].bark_env_size
/ bark_n_coef
;
714 for (i
= 0; i
< fw_cb_len
; i
++)
715 for (j
= 0; j
< bark_n_coef
; j
++, idx
++) {
717 mtab
->fmode
[ftype
].bark_cb
[fw_cb_len
*in
[j
] + i
] * (1./4096);
718 float st
= use_hist ?
719 (1. - val
) * tmp2
+ val
*hist
[idx
] + 1. : tmp2
+ 1.;
722 if (st
< -1.) st
= 1.;
724 memset_float(out
, st
* gain
, mtab
->fmode
[ftype
].bark_tab
[idx
]);
725 out
+= mtab
->fmode
[ftype
].bark_tab
[idx
];
730 static void read_and_decode_spectrum(TwinContext
*tctx
, GetBitContext
*gb
,
731 float *out
, enum FrameType ftype
)
733 const ModeTab
*mtab
= tctx
->mtab
;
734 int channels
= tctx
->avctx
->channels
;
735 int sub
= mtab
->fmode
[ftype
].sub
;
736 int block_size
= mtab
->size
/ sub
;
737 float gain
[CHANNELS_MAX
*SUBBLOCKS_MAX
];
738 float ppc_shape
[PPC_SHAPE_LEN_MAX
* CHANNELS_MAX
* 4];
739 uint8_t bark1
[CHANNELS_MAX
][SUBBLOCKS_MAX
][BARK_N_COEF_MAX
];
740 uint8_t bark_use_hist
[CHANNELS_MAX
][SUBBLOCKS_MAX
];
742 uint8_t lpc_idx1
[CHANNELS_MAX
];
743 uint8_t lpc_idx2
[CHANNELS_MAX
][LSP_SPLIT_MAX
];
744 uint8_t lpc_hist_idx
[CHANNELS_MAX
];
748 dequant(tctx
, gb
, out
, ftype
,
749 mtab
->fmode
[ftype
].cb0
, mtab
->fmode
[ftype
].cb1
,
750 mtab
->fmode
[ftype
].cb_len_read
);
752 for (i
= 0; i
< channels
; i
++)
753 for (j
= 0; j
< sub
; j
++)
754 for (k
= 0; k
< mtab
->fmode
[ftype
].bark_n_coef
; k
++)
756 get_bits(gb
, mtab
->fmode
[ftype
].bark_n_bit
);
758 for (i
= 0; i
< channels
; i
++)
759 for (j
= 0; j
< sub
; j
++)
760 bark_use_hist
[i
][j
] = get_bits1(gb
);
762 dec_gain(tctx
, gb
, ftype
, gain
);
764 for (i
= 0; i
< channels
; i
++) {
765 lpc_hist_idx
[i
] = get_bits(gb
, tctx
->mtab
->lsp_bit0
);
766 lpc_idx1
[i
] = get_bits(gb
, tctx
->mtab
->lsp_bit1
);
768 for (j
= 0; j
< tctx
->mtab
->lsp_split
; j
++)
769 lpc_idx2
[i
][j
] = get_bits(gb
, tctx
->mtab
->lsp_bit2
);
772 if (ftype
== FT_LONG
) {
773 int cb_len_p
= (tctx
->n_div
[3] + mtab
->ppc_shape_len
*channels
- 1)/
775 dequant(tctx
, gb
, ppc_shape
, FT_PPC
, mtab
->ppc_shape_cb
,
776 mtab
->ppc_shape_cb
+ cb_len_p
*PPC_SHAPE_CB_SIZE
, cb_len_p
);
779 for (i
= 0; i
< channels
; i
++) {
780 float *chunk
= out
+ mtab
->size
* i
;
781 float lsp
[LSP_COEFS_MAX
];
783 for (j
= 0; j
< sub
; j
++) {
784 dec_bark_env(tctx
, bark1
[i
][j
], bark_use_hist
[i
][j
], i
,
785 tctx
->tmp_buf
, gain
[sub
*i
+j
], ftype
);
787 tctx
->dsp
.vector_fmul(chunk
+ block_size
*j
, chunk
+ block_size
*j
, tctx
->tmp_buf
,
792 if (ftype
== FT_LONG
) {
793 float pgain_step
= 25000. / ((1 << mtab
->pgain_bit
) - 1);
794 int p_coef
= get_bits(gb
, tctx
->mtab
->ppc_period_bit
);
795 int g_coef
= get_bits(gb
, tctx
->mtab
->pgain_bit
);
797 mulawinv(pgain_step
*g_coef
+ pgain_step
/2, 25000., PGAIN_MU
);
799 decode_ppc(tctx
, p_coef
, ppc_shape
+ i
*mtab
->ppc_shape_len
, v
,
803 decode_lsp(tctx
, lpc_idx1
[i
], lpc_idx2
[i
], lpc_hist_idx
[i
], lsp
,
806 dec_lpc_spectrum_inv(tctx
, lsp
, ftype
, tctx
->tmp_buf
);
808 for (j
= 0; j
< mtab
->fmode
[ftype
].sub
; j
++) {
809 tctx
->dsp
.vector_fmul(chunk
, chunk
, tctx
->tmp_buf
, block_size
);
815 static int twin_decode_frame(AVCodecContext
* avctx
, void *data
,
816 int *data_size
, AVPacket
*avpkt
)
818 const uint8_t *buf
= avpkt
->data
;
819 int buf_size
= avpkt
->size
;
820 TwinContext
*tctx
= avctx
->priv_data
;
822 const ModeTab
*mtab
= tctx
->mtab
;
824 enum FrameType ftype
;
825 int window_type
, out_size
;
826 static const enum FrameType wtype_to_ftype_table
[] = {
827 FT_LONG
, FT_LONG
, FT_SHORT
, FT_LONG
,
828 FT_MEDIUM
, FT_LONG
, FT_LONG
, FT_MEDIUM
, FT_MEDIUM
831 if (buf_size
*8 < avctx
->bit_rate
*mtab
->size
/avctx
->sample_rate
+ 8) {
832 av_log(avctx
, AV_LOG_ERROR
,
833 "Frame too small (%d bytes). Truncated file?\n", buf_size
);
834 return AVERROR(EINVAL
);
837 out_size
= mtab
->size
* avctx
->channels
*
838 av_get_bytes_per_sample(avctx
->sample_fmt
);
839 if (*data_size
< out_size
) {
840 av_log(avctx
, AV_LOG_ERROR
, "output buffer is too small\n");
841 return AVERROR(EINVAL
);
844 init_get_bits(&gb
, buf
, buf_size
* 8);
845 skip_bits(&gb
, get_bits(&gb
, 8));
846 window_type
= get_bits(&gb
, WINDOW_TYPE_BITS
);
848 if (window_type
> 8) {
849 av_log(avctx
, AV_LOG_ERROR
, "Invalid window type, broken sample?\n");
853 ftype
= wtype_to_ftype_table
[window_type
];
855 read_and_decode_spectrum(tctx
, &gb
, tctx
->spectrum
, ftype
);
857 imdct_output(tctx
, ftype
, window_type
, out
);
859 FFSWAP(float*, tctx
->curr_frame
, tctx
->prev_frame
);
861 if (tctx
->avctx
->frame_number
< 2) {
866 *data_size
= out_size
;
872 * Init IMDCT and windowing tables
874 static av_cold
int init_mdct_win(TwinContext
*tctx
)
877 const ModeTab
*mtab
= tctx
->mtab
;
878 int size_s
= mtab
->size
/ mtab
->fmode
[FT_SHORT
].sub
;
879 int size_m
= mtab
->size
/ mtab
->fmode
[FT_MEDIUM
].sub
;
880 int channels
= tctx
->avctx
->channels
;
881 float norm
= channels
== 1 ?
2. : 1.;
883 for (i
= 0; i
< 3; i
++) {
884 int bsize
= tctx
->mtab
->size
/tctx
->mtab
->fmode
[i
].sub
;
885 if ((ret
= ff_mdct_init(&tctx
->mdct_ctx
[i
], av_log2(bsize
) + 1, 1,
886 -sqrt(norm
/bsize
) / (1<<15))))
890 FF_ALLOC_OR_GOTO(tctx
->avctx
, tctx
->tmp_buf
,
891 mtab
->size
* sizeof(*tctx
->tmp_buf
), alloc_fail
);
893 FF_ALLOC_OR_GOTO(tctx
->avctx
, tctx
->spectrum
,
894 2 * mtab
->size
* channels
* sizeof(*tctx
->spectrum
),
896 FF_ALLOC_OR_GOTO(tctx
->avctx
, tctx
->curr_frame
,
897 2 * mtab
->size
* channels
* sizeof(*tctx
->curr_frame
),
899 FF_ALLOC_OR_GOTO(tctx
->avctx
, tctx
->prev_frame
,
900 2 * mtab
->size
* channels
* sizeof(*tctx
->prev_frame
),
903 for (i
= 0; i
< 3; i
++) {
904 int m
= 4*mtab
->size
/mtab
->fmode
[i
].sub
;
905 double freq
= 2*M_PI
/m
;
906 FF_ALLOC_OR_GOTO(tctx
->avctx
, tctx
->cos_tabs
[i
],
907 (m
/ 4) * sizeof(*tctx
->cos_tabs
[i
]), alloc_fail
);
909 for (j
= 0; j
<= m
/8; j
++)
910 tctx
->cos_tabs
[i
][j
] = cos((2*j
+ 1)*freq
);
911 for (j
= 1; j
< m
/8; j
++)
912 tctx
->cos_tabs
[i
][m
/4-j
] = tctx
->cos_tabs
[i
][j
];
916 ff_init_ff_sine_windows(av_log2(size_m
));
917 ff_init_ff_sine_windows(av_log2(size_s
/2));
918 ff_init_ff_sine_windows(av_log2(mtab
->size
));
922 return AVERROR(ENOMEM
);
926 * Interpret the data as if it were a num_blocks x line_len[0] matrix and for
927 * each line do a cyclic permutation, i.e.
928 * abcdefghijklm -> defghijklmabc
929 * where the amount to be shifted is evaluated depending on the column.
931 static void permutate_in_line(int16_t *tab
, int num_vect
, int num_blocks
,
933 const uint8_t line_len
[2], int length_div
,
934 enum FrameType ftype
)
939 for (i
= 0; i
< line_len
[0]; i
++) {
942 if (num_blocks
== 1 ||
943 (ftype
== FT_LONG
&& num_vect
% num_blocks
) ||
944 (ftype
!= FT_LONG
&& num_vect
& 1 ) ||
947 } else if (ftype
== FT_LONG
) {
952 for (j
= 0; j
< num_vect
&& (j
+num_vect
*i
< block_size
*num_blocks
); j
++)
953 tab
[i
*num_vect
+j
] = i
*num_vect
+ (j
+ shift
) % num_vect
;
958 * Interpret the input data as in the following table:
969 * and transpose it, giving the output
970 * aiqxbjr1cks2dlt3emu4fvn5gow6hp
972 static void transpose_perm(int16_t *out
, int16_t *in
, int num_vect
,
973 const uint8_t line_len
[2], int length_div
)
977 for (i
= 0; i
< num_vect
; i
++)
978 for (j
= 0; j
< line_len
[i
>= length_div
]; j
++)
979 out
[cont
++] = in
[j
*num_vect
+ i
];
982 static void linear_perm(int16_t *out
, int16_t *in
, int n_blocks
, int size
)
984 int block_size
= size
/n_blocks
;
987 for (i
= 0; i
< size
; i
++)
988 out
[i
] = block_size
* (in
[i
] % n_blocks
) + in
[i
] / n_blocks
;
991 static av_cold
void construct_perm_table(TwinContext
*tctx
,enum FrameType ftype
)
994 const ModeTab
*mtab
= tctx
->mtab
;
995 int size
= tctx
->avctx
->channels
*mtab
->fmode
[ftype
].sub
;
996 int16_t *tmp_perm
= (int16_t *) tctx
->tmp_buf
;
998 if (ftype
== FT_PPC
) {
999 size
= tctx
->avctx
->channels
;
1000 block_size
= mtab
->ppc_shape_len
;
1002 block_size
= mtab
->size
/ mtab
->fmode
[ftype
].sub
;
1004 permutate_in_line(tmp_perm
, tctx
->n_div
[ftype
], size
,
1005 block_size
, tctx
->length
[ftype
],
1006 tctx
->length_change
[ftype
], ftype
);
1008 transpose_perm(tctx
->permut
[ftype
], tmp_perm
, tctx
->n_div
[ftype
],
1009 tctx
->length
[ftype
], tctx
->length_change
[ftype
]);
1011 linear_perm(tctx
->permut
[ftype
], tctx
->permut
[ftype
], size
,
1015 static av_cold
void init_bitstream_params(TwinContext
*tctx
)
1017 const ModeTab
*mtab
= tctx
->mtab
;
1018 int n_ch
= tctx
->avctx
->channels
;
1019 int total_fr_bits
= tctx
->avctx
->bit_rate
*mtab
->size
/
1020 tctx
->avctx
->sample_rate
;
1022 int lsp_bits_per_block
= n_ch
*(mtab
->lsp_bit0
+ mtab
->lsp_bit1
+
1023 mtab
->lsp_split
*mtab
->lsp_bit2
);
1025 int ppc_bits
= n_ch
*(mtab
->pgain_bit
+ mtab
->ppc_shape_bit
+
1026 mtab
->ppc_period_bit
);
1028 int bsize_no_main_cb
[3];
1031 enum FrameType frametype
;
1033 for (i
= 0; i
< 3; i
++)
1034 // +1 for history usage switch
1035 bse_bits
[i
] = n_ch
*
1036 (mtab
->fmode
[i
].bark_n_coef
* mtab
->fmode
[i
].bark_n_bit
+ 1);
1038 bsize_no_main_cb
[2] = bse_bits
[2] + lsp_bits_per_block
+ ppc_bits
+
1039 WINDOW_TYPE_BITS
+ n_ch
*GAIN_BITS
;
1041 for (i
= 0; i
< 2; i
++)
1042 bsize_no_main_cb
[i
] =
1043 lsp_bits_per_block
+ n_ch
*GAIN_BITS
+ WINDOW_TYPE_BITS
+
1044 mtab
->fmode
[i
].sub
*(bse_bits
[i
] + n_ch
*SUB_GAIN_BITS
);
1046 // The remaining bits are all used for the main spectrum coefficients
1047 for (i
= 0; i
< 4; i
++) {
1050 int rounded_up
, rounded_down
, num_rounded_down
, num_rounded_up
;
1052 bit_size
= n_ch
* mtab
->ppc_shape_bit
;
1053 vect_size
= n_ch
* mtab
->ppc_shape_len
;
1055 bit_size
= total_fr_bits
- bsize_no_main_cb
[i
];
1056 vect_size
= n_ch
* mtab
->size
;
1059 tctx
->n_div
[i
] = (bit_size
+ 13) / 14;
1061 rounded_up
= (bit_size
+ tctx
->n_div
[i
] - 1)/tctx
->n_div
[i
];
1062 rounded_down
= (bit_size
)/tctx
->n_div
[i
];
1063 num_rounded_down
= rounded_up
* tctx
->n_div
[i
] - bit_size
;
1064 num_rounded_up
= tctx
->n_div
[i
] - num_rounded_down
;
1065 tctx
->bits_main_spec
[0][i
][0] = (rounded_up
+ 1)/2;
1066 tctx
->bits_main_spec
[1][i
][0] = (rounded_up
)/2;
1067 tctx
->bits_main_spec
[0][i
][1] = (rounded_down
+ 1)/2;
1068 tctx
->bits_main_spec
[1][i
][1] = (rounded_down
)/2;
1069 tctx
->bits_main_spec_change
[i
] = num_rounded_up
;
1071 rounded_up
= (vect_size
+ tctx
->n_div
[i
] - 1)/tctx
->n_div
[i
];
1072 rounded_down
= (vect_size
)/tctx
->n_div
[i
];
1073 num_rounded_down
= rounded_up
* tctx
->n_div
[i
] - vect_size
;
1074 num_rounded_up
= tctx
->n_div
[i
] - num_rounded_down
;
1075 tctx
->length
[i
][0] = rounded_up
;
1076 tctx
->length
[i
][1] = rounded_down
;
1077 tctx
->length_change
[i
] = num_rounded_up
;
1080 for (frametype
= FT_SHORT
; frametype
<= FT_PPC
; frametype
++)
1081 construct_perm_table(tctx
, frametype
);
1084 static av_cold
int twin_decode_close(AVCodecContext
*avctx
)
1086 TwinContext
*tctx
= avctx
->priv_data
;
1089 for (i
= 0; i
< 3; i
++) {
1090 ff_mdct_end(&tctx
->mdct_ctx
[i
]);
1091 av_free(tctx
->cos_tabs
[i
]);
1095 av_free(tctx
->curr_frame
);
1096 av_free(tctx
->spectrum
);
1097 av_free(tctx
->prev_frame
);
1098 av_free(tctx
->tmp_buf
);
1103 static av_cold
int twin_decode_init(AVCodecContext
*avctx
)
1106 TwinContext
*tctx
= avctx
->priv_data
;
1107 int isampf
= avctx
->sample_rate
/1000;
1108 int ibps
= avctx
->bit_rate
/(1000 * avctx
->channels
);
1110 tctx
->avctx
= avctx
;
1111 avctx
->sample_fmt
= AV_SAMPLE_FMT_FLT
;
1113 if (avctx
->channels
> CHANNELS_MAX
) {
1114 av_log(avctx
, AV_LOG_ERROR
, "Unsupported number of channels: %i\n",
1119 switch ((isampf
<< 8) + ibps
) {
1120 case (8 <<8) + 8: tctx
->mtab
= &mode_08_08
; break;
1121 case (11<<8) + 8: tctx
->mtab
= &mode_11_08
; break;
1122 case (11<<8) + 10: tctx
->mtab
= &mode_11_10
; break;
1123 case (16<<8) + 16: tctx
->mtab
= &mode_16_16
; break;
1124 case (22<<8) + 20: tctx
->mtab
= &mode_22_20
; break;
1125 case (22<<8) + 24: tctx
->mtab
= &mode_22_24
; break;
1126 case (22<<8) + 32: tctx
->mtab
= &mode_22_32
; break;
1127 case (44<<8) + 40: tctx
->mtab
= &mode_44_40
; break;
1128 case (44<<8) + 48: tctx
->mtab
= &mode_44_48
; break;
1130 av_log(avctx
, AV_LOG_ERROR
, "This version does not support %d kHz - %d kbit/s/ch mode.\n", isampf
, isampf
);
1134 dsputil_init(&tctx
->dsp
, avctx
);
1135 if ((ret
= init_mdct_win(tctx
))) {
1136 av_log(avctx
, AV_LOG_ERROR
, "Error initializing MDCT\n");
1137 twin_decode_close(avctx
);
1140 init_bitstream_params(tctx
);
1142 memset_float(tctx
->bark_hist
[0][0], 0.1, FF_ARRAY_ELEMS(tctx
->bark_hist
));
1147 AVCodec ff_twinvq_decoder
= {
1149 .type
= AVMEDIA_TYPE_AUDIO
,
1150 .id
= CODEC_ID_TWINVQ
,
1151 .priv_data_size
= sizeof(TwinContext
),
1152 .init
= twin_decode_init
,
1153 .close
= twin_decode_close
,
1154 .decode
= twin_decode_frame
,
1155 .long_name
= NULL_IF_CONFIG_SMALL("VQF TwinVQ"),