1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * Copyright (C) 2016 foo86
3cabdff1aSopenharmony_ci *
4cabdff1aSopenharmony_ci * This file is part of FFmpeg.
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
10cabdff1aSopenharmony_ci *
11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
14cabdff1aSopenharmony_ci * Lesser General Public License for more details.
15cabdff1aSopenharmony_ci *
16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19cabdff1aSopenharmony_ci */
20cabdff1aSopenharmony_ci
21cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h"
22cabdff1aSopenharmony_ci#include "dcaadpcm.h"
23cabdff1aSopenharmony_ci#include "dcadec.h"
24cabdff1aSopenharmony_ci#include "dcadata.h"
25cabdff1aSopenharmony_ci#include "dcahuff.h"
26cabdff1aSopenharmony_ci#include "dcamath.h"
27cabdff1aSopenharmony_ci#include "dca_syncwords.h"
28cabdff1aSopenharmony_ci#include "internal.h"
29cabdff1aSopenharmony_ci
30cabdff1aSopenharmony_ci#if ARCH_ARM
31cabdff1aSopenharmony_ci#include "arm/dca.h"
32cabdff1aSopenharmony_ci#endif
33cabdff1aSopenharmony_ci
34cabdff1aSopenharmony_cienum HeaderType {
35cabdff1aSopenharmony_ci    HEADER_CORE,
36cabdff1aSopenharmony_ci    HEADER_XCH,
37cabdff1aSopenharmony_ci    HEADER_XXCH
38cabdff1aSopenharmony_ci};
39cabdff1aSopenharmony_ci
40cabdff1aSopenharmony_cistatic const int8_t prm_ch_to_spkr_map[DCA_AMODE_COUNT][5] = {
41cabdff1aSopenharmony_ci    { DCA_SPEAKER_C,            -1,             -1,             -1,             -1 },
42cabdff1aSopenharmony_ci    { DCA_SPEAKER_L, DCA_SPEAKER_R,             -1,             -1,             -1 },
43cabdff1aSopenharmony_ci    { DCA_SPEAKER_L, DCA_SPEAKER_R,             -1,             -1,             -1 },
44cabdff1aSopenharmony_ci    { DCA_SPEAKER_L, DCA_SPEAKER_R,             -1,             -1,             -1 },
45cabdff1aSopenharmony_ci    { DCA_SPEAKER_L, DCA_SPEAKER_R,             -1,             -1,             -1 },
46cabdff1aSopenharmony_ci    { DCA_SPEAKER_C, DCA_SPEAKER_L, DCA_SPEAKER_R ,             -1,             -1 },
47cabdff1aSopenharmony_ci    { DCA_SPEAKER_L, DCA_SPEAKER_R, DCA_SPEAKER_Cs,             -1,             -1 },
48cabdff1aSopenharmony_ci    { DCA_SPEAKER_C, DCA_SPEAKER_L, DCA_SPEAKER_R , DCA_SPEAKER_Cs,             -1 },
49cabdff1aSopenharmony_ci    { DCA_SPEAKER_L, DCA_SPEAKER_R, DCA_SPEAKER_Ls, DCA_SPEAKER_Rs,             -1 },
50cabdff1aSopenharmony_ci    { DCA_SPEAKER_C, DCA_SPEAKER_L, DCA_SPEAKER_R,  DCA_SPEAKER_Ls, DCA_SPEAKER_Rs }
51cabdff1aSopenharmony_ci};
52cabdff1aSopenharmony_ci
53cabdff1aSopenharmony_cistatic const uint8_t audio_mode_ch_mask[DCA_AMODE_COUNT] = {
54cabdff1aSopenharmony_ci    DCA_SPEAKER_LAYOUT_MONO,
55cabdff1aSopenharmony_ci    DCA_SPEAKER_LAYOUT_STEREO,
56cabdff1aSopenharmony_ci    DCA_SPEAKER_LAYOUT_STEREO,
57cabdff1aSopenharmony_ci    DCA_SPEAKER_LAYOUT_STEREO,
58cabdff1aSopenharmony_ci    DCA_SPEAKER_LAYOUT_STEREO,
59cabdff1aSopenharmony_ci    DCA_SPEAKER_LAYOUT_3_0,
60cabdff1aSopenharmony_ci    DCA_SPEAKER_LAYOUT_2_1,
61cabdff1aSopenharmony_ci    DCA_SPEAKER_LAYOUT_3_1,
62cabdff1aSopenharmony_ci    DCA_SPEAKER_LAYOUT_2_2,
63cabdff1aSopenharmony_ci    DCA_SPEAKER_LAYOUT_5POINT0
64cabdff1aSopenharmony_ci};
65cabdff1aSopenharmony_ci
66cabdff1aSopenharmony_cistatic const uint8_t block_code_nbits[7] = {
67cabdff1aSopenharmony_ci    7, 10, 12, 13, 15, 17, 19
68cabdff1aSopenharmony_ci};
69cabdff1aSopenharmony_ci
70cabdff1aSopenharmony_cistatic int dca_get_vlc(GetBitContext *s, DCAVLC *v, int i)
71cabdff1aSopenharmony_ci{
72cabdff1aSopenharmony_ci    return get_vlc2(s, v->vlc[i].table, v->vlc[i].bits, v->max_depth) + v->offset;
73cabdff1aSopenharmony_ci}
74cabdff1aSopenharmony_ci
75cabdff1aSopenharmony_cistatic void get_array(GetBitContext *s, int32_t *array, int size, int n)
76cabdff1aSopenharmony_ci{
77cabdff1aSopenharmony_ci    int i;
78cabdff1aSopenharmony_ci
79cabdff1aSopenharmony_ci    for (i = 0; i < size; i++)
80cabdff1aSopenharmony_ci        array[i] = get_sbits(s, n);
81cabdff1aSopenharmony_ci}
82cabdff1aSopenharmony_ci
83cabdff1aSopenharmony_ci// 5.3.1 - Bit stream header
84cabdff1aSopenharmony_cistatic int parse_frame_header(DCACoreDecoder *s)
85cabdff1aSopenharmony_ci{
86cabdff1aSopenharmony_ci    DCACoreFrameHeader h = { 0 };
87cabdff1aSopenharmony_ci    int err = ff_dca_parse_core_frame_header(&h, &s->gb);
88cabdff1aSopenharmony_ci
89cabdff1aSopenharmony_ci    if (err < 0) {
90cabdff1aSopenharmony_ci        switch (err) {
91cabdff1aSopenharmony_ci        case DCA_PARSE_ERROR_DEFICIT_SAMPLES:
92cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Deficit samples are not supported\n");
93cabdff1aSopenharmony_ci            return h.normal_frame ? AVERROR_INVALIDDATA : AVERROR_PATCHWELCOME;
94cabdff1aSopenharmony_ci
95cabdff1aSopenharmony_ci        case DCA_PARSE_ERROR_PCM_BLOCKS:
96cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Unsupported number of PCM sample blocks (%d)\n", h.npcmblocks);
97cabdff1aSopenharmony_ci            return (h.npcmblocks < 6 || h.normal_frame) ? AVERROR_INVALIDDATA : AVERROR_PATCHWELCOME;
98cabdff1aSopenharmony_ci
99cabdff1aSopenharmony_ci        case DCA_PARSE_ERROR_FRAME_SIZE:
100cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid core frame size (%d bytes)\n", h.frame_size);
101cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
102cabdff1aSopenharmony_ci
103cabdff1aSopenharmony_ci        case DCA_PARSE_ERROR_AMODE:
104cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Unsupported audio channel arrangement (%d)\n", h.audio_mode);
105cabdff1aSopenharmony_ci            return AVERROR_PATCHWELCOME;
106cabdff1aSopenharmony_ci
107cabdff1aSopenharmony_ci        case DCA_PARSE_ERROR_SAMPLE_RATE:
108cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid core audio sampling frequency\n");
109cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
110cabdff1aSopenharmony_ci
111cabdff1aSopenharmony_ci        case DCA_PARSE_ERROR_RESERVED_BIT:
112cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Reserved bit set\n");
113cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
114cabdff1aSopenharmony_ci
115cabdff1aSopenharmony_ci        case DCA_PARSE_ERROR_LFE_FLAG:
116cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid low frequency effects flag\n");
117cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
118cabdff1aSopenharmony_ci
119cabdff1aSopenharmony_ci        case DCA_PARSE_ERROR_PCM_RES:
120cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid source PCM resolution\n");
121cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
122cabdff1aSopenharmony_ci
123cabdff1aSopenharmony_ci        default:
124cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Unknown core frame header error\n");
125cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
126cabdff1aSopenharmony_ci        }
127cabdff1aSopenharmony_ci    }
128cabdff1aSopenharmony_ci
129cabdff1aSopenharmony_ci    s->crc_present          = h.crc_present;
130cabdff1aSopenharmony_ci    s->npcmblocks           = h.npcmblocks;
131cabdff1aSopenharmony_ci    s->frame_size           = h.frame_size;
132cabdff1aSopenharmony_ci    s->audio_mode           = h.audio_mode;
133cabdff1aSopenharmony_ci    s->sample_rate          = ff_dca_sample_rates[h.sr_code];
134cabdff1aSopenharmony_ci    s->bit_rate             = ff_dca_bit_rates[h.br_code];
135cabdff1aSopenharmony_ci    s->drc_present          = h.drc_present;
136cabdff1aSopenharmony_ci    s->ts_present           = h.ts_present;
137cabdff1aSopenharmony_ci    s->aux_present          = h.aux_present;
138cabdff1aSopenharmony_ci    s->ext_audio_type       = h.ext_audio_type;
139cabdff1aSopenharmony_ci    s->ext_audio_present    = h.ext_audio_present;
140cabdff1aSopenharmony_ci    s->sync_ssf             = h.sync_ssf;
141cabdff1aSopenharmony_ci    s->lfe_present          = h.lfe_present;
142cabdff1aSopenharmony_ci    s->predictor_history    = h.predictor_history;
143cabdff1aSopenharmony_ci    s->filter_perfect       = h.filter_perfect;
144cabdff1aSopenharmony_ci    s->source_pcm_res       = ff_dca_bits_per_sample[h.pcmr_code];
145cabdff1aSopenharmony_ci    s->es_format            = h.pcmr_code & 1;
146cabdff1aSopenharmony_ci    s->sumdiff_front        = h.sumdiff_front;
147cabdff1aSopenharmony_ci    s->sumdiff_surround     = h.sumdiff_surround;
148cabdff1aSopenharmony_ci
149cabdff1aSopenharmony_ci    return 0;
150cabdff1aSopenharmony_ci}
151cabdff1aSopenharmony_ci
152cabdff1aSopenharmony_ci// 5.3.2 - Primary audio coding header
153cabdff1aSopenharmony_cistatic int parse_coding_header(DCACoreDecoder *s, enum HeaderType header, int xch_base)
154cabdff1aSopenharmony_ci{
155cabdff1aSopenharmony_ci    int n, ch, nchannels, header_size = 0, header_pos = get_bits_count(&s->gb);
156cabdff1aSopenharmony_ci    unsigned int mask, index;
157cabdff1aSopenharmony_ci
158cabdff1aSopenharmony_ci    if (get_bits_left(&s->gb) < 0)
159cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
160cabdff1aSopenharmony_ci
161cabdff1aSopenharmony_ci    switch (header) {
162cabdff1aSopenharmony_ci    case HEADER_CORE:
163cabdff1aSopenharmony_ci        // Number of subframes
164cabdff1aSopenharmony_ci        s->nsubframes = get_bits(&s->gb, 4) + 1;
165cabdff1aSopenharmony_ci
166cabdff1aSopenharmony_ci        // Number of primary audio channels
167cabdff1aSopenharmony_ci        s->nchannels = get_bits(&s->gb, 3) + 1;
168cabdff1aSopenharmony_ci        if (s->nchannels != ff_dca_channels[s->audio_mode]) {
169cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid number of primary audio channels (%d) for audio channel arrangement (%d)\n", s->nchannels, s->audio_mode);
170cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
171cabdff1aSopenharmony_ci        }
172cabdff1aSopenharmony_ci        av_assert1(s->nchannels <= DCA_CHANNELS - 2);
173cabdff1aSopenharmony_ci
174cabdff1aSopenharmony_ci        s->ch_mask = audio_mode_ch_mask[s->audio_mode];
175cabdff1aSopenharmony_ci
176cabdff1aSopenharmony_ci        // Add LFE channel if present
177cabdff1aSopenharmony_ci        if (s->lfe_present)
178cabdff1aSopenharmony_ci            s->ch_mask |= DCA_SPEAKER_MASK_LFE1;
179cabdff1aSopenharmony_ci        break;
180cabdff1aSopenharmony_ci
181cabdff1aSopenharmony_ci    case HEADER_XCH:
182cabdff1aSopenharmony_ci        s->nchannels = ff_dca_channels[s->audio_mode] + 1;
183cabdff1aSopenharmony_ci        av_assert1(s->nchannels <= DCA_CHANNELS - 1);
184cabdff1aSopenharmony_ci        s->ch_mask |= DCA_SPEAKER_MASK_Cs;
185cabdff1aSopenharmony_ci        break;
186cabdff1aSopenharmony_ci
187cabdff1aSopenharmony_ci    case HEADER_XXCH:
188cabdff1aSopenharmony_ci        // Channel set header length
189cabdff1aSopenharmony_ci        header_size = get_bits(&s->gb, 7) + 1;
190cabdff1aSopenharmony_ci
191cabdff1aSopenharmony_ci        // Check CRC
192cabdff1aSopenharmony_ci        if (s->xxch_crc_present
193cabdff1aSopenharmony_ci            && ff_dca_check_crc(s->avctx, &s->gb, header_pos, header_pos + header_size * 8)) {
194cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid XXCH channel set header checksum\n");
195cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
196cabdff1aSopenharmony_ci        }
197cabdff1aSopenharmony_ci
198cabdff1aSopenharmony_ci        // Number of channels in a channel set
199cabdff1aSopenharmony_ci        nchannels = get_bits(&s->gb, 3) + 1;
200cabdff1aSopenharmony_ci        if (nchannels > DCA_XXCH_CHANNELS_MAX) {
201cabdff1aSopenharmony_ci            avpriv_request_sample(s->avctx, "%d XXCH channels", nchannels);
202cabdff1aSopenharmony_ci            return AVERROR_PATCHWELCOME;
203cabdff1aSopenharmony_ci        }
204cabdff1aSopenharmony_ci        s->nchannels = ff_dca_channels[s->audio_mode] + nchannels;
205cabdff1aSopenharmony_ci        av_assert1(s->nchannels <= DCA_CHANNELS);
206cabdff1aSopenharmony_ci
207cabdff1aSopenharmony_ci        // Loudspeaker layout mask
208cabdff1aSopenharmony_ci        mask = get_bits_long(&s->gb, s->xxch_mask_nbits - DCA_SPEAKER_Cs);
209cabdff1aSopenharmony_ci        s->xxch_spkr_mask = mask << DCA_SPEAKER_Cs;
210cabdff1aSopenharmony_ci
211cabdff1aSopenharmony_ci        if (av_popcount(s->xxch_spkr_mask) != nchannels) {
212cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid XXCH speaker layout mask (%#x)\n", s->xxch_spkr_mask);
213cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
214cabdff1aSopenharmony_ci        }
215cabdff1aSopenharmony_ci
216cabdff1aSopenharmony_ci        if (s->xxch_core_mask & s->xxch_spkr_mask) {
217cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "XXCH speaker layout mask (%#x) overlaps with core (%#x)\n", s->xxch_spkr_mask, s->xxch_core_mask);
218cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
219cabdff1aSopenharmony_ci        }
220cabdff1aSopenharmony_ci
221cabdff1aSopenharmony_ci        // Combine core and XXCH masks together
222cabdff1aSopenharmony_ci        s->ch_mask = s->xxch_core_mask | s->xxch_spkr_mask;
223cabdff1aSopenharmony_ci
224cabdff1aSopenharmony_ci        // Downmix coefficients present in stream
225cabdff1aSopenharmony_ci        if (get_bits1(&s->gb)) {
226cabdff1aSopenharmony_ci            int *coeff_ptr = s->xxch_dmix_coeff;
227cabdff1aSopenharmony_ci
228cabdff1aSopenharmony_ci            // Downmix already performed by encoder
229cabdff1aSopenharmony_ci            s->xxch_dmix_embedded = get_bits1(&s->gb);
230cabdff1aSopenharmony_ci
231cabdff1aSopenharmony_ci            // Downmix scale factor
232cabdff1aSopenharmony_ci            index = get_bits(&s->gb, 6) * 4 - FF_DCA_DMIXTABLE_OFFSET - 3;
233cabdff1aSopenharmony_ci            if (index >= FF_DCA_INV_DMIXTABLE_SIZE) {
234cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "Invalid XXCH downmix scale index (%d)\n", index);
235cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
236cabdff1aSopenharmony_ci            }
237cabdff1aSopenharmony_ci            s->xxch_dmix_scale_inv = ff_dca_inv_dmixtable[index];
238cabdff1aSopenharmony_ci
239cabdff1aSopenharmony_ci            // Downmix channel mapping mask
240cabdff1aSopenharmony_ci            for (ch = 0; ch < nchannels; ch++) {
241cabdff1aSopenharmony_ci                mask = get_bits_long(&s->gb, s->xxch_mask_nbits);
242cabdff1aSopenharmony_ci                if ((mask & s->xxch_core_mask) != mask) {
243cabdff1aSopenharmony_ci                    av_log(s->avctx, AV_LOG_ERROR, "Invalid XXCH downmix channel mapping mask (%#x)\n", mask);
244cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
245cabdff1aSopenharmony_ci                }
246cabdff1aSopenharmony_ci                s->xxch_dmix_mask[ch] = mask;
247cabdff1aSopenharmony_ci            }
248cabdff1aSopenharmony_ci
249cabdff1aSopenharmony_ci            // Downmix coefficients
250cabdff1aSopenharmony_ci            for (ch = 0; ch < nchannels; ch++) {
251cabdff1aSopenharmony_ci                for (n = 0; n < s->xxch_mask_nbits; n++) {
252cabdff1aSopenharmony_ci                    if (s->xxch_dmix_mask[ch] & (1U << n)) {
253cabdff1aSopenharmony_ci                        int code = get_bits(&s->gb, 7);
254cabdff1aSopenharmony_ci                        int sign = (code >> 6) - 1;
255cabdff1aSopenharmony_ci                        if (code &= 63) {
256cabdff1aSopenharmony_ci                            index = code * 4 - 3;
257cabdff1aSopenharmony_ci                            if (index >= FF_DCA_DMIXTABLE_SIZE) {
258cabdff1aSopenharmony_ci                                av_log(s->avctx, AV_LOG_ERROR, "Invalid XXCH downmix coefficient index (%d)\n", index);
259cabdff1aSopenharmony_ci                                return AVERROR_INVALIDDATA;
260cabdff1aSopenharmony_ci                            }
261cabdff1aSopenharmony_ci                            *coeff_ptr++ = (ff_dca_dmixtable[index] ^ sign) - sign;
262cabdff1aSopenharmony_ci                        } else {
263cabdff1aSopenharmony_ci                            *coeff_ptr++ = 0;
264cabdff1aSopenharmony_ci                        }
265cabdff1aSopenharmony_ci                    }
266cabdff1aSopenharmony_ci                }
267cabdff1aSopenharmony_ci            }
268cabdff1aSopenharmony_ci        } else {
269cabdff1aSopenharmony_ci            s->xxch_dmix_embedded = 0;
270cabdff1aSopenharmony_ci        }
271cabdff1aSopenharmony_ci
272cabdff1aSopenharmony_ci        break;
273cabdff1aSopenharmony_ci    }
274cabdff1aSopenharmony_ci
275cabdff1aSopenharmony_ci    // Subband activity count
276cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->nchannels; ch++) {
277cabdff1aSopenharmony_ci        s->nsubbands[ch] = get_bits(&s->gb, 5) + 2;
278cabdff1aSopenharmony_ci        if (s->nsubbands[ch] > DCA_SUBBANDS) {
279cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid subband activity count\n");
280cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
281cabdff1aSopenharmony_ci        }
282cabdff1aSopenharmony_ci    }
283cabdff1aSopenharmony_ci
284cabdff1aSopenharmony_ci    // High frequency VQ start subband
285cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->nchannels; ch++)
286cabdff1aSopenharmony_ci        s->subband_vq_start[ch] = get_bits(&s->gb, 5) + 1;
287cabdff1aSopenharmony_ci
288cabdff1aSopenharmony_ci    // Joint intensity coding index
289cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->nchannels; ch++) {
290cabdff1aSopenharmony_ci        if ((n = get_bits(&s->gb, 3)) && header == HEADER_XXCH)
291cabdff1aSopenharmony_ci            n += xch_base - 1;
292cabdff1aSopenharmony_ci        if (n > s->nchannels) {
293cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid joint intensity coding index\n");
294cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
295cabdff1aSopenharmony_ci        }
296cabdff1aSopenharmony_ci        s->joint_intensity_index[ch] = n;
297cabdff1aSopenharmony_ci    }
298cabdff1aSopenharmony_ci
299cabdff1aSopenharmony_ci    // Transient mode code book
300cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->nchannels; ch++)
301cabdff1aSopenharmony_ci        s->transition_mode_sel[ch] = get_bits(&s->gb, 2);
302cabdff1aSopenharmony_ci
303cabdff1aSopenharmony_ci    // Scale factor code book
304cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->nchannels; ch++) {
305cabdff1aSopenharmony_ci        s->scale_factor_sel[ch] = get_bits(&s->gb, 3);
306cabdff1aSopenharmony_ci        if (s->scale_factor_sel[ch] == 7) {
307cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid scale factor code book\n");
308cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
309cabdff1aSopenharmony_ci        }
310cabdff1aSopenharmony_ci    }
311cabdff1aSopenharmony_ci
312cabdff1aSopenharmony_ci    // Bit allocation quantizer select
313cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->nchannels; ch++) {
314cabdff1aSopenharmony_ci        s->bit_allocation_sel[ch] = get_bits(&s->gb, 3);
315cabdff1aSopenharmony_ci        if (s->bit_allocation_sel[ch] == 7) {
316cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid bit allocation quantizer select\n");
317cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
318cabdff1aSopenharmony_ci        }
319cabdff1aSopenharmony_ci    }
320cabdff1aSopenharmony_ci
321cabdff1aSopenharmony_ci    // Quantization index codebook select
322cabdff1aSopenharmony_ci    for (n = 0; n < DCA_CODE_BOOKS; n++)
323cabdff1aSopenharmony_ci        for (ch = xch_base; ch < s->nchannels; ch++)
324cabdff1aSopenharmony_ci            s->quant_index_sel[ch][n] = get_bits(&s->gb, ff_dca_quant_index_sel_nbits[n]);
325cabdff1aSopenharmony_ci
326cabdff1aSopenharmony_ci    // Scale factor adjustment index
327cabdff1aSopenharmony_ci    for (n = 0; n < DCA_CODE_BOOKS; n++)
328cabdff1aSopenharmony_ci        for (ch = xch_base; ch < s->nchannels; ch++)
329cabdff1aSopenharmony_ci            if (s->quant_index_sel[ch][n] < ff_dca_quant_index_group_size[n])
330cabdff1aSopenharmony_ci                s->scale_factor_adj[ch][n] = ff_dca_scale_factor_adj[get_bits(&s->gb, 2)];
331cabdff1aSopenharmony_ci
332cabdff1aSopenharmony_ci    if (header == HEADER_XXCH) {
333cabdff1aSopenharmony_ci        // Reserved
334cabdff1aSopenharmony_ci        // Byte align
335cabdff1aSopenharmony_ci        // CRC16 of channel set header
336cabdff1aSopenharmony_ci        if (ff_dca_seek_bits(&s->gb, header_pos + header_size * 8)) {
337cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Read past end of XXCH channel set header\n");
338cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
339cabdff1aSopenharmony_ci        }
340cabdff1aSopenharmony_ci    } else {
341cabdff1aSopenharmony_ci        // Audio header CRC check word
342cabdff1aSopenharmony_ci        if (s->crc_present)
343cabdff1aSopenharmony_ci            skip_bits(&s->gb, 16);
344cabdff1aSopenharmony_ci    }
345cabdff1aSopenharmony_ci
346cabdff1aSopenharmony_ci    return 0;
347cabdff1aSopenharmony_ci}
348cabdff1aSopenharmony_ci
349cabdff1aSopenharmony_cistatic inline int parse_scale(DCACoreDecoder *s, int *scale_index, int sel)
350cabdff1aSopenharmony_ci{
351cabdff1aSopenharmony_ci    const uint32_t *scale_table;
352cabdff1aSopenharmony_ci    unsigned int scale_size;
353cabdff1aSopenharmony_ci
354cabdff1aSopenharmony_ci    // Select the root square table
355cabdff1aSopenharmony_ci    if (sel > 5) {
356cabdff1aSopenharmony_ci        scale_table = ff_dca_scale_factor_quant7;
357cabdff1aSopenharmony_ci        scale_size = FF_ARRAY_ELEMS(ff_dca_scale_factor_quant7);
358cabdff1aSopenharmony_ci    } else {
359cabdff1aSopenharmony_ci        scale_table = ff_dca_scale_factor_quant6;
360cabdff1aSopenharmony_ci        scale_size = FF_ARRAY_ELEMS(ff_dca_scale_factor_quant6);
361cabdff1aSopenharmony_ci    }
362cabdff1aSopenharmony_ci
363cabdff1aSopenharmony_ci    // If Huffman code was used, the difference of scales was encoded
364cabdff1aSopenharmony_ci    if (sel < 5)
365cabdff1aSopenharmony_ci        *scale_index += dca_get_vlc(&s->gb, &ff_dca_vlc_scale_factor, sel);
366cabdff1aSopenharmony_ci    else
367cabdff1aSopenharmony_ci        *scale_index = get_bits(&s->gb, sel + 1);
368cabdff1aSopenharmony_ci
369cabdff1aSopenharmony_ci    // Look up scale factor from the root square table
370cabdff1aSopenharmony_ci    if ((unsigned int)*scale_index >= scale_size) {
371cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Invalid scale factor index\n");
372cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
373cabdff1aSopenharmony_ci    }
374cabdff1aSopenharmony_ci
375cabdff1aSopenharmony_ci    return scale_table[*scale_index];
376cabdff1aSopenharmony_ci}
377cabdff1aSopenharmony_ci
378cabdff1aSopenharmony_cistatic inline int parse_joint_scale(DCACoreDecoder *s, int sel)
379cabdff1aSopenharmony_ci{
380cabdff1aSopenharmony_ci    int scale_index;
381cabdff1aSopenharmony_ci
382cabdff1aSopenharmony_ci    // Absolute value was encoded even when Huffman code was used
383cabdff1aSopenharmony_ci    if (sel < 5)
384cabdff1aSopenharmony_ci        scale_index = dca_get_vlc(&s->gb, &ff_dca_vlc_scale_factor, sel);
385cabdff1aSopenharmony_ci    else
386cabdff1aSopenharmony_ci        scale_index = get_bits(&s->gb, sel + 1);
387cabdff1aSopenharmony_ci
388cabdff1aSopenharmony_ci    // Bias by 64
389cabdff1aSopenharmony_ci    scale_index += 64;
390cabdff1aSopenharmony_ci
391cabdff1aSopenharmony_ci    // Look up joint scale factor
392cabdff1aSopenharmony_ci    if ((unsigned int)scale_index >= FF_ARRAY_ELEMS(ff_dca_joint_scale_factors)) {
393cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Invalid joint scale factor index\n");
394cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
395cabdff1aSopenharmony_ci    }
396cabdff1aSopenharmony_ci
397cabdff1aSopenharmony_ci    return ff_dca_joint_scale_factors[scale_index];
398cabdff1aSopenharmony_ci}
399cabdff1aSopenharmony_ci
400cabdff1aSopenharmony_ci// 5.4.1 - Primary audio coding side information
401cabdff1aSopenharmony_cistatic int parse_subframe_header(DCACoreDecoder *s, int sf,
402cabdff1aSopenharmony_ci                                 enum HeaderType header, int xch_base)
403cabdff1aSopenharmony_ci{
404cabdff1aSopenharmony_ci    int ch, band, ret;
405cabdff1aSopenharmony_ci
406cabdff1aSopenharmony_ci    if (get_bits_left(&s->gb) < 0)
407cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
408cabdff1aSopenharmony_ci
409cabdff1aSopenharmony_ci    if (header == HEADER_CORE) {
410cabdff1aSopenharmony_ci        // Subsubframe count
411cabdff1aSopenharmony_ci        s->nsubsubframes[sf] = get_bits(&s->gb, 2) + 1;
412cabdff1aSopenharmony_ci
413cabdff1aSopenharmony_ci        // Partial subsubframe sample count
414cabdff1aSopenharmony_ci        skip_bits(&s->gb, 3);
415cabdff1aSopenharmony_ci    }
416cabdff1aSopenharmony_ci
417cabdff1aSopenharmony_ci    // Prediction mode
418cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->nchannels; ch++)
419cabdff1aSopenharmony_ci        for (band = 0; band < s->nsubbands[ch]; band++)
420cabdff1aSopenharmony_ci            s->prediction_mode[ch][band] = get_bits1(&s->gb);
421cabdff1aSopenharmony_ci
422cabdff1aSopenharmony_ci    // Prediction coefficients VQ address
423cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->nchannels; ch++)
424cabdff1aSopenharmony_ci        for (band = 0; band < s->nsubbands[ch]; band++)
425cabdff1aSopenharmony_ci            if (s->prediction_mode[ch][band])
426cabdff1aSopenharmony_ci                s->prediction_vq_index[ch][band] = get_bits(&s->gb, 12);
427cabdff1aSopenharmony_ci
428cabdff1aSopenharmony_ci    // Bit allocation index
429cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->nchannels; ch++) {
430cabdff1aSopenharmony_ci        int sel = s->bit_allocation_sel[ch];
431cabdff1aSopenharmony_ci
432cabdff1aSopenharmony_ci        for (band = 0; band < s->subband_vq_start[ch]; band++) {
433cabdff1aSopenharmony_ci            int abits;
434cabdff1aSopenharmony_ci
435cabdff1aSopenharmony_ci            if (sel < 5)
436cabdff1aSopenharmony_ci                abits = dca_get_vlc(&s->gb, &ff_dca_vlc_bit_allocation, sel);
437cabdff1aSopenharmony_ci            else
438cabdff1aSopenharmony_ci                abits = get_bits(&s->gb, sel - 1);
439cabdff1aSopenharmony_ci
440cabdff1aSopenharmony_ci            if (abits > DCA_ABITS_MAX) {
441cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "Invalid bit allocation index\n");
442cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
443cabdff1aSopenharmony_ci            }
444cabdff1aSopenharmony_ci
445cabdff1aSopenharmony_ci            s->bit_allocation[ch][band] = abits;
446cabdff1aSopenharmony_ci        }
447cabdff1aSopenharmony_ci    }
448cabdff1aSopenharmony_ci
449cabdff1aSopenharmony_ci    // Transition mode
450cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->nchannels; ch++) {
451cabdff1aSopenharmony_ci        // Clear transition mode for all subbands
452cabdff1aSopenharmony_ci        memset(s->transition_mode[sf][ch], 0, sizeof(s->transition_mode[0][0]));
453cabdff1aSopenharmony_ci
454cabdff1aSopenharmony_ci        // Transient possible only if more than one subsubframe
455cabdff1aSopenharmony_ci        if (s->nsubsubframes[sf] > 1) {
456cabdff1aSopenharmony_ci            int sel = s->transition_mode_sel[ch];
457cabdff1aSopenharmony_ci            for (band = 0; band < s->subband_vq_start[ch]; band++)
458cabdff1aSopenharmony_ci                if (s->bit_allocation[ch][band])
459cabdff1aSopenharmony_ci                    s->transition_mode[sf][ch][band] = dca_get_vlc(&s->gb, &ff_dca_vlc_transition_mode, sel);
460cabdff1aSopenharmony_ci        }
461cabdff1aSopenharmony_ci    }
462cabdff1aSopenharmony_ci
463cabdff1aSopenharmony_ci    // Scale factors
464cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->nchannels; ch++) {
465cabdff1aSopenharmony_ci        int sel = s->scale_factor_sel[ch];
466cabdff1aSopenharmony_ci        int scale_index = 0;
467cabdff1aSopenharmony_ci
468cabdff1aSopenharmony_ci        // Extract scales for subbands up to VQ
469cabdff1aSopenharmony_ci        for (band = 0; band < s->subband_vq_start[ch]; band++) {
470cabdff1aSopenharmony_ci            if (s->bit_allocation[ch][band]) {
471cabdff1aSopenharmony_ci                if ((ret = parse_scale(s, &scale_index, sel)) < 0)
472cabdff1aSopenharmony_ci                    return ret;
473cabdff1aSopenharmony_ci                s->scale_factors[ch][band][0] = ret;
474cabdff1aSopenharmony_ci                if (s->transition_mode[sf][ch][band]) {
475cabdff1aSopenharmony_ci                    if ((ret = parse_scale(s, &scale_index, sel)) < 0)
476cabdff1aSopenharmony_ci                        return ret;
477cabdff1aSopenharmony_ci                    s->scale_factors[ch][band][1] = ret;
478cabdff1aSopenharmony_ci                }
479cabdff1aSopenharmony_ci            } else {
480cabdff1aSopenharmony_ci                s->scale_factors[ch][band][0] = 0;
481cabdff1aSopenharmony_ci            }
482cabdff1aSopenharmony_ci        }
483cabdff1aSopenharmony_ci
484cabdff1aSopenharmony_ci        // High frequency VQ subbands
485cabdff1aSopenharmony_ci        for (band = s->subband_vq_start[ch]; band < s->nsubbands[ch]; band++) {
486cabdff1aSopenharmony_ci            if ((ret = parse_scale(s, &scale_index, sel)) < 0)
487cabdff1aSopenharmony_ci                return ret;
488cabdff1aSopenharmony_ci            s->scale_factors[ch][band][0] = ret;
489cabdff1aSopenharmony_ci        }
490cabdff1aSopenharmony_ci    }
491cabdff1aSopenharmony_ci
492cabdff1aSopenharmony_ci    // Joint subband codebook select
493cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->nchannels; ch++) {
494cabdff1aSopenharmony_ci        if (s->joint_intensity_index[ch]) {
495cabdff1aSopenharmony_ci            s->joint_scale_sel[ch] = get_bits(&s->gb, 3);
496cabdff1aSopenharmony_ci            if (s->joint_scale_sel[ch] == 7) {
497cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "Invalid joint scale factor code book\n");
498cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
499cabdff1aSopenharmony_ci            }
500cabdff1aSopenharmony_ci        }
501cabdff1aSopenharmony_ci    }
502cabdff1aSopenharmony_ci
503cabdff1aSopenharmony_ci    // Scale factors for joint subband coding
504cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->nchannels; ch++) {
505cabdff1aSopenharmony_ci        int src_ch = s->joint_intensity_index[ch] - 1;
506cabdff1aSopenharmony_ci        if (src_ch >= 0) {
507cabdff1aSopenharmony_ci            int sel = s->joint_scale_sel[ch];
508cabdff1aSopenharmony_ci            for (band = s->nsubbands[ch]; band < s->nsubbands[src_ch]; band++) {
509cabdff1aSopenharmony_ci                if ((ret = parse_joint_scale(s, sel)) < 0)
510cabdff1aSopenharmony_ci                    return ret;
511cabdff1aSopenharmony_ci                s->joint_scale_factors[ch][band] = ret;
512cabdff1aSopenharmony_ci            }
513cabdff1aSopenharmony_ci        }
514cabdff1aSopenharmony_ci    }
515cabdff1aSopenharmony_ci
516cabdff1aSopenharmony_ci    // Dynamic range coefficient
517cabdff1aSopenharmony_ci    if (s->drc_present && header == HEADER_CORE)
518cabdff1aSopenharmony_ci        skip_bits(&s->gb, 8);
519cabdff1aSopenharmony_ci
520cabdff1aSopenharmony_ci    // Side information CRC check word
521cabdff1aSopenharmony_ci    if (s->crc_present)
522cabdff1aSopenharmony_ci        skip_bits(&s->gb, 16);
523cabdff1aSopenharmony_ci
524cabdff1aSopenharmony_ci    return 0;
525cabdff1aSopenharmony_ci}
526cabdff1aSopenharmony_ci
527cabdff1aSopenharmony_ci#ifndef decode_blockcodes
528cabdff1aSopenharmony_cistatic inline int decode_blockcodes(int code1, int code2, int levels, int32_t *audio)
529cabdff1aSopenharmony_ci{
530cabdff1aSopenharmony_ci    int offset = (levels - 1) / 2;
531cabdff1aSopenharmony_ci    int n, div;
532cabdff1aSopenharmony_ci
533cabdff1aSopenharmony_ci    for (n = 0; n < DCA_SUBBAND_SAMPLES / 2; n++) {
534cabdff1aSopenharmony_ci        div = FASTDIV(code1, levels);
535cabdff1aSopenharmony_ci        audio[n] = code1 - div * levels - offset;
536cabdff1aSopenharmony_ci        code1 = div;
537cabdff1aSopenharmony_ci    }
538cabdff1aSopenharmony_ci    for (; n < DCA_SUBBAND_SAMPLES; n++) {
539cabdff1aSopenharmony_ci        div = FASTDIV(code2, levels);
540cabdff1aSopenharmony_ci        audio[n] = code2 - div * levels - offset;
541cabdff1aSopenharmony_ci        code2 = div;
542cabdff1aSopenharmony_ci    }
543cabdff1aSopenharmony_ci
544cabdff1aSopenharmony_ci    return code1 | code2;
545cabdff1aSopenharmony_ci}
546cabdff1aSopenharmony_ci#endif
547cabdff1aSopenharmony_ci
548cabdff1aSopenharmony_cistatic inline int parse_block_codes(DCACoreDecoder *s, int32_t *audio, int abits)
549cabdff1aSopenharmony_ci{
550cabdff1aSopenharmony_ci    // Extract block code indices from the bit stream
551cabdff1aSopenharmony_ci    int code1 = get_bits(&s->gb, block_code_nbits[abits - 1]);
552cabdff1aSopenharmony_ci    int code2 = get_bits(&s->gb, block_code_nbits[abits - 1]);
553cabdff1aSopenharmony_ci    int levels = ff_dca_quant_levels[abits];
554cabdff1aSopenharmony_ci
555cabdff1aSopenharmony_ci    // Look up samples from the block code book
556cabdff1aSopenharmony_ci    if (decode_blockcodes(code1, code2, levels, audio)) {
557cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Failed to decode block code(s)\n");
558cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
559cabdff1aSopenharmony_ci    }
560cabdff1aSopenharmony_ci
561cabdff1aSopenharmony_ci    return 0;
562cabdff1aSopenharmony_ci}
563cabdff1aSopenharmony_ci
564cabdff1aSopenharmony_cistatic inline int parse_huffman_codes(DCACoreDecoder *s, int32_t *audio, int abits, int sel)
565cabdff1aSopenharmony_ci{
566cabdff1aSopenharmony_ci    int i;
567cabdff1aSopenharmony_ci
568cabdff1aSopenharmony_ci    // Extract Huffman codes from the bit stream
569cabdff1aSopenharmony_ci    for (i = 0; i < DCA_SUBBAND_SAMPLES; i++)
570cabdff1aSopenharmony_ci        audio[i] = dca_get_vlc(&s->gb, &ff_dca_vlc_quant_index[abits - 1], sel);
571cabdff1aSopenharmony_ci
572cabdff1aSopenharmony_ci    return 1;
573cabdff1aSopenharmony_ci}
574cabdff1aSopenharmony_ci
575cabdff1aSopenharmony_cistatic inline int extract_audio(DCACoreDecoder *s, int32_t *audio, int abits, int ch)
576cabdff1aSopenharmony_ci{
577cabdff1aSopenharmony_ci    av_assert1(abits >= 0 && abits <= DCA_ABITS_MAX);
578cabdff1aSopenharmony_ci
579cabdff1aSopenharmony_ci    if (abits == 0) {
580cabdff1aSopenharmony_ci        // No bits allocated
581cabdff1aSopenharmony_ci        memset(audio, 0, DCA_SUBBAND_SAMPLES * sizeof(*audio));
582cabdff1aSopenharmony_ci        return 0;
583cabdff1aSopenharmony_ci    }
584cabdff1aSopenharmony_ci
585cabdff1aSopenharmony_ci    if (abits <= DCA_CODE_BOOKS) {
586cabdff1aSopenharmony_ci        int sel = s->quant_index_sel[ch][abits - 1];
587cabdff1aSopenharmony_ci        if (sel < ff_dca_quant_index_group_size[abits - 1]) {
588cabdff1aSopenharmony_ci            // Huffman codes
589cabdff1aSopenharmony_ci            return parse_huffman_codes(s, audio, abits, sel);
590cabdff1aSopenharmony_ci        }
591cabdff1aSopenharmony_ci        if (abits <= 7) {
592cabdff1aSopenharmony_ci            // Block codes
593cabdff1aSopenharmony_ci            return parse_block_codes(s, audio, abits);
594cabdff1aSopenharmony_ci        }
595cabdff1aSopenharmony_ci    }
596cabdff1aSopenharmony_ci
597cabdff1aSopenharmony_ci    // No further encoding
598cabdff1aSopenharmony_ci    get_array(&s->gb, audio, DCA_SUBBAND_SAMPLES, abits - 3);
599cabdff1aSopenharmony_ci    return 0;
600cabdff1aSopenharmony_ci}
601cabdff1aSopenharmony_ci
602cabdff1aSopenharmony_cistatic inline void inverse_adpcm(int32_t **subband_samples,
603cabdff1aSopenharmony_ci                                 const int16_t *vq_index,
604cabdff1aSopenharmony_ci                                 const int8_t *prediction_mode,
605cabdff1aSopenharmony_ci                                 int sb_start, int sb_end,
606cabdff1aSopenharmony_ci                                 int ofs, int len)
607cabdff1aSopenharmony_ci{
608cabdff1aSopenharmony_ci    int i, j;
609cabdff1aSopenharmony_ci
610cabdff1aSopenharmony_ci    for (i = sb_start; i < sb_end; i++) {
611cabdff1aSopenharmony_ci        if (prediction_mode[i]) {
612cabdff1aSopenharmony_ci            const int pred_id = vq_index[i];
613cabdff1aSopenharmony_ci            int32_t *ptr = subband_samples[i] + ofs;
614cabdff1aSopenharmony_ci            for (j = 0; j < len; j++) {
615cabdff1aSopenharmony_ci                int32_t x = ff_dcaadpcm_predict(pred_id, ptr + j - DCA_ADPCM_COEFFS);
616cabdff1aSopenharmony_ci                ptr[j] = clip23(ptr[j] + x);
617cabdff1aSopenharmony_ci            }
618cabdff1aSopenharmony_ci        }
619cabdff1aSopenharmony_ci    }
620cabdff1aSopenharmony_ci}
621cabdff1aSopenharmony_ci
622cabdff1aSopenharmony_ci// 5.5 - Primary audio data arrays
623cabdff1aSopenharmony_cistatic int parse_subframe_audio(DCACoreDecoder *s, int sf, enum HeaderType header,
624cabdff1aSopenharmony_ci                                int xch_base, int *sub_pos, int *lfe_pos)
625cabdff1aSopenharmony_ci{
626cabdff1aSopenharmony_ci    int32_t audio[16], scale;
627cabdff1aSopenharmony_ci    int n, ssf, ofs, ch, band;
628cabdff1aSopenharmony_ci
629cabdff1aSopenharmony_ci    // Check number of subband samples in this subframe
630cabdff1aSopenharmony_ci    int nsamples = s->nsubsubframes[sf] * DCA_SUBBAND_SAMPLES;
631cabdff1aSopenharmony_ci    if (*sub_pos + nsamples > s->npcmblocks) {
632cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Subband sample buffer overflow\n");
633cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
634cabdff1aSopenharmony_ci    }
635cabdff1aSopenharmony_ci
636cabdff1aSopenharmony_ci    if (get_bits_left(&s->gb) < 0)
637cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
638cabdff1aSopenharmony_ci
639cabdff1aSopenharmony_ci    // VQ encoded subbands
640cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->nchannels; ch++) {
641cabdff1aSopenharmony_ci        int32_t vq_index[DCA_SUBBANDS];
642cabdff1aSopenharmony_ci
643cabdff1aSopenharmony_ci        for (band = s->subband_vq_start[ch]; band < s->nsubbands[ch]; band++)
644cabdff1aSopenharmony_ci            // Extract the VQ address from the bit stream
645cabdff1aSopenharmony_ci            vq_index[band] = get_bits(&s->gb, 10);
646cabdff1aSopenharmony_ci
647cabdff1aSopenharmony_ci        if (s->subband_vq_start[ch] < s->nsubbands[ch]) {
648cabdff1aSopenharmony_ci            s->dcadsp->decode_hf(s->subband_samples[ch], vq_index,
649cabdff1aSopenharmony_ci                                 ff_dca_high_freq_vq, s->scale_factors[ch],
650cabdff1aSopenharmony_ci                                 s->subband_vq_start[ch], s->nsubbands[ch],
651cabdff1aSopenharmony_ci                                 *sub_pos, nsamples);
652cabdff1aSopenharmony_ci        }
653cabdff1aSopenharmony_ci    }
654cabdff1aSopenharmony_ci
655cabdff1aSopenharmony_ci    // Low frequency effect data
656cabdff1aSopenharmony_ci    if (s->lfe_present && header == HEADER_CORE) {
657cabdff1aSopenharmony_ci        unsigned int index;
658cabdff1aSopenharmony_ci
659cabdff1aSopenharmony_ci        // Determine number of LFE samples in this subframe
660cabdff1aSopenharmony_ci        int nlfesamples = 2 * s->lfe_present * s->nsubsubframes[sf];
661cabdff1aSopenharmony_ci        av_assert1((unsigned int)nlfesamples <= FF_ARRAY_ELEMS(audio));
662cabdff1aSopenharmony_ci
663cabdff1aSopenharmony_ci        // Extract LFE samples from the bit stream
664cabdff1aSopenharmony_ci        get_array(&s->gb, audio, nlfesamples, 8);
665cabdff1aSopenharmony_ci
666cabdff1aSopenharmony_ci        // Extract scale factor index from the bit stream
667cabdff1aSopenharmony_ci        index = get_bits(&s->gb, 8);
668cabdff1aSopenharmony_ci        if (index >= FF_ARRAY_ELEMS(ff_dca_scale_factor_quant7)) {
669cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid LFE scale factor index\n");
670cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
671cabdff1aSopenharmony_ci        }
672cabdff1aSopenharmony_ci
673cabdff1aSopenharmony_ci        // Look up the 7-bit root square quantization table
674cabdff1aSopenharmony_ci        scale = ff_dca_scale_factor_quant7[index];
675cabdff1aSopenharmony_ci
676cabdff1aSopenharmony_ci        // Account for quantizer step size which is 0.035
677cabdff1aSopenharmony_ci        scale = mul23(4697620 /* 0.035 * (1 << 27) */, scale);
678cabdff1aSopenharmony_ci
679cabdff1aSopenharmony_ci        // Scale and take the LFE samples
680cabdff1aSopenharmony_ci        for (n = 0, ofs = *lfe_pos; n < nlfesamples; n++, ofs++)
681cabdff1aSopenharmony_ci            s->lfe_samples[ofs] = clip23(audio[n] * scale >> 4);
682cabdff1aSopenharmony_ci
683cabdff1aSopenharmony_ci        // Advance LFE sample pointer for the next subframe
684cabdff1aSopenharmony_ci        *lfe_pos = ofs;
685cabdff1aSopenharmony_ci    }
686cabdff1aSopenharmony_ci
687cabdff1aSopenharmony_ci    // Audio data
688cabdff1aSopenharmony_ci    for (ssf = 0, ofs = *sub_pos; ssf < s->nsubsubframes[sf]; ssf++) {
689cabdff1aSopenharmony_ci        for (ch = xch_base; ch < s->nchannels; ch++) {
690cabdff1aSopenharmony_ci            if (get_bits_left(&s->gb) < 0)
691cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
692cabdff1aSopenharmony_ci
693cabdff1aSopenharmony_ci            // Not high frequency VQ subbands
694cabdff1aSopenharmony_ci            for (band = 0; band < s->subband_vq_start[ch]; band++) {
695cabdff1aSopenharmony_ci                int ret, trans_ssf, abits = s->bit_allocation[ch][band];
696cabdff1aSopenharmony_ci                int32_t step_size;
697cabdff1aSopenharmony_ci
698cabdff1aSopenharmony_ci                // Extract bits from the bit stream
699cabdff1aSopenharmony_ci                if ((ret = extract_audio(s, audio, abits, ch)) < 0)
700cabdff1aSopenharmony_ci                    return ret;
701cabdff1aSopenharmony_ci
702cabdff1aSopenharmony_ci                // Select quantization step size table and look up
703cabdff1aSopenharmony_ci                // quantization step size
704cabdff1aSopenharmony_ci                if (s->bit_rate == 3)
705cabdff1aSopenharmony_ci                    step_size = ff_dca_lossless_quant[abits];
706cabdff1aSopenharmony_ci                else
707cabdff1aSopenharmony_ci                    step_size = ff_dca_lossy_quant[abits];
708cabdff1aSopenharmony_ci
709cabdff1aSopenharmony_ci                // Identify transient location
710cabdff1aSopenharmony_ci                trans_ssf = s->transition_mode[sf][ch][band];
711cabdff1aSopenharmony_ci
712cabdff1aSopenharmony_ci                // Determine proper scale factor
713cabdff1aSopenharmony_ci                if (trans_ssf == 0 || ssf < trans_ssf)
714cabdff1aSopenharmony_ci                    scale = s->scale_factors[ch][band][0];
715cabdff1aSopenharmony_ci                else
716cabdff1aSopenharmony_ci                    scale = s->scale_factors[ch][band][1];
717cabdff1aSopenharmony_ci
718cabdff1aSopenharmony_ci                // Adjust scale factor when SEL indicates Huffman code
719cabdff1aSopenharmony_ci                if (ret > 0) {
720cabdff1aSopenharmony_ci                    int64_t adj = s->scale_factor_adj[ch][abits - 1];
721cabdff1aSopenharmony_ci                    scale = clip23(adj * scale >> 22);
722cabdff1aSopenharmony_ci                }
723cabdff1aSopenharmony_ci
724cabdff1aSopenharmony_ci                ff_dca_core_dequantize(s->subband_samples[ch][band] + ofs,
725cabdff1aSopenharmony_ci                           audio, step_size, scale, 0, DCA_SUBBAND_SAMPLES);
726cabdff1aSopenharmony_ci            }
727cabdff1aSopenharmony_ci        }
728cabdff1aSopenharmony_ci
729cabdff1aSopenharmony_ci        // DSYNC
730cabdff1aSopenharmony_ci        if ((ssf == s->nsubsubframes[sf] - 1 || s->sync_ssf) && get_bits(&s->gb, 16) != 0xffff) {
731cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "DSYNC check failed\n");
732cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
733cabdff1aSopenharmony_ci        }
734cabdff1aSopenharmony_ci
735cabdff1aSopenharmony_ci        ofs += DCA_SUBBAND_SAMPLES;
736cabdff1aSopenharmony_ci    }
737cabdff1aSopenharmony_ci
738cabdff1aSopenharmony_ci    // Inverse ADPCM
739cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->nchannels; ch++) {
740cabdff1aSopenharmony_ci        inverse_adpcm(s->subband_samples[ch], s->prediction_vq_index[ch],
741cabdff1aSopenharmony_ci                      s->prediction_mode[ch], 0, s->nsubbands[ch],
742cabdff1aSopenharmony_ci                      *sub_pos, nsamples);
743cabdff1aSopenharmony_ci    }
744cabdff1aSopenharmony_ci
745cabdff1aSopenharmony_ci    // Joint subband coding
746cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->nchannels; ch++) {
747cabdff1aSopenharmony_ci        int src_ch = s->joint_intensity_index[ch] - 1;
748cabdff1aSopenharmony_ci        if (src_ch >= 0) {
749cabdff1aSopenharmony_ci            s->dcadsp->decode_joint(s->subband_samples[ch], s->subband_samples[src_ch],
750cabdff1aSopenharmony_ci                                    s->joint_scale_factors[ch], s->nsubbands[ch],
751cabdff1aSopenharmony_ci                                    s->nsubbands[src_ch], *sub_pos, nsamples);
752cabdff1aSopenharmony_ci        }
753cabdff1aSopenharmony_ci    }
754cabdff1aSopenharmony_ci
755cabdff1aSopenharmony_ci    // Advance subband sample pointer for the next subframe
756cabdff1aSopenharmony_ci    *sub_pos = ofs;
757cabdff1aSopenharmony_ci    return 0;
758cabdff1aSopenharmony_ci}
759cabdff1aSopenharmony_ci
760cabdff1aSopenharmony_cistatic void erase_adpcm_history(DCACoreDecoder *s)
761cabdff1aSopenharmony_ci{
762cabdff1aSopenharmony_ci    int ch, band;
763cabdff1aSopenharmony_ci
764cabdff1aSopenharmony_ci    // Erase ADPCM history from previous frame if
765cabdff1aSopenharmony_ci    // predictor history switch was disabled
766cabdff1aSopenharmony_ci    for (ch = 0; ch < DCA_CHANNELS; ch++)
767cabdff1aSopenharmony_ci        for (band = 0; band < DCA_SUBBANDS; band++)
768cabdff1aSopenharmony_ci            AV_ZERO128(s->subband_samples[ch][band] - DCA_ADPCM_COEFFS);
769cabdff1aSopenharmony_ci
770cabdff1aSopenharmony_ci    emms_c();
771cabdff1aSopenharmony_ci}
772cabdff1aSopenharmony_ci
773cabdff1aSopenharmony_cistatic int alloc_sample_buffer(DCACoreDecoder *s)
774cabdff1aSopenharmony_ci{
775cabdff1aSopenharmony_ci    int nchsamples = DCA_ADPCM_COEFFS + s->npcmblocks;
776cabdff1aSopenharmony_ci    int nframesamples = nchsamples * DCA_CHANNELS * DCA_SUBBANDS;
777cabdff1aSopenharmony_ci    int nlfesamples = DCA_LFE_HISTORY + s->npcmblocks / 2;
778cabdff1aSopenharmony_ci    unsigned int size = s->subband_size;
779cabdff1aSopenharmony_ci    int ch, band;
780cabdff1aSopenharmony_ci
781cabdff1aSopenharmony_ci    // Reallocate subband sample buffer
782cabdff1aSopenharmony_ci    av_fast_mallocz(&s->subband_buffer, &s->subband_size,
783cabdff1aSopenharmony_ci                    (nframesamples + nlfesamples) * sizeof(int32_t));
784cabdff1aSopenharmony_ci    if (!s->subband_buffer)
785cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
786cabdff1aSopenharmony_ci
787cabdff1aSopenharmony_ci    if (size != s->subband_size) {
788cabdff1aSopenharmony_ci        for (ch = 0; ch < DCA_CHANNELS; ch++)
789cabdff1aSopenharmony_ci            for (band = 0; band < DCA_SUBBANDS; band++)
790cabdff1aSopenharmony_ci                s->subband_samples[ch][band] = s->subband_buffer +
791cabdff1aSopenharmony_ci                    (ch * DCA_SUBBANDS + band) * nchsamples + DCA_ADPCM_COEFFS;
792cabdff1aSopenharmony_ci        s->lfe_samples = s->subband_buffer + nframesamples;
793cabdff1aSopenharmony_ci    }
794cabdff1aSopenharmony_ci
795cabdff1aSopenharmony_ci    if (!s->predictor_history)
796cabdff1aSopenharmony_ci        erase_adpcm_history(s);
797cabdff1aSopenharmony_ci
798cabdff1aSopenharmony_ci    return 0;
799cabdff1aSopenharmony_ci}
800cabdff1aSopenharmony_ci
801cabdff1aSopenharmony_cistatic int parse_frame_data(DCACoreDecoder *s, enum HeaderType header, int xch_base)
802cabdff1aSopenharmony_ci{
803cabdff1aSopenharmony_ci    int sf, ch, ret, band, sub_pos, lfe_pos;
804cabdff1aSopenharmony_ci
805cabdff1aSopenharmony_ci    if ((ret = parse_coding_header(s, header, xch_base)) < 0)
806cabdff1aSopenharmony_ci        return ret;
807cabdff1aSopenharmony_ci
808cabdff1aSopenharmony_ci    for (sf = 0, sub_pos = 0, lfe_pos = DCA_LFE_HISTORY; sf < s->nsubframes; sf++) {
809cabdff1aSopenharmony_ci        if ((ret = parse_subframe_header(s, sf, header, xch_base)) < 0)
810cabdff1aSopenharmony_ci            return ret;
811cabdff1aSopenharmony_ci        if ((ret = parse_subframe_audio(s, sf, header, xch_base, &sub_pos, &lfe_pos)) < 0)
812cabdff1aSopenharmony_ci            return ret;
813cabdff1aSopenharmony_ci    }
814cabdff1aSopenharmony_ci
815cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->nchannels; ch++) {
816cabdff1aSopenharmony_ci        // Determine number of active subbands for this channel
817cabdff1aSopenharmony_ci        int nsubbands = s->nsubbands[ch];
818cabdff1aSopenharmony_ci        if (s->joint_intensity_index[ch])
819cabdff1aSopenharmony_ci            nsubbands = FFMAX(nsubbands, s->nsubbands[s->joint_intensity_index[ch] - 1]);
820cabdff1aSopenharmony_ci
821cabdff1aSopenharmony_ci        // Update history for ADPCM
822cabdff1aSopenharmony_ci        for (band = 0; band < nsubbands; band++) {
823cabdff1aSopenharmony_ci            int32_t *samples = s->subband_samples[ch][band] - DCA_ADPCM_COEFFS;
824cabdff1aSopenharmony_ci            AV_COPY128(samples, samples + s->npcmblocks);
825cabdff1aSopenharmony_ci        }
826cabdff1aSopenharmony_ci
827cabdff1aSopenharmony_ci        // Clear inactive subbands
828cabdff1aSopenharmony_ci        for (; band < DCA_SUBBANDS; band++) {
829cabdff1aSopenharmony_ci            int32_t *samples = s->subband_samples[ch][band] - DCA_ADPCM_COEFFS;
830cabdff1aSopenharmony_ci            memset(samples, 0, (DCA_ADPCM_COEFFS + s->npcmblocks) * sizeof(int32_t));
831cabdff1aSopenharmony_ci        }
832cabdff1aSopenharmony_ci    }
833cabdff1aSopenharmony_ci
834cabdff1aSopenharmony_ci    emms_c();
835cabdff1aSopenharmony_ci
836cabdff1aSopenharmony_ci    return 0;
837cabdff1aSopenharmony_ci}
838cabdff1aSopenharmony_ci
839cabdff1aSopenharmony_cistatic int parse_xch_frame(DCACoreDecoder *s)
840cabdff1aSopenharmony_ci{
841cabdff1aSopenharmony_ci    int ret;
842cabdff1aSopenharmony_ci
843cabdff1aSopenharmony_ci    if (s->ch_mask & DCA_SPEAKER_MASK_Cs) {
844cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "XCH with Cs speaker already present\n");
845cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
846cabdff1aSopenharmony_ci    }
847cabdff1aSopenharmony_ci
848cabdff1aSopenharmony_ci    if ((ret = parse_frame_data(s, HEADER_XCH, s->nchannels)) < 0)
849cabdff1aSopenharmony_ci        return ret;
850cabdff1aSopenharmony_ci
851cabdff1aSopenharmony_ci    // Seek to the end of core frame, don't trust XCH frame size
852cabdff1aSopenharmony_ci    if (ff_dca_seek_bits(&s->gb, s->frame_size * 8)) {
853cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Read past end of XCH frame\n");
854cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
855cabdff1aSopenharmony_ci    }
856cabdff1aSopenharmony_ci
857cabdff1aSopenharmony_ci    return 0;
858cabdff1aSopenharmony_ci}
859cabdff1aSopenharmony_ci
860cabdff1aSopenharmony_cistatic int parse_xxch_frame(DCACoreDecoder *s)
861cabdff1aSopenharmony_ci{
862cabdff1aSopenharmony_ci    int xxch_nchsets, xxch_frame_size;
863cabdff1aSopenharmony_ci    int ret, mask, header_size, header_pos = get_bits_count(&s->gb);
864cabdff1aSopenharmony_ci
865cabdff1aSopenharmony_ci    // XXCH sync word
866cabdff1aSopenharmony_ci    if (get_bits_long(&s->gb, 32) != DCA_SYNCWORD_XXCH) {
867cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Invalid XXCH sync word\n");
868cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
869cabdff1aSopenharmony_ci    }
870cabdff1aSopenharmony_ci
871cabdff1aSopenharmony_ci    // XXCH frame header length
872cabdff1aSopenharmony_ci    header_size = get_bits(&s->gb, 6) + 1;
873cabdff1aSopenharmony_ci
874cabdff1aSopenharmony_ci    // Check XXCH frame header CRC
875cabdff1aSopenharmony_ci    if (ff_dca_check_crc(s->avctx, &s->gb, header_pos + 32, header_pos + header_size * 8)) {
876cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Invalid XXCH frame header checksum\n");
877cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
878cabdff1aSopenharmony_ci    }
879cabdff1aSopenharmony_ci
880cabdff1aSopenharmony_ci    // CRC presence flag for channel set header
881cabdff1aSopenharmony_ci    s->xxch_crc_present = get_bits1(&s->gb);
882cabdff1aSopenharmony_ci
883cabdff1aSopenharmony_ci    // Number of bits for loudspeaker mask
884cabdff1aSopenharmony_ci    s->xxch_mask_nbits = get_bits(&s->gb, 5) + 1;
885cabdff1aSopenharmony_ci    if (s->xxch_mask_nbits <= DCA_SPEAKER_Cs) {
886cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Invalid number of bits for XXCH speaker mask (%d)\n", s->xxch_mask_nbits);
887cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
888cabdff1aSopenharmony_ci    }
889cabdff1aSopenharmony_ci
890cabdff1aSopenharmony_ci    // Number of channel sets
891cabdff1aSopenharmony_ci    xxch_nchsets = get_bits(&s->gb, 2) + 1;
892cabdff1aSopenharmony_ci    if (xxch_nchsets > 1) {
893cabdff1aSopenharmony_ci        avpriv_request_sample(s->avctx, "%d XXCH channel sets", xxch_nchsets);
894cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
895cabdff1aSopenharmony_ci    }
896cabdff1aSopenharmony_ci
897cabdff1aSopenharmony_ci    // Channel set 0 data byte size
898cabdff1aSopenharmony_ci    xxch_frame_size = get_bits(&s->gb, 14) + 1;
899cabdff1aSopenharmony_ci
900cabdff1aSopenharmony_ci    // Core loudspeaker activity mask
901cabdff1aSopenharmony_ci    s->xxch_core_mask = get_bits_long(&s->gb, s->xxch_mask_nbits);
902cabdff1aSopenharmony_ci
903cabdff1aSopenharmony_ci    // Validate the core mask
904cabdff1aSopenharmony_ci    mask = s->ch_mask;
905cabdff1aSopenharmony_ci
906cabdff1aSopenharmony_ci    if ((mask & DCA_SPEAKER_MASK_Ls) && (s->xxch_core_mask & DCA_SPEAKER_MASK_Lss))
907cabdff1aSopenharmony_ci        mask = (mask & ~DCA_SPEAKER_MASK_Ls) | DCA_SPEAKER_MASK_Lss;
908cabdff1aSopenharmony_ci
909cabdff1aSopenharmony_ci    if ((mask & DCA_SPEAKER_MASK_Rs) && (s->xxch_core_mask & DCA_SPEAKER_MASK_Rss))
910cabdff1aSopenharmony_ci        mask = (mask & ~DCA_SPEAKER_MASK_Rs) | DCA_SPEAKER_MASK_Rss;
911cabdff1aSopenharmony_ci
912cabdff1aSopenharmony_ci    if (mask != s->xxch_core_mask) {
913cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "XXCH core speaker activity mask (%#x) disagrees with core (%#x)\n", s->xxch_core_mask, mask);
914cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
915cabdff1aSopenharmony_ci    }
916cabdff1aSopenharmony_ci
917cabdff1aSopenharmony_ci    // Reserved
918cabdff1aSopenharmony_ci    // Byte align
919cabdff1aSopenharmony_ci    // CRC16 of XXCH frame header
920cabdff1aSopenharmony_ci    if (ff_dca_seek_bits(&s->gb, header_pos + header_size * 8)) {
921cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Read past end of XXCH frame header\n");
922cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
923cabdff1aSopenharmony_ci    }
924cabdff1aSopenharmony_ci
925cabdff1aSopenharmony_ci    // Parse XXCH channel set 0
926cabdff1aSopenharmony_ci    if ((ret = parse_frame_data(s, HEADER_XXCH, s->nchannels)) < 0)
927cabdff1aSopenharmony_ci        return ret;
928cabdff1aSopenharmony_ci
929cabdff1aSopenharmony_ci    if (ff_dca_seek_bits(&s->gb, header_pos + header_size * 8 + xxch_frame_size * 8)) {
930cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Read past end of XXCH channel set\n");
931cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
932cabdff1aSopenharmony_ci    }
933cabdff1aSopenharmony_ci
934cabdff1aSopenharmony_ci    return 0;
935cabdff1aSopenharmony_ci}
936cabdff1aSopenharmony_ci
937cabdff1aSopenharmony_cistatic int parse_xbr_subframe(DCACoreDecoder *s, int xbr_base_ch, int xbr_nchannels,
938cabdff1aSopenharmony_ci                              int *xbr_nsubbands, int xbr_transition_mode, int sf, int *sub_pos)
939cabdff1aSopenharmony_ci{
940cabdff1aSopenharmony_ci    int     xbr_nabits[DCA_CHANNELS];
941cabdff1aSopenharmony_ci    int     xbr_bit_allocation[DCA_CHANNELS][DCA_SUBBANDS];
942cabdff1aSopenharmony_ci    int     xbr_scale_nbits[DCA_CHANNELS];
943cabdff1aSopenharmony_ci    int32_t xbr_scale_factors[DCA_CHANNELS][DCA_SUBBANDS][2];
944cabdff1aSopenharmony_ci    int     ssf, ch, band, ofs;
945cabdff1aSopenharmony_ci
946cabdff1aSopenharmony_ci    // Check number of subband samples in this subframe
947cabdff1aSopenharmony_ci    if (*sub_pos + s->nsubsubframes[sf] * DCA_SUBBAND_SAMPLES > s->npcmblocks) {
948cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Subband sample buffer overflow\n");
949cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
950cabdff1aSopenharmony_ci    }
951cabdff1aSopenharmony_ci
952cabdff1aSopenharmony_ci    if (get_bits_left(&s->gb) < 0)
953cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
954cabdff1aSopenharmony_ci
955cabdff1aSopenharmony_ci    // Number of bits for XBR bit allocation index
956cabdff1aSopenharmony_ci    for (ch = xbr_base_ch; ch < xbr_nchannels; ch++)
957cabdff1aSopenharmony_ci        xbr_nabits[ch] = get_bits(&s->gb, 2) + 2;
958cabdff1aSopenharmony_ci
959cabdff1aSopenharmony_ci    // XBR bit allocation index
960cabdff1aSopenharmony_ci    for (ch = xbr_base_ch; ch < xbr_nchannels; ch++) {
961cabdff1aSopenharmony_ci        for (band = 0; band < xbr_nsubbands[ch]; band++) {
962cabdff1aSopenharmony_ci            xbr_bit_allocation[ch][band] = get_bits(&s->gb, xbr_nabits[ch]);
963cabdff1aSopenharmony_ci            if (xbr_bit_allocation[ch][band] > DCA_ABITS_MAX) {
964cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "Invalid XBR bit allocation index\n");
965cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
966cabdff1aSopenharmony_ci            }
967cabdff1aSopenharmony_ci        }
968cabdff1aSopenharmony_ci    }
969cabdff1aSopenharmony_ci
970cabdff1aSopenharmony_ci    // Number of bits for scale indices
971cabdff1aSopenharmony_ci    for (ch = xbr_base_ch; ch < xbr_nchannels; ch++) {
972cabdff1aSopenharmony_ci        xbr_scale_nbits[ch] = get_bits(&s->gb, 3);
973cabdff1aSopenharmony_ci        if (!xbr_scale_nbits[ch]) {
974cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid number of bits for XBR scale factor index\n");
975cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
976cabdff1aSopenharmony_ci        }
977cabdff1aSopenharmony_ci    }
978cabdff1aSopenharmony_ci
979cabdff1aSopenharmony_ci    // XBR scale factors
980cabdff1aSopenharmony_ci    for (ch = xbr_base_ch; ch < xbr_nchannels; ch++) {
981cabdff1aSopenharmony_ci        const uint32_t *scale_table;
982cabdff1aSopenharmony_ci        int scale_size;
983cabdff1aSopenharmony_ci
984cabdff1aSopenharmony_ci        // Select the root square table
985cabdff1aSopenharmony_ci        if (s->scale_factor_sel[ch] > 5) {
986cabdff1aSopenharmony_ci            scale_table = ff_dca_scale_factor_quant7;
987cabdff1aSopenharmony_ci            scale_size = FF_ARRAY_ELEMS(ff_dca_scale_factor_quant7);
988cabdff1aSopenharmony_ci        } else {
989cabdff1aSopenharmony_ci            scale_table = ff_dca_scale_factor_quant6;
990cabdff1aSopenharmony_ci            scale_size = FF_ARRAY_ELEMS(ff_dca_scale_factor_quant6);
991cabdff1aSopenharmony_ci        }
992cabdff1aSopenharmony_ci
993cabdff1aSopenharmony_ci        // Parse scale factor indices and look up scale factors from the root
994cabdff1aSopenharmony_ci        // square table
995cabdff1aSopenharmony_ci        for (band = 0; band < xbr_nsubbands[ch]; band++) {
996cabdff1aSopenharmony_ci            if (xbr_bit_allocation[ch][band]) {
997cabdff1aSopenharmony_ci                int scale_index = get_bits(&s->gb, xbr_scale_nbits[ch]);
998cabdff1aSopenharmony_ci                if (scale_index >= scale_size) {
999cabdff1aSopenharmony_ci                    av_log(s->avctx, AV_LOG_ERROR, "Invalid XBR scale factor index\n");
1000cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
1001cabdff1aSopenharmony_ci                }
1002cabdff1aSopenharmony_ci                xbr_scale_factors[ch][band][0] = scale_table[scale_index];
1003cabdff1aSopenharmony_ci                if (xbr_transition_mode && s->transition_mode[sf][ch][band]) {
1004cabdff1aSopenharmony_ci                    scale_index = get_bits(&s->gb, xbr_scale_nbits[ch]);
1005cabdff1aSopenharmony_ci                    if (scale_index >= scale_size) {
1006cabdff1aSopenharmony_ci                        av_log(s->avctx, AV_LOG_ERROR, "Invalid XBR scale factor index\n");
1007cabdff1aSopenharmony_ci                        return AVERROR_INVALIDDATA;
1008cabdff1aSopenharmony_ci                    }
1009cabdff1aSopenharmony_ci                    xbr_scale_factors[ch][band][1] = scale_table[scale_index];
1010cabdff1aSopenharmony_ci                }
1011cabdff1aSopenharmony_ci            }
1012cabdff1aSopenharmony_ci        }
1013cabdff1aSopenharmony_ci    }
1014cabdff1aSopenharmony_ci
1015cabdff1aSopenharmony_ci    // Audio data
1016cabdff1aSopenharmony_ci    for (ssf = 0, ofs = *sub_pos; ssf < s->nsubsubframes[sf]; ssf++) {
1017cabdff1aSopenharmony_ci        for (ch = xbr_base_ch; ch < xbr_nchannels; ch++) {
1018cabdff1aSopenharmony_ci            if (get_bits_left(&s->gb) < 0)
1019cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1020cabdff1aSopenharmony_ci
1021cabdff1aSopenharmony_ci            for (band = 0; band < xbr_nsubbands[ch]; band++) {
1022cabdff1aSopenharmony_ci                int ret, trans_ssf, abits = xbr_bit_allocation[ch][band];
1023cabdff1aSopenharmony_ci                int32_t audio[DCA_SUBBAND_SAMPLES], step_size, scale;
1024cabdff1aSopenharmony_ci
1025cabdff1aSopenharmony_ci                // Extract bits from the bit stream
1026cabdff1aSopenharmony_ci                if (abits > 7) {
1027cabdff1aSopenharmony_ci                    // No further encoding
1028cabdff1aSopenharmony_ci                    get_array(&s->gb, audio, DCA_SUBBAND_SAMPLES, abits - 3);
1029cabdff1aSopenharmony_ci                } else if (abits > 0) {
1030cabdff1aSopenharmony_ci                    // Block codes
1031cabdff1aSopenharmony_ci                    if ((ret = parse_block_codes(s, audio, abits)) < 0)
1032cabdff1aSopenharmony_ci                        return ret;
1033cabdff1aSopenharmony_ci                } else {
1034cabdff1aSopenharmony_ci                    // No bits allocated
1035cabdff1aSopenharmony_ci                    continue;
1036cabdff1aSopenharmony_ci                }
1037cabdff1aSopenharmony_ci
1038cabdff1aSopenharmony_ci                // Look up quantization step size
1039cabdff1aSopenharmony_ci                step_size = ff_dca_lossless_quant[abits];
1040cabdff1aSopenharmony_ci
1041cabdff1aSopenharmony_ci                // Identify transient location
1042cabdff1aSopenharmony_ci                if (xbr_transition_mode)
1043cabdff1aSopenharmony_ci                    trans_ssf = s->transition_mode[sf][ch][band];
1044cabdff1aSopenharmony_ci                else
1045cabdff1aSopenharmony_ci                    trans_ssf = 0;
1046cabdff1aSopenharmony_ci
1047cabdff1aSopenharmony_ci                // Determine proper scale factor
1048cabdff1aSopenharmony_ci                if (trans_ssf == 0 || ssf < trans_ssf)
1049cabdff1aSopenharmony_ci                    scale = xbr_scale_factors[ch][band][0];
1050cabdff1aSopenharmony_ci                else
1051cabdff1aSopenharmony_ci                    scale = xbr_scale_factors[ch][band][1];
1052cabdff1aSopenharmony_ci
1053cabdff1aSopenharmony_ci                ff_dca_core_dequantize(s->subband_samples[ch][band] + ofs,
1054cabdff1aSopenharmony_ci                           audio, step_size, scale, 1, DCA_SUBBAND_SAMPLES);
1055cabdff1aSopenharmony_ci            }
1056cabdff1aSopenharmony_ci        }
1057cabdff1aSopenharmony_ci
1058cabdff1aSopenharmony_ci        // DSYNC
1059cabdff1aSopenharmony_ci        if ((ssf == s->nsubsubframes[sf] - 1 || s->sync_ssf) && get_bits(&s->gb, 16) != 0xffff) {
1060cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "XBR-DSYNC check failed\n");
1061cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1062cabdff1aSopenharmony_ci        }
1063cabdff1aSopenharmony_ci
1064cabdff1aSopenharmony_ci        ofs += DCA_SUBBAND_SAMPLES;
1065cabdff1aSopenharmony_ci    }
1066cabdff1aSopenharmony_ci
1067cabdff1aSopenharmony_ci    // Advance subband sample pointer for the next subframe
1068cabdff1aSopenharmony_ci    *sub_pos = ofs;
1069cabdff1aSopenharmony_ci    return 0;
1070cabdff1aSopenharmony_ci}
1071cabdff1aSopenharmony_ci
1072cabdff1aSopenharmony_cistatic int parse_xbr_frame(DCACoreDecoder *s)
1073cabdff1aSopenharmony_ci{
1074cabdff1aSopenharmony_ci    int     xbr_frame_size[DCA_EXSS_CHSETS_MAX];
1075cabdff1aSopenharmony_ci    int     xbr_nchannels[DCA_EXSS_CHSETS_MAX];
1076cabdff1aSopenharmony_ci    int     xbr_nsubbands[DCA_EXSS_CHSETS_MAX * DCA_EXSS_CHANNELS_MAX];
1077cabdff1aSopenharmony_ci    int     xbr_nchsets, xbr_transition_mode, xbr_band_nbits, xbr_base_ch;
1078cabdff1aSopenharmony_ci    int     i, ch1, ch2, ret, header_size, header_pos = get_bits_count(&s->gb);
1079cabdff1aSopenharmony_ci
1080cabdff1aSopenharmony_ci    // XBR sync word
1081cabdff1aSopenharmony_ci    if (get_bits_long(&s->gb, 32) != DCA_SYNCWORD_XBR) {
1082cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Invalid XBR sync word\n");
1083cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1084cabdff1aSopenharmony_ci    }
1085cabdff1aSopenharmony_ci
1086cabdff1aSopenharmony_ci    // XBR frame header length
1087cabdff1aSopenharmony_ci    header_size = get_bits(&s->gb, 6) + 1;
1088cabdff1aSopenharmony_ci
1089cabdff1aSopenharmony_ci    // Check XBR frame header CRC
1090cabdff1aSopenharmony_ci    if (ff_dca_check_crc(s->avctx, &s->gb, header_pos + 32, header_pos + header_size * 8)) {
1091cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Invalid XBR frame header checksum\n");
1092cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1093cabdff1aSopenharmony_ci    }
1094cabdff1aSopenharmony_ci
1095cabdff1aSopenharmony_ci    // Number of channel sets
1096cabdff1aSopenharmony_ci    xbr_nchsets = get_bits(&s->gb, 2) + 1;
1097cabdff1aSopenharmony_ci
1098cabdff1aSopenharmony_ci    // Channel set data byte size
1099cabdff1aSopenharmony_ci    for (i = 0; i < xbr_nchsets; i++)
1100cabdff1aSopenharmony_ci        xbr_frame_size[i] = get_bits(&s->gb, 14) + 1;
1101cabdff1aSopenharmony_ci
1102cabdff1aSopenharmony_ci    // Transition mode flag
1103cabdff1aSopenharmony_ci    xbr_transition_mode = get_bits1(&s->gb);
1104cabdff1aSopenharmony_ci
1105cabdff1aSopenharmony_ci    // Channel set headers
1106cabdff1aSopenharmony_ci    for (i = 0, ch2 = 0; i < xbr_nchsets; i++) {
1107cabdff1aSopenharmony_ci        xbr_nchannels[i] = get_bits(&s->gb, 3) + 1;
1108cabdff1aSopenharmony_ci        xbr_band_nbits = get_bits(&s->gb, 2) + 5;
1109cabdff1aSopenharmony_ci        for (ch1 = 0; ch1 < xbr_nchannels[i]; ch1++, ch2++) {
1110cabdff1aSopenharmony_ci            xbr_nsubbands[ch2] = get_bits(&s->gb, xbr_band_nbits) + 1;
1111cabdff1aSopenharmony_ci            if (xbr_nsubbands[ch2] > DCA_SUBBANDS) {
1112cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "Invalid number of active XBR subbands (%d)\n", xbr_nsubbands[ch2]);
1113cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1114cabdff1aSopenharmony_ci            }
1115cabdff1aSopenharmony_ci        }
1116cabdff1aSopenharmony_ci    }
1117cabdff1aSopenharmony_ci
1118cabdff1aSopenharmony_ci    // Reserved
1119cabdff1aSopenharmony_ci    // Byte align
1120cabdff1aSopenharmony_ci    // CRC16 of XBR frame header
1121cabdff1aSopenharmony_ci    if (ff_dca_seek_bits(&s->gb, header_pos + header_size * 8)) {
1122cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Read past end of XBR frame header\n");
1123cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1124cabdff1aSopenharmony_ci    }
1125cabdff1aSopenharmony_ci
1126cabdff1aSopenharmony_ci    // Channel set data
1127cabdff1aSopenharmony_ci    for (i = 0, xbr_base_ch = 0; i < xbr_nchsets; i++) {
1128cabdff1aSopenharmony_ci        header_pos = get_bits_count(&s->gb);
1129cabdff1aSopenharmony_ci
1130cabdff1aSopenharmony_ci        if (xbr_base_ch + xbr_nchannels[i] <= s->nchannels) {
1131cabdff1aSopenharmony_ci            int sf, sub_pos;
1132cabdff1aSopenharmony_ci
1133cabdff1aSopenharmony_ci            for (sf = 0, sub_pos = 0; sf < s->nsubframes; sf++) {
1134cabdff1aSopenharmony_ci                if ((ret = parse_xbr_subframe(s, xbr_base_ch,
1135cabdff1aSopenharmony_ci                                              xbr_base_ch + xbr_nchannels[i],
1136cabdff1aSopenharmony_ci                                              xbr_nsubbands, xbr_transition_mode,
1137cabdff1aSopenharmony_ci                                              sf, &sub_pos)) < 0)
1138cabdff1aSopenharmony_ci                    return ret;
1139cabdff1aSopenharmony_ci            }
1140cabdff1aSopenharmony_ci        }
1141cabdff1aSopenharmony_ci
1142cabdff1aSopenharmony_ci        xbr_base_ch += xbr_nchannels[i];
1143cabdff1aSopenharmony_ci
1144cabdff1aSopenharmony_ci        if (ff_dca_seek_bits(&s->gb, header_pos + xbr_frame_size[i] * 8)) {
1145cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Read past end of XBR channel set\n");
1146cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1147cabdff1aSopenharmony_ci        }
1148cabdff1aSopenharmony_ci    }
1149cabdff1aSopenharmony_ci
1150cabdff1aSopenharmony_ci    return 0;
1151cabdff1aSopenharmony_ci}
1152cabdff1aSopenharmony_ci
1153cabdff1aSopenharmony_ci// Modified ISO/IEC 9899 linear congruential generator
1154cabdff1aSopenharmony_ci// Returns pseudorandom integer in range [-2^30, 2^30 - 1]
1155cabdff1aSopenharmony_cistatic int rand_x96(DCACoreDecoder *s)
1156cabdff1aSopenharmony_ci{
1157cabdff1aSopenharmony_ci    s->x96_rand = 1103515245U * s->x96_rand + 12345U;
1158cabdff1aSopenharmony_ci    return (s->x96_rand & 0x7fffffff) - 0x40000000;
1159cabdff1aSopenharmony_ci}
1160cabdff1aSopenharmony_ci
1161cabdff1aSopenharmony_cistatic int parse_x96_subframe_audio(DCACoreDecoder *s, int sf, int xch_base, int *sub_pos)
1162cabdff1aSopenharmony_ci{
1163cabdff1aSopenharmony_ci    int n, ssf, ch, band, ofs;
1164cabdff1aSopenharmony_ci
1165cabdff1aSopenharmony_ci    // Check number of subband samples in this subframe
1166cabdff1aSopenharmony_ci    int nsamples = s->nsubsubframes[sf] * DCA_SUBBAND_SAMPLES;
1167cabdff1aSopenharmony_ci    if (*sub_pos + nsamples > s->npcmblocks) {
1168cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Subband sample buffer overflow\n");
1169cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1170cabdff1aSopenharmony_ci    }
1171cabdff1aSopenharmony_ci
1172cabdff1aSopenharmony_ci    if (get_bits_left(&s->gb) < 0)
1173cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1174cabdff1aSopenharmony_ci
1175cabdff1aSopenharmony_ci    // VQ encoded or unallocated subbands
1176cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->x96_nchannels; ch++) {
1177cabdff1aSopenharmony_ci        for (band = s->x96_subband_start; band < s->nsubbands[ch]; band++) {
1178cabdff1aSopenharmony_ci            // Get the sample pointer and scale factor
1179cabdff1aSopenharmony_ci            int32_t *samples = s->x96_subband_samples[ch][band] + *sub_pos;
1180cabdff1aSopenharmony_ci            int32_t scale    = s->scale_factors[ch][band >> 1][band & 1];
1181cabdff1aSopenharmony_ci
1182cabdff1aSopenharmony_ci            switch (s->bit_allocation[ch][band]) {
1183cabdff1aSopenharmony_ci            case 0: // No bits allocated for subband
1184cabdff1aSopenharmony_ci                if (scale <= 1)
1185cabdff1aSopenharmony_ci                    memset(samples, 0, nsamples * sizeof(int32_t));
1186cabdff1aSopenharmony_ci                else for (n = 0; n < nsamples; n++)
1187cabdff1aSopenharmony_ci                    // Generate scaled random samples
1188cabdff1aSopenharmony_ci                    samples[n] = mul31(rand_x96(s), scale);
1189cabdff1aSopenharmony_ci                break;
1190cabdff1aSopenharmony_ci
1191cabdff1aSopenharmony_ci            case 1: // VQ encoded subband
1192cabdff1aSopenharmony_ci                for (ssf = 0; ssf < (s->nsubsubframes[sf] + 1) / 2; ssf++) {
1193cabdff1aSopenharmony_ci                    // Extract the VQ address from the bit stream and look up
1194cabdff1aSopenharmony_ci                    // the VQ code book for up to 16 subband samples
1195cabdff1aSopenharmony_ci                    const int8_t *vq_samples = ff_dca_high_freq_vq[get_bits(&s->gb, 10)];
1196cabdff1aSopenharmony_ci                    // Scale and take the samples
1197cabdff1aSopenharmony_ci                    for (n = 0; n < FFMIN(nsamples - ssf * 16, 16); n++)
1198cabdff1aSopenharmony_ci                        *samples++ = clip23(vq_samples[n] * scale + (1 << 3) >> 4);
1199cabdff1aSopenharmony_ci                }
1200cabdff1aSopenharmony_ci                break;
1201cabdff1aSopenharmony_ci            }
1202cabdff1aSopenharmony_ci        }
1203cabdff1aSopenharmony_ci    }
1204cabdff1aSopenharmony_ci
1205cabdff1aSopenharmony_ci    // Audio data
1206cabdff1aSopenharmony_ci    for (ssf = 0, ofs = *sub_pos; ssf < s->nsubsubframes[sf]; ssf++) {
1207cabdff1aSopenharmony_ci        for (ch = xch_base; ch < s->x96_nchannels; ch++) {
1208cabdff1aSopenharmony_ci            if (get_bits_left(&s->gb) < 0)
1209cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1210cabdff1aSopenharmony_ci
1211cabdff1aSopenharmony_ci            for (band = s->x96_subband_start; band < s->nsubbands[ch]; band++) {
1212cabdff1aSopenharmony_ci                int ret, abits = s->bit_allocation[ch][band] - 1;
1213cabdff1aSopenharmony_ci                int32_t audio[DCA_SUBBAND_SAMPLES], step_size, scale;
1214cabdff1aSopenharmony_ci
1215cabdff1aSopenharmony_ci                // Not VQ encoded or unallocated subbands
1216cabdff1aSopenharmony_ci                if (abits < 1)
1217cabdff1aSopenharmony_ci                    continue;
1218cabdff1aSopenharmony_ci
1219cabdff1aSopenharmony_ci                // Extract bits from the bit stream
1220cabdff1aSopenharmony_ci                if ((ret = extract_audio(s, audio, abits, ch)) < 0)
1221cabdff1aSopenharmony_ci                    return ret;
1222cabdff1aSopenharmony_ci
1223cabdff1aSopenharmony_ci                // Select quantization step size table and look up quantization
1224cabdff1aSopenharmony_ci                // step size
1225cabdff1aSopenharmony_ci                if (s->bit_rate == 3)
1226cabdff1aSopenharmony_ci                    step_size = ff_dca_lossless_quant[abits];
1227cabdff1aSopenharmony_ci                else
1228cabdff1aSopenharmony_ci                    step_size = ff_dca_lossy_quant[abits];
1229cabdff1aSopenharmony_ci
1230cabdff1aSopenharmony_ci                // Get the scale factor
1231cabdff1aSopenharmony_ci                scale = s->scale_factors[ch][band >> 1][band & 1];
1232cabdff1aSopenharmony_ci
1233cabdff1aSopenharmony_ci                ff_dca_core_dequantize(s->x96_subband_samples[ch][band] + ofs,
1234cabdff1aSopenharmony_ci                           audio, step_size, scale, 0, DCA_SUBBAND_SAMPLES);
1235cabdff1aSopenharmony_ci            }
1236cabdff1aSopenharmony_ci        }
1237cabdff1aSopenharmony_ci
1238cabdff1aSopenharmony_ci        // DSYNC
1239cabdff1aSopenharmony_ci        if ((ssf == s->nsubsubframes[sf] - 1 || s->sync_ssf) && get_bits(&s->gb, 16) != 0xffff) {
1240cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "X96-DSYNC check failed\n");
1241cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1242cabdff1aSopenharmony_ci        }
1243cabdff1aSopenharmony_ci
1244cabdff1aSopenharmony_ci        ofs += DCA_SUBBAND_SAMPLES;
1245cabdff1aSopenharmony_ci    }
1246cabdff1aSopenharmony_ci
1247cabdff1aSopenharmony_ci    // Inverse ADPCM
1248cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->x96_nchannels; ch++) {
1249cabdff1aSopenharmony_ci        inverse_adpcm(s->x96_subband_samples[ch], s->prediction_vq_index[ch],
1250cabdff1aSopenharmony_ci                      s->prediction_mode[ch], s->x96_subband_start, s->nsubbands[ch],
1251cabdff1aSopenharmony_ci                      *sub_pos, nsamples);
1252cabdff1aSopenharmony_ci    }
1253cabdff1aSopenharmony_ci
1254cabdff1aSopenharmony_ci    // Joint subband coding
1255cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->x96_nchannels; ch++) {
1256cabdff1aSopenharmony_ci        int src_ch = s->joint_intensity_index[ch] - 1;
1257cabdff1aSopenharmony_ci        if (src_ch >= 0) {
1258cabdff1aSopenharmony_ci            s->dcadsp->decode_joint(s->x96_subband_samples[ch], s->x96_subband_samples[src_ch],
1259cabdff1aSopenharmony_ci                                    s->joint_scale_factors[ch], s->nsubbands[ch],
1260cabdff1aSopenharmony_ci                                    s->nsubbands[src_ch], *sub_pos, nsamples);
1261cabdff1aSopenharmony_ci        }
1262cabdff1aSopenharmony_ci    }
1263cabdff1aSopenharmony_ci
1264cabdff1aSopenharmony_ci    // Advance subband sample pointer for the next subframe
1265cabdff1aSopenharmony_ci    *sub_pos = ofs;
1266cabdff1aSopenharmony_ci    return 0;
1267cabdff1aSopenharmony_ci}
1268cabdff1aSopenharmony_ci
1269cabdff1aSopenharmony_cistatic void erase_x96_adpcm_history(DCACoreDecoder *s)
1270cabdff1aSopenharmony_ci{
1271cabdff1aSopenharmony_ci    int ch, band;
1272cabdff1aSopenharmony_ci
1273cabdff1aSopenharmony_ci    // Erase ADPCM history from previous frame if
1274cabdff1aSopenharmony_ci    // predictor history switch was disabled
1275cabdff1aSopenharmony_ci    for (ch = 0; ch < DCA_CHANNELS; ch++)
1276cabdff1aSopenharmony_ci        for (band = 0; band < DCA_SUBBANDS_X96; band++)
1277cabdff1aSopenharmony_ci            AV_ZERO128(s->x96_subband_samples[ch][band] - DCA_ADPCM_COEFFS);
1278cabdff1aSopenharmony_ci
1279cabdff1aSopenharmony_ci    emms_c();
1280cabdff1aSopenharmony_ci}
1281cabdff1aSopenharmony_ci
1282cabdff1aSopenharmony_cistatic int alloc_x96_sample_buffer(DCACoreDecoder *s)
1283cabdff1aSopenharmony_ci{
1284cabdff1aSopenharmony_ci    int nchsamples = DCA_ADPCM_COEFFS + s->npcmblocks;
1285cabdff1aSopenharmony_ci    int nframesamples = nchsamples * DCA_CHANNELS * DCA_SUBBANDS_X96;
1286cabdff1aSopenharmony_ci    unsigned int size = s->x96_subband_size;
1287cabdff1aSopenharmony_ci    int ch, band;
1288cabdff1aSopenharmony_ci
1289cabdff1aSopenharmony_ci    // Reallocate subband sample buffer
1290cabdff1aSopenharmony_ci    av_fast_mallocz(&s->x96_subband_buffer, &s->x96_subband_size,
1291cabdff1aSopenharmony_ci                    nframesamples * sizeof(int32_t));
1292cabdff1aSopenharmony_ci    if (!s->x96_subband_buffer)
1293cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
1294cabdff1aSopenharmony_ci
1295cabdff1aSopenharmony_ci    if (size != s->x96_subband_size) {
1296cabdff1aSopenharmony_ci        for (ch = 0; ch < DCA_CHANNELS; ch++)
1297cabdff1aSopenharmony_ci            for (band = 0; band < DCA_SUBBANDS_X96; band++)
1298cabdff1aSopenharmony_ci                s->x96_subband_samples[ch][band] = s->x96_subband_buffer +
1299cabdff1aSopenharmony_ci                    (ch * DCA_SUBBANDS_X96 + band) * nchsamples + DCA_ADPCM_COEFFS;
1300cabdff1aSopenharmony_ci    }
1301cabdff1aSopenharmony_ci
1302cabdff1aSopenharmony_ci    if (!s->predictor_history)
1303cabdff1aSopenharmony_ci        erase_x96_adpcm_history(s);
1304cabdff1aSopenharmony_ci
1305cabdff1aSopenharmony_ci    return 0;
1306cabdff1aSopenharmony_ci}
1307cabdff1aSopenharmony_ci
1308cabdff1aSopenharmony_cistatic int parse_x96_subframe_header(DCACoreDecoder *s, int xch_base)
1309cabdff1aSopenharmony_ci{
1310cabdff1aSopenharmony_ci    int ch, band, ret;
1311cabdff1aSopenharmony_ci
1312cabdff1aSopenharmony_ci    if (get_bits_left(&s->gb) < 0)
1313cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1314cabdff1aSopenharmony_ci
1315cabdff1aSopenharmony_ci    // Prediction mode
1316cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->x96_nchannels; ch++)
1317cabdff1aSopenharmony_ci        for (band = s->x96_subband_start; band < s->nsubbands[ch]; band++)
1318cabdff1aSopenharmony_ci            s->prediction_mode[ch][band] = get_bits1(&s->gb);
1319cabdff1aSopenharmony_ci
1320cabdff1aSopenharmony_ci    // Prediction coefficients VQ address
1321cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->x96_nchannels; ch++)
1322cabdff1aSopenharmony_ci        for (band = s->x96_subband_start; band < s->nsubbands[ch]; band++)
1323cabdff1aSopenharmony_ci            if (s->prediction_mode[ch][band])
1324cabdff1aSopenharmony_ci                s->prediction_vq_index[ch][band] = get_bits(&s->gb, 12);
1325cabdff1aSopenharmony_ci
1326cabdff1aSopenharmony_ci    // Bit allocation index
1327cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->x96_nchannels; ch++) {
1328cabdff1aSopenharmony_ci        int sel = s->bit_allocation_sel[ch];
1329cabdff1aSopenharmony_ci        int abits = 0;
1330cabdff1aSopenharmony_ci
1331cabdff1aSopenharmony_ci        for (band = s->x96_subband_start; band < s->nsubbands[ch]; band++) {
1332cabdff1aSopenharmony_ci            // If Huffman code was used, the difference of abits was encoded
1333cabdff1aSopenharmony_ci            if (sel < 7)
1334cabdff1aSopenharmony_ci                abits += dca_get_vlc(&s->gb, &ff_dca_vlc_quant_index[5 + 2 * s->x96_high_res], sel);
1335cabdff1aSopenharmony_ci            else
1336cabdff1aSopenharmony_ci                abits = get_bits(&s->gb, 3 + s->x96_high_res);
1337cabdff1aSopenharmony_ci
1338cabdff1aSopenharmony_ci            if (abits < 0 || abits > 7 + 8 * s->x96_high_res) {
1339cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 bit allocation index\n");
1340cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1341cabdff1aSopenharmony_ci            }
1342cabdff1aSopenharmony_ci
1343cabdff1aSopenharmony_ci            s->bit_allocation[ch][band] = abits;
1344cabdff1aSopenharmony_ci        }
1345cabdff1aSopenharmony_ci    }
1346cabdff1aSopenharmony_ci
1347cabdff1aSopenharmony_ci    // Scale factors
1348cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->x96_nchannels; ch++) {
1349cabdff1aSopenharmony_ci        int sel = s->scale_factor_sel[ch];
1350cabdff1aSopenharmony_ci        int scale_index = 0;
1351cabdff1aSopenharmony_ci
1352cabdff1aSopenharmony_ci        // Extract scales for subbands which are transmitted even for
1353cabdff1aSopenharmony_ci        // unallocated subbands
1354cabdff1aSopenharmony_ci        for (band = s->x96_subband_start; band < s->nsubbands[ch]; band++) {
1355cabdff1aSopenharmony_ci            if ((ret = parse_scale(s, &scale_index, sel)) < 0)
1356cabdff1aSopenharmony_ci                return ret;
1357cabdff1aSopenharmony_ci            s->scale_factors[ch][band >> 1][band & 1] = ret;
1358cabdff1aSopenharmony_ci        }
1359cabdff1aSopenharmony_ci    }
1360cabdff1aSopenharmony_ci
1361cabdff1aSopenharmony_ci    // Joint subband codebook select
1362cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->x96_nchannels; ch++) {
1363cabdff1aSopenharmony_ci        if (s->joint_intensity_index[ch]) {
1364cabdff1aSopenharmony_ci            s->joint_scale_sel[ch] = get_bits(&s->gb, 3);
1365cabdff1aSopenharmony_ci            if (s->joint_scale_sel[ch] == 7) {
1366cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 joint scale factor code book\n");
1367cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1368cabdff1aSopenharmony_ci            }
1369cabdff1aSopenharmony_ci        }
1370cabdff1aSopenharmony_ci    }
1371cabdff1aSopenharmony_ci
1372cabdff1aSopenharmony_ci    // Scale factors for joint subband coding
1373cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->x96_nchannels; ch++) {
1374cabdff1aSopenharmony_ci        int src_ch = s->joint_intensity_index[ch] - 1;
1375cabdff1aSopenharmony_ci        if (src_ch >= 0) {
1376cabdff1aSopenharmony_ci            int sel = s->joint_scale_sel[ch];
1377cabdff1aSopenharmony_ci            for (band = s->nsubbands[ch]; band < s->nsubbands[src_ch]; band++) {
1378cabdff1aSopenharmony_ci                if ((ret = parse_joint_scale(s, sel)) < 0)
1379cabdff1aSopenharmony_ci                    return ret;
1380cabdff1aSopenharmony_ci                s->joint_scale_factors[ch][band] = ret;
1381cabdff1aSopenharmony_ci            }
1382cabdff1aSopenharmony_ci        }
1383cabdff1aSopenharmony_ci    }
1384cabdff1aSopenharmony_ci
1385cabdff1aSopenharmony_ci    // Side information CRC check word
1386cabdff1aSopenharmony_ci    if (s->crc_present)
1387cabdff1aSopenharmony_ci        skip_bits(&s->gb, 16);
1388cabdff1aSopenharmony_ci
1389cabdff1aSopenharmony_ci    return 0;
1390cabdff1aSopenharmony_ci}
1391cabdff1aSopenharmony_ci
1392cabdff1aSopenharmony_cistatic int parse_x96_coding_header(DCACoreDecoder *s, int exss, int xch_base)
1393cabdff1aSopenharmony_ci{
1394cabdff1aSopenharmony_ci    int n, ch, header_size = 0, header_pos = get_bits_count(&s->gb);
1395cabdff1aSopenharmony_ci
1396cabdff1aSopenharmony_ci    if (get_bits_left(&s->gb) < 0)
1397cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1398cabdff1aSopenharmony_ci
1399cabdff1aSopenharmony_ci    if (exss) {
1400cabdff1aSopenharmony_ci        // Channel set header length
1401cabdff1aSopenharmony_ci        header_size = get_bits(&s->gb, 7) + 1;
1402cabdff1aSopenharmony_ci
1403cabdff1aSopenharmony_ci        // Check CRC
1404cabdff1aSopenharmony_ci        if (s->x96_crc_present
1405cabdff1aSopenharmony_ci            && ff_dca_check_crc(s->avctx, &s->gb, header_pos, header_pos + header_size * 8)) {
1406cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 channel set header checksum\n");
1407cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1408cabdff1aSopenharmony_ci        }
1409cabdff1aSopenharmony_ci    }
1410cabdff1aSopenharmony_ci
1411cabdff1aSopenharmony_ci    // High resolution flag
1412cabdff1aSopenharmony_ci    s->x96_high_res = get_bits1(&s->gb);
1413cabdff1aSopenharmony_ci
1414cabdff1aSopenharmony_ci    // First encoded subband
1415cabdff1aSopenharmony_ci    if (s->x96_rev_no < 8) {
1416cabdff1aSopenharmony_ci        s->x96_subband_start = get_bits(&s->gb, 5);
1417cabdff1aSopenharmony_ci        if (s->x96_subband_start > 27) {
1418cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 subband start index (%d)\n", s->x96_subband_start);
1419cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1420cabdff1aSopenharmony_ci        }
1421cabdff1aSopenharmony_ci    } else {
1422cabdff1aSopenharmony_ci        s->x96_subband_start = DCA_SUBBANDS;
1423cabdff1aSopenharmony_ci    }
1424cabdff1aSopenharmony_ci
1425cabdff1aSopenharmony_ci    // Subband activity count
1426cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->x96_nchannels; ch++) {
1427cabdff1aSopenharmony_ci        s->nsubbands[ch] = get_bits(&s->gb, 6) + 1;
1428cabdff1aSopenharmony_ci        if (s->nsubbands[ch] < DCA_SUBBANDS) {
1429cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 subband activity count (%d)\n", s->nsubbands[ch]);
1430cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1431cabdff1aSopenharmony_ci        }
1432cabdff1aSopenharmony_ci    }
1433cabdff1aSopenharmony_ci
1434cabdff1aSopenharmony_ci    // Joint intensity coding index
1435cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->x96_nchannels; ch++) {
1436cabdff1aSopenharmony_ci        if ((n = get_bits(&s->gb, 3)) && xch_base)
1437cabdff1aSopenharmony_ci            n += xch_base - 1;
1438cabdff1aSopenharmony_ci        if (n > s->x96_nchannels) {
1439cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 joint intensity coding index\n");
1440cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1441cabdff1aSopenharmony_ci        }
1442cabdff1aSopenharmony_ci        s->joint_intensity_index[ch] = n;
1443cabdff1aSopenharmony_ci    }
1444cabdff1aSopenharmony_ci
1445cabdff1aSopenharmony_ci    // Scale factor code book
1446cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->x96_nchannels; ch++) {
1447cabdff1aSopenharmony_ci        s->scale_factor_sel[ch] = get_bits(&s->gb, 3);
1448cabdff1aSopenharmony_ci        if (s->scale_factor_sel[ch] >= 6) {
1449cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 scale factor code book\n");
1450cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1451cabdff1aSopenharmony_ci        }
1452cabdff1aSopenharmony_ci    }
1453cabdff1aSopenharmony_ci
1454cabdff1aSopenharmony_ci    // Bit allocation quantizer select
1455cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->x96_nchannels; ch++)
1456cabdff1aSopenharmony_ci        s->bit_allocation_sel[ch] = get_bits(&s->gb, 3);
1457cabdff1aSopenharmony_ci
1458cabdff1aSopenharmony_ci    // Quantization index codebook select
1459cabdff1aSopenharmony_ci    for (n = 0; n < 6 + 4 * s->x96_high_res; n++)
1460cabdff1aSopenharmony_ci        for (ch = xch_base; ch < s->x96_nchannels; ch++)
1461cabdff1aSopenharmony_ci            s->quant_index_sel[ch][n] = get_bits(&s->gb, ff_dca_quant_index_sel_nbits[n]);
1462cabdff1aSopenharmony_ci
1463cabdff1aSopenharmony_ci    if (exss) {
1464cabdff1aSopenharmony_ci        // Reserved
1465cabdff1aSopenharmony_ci        // Byte align
1466cabdff1aSopenharmony_ci        // CRC16 of channel set header
1467cabdff1aSopenharmony_ci        if (ff_dca_seek_bits(&s->gb, header_pos + header_size * 8)) {
1468cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Read past end of X96 channel set header\n");
1469cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1470cabdff1aSopenharmony_ci        }
1471cabdff1aSopenharmony_ci    } else {
1472cabdff1aSopenharmony_ci        if (s->crc_present)
1473cabdff1aSopenharmony_ci            skip_bits(&s->gb, 16);
1474cabdff1aSopenharmony_ci    }
1475cabdff1aSopenharmony_ci
1476cabdff1aSopenharmony_ci    return 0;
1477cabdff1aSopenharmony_ci}
1478cabdff1aSopenharmony_ci
1479cabdff1aSopenharmony_cistatic int parse_x96_frame_data(DCACoreDecoder *s, int exss, int xch_base)
1480cabdff1aSopenharmony_ci{
1481cabdff1aSopenharmony_ci    int sf, ch, ret, band, sub_pos;
1482cabdff1aSopenharmony_ci
1483cabdff1aSopenharmony_ci    if ((ret = parse_x96_coding_header(s, exss, xch_base)) < 0)
1484cabdff1aSopenharmony_ci        return ret;
1485cabdff1aSopenharmony_ci
1486cabdff1aSopenharmony_ci    for (sf = 0, sub_pos = 0; sf < s->nsubframes; sf++) {
1487cabdff1aSopenharmony_ci        if ((ret = parse_x96_subframe_header(s, xch_base)) < 0)
1488cabdff1aSopenharmony_ci            return ret;
1489cabdff1aSopenharmony_ci        if ((ret = parse_x96_subframe_audio(s, sf, xch_base, &sub_pos)) < 0)
1490cabdff1aSopenharmony_ci            return ret;
1491cabdff1aSopenharmony_ci    }
1492cabdff1aSopenharmony_ci
1493cabdff1aSopenharmony_ci    for (ch = xch_base; ch < s->x96_nchannels; ch++) {
1494cabdff1aSopenharmony_ci        // Determine number of active subbands for this channel
1495cabdff1aSopenharmony_ci        int nsubbands = s->nsubbands[ch];
1496cabdff1aSopenharmony_ci        if (s->joint_intensity_index[ch])
1497cabdff1aSopenharmony_ci            nsubbands = FFMAX(nsubbands, s->nsubbands[s->joint_intensity_index[ch] - 1]);
1498cabdff1aSopenharmony_ci
1499cabdff1aSopenharmony_ci        // Update history for ADPCM and clear inactive subbands
1500cabdff1aSopenharmony_ci        for (band = 0; band < DCA_SUBBANDS_X96; band++) {
1501cabdff1aSopenharmony_ci            int32_t *samples = s->x96_subband_samples[ch][band] - DCA_ADPCM_COEFFS;
1502cabdff1aSopenharmony_ci            if (band >= s->x96_subband_start && band < nsubbands)
1503cabdff1aSopenharmony_ci                AV_COPY128(samples, samples + s->npcmblocks);
1504cabdff1aSopenharmony_ci            else
1505cabdff1aSopenharmony_ci                memset(samples, 0, (DCA_ADPCM_COEFFS + s->npcmblocks) * sizeof(int32_t));
1506cabdff1aSopenharmony_ci        }
1507cabdff1aSopenharmony_ci    }
1508cabdff1aSopenharmony_ci
1509cabdff1aSopenharmony_ci    emms_c();
1510cabdff1aSopenharmony_ci
1511cabdff1aSopenharmony_ci    return 0;
1512cabdff1aSopenharmony_ci}
1513cabdff1aSopenharmony_ci
1514cabdff1aSopenharmony_cistatic int parse_x96_frame(DCACoreDecoder *s)
1515cabdff1aSopenharmony_ci{
1516cabdff1aSopenharmony_ci    int ret;
1517cabdff1aSopenharmony_ci
1518cabdff1aSopenharmony_ci    // Revision number
1519cabdff1aSopenharmony_ci    s->x96_rev_no = get_bits(&s->gb, 4);
1520cabdff1aSopenharmony_ci    if (s->x96_rev_no < 1 || s->x96_rev_no > 8) {
1521cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 revision (%d)\n", s->x96_rev_no);
1522cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1523cabdff1aSopenharmony_ci    }
1524cabdff1aSopenharmony_ci
1525cabdff1aSopenharmony_ci    s->x96_crc_present = 0;
1526cabdff1aSopenharmony_ci    s->x96_nchannels = s->nchannels;
1527cabdff1aSopenharmony_ci
1528cabdff1aSopenharmony_ci    if ((ret = alloc_x96_sample_buffer(s)) < 0)
1529cabdff1aSopenharmony_ci        return ret;
1530cabdff1aSopenharmony_ci
1531cabdff1aSopenharmony_ci    if ((ret = parse_x96_frame_data(s, 0, 0)) < 0)
1532cabdff1aSopenharmony_ci        return ret;
1533cabdff1aSopenharmony_ci
1534cabdff1aSopenharmony_ci    // Seek to the end of core frame
1535cabdff1aSopenharmony_ci    if (ff_dca_seek_bits(&s->gb, s->frame_size * 8)) {
1536cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Read past end of X96 frame\n");
1537cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1538cabdff1aSopenharmony_ci    }
1539cabdff1aSopenharmony_ci
1540cabdff1aSopenharmony_ci    return 0;
1541cabdff1aSopenharmony_ci}
1542cabdff1aSopenharmony_ci
1543cabdff1aSopenharmony_cistatic int parse_x96_frame_exss(DCACoreDecoder *s)
1544cabdff1aSopenharmony_ci{
1545cabdff1aSopenharmony_ci    int     x96_frame_size[DCA_EXSS_CHSETS_MAX];
1546cabdff1aSopenharmony_ci    int     x96_nchannels[DCA_EXSS_CHSETS_MAX];
1547cabdff1aSopenharmony_ci    int     x96_nchsets, x96_base_ch;
1548cabdff1aSopenharmony_ci    int     i, ret, header_size, header_pos = get_bits_count(&s->gb);
1549cabdff1aSopenharmony_ci
1550cabdff1aSopenharmony_ci    // X96 sync word
1551cabdff1aSopenharmony_ci    if (get_bits_long(&s->gb, 32) != DCA_SYNCWORD_X96) {
1552cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 sync word\n");
1553cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1554cabdff1aSopenharmony_ci    }
1555cabdff1aSopenharmony_ci
1556cabdff1aSopenharmony_ci    // X96 frame header length
1557cabdff1aSopenharmony_ci    header_size = get_bits(&s->gb, 6) + 1;
1558cabdff1aSopenharmony_ci
1559cabdff1aSopenharmony_ci    // Check X96 frame header CRC
1560cabdff1aSopenharmony_ci    if (ff_dca_check_crc(s->avctx, &s->gb, header_pos + 32, header_pos + header_size * 8)) {
1561cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 frame header checksum\n");
1562cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1563cabdff1aSopenharmony_ci    }
1564cabdff1aSopenharmony_ci
1565cabdff1aSopenharmony_ci    // Revision number
1566cabdff1aSopenharmony_ci    s->x96_rev_no = get_bits(&s->gb, 4);
1567cabdff1aSopenharmony_ci    if (s->x96_rev_no < 1 || s->x96_rev_no > 8) {
1568cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 revision (%d)\n", s->x96_rev_no);
1569cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1570cabdff1aSopenharmony_ci    }
1571cabdff1aSopenharmony_ci
1572cabdff1aSopenharmony_ci    // CRC presence flag for channel set header
1573cabdff1aSopenharmony_ci    s->x96_crc_present = get_bits1(&s->gb);
1574cabdff1aSopenharmony_ci
1575cabdff1aSopenharmony_ci    // Number of channel sets
1576cabdff1aSopenharmony_ci    x96_nchsets = get_bits(&s->gb, 2) + 1;
1577cabdff1aSopenharmony_ci
1578cabdff1aSopenharmony_ci    // Channel set data byte size
1579cabdff1aSopenharmony_ci    for (i = 0; i < x96_nchsets; i++)
1580cabdff1aSopenharmony_ci        x96_frame_size[i] = get_bits(&s->gb, 12) + 1;
1581cabdff1aSopenharmony_ci
1582cabdff1aSopenharmony_ci    // Number of channels in channel set
1583cabdff1aSopenharmony_ci    for (i = 0; i < x96_nchsets; i++)
1584cabdff1aSopenharmony_ci        x96_nchannels[i] = get_bits(&s->gb, 3) + 1;
1585cabdff1aSopenharmony_ci
1586cabdff1aSopenharmony_ci    // Reserved
1587cabdff1aSopenharmony_ci    // Byte align
1588cabdff1aSopenharmony_ci    // CRC16 of X96 frame header
1589cabdff1aSopenharmony_ci    if (ff_dca_seek_bits(&s->gb, header_pos + header_size * 8)) {
1590cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Read past end of X96 frame header\n");
1591cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1592cabdff1aSopenharmony_ci    }
1593cabdff1aSopenharmony_ci
1594cabdff1aSopenharmony_ci    if ((ret = alloc_x96_sample_buffer(s)) < 0)
1595cabdff1aSopenharmony_ci        return ret;
1596cabdff1aSopenharmony_ci
1597cabdff1aSopenharmony_ci    // Channel set data
1598cabdff1aSopenharmony_ci    s->x96_nchannels = 0;
1599cabdff1aSopenharmony_ci    for (i = 0, x96_base_ch = 0; i < x96_nchsets; i++) {
1600cabdff1aSopenharmony_ci        header_pos = get_bits_count(&s->gb);
1601cabdff1aSopenharmony_ci
1602cabdff1aSopenharmony_ci        if (x96_base_ch + x96_nchannels[i] <= s->nchannels) {
1603cabdff1aSopenharmony_ci            s->x96_nchannels = x96_base_ch + x96_nchannels[i];
1604cabdff1aSopenharmony_ci            if ((ret = parse_x96_frame_data(s, 1, x96_base_ch)) < 0)
1605cabdff1aSopenharmony_ci                return ret;
1606cabdff1aSopenharmony_ci        }
1607cabdff1aSopenharmony_ci
1608cabdff1aSopenharmony_ci        x96_base_ch += x96_nchannels[i];
1609cabdff1aSopenharmony_ci
1610cabdff1aSopenharmony_ci        if (ff_dca_seek_bits(&s->gb, header_pos + x96_frame_size[i] * 8)) {
1611cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Read past end of X96 channel set\n");
1612cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1613cabdff1aSopenharmony_ci        }
1614cabdff1aSopenharmony_ci    }
1615cabdff1aSopenharmony_ci
1616cabdff1aSopenharmony_ci    return 0;
1617cabdff1aSopenharmony_ci}
1618cabdff1aSopenharmony_ci
1619cabdff1aSopenharmony_cistatic int parse_aux_data(DCACoreDecoder *s)
1620cabdff1aSopenharmony_ci{
1621cabdff1aSopenharmony_ci    int aux_pos;
1622cabdff1aSopenharmony_ci
1623cabdff1aSopenharmony_ci    if (get_bits_left(&s->gb) < 0)
1624cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1625cabdff1aSopenharmony_ci
1626cabdff1aSopenharmony_ci    // Auxiliary data byte count (can't be trusted)
1627cabdff1aSopenharmony_ci    skip_bits(&s->gb, 6);
1628cabdff1aSopenharmony_ci
1629cabdff1aSopenharmony_ci    // 4-byte align
1630cabdff1aSopenharmony_ci    skip_bits_long(&s->gb, -get_bits_count(&s->gb) & 31);
1631cabdff1aSopenharmony_ci
1632cabdff1aSopenharmony_ci    // Auxiliary data sync word
1633cabdff1aSopenharmony_ci    if (get_bits_long(&s->gb, 32) != DCA_SYNCWORD_REV1AUX) {
1634cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Invalid auxiliary data sync word\n");
1635cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1636cabdff1aSopenharmony_ci    }
1637cabdff1aSopenharmony_ci
1638cabdff1aSopenharmony_ci    aux_pos = get_bits_count(&s->gb);
1639cabdff1aSopenharmony_ci
1640cabdff1aSopenharmony_ci    // Auxiliary decode time stamp flag
1641cabdff1aSopenharmony_ci    if (get_bits1(&s->gb))
1642cabdff1aSopenharmony_ci        skip_bits_long(&s->gb, 47);
1643cabdff1aSopenharmony_ci
1644cabdff1aSopenharmony_ci    // Auxiliary dynamic downmix flag
1645cabdff1aSopenharmony_ci    if (s->prim_dmix_embedded = get_bits1(&s->gb)) {
1646cabdff1aSopenharmony_ci        int i, m, n;
1647cabdff1aSopenharmony_ci
1648cabdff1aSopenharmony_ci        // Auxiliary primary channel downmix type
1649cabdff1aSopenharmony_ci        s->prim_dmix_type = get_bits(&s->gb, 3);
1650cabdff1aSopenharmony_ci        if (s->prim_dmix_type >= DCA_DMIX_TYPE_COUNT) {
1651cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Invalid primary channel set downmix type\n");
1652cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1653cabdff1aSopenharmony_ci        }
1654cabdff1aSopenharmony_ci
1655cabdff1aSopenharmony_ci        // Size of downmix coefficients matrix
1656cabdff1aSopenharmony_ci        m = ff_dca_dmix_primary_nch[s->prim_dmix_type];
1657cabdff1aSopenharmony_ci        n = ff_dca_channels[s->audio_mode] + !!s->lfe_present;
1658cabdff1aSopenharmony_ci
1659cabdff1aSopenharmony_ci        // Dynamic downmix code coefficients
1660cabdff1aSopenharmony_ci        for (i = 0; i < m * n; i++) {
1661cabdff1aSopenharmony_ci            int code = get_bits(&s->gb, 9);
1662cabdff1aSopenharmony_ci            int sign = (code >> 8) - 1;
1663cabdff1aSopenharmony_ci            unsigned int index = code & 0xff;
1664cabdff1aSopenharmony_ci            if (index >= FF_DCA_DMIXTABLE_SIZE) {
1665cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "Invalid downmix coefficient index\n");
1666cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1667cabdff1aSopenharmony_ci            }
1668cabdff1aSopenharmony_ci            s->prim_dmix_coeff[i] = (ff_dca_dmixtable[index] ^ sign) - sign;
1669cabdff1aSopenharmony_ci        }
1670cabdff1aSopenharmony_ci    }
1671cabdff1aSopenharmony_ci
1672cabdff1aSopenharmony_ci    // Byte align
1673cabdff1aSopenharmony_ci    skip_bits(&s->gb, -get_bits_count(&s->gb) & 7);
1674cabdff1aSopenharmony_ci
1675cabdff1aSopenharmony_ci    // CRC16 of auxiliary data
1676cabdff1aSopenharmony_ci    skip_bits(&s->gb, 16);
1677cabdff1aSopenharmony_ci
1678cabdff1aSopenharmony_ci    // Check CRC
1679cabdff1aSopenharmony_ci    if (ff_dca_check_crc(s->avctx, &s->gb, aux_pos, get_bits_count(&s->gb))) {
1680cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Invalid auxiliary data checksum\n");
1681cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1682cabdff1aSopenharmony_ci    }
1683cabdff1aSopenharmony_ci
1684cabdff1aSopenharmony_ci    return 0;
1685cabdff1aSopenharmony_ci}
1686cabdff1aSopenharmony_ci
1687cabdff1aSopenharmony_cistatic int parse_optional_info(DCACoreDecoder *s)
1688cabdff1aSopenharmony_ci{
1689cabdff1aSopenharmony_ci    DCAContext *dca = s->avctx->priv_data;
1690cabdff1aSopenharmony_ci    int ret = -1;
1691cabdff1aSopenharmony_ci
1692cabdff1aSopenharmony_ci    // Time code stamp
1693cabdff1aSopenharmony_ci    if (s->ts_present)
1694cabdff1aSopenharmony_ci        skip_bits_long(&s->gb, 32);
1695cabdff1aSopenharmony_ci
1696cabdff1aSopenharmony_ci    // Auxiliary data
1697cabdff1aSopenharmony_ci    if (s->aux_present && (ret = parse_aux_data(s)) < 0
1698cabdff1aSopenharmony_ci        && (s->avctx->err_recognition & AV_EF_EXPLODE))
1699cabdff1aSopenharmony_ci        return ret;
1700cabdff1aSopenharmony_ci
1701cabdff1aSopenharmony_ci    if (ret < 0)
1702cabdff1aSopenharmony_ci        s->prim_dmix_embedded = 0;
1703cabdff1aSopenharmony_ci
1704cabdff1aSopenharmony_ci    // Core extensions
1705cabdff1aSopenharmony_ci    if (s->ext_audio_present && !dca->core_only) {
1706cabdff1aSopenharmony_ci        int sync_pos = FFMIN(s->frame_size / 4, s->gb.size_in_bits / 32) - 1;
1707cabdff1aSopenharmony_ci        int last_pos = get_bits_count(&s->gb) / 32;
1708cabdff1aSopenharmony_ci        int size, dist;
1709cabdff1aSopenharmony_ci        uint32_t w1, w2 = 0;
1710cabdff1aSopenharmony_ci
1711cabdff1aSopenharmony_ci        // Search for extension sync words aligned on 4-byte boundary. Search
1712cabdff1aSopenharmony_ci        // must be done backwards from the end of core frame to work around
1713cabdff1aSopenharmony_ci        // sync word aliasing issues.
1714cabdff1aSopenharmony_ci        switch (s->ext_audio_type) {
1715cabdff1aSopenharmony_ci        case DCA_EXT_AUDIO_XCH:
1716cabdff1aSopenharmony_ci            if (dca->request_channel_layout)
1717cabdff1aSopenharmony_ci                break;
1718cabdff1aSopenharmony_ci
1719cabdff1aSopenharmony_ci            // The distance between XCH sync word and end of the core frame
1720cabdff1aSopenharmony_ci            // must be equal to XCH frame size. Off by one error is allowed for
1721cabdff1aSopenharmony_ci            // compatibility with legacy bitstreams. Minimum XCH frame size is
1722cabdff1aSopenharmony_ci            // 96 bytes. AMODE and PCHS are further checked to reduce
1723cabdff1aSopenharmony_ci            // probability of alias sync detection.
1724cabdff1aSopenharmony_ci            for (; sync_pos >= last_pos; sync_pos--, w2 = w1) {
1725cabdff1aSopenharmony_ci                w1 = AV_RB32(s->gb.buffer + sync_pos * 4);
1726cabdff1aSopenharmony_ci                if (w1 == DCA_SYNCWORD_XCH) {
1727cabdff1aSopenharmony_ci                    size = (w2 >> 22) + 1;
1728cabdff1aSopenharmony_ci                    dist = s->frame_size - sync_pos * 4;
1729cabdff1aSopenharmony_ci                    if (size >= 96
1730cabdff1aSopenharmony_ci                        && (size == dist || size - 1 == dist)
1731cabdff1aSopenharmony_ci                        && (w2 >> 15 & 0x7f) == 0x08) {
1732cabdff1aSopenharmony_ci                        s->xch_pos = sync_pos * 32 + 49;
1733cabdff1aSopenharmony_ci                        break;
1734cabdff1aSopenharmony_ci                    }
1735cabdff1aSopenharmony_ci                }
1736cabdff1aSopenharmony_ci            }
1737cabdff1aSopenharmony_ci
1738cabdff1aSopenharmony_ci            if (!s->xch_pos) {
1739cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "XCH sync word not found\n");
1740cabdff1aSopenharmony_ci                if (s->avctx->err_recognition & AV_EF_EXPLODE)
1741cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
1742cabdff1aSopenharmony_ci            }
1743cabdff1aSopenharmony_ci            break;
1744cabdff1aSopenharmony_ci
1745cabdff1aSopenharmony_ci        case DCA_EXT_AUDIO_X96:
1746cabdff1aSopenharmony_ci            // The distance between X96 sync word and end of the core frame
1747cabdff1aSopenharmony_ci            // must be equal to X96 frame size. Minimum X96 frame size is 96
1748cabdff1aSopenharmony_ci            // bytes.
1749cabdff1aSopenharmony_ci            for (; sync_pos >= last_pos; sync_pos--, w2 = w1) {
1750cabdff1aSopenharmony_ci                w1 = AV_RB32(s->gb.buffer + sync_pos * 4);
1751cabdff1aSopenharmony_ci                if (w1 == DCA_SYNCWORD_X96) {
1752cabdff1aSopenharmony_ci                    size = (w2 >> 20) + 1;
1753cabdff1aSopenharmony_ci                    dist = s->frame_size - sync_pos * 4;
1754cabdff1aSopenharmony_ci                    if (size >= 96 && size == dist) {
1755cabdff1aSopenharmony_ci                        s->x96_pos = sync_pos * 32 + 44;
1756cabdff1aSopenharmony_ci                        break;
1757cabdff1aSopenharmony_ci                    }
1758cabdff1aSopenharmony_ci                }
1759cabdff1aSopenharmony_ci            }
1760cabdff1aSopenharmony_ci
1761cabdff1aSopenharmony_ci            if (!s->x96_pos) {
1762cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "X96 sync word not found\n");
1763cabdff1aSopenharmony_ci                if (s->avctx->err_recognition & AV_EF_EXPLODE)
1764cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
1765cabdff1aSopenharmony_ci            }
1766cabdff1aSopenharmony_ci            break;
1767cabdff1aSopenharmony_ci
1768cabdff1aSopenharmony_ci        case DCA_EXT_AUDIO_XXCH:
1769cabdff1aSopenharmony_ci            if (dca->request_channel_layout)
1770cabdff1aSopenharmony_ci                break;
1771cabdff1aSopenharmony_ci
1772cabdff1aSopenharmony_ci            // XXCH frame header CRC must be valid. Minimum XXCH frame header
1773cabdff1aSopenharmony_ci            // size is 11 bytes.
1774cabdff1aSopenharmony_ci            for (; sync_pos >= last_pos; sync_pos--, w2 = w1) {
1775cabdff1aSopenharmony_ci                w1 = AV_RB32(s->gb.buffer + sync_pos * 4);
1776cabdff1aSopenharmony_ci                if (w1 == DCA_SYNCWORD_XXCH) {
1777cabdff1aSopenharmony_ci                    size = (w2 >> 26) + 1;
1778cabdff1aSopenharmony_ci                    dist = s->gb.size_in_bits / 8 - sync_pos * 4;
1779cabdff1aSopenharmony_ci                    if (size >= 11 && size <= dist &&
1780cabdff1aSopenharmony_ci                        !av_crc(dca->crctab, 0xffff, s->gb.buffer +
1781cabdff1aSopenharmony_ci                                (sync_pos + 1) * 4, size - 4)) {
1782cabdff1aSopenharmony_ci                        s->xxch_pos = sync_pos * 32;
1783cabdff1aSopenharmony_ci                        break;
1784cabdff1aSopenharmony_ci                    }
1785cabdff1aSopenharmony_ci                }
1786cabdff1aSopenharmony_ci            }
1787cabdff1aSopenharmony_ci
1788cabdff1aSopenharmony_ci            if (!s->xxch_pos) {
1789cabdff1aSopenharmony_ci                av_log(s->avctx, AV_LOG_ERROR, "XXCH sync word not found\n");
1790cabdff1aSopenharmony_ci                if (s->avctx->err_recognition & AV_EF_EXPLODE)
1791cabdff1aSopenharmony_ci                    return AVERROR_INVALIDDATA;
1792cabdff1aSopenharmony_ci            }
1793cabdff1aSopenharmony_ci            break;
1794cabdff1aSopenharmony_ci        }
1795cabdff1aSopenharmony_ci    }
1796cabdff1aSopenharmony_ci
1797cabdff1aSopenharmony_ci    return 0;
1798cabdff1aSopenharmony_ci}
1799cabdff1aSopenharmony_ci
1800cabdff1aSopenharmony_ciint ff_dca_core_parse(DCACoreDecoder *s, const uint8_t *data, int size)
1801cabdff1aSopenharmony_ci{
1802cabdff1aSopenharmony_ci    int ret;
1803cabdff1aSopenharmony_ci
1804cabdff1aSopenharmony_ci    s->ext_audio_mask = 0;
1805cabdff1aSopenharmony_ci    s->xch_pos = s->xxch_pos = s->x96_pos = 0;
1806cabdff1aSopenharmony_ci
1807cabdff1aSopenharmony_ci    if ((ret = init_get_bits8(&s->gb, data, size)) < 0)
1808cabdff1aSopenharmony_ci        return ret;
1809cabdff1aSopenharmony_ci    s->gb_in = s->gb;
1810cabdff1aSopenharmony_ci
1811cabdff1aSopenharmony_ci    if ((ret = parse_frame_header(s)) < 0)
1812cabdff1aSopenharmony_ci        return ret;
1813cabdff1aSopenharmony_ci    if ((ret = alloc_sample_buffer(s)) < 0)
1814cabdff1aSopenharmony_ci        return ret;
1815cabdff1aSopenharmony_ci    if ((ret = parse_frame_data(s, HEADER_CORE, 0)) < 0)
1816cabdff1aSopenharmony_ci        return ret;
1817cabdff1aSopenharmony_ci    if ((ret = parse_optional_info(s)) < 0)
1818cabdff1aSopenharmony_ci        return ret;
1819cabdff1aSopenharmony_ci
1820cabdff1aSopenharmony_ci    // Workaround for DTS in WAV
1821cabdff1aSopenharmony_ci    if (s->frame_size > size)
1822cabdff1aSopenharmony_ci        s->frame_size = size;
1823cabdff1aSopenharmony_ci
1824cabdff1aSopenharmony_ci    if (ff_dca_seek_bits(&s->gb, s->frame_size * 8)) {
1825cabdff1aSopenharmony_ci        av_log(s->avctx, AV_LOG_ERROR, "Read past end of core frame\n");
1826cabdff1aSopenharmony_ci        if (s->avctx->err_recognition & AV_EF_EXPLODE)
1827cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
1828cabdff1aSopenharmony_ci    }
1829cabdff1aSopenharmony_ci
1830cabdff1aSopenharmony_ci    return 0;
1831cabdff1aSopenharmony_ci}
1832cabdff1aSopenharmony_ci
1833cabdff1aSopenharmony_ciint ff_dca_core_parse_exss(DCACoreDecoder *s, const uint8_t *data, DCAExssAsset *asset)
1834cabdff1aSopenharmony_ci{
1835cabdff1aSopenharmony_ci    AVCodecContext *avctx = s->avctx;
1836cabdff1aSopenharmony_ci    DCAContext *dca = avctx->priv_data;
1837cabdff1aSopenharmony_ci    int exss_mask = asset ? asset->extension_mask : 0;
1838cabdff1aSopenharmony_ci    int ret = 0, ext = 0;
1839cabdff1aSopenharmony_ci
1840cabdff1aSopenharmony_ci    // Parse (X)XCH unless downmixing
1841cabdff1aSopenharmony_ci    if (!dca->request_channel_layout) {
1842cabdff1aSopenharmony_ci        if (exss_mask & DCA_EXSS_XXCH) {
1843cabdff1aSopenharmony_ci            if ((ret = init_get_bits8(&s->gb, data + asset->xxch_offset, asset->xxch_size)) < 0)
1844cabdff1aSopenharmony_ci                return ret;
1845cabdff1aSopenharmony_ci            ret = parse_xxch_frame(s);
1846cabdff1aSopenharmony_ci            ext = DCA_EXSS_XXCH;
1847cabdff1aSopenharmony_ci        } else if (s->xxch_pos) {
1848cabdff1aSopenharmony_ci            s->gb = s->gb_in;
1849cabdff1aSopenharmony_ci            skip_bits_long(&s->gb, s->xxch_pos);
1850cabdff1aSopenharmony_ci            ret = parse_xxch_frame(s);
1851cabdff1aSopenharmony_ci            ext = DCA_CSS_XXCH;
1852cabdff1aSopenharmony_ci        } else if (s->xch_pos) {
1853cabdff1aSopenharmony_ci            s->gb = s->gb_in;
1854cabdff1aSopenharmony_ci            skip_bits_long(&s->gb, s->xch_pos);
1855cabdff1aSopenharmony_ci            ret = parse_xch_frame(s);
1856cabdff1aSopenharmony_ci            ext = DCA_CSS_XCH;
1857cabdff1aSopenharmony_ci        }
1858cabdff1aSopenharmony_ci
1859cabdff1aSopenharmony_ci        // Revert to primary channel set in case (X)XCH parsing fails
1860cabdff1aSopenharmony_ci        if (ret < 0) {
1861cabdff1aSopenharmony_ci            if (avctx->err_recognition & AV_EF_EXPLODE)
1862cabdff1aSopenharmony_ci                return ret;
1863cabdff1aSopenharmony_ci            s->nchannels = ff_dca_channels[s->audio_mode];
1864cabdff1aSopenharmony_ci            s->ch_mask = audio_mode_ch_mask[s->audio_mode];
1865cabdff1aSopenharmony_ci            if (s->lfe_present)
1866cabdff1aSopenharmony_ci                s->ch_mask |= DCA_SPEAKER_MASK_LFE1;
1867cabdff1aSopenharmony_ci        } else {
1868cabdff1aSopenharmony_ci            s->ext_audio_mask |= ext;
1869cabdff1aSopenharmony_ci        }
1870cabdff1aSopenharmony_ci    }
1871cabdff1aSopenharmony_ci
1872cabdff1aSopenharmony_ci    // Parse XBR
1873cabdff1aSopenharmony_ci    if (exss_mask & DCA_EXSS_XBR) {
1874cabdff1aSopenharmony_ci        if ((ret = init_get_bits8(&s->gb, data + asset->xbr_offset, asset->xbr_size)) < 0)
1875cabdff1aSopenharmony_ci            return ret;
1876cabdff1aSopenharmony_ci        if ((ret = parse_xbr_frame(s)) < 0) {
1877cabdff1aSopenharmony_ci            if (avctx->err_recognition & AV_EF_EXPLODE)
1878cabdff1aSopenharmony_ci                return ret;
1879cabdff1aSopenharmony_ci        } else {
1880cabdff1aSopenharmony_ci            s->ext_audio_mask |= DCA_EXSS_XBR;
1881cabdff1aSopenharmony_ci        }
1882cabdff1aSopenharmony_ci    }
1883cabdff1aSopenharmony_ci
1884cabdff1aSopenharmony_ci    // Parse X96 unless decoding XLL
1885cabdff1aSopenharmony_ci    if (!(dca->packet & DCA_PACKET_XLL)) {
1886cabdff1aSopenharmony_ci        if (exss_mask & DCA_EXSS_X96) {
1887cabdff1aSopenharmony_ci            if ((ret = init_get_bits8(&s->gb, data + asset->x96_offset, asset->x96_size)) < 0)
1888cabdff1aSopenharmony_ci                return ret;
1889cabdff1aSopenharmony_ci            if ((ret = parse_x96_frame_exss(s)) < 0) {
1890cabdff1aSopenharmony_ci                if (ret == AVERROR(ENOMEM) || (avctx->err_recognition & AV_EF_EXPLODE))
1891cabdff1aSopenharmony_ci                    return ret;
1892cabdff1aSopenharmony_ci            } else {
1893cabdff1aSopenharmony_ci                s->ext_audio_mask |= DCA_EXSS_X96;
1894cabdff1aSopenharmony_ci            }
1895cabdff1aSopenharmony_ci        } else if (s->x96_pos) {
1896cabdff1aSopenharmony_ci            s->gb = s->gb_in;
1897cabdff1aSopenharmony_ci            skip_bits_long(&s->gb, s->x96_pos);
1898cabdff1aSopenharmony_ci            if ((ret = parse_x96_frame(s)) < 0) {
1899cabdff1aSopenharmony_ci                if (ret == AVERROR(ENOMEM) || (avctx->err_recognition & AV_EF_EXPLODE))
1900cabdff1aSopenharmony_ci                    return ret;
1901cabdff1aSopenharmony_ci            } else {
1902cabdff1aSopenharmony_ci                s->ext_audio_mask |= DCA_CSS_X96;
1903cabdff1aSopenharmony_ci            }
1904cabdff1aSopenharmony_ci        }
1905cabdff1aSopenharmony_ci    }
1906cabdff1aSopenharmony_ci
1907cabdff1aSopenharmony_ci    return 0;
1908cabdff1aSopenharmony_ci}
1909cabdff1aSopenharmony_ci
1910cabdff1aSopenharmony_cistatic int map_prm_ch_to_spkr(DCACoreDecoder *s, int ch)
1911cabdff1aSopenharmony_ci{
1912cabdff1aSopenharmony_ci    int pos, spkr;
1913cabdff1aSopenharmony_ci
1914cabdff1aSopenharmony_ci    // Try to map this channel to core first
1915cabdff1aSopenharmony_ci    pos = ff_dca_channels[s->audio_mode];
1916cabdff1aSopenharmony_ci    if (ch < pos) {
1917cabdff1aSopenharmony_ci        spkr = prm_ch_to_spkr_map[s->audio_mode][ch];
1918cabdff1aSopenharmony_ci        if (s->ext_audio_mask & (DCA_CSS_XXCH | DCA_EXSS_XXCH)) {
1919cabdff1aSopenharmony_ci            if (s->xxch_core_mask & (1U << spkr))
1920cabdff1aSopenharmony_ci                return spkr;
1921cabdff1aSopenharmony_ci            if (spkr == DCA_SPEAKER_Ls && (s->xxch_core_mask & DCA_SPEAKER_MASK_Lss))
1922cabdff1aSopenharmony_ci                return DCA_SPEAKER_Lss;
1923cabdff1aSopenharmony_ci            if (spkr == DCA_SPEAKER_Rs && (s->xxch_core_mask & DCA_SPEAKER_MASK_Rss))
1924cabdff1aSopenharmony_ci                return DCA_SPEAKER_Rss;
1925cabdff1aSopenharmony_ci            return -1;
1926cabdff1aSopenharmony_ci        }
1927cabdff1aSopenharmony_ci        return spkr;
1928cabdff1aSopenharmony_ci    }
1929cabdff1aSopenharmony_ci
1930cabdff1aSopenharmony_ci    // Then XCH
1931cabdff1aSopenharmony_ci    if ((s->ext_audio_mask & DCA_CSS_XCH) && ch == pos)
1932cabdff1aSopenharmony_ci        return DCA_SPEAKER_Cs;
1933cabdff1aSopenharmony_ci
1934cabdff1aSopenharmony_ci    // Then XXCH
1935cabdff1aSopenharmony_ci    if (s->ext_audio_mask & (DCA_CSS_XXCH | DCA_EXSS_XXCH)) {
1936cabdff1aSopenharmony_ci        for (spkr = DCA_SPEAKER_Cs; spkr < s->xxch_mask_nbits; spkr++)
1937cabdff1aSopenharmony_ci            if (s->xxch_spkr_mask & (1U << spkr))
1938cabdff1aSopenharmony_ci                if (pos++ == ch)
1939cabdff1aSopenharmony_ci                    return spkr;
1940cabdff1aSopenharmony_ci    }
1941cabdff1aSopenharmony_ci
1942cabdff1aSopenharmony_ci    // No mapping
1943cabdff1aSopenharmony_ci    return -1;
1944cabdff1aSopenharmony_ci}
1945cabdff1aSopenharmony_ci
1946cabdff1aSopenharmony_cistatic void erase_dsp_history(DCACoreDecoder *s)
1947cabdff1aSopenharmony_ci{
1948cabdff1aSopenharmony_ci    memset(s->dcadsp_data, 0, sizeof(s->dcadsp_data));
1949cabdff1aSopenharmony_ci    s->output_history_lfe_fixed = 0;
1950cabdff1aSopenharmony_ci    s->output_history_lfe_float = 0;
1951cabdff1aSopenharmony_ci}
1952cabdff1aSopenharmony_ci
1953cabdff1aSopenharmony_cistatic void set_filter_mode(DCACoreDecoder *s, int mode)
1954cabdff1aSopenharmony_ci{
1955cabdff1aSopenharmony_ci    if (s->filter_mode != mode) {
1956cabdff1aSopenharmony_ci        erase_dsp_history(s);
1957cabdff1aSopenharmony_ci        s->filter_mode = mode;
1958cabdff1aSopenharmony_ci    }
1959cabdff1aSopenharmony_ci}
1960cabdff1aSopenharmony_ci
1961cabdff1aSopenharmony_ciint ff_dca_core_filter_fixed(DCACoreDecoder *s, int x96_synth)
1962cabdff1aSopenharmony_ci{
1963cabdff1aSopenharmony_ci    int n, ch, spkr, nsamples, x96_nchannels = 0;
1964cabdff1aSopenharmony_ci    const int32_t *filter_coeff;
1965cabdff1aSopenharmony_ci    int32_t *ptr;
1966cabdff1aSopenharmony_ci
1967cabdff1aSopenharmony_ci    // Externally set x96_synth flag implies that X96 synthesis should be
1968cabdff1aSopenharmony_ci    // enabled, yet actual X96 subband data should be discarded. This is a
1969cabdff1aSopenharmony_ci    // special case for lossless residual decoder that ignores X96 data if
1970cabdff1aSopenharmony_ci    // present.
1971cabdff1aSopenharmony_ci    if (!x96_synth && (s->ext_audio_mask & (DCA_CSS_X96 | DCA_EXSS_X96))) {
1972cabdff1aSopenharmony_ci        x96_nchannels = s->x96_nchannels;
1973cabdff1aSopenharmony_ci        x96_synth = 1;
1974cabdff1aSopenharmony_ci    }
1975cabdff1aSopenharmony_ci    if (x96_synth < 0)
1976cabdff1aSopenharmony_ci        x96_synth = 0;
1977cabdff1aSopenharmony_ci
1978cabdff1aSopenharmony_ci    s->output_rate = s->sample_rate << x96_synth;
1979cabdff1aSopenharmony_ci    s->npcmsamples = nsamples = (s->npcmblocks * DCA_PCMBLOCK_SAMPLES) << x96_synth;
1980cabdff1aSopenharmony_ci
1981cabdff1aSopenharmony_ci    // Reallocate PCM output buffer
1982cabdff1aSopenharmony_ci    av_fast_malloc(&s->output_buffer, &s->output_size,
1983cabdff1aSopenharmony_ci                   nsamples * av_popcount(s->ch_mask) * sizeof(int32_t));
1984cabdff1aSopenharmony_ci    if (!s->output_buffer)
1985cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
1986cabdff1aSopenharmony_ci
1987cabdff1aSopenharmony_ci    ptr = (int32_t *)s->output_buffer;
1988cabdff1aSopenharmony_ci    for (spkr = 0; spkr < DCA_SPEAKER_COUNT; spkr++) {
1989cabdff1aSopenharmony_ci        if (s->ch_mask & (1U << spkr)) {
1990cabdff1aSopenharmony_ci            s->output_samples[spkr] = ptr;
1991cabdff1aSopenharmony_ci            ptr += nsamples;
1992cabdff1aSopenharmony_ci        } else {
1993cabdff1aSopenharmony_ci            s->output_samples[spkr] = NULL;
1994cabdff1aSopenharmony_ci        }
1995cabdff1aSopenharmony_ci    }
1996cabdff1aSopenharmony_ci
1997cabdff1aSopenharmony_ci    // Handle change of filtering mode
1998cabdff1aSopenharmony_ci    set_filter_mode(s, x96_synth | DCA_FILTER_MODE_FIXED);
1999cabdff1aSopenharmony_ci
2000cabdff1aSopenharmony_ci    // Select filter
2001cabdff1aSopenharmony_ci    if (x96_synth)
2002cabdff1aSopenharmony_ci        filter_coeff = ff_dca_fir_64bands_fixed;
2003cabdff1aSopenharmony_ci    else if (s->filter_perfect)
2004cabdff1aSopenharmony_ci        filter_coeff = ff_dca_fir_32bands_perfect_fixed;
2005cabdff1aSopenharmony_ci    else
2006cabdff1aSopenharmony_ci        filter_coeff = ff_dca_fir_32bands_nonperfect_fixed;
2007cabdff1aSopenharmony_ci
2008cabdff1aSopenharmony_ci    // Filter primary channels
2009cabdff1aSopenharmony_ci    for (ch = 0; ch < s->nchannels; ch++) {
2010cabdff1aSopenharmony_ci        // Map this primary channel to speaker
2011cabdff1aSopenharmony_ci        spkr = map_prm_ch_to_spkr(s, ch);
2012cabdff1aSopenharmony_ci        if (spkr < 0)
2013cabdff1aSopenharmony_ci            return AVERROR(EINVAL);
2014cabdff1aSopenharmony_ci
2015cabdff1aSopenharmony_ci        // Filter bank reconstruction
2016cabdff1aSopenharmony_ci        s->dcadsp->sub_qmf_fixed[x96_synth](
2017cabdff1aSopenharmony_ci            &s->synth,
2018cabdff1aSopenharmony_ci            &s->dcadct,
2019cabdff1aSopenharmony_ci            s->output_samples[spkr],
2020cabdff1aSopenharmony_ci            s->subband_samples[ch],
2021cabdff1aSopenharmony_ci            ch < x96_nchannels ? s->x96_subband_samples[ch] : NULL,
2022cabdff1aSopenharmony_ci            s->dcadsp_data[ch].u.fix.hist1,
2023cabdff1aSopenharmony_ci            &s->dcadsp_data[ch].offset,
2024cabdff1aSopenharmony_ci            s->dcadsp_data[ch].u.fix.hist2,
2025cabdff1aSopenharmony_ci            filter_coeff,
2026cabdff1aSopenharmony_ci            s->npcmblocks);
2027cabdff1aSopenharmony_ci    }
2028cabdff1aSopenharmony_ci
2029cabdff1aSopenharmony_ci    // Filter LFE channel
2030cabdff1aSopenharmony_ci    if (s->lfe_present) {
2031cabdff1aSopenharmony_ci        int32_t *samples = s->output_samples[DCA_SPEAKER_LFE1];
2032cabdff1aSopenharmony_ci        int nlfesamples = s->npcmblocks >> 1;
2033cabdff1aSopenharmony_ci
2034cabdff1aSopenharmony_ci        // Check LFF
2035cabdff1aSopenharmony_ci        if (s->lfe_present == DCA_LFE_FLAG_128) {
2036cabdff1aSopenharmony_ci            av_log(s->avctx, AV_LOG_ERROR, "Fixed point mode doesn't support LFF=1\n");
2037cabdff1aSopenharmony_ci            return AVERROR(EINVAL);
2038cabdff1aSopenharmony_ci        }
2039cabdff1aSopenharmony_ci
2040cabdff1aSopenharmony_ci        // Offset intermediate buffer for X96
2041cabdff1aSopenharmony_ci        if (x96_synth)
2042cabdff1aSopenharmony_ci            samples += nsamples / 2;
2043cabdff1aSopenharmony_ci
2044cabdff1aSopenharmony_ci        // Interpolate LFE channel
2045cabdff1aSopenharmony_ci        s->dcadsp->lfe_fir_fixed(samples, s->lfe_samples + DCA_LFE_HISTORY,
2046cabdff1aSopenharmony_ci                                 ff_dca_lfe_fir_64_fixed, s->npcmblocks);
2047cabdff1aSopenharmony_ci
2048cabdff1aSopenharmony_ci        if (x96_synth) {
2049cabdff1aSopenharmony_ci            // Filter 96 kHz oversampled LFE PCM to attenuate high frequency
2050cabdff1aSopenharmony_ci            // (47.6 - 48.0 kHz) components of interpolation image
2051cabdff1aSopenharmony_ci            s->dcadsp->lfe_x96_fixed(s->output_samples[DCA_SPEAKER_LFE1],
2052cabdff1aSopenharmony_ci                                     samples, &s->output_history_lfe_fixed,
2053cabdff1aSopenharmony_ci                                     nsamples / 2);
2054cabdff1aSopenharmony_ci
2055cabdff1aSopenharmony_ci        }
2056cabdff1aSopenharmony_ci
2057cabdff1aSopenharmony_ci        // Update LFE history
2058cabdff1aSopenharmony_ci        for (n = DCA_LFE_HISTORY - 1; n >= 0; n--)
2059cabdff1aSopenharmony_ci            s->lfe_samples[n] = s->lfe_samples[nlfesamples + n];
2060cabdff1aSopenharmony_ci    }
2061cabdff1aSopenharmony_ci
2062cabdff1aSopenharmony_ci    return 0;
2063cabdff1aSopenharmony_ci}
2064cabdff1aSopenharmony_ci
2065cabdff1aSopenharmony_cistatic int filter_frame_fixed(DCACoreDecoder *s, AVFrame *frame)
2066cabdff1aSopenharmony_ci{
2067cabdff1aSopenharmony_ci    AVCodecContext *avctx = s->avctx;
2068cabdff1aSopenharmony_ci    DCAContext *dca = avctx->priv_data;
2069cabdff1aSopenharmony_ci    int i, n, ch, ret, spkr, nsamples;
2070cabdff1aSopenharmony_ci
2071cabdff1aSopenharmony_ci    // Don't filter twice when falling back from XLL
2072cabdff1aSopenharmony_ci    if (!(dca->packet & DCA_PACKET_XLL) && (ret = ff_dca_core_filter_fixed(s, 0)) < 0)
2073cabdff1aSopenharmony_ci        return ret;
2074cabdff1aSopenharmony_ci
2075cabdff1aSopenharmony_ci    avctx->sample_rate = s->output_rate;
2076cabdff1aSopenharmony_ci    avctx->sample_fmt = AV_SAMPLE_FMT_S32P;
2077cabdff1aSopenharmony_ci    avctx->bits_per_raw_sample = 24;
2078cabdff1aSopenharmony_ci
2079cabdff1aSopenharmony_ci    frame->nb_samples = nsamples = s->npcmsamples;
2080cabdff1aSopenharmony_ci    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
2081cabdff1aSopenharmony_ci        return ret;
2082cabdff1aSopenharmony_ci
2083cabdff1aSopenharmony_ci    // Undo embedded XCH downmix
2084cabdff1aSopenharmony_ci    if (s->es_format && (s->ext_audio_mask & DCA_CSS_XCH)
2085cabdff1aSopenharmony_ci        && s->audio_mode >= DCA_AMODE_2F2R) {
2086cabdff1aSopenharmony_ci        s->dcadsp->dmix_sub_xch(s->output_samples[DCA_SPEAKER_Ls],
2087cabdff1aSopenharmony_ci                                s->output_samples[DCA_SPEAKER_Rs],
2088cabdff1aSopenharmony_ci                                s->output_samples[DCA_SPEAKER_Cs],
2089cabdff1aSopenharmony_ci                                nsamples);
2090cabdff1aSopenharmony_ci
2091cabdff1aSopenharmony_ci    }
2092cabdff1aSopenharmony_ci
2093cabdff1aSopenharmony_ci    // Undo embedded XXCH downmix
2094cabdff1aSopenharmony_ci    if ((s->ext_audio_mask & (DCA_CSS_XXCH | DCA_EXSS_XXCH))
2095cabdff1aSopenharmony_ci        && s->xxch_dmix_embedded) {
2096cabdff1aSopenharmony_ci        int scale_inv   = s->xxch_dmix_scale_inv;
2097cabdff1aSopenharmony_ci        int *coeff_ptr  = s->xxch_dmix_coeff;
2098cabdff1aSopenharmony_ci        int xch_base    = ff_dca_channels[s->audio_mode];
2099cabdff1aSopenharmony_ci        av_assert1(s->nchannels - xch_base <= DCA_XXCH_CHANNELS_MAX);
2100cabdff1aSopenharmony_ci
2101cabdff1aSopenharmony_ci        // Undo embedded core downmix pre-scaling
2102cabdff1aSopenharmony_ci        for (spkr = 0; spkr < s->xxch_mask_nbits; spkr++) {
2103cabdff1aSopenharmony_ci            if (s->xxch_core_mask & (1U << spkr)) {
2104cabdff1aSopenharmony_ci                s->dcadsp->dmix_scale_inv(s->output_samples[spkr],
2105cabdff1aSopenharmony_ci                                          scale_inv, nsamples);
2106cabdff1aSopenharmony_ci            }
2107cabdff1aSopenharmony_ci        }
2108cabdff1aSopenharmony_ci
2109cabdff1aSopenharmony_ci        // Undo downmix
2110cabdff1aSopenharmony_ci        for (ch = xch_base; ch < s->nchannels; ch++) {
2111cabdff1aSopenharmony_ci            int src_spkr = map_prm_ch_to_spkr(s, ch);
2112cabdff1aSopenharmony_ci            if (src_spkr < 0)
2113cabdff1aSopenharmony_ci                return AVERROR(EINVAL);
2114cabdff1aSopenharmony_ci            for (spkr = 0; spkr < s->xxch_mask_nbits; spkr++) {
2115cabdff1aSopenharmony_ci                if (s->xxch_dmix_mask[ch - xch_base] & (1U << spkr)) {
2116cabdff1aSopenharmony_ci                    int coeff = mul16(*coeff_ptr++, scale_inv);
2117cabdff1aSopenharmony_ci                    if (coeff) {
2118cabdff1aSopenharmony_ci                        s->dcadsp->dmix_sub(s->output_samples[spkr    ],
2119cabdff1aSopenharmony_ci                                            s->output_samples[src_spkr],
2120cabdff1aSopenharmony_ci                                            coeff, nsamples);
2121cabdff1aSopenharmony_ci                    }
2122cabdff1aSopenharmony_ci                }
2123cabdff1aSopenharmony_ci            }
2124cabdff1aSopenharmony_ci        }
2125cabdff1aSopenharmony_ci    }
2126cabdff1aSopenharmony_ci
2127cabdff1aSopenharmony_ci    if (!(s->ext_audio_mask & (DCA_CSS_XXCH | DCA_CSS_XCH | DCA_EXSS_XXCH))) {
2128cabdff1aSopenharmony_ci        // Front sum/difference decoding
2129cabdff1aSopenharmony_ci        if ((s->sumdiff_front && s->audio_mode > DCA_AMODE_MONO)
2130cabdff1aSopenharmony_ci            || s->audio_mode == DCA_AMODE_STEREO_SUMDIFF) {
2131cabdff1aSopenharmony_ci            s->fixed_dsp->butterflies_fixed(s->output_samples[DCA_SPEAKER_L],
2132cabdff1aSopenharmony_ci                                            s->output_samples[DCA_SPEAKER_R],
2133cabdff1aSopenharmony_ci                                            nsamples);
2134cabdff1aSopenharmony_ci        }
2135cabdff1aSopenharmony_ci
2136cabdff1aSopenharmony_ci        // Surround sum/difference decoding
2137cabdff1aSopenharmony_ci        if (s->sumdiff_surround && s->audio_mode >= DCA_AMODE_2F2R) {
2138cabdff1aSopenharmony_ci            s->fixed_dsp->butterflies_fixed(s->output_samples[DCA_SPEAKER_Ls],
2139cabdff1aSopenharmony_ci                                            s->output_samples[DCA_SPEAKER_Rs],
2140cabdff1aSopenharmony_ci                                            nsamples);
2141cabdff1aSopenharmony_ci        }
2142cabdff1aSopenharmony_ci    }
2143cabdff1aSopenharmony_ci
2144cabdff1aSopenharmony_ci    // Downmix primary channel set to stereo
2145cabdff1aSopenharmony_ci    if (s->request_mask != s->ch_mask) {
2146cabdff1aSopenharmony_ci        ff_dca_downmix_to_stereo_fixed(s->dcadsp,
2147cabdff1aSopenharmony_ci                                       s->output_samples,
2148cabdff1aSopenharmony_ci                                       s->prim_dmix_coeff,
2149cabdff1aSopenharmony_ci                                       nsamples, s->ch_mask);
2150cabdff1aSopenharmony_ci    }
2151cabdff1aSopenharmony_ci
2152cabdff1aSopenharmony_ci    for (i = 0; i < avctx->ch_layout.nb_channels; i++) {
2153cabdff1aSopenharmony_ci        int32_t *samples = s->output_samples[s->ch_remap[i]];
2154cabdff1aSopenharmony_ci        int32_t *plane = (int32_t *)frame->extended_data[i];
2155cabdff1aSopenharmony_ci        for (n = 0; n < nsamples; n++)
2156cabdff1aSopenharmony_ci            plane[n] = clip23(samples[n]) * (1 << 8);
2157cabdff1aSopenharmony_ci    }
2158cabdff1aSopenharmony_ci
2159cabdff1aSopenharmony_ci    return 0;
2160cabdff1aSopenharmony_ci}
2161cabdff1aSopenharmony_ci
2162cabdff1aSopenharmony_cistatic int filter_frame_float(DCACoreDecoder *s, AVFrame *frame)
2163cabdff1aSopenharmony_ci{
2164cabdff1aSopenharmony_ci    AVCodecContext *avctx = s->avctx;
2165cabdff1aSopenharmony_ci    int x96_nchannels = 0, x96_synth = 0;
2166cabdff1aSopenharmony_ci    int i, n, ch, ret, spkr, nsamples, nchannels;
2167cabdff1aSopenharmony_ci    float *output_samples[DCA_SPEAKER_COUNT] = { NULL }, *ptr;
2168cabdff1aSopenharmony_ci    const float *filter_coeff;
2169cabdff1aSopenharmony_ci
2170cabdff1aSopenharmony_ci    if (s->ext_audio_mask & (DCA_CSS_X96 | DCA_EXSS_X96)) {
2171cabdff1aSopenharmony_ci        x96_nchannels = s->x96_nchannels;
2172cabdff1aSopenharmony_ci        x96_synth = 1;
2173cabdff1aSopenharmony_ci    }
2174cabdff1aSopenharmony_ci
2175cabdff1aSopenharmony_ci    avctx->sample_rate = s->sample_rate << x96_synth;
2176cabdff1aSopenharmony_ci    avctx->sample_fmt = AV_SAMPLE_FMT_FLTP;
2177cabdff1aSopenharmony_ci    avctx->bits_per_raw_sample = 0;
2178cabdff1aSopenharmony_ci
2179cabdff1aSopenharmony_ci    frame->nb_samples = nsamples = (s->npcmblocks * DCA_PCMBLOCK_SAMPLES) << x96_synth;
2180cabdff1aSopenharmony_ci    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
2181cabdff1aSopenharmony_ci        return ret;
2182cabdff1aSopenharmony_ci
2183cabdff1aSopenharmony_ci    // Build reverse speaker to channel mapping
2184cabdff1aSopenharmony_ci    for (i = 0; i < avctx->ch_layout.nb_channels; i++)
2185cabdff1aSopenharmony_ci        output_samples[s->ch_remap[i]] = (float *)frame->extended_data[i];
2186cabdff1aSopenharmony_ci
2187cabdff1aSopenharmony_ci    // Allocate space for extra channels
2188cabdff1aSopenharmony_ci    nchannels = av_popcount(s->ch_mask) - avctx->ch_layout.nb_channels;
2189cabdff1aSopenharmony_ci    if (nchannels > 0) {
2190cabdff1aSopenharmony_ci        av_fast_malloc(&s->output_buffer, &s->output_size,
2191cabdff1aSopenharmony_ci                       nsamples * nchannels * sizeof(float));
2192cabdff1aSopenharmony_ci        if (!s->output_buffer)
2193cabdff1aSopenharmony_ci            return AVERROR(ENOMEM);
2194cabdff1aSopenharmony_ci
2195cabdff1aSopenharmony_ci        ptr = (float *)s->output_buffer;
2196cabdff1aSopenharmony_ci        for (spkr = 0; spkr < DCA_SPEAKER_COUNT; spkr++) {
2197cabdff1aSopenharmony_ci            if (!(s->ch_mask & (1U << spkr)))
2198cabdff1aSopenharmony_ci                continue;
2199cabdff1aSopenharmony_ci            if (output_samples[spkr])
2200cabdff1aSopenharmony_ci                continue;
2201cabdff1aSopenharmony_ci            output_samples[spkr] = ptr;
2202cabdff1aSopenharmony_ci            ptr += nsamples;
2203cabdff1aSopenharmony_ci        }
2204cabdff1aSopenharmony_ci    }
2205cabdff1aSopenharmony_ci
2206cabdff1aSopenharmony_ci    // Handle change of filtering mode
2207cabdff1aSopenharmony_ci    set_filter_mode(s, x96_synth);
2208cabdff1aSopenharmony_ci
2209cabdff1aSopenharmony_ci    // Select filter
2210cabdff1aSopenharmony_ci    if (x96_synth)
2211cabdff1aSopenharmony_ci        filter_coeff = ff_dca_fir_64bands;
2212cabdff1aSopenharmony_ci    else if (s->filter_perfect)
2213cabdff1aSopenharmony_ci        filter_coeff = ff_dca_fir_32bands_perfect;
2214cabdff1aSopenharmony_ci    else
2215cabdff1aSopenharmony_ci        filter_coeff = ff_dca_fir_32bands_nonperfect;
2216cabdff1aSopenharmony_ci
2217cabdff1aSopenharmony_ci    // Filter primary channels
2218cabdff1aSopenharmony_ci    for (ch = 0; ch < s->nchannels; ch++) {
2219cabdff1aSopenharmony_ci        // Map this primary channel to speaker
2220cabdff1aSopenharmony_ci        spkr = map_prm_ch_to_spkr(s, ch);
2221cabdff1aSopenharmony_ci        if (spkr < 0)
2222cabdff1aSopenharmony_ci            return AVERROR(EINVAL);
2223cabdff1aSopenharmony_ci
2224cabdff1aSopenharmony_ci        // Filter bank reconstruction
2225cabdff1aSopenharmony_ci        s->dcadsp->sub_qmf_float[x96_synth](
2226cabdff1aSopenharmony_ci            &s->synth,
2227cabdff1aSopenharmony_ci            &s->imdct[x96_synth],
2228cabdff1aSopenharmony_ci            output_samples[spkr],
2229cabdff1aSopenharmony_ci            s->subband_samples[ch],
2230cabdff1aSopenharmony_ci            ch < x96_nchannels ? s->x96_subband_samples[ch] : NULL,
2231cabdff1aSopenharmony_ci            s->dcadsp_data[ch].u.flt.hist1,
2232cabdff1aSopenharmony_ci            &s->dcadsp_data[ch].offset,
2233cabdff1aSopenharmony_ci            s->dcadsp_data[ch].u.flt.hist2,
2234cabdff1aSopenharmony_ci            filter_coeff,
2235cabdff1aSopenharmony_ci            s->npcmblocks,
2236cabdff1aSopenharmony_ci            1.0f / (1 << (17 - x96_synth)));
2237cabdff1aSopenharmony_ci    }
2238cabdff1aSopenharmony_ci
2239cabdff1aSopenharmony_ci    // Filter LFE channel
2240cabdff1aSopenharmony_ci    if (s->lfe_present) {
2241cabdff1aSopenharmony_ci        int dec_select = (s->lfe_present == DCA_LFE_FLAG_128);
2242cabdff1aSopenharmony_ci        float *samples = output_samples[DCA_SPEAKER_LFE1];
2243cabdff1aSopenharmony_ci        int nlfesamples = s->npcmblocks >> (dec_select + 1);
2244cabdff1aSopenharmony_ci
2245cabdff1aSopenharmony_ci        // Offset intermediate buffer for X96
2246cabdff1aSopenharmony_ci        if (x96_synth)
2247cabdff1aSopenharmony_ci            samples += nsamples / 2;
2248cabdff1aSopenharmony_ci
2249cabdff1aSopenharmony_ci        // Select filter
2250cabdff1aSopenharmony_ci        if (dec_select)
2251cabdff1aSopenharmony_ci            filter_coeff = ff_dca_lfe_fir_128;
2252cabdff1aSopenharmony_ci        else
2253cabdff1aSopenharmony_ci            filter_coeff = ff_dca_lfe_fir_64;
2254cabdff1aSopenharmony_ci
2255cabdff1aSopenharmony_ci        // Interpolate LFE channel
2256cabdff1aSopenharmony_ci        s->dcadsp->lfe_fir_float[dec_select](
2257cabdff1aSopenharmony_ci            samples, s->lfe_samples + DCA_LFE_HISTORY,
2258cabdff1aSopenharmony_ci            filter_coeff, s->npcmblocks);
2259cabdff1aSopenharmony_ci
2260cabdff1aSopenharmony_ci        if (x96_synth) {
2261cabdff1aSopenharmony_ci            // Filter 96 kHz oversampled LFE PCM to attenuate high frequency
2262cabdff1aSopenharmony_ci            // (47.6 - 48.0 kHz) components of interpolation image
2263cabdff1aSopenharmony_ci            s->dcadsp->lfe_x96_float(output_samples[DCA_SPEAKER_LFE1],
2264cabdff1aSopenharmony_ci                                     samples, &s->output_history_lfe_float,
2265cabdff1aSopenharmony_ci                                     nsamples / 2);
2266cabdff1aSopenharmony_ci        }
2267cabdff1aSopenharmony_ci
2268cabdff1aSopenharmony_ci        // Update LFE history
2269cabdff1aSopenharmony_ci        for (n = DCA_LFE_HISTORY - 1; n >= 0; n--)
2270cabdff1aSopenharmony_ci            s->lfe_samples[n] = s->lfe_samples[nlfesamples + n];
2271cabdff1aSopenharmony_ci    }
2272cabdff1aSopenharmony_ci
2273cabdff1aSopenharmony_ci    // Undo embedded XCH downmix
2274cabdff1aSopenharmony_ci    if (s->es_format && (s->ext_audio_mask & DCA_CSS_XCH)
2275cabdff1aSopenharmony_ci        && s->audio_mode >= DCA_AMODE_2F2R) {
2276cabdff1aSopenharmony_ci        s->float_dsp->vector_fmac_scalar(output_samples[DCA_SPEAKER_Ls],
2277cabdff1aSopenharmony_ci                                         output_samples[DCA_SPEAKER_Cs],
2278cabdff1aSopenharmony_ci                                         -M_SQRT1_2, nsamples);
2279cabdff1aSopenharmony_ci        s->float_dsp->vector_fmac_scalar(output_samples[DCA_SPEAKER_Rs],
2280cabdff1aSopenharmony_ci                                         output_samples[DCA_SPEAKER_Cs],
2281cabdff1aSopenharmony_ci                                         -M_SQRT1_2, nsamples);
2282cabdff1aSopenharmony_ci    }
2283cabdff1aSopenharmony_ci
2284cabdff1aSopenharmony_ci    // Undo embedded XXCH downmix
2285cabdff1aSopenharmony_ci    if ((s->ext_audio_mask & (DCA_CSS_XXCH | DCA_EXSS_XXCH))
2286cabdff1aSopenharmony_ci        && s->xxch_dmix_embedded) {
2287cabdff1aSopenharmony_ci        float scale_inv = s->xxch_dmix_scale_inv * (1.0f / (1 << 16));
2288cabdff1aSopenharmony_ci        int *coeff_ptr  = s->xxch_dmix_coeff;
2289cabdff1aSopenharmony_ci        int xch_base    = ff_dca_channels[s->audio_mode];
2290cabdff1aSopenharmony_ci        av_assert1(s->nchannels - xch_base <= DCA_XXCH_CHANNELS_MAX);
2291cabdff1aSopenharmony_ci
2292cabdff1aSopenharmony_ci        // Undo downmix
2293cabdff1aSopenharmony_ci        for (ch = xch_base; ch < s->nchannels; ch++) {
2294cabdff1aSopenharmony_ci            int src_spkr = map_prm_ch_to_spkr(s, ch);
2295cabdff1aSopenharmony_ci            if (src_spkr < 0)
2296cabdff1aSopenharmony_ci                return AVERROR(EINVAL);
2297cabdff1aSopenharmony_ci            for (spkr = 0; spkr < s->xxch_mask_nbits; spkr++) {
2298cabdff1aSopenharmony_ci                if (s->xxch_dmix_mask[ch - xch_base] & (1U << spkr)) {
2299cabdff1aSopenharmony_ci                    int coeff = *coeff_ptr++;
2300cabdff1aSopenharmony_ci                    if (coeff) {
2301cabdff1aSopenharmony_ci                        s->float_dsp->vector_fmac_scalar(output_samples[    spkr],
2302cabdff1aSopenharmony_ci                                                         output_samples[src_spkr],
2303cabdff1aSopenharmony_ci                                                         coeff * (-1.0f / (1 << 15)),
2304cabdff1aSopenharmony_ci                                                         nsamples);
2305cabdff1aSopenharmony_ci                    }
2306cabdff1aSopenharmony_ci                }
2307cabdff1aSopenharmony_ci            }
2308cabdff1aSopenharmony_ci        }
2309cabdff1aSopenharmony_ci
2310cabdff1aSopenharmony_ci        // Undo embedded core downmix pre-scaling
2311cabdff1aSopenharmony_ci        for (spkr = 0; spkr < s->xxch_mask_nbits; spkr++) {
2312cabdff1aSopenharmony_ci            if (s->xxch_core_mask & (1U << spkr)) {
2313cabdff1aSopenharmony_ci                s->float_dsp->vector_fmul_scalar(output_samples[spkr],
2314cabdff1aSopenharmony_ci                                                 output_samples[spkr],
2315cabdff1aSopenharmony_ci                                                 scale_inv, nsamples);
2316cabdff1aSopenharmony_ci            }
2317cabdff1aSopenharmony_ci        }
2318cabdff1aSopenharmony_ci    }
2319cabdff1aSopenharmony_ci
2320cabdff1aSopenharmony_ci    if (!(s->ext_audio_mask & (DCA_CSS_XXCH | DCA_CSS_XCH | DCA_EXSS_XXCH))) {
2321cabdff1aSopenharmony_ci        // Front sum/difference decoding
2322cabdff1aSopenharmony_ci        if ((s->sumdiff_front && s->audio_mode > DCA_AMODE_MONO)
2323cabdff1aSopenharmony_ci            || s->audio_mode == DCA_AMODE_STEREO_SUMDIFF) {
2324cabdff1aSopenharmony_ci            s->float_dsp->butterflies_float(output_samples[DCA_SPEAKER_L],
2325cabdff1aSopenharmony_ci                                            output_samples[DCA_SPEAKER_R],
2326cabdff1aSopenharmony_ci                                            nsamples);
2327cabdff1aSopenharmony_ci        }
2328cabdff1aSopenharmony_ci
2329cabdff1aSopenharmony_ci        // Surround sum/difference decoding
2330cabdff1aSopenharmony_ci        if (s->sumdiff_surround && s->audio_mode >= DCA_AMODE_2F2R) {
2331cabdff1aSopenharmony_ci            s->float_dsp->butterflies_float(output_samples[DCA_SPEAKER_Ls],
2332cabdff1aSopenharmony_ci                                            output_samples[DCA_SPEAKER_Rs],
2333cabdff1aSopenharmony_ci                                            nsamples);
2334cabdff1aSopenharmony_ci        }
2335cabdff1aSopenharmony_ci    }
2336cabdff1aSopenharmony_ci
2337cabdff1aSopenharmony_ci    // Downmix primary channel set to stereo
2338cabdff1aSopenharmony_ci    if (s->request_mask != s->ch_mask) {
2339cabdff1aSopenharmony_ci        ff_dca_downmix_to_stereo_float(s->float_dsp, output_samples,
2340cabdff1aSopenharmony_ci                                       s->prim_dmix_coeff,
2341cabdff1aSopenharmony_ci                                       nsamples, s->ch_mask);
2342cabdff1aSopenharmony_ci    }
2343cabdff1aSopenharmony_ci
2344cabdff1aSopenharmony_ci    return 0;
2345cabdff1aSopenharmony_ci}
2346cabdff1aSopenharmony_ci
2347cabdff1aSopenharmony_ciint ff_dca_core_filter_frame(DCACoreDecoder *s, AVFrame *frame)
2348cabdff1aSopenharmony_ci{
2349cabdff1aSopenharmony_ci    AVCodecContext *avctx = s->avctx;
2350cabdff1aSopenharmony_ci    DCAContext *dca = avctx->priv_data;
2351cabdff1aSopenharmony_ci    DCAExssAsset *asset = &dca->exss.assets[0];
2352cabdff1aSopenharmony_ci    enum AVMatrixEncoding matrix_encoding;
2353cabdff1aSopenharmony_ci    int ret;
2354cabdff1aSopenharmony_ci
2355cabdff1aSopenharmony_ci    // Handle downmixing to stereo request
2356cabdff1aSopenharmony_ci    if (dca->request_channel_layout == DCA_SPEAKER_LAYOUT_STEREO
2357cabdff1aSopenharmony_ci        && s->audio_mode > DCA_AMODE_MONO && s->prim_dmix_embedded
2358cabdff1aSopenharmony_ci        && (s->prim_dmix_type == DCA_DMIX_TYPE_LoRo ||
2359cabdff1aSopenharmony_ci            s->prim_dmix_type == DCA_DMIX_TYPE_LtRt))
2360cabdff1aSopenharmony_ci        s->request_mask = DCA_SPEAKER_LAYOUT_STEREO;
2361cabdff1aSopenharmony_ci    else
2362cabdff1aSopenharmony_ci        s->request_mask = s->ch_mask;
2363cabdff1aSopenharmony_ci    if (!ff_dca_set_channel_layout(avctx, s->ch_remap, s->request_mask))
2364cabdff1aSopenharmony_ci        return AVERROR(EINVAL);
2365cabdff1aSopenharmony_ci
2366cabdff1aSopenharmony_ci    // Force fixed point mode when falling back from XLL
2367cabdff1aSopenharmony_ci    if ((avctx->flags & AV_CODEC_FLAG_BITEXACT) || ((dca->packet & DCA_PACKET_EXSS)
2368cabdff1aSopenharmony_ci                                                    && (asset->extension_mask & DCA_EXSS_XLL)))
2369cabdff1aSopenharmony_ci        ret = filter_frame_fixed(s, frame);
2370cabdff1aSopenharmony_ci    else
2371cabdff1aSopenharmony_ci        ret = filter_frame_float(s, frame);
2372cabdff1aSopenharmony_ci    if (ret < 0)
2373cabdff1aSopenharmony_ci        return ret;
2374cabdff1aSopenharmony_ci
2375cabdff1aSopenharmony_ci    // Set profile, bit rate, etc
2376cabdff1aSopenharmony_ci    if (s->ext_audio_mask & DCA_EXSS_MASK)
2377cabdff1aSopenharmony_ci        avctx->profile = FF_PROFILE_DTS_HD_HRA;
2378cabdff1aSopenharmony_ci    else if (s->ext_audio_mask & (DCA_CSS_XXCH | DCA_CSS_XCH))
2379cabdff1aSopenharmony_ci        avctx->profile = FF_PROFILE_DTS_ES;
2380cabdff1aSopenharmony_ci    else if (s->ext_audio_mask & DCA_CSS_X96)
2381cabdff1aSopenharmony_ci        avctx->profile = FF_PROFILE_DTS_96_24;
2382cabdff1aSopenharmony_ci    else
2383cabdff1aSopenharmony_ci        avctx->profile = FF_PROFILE_DTS;
2384cabdff1aSopenharmony_ci
2385cabdff1aSopenharmony_ci    if (s->bit_rate > 3 && !(s->ext_audio_mask & DCA_EXSS_MASK))
2386cabdff1aSopenharmony_ci        avctx->bit_rate = s->bit_rate;
2387cabdff1aSopenharmony_ci    else
2388cabdff1aSopenharmony_ci        avctx->bit_rate = 0;
2389cabdff1aSopenharmony_ci
2390cabdff1aSopenharmony_ci    if (s->audio_mode == DCA_AMODE_STEREO_TOTAL || (s->request_mask != s->ch_mask &&
2391cabdff1aSopenharmony_ci                                                    s->prim_dmix_type == DCA_DMIX_TYPE_LtRt))
2392cabdff1aSopenharmony_ci        matrix_encoding = AV_MATRIX_ENCODING_DOLBY;
2393cabdff1aSopenharmony_ci    else
2394cabdff1aSopenharmony_ci        matrix_encoding = AV_MATRIX_ENCODING_NONE;
2395cabdff1aSopenharmony_ci    if ((ret = ff_side_data_update_matrix_encoding(frame, matrix_encoding)) < 0)
2396cabdff1aSopenharmony_ci        return ret;
2397cabdff1aSopenharmony_ci
2398cabdff1aSopenharmony_ci    return 0;
2399cabdff1aSopenharmony_ci}
2400cabdff1aSopenharmony_ci
2401cabdff1aSopenharmony_ciav_cold void ff_dca_core_flush(DCACoreDecoder *s)
2402cabdff1aSopenharmony_ci{
2403cabdff1aSopenharmony_ci    if (s->subband_buffer) {
2404cabdff1aSopenharmony_ci        erase_adpcm_history(s);
2405cabdff1aSopenharmony_ci        memset(s->lfe_samples, 0, DCA_LFE_HISTORY * sizeof(int32_t));
2406cabdff1aSopenharmony_ci    }
2407cabdff1aSopenharmony_ci
2408cabdff1aSopenharmony_ci    if (s->x96_subband_buffer)
2409cabdff1aSopenharmony_ci        erase_x96_adpcm_history(s);
2410cabdff1aSopenharmony_ci
2411cabdff1aSopenharmony_ci    erase_dsp_history(s);
2412cabdff1aSopenharmony_ci}
2413cabdff1aSopenharmony_ci
2414cabdff1aSopenharmony_ciav_cold int ff_dca_core_init(DCACoreDecoder *s)
2415cabdff1aSopenharmony_ci{
2416cabdff1aSopenharmony_ci    if (!(s->float_dsp = avpriv_float_dsp_alloc(0)))
2417cabdff1aSopenharmony_ci        return -1;
2418cabdff1aSopenharmony_ci    if (!(s->fixed_dsp = avpriv_alloc_fixed_dsp(0)))
2419cabdff1aSopenharmony_ci        return -1;
2420cabdff1aSopenharmony_ci
2421cabdff1aSopenharmony_ci    ff_dcadct_init(&s->dcadct);
2422cabdff1aSopenharmony_ci    if (ff_mdct_init(&s->imdct[0], 6, 1, 1.0) < 0)
2423cabdff1aSopenharmony_ci        return -1;
2424cabdff1aSopenharmony_ci    if (ff_mdct_init(&s->imdct[1], 7, 1, 1.0) < 0)
2425cabdff1aSopenharmony_ci        return -1;
2426cabdff1aSopenharmony_ci    ff_synth_filter_init(&s->synth);
2427cabdff1aSopenharmony_ci
2428cabdff1aSopenharmony_ci    s->x96_rand = 1;
2429cabdff1aSopenharmony_ci    return 0;
2430cabdff1aSopenharmony_ci}
2431cabdff1aSopenharmony_ci
2432cabdff1aSopenharmony_ciav_cold void ff_dca_core_close(DCACoreDecoder *s)
2433cabdff1aSopenharmony_ci{
2434cabdff1aSopenharmony_ci    av_freep(&s->float_dsp);
2435cabdff1aSopenharmony_ci    av_freep(&s->fixed_dsp);
2436cabdff1aSopenharmony_ci
2437cabdff1aSopenharmony_ci    ff_mdct_end(&s->imdct[0]);
2438cabdff1aSopenharmony_ci    ff_mdct_end(&s->imdct[1]);
2439cabdff1aSopenharmony_ci
2440cabdff1aSopenharmony_ci    av_freep(&s->subband_buffer);
2441cabdff1aSopenharmony_ci    s->subband_size = 0;
2442cabdff1aSopenharmony_ci
2443cabdff1aSopenharmony_ci    av_freep(&s->x96_subband_buffer);
2444cabdff1aSopenharmony_ci    s->x96_subband_size = 0;
2445cabdff1aSopenharmony_ci
2446cabdff1aSopenharmony_ci    av_freep(&s->output_buffer);
2447cabdff1aSopenharmony_ci    s->output_size = 0;
2448cabdff1aSopenharmony_ci}
2449