GCC Code Coverage Report
Directory: ../../../ffmpeg/ Exec Total Coverage
File: src/libavcodec/twinvqdec.c Lines: 126 177 71.2 %
Date: 2021-01-22 05:18:52 Branches: 69 100 69.0 %

Line Branch Exec Source
1
/*
2
 * TwinVQ decoder
3
 * Copyright (c) 2009 Vitor Sessak
4
 *
5
 * This file is part of FFmpeg.
6
 *
7
 * FFmpeg is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU Lesser General Public
9
 * License as published by the Free Software Foundation; either
10
 * version 2.1 of the License, or (at your option) any later version.
11
 *
12
 * FFmpeg is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15
 * Lesser General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU Lesser General Public
18
 * License along with FFmpeg; if not, write to the Free Software
19
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
 */
21
22
#include <math.h>
23
#include <stdint.h>
24
25
#include "libavutil/channel_layout.h"
26
#include "avcodec.h"
27
#include "get_bits.h"
28
#include "internal.h"
29
#include "twinvq.h"
30
#include "metasound_data.h"
31
#include "twinvq_data.h"
32
33
static const TwinVQModeTab mode_08_08 = {
34
    {
35
        { 8, bark_tab_s08_64,  10, tab.fcb08s, 1, 5, tab.cb0808s0, tab.cb0808s1, 18 },
36
        { 2, bark_tab_m08_256, 20, tab.fcb08m, 2, 5, tab.cb0808m0, tab.cb0808m1, 16 },
37
        { 1, bark_tab_l08_512, 30, tab.fcb08l, 3, 6, tab.cb0808l0, tab.cb0808l1, 17 }
38
    },
39
    512, 12, ff_metasound_lsp8, 1, 5, 3, 3, tab.shape08, 8, 28, 20, 6, 40
40
};
41
42
static const TwinVQModeTab mode_11_08 = {
43
    {
44
        { 8, bark_tab_s11_64,  10, tab.fcb11s, 1, 5, tab.cb1108s0, tab.cb1108s1, 29 },
45
        { 2, bark_tab_m11_256, 20, tab.fcb11m, 2, 5, tab.cb1108m0, tab.cb1108m1, 24 },
46
        { 1, bark_tab_l11_512, 30, tab.fcb11l, 3, 6, tab.cb1108l0, tab.cb1108l1, 27 }
47
    },
48
    512, 16, ff_metasound_lsp11, 1, 6, 4, 3, tab.shape11, 9, 36, 30, 7, 90
49
};
50
51
static const TwinVQModeTab mode_11_10 = {
52
    {
53
        { 8, bark_tab_s11_64,  10, tab.fcb11s, 1, 5, tab.cb1110s0, tab.cb1110s1, 21 },
54
        { 2, bark_tab_m11_256, 20, tab.fcb11m, 2, 5, tab.cb1110m0, tab.cb1110m1, 18 },
55
        { 1, bark_tab_l11_512, 30, tab.fcb11l, 3, 6, tab.cb1110l0, tab.cb1110l1, 20 }
56
    },
57
    512, 16, ff_metasound_lsp11, 1, 6, 4, 3, tab.shape11, 9, 36, 30, 7, 90
58
};
59
60
static const TwinVQModeTab mode_16_16 = {
61
    {
62
        { 8, bark_tab_s16_128,  10, tab.fcb16s, 1, 5, tab.cb1616s0, tab.cb1616s1, 16 },
63
        { 2, bark_tab_m16_512,  20, tab.fcb16m, 2, 5, tab.cb1616m0, tab.cb1616m1, 15 },
64
        { 1, bark_tab_l16_1024, 30, tab.fcb16l, 3, 6, tab.cb1616l0, tab.cb1616l1, 16 }
65
    },
66
    1024, 16, ff_metasound_lsp16, 1, 6, 4, 3, tab.shape16, 9, 56, 60, 7, 180
67
};
68
69
static const TwinVQModeTab mode_22_20 = {
70
    {
71
        { 8, bark_tab_s22_128,  10, tab.fcb22s_1, 1, 6, tab.cb2220s0, tab.cb2220s1, 18 },
72
        { 2, bark_tab_m22_512,  20, tab.fcb22m_1, 2, 6, tab.cb2220m0, tab.cb2220m1, 17 },
73
        { 1, bark_tab_l22_1024, 32, tab.fcb22l_1, 4, 6, tab.cb2220l0, tab.cb2220l1, 18 }
74
    },
75
    1024, 16, ff_metasound_lsp22, 1, 6, 4, 3, tab.shape22_1, 9, 56, 36, 7, 144
76
};
77
78
static const TwinVQModeTab mode_22_24 = {
79
    {
80
        { 8, bark_tab_s22_128,  10, tab.fcb22s_1, 1, 6, tab.cb2224s0, tab.cb2224s1, 15 },
81
        { 2, bark_tab_m22_512,  20, tab.fcb22m_1, 2, 6, tab.cb2224m0, tab.cb2224m1, 14 },
82
        { 1, bark_tab_l22_1024, 32, tab.fcb22l_1, 4, 6, tab.cb2224l0, tab.cb2224l1, 15 }
83
    },
84
    1024, 16, ff_metasound_lsp22, 1, 6, 4, 3, tab.shape22_1, 9, 56, 36, 7, 144
85
};
86
87
static const TwinVQModeTab mode_22_32 = {
88
    {
89
        { 4, bark_tab_s22_128, 10, tab.fcb22s_2, 1, 6, tab.cb2232s0, tab.cb2232s1, 11 },
90
        { 2, bark_tab_m22_256, 20, tab.fcb22m_2, 2, 6, tab.cb2232m0, tab.cb2232m1, 11 },
91
        { 1, bark_tab_l22_512, 32, tab.fcb22l_2, 4, 6, tab.cb2232l0, tab.cb2232l1, 12 }
92
    },
93
    512, 16, tab.lsp22_2, 1, 6, 4, 4, tab.shape22_2, 9, 56, 36, 7, 72
94
};
95
96
static const TwinVQModeTab mode_44_40 = {
97
    {
98
        { 16, bark_tab_s44_128,  10, tab.fcb44s, 1, 6, tab.cb4440s0, tab.cb4440s1, 18 },
99
        { 4,  bark_tab_m44_512,  20, tab.fcb44m, 2, 6, tab.cb4440m0, tab.cb4440m1, 17 },
100
        { 1,  bark_tab_l44_2048, 40, tab.fcb44l, 4, 6, tab.cb4440l0, tab.cb4440l1, 17 }
101
    },
102
    2048, 20, ff_metasound_lsp44, 1, 6, 4, 4, tab.shape44, 9, 84, 54, 7, 432
103
};
104
105
static const TwinVQModeTab mode_44_48 = {
106
    {
107
        { 16, bark_tab_s44_128,  10, tab.fcb44s, 1, 6, tab.cb4448s0, tab.cb4448s1, 15 },
108
        { 4,  bark_tab_m44_512,  20, tab.fcb44m, 2, 6, tab.cb4448m0, tab.cb4448m1, 14 },
109
        { 1,  bark_tab_l44_2048, 40, tab.fcb44l, 4, 6, tab.cb4448l0, tab.cb4448l1, 14 }
110
    },
111
    2048, 20, ff_metasound_lsp44, 1, 6, 4, 4, tab.shape44, 9, 84, 54, 7, 432
112
};
113
114
/**
115
 * Evaluate a * b / 400 rounded to the nearest integer. When, for example,
116
 * a * b == 200 and the nearest integer is ill-defined, use a table to emulate
117
 * the following broken float-based implementation used by the binary decoder:
118
 *
119
 * @code
120
 * static int very_broken_op(int a, int b)
121
 * {
122
 *    static float test; // Ugh, force gcc to do the division first...
123
 *
124
 *    test = a / 400.0;
125
 *    return b * test + 0.5;
126
 * }
127
 * @endcode
128
 *
129
 * @note if this function is replaced by just ROUNDED_DIV(a * b, 400.0), the
130
 * stddev between the original file (before encoding with Yamaha encoder) and
131
 * the decoded output increases, which leads one to believe that the encoder
132
 * expects exactly this broken calculation.
133
 */
134
31849
static int very_broken_op(int a, int b)
135
{
136
31849
    int x = a * b + 200;
137
    int size;
138
    const uint8_t *rtab;
139
140

31849
    if (x % 400 || b % 5)
141
31775
        return x / 400;
142
143
74
    x /= 400;
144
145
74
    size = tabs[b / 5].size;
146
74
    rtab = tabs[b / 5].tab;
147
74
    return x - rtab[size * av_log2(2 * (x - 1) / size) + (x - 1) % size];
148
}
149
150
/**
151
 * Sum to data a periodic peak of a given period, width and shape.
152
 *
153
 * @param period the period of the peak divided by 400.0
154
 */
155
2477
static void add_peak(int period, int width, const float *shape,
156
                     float ppc_gain, float *speech, int len)
157
{
158
    int i, j;
159
160
2477
    const float *shape_end = shape + len;
161
    int center;
162
163
    // First peak centered around zero
164
6428
    for (i = 0; i < width / 2; i++)
165
3951
        speech[i] += ppc_gain * *shape++;
166
167

31849
    for (i = 1; i < ROUNDED_DIV(len, width); i++) {
168
29372
        center = very_broken_op(period, i);
169
108515
        for (j = -width / 2; j < (width + 1) / 2; j++)
170
79143
            speech[j + center] += ppc_gain * *shape++;
171
    }
172
173
    // For the last block, be careful not to go beyond the end of the buffer
174
2477
    center = very_broken_op(period, i);
175

8555
    for (j = -width / 2; j < (width + 1) / 2 && shape < shape_end; j++)
176
6078
        speech[j + center] += ppc_gain * *shape++;
177
2477
}
178
179
2477
static void decode_ppc(TwinVQContext *tctx, int period_coef, int g_coef,
180
                       const float *shape, float *speech)
181
{
182
2477
    const TwinVQModeTab *mtab = tctx->mtab;
183
2477
    int isampf = tctx->avctx->sample_rate /  1000;
184
2477
    int ibps   = tctx->avctx->bit_rate    / (1000 * tctx->avctx->channels);
185
2477
    int min_period   = ROUNDED_DIV(40 * 2 * mtab->size, isampf);
186
2477
    int max_period   = ROUNDED_DIV(40 * 2 * mtab->size * 6, isampf);
187
2477
    int period_range = max_period - min_period;
188
2477
    float pgain_step = 25000.0 / ((1 << mtab->pgain_bit) - 1);
189
2477
    float ppc_gain   = 1.0 / 8192 *
190
4954
                       twinvq_mulawinv(pgain_step * g_coef +
191
2477
                                           pgain_step / 2,
192
                                       25000.0, TWINVQ_PGAIN_MU);
193
194
    // This is actually the period multiplied by 400. It is just linearly coded
195
    // between its maximum and minimum value.
196
2477
    int period = min_period +
197
2477
                 ROUNDED_DIV(period_coef * period_range,
198
                             (1 << mtab->ppc_period_bit) - 1);
199
    int width;
200
201

2477
    if (isampf == 22 && ibps == 32) {
202
        // For some unknown reason, NTT decided to code this case differently...
203
        width = ROUNDED_DIV((period + 800) * mtab->peak_per2wid,
204
                            400 * mtab->size);
205
    } else
206
2477
        width = period * mtab->peak_per2wid / (400 * mtab->size);
207
208
2477
    add_peak(period, width, shape, ppc_gain, speech, mtab->ppc_shape_len);
209
2477
}
210
211
2709
static void dec_bark_env(TwinVQContext *tctx, const uint8_t *in, int use_hist,
212
                         int ch, float *out, float gain,
213
                         enum TwinVQFrameType ftype)
214
{
215
2709
    const TwinVQModeTab *mtab = tctx->mtab;
216
    int i, j;
217
2709
    float *hist     = tctx->bark_hist[ftype][ch];
218
2709
    float val       = ((const float []) { 0.4, 0.35, 0.28 })[ftype];
219
2709
    int bark_n_coef = mtab->fmode[ftype].bark_n_coef;
220
2709
    int fw_cb_len   = mtab->fmode[ftype].bark_env_size / bark_n_coef;
221
2709
    int idx         = 0;
222
223
24845
    for (i = 0; i < fw_cb_len; i++)
224
105960
        for (j = 0; j < bark_n_coef; j++, idx++) {
225
83824
            float tmp2 = mtab->fmode[ftype].bark_cb[fw_cb_len * in[j] + i] *
226
                         (1.0 / 4096);
227
138462
            float st   = use_hist ? (1.0 - val) * tmp2 + val * hist[idx] + 1.0
228
83824
                                  : tmp2 + 1.0;
229
230
83824
            hist[idx] = tmp2;
231
83824
            if (st < -1.0)
232
                st = 1.0;
233
234
83824
            twinvq_memset_float(out, st * gain, mtab->fmode[ftype].bark_tab[idx]);
235
83824
            out += mtab->fmode[ftype].bark_tab[idx];
236
        }
237
2709
}
238
239
5067
static void read_cb_data(TwinVQContext *tctx, GetBitContext *gb,
240
                         uint8_t *dst, enum TwinVQFrameType ftype)
241
{
242
    int i;
243
244
165643
    for (i = 0; i < tctx->n_div[ftype]; i++) {
245
160576
        int bs_second_part = (i >= tctx->bits_main_spec_change[ftype]);
246
247
160576
        *dst++ = get_bits(gb, tctx->bits_main_spec[0][ftype][bs_second_part]);
248
160576
        *dst++ = get_bits(gb, tctx->bits_main_spec[1][ftype][bs_second_part]);
249
    }
250
5067
}
251
252
2590
static int twinvq_read_bitstream(AVCodecContext *avctx, TwinVQContext *tctx,
253
                                 const uint8_t *buf, int buf_size)
254
{
255
2590
    TwinVQFrameData     *bits = &tctx->bits[0];
256
2590
    const TwinVQModeTab *mtab = tctx->mtab;
257
2590
    int channels              = tctx->avctx->channels;
258
    int sub;
259
    GetBitContext gb;
260
    int i, j, k, ret;
261
262
2590
    if ((ret = init_get_bits8(&gb, buf, buf_size)) < 0)
263
        return ret;
264
2590
    skip_bits(&gb, get_bits(&gb, 8));
265
266
2590
    bits->window_type = get_bits(&gb, TWINVQ_WINDOW_TYPE_BITS);
267
268
2590
    if (bits->window_type > 8) {
269
        av_log(avctx, AV_LOG_ERROR, "Invalid window type, broken sample?\n");
270
        return AVERROR_INVALIDDATA;
271
    }
272
273
2590
    bits->ftype = ff_twinvq_wtype_to_ftype_table[tctx->bits[0].window_type];
274
275
2590
    sub = mtab->fmode[bits->ftype].sub;
276
277
2590
    read_cb_data(tctx, &gb, bits->main_coeffs, bits->ftype);
278
279
5180
    for (i = 0; i < channels; i++)
280
5299
        for (j = 0; j < sub; j++)
281
13073
            for (k = 0; k < mtab->fmode[bits->ftype].bark_n_coef; k++)
282
10364
                bits->bark1[i][j][k] =
283
10364
                    get_bits(&gb, mtab->fmode[bits->ftype].bark_n_bit);
284
285
5180
    for (i = 0; i < channels; i++)
286
5299
        for (j = 0; j < sub; j++)
287
2709
            bits->bark_use_hist[i][j] = get_bits1(&gb);
288
289
2590
    if (bits->ftype == TWINVQ_FT_LONG) {
290
4954
        for (i = 0; i < channels; i++)
291
2477
            bits->gain_bits[i] = get_bits(&gb, TWINVQ_GAIN_BITS);
292
    } else {
293
226
        for (i = 0; i < channels; i++) {
294
113
            bits->gain_bits[i] = get_bits(&gb, TWINVQ_GAIN_BITS);
295
345
            for (j = 0; j < sub; j++)
296
232
                bits->sub_gain_bits[i * sub + j] = get_bits(&gb,
297
                                                       TWINVQ_SUB_GAIN_BITS);
298
        }
299
    }
300
301
5180
    for (i = 0; i < channels; i++) {
302
2590
        bits->lpc_hist_idx[i] = get_bits(&gb, mtab->lsp_bit0);
303
2590
        bits->lpc_idx1[i]     = get_bits(&gb, mtab->lsp_bit1);
304
305
10360
        for (j = 0; j < mtab->lsp_split; j++)
306
7770
            bits->lpc_idx2[i][j] = get_bits(&gb, mtab->lsp_bit2);
307
    }
308
309
2590
    if (bits->ftype == TWINVQ_FT_LONG) {
310
2477
        read_cb_data(tctx, &gb, bits->ppc_coeffs, 3);
311
4954
        for (i = 0; i < channels; i++) {
312
2477
            bits->p_coef[i] = get_bits(&gb, mtab->ppc_period_bit);
313
2477
            bits->g_coef[i] = get_bits(&gb, mtab->pgain_bit);
314
        }
315
    }
316
317
2590
    return (get_bits_count(&gb) + 7) / 8;
318
}
319
320
3
static av_cold int twinvq_decode_init(AVCodecContext *avctx)
321
{
322
    int isampf, ibps;
323
3
    TwinVQContext *tctx = avctx->priv_data;
324
325

3
    if (!avctx->extradata || avctx->extradata_size < 12) {
326
        av_log(avctx, AV_LOG_ERROR, "Missing or incomplete extradata\n");
327
        return AVERROR_INVALIDDATA;
328
    }
329
3
    avctx->channels = AV_RB32(avctx->extradata)     + 1;
330
3
    avctx->bit_rate = AV_RB32(avctx->extradata + 4) * 1000;
331
3
    isampf          = AV_RB32(avctx->extradata + 8);
332
333

3
    if (isampf < 8 || isampf > 44) {
334
        av_log(avctx, AV_LOG_ERROR, "Unsupported sample rate\n");
335
        return AVERROR_INVALIDDATA;
336
    }
337

3
    switch (isampf) {
338
    case 44:
339
        avctx->sample_rate = 44100;
340
        break;
341
3
    case 22:
342
3
        avctx->sample_rate = 22050;
343
3
        break;
344
    case 11:
345
        avctx->sample_rate = 11025;
346
        break;
347
    default:
348
        avctx->sample_rate = isampf * 1000;
349
        break;
350
    }
351
352

3
    if (avctx->channels <= 0 || avctx->channels > TWINVQ_CHANNELS_MAX) {
353
        av_log(avctx, AV_LOG_ERROR, "Unsupported number of channels: %i\n",
354
               avctx->channels);
355
        return -1;
356
    }
357
6
    avctx->channel_layout = avctx->channels == 1 ? AV_CH_LAYOUT_MONO
358
3
                                                 : AV_CH_LAYOUT_STEREO;
359
360
3
    ibps = avctx->bit_rate / (1000 * avctx->channels);
361

3
    if (ibps < 8 || ibps > 48) {
362
        av_log(avctx, AV_LOG_ERROR, "Bad bitrate per channel value %d\n", ibps);
363
        return AVERROR_INVALIDDATA;
364
    }
365
366


3
    switch ((isampf << 8) + ibps) {
367
    case (8 << 8) + 8:
368
        tctx->mtab = &mode_08_08;
369
        break;
370
    case (11 << 8) + 8:
371
        tctx->mtab = &mode_11_08;
372
        break;
373
    case (11 << 8) + 10:
374
        tctx->mtab = &mode_11_10;
375
        break;
376
    case (16 << 8) + 16:
377
        tctx->mtab = &mode_16_16;
378
        break;
379
3
    case (22 << 8) + 20:
380
3
        tctx->mtab = &mode_22_20;
381
3
        break;
382
    case (22 << 8) + 24:
383
        tctx->mtab = &mode_22_24;
384
        break;
385
    case (22 << 8) + 32:
386
        tctx->mtab = &mode_22_32;
387
        break;
388
    case (44 << 8) + 40:
389
        tctx->mtab = &mode_44_40;
390
        break;
391
    case (44 << 8) + 48:
392
        tctx->mtab = &mode_44_48;
393
        break;
394
    default:
395
        av_log(avctx, AV_LOG_ERROR,
396
               "This version does not support %d kHz - %d kbit/s/ch mode.\n",
397
               isampf, isampf);
398
        return -1;
399
    }
400
401
3
    tctx->codec          = TWINVQ_CODEC_VQF;
402
3
    tctx->read_bitstream = twinvq_read_bitstream;
403
3
    tctx->dec_bark_env   = dec_bark_env;
404
3
    tctx->decode_ppc     = decode_ppc;
405
3
    tctx->frame_size     = avctx->bit_rate * tctx->mtab->size
406
3
                                           / avctx->sample_rate + 8;
407
3
    tctx->is_6kbps       = 0;
408

3
    if (avctx->block_align && avctx->block_align * 8LL / tctx->frame_size > 1) {
409
        av_log(avctx, AV_LOG_ERROR,
410
               "VQF TwinVQ should have only one frame per packet\n");
411
        return AVERROR_INVALIDDATA;
412
    }
413
414
3
    return ff_twinvq_decode_init(avctx);
415
}
416
417
AVCodec ff_twinvq_decoder = {
418
    .name           = "twinvq",
419
    .long_name      = NULL_IF_CONFIG_SMALL("VQF TwinVQ"),
420
    .type           = AVMEDIA_TYPE_AUDIO,
421
    .id             = AV_CODEC_ID_TWINVQ,
422
    .priv_data_size = sizeof(TwinVQContext),
423
    .init           = twinvq_decode_init,
424
    .close          = ff_twinvq_decode_close,
425
    .decode         = ff_twinvq_decode_frame,
426
    .capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
427
    .sample_fmts    = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP,
428
                                                      AV_SAMPLE_FMT_NONE },
429
};