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"
30 #include "twinvq_data.h"
32 static const TwinVQModeTab mode_08_08
= {
34 { 8, bark_tab_s08_64
, 10, tab
.fcb08s
, 1, 5, tab
.cb0808s0
, tab
.cb0808s1
, 18 },
35 { 2, bark_tab_m08_256
, 20, tab
.fcb08m
, 2, 5, tab
.cb0808m0
, tab
.cb0808m1
, 16 },
36 { 1, bark_tab_l08_512
, 30, tab
.fcb08l
, 3, 6, tab
.cb0808l0
, tab
.cb0808l1
, 17 }
38 512, 12, tab
.lsp08
, 1, 5, 3, 3, tab
.shape08
, 8, 28, 20, 6, 40
41 static const TwinVQModeTab mode_11_08
= {
43 { 8, bark_tab_s11_64
, 10, tab
.fcb11s
, 1, 5, tab
.cb1108s0
, tab
.cb1108s1
, 29 },
44 { 2, bark_tab_m11_256
, 20, tab
.fcb11m
, 2, 5, tab
.cb1108m0
, tab
.cb1108m1
, 24 },
45 { 1, bark_tab_l11_512
, 30, tab
.fcb11l
, 3, 6, tab
.cb1108l0
, tab
.cb1108l1
, 27 }
47 512, 16, tab
.lsp11
, 1, 6, 4, 3, tab
.shape11
, 9, 36, 30, 7, 90
50 static const TwinVQModeTab mode_11_10
= {
52 { 8, bark_tab_s11_64
, 10, tab
.fcb11s
, 1, 5, tab
.cb1110s0
, tab
.cb1110s1
, 21 },
53 { 2, bark_tab_m11_256
, 20, tab
.fcb11m
, 2, 5, tab
.cb1110m0
, tab
.cb1110m1
, 18 },
54 { 1, bark_tab_l11_512
, 30, tab
.fcb11l
, 3, 6, tab
.cb1110l0
, tab
.cb1110l1
, 20 }
56 512, 16, tab
.lsp11
, 1, 6, 4, 3, tab
.shape11
, 9, 36, 30, 7, 90
59 static const TwinVQModeTab mode_16_16
= {
61 { 8, bark_tab_s16_128
, 10, tab
.fcb16s
, 1, 5, tab
.cb1616s0
, tab
.cb1616s1
, 16 },
62 { 2, bark_tab_m16_512
, 20, tab
.fcb16m
, 2, 5, tab
.cb1616m0
, tab
.cb1616m1
, 15 },
63 { 1, bark_tab_l16_1024
, 30, tab
.fcb16l
, 3, 6, tab
.cb1616l0
, tab
.cb1616l1
, 16 }
65 1024, 16, tab
.lsp16
, 1, 6, 4, 3, tab
.shape16
, 9, 56, 60, 7, 180
68 static const TwinVQModeTab mode_22_20
= {
70 { 8, bark_tab_s22_128
, 10, tab
.fcb22s_1
, 1, 6, tab
.cb2220s0
, tab
.cb2220s1
, 18 },
71 { 2, bark_tab_m22_512
, 20, tab
.fcb22m_1
, 2, 6, tab
.cb2220m0
, tab
.cb2220m1
, 17 },
72 { 1, bark_tab_l22_1024
, 32, tab
.fcb22l_1
, 4, 6, tab
.cb2220l0
, tab
.cb2220l1
, 18 }
74 1024, 16, tab
.lsp22_1
, 1, 6, 4, 3, tab
.shape22_1
, 9, 56, 36, 7, 144
77 static const TwinVQModeTab mode_22_24
= {
79 { 8, bark_tab_s22_128
, 10, tab
.fcb22s_1
, 1, 6, tab
.cb2224s0
, tab
.cb2224s1
, 15 },
80 { 2, bark_tab_m22_512
, 20, tab
.fcb22m_1
, 2, 6, tab
.cb2224m0
, tab
.cb2224m1
, 14 },
81 { 1, bark_tab_l22_1024
, 32, tab
.fcb22l_1
, 4, 6, tab
.cb2224l0
, tab
.cb2224l1
, 15 }
83 1024, 16, tab
.lsp22_1
, 1, 6, 4, 3, tab
.shape22_1
, 9, 56, 36, 7, 144
86 static const TwinVQModeTab mode_22_32
= {
88 { 4, bark_tab_s22_128
, 10, tab
.fcb22s_2
, 1, 6, tab
.cb2232s0
, tab
.cb2232s1
, 11 },
89 { 2, bark_tab_m22_256
, 20, tab
.fcb22m_2
, 2, 6, tab
.cb2232m0
, tab
.cb2232m1
, 11 },
90 { 1, bark_tab_l22_512
, 32, tab
.fcb22l_2
, 4, 6, tab
.cb2232l0
, tab
.cb2232l1
, 12 }
92 512, 16, tab
.lsp22_2
, 1, 6, 4, 4, tab
.shape22_2
, 9, 56, 36, 7, 72
95 static const TwinVQModeTab mode_44_40
= {
97 { 16, bark_tab_s44_128
, 10, tab
.fcb44s
, 1, 6, tab
.cb4440s0
, tab
.cb4440s1
, 18 },
98 { 4, bark_tab_m44_512
, 20, tab
.fcb44m
, 2, 6, tab
.cb4440m0
, tab
.cb4440m1
, 17 },
99 { 1, bark_tab_l44_2048
, 40, tab
.fcb44l
, 4, 6, tab
.cb4440l0
, tab
.cb4440l1
, 17 }
101 2048, 20, tab
.lsp44
, 1, 6, 4, 4, tab
.shape44
, 9, 84, 54, 7, 432
104 static const TwinVQModeTab mode_44_48
= {
106 { 16, bark_tab_s44_128
, 10, tab
.fcb44s
, 1, 6, tab
.cb4448s0
, tab
.cb4448s1
, 15 },
107 { 4, bark_tab_m44_512
, 20, tab
.fcb44m
, 2, 6, tab
.cb4448m0
, tab
.cb4448m1
, 14 },
108 { 1, bark_tab_l44_2048
, 40, tab
.fcb44l
, 4, 6, tab
.cb4448l0
, tab
.cb4448l1
, 14 }
110 2048, 20, tab
.lsp44
, 1, 6, 4, 4, tab
.shape44
, 9, 84, 54, 7, 432
114 * Evaluate a * b / 400 rounded to the nearest integer. When, for example,
115 * a * b == 200 and the nearest integer is ill-defined, use a table to emulate
116 * the following broken float-based implementation used by the binary decoder:
119 * static int very_broken_op(int a, int b)
121 * static float test; // Ugh, force gcc to do the division first...
124 * return b * test + 0.5;
128 * @note if this function is replaced by just ROUNDED_DIV(a * b, 400.0), the
129 * stddev between the original file (before encoding with Yamaha encoder) and
130 * the decoded output increases, which leads one to believe that the encoder
131 * expects exactly this broken calculation.
133 static int very_broken_op(int a
, int b
)
139 if (x
% 400 || b
% 5)
144 size
= tabs
[b
/ 5].size
;
145 rtab
= tabs
[b
/ 5].tab
;
146 return x
- rtab
[size
* av_log2(2 * (x
- 1) / size
) + (x
- 1) % size
];
150 * Sum to data a periodic peak of a given period, width and shape.
152 * @param period the period of the peak divised by 400.0
154 static void add_peak(int period
, int width
, const float *shape
,
155 float ppc_gain
, float *speech
, int len
)
159 const float *shape_end
= shape
+ len
;
162 // First peak centered around zero
163 for (i
= 0; i
< width
/ 2; i
++)
164 speech
[i
] += ppc_gain
* *shape
++;
166 for (i
= 1; i
< ROUNDED_DIV(len
, width
); i
++) {
167 center
= very_broken_op(period
, i
);
168 for (j
= -width
/ 2; j
< (width
+ 1) / 2; j
++)
169 speech
[j
+ center
] += ppc_gain
* *shape
++;
172 // For the last block, be careful not to go beyond the end of the buffer
173 center
= very_broken_op(period
, i
);
174 for (j
= -width
/ 2; j
< (width
+ 1) / 2 && shape
< shape_end
; j
++)
175 speech
[j
+ center
] += ppc_gain
* *shape
++;
178 static void decode_ppc(TwinVQContext
*tctx
, int period_coef
, int g_coef
,
179 const float *shape
, float *speech
)
181 const TwinVQModeTab
*mtab
= tctx
->mtab
;
182 int isampf
= tctx
->avctx
->sample_rate
/ 1000;
183 int ibps
= tctx
->avctx
->bit_rate
/ (1000 * tctx
->avctx
->channels
);
184 int min_period
= ROUNDED_DIV(40 * 2 * mtab
->size
, isampf
);
185 int max_period
= ROUNDED_DIV(40 * 2 * mtab
->size
* 6, isampf
);
186 int period_range
= max_period
- min_period
;
187 float pgain_step
= 25000.0 / ((1 << mtab
->pgain_bit
) - 1);
188 float ppc_gain
= 1.0 / 8192 *
189 twinvq_mulawinv(pgain_step
* g_coef
+
191 25000.0, TWINVQ_PGAIN_MU
);
193 // This is actually the period multiplied by 400. It is just linearly coded
194 // between its maximum and minimum value.
195 int period
= min_period
+
196 ROUNDED_DIV(period_coef
* period_range
,
197 (1 << mtab
->ppc_period_bit
) - 1);
200 if (isampf
== 22 && ibps
== 32) {
201 // For some unknown reason, NTT decided to code this case differently...
202 width
= ROUNDED_DIV((period
+ 800) * mtab
->peak_per2wid
,
205 width
= period
* mtab
->peak_per2wid
/ (400 * mtab
->size
);
207 add_peak(period
, width
, shape
, ppc_gain
, speech
, mtab
->ppc_shape_len
);
210 static void dec_bark_env(TwinVQContext
*tctx
, const uint8_t *in
, int use_hist
,
211 int ch
, float *out
, float gain
,
212 enum TwinVQFrameType ftype
)
214 const TwinVQModeTab
*mtab
= tctx
->mtab
;
216 float *hist
= tctx
->bark_hist
[ftype
][ch
];
217 float val
= ((const float []) { 0.4, 0.35, 0.28 })[ftype
];
218 int bark_n_coef
= mtab
->fmode
[ftype
].bark_n_coef
;
219 int fw_cb_len
= mtab
->fmode
[ftype
].bark_env_size
/ bark_n_coef
;
222 for (i
= 0; i
< fw_cb_len
; i
++)
223 for (j
= 0; j
< bark_n_coef
; j
++, idx
++) {
224 float tmp2
= mtab
->fmode
[ftype
].bark_cb
[fw_cb_len
* in
[j
] + i
] *
226 float st
= use_hist
? (1.0 - val
) * tmp2
+ val
* hist
[idx
] + 1.0
233 twinvq_memset_float(out
, st
* gain
, mtab
->fmode
[ftype
].bark_tab
[idx
]);
234 out
+= mtab
->fmode
[ftype
].bark_tab
[idx
];
238 static void read_cb_data(TwinVQContext
*tctx
, GetBitContext
*gb
,
239 uint8_t *dst
, enum TwinVQFrameType ftype
)
243 for (i
= 0; i
< tctx
->n_div
[ftype
]; i
++) {
244 int bs_second_part
= (i
>= tctx
->bits_main_spec_change
[ftype
]);
246 *dst
++ = get_bits(gb
, tctx
->bits_main_spec
[0][ftype
][bs_second_part
]);
247 *dst
++ = get_bits(gb
, tctx
->bits_main_spec
[1][ftype
][bs_second_part
]);
251 static int twinvq_read_bitstream(AVCodecContext
*avctx
, TwinVQContext
*tctx
,
252 const uint8_t *buf
, int buf_size
)
254 TwinVQFrameData
*bits
= &tctx
->bits
[0];
255 const TwinVQModeTab
*mtab
= tctx
->mtab
;
256 int channels
= tctx
->avctx
->channels
;
261 init_get_bits(&gb
, buf
, buf_size
* 8);
262 skip_bits(&gb
, get_bits(&gb
, 8));
264 bits
->window_type
= get_bits(&gb
, TWINVQ_WINDOW_TYPE_BITS
);
266 if (bits
->window_type
> 8) {
267 av_log(avctx
, AV_LOG_ERROR
, "Invalid window type, broken sample?\n");
268 return AVERROR_INVALIDDATA
;
271 bits
->ftype
= ff_twinvq_wtype_to_ftype_table
[tctx
->bits
[0].window_type
];
273 sub
= mtab
->fmode
[bits
->ftype
].sub
;
275 read_cb_data(tctx
, &gb
, bits
->main_coeffs
, bits
->ftype
);
277 for (i
= 0; i
< channels
; i
++)
278 for (j
= 0; j
< sub
; j
++)
279 for (k
= 0; k
< mtab
->fmode
[bits
->ftype
].bark_n_coef
; k
++)
280 bits
->bark1
[i
][j
][k
] =
281 get_bits(&gb
, mtab
->fmode
[bits
->ftype
].bark_n_bit
);
283 for (i
= 0; i
< channels
; i
++)
284 for (j
= 0; j
< sub
; j
++)
285 bits
->bark_use_hist
[i
][j
] = get_bits1(&gb
);
287 if (bits
->ftype
== TWINVQ_FT_LONG
) {
288 for (i
= 0; i
< channels
; i
++)
289 bits
->gain_bits
[i
] = get_bits(&gb
, TWINVQ_GAIN_BITS
);
291 for (i
= 0; i
< channels
; i
++) {
292 bits
->gain_bits
[i
] = get_bits(&gb
, TWINVQ_GAIN_BITS
);
293 for (j
= 0; j
< sub
; j
++)
294 bits
->sub_gain_bits
[i
* sub
+ j
] = get_bits(&gb
,
295 TWINVQ_SUB_GAIN_BITS
);
299 for (i
= 0; i
< channels
; i
++) {
300 bits
->lpc_hist_idx
[i
] = get_bits(&gb
, mtab
->lsp_bit0
);
301 bits
->lpc_idx1
[i
] = get_bits(&gb
, mtab
->lsp_bit1
);
303 for (j
= 0; j
< mtab
->lsp_split
; j
++)
304 bits
->lpc_idx2
[i
][j
] = get_bits(&gb
, mtab
->lsp_bit2
);
307 if (bits
->ftype
== TWINVQ_FT_LONG
) {
308 read_cb_data(tctx
, &gb
, bits
->ppc_coeffs
, 3);
309 for (i
= 0; i
< channels
; i
++) {
310 bits
->p_coef
[i
] = get_bits(&gb
, mtab
->ppc_period_bit
);
311 bits
->g_coef
[i
] = get_bits(&gb
, mtab
->pgain_bit
);
315 return (get_bits_count(&gb
) + 7) / 8;
318 static av_cold
int twinvq_decode_init(AVCodecContext
*avctx
)
321 TwinVQContext
*tctx
= avctx
->priv_data
;
323 if (!avctx
->extradata
|| avctx
->extradata_size
< 12) {
324 av_log(avctx
, AV_LOG_ERROR
, "Missing or incomplete extradata\n");
325 return AVERROR_INVALIDDATA
;
327 avctx
->channels
= AV_RB32(avctx
->extradata
) + 1;
328 avctx
->bit_rate
= AV_RB32(avctx
->extradata
+ 4) * 1000;
329 isampf
= AV_RB32(avctx
->extradata
+ 8);
331 if (isampf
< 8 || isampf
> 44) {
332 av_log(avctx
, AV_LOG_ERROR
, "Unsupported sample rate\n");
333 return AVERROR_INVALIDDATA
;
337 avctx
->sample_rate
= 44100;
340 avctx
->sample_rate
= 22050;
343 avctx
->sample_rate
= 11025;
346 avctx
->sample_rate
= isampf
* 1000;
350 if (avctx
->channels
<= 0 || avctx
->channels
> TWINVQ_CHANNELS_MAX
) {
351 av_log(avctx
, AV_LOG_ERROR
, "Unsupported number of channels: %i\n",
355 avctx
->channel_layout
= avctx
->channels
== 1 ? AV_CH_LAYOUT_MONO
356 : AV_CH_LAYOUT_STEREO
;
358 ibps
= avctx
->bit_rate
/ (1000 * avctx
->channels
);
359 if (ibps
< 8 || ibps
> 48) {
360 av_log(avctx
, AV_LOG_ERROR
, "Bad bitrate per channel value %d\n", ibps
);
361 return AVERROR_INVALIDDATA
;
364 switch ((isampf
<< 8) + ibps
) {
366 tctx
->mtab
= &mode_08_08
;
369 tctx
->mtab
= &mode_11_08
;
372 tctx
->mtab
= &mode_11_10
;
375 tctx
->mtab
= &mode_16_16
;
378 tctx
->mtab
= &mode_22_20
;
381 tctx
->mtab
= &mode_22_24
;
384 tctx
->mtab
= &mode_22_32
;
387 tctx
->mtab
= &mode_44_40
;
390 tctx
->mtab
= &mode_44_48
;
393 av_log(avctx
, AV_LOG_ERROR
,
394 "This version does not support %d kHz - %d kbit/s/ch mode.\n",
399 tctx
->codec
= TWINVQ_CODEC_VQF
;
400 tctx
->read_bitstream
= twinvq_read_bitstream
;
401 tctx
->dec_bark_env
= dec_bark_env
;
402 tctx
->decode_ppc
= decode_ppc
;
403 tctx
->frame_size
= avctx
->bit_rate
* tctx
->mtab
->size
404 / avctx
->sample_rate
+ 8;
406 if (avctx
->block_align
&& avctx
->block_align
* 8 / tctx
->frame_size
> 1) {
407 av_log(avctx
, AV_LOG_ERROR
,
408 "VQF TwinVQ should have only one frame per packet\n");
409 return AVERROR_INVALIDDATA
;
412 return ff_twinvq_decode_init(avctx
);
415 AVCodec ff_twinvq_decoder
= {
417 .long_name
= NULL_IF_CONFIG_SMALL("VQF TwinVQ"),
418 .type
= AVMEDIA_TYPE_AUDIO
,
419 .id
= AV_CODEC_ID_TWINVQ
,
420 .priv_data_size
= sizeof(TwinVQContext
),
421 .init
= twinvq_decode_init
,
422 .close
= ff_twinvq_decode_close
,
423 .decode
= ff_twinvq_decode_frame
,
424 .capabilities
= CODEC_CAP_DR1
,
425 .sample_fmts
= (const enum AVSampleFormat
[]) { AV_SAMPLE_FMT_FLTP
,
426 AV_SAMPLE_FMT_NONE
},