1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * QDM2 compatible decoder
3cabdff1aSopenharmony_ci * Copyright (c) 2003 Ewald Snel
4cabdff1aSopenharmony_ci * Copyright (c) 2005 Benjamin Larsson
5cabdff1aSopenharmony_ci * Copyright (c) 2005 Alex Beregszaszi
6cabdff1aSopenharmony_ci * Copyright (c) 2005 Roberto Togni
7cabdff1aSopenharmony_ci *
8cabdff1aSopenharmony_ci * This file is part of FFmpeg.
9cabdff1aSopenharmony_ci *
10cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
11cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
12cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
13cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
14cabdff1aSopenharmony_ci *
15cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
16cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
17cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
18cabdff1aSopenharmony_ci * Lesser General Public License for more details.
19cabdff1aSopenharmony_ci *
20cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
21cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
22cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
23cabdff1aSopenharmony_ci */
24cabdff1aSopenharmony_ci
25cabdff1aSopenharmony_ci/**
26cabdff1aSopenharmony_ci * @file
27cabdff1aSopenharmony_ci * QDM2 decoder
28cabdff1aSopenharmony_ci * @author Ewald Snel, Benjamin Larsson, Alex Beregszaszi, Roberto Togni
29cabdff1aSopenharmony_ci *
30cabdff1aSopenharmony_ci * The decoder is not perfect yet, there are still some distortions
31cabdff1aSopenharmony_ci * especially on files encoded with 16 or 8 subbands.
32cabdff1aSopenharmony_ci */
33cabdff1aSopenharmony_ci
34cabdff1aSopenharmony_ci#include <math.h>
35cabdff1aSopenharmony_ci#include <stddef.h>
36cabdff1aSopenharmony_ci#include <stdio.h>
37cabdff1aSopenharmony_ci
38cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h"
39cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h"
40cabdff1aSopenharmony_ci#include "libavutil/thread.h"
41cabdff1aSopenharmony_ci
42cabdff1aSopenharmony_ci#define BITSTREAM_READER_LE
43cabdff1aSopenharmony_ci#include "avcodec.h"
44cabdff1aSopenharmony_ci#include "get_bits.h"
45cabdff1aSopenharmony_ci#include "bytestream.h"
46cabdff1aSopenharmony_ci#include "codec_internal.h"
47cabdff1aSopenharmony_ci#include "internal.h"
48cabdff1aSopenharmony_ci#include "mpegaudio.h"
49cabdff1aSopenharmony_ci#include "mpegaudiodsp.h"
50cabdff1aSopenharmony_ci#include "rdft.h"
51cabdff1aSopenharmony_ci
52cabdff1aSopenharmony_ci#include "qdm2_tablegen.h"
53cabdff1aSopenharmony_ci
54cabdff1aSopenharmony_ci#define QDM2_LIST_ADD(list, size, packet) \
55cabdff1aSopenharmony_cido { \
56cabdff1aSopenharmony_ci      if (size > 0) { \
57cabdff1aSopenharmony_ci    list[size - 1].next = &list[size]; \
58cabdff1aSopenharmony_ci      } \
59cabdff1aSopenharmony_ci      list[size].packet = packet; \
60cabdff1aSopenharmony_ci      list[size].next = NULL; \
61cabdff1aSopenharmony_ci      size++; \
62cabdff1aSopenharmony_ci} while(0)
63cabdff1aSopenharmony_ci
64cabdff1aSopenharmony_ci// Result is 8, 16 or 30
65cabdff1aSopenharmony_ci#define QDM2_SB_USED(sub_sampling) (((sub_sampling) >= 2) ? 30 : 8 << (sub_sampling))
66cabdff1aSopenharmony_ci
67cabdff1aSopenharmony_ci#define FIX_NOISE_IDX(noise_idx) \
68cabdff1aSopenharmony_ci  if ((noise_idx) >= 3840) \
69cabdff1aSopenharmony_ci    (noise_idx) -= 3840; \
70cabdff1aSopenharmony_ci
71cabdff1aSopenharmony_ci#define SB_DITHERING_NOISE(sb,noise_idx) (noise_table[(noise_idx)++] * sb_noise_attenuation[(sb)])
72cabdff1aSopenharmony_ci
73cabdff1aSopenharmony_ci#define SAMPLES_NEEDED \
74cabdff1aSopenharmony_ci     av_log (NULL,AV_LOG_INFO,"This file triggers some untested code. Please contact the developers.\n");
75cabdff1aSopenharmony_ci
76cabdff1aSopenharmony_ci#define SAMPLES_NEEDED_2(why) \
77cabdff1aSopenharmony_ci     av_log (NULL,AV_LOG_INFO,"This file triggers some missing code. Please contact the developers.\nPosition: %s\n",why);
78cabdff1aSopenharmony_ci
79cabdff1aSopenharmony_ci#define QDM2_MAX_FRAME_SIZE 512
80cabdff1aSopenharmony_ci
81cabdff1aSopenharmony_citypedef int8_t sb_int8_array[2][30][64];
82cabdff1aSopenharmony_ci
83cabdff1aSopenharmony_ci/**
84cabdff1aSopenharmony_ci * Subpacket
85cabdff1aSopenharmony_ci */
86cabdff1aSopenharmony_citypedef struct QDM2SubPacket {
87cabdff1aSopenharmony_ci    int type;            ///< subpacket type
88cabdff1aSopenharmony_ci    unsigned int size;   ///< subpacket size
89cabdff1aSopenharmony_ci    const uint8_t *data; ///< pointer to subpacket data (points to input data buffer, it's not a private copy)
90cabdff1aSopenharmony_ci} QDM2SubPacket;
91cabdff1aSopenharmony_ci
92cabdff1aSopenharmony_ci/**
93cabdff1aSopenharmony_ci * A node in the subpacket list
94cabdff1aSopenharmony_ci */
95cabdff1aSopenharmony_citypedef struct QDM2SubPNode {
96cabdff1aSopenharmony_ci    QDM2SubPacket *packet;      ///< packet
97cabdff1aSopenharmony_ci    struct QDM2SubPNode *next; ///< pointer to next packet in the list, NULL if leaf node
98cabdff1aSopenharmony_ci} QDM2SubPNode;
99cabdff1aSopenharmony_ci
100cabdff1aSopenharmony_citypedef struct QDM2Complex {
101cabdff1aSopenharmony_ci    float re;
102cabdff1aSopenharmony_ci    float im;
103cabdff1aSopenharmony_ci} QDM2Complex;
104cabdff1aSopenharmony_ci
105cabdff1aSopenharmony_citypedef struct FFTTone {
106cabdff1aSopenharmony_ci    float level;
107cabdff1aSopenharmony_ci    QDM2Complex *complex;
108cabdff1aSopenharmony_ci    const float *table;
109cabdff1aSopenharmony_ci    int   phase;
110cabdff1aSopenharmony_ci    int   phase_shift;
111cabdff1aSopenharmony_ci    int   duration;
112cabdff1aSopenharmony_ci    short time_index;
113cabdff1aSopenharmony_ci    short cutoff;
114cabdff1aSopenharmony_ci} FFTTone;
115cabdff1aSopenharmony_ci
116cabdff1aSopenharmony_citypedef struct FFTCoefficient {
117cabdff1aSopenharmony_ci    int16_t sub_packet;
118cabdff1aSopenharmony_ci    uint8_t channel;
119cabdff1aSopenharmony_ci    int16_t offset;
120cabdff1aSopenharmony_ci    int16_t exp;
121cabdff1aSopenharmony_ci    uint8_t phase;
122cabdff1aSopenharmony_ci} FFTCoefficient;
123cabdff1aSopenharmony_ci
124cabdff1aSopenharmony_citypedef struct QDM2FFT {
125cabdff1aSopenharmony_ci    DECLARE_ALIGNED(32, QDM2Complex, complex)[MPA_MAX_CHANNELS][256];
126cabdff1aSopenharmony_ci} QDM2FFT;
127cabdff1aSopenharmony_ci
128cabdff1aSopenharmony_ci/**
129cabdff1aSopenharmony_ci * QDM2 decoder context
130cabdff1aSopenharmony_ci */
131cabdff1aSopenharmony_citypedef struct QDM2Context {
132cabdff1aSopenharmony_ci    /// Parameters from codec header, do not change during playback
133cabdff1aSopenharmony_ci    int nb_channels;         ///< number of channels
134cabdff1aSopenharmony_ci    int channels;            ///< number of channels
135cabdff1aSopenharmony_ci    int group_size;          ///< size of frame group (16 frames per group)
136cabdff1aSopenharmony_ci    int fft_size;            ///< size of FFT, in complex numbers
137cabdff1aSopenharmony_ci    int checksum_size;       ///< size of data block, used also for checksum
138cabdff1aSopenharmony_ci
139cabdff1aSopenharmony_ci    /// Parameters built from header parameters, do not change during playback
140cabdff1aSopenharmony_ci    int group_order;         ///< order of frame group
141cabdff1aSopenharmony_ci    int fft_order;           ///< order of FFT (actually fftorder+1)
142cabdff1aSopenharmony_ci    int frame_size;          ///< size of data frame
143cabdff1aSopenharmony_ci    int frequency_range;
144cabdff1aSopenharmony_ci    int sub_sampling;        ///< subsampling: 0=25%, 1=50%, 2=100% */
145cabdff1aSopenharmony_ci    int coeff_per_sb_select; ///< selector for "num. of coeffs. per subband" tables. Can be 0, 1, 2
146cabdff1aSopenharmony_ci    int cm_table_select;     ///< selector for "coding method" tables. Can be 0, 1 (from init: 0-4)
147cabdff1aSopenharmony_ci
148cabdff1aSopenharmony_ci    /// Packets and packet lists
149cabdff1aSopenharmony_ci    QDM2SubPacket sub_packets[16];      ///< the packets themselves
150cabdff1aSopenharmony_ci    QDM2SubPNode sub_packet_list_A[16]; ///< list of all packets
151cabdff1aSopenharmony_ci    QDM2SubPNode sub_packet_list_B[16]; ///< FFT packets B are on list
152cabdff1aSopenharmony_ci    int sub_packets_B;                  ///< number of packets on 'B' list
153cabdff1aSopenharmony_ci    QDM2SubPNode sub_packet_list_C[16]; ///< packets with errors?
154cabdff1aSopenharmony_ci    QDM2SubPNode sub_packet_list_D[16]; ///< DCT packets
155cabdff1aSopenharmony_ci
156cabdff1aSopenharmony_ci    /// FFT and tones
157cabdff1aSopenharmony_ci    FFTTone fft_tones[1000];
158cabdff1aSopenharmony_ci    int fft_tone_start;
159cabdff1aSopenharmony_ci    int fft_tone_end;
160cabdff1aSopenharmony_ci    FFTCoefficient fft_coefs[1000];
161cabdff1aSopenharmony_ci    int fft_coefs_index;
162cabdff1aSopenharmony_ci    int fft_coefs_min_index[5];
163cabdff1aSopenharmony_ci    int fft_coefs_max_index[5];
164cabdff1aSopenharmony_ci    int fft_level_exp[6];
165cabdff1aSopenharmony_ci    RDFTContext rdft_ctx;
166cabdff1aSopenharmony_ci    QDM2FFT fft;
167cabdff1aSopenharmony_ci
168cabdff1aSopenharmony_ci    /// I/O data
169cabdff1aSopenharmony_ci    const uint8_t *compressed_data;
170cabdff1aSopenharmony_ci    int compressed_size;
171cabdff1aSopenharmony_ci    float output_buffer[QDM2_MAX_FRAME_SIZE * MPA_MAX_CHANNELS * 2];
172cabdff1aSopenharmony_ci
173cabdff1aSopenharmony_ci    /// Synthesis filter
174cabdff1aSopenharmony_ci    MPADSPContext mpadsp;
175cabdff1aSopenharmony_ci    DECLARE_ALIGNED(32, float, synth_buf)[MPA_MAX_CHANNELS][512*2];
176cabdff1aSopenharmony_ci    int synth_buf_offset[MPA_MAX_CHANNELS];
177cabdff1aSopenharmony_ci    DECLARE_ALIGNED(32, float, sb_samples)[MPA_MAX_CHANNELS][128][SBLIMIT];
178cabdff1aSopenharmony_ci    DECLARE_ALIGNED(32, float, samples)[MPA_MAX_CHANNELS * MPA_FRAME_SIZE];
179cabdff1aSopenharmony_ci
180cabdff1aSopenharmony_ci    /// Mixed temporary data used in decoding
181cabdff1aSopenharmony_ci    float tone_level[MPA_MAX_CHANNELS][30][64];
182cabdff1aSopenharmony_ci    int8_t coding_method[MPA_MAX_CHANNELS][30][64];
183cabdff1aSopenharmony_ci    int8_t quantized_coeffs[MPA_MAX_CHANNELS][10][8];
184cabdff1aSopenharmony_ci    int8_t tone_level_idx_base[MPA_MAX_CHANNELS][30][8];
185cabdff1aSopenharmony_ci    int8_t tone_level_idx_hi1[MPA_MAX_CHANNELS][3][8][8];
186cabdff1aSopenharmony_ci    int8_t tone_level_idx_mid[MPA_MAX_CHANNELS][26][8];
187cabdff1aSopenharmony_ci    int8_t tone_level_idx_hi2[MPA_MAX_CHANNELS][26];
188cabdff1aSopenharmony_ci    int8_t tone_level_idx[MPA_MAX_CHANNELS][30][64];
189cabdff1aSopenharmony_ci    int8_t tone_level_idx_temp[MPA_MAX_CHANNELS][30][64];
190cabdff1aSopenharmony_ci
191cabdff1aSopenharmony_ci    // Flags
192cabdff1aSopenharmony_ci    int has_errors;         ///< packet has errors
193cabdff1aSopenharmony_ci    int superblocktype_2_3; ///< select fft tables and some algorithm based on superblock type
194cabdff1aSopenharmony_ci    int do_synth_filter;    ///< used to perform or skip synthesis filter
195cabdff1aSopenharmony_ci
196cabdff1aSopenharmony_ci    int sub_packet;
197cabdff1aSopenharmony_ci    int noise_idx; ///< index for dithering noise table
198cabdff1aSopenharmony_ci} QDM2Context;
199cabdff1aSopenharmony_ci
200cabdff1aSopenharmony_cistatic const int switchtable[23] = {
201cabdff1aSopenharmony_ci    0, 5, 1, 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 3, 5, 5, 5, 5, 5, 4
202cabdff1aSopenharmony_ci};
203cabdff1aSopenharmony_ci
204cabdff1aSopenharmony_cistatic int qdm2_get_vlc(GetBitContext *gb, const VLC *vlc, int flag, int depth)
205cabdff1aSopenharmony_ci{
206cabdff1aSopenharmony_ci    int value;
207cabdff1aSopenharmony_ci
208cabdff1aSopenharmony_ci    value = get_vlc2(gb, vlc->table, vlc->bits, depth);
209cabdff1aSopenharmony_ci
210cabdff1aSopenharmony_ci    /* stage-2, 3 bits exponent escape sequence */
211cabdff1aSopenharmony_ci    if (value < 0)
212cabdff1aSopenharmony_ci        value = get_bits(gb, get_bits(gb, 3) + 1);
213cabdff1aSopenharmony_ci
214cabdff1aSopenharmony_ci    /* stage-3, optional */
215cabdff1aSopenharmony_ci    if (flag) {
216cabdff1aSopenharmony_ci        int tmp;
217cabdff1aSopenharmony_ci
218cabdff1aSopenharmony_ci        if (value >= 60) {
219cabdff1aSopenharmony_ci            av_log(NULL, AV_LOG_ERROR, "value %d in qdm2_get_vlc too large\n", value);
220cabdff1aSopenharmony_ci            return 0;
221cabdff1aSopenharmony_ci        }
222cabdff1aSopenharmony_ci
223cabdff1aSopenharmony_ci        tmp= vlc_stage3_values[value];
224cabdff1aSopenharmony_ci
225cabdff1aSopenharmony_ci        if ((value & ~3) > 0)
226cabdff1aSopenharmony_ci            tmp += get_bits(gb, (value >> 2));
227cabdff1aSopenharmony_ci        value = tmp;
228cabdff1aSopenharmony_ci    }
229cabdff1aSopenharmony_ci
230cabdff1aSopenharmony_ci    return value;
231cabdff1aSopenharmony_ci}
232cabdff1aSopenharmony_ci
233cabdff1aSopenharmony_cistatic int qdm2_get_se_vlc(const VLC *vlc, GetBitContext *gb, int depth)
234cabdff1aSopenharmony_ci{
235cabdff1aSopenharmony_ci    int value = qdm2_get_vlc(gb, vlc, 0, depth);
236cabdff1aSopenharmony_ci
237cabdff1aSopenharmony_ci    return (value & 1) ? ((value + 1) >> 1) : -(value >> 1);
238cabdff1aSopenharmony_ci}
239cabdff1aSopenharmony_ci
240cabdff1aSopenharmony_ci/**
241cabdff1aSopenharmony_ci * QDM2 checksum
242cabdff1aSopenharmony_ci *
243cabdff1aSopenharmony_ci * @param data      pointer to data to be checksummed
244cabdff1aSopenharmony_ci * @param length    data length
245cabdff1aSopenharmony_ci * @param value     checksum value
246cabdff1aSopenharmony_ci *
247cabdff1aSopenharmony_ci * @return          0 if checksum is OK
248cabdff1aSopenharmony_ci */
249cabdff1aSopenharmony_cistatic uint16_t qdm2_packet_checksum(const uint8_t *data, int length, int value)
250cabdff1aSopenharmony_ci{
251cabdff1aSopenharmony_ci    int i;
252cabdff1aSopenharmony_ci
253cabdff1aSopenharmony_ci    for (i = 0; i < length; i++)
254cabdff1aSopenharmony_ci        value -= data[i];
255cabdff1aSopenharmony_ci
256cabdff1aSopenharmony_ci    return (uint16_t)(value & 0xffff);
257cabdff1aSopenharmony_ci}
258cabdff1aSopenharmony_ci
259cabdff1aSopenharmony_ci/**
260cabdff1aSopenharmony_ci * Fill a QDM2SubPacket structure with packet type, size, and data pointer.
261cabdff1aSopenharmony_ci *
262cabdff1aSopenharmony_ci * @param gb            bitreader context
263cabdff1aSopenharmony_ci * @param sub_packet    packet under analysis
264cabdff1aSopenharmony_ci */
265cabdff1aSopenharmony_cistatic void qdm2_decode_sub_packet_header(GetBitContext *gb,
266cabdff1aSopenharmony_ci                                          QDM2SubPacket *sub_packet)
267cabdff1aSopenharmony_ci{
268cabdff1aSopenharmony_ci    sub_packet->type = get_bits(gb, 8);
269cabdff1aSopenharmony_ci
270cabdff1aSopenharmony_ci    if (sub_packet->type == 0) {
271cabdff1aSopenharmony_ci        sub_packet->size = 0;
272cabdff1aSopenharmony_ci        sub_packet->data = NULL;
273cabdff1aSopenharmony_ci    } else {
274cabdff1aSopenharmony_ci        sub_packet->size = get_bits(gb, 8);
275cabdff1aSopenharmony_ci
276cabdff1aSopenharmony_ci        if (sub_packet->type & 0x80) {
277cabdff1aSopenharmony_ci            sub_packet->size <<= 8;
278cabdff1aSopenharmony_ci            sub_packet->size  |= get_bits(gb, 8);
279cabdff1aSopenharmony_ci            sub_packet->type  &= 0x7f;
280cabdff1aSopenharmony_ci        }
281cabdff1aSopenharmony_ci
282cabdff1aSopenharmony_ci        if (sub_packet->type == 0x7f)
283cabdff1aSopenharmony_ci            sub_packet->type |= (get_bits(gb, 8) << 8);
284cabdff1aSopenharmony_ci
285cabdff1aSopenharmony_ci        // FIXME: this depends on bitreader-internal data
286cabdff1aSopenharmony_ci        sub_packet->data = &gb->buffer[get_bits_count(gb) / 8];
287cabdff1aSopenharmony_ci    }
288cabdff1aSopenharmony_ci
289cabdff1aSopenharmony_ci    av_log(NULL, AV_LOG_DEBUG, "Subpacket: type=%d size=%d start_offs=%x\n",
290cabdff1aSopenharmony_ci           sub_packet->type, sub_packet->size, get_bits_count(gb) / 8);
291cabdff1aSopenharmony_ci}
292cabdff1aSopenharmony_ci
293cabdff1aSopenharmony_ci/**
294cabdff1aSopenharmony_ci * Return node pointer to first packet of requested type in list.
295cabdff1aSopenharmony_ci *
296cabdff1aSopenharmony_ci * @param list    list of subpackets to be scanned
297cabdff1aSopenharmony_ci * @param type    type of searched subpacket
298cabdff1aSopenharmony_ci * @return        node pointer for subpacket if found, else NULL
299cabdff1aSopenharmony_ci */
300cabdff1aSopenharmony_cistatic QDM2SubPNode *qdm2_search_subpacket_type_in_list(QDM2SubPNode *list,
301cabdff1aSopenharmony_ci                                                        int type)
302cabdff1aSopenharmony_ci{
303cabdff1aSopenharmony_ci    while (list && list->packet) {
304cabdff1aSopenharmony_ci        if (list->packet->type == type)
305cabdff1aSopenharmony_ci            return list;
306cabdff1aSopenharmony_ci        list = list->next;
307cabdff1aSopenharmony_ci    }
308cabdff1aSopenharmony_ci    return NULL;
309cabdff1aSopenharmony_ci}
310cabdff1aSopenharmony_ci
311cabdff1aSopenharmony_ci/**
312cabdff1aSopenharmony_ci * Replace 8 elements with their average value.
313cabdff1aSopenharmony_ci * Called by qdm2_decode_superblock before starting subblock decoding.
314cabdff1aSopenharmony_ci *
315cabdff1aSopenharmony_ci * @param q       context
316cabdff1aSopenharmony_ci */
317cabdff1aSopenharmony_cistatic void average_quantized_coeffs(QDM2Context *q)
318cabdff1aSopenharmony_ci{
319cabdff1aSopenharmony_ci    int i, j, n, ch, sum;
320cabdff1aSopenharmony_ci
321cabdff1aSopenharmony_ci    n = coeff_per_sb_for_avg[q->coeff_per_sb_select][QDM2_SB_USED(q->sub_sampling) - 1] + 1;
322cabdff1aSopenharmony_ci
323cabdff1aSopenharmony_ci    for (ch = 0; ch < q->nb_channels; ch++)
324cabdff1aSopenharmony_ci        for (i = 0; i < n; i++) {
325cabdff1aSopenharmony_ci            sum = 0;
326cabdff1aSopenharmony_ci
327cabdff1aSopenharmony_ci            for (j = 0; j < 8; j++)
328cabdff1aSopenharmony_ci                sum += q->quantized_coeffs[ch][i][j];
329cabdff1aSopenharmony_ci
330cabdff1aSopenharmony_ci            sum /= 8;
331cabdff1aSopenharmony_ci            if (sum > 0)
332cabdff1aSopenharmony_ci                sum--;
333cabdff1aSopenharmony_ci
334cabdff1aSopenharmony_ci            for (j = 0; j < 8; j++)
335cabdff1aSopenharmony_ci                q->quantized_coeffs[ch][i][j] = sum;
336cabdff1aSopenharmony_ci        }
337cabdff1aSopenharmony_ci}
338cabdff1aSopenharmony_ci
339cabdff1aSopenharmony_ci/**
340cabdff1aSopenharmony_ci * Build subband samples with noise weighted by q->tone_level.
341cabdff1aSopenharmony_ci * Called by synthfilt_build_sb_samples.
342cabdff1aSopenharmony_ci *
343cabdff1aSopenharmony_ci * @param q     context
344cabdff1aSopenharmony_ci * @param sb    subband index
345cabdff1aSopenharmony_ci */
346cabdff1aSopenharmony_cistatic void build_sb_samples_from_noise(QDM2Context *q, int sb)
347cabdff1aSopenharmony_ci{
348cabdff1aSopenharmony_ci    int ch, j;
349cabdff1aSopenharmony_ci
350cabdff1aSopenharmony_ci    FIX_NOISE_IDX(q->noise_idx);
351cabdff1aSopenharmony_ci
352cabdff1aSopenharmony_ci    if (!q->nb_channels)
353cabdff1aSopenharmony_ci        return;
354cabdff1aSopenharmony_ci
355cabdff1aSopenharmony_ci    for (ch = 0; ch < q->nb_channels; ch++) {
356cabdff1aSopenharmony_ci        for (j = 0; j < 64; j++) {
357cabdff1aSopenharmony_ci            q->sb_samples[ch][j * 2][sb] =
358cabdff1aSopenharmony_ci                SB_DITHERING_NOISE(sb, q->noise_idx) * q->tone_level[ch][sb][j];
359cabdff1aSopenharmony_ci            q->sb_samples[ch][j * 2 + 1][sb] =
360cabdff1aSopenharmony_ci                SB_DITHERING_NOISE(sb, q->noise_idx) * q->tone_level[ch][sb][j];
361cabdff1aSopenharmony_ci        }
362cabdff1aSopenharmony_ci    }
363cabdff1aSopenharmony_ci}
364cabdff1aSopenharmony_ci
365cabdff1aSopenharmony_ci/**
366cabdff1aSopenharmony_ci * Called while processing data from subpackets 11 and 12.
367cabdff1aSopenharmony_ci * Used after making changes to coding_method array.
368cabdff1aSopenharmony_ci *
369cabdff1aSopenharmony_ci * @param sb               subband index
370cabdff1aSopenharmony_ci * @param channels         number of channels
371cabdff1aSopenharmony_ci * @param coding_method    q->coding_method[0][0][0]
372cabdff1aSopenharmony_ci */
373cabdff1aSopenharmony_cistatic int fix_coding_method_array(int sb, int channels,
374cabdff1aSopenharmony_ci                                   sb_int8_array coding_method)
375cabdff1aSopenharmony_ci{
376cabdff1aSopenharmony_ci    int j, k;
377cabdff1aSopenharmony_ci    int ch;
378cabdff1aSopenharmony_ci    int run, case_val;
379cabdff1aSopenharmony_ci
380cabdff1aSopenharmony_ci    for (ch = 0; ch < channels; ch++) {
381cabdff1aSopenharmony_ci        for (j = 0; j < 64; ) {
382cabdff1aSopenharmony_ci            if (coding_method[ch][sb][j] < 8)
383cabdff1aSopenharmony_ci                return -1;
384cabdff1aSopenharmony_ci            if ((coding_method[ch][sb][j] - 8) > 22) {
385cabdff1aSopenharmony_ci                run      = 1;
386cabdff1aSopenharmony_ci                case_val = 8;
387cabdff1aSopenharmony_ci            } else {
388cabdff1aSopenharmony_ci                switch (switchtable[coding_method[ch][sb][j] - 8]) {
389cabdff1aSopenharmony_ci                case 0: run  = 10;
390cabdff1aSopenharmony_ci                    case_val = 10;
391cabdff1aSopenharmony_ci                    break;
392cabdff1aSopenharmony_ci                case 1: run  = 1;
393cabdff1aSopenharmony_ci                    case_val = 16;
394cabdff1aSopenharmony_ci                    break;
395cabdff1aSopenharmony_ci                case 2: run  = 5;
396cabdff1aSopenharmony_ci                    case_val = 24;
397cabdff1aSopenharmony_ci                    break;
398cabdff1aSopenharmony_ci                case 3: run  = 3;
399cabdff1aSopenharmony_ci                    case_val = 30;
400cabdff1aSopenharmony_ci                    break;
401cabdff1aSopenharmony_ci                case 4: run  = 1;
402cabdff1aSopenharmony_ci                    case_val = 30;
403cabdff1aSopenharmony_ci                    break;
404cabdff1aSopenharmony_ci                case 5: run  = 1;
405cabdff1aSopenharmony_ci                    case_val = 8;
406cabdff1aSopenharmony_ci                    break;
407cabdff1aSopenharmony_ci                default: run = 1;
408cabdff1aSopenharmony_ci                    case_val = 8;
409cabdff1aSopenharmony_ci                    break;
410cabdff1aSopenharmony_ci                }
411cabdff1aSopenharmony_ci            }
412cabdff1aSopenharmony_ci            for (k = 0; k < run; k++) {
413cabdff1aSopenharmony_ci                if (j + k < 128) {
414cabdff1aSopenharmony_ci                    int sbjk = sb + (j + k) / 64;
415cabdff1aSopenharmony_ci                    if (sbjk > 29) {
416cabdff1aSopenharmony_ci                        SAMPLES_NEEDED
417cabdff1aSopenharmony_ci                        continue;
418cabdff1aSopenharmony_ci                    }
419cabdff1aSopenharmony_ci                    if (coding_method[ch][sbjk][(j + k) % 64] > coding_method[ch][sb][j]) {
420cabdff1aSopenharmony_ci                        if (k > 0) {
421cabdff1aSopenharmony_ci                            SAMPLES_NEEDED
422cabdff1aSopenharmony_ci                            //not debugged, almost never used
423cabdff1aSopenharmony_ci                            memset(&coding_method[ch][sb][j + k], case_val,
424cabdff1aSopenharmony_ci                                   k *sizeof(int8_t));
425cabdff1aSopenharmony_ci                            memset(&coding_method[ch][sb][j + k], case_val,
426cabdff1aSopenharmony_ci                                   3 * sizeof(int8_t));
427cabdff1aSopenharmony_ci                        }
428cabdff1aSopenharmony_ci                    }
429cabdff1aSopenharmony_ci                }
430cabdff1aSopenharmony_ci            }
431cabdff1aSopenharmony_ci            j += run;
432cabdff1aSopenharmony_ci        }
433cabdff1aSopenharmony_ci    }
434cabdff1aSopenharmony_ci    return 0;
435cabdff1aSopenharmony_ci}
436cabdff1aSopenharmony_ci
437cabdff1aSopenharmony_ci/**
438cabdff1aSopenharmony_ci * Related to synthesis filter
439cabdff1aSopenharmony_ci * Called by process_subpacket_10
440cabdff1aSopenharmony_ci *
441cabdff1aSopenharmony_ci * @param q       context
442cabdff1aSopenharmony_ci * @param flag    1 if called after getting data from subpacket 10, 0 if no subpacket 10
443cabdff1aSopenharmony_ci */
444cabdff1aSopenharmony_cistatic void fill_tone_level_array(QDM2Context *q, int flag)
445cabdff1aSopenharmony_ci{
446cabdff1aSopenharmony_ci    int i, sb, ch, sb_used;
447cabdff1aSopenharmony_ci    int tmp, tab;
448cabdff1aSopenharmony_ci
449cabdff1aSopenharmony_ci    for (ch = 0; ch < q->nb_channels; ch++)
450cabdff1aSopenharmony_ci        for (sb = 0; sb < 30; sb++)
451cabdff1aSopenharmony_ci            for (i = 0; i < 8; i++) {
452cabdff1aSopenharmony_ci                if ((tab=coeff_per_sb_for_dequant[q->coeff_per_sb_select][sb]) < (last_coeff[q->coeff_per_sb_select] - 1))
453cabdff1aSopenharmony_ci                    tmp = q->quantized_coeffs[ch][tab + 1][i] * dequant_table[q->coeff_per_sb_select][tab + 1][sb]+
454cabdff1aSopenharmony_ci                          q->quantized_coeffs[ch][tab][i] * dequant_table[q->coeff_per_sb_select][tab][sb];
455cabdff1aSopenharmony_ci                else
456cabdff1aSopenharmony_ci                    tmp = q->quantized_coeffs[ch][tab][i] * dequant_table[q->coeff_per_sb_select][tab][sb];
457cabdff1aSopenharmony_ci                if(tmp < 0)
458cabdff1aSopenharmony_ci                    tmp += 0xff;
459cabdff1aSopenharmony_ci                q->tone_level_idx_base[ch][sb][i] = (tmp / 256) & 0xff;
460cabdff1aSopenharmony_ci            }
461cabdff1aSopenharmony_ci
462cabdff1aSopenharmony_ci    sb_used = QDM2_SB_USED(q->sub_sampling);
463cabdff1aSopenharmony_ci
464cabdff1aSopenharmony_ci    if ((q->superblocktype_2_3 != 0) && !flag) {
465cabdff1aSopenharmony_ci        for (sb = 0; sb < sb_used; sb++)
466cabdff1aSopenharmony_ci            for (ch = 0; ch < q->nb_channels; ch++)
467cabdff1aSopenharmony_ci                for (i = 0; i < 64; i++) {
468cabdff1aSopenharmony_ci                    q->tone_level_idx[ch][sb][i] = q->tone_level_idx_base[ch][sb][i / 8];
469cabdff1aSopenharmony_ci                    if (q->tone_level_idx[ch][sb][i] < 0)
470cabdff1aSopenharmony_ci                        q->tone_level[ch][sb][i] = 0;
471cabdff1aSopenharmony_ci                    else
472cabdff1aSopenharmony_ci                        q->tone_level[ch][sb][i] = fft_tone_level_table[0][q->tone_level_idx[ch][sb][i] & 0x3f];
473cabdff1aSopenharmony_ci                }
474cabdff1aSopenharmony_ci    } else {
475cabdff1aSopenharmony_ci        tab = q->superblocktype_2_3 ? 0 : 1;
476cabdff1aSopenharmony_ci        for (sb = 0; sb < sb_used; sb++) {
477cabdff1aSopenharmony_ci            if ((sb >= 4) && (sb <= 23)) {
478cabdff1aSopenharmony_ci                for (ch = 0; ch < q->nb_channels; ch++)
479cabdff1aSopenharmony_ci                    for (i = 0; i < 64; i++) {
480cabdff1aSopenharmony_ci                        tmp = q->tone_level_idx_base[ch][sb][i / 8] -
481cabdff1aSopenharmony_ci                              q->tone_level_idx_hi1[ch][sb / 8][i / 8][i % 8] -
482cabdff1aSopenharmony_ci                              q->tone_level_idx_mid[ch][sb - 4][i / 8] -
483cabdff1aSopenharmony_ci                              q->tone_level_idx_hi2[ch][sb - 4];
484cabdff1aSopenharmony_ci                        q->tone_level_idx[ch][sb][i] = tmp & 0xff;
485cabdff1aSopenharmony_ci                        if ((tmp < 0) || (!q->superblocktype_2_3 && !tmp))
486cabdff1aSopenharmony_ci                            q->tone_level[ch][sb][i] = 0;
487cabdff1aSopenharmony_ci                        else
488cabdff1aSopenharmony_ci                            q->tone_level[ch][sb][i] = fft_tone_level_table[tab][tmp & 0x3f];
489cabdff1aSopenharmony_ci                }
490cabdff1aSopenharmony_ci            } else {
491cabdff1aSopenharmony_ci                if (sb > 4) {
492cabdff1aSopenharmony_ci                    for (ch = 0; ch < q->nb_channels; ch++)
493cabdff1aSopenharmony_ci                        for (i = 0; i < 64; i++) {
494cabdff1aSopenharmony_ci                            tmp = q->tone_level_idx_base[ch][sb][i / 8] -
495cabdff1aSopenharmony_ci                                  q->tone_level_idx_hi1[ch][2][i / 8][i % 8] -
496cabdff1aSopenharmony_ci                                  q->tone_level_idx_hi2[ch][sb - 4];
497cabdff1aSopenharmony_ci                            q->tone_level_idx[ch][sb][i] = tmp & 0xff;
498cabdff1aSopenharmony_ci                            if ((tmp < 0) || (!q->superblocktype_2_3 && !tmp))
499cabdff1aSopenharmony_ci                                q->tone_level[ch][sb][i] = 0;
500cabdff1aSopenharmony_ci                            else
501cabdff1aSopenharmony_ci                                q->tone_level[ch][sb][i] = fft_tone_level_table[tab][tmp & 0x3f];
502cabdff1aSopenharmony_ci                    }
503cabdff1aSopenharmony_ci                } else {
504cabdff1aSopenharmony_ci                    for (ch = 0; ch < q->nb_channels; ch++)
505cabdff1aSopenharmony_ci                        for (i = 0; i < 64; i++) {
506cabdff1aSopenharmony_ci                            tmp = q->tone_level_idx[ch][sb][i] = q->tone_level_idx_base[ch][sb][i / 8];
507cabdff1aSopenharmony_ci                            if ((tmp < 0) || (!q->superblocktype_2_3 && !tmp))
508cabdff1aSopenharmony_ci                                q->tone_level[ch][sb][i] = 0;
509cabdff1aSopenharmony_ci                            else
510cabdff1aSopenharmony_ci                                q->tone_level[ch][sb][i] = fft_tone_level_table[tab][tmp & 0x3f];
511cabdff1aSopenharmony_ci                        }
512cabdff1aSopenharmony_ci                }
513cabdff1aSopenharmony_ci            }
514cabdff1aSopenharmony_ci        }
515cabdff1aSopenharmony_ci    }
516cabdff1aSopenharmony_ci}
517cabdff1aSopenharmony_ci
518cabdff1aSopenharmony_ci/**
519cabdff1aSopenharmony_ci * Related to synthesis filter
520cabdff1aSopenharmony_ci * Called by process_subpacket_11
521cabdff1aSopenharmony_ci * c is built with data from subpacket 11
522cabdff1aSopenharmony_ci * Most of this function is used only if superblock_type_2_3 == 0,
523cabdff1aSopenharmony_ci * never seen it in samples.
524cabdff1aSopenharmony_ci *
525cabdff1aSopenharmony_ci * @param tone_level_idx
526cabdff1aSopenharmony_ci * @param tone_level_idx_temp
527cabdff1aSopenharmony_ci * @param coding_method        q->coding_method[0][0][0]
528cabdff1aSopenharmony_ci * @param nb_channels          number of channels
529cabdff1aSopenharmony_ci * @param c                    coming from subpacket 11, passed as 8*c
530cabdff1aSopenharmony_ci * @param superblocktype_2_3   flag based on superblock packet type
531cabdff1aSopenharmony_ci * @param cm_table_select      q->cm_table_select
532cabdff1aSopenharmony_ci */
533cabdff1aSopenharmony_cistatic void fill_coding_method_array(sb_int8_array tone_level_idx,
534cabdff1aSopenharmony_ci                                     sb_int8_array tone_level_idx_temp,
535cabdff1aSopenharmony_ci                                     sb_int8_array coding_method,
536cabdff1aSopenharmony_ci                                     int nb_channels,
537cabdff1aSopenharmony_ci                                     int c, int superblocktype_2_3,
538cabdff1aSopenharmony_ci                                     int cm_table_select)
539cabdff1aSopenharmony_ci{
540cabdff1aSopenharmony_ci    int ch, sb, j;
541cabdff1aSopenharmony_ci    int tmp, acc, esp_40, comp;
542cabdff1aSopenharmony_ci    int add1, add2, add3, add4;
543cabdff1aSopenharmony_ci    int64_t multres;
544cabdff1aSopenharmony_ci
545cabdff1aSopenharmony_ci    if (!superblocktype_2_3) {
546cabdff1aSopenharmony_ci        /* This case is untested, no samples available */
547cabdff1aSopenharmony_ci        avpriv_request_sample(NULL, "!superblocktype_2_3");
548cabdff1aSopenharmony_ci        return;
549cabdff1aSopenharmony_ci        for (ch = 0; ch < nb_channels; ch++) {
550cabdff1aSopenharmony_ci            for (sb = 0; sb < 30; sb++) {
551cabdff1aSopenharmony_ci                for (j = 1; j < 63; j++) {  // The loop only iterates to 63 so the code doesn't overflow the buffer
552cabdff1aSopenharmony_ci                    add1 = tone_level_idx[ch][sb][j] - 10;
553cabdff1aSopenharmony_ci                    if (add1 < 0)
554cabdff1aSopenharmony_ci                        add1 = 0;
555cabdff1aSopenharmony_ci                    add2 = add3 = add4 = 0;
556cabdff1aSopenharmony_ci                    if (sb > 1) {
557cabdff1aSopenharmony_ci                        add2 = tone_level_idx[ch][sb - 2][j] + tone_level_idx_offset_table[sb][0] - 6;
558cabdff1aSopenharmony_ci                        if (add2 < 0)
559cabdff1aSopenharmony_ci                            add2 = 0;
560cabdff1aSopenharmony_ci                    }
561cabdff1aSopenharmony_ci                    if (sb > 0) {
562cabdff1aSopenharmony_ci                        add3 = tone_level_idx[ch][sb - 1][j] + tone_level_idx_offset_table[sb][1] - 6;
563cabdff1aSopenharmony_ci                        if (add3 < 0)
564cabdff1aSopenharmony_ci                            add3 = 0;
565cabdff1aSopenharmony_ci                    }
566cabdff1aSopenharmony_ci                    if (sb < 29) {
567cabdff1aSopenharmony_ci                        add4 = tone_level_idx[ch][sb + 1][j] + tone_level_idx_offset_table[sb][3] - 6;
568cabdff1aSopenharmony_ci                        if (add4 < 0)
569cabdff1aSopenharmony_ci                            add4 = 0;
570cabdff1aSopenharmony_ci                    }
571cabdff1aSopenharmony_ci                    tmp = tone_level_idx[ch][sb][j + 1] * 2 - add4 - add3 - add2 - add1;
572cabdff1aSopenharmony_ci                    if (tmp < 0)
573cabdff1aSopenharmony_ci                        tmp = 0;
574cabdff1aSopenharmony_ci                    tone_level_idx_temp[ch][sb][j + 1] = tmp & 0xff;
575cabdff1aSopenharmony_ci                }
576cabdff1aSopenharmony_ci                tone_level_idx_temp[ch][sb][0] = tone_level_idx_temp[ch][sb][1];
577cabdff1aSopenharmony_ci            }
578cabdff1aSopenharmony_ci        }
579cabdff1aSopenharmony_ci        acc = 0;
580cabdff1aSopenharmony_ci        for (ch = 0; ch < nb_channels; ch++)
581cabdff1aSopenharmony_ci            for (sb = 0; sb < 30; sb++)
582cabdff1aSopenharmony_ci                for (j = 0; j < 64; j++)
583cabdff1aSopenharmony_ci                    acc += tone_level_idx_temp[ch][sb][j];
584cabdff1aSopenharmony_ci
585cabdff1aSopenharmony_ci        multres = 0x66666667LL * (acc * 10);
586cabdff1aSopenharmony_ci        esp_40 = (multres >> 32) / 8 + ((multres & 0xffffffff) >> 31);
587cabdff1aSopenharmony_ci        for (ch = 0;  ch < nb_channels; ch++)
588cabdff1aSopenharmony_ci            for (sb = 0; sb < 30; sb++)
589cabdff1aSopenharmony_ci                for (j = 0; j < 64; j++) {
590cabdff1aSopenharmony_ci                    comp = tone_level_idx_temp[ch][sb][j]* esp_40 * 10;
591cabdff1aSopenharmony_ci                    if (comp < 0)
592cabdff1aSopenharmony_ci                        comp += 0xff;
593cabdff1aSopenharmony_ci                    comp /= 256; // signed shift
594cabdff1aSopenharmony_ci                    switch(sb) {
595cabdff1aSopenharmony_ci                        case 0:
596cabdff1aSopenharmony_ci                            if (comp < 30)
597cabdff1aSopenharmony_ci                                comp = 30;
598cabdff1aSopenharmony_ci                            comp += 15;
599cabdff1aSopenharmony_ci                            break;
600cabdff1aSopenharmony_ci                        case 1:
601cabdff1aSopenharmony_ci                            if (comp < 24)
602cabdff1aSopenharmony_ci                                comp = 24;
603cabdff1aSopenharmony_ci                            comp += 10;
604cabdff1aSopenharmony_ci                            break;
605cabdff1aSopenharmony_ci                        case 2:
606cabdff1aSopenharmony_ci                        case 3:
607cabdff1aSopenharmony_ci                        case 4:
608cabdff1aSopenharmony_ci                            if (comp < 16)
609cabdff1aSopenharmony_ci                                comp = 16;
610cabdff1aSopenharmony_ci                    }
611cabdff1aSopenharmony_ci                    if (comp <= 5)
612cabdff1aSopenharmony_ci                        tmp = 0;
613cabdff1aSopenharmony_ci                    else if (comp <= 10)
614cabdff1aSopenharmony_ci                        tmp = 10;
615cabdff1aSopenharmony_ci                    else if (comp <= 16)
616cabdff1aSopenharmony_ci                        tmp = 16;
617cabdff1aSopenharmony_ci                    else if (comp <= 24)
618cabdff1aSopenharmony_ci                        tmp = -1;
619cabdff1aSopenharmony_ci                    else
620cabdff1aSopenharmony_ci                        tmp = 0;
621cabdff1aSopenharmony_ci                    coding_method[ch][sb][j] = ((tmp & 0xfffa) + 30 )& 0xff;
622cabdff1aSopenharmony_ci                }
623cabdff1aSopenharmony_ci        for (sb = 0; sb < 30; sb++)
624cabdff1aSopenharmony_ci            fix_coding_method_array(sb, nb_channels, coding_method);
625cabdff1aSopenharmony_ci        for (ch = 0; ch < nb_channels; ch++)
626cabdff1aSopenharmony_ci            for (sb = 0; sb < 30; sb++)
627cabdff1aSopenharmony_ci                for (j = 0; j < 64; j++)
628cabdff1aSopenharmony_ci                    if (sb >= 10) {
629cabdff1aSopenharmony_ci                        if (coding_method[ch][sb][j] < 10)
630cabdff1aSopenharmony_ci                            coding_method[ch][sb][j] = 10;
631cabdff1aSopenharmony_ci                    } else {
632cabdff1aSopenharmony_ci                        if (sb >= 2) {
633cabdff1aSopenharmony_ci                            if (coding_method[ch][sb][j] < 16)
634cabdff1aSopenharmony_ci                                coding_method[ch][sb][j] = 16;
635cabdff1aSopenharmony_ci                        } else {
636cabdff1aSopenharmony_ci                            if (coding_method[ch][sb][j] < 30)
637cabdff1aSopenharmony_ci                                coding_method[ch][sb][j] = 30;
638cabdff1aSopenharmony_ci                        }
639cabdff1aSopenharmony_ci                    }
640cabdff1aSopenharmony_ci    } else { // superblocktype_2_3 != 0
641cabdff1aSopenharmony_ci        for (ch = 0; ch < nb_channels; ch++)
642cabdff1aSopenharmony_ci            for (sb = 0; sb < 30; sb++)
643cabdff1aSopenharmony_ci                for (j = 0; j < 64; j++)
644cabdff1aSopenharmony_ci                    coding_method[ch][sb][j] = coding_method_table[cm_table_select][sb];
645cabdff1aSopenharmony_ci    }
646cabdff1aSopenharmony_ci}
647cabdff1aSopenharmony_ci
648cabdff1aSopenharmony_ci/**
649cabdff1aSopenharmony_ci * Called by process_subpacket_11 to process more data from subpacket 11
650cabdff1aSopenharmony_ci * with sb 0-8.
651cabdff1aSopenharmony_ci * Called by process_subpacket_12 to process data from subpacket 12 with
652cabdff1aSopenharmony_ci * sb 8-sb_used.
653cabdff1aSopenharmony_ci *
654cabdff1aSopenharmony_ci * @param q         context
655cabdff1aSopenharmony_ci * @param gb        bitreader context
656cabdff1aSopenharmony_ci * @param length    packet length in bits
657cabdff1aSopenharmony_ci * @param sb_min    lower subband processed (sb_min included)
658cabdff1aSopenharmony_ci * @param sb_max    higher subband processed (sb_max excluded)
659cabdff1aSopenharmony_ci */
660cabdff1aSopenharmony_cistatic int synthfilt_build_sb_samples(QDM2Context *q, GetBitContext *gb,
661cabdff1aSopenharmony_ci                                       int length, int sb_min, int sb_max)
662cabdff1aSopenharmony_ci{
663cabdff1aSopenharmony_ci    int sb, j, k, n, ch, run, channels;
664cabdff1aSopenharmony_ci    int joined_stereo, zero_encoding;
665cabdff1aSopenharmony_ci    int type34_first;
666cabdff1aSopenharmony_ci    float type34_div = 0;
667cabdff1aSopenharmony_ci    float type34_predictor;
668cabdff1aSopenharmony_ci    float samples[10];
669cabdff1aSopenharmony_ci    int sign_bits[16] = {0};
670cabdff1aSopenharmony_ci
671cabdff1aSopenharmony_ci    if (length == 0) {
672cabdff1aSopenharmony_ci        // If no data use noise
673cabdff1aSopenharmony_ci        for (sb=sb_min; sb < sb_max; sb++)
674cabdff1aSopenharmony_ci            build_sb_samples_from_noise(q, sb);
675cabdff1aSopenharmony_ci
676cabdff1aSopenharmony_ci        return 0;
677cabdff1aSopenharmony_ci    }
678cabdff1aSopenharmony_ci
679cabdff1aSopenharmony_ci    for (sb = sb_min; sb < sb_max; sb++) {
680cabdff1aSopenharmony_ci        channels = q->nb_channels;
681cabdff1aSopenharmony_ci
682cabdff1aSopenharmony_ci        if (q->nb_channels <= 1 || sb < 12)
683cabdff1aSopenharmony_ci            joined_stereo = 0;
684cabdff1aSopenharmony_ci        else if (sb >= 24)
685cabdff1aSopenharmony_ci            joined_stereo = 1;
686cabdff1aSopenharmony_ci        else
687cabdff1aSopenharmony_ci            joined_stereo = (get_bits_left(gb) >= 1) ? get_bits1(gb) : 0;
688cabdff1aSopenharmony_ci
689cabdff1aSopenharmony_ci        if (joined_stereo) {
690cabdff1aSopenharmony_ci            if (get_bits_left(gb) >= 16)
691cabdff1aSopenharmony_ci                for (j = 0; j < 16; j++)
692cabdff1aSopenharmony_ci                    sign_bits[j] = get_bits1(gb);
693cabdff1aSopenharmony_ci
694cabdff1aSopenharmony_ci            for (j = 0; j < 64; j++)
695cabdff1aSopenharmony_ci                if (q->coding_method[1][sb][j] > q->coding_method[0][sb][j])
696cabdff1aSopenharmony_ci                    q->coding_method[0][sb][j] = q->coding_method[1][sb][j];
697cabdff1aSopenharmony_ci
698cabdff1aSopenharmony_ci            if (fix_coding_method_array(sb, q->nb_channels,
699cabdff1aSopenharmony_ci                                            q->coding_method)) {
700cabdff1aSopenharmony_ci                av_log(NULL, AV_LOG_ERROR, "coding method invalid\n");
701cabdff1aSopenharmony_ci                build_sb_samples_from_noise(q, sb);
702cabdff1aSopenharmony_ci                continue;
703cabdff1aSopenharmony_ci            }
704cabdff1aSopenharmony_ci            channels = 1;
705cabdff1aSopenharmony_ci        }
706cabdff1aSopenharmony_ci
707cabdff1aSopenharmony_ci        for (ch = 0; ch < channels; ch++) {
708cabdff1aSopenharmony_ci            FIX_NOISE_IDX(q->noise_idx);
709cabdff1aSopenharmony_ci            zero_encoding = (get_bits_left(gb) >= 1) ? get_bits1(gb) : 0;
710cabdff1aSopenharmony_ci            type34_predictor = 0.0;
711cabdff1aSopenharmony_ci            type34_first = 1;
712cabdff1aSopenharmony_ci
713cabdff1aSopenharmony_ci            for (j = 0; j < 128; ) {
714cabdff1aSopenharmony_ci                switch (q->coding_method[ch][sb][j / 2]) {
715cabdff1aSopenharmony_ci                    case 8:
716cabdff1aSopenharmony_ci                        if (get_bits_left(gb) >= 10) {
717cabdff1aSopenharmony_ci                            if (zero_encoding) {
718cabdff1aSopenharmony_ci                                for (k = 0; k < 5; k++) {
719cabdff1aSopenharmony_ci                                    if ((j + 2 * k) >= 128)
720cabdff1aSopenharmony_ci                                        break;
721cabdff1aSopenharmony_ci                                    samples[2 * k] = get_bits1(gb) ? dequant_1bit[joined_stereo][2 * get_bits1(gb)] : 0;
722cabdff1aSopenharmony_ci                                }
723cabdff1aSopenharmony_ci                            } else {
724cabdff1aSopenharmony_ci                                n = get_bits(gb, 8);
725cabdff1aSopenharmony_ci                                if (n >= 243) {
726cabdff1aSopenharmony_ci                                    av_log(NULL, AV_LOG_ERROR, "Invalid 8bit codeword\n");
727cabdff1aSopenharmony_ci                                    return AVERROR_INVALIDDATA;
728cabdff1aSopenharmony_ci                                }
729cabdff1aSopenharmony_ci
730cabdff1aSopenharmony_ci                                for (k = 0; k < 5; k++)
731cabdff1aSopenharmony_ci                                    samples[2 * k] = dequant_1bit[joined_stereo][random_dequant_index[n][k]];
732cabdff1aSopenharmony_ci                            }
733cabdff1aSopenharmony_ci                            for (k = 0; k < 5; k++)
734cabdff1aSopenharmony_ci                                samples[2 * k + 1] = SB_DITHERING_NOISE(sb,q->noise_idx);
735cabdff1aSopenharmony_ci                        } else {
736cabdff1aSopenharmony_ci                            for (k = 0; k < 10; k++)
737cabdff1aSopenharmony_ci                                samples[k] = SB_DITHERING_NOISE(sb,q->noise_idx);
738cabdff1aSopenharmony_ci                        }
739cabdff1aSopenharmony_ci                        run = 10;
740cabdff1aSopenharmony_ci                        break;
741cabdff1aSopenharmony_ci
742cabdff1aSopenharmony_ci                    case 10:
743cabdff1aSopenharmony_ci                        if (get_bits_left(gb) >= 1) {
744cabdff1aSopenharmony_ci                            float f = 0.81;
745cabdff1aSopenharmony_ci
746cabdff1aSopenharmony_ci                            if (get_bits1(gb))
747cabdff1aSopenharmony_ci                                f = -f;
748cabdff1aSopenharmony_ci                            f -= noise_samples[((sb + 1) * (j +5 * ch + 1)) & 127] * 9.0 / 40.0;
749cabdff1aSopenharmony_ci                            samples[0] = f;
750cabdff1aSopenharmony_ci                        } else {
751cabdff1aSopenharmony_ci                            samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);
752cabdff1aSopenharmony_ci                        }
753cabdff1aSopenharmony_ci                        run = 1;
754cabdff1aSopenharmony_ci                        break;
755cabdff1aSopenharmony_ci
756cabdff1aSopenharmony_ci                    case 16:
757cabdff1aSopenharmony_ci                        if (get_bits_left(gb) >= 10) {
758cabdff1aSopenharmony_ci                            if (zero_encoding) {
759cabdff1aSopenharmony_ci                                for (k = 0; k < 5; k++) {
760cabdff1aSopenharmony_ci                                    if ((j + k) >= 128)
761cabdff1aSopenharmony_ci                                        break;
762cabdff1aSopenharmony_ci                                    samples[k] = (get_bits1(gb) == 0) ? 0 : dequant_1bit[joined_stereo][2 * get_bits1(gb)];
763cabdff1aSopenharmony_ci                                }
764cabdff1aSopenharmony_ci                            } else {
765cabdff1aSopenharmony_ci                                n = get_bits (gb, 8);
766cabdff1aSopenharmony_ci                                if (n >= 243) {
767cabdff1aSopenharmony_ci                                    av_log(NULL, AV_LOG_ERROR, "Invalid 8bit codeword\n");
768cabdff1aSopenharmony_ci                                    return AVERROR_INVALIDDATA;
769cabdff1aSopenharmony_ci                                }
770cabdff1aSopenharmony_ci
771cabdff1aSopenharmony_ci                                for (k = 0; k < 5; k++)
772cabdff1aSopenharmony_ci                                    samples[k] = dequant_1bit[joined_stereo][random_dequant_index[n][k]];
773cabdff1aSopenharmony_ci                            }
774cabdff1aSopenharmony_ci                        } else {
775cabdff1aSopenharmony_ci                            for (k = 0; k < 5; k++)
776cabdff1aSopenharmony_ci                                samples[k] = SB_DITHERING_NOISE(sb,q->noise_idx);
777cabdff1aSopenharmony_ci                        }
778cabdff1aSopenharmony_ci                        run = 5;
779cabdff1aSopenharmony_ci                        break;
780cabdff1aSopenharmony_ci
781cabdff1aSopenharmony_ci                    case 24:
782cabdff1aSopenharmony_ci                        if (get_bits_left(gb) >= 7) {
783cabdff1aSopenharmony_ci                            n = get_bits(gb, 7);
784cabdff1aSopenharmony_ci                            if (n >= 125) {
785cabdff1aSopenharmony_ci                                av_log(NULL, AV_LOG_ERROR, "Invalid 7bit codeword\n");
786cabdff1aSopenharmony_ci                                return AVERROR_INVALIDDATA;
787cabdff1aSopenharmony_ci                            }
788cabdff1aSopenharmony_ci
789cabdff1aSopenharmony_ci                            for (k = 0; k < 3; k++)
790cabdff1aSopenharmony_ci                                samples[k] = (random_dequant_type24[n][k] - 2.0) * 0.5;
791cabdff1aSopenharmony_ci                        } else {
792cabdff1aSopenharmony_ci                            for (k = 0; k < 3; k++)
793cabdff1aSopenharmony_ci                                samples[k] = SB_DITHERING_NOISE(sb,q->noise_idx);
794cabdff1aSopenharmony_ci                        }
795cabdff1aSopenharmony_ci                        run = 3;
796cabdff1aSopenharmony_ci                        break;
797cabdff1aSopenharmony_ci
798cabdff1aSopenharmony_ci                    case 30:
799cabdff1aSopenharmony_ci                        if (get_bits_left(gb) >= 4) {
800cabdff1aSopenharmony_ci                            unsigned index = qdm2_get_vlc(gb, &vlc_tab_type30, 0, 1);
801cabdff1aSopenharmony_ci                            if (index >= FF_ARRAY_ELEMS(type30_dequant)) {
802cabdff1aSopenharmony_ci                                av_log(NULL, AV_LOG_ERROR, "index %d out of type30_dequant array\n", index);
803cabdff1aSopenharmony_ci                                return AVERROR_INVALIDDATA;
804cabdff1aSopenharmony_ci                            }
805cabdff1aSopenharmony_ci                            samples[0] = type30_dequant[index];
806cabdff1aSopenharmony_ci                        } else
807cabdff1aSopenharmony_ci                            samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);
808cabdff1aSopenharmony_ci
809cabdff1aSopenharmony_ci                        run = 1;
810cabdff1aSopenharmony_ci                        break;
811cabdff1aSopenharmony_ci
812cabdff1aSopenharmony_ci                    case 34:
813cabdff1aSopenharmony_ci                        if (get_bits_left(gb) >= 7) {
814cabdff1aSopenharmony_ci                            if (type34_first) {
815cabdff1aSopenharmony_ci                                type34_div = (float)(1 << get_bits(gb, 2));
816cabdff1aSopenharmony_ci                                samples[0] = ((float)get_bits(gb, 5) - 16.0) / 15.0;
817cabdff1aSopenharmony_ci                                type34_predictor = samples[0];
818cabdff1aSopenharmony_ci                                type34_first = 0;
819cabdff1aSopenharmony_ci                            } else {
820cabdff1aSopenharmony_ci                                unsigned index = qdm2_get_vlc(gb, &vlc_tab_type34, 0, 1);
821cabdff1aSopenharmony_ci                                if (index >= FF_ARRAY_ELEMS(type34_delta)) {
822cabdff1aSopenharmony_ci                                    av_log(NULL, AV_LOG_ERROR, "index %d out of type34_delta array\n", index);
823cabdff1aSopenharmony_ci                                    return AVERROR_INVALIDDATA;
824cabdff1aSopenharmony_ci                                }
825cabdff1aSopenharmony_ci                                samples[0] = type34_delta[index] / type34_div + type34_predictor;
826cabdff1aSopenharmony_ci                                type34_predictor = samples[0];
827cabdff1aSopenharmony_ci                            }
828cabdff1aSopenharmony_ci                        } else {
829cabdff1aSopenharmony_ci                            samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);
830cabdff1aSopenharmony_ci                        }
831cabdff1aSopenharmony_ci                        run = 1;
832cabdff1aSopenharmony_ci                        break;
833cabdff1aSopenharmony_ci
834cabdff1aSopenharmony_ci                    default:
835cabdff1aSopenharmony_ci                        samples[0] = SB_DITHERING_NOISE(sb,q->noise_idx);
836cabdff1aSopenharmony_ci                        run = 1;
837cabdff1aSopenharmony_ci                        break;
838cabdff1aSopenharmony_ci                }
839cabdff1aSopenharmony_ci
840cabdff1aSopenharmony_ci                if (joined_stereo) {
841cabdff1aSopenharmony_ci                    for (k = 0; k < run && j + k < 128; k++) {
842cabdff1aSopenharmony_ci                        q->sb_samples[0][j + k][sb] =
843cabdff1aSopenharmony_ci                            q->tone_level[0][sb][(j + k) / 2] * samples[k];
844cabdff1aSopenharmony_ci                        if (q->nb_channels == 2) {
845cabdff1aSopenharmony_ci                            if (sign_bits[(j + k) / 8])
846cabdff1aSopenharmony_ci                                q->sb_samples[1][j + k][sb] =
847cabdff1aSopenharmony_ci                                    q->tone_level[1][sb][(j + k) / 2] * -samples[k];
848cabdff1aSopenharmony_ci                            else
849cabdff1aSopenharmony_ci                                q->sb_samples[1][j + k][sb] =
850cabdff1aSopenharmony_ci                                    q->tone_level[1][sb][(j + k) / 2] * samples[k];
851cabdff1aSopenharmony_ci                        }
852cabdff1aSopenharmony_ci                    }
853cabdff1aSopenharmony_ci                } else {
854cabdff1aSopenharmony_ci                    for (k = 0; k < run; k++)
855cabdff1aSopenharmony_ci                        if ((j + k) < 128)
856cabdff1aSopenharmony_ci                            q->sb_samples[ch][j + k][sb] = q->tone_level[ch][sb][(j + k)/2] * samples[k];
857cabdff1aSopenharmony_ci                }
858cabdff1aSopenharmony_ci
859cabdff1aSopenharmony_ci                j += run;
860cabdff1aSopenharmony_ci            } // j loop
861cabdff1aSopenharmony_ci        } // channel loop
862cabdff1aSopenharmony_ci    } // subband loop
863cabdff1aSopenharmony_ci    return 0;
864cabdff1aSopenharmony_ci}
865cabdff1aSopenharmony_ci
866cabdff1aSopenharmony_ci/**
867cabdff1aSopenharmony_ci * Init the first element of a channel in quantized_coeffs with data
868cabdff1aSopenharmony_ci * from packet 10 (quantized_coeffs[ch][0]).
869cabdff1aSopenharmony_ci * This is similar to process_subpacket_9, but for a single channel
870cabdff1aSopenharmony_ci * and for element [0]
871cabdff1aSopenharmony_ci * same VLC tables as process_subpacket_9 are used.
872cabdff1aSopenharmony_ci *
873cabdff1aSopenharmony_ci * @param quantized_coeffs    pointer to quantized_coeffs[ch][0]
874cabdff1aSopenharmony_ci * @param gb        bitreader context
875cabdff1aSopenharmony_ci */
876cabdff1aSopenharmony_cistatic int init_quantized_coeffs_elem0(int8_t *quantized_coeffs,
877cabdff1aSopenharmony_ci                                        GetBitContext *gb)
878cabdff1aSopenharmony_ci{
879cabdff1aSopenharmony_ci    int i, k, run, level, diff;
880cabdff1aSopenharmony_ci
881cabdff1aSopenharmony_ci    if (get_bits_left(gb) < 16)
882cabdff1aSopenharmony_ci        return -1;
883cabdff1aSopenharmony_ci    level = qdm2_get_vlc(gb, &vlc_tab_level, 0, 2);
884cabdff1aSopenharmony_ci
885cabdff1aSopenharmony_ci    quantized_coeffs[0] = level;
886cabdff1aSopenharmony_ci
887cabdff1aSopenharmony_ci    for (i = 0; i < 7; ) {
888cabdff1aSopenharmony_ci        if (get_bits_left(gb) < 16)
889cabdff1aSopenharmony_ci            return -1;
890cabdff1aSopenharmony_ci        run = qdm2_get_vlc(gb, &vlc_tab_run, 0, 1) + 1;
891cabdff1aSopenharmony_ci
892cabdff1aSopenharmony_ci        if (i + run >= 8)
893cabdff1aSopenharmony_ci            return -1;
894cabdff1aSopenharmony_ci
895cabdff1aSopenharmony_ci        if (get_bits_left(gb) < 16)
896cabdff1aSopenharmony_ci            return -1;
897cabdff1aSopenharmony_ci        diff = qdm2_get_se_vlc(&vlc_tab_diff, gb, 2);
898cabdff1aSopenharmony_ci
899cabdff1aSopenharmony_ci        for (k = 1; k <= run; k++)
900cabdff1aSopenharmony_ci            quantized_coeffs[i + k] = (level + ((k * diff) / run));
901cabdff1aSopenharmony_ci
902cabdff1aSopenharmony_ci        level += diff;
903cabdff1aSopenharmony_ci        i += run;
904cabdff1aSopenharmony_ci    }
905cabdff1aSopenharmony_ci    return 0;
906cabdff1aSopenharmony_ci}
907cabdff1aSopenharmony_ci
908cabdff1aSopenharmony_ci/**
909cabdff1aSopenharmony_ci * Related to synthesis filter, process data from packet 10
910cabdff1aSopenharmony_ci * Init part of quantized_coeffs via function init_quantized_coeffs_elem0
911cabdff1aSopenharmony_ci * Init tone_level_idx_hi1, tone_level_idx_hi2, tone_level_idx_mid with
912cabdff1aSopenharmony_ci * data from packet 10
913cabdff1aSopenharmony_ci *
914cabdff1aSopenharmony_ci * @param q         context
915cabdff1aSopenharmony_ci * @param gb        bitreader context
916cabdff1aSopenharmony_ci */
917cabdff1aSopenharmony_cistatic void init_tone_level_dequantization(QDM2Context *q, GetBitContext *gb)
918cabdff1aSopenharmony_ci{
919cabdff1aSopenharmony_ci    int sb, j, k, n, ch;
920cabdff1aSopenharmony_ci
921cabdff1aSopenharmony_ci    for (ch = 0; ch < q->nb_channels; ch++) {
922cabdff1aSopenharmony_ci        init_quantized_coeffs_elem0(q->quantized_coeffs[ch][0], gb);
923cabdff1aSopenharmony_ci
924cabdff1aSopenharmony_ci        if (get_bits_left(gb) < 16) {
925cabdff1aSopenharmony_ci            memset(q->quantized_coeffs[ch][0], 0, 8);
926cabdff1aSopenharmony_ci            break;
927cabdff1aSopenharmony_ci        }
928cabdff1aSopenharmony_ci    }
929cabdff1aSopenharmony_ci
930cabdff1aSopenharmony_ci    n = q->sub_sampling + 1;
931cabdff1aSopenharmony_ci
932cabdff1aSopenharmony_ci    for (sb = 0; sb < n; sb++)
933cabdff1aSopenharmony_ci        for (ch = 0; ch < q->nb_channels; ch++)
934cabdff1aSopenharmony_ci            for (j = 0; j < 8; j++) {
935cabdff1aSopenharmony_ci                if (get_bits_left(gb) < 1)
936cabdff1aSopenharmony_ci                    break;
937cabdff1aSopenharmony_ci                if (get_bits1(gb)) {
938cabdff1aSopenharmony_ci                    for (k=0; k < 8; k++) {
939cabdff1aSopenharmony_ci                        if (get_bits_left(gb) < 16)
940cabdff1aSopenharmony_ci                            break;
941cabdff1aSopenharmony_ci                        q->tone_level_idx_hi1[ch][sb][j][k] = qdm2_get_vlc(gb, &vlc_tab_tone_level_idx_hi1, 0, 2);
942cabdff1aSopenharmony_ci                    }
943cabdff1aSopenharmony_ci                } else {
944cabdff1aSopenharmony_ci                    for (k=0; k < 8; k++)
945cabdff1aSopenharmony_ci                        q->tone_level_idx_hi1[ch][sb][j][k] = 0;
946cabdff1aSopenharmony_ci                }
947cabdff1aSopenharmony_ci            }
948cabdff1aSopenharmony_ci
949cabdff1aSopenharmony_ci    n = QDM2_SB_USED(q->sub_sampling) - 4;
950cabdff1aSopenharmony_ci
951cabdff1aSopenharmony_ci    for (sb = 0; sb < n; sb++)
952cabdff1aSopenharmony_ci        for (ch = 0; ch < q->nb_channels; ch++) {
953cabdff1aSopenharmony_ci            if (get_bits_left(gb) < 16)
954cabdff1aSopenharmony_ci                break;
955cabdff1aSopenharmony_ci            q->tone_level_idx_hi2[ch][sb] = qdm2_get_vlc(gb, &vlc_tab_tone_level_idx_hi2, 0, 2);
956cabdff1aSopenharmony_ci            if (sb > 19)
957cabdff1aSopenharmony_ci                q->tone_level_idx_hi2[ch][sb] -= 16;
958cabdff1aSopenharmony_ci            else
959cabdff1aSopenharmony_ci                for (j = 0; j < 8; j++)
960cabdff1aSopenharmony_ci                    q->tone_level_idx_mid[ch][sb][j] = -16;
961cabdff1aSopenharmony_ci        }
962cabdff1aSopenharmony_ci
963cabdff1aSopenharmony_ci    n = QDM2_SB_USED(q->sub_sampling) - 5;
964cabdff1aSopenharmony_ci
965cabdff1aSopenharmony_ci    for (sb = 0; sb < n; sb++)
966cabdff1aSopenharmony_ci        for (ch = 0; ch < q->nb_channels; ch++)
967cabdff1aSopenharmony_ci            for (j = 0; j < 8; j++) {
968cabdff1aSopenharmony_ci                if (get_bits_left(gb) < 16)
969cabdff1aSopenharmony_ci                    break;
970cabdff1aSopenharmony_ci                q->tone_level_idx_mid[ch][sb][j] = qdm2_get_vlc(gb, &vlc_tab_tone_level_idx_mid, 0, 2) - 32;
971cabdff1aSopenharmony_ci            }
972cabdff1aSopenharmony_ci}
973cabdff1aSopenharmony_ci
974cabdff1aSopenharmony_ci/**
975cabdff1aSopenharmony_ci * Process subpacket 9, init quantized_coeffs with data from it
976cabdff1aSopenharmony_ci *
977cabdff1aSopenharmony_ci * @param q       context
978cabdff1aSopenharmony_ci * @param node    pointer to node with packet
979cabdff1aSopenharmony_ci */
980cabdff1aSopenharmony_cistatic int process_subpacket_9(QDM2Context *q, QDM2SubPNode *node)
981cabdff1aSopenharmony_ci{
982cabdff1aSopenharmony_ci    GetBitContext gb;
983cabdff1aSopenharmony_ci    int i, j, k, n, ch, run, level, diff;
984cabdff1aSopenharmony_ci
985cabdff1aSopenharmony_ci    init_get_bits(&gb, node->packet->data, node->packet->size * 8);
986cabdff1aSopenharmony_ci
987cabdff1aSopenharmony_ci    n = coeff_per_sb_for_avg[q->coeff_per_sb_select][QDM2_SB_USED(q->sub_sampling) - 1] + 1;
988cabdff1aSopenharmony_ci
989cabdff1aSopenharmony_ci    for (i = 1; i < n; i++)
990cabdff1aSopenharmony_ci        for (ch = 0; ch < q->nb_channels; ch++) {
991cabdff1aSopenharmony_ci            level = qdm2_get_vlc(&gb, &vlc_tab_level, 0, 2);
992cabdff1aSopenharmony_ci            q->quantized_coeffs[ch][i][0] = level;
993cabdff1aSopenharmony_ci
994cabdff1aSopenharmony_ci            for (j = 0; j < (8 - 1); ) {
995cabdff1aSopenharmony_ci                run  = qdm2_get_vlc(&gb, &vlc_tab_run, 0, 1) + 1;
996cabdff1aSopenharmony_ci                diff = qdm2_get_se_vlc(&vlc_tab_diff, &gb, 2);
997cabdff1aSopenharmony_ci
998cabdff1aSopenharmony_ci                if (j + run >= 8)
999cabdff1aSopenharmony_ci                    return -1;
1000cabdff1aSopenharmony_ci
1001cabdff1aSopenharmony_ci                for (k = 1; k <= run; k++)
1002cabdff1aSopenharmony_ci                    q->quantized_coeffs[ch][i][j + k] = (level + ((k * diff) / run));
1003cabdff1aSopenharmony_ci
1004cabdff1aSopenharmony_ci                level += diff;
1005cabdff1aSopenharmony_ci                j     += run;
1006cabdff1aSopenharmony_ci            }
1007cabdff1aSopenharmony_ci        }
1008cabdff1aSopenharmony_ci
1009cabdff1aSopenharmony_ci    for (ch = 0; ch < q->nb_channels; ch++)
1010cabdff1aSopenharmony_ci        for (i = 0; i < 8; i++)
1011cabdff1aSopenharmony_ci            q->quantized_coeffs[ch][0][i] = 0;
1012cabdff1aSopenharmony_ci
1013cabdff1aSopenharmony_ci    return 0;
1014cabdff1aSopenharmony_ci}
1015cabdff1aSopenharmony_ci
1016cabdff1aSopenharmony_ci/**
1017cabdff1aSopenharmony_ci * Process subpacket 10 if not null, else
1018cabdff1aSopenharmony_ci *
1019cabdff1aSopenharmony_ci * @param q         context
1020cabdff1aSopenharmony_ci * @param node      pointer to node with packet
1021cabdff1aSopenharmony_ci */
1022cabdff1aSopenharmony_cistatic void process_subpacket_10(QDM2Context *q, QDM2SubPNode *node)
1023cabdff1aSopenharmony_ci{
1024cabdff1aSopenharmony_ci    GetBitContext gb;
1025cabdff1aSopenharmony_ci
1026cabdff1aSopenharmony_ci    if (node) {
1027cabdff1aSopenharmony_ci        init_get_bits(&gb, node->packet->data, node->packet->size * 8);
1028cabdff1aSopenharmony_ci        init_tone_level_dequantization(q, &gb);
1029cabdff1aSopenharmony_ci        fill_tone_level_array(q, 1);
1030cabdff1aSopenharmony_ci    } else {
1031cabdff1aSopenharmony_ci        fill_tone_level_array(q, 0);
1032cabdff1aSopenharmony_ci    }
1033cabdff1aSopenharmony_ci}
1034cabdff1aSopenharmony_ci
1035cabdff1aSopenharmony_ci/**
1036cabdff1aSopenharmony_ci * Process subpacket 11
1037cabdff1aSopenharmony_ci *
1038cabdff1aSopenharmony_ci * @param q         context
1039cabdff1aSopenharmony_ci * @param node      pointer to node with packet
1040cabdff1aSopenharmony_ci */
1041cabdff1aSopenharmony_cistatic void process_subpacket_11(QDM2Context *q, QDM2SubPNode *node)
1042cabdff1aSopenharmony_ci{
1043cabdff1aSopenharmony_ci    GetBitContext gb;
1044cabdff1aSopenharmony_ci    int length = 0;
1045cabdff1aSopenharmony_ci
1046cabdff1aSopenharmony_ci    if (node) {
1047cabdff1aSopenharmony_ci        length = node->packet->size * 8;
1048cabdff1aSopenharmony_ci        init_get_bits(&gb, node->packet->data, length);
1049cabdff1aSopenharmony_ci    }
1050cabdff1aSopenharmony_ci
1051cabdff1aSopenharmony_ci    if (length >= 32) {
1052cabdff1aSopenharmony_ci        int c = get_bits(&gb, 13);
1053cabdff1aSopenharmony_ci
1054cabdff1aSopenharmony_ci        if (c > 3)
1055cabdff1aSopenharmony_ci            fill_coding_method_array(q->tone_level_idx,
1056cabdff1aSopenharmony_ci                                     q->tone_level_idx_temp, q->coding_method,
1057cabdff1aSopenharmony_ci                                     q->nb_channels, 8 * c,
1058cabdff1aSopenharmony_ci                                     q->superblocktype_2_3, q->cm_table_select);
1059cabdff1aSopenharmony_ci    }
1060cabdff1aSopenharmony_ci
1061cabdff1aSopenharmony_ci    synthfilt_build_sb_samples(q, &gb, length, 0, 8);
1062cabdff1aSopenharmony_ci}
1063cabdff1aSopenharmony_ci
1064cabdff1aSopenharmony_ci/**
1065cabdff1aSopenharmony_ci * Process subpacket 12
1066cabdff1aSopenharmony_ci *
1067cabdff1aSopenharmony_ci * @param q         context
1068cabdff1aSopenharmony_ci * @param node      pointer to node with packet
1069cabdff1aSopenharmony_ci */
1070cabdff1aSopenharmony_cistatic void process_subpacket_12(QDM2Context *q, QDM2SubPNode *node)
1071cabdff1aSopenharmony_ci{
1072cabdff1aSopenharmony_ci    GetBitContext gb;
1073cabdff1aSopenharmony_ci    int length = 0;
1074cabdff1aSopenharmony_ci
1075cabdff1aSopenharmony_ci    if (node) {
1076cabdff1aSopenharmony_ci        length = node->packet->size * 8;
1077cabdff1aSopenharmony_ci        init_get_bits(&gb, node->packet->data, length);
1078cabdff1aSopenharmony_ci    }
1079cabdff1aSopenharmony_ci
1080cabdff1aSopenharmony_ci    synthfilt_build_sb_samples(q, &gb, length, 8, QDM2_SB_USED(q->sub_sampling));
1081cabdff1aSopenharmony_ci}
1082cabdff1aSopenharmony_ci
1083cabdff1aSopenharmony_ci/**
1084cabdff1aSopenharmony_ci * Process new subpackets for synthesis filter
1085cabdff1aSopenharmony_ci *
1086cabdff1aSopenharmony_ci * @param q       context
1087cabdff1aSopenharmony_ci * @param list    list with synthesis filter packets (list D)
1088cabdff1aSopenharmony_ci */
1089cabdff1aSopenharmony_cistatic void process_synthesis_subpackets(QDM2Context *q, QDM2SubPNode *list)
1090cabdff1aSopenharmony_ci{
1091cabdff1aSopenharmony_ci    QDM2SubPNode *nodes[4];
1092cabdff1aSopenharmony_ci
1093cabdff1aSopenharmony_ci    nodes[0] = qdm2_search_subpacket_type_in_list(list, 9);
1094cabdff1aSopenharmony_ci    if (nodes[0])
1095cabdff1aSopenharmony_ci        process_subpacket_9(q, nodes[0]);
1096cabdff1aSopenharmony_ci
1097cabdff1aSopenharmony_ci    nodes[1] = qdm2_search_subpacket_type_in_list(list, 10);
1098cabdff1aSopenharmony_ci    if (nodes[1])
1099cabdff1aSopenharmony_ci        process_subpacket_10(q, nodes[1]);
1100cabdff1aSopenharmony_ci    else
1101cabdff1aSopenharmony_ci        process_subpacket_10(q, NULL);
1102cabdff1aSopenharmony_ci
1103cabdff1aSopenharmony_ci    nodes[2] = qdm2_search_subpacket_type_in_list(list, 11);
1104cabdff1aSopenharmony_ci    if (nodes[0] && nodes[1] && nodes[2])
1105cabdff1aSopenharmony_ci        process_subpacket_11(q, nodes[2]);
1106cabdff1aSopenharmony_ci    else
1107cabdff1aSopenharmony_ci        process_subpacket_11(q, NULL);
1108cabdff1aSopenharmony_ci
1109cabdff1aSopenharmony_ci    nodes[3] = qdm2_search_subpacket_type_in_list(list, 12);
1110cabdff1aSopenharmony_ci    if (nodes[0] && nodes[1] && nodes[3])
1111cabdff1aSopenharmony_ci        process_subpacket_12(q, nodes[3]);
1112cabdff1aSopenharmony_ci    else
1113cabdff1aSopenharmony_ci        process_subpacket_12(q, NULL);
1114cabdff1aSopenharmony_ci}
1115cabdff1aSopenharmony_ci
1116cabdff1aSopenharmony_ci/**
1117cabdff1aSopenharmony_ci * Decode superblock, fill packet lists.
1118cabdff1aSopenharmony_ci *
1119cabdff1aSopenharmony_ci * @param q    context
1120cabdff1aSopenharmony_ci */
1121cabdff1aSopenharmony_cistatic void qdm2_decode_super_block(QDM2Context *q)
1122cabdff1aSopenharmony_ci{
1123cabdff1aSopenharmony_ci    GetBitContext gb;
1124cabdff1aSopenharmony_ci    QDM2SubPacket header, *packet;
1125cabdff1aSopenharmony_ci    int i, packet_bytes, sub_packet_size, sub_packets_D;
1126cabdff1aSopenharmony_ci    unsigned int next_index = 0;
1127cabdff1aSopenharmony_ci
1128cabdff1aSopenharmony_ci    memset(q->tone_level_idx_hi1, 0, sizeof(q->tone_level_idx_hi1));
1129cabdff1aSopenharmony_ci    memset(q->tone_level_idx_mid, 0, sizeof(q->tone_level_idx_mid));
1130cabdff1aSopenharmony_ci    memset(q->tone_level_idx_hi2, 0, sizeof(q->tone_level_idx_hi2));
1131cabdff1aSopenharmony_ci
1132cabdff1aSopenharmony_ci    q->sub_packets_B = 0;
1133cabdff1aSopenharmony_ci    sub_packets_D    = 0;
1134cabdff1aSopenharmony_ci
1135cabdff1aSopenharmony_ci    average_quantized_coeffs(q); // average elements in quantized_coeffs[max_ch][10][8]
1136cabdff1aSopenharmony_ci
1137cabdff1aSopenharmony_ci    init_get_bits(&gb, q->compressed_data, q->compressed_size * 8);
1138cabdff1aSopenharmony_ci    qdm2_decode_sub_packet_header(&gb, &header);
1139cabdff1aSopenharmony_ci
1140cabdff1aSopenharmony_ci    if (header.type < 2 || header.type >= 8) {
1141cabdff1aSopenharmony_ci        q->has_errors = 1;
1142cabdff1aSopenharmony_ci        av_log(NULL, AV_LOG_ERROR, "bad superblock type\n");
1143cabdff1aSopenharmony_ci        return;
1144cabdff1aSopenharmony_ci    }
1145cabdff1aSopenharmony_ci
1146cabdff1aSopenharmony_ci    q->superblocktype_2_3 = (header.type == 2 || header.type == 3);
1147cabdff1aSopenharmony_ci    packet_bytes          = (q->compressed_size - get_bits_count(&gb) / 8);
1148cabdff1aSopenharmony_ci
1149cabdff1aSopenharmony_ci    init_get_bits(&gb, header.data, header.size * 8);
1150cabdff1aSopenharmony_ci
1151cabdff1aSopenharmony_ci    if (header.type == 2 || header.type == 4 || header.type == 5) {
1152cabdff1aSopenharmony_ci        int csum = 257 * get_bits(&gb, 8);
1153cabdff1aSopenharmony_ci        csum += 2 * get_bits(&gb, 8);
1154cabdff1aSopenharmony_ci
1155cabdff1aSopenharmony_ci        csum = qdm2_packet_checksum(q->compressed_data, q->checksum_size, csum);
1156cabdff1aSopenharmony_ci
1157cabdff1aSopenharmony_ci        if (csum != 0) {
1158cabdff1aSopenharmony_ci            q->has_errors = 1;
1159cabdff1aSopenharmony_ci            av_log(NULL, AV_LOG_ERROR, "bad packet checksum\n");
1160cabdff1aSopenharmony_ci            return;
1161cabdff1aSopenharmony_ci        }
1162cabdff1aSopenharmony_ci    }
1163cabdff1aSopenharmony_ci
1164cabdff1aSopenharmony_ci    q->sub_packet_list_B[0].packet = NULL;
1165cabdff1aSopenharmony_ci    q->sub_packet_list_D[0].packet = NULL;
1166cabdff1aSopenharmony_ci
1167cabdff1aSopenharmony_ci    for (i = 0; i < 6; i++)
1168cabdff1aSopenharmony_ci        if (--q->fft_level_exp[i] < 0)
1169cabdff1aSopenharmony_ci            q->fft_level_exp[i] = 0;
1170cabdff1aSopenharmony_ci
1171cabdff1aSopenharmony_ci    for (i = 0; packet_bytes > 0; i++) {
1172cabdff1aSopenharmony_ci        int j;
1173cabdff1aSopenharmony_ci
1174cabdff1aSopenharmony_ci        if (i >= FF_ARRAY_ELEMS(q->sub_packet_list_A)) {
1175cabdff1aSopenharmony_ci            SAMPLES_NEEDED_2("too many packet bytes");
1176cabdff1aSopenharmony_ci            return;
1177cabdff1aSopenharmony_ci        }
1178cabdff1aSopenharmony_ci
1179cabdff1aSopenharmony_ci        q->sub_packet_list_A[i].next = NULL;
1180cabdff1aSopenharmony_ci
1181cabdff1aSopenharmony_ci        if (i > 0) {
1182cabdff1aSopenharmony_ci            q->sub_packet_list_A[i - 1].next = &q->sub_packet_list_A[i];
1183cabdff1aSopenharmony_ci
1184cabdff1aSopenharmony_ci            /* seek to next block */
1185cabdff1aSopenharmony_ci            init_get_bits(&gb, header.data, header.size * 8);
1186cabdff1aSopenharmony_ci            skip_bits(&gb, next_index * 8);
1187cabdff1aSopenharmony_ci
1188cabdff1aSopenharmony_ci            if (next_index >= header.size)
1189cabdff1aSopenharmony_ci                break;
1190cabdff1aSopenharmony_ci        }
1191cabdff1aSopenharmony_ci
1192cabdff1aSopenharmony_ci        /* decode subpacket */
1193cabdff1aSopenharmony_ci        packet = &q->sub_packets[i];
1194cabdff1aSopenharmony_ci        qdm2_decode_sub_packet_header(&gb, packet);
1195cabdff1aSopenharmony_ci        next_index      = packet->size + get_bits_count(&gb) / 8;
1196cabdff1aSopenharmony_ci        sub_packet_size = ((packet->size > 0xff) ? 1 : 0) + packet->size + 2;
1197cabdff1aSopenharmony_ci
1198cabdff1aSopenharmony_ci        if (packet->type == 0)
1199cabdff1aSopenharmony_ci            break;
1200cabdff1aSopenharmony_ci
1201cabdff1aSopenharmony_ci        if (sub_packet_size > packet_bytes) {
1202cabdff1aSopenharmony_ci            if (packet->type != 10 && packet->type != 11 && packet->type != 12)
1203cabdff1aSopenharmony_ci                break;
1204cabdff1aSopenharmony_ci            packet->size += packet_bytes - sub_packet_size;
1205cabdff1aSopenharmony_ci        }
1206cabdff1aSopenharmony_ci
1207cabdff1aSopenharmony_ci        packet_bytes -= sub_packet_size;
1208cabdff1aSopenharmony_ci
1209cabdff1aSopenharmony_ci        /* add subpacket to 'all subpackets' list */
1210cabdff1aSopenharmony_ci        q->sub_packet_list_A[i].packet = packet;
1211cabdff1aSopenharmony_ci
1212cabdff1aSopenharmony_ci        /* add subpacket to related list */
1213cabdff1aSopenharmony_ci        if (packet->type == 8) {
1214cabdff1aSopenharmony_ci            SAMPLES_NEEDED_2("packet type 8");
1215cabdff1aSopenharmony_ci            return;
1216cabdff1aSopenharmony_ci        } else if (packet->type >= 9 && packet->type <= 12) {
1217cabdff1aSopenharmony_ci            /* packets for MPEG Audio like Synthesis Filter */
1218cabdff1aSopenharmony_ci            QDM2_LIST_ADD(q->sub_packet_list_D, sub_packets_D, packet);
1219cabdff1aSopenharmony_ci        } else if (packet->type == 13) {
1220cabdff1aSopenharmony_ci            for (j = 0; j < 6; j++)
1221cabdff1aSopenharmony_ci                q->fft_level_exp[j] = get_bits(&gb, 6);
1222cabdff1aSopenharmony_ci        } else if (packet->type == 14) {
1223cabdff1aSopenharmony_ci            for (j = 0; j < 6; j++)
1224cabdff1aSopenharmony_ci                q->fft_level_exp[j] = qdm2_get_vlc(&gb, &fft_level_exp_vlc, 0, 2);
1225cabdff1aSopenharmony_ci        } else if (packet->type == 15) {
1226cabdff1aSopenharmony_ci            SAMPLES_NEEDED_2("packet type 15")
1227cabdff1aSopenharmony_ci            return;
1228cabdff1aSopenharmony_ci        } else if (packet->type >= 16 && packet->type < 48 &&
1229cabdff1aSopenharmony_ci                   !fft_subpackets[packet->type - 16]) {
1230cabdff1aSopenharmony_ci            /* packets for FFT */
1231cabdff1aSopenharmony_ci            QDM2_LIST_ADD(q->sub_packet_list_B, q->sub_packets_B, packet);
1232cabdff1aSopenharmony_ci        }
1233cabdff1aSopenharmony_ci    } // Packet bytes loop
1234cabdff1aSopenharmony_ci
1235cabdff1aSopenharmony_ci    if (q->sub_packet_list_D[0].packet) {
1236cabdff1aSopenharmony_ci        process_synthesis_subpackets(q, q->sub_packet_list_D);
1237cabdff1aSopenharmony_ci        q->do_synth_filter = 1;
1238cabdff1aSopenharmony_ci    } else if (q->do_synth_filter) {
1239cabdff1aSopenharmony_ci        process_subpacket_10(q, NULL);
1240cabdff1aSopenharmony_ci        process_subpacket_11(q, NULL);
1241cabdff1aSopenharmony_ci        process_subpacket_12(q, NULL);
1242cabdff1aSopenharmony_ci    }
1243cabdff1aSopenharmony_ci}
1244cabdff1aSopenharmony_ci
1245cabdff1aSopenharmony_cistatic void qdm2_fft_init_coefficient(QDM2Context *q, int sub_packet,
1246cabdff1aSopenharmony_ci                                      int offset, int duration, int channel,
1247cabdff1aSopenharmony_ci                                      int exp, int phase)
1248cabdff1aSopenharmony_ci{
1249cabdff1aSopenharmony_ci    if (q->fft_coefs_min_index[duration] < 0)
1250cabdff1aSopenharmony_ci        q->fft_coefs_min_index[duration] = q->fft_coefs_index;
1251cabdff1aSopenharmony_ci
1252cabdff1aSopenharmony_ci    q->fft_coefs[q->fft_coefs_index].sub_packet =
1253cabdff1aSopenharmony_ci        ((sub_packet >= 16) ? (sub_packet - 16) : sub_packet);
1254cabdff1aSopenharmony_ci    q->fft_coefs[q->fft_coefs_index].channel = channel;
1255cabdff1aSopenharmony_ci    q->fft_coefs[q->fft_coefs_index].offset  = offset;
1256cabdff1aSopenharmony_ci    q->fft_coefs[q->fft_coefs_index].exp     = exp;
1257cabdff1aSopenharmony_ci    q->fft_coefs[q->fft_coefs_index].phase   = phase;
1258cabdff1aSopenharmony_ci    q->fft_coefs_index++;
1259cabdff1aSopenharmony_ci}
1260cabdff1aSopenharmony_ci
1261cabdff1aSopenharmony_cistatic void qdm2_fft_decode_tones(QDM2Context *q, int duration,
1262cabdff1aSopenharmony_ci                                  GetBitContext *gb, int b)
1263cabdff1aSopenharmony_ci{
1264cabdff1aSopenharmony_ci    int channel, stereo, phase, exp;
1265cabdff1aSopenharmony_ci    int local_int_4, local_int_8, stereo_phase, local_int_10;
1266cabdff1aSopenharmony_ci    int local_int_14, stereo_exp, local_int_20, local_int_28;
1267cabdff1aSopenharmony_ci    int n, offset;
1268cabdff1aSopenharmony_ci
1269cabdff1aSopenharmony_ci    local_int_4  = 0;
1270cabdff1aSopenharmony_ci    local_int_28 = 0;
1271cabdff1aSopenharmony_ci    local_int_20 = 2;
1272cabdff1aSopenharmony_ci    local_int_8  = (4 - duration);
1273cabdff1aSopenharmony_ci    local_int_10 = 1 << (q->group_order - duration - 1);
1274cabdff1aSopenharmony_ci    offset       = 1;
1275cabdff1aSopenharmony_ci
1276cabdff1aSopenharmony_ci    while (get_bits_left(gb)>0) {
1277cabdff1aSopenharmony_ci        if (q->superblocktype_2_3) {
1278cabdff1aSopenharmony_ci            while ((n = qdm2_get_vlc(gb, &vlc_tab_fft_tone_offset[local_int_8], 1, 2)) < 2) {
1279cabdff1aSopenharmony_ci                if (get_bits_left(gb)<0) {
1280cabdff1aSopenharmony_ci                    if(local_int_4 < q->group_size)
1281cabdff1aSopenharmony_ci                        av_log(NULL, AV_LOG_ERROR, "overread in qdm2_fft_decode_tones()\n");
1282cabdff1aSopenharmony_ci                    return;
1283cabdff1aSopenharmony_ci                }
1284cabdff1aSopenharmony_ci                offset = 1;
1285cabdff1aSopenharmony_ci                if (n == 0) {
1286cabdff1aSopenharmony_ci                    local_int_4  += local_int_10;
1287cabdff1aSopenharmony_ci                    local_int_28 += (1 << local_int_8);
1288cabdff1aSopenharmony_ci                } else {
1289cabdff1aSopenharmony_ci                    local_int_4  += 8 * local_int_10;
1290cabdff1aSopenharmony_ci                    local_int_28 += (8 << local_int_8);
1291cabdff1aSopenharmony_ci                }
1292cabdff1aSopenharmony_ci            }
1293cabdff1aSopenharmony_ci            offset += (n - 2);
1294cabdff1aSopenharmony_ci        } else {
1295cabdff1aSopenharmony_ci            if (local_int_10 <= 2) {
1296cabdff1aSopenharmony_ci                av_log(NULL, AV_LOG_ERROR, "qdm2_fft_decode_tones() stuck\n");
1297cabdff1aSopenharmony_ci                return;
1298cabdff1aSopenharmony_ci            }
1299cabdff1aSopenharmony_ci            offset += qdm2_get_vlc(gb, &vlc_tab_fft_tone_offset[local_int_8], 1, 2);
1300cabdff1aSopenharmony_ci            while (offset >= (local_int_10 - 1)) {
1301cabdff1aSopenharmony_ci                offset       += (1 - (local_int_10 - 1));
1302cabdff1aSopenharmony_ci                local_int_4  += local_int_10;
1303cabdff1aSopenharmony_ci                local_int_28 += (1 << local_int_8);
1304cabdff1aSopenharmony_ci            }
1305cabdff1aSopenharmony_ci        }
1306cabdff1aSopenharmony_ci
1307cabdff1aSopenharmony_ci        if (local_int_4 >= q->group_size)
1308cabdff1aSopenharmony_ci            return;
1309cabdff1aSopenharmony_ci
1310cabdff1aSopenharmony_ci        local_int_14 = (offset >> local_int_8);
1311cabdff1aSopenharmony_ci        if (local_int_14 >= FF_ARRAY_ELEMS(fft_level_index_table))
1312cabdff1aSopenharmony_ci            return;
1313cabdff1aSopenharmony_ci
1314cabdff1aSopenharmony_ci        if (q->nb_channels > 1) {
1315cabdff1aSopenharmony_ci            channel = get_bits1(gb);
1316cabdff1aSopenharmony_ci            stereo  = get_bits1(gb);
1317cabdff1aSopenharmony_ci        } else {
1318cabdff1aSopenharmony_ci            channel = 0;
1319cabdff1aSopenharmony_ci            stereo  = 0;
1320cabdff1aSopenharmony_ci        }
1321cabdff1aSopenharmony_ci
1322cabdff1aSopenharmony_ci        exp  = qdm2_get_vlc(gb, (b ? &fft_level_exp_vlc : &fft_level_exp_alt_vlc), 0, 2);
1323cabdff1aSopenharmony_ci        exp += q->fft_level_exp[fft_level_index_table[local_int_14]];
1324cabdff1aSopenharmony_ci        exp  = (exp < 0) ? 0 : exp;
1325cabdff1aSopenharmony_ci
1326cabdff1aSopenharmony_ci        phase        = get_bits(gb, 3);
1327cabdff1aSopenharmony_ci        stereo_exp   = 0;
1328cabdff1aSopenharmony_ci        stereo_phase = 0;
1329cabdff1aSopenharmony_ci
1330cabdff1aSopenharmony_ci        if (stereo) {
1331cabdff1aSopenharmony_ci            stereo_exp   = (exp - qdm2_get_vlc(gb, &fft_stereo_exp_vlc, 0, 1));
1332cabdff1aSopenharmony_ci            stereo_phase = (phase - qdm2_get_vlc(gb, &fft_stereo_phase_vlc, 0, 1));
1333cabdff1aSopenharmony_ci            if (stereo_phase < 0)
1334cabdff1aSopenharmony_ci                stereo_phase += 8;
1335cabdff1aSopenharmony_ci        }
1336cabdff1aSopenharmony_ci
1337cabdff1aSopenharmony_ci        if (q->frequency_range > (local_int_14 + 1)) {
1338cabdff1aSopenharmony_ci            int sub_packet = (local_int_20 + local_int_28);
1339cabdff1aSopenharmony_ci
1340cabdff1aSopenharmony_ci            if (q->fft_coefs_index + stereo >= FF_ARRAY_ELEMS(q->fft_coefs))
1341cabdff1aSopenharmony_ci                return;
1342cabdff1aSopenharmony_ci
1343cabdff1aSopenharmony_ci            qdm2_fft_init_coefficient(q, sub_packet, offset, duration,
1344cabdff1aSopenharmony_ci                                      channel, exp, phase);
1345cabdff1aSopenharmony_ci            if (stereo)
1346cabdff1aSopenharmony_ci                qdm2_fft_init_coefficient(q, sub_packet, offset, duration,
1347cabdff1aSopenharmony_ci                                          1 - channel,
1348cabdff1aSopenharmony_ci                                          stereo_exp, stereo_phase);
1349cabdff1aSopenharmony_ci        }
1350cabdff1aSopenharmony_ci        offset++;
1351cabdff1aSopenharmony_ci    }
1352cabdff1aSopenharmony_ci}
1353cabdff1aSopenharmony_ci
1354cabdff1aSopenharmony_cistatic void qdm2_decode_fft_packets(QDM2Context *q)
1355cabdff1aSopenharmony_ci{
1356cabdff1aSopenharmony_ci    int i, j, min, max, value, type, unknown_flag;
1357cabdff1aSopenharmony_ci    GetBitContext gb;
1358cabdff1aSopenharmony_ci
1359cabdff1aSopenharmony_ci    if (!q->sub_packet_list_B[0].packet)
1360cabdff1aSopenharmony_ci        return;
1361cabdff1aSopenharmony_ci
1362cabdff1aSopenharmony_ci    /* reset minimum indexes for FFT coefficients */
1363cabdff1aSopenharmony_ci    q->fft_coefs_index = 0;
1364cabdff1aSopenharmony_ci    for (i = 0; i < 5; i++)
1365cabdff1aSopenharmony_ci        q->fft_coefs_min_index[i] = -1;
1366cabdff1aSopenharmony_ci
1367cabdff1aSopenharmony_ci    /* process subpackets ordered by type, largest type first */
1368cabdff1aSopenharmony_ci    for (i = 0, max = 256; i < q->sub_packets_B; i++) {
1369cabdff1aSopenharmony_ci        QDM2SubPacket *packet = NULL;
1370cabdff1aSopenharmony_ci
1371cabdff1aSopenharmony_ci        /* find subpacket with largest type less than max */
1372cabdff1aSopenharmony_ci        for (j = 0, min = 0; j < q->sub_packets_B; j++) {
1373cabdff1aSopenharmony_ci            value = q->sub_packet_list_B[j].packet->type;
1374cabdff1aSopenharmony_ci            if (value > min && value < max) {
1375cabdff1aSopenharmony_ci                min    = value;
1376cabdff1aSopenharmony_ci                packet = q->sub_packet_list_B[j].packet;
1377cabdff1aSopenharmony_ci            }
1378cabdff1aSopenharmony_ci        }
1379cabdff1aSopenharmony_ci
1380cabdff1aSopenharmony_ci        max = min;
1381cabdff1aSopenharmony_ci
1382cabdff1aSopenharmony_ci        /* check for errors (?) */
1383cabdff1aSopenharmony_ci        if (!packet)
1384cabdff1aSopenharmony_ci            return;
1385cabdff1aSopenharmony_ci
1386cabdff1aSopenharmony_ci        if (i == 0 &&
1387cabdff1aSopenharmony_ci            (packet->type < 16 || packet->type >= 48 ||
1388cabdff1aSopenharmony_ci             fft_subpackets[packet->type - 16]))
1389cabdff1aSopenharmony_ci            return;
1390cabdff1aSopenharmony_ci
1391cabdff1aSopenharmony_ci        /* decode FFT tones */
1392cabdff1aSopenharmony_ci        init_get_bits(&gb, packet->data, packet->size * 8);
1393cabdff1aSopenharmony_ci
1394cabdff1aSopenharmony_ci        if (packet->type >= 32 && packet->type < 48 && !fft_subpackets[packet->type - 16])
1395cabdff1aSopenharmony_ci            unknown_flag = 1;
1396cabdff1aSopenharmony_ci        else
1397cabdff1aSopenharmony_ci            unknown_flag = 0;
1398cabdff1aSopenharmony_ci
1399cabdff1aSopenharmony_ci        type = packet->type;
1400cabdff1aSopenharmony_ci
1401cabdff1aSopenharmony_ci        if ((type >= 17 && type < 24) || (type >= 33 && type < 40)) {
1402cabdff1aSopenharmony_ci            int duration = q->sub_sampling + 5 - (type & 15);
1403cabdff1aSopenharmony_ci
1404cabdff1aSopenharmony_ci            if (duration >= 0 && duration < 4)
1405cabdff1aSopenharmony_ci                qdm2_fft_decode_tones(q, duration, &gb, unknown_flag);
1406cabdff1aSopenharmony_ci        } else if (type == 31) {
1407cabdff1aSopenharmony_ci            for (j = 0; j < 4; j++)
1408cabdff1aSopenharmony_ci                qdm2_fft_decode_tones(q, j, &gb, unknown_flag);
1409cabdff1aSopenharmony_ci        } else if (type == 46) {
1410cabdff1aSopenharmony_ci            for (j = 0; j < 6; j++)
1411cabdff1aSopenharmony_ci                q->fft_level_exp[j] = get_bits(&gb, 6);
1412cabdff1aSopenharmony_ci            for (j = 0; j < 4; j++)
1413cabdff1aSopenharmony_ci                qdm2_fft_decode_tones(q, j, &gb, unknown_flag);
1414cabdff1aSopenharmony_ci        }
1415cabdff1aSopenharmony_ci    } // Loop on B packets
1416cabdff1aSopenharmony_ci
1417cabdff1aSopenharmony_ci    /* calculate maximum indexes for FFT coefficients */
1418cabdff1aSopenharmony_ci    for (i = 0, j = -1; i < 5; i++)
1419cabdff1aSopenharmony_ci        if (q->fft_coefs_min_index[i] >= 0) {
1420cabdff1aSopenharmony_ci            if (j >= 0)
1421cabdff1aSopenharmony_ci                q->fft_coefs_max_index[j] = q->fft_coefs_min_index[i];
1422cabdff1aSopenharmony_ci            j = i;
1423cabdff1aSopenharmony_ci        }
1424cabdff1aSopenharmony_ci    if (j >= 0)
1425cabdff1aSopenharmony_ci        q->fft_coefs_max_index[j] = q->fft_coefs_index;
1426cabdff1aSopenharmony_ci}
1427cabdff1aSopenharmony_ci
1428cabdff1aSopenharmony_cistatic void qdm2_fft_generate_tone(QDM2Context *q, FFTTone *tone)
1429cabdff1aSopenharmony_ci{
1430cabdff1aSopenharmony_ci    float level, f[6];
1431cabdff1aSopenharmony_ci    int i;
1432cabdff1aSopenharmony_ci    QDM2Complex c;
1433cabdff1aSopenharmony_ci    const double iscale = 2.0 * M_PI / 512.0;
1434cabdff1aSopenharmony_ci
1435cabdff1aSopenharmony_ci    tone->phase += tone->phase_shift;
1436cabdff1aSopenharmony_ci
1437cabdff1aSopenharmony_ci    /* calculate current level (maximum amplitude) of tone */
1438cabdff1aSopenharmony_ci    level = fft_tone_envelope_table[tone->duration][tone->time_index] * tone->level;
1439cabdff1aSopenharmony_ci    c.im  = level * sin(tone->phase * iscale);
1440cabdff1aSopenharmony_ci    c.re  = level * cos(tone->phase * iscale);
1441cabdff1aSopenharmony_ci
1442cabdff1aSopenharmony_ci    /* generate FFT coefficients for tone */
1443cabdff1aSopenharmony_ci    if (tone->duration >= 3 || tone->cutoff >= 3) {
1444cabdff1aSopenharmony_ci        tone->complex[0].im += c.im;
1445cabdff1aSopenharmony_ci        tone->complex[0].re += c.re;
1446cabdff1aSopenharmony_ci        tone->complex[1].im -= c.im;
1447cabdff1aSopenharmony_ci        tone->complex[1].re -= c.re;
1448cabdff1aSopenharmony_ci    } else {
1449cabdff1aSopenharmony_ci        f[1] = -tone->table[4];
1450cabdff1aSopenharmony_ci        f[0] = tone->table[3] - tone->table[0];
1451cabdff1aSopenharmony_ci        f[2] = 1.0 - tone->table[2] - tone->table[3];
1452cabdff1aSopenharmony_ci        f[3] = tone->table[1] + tone->table[4] - 1.0;
1453cabdff1aSopenharmony_ci        f[4] = tone->table[0] - tone->table[1];
1454cabdff1aSopenharmony_ci        f[5] = tone->table[2];
1455cabdff1aSopenharmony_ci        for (i = 0; i < 2; i++) {
1456cabdff1aSopenharmony_ci            tone->complex[fft_cutoff_index_table[tone->cutoff][i]].re +=
1457cabdff1aSopenharmony_ci                c.re * f[i];
1458cabdff1aSopenharmony_ci            tone->complex[fft_cutoff_index_table[tone->cutoff][i]].im +=
1459cabdff1aSopenharmony_ci                c.im * ((tone->cutoff <= i) ? -f[i] : f[i]);
1460cabdff1aSopenharmony_ci        }
1461cabdff1aSopenharmony_ci        for (i = 0; i < 4; i++) {
1462cabdff1aSopenharmony_ci            tone->complex[i].re += c.re * f[i + 2];
1463cabdff1aSopenharmony_ci            tone->complex[i].im += c.im * f[i + 2];
1464cabdff1aSopenharmony_ci        }
1465cabdff1aSopenharmony_ci    }
1466cabdff1aSopenharmony_ci
1467cabdff1aSopenharmony_ci    /* copy the tone if it has not yet died out */
1468cabdff1aSopenharmony_ci    if (++tone->time_index < ((1 << (5 - tone->duration)) - 1)) {
1469cabdff1aSopenharmony_ci        memcpy(&q->fft_tones[q->fft_tone_end], tone, sizeof(FFTTone));
1470cabdff1aSopenharmony_ci        q->fft_tone_end = (q->fft_tone_end + 1) % 1000;
1471cabdff1aSopenharmony_ci    }
1472cabdff1aSopenharmony_ci}
1473cabdff1aSopenharmony_ci
1474cabdff1aSopenharmony_cistatic void qdm2_fft_tone_synthesizer(QDM2Context *q, int sub_packet)
1475cabdff1aSopenharmony_ci{
1476cabdff1aSopenharmony_ci    int i, j, ch;
1477cabdff1aSopenharmony_ci    const double iscale = 0.25 * M_PI;
1478cabdff1aSopenharmony_ci
1479cabdff1aSopenharmony_ci    for (ch = 0; ch < q->channels; ch++) {
1480cabdff1aSopenharmony_ci        memset(q->fft.complex[ch], 0, q->fft_size * sizeof(QDM2Complex));
1481cabdff1aSopenharmony_ci    }
1482cabdff1aSopenharmony_ci
1483cabdff1aSopenharmony_ci
1484cabdff1aSopenharmony_ci    /* apply FFT tones with duration 4 (1 FFT period) */
1485cabdff1aSopenharmony_ci    if (q->fft_coefs_min_index[4] >= 0)
1486cabdff1aSopenharmony_ci        for (i = q->fft_coefs_min_index[4]; i < q->fft_coefs_max_index[4]; i++) {
1487cabdff1aSopenharmony_ci            float level;
1488cabdff1aSopenharmony_ci            QDM2Complex c;
1489cabdff1aSopenharmony_ci
1490cabdff1aSopenharmony_ci            if (q->fft_coefs[i].sub_packet != sub_packet)
1491cabdff1aSopenharmony_ci                break;
1492cabdff1aSopenharmony_ci
1493cabdff1aSopenharmony_ci            ch = (q->channels == 1) ? 0 : q->fft_coefs[i].channel;
1494cabdff1aSopenharmony_ci            level = (q->fft_coefs[i].exp < 0) ? 0.0 : fft_tone_level_table[q->superblocktype_2_3 ? 0 : 1][q->fft_coefs[i].exp & 63];
1495cabdff1aSopenharmony_ci
1496cabdff1aSopenharmony_ci            c.re = level * cos(q->fft_coefs[i].phase * iscale);
1497cabdff1aSopenharmony_ci            c.im = level * sin(q->fft_coefs[i].phase * iscale);
1498cabdff1aSopenharmony_ci            q->fft.complex[ch][q->fft_coefs[i].offset + 0].re += c.re;
1499cabdff1aSopenharmony_ci            q->fft.complex[ch][q->fft_coefs[i].offset + 0].im += c.im;
1500cabdff1aSopenharmony_ci            q->fft.complex[ch][q->fft_coefs[i].offset + 1].re -= c.re;
1501cabdff1aSopenharmony_ci            q->fft.complex[ch][q->fft_coefs[i].offset + 1].im -= c.im;
1502cabdff1aSopenharmony_ci        }
1503cabdff1aSopenharmony_ci
1504cabdff1aSopenharmony_ci    /* generate existing FFT tones */
1505cabdff1aSopenharmony_ci    for (i = q->fft_tone_end; i != q->fft_tone_start; ) {
1506cabdff1aSopenharmony_ci        qdm2_fft_generate_tone(q, &q->fft_tones[q->fft_tone_start]);
1507cabdff1aSopenharmony_ci        q->fft_tone_start = (q->fft_tone_start + 1) % 1000;
1508cabdff1aSopenharmony_ci    }
1509cabdff1aSopenharmony_ci
1510cabdff1aSopenharmony_ci    /* create and generate new FFT tones with duration 0 (long) to 3 (short) */
1511cabdff1aSopenharmony_ci    for (i = 0; i < 4; i++)
1512cabdff1aSopenharmony_ci        if (q->fft_coefs_min_index[i] >= 0) {
1513cabdff1aSopenharmony_ci            for (j = q->fft_coefs_min_index[i]; j < q->fft_coefs_max_index[i]; j++) {
1514cabdff1aSopenharmony_ci                int offset, four_i;
1515cabdff1aSopenharmony_ci                FFTTone tone;
1516cabdff1aSopenharmony_ci
1517cabdff1aSopenharmony_ci                if (q->fft_coefs[j].sub_packet != sub_packet)
1518cabdff1aSopenharmony_ci                    break;
1519cabdff1aSopenharmony_ci
1520cabdff1aSopenharmony_ci                four_i = (4 - i);
1521cabdff1aSopenharmony_ci                offset = q->fft_coefs[j].offset >> four_i;
1522cabdff1aSopenharmony_ci                ch = (q->channels == 1) ? 0 : q->fft_coefs[j].channel;
1523cabdff1aSopenharmony_ci
1524cabdff1aSopenharmony_ci                if (offset < q->frequency_range) {
1525cabdff1aSopenharmony_ci                    if (offset < 2)
1526cabdff1aSopenharmony_ci                        tone.cutoff = offset;
1527cabdff1aSopenharmony_ci                    else
1528cabdff1aSopenharmony_ci                        tone.cutoff = (offset >= 60) ? 3 : 2;
1529cabdff1aSopenharmony_ci
1530cabdff1aSopenharmony_ci                    tone.level = (q->fft_coefs[j].exp < 0) ? 0.0 : fft_tone_level_table[q->superblocktype_2_3 ? 0 : 1][q->fft_coefs[j].exp & 63];
1531cabdff1aSopenharmony_ci                    tone.complex = &q->fft.complex[ch][offset];
1532cabdff1aSopenharmony_ci                    tone.table = fft_tone_sample_table[i][q->fft_coefs[j].offset - (offset << four_i)];
1533cabdff1aSopenharmony_ci                    tone.phase = 64 * q->fft_coefs[j].phase - (offset << 8) - 128;
1534cabdff1aSopenharmony_ci                    tone.phase_shift = (2 * q->fft_coefs[j].offset + 1) << (7 - four_i);
1535cabdff1aSopenharmony_ci                    tone.duration = i;
1536cabdff1aSopenharmony_ci                    tone.time_index = 0;
1537cabdff1aSopenharmony_ci
1538cabdff1aSopenharmony_ci                    qdm2_fft_generate_tone(q, &tone);
1539cabdff1aSopenharmony_ci                }
1540cabdff1aSopenharmony_ci            }
1541cabdff1aSopenharmony_ci            q->fft_coefs_min_index[i] = j;
1542cabdff1aSopenharmony_ci        }
1543cabdff1aSopenharmony_ci}
1544cabdff1aSopenharmony_ci
1545cabdff1aSopenharmony_cistatic void qdm2_calculate_fft(QDM2Context *q, int channel, int sub_packet)
1546cabdff1aSopenharmony_ci{
1547cabdff1aSopenharmony_ci    const float gain = (q->channels == 1 && q->nb_channels == 2) ? 0.5f : 1.0f;
1548cabdff1aSopenharmony_ci    float *out       = q->output_buffer + channel;
1549cabdff1aSopenharmony_ci    int i;
1550cabdff1aSopenharmony_ci    q->fft.complex[channel][0].re *= 2.0f;
1551cabdff1aSopenharmony_ci    q->fft.complex[channel][0].im  = 0.0f;
1552cabdff1aSopenharmony_ci    q->rdft_ctx.rdft_calc(&q->rdft_ctx, (FFTSample *)q->fft.complex[channel]);
1553cabdff1aSopenharmony_ci    /* add samples to output buffer */
1554cabdff1aSopenharmony_ci    for (i = 0; i < FFALIGN(q->fft_size, 8); i++) {
1555cabdff1aSopenharmony_ci        out[0]           += q->fft.complex[channel][i].re * gain;
1556cabdff1aSopenharmony_ci        out[q->channels] += q->fft.complex[channel][i].im * gain;
1557cabdff1aSopenharmony_ci        out              += 2 * q->channels;
1558cabdff1aSopenharmony_ci    }
1559cabdff1aSopenharmony_ci}
1560cabdff1aSopenharmony_ci
1561cabdff1aSopenharmony_ci/**
1562cabdff1aSopenharmony_ci * @param q        context
1563cabdff1aSopenharmony_ci * @param index    subpacket number
1564cabdff1aSopenharmony_ci */
1565cabdff1aSopenharmony_cistatic void qdm2_synthesis_filter(QDM2Context *q, int index)
1566cabdff1aSopenharmony_ci{
1567cabdff1aSopenharmony_ci    int i, k, ch, sb_used, sub_sampling, dither_state = 0;
1568cabdff1aSopenharmony_ci
1569cabdff1aSopenharmony_ci    /* copy sb_samples */
1570cabdff1aSopenharmony_ci    sb_used = QDM2_SB_USED(q->sub_sampling);
1571cabdff1aSopenharmony_ci
1572cabdff1aSopenharmony_ci    for (ch = 0; ch < q->channels; ch++)
1573cabdff1aSopenharmony_ci        for (i = 0; i < 8; i++)
1574cabdff1aSopenharmony_ci            for (k = sb_used; k < SBLIMIT; k++)
1575cabdff1aSopenharmony_ci                q->sb_samples[ch][(8 * index) + i][k] = 0;
1576cabdff1aSopenharmony_ci
1577cabdff1aSopenharmony_ci    for (ch = 0; ch < q->nb_channels; ch++) {
1578cabdff1aSopenharmony_ci        float *samples_ptr = q->samples + ch;
1579cabdff1aSopenharmony_ci
1580cabdff1aSopenharmony_ci        for (i = 0; i < 8; i++) {
1581cabdff1aSopenharmony_ci            ff_mpa_synth_filter_float(&q->mpadsp,
1582cabdff1aSopenharmony_ci                                      q->synth_buf[ch], &(q->synth_buf_offset[ch]),
1583cabdff1aSopenharmony_ci                                      ff_mpa_synth_window_float, &dither_state,
1584cabdff1aSopenharmony_ci                                      samples_ptr, q->nb_channels,
1585cabdff1aSopenharmony_ci                                      q->sb_samples[ch][(8 * index) + i]);
1586cabdff1aSopenharmony_ci            samples_ptr += 32 * q->nb_channels;
1587cabdff1aSopenharmony_ci        }
1588cabdff1aSopenharmony_ci    }
1589cabdff1aSopenharmony_ci
1590cabdff1aSopenharmony_ci    /* add samples to output buffer */
1591cabdff1aSopenharmony_ci    sub_sampling = (4 >> q->sub_sampling);
1592cabdff1aSopenharmony_ci
1593cabdff1aSopenharmony_ci    for (ch = 0; ch < q->channels; ch++)
1594cabdff1aSopenharmony_ci        for (i = 0; i < q->frame_size; i++)
1595cabdff1aSopenharmony_ci            q->output_buffer[q->channels * i + ch] += (1 << 23) * q->samples[q->nb_channels * sub_sampling * i + ch];
1596cabdff1aSopenharmony_ci}
1597cabdff1aSopenharmony_ci
1598cabdff1aSopenharmony_ci/**
1599cabdff1aSopenharmony_ci * Init static data (does not depend on specific file)
1600cabdff1aSopenharmony_ci */
1601cabdff1aSopenharmony_cistatic av_cold void qdm2_init_static_data(void) {
1602cabdff1aSopenharmony_ci    qdm2_init_vlc();
1603cabdff1aSopenharmony_ci    softclip_table_init();
1604cabdff1aSopenharmony_ci    rnd_table_init();
1605cabdff1aSopenharmony_ci    init_noise_samples();
1606cabdff1aSopenharmony_ci
1607cabdff1aSopenharmony_ci    ff_mpa_synth_init_float();
1608cabdff1aSopenharmony_ci}
1609cabdff1aSopenharmony_ci
1610cabdff1aSopenharmony_ci/**
1611cabdff1aSopenharmony_ci * Init parameters from codec extradata
1612cabdff1aSopenharmony_ci */
1613cabdff1aSopenharmony_cistatic av_cold int qdm2_decode_init(AVCodecContext *avctx)
1614cabdff1aSopenharmony_ci{
1615cabdff1aSopenharmony_ci    static AVOnce init_static_once = AV_ONCE_INIT;
1616cabdff1aSopenharmony_ci    QDM2Context *s = avctx->priv_data;
1617cabdff1aSopenharmony_ci    int tmp_val, tmp, size;
1618cabdff1aSopenharmony_ci    GetByteContext gb;
1619cabdff1aSopenharmony_ci
1620cabdff1aSopenharmony_ci    /* extradata parsing
1621cabdff1aSopenharmony_ci
1622cabdff1aSopenharmony_ci    Structure:
1623cabdff1aSopenharmony_ci    wave {
1624cabdff1aSopenharmony_ci        frma (QDM2)
1625cabdff1aSopenharmony_ci        QDCA
1626cabdff1aSopenharmony_ci        QDCP
1627cabdff1aSopenharmony_ci    }
1628cabdff1aSopenharmony_ci
1629cabdff1aSopenharmony_ci    32  size (including this field)
1630cabdff1aSopenharmony_ci    32  tag (=frma)
1631cabdff1aSopenharmony_ci    32  type (=QDM2 or QDMC)
1632cabdff1aSopenharmony_ci
1633cabdff1aSopenharmony_ci    32  size (including this field, in bytes)
1634cabdff1aSopenharmony_ci    32  tag (=QDCA) // maybe mandatory parameters
1635cabdff1aSopenharmony_ci    32  unknown (=1)
1636cabdff1aSopenharmony_ci    32  channels (=2)
1637cabdff1aSopenharmony_ci    32  samplerate (=44100)
1638cabdff1aSopenharmony_ci    32  bitrate (=96000)
1639cabdff1aSopenharmony_ci    32  block size (=4096)
1640cabdff1aSopenharmony_ci    32  frame size (=256) (for one channel)
1641cabdff1aSopenharmony_ci    32  packet size (=1300)
1642cabdff1aSopenharmony_ci
1643cabdff1aSopenharmony_ci    32  size (including this field, in bytes)
1644cabdff1aSopenharmony_ci    32  tag (=QDCP) // maybe some tuneable parameters
1645cabdff1aSopenharmony_ci    32  float1 (=1.0)
1646cabdff1aSopenharmony_ci    32  zero ?
1647cabdff1aSopenharmony_ci    32  float2 (=1.0)
1648cabdff1aSopenharmony_ci    32  float3 (=1.0)
1649cabdff1aSopenharmony_ci    32  unknown (27)
1650cabdff1aSopenharmony_ci    32  unknown (8)
1651cabdff1aSopenharmony_ci    32  zero ?
1652cabdff1aSopenharmony_ci    */
1653cabdff1aSopenharmony_ci
1654cabdff1aSopenharmony_ci    if (!avctx->extradata || (avctx->extradata_size < 48)) {
1655cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "extradata missing or truncated\n");
1656cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1657cabdff1aSopenharmony_ci    }
1658cabdff1aSopenharmony_ci
1659cabdff1aSopenharmony_ci    bytestream2_init(&gb, avctx->extradata, avctx->extradata_size);
1660cabdff1aSopenharmony_ci
1661cabdff1aSopenharmony_ci    while (bytestream2_get_bytes_left(&gb) > 8) {
1662cabdff1aSopenharmony_ci        if (bytestream2_peek_be64(&gb) == (((uint64_t)MKBETAG('f','r','m','a') << 32) |
1663cabdff1aSopenharmony_ci                                            (uint64_t)MKBETAG('Q','D','M','2')))
1664cabdff1aSopenharmony_ci            break;
1665cabdff1aSopenharmony_ci        bytestream2_skip(&gb, 1);
1666cabdff1aSopenharmony_ci    }
1667cabdff1aSopenharmony_ci
1668cabdff1aSopenharmony_ci    if (bytestream2_get_bytes_left(&gb) < 12) {
1669cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "not enough extradata (%i)\n",
1670cabdff1aSopenharmony_ci               bytestream2_get_bytes_left(&gb));
1671cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1672cabdff1aSopenharmony_ci    }
1673cabdff1aSopenharmony_ci
1674cabdff1aSopenharmony_ci    bytestream2_skip(&gb, 8);
1675cabdff1aSopenharmony_ci    size = bytestream2_get_be32(&gb);
1676cabdff1aSopenharmony_ci
1677cabdff1aSopenharmony_ci    if (size > bytestream2_get_bytes_left(&gb)) {
1678cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "extradata size too small, %i < %i\n",
1679cabdff1aSopenharmony_ci               bytestream2_get_bytes_left(&gb), size);
1680cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1681cabdff1aSopenharmony_ci    }
1682cabdff1aSopenharmony_ci
1683cabdff1aSopenharmony_ci    av_log(avctx, AV_LOG_DEBUG, "size: %d\n", size);
1684cabdff1aSopenharmony_ci    if (bytestream2_get_be32(&gb) != MKBETAG('Q','D','C','A')) {
1685cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "invalid extradata, expecting QDCA\n");
1686cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1687cabdff1aSopenharmony_ci    }
1688cabdff1aSopenharmony_ci
1689cabdff1aSopenharmony_ci    bytestream2_skip(&gb, 4);
1690cabdff1aSopenharmony_ci
1691cabdff1aSopenharmony_ci    s->nb_channels = s->channels = bytestream2_get_be32(&gb);
1692cabdff1aSopenharmony_ci    if (s->channels <= 0 || s->channels > MPA_MAX_CHANNELS) {
1693cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Invalid number of channels\n");
1694cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1695cabdff1aSopenharmony_ci    }
1696cabdff1aSopenharmony_ci    av_channel_layout_uninit(&avctx->ch_layout);
1697cabdff1aSopenharmony_ci    av_channel_layout_default(&avctx->ch_layout, s->channels);
1698cabdff1aSopenharmony_ci
1699cabdff1aSopenharmony_ci    avctx->sample_rate = bytestream2_get_be32(&gb);
1700cabdff1aSopenharmony_ci    avctx->bit_rate = bytestream2_get_be32(&gb);
1701cabdff1aSopenharmony_ci    s->group_size = bytestream2_get_be32(&gb);
1702cabdff1aSopenharmony_ci    s->fft_size = bytestream2_get_be32(&gb);
1703cabdff1aSopenharmony_ci    s->checksum_size = bytestream2_get_be32(&gb);
1704cabdff1aSopenharmony_ci    if (s->checksum_size >= 1U << 28 || s->checksum_size <= 1) {
1705cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "data block size invalid (%u)\n", s->checksum_size);
1706cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1707cabdff1aSopenharmony_ci    }
1708cabdff1aSopenharmony_ci
1709cabdff1aSopenharmony_ci    s->fft_order = av_log2(s->fft_size) + 1;
1710cabdff1aSopenharmony_ci
1711cabdff1aSopenharmony_ci    // Fail on unknown fft order
1712cabdff1aSopenharmony_ci    if ((s->fft_order < 7) || (s->fft_order > 9)) {
1713cabdff1aSopenharmony_ci        avpriv_request_sample(avctx, "Unknown FFT order %d", s->fft_order);
1714cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
1715cabdff1aSopenharmony_ci    }
1716cabdff1aSopenharmony_ci
1717cabdff1aSopenharmony_ci    // something like max decodable tones
1718cabdff1aSopenharmony_ci    s->group_order = av_log2(s->group_size) + 1;
1719cabdff1aSopenharmony_ci    s->frame_size = s->group_size / 16; // 16 iterations per super block
1720cabdff1aSopenharmony_ci
1721cabdff1aSopenharmony_ci    if (s->frame_size > QDM2_MAX_FRAME_SIZE)
1722cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1723cabdff1aSopenharmony_ci
1724cabdff1aSopenharmony_ci    s->sub_sampling = s->fft_order - 7;
1725cabdff1aSopenharmony_ci    s->frequency_range = 255 / (1 << (2 - s->sub_sampling));
1726cabdff1aSopenharmony_ci
1727cabdff1aSopenharmony_ci    if (s->frame_size * 4 >> s->sub_sampling > MPA_FRAME_SIZE) {
1728cabdff1aSopenharmony_ci        avpriv_request_sample(avctx, "large frames");
1729cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
1730cabdff1aSopenharmony_ci    }
1731cabdff1aSopenharmony_ci
1732cabdff1aSopenharmony_ci    switch ((s->sub_sampling * 2 + s->channels - 1)) {
1733cabdff1aSopenharmony_ci        case 0: tmp = 40; break;
1734cabdff1aSopenharmony_ci        case 1: tmp = 48; break;
1735cabdff1aSopenharmony_ci        case 2: tmp = 56; break;
1736cabdff1aSopenharmony_ci        case 3: tmp = 72; break;
1737cabdff1aSopenharmony_ci        case 4: tmp = 80; break;
1738cabdff1aSopenharmony_ci        case 5: tmp = 100;break;
1739cabdff1aSopenharmony_ci        default: tmp=s->sub_sampling; break;
1740cabdff1aSopenharmony_ci    }
1741cabdff1aSopenharmony_ci    tmp_val = 0;
1742cabdff1aSopenharmony_ci    if ((tmp * 1000) < avctx->bit_rate)  tmp_val = 1;
1743cabdff1aSopenharmony_ci    if ((tmp * 1440) < avctx->bit_rate)  tmp_val = 2;
1744cabdff1aSopenharmony_ci    if ((tmp * 1760) < avctx->bit_rate)  tmp_val = 3;
1745cabdff1aSopenharmony_ci    if ((tmp * 2240) < avctx->bit_rate)  tmp_val = 4;
1746cabdff1aSopenharmony_ci    s->cm_table_select = tmp_val;
1747cabdff1aSopenharmony_ci
1748cabdff1aSopenharmony_ci    if (avctx->bit_rate <= 8000)
1749cabdff1aSopenharmony_ci        s->coeff_per_sb_select = 0;
1750cabdff1aSopenharmony_ci    else if (avctx->bit_rate < 16000)
1751cabdff1aSopenharmony_ci        s->coeff_per_sb_select = 1;
1752cabdff1aSopenharmony_ci    else
1753cabdff1aSopenharmony_ci        s->coeff_per_sb_select = 2;
1754cabdff1aSopenharmony_ci
1755cabdff1aSopenharmony_ci    if (s->fft_size != (1 << (s->fft_order - 1))) {
1756cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "FFT size %d not power of 2.\n", s->fft_size);
1757cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1758cabdff1aSopenharmony_ci    }
1759cabdff1aSopenharmony_ci
1760cabdff1aSopenharmony_ci    ff_rdft_init(&s->rdft_ctx, s->fft_order, IDFT_C2R);
1761cabdff1aSopenharmony_ci    ff_mpadsp_init(&s->mpadsp);
1762cabdff1aSopenharmony_ci
1763cabdff1aSopenharmony_ci    avctx->sample_fmt = AV_SAMPLE_FMT_S16;
1764cabdff1aSopenharmony_ci
1765cabdff1aSopenharmony_ci    ff_thread_once(&init_static_once, qdm2_init_static_data);
1766cabdff1aSopenharmony_ci
1767cabdff1aSopenharmony_ci    return 0;
1768cabdff1aSopenharmony_ci}
1769cabdff1aSopenharmony_ci
1770cabdff1aSopenharmony_cistatic av_cold int qdm2_decode_close(AVCodecContext *avctx)
1771cabdff1aSopenharmony_ci{
1772cabdff1aSopenharmony_ci    QDM2Context *s = avctx->priv_data;
1773cabdff1aSopenharmony_ci
1774cabdff1aSopenharmony_ci    ff_rdft_end(&s->rdft_ctx);
1775cabdff1aSopenharmony_ci
1776cabdff1aSopenharmony_ci    return 0;
1777cabdff1aSopenharmony_ci}
1778cabdff1aSopenharmony_ci
1779cabdff1aSopenharmony_cistatic int qdm2_decode(QDM2Context *q, const uint8_t *in, int16_t *out)
1780cabdff1aSopenharmony_ci{
1781cabdff1aSopenharmony_ci    int ch, i;
1782cabdff1aSopenharmony_ci    const int frame_size = (q->frame_size * q->channels);
1783cabdff1aSopenharmony_ci
1784cabdff1aSopenharmony_ci    if((unsigned)frame_size > FF_ARRAY_ELEMS(q->output_buffer)/2)
1785cabdff1aSopenharmony_ci        return -1;
1786cabdff1aSopenharmony_ci
1787cabdff1aSopenharmony_ci    /* select input buffer */
1788cabdff1aSopenharmony_ci    q->compressed_data = in;
1789cabdff1aSopenharmony_ci    q->compressed_size = q->checksum_size;
1790cabdff1aSopenharmony_ci
1791cabdff1aSopenharmony_ci    /* copy old block, clear new block of output samples */
1792cabdff1aSopenharmony_ci    memmove(q->output_buffer, &q->output_buffer[frame_size], frame_size * sizeof(float));
1793cabdff1aSopenharmony_ci    memset(&q->output_buffer[frame_size], 0, frame_size * sizeof(float));
1794cabdff1aSopenharmony_ci
1795cabdff1aSopenharmony_ci    /* decode block of QDM2 compressed data */
1796cabdff1aSopenharmony_ci    if (q->sub_packet == 0) {
1797cabdff1aSopenharmony_ci        q->has_errors = 0; // zero it for a new super block
1798cabdff1aSopenharmony_ci        av_log(NULL,AV_LOG_DEBUG,"Superblock follows\n");
1799cabdff1aSopenharmony_ci        qdm2_decode_super_block(q);
1800cabdff1aSopenharmony_ci    }
1801cabdff1aSopenharmony_ci
1802cabdff1aSopenharmony_ci    /* parse subpackets */
1803cabdff1aSopenharmony_ci    if (!q->has_errors) {
1804cabdff1aSopenharmony_ci        if (q->sub_packet == 2)
1805cabdff1aSopenharmony_ci            qdm2_decode_fft_packets(q);
1806cabdff1aSopenharmony_ci
1807cabdff1aSopenharmony_ci        qdm2_fft_tone_synthesizer(q, q->sub_packet);
1808cabdff1aSopenharmony_ci    }
1809cabdff1aSopenharmony_ci
1810cabdff1aSopenharmony_ci    /* sound synthesis stage 1 (FFT) */
1811cabdff1aSopenharmony_ci    for (ch = 0; ch < q->channels; ch++) {
1812cabdff1aSopenharmony_ci        qdm2_calculate_fft(q, ch, q->sub_packet);
1813cabdff1aSopenharmony_ci
1814cabdff1aSopenharmony_ci        if (!q->has_errors && q->sub_packet_list_C[0].packet) {
1815cabdff1aSopenharmony_ci            SAMPLES_NEEDED_2("has errors, and C list is not empty")
1816cabdff1aSopenharmony_ci            return -1;
1817cabdff1aSopenharmony_ci        }
1818cabdff1aSopenharmony_ci    }
1819cabdff1aSopenharmony_ci
1820cabdff1aSopenharmony_ci    /* sound synthesis stage 2 (MPEG audio like synthesis filter) */
1821cabdff1aSopenharmony_ci    if (!q->has_errors && q->do_synth_filter)
1822cabdff1aSopenharmony_ci        qdm2_synthesis_filter(q, q->sub_packet);
1823cabdff1aSopenharmony_ci
1824cabdff1aSopenharmony_ci    q->sub_packet = (q->sub_packet + 1) % 16;
1825cabdff1aSopenharmony_ci
1826cabdff1aSopenharmony_ci    /* clip and convert output float[] to 16-bit signed samples */
1827cabdff1aSopenharmony_ci    for (i = 0; i < frame_size; i++) {
1828cabdff1aSopenharmony_ci        int value = (int)q->output_buffer[i];
1829cabdff1aSopenharmony_ci
1830cabdff1aSopenharmony_ci        if (value > SOFTCLIP_THRESHOLD)
1831cabdff1aSopenharmony_ci            value = (value >  HARDCLIP_THRESHOLD) ?  32767 :  softclip_table[ value - SOFTCLIP_THRESHOLD];
1832cabdff1aSopenharmony_ci        else if (value < -SOFTCLIP_THRESHOLD)
1833cabdff1aSopenharmony_ci            value = (value < -HARDCLIP_THRESHOLD) ? -32767 : -softclip_table[-value - SOFTCLIP_THRESHOLD];
1834cabdff1aSopenharmony_ci
1835cabdff1aSopenharmony_ci        out[i] = value;
1836cabdff1aSopenharmony_ci    }
1837cabdff1aSopenharmony_ci
1838cabdff1aSopenharmony_ci    return 0;
1839cabdff1aSopenharmony_ci}
1840cabdff1aSopenharmony_ci
1841cabdff1aSopenharmony_cistatic int qdm2_decode_frame(AVCodecContext *avctx, AVFrame *frame,
1842cabdff1aSopenharmony_ci                             int *got_frame_ptr, AVPacket *avpkt)
1843cabdff1aSopenharmony_ci{
1844cabdff1aSopenharmony_ci    const uint8_t *buf = avpkt->data;
1845cabdff1aSopenharmony_ci    int buf_size = avpkt->size;
1846cabdff1aSopenharmony_ci    QDM2Context *s = avctx->priv_data;
1847cabdff1aSopenharmony_ci    int16_t *out;
1848cabdff1aSopenharmony_ci    int i, ret;
1849cabdff1aSopenharmony_ci
1850cabdff1aSopenharmony_ci    if(!buf)
1851cabdff1aSopenharmony_ci        return 0;
1852cabdff1aSopenharmony_ci    if(buf_size < s->checksum_size)
1853cabdff1aSopenharmony_ci        return -1;
1854cabdff1aSopenharmony_ci
1855cabdff1aSopenharmony_ci    /* get output buffer */
1856cabdff1aSopenharmony_ci    frame->nb_samples = 16 * s->frame_size;
1857cabdff1aSopenharmony_ci    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
1858cabdff1aSopenharmony_ci        return ret;
1859cabdff1aSopenharmony_ci    out = (int16_t *)frame->data[0];
1860cabdff1aSopenharmony_ci
1861cabdff1aSopenharmony_ci    for (i = 0; i < 16; i++) {
1862cabdff1aSopenharmony_ci        if ((ret = qdm2_decode(s, buf, out)) < 0)
1863cabdff1aSopenharmony_ci            return ret;
1864cabdff1aSopenharmony_ci        out += s->channels * s->frame_size;
1865cabdff1aSopenharmony_ci    }
1866cabdff1aSopenharmony_ci
1867cabdff1aSopenharmony_ci    *got_frame_ptr = 1;
1868cabdff1aSopenharmony_ci
1869cabdff1aSopenharmony_ci    return s->checksum_size;
1870cabdff1aSopenharmony_ci}
1871cabdff1aSopenharmony_ci
1872cabdff1aSopenharmony_ciconst FFCodec ff_qdm2_decoder = {
1873cabdff1aSopenharmony_ci    .p.name           = "qdm2",
1874cabdff1aSopenharmony_ci    .p.long_name      = NULL_IF_CONFIG_SMALL("QDesign Music Codec 2"),
1875cabdff1aSopenharmony_ci    .p.type           = AVMEDIA_TYPE_AUDIO,
1876cabdff1aSopenharmony_ci    .p.id             = AV_CODEC_ID_QDM2,
1877cabdff1aSopenharmony_ci    .priv_data_size   = sizeof(QDM2Context),
1878cabdff1aSopenharmony_ci    .init             = qdm2_decode_init,
1879cabdff1aSopenharmony_ci    .close            = qdm2_decode_close,
1880cabdff1aSopenharmony_ci    FF_CODEC_DECODE_CB(qdm2_decode_frame),
1881cabdff1aSopenharmony_ci    .p.capabilities   = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
1882cabdff1aSopenharmony_ci    .caps_internal    = FF_CODEC_CAP_INIT_THREADSAFE,
1883cabdff1aSopenharmony_ci};
1884