• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * QDMC compatible decoder
3  * Copyright (c) 2017 Paul B Mahol
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 <stddef.h>
24 #include <stdio.h>
25 
26 #define BITSTREAM_READER_LE
27 
28 #include "libavutil/channel_layout.h"
29 #include "libavutil/thread.h"
30 
31 #include "avcodec.h"
32 #include "bytestream.h"
33 #include "get_bits.h"
34 #include "internal.h"
35 #include "fft.h"
36 
37 typedef struct QDMCTone {
38     uint8_t mode;
39     uint8_t phase;
40     uint8_t offset;
41     int16_t freq;
42     int16_t amplitude;
43 } QDMCTone;
44 
45 typedef struct QDMCContext {
46     AVCodecContext *avctx;
47 
48     uint8_t frame_bits;
49     int band_index;
50     int frame_size;
51     int subframe_size;
52     int fft_offset;
53     int buffer_offset;
54     int nb_channels;
55     int checksum_size;
56 
57     uint8_t noise[2][19][17];
58     QDMCTone tones[5][8192];
59     int nb_tones[5];
60     int cur_tone[5];
61     float alt_sin[5][31];
62     float fft_buffer[4][8192 * 2];
63     float noise2_buffer[4096 * 2];
64     float noise_buffer[4096 * 2];
65     float buffer[2 * 32768];
66     float *buffer_ptr;
67     int rndval;
68 
69     DECLARE_ALIGNED(32, FFTComplex, cmplx)[2][512];
70     FFTContext fft_ctx;
71 } QDMCContext;
72 
73 static float sin_table[512];
74 static VLC vtable[6];
75 
76 static const unsigned code_prefix[] = {
77     0x0, 0x1, 0x2, 0x3, 0x4, 0x6, 0x8, 0xA,
78     0xC, 0x10, 0x14, 0x18, 0x1C, 0x24, 0x2C, 0x34,
79     0x3C, 0x4C, 0x5C, 0x6C, 0x7C, 0x9C, 0xBC, 0xDC,
80     0xFC, 0x13C, 0x17C, 0x1BC, 0x1FC, 0x27C, 0x2FC, 0x37C,
81     0x3FC, 0x4FC, 0x5FC, 0x6FC, 0x7FC, 0x9FC, 0xBFC, 0xDFC,
82     0xFFC, 0x13FC, 0x17FC, 0x1BFC, 0x1FFC, 0x27FC, 0x2FFC, 0x37FC,
83     0x3FFC, 0x4FFC, 0x5FFC, 0x6FFC, 0x7FFC, 0x9FFC, 0xBFFC, 0xDFFC,
84     0xFFFC, 0x13FFC, 0x17FFC, 0x1BFFC, 0x1FFFC, 0x27FFC, 0x2FFFC, 0x37FFC,
85     0x3FFFC
86 };
87 
88 static const float amplitude_tab[64] = {
89     1.18750000f, 1.68359380f, 2.37500000f, 3.36718750f, 4.75000000f,
90     6.73437500f, 9.50000000f, 13.4687500f, 19.0000000f, 26.9375000f,
91     38.0000000f, 53.8750000f, 76.0000000f, 107.750000f, 152.000000f,
92     215.500000f, 304.000000f, 431.000000f, 608.000000f, 862.000000f,
93     1216.00000f, 1724.00000f, 2432.00000f, 3448.00000f, 4864.00000f,
94     6896.00000f, 9728.00000f, 13792.0000f, 19456.0000f, 27584.0000f,
95     38912.0000f, 55168.0000f, 77824.0000f, 110336.000f, 155648.000f,
96     220672.000f, 311296.000f, 441344.000f, 622592.000f, 882688.000f,
97     1245184.00f, 1765376.00f, 2490368.00f, 3530752.00f, 4980736.00f,
98     7061504.00f, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
99 };
100 
101 static const uint16_t qdmc_nodes[112] = {
102     0, 1, 2, 4, 6, 8, 12, 16, 24, 32, 48, 56, 64,
103     80, 96, 120, 144, 176, 208, 240, 256,
104     0, 2, 4, 8, 16, 24, 32, 48, 56, 64, 80, 104,
105     128, 160, 208, 256, 0, 0, 0, 0, 0,
106     0, 2, 4, 8, 16, 32, 48, 64, 80, 112, 160, 208,
107     256, 0, 0, 0, 0, 0, 0, 0, 0,
108     0, 4, 8, 16, 32, 48, 64, 96, 144, 208, 256,
109     0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
110     0, 4, 16, 32, 64, 256, 0, 0, 0, 0, 0, 0, 0, 0,
111     0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
112 };
113 
114 static const uint8_t noise_bands_size[] = {
115     19, 14, 11, 9, 4, 2, 0
116 };
117 
118 static const uint8_t noise_bands_selector[] = {
119     4, 3, 2, 1, 0, 0, 0,
120 };
121 
122 static const uint8_t qdmc_hufftab[][2] = {
123     /* Noise value - 27 entries */
124     {  1,  2 }, { 10,  7 }, { 26,  9 }, { 22,  9 }, { 24,  9 }, { 14,  9 },
125     {  8,  6 }, {  6,  5 }, {  7,  5 }, {  9,  7 }, { 30,  9 }, { 32, 10 },
126     { 13, 10 }, { 20,  9 }, { 28,  9 }, { 12,  7 }, { 15, 11 }, { 36, 12 },
127     {  0, 12 }, { 34, 10 }, { 18,  9 }, { 11,  9 }, { 16,  9 }, {  5,  3 },
128     {  2,  3 }, {  4,  3 }, {  3,  2 },
129     /* Noise segment length - 12 entries */
130     {  1,  1 }, {  2,  2 }, {  3,  4 }, {  8,  9 }, {  9, 10 }, {  0, 10 },
131     { 13,  8 }, {  7,  7 }, {  6,  6 }, { 17,  5 }, {  4,  4 }, {  5,  4 },
132     /* Amplitude - 28 entries */
133     { 18,  3 }, { 16,  3 }, { 22,  7 }, {  8, 10 }, {  4, 10 }, {  3,  9 },
134     {  2,  8 }, { 23,  8 }, { 10,  8 }, { 11,  7 }, { 21,  5 }, { 20,  4 },
135     {  1,  7 }, {  7, 10 }, {  5, 10 }, {  9,  9 }, {  6, 10 }, { 25, 11 },
136     { 26, 12 }, { 27, 13 }, {  0, 13 }, { 24,  9 }, { 12,  6 }, { 13,  5 },
137     { 14,  4 }, { 19,  3 }, { 15,  3 }, { 17,  2 },
138     /* Frequency differences - 47 entries */
139     {  2,  4 }, { 14,  6 }, { 26,  7 }, { 31,  8 }, { 32,  9 }, { 35,  9 },
140     {  7,  5 }, { 10,  5 }, { 22,  7 }, { 27,  7 }, { 19,  7 }, { 20,  7 },
141     {  4,  5 }, { 13,  5 }, { 17,  6 }, { 15,  6 }, {  8,  5 }, {  5,  4 },
142     { 28,  7 }, { 33,  9 }, { 36, 11 }, { 38, 12 }, { 42, 14 }, { 45, 16 },
143     { 44, 18 }, {  0, 18 }, { 46, 17 }, { 43, 15 }, { 40, 13 }, { 37, 11 },
144     { 39, 12 }, { 41, 12 }, { 34,  8 }, { 16,  6 }, { 11,  5 }, {  9,  4 },
145     {  1,  2 }, {  3,  4 }, { 30,  7 }, { 29,  7 }, { 23,  6 }, { 24,  6 },
146     { 18,  6 }, {  6,  4 }, { 12,  5 }, { 21,  6 }, { 25,  6 },
147     /* Amplitude differences - 9 entries */
148     {  1,  2 }, {  3,  3 }, {  4,  4 }, {  5,  5 }, {  6,  6 }, {  7,  7 },
149     {  8,  8 }, {  0,  8 }, {  2,  1 },
150     /* Phase differences - 9 entries */
151     {  2,  2 }, {  1,  2 }, {  3,  4 }, {  7,  4 }, {  6,  5 }, {  5,  6 },
152     {  0,  6 }, {  4,  4 }, {  8,  2 },
153 };
154 
155 static const uint8_t huff_sizes[] = {
156     27, 12, 28, 47, 9, 9
157 };
158 
159 static const uint8_t huff_bits[] = {
160     12, 10, 12, 12, 8, 6
161 };
162 
qdmc_init_static_data(void)163 static av_cold void qdmc_init_static_data(void)
164 {
165     const uint8_t (*hufftab)[2] = qdmc_hufftab;
166     int i;
167 
168     for (unsigned i = 0, offset = 0; i < FF_ARRAY_ELEMS(vtable); i++) {
169         static VLC_TYPE vlc_buffer[13698][2];
170         vtable[i].table           = &vlc_buffer[offset];
171         vtable[i].table_allocated = FF_ARRAY_ELEMS(vlc_buffer) - offset;
172         ff_init_vlc_from_lengths(&vtable[i], huff_bits[i], huff_sizes[i],
173                                  &hufftab[0][1], 2, &hufftab[0][0], 2, 1, -1,
174                                  INIT_VLC_LE | INIT_VLC_STATIC_OVERLONG, NULL);
175         hufftab += huff_sizes[i];
176         offset  += vtable[i].table_size;
177     }
178 
179     for (i = 0; i < 512; i++)
180         sin_table[i] = sin(2.0f * i * M_PI * 0.001953125f);
181 }
182 
make_noises(QDMCContext * s)183 static void make_noises(QDMCContext *s)
184 {
185     int i, j, n0, n1, n2, diff;
186     float *nptr;
187 
188     for (j = 0; j < noise_bands_size[s->band_index]; j++) {
189         n0 = qdmc_nodes[j + 21 * s->band_index    ];
190         n1 = qdmc_nodes[j + 21 * s->band_index + 1];
191         n2 = qdmc_nodes[j + 21 * s->band_index + 2];
192         nptr = s->noise_buffer + 256 * j;
193 
194         for (i = 0; i + n0 < n1; i++, nptr++)
195             nptr[0] = i / (float)(n1 - n0);
196 
197         diff = n2 - n1;
198         nptr = s->noise_buffer + (j << 8) + n1 - n0;
199 
200         for (i = n1; i < n2; i++, nptr++, diff--)
201             nptr[0] = diff / (float)(n2 - n1);
202     }
203 }
204 
qdmc_decode_init(AVCodecContext * avctx)205 static av_cold int qdmc_decode_init(AVCodecContext *avctx)
206 {
207     static AVOnce init_static_once = AV_ONCE_INIT;
208     QDMCContext *s = avctx->priv_data;
209     int ret, fft_size, fft_order, size, g, j, x;
210     GetByteContext b;
211 
212     ff_thread_once(&init_static_once, qdmc_init_static_data);
213 
214     if (!avctx->extradata || (avctx->extradata_size < 48)) {
215         av_log(avctx, AV_LOG_ERROR, "extradata missing or truncated\n");
216         return AVERROR_INVALIDDATA;
217     }
218 
219     bytestream2_init(&b, avctx->extradata, avctx->extradata_size);
220 
221     while (bytestream2_get_bytes_left(&b) > 8) {
222         if (bytestream2_peek_be64(&b) == (((uint64_t)MKBETAG('f','r','m','a') << 32) |
223                                            (uint64_t)MKBETAG('Q','D','M','C')))
224             break;
225         bytestream2_skipu(&b, 1);
226     }
227     bytestream2_skipu(&b, 8);
228 
229     if (bytestream2_get_bytes_left(&b) < 36) {
230         av_log(avctx, AV_LOG_ERROR, "not enough extradata (%i)\n",
231                bytestream2_get_bytes_left(&b));
232         return AVERROR_INVALIDDATA;
233     }
234 
235     size = bytestream2_get_be32u(&b);
236     if (size > bytestream2_get_bytes_left(&b)) {
237         av_log(avctx, AV_LOG_ERROR, "extradata size too small, %i < %i\n",
238                bytestream2_get_bytes_left(&b), size);
239         return AVERROR_INVALIDDATA;
240     }
241 
242     if (bytestream2_get_be32u(&b) != MKBETAG('Q','D','C','A')) {
243         av_log(avctx, AV_LOG_ERROR, "invalid extradata, expecting QDCA\n");
244         return AVERROR_INVALIDDATA;
245     }
246     bytestream2_skipu(&b, 4);
247 
248     avctx->channels = s->nb_channels = bytestream2_get_be32u(&b);
249     if (s->nb_channels <= 0 || s->nb_channels > 2) {
250         av_log(avctx, AV_LOG_ERROR, "invalid number of channels\n");
251         return AVERROR_INVALIDDATA;
252     }
253     avctx->channel_layout = avctx->channels == 2 ? AV_CH_LAYOUT_STEREO :
254                                                    AV_CH_LAYOUT_MONO;
255 
256     avctx->sample_rate = bytestream2_get_be32u(&b);
257     avctx->bit_rate = bytestream2_get_be32u(&b);
258     bytestream2_skipu(&b, 4);
259     fft_size = bytestream2_get_be32u(&b);
260     fft_order = av_log2(fft_size) + 1;
261     s->checksum_size = bytestream2_get_be32u(&b);
262     if (s->checksum_size >= 1U << 28) {
263         av_log(avctx, AV_LOG_ERROR, "data block size too large (%u)\n", s->checksum_size);
264         return AVERROR_INVALIDDATA;
265     }
266 
267     if (avctx->sample_rate >= 32000) {
268         x = 28000;
269         s->frame_bits = 13;
270     } else if (avctx->sample_rate >= 16000) {
271         x = 20000;
272         s->frame_bits = 12;
273     } else {
274         x = 16000;
275         s->frame_bits = 11;
276     }
277     s->frame_size = 1 << s->frame_bits;
278     s->subframe_size = s->frame_size >> 5;
279 
280     if (avctx->channels == 2)
281         x = 3 * x / 2;
282     s->band_index = noise_bands_selector[FFMIN(6, llrint(floor(avctx->bit_rate * 3.0 / (double)x + 0.5)))];
283 
284     if ((fft_order < 7) || (fft_order > 9)) {
285         avpriv_request_sample(avctx, "Unknown FFT order %d", fft_order);
286         return AVERROR_PATCHWELCOME;
287     }
288 
289     if (fft_size != (1 << (fft_order - 1))) {
290         av_log(avctx, AV_LOG_ERROR, "FFT size %d not power of 2.\n", fft_size);
291         return AVERROR_INVALIDDATA;
292     }
293 
294     ret = ff_fft_init(&s->fft_ctx, fft_order, 1);
295     if (ret < 0)
296         return ret;
297 
298     avctx->sample_fmt = AV_SAMPLE_FMT_S16;
299 
300     for (g = 5; g > 0; g--) {
301         for (j = 0; j < (1 << g) - 1; j++)
302             s->alt_sin[5-g][j] = sin_table[(((j+1) << (8 - g)) & 0x1FF)];
303     }
304 
305     make_noises(s);
306 
307     return 0;
308 }
309 
qdmc_decode_close(AVCodecContext * avctx)310 static av_cold int qdmc_decode_close(AVCodecContext *avctx)
311 {
312     QDMCContext *s = avctx->priv_data;
313 
314     ff_fft_end(&s->fft_ctx);
315 
316     return 0;
317 }
318 
qdmc_get_vlc(GetBitContext * gb,VLC * table,int flag)319 static int qdmc_get_vlc(GetBitContext *gb, VLC *table, int flag)
320 {
321     int v;
322 
323     if (get_bits_left(gb) < 1)
324         return AVERROR_INVALIDDATA;
325     v = get_vlc2(gb, table->table, table->bits, 2);
326     if (v < 0)
327         v = get_bits(gb, get_bits(gb, 3) + 1);
328 
329     if (flag) {
330         if (v >= FF_ARRAY_ELEMS(code_prefix))
331             return AVERROR_INVALIDDATA;
332 
333         v = code_prefix[v] + get_bitsz(gb, v >> 2);
334     }
335 
336     return v;
337 }
338 
skip_label(QDMCContext * s,GetBitContext * gb)339 static int skip_label(QDMCContext *s, GetBitContext *gb)
340 {
341     uint32_t label = get_bits_long(gb, 32);
342     uint16_t sum = 226, checksum = get_bits(gb, 16);
343     const uint8_t *ptr = gb->buffer + 6;
344     int i;
345 
346     if (label != MKTAG('Q', 'M', 'C', 1))
347         return AVERROR_INVALIDDATA;
348 
349     for (i = 0; i < s->checksum_size - 6; i++)
350         sum += ptr[i];
351 
352     return sum != checksum;
353 }
354 
read_noise_data(QDMCContext * s,GetBitContext * gb)355 static int read_noise_data(QDMCContext *s, GetBitContext *gb)
356 {
357     int ch, j, k, v, idx, band, lastval, newval, len;
358 
359     for (ch = 0; ch < s->nb_channels; ch++) {
360         for (band = 0; band < noise_bands_size[s->band_index]; band++) {
361             v = qdmc_get_vlc(gb, &vtable[0], 0);
362             if (v < 0)
363                 return AVERROR_INVALIDDATA;
364 
365             if (v & 1)
366                 v = v + 1;
367             else
368                 v = -v;
369 
370             lastval = v / 2;
371             s->noise[ch][band][0] = lastval - 1;
372             for (j = 0; j < 15;) {
373                 len = qdmc_get_vlc(gb, &vtable[1], 1);
374                 if (len < 0)
375                     return AVERROR_INVALIDDATA;
376                 len += 1;
377 
378                 v = qdmc_get_vlc(gb, &vtable[0], 0);
379                 if (v < 0)
380                     return AVERROR_INVALIDDATA;
381 
382                 if (v & 1)
383                     newval = lastval + (v + 1) / 2;
384                 else
385                     newval = lastval - v / 2;
386 
387                 idx = j + 1;
388                 if (len + idx > 16)
389                     return AVERROR_INVALIDDATA;
390 
391                 for (k = 1; idx <= j + len; k++, idx++)
392                     s->noise[ch][band][idx] = lastval + k * (newval - lastval) / len - 1;
393 
394                 lastval = newval;
395                 j += len;
396             }
397         }
398     }
399 
400     return 0;
401 }
402 
add_tone(QDMCContext * s,int group,int offset,int freq,int stereo_mode,int amplitude,int phase)403 static void add_tone(QDMCContext *s, int group, int offset, int freq, int stereo_mode, int amplitude, int phase)
404 {
405     const int index = s->nb_tones[group];
406 
407     if (index >= FF_ARRAY_ELEMS(s->tones[group])) {
408         av_log(s->avctx, AV_LOG_WARNING, "Too many tones already in buffer, ignoring tone!\n");
409         return;
410     }
411 
412     s->tones[group][index].offset    = offset;
413     s->tones[group][index].freq      = freq;
414     s->tones[group][index].mode      = stereo_mode;
415     s->tones[group][index].amplitude = amplitude;
416     s->tones[group][index].phase     = phase;
417     s->nb_tones[group]++;
418 }
419 
read_wave_data(QDMCContext * s,GetBitContext * gb)420 static int read_wave_data(QDMCContext *s, GetBitContext *gb)
421 {
422     int amp, phase, stereo_mode = 0, i, group, freq, group_size, group_bits;
423     int amp2, phase2, pos2, off;
424 
425     for (group = 0; group < 5; group++) {
426         group_size = 1 << (s->frame_bits - group - 1);
427         group_bits = 4 - group;
428         pos2 = 0;
429         off  = 0;
430 
431         for (i = 1; ; i = freq + 1) {
432             int v;
433 
434             v = qdmc_get_vlc(gb, &vtable[3], 1);
435             if (v < 0)
436                 return AVERROR_INVALIDDATA;
437 
438             freq = i + v;
439             while (freq >= group_size - 1) {
440                 freq += 2 - group_size;
441                 pos2 += group_size;
442                 off  += 1 << group_bits;
443             }
444 
445             if (pos2 >= s->frame_size)
446                 break;
447 
448             if (s->nb_channels > 1)
449                 stereo_mode = get_bits(gb, 2);
450 
451             amp   = qdmc_get_vlc(gb, &vtable[2], 0);
452             if (amp < 0)
453                 return AVERROR_INVALIDDATA;
454             phase = get_bits(gb, 3);
455 
456             if (stereo_mode > 1) {
457                 amp2   = qdmc_get_vlc(gb, &vtable[4], 0);
458                 if (amp2 < 0)
459                     return AVERROR_INVALIDDATA;
460                 amp2   = amp - amp2;
461 
462                 phase2 = qdmc_get_vlc(gb, &vtable[5], 0);
463                 if (phase2 < 0)
464                     return AVERROR_INVALIDDATA;
465                 phase2 = phase - phase2;
466 
467                 if (phase2 < 0)
468                     phase2 += 8;
469             }
470 
471             if ((freq >> group_bits) + 1 < s->subframe_size) {
472                 add_tone(s, group, off, freq, stereo_mode & 1, amp, phase);
473                 if (stereo_mode > 1)
474                     add_tone(s, group, off, freq, ~stereo_mode & 1, amp2, phase2);
475             }
476         }
477     }
478 
479     return 0;
480 }
481 
lin_calc(QDMCContext * s,float amplitude,int node1,int node2,int index)482 static void lin_calc(QDMCContext *s, float amplitude, int node1, int node2, int index)
483 {
484     int subframe_size, i, j, k, length;
485     float scale, *noise_ptr;
486 
487     scale = 0.5 * amplitude;
488     subframe_size = s->subframe_size;
489     if (subframe_size >= node2)
490         subframe_size = node2;
491     length = (subframe_size - node1) & 0xFFFC;
492     j = node1;
493     noise_ptr = &s->noise_buffer[256 * index];
494 
495     for (i = 0; i < length; i += 4, j+= 4, noise_ptr += 4) {
496         s->noise2_buffer[j    ] += scale * noise_ptr[0];
497         s->noise2_buffer[j + 1] += scale * noise_ptr[1];
498         s->noise2_buffer[j + 2] += scale * noise_ptr[2];
499         s->noise2_buffer[j + 3] += scale * noise_ptr[3];
500     }
501 
502     k = length + node1;
503     noise_ptr = s->noise_buffer + length + (index << 8);
504     for (i = length; i < subframe_size - node1; i++, k++, noise_ptr++)
505         s->noise2_buffer[k] += scale * noise_ptr[0];
506 }
507 
add_noise(QDMCContext * s,int ch,int current_subframe)508 static void add_noise(QDMCContext *s, int ch, int current_subframe)
509 {
510     int i, j, aindex;
511     float amplitude;
512     float *im = &s->fft_buffer[0 + ch][s->fft_offset + s->subframe_size * current_subframe];
513     float *re = &s->fft_buffer[2 + ch][s->fft_offset + s->subframe_size * current_subframe];
514 
515     memset(s->noise2_buffer, 0, 4 * s->subframe_size);
516 
517     for (i = 0; i < noise_bands_size[s->band_index]; i++) {
518         if (qdmc_nodes[i + 21 * s->band_index] > s->subframe_size - 1)
519             break;
520 
521         aindex = s->noise[ch][i][current_subframe / 2];
522         amplitude = aindex > 0 ? amplitude_tab[aindex & 0x3F] : 0.0f;
523 
524         lin_calc(s, amplitude, qdmc_nodes[21 * s->band_index + i],
525                  qdmc_nodes[21 * s->band_index + i + 2], i);
526     }
527 
528     for (j = 2; j < s->subframe_size - 1; j++) {
529         float rnd_re, rnd_im;
530 
531         s->rndval = 214013U * s->rndval + 2531011;
532         rnd_im = ((s->rndval & 0x7FFF) - 16384.0f) * 0.000030517578f * s->noise2_buffer[j];
533         s->rndval = 214013U * s->rndval + 2531011;
534         rnd_re = ((s->rndval & 0x7FFF) - 16384.0f) * 0.000030517578f * s->noise2_buffer[j];
535         im[j  ] += rnd_im;
536         re[j  ] += rnd_re;
537         im[j+1] -= rnd_im;
538         re[j+1] -= rnd_re;
539     }
540 }
541 
add_wave(QDMCContext * s,int offset,int freqs,int group,int stereo_mode,int amp,int phase)542 static void add_wave(QDMCContext *s, int offset, int freqs, int group, int stereo_mode, int amp, int phase)
543 {
544     int j, group_bits, pos, pindex;
545     float im, re, amplitude, level, *imptr, *reptr;
546 
547     if (s->nb_channels == 1)
548         stereo_mode = 0;
549 
550     group_bits = 4 - group;
551     pos = freqs >> (4 - group);
552     amplitude = amplitude_tab[amp & 0x3F];
553     imptr = &s->fft_buffer[    stereo_mode][s->fft_offset + s->subframe_size * offset + pos];
554     reptr = &s->fft_buffer[2 + stereo_mode][s->fft_offset + s->subframe_size * offset + pos];
555     pindex = (phase << 6) - ((2 * (freqs >> (4 - group)) + 1) << 7);
556     for (j = 0; j < (1 << (group_bits + 1)) - 1; j++) {
557         pindex += (2 * freqs + 1) << (7 - group_bits);
558         level = amplitude * s->alt_sin[group][j];
559         im = level * sin_table[ pindex        & 0x1FF];
560         re = level * sin_table[(pindex + 128) & 0x1FF];
561         imptr[0] += im;
562         imptr[1] -= im;
563         reptr[0] += re;
564         reptr[1] -= re;
565         imptr += s->subframe_size;
566         reptr += s->subframe_size;
567         if (imptr >= &s->fft_buffer[stereo_mode][2 * s->frame_size]) {
568             imptr = &s->fft_buffer[0 + stereo_mode][pos];
569             reptr = &s->fft_buffer[2 + stereo_mode][pos];
570         }
571     }
572 }
573 
add_wave0(QDMCContext * s,int offset,int freqs,int stereo_mode,int amp,int phase)574 static void add_wave0(QDMCContext *s, int offset, int freqs, int stereo_mode, int amp, int phase)
575 {
576     float level, im, re;
577     int pos;
578 
579     if (s->nb_channels == 1)
580         stereo_mode = 0;
581 
582     level = amplitude_tab[amp & 0x3F];
583     im = level * sin_table[ (phase << 6)        & 0x1FF];
584     re = level * sin_table[((phase << 6) + 128) & 0x1FF];
585     pos = s->fft_offset + freqs + s->subframe_size * offset;
586     s->fft_buffer[    stereo_mode][pos    ] += im;
587     s->fft_buffer[2 + stereo_mode][pos    ] += re;
588     s->fft_buffer[    stereo_mode][pos + 1] -= im;
589     s->fft_buffer[2 + stereo_mode][pos + 1] -= re;
590 }
591 
add_waves(QDMCContext * s,int current_subframe)592 static void add_waves(QDMCContext *s, int current_subframe)
593 {
594     int w, g;
595 
596     for (g = 0; g < 4; g++) {
597         for (w = s->cur_tone[g]; w < s->nb_tones[g]; w++) {
598             QDMCTone *t = &s->tones[g][w];
599 
600             if (current_subframe < t->offset)
601                 break;
602             add_wave(s, t->offset, t->freq, g, t->mode, t->amplitude, t->phase);
603         }
604         s->cur_tone[g] = w;
605     }
606     for (w = s->cur_tone[4]; w < s->nb_tones[4]; w++) {
607         QDMCTone *t = &s->tones[4][w];
608 
609         if (current_subframe < t->offset)
610             break;
611         add_wave0(s, t->offset, t->freq, t->mode, t->amplitude, t->phase);
612     }
613     s->cur_tone[4] = w;
614 }
615 
decode_frame(QDMCContext * s,GetBitContext * gb,int16_t * out)616 static int decode_frame(QDMCContext *s, GetBitContext *gb, int16_t *out)
617 {
618     int ret, ch, i, n;
619 
620     if (skip_label(s, gb))
621         return AVERROR_INVALIDDATA;
622 
623     s->fft_offset = s->frame_size - s->fft_offset;
624     s->buffer_ptr = &s->buffer[s->nb_channels * s->buffer_offset];
625 
626     ret = read_noise_data(s, gb);
627     if (ret < 0)
628         return ret;
629 
630     ret = read_wave_data(s, gb);
631     if (ret < 0)
632         return ret;
633 
634     for (n = 0; n < 32; n++) {
635         float *r;
636 
637         for (ch = 0; ch < s->nb_channels; ch++)
638             add_noise(s, ch, n);
639 
640         add_waves(s, n);
641 
642         for (ch = 0; ch < s->nb_channels; ch++) {
643             for (i = 0; i < s->subframe_size; i++) {
644                 s->cmplx[ch][i].re = s->fft_buffer[ch + 2][s->fft_offset + n * s->subframe_size + i];
645                 s->cmplx[ch][i].im = s->fft_buffer[ch + 0][s->fft_offset + n * s->subframe_size + i];
646                 s->cmplx[ch][s->subframe_size + i].re = 0;
647                 s->cmplx[ch][s->subframe_size + i].im = 0;
648             }
649         }
650 
651         for (ch = 0; ch < s->nb_channels; ch++) {
652             s->fft_ctx.fft_permute(&s->fft_ctx, s->cmplx[ch]);
653             s->fft_ctx.fft_calc(&s->fft_ctx, s->cmplx[ch]);
654         }
655 
656         r = &s->buffer_ptr[s->nb_channels * n * s->subframe_size];
657         for (i = 0; i < 2 * s->subframe_size; i++) {
658             for (ch = 0; ch < s->nb_channels; ch++) {
659                 *r++ += s->cmplx[ch][i].re;
660             }
661         }
662 
663         r = &s->buffer_ptr[n * s->subframe_size * s->nb_channels];
664         for (i = 0; i < s->nb_channels * s->subframe_size; i++) {
665             out[i] = av_clipf(r[i], INT16_MIN, INT16_MAX);
666         }
667         out += s->subframe_size * s->nb_channels;
668 
669         for (ch = 0; ch < s->nb_channels; ch++) {
670             memset(s->fft_buffer[ch+0] + s->fft_offset + n * s->subframe_size, 0, 4 * s->subframe_size);
671             memset(s->fft_buffer[ch+2] + s->fft_offset + n * s->subframe_size, 0, 4 * s->subframe_size);
672         }
673         memset(s->buffer + s->nb_channels * (n * s->subframe_size + s->frame_size + s->buffer_offset), 0, 4 * s->subframe_size * s->nb_channels);
674     }
675 
676     s->buffer_offset += s->frame_size;
677     if (s->buffer_offset >= 32768 - s->frame_size) {
678         memcpy(s->buffer, &s->buffer[s->nb_channels * s->buffer_offset], 4 * s->frame_size * s->nb_channels);
679         s->buffer_offset = 0;
680     }
681 
682     return 0;
683 }
684 
qdmc_flush(AVCodecContext * avctx)685 static av_cold void qdmc_flush(AVCodecContext *avctx)
686 {
687     QDMCContext *s = avctx->priv_data;
688 
689     memset(s->buffer, 0, sizeof(s->buffer));
690     memset(s->fft_buffer, 0, sizeof(s->fft_buffer));
691     s->fft_offset = 0;
692     s->buffer_offset = 0;
693 }
694 
qdmc_decode_frame(AVCodecContext * avctx,void * data,int * got_frame_ptr,AVPacket * avpkt)695 static int qdmc_decode_frame(AVCodecContext *avctx, void *data,
696                              int *got_frame_ptr, AVPacket *avpkt)
697 {
698     QDMCContext *s = avctx->priv_data;
699     AVFrame *frame = data;
700     GetBitContext gb;
701     int ret;
702 
703     if (!avpkt->data)
704         return 0;
705     if (avpkt->size < s->checksum_size)
706         return AVERROR_INVALIDDATA;
707 
708     s->avctx = avctx;
709     frame->nb_samples = s->frame_size;
710     if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
711         return ret;
712 
713     if ((ret = init_get_bits8(&gb, avpkt->data, s->checksum_size)) < 0)
714         return ret;
715 
716     memset(s->nb_tones, 0, sizeof(s->nb_tones));
717     memset(s->cur_tone, 0, sizeof(s->cur_tone));
718 
719     ret = decode_frame(s, &gb, (int16_t *)frame->data[0]);
720     if (ret >= 0) {
721         *got_frame_ptr = 1;
722         return s->checksum_size;
723     }
724     qdmc_flush(avctx);
725     return ret;
726 }
727 
728 AVCodec ff_qdmc_decoder = {
729     .name             = "qdmc",
730     .long_name        = NULL_IF_CONFIG_SMALL("QDesign Music Codec 1"),
731     .type             = AVMEDIA_TYPE_AUDIO,
732     .id               = AV_CODEC_ID_QDMC,
733     .priv_data_size   = sizeof(QDMCContext),
734     .init             = qdmc_decode_init,
735     .close            = qdmc_decode_close,
736     .decode           = qdmc_decode_frame,
737     .flush            = qdmc_flush,
738     .capabilities     = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
739     .caps_internal    = FF_CODEC_CAP_INIT_THREADSAFE,
740 };
741