1cabdff1aSopenharmony_ci/*
2cabdff1aSopenharmony_ci * MLP decoder
3cabdff1aSopenharmony_ci * Copyright (c) 2007-2008 Ian Caulfield
4cabdff1aSopenharmony_ci *
5cabdff1aSopenharmony_ci * This file is part of FFmpeg.
6cabdff1aSopenharmony_ci *
7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
11cabdff1aSopenharmony_ci *
12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15cabdff1aSopenharmony_ci * Lesser General Public License for more details.
16cabdff1aSopenharmony_ci *
17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20cabdff1aSopenharmony_ci */
21cabdff1aSopenharmony_ci
22cabdff1aSopenharmony_ci/**
23cabdff1aSopenharmony_ci * @file
24cabdff1aSopenharmony_ci * MLP decoder
25cabdff1aSopenharmony_ci */
26cabdff1aSopenharmony_ci
27cabdff1aSopenharmony_ci#include "config_components.h"
28cabdff1aSopenharmony_ci
29cabdff1aSopenharmony_ci#include <stdint.h>
30cabdff1aSopenharmony_ci
31cabdff1aSopenharmony_ci#include "avcodec.h"
32cabdff1aSopenharmony_ci#include "libavutil/internal.h"
33cabdff1aSopenharmony_ci#include "libavutil/intreadwrite.h"
34cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h"
35cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h"
36cabdff1aSopenharmony_ci#include "libavutil/thread.h"
37cabdff1aSopenharmony_ci#include "libavutil/opt.h"
38cabdff1aSopenharmony_ci#include "codec_internal.h"
39cabdff1aSopenharmony_ci#include "get_bits.h"
40cabdff1aSopenharmony_ci#include "internal.h"
41cabdff1aSopenharmony_ci#include "libavutil/crc.h"
42cabdff1aSopenharmony_ci#include "parser.h"
43cabdff1aSopenharmony_ci#include "mlp_parse.h"
44cabdff1aSopenharmony_ci#include "mlpdsp.h"
45cabdff1aSopenharmony_ci#include "mlp.h"
46cabdff1aSopenharmony_ci#include "config.h"
47cabdff1aSopenharmony_ci
48cabdff1aSopenharmony_ci/** number of bits used for VLC lookup - longest Huffman code is 9 */
49cabdff1aSopenharmony_ci#if ARCH_ARM
50cabdff1aSopenharmony_ci#define VLC_BITS            5
51cabdff1aSopenharmony_ci#define VLC_STATIC_SIZE     64
52cabdff1aSopenharmony_ci#else
53cabdff1aSopenharmony_ci#define VLC_BITS            9
54cabdff1aSopenharmony_ci#define VLC_STATIC_SIZE     512
55cabdff1aSopenharmony_ci#endif
56cabdff1aSopenharmony_ci
57cabdff1aSopenharmony_citypedef struct SubStream {
58cabdff1aSopenharmony_ci    /// Set if a valid restart header has been read. Otherwise the substream cannot be decoded.
59cabdff1aSopenharmony_ci    uint8_t     restart_seen;
60cabdff1aSopenharmony_ci    /// Set if end of stream is encountered
61cabdff1aSopenharmony_ci    uint8_t     end_of_stream;
62cabdff1aSopenharmony_ci
63cabdff1aSopenharmony_ci    //@{
64cabdff1aSopenharmony_ci    /** restart header data */
65cabdff1aSopenharmony_ci    /// The type of noise to be used in the rematrix stage.
66cabdff1aSopenharmony_ci    uint16_t    noise_type;
67cabdff1aSopenharmony_ci
68cabdff1aSopenharmony_ci    /// The index of the first channel coded in this substream.
69cabdff1aSopenharmony_ci    uint8_t     min_channel;
70cabdff1aSopenharmony_ci    /// The index of the last channel coded in this substream.
71cabdff1aSopenharmony_ci    uint8_t     max_channel;
72cabdff1aSopenharmony_ci    /// The number of channels input into the rematrix stage.
73cabdff1aSopenharmony_ci    uint8_t     max_matrix_channel;
74cabdff1aSopenharmony_ci    /// For each channel output by the matrix, the output channel to map it to
75cabdff1aSopenharmony_ci    uint8_t     ch_assign[MAX_CHANNELS];
76cabdff1aSopenharmony_ci    /// The channel layout for this substream
77cabdff1aSopenharmony_ci    uint64_t    mask;
78cabdff1aSopenharmony_ci    /// The matrix encoding mode for this substream
79cabdff1aSopenharmony_ci    enum AVMatrixEncoding matrix_encoding;
80cabdff1aSopenharmony_ci    enum AVMatrixEncoding prev_matrix_encoding;
81cabdff1aSopenharmony_ci
82cabdff1aSopenharmony_ci    /// Channel coding parameters for channels in the substream
83cabdff1aSopenharmony_ci    ChannelParams channel_params[MAX_CHANNELS];
84cabdff1aSopenharmony_ci
85cabdff1aSopenharmony_ci    /// The left shift applied to random noise in 0x31ea substreams.
86cabdff1aSopenharmony_ci    uint8_t     noise_shift;
87cabdff1aSopenharmony_ci    /// The current seed value for the pseudorandom noise generator(s).
88cabdff1aSopenharmony_ci    uint32_t    noisegen_seed;
89cabdff1aSopenharmony_ci
90cabdff1aSopenharmony_ci    /// Set if the substream contains extra info to check the size of VLC blocks.
91cabdff1aSopenharmony_ci    uint8_t     data_check_present;
92cabdff1aSopenharmony_ci
93cabdff1aSopenharmony_ci    /// Bitmask of which parameter sets are conveyed in a decoding parameter block.
94cabdff1aSopenharmony_ci    uint8_t     param_presence_flags;
95cabdff1aSopenharmony_ci#define PARAM_BLOCKSIZE     (1 << 7)
96cabdff1aSopenharmony_ci#define PARAM_MATRIX        (1 << 6)
97cabdff1aSopenharmony_ci#define PARAM_OUTSHIFT      (1 << 5)
98cabdff1aSopenharmony_ci#define PARAM_QUANTSTEP     (1 << 4)
99cabdff1aSopenharmony_ci#define PARAM_FIR           (1 << 3)
100cabdff1aSopenharmony_ci#define PARAM_IIR           (1 << 2)
101cabdff1aSopenharmony_ci#define PARAM_HUFFOFFSET    (1 << 1)
102cabdff1aSopenharmony_ci#define PARAM_PRESENCE      (1 << 0)
103cabdff1aSopenharmony_ci    //@}
104cabdff1aSopenharmony_ci
105cabdff1aSopenharmony_ci    //@{
106cabdff1aSopenharmony_ci    /** matrix data */
107cabdff1aSopenharmony_ci
108cabdff1aSopenharmony_ci    /// Number of matrices to be applied.
109cabdff1aSopenharmony_ci    uint8_t     num_primitive_matrices;
110cabdff1aSopenharmony_ci
111cabdff1aSopenharmony_ci    /// matrix output channel
112cabdff1aSopenharmony_ci    uint8_t     matrix_out_ch[MAX_MATRICES];
113cabdff1aSopenharmony_ci
114cabdff1aSopenharmony_ci    /// Whether the LSBs of the matrix output are encoded in the bitstream.
115cabdff1aSopenharmony_ci    uint8_t     lsb_bypass[MAX_MATRICES];
116cabdff1aSopenharmony_ci    /// Matrix coefficients, stored as 2.14 fixed point.
117cabdff1aSopenharmony_ci    DECLARE_ALIGNED(32, int32_t, matrix_coeff)[MAX_MATRICES][MAX_CHANNELS];
118cabdff1aSopenharmony_ci    /// Left shift to apply to noise values in 0x31eb substreams.
119cabdff1aSopenharmony_ci    uint8_t     matrix_noise_shift[MAX_MATRICES];
120cabdff1aSopenharmony_ci    //@}
121cabdff1aSopenharmony_ci
122cabdff1aSopenharmony_ci    /// Left shift to apply to Huffman-decoded residuals.
123cabdff1aSopenharmony_ci    uint8_t     quant_step_size[MAX_CHANNELS];
124cabdff1aSopenharmony_ci
125cabdff1aSopenharmony_ci    /// number of PCM samples in current audio block
126cabdff1aSopenharmony_ci    uint16_t    blocksize;
127cabdff1aSopenharmony_ci    /// Number of PCM samples decoded so far in this frame.
128cabdff1aSopenharmony_ci    uint16_t    blockpos;
129cabdff1aSopenharmony_ci
130cabdff1aSopenharmony_ci    /// Left shift to apply to decoded PCM values to get final 24-bit output.
131cabdff1aSopenharmony_ci    int8_t      output_shift[MAX_CHANNELS];
132cabdff1aSopenharmony_ci
133cabdff1aSopenharmony_ci    /// Running XOR of all output samples.
134cabdff1aSopenharmony_ci    int32_t     lossless_check_data;
135cabdff1aSopenharmony_ci
136cabdff1aSopenharmony_ci} SubStream;
137cabdff1aSopenharmony_ci
138cabdff1aSopenharmony_citypedef struct MLPDecodeContext {
139cabdff1aSopenharmony_ci    const AVClass  *class;
140cabdff1aSopenharmony_ci    AVCodecContext *avctx;
141cabdff1aSopenharmony_ci
142cabdff1aSopenharmony_ci    AVChannelLayout downmix_layout;
143cabdff1aSopenharmony_ci
144cabdff1aSopenharmony_ci    /// Current access unit being read has a major sync.
145cabdff1aSopenharmony_ci    int         is_major_sync_unit;
146cabdff1aSopenharmony_ci
147cabdff1aSopenharmony_ci    /// Size of the major sync unit, in bytes
148cabdff1aSopenharmony_ci    int         major_sync_header_size;
149cabdff1aSopenharmony_ci
150cabdff1aSopenharmony_ci    /// Set if a valid major sync block has been read. Otherwise no decoding is possible.
151cabdff1aSopenharmony_ci    uint8_t     params_valid;
152cabdff1aSopenharmony_ci
153cabdff1aSopenharmony_ci    /// Number of substreams contained within this stream.
154cabdff1aSopenharmony_ci    uint8_t     num_substreams;
155cabdff1aSopenharmony_ci
156cabdff1aSopenharmony_ci    /// Index of the last substream to decode - further substreams are skipped.
157cabdff1aSopenharmony_ci    uint8_t     max_decoded_substream;
158cabdff1aSopenharmony_ci
159cabdff1aSopenharmony_ci    /// Stream needs channel reordering to comply with FFmpeg's channel order
160cabdff1aSopenharmony_ci    uint8_t     needs_reordering;
161cabdff1aSopenharmony_ci
162cabdff1aSopenharmony_ci    /// number of PCM samples contained in each frame
163cabdff1aSopenharmony_ci    int         access_unit_size;
164cabdff1aSopenharmony_ci    /// next power of two above the number of samples in each frame
165cabdff1aSopenharmony_ci    int         access_unit_size_pow2;
166cabdff1aSopenharmony_ci
167cabdff1aSopenharmony_ci    SubStream   substream[MAX_SUBSTREAMS];
168cabdff1aSopenharmony_ci
169cabdff1aSopenharmony_ci    int         matrix_changed;
170cabdff1aSopenharmony_ci    int         filter_changed[MAX_CHANNELS][NUM_FILTERS];
171cabdff1aSopenharmony_ci
172cabdff1aSopenharmony_ci    int8_t      noise_buffer[MAX_BLOCKSIZE_POW2];
173cabdff1aSopenharmony_ci    int8_t      bypassed_lsbs[MAX_BLOCKSIZE][MAX_CHANNELS];
174cabdff1aSopenharmony_ci    DECLARE_ALIGNED(32, int32_t, sample_buffer)[MAX_BLOCKSIZE][MAX_CHANNELS];
175cabdff1aSopenharmony_ci
176cabdff1aSopenharmony_ci    MLPDSPContext dsp;
177cabdff1aSopenharmony_ci} MLPDecodeContext;
178cabdff1aSopenharmony_ci
179cabdff1aSopenharmony_cistatic const enum AVChannel thd_channel_order[] = {
180cabdff1aSopenharmony_ci    AV_CHAN_FRONT_LEFT, AV_CHAN_FRONT_RIGHT,                     // LR
181cabdff1aSopenharmony_ci    AV_CHAN_FRONT_CENTER,                                        // C
182cabdff1aSopenharmony_ci    AV_CHAN_LOW_FREQUENCY,                                       // LFE
183cabdff1aSopenharmony_ci    AV_CHAN_SIDE_LEFT, AV_CHAN_SIDE_RIGHT,                       // LRs
184cabdff1aSopenharmony_ci    AV_CHAN_TOP_FRONT_LEFT, AV_CHAN_TOP_FRONT_RIGHT,             // LRvh
185cabdff1aSopenharmony_ci    AV_CHAN_FRONT_LEFT_OF_CENTER, AV_CHAN_FRONT_RIGHT_OF_CENTER, // LRc
186cabdff1aSopenharmony_ci    AV_CHAN_BACK_LEFT, AV_CHAN_BACK_RIGHT,                       // LRrs
187cabdff1aSopenharmony_ci    AV_CHAN_BACK_CENTER,                                         // Cs
188cabdff1aSopenharmony_ci    AV_CHAN_TOP_CENTER,                                          // Ts
189cabdff1aSopenharmony_ci    AV_CHAN_SURROUND_DIRECT_LEFT, AV_CHAN_SURROUND_DIRECT_RIGHT, // LRsd
190cabdff1aSopenharmony_ci    AV_CHAN_WIDE_LEFT, AV_CHAN_WIDE_RIGHT,                       // LRw
191cabdff1aSopenharmony_ci    AV_CHAN_TOP_FRONT_CENTER,                                    // Cvh
192cabdff1aSopenharmony_ci    AV_CHAN_LOW_FREQUENCY_2,                                     // LFE2
193cabdff1aSopenharmony_ci};
194cabdff1aSopenharmony_ci
195cabdff1aSopenharmony_cistatic int mlp_channel_layout_subset(AVChannelLayout *layout, uint64_t mask)
196cabdff1aSopenharmony_ci{
197cabdff1aSopenharmony_ci    return av_channel_layout_check(layout) &&
198cabdff1aSopenharmony_ci           av_channel_layout_subset(layout, mask) ==
199cabdff1aSopenharmony_ci           av_channel_layout_subset(layout, UINT64_MAX);
200cabdff1aSopenharmony_ci}
201cabdff1aSopenharmony_ci
202cabdff1aSopenharmony_cistatic enum AVChannel thd_channel_layout_extract_channel(uint64_t channel_layout,
203cabdff1aSopenharmony_ci                                                         int index)
204cabdff1aSopenharmony_ci{
205cabdff1aSopenharmony_ci    int i;
206cabdff1aSopenharmony_ci
207cabdff1aSopenharmony_ci    if (av_popcount64(channel_layout) <= index)
208cabdff1aSopenharmony_ci        return AV_CHAN_NONE;
209cabdff1aSopenharmony_ci
210cabdff1aSopenharmony_ci    for (i = 0; i < FF_ARRAY_ELEMS(thd_channel_order); i++)
211cabdff1aSopenharmony_ci        if (channel_layout & (1ULL << thd_channel_order[i]) && !index--)
212cabdff1aSopenharmony_ci            return thd_channel_order[i];
213cabdff1aSopenharmony_ci    return AV_CHAN_NONE;
214cabdff1aSopenharmony_ci}
215cabdff1aSopenharmony_ci
216cabdff1aSopenharmony_cistatic VLC huff_vlc[3];
217cabdff1aSopenharmony_ci
218cabdff1aSopenharmony_ci/** Initialize static data, constant between all invocations of the codec. */
219cabdff1aSopenharmony_ci
220cabdff1aSopenharmony_cistatic av_cold void init_static(void)
221cabdff1aSopenharmony_ci{
222cabdff1aSopenharmony_ci    for (int i = 0; i < 3; i++) {
223cabdff1aSopenharmony_ci        static VLCElem vlc_buf[3 * VLC_STATIC_SIZE];
224cabdff1aSopenharmony_ci        huff_vlc[i].table           = &vlc_buf[i * VLC_STATIC_SIZE];
225cabdff1aSopenharmony_ci        huff_vlc[i].table_allocated = VLC_STATIC_SIZE;
226cabdff1aSopenharmony_ci        init_vlc(&huff_vlc[i], VLC_BITS, 18,
227cabdff1aSopenharmony_ci                 &ff_mlp_huffman_tables[i][0][1], 2, 1,
228cabdff1aSopenharmony_ci                 &ff_mlp_huffman_tables[i][0][0], 2, 1, INIT_VLC_USE_NEW_STATIC);
229cabdff1aSopenharmony_ci    }
230cabdff1aSopenharmony_ci
231cabdff1aSopenharmony_ci    ff_mlp_init_crc();
232cabdff1aSopenharmony_ci}
233cabdff1aSopenharmony_ci
234cabdff1aSopenharmony_cistatic inline int32_t calculate_sign_huff(MLPDecodeContext *m,
235cabdff1aSopenharmony_ci                                          unsigned int substr, unsigned int ch)
236cabdff1aSopenharmony_ci{
237cabdff1aSopenharmony_ci    SubStream *s = &m->substream[substr];
238cabdff1aSopenharmony_ci    ChannelParams *cp = &s->channel_params[ch];
239cabdff1aSopenharmony_ci    int lsb_bits = cp->huff_lsbs - s->quant_step_size[ch];
240cabdff1aSopenharmony_ci    int sign_shift = lsb_bits + (cp->codebook ? 2 - cp->codebook : -1);
241cabdff1aSopenharmony_ci    int32_t sign_huff_offset = cp->huff_offset;
242cabdff1aSopenharmony_ci
243cabdff1aSopenharmony_ci    if (cp->codebook > 0)
244cabdff1aSopenharmony_ci        sign_huff_offset -= 7 << lsb_bits;
245cabdff1aSopenharmony_ci
246cabdff1aSopenharmony_ci    if (sign_shift >= 0)
247cabdff1aSopenharmony_ci        sign_huff_offset -= 1 << sign_shift;
248cabdff1aSopenharmony_ci
249cabdff1aSopenharmony_ci    return sign_huff_offset;
250cabdff1aSopenharmony_ci}
251cabdff1aSopenharmony_ci
252cabdff1aSopenharmony_ci/** Read a sample, consisting of either, both or neither of entropy-coded MSBs
253cabdff1aSopenharmony_ci *  and plain LSBs. */
254cabdff1aSopenharmony_ci
255cabdff1aSopenharmony_cistatic inline int read_huff_channels(MLPDecodeContext *m, GetBitContext *gbp,
256cabdff1aSopenharmony_ci                                     unsigned int substr, unsigned int pos)
257cabdff1aSopenharmony_ci{
258cabdff1aSopenharmony_ci    SubStream *s = &m->substream[substr];
259cabdff1aSopenharmony_ci    unsigned int mat, channel;
260cabdff1aSopenharmony_ci
261cabdff1aSopenharmony_ci    for (mat = 0; mat < s->num_primitive_matrices; mat++)
262cabdff1aSopenharmony_ci        if (s->lsb_bypass[mat])
263cabdff1aSopenharmony_ci            m->bypassed_lsbs[pos + s->blockpos][mat] = get_bits1(gbp);
264cabdff1aSopenharmony_ci
265cabdff1aSopenharmony_ci    for (channel = s->min_channel; channel <= s->max_channel; channel++) {
266cabdff1aSopenharmony_ci        ChannelParams *cp = &s->channel_params[channel];
267cabdff1aSopenharmony_ci        int codebook = cp->codebook;
268cabdff1aSopenharmony_ci        int quant_step_size = s->quant_step_size[channel];
269cabdff1aSopenharmony_ci        int lsb_bits = cp->huff_lsbs - quant_step_size;
270cabdff1aSopenharmony_ci        int result = 0;
271cabdff1aSopenharmony_ci
272cabdff1aSopenharmony_ci        if (codebook > 0)
273cabdff1aSopenharmony_ci            result = get_vlc2(gbp, huff_vlc[codebook-1].table,
274cabdff1aSopenharmony_ci                            VLC_BITS, (9 + VLC_BITS - 1) / VLC_BITS);
275cabdff1aSopenharmony_ci
276cabdff1aSopenharmony_ci        if (result < 0)
277cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
278cabdff1aSopenharmony_ci
279cabdff1aSopenharmony_ci        if (lsb_bits > 0)
280cabdff1aSopenharmony_ci            result = (result << lsb_bits) + get_bits_long(gbp, lsb_bits);
281cabdff1aSopenharmony_ci
282cabdff1aSopenharmony_ci        result  += cp->sign_huff_offset;
283cabdff1aSopenharmony_ci        result *= 1 << quant_step_size;
284cabdff1aSopenharmony_ci
285cabdff1aSopenharmony_ci        m->sample_buffer[pos + s->blockpos][channel] = result;
286cabdff1aSopenharmony_ci    }
287cabdff1aSopenharmony_ci
288cabdff1aSopenharmony_ci    return 0;
289cabdff1aSopenharmony_ci}
290cabdff1aSopenharmony_ci
291cabdff1aSopenharmony_cistatic av_cold int mlp_decode_init(AVCodecContext *avctx)
292cabdff1aSopenharmony_ci{
293cabdff1aSopenharmony_ci    static AVOnce init_static_once = AV_ONCE_INIT;
294cabdff1aSopenharmony_ci    MLPDecodeContext *m = avctx->priv_data;
295cabdff1aSopenharmony_ci    int substr;
296cabdff1aSopenharmony_ci
297cabdff1aSopenharmony_ci    m->avctx = avctx;
298cabdff1aSopenharmony_ci    for (substr = 0; substr < MAX_SUBSTREAMS; substr++)
299cabdff1aSopenharmony_ci        m->substream[substr].lossless_check_data = 0xffffffff;
300cabdff1aSopenharmony_ci    ff_mlpdsp_init(&m->dsp);
301cabdff1aSopenharmony_ci
302cabdff1aSopenharmony_ci#if FF_API_OLD_CHANNEL_LAYOUT
303cabdff1aSopenharmony_ciFF_DISABLE_DEPRECATION_WARNINGS
304cabdff1aSopenharmony_ci    if (avctx->request_channel_layout) {
305cabdff1aSopenharmony_ci        av_channel_layout_uninit(&m->downmix_layout);
306cabdff1aSopenharmony_ci        av_channel_layout_from_mask(&m->downmix_layout, avctx->request_channel_layout);
307cabdff1aSopenharmony_ci    }
308cabdff1aSopenharmony_ciFF_ENABLE_DEPRECATION_WARNINGS
309cabdff1aSopenharmony_ci#endif
310cabdff1aSopenharmony_ci    ff_thread_once(&init_static_once, init_static);
311cabdff1aSopenharmony_ci
312cabdff1aSopenharmony_ci    return 0;
313cabdff1aSopenharmony_ci}
314cabdff1aSopenharmony_ci
315cabdff1aSopenharmony_ci/** Read a major sync info header - contains high level information about
316cabdff1aSopenharmony_ci *  the stream - sample rate, channel arrangement etc. Most of this
317cabdff1aSopenharmony_ci *  information is not actually necessary for decoding, only for playback.
318cabdff1aSopenharmony_ci */
319cabdff1aSopenharmony_ci
320cabdff1aSopenharmony_cistatic int read_major_sync(MLPDecodeContext *m, GetBitContext *gb)
321cabdff1aSopenharmony_ci{
322cabdff1aSopenharmony_ci    MLPHeaderInfo mh;
323cabdff1aSopenharmony_ci    int substr, ret;
324cabdff1aSopenharmony_ci
325cabdff1aSopenharmony_ci    if ((ret = ff_mlp_read_major_sync(m->avctx, &mh, gb)) != 0)
326cabdff1aSopenharmony_ci        return ret;
327cabdff1aSopenharmony_ci
328cabdff1aSopenharmony_ci    if (mh.group1_bits == 0) {
329cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR, "invalid/unknown bits per sample\n");
330cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
331cabdff1aSopenharmony_ci    }
332cabdff1aSopenharmony_ci    if (mh.group2_bits > mh.group1_bits) {
333cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR,
334cabdff1aSopenharmony_ci               "Channel group 2 cannot have more bits per sample than group 1.\n");
335cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
336cabdff1aSopenharmony_ci    }
337cabdff1aSopenharmony_ci
338cabdff1aSopenharmony_ci    if (mh.group2_samplerate && mh.group2_samplerate != mh.group1_samplerate) {
339cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR,
340cabdff1aSopenharmony_ci               "Channel groups with differing sample rates are not currently supported.\n");
341cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
342cabdff1aSopenharmony_ci    }
343cabdff1aSopenharmony_ci
344cabdff1aSopenharmony_ci    if (mh.group1_samplerate == 0) {
345cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR, "invalid/unknown sampling rate\n");
346cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
347cabdff1aSopenharmony_ci    }
348cabdff1aSopenharmony_ci    if (mh.group1_samplerate > MAX_SAMPLERATE) {
349cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR,
350cabdff1aSopenharmony_ci               "Sampling rate %d is greater than the supported maximum (%d).\n",
351cabdff1aSopenharmony_ci               mh.group1_samplerate, MAX_SAMPLERATE);
352cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
353cabdff1aSopenharmony_ci    }
354cabdff1aSopenharmony_ci    if (mh.access_unit_size > MAX_BLOCKSIZE) {
355cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR,
356cabdff1aSopenharmony_ci               "Block size %d is greater than the supported maximum (%d).\n",
357cabdff1aSopenharmony_ci               mh.access_unit_size, MAX_BLOCKSIZE);
358cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
359cabdff1aSopenharmony_ci    }
360cabdff1aSopenharmony_ci    if (mh.access_unit_size_pow2 > MAX_BLOCKSIZE_POW2) {
361cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR,
362cabdff1aSopenharmony_ci               "Block size pow2 %d is greater than the supported maximum (%d).\n",
363cabdff1aSopenharmony_ci               mh.access_unit_size_pow2, MAX_BLOCKSIZE_POW2);
364cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
365cabdff1aSopenharmony_ci    }
366cabdff1aSopenharmony_ci
367cabdff1aSopenharmony_ci    if (mh.num_substreams == 0)
368cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
369cabdff1aSopenharmony_ci    if (m->avctx->codec_id == AV_CODEC_ID_MLP && mh.num_substreams > 2) {
370cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR, "MLP only supports up to 2 substreams.\n");
371cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
372cabdff1aSopenharmony_ci    }
373cabdff1aSopenharmony_ci    if (mh.num_substreams > MAX_SUBSTREAMS) {
374cabdff1aSopenharmony_ci        avpriv_request_sample(m->avctx,
375cabdff1aSopenharmony_ci                              "%d substreams (more than the "
376cabdff1aSopenharmony_ci                              "maximum supported by the decoder)",
377cabdff1aSopenharmony_ci                              mh.num_substreams);
378cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
379cabdff1aSopenharmony_ci    }
380cabdff1aSopenharmony_ci
381cabdff1aSopenharmony_ci    m->major_sync_header_size = mh.header_size;
382cabdff1aSopenharmony_ci
383cabdff1aSopenharmony_ci    m->access_unit_size      = mh.access_unit_size;
384cabdff1aSopenharmony_ci    m->access_unit_size_pow2 = mh.access_unit_size_pow2;
385cabdff1aSopenharmony_ci
386cabdff1aSopenharmony_ci    m->num_substreams        = mh.num_substreams;
387cabdff1aSopenharmony_ci
388cabdff1aSopenharmony_ci    /* limit to decoding 3 substreams, as the 4th is used by Dolby Atmos for non-audio data */
389cabdff1aSopenharmony_ci    m->max_decoded_substream = FFMIN(m->num_substreams - 1, 2);
390cabdff1aSopenharmony_ci
391cabdff1aSopenharmony_ci    m->avctx->sample_rate    = mh.group1_samplerate;
392cabdff1aSopenharmony_ci    m->avctx->frame_size     = mh.access_unit_size;
393cabdff1aSopenharmony_ci
394cabdff1aSopenharmony_ci    m->avctx->bits_per_raw_sample = mh.group1_bits;
395cabdff1aSopenharmony_ci    if (mh.group1_bits > 16)
396cabdff1aSopenharmony_ci        m->avctx->sample_fmt = AV_SAMPLE_FMT_S32;
397cabdff1aSopenharmony_ci    else
398cabdff1aSopenharmony_ci        m->avctx->sample_fmt = AV_SAMPLE_FMT_S16;
399cabdff1aSopenharmony_ci    m->dsp.mlp_pack_output = m->dsp.mlp_select_pack_output(m->substream[m->max_decoded_substream].ch_assign,
400cabdff1aSopenharmony_ci                                                           m->substream[m->max_decoded_substream].output_shift,
401cabdff1aSopenharmony_ci                                                           m->substream[m->max_decoded_substream].max_matrix_channel,
402cabdff1aSopenharmony_ci                                                           m->avctx->sample_fmt == AV_SAMPLE_FMT_S32);
403cabdff1aSopenharmony_ci
404cabdff1aSopenharmony_ci    m->params_valid = 1;
405cabdff1aSopenharmony_ci    for (substr = 0; substr < MAX_SUBSTREAMS; substr++)
406cabdff1aSopenharmony_ci        m->substream[substr].restart_seen = 0;
407cabdff1aSopenharmony_ci
408cabdff1aSopenharmony_ci    /* Set the layout for each substream. When there's more than one, the first
409cabdff1aSopenharmony_ci     * substream is Stereo. Subsequent substreams' layouts are indicated in the
410cabdff1aSopenharmony_ci     * major sync. */
411cabdff1aSopenharmony_ci    if (m->avctx->codec_id == AV_CODEC_ID_MLP) {
412cabdff1aSopenharmony_ci        if (mh.stream_type != SYNC_MLP) {
413cabdff1aSopenharmony_ci            avpriv_request_sample(m->avctx,
414cabdff1aSopenharmony_ci                        "unexpected stream_type %X in MLP",
415cabdff1aSopenharmony_ci                        mh.stream_type);
416cabdff1aSopenharmony_ci            return AVERROR_PATCHWELCOME;
417cabdff1aSopenharmony_ci        }
418cabdff1aSopenharmony_ci        if ((substr = (mh.num_substreams > 1)))
419cabdff1aSopenharmony_ci            m->substream[0].mask = AV_CH_LAYOUT_STEREO;
420cabdff1aSopenharmony_ci        m->substream[substr].mask = mh.channel_layout_mlp;
421cabdff1aSopenharmony_ci    } else {
422cabdff1aSopenharmony_ci        if (mh.stream_type != SYNC_TRUEHD) {
423cabdff1aSopenharmony_ci            avpriv_request_sample(m->avctx,
424cabdff1aSopenharmony_ci                        "unexpected stream_type %X in !MLP",
425cabdff1aSopenharmony_ci                        mh.stream_type);
426cabdff1aSopenharmony_ci            return AVERROR_PATCHWELCOME;
427cabdff1aSopenharmony_ci        }
428cabdff1aSopenharmony_ci        if (mh.channels_thd_stream1 == 2 &&
429cabdff1aSopenharmony_ci            mh.channels_thd_stream2 == 2 &&
430cabdff1aSopenharmony_ci            m->avctx->ch_layout.nb_channels == 2)
431cabdff1aSopenharmony_ci            m->substream[0].mask = AV_CH_LAYOUT_STEREO;
432cabdff1aSopenharmony_ci        if ((substr = (mh.num_substreams > 1)))
433cabdff1aSopenharmony_ci            m->substream[0].mask = AV_CH_LAYOUT_STEREO;
434cabdff1aSopenharmony_ci        if (mh.num_substreams > 2)
435cabdff1aSopenharmony_ci            if (mh.channel_layout_thd_stream2)
436cabdff1aSopenharmony_ci                m->substream[2].mask = mh.channel_layout_thd_stream2;
437cabdff1aSopenharmony_ci            else
438cabdff1aSopenharmony_ci                m->substream[2].mask = mh.channel_layout_thd_stream1;
439cabdff1aSopenharmony_ci        if (m->avctx->ch_layout.nb_channels > 2)
440cabdff1aSopenharmony_ci            m->substream[mh.num_substreams > 1].mask = mh.channel_layout_thd_stream1;
441cabdff1aSopenharmony_ci
442cabdff1aSopenharmony_ci        if (m->avctx->ch_layout.nb_channels <= 2 &&
443cabdff1aSopenharmony_ci            m->substream[substr].mask == AV_CH_LAYOUT_MONO && m->max_decoded_substream == 1) {
444cabdff1aSopenharmony_ci            av_log(m->avctx, AV_LOG_DEBUG, "Mono stream with 2 substreams, ignoring 2nd\n");
445cabdff1aSopenharmony_ci            m->max_decoded_substream = 0;
446cabdff1aSopenharmony_ci            if (m->avctx->ch_layout.nb_channels == 2) {
447cabdff1aSopenharmony_ci                av_channel_layout_uninit(&m->avctx->ch_layout);
448cabdff1aSopenharmony_ci                m->avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO;
449cabdff1aSopenharmony_ci            }
450cabdff1aSopenharmony_ci        }
451cabdff1aSopenharmony_ci    }
452cabdff1aSopenharmony_ci
453cabdff1aSopenharmony_ci    m->needs_reordering = mh.channel_arrangement >= 18 && mh.channel_arrangement <= 20;
454cabdff1aSopenharmony_ci
455cabdff1aSopenharmony_ci    /* Parse the TrueHD decoder channel modifiers and set each substream's
456cabdff1aSopenharmony_ci     * AVMatrixEncoding accordingly.
457cabdff1aSopenharmony_ci     *
458cabdff1aSopenharmony_ci     * The meaning of the modifiers depends on the channel layout:
459cabdff1aSopenharmony_ci     *
460cabdff1aSopenharmony_ci     * - THD_CH_MODIFIER_LTRT, THD_CH_MODIFIER_LBINRBIN only apply to 2-channel
461cabdff1aSopenharmony_ci     *
462cabdff1aSopenharmony_ci     * - THD_CH_MODIFIER_MONO applies to 1-channel or 2-channel (dual mono)
463cabdff1aSopenharmony_ci     *
464cabdff1aSopenharmony_ci     * - THD_CH_MODIFIER_SURROUNDEX, THD_CH_MODIFIER_NOTSURROUNDEX only apply to
465cabdff1aSopenharmony_ci     *   layouts with an Ls/Rs channel pair
466cabdff1aSopenharmony_ci     */
467cabdff1aSopenharmony_ci    for (substr = 0; substr < MAX_SUBSTREAMS; substr++)
468cabdff1aSopenharmony_ci        m->substream[substr].matrix_encoding = AV_MATRIX_ENCODING_NONE;
469cabdff1aSopenharmony_ci    if (m->avctx->codec_id == AV_CODEC_ID_TRUEHD) {
470cabdff1aSopenharmony_ci        if (mh.num_substreams > 2 &&
471cabdff1aSopenharmony_ci            mh.channel_layout_thd_stream2 & AV_CH_SIDE_LEFT &&
472cabdff1aSopenharmony_ci            mh.channel_layout_thd_stream2 & AV_CH_SIDE_RIGHT &&
473cabdff1aSopenharmony_ci            mh.channel_modifier_thd_stream2 == THD_CH_MODIFIER_SURROUNDEX)
474cabdff1aSopenharmony_ci            m->substream[2].matrix_encoding = AV_MATRIX_ENCODING_DOLBYEX;
475cabdff1aSopenharmony_ci
476cabdff1aSopenharmony_ci        if (mh.num_substreams > 1 &&
477cabdff1aSopenharmony_ci            mh.channel_layout_thd_stream1 & AV_CH_SIDE_LEFT &&
478cabdff1aSopenharmony_ci            mh.channel_layout_thd_stream1 & AV_CH_SIDE_RIGHT &&
479cabdff1aSopenharmony_ci            mh.channel_modifier_thd_stream1 == THD_CH_MODIFIER_SURROUNDEX)
480cabdff1aSopenharmony_ci            m->substream[1].matrix_encoding = AV_MATRIX_ENCODING_DOLBYEX;
481cabdff1aSopenharmony_ci
482cabdff1aSopenharmony_ci        if (mh.num_substreams > 0)
483cabdff1aSopenharmony_ci            switch (mh.channel_modifier_thd_stream0) {
484cabdff1aSopenharmony_ci            case THD_CH_MODIFIER_LTRT:
485cabdff1aSopenharmony_ci                m->substream[0].matrix_encoding = AV_MATRIX_ENCODING_DOLBY;
486cabdff1aSopenharmony_ci                break;
487cabdff1aSopenharmony_ci            case THD_CH_MODIFIER_LBINRBIN:
488cabdff1aSopenharmony_ci                m->substream[0].matrix_encoding = AV_MATRIX_ENCODING_DOLBYHEADPHONE;
489cabdff1aSopenharmony_ci                break;
490cabdff1aSopenharmony_ci            default:
491cabdff1aSopenharmony_ci                break;
492cabdff1aSopenharmony_ci            }
493cabdff1aSopenharmony_ci    }
494cabdff1aSopenharmony_ci
495cabdff1aSopenharmony_ci    return 0;
496cabdff1aSopenharmony_ci}
497cabdff1aSopenharmony_ci
498cabdff1aSopenharmony_ci/** Read a restart header from a block in a substream. This contains parameters
499cabdff1aSopenharmony_ci *  required to decode the audio that do not change very often. Generally
500cabdff1aSopenharmony_ci *  (always) present only in blocks following a major sync. */
501cabdff1aSopenharmony_ci
502cabdff1aSopenharmony_cistatic int read_restart_header(MLPDecodeContext *m, GetBitContext *gbp,
503cabdff1aSopenharmony_ci                               const uint8_t *buf, unsigned int substr)
504cabdff1aSopenharmony_ci{
505cabdff1aSopenharmony_ci    SubStream *s = &m->substream[substr];
506cabdff1aSopenharmony_ci    unsigned int ch;
507cabdff1aSopenharmony_ci    int sync_word, tmp;
508cabdff1aSopenharmony_ci    uint8_t checksum;
509cabdff1aSopenharmony_ci    uint8_t lossless_check;
510cabdff1aSopenharmony_ci    int start_count = get_bits_count(gbp);
511cabdff1aSopenharmony_ci    int min_channel, max_channel, max_matrix_channel, noise_type;
512cabdff1aSopenharmony_ci    const int std_max_matrix_channel = m->avctx->codec_id == AV_CODEC_ID_MLP
513cabdff1aSopenharmony_ci                                     ? MAX_MATRIX_CHANNEL_MLP
514cabdff1aSopenharmony_ci                                     : MAX_MATRIX_CHANNEL_TRUEHD;
515cabdff1aSopenharmony_ci
516cabdff1aSopenharmony_ci    sync_word = get_bits(gbp, 13);
517cabdff1aSopenharmony_ci
518cabdff1aSopenharmony_ci    if (sync_word != 0x31ea >> 1) {
519cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR,
520cabdff1aSopenharmony_ci               "restart header sync incorrect (got 0x%04x)\n", sync_word);
521cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
522cabdff1aSopenharmony_ci    }
523cabdff1aSopenharmony_ci
524cabdff1aSopenharmony_ci    noise_type = get_bits1(gbp);
525cabdff1aSopenharmony_ci
526cabdff1aSopenharmony_ci    if (m->avctx->codec_id == AV_CODEC_ID_MLP && noise_type) {
527cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR, "MLP must have 0x31ea sync word.\n");
528cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
529cabdff1aSopenharmony_ci    }
530cabdff1aSopenharmony_ci
531cabdff1aSopenharmony_ci    skip_bits(gbp, 16); /* Output timestamp */
532cabdff1aSopenharmony_ci
533cabdff1aSopenharmony_ci    min_channel        = get_bits(gbp, 4);
534cabdff1aSopenharmony_ci    max_channel        = get_bits(gbp, 4);
535cabdff1aSopenharmony_ci    max_matrix_channel = get_bits(gbp, 4);
536cabdff1aSopenharmony_ci
537cabdff1aSopenharmony_ci    if (max_matrix_channel > std_max_matrix_channel) {
538cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR,
539cabdff1aSopenharmony_ci               "Max matrix channel cannot be greater than %d.\n",
540cabdff1aSopenharmony_ci               std_max_matrix_channel);
541cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
542cabdff1aSopenharmony_ci    }
543cabdff1aSopenharmony_ci
544cabdff1aSopenharmony_ci    if (max_channel != max_matrix_channel) {
545cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR,
546cabdff1aSopenharmony_ci               "Max channel must be equal max matrix channel.\n");
547cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
548cabdff1aSopenharmony_ci    }
549cabdff1aSopenharmony_ci
550cabdff1aSopenharmony_ci    /* This should happen for TrueHD streams with >6 channels and MLP's noise
551cabdff1aSopenharmony_ci     * type. It is not yet known if this is allowed. */
552cabdff1aSopenharmony_ci    if (max_matrix_channel > MAX_MATRIX_CHANNEL_MLP && !noise_type) {
553cabdff1aSopenharmony_ci        avpriv_request_sample(m->avctx,
554cabdff1aSopenharmony_ci                              "%d channels (more than the "
555cabdff1aSopenharmony_ci                              "maximum supported by the decoder)",
556cabdff1aSopenharmony_ci                              max_channel + 2);
557cabdff1aSopenharmony_ci        return AVERROR_PATCHWELCOME;
558cabdff1aSopenharmony_ci    }
559cabdff1aSopenharmony_ci
560cabdff1aSopenharmony_ci    if (min_channel > max_channel) {
561cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR,
562cabdff1aSopenharmony_ci               "Substream min channel cannot be greater than max channel.\n");
563cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
564cabdff1aSopenharmony_ci    }
565cabdff1aSopenharmony_ci
566cabdff1aSopenharmony_ci    s->min_channel        = min_channel;
567cabdff1aSopenharmony_ci    s->max_channel        = max_channel;
568cabdff1aSopenharmony_ci    s->max_matrix_channel = max_matrix_channel;
569cabdff1aSopenharmony_ci    s->noise_type         = noise_type;
570cabdff1aSopenharmony_ci
571cabdff1aSopenharmony_ci    if (mlp_channel_layout_subset(&m->downmix_layout, s->mask) &&
572cabdff1aSopenharmony_ci        m->max_decoded_substream > substr) {
573cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_DEBUG,
574cabdff1aSopenharmony_ci               "Extracting %d-channel downmix (0x%"PRIx64") from substream %d. "
575cabdff1aSopenharmony_ci               "Further substreams will be skipped.\n",
576cabdff1aSopenharmony_ci               s->max_channel + 1, s->mask, substr);
577cabdff1aSopenharmony_ci        m->max_decoded_substream = substr;
578cabdff1aSopenharmony_ci    }
579cabdff1aSopenharmony_ci
580cabdff1aSopenharmony_ci    s->noise_shift   = get_bits(gbp,  4);
581cabdff1aSopenharmony_ci    s->noisegen_seed = get_bits(gbp, 23);
582cabdff1aSopenharmony_ci
583cabdff1aSopenharmony_ci    skip_bits(gbp, 19);
584cabdff1aSopenharmony_ci
585cabdff1aSopenharmony_ci    s->data_check_present = get_bits1(gbp);
586cabdff1aSopenharmony_ci    lossless_check = get_bits(gbp, 8);
587cabdff1aSopenharmony_ci    if (substr == m->max_decoded_substream
588cabdff1aSopenharmony_ci        && s->lossless_check_data != 0xffffffff) {
589cabdff1aSopenharmony_ci        tmp = xor_32_to_8(s->lossless_check_data);
590cabdff1aSopenharmony_ci        if (tmp != lossless_check)
591cabdff1aSopenharmony_ci            av_log(m->avctx, AV_LOG_WARNING,
592cabdff1aSopenharmony_ci                   "Lossless check failed - expected %02x, calculated %02x.\n",
593cabdff1aSopenharmony_ci                   lossless_check, tmp);
594cabdff1aSopenharmony_ci    }
595cabdff1aSopenharmony_ci
596cabdff1aSopenharmony_ci    skip_bits(gbp, 16);
597cabdff1aSopenharmony_ci
598cabdff1aSopenharmony_ci    memset(s->ch_assign, 0, sizeof(s->ch_assign));
599cabdff1aSopenharmony_ci
600cabdff1aSopenharmony_ci    for (ch = 0; ch <= s->max_matrix_channel; ch++) {
601cabdff1aSopenharmony_ci        int ch_assign = get_bits(gbp, 6);
602cabdff1aSopenharmony_ci        if (m->avctx->codec_id == AV_CODEC_ID_TRUEHD) {
603cabdff1aSopenharmony_ci            AVChannelLayout l;
604cabdff1aSopenharmony_ci            enum AVChannel channel = thd_channel_layout_extract_channel(s->mask, ch_assign);
605cabdff1aSopenharmony_ci
606cabdff1aSopenharmony_ci            av_channel_layout_from_mask(&l, s->mask);
607cabdff1aSopenharmony_ci            ch_assign = av_channel_layout_index_from_channel(&l, channel);
608cabdff1aSopenharmony_ci        }
609cabdff1aSopenharmony_ci        if (ch_assign < 0 || ch_assign > s->max_matrix_channel) {
610cabdff1aSopenharmony_ci            avpriv_request_sample(m->avctx,
611cabdff1aSopenharmony_ci                                  "Assignment of matrix channel %d to invalid output channel %d",
612cabdff1aSopenharmony_ci                                  ch, ch_assign);
613cabdff1aSopenharmony_ci            return AVERROR_PATCHWELCOME;
614cabdff1aSopenharmony_ci        }
615cabdff1aSopenharmony_ci        s->ch_assign[ch_assign] = ch;
616cabdff1aSopenharmony_ci    }
617cabdff1aSopenharmony_ci
618cabdff1aSopenharmony_ci    checksum = ff_mlp_restart_checksum(buf, get_bits_count(gbp) - start_count);
619cabdff1aSopenharmony_ci
620cabdff1aSopenharmony_ci    if (checksum != get_bits(gbp, 8))
621cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR, "restart header checksum error\n");
622cabdff1aSopenharmony_ci
623cabdff1aSopenharmony_ci    /* Set default decoding parameters. */
624cabdff1aSopenharmony_ci    s->param_presence_flags   = 0xff;
625cabdff1aSopenharmony_ci    s->num_primitive_matrices = 0;
626cabdff1aSopenharmony_ci    s->blocksize              = 8;
627cabdff1aSopenharmony_ci    s->lossless_check_data    = 0;
628cabdff1aSopenharmony_ci
629cabdff1aSopenharmony_ci    memset(s->output_shift   , 0, sizeof(s->output_shift   ));
630cabdff1aSopenharmony_ci    memset(s->quant_step_size, 0, sizeof(s->quant_step_size));
631cabdff1aSopenharmony_ci
632cabdff1aSopenharmony_ci    for (ch = s->min_channel; ch <= s->max_channel; ch++) {
633cabdff1aSopenharmony_ci        ChannelParams *cp = &s->channel_params[ch];
634cabdff1aSopenharmony_ci        cp->filter_params[FIR].order = 0;
635cabdff1aSopenharmony_ci        cp->filter_params[IIR].order = 0;
636cabdff1aSopenharmony_ci        cp->filter_params[FIR].shift = 0;
637cabdff1aSopenharmony_ci        cp->filter_params[IIR].shift = 0;
638cabdff1aSopenharmony_ci
639cabdff1aSopenharmony_ci        /* Default audio coding is 24-bit raw PCM. */
640cabdff1aSopenharmony_ci        cp->huff_offset      = 0;
641cabdff1aSopenharmony_ci        cp->sign_huff_offset = -(1 << 23);
642cabdff1aSopenharmony_ci        cp->codebook         = 0;
643cabdff1aSopenharmony_ci        cp->huff_lsbs        = 24;
644cabdff1aSopenharmony_ci    }
645cabdff1aSopenharmony_ci
646cabdff1aSopenharmony_ci    if (substr == m->max_decoded_substream) {
647cabdff1aSopenharmony_ci        av_channel_layout_uninit(&m->avctx->ch_layout);
648cabdff1aSopenharmony_ci        av_channel_layout_from_mask(&m->avctx->ch_layout, s->mask);
649cabdff1aSopenharmony_ci        m->dsp.mlp_pack_output = m->dsp.mlp_select_pack_output(s->ch_assign,
650cabdff1aSopenharmony_ci                                                               s->output_shift,
651cabdff1aSopenharmony_ci                                                               s->max_matrix_channel,
652cabdff1aSopenharmony_ci                                                               m->avctx->sample_fmt == AV_SAMPLE_FMT_S32);
653cabdff1aSopenharmony_ci
654cabdff1aSopenharmony_ci        if (m->avctx->codec_id == AV_CODEC_ID_MLP && m->needs_reordering) {
655cabdff1aSopenharmony_ci            if (s->mask == (AV_CH_LAYOUT_QUAD|AV_CH_LOW_FREQUENCY) ||
656cabdff1aSopenharmony_ci                s->mask == AV_CH_LAYOUT_5POINT0_BACK) {
657cabdff1aSopenharmony_ci                int i = s->ch_assign[4];
658cabdff1aSopenharmony_ci                s->ch_assign[4] = s->ch_assign[3];
659cabdff1aSopenharmony_ci                s->ch_assign[3] = s->ch_assign[2];
660cabdff1aSopenharmony_ci                s->ch_assign[2] = i;
661cabdff1aSopenharmony_ci            } else if (s->mask == AV_CH_LAYOUT_5POINT1_BACK) {
662cabdff1aSopenharmony_ci                FFSWAP(int, s->ch_assign[2], s->ch_assign[4]);
663cabdff1aSopenharmony_ci                FFSWAP(int, s->ch_assign[3], s->ch_assign[5]);
664cabdff1aSopenharmony_ci            }
665cabdff1aSopenharmony_ci        }
666cabdff1aSopenharmony_ci
667cabdff1aSopenharmony_ci    }
668cabdff1aSopenharmony_ci
669cabdff1aSopenharmony_ci    return 0;
670cabdff1aSopenharmony_ci}
671cabdff1aSopenharmony_ci
672cabdff1aSopenharmony_ci/** Read parameters for one of the prediction filters. */
673cabdff1aSopenharmony_ci
674cabdff1aSopenharmony_cistatic int read_filter_params(MLPDecodeContext *m, GetBitContext *gbp,
675cabdff1aSopenharmony_ci                              unsigned int substr, unsigned int channel,
676cabdff1aSopenharmony_ci                              unsigned int filter)
677cabdff1aSopenharmony_ci{
678cabdff1aSopenharmony_ci    SubStream *s = &m->substream[substr];
679cabdff1aSopenharmony_ci    FilterParams *fp = &s->channel_params[channel].filter_params[filter];
680cabdff1aSopenharmony_ci    const int max_order = filter ? MAX_IIR_ORDER : MAX_FIR_ORDER;
681cabdff1aSopenharmony_ci    const char fchar = filter ? 'I' : 'F';
682cabdff1aSopenharmony_ci    int i, order;
683cabdff1aSopenharmony_ci
684cabdff1aSopenharmony_ci    // Filter is 0 for FIR, 1 for IIR.
685cabdff1aSopenharmony_ci    av_assert0(filter < 2);
686cabdff1aSopenharmony_ci
687cabdff1aSopenharmony_ci    if (m->filter_changed[channel][filter]++ > 1) {
688cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR, "Filters may change only once per access unit.\n");
689cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
690cabdff1aSopenharmony_ci    }
691cabdff1aSopenharmony_ci
692cabdff1aSopenharmony_ci    order = get_bits(gbp, 4);
693cabdff1aSopenharmony_ci    if (order > max_order) {
694cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR,
695cabdff1aSopenharmony_ci               "%cIR filter order %d is greater than maximum %d.\n",
696cabdff1aSopenharmony_ci               fchar, order, max_order);
697cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
698cabdff1aSopenharmony_ci    }
699cabdff1aSopenharmony_ci    fp->order = order;
700cabdff1aSopenharmony_ci
701cabdff1aSopenharmony_ci    if (order > 0) {
702cabdff1aSopenharmony_ci        int32_t *fcoeff = s->channel_params[channel].coeff[filter];
703cabdff1aSopenharmony_ci        int coeff_bits, coeff_shift;
704cabdff1aSopenharmony_ci
705cabdff1aSopenharmony_ci        fp->shift = get_bits(gbp, 4);
706cabdff1aSopenharmony_ci
707cabdff1aSopenharmony_ci        coeff_bits  = get_bits(gbp, 5);
708cabdff1aSopenharmony_ci        coeff_shift = get_bits(gbp, 3);
709cabdff1aSopenharmony_ci        if (coeff_bits < 1 || coeff_bits > 16) {
710cabdff1aSopenharmony_ci            av_log(m->avctx, AV_LOG_ERROR,
711cabdff1aSopenharmony_ci                   "%cIR filter coeff_bits must be between 1 and 16.\n",
712cabdff1aSopenharmony_ci                   fchar);
713cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
714cabdff1aSopenharmony_ci        }
715cabdff1aSopenharmony_ci        if (coeff_bits + coeff_shift > 16) {
716cabdff1aSopenharmony_ci            av_log(m->avctx, AV_LOG_ERROR,
717cabdff1aSopenharmony_ci                   "Sum of coeff_bits and coeff_shift for %cIR filter must be 16 or less.\n",
718cabdff1aSopenharmony_ci                   fchar);
719cabdff1aSopenharmony_ci            return AVERROR_INVALIDDATA;
720cabdff1aSopenharmony_ci        }
721cabdff1aSopenharmony_ci
722cabdff1aSopenharmony_ci        for (i = 0; i < order; i++)
723cabdff1aSopenharmony_ci            fcoeff[i] = get_sbits(gbp, coeff_bits) * (1 << coeff_shift);
724cabdff1aSopenharmony_ci
725cabdff1aSopenharmony_ci        if (get_bits1(gbp)) {
726cabdff1aSopenharmony_ci            int state_bits, state_shift;
727cabdff1aSopenharmony_ci
728cabdff1aSopenharmony_ci            if (filter == FIR) {
729cabdff1aSopenharmony_ci                av_log(m->avctx, AV_LOG_ERROR,
730cabdff1aSopenharmony_ci                       "FIR filter has state data specified.\n");
731cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
732cabdff1aSopenharmony_ci            }
733cabdff1aSopenharmony_ci
734cabdff1aSopenharmony_ci            state_bits  = get_bits(gbp, 4);
735cabdff1aSopenharmony_ci            state_shift = get_bits(gbp, 4);
736cabdff1aSopenharmony_ci
737cabdff1aSopenharmony_ci            /* TODO: Check validity of state data. */
738cabdff1aSopenharmony_ci
739cabdff1aSopenharmony_ci            for (i = 0; i < order; i++)
740cabdff1aSopenharmony_ci                fp->state[i] = state_bits ? get_sbits(gbp, state_bits) * (1 << state_shift) : 0;
741cabdff1aSopenharmony_ci        }
742cabdff1aSopenharmony_ci    }
743cabdff1aSopenharmony_ci
744cabdff1aSopenharmony_ci    return 0;
745cabdff1aSopenharmony_ci}
746cabdff1aSopenharmony_ci
747cabdff1aSopenharmony_ci/** Read parameters for primitive matrices. */
748cabdff1aSopenharmony_ci
749cabdff1aSopenharmony_cistatic int read_matrix_params(MLPDecodeContext *m, unsigned int substr, GetBitContext *gbp)
750cabdff1aSopenharmony_ci{
751cabdff1aSopenharmony_ci    SubStream *s = &m->substream[substr];
752cabdff1aSopenharmony_ci    unsigned int mat, ch;
753cabdff1aSopenharmony_ci    const int max_primitive_matrices = m->avctx->codec_id == AV_CODEC_ID_MLP
754cabdff1aSopenharmony_ci                                     ? MAX_MATRICES_MLP
755cabdff1aSopenharmony_ci                                     : MAX_MATRICES_TRUEHD;
756cabdff1aSopenharmony_ci
757cabdff1aSopenharmony_ci    if (m->matrix_changed++ > 1) {
758cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR, "Matrices may change only once per access unit.\n");
759cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
760cabdff1aSopenharmony_ci    }
761cabdff1aSopenharmony_ci
762cabdff1aSopenharmony_ci    s->num_primitive_matrices = get_bits(gbp, 4);
763cabdff1aSopenharmony_ci
764cabdff1aSopenharmony_ci    if (s->num_primitive_matrices > max_primitive_matrices) {
765cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR,
766cabdff1aSopenharmony_ci               "Number of primitive matrices cannot be greater than %d.\n",
767cabdff1aSopenharmony_ci               max_primitive_matrices);
768cabdff1aSopenharmony_ci        goto error;
769cabdff1aSopenharmony_ci    }
770cabdff1aSopenharmony_ci
771cabdff1aSopenharmony_ci    for (mat = 0; mat < s->num_primitive_matrices; mat++) {
772cabdff1aSopenharmony_ci        int frac_bits, max_chan;
773cabdff1aSopenharmony_ci        s->matrix_out_ch[mat] = get_bits(gbp, 4);
774cabdff1aSopenharmony_ci        frac_bits             = get_bits(gbp, 4);
775cabdff1aSopenharmony_ci        s->lsb_bypass   [mat] = get_bits1(gbp);
776cabdff1aSopenharmony_ci
777cabdff1aSopenharmony_ci        if (s->matrix_out_ch[mat] > s->max_matrix_channel) {
778cabdff1aSopenharmony_ci            av_log(m->avctx, AV_LOG_ERROR,
779cabdff1aSopenharmony_ci                    "Invalid channel %d specified as output from matrix.\n",
780cabdff1aSopenharmony_ci                    s->matrix_out_ch[mat]);
781cabdff1aSopenharmony_ci            goto error;
782cabdff1aSopenharmony_ci        }
783cabdff1aSopenharmony_ci        if (frac_bits > 14) {
784cabdff1aSopenharmony_ci            av_log(m->avctx, AV_LOG_ERROR,
785cabdff1aSopenharmony_ci                    "Too many fractional bits specified.\n");
786cabdff1aSopenharmony_ci            goto error;
787cabdff1aSopenharmony_ci        }
788cabdff1aSopenharmony_ci
789cabdff1aSopenharmony_ci        max_chan = s->max_matrix_channel;
790cabdff1aSopenharmony_ci        if (!s->noise_type)
791cabdff1aSopenharmony_ci            max_chan+=2;
792cabdff1aSopenharmony_ci
793cabdff1aSopenharmony_ci        for (ch = 0; ch <= max_chan; ch++) {
794cabdff1aSopenharmony_ci            int coeff_val = 0;
795cabdff1aSopenharmony_ci            if (get_bits1(gbp))
796cabdff1aSopenharmony_ci                coeff_val = get_sbits(gbp, frac_bits + 2);
797cabdff1aSopenharmony_ci
798cabdff1aSopenharmony_ci            s->matrix_coeff[mat][ch] = coeff_val * (1 << (14 - frac_bits));
799cabdff1aSopenharmony_ci        }
800cabdff1aSopenharmony_ci
801cabdff1aSopenharmony_ci        if (s->noise_type)
802cabdff1aSopenharmony_ci            s->matrix_noise_shift[mat] = get_bits(gbp, 4);
803cabdff1aSopenharmony_ci        else
804cabdff1aSopenharmony_ci            s->matrix_noise_shift[mat] = 0;
805cabdff1aSopenharmony_ci    }
806cabdff1aSopenharmony_ci
807cabdff1aSopenharmony_ci    return 0;
808cabdff1aSopenharmony_cierror:
809cabdff1aSopenharmony_ci    s->num_primitive_matrices = 0;
810cabdff1aSopenharmony_ci    memset(s->matrix_out_ch, 0, sizeof(s->matrix_out_ch));
811cabdff1aSopenharmony_ci
812cabdff1aSopenharmony_ci    return AVERROR_INVALIDDATA;
813cabdff1aSopenharmony_ci}
814cabdff1aSopenharmony_ci
815cabdff1aSopenharmony_ci/** Read channel parameters. */
816cabdff1aSopenharmony_ci
817cabdff1aSopenharmony_cistatic int read_channel_params(MLPDecodeContext *m, unsigned int substr,
818cabdff1aSopenharmony_ci                               GetBitContext *gbp, unsigned int ch)
819cabdff1aSopenharmony_ci{
820cabdff1aSopenharmony_ci    SubStream *s = &m->substream[substr];
821cabdff1aSopenharmony_ci    ChannelParams *cp = &s->channel_params[ch];
822cabdff1aSopenharmony_ci    FilterParams *fir = &cp->filter_params[FIR];
823cabdff1aSopenharmony_ci    FilterParams *iir = &cp->filter_params[IIR];
824cabdff1aSopenharmony_ci    int ret;
825cabdff1aSopenharmony_ci
826cabdff1aSopenharmony_ci    if (s->param_presence_flags & PARAM_FIR)
827cabdff1aSopenharmony_ci        if (get_bits1(gbp))
828cabdff1aSopenharmony_ci            if ((ret = read_filter_params(m, gbp, substr, ch, FIR)) < 0)
829cabdff1aSopenharmony_ci                return ret;
830cabdff1aSopenharmony_ci
831cabdff1aSopenharmony_ci    if (s->param_presence_flags & PARAM_IIR)
832cabdff1aSopenharmony_ci        if (get_bits1(gbp))
833cabdff1aSopenharmony_ci            if ((ret = read_filter_params(m, gbp, substr, ch, IIR)) < 0)
834cabdff1aSopenharmony_ci                return ret;
835cabdff1aSopenharmony_ci
836cabdff1aSopenharmony_ci    if (fir->order + iir->order > 8) {
837cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR, "Total filter orders too high.\n");
838cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
839cabdff1aSopenharmony_ci    }
840cabdff1aSopenharmony_ci
841cabdff1aSopenharmony_ci    if (fir->order && iir->order &&
842cabdff1aSopenharmony_ci        fir->shift != iir->shift) {
843cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR,
844cabdff1aSopenharmony_ci                "FIR and IIR filters must use the same precision.\n");
845cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
846cabdff1aSopenharmony_ci    }
847cabdff1aSopenharmony_ci    /* The FIR and IIR filters must have the same precision.
848cabdff1aSopenharmony_ci     * To simplify the filtering code, only the precision of the
849cabdff1aSopenharmony_ci     * FIR filter is considered. If only the IIR filter is employed,
850cabdff1aSopenharmony_ci     * the FIR filter precision is set to that of the IIR filter, so
851cabdff1aSopenharmony_ci     * that the filtering code can use it. */
852cabdff1aSopenharmony_ci    if (!fir->order && iir->order)
853cabdff1aSopenharmony_ci        fir->shift = iir->shift;
854cabdff1aSopenharmony_ci
855cabdff1aSopenharmony_ci    if (s->param_presence_flags & PARAM_HUFFOFFSET)
856cabdff1aSopenharmony_ci        if (get_bits1(gbp))
857cabdff1aSopenharmony_ci            cp->huff_offset = get_sbits(gbp, 15);
858cabdff1aSopenharmony_ci
859cabdff1aSopenharmony_ci    cp->codebook  = get_bits(gbp, 2);
860cabdff1aSopenharmony_ci    cp->huff_lsbs = get_bits(gbp, 5);
861cabdff1aSopenharmony_ci
862cabdff1aSopenharmony_ci    if (cp->codebook > 0 && cp->huff_lsbs > 24) {
863cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR, "Invalid huff_lsbs.\n");
864cabdff1aSopenharmony_ci        cp->huff_lsbs = 0;
865cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
866cabdff1aSopenharmony_ci    }
867cabdff1aSopenharmony_ci
868cabdff1aSopenharmony_ci    return 0;
869cabdff1aSopenharmony_ci}
870cabdff1aSopenharmony_ci
871cabdff1aSopenharmony_ci/** Read decoding parameters that change more often than those in the restart
872cabdff1aSopenharmony_ci *  header. */
873cabdff1aSopenharmony_ci
874cabdff1aSopenharmony_cistatic int read_decoding_params(MLPDecodeContext *m, GetBitContext *gbp,
875cabdff1aSopenharmony_ci                                unsigned int substr)
876cabdff1aSopenharmony_ci{
877cabdff1aSopenharmony_ci    SubStream *s = &m->substream[substr];
878cabdff1aSopenharmony_ci    unsigned int ch;
879cabdff1aSopenharmony_ci    int ret = 0;
880cabdff1aSopenharmony_ci    unsigned recompute_sho = 0;
881cabdff1aSopenharmony_ci
882cabdff1aSopenharmony_ci    if (s->param_presence_flags & PARAM_PRESENCE)
883cabdff1aSopenharmony_ci        if (get_bits1(gbp))
884cabdff1aSopenharmony_ci            s->param_presence_flags = get_bits(gbp, 8);
885cabdff1aSopenharmony_ci
886cabdff1aSopenharmony_ci    if (s->param_presence_flags & PARAM_BLOCKSIZE)
887cabdff1aSopenharmony_ci        if (get_bits1(gbp)) {
888cabdff1aSopenharmony_ci            s->blocksize = get_bits(gbp, 9);
889cabdff1aSopenharmony_ci            if (s->blocksize < 8 || s->blocksize > m->access_unit_size) {
890cabdff1aSopenharmony_ci                av_log(m->avctx, AV_LOG_ERROR, "Invalid blocksize.\n");
891cabdff1aSopenharmony_ci                s->blocksize = 0;
892cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
893cabdff1aSopenharmony_ci            }
894cabdff1aSopenharmony_ci        }
895cabdff1aSopenharmony_ci
896cabdff1aSopenharmony_ci    if (s->param_presence_flags & PARAM_MATRIX)
897cabdff1aSopenharmony_ci        if (get_bits1(gbp))
898cabdff1aSopenharmony_ci            if ((ret = read_matrix_params(m, substr, gbp)) < 0)
899cabdff1aSopenharmony_ci                return ret;
900cabdff1aSopenharmony_ci
901cabdff1aSopenharmony_ci    if (s->param_presence_flags & PARAM_OUTSHIFT)
902cabdff1aSopenharmony_ci        if (get_bits1(gbp)) {
903cabdff1aSopenharmony_ci            for (ch = 0; ch <= s->max_matrix_channel; ch++) {
904cabdff1aSopenharmony_ci                s->output_shift[ch] = get_sbits(gbp, 4);
905cabdff1aSopenharmony_ci                if (s->output_shift[ch] < 0) {
906cabdff1aSopenharmony_ci                    avpriv_request_sample(m->avctx, "Negative output_shift");
907cabdff1aSopenharmony_ci                    s->output_shift[ch] = 0;
908cabdff1aSopenharmony_ci                }
909cabdff1aSopenharmony_ci            }
910cabdff1aSopenharmony_ci            if (substr == m->max_decoded_substream)
911cabdff1aSopenharmony_ci                m->dsp.mlp_pack_output = m->dsp.mlp_select_pack_output(s->ch_assign,
912cabdff1aSopenharmony_ci                                                                       s->output_shift,
913cabdff1aSopenharmony_ci                                                                       s->max_matrix_channel,
914cabdff1aSopenharmony_ci                                                                       m->avctx->sample_fmt == AV_SAMPLE_FMT_S32);
915cabdff1aSopenharmony_ci        }
916cabdff1aSopenharmony_ci
917cabdff1aSopenharmony_ci    if (s->param_presence_flags & PARAM_QUANTSTEP)
918cabdff1aSopenharmony_ci        if (get_bits1(gbp))
919cabdff1aSopenharmony_ci            for (ch = 0; ch <= s->max_channel; ch++) {
920cabdff1aSopenharmony_ci                s->quant_step_size[ch] = get_bits(gbp, 4);
921cabdff1aSopenharmony_ci
922cabdff1aSopenharmony_ci                recompute_sho |= 1<<ch;
923cabdff1aSopenharmony_ci            }
924cabdff1aSopenharmony_ci
925cabdff1aSopenharmony_ci    for (ch = s->min_channel; ch <= s->max_channel; ch++)
926cabdff1aSopenharmony_ci        if (get_bits1(gbp)) {
927cabdff1aSopenharmony_ci            recompute_sho |= 1<<ch;
928cabdff1aSopenharmony_ci            if ((ret = read_channel_params(m, substr, gbp, ch)) < 0)
929cabdff1aSopenharmony_ci                goto fail;
930cabdff1aSopenharmony_ci        }
931cabdff1aSopenharmony_ci
932cabdff1aSopenharmony_ci
933cabdff1aSopenharmony_cifail:
934cabdff1aSopenharmony_ci    for (ch = 0; ch <= s->max_channel; ch++) {
935cabdff1aSopenharmony_ci        if (recompute_sho & (1<<ch)) {
936cabdff1aSopenharmony_ci            ChannelParams *cp = &s->channel_params[ch];
937cabdff1aSopenharmony_ci
938cabdff1aSopenharmony_ci            if (cp->codebook > 0 && cp->huff_lsbs < s->quant_step_size[ch]) {
939cabdff1aSopenharmony_ci                if (ret >= 0) {
940cabdff1aSopenharmony_ci                    av_log(m->avctx, AV_LOG_ERROR, "quant_step_size larger than huff_lsbs\n");
941cabdff1aSopenharmony_ci                    ret = AVERROR_INVALIDDATA;
942cabdff1aSopenharmony_ci                }
943cabdff1aSopenharmony_ci                s->quant_step_size[ch] = 0;
944cabdff1aSopenharmony_ci            }
945cabdff1aSopenharmony_ci
946cabdff1aSopenharmony_ci            cp->sign_huff_offset = calculate_sign_huff(m, substr, ch);
947cabdff1aSopenharmony_ci        }
948cabdff1aSopenharmony_ci    }
949cabdff1aSopenharmony_ci    return ret;
950cabdff1aSopenharmony_ci}
951cabdff1aSopenharmony_ci
952cabdff1aSopenharmony_ci#define MSB_MASK(bits)  (-(1 << (bits)))
953cabdff1aSopenharmony_ci
954cabdff1aSopenharmony_ci/** Generate PCM samples using the prediction filters and residual values
955cabdff1aSopenharmony_ci *  read from the data stream, and update the filter state. */
956cabdff1aSopenharmony_ci
957cabdff1aSopenharmony_cistatic void filter_channel(MLPDecodeContext *m, unsigned int substr,
958cabdff1aSopenharmony_ci                           unsigned int channel)
959cabdff1aSopenharmony_ci{
960cabdff1aSopenharmony_ci    SubStream *s = &m->substream[substr];
961cabdff1aSopenharmony_ci    const int32_t *fircoeff = s->channel_params[channel].coeff[FIR];
962cabdff1aSopenharmony_ci    int32_t state_buffer[NUM_FILTERS][MAX_BLOCKSIZE + MAX_FIR_ORDER];
963cabdff1aSopenharmony_ci    int32_t *firbuf = state_buffer[FIR] + MAX_BLOCKSIZE;
964cabdff1aSopenharmony_ci    int32_t *iirbuf = state_buffer[IIR] + MAX_BLOCKSIZE;
965cabdff1aSopenharmony_ci    FilterParams *fir = &s->channel_params[channel].filter_params[FIR];
966cabdff1aSopenharmony_ci    FilterParams *iir = &s->channel_params[channel].filter_params[IIR];
967cabdff1aSopenharmony_ci    unsigned int filter_shift = fir->shift;
968cabdff1aSopenharmony_ci    int32_t mask = MSB_MASK(s->quant_step_size[channel]);
969cabdff1aSopenharmony_ci
970cabdff1aSopenharmony_ci    memcpy(firbuf, fir->state, MAX_FIR_ORDER * sizeof(int32_t));
971cabdff1aSopenharmony_ci    memcpy(iirbuf, iir->state, MAX_IIR_ORDER * sizeof(int32_t));
972cabdff1aSopenharmony_ci
973cabdff1aSopenharmony_ci    m->dsp.mlp_filter_channel(firbuf, fircoeff,
974cabdff1aSopenharmony_ci                              fir->order, iir->order,
975cabdff1aSopenharmony_ci                              filter_shift, mask, s->blocksize,
976cabdff1aSopenharmony_ci                              &m->sample_buffer[s->blockpos][channel]);
977cabdff1aSopenharmony_ci
978cabdff1aSopenharmony_ci    memcpy(fir->state, firbuf - s->blocksize, MAX_FIR_ORDER * sizeof(int32_t));
979cabdff1aSopenharmony_ci    memcpy(iir->state, iirbuf - s->blocksize, MAX_IIR_ORDER * sizeof(int32_t));
980cabdff1aSopenharmony_ci}
981cabdff1aSopenharmony_ci
982cabdff1aSopenharmony_ci/** Read a block of PCM residual data (or actual if no filtering active). */
983cabdff1aSopenharmony_ci
984cabdff1aSopenharmony_cistatic int read_block_data(MLPDecodeContext *m, GetBitContext *gbp,
985cabdff1aSopenharmony_ci                           unsigned int substr)
986cabdff1aSopenharmony_ci{
987cabdff1aSopenharmony_ci    SubStream *s = &m->substream[substr];
988cabdff1aSopenharmony_ci    unsigned int i, ch, expected_stream_pos = 0;
989cabdff1aSopenharmony_ci    int ret;
990cabdff1aSopenharmony_ci
991cabdff1aSopenharmony_ci    if (s->data_check_present) {
992cabdff1aSopenharmony_ci        expected_stream_pos  = get_bits_count(gbp);
993cabdff1aSopenharmony_ci        expected_stream_pos += get_bits(gbp, 16);
994cabdff1aSopenharmony_ci        avpriv_request_sample(m->avctx,
995cabdff1aSopenharmony_ci                              "Substreams with VLC block size check info");
996cabdff1aSopenharmony_ci    }
997cabdff1aSopenharmony_ci
998cabdff1aSopenharmony_ci    if (s->blockpos + s->blocksize > m->access_unit_size) {
999cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR, "too many audio samples in frame\n");
1000cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1001cabdff1aSopenharmony_ci    }
1002cabdff1aSopenharmony_ci
1003cabdff1aSopenharmony_ci    memset(&m->bypassed_lsbs[s->blockpos][0], 0,
1004cabdff1aSopenharmony_ci           s->blocksize * sizeof(m->bypassed_lsbs[0]));
1005cabdff1aSopenharmony_ci
1006cabdff1aSopenharmony_ci    for (i = 0; i < s->blocksize; i++)
1007cabdff1aSopenharmony_ci        if ((ret = read_huff_channels(m, gbp, substr, i)) < 0)
1008cabdff1aSopenharmony_ci            return ret;
1009cabdff1aSopenharmony_ci
1010cabdff1aSopenharmony_ci    for (ch = s->min_channel; ch <= s->max_channel; ch++)
1011cabdff1aSopenharmony_ci        filter_channel(m, substr, ch);
1012cabdff1aSopenharmony_ci
1013cabdff1aSopenharmony_ci    s->blockpos += s->blocksize;
1014cabdff1aSopenharmony_ci
1015cabdff1aSopenharmony_ci    if (s->data_check_present) {
1016cabdff1aSopenharmony_ci        if (get_bits_count(gbp) != expected_stream_pos)
1017cabdff1aSopenharmony_ci            av_log(m->avctx, AV_LOG_ERROR, "block data length mismatch\n");
1018cabdff1aSopenharmony_ci        skip_bits(gbp, 8);
1019cabdff1aSopenharmony_ci    }
1020cabdff1aSopenharmony_ci
1021cabdff1aSopenharmony_ci    return 0;
1022cabdff1aSopenharmony_ci}
1023cabdff1aSopenharmony_ci
1024cabdff1aSopenharmony_ci/** Data table used for TrueHD noise generation function. */
1025cabdff1aSopenharmony_ci
1026cabdff1aSopenharmony_cistatic const int8_t noise_table[256] = {
1027cabdff1aSopenharmony_ci     30,  51,  22,  54,   3,   7,  -4,  38,  14,  55,  46,  81,  22,  58,  -3,   2,
1028cabdff1aSopenharmony_ci     52,  31,  -7,  51,  15,  44,  74,  30,  85, -17,  10,  33,  18,  80,  28,  62,
1029cabdff1aSopenharmony_ci     10,  32,  23,  69,  72,  26,  35,  17,  73,  60,   8,  56,   2,   6,  -2,  -5,
1030cabdff1aSopenharmony_ci     51,   4,  11,  50,  66,  76,  21,  44,  33,  47,   1,  26,  64,  48,  57,  40,
1031cabdff1aSopenharmony_ci     38,  16, -10, -28,  92,  22, -18,  29, -10,   5, -13,  49,  19,  24,  70,  34,
1032cabdff1aSopenharmony_ci     61,  48,  30,  14,  -6,  25,  58,  33,  42,  60,  67,  17,  54,  17,  22,  30,
1033cabdff1aSopenharmony_ci     67,  44,  -9,  50, -11,  43,  40,  32,  59,  82,  13,  49, -14,  55,  60,  36,
1034cabdff1aSopenharmony_ci     48,  49,  31,  47,  15,  12,   4,  65,   1,  23,  29,  39,  45,  -2,  84,  69,
1035cabdff1aSopenharmony_ci      0,  72,  37,  57,  27,  41, -15, -16,  35,  31,  14,  61,  24,   0,  27,  24,
1036cabdff1aSopenharmony_ci     16,  41,  55,  34,  53,   9,  56,  12,  25,  29,  53,   5,  20, -20,  -8,  20,
1037cabdff1aSopenharmony_ci     13,  28,  -3,  78,  38,  16,  11,  62,  46,  29,  21,  24,  46,  65,  43, -23,
1038cabdff1aSopenharmony_ci     89,  18,  74,  21,  38, -12,  19,  12, -19,   8,  15,  33,   4,  57,   9,  -8,
1039cabdff1aSopenharmony_ci     36,  35,  26,  28,   7,  83,  63,  79,  75,  11,   3,  87,  37,  47,  34,  40,
1040cabdff1aSopenharmony_ci     39,  19,  20,  42,  27,  34,  39,  77,  13,  42,  59,  64,  45,  -1,  32,  37,
1041cabdff1aSopenharmony_ci     45,  -5,  53,  -6,   7,  36,  50,  23,   6,  32,   9, -21,  18,  71,  27,  52,
1042cabdff1aSopenharmony_ci    -25,  31,  35,  42,  -1,  68,  63,  52,  26,  43,  66,  37,  41,  25,  40,  70,
1043cabdff1aSopenharmony_ci};
1044cabdff1aSopenharmony_ci
1045cabdff1aSopenharmony_ci/** Noise generation functions.
1046cabdff1aSopenharmony_ci *  I'm not sure what these are for - they seem to be some kind of pseudorandom
1047cabdff1aSopenharmony_ci *  sequence generators, used to generate noise data which is used when the
1048cabdff1aSopenharmony_ci *  channels are rematrixed. I'm not sure if they provide a practical benefit
1049cabdff1aSopenharmony_ci *  to compression, or just obfuscate the decoder. Are they for some kind of
1050cabdff1aSopenharmony_ci *  dithering? */
1051cabdff1aSopenharmony_ci
1052cabdff1aSopenharmony_ci/** Generate two channels of noise, used in the matrix when
1053cabdff1aSopenharmony_ci *  restart sync word == 0x31ea. */
1054cabdff1aSopenharmony_ci
1055cabdff1aSopenharmony_cistatic void generate_2_noise_channels(MLPDecodeContext *m, unsigned int substr)
1056cabdff1aSopenharmony_ci{
1057cabdff1aSopenharmony_ci    SubStream *s = &m->substream[substr];
1058cabdff1aSopenharmony_ci    unsigned int i;
1059cabdff1aSopenharmony_ci    uint32_t seed = s->noisegen_seed;
1060cabdff1aSopenharmony_ci    unsigned int maxchan = s->max_matrix_channel;
1061cabdff1aSopenharmony_ci
1062cabdff1aSopenharmony_ci    for (i = 0; i < s->blockpos; i++) {
1063cabdff1aSopenharmony_ci        uint16_t seed_shr7 = seed >> 7;
1064cabdff1aSopenharmony_ci        m->sample_buffer[i][maxchan+1] = ((int8_t)(seed >> 15)) * (1 << s->noise_shift);
1065cabdff1aSopenharmony_ci        m->sample_buffer[i][maxchan+2] = ((int8_t) seed_shr7)   * (1 << s->noise_shift);
1066cabdff1aSopenharmony_ci
1067cabdff1aSopenharmony_ci        seed = (seed << 16) ^ seed_shr7 ^ (seed_shr7 << 5);
1068cabdff1aSopenharmony_ci    }
1069cabdff1aSopenharmony_ci
1070cabdff1aSopenharmony_ci    s->noisegen_seed = seed;
1071cabdff1aSopenharmony_ci}
1072cabdff1aSopenharmony_ci
1073cabdff1aSopenharmony_ci/** Generate a block of noise, used when restart sync word == 0x31eb. */
1074cabdff1aSopenharmony_ci
1075cabdff1aSopenharmony_cistatic void fill_noise_buffer(MLPDecodeContext *m, unsigned int substr)
1076cabdff1aSopenharmony_ci{
1077cabdff1aSopenharmony_ci    SubStream *s = &m->substream[substr];
1078cabdff1aSopenharmony_ci    unsigned int i;
1079cabdff1aSopenharmony_ci    uint32_t seed = s->noisegen_seed;
1080cabdff1aSopenharmony_ci
1081cabdff1aSopenharmony_ci    for (i = 0; i < m->access_unit_size_pow2; i++) {
1082cabdff1aSopenharmony_ci        uint8_t seed_shr15 = seed >> 15;
1083cabdff1aSopenharmony_ci        m->noise_buffer[i] = noise_table[seed_shr15];
1084cabdff1aSopenharmony_ci        seed = (seed << 8) ^ seed_shr15 ^ (seed_shr15 << 5);
1085cabdff1aSopenharmony_ci    }
1086cabdff1aSopenharmony_ci
1087cabdff1aSopenharmony_ci    s->noisegen_seed = seed;
1088cabdff1aSopenharmony_ci}
1089cabdff1aSopenharmony_ci
1090cabdff1aSopenharmony_ci/** Write the audio data into the output buffer. */
1091cabdff1aSopenharmony_ci
1092cabdff1aSopenharmony_cistatic int output_data(MLPDecodeContext *m, unsigned int substr,
1093cabdff1aSopenharmony_ci                       AVFrame *frame, int *got_frame_ptr)
1094cabdff1aSopenharmony_ci{
1095cabdff1aSopenharmony_ci    AVCodecContext *avctx = m->avctx;
1096cabdff1aSopenharmony_ci    SubStream *s = &m->substream[substr];
1097cabdff1aSopenharmony_ci    unsigned int mat;
1098cabdff1aSopenharmony_ci    unsigned int maxchan;
1099cabdff1aSopenharmony_ci    int ret;
1100cabdff1aSopenharmony_ci    int is32 = (m->avctx->sample_fmt == AV_SAMPLE_FMT_S32);
1101cabdff1aSopenharmony_ci
1102cabdff1aSopenharmony_ci    if (m->avctx->ch_layout.nb_channels != s->max_matrix_channel + 1) {
1103cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_ERROR, "channel count mismatch\n");
1104cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1105cabdff1aSopenharmony_ci    }
1106cabdff1aSopenharmony_ci
1107cabdff1aSopenharmony_ci    if (!s->blockpos) {
1108cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "No samples to output.\n");
1109cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1110cabdff1aSopenharmony_ci    }
1111cabdff1aSopenharmony_ci
1112cabdff1aSopenharmony_ci    maxchan = s->max_matrix_channel;
1113cabdff1aSopenharmony_ci    if (!s->noise_type) {
1114cabdff1aSopenharmony_ci        generate_2_noise_channels(m, substr);
1115cabdff1aSopenharmony_ci        maxchan += 2;
1116cabdff1aSopenharmony_ci    } else {
1117cabdff1aSopenharmony_ci        fill_noise_buffer(m, substr);
1118cabdff1aSopenharmony_ci    }
1119cabdff1aSopenharmony_ci
1120cabdff1aSopenharmony_ci    /* Apply the channel matrices in turn to reconstruct the original audio
1121cabdff1aSopenharmony_ci     * samples. */
1122cabdff1aSopenharmony_ci    for (mat = 0; mat < s->num_primitive_matrices; mat++) {
1123cabdff1aSopenharmony_ci        unsigned int dest_ch = s->matrix_out_ch[mat];
1124cabdff1aSopenharmony_ci        m->dsp.mlp_rematrix_channel(&m->sample_buffer[0][0],
1125cabdff1aSopenharmony_ci                                    s->matrix_coeff[mat],
1126cabdff1aSopenharmony_ci                                    &m->bypassed_lsbs[0][mat],
1127cabdff1aSopenharmony_ci                                    m->noise_buffer,
1128cabdff1aSopenharmony_ci                                    s->num_primitive_matrices - mat,
1129cabdff1aSopenharmony_ci                                    dest_ch,
1130cabdff1aSopenharmony_ci                                    s->blockpos,
1131cabdff1aSopenharmony_ci                                    maxchan,
1132cabdff1aSopenharmony_ci                                    s->matrix_noise_shift[mat],
1133cabdff1aSopenharmony_ci                                    m->access_unit_size_pow2,
1134cabdff1aSopenharmony_ci                                    MSB_MASK(s->quant_step_size[dest_ch]));
1135cabdff1aSopenharmony_ci    }
1136cabdff1aSopenharmony_ci
1137cabdff1aSopenharmony_ci    /* get output buffer */
1138cabdff1aSopenharmony_ci    frame->nb_samples = s->blockpos;
1139cabdff1aSopenharmony_ci    if ((ret = ff_get_buffer(avctx, frame, 0)) < 0)
1140cabdff1aSopenharmony_ci        return ret;
1141cabdff1aSopenharmony_ci    s->lossless_check_data = m->dsp.mlp_pack_output(s->lossless_check_data,
1142cabdff1aSopenharmony_ci                                                    s->blockpos,
1143cabdff1aSopenharmony_ci                                                    m->sample_buffer,
1144cabdff1aSopenharmony_ci                                                    frame->data[0],
1145cabdff1aSopenharmony_ci                                                    s->ch_assign,
1146cabdff1aSopenharmony_ci                                                    s->output_shift,
1147cabdff1aSopenharmony_ci                                                    s->max_matrix_channel,
1148cabdff1aSopenharmony_ci                                                    is32);
1149cabdff1aSopenharmony_ci
1150cabdff1aSopenharmony_ci    /* Update matrix encoding side data */
1151cabdff1aSopenharmony_ci    if (s->matrix_encoding != s->prev_matrix_encoding) {
1152cabdff1aSopenharmony_ci        if ((ret = ff_side_data_update_matrix_encoding(frame, s->matrix_encoding)) < 0)
1153cabdff1aSopenharmony_ci            return ret;
1154cabdff1aSopenharmony_ci
1155cabdff1aSopenharmony_ci        s->prev_matrix_encoding = s->matrix_encoding;
1156cabdff1aSopenharmony_ci    }
1157cabdff1aSopenharmony_ci
1158cabdff1aSopenharmony_ci    *got_frame_ptr = 1;
1159cabdff1aSopenharmony_ci
1160cabdff1aSopenharmony_ci    return 0;
1161cabdff1aSopenharmony_ci}
1162cabdff1aSopenharmony_ci
1163cabdff1aSopenharmony_ci/** Read an access unit from the stream.
1164cabdff1aSopenharmony_ci *  @return negative on error, 0 if not enough data is present in the input stream,
1165cabdff1aSopenharmony_ci *  otherwise the number of bytes consumed. */
1166cabdff1aSopenharmony_ci
1167cabdff1aSopenharmony_cistatic int read_access_unit(AVCodecContext *avctx, AVFrame *frame,
1168cabdff1aSopenharmony_ci                            int *got_frame_ptr, AVPacket *avpkt)
1169cabdff1aSopenharmony_ci{
1170cabdff1aSopenharmony_ci    const uint8_t *buf = avpkt->data;
1171cabdff1aSopenharmony_ci    int buf_size = avpkt->size;
1172cabdff1aSopenharmony_ci    MLPDecodeContext *m = avctx->priv_data;
1173cabdff1aSopenharmony_ci    GetBitContext gb;
1174cabdff1aSopenharmony_ci    unsigned int length, substr;
1175cabdff1aSopenharmony_ci    unsigned int substream_start;
1176cabdff1aSopenharmony_ci    unsigned int header_size = 4;
1177cabdff1aSopenharmony_ci    unsigned int substr_header_size = 0;
1178cabdff1aSopenharmony_ci    uint8_t substream_parity_present[MAX_SUBSTREAMS];
1179cabdff1aSopenharmony_ci    uint16_t substream_data_len[MAX_SUBSTREAMS];
1180cabdff1aSopenharmony_ci    uint8_t parity_bits;
1181cabdff1aSopenharmony_ci    int ret;
1182cabdff1aSopenharmony_ci
1183cabdff1aSopenharmony_ci    if (buf_size < 4)
1184cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1185cabdff1aSopenharmony_ci
1186cabdff1aSopenharmony_ci    length = (AV_RB16(buf) & 0xfff) * 2;
1187cabdff1aSopenharmony_ci
1188cabdff1aSopenharmony_ci    if (length < 4 || length > buf_size)
1189cabdff1aSopenharmony_ci        return AVERROR_INVALIDDATA;
1190cabdff1aSopenharmony_ci
1191cabdff1aSopenharmony_ci    init_get_bits(&gb, (buf + 4), (length - 4) * 8);
1192cabdff1aSopenharmony_ci
1193cabdff1aSopenharmony_ci    m->is_major_sync_unit = 0;
1194cabdff1aSopenharmony_ci    if (show_bits_long(&gb, 31) == (0xf8726fba >> 1)) {
1195cabdff1aSopenharmony_ci        if (read_major_sync(m, &gb) < 0)
1196cabdff1aSopenharmony_ci            goto error;
1197cabdff1aSopenharmony_ci        m->is_major_sync_unit = 1;
1198cabdff1aSopenharmony_ci        header_size += m->major_sync_header_size;
1199cabdff1aSopenharmony_ci    }
1200cabdff1aSopenharmony_ci
1201cabdff1aSopenharmony_ci    if (!m->params_valid) {
1202cabdff1aSopenharmony_ci        av_log(m->avctx, AV_LOG_WARNING,
1203cabdff1aSopenharmony_ci               "Stream parameters not seen; skipping frame.\n");
1204cabdff1aSopenharmony_ci        *got_frame_ptr = 0;
1205cabdff1aSopenharmony_ci        return length;
1206cabdff1aSopenharmony_ci    }
1207cabdff1aSopenharmony_ci
1208cabdff1aSopenharmony_ci    substream_start = 0;
1209cabdff1aSopenharmony_ci
1210cabdff1aSopenharmony_ci    for (substr = 0; substr < m->num_substreams; substr++) {
1211cabdff1aSopenharmony_ci        int extraword_present, checkdata_present, end, nonrestart_substr;
1212cabdff1aSopenharmony_ci
1213cabdff1aSopenharmony_ci        extraword_present = get_bits1(&gb);
1214cabdff1aSopenharmony_ci        nonrestart_substr = get_bits1(&gb);
1215cabdff1aSopenharmony_ci        checkdata_present = get_bits1(&gb);
1216cabdff1aSopenharmony_ci        skip_bits1(&gb);
1217cabdff1aSopenharmony_ci
1218cabdff1aSopenharmony_ci        end = get_bits(&gb, 12) * 2;
1219cabdff1aSopenharmony_ci
1220cabdff1aSopenharmony_ci        substr_header_size += 2;
1221cabdff1aSopenharmony_ci
1222cabdff1aSopenharmony_ci        if (extraword_present) {
1223cabdff1aSopenharmony_ci            if (m->avctx->codec_id == AV_CODEC_ID_MLP) {
1224cabdff1aSopenharmony_ci                av_log(m->avctx, AV_LOG_ERROR, "There must be no extraword for MLP.\n");
1225cabdff1aSopenharmony_ci                goto error;
1226cabdff1aSopenharmony_ci            }
1227cabdff1aSopenharmony_ci            skip_bits(&gb, 16);
1228cabdff1aSopenharmony_ci            substr_header_size += 2;
1229cabdff1aSopenharmony_ci        }
1230cabdff1aSopenharmony_ci
1231cabdff1aSopenharmony_ci        if (length < header_size + substr_header_size) {
1232cabdff1aSopenharmony_ci            av_log(m->avctx, AV_LOG_ERROR, "Insufficient data for headers\n");
1233cabdff1aSopenharmony_ci            goto error;
1234cabdff1aSopenharmony_ci        }
1235cabdff1aSopenharmony_ci
1236cabdff1aSopenharmony_ci        if (!(nonrestart_substr ^ m->is_major_sync_unit)) {
1237cabdff1aSopenharmony_ci            av_log(m->avctx, AV_LOG_ERROR, "Invalid nonrestart_substr.\n");
1238cabdff1aSopenharmony_ci            goto error;
1239cabdff1aSopenharmony_ci        }
1240cabdff1aSopenharmony_ci
1241cabdff1aSopenharmony_ci        if (end + header_size + substr_header_size > length) {
1242cabdff1aSopenharmony_ci            av_log(m->avctx, AV_LOG_ERROR,
1243cabdff1aSopenharmony_ci                   "Indicated length of substream %d data goes off end of "
1244cabdff1aSopenharmony_ci                   "packet.\n", substr);
1245cabdff1aSopenharmony_ci            end = length - header_size - substr_header_size;
1246cabdff1aSopenharmony_ci        }
1247cabdff1aSopenharmony_ci
1248cabdff1aSopenharmony_ci        if (end < substream_start) {
1249cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR,
1250cabdff1aSopenharmony_ci                   "Indicated end offset of substream %d data "
1251cabdff1aSopenharmony_ci                   "is smaller than calculated start offset.\n",
1252cabdff1aSopenharmony_ci                   substr);
1253cabdff1aSopenharmony_ci            goto error;
1254cabdff1aSopenharmony_ci        }
1255cabdff1aSopenharmony_ci
1256cabdff1aSopenharmony_ci        if (substr > m->max_decoded_substream)
1257cabdff1aSopenharmony_ci            continue;
1258cabdff1aSopenharmony_ci
1259cabdff1aSopenharmony_ci        substream_parity_present[substr] = checkdata_present;
1260cabdff1aSopenharmony_ci        substream_data_len[substr] = end - substream_start;
1261cabdff1aSopenharmony_ci        substream_start = end;
1262cabdff1aSopenharmony_ci    }
1263cabdff1aSopenharmony_ci
1264cabdff1aSopenharmony_ci    parity_bits  = ff_mlp_calculate_parity(buf, 4);
1265cabdff1aSopenharmony_ci    parity_bits ^= ff_mlp_calculate_parity(buf + header_size, substr_header_size);
1266cabdff1aSopenharmony_ci
1267cabdff1aSopenharmony_ci    if ((((parity_bits >> 4) ^ parity_bits) & 0xF) != 0xF) {
1268cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Parity check failed.\n");
1269cabdff1aSopenharmony_ci        goto error;
1270cabdff1aSopenharmony_ci    }
1271cabdff1aSopenharmony_ci
1272cabdff1aSopenharmony_ci    buf += header_size + substr_header_size;
1273cabdff1aSopenharmony_ci
1274cabdff1aSopenharmony_ci    for (substr = 0; substr <= m->max_decoded_substream; substr++) {
1275cabdff1aSopenharmony_ci        SubStream *s = &m->substream[substr];
1276cabdff1aSopenharmony_ci
1277cabdff1aSopenharmony_ci        if (substr != m->max_decoded_substream &&
1278cabdff1aSopenharmony_ci            m->substream[m->max_decoded_substream].min_channel == 0 &&
1279cabdff1aSopenharmony_ci            m->substream[m->max_decoded_substream].max_channel == avctx->ch_layout.nb_channels - 1)
1280cabdff1aSopenharmony_ci            goto skip_substr;
1281cabdff1aSopenharmony_ci
1282cabdff1aSopenharmony_ci        init_get_bits(&gb, buf, substream_data_len[substr] * 8);
1283cabdff1aSopenharmony_ci
1284cabdff1aSopenharmony_ci        m->matrix_changed = 0;
1285cabdff1aSopenharmony_ci        memset(m->filter_changed, 0, sizeof(m->filter_changed));
1286cabdff1aSopenharmony_ci
1287cabdff1aSopenharmony_ci        s->blockpos = 0;
1288cabdff1aSopenharmony_ci        do {
1289cabdff1aSopenharmony_ci            if (get_bits1(&gb)) {
1290cabdff1aSopenharmony_ci                if (get_bits1(&gb)) {
1291cabdff1aSopenharmony_ci                    /* A restart header should be present. */
1292cabdff1aSopenharmony_ci                    if (read_restart_header(m, &gb, buf, substr) < 0)
1293cabdff1aSopenharmony_ci                        goto next_substr;
1294cabdff1aSopenharmony_ci                    s->restart_seen = 1;
1295cabdff1aSopenharmony_ci                }
1296cabdff1aSopenharmony_ci
1297cabdff1aSopenharmony_ci                if (!s->restart_seen)
1298cabdff1aSopenharmony_ci                    goto next_substr;
1299cabdff1aSopenharmony_ci                if (read_decoding_params(m, &gb, substr) < 0)
1300cabdff1aSopenharmony_ci                    goto next_substr;
1301cabdff1aSopenharmony_ci            }
1302cabdff1aSopenharmony_ci
1303cabdff1aSopenharmony_ci            if (!s->restart_seen)
1304cabdff1aSopenharmony_ci                goto next_substr;
1305cabdff1aSopenharmony_ci
1306cabdff1aSopenharmony_ci            if ((ret = read_block_data(m, &gb, substr)) < 0)
1307cabdff1aSopenharmony_ci                return ret;
1308cabdff1aSopenharmony_ci
1309cabdff1aSopenharmony_ci            if (get_bits_count(&gb) >= substream_data_len[substr] * 8)
1310cabdff1aSopenharmony_ci                goto substream_length_mismatch;
1311cabdff1aSopenharmony_ci
1312cabdff1aSopenharmony_ci        } while (!get_bits1(&gb));
1313cabdff1aSopenharmony_ci
1314cabdff1aSopenharmony_ci        skip_bits(&gb, (-get_bits_count(&gb)) & 15);
1315cabdff1aSopenharmony_ci
1316cabdff1aSopenharmony_ci        if (substream_data_len[substr] * 8 - get_bits_count(&gb) >= 32) {
1317cabdff1aSopenharmony_ci            int shorten_by;
1318cabdff1aSopenharmony_ci
1319cabdff1aSopenharmony_ci            if (get_bits(&gb, 16) != 0xD234)
1320cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1321cabdff1aSopenharmony_ci
1322cabdff1aSopenharmony_ci            shorten_by = get_bits(&gb, 16);
1323cabdff1aSopenharmony_ci            if      (m->avctx->codec_id == AV_CODEC_ID_TRUEHD && shorten_by  & 0x2000)
1324cabdff1aSopenharmony_ci                s->blockpos -= FFMIN(shorten_by & 0x1FFF, s->blockpos);
1325cabdff1aSopenharmony_ci            else if (m->avctx->codec_id == AV_CODEC_ID_MLP    && shorten_by != 0xD234)
1326cabdff1aSopenharmony_ci                return AVERROR_INVALIDDATA;
1327cabdff1aSopenharmony_ci
1328cabdff1aSopenharmony_ci            av_log(m->avctx, AV_LOG_DEBUG, "End of stream indicated.\n");
1329cabdff1aSopenharmony_ci            s->end_of_stream = 1;
1330cabdff1aSopenharmony_ci        }
1331cabdff1aSopenharmony_ci
1332cabdff1aSopenharmony_ci        if (substream_parity_present[substr]) {
1333cabdff1aSopenharmony_ci            uint8_t parity, checksum;
1334cabdff1aSopenharmony_ci
1335cabdff1aSopenharmony_ci            if (substream_data_len[substr] * 8 - get_bits_count(&gb) != 16)
1336cabdff1aSopenharmony_ci                goto substream_length_mismatch;
1337cabdff1aSopenharmony_ci
1338cabdff1aSopenharmony_ci            parity   = ff_mlp_calculate_parity(buf, substream_data_len[substr] - 2);
1339cabdff1aSopenharmony_ci            checksum = ff_mlp_checksum8       (buf, substream_data_len[substr] - 2);
1340cabdff1aSopenharmony_ci
1341cabdff1aSopenharmony_ci            if ((get_bits(&gb, 8) ^ parity) != 0xa9    )
1342cabdff1aSopenharmony_ci                av_log(m->avctx, AV_LOG_ERROR, "Substream %d parity check failed.\n", substr);
1343cabdff1aSopenharmony_ci            if ( get_bits(&gb, 8)           != checksum)
1344cabdff1aSopenharmony_ci                av_log(m->avctx, AV_LOG_ERROR, "Substream %d checksum failed.\n"    , substr);
1345cabdff1aSopenharmony_ci        }
1346cabdff1aSopenharmony_ci
1347cabdff1aSopenharmony_ci        if (substream_data_len[substr] * 8 != get_bits_count(&gb))
1348cabdff1aSopenharmony_ci            goto substream_length_mismatch;
1349cabdff1aSopenharmony_ci
1350cabdff1aSopenharmony_cinext_substr:
1351cabdff1aSopenharmony_ci        if (!s->restart_seen)
1352cabdff1aSopenharmony_ci            av_log(m->avctx, AV_LOG_ERROR,
1353cabdff1aSopenharmony_ci                   "No restart header present in substream %d.\n", substr);
1354cabdff1aSopenharmony_ci
1355cabdff1aSopenharmony_ciskip_substr:
1356cabdff1aSopenharmony_ci        buf += substream_data_len[substr];
1357cabdff1aSopenharmony_ci    }
1358cabdff1aSopenharmony_ci
1359cabdff1aSopenharmony_ci    if ((ret = output_data(m, m->max_decoded_substream, frame, got_frame_ptr)) < 0)
1360cabdff1aSopenharmony_ci        return ret;
1361cabdff1aSopenharmony_ci
1362cabdff1aSopenharmony_ci    for (substr = 0; substr <= m->max_decoded_substream; substr++){
1363cabdff1aSopenharmony_ci        SubStream *s = &m->substream[substr];
1364cabdff1aSopenharmony_ci
1365cabdff1aSopenharmony_ci        if (s->end_of_stream) {
1366cabdff1aSopenharmony_ci            s->lossless_check_data = 0xffffffff;
1367cabdff1aSopenharmony_ci            s->end_of_stream = 0;
1368cabdff1aSopenharmony_ci            m->params_valid = 0;
1369cabdff1aSopenharmony_ci        }
1370cabdff1aSopenharmony_ci    }
1371cabdff1aSopenharmony_ci
1372cabdff1aSopenharmony_ci    return length;
1373cabdff1aSopenharmony_ci
1374cabdff1aSopenharmony_cisubstream_length_mismatch:
1375cabdff1aSopenharmony_ci    av_log(m->avctx, AV_LOG_ERROR, "substream %d length mismatch\n", substr);
1376cabdff1aSopenharmony_ci    return AVERROR_INVALIDDATA;
1377cabdff1aSopenharmony_ci
1378cabdff1aSopenharmony_cierror:
1379cabdff1aSopenharmony_ci    m->params_valid = 0;
1380cabdff1aSopenharmony_ci    return AVERROR_INVALIDDATA;
1381cabdff1aSopenharmony_ci}
1382cabdff1aSopenharmony_ci
1383cabdff1aSopenharmony_cistatic void mlp_decode_flush(AVCodecContext *avctx)
1384cabdff1aSopenharmony_ci{
1385cabdff1aSopenharmony_ci    MLPDecodeContext *m = avctx->priv_data;
1386cabdff1aSopenharmony_ci
1387cabdff1aSopenharmony_ci    m->params_valid = 0;
1388cabdff1aSopenharmony_ci    for (int substr = 0; substr <= m->max_decoded_substream; substr++){
1389cabdff1aSopenharmony_ci        SubStream *s = &m->substream[substr];
1390cabdff1aSopenharmony_ci
1391cabdff1aSopenharmony_ci        s->lossless_check_data = 0xffffffff;
1392cabdff1aSopenharmony_ci        s->prev_matrix_encoding = 0;
1393cabdff1aSopenharmony_ci    }
1394cabdff1aSopenharmony_ci}
1395cabdff1aSopenharmony_ci
1396cabdff1aSopenharmony_ci#define OFFSET(x) offsetof(MLPDecodeContext, x)
1397cabdff1aSopenharmony_ci#define FLAGS (AV_OPT_FLAG_DECODING_PARAM | AV_OPT_FLAG_AUDIO_PARAM)
1398cabdff1aSopenharmony_cistatic const AVOption options[] = {
1399cabdff1aSopenharmony_ci    { "downmix", "Request a specific channel layout from the decoder", OFFSET(downmix_layout),
1400cabdff1aSopenharmony_ci        AV_OPT_TYPE_CHLAYOUT, {.str = NULL}, .flags = FLAGS },
1401cabdff1aSopenharmony_ci    { NULL },
1402cabdff1aSopenharmony_ci};
1403cabdff1aSopenharmony_ci
1404cabdff1aSopenharmony_cistatic const AVClass mlp_decoder_class = {
1405cabdff1aSopenharmony_ci    .class_name = "MLP decoder",
1406cabdff1aSopenharmony_ci    .item_name  = av_default_item_name,
1407cabdff1aSopenharmony_ci    .option     = options,
1408cabdff1aSopenharmony_ci    .version    = LIBAVUTIL_VERSION_INT,
1409cabdff1aSopenharmony_ci};
1410cabdff1aSopenharmony_ci
1411cabdff1aSopenharmony_cistatic const AVClass truehd_decoder_class = {
1412cabdff1aSopenharmony_ci    .class_name = "TrueHD decoder",
1413cabdff1aSopenharmony_ci    .item_name  = av_default_item_name,
1414cabdff1aSopenharmony_ci    .option     = options,
1415cabdff1aSopenharmony_ci    .version    = LIBAVUTIL_VERSION_INT,
1416cabdff1aSopenharmony_ci};
1417cabdff1aSopenharmony_ci
1418cabdff1aSopenharmony_ci#if CONFIG_MLP_DECODER
1419cabdff1aSopenharmony_ciconst FFCodec ff_mlp_decoder = {
1420cabdff1aSopenharmony_ci    .p.name         = "mlp",
1421cabdff1aSopenharmony_ci    .p.long_name    = NULL_IF_CONFIG_SMALL("MLP (Meridian Lossless Packing)"),
1422cabdff1aSopenharmony_ci    .p.type         = AVMEDIA_TYPE_AUDIO,
1423cabdff1aSopenharmony_ci    .p.id           = AV_CODEC_ID_MLP,
1424cabdff1aSopenharmony_ci    .priv_data_size = sizeof(MLPDecodeContext),
1425cabdff1aSopenharmony_ci    .p.priv_class   = &mlp_decoder_class,
1426cabdff1aSopenharmony_ci    .init           = mlp_decode_init,
1427cabdff1aSopenharmony_ci    FF_CODEC_DECODE_CB(read_access_unit),
1428cabdff1aSopenharmony_ci    .flush          = mlp_decode_flush,
1429cabdff1aSopenharmony_ci    .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
1430cabdff1aSopenharmony_ci    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
1431cabdff1aSopenharmony_ci};
1432cabdff1aSopenharmony_ci#endif
1433cabdff1aSopenharmony_ci#if CONFIG_TRUEHD_DECODER
1434cabdff1aSopenharmony_ciconst FFCodec ff_truehd_decoder = {
1435cabdff1aSopenharmony_ci    .p.name         = "truehd",
1436cabdff1aSopenharmony_ci    .p.long_name    = NULL_IF_CONFIG_SMALL("TrueHD"),
1437cabdff1aSopenharmony_ci    .p.type         = AVMEDIA_TYPE_AUDIO,
1438cabdff1aSopenharmony_ci    .p.id           = AV_CODEC_ID_TRUEHD,
1439cabdff1aSopenharmony_ci    .priv_data_size = sizeof(MLPDecodeContext),
1440cabdff1aSopenharmony_ci    .p.priv_class   = &truehd_decoder_class,
1441cabdff1aSopenharmony_ci    .init           = mlp_decode_init,
1442cabdff1aSopenharmony_ci    FF_CODEC_DECODE_CB(read_access_unit),
1443cabdff1aSopenharmony_ci    .flush          = mlp_decode_flush,
1444cabdff1aSopenharmony_ci    .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF,
1445cabdff1aSopenharmony_ci    .caps_internal  = FF_CODEC_CAP_INIT_THREADSAFE,
1446cabdff1aSopenharmony_ci};
1447cabdff1aSopenharmony_ci#endif /* CONFIG_TRUEHD_DECODER */
1448