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
25 #include "libavutil/channel_layout.h"
26 #include "libavutil/float_dsp.h"
27 #include "libavutil/mem.h"
31 #include "metasound_twinvq_data.h"
36 * Evaluate a single LPC amplitude spectrum envelope coefficient from the line
39 * @param lsp a vector of the cosine of the LSP values
40 * @param cos_val cos(PI*i/N) where i is the index of the LPC amplitude
41 * @param order the order of the LSP (and the size of the *lsp buffer). Must
42 * be a multiple of four.
43 * @return the LPC value
45 * @todo reuse code from Vorbis decoder: vorbis_floor0_decode
47 static float eval_lpc_spectrum(const float *lsp
, float cos_val
, int order
)
52 float two_cos_w
= 2.0f
* cos_val
;
54 for (j
= 0; j
+ 1 < order
; j
+= 2 * 2) {
55 // Unroll the loop once since order is a multiple of four
56 q
*= lsp
[j
] - two_cos_w
;
57 p
*= lsp
[j
+ 1] - two_cos_w
;
59 q
*= lsp
[j
+ 2] - two_cos_w
;
60 p
*= lsp
[j
+ 3] - two_cos_w
;
63 p
*= p
* (2.0f
- two_cos_w
);
64 q
*= q
* (2.0f
+ two_cos_w
);
70 * Evaluate the LPC amplitude spectrum envelope from the line spectrum pairs.
72 static void eval_lpcenv(TwinVQContext
*tctx
, const float *cos_vals
, float *lpc
)
75 const TwinVQModeTab
*mtab
= tctx
->mtab
;
76 int size_s
= mtab
->size
/ mtab
->fmode
[TWINVQ_FT_SHORT
].sub
;
78 for (i
= 0; i
< size_s
/ 2; i
++) {
79 float cos_i
= tctx
->cos_tabs
[0][i
];
80 lpc
[i
] = eval_lpc_spectrum(cos_vals
, cos_i
, mtab
->n_lsp
);
81 lpc
[size_s
- i
- 1] = eval_lpc_spectrum(cos_vals
, -cos_i
, mtab
->n_lsp
);
85 static void interpolate(float *out
, float v1
, float v2
, int size
)
88 float step
= (v1
- v2
) / (size
+ 1);
90 for (i
= 0; i
< size
; i
++) {
96 static inline float get_cos(int idx
, int part
, const float *cos_tab
, int size
)
98 return part
? -cos_tab
[size
- idx
- 1]
103 * Evaluate the LPC amplitude spectrum envelope from the line spectrum pairs.
104 * Probably for speed reasons, the coefficients are evaluated as
105 * siiiibiiiisiiiibiiiisiiiibiiiisiiiibiiiis ...
106 * where s is an evaluated value, i is a value interpolated from the others
107 * and b might be either calculated or interpolated, depending on an
108 * unexplained condition.
110 * @param step the size of a block "siiiibiiii"
111 * @param in the cosine of the LSP data
112 * @param part is 0 for 0...PI (positive cosine values) and 1 for PI...2PI
113 * (negative cosine values)
114 * @param size the size of the whole output
116 static inline void eval_lpcenv_or_interp(TwinVQContext
*tctx
,
117 enum TwinVQFrameType ftype
,
118 float *out
, const float *in
,
119 int size
, int step
, int part
)
122 const TwinVQModeTab
*mtab
= tctx
->mtab
;
123 const float *cos_tab
= tctx
->cos_tabs
[ftype
];
126 for (i
= 0; i
< size
; i
+= step
)
128 eval_lpc_spectrum(in
,
129 get_cos(i
, part
, cos_tab
, size
),
132 // Fill the 'iiiibiiii'
133 for (i
= step
; i
<= size
- 2 * step
; i
+= step
) {
134 if (out
[i
+ step
] + out
[i
- step
] > 1.95 * out
[i
] ||
135 out
[i
+ step
] >= out
[i
- step
]) {
136 interpolate(out
+ i
- step
+ 1, out
[i
], out
[i
- step
], step
- 1);
139 eval_lpc_spectrum(in
,
140 get_cos(i
- step
/ 2, part
, cos_tab
, size
),
142 interpolate(out
+ i
- step
+ 1, out
[i
- step
/ 2],
143 out
[i
- step
], step
/ 2 - 1);
144 interpolate(out
+ i
- step
/ 2 + 1, out
[i
],
145 out
[i
- step
/ 2], step
/ 2 - 1);
149 interpolate(out
+ size
- 2 * step
+ 1, out
[size
- step
],
150 out
[size
- 2 * step
], step
- 1);
153 static void eval_lpcenv_2parts(TwinVQContext
*tctx
, enum TwinVQFrameType ftype
,
154 const float *buf
, float *lpc
,
157 eval_lpcenv_or_interp(tctx
, ftype
, lpc
, buf
, size
/ 2, step
, 0);
158 eval_lpcenv_or_interp(tctx
, ftype
, lpc
+ size
/ 2, buf
, size
/ 2,
161 interpolate(lpc
+ size
/ 2 - step
+ 1, lpc
[size
/ 2],
162 lpc
[size
/ 2 - step
], step
);
164 twinvq_memset_float(lpc
+ size
- 2 * step
+ 1, lpc
[size
- 2 * step
],
169 * Inverse quantization. Read CB coefficients for cb1 and cb2 from the
170 * bitstream, sum the corresponding vectors and write the result to *out
173 static void dequant(TwinVQContext
*tctx
, const uint8_t *cb_bits
, float *out
,
174 enum TwinVQFrameType ftype
,
175 const int16_t *cb0
, const int16_t *cb1
, int cb_len
)
180 for (i
= 0; i
< tctx
->n_div
[ftype
]; i
++) {
184 const int16_t *tab0
, *tab1
;
185 int length
= tctx
->length
[ftype
][i
>= tctx
->length_change
[ftype
]];
186 int bitstream_second_part
= (i
>= tctx
->bits_main_spec_change
[ftype
]);
188 int bits
= tctx
->bits_main_spec
[0][ftype
][bitstream_second_part
];
196 bits
= tctx
->bits_main_spec
[1][ftype
][bitstream_second_part
];
204 tab0
= cb0
+ tmp0
* cb_len
;
205 tab1
= cb1
+ tmp1
* cb_len
;
207 for (j
= 0; j
< length
; j
++)
208 out
[tctx
->permut
[ftype
][pos
+ j
]] = sign0
* tab0
[j
] +
215 static void dec_gain(TwinVQContext
*tctx
,
216 enum TwinVQFrameType ftype
, float *out
)
218 const TwinVQModeTab
*mtab
= tctx
->mtab
;
219 const TwinVQFrameData
*bits
= &tctx
->bits
[tctx
->cur_frame
];
221 int channels
= tctx
->avctx
->ch_layout
.nb_channels
;
222 int sub
= mtab
->fmode
[ftype
].sub
;
223 float step
= TWINVQ_AMP_MAX
/ ((1 << TWINVQ_GAIN_BITS
) - 1);
224 float sub_step
= TWINVQ_SUB_AMP_MAX
/ ((1 << TWINVQ_SUB_GAIN_BITS
) - 1);
226 if (ftype
== TWINVQ_FT_LONG
) {
227 for (i
= 0; i
< channels
; i
++)
228 out
[i
] = (1.0 / (1 << 13)) *
229 twinvq_mulawinv(step
* 0.5 + step
* bits
->gain_bits
[i
],
230 TWINVQ_AMP_MAX
, TWINVQ_MULAW_MU
);
232 for (i
= 0; i
< channels
; i
++) {
233 float val
= (1.0 / (1 << 23)) *
234 twinvq_mulawinv(step
* 0.5 + step
* bits
->gain_bits
[i
],
235 TWINVQ_AMP_MAX
, TWINVQ_MULAW_MU
);
237 for (j
= 0; j
< sub
; j
++)
239 val
* twinvq_mulawinv(sub_step
* 0.5 +
240 sub_step
* bits
->sub_gain_bits
[i
* sub
+ j
],
241 TWINVQ_SUB_AMP_MAX
, TWINVQ_MULAW_MU
);
247 * Rearrange the LSP coefficients so that they have a minimum distance of
248 * min_dist. This function does it exactly as described in section of 3.2.4
249 * of the G.729 specification (but interestingly is different from what the
250 * reference decoder actually does).
252 static void rearrange_lsp(int order
, float *lsp
, float min_dist
)
255 float min_dist2
= min_dist
* 0.5;
256 for (i
= 1; i
< order
; i
++)
257 if (lsp
[i
] - lsp
[i
- 1] < min_dist
) {
258 float avg
= (lsp
[i
] + lsp
[i
- 1]) * 0.5;
260 lsp
[i
- 1] = avg
- min_dist2
;
261 lsp
[i
] = avg
+ min_dist2
;
265 static void decode_lsp(TwinVQContext
*tctx
, int lpc_idx1
, uint8_t *lpc_idx2
,
266 int lpc_hist_idx
, float *lsp
, float *hist
)
268 const TwinVQModeTab
*mtab
= tctx
->mtab
;
271 const float *cb
= mtab
->lspcodebook
;
272 const float *cb2
= cb
+ (1 << mtab
->lsp_bit1
) * mtab
->n_lsp
;
273 const float *cb3
= cb2
+ (1 << mtab
->lsp_bit2
) * mtab
->n_lsp
;
275 const int8_t funny_rounding
[4] = {
277 mtab
->lsp_split
== 4 ? -2 : 1,
278 mtab
->lsp_split
== 4 ? -2 : 1,
283 for (i
= 0; i
< mtab
->lsp_split
; i
++) {
284 int chunk_end
= ((i
+ 1) * mtab
->n_lsp
+ funny_rounding
[i
]) /
286 for (; j
< chunk_end
; j
++)
287 lsp
[j
] = cb
[lpc_idx1
* mtab
->n_lsp
+ j
] +
288 cb2
[lpc_idx2
[i
] * mtab
->n_lsp
+ j
];
291 rearrange_lsp(mtab
->n_lsp
, lsp
, 0.0001);
293 for (i
= 0; i
< mtab
->n_lsp
; i
++) {
294 float tmp1
= 1.0 - cb3
[lpc_hist_idx
* mtab
->n_lsp
+ i
];
295 float tmp2
= hist
[i
] * cb3
[lpc_hist_idx
* mtab
->n_lsp
+ i
];
297 lsp
[i
] = lsp
[i
] * tmp1
+ tmp2
;
300 rearrange_lsp(mtab
->n_lsp
, lsp
, 0.0001);
301 rearrange_lsp(mtab
->n_lsp
, lsp
, 0.000095);
302 ff_sort_nearly_sorted_floats(lsp
, mtab
->n_lsp
);
305 static void dec_lpc_spectrum_inv(TwinVQContext
*tctx
, float *lsp
,
306 enum TwinVQFrameType ftype
, float *lpc
)
309 int size
= tctx
->mtab
->size
/ tctx
->mtab
->fmode
[ftype
].sub
;
311 for (i
= 0; i
< tctx
->mtab
->n_lsp
; i
++)
312 lsp
[i
] = 2 * cos(lsp
[i
]);
316 eval_lpcenv_2parts(tctx
, ftype
, lsp
, lpc
, size
, 8);
318 case TWINVQ_FT_MEDIUM
:
319 eval_lpcenv_2parts(tctx
, ftype
, lsp
, lpc
, size
, 2);
321 case TWINVQ_FT_SHORT
:
322 eval_lpcenv(tctx
, lsp
, lpc
);
327 static const uint8_t wtype_to_wsize
[] = { 0, 0, 2, 2, 2, 1, 0, 1, 1 };
329 static void imdct_and_window(TwinVQContext
*tctx
, enum TwinVQFrameType ftype
,
330 int wtype
, float *in
, float *prev
, int ch
)
332 AVTXContext
*tx
= tctx
->tx
[ftype
];
333 av_tx_fn tx_fn
= tctx
->tx_fn
[ftype
];
334 const TwinVQModeTab
*mtab
= tctx
->mtab
;
335 int bsize
= mtab
->size
/ mtab
->fmode
[ftype
].sub
;
336 int size
= mtab
->size
;
337 float *buf1
= tctx
->tmp_buf
;
338 int j
, first_wsize
, wsize
; // Window size
339 float *out
= tctx
->curr_frame
+ 2 * ch
* mtab
->size
;
342 int types_sizes
[] = {
343 mtab
->size
/ mtab
->fmode
[TWINVQ_FT_LONG
].sub
,
344 mtab
->size
/ mtab
->fmode
[TWINVQ_FT_MEDIUM
].sub
,
345 mtab
->size
/ (mtab
->fmode
[TWINVQ_FT_SHORT
].sub
* 2),
348 wsize
= types_sizes
[wtype_to_wsize
[wtype
]];
350 prev_buf
= prev
+ (size
- bsize
) / 2;
352 for (j
= 0; j
< mtab
->fmode
[ftype
].sub
; j
++) {
353 int sub_wtype
= ftype
== TWINVQ_FT_MEDIUM
? 8 : wtype
;
355 if (!j
&& wtype
== 4)
357 else if (j
== mtab
->fmode
[ftype
].sub
- 1 && wtype
== 7)
360 wsize
= types_sizes
[wtype_to_wsize
[sub_wtype
]];
362 tx_fn(tx
, buf1
+ bsize
* j
, in
+ bsize
* j
, sizeof(float));
364 tctx
->fdsp
->vector_fmul_window(out2
, prev_buf
+ (bsize
- wsize
) / 2,
366 ff_sine_windows
[av_log2(wsize
)],
370 memcpy(out2
, buf1
+ bsize
* j
+ wsize
/ 2,
371 (bsize
- wsize
/ 2) * sizeof(float));
373 out2
+= ftype
== TWINVQ_FT_MEDIUM
? (bsize
- wsize
) / 2 : bsize
- wsize
;
375 prev_buf
= buf1
+ bsize
* j
+ bsize
/ 2;
378 tctx
->last_block_pos
[ch
] = (size
+ first_wsize
) / 2;
381 static void imdct_output(TwinVQContext
*tctx
, enum TwinVQFrameType ftype
,
382 int wtype
, float **out
, int offset
)
384 const TwinVQModeTab
*mtab
= tctx
->mtab
;
385 float *prev_buf
= tctx
->prev_frame
+ tctx
->last_block_pos
[0];
386 int channels
= tctx
->avctx
->ch_layout
.nb_channels
;
390 for (i
= 0; i
< channels
; i
++)
391 imdct_and_window(tctx
, ftype
, wtype
,
392 tctx
->spectrum
+ i
* mtab
->size
,
393 prev_buf
+ 2 * i
* mtab
->size
,
399 size2
= tctx
->last_block_pos
[0];
400 size1
= mtab
->size
- size2
;
402 out1
= &out
[0][0] + offset
;
403 memcpy(out1
, prev_buf
, size1
* sizeof(*out1
));
404 memcpy(out1
+ size1
, tctx
->curr_frame
, size2
* sizeof(*out1
));
407 out2
= &out
[1][0] + offset
;
408 memcpy(out2
, &prev_buf
[2 * mtab
->size
],
409 size1
* sizeof(*out2
));
410 memcpy(out2
+ size1
, &tctx
->curr_frame
[2 * mtab
->size
],
411 size2
* sizeof(*out2
));
412 tctx
->fdsp
->butterflies_float(out1
, out2
, mtab
->size
);
416 static void read_and_decode_spectrum(TwinVQContext
*tctx
, float *out
,
417 enum TwinVQFrameType ftype
)
419 const TwinVQModeTab
*mtab
= tctx
->mtab
;
420 TwinVQFrameData
*bits
= &tctx
->bits
[tctx
->cur_frame
];
421 int channels
= tctx
->avctx
->ch_layout
.nb_channels
;
422 int sub
= mtab
->fmode
[ftype
].sub
;
423 int block_size
= mtab
->size
/ sub
;
424 float gain
[TWINVQ_CHANNELS_MAX
* TWINVQ_SUBBLOCKS_MAX
];
425 float ppc_shape
[TWINVQ_PPC_SHAPE_LEN_MAX
* TWINVQ_CHANNELS_MAX
* 4];
429 dequant(tctx
, bits
->main_coeffs
, out
, ftype
,
430 mtab
->fmode
[ftype
].cb0
, mtab
->fmode
[ftype
].cb1
,
431 mtab
->fmode
[ftype
].cb_len_read
);
433 dec_gain(tctx
, ftype
, gain
);
435 if (ftype
== TWINVQ_FT_LONG
) {
436 int cb_len_p
= (tctx
->n_div
[3] + mtab
->ppc_shape_len
* channels
- 1) /
438 dequant(tctx
, bits
->ppc_coeffs
, ppc_shape
,
439 TWINVQ_FT_PPC
, mtab
->ppc_shape_cb
,
440 mtab
->ppc_shape_cb
+ cb_len_p
* TWINVQ_PPC_SHAPE_CB_SIZE
,
444 for (i
= 0; i
< channels
; i
++) {
445 float *chunk
= out
+ mtab
->size
* i
;
446 float lsp
[TWINVQ_LSP_COEFS_MAX
];
448 for (j
= 0; j
< sub
; j
++) {
449 tctx
->dec_bark_env(tctx
, bits
->bark1
[i
][j
],
450 bits
->bark_use_hist
[i
][j
], i
,
451 tctx
->tmp_buf
, gain
[sub
* i
+ j
], ftype
);
453 tctx
->fdsp
->vector_fmul(chunk
+ block_size
* j
,
454 chunk
+ block_size
* j
,
455 tctx
->tmp_buf
, block_size
);
458 if (ftype
== TWINVQ_FT_LONG
)
459 tctx
->decode_ppc(tctx
, bits
->p_coef
[i
], bits
->g_coef
[i
],
460 ppc_shape
+ i
* mtab
->ppc_shape_len
, chunk
);
462 decode_lsp(tctx
, bits
->lpc_idx1
[i
], bits
->lpc_idx2
[i
],
463 bits
->lpc_hist_idx
[i
], lsp
, tctx
->lsp_hist
[i
]);
465 dec_lpc_spectrum_inv(tctx
, lsp
, ftype
, tctx
->tmp_buf
);
467 for (j
= 0; j
< mtab
->fmode
[ftype
].sub
; j
++) {
468 tctx
->fdsp
->vector_fmul(chunk
, chunk
, tctx
->tmp_buf
, block_size
);
474 const enum TwinVQFrameType ff_twinvq_wtype_to_ftype_table
[] = {
475 TWINVQ_FT_LONG
, TWINVQ_FT_LONG
, TWINVQ_FT_SHORT
, TWINVQ_FT_LONG
,
476 TWINVQ_FT_MEDIUM
, TWINVQ_FT_LONG
, TWINVQ_FT_LONG
, TWINVQ_FT_MEDIUM
,
480 int ff_twinvq_decode_frame(AVCodecContext
*avctx
, AVFrame
*frame
,
481 int *got_frame_ptr
, AVPacket
*avpkt
)
483 const uint8_t *buf
= avpkt
->data
;
484 int buf_size
= avpkt
->size
;
485 TwinVQContext
*tctx
= avctx
->priv_data
;
486 const TwinVQModeTab
*mtab
= tctx
->mtab
;
490 /* get output buffer */
491 if (tctx
->discarded_packets
>= 2) {
492 frame
->nb_samples
= mtab
->size
* tctx
->frames_per_packet
;
493 if ((ret
= ff_get_buffer(avctx
, frame
, 0)) < 0)
495 out
= (float **)frame
->extended_data
;
498 if (buf_size
< avctx
->block_align
) {
499 av_log(avctx
, AV_LOG_ERROR
,
500 "Frame too small (%d bytes). Truncated file?\n", buf_size
);
501 return AVERROR(EINVAL
);
504 if ((ret
= tctx
->read_bitstream(avctx
, tctx
, buf
, buf_size
)) < 0)
507 for (tctx
->cur_frame
= 0; tctx
->cur_frame
< tctx
->frames_per_packet
;
509 read_and_decode_spectrum(tctx
, tctx
->spectrum
,
510 tctx
->bits
[tctx
->cur_frame
].ftype
);
512 imdct_output(tctx
, tctx
->bits
[tctx
->cur_frame
].ftype
,
513 tctx
->bits
[tctx
->cur_frame
].window_type
, out
,
514 tctx
->cur_frame
* mtab
->size
);
516 FFSWAP(float *, tctx
->curr_frame
, tctx
->prev_frame
);
519 if (tctx
->discarded_packets
< 2) {
520 tctx
->discarded_packets
++;
527 // VQF can deliver packets 1 byte greater than block align
528 if (buf_size
== avctx
->block_align
+ 1)
530 return avctx
->block_align
;
534 * Init IMDCT and windowing tables
536 static av_cold
int init_mdct_win(TwinVQContext
*tctx
)
539 const TwinVQModeTab
*mtab
= tctx
->mtab
;
540 int size_s
= mtab
->size
/ mtab
->fmode
[TWINVQ_FT_SHORT
].sub
;
541 int size_m
= mtab
->size
/ mtab
->fmode
[TWINVQ_FT_MEDIUM
].sub
;
542 int channels
= tctx
->avctx
->ch_layout
.nb_channels
;
543 float norm
= channels
== 1 ? 2.0 : 1.0;
544 int table_size
= 2 * mtab
->size
* channels
;
546 for (i
= 0; i
< 3; i
++) {
547 int bsize
= tctx
->mtab
->size
/ tctx
->mtab
->fmode
[i
].sub
;
548 const float scale
= -sqrt(norm
/ bsize
) / (1 << 15);
549 if ((ret
= av_tx_init(&tctx
->tx
[i
], &tctx
->tx_fn
[i
], AV_TX_FLOAT_MDCT
,
550 1, bsize
, &scale
, 0)))
554 if (!FF_ALLOC_TYPED_ARRAY(tctx
->tmp_buf
, mtab
->size
) ||
555 !FF_ALLOC_TYPED_ARRAY(tctx
->spectrum
, table_size
) ||
556 !FF_ALLOC_TYPED_ARRAY(tctx
->curr_frame
, table_size
) ||
557 !FF_ALLOC_TYPED_ARRAY(tctx
->prev_frame
, table_size
))
558 return AVERROR(ENOMEM
);
560 for (i
= 0; i
< 3; i
++) {
561 int m
= 4 * mtab
->size
/ mtab
->fmode
[i
].sub
;
562 double freq
= 2 * M_PI
/ m
;
563 if (!FF_ALLOC_TYPED_ARRAY(tctx
->cos_tabs
[i
], m
/ 4))
564 return AVERROR(ENOMEM
);
565 for (j
= 0; j
<= m
/ 8; j
++)
566 tctx
->cos_tabs
[i
][j
] = cos((2 * j
+ 1) * freq
);
567 for (j
= 1; j
< m
/ 8; j
++)
568 tctx
->cos_tabs
[i
][m
/ 4 - j
] = tctx
->cos_tabs
[i
][j
];
571 ff_init_ff_sine_windows(av_log2(size_m
));
572 ff_init_ff_sine_windows(av_log2(size_s
/ 2));
573 ff_init_ff_sine_windows(av_log2(mtab
->size
));
579 * Interpret the data as if it were a num_blocks x line_len[0] matrix and for
580 * each line do a cyclic permutation, i.e.
581 * abcdefghijklm -> defghijklmabc
582 * where the amount to be shifted is evaluated depending on the column.
584 static void permutate_in_line(int16_t *tab
, int num_vect
, int num_blocks
,
586 const uint8_t line_len
[2], int length_div
,
587 enum TwinVQFrameType ftype
)
591 for (i
= 0; i
< line_len
[0]; i
++) {
594 if (num_blocks
== 1 ||
595 (ftype
== TWINVQ_FT_LONG
&& num_vect
% num_blocks
) ||
596 (ftype
!= TWINVQ_FT_LONG
&& num_vect
& 1) ||
599 } else if (ftype
== TWINVQ_FT_LONG
) {
604 for (j
= 0; j
< num_vect
&& (j
+ num_vect
* i
< block_size
* num_blocks
); j
++)
605 tab
[i
* num_vect
+ j
] = i
* num_vect
+ (j
+ shift
) % num_vect
;
610 * Interpret the input data as in the following table:
621 * and transpose it, giving the output
622 * aiqxbjr1cks2dlt3emu4fvn5gow6hp
624 static void transpose_perm(int16_t *out
, int16_t *in
, int num_vect
,
625 const uint8_t line_len
[2], int length_div
)
630 for (i
= 0; i
< num_vect
; i
++)
631 for (j
= 0; j
< line_len
[i
>= length_div
]; j
++)
632 out
[cont
++] = in
[j
* num_vect
+ i
];
635 static void linear_perm(int16_t *out
, int16_t *in
, int n_blocks
, int size
)
637 int block_size
= size
/ n_blocks
;
640 for (i
= 0; i
< size
; i
++)
641 out
[i
] = block_size
* (in
[i
] % n_blocks
) + in
[i
] / n_blocks
;
644 static av_cold
void construct_perm_table(TwinVQContext
*tctx
,
645 enum TwinVQFrameType ftype
)
647 int block_size
, size
;
648 const TwinVQModeTab
*mtab
= tctx
->mtab
;
649 int16_t *tmp_perm
= (int16_t *)tctx
->tmp_buf
;
651 if (ftype
== TWINVQ_FT_PPC
) {
652 size
= tctx
->avctx
->ch_layout
.nb_channels
;
653 block_size
= mtab
->ppc_shape_len
;
655 size
= tctx
->avctx
->ch_layout
.nb_channels
* mtab
->fmode
[ftype
].sub
;
656 block_size
= mtab
->size
/ mtab
->fmode
[ftype
].sub
;
659 permutate_in_line(tmp_perm
, tctx
->n_div
[ftype
], size
,
660 block_size
, tctx
->length
[ftype
],
661 tctx
->length_change
[ftype
], ftype
);
663 transpose_perm(tctx
->permut
[ftype
], tmp_perm
, tctx
->n_div
[ftype
],
664 tctx
->length
[ftype
], tctx
->length_change
[ftype
]);
666 linear_perm(tctx
->permut
[ftype
], tctx
->permut
[ftype
], size
,
670 static av_cold
void init_bitstream_params(TwinVQContext
*tctx
)
672 const TwinVQModeTab
*mtab
= tctx
->mtab
;
673 int n_ch
= tctx
->avctx
->ch_layout
.nb_channels
;
674 int total_fr_bits
= tctx
->avctx
->bit_rate
* mtab
->size
/
675 tctx
->avctx
->sample_rate
;
677 int lsp_bits_per_block
= n_ch
* (mtab
->lsp_bit0
+ mtab
->lsp_bit1
+
678 mtab
->lsp_split
* mtab
->lsp_bit2
);
680 int ppc_bits
= n_ch
* (mtab
->pgain_bit
+ mtab
->ppc_shape_bit
+
681 mtab
->ppc_period_bit
);
683 int bsize_no_main_cb
[3], bse_bits
[3], i
;
684 enum TwinVQFrameType frametype
;
686 for (i
= 0; i
< 3; i
++)
687 // +1 for history usage switch
689 (mtab
->fmode
[i
].bark_n_coef
*
690 mtab
->fmode
[i
].bark_n_bit
+ 1);
692 bsize_no_main_cb
[2] = bse_bits
[2] + lsp_bits_per_block
+ ppc_bits
+
693 TWINVQ_WINDOW_TYPE_BITS
+ n_ch
* TWINVQ_GAIN_BITS
;
695 for (i
= 0; i
< 2; i
++)
696 bsize_no_main_cb
[i
] =
697 lsp_bits_per_block
+ n_ch
* TWINVQ_GAIN_BITS
+
698 TWINVQ_WINDOW_TYPE_BITS
+
699 mtab
->fmode
[i
].sub
* (bse_bits
[i
] + n_ch
* TWINVQ_SUB_GAIN_BITS
);
701 if (tctx
->codec
== TWINVQ_CODEC_METASOUND
&& !tctx
->is_6kbps
) {
702 bsize_no_main_cb
[1] += 2;
703 bsize_no_main_cb
[2] += 2;
706 // The remaining bits are all used for the main spectrum coefficients
707 for (i
= 0; i
< 4; i
++) {
708 int bit_size
, vect_size
;
709 int rounded_up
, rounded_down
, num_rounded_down
, num_rounded_up
;
711 bit_size
= n_ch
* mtab
->ppc_shape_bit
;
712 vect_size
= n_ch
* mtab
->ppc_shape_len
;
714 bit_size
= total_fr_bits
- bsize_no_main_cb
[i
];
715 vect_size
= n_ch
* mtab
->size
;
718 tctx
->n_div
[i
] = (bit_size
+ 13) / 14;
720 rounded_up
= (bit_size
+ tctx
->n_div
[i
] - 1) /
722 rounded_down
= (bit_size
) / tctx
->n_div
[i
];
723 num_rounded_down
= rounded_up
* tctx
->n_div
[i
] - bit_size
;
724 num_rounded_up
= tctx
->n_div
[i
] - num_rounded_down
;
725 tctx
->bits_main_spec
[0][i
][0] = (rounded_up
+ 1) / 2;
726 tctx
->bits_main_spec
[1][i
][0] = rounded_up
/ 2;
727 tctx
->bits_main_spec
[0][i
][1] = (rounded_down
+ 1) / 2;
728 tctx
->bits_main_spec
[1][i
][1] = rounded_down
/ 2;
729 tctx
->bits_main_spec_change
[i
] = num_rounded_up
;
731 rounded_up
= (vect_size
+ tctx
->n_div
[i
] - 1) /
733 rounded_down
= (vect_size
) / tctx
->n_div
[i
];
734 num_rounded_down
= rounded_up
* tctx
->n_div
[i
] - vect_size
;
735 num_rounded_up
= tctx
->n_div
[i
] - num_rounded_down
;
736 tctx
->length
[i
][0] = rounded_up
;
737 tctx
->length
[i
][1] = rounded_down
;
738 tctx
->length_change
[i
] = num_rounded_up
;
741 for (frametype
= TWINVQ_FT_SHORT
; frametype
<= TWINVQ_FT_PPC
; frametype
++)
742 construct_perm_table(tctx
, frametype
);
745 av_cold
int ff_twinvq_decode_close(AVCodecContext
*avctx
)
747 TwinVQContext
*tctx
= avctx
->priv_data
;
750 for (i
= 0; i
< 3; i
++) {
751 av_tx_uninit(&tctx
->tx
[i
]);
752 av_freep(&tctx
->cos_tabs
[i
]);
755 av_freep(&tctx
->curr_frame
);
756 av_freep(&tctx
->spectrum
);
757 av_freep(&tctx
->prev_frame
);
758 av_freep(&tctx
->tmp_buf
);
759 av_freep(&tctx
->fdsp
);
764 av_cold
int ff_twinvq_decode_init(AVCodecContext
*avctx
)
767 TwinVQContext
*tctx
= avctx
->priv_data
;
768 int64_t frames_per_packet
;
771 avctx
->sample_fmt
= AV_SAMPLE_FMT_FLTP
;
773 if (!avctx
->block_align
) {
774 avctx
->block_align
= tctx
->frame_size
+ 7 >> 3;
776 frames_per_packet
= avctx
->block_align
* 8LL / tctx
->frame_size
;
777 if (frames_per_packet
<= 0) {
778 av_log(avctx
, AV_LOG_ERROR
, "Block align is %"PRId64
" bits, expected %d\n",
779 avctx
->block_align
* (int64_t)8, tctx
->frame_size
);
780 return AVERROR_INVALIDDATA
;
782 if (frames_per_packet
> TWINVQ_MAX_FRAMES_PER_PACKET
) {
783 av_log(avctx
, AV_LOG_ERROR
, "Too many frames per packet (%"PRId64
")\n",
785 return AVERROR_INVALIDDATA
;
787 tctx
->frames_per_packet
= frames_per_packet
;
789 tctx
->fdsp
= avpriv_float_dsp_alloc(avctx
->flags
& AV_CODEC_FLAG_BITEXACT
);
791 return AVERROR(ENOMEM
);
792 if ((ret
= init_mdct_win(tctx
))) {
793 av_log(avctx
, AV_LOG_ERROR
, "Error initializing MDCT\n");
796 init_bitstream_params(tctx
);
798 twinvq_memset_float(tctx
->bark_hist
[0][0], 0.1,
799 FF_ARRAY_ELEMS(tctx
->bark_hist
));