1cabdff1aSopenharmony_ci/**
2cabdff1aSopenharmony_ci * MLP encoder
3cabdff1aSopenharmony_ci * Copyright (c) 2008 Ramiro Polla
4cabdff1aSopenharmony_ci * Copyright (c) 2016-2019 Jai Luthra
5cabdff1aSopenharmony_ci *
6cabdff1aSopenharmony_ci * This file is part of FFmpeg.
7cabdff1aSopenharmony_ci *
8cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or
9cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public
10cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either
11cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version.
12cabdff1aSopenharmony_ci *
13cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful,
14cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of
15cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16cabdff1aSopenharmony_ci * Lesser General Public License for more details.
17cabdff1aSopenharmony_ci *
18cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public
19cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software
20cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21cabdff1aSopenharmony_ci */
22cabdff1aSopenharmony_ci
23cabdff1aSopenharmony_ci#include "config_components.h"
24cabdff1aSopenharmony_ci
25cabdff1aSopenharmony_ci#include "avcodec.h"
26cabdff1aSopenharmony_ci#include "codec_internal.h"
27cabdff1aSopenharmony_ci#include "encode.h"
28cabdff1aSopenharmony_ci#include "put_bits.h"
29cabdff1aSopenharmony_ci#include "audio_frame_queue.h"
30cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h"
31cabdff1aSopenharmony_ci#include "libavutil/crc.h"
32cabdff1aSopenharmony_ci#include "libavutil/avstring.h"
33cabdff1aSopenharmony_ci#include "libavutil/intmath.h"
34cabdff1aSopenharmony_ci#include "libavutil/samplefmt.h"
35cabdff1aSopenharmony_ci#include "libavutil/thread.h"
36cabdff1aSopenharmony_ci#include "mlp.h"
37cabdff1aSopenharmony_ci#include "lpc.h"
38cabdff1aSopenharmony_ci
39cabdff1aSopenharmony_ci#define MAJOR_HEADER_INTERVAL 16
40cabdff1aSopenharmony_ci
41cabdff1aSopenharmony_ci#define MLP_MIN_LPC_ORDER      1
42cabdff1aSopenharmony_ci#define MLP_MAX_LPC_ORDER      8
43cabdff1aSopenharmony_ci#define MLP_MIN_LPC_SHIFT      8
44cabdff1aSopenharmony_ci#define MLP_MAX_LPC_SHIFT     15
45cabdff1aSopenharmony_ci
46cabdff1aSopenharmony_citypedef struct {
47cabdff1aSopenharmony_ci    uint8_t         min_channel;         ///< The index of the first channel coded in this substream.
48cabdff1aSopenharmony_ci    uint8_t         max_channel;         ///< The index of the last channel coded in this substream.
49cabdff1aSopenharmony_ci    uint8_t         max_matrix_channel;  ///< The number of channels input into the rematrix stage.
50cabdff1aSopenharmony_ci
51cabdff1aSopenharmony_ci    uint8_t         noise_shift;         ///< The left shift applied to random noise in 0x31ea substreams.
52cabdff1aSopenharmony_ci    uint32_t        noisegen_seed;       ///< The current seed value for the pseudorandom noise generator(s).
53cabdff1aSopenharmony_ci
54cabdff1aSopenharmony_ci    int             data_check_present;  ///< Set if the substream contains extra info to check the size of VLC blocks.
55cabdff1aSopenharmony_ci
56cabdff1aSopenharmony_ci    int32_t         lossless_check_data; ///< XOR of all output samples
57cabdff1aSopenharmony_ci
58cabdff1aSopenharmony_ci    uint8_t         max_huff_lsbs;       ///< largest huff_lsbs
59cabdff1aSopenharmony_ci    uint8_t         max_output_bits;     ///< largest output bit-depth
60cabdff1aSopenharmony_ci} RestartHeader;
61cabdff1aSopenharmony_ci
62cabdff1aSopenharmony_citypedef struct {
63cabdff1aSopenharmony_ci    uint8_t         count;                  ///< number of matrices to apply
64cabdff1aSopenharmony_ci
65cabdff1aSopenharmony_ci    uint8_t         outch[MAX_MATRICES];    ///< output channel for each matrix
66cabdff1aSopenharmony_ci    int32_t         forco[MAX_MATRICES][MAX_CHANNELS+2];    ///< forward coefficients
67cabdff1aSopenharmony_ci    int32_t         coeff[MAX_MATRICES][MAX_CHANNELS+2];    ///< decoding coefficients
68cabdff1aSopenharmony_ci    uint8_t         fbits[MAX_CHANNELS];    ///< fraction bits
69cabdff1aSopenharmony_ci
70cabdff1aSopenharmony_ci    int8_t          shift[MAX_CHANNELS];    ///< Left shift to apply to decoded PCM values to get final 24-bit output.
71cabdff1aSopenharmony_ci} MatrixParams;
72cabdff1aSopenharmony_ci
73cabdff1aSopenharmony_cienum ParamFlags {
74cabdff1aSopenharmony_ci    PARAMS_DEFAULT       = 0xff,
75cabdff1aSopenharmony_ci    PARAM_PRESENCE_FLAGS = 1 << 8,
76cabdff1aSopenharmony_ci    PARAM_BLOCKSIZE      = 1 << 7,
77cabdff1aSopenharmony_ci    PARAM_MATRIX         = 1 << 6,
78cabdff1aSopenharmony_ci    PARAM_OUTSHIFT       = 1 << 5,
79cabdff1aSopenharmony_ci    PARAM_QUANTSTEP      = 1 << 4,
80cabdff1aSopenharmony_ci    PARAM_FIR            = 1 << 3,
81cabdff1aSopenharmony_ci    PARAM_IIR            = 1 << 2,
82cabdff1aSopenharmony_ci    PARAM_HUFFOFFSET     = 1 << 1,
83cabdff1aSopenharmony_ci    PARAM_PRESENT        = 1 << 0,
84cabdff1aSopenharmony_ci};
85cabdff1aSopenharmony_ci
86cabdff1aSopenharmony_citypedef struct {
87cabdff1aSopenharmony_ci    uint16_t        blocksize;                  ///< number of PCM samples in current audio block
88cabdff1aSopenharmony_ci    uint8_t         quant_step_size[MAX_CHANNELS];  ///< left shift to apply to Huffman-decoded residuals
89cabdff1aSopenharmony_ci
90cabdff1aSopenharmony_ci    MatrixParams    matrix_params;
91cabdff1aSopenharmony_ci
92cabdff1aSopenharmony_ci    uint8_t         param_presence_flags;       ///< Bitmask of which parameter sets are conveyed in a decoding parameter block.
93cabdff1aSopenharmony_ci} DecodingParams;
94cabdff1aSopenharmony_ci
95cabdff1aSopenharmony_citypedef struct BestOffset {
96cabdff1aSopenharmony_ci    int32_t offset;
97cabdff1aSopenharmony_ci    int bitcount;
98cabdff1aSopenharmony_ci    int lsb_bits;
99cabdff1aSopenharmony_ci    int32_t min;
100cabdff1aSopenharmony_ci    int32_t max;
101cabdff1aSopenharmony_ci} BestOffset;
102cabdff1aSopenharmony_ci
103cabdff1aSopenharmony_ci#define HUFF_OFFSET_MIN    (-16384)
104cabdff1aSopenharmony_ci#define HUFF_OFFSET_MAX    ( 16383)
105cabdff1aSopenharmony_ci
106cabdff1aSopenharmony_ci/** Number of possible codebooks (counting "no codebooks") */
107cabdff1aSopenharmony_ci#define NUM_CODEBOOKS       4
108cabdff1aSopenharmony_ci
109cabdff1aSopenharmony_citypedef struct MLPEncodeContext {
110cabdff1aSopenharmony_ci    AVCodecContext *avctx;
111cabdff1aSopenharmony_ci
112cabdff1aSopenharmony_ci    int             num_substreams;         ///< Number of substreams contained within this stream.
113cabdff1aSopenharmony_ci
114cabdff1aSopenharmony_ci    int             num_channels;   /**< Number of channels in major_scratch_buffer.
115cabdff1aSopenharmony_ci                                     *   Normal channels + noise channels. */
116cabdff1aSopenharmony_ci
117cabdff1aSopenharmony_ci    int             coded_sample_fmt [2];   ///< sample format encoded for MLP
118cabdff1aSopenharmony_ci    int             coded_sample_rate[2];   ///< sample rate encoded for MLP
119cabdff1aSopenharmony_ci    int             coded_peak_bitrate;     ///< peak bitrate for this major sync header
120cabdff1aSopenharmony_ci
121cabdff1aSopenharmony_ci    int             flags;                  ///< major sync info flags
122cabdff1aSopenharmony_ci
123cabdff1aSopenharmony_ci    /* channel_meaning */
124cabdff1aSopenharmony_ci    int             substream_info;
125cabdff1aSopenharmony_ci    int             fs;
126cabdff1aSopenharmony_ci    int             wordlength;
127cabdff1aSopenharmony_ci    int             channel_occupancy;
128cabdff1aSopenharmony_ci    int             summary_info;
129cabdff1aSopenharmony_ci
130cabdff1aSopenharmony_ci    int32_t        *inout_buffer;           ///< Pointer to data currently being read from lavc or written to bitstream.
131cabdff1aSopenharmony_ci    int32_t        *major_inout_buffer;     ///< Buffer with all in/out data for one entire major frame interval.
132cabdff1aSopenharmony_ci    int32_t        *write_buffer;           ///< Pointer to data currently being written to bitstream.
133cabdff1aSopenharmony_ci    int32_t        *sample_buffer;          ///< Pointer to current access unit samples.
134cabdff1aSopenharmony_ci    int32_t        *major_scratch_buffer;   ///< Scratch buffer big enough to fit all data for one entire major frame interval.
135cabdff1aSopenharmony_ci    int32_t         last_frames;            ///< Signal last frames.
136cabdff1aSopenharmony_ci
137cabdff1aSopenharmony_ci    int32_t        *lpc_sample_buffer;
138cabdff1aSopenharmony_ci
139cabdff1aSopenharmony_ci    unsigned int    major_number_of_frames;
140cabdff1aSopenharmony_ci    unsigned int    next_major_number_of_frames;
141cabdff1aSopenharmony_ci
142cabdff1aSopenharmony_ci    unsigned int    major_frame_size;       ///< Number of samples in current major frame being encoded.
143cabdff1aSopenharmony_ci    unsigned int    next_major_frame_size;  ///< Counter of number of samples for next major frame.
144cabdff1aSopenharmony_ci
145cabdff1aSopenharmony_ci    int32_t        *lossless_check_data;    ///< Array with lossless_check_data for each access unit.
146cabdff1aSopenharmony_ci
147cabdff1aSopenharmony_ci    unsigned int   *max_output_bits;        ///< largest output bit-depth
148cabdff1aSopenharmony_ci    unsigned int    frame_index;            ///< Index of current frame being encoded.
149cabdff1aSopenharmony_ci
150cabdff1aSopenharmony_ci    unsigned int    one_sample_buffer_size; ///< Number of samples*channel for one access unit.
151cabdff1aSopenharmony_ci
152cabdff1aSopenharmony_ci    unsigned int    max_restart_interval;   ///< Max interval of access units in between two major frames.
153cabdff1aSopenharmony_ci    unsigned int    min_restart_interval;   ///< Min interval of access units in between two major frames.
154cabdff1aSopenharmony_ci    unsigned int    restart_intervals;      ///< Number of possible major frame sizes.
155cabdff1aSopenharmony_ci
156cabdff1aSopenharmony_ci    uint16_t        timestamp;              ///< Timestamp of current access unit.
157cabdff1aSopenharmony_ci    uint16_t        dts;                    ///< Decoding timestamp of current access unit.
158cabdff1aSopenharmony_ci
159cabdff1aSopenharmony_ci    uint8_t         channel_arrangement;    ///< channel arrangement for MLP streams
160cabdff1aSopenharmony_ci
161cabdff1aSopenharmony_ci    uint8_t         ch_modifier_thd0;       ///< channel modifier for TrueHD stream 0
162cabdff1aSopenharmony_ci    uint8_t         ch_modifier_thd1;       ///< channel modifier for TrueHD stream 1
163cabdff1aSopenharmony_ci    uint8_t         ch_modifier_thd2;       ///< channel modifier for TrueHD stream 2
164cabdff1aSopenharmony_ci
165cabdff1aSopenharmony_ci    unsigned int    seq_size  [MAJOR_HEADER_INTERVAL];
166cabdff1aSopenharmony_ci    unsigned int    seq_offset[MAJOR_HEADER_INTERVAL];
167cabdff1aSopenharmony_ci    unsigned int    sequence_size;
168cabdff1aSopenharmony_ci
169cabdff1aSopenharmony_ci    ChannelParams  *channel_params;
170cabdff1aSopenharmony_ci
171cabdff1aSopenharmony_ci    BestOffset      best_offset[MAJOR_HEADER_INTERVAL+1][MAX_CHANNELS][NUM_CODEBOOKS];
172cabdff1aSopenharmony_ci
173cabdff1aSopenharmony_ci    DecodingParams *decoding_params;
174cabdff1aSopenharmony_ci    RestartHeader   restart_header;
175cabdff1aSopenharmony_ci
176cabdff1aSopenharmony_ci    ChannelParams   major_channel_params[MAJOR_HEADER_INTERVAL+1][MAX_CHANNELS];       ///< ChannelParams to be written to bitstream.
177cabdff1aSopenharmony_ci    DecodingParams  major_decoding_params[MAJOR_HEADER_INTERVAL+1];                    ///< DecodingParams to be written to bitstream.
178cabdff1aSopenharmony_ci    int             major_params_changed[MAJOR_HEADER_INTERVAL+1];                     ///< params_changed to be written to bitstream.
179cabdff1aSopenharmony_ci
180cabdff1aSopenharmony_ci    unsigned int    major_cur_subblock_index;
181cabdff1aSopenharmony_ci    unsigned int    major_filter_state_subblock;
182cabdff1aSopenharmony_ci    unsigned int    major_number_of_subblocks;
183cabdff1aSopenharmony_ci
184cabdff1aSopenharmony_ci    BestOffset    (*cur_best_offset)[NUM_CODEBOOKS];
185cabdff1aSopenharmony_ci    ChannelParams  *cur_channel_params;
186cabdff1aSopenharmony_ci    DecodingParams *cur_decoding_params;
187cabdff1aSopenharmony_ci    RestartHeader  *cur_restart_header;
188cabdff1aSopenharmony_ci
189cabdff1aSopenharmony_ci    AudioFrameQueue afq;
190cabdff1aSopenharmony_ci
191cabdff1aSopenharmony_ci    /* Analysis stage. */
192cabdff1aSopenharmony_ci    unsigned int    number_of_frames;
193cabdff1aSopenharmony_ci    unsigned int    number_of_samples;
194cabdff1aSopenharmony_ci    unsigned int    number_of_subblocks;
195cabdff1aSopenharmony_ci    unsigned int    seq_index;              ///< Sequence index for high compression levels.
196cabdff1aSopenharmony_ci
197cabdff1aSopenharmony_ci    const ChannelParams  *prev_channel_params;
198cabdff1aSopenharmony_ci    const DecodingParams *prev_decoding_params;
199cabdff1aSopenharmony_ci
200cabdff1aSopenharmony_ci    ChannelParams  *seq_channel_params;
201cabdff1aSopenharmony_ci    DecodingParams *seq_decoding_params;
202cabdff1aSopenharmony_ci
203cabdff1aSopenharmony_ci    int32_t *filter_state_buffer[NUM_FILTERS];
204cabdff1aSopenharmony_ci
205cabdff1aSopenharmony_ci    unsigned int    max_codebook_search;
206cabdff1aSopenharmony_ci
207cabdff1aSopenharmony_ci    int             shorten_by;
208cabdff1aSopenharmony_ci
209cabdff1aSopenharmony_ci    LPCContext      lpc_ctx;
210cabdff1aSopenharmony_ci} MLPEncodeContext;
211cabdff1aSopenharmony_ci
212cabdff1aSopenharmony_cistatic ChannelParams   restart_channel_params[MAX_CHANNELS];
213cabdff1aSopenharmony_cistatic DecodingParams  restart_decoding_params[MAX_SUBSTREAMS];
214cabdff1aSopenharmony_cistatic const BestOffset restart_best_offset[NUM_CODEBOOKS] = {{0}};
215cabdff1aSopenharmony_ci
216cabdff1aSopenharmony_ci#define SYNC_MAJOR      0xf8726f
217cabdff1aSopenharmony_ci#define MAJOR_SYNC_INFO_SIGNATURE   0xB752
218cabdff1aSopenharmony_ci
219cabdff1aSopenharmony_ci/* must be set for DVD-A */
220cabdff1aSopenharmony_ci#define FLAGS_DVDA      0x4000
221cabdff1aSopenharmony_ci/* FIFO delay must be constant */
222cabdff1aSopenharmony_ci#define FLAGS_CONST     0x8000
223cabdff1aSopenharmony_ci
224cabdff1aSopenharmony_ci#define SUBSTREAM_INFO_MAX_2_CHAN   0x01
225cabdff1aSopenharmony_ci#define SUBSTREAM_INFO_HIGH_RATE    0x02
226cabdff1aSopenharmony_ci#define SUBSTREAM_INFO_ALWAYS_SET   0x04
227cabdff1aSopenharmony_ci#define SUBSTREAM_INFO_2_SUBSTREAMS 0x08
228cabdff1aSopenharmony_ci
229cabdff1aSopenharmony_ci/****************************************************************************
230cabdff1aSopenharmony_ci ************ Functions that copy, clear, or compare parameters *************
231cabdff1aSopenharmony_ci ****************************************************************************/
232cabdff1aSopenharmony_ci
233cabdff1aSopenharmony_ci/** Compares two FilterParams structures and returns 1 if anything has
234cabdff1aSopenharmony_ci *  changed. Returns 0 if they are both equal.
235cabdff1aSopenharmony_ci */
236cabdff1aSopenharmony_cistatic int compare_filter_params(const ChannelParams *prev_cp, const ChannelParams *cp, int filter)
237cabdff1aSopenharmony_ci{
238cabdff1aSopenharmony_ci    const FilterParams *prev = &prev_cp->filter_params[filter];
239cabdff1aSopenharmony_ci    const FilterParams *fp = &cp->filter_params[filter];
240cabdff1aSopenharmony_ci
241cabdff1aSopenharmony_ci    if (prev->order != fp->order)
242cabdff1aSopenharmony_ci        return 1;
243cabdff1aSopenharmony_ci
244cabdff1aSopenharmony_ci    if (!prev->order)
245cabdff1aSopenharmony_ci        return 0;
246cabdff1aSopenharmony_ci
247cabdff1aSopenharmony_ci    if (prev->shift != fp->shift)
248cabdff1aSopenharmony_ci        return 1;
249cabdff1aSopenharmony_ci
250cabdff1aSopenharmony_ci    for (int i = 0; i < fp->order; i++)
251cabdff1aSopenharmony_ci        if (prev_cp->coeff[filter][i] != cp->coeff[filter][i])
252cabdff1aSopenharmony_ci            return 1;
253cabdff1aSopenharmony_ci
254cabdff1aSopenharmony_ci    return 0;
255cabdff1aSopenharmony_ci}
256cabdff1aSopenharmony_ci
257cabdff1aSopenharmony_ci/** Compare two primitive matrices and returns 1 if anything has changed.
258cabdff1aSopenharmony_ci *  Returns 0 if they are both equal.
259cabdff1aSopenharmony_ci */
260cabdff1aSopenharmony_cistatic int compare_matrix_params(MLPEncodeContext *ctx, const MatrixParams *prev, const MatrixParams *mp)
261cabdff1aSopenharmony_ci{
262cabdff1aSopenharmony_ci    RestartHeader *rh = ctx->cur_restart_header;
263cabdff1aSopenharmony_ci
264cabdff1aSopenharmony_ci    if (prev->count != mp->count)
265cabdff1aSopenharmony_ci        return 1;
266cabdff1aSopenharmony_ci
267cabdff1aSopenharmony_ci    if (!prev->count)
268cabdff1aSopenharmony_ci        return 0;
269cabdff1aSopenharmony_ci
270cabdff1aSopenharmony_ci    for (unsigned int channel = rh->min_channel; channel <= rh->max_channel; channel++)
271cabdff1aSopenharmony_ci        if (prev->fbits[channel] != mp->fbits[channel])
272cabdff1aSopenharmony_ci            return 1;
273cabdff1aSopenharmony_ci
274cabdff1aSopenharmony_ci    for (unsigned int mat = 0; mat < mp->count; mat++) {
275cabdff1aSopenharmony_ci        if (prev->outch[mat] != mp->outch[mat])
276cabdff1aSopenharmony_ci            return 1;
277cabdff1aSopenharmony_ci
278cabdff1aSopenharmony_ci        for (unsigned int channel = 0; channel < ctx->num_channels; channel++)
279cabdff1aSopenharmony_ci            if (prev->coeff[mat][channel] != mp->coeff[mat][channel])
280cabdff1aSopenharmony_ci                return 1;
281cabdff1aSopenharmony_ci    }
282cabdff1aSopenharmony_ci
283cabdff1aSopenharmony_ci    return 0;
284cabdff1aSopenharmony_ci}
285cabdff1aSopenharmony_ci
286cabdff1aSopenharmony_ci/** Compares two DecodingParams and ChannelParams structures to decide if a
287cabdff1aSopenharmony_ci *  new decoding params header has to be written.
288cabdff1aSopenharmony_ci */
289cabdff1aSopenharmony_cistatic int compare_decoding_params(MLPEncodeContext *ctx)
290cabdff1aSopenharmony_ci{
291cabdff1aSopenharmony_ci    const DecodingParams *prev = ctx->prev_decoding_params;
292cabdff1aSopenharmony_ci    DecodingParams *dp = ctx->cur_decoding_params;
293cabdff1aSopenharmony_ci    const MatrixParams *prev_mp = &prev->matrix_params;
294cabdff1aSopenharmony_ci    MatrixParams *mp = &dp->matrix_params;
295cabdff1aSopenharmony_ci    RestartHeader  *rh = ctx->cur_restart_header;
296cabdff1aSopenharmony_ci    int retval = 0;
297cabdff1aSopenharmony_ci
298cabdff1aSopenharmony_ci    if (prev->param_presence_flags != dp->param_presence_flags)
299cabdff1aSopenharmony_ci        retval |= PARAM_PRESENCE_FLAGS;
300cabdff1aSopenharmony_ci
301cabdff1aSopenharmony_ci    if (prev->blocksize != dp->blocksize)
302cabdff1aSopenharmony_ci        retval |= PARAM_BLOCKSIZE;
303cabdff1aSopenharmony_ci
304cabdff1aSopenharmony_ci    if (compare_matrix_params(ctx, prev_mp, mp))
305cabdff1aSopenharmony_ci        retval |= PARAM_MATRIX;
306cabdff1aSopenharmony_ci
307cabdff1aSopenharmony_ci    for (unsigned int ch = 0; ch <= rh->max_matrix_channel; ch++)
308cabdff1aSopenharmony_ci        if (prev_mp->shift[ch] != mp->shift[ch]) {
309cabdff1aSopenharmony_ci            retval |= PARAM_OUTSHIFT;
310cabdff1aSopenharmony_ci            break;
311cabdff1aSopenharmony_ci        }
312cabdff1aSopenharmony_ci
313cabdff1aSopenharmony_ci    for (unsigned int ch = 0; ch <= rh->max_channel; ch++)
314cabdff1aSopenharmony_ci        if (prev->quant_step_size[ch] != dp->quant_step_size[ch]) {
315cabdff1aSopenharmony_ci            retval |= PARAM_QUANTSTEP;
316cabdff1aSopenharmony_ci            break;
317cabdff1aSopenharmony_ci        }
318cabdff1aSopenharmony_ci
319cabdff1aSopenharmony_ci    for (unsigned int ch = rh->min_channel; ch <= rh->max_channel; ch++) {
320cabdff1aSopenharmony_ci        const ChannelParams *prev_cp = &ctx->prev_channel_params[ch];
321cabdff1aSopenharmony_ci        ChannelParams *cp = &ctx->cur_channel_params[ch];
322cabdff1aSopenharmony_ci
323cabdff1aSopenharmony_ci        if (!(retval & PARAM_FIR) &&
324cabdff1aSopenharmony_ci            compare_filter_params(prev_cp, cp, FIR))
325cabdff1aSopenharmony_ci            retval |= PARAM_FIR;
326cabdff1aSopenharmony_ci
327cabdff1aSopenharmony_ci        if (!(retval & PARAM_IIR) &&
328cabdff1aSopenharmony_ci            compare_filter_params(prev_cp, cp, IIR))
329cabdff1aSopenharmony_ci            retval |= PARAM_IIR;
330cabdff1aSopenharmony_ci
331cabdff1aSopenharmony_ci        if (prev_cp->huff_offset != cp->huff_offset)
332cabdff1aSopenharmony_ci            retval |= PARAM_HUFFOFFSET;
333cabdff1aSopenharmony_ci
334cabdff1aSopenharmony_ci        if (prev_cp->codebook    != cp->codebook  ||
335cabdff1aSopenharmony_ci            prev_cp->huff_lsbs   != cp->huff_lsbs  )
336cabdff1aSopenharmony_ci            retval |= PARAM_PRESENT;
337cabdff1aSopenharmony_ci    }
338cabdff1aSopenharmony_ci
339cabdff1aSopenharmony_ci    return retval;
340cabdff1aSopenharmony_ci}
341cabdff1aSopenharmony_ci
342cabdff1aSopenharmony_cistatic void copy_filter_params(ChannelParams *dst_cp, ChannelParams *src_cp, int filter)
343cabdff1aSopenharmony_ci{
344cabdff1aSopenharmony_ci    FilterParams *dst = &dst_cp->filter_params[filter];
345cabdff1aSopenharmony_ci    FilterParams *src = &src_cp->filter_params[filter];
346cabdff1aSopenharmony_ci
347cabdff1aSopenharmony_ci    dst->order = src->order;
348cabdff1aSopenharmony_ci
349cabdff1aSopenharmony_ci    if (dst->order) {
350cabdff1aSopenharmony_ci        dst->shift = src->shift;
351cabdff1aSopenharmony_ci
352cabdff1aSopenharmony_ci        dst->coeff_shift = src->coeff_shift;
353cabdff1aSopenharmony_ci        dst->coeff_bits = src->coeff_bits;
354cabdff1aSopenharmony_ci    }
355cabdff1aSopenharmony_ci
356cabdff1aSopenharmony_ci    for (unsigned int order = 0; order < dst->order; order++)
357cabdff1aSopenharmony_ci        dst_cp->coeff[filter][order] = src_cp->coeff[filter][order];
358cabdff1aSopenharmony_ci}
359cabdff1aSopenharmony_ci
360cabdff1aSopenharmony_cistatic void copy_matrix_params(MatrixParams *dst, MatrixParams *src)
361cabdff1aSopenharmony_ci{
362cabdff1aSopenharmony_ci    dst->count = src->count;
363cabdff1aSopenharmony_ci
364cabdff1aSopenharmony_ci    if (dst->count) {
365cabdff1aSopenharmony_ci        for (unsigned int channel = 0; channel < MAX_CHANNELS; channel++) {
366cabdff1aSopenharmony_ci
367cabdff1aSopenharmony_ci            dst->fbits[channel] = src->fbits[channel];
368cabdff1aSopenharmony_ci            dst->shift[channel] = src->shift[channel];
369cabdff1aSopenharmony_ci
370cabdff1aSopenharmony_ci            for (unsigned int count = 0; count < MAX_MATRICES; count++)
371cabdff1aSopenharmony_ci                dst->coeff[count][channel] = src->coeff[count][channel];
372cabdff1aSopenharmony_ci        }
373cabdff1aSopenharmony_ci
374cabdff1aSopenharmony_ci        for (unsigned int count = 0; count < MAX_MATRICES; count++)
375cabdff1aSopenharmony_ci            dst->outch[count] = src->outch[count];
376cabdff1aSopenharmony_ci    }
377cabdff1aSopenharmony_ci}
378cabdff1aSopenharmony_ci
379cabdff1aSopenharmony_cistatic void copy_restart_frame_params(MLPEncodeContext *ctx)
380cabdff1aSopenharmony_ci{
381cabdff1aSopenharmony_ci    for (unsigned int index = 0; index < ctx->number_of_subblocks; index++) {
382cabdff1aSopenharmony_ci        DecodingParams *dp = ctx->seq_decoding_params + index;
383cabdff1aSopenharmony_ci
384cabdff1aSopenharmony_ci        copy_matrix_params(&dp->matrix_params, &ctx->cur_decoding_params->matrix_params);
385cabdff1aSopenharmony_ci
386cabdff1aSopenharmony_ci        for (unsigned int channel = 0; channel < ctx->avctx->ch_layout.nb_channels; channel++) {
387cabdff1aSopenharmony_ci            ChannelParams *cp = ctx->seq_channel_params + index*(ctx->avctx->ch_layout.nb_channels) + channel;
388cabdff1aSopenharmony_ci
389cabdff1aSopenharmony_ci            dp->quant_step_size[channel] = ctx->cur_decoding_params->quant_step_size[channel];
390cabdff1aSopenharmony_ci            dp->matrix_params.shift[channel] = ctx->cur_decoding_params->matrix_params.shift[channel];
391cabdff1aSopenharmony_ci
392cabdff1aSopenharmony_ci            if (index)
393cabdff1aSopenharmony_ci                for (unsigned int filter = 0; filter < NUM_FILTERS; filter++)
394cabdff1aSopenharmony_ci                    copy_filter_params(cp, &ctx->cur_channel_params[channel], filter);
395cabdff1aSopenharmony_ci        }
396cabdff1aSopenharmony_ci    }
397cabdff1aSopenharmony_ci}
398cabdff1aSopenharmony_ci
399cabdff1aSopenharmony_ci/** Clears a DecodingParams struct the way it should be after a restart header. */
400cabdff1aSopenharmony_cistatic void clear_decoding_params(DecodingParams *decoding_params)
401cabdff1aSopenharmony_ci{
402cabdff1aSopenharmony_ci    DecodingParams *dp = decoding_params;
403cabdff1aSopenharmony_ci
404cabdff1aSopenharmony_ci    dp->param_presence_flags   = 0xff;
405cabdff1aSopenharmony_ci    dp->blocksize              = 8;
406cabdff1aSopenharmony_ci
407cabdff1aSopenharmony_ci    memset(&dp->matrix_params , 0, sizeof(MatrixParams       ));
408cabdff1aSopenharmony_ci    memset(dp->quant_step_size, 0, sizeof(dp->quant_step_size));
409cabdff1aSopenharmony_ci}
410cabdff1aSopenharmony_ci
411cabdff1aSopenharmony_ci/** Clears a ChannelParams struct the way it should be after a restart header. */
412cabdff1aSopenharmony_cistatic void clear_channel_params(ChannelParams channel_params[MAX_CHANNELS], int nb_channels)
413cabdff1aSopenharmony_ci{
414cabdff1aSopenharmony_ci    for (unsigned channel = 0; channel < nb_channels; channel++) {
415cabdff1aSopenharmony_ci        ChannelParams *cp = &channel_params[channel];
416cabdff1aSopenharmony_ci
417cabdff1aSopenharmony_ci        memset(&cp->filter_params, 0, sizeof(cp->filter_params));
418cabdff1aSopenharmony_ci
419cabdff1aSopenharmony_ci        /* Default audio coding is 24-bit raw PCM. */
420cabdff1aSopenharmony_ci        cp->huff_offset      =  0;
421cabdff1aSopenharmony_ci        cp->codebook         =  0;
422cabdff1aSopenharmony_ci        cp->huff_lsbs        = 24;
423cabdff1aSopenharmony_ci    }
424cabdff1aSopenharmony_ci}
425cabdff1aSopenharmony_ci
426cabdff1aSopenharmony_ci/** Sets default vales in our encoder for a DecodingParams struct. */
427cabdff1aSopenharmony_cistatic void default_decoding_params(MLPEncodeContext *ctx, DecodingParams *decoding_params)
428cabdff1aSopenharmony_ci{
429cabdff1aSopenharmony_ci    DecodingParams *dp = decoding_params;
430cabdff1aSopenharmony_ci    uint8_t param_presence_flags = 0;
431cabdff1aSopenharmony_ci
432cabdff1aSopenharmony_ci    clear_decoding_params(decoding_params);
433cabdff1aSopenharmony_ci
434cabdff1aSopenharmony_ci    param_presence_flags |= PARAM_BLOCKSIZE;
435cabdff1aSopenharmony_ci    param_presence_flags |= PARAM_MATRIX;
436cabdff1aSopenharmony_ci    param_presence_flags |= PARAM_OUTSHIFT;
437cabdff1aSopenharmony_ci    param_presence_flags |= PARAM_QUANTSTEP;
438cabdff1aSopenharmony_ci    param_presence_flags |= PARAM_FIR;
439cabdff1aSopenharmony_ci  /*param_presence_flags |= PARAM_IIR; */
440cabdff1aSopenharmony_ci    param_presence_flags |= PARAM_HUFFOFFSET;
441cabdff1aSopenharmony_ci    param_presence_flags |= PARAM_PRESENT;
442cabdff1aSopenharmony_ci
443cabdff1aSopenharmony_ci    dp->param_presence_flags = param_presence_flags;
444cabdff1aSopenharmony_ci}
445cabdff1aSopenharmony_ci
446cabdff1aSopenharmony_ci/****************************************************************************/
447cabdff1aSopenharmony_ci
448cabdff1aSopenharmony_ci/** Calculates the smallest number of bits it takes to encode a given signed
449cabdff1aSopenharmony_ci *  value in two's complement.
450cabdff1aSopenharmony_ci */
451cabdff1aSopenharmony_cistatic int inline number_sbits(int number)
452cabdff1aSopenharmony_ci{
453cabdff1aSopenharmony_ci    if (number < -1)
454cabdff1aSopenharmony_ci        number++;
455cabdff1aSopenharmony_ci
456cabdff1aSopenharmony_ci    return av_log2(FFABS(number)) + 1 + !!number;
457cabdff1aSopenharmony_ci}
458cabdff1aSopenharmony_ci
459cabdff1aSopenharmony_cienum InputBitDepth {
460cabdff1aSopenharmony_ci    BITS_16,
461cabdff1aSopenharmony_ci    BITS_20,
462cabdff1aSopenharmony_ci    BITS_24,
463cabdff1aSopenharmony_ci};
464cabdff1aSopenharmony_ci
465cabdff1aSopenharmony_cistatic int mlp_peak_bitrate(int peak_bitrate, int sample_rate)
466cabdff1aSopenharmony_ci{
467cabdff1aSopenharmony_ci    return ((peak_bitrate << 4) - 8) / sample_rate;
468cabdff1aSopenharmony_ci}
469cabdff1aSopenharmony_ci
470cabdff1aSopenharmony_cistatic av_cold void mlp_encode_init_static(void)
471cabdff1aSopenharmony_ci{
472cabdff1aSopenharmony_ci    clear_channel_params (restart_channel_params,  MAX_CHANNELS);
473cabdff1aSopenharmony_ci    clear_decoding_params(restart_decoding_params);
474cabdff1aSopenharmony_ci    ff_mlp_init_crc();
475cabdff1aSopenharmony_ci}
476cabdff1aSopenharmony_ci
477cabdff1aSopenharmony_cistatic av_cold int mlp_encode_init(AVCodecContext *avctx)
478cabdff1aSopenharmony_ci{
479cabdff1aSopenharmony_ci    static AVOnce init_static_once = AV_ONCE_INIT;
480cabdff1aSopenharmony_ci    MLPEncodeContext *ctx = avctx->priv_data;
481cabdff1aSopenharmony_ci    RestartHeader *const rh = &ctx->restart_header;
482cabdff1aSopenharmony_ci    unsigned int sum = 0;
483cabdff1aSopenharmony_ci    size_t size;
484cabdff1aSopenharmony_ci    int ret;
485cabdff1aSopenharmony_ci
486cabdff1aSopenharmony_ci    ctx->avctx = avctx;
487cabdff1aSopenharmony_ci
488cabdff1aSopenharmony_ci    switch (avctx->sample_rate) {
489cabdff1aSopenharmony_ci    case 44100 << 0:
490cabdff1aSopenharmony_ci        avctx->frame_size         = 40  << 0;
491cabdff1aSopenharmony_ci        ctx->coded_sample_rate[0] = 0x08 + 0;
492cabdff1aSopenharmony_ci        ctx->fs                   = 0x08 + 1;
493cabdff1aSopenharmony_ci        break;
494cabdff1aSopenharmony_ci    case 44100 << 1:
495cabdff1aSopenharmony_ci        avctx->frame_size         = 40  << 1;
496cabdff1aSopenharmony_ci        ctx->coded_sample_rate[0] = 0x08 + 1;
497cabdff1aSopenharmony_ci        ctx->fs                   = 0x0C + 1;
498cabdff1aSopenharmony_ci        break;
499cabdff1aSopenharmony_ci    case 44100 << 2:
500cabdff1aSopenharmony_ci        ctx->substream_info      |= SUBSTREAM_INFO_HIGH_RATE;
501cabdff1aSopenharmony_ci        avctx->frame_size         = 40  << 2;
502cabdff1aSopenharmony_ci        ctx->coded_sample_rate[0] = 0x08 + 2;
503cabdff1aSopenharmony_ci        ctx->fs                   = 0x10 + 1;
504cabdff1aSopenharmony_ci        break;
505cabdff1aSopenharmony_ci    case 48000 << 0:
506cabdff1aSopenharmony_ci        avctx->frame_size         = 40  << 0;
507cabdff1aSopenharmony_ci        ctx->coded_sample_rate[0] = 0x00 + 0;
508cabdff1aSopenharmony_ci        ctx->fs                   = 0x08 + 2;
509cabdff1aSopenharmony_ci        break;
510cabdff1aSopenharmony_ci    case 48000 << 1:
511cabdff1aSopenharmony_ci        avctx->frame_size         = 40  << 1;
512cabdff1aSopenharmony_ci        ctx->coded_sample_rate[0] = 0x00 + 1;
513cabdff1aSopenharmony_ci        ctx->fs                   = 0x0C + 2;
514cabdff1aSopenharmony_ci        break;
515cabdff1aSopenharmony_ci    case 48000 << 2:
516cabdff1aSopenharmony_ci        ctx->substream_info      |= SUBSTREAM_INFO_HIGH_RATE;
517cabdff1aSopenharmony_ci        avctx->frame_size         = 40  << 2;
518cabdff1aSopenharmony_ci        ctx->coded_sample_rate[0] = 0x00 + 2;
519cabdff1aSopenharmony_ci        ctx->fs                   = 0x10 + 2;
520cabdff1aSopenharmony_ci        break;
521cabdff1aSopenharmony_ci    default:
522cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Unsupported sample rate %d. Supported "
523cabdff1aSopenharmony_ci                            "sample rates are 44100, 88200, 176400, 48000, "
524cabdff1aSopenharmony_ci                            "96000, and 192000.\n", avctx->sample_rate);
525cabdff1aSopenharmony_ci        return AVERROR(EINVAL);
526cabdff1aSopenharmony_ci    }
527cabdff1aSopenharmony_ci    ctx->coded_sample_rate[1] = -1 & 0xf;
528cabdff1aSopenharmony_ci
529cabdff1aSopenharmony_ci    /* TODO Keep count of bitrate and calculate real value. */
530cabdff1aSopenharmony_ci    ctx->coded_peak_bitrate = mlp_peak_bitrate(9600000, avctx->sample_rate);
531cabdff1aSopenharmony_ci
532cabdff1aSopenharmony_ci    /* TODO support more channels. */
533cabdff1aSopenharmony_ci    if (avctx->ch_layout.nb_channels > 2) {
534cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_WARNING,
535cabdff1aSopenharmony_ci               "Only mono and stereo are supported at the moment.\n");
536cabdff1aSopenharmony_ci    }
537cabdff1aSopenharmony_ci
538cabdff1aSopenharmony_ci    ctx->substream_info |= SUBSTREAM_INFO_ALWAYS_SET;
539cabdff1aSopenharmony_ci    if (avctx->ch_layout.nb_channels <= 2) {
540cabdff1aSopenharmony_ci        ctx->substream_info |= SUBSTREAM_INFO_MAX_2_CHAN;
541cabdff1aSopenharmony_ci    }
542cabdff1aSopenharmony_ci
543cabdff1aSopenharmony_ci    switch (avctx->sample_fmt) {
544cabdff1aSopenharmony_ci    case AV_SAMPLE_FMT_S16:
545cabdff1aSopenharmony_ci        ctx->coded_sample_fmt[0] = BITS_16;
546cabdff1aSopenharmony_ci        ctx->wordlength = 16;
547cabdff1aSopenharmony_ci        avctx->bits_per_raw_sample = 16;
548cabdff1aSopenharmony_ci        break;
549cabdff1aSopenharmony_ci    /* TODO 20 bits: */
550cabdff1aSopenharmony_ci    case AV_SAMPLE_FMT_S32:
551cabdff1aSopenharmony_ci        ctx->coded_sample_fmt[0] = BITS_24;
552cabdff1aSopenharmony_ci        ctx->wordlength = 24;
553cabdff1aSopenharmony_ci        avctx->bits_per_raw_sample = 24;
554cabdff1aSopenharmony_ci        break;
555cabdff1aSopenharmony_ci    default:
556cabdff1aSopenharmony_ci        av_log(avctx, AV_LOG_ERROR, "Sample format not supported. "
557cabdff1aSopenharmony_ci               "Only 16- and 24-bit samples are supported.\n");
558cabdff1aSopenharmony_ci        return AVERROR(EINVAL);
559cabdff1aSopenharmony_ci    }
560cabdff1aSopenharmony_ci    ctx->coded_sample_fmt[1] = -1 & 0xf;
561cabdff1aSopenharmony_ci
562cabdff1aSopenharmony_ci    ctx->dts = -avctx->frame_size;
563cabdff1aSopenharmony_ci
564cabdff1aSopenharmony_ci    ctx->num_channels = avctx->ch_layout.nb_channels + 2; /* +2 noise channels */
565cabdff1aSopenharmony_ci    ctx->one_sample_buffer_size = avctx->frame_size
566cabdff1aSopenharmony_ci                                * ctx->num_channels;
567cabdff1aSopenharmony_ci    /* TODO Let user pass major header interval as parameter. */
568cabdff1aSopenharmony_ci    ctx->max_restart_interval = MAJOR_HEADER_INTERVAL;
569cabdff1aSopenharmony_ci
570cabdff1aSopenharmony_ci    ctx->max_codebook_search = 3;
571cabdff1aSopenharmony_ci    ctx->min_restart_interval = MAJOR_HEADER_INTERVAL;
572cabdff1aSopenharmony_ci    ctx->restart_intervals = ctx->max_restart_interval / ctx->min_restart_interval;
573cabdff1aSopenharmony_ci
574cabdff1aSopenharmony_ci    /* TODO Let user pass parameters for LPC filter. */
575cabdff1aSopenharmony_ci
576cabdff1aSopenharmony_ci    size = avctx->frame_size * ctx->max_restart_interval;
577cabdff1aSopenharmony_ci    ctx->lpc_sample_buffer = av_calloc(size, sizeof(*ctx->lpc_sample_buffer));
578cabdff1aSopenharmony_ci    if (!ctx->lpc_sample_buffer)
579cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
580cabdff1aSopenharmony_ci
581cabdff1aSopenharmony_ci    size = ctx->one_sample_buffer_size * ctx->max_restart_interval;
582cabdff1aSopenharmony_ci    ctx->major_scratch_buffer = av_calloc(size, sizeof(*ctx->major_scratch_buffer));
583cabdff1aSopenharmony_ci    if (!ctx->major_scratch_buffer)
584cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
585cabdff1aSopenharmony_ci
586cabdff1aSopenharmony_ci    ctx->major_inout_buffer = av_calloc(size, sizeof(*ctx->major_inout_buffer));
587cabdff1aSopenharmony_ci    if (!ctx->major_inout_buffer)
588cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
589cabdff1aSopenharmony_ci
590cabdff1aSopenharmony_ci    ctx->num_substreams = 1; // TODO: change this after adding multi-channel support for TrueHD
591cabdff1aSopenharmony_ci
592cabdff1aSopenharmony_ci    if (ctx->avctx->codec_id == AV_CODEC_ID_MLP) {
593cabdff1aSopenharmony_ci        static const AVChannelLayout layout_arrangement[] = {
594cabdff1aSopenharmony_ci            AV_CHANNEL_LAYOUT_MONO,         AV_CHANNEL_LAYOUT_STEREO,
595cabdff1aSopenharmony_ci            AV_CHANNEL_LAYOUT_2_1,          AV_CHANNEL_LAYOUT_QUAD,
596cabdff1aSopenharmony_ci            AV_CHANNEL_LAYOUT_2POINT1,      { 0 }, { 0 },
597cabdff1aSopenharmony_ci            AV_CHANNEL_LAYOUT_SURROUND,     AV_CHANNEL_LAYOUT_4POINT0,
598cabdff1aSopenharmony_ci            AV_CHANNEL_LAYOUT_5POINT0_BACK, AV_CHANNEL_LAYOUT_3POINT1,
599cabdff1aSopenharmony_ci            AV_CHANNEL_LAYOUT_4POINT1,      AV_CHANNEL_LAYOUT_5POINT1_BACK,
600cabdff1aSopenharmony_ci        };
601cabdff1aSopenharmony_ci        int i;
602cabdff1aSopenharmony_ci
603cabdff1aSopenharmony_ci        for (i = 0; i < FF_ARRAY_ELEMS(layout_arrangement); i++)
604cabdff1aSopenharmony_ci            if (!av_channel_layout_compare(&avctx->ch_layout, &layout_arrangement[i]))
605cabdff1aSopenharmony_ci                break;
606cabdff1aSopenharmony_ci        if (i == FF_ARRAY_ELEMS(layout_arrangement)) {
607cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "Unsupported channel arrangement\n");
608cabdff1aSopenharmony_ci            return AVERROR(EINVAL);
609cabdff1aSopenharmony_ci        }
610cabdff1aSopenharmony_ci        ctx->channel_arrangement = i;
611cabdff1aSopenharmony_ci        ctx->flags = FLAGS_DVDA;
612cabdff1aSopenharmony_ci        ctx->channel_occupancy = ff_mlp_ch_info[ctx->channel_arrangement].channel_occupancy;
613cabdff1aSopenharmony_ci        ctx->summary_info      = ff_mlp_ch_info[ctx->channel_arrangement].summary_info     ;
614cabdff1aSopenharmony_ci    } else {
615cabdff1aSopenharmony_ci        /* TrueHD */
616cabdff1aSopenharmony_ci        if (!av_channel_layout_compare(&avctx->ch_layout,
617cabdff1aSopenharmony_ci                                       &(AVChannelLayout)AV_CHANNEL_LAYOUT_STEREO)) {
618cabdff1aSopenharmony_ci            ctx->ch_modifier_thd0    = 0;
619cabdff1aSopenharmony_ci            ctx->ch_modifier_thd1    = 0;
620cabdff1aSopenharmony_ci            ctx->ch_modifier_thd2    = 0;
621cabdff1aSopenharmony_ci            ctx->channel_arrangement = 1;
622cabdff1aSopenharmony_ci        } else if (!av_channel_layout_compare(&avctx->ch_layout,
623cabdff1aSopenharmony_ci                                              &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT0_BACK)) {
624cabdff1aSopenharmony_ci            ctx->ch_modifier_thd0    = 1;
625cabdff1aSopenharmony_ci            ctx->ch_modifier_thd1    = 1;
626cabdff1aSopenharmony_ci            ctx->ch_modifier_thd2    = 1;
627cabdff1aSopenharmony_ci            ctx->channel_arrangement = 11;
628cabdff1aSopenharmony_ci        } else if (!av_channel_layout_compare(&avctx->ch_layout,
629cabdff1aSopenharmony_ci                                              &(AVChannelLayout)AV_CHANNEL_LAYOUT_5POINT1_BACK)) {
630cabdff1aSopenharmony_ci            ctx->ch_modifier_thd0    = 2;
631cabdff1aSopenharmony_ci            ctx->ch_modifier_thd1    = 1;
632cabdff1aSopenharmony_ci            ctx->ch_modifier_thd2    = 2;
633cabdff1aSopenharmony_ci            ctx->channel_arrangement = 15;
634cabdff1aSopenharmony_ci        } else {
635cabdff1aSopenharmony_ci            av_log(avctx, AV_LOG_ERROR, "Unsupported channel arrangement\n");
636cabdff1aSopenharmony_ci            return AVERROR(EINVAL);
637cabdff1aSopenharmony_ci        }
638cabdff1aSopenharmony_ci        ctx->flags = 0;
639cabdff1aSopenharmony_ci        ctx->channel_occupancy = 0;
640cabdff1aSopenharmony_ci        ctx->summary_info = 0;
641cabdff1aSopenharmony_ci    }
642cabdff1aSopenharmony_ci
643cabdff1aSopenharmony_ci    size = ctx->max_restart_interval;
644cabdff1aSopenharmony_ci    ctx->max_output_bits = av_calloc(size, sizeof(*ctx->max_output_bits));
645cabdff1aSopenharmony_ci    if (!ctx->max_output_bits)
646cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
647cabdff1aSopenharmony_ci
648cabdff1aSopenharmony_ci    size = ctx->max_restart_interval;
649cabdff1aSopenharmony_ci    ctx->lossless_check_data = av_calloc(size, sizeof(*ctx->lossless_check_data));
650cabdff1aSopenharmony_ci    if (!ctx->lossless_check_data)
651cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
652cabdff1aSopenharmony_ci
653cabdff1aSopenharmony_ci    for (unsigned int index = 0; index < ctx->restart_intervals; index++) {
654cabdff1aSopenharmony_ci        ctx->seq_offset[index] = sum;
655cabdff1aSopenharmony_ci        ctx->seq_size  [index] = ((index + 1) * ctx->min_restart_interval) + 1;
656cabdff1aSopenharmony_ci        sum += ctx->seq_size[index];
657cabdff1aSopenharmony_ci    }
658cabdff1aSopenharmony_ci    ctx->sequence_size = sum;
659cabdff1aSopenharmony_ci    size = ctx->restart_intervals * ctx->sequence_size * ctx->avctx->ch_layout.nb_channels;
660cabdff1aSopenharmony_ci    ctx->channel_params = av_calloc(size, sizeof(*ctx->channel_params));
661cabdff1aSopenharmony_ci    if (!ctx->channel_params)
662cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
663cabdff1aSopenharmony_ci
664cabdff1aSopenharmony_ci    size = ctx->restart_intervals * ctx->sequence_size;
665cabdff1aSopenharmony_ci    ctx->decoding_params = av_calloc(size, sizeof(*ctx->decoding_params));
666cabdff1aSopenharmony_ci    if (!ctx->decoding_params)
667cabdff1aSopenharmony_ci        return AVERROR(ENOMEM);
668cabdff1aSopenharmony_ci
669cabdff1aSopenharmony_ci    /* TODO see if noisegen_seed is really worth it. */
670cabdff1aSopenharmony_ci    rh->noisegen_seed      = 0;
671cabdff1aSopenharmony_ci
672cabdff1aSopenharmony_ci    rh->min_channel        = 0;
673cabdff1aSopenharmony_ci    rh->max_channel        = avctx->ch_layout.nb_channels - 1;
674cabdff1aSopenharmony_ci    /* FIXME: this works for 1 and 2 channels, but check for more */
675cabdff1aSopenharmony_ci    rh->max_matrix_channel = rh->max_channel;
676cabdff1aSopenharmony_ci
677cabdff1aSopenharmony_ci    if ((ret = ff_lpc_init(&ctx->lpc_ctx, ctx->number_of_samples,
678cabdff1aSopenharmony_ci                    MLP_MAX_LPC_ORDER, FF_LPC_TYPE_LEVINSON)) < 0)
679cabdff1aSopenharmony_ci        return ret;
680cabdff1aSopenharmony_ci
681cabdff1aSopenharmony_ci    for (int i = 0; i < NUM_FILTERS; i++) {
682cabdff1aSopenharmony_ci        ctx->filter_state_buffer[i] = av_calloc(avctx->frame_size * ctx->max_restart_interval,
683cabdff1aSopenharmony_ci                                                sizeof(*ctx->filter_state_buffer[0]));
684cabdff1aSopenharmony_ci        if (!ctx->filter_state_buffer[i])
685cabdff1aSopenharmony_ci            return AVERROR(ENOMEM);
686cabdff1aSopenharmony_ci    }
687cabdff1aSopenharmony_ci
688cabdff1aSopenharmony_ci    ff_af_queue_init(avctx, &ctx->afq);
689cabdff1aSopenharmony_ci
690cabdff1aSopenharmony_ci    ff_thread_once(&init_static_once, mlp_encode_init_static);
691cabdff1aSopenharmony_ci
692cabdff1aSopenharmony_ci    return 0;
693cabdff1aSopenharmony_ci}
694cabdff1aSopenharmony_ci
695cabdff1aSopenharmony_ci/****************************************************************************
696cabdff1aSopenharmony_ci ****************** Functions that write to the bitstream *******************
697cabdff1aSopenharmony_ci ****************************************************************************/
698cabdff1aSopenharmony_ci
699cabdff1aSopenharmony_ci/** Writes a major sync header to the bitstream. */
700cabdff1aSopenharmony_cistatic void write_major_sync(MLPEncodeContext *ctx, uint8_t *buf, int buf_size)
701cabdff1aSopenharmony_ci{
702cabdff1aSopenharmony_ci    PutBitContext pb;
703cabdff1aSopenharmony_ci
704cabdff1aSopenharmony_ci    init_put_bits(&pb, buf, buf_size);
705cabdff1aSopenharmony_ci
706cabdff1aSopenharmony_ci    put_bits(&pb, 24, SYNC_MAJOR               );
707cabdff1aSopenharmony_ci
708cabdff1aSopenharmony_ci    if (ctx->avctx->codec_id == AV_CODEC_ID_MLP) {
709cabdff1aSopenharmony_ci        put_bits(&pb,  8, SYNC_MLP                 );
710cabdff1aSopenharmony_ci        put_bits(&pb,  4, ctx->coded_sample_fmt [0]);
711cabdff1aSopenharmony_ci        put_bits(&pb,  4, ctx->coded_sample_fmt [1]);
712cabdff1aSopenharmony_ci        put_bits(&pb,  4, ctx->coded_sample_rate[0]);
713cabdff1aSopenharmony_ci        put_bits(&pb,  4, ctx->coded_sample_rate[1]);
714cabdff1aSopenharmony_ci        put_bits(&pb,  4, 0                        ); /* ignored */
715cabdff1aSopenharmony_ci        put_bits(&pb,  4, 0                        ); /* multi_channel_type */
716cabdff1aSopenharmony_ci        put_bits(&pb,  3, 0                        ); /* ignored */
717cabdff1aSopenharmony_ci        put_bits(&pb,  5, ctx->channel_arrangement );
718cabdff1aSopenharmony_ci    } else if (ctx->avctx->codec_id == AV_CODEC_ID_TRUEHD) {
719cabdff1aSopenharmony_ci        put_bits(&pb,  8, SYNC_TRUEHD              );
720cabdff1aSopenharmony_ci        put_bits(&pb,  4, ctx->coded_sample_rate[0]);
721cabdff1aSopenharmony_ci        put_bits(&pb,  4, 0                        ); /* ignored */
722cabdff1aSopenharmony_ci        put_bits(&pb,  2, ctx->ch_modifier_thd0    );
723cabdff1aSopenharmony_ci        put_bits(&pb,  2, ctx->ch_modifier_thd1    );
724cabdff1aSopenharmony_ci        put_bits(&pb,  5, ctx->channel_arrangement );
725cabdff1aSopenharmony_ci        put_bits(&pb,  2, ctx->ch_modifier_thd2    );
726cabdff1aSopenharmony_ci        put_bits(&pb, 13, ctx->channel_arrangement );
727cabdff1aSopenharmony_ci    }
728cabdff1aSopenharmony_ci
729cabdff1aSopenharmony_ci    put_bits(&pb, 16, MAJOR_SYNC_INFO_SIGNATURE);
730cabdff1aSopenharmony_ci    put_bits(&pb, 16, ctx->flags               );
731cabdff1aSopenharmony_ci    put_bits(&pb, 16, 0                        ); /* ignored */
732cabdff1aSopenharmony_ci    put_bits(&pb,  1, 1                        ); /* is_vbr */
733cabdff1aSopenharmony_ci    put_bits(&pb, 15, ctx->coded_peak_bitrate  );
734cabdff1aSopenharmony_ci    put_bits(&pb,  4, 1                        ); /* num_substreams */
735cabdff1aSopenharmony_ci    put_bits(&pb,  4, 0x1                      ); /* ignored */
736cabdff1aSopenharmony_ci
737cabdff1aSopenharmony_ci    /* channel_meaning */
738cabdff1aSopenharmony_ci    put_bits(&pb,  8, ctx->substream_info      );
739cabdff1aSopenharmony_ci    put_bits(&pb,  5, ctx->fs                  );
740cabdff1aSopenharmony_ci    put_bits(&pb,  5, ctx->wordlength          );
741cabdff1aSopenharmony_ci    put_bits(&pb,  6, ctx->channel_occupancy   );
742cabdff1aSopenharmony_ci    put_bits(&pb,  3, 0                        ); /* ignored */
743cabdff1aSopenharmony_ci    put_bits(&pb, 10, 0                        ); /* speaker_layout */
744cabdff1aSopenharmony_ci    put_bits(&pb,  3, 0                        ); /* copy_protection */
745cabdff1aSopenharmony_ci    put_bits(&pb, 16, 0x8080                   ); /* ignored */
746cabdff1aSopenharmony_ci    put_bits(&pb,  7, 0                        ); /* ignored */
747cabdff1aSopenharmony_ci    put_bits(&pb,  4, 0                        ); /* source_format */
748cabdff1aSopenharmony_ci    put_bits(&pb,  5, ctx->summary_info        );
749cabdff1aSopenharmony_ci
750cabdff1aSopenharmony_ci    flush_put_bits(&pb);
751cabdff1aSopenharmony_ci
752cabdff1aSopenharmony_ci    AV_WL16(buf+26, ff_mlp_checksum16(buf, 26));
753cabdff1aSopenharmony_ci}
754cabdff1aSopenharmony_ci
755cabdff1aSopenharmony_ci/** Writes a restart header to the bitstream. Damaged streams can start being
756cabdff1aSopenharmony_ci *  decoded losslessly again after such a header and the subsequent decoding
757cabdff1aSopenharmony_ci *  params header.
758cabdff1aSopenharmony_ci */
759cabdff1aSopenharmony_cistatic void write_restart_header(MLPEncodeContext *ctx, PutBitContext *pb)
760cabdff1aSopenharmony_ci{
761cabdff1aSopenharmony_ci    RestartHeader *rh = ctx->cur_restart_header;
762cabdff1aSopenharmony_ci    uint8_t lossless_check = xor_32_to_8(rh->lossless_check_data);
763cabdff1aSopenharmony_ci    unsigned int start_count = put_bits_count(pb);
764cabdff1aSopenharmony_ci    PutBitContext tmpb;
765cabdff1aSopenharmony_ci    uint8_t checksum;
766cabdff1aSopenharmony_ci
767cabdff1aSopenharmony_ci    put_bits(pb, 14, 0x31ea                ); /* TODO 0x31eb */
768cabdff1aSopenharmony_ci    put_bits(pb, 16, ctx->timestamp        );
769cabdff1aSopenharmony_ci    put_bits(pb,  4, rh->min_channel       );
770cabdff1aSopenharmony_ci    put_bits(pb,  4, rh->max_channel       );
771cabdff1aSopenharmony_ci    put_bits(pb,  4, rh->max_matrix_channel);
772cabdff1aSopenharmony_ci    put_bits(pb,  4, rh->noise_shift       );
773cabdff1aSopenharmony_ci    put_bits(pb, 23, rh->noisegen_seed     );
774cabdff1aSopenharmony_ci    put_bits(pb,  4, 0                     ); /* TODO max_shift */
775cabdff1aSopenharmony_ci    put_bits(pb,  5, rh->max_huff_lsbs     );
776cabdff1aSopenharmony_ci    put_bits(pb,  5, rh->max_output_bits   );
777cabdff1aSopenharmony_ci    put_bits(pb,  5, rh->max_output_bits   );
778cabdff1aSopenharmony_ci    put_bits(pb,  1, rh->data_check_present);
779cabdff1aSopenharmony_ci    put_bits(pb,  8, lossless_check        );
780cabdff1aSopenharmony_ci    put_bits(pb, 16, 0                     ); /* ignored */
781cabdff1aSopenharmony_ci
782cabdff1aSopenharmony_ci    for (unsigned int ch = 0; ch <= rh->max_matrix_channel; ch++)
783cabdff1aSopenharmony_ci        put_bits(pb, 6, ch);
784cabdff1aSopenharmony_ci
785cabdff1aSopenharmony_ci    /* Data must be flushed for the checksum to be correct. */
786cabdff1aSopenharmony_ci    tmpb = *pb;
787cabdff1aSopenharmony_ci    flush_put_bits(&tmpb);
788cabdff1aSopenharmony_ci
789cabdff1aSopenharmony_ci    checksum = ff_mlp_restart_checksum(pb->buf, put_bits_count(pb) - start_count);
790cabdff1aSopenharmony_ci
791cabdff1aSopenharmony_ci    put_bits(pb,  8, checksum);
792cabdff1aSopenharmony_ci}
793cabdff1aSopenharmony_ci
794cabdff1aSopenharmony_ci/** Writes matrix params for all primitive matrices to the bitstream. */
795cabdff1aSopenharmony_cistatic void write_matrix_params(MLPEncodeContext *ctx, PutBitContext *pb)
796cabdff1aSopenharmony_ci{
797cabdff1aSopenharmony_ci    DecodingParams *dp = ctx->cur_decoding_params;
798cabdff1aSopenharmony_ci    MatrixParams *mp = &dp->matrix_params;
799cabdff1aSopenharmony_ci
800cabdff1aSopenharmony_ci    put_bits(pb, 4, mp->count);
801cabdff1aSopenharmony_ci
802cabdff1aSopenharmony_ci    for (unsigned int mat = 0; mat < mp->count; mat++) {
803cabdff1aSopenharmony_ci        put_bits(pb, 4, mp->outch[mat]); /* matrix_out_ch */
804cabdff1aSopenharmony_ci        put_bits(pb, 4, mp->fbits[mat]);
805cabdff1aSopenharmony_ci        put_bits(pb, 1, 0             ); /* lsb_bypass */
806cabdff1aSopenharmony_ci
807cabdff1aSopenharmony_ci        for (unsigned int channel = 0; channel < ctx->num_channels; channel++) {
808cabdff1aSopenharmony_ci            int32_t coeff = mp->coeff[mat][channel];
809cabdff1aSopenharmony_ci
810cabdff1aSopenharmony_ci            if (coeff) {
811cabdff1aSopenharmony_ci                put_bits(pb, 1, 1);
812cabdff1aSopenharmony_ci
813cabdff1aSopenharmony_ci                coeff >>= 14 - mp->fbits[mat];
814cabdff1aSopenharmony_ci
815cabdff1aSopenharmony_ci                put_sbits(pb, mp->fbits[mat] + 2, coeff);
816cabdff1aSopenharmony_ci            } else {
817cabdff1aSopenharmony_ci                put_bits(pb, 1, 0);
818cabdff1aSopenharmony_ci            }
819cabdff1aSopenharmony_ci        }
820cabdff1aSopenharmony_ci    }
821cabdff1aSopenharmony_ci}
822cabdff1aSopenharmony_ci
823cabdff1aSopenharmony_ci/** Writes filter parameters for one filter to the bitstream. */
824cabdff1aSopenharmony_cistatic void write_filter_params(MLPEncodeContext *ctx, PutBitContext *pb,
825cabdff1aSopenharmony_ci                                unsigned int channel, unsigned int filter)
826cabdff1aSopenharmony_ci{
827cabdff1aSopenharmony_ci    FilterParams *fp = &ctx->cur_channel_params[channel].filter_params[filter];
828cabdff1aSopenharmony_ci
829cabdff1aSopenharmony_ci    put_bits(pb, 4, fp->order);
830cabdff1aSopenharmony_ci
831cabdff1aSopenharmony_ci    if (fp->order > 0) {
832cabdff1aSopenharmony_ci        int32_t *fcoeff = ctx->cur_channel_params[channel].coeff[filter];
833cabdff1aSopenharmony_ci
834cabdff1aSopenharmony_ci        put_bits(pb, 4, fp->shift      );
835cabdff1aSopenharmony_ci        put_bits(pb, 5, fp->coeff_bits );
836cabdff1aSopenharmony_ci        put_bits(pb, 3, fp->coeff_shift);
837cabdff1aSopenharmony_ci
838cabdff1aSopenharmony_ci        for (int i = 0; i < fp->order; i++) {
839cabdff1aSopenharmony_ci            put_sbits(pb, fp->coeff_bits, fcoeff[i] >> fp->coeff_shift);
840cabdff1aSopenharmony_ci        }
841cabdff1aSopenharmony_ci
842cabdff1aSopenharmony_ci        /* TODO state data for IIR filter. */
843cabdff1aSopenharmony_ci        put_bits(pb, 1, 0);
844cabdff1aSopenharmony_ci    }
845cabdff1aSopenharmony_ci}
846cabdff1aSopenharmony_ci
847cabdff1aSopenharmony_ci/** Writes decoding parameters to the bitstream. These change very often,
848cabdff1aSopenharmony_ci *  usually at almost every frame.
849cabdff1aSopenharmony_ci */
850cabdff1aSopenharmony_cistatic void write_decoding_params(MLPEncodeContext *ctx, PutBitContext *pb,
851cabdff1aSopenharmony_ci                                  int params_changed)
852cabdff1aSopenharmony_ci{
853cabdff1aSopenharmony_ci    DecodingParams *dp = ctx->cur_decoding_params;
854cabdff1aSopenharmony_ci    RestartHeader  *rh = ctx->cur_restart_header;
855cabdff1aSopenharmony_ci    MatrixParams *mp = &dp->matrix_params;
856cabdff1aSopenharmony_ci
857cabdff1aSopenharmony_ci    if (dp->param_presence_flags != PARAMS_DEFAULT &&
858cabdff1aSopenharmony_ci        params_changed & PARAM_PRESENCE_FLAGS) {
859cabdff1aSopenharmony_ci        put_bits(pb, 1, 1);
860cabdff1aSopenharmony_ci        put_bits(pb, 8, dp->param_presence_flags);
861cabdff1aSopenharmony_ci    } else {
862cabdff1aSopenharmony_ci        put_bits(pb, 1, 0);
863cabdff1aSopenharmony_ci    }
864cabdff1aSopenharmony_ci
865cabdff1aSopenharmony_ci    if (dp->param_presence_flags & PARAM_BLOCKSIZE) {
866cabdff1aSopenharmony_ci        if (params_changed       & PARAM_BLOCKSIZE) {
867cabdff1aSopenharmony_ci            put_bits(pb, 1, 1);
868cabdff1aSopenharmony_ci            put_bits(pb, 9, dp->blocksize);
869cabdff1aSopenharmony_ci        } else {
870cabdff1aSopenharmony_ci            put_bits(pb, 1, 0);
871cabdff1aSopenharmony_ci        }
872cabdff1aSopenharmony_ci    }
873cabdff1aSopenharmony_ci
874cabdff1aSopenharmony_ci    if (dp->param_presence_flags & PARAM_MATRIX) {
875cabdff1aSopenharmony_ci        if (params_changed       & PARAM_MATRIX) {
876cabdff1aSopenharmony_ci            put_bits(pb, 1, 1);
877cabdff1aSopenharmony_ci            write_matrix_params(ctx, pb);
878cabdff1aSopenharmony_ci        } else {
879cabdff1aSopenharmony_ci            put_bits(pb, 1, 0);
880cabdff1aSopenharmony_ci        }
881cabdff1aSopenharmony_ci    }
882cabdff1aSopenharmony_ci
883cabdff1aSopenharmony_ci    if (dp->param_presence_flags & PARAM_OUTSHIFT) {
884cabdff1aSopenharmony_ci        if (params_changed       & PARAM_OUTSHIFT) {
885cabdff1aSopenharmony_ci            put_bits(pb, 1, 1);
886cabdff1aSopenharmony_ci            for (unsigned int ch = 0; ch <= rh->max_matrix_channel; ch++)
887cabdff1aSopenharmony_ci                put_sbits(pb, 4, mp->shift[ch]);
888cabdff1aSopenharmony_ci        } else {
889cabdff1aSopenharmony_ci            put_bits(pb, 1, 0);
890cabdff1aSopenharmony_ci        }
891cabdff1aSopenharmony_ci    }
892cabdff1aSopenharmony_ci
893cabdff1aSopenharmony_ci    if (dp->param_presence_flags & PARAM_QUANTSTEP) {
894cabdff1aSopenharmony_ci        if (params_changed       & PARAM_QUANTSTEP) {
895cabdff1aSopenharmony_ci            put_bits(pb, 1, 1);
896cabdff1aSopenharmony_ci            for (unsigned int ch = 0; ch <= rh->max_channel; ch++)
897cabdff1aSopenharmony_ci                put_bits(pb, 4, dp->quant_step_size[ch]);
898cabdff1aSopenharmony_ci        } else {
899cabdff1aSopenharmony_ci            put_bits(pb, 1, 0);
900cabdff1aSopenharmony_ci        }
901cabdff1aSopenharmony_ci    }
902cabdff1aSopenharmony_ci
903cabdff1aSopenharmony_ci    for (unsigned int ch = rh->min_channel; ch <= rh->max_channel; ch++) {
904cabdff1aSopenharmony_ci        ChannelParams *cp = &ctx->cur_channel_params[ch];
905cabdff1aSopenharmony_ci
906cabdff1aSopenharmony_ci        if (dp->param_presence_flags & 0xF) {
907cabdff1aSopenharmony_ci            put_bits(pb, 1, 1);
908cabdff1aSopenharmony_ci
909cabdff1aSopenharmony_ci            if (dp->param_presence_flags & PARAM_FIR) {
910cabdff1aSopenharmony_ci                if (params_changed       & PARAM_FIR) {
911cabdff1aSopenharmony_ci                    put_bits(pb, 1, 1);
912cabdff1aSopenharmony_ci                    write_filter_params(ctx, pb, ch, FIR);
913cabdff1aSopenharmony_ci                } else {
914cabdff1aSopenharmony_ci                    put_bits(pb, 1, 0);
915cabdff1aSopenharmony_ci                }
916cabdff1aSopenharmony_ci            }
917cabdff1aSopenharmony_ci
918cabdff1aSopenharmony_ci            if (dp->param_presence_flags & PARAM_IIR) {
919cabdff1aSopenharmony_ci                if (params_changed       & PARAM_IIR) {
920cabdff1aSopenharmony_ci                    put_bits(pb, 1, 1);
921cabdff1aSopenharmony_ci                    write_filter_params(ctx, pb, ch, IIR);
922cabdff1aSopenharmony_ci                } else {
923cabdff1aSopenharmony_ci                    put_bits(pb, 1, 0);
924cabdff1aSopenharmony_ci                }
925cabdff1aSopenharmony_ci            }
926cabdff1aSopenharmony_ci
927cabdff1aSopenharmony_ci            if (dp->param_presence_flags & PARAM_HUFFOFFSET) {
928cabdff1aSopenharmony_ci                if (params_changed       & PARAM_HUFFOFFSET) {
929cabdff1aSopenharmony_ci                    put_bits (pb,  1, 1);
930cabdff1aSopenharmony_ci                    put_sbits(pb, 15, cp->huff_offset);
931cabdff1aSopenharmony_ci                } else {
932cabdff1aSopenharmony_ci                    put_bits(pb, 1, 0);
933cabdff1aSopenharmony_ci                }
934cabdff1aSopenharmony_ci            }
935cabdff1aSopenharmony_ci            if (cp->codebook > 0 && cp->huff_lsbs > 24) {
936cabdff1aSopenharmony_ci                av_log(ctx->avctx, AV_LOG_ERROR, "Invalid Huff LSBs\n");
937cabdff1aSopenharmony_ci            }
938cabdff1aSopenharmony_ci
939cabdff1aSopenharmony_ci            put_bits(pb, 2, cp->codebook );
940cabdff1aSopenharmony_ci            put_bits(pb, 5, cp->huff_lsbs);
941cabdff1aSopenharmony_ci        } else {
942cabdff1aSopenharmony_ci            put_bits(pb, 1, 0);
943cabdff1aSopenharmony_ci        }
944cabdff1aSopenharmony_ci    }
945cabdff1aSopenharmony_ci}
946cabdff1aSopenharmony_ci
947cabdff1aSopenharmony_ci/** Writes the residuals to the bitstream. That is, the VLC codes from the
948cabdff1aSopenharmony_ci *  codebooks (if any is used), and then the residual.
949cabdff1aSopenharmony_ci */
950cabdff1aSopenharmony_cistatic void write_block_data(MLPEncodeContext *ctx, PutBitContext *pb)
951cabdff1aSopenharmony_ci{
952cabdff1aSopenharmony_ci    DecodingParams *dp = ctx->cur_decoding_params;
953cabdff1aSopenharmony_ci    RestartHeader  *rh = ctx->cur_restart_header;
954cabdff1aSopenharmony_ci    int32_t *sample_buffer = ctx->write_buffer;
955cabdff1aSopenharmony_ci    int32_t sign_huff_offset[MAX_CHANNELS];
956cabdff1aSopenharmony_ci    int codebook_index      [MAX_CHANNELS];
957cabdff1aSopenharmony_ci    int lsb_bits            [MAX_CHANNELS];
958cabdff1aSopenharmony_ci
959cabdff1aSopenharmony_ci    for (unsigned int ch = rh->min_channel; ch <= rh->max_channel; ch++) {
960cabdff1aSopenharmony_ci        ChannelParams *cp = &ctx->cur_channel_params[ch];
961cabdff1aSopenharmony_ci        int sign_shift;
962cabdff1aSopenharmony_ci
963cabdff1aSopenharmony_ci        lsb_bits        [ch] = cp->huff_lsbs - dp->quant_step_size[ch];
964cabdff1aSopenharmony_ci        codebook_index  [ch] = cp->codebook  - 1;
965cabdff1aSopenharmony_ci        sign_huff_offset[ch] = cp->huff_offset;
966cabdff1aSopenharmony_ci
967cabdff1aSopenharmony_ci        sign_shift = lsb_bits[ch] + (cp->codebook ? 2 - cp->codebook : -1);
968cabdff1aSopenharmony_ci
969cabdff1aSopenharmony_ci        if (cp->codebook > 0)
970cabdff1aSopenharmony_ci            sign_huff_offset[ch] -= 7 << lsb_bits[ch];
971cabdff1aSopenharmony_ci
972cabdff1aSopenharmony_ci        /* Unsign if needed. */
973cabdff1aSopenharmony_ci        if (sign_shift >= 0)
974cabdff1aSopenharmony_ci            sign_huff_offset[ch] -= 1 << sign_shift;
975cabdff1aSopenharmony_ci    }
976cabdff1aSopenharmony_ci
977cabdff1aSopenharmony_ci    for (unsigned int i = 0; i < dp->blocksize; i++) {
978cabdff1aSopenharmony_ci        for (unsigned int ch = rh->min_channel; ch <= rh->max_channel; ch++) {
979cabdff1aSopenharmony_ci            int32_t sample = *sample_buffer++ >> dp->quant_step_size[ch];
980cabdff1aSopenharmony_ci            sample -= sign_huff_offset[ch];
981cabdff1aSopenharmony_ci
982cabdff1aSopenharmony_ci            if (codebook_index[ch] >= 0) {
983cabdff1aSopenharmony_ci                int vlc = sample >> lsb_bits[ch];
984cabdff1aSopenharmony_ci                put_bits(pb, ff_mlp_huffman_tables[codebook_index[ch]][vlc][1],
985cabdff1aSopenharmony_ci                             ff_mlp_huffman_tables[codebook_index[ch]][vlc][0]);
986cabdff1aSopenharmony_ci            }
987cabdff1aSopenharmony_ci
988cabdff1aSopenharmony_ci            put_sbits(pb, lsb_bits[ch], sample);
989cabdff1aSopenharmony_ci        }
990cabdff1aSopenharmony_ci        sample_buffer += 2; /* noise channels */
991cabdff1aSopenharmony_ci    }
992cabdff1aSopenharmony_ci
993cabdff1aSopenharmony_ci    ctx->write_buffer = sample_buffer;
994cabdff1aSopenharmony_ci}
995cabdff1aSopenharmony_ci
996cabdff1aSopenharmony_ci/** Writes the substream data to the bitstream. */
997cabdff1aSopenharmony_cistatic uint8_t *write_substr(MLPEncodeContext *ctx, uint8_t *buf, int buf_size,
998cabdff1aSopenharmony_ci                             int restart_frame,
999cabdff1aSopenharmony_ci                             uint16_t substream_data_len[MAX_SUBSTREAMS])
1000cabdff1aSopenharmony_ci{
1001cabdff1aSopenharmony_ci    int32_t *lossless_check_data = ctx->lossless_check_data;
1002cabdff1aSopenharmony_ci    unsigned int cur_subblock_index = ctx->major_cur_subblock_index;
1003cabdff1aSopenharmony_ci    unsigned int num_subblocks = ctx->major_filter_state_subblock;
1004cabdff1aSopenharmony_ci    RestartHeader  *rh = &ctx->restart_header;
1005cabdff1aSopenharmony_ci    int substr_restart_frame = restart_frame;
1006cabdff1aSopenharmony_ci    uint8_t parity, checksum;
1007cabdff1aSopenharmony_ci    PutBitContext pb;
1008cabdff1aSopenharmony_ci    int params_changed;
1009cabdff1aSopenharmony_ci    int end = 0;
1010cabdff1aSopenharmony_ci
1011cabdff1aSopenharmony_ci    lossless_check_data += ctx->frame_index;
1012cabdff1aSopenharmony_ci    ctx->cur_restart_header = rh;
1013cabdff1aSopenharmony_ci
1014cabdff1aSopenharmony_ci    init_put_bits(&pb, buf, buf_size);
1015cabdff1aSopenharmony_ci
1016cabdff1aSopenharmony_ci    for (unsigned int subblock = 0; subblock <= num_subblocks; subblock++) {
1017cabdff1aSopenharmony_ci        unsigned int subblock_index;
1018cabdff1aSopenharmony_ci
1019cabdff1aSopenharmony_ci        subblock_index = cur_subblock_index++;
1020cabdff1aSopenharmony_ci
1021cabdff1aSopenharmony_ci        ctx->cur_decoding_params = &ctx->major_decoding_params[subblock_index];
1022cabdff1aSopenharmony_ci        ctx->cur_channel_params = ctx->major_channel_params[subblock_index];
1023cabdff1aSopenharmony_ci
1024cabdff1aSopenharmony_ci        params_changed = ctx->major_params_changed[subblock_index];
1025cabdff1aSopenharmony_ci
1026cabdff1aSopenharmony_ci        if (substr_restart_frame || params_changed) {
1027cabdff1aSopenharmony_ci            put_bits(&pb, 1, 1);
1028cabdff1aSopenharmony_ci
1029cabdff1aSopenharmony_ci            if (substr_restart_frame) {
1030cabdff1aSopenharmony_ci                put_bits(&pb, 1, 1);
1031cabdff1aSopenharmony_ci
1032cabdff1aSopenharmony_ci                write_restart_header(ctx, &pb);
1033cabdff1aSopenharmony_ci                rh->lossless_check_data = 0;
1034cabdff1aSopenharmony_ci            } else {
1035cabdff1aSopenharmony_ci                put_bits(&pb, 1, 0);
1036cabdff1aSopenharmony_ci            }
1037cabdff1aSopenharmony_ci
1038cabdff1aSopenharmony_ci            write_decoding_params(ctx, &pb, params_changed);
1039cabdff1aSopenharmony_ci        } else {
1040cabdff1aSopenharmony_ci            put_bits(&pb, 1, 0);
1041cabdff1aSopenharmony_ci        }
1042cabdff1aSopenharmony_ci
1043cabdff1aSopenharmony_ci        write_block_data(ctx, &pb);
1044cabdff1aSopenharmony_ci
1045cabdff1aSopenharmony_ci        put_bits(&pb, 1, !substr_restart_frame);
1046cabdff1aSopenharmony_ci
1047cabdff1aSopenharmony_ci        substr_restart_frame = 0;
1048cabdff1aSopenharmony_ci    }
1049cabdff1aSopenharmony_ci
1050cabdff1aSopenharmony_ci    put_bits(&pb, (-put_bits_count(&pb)) & 15, 0);
1051cabdff1aSopenharmony_ci
1052cabdff1aSopenharmony_ci    rh->lossless_check_data ^= *lossless_check_data++;
1053cabdff1aSopenharmony_ci
1054cabdff1aSopenharmony_ci    if (ctx->last_frames == 0 && ctx->shorten_by) {
1055cabdff1aSopenharmony_ci        if (ctx->avctx->codec_id == AV_CODEC_ID_TRUEHD) {
1056cabdff1aSopenharmony_ci            put_bits(&pb, 16, END_OF_STREAM & 0xFFFF);
1057cabdff1aSopenharmony_ci            put_bits(&pb, 16, (ctx->shorten_by & 0x1FFF) | 0x2000);
1058cabdff1aSopenharmony_ci        } else {
1059cabdff1aSopenharmony_ci            put_bits(&pb, 32, END_OF_STREAM);
1060cabdff1aSopenharmony_ci        }
1061cabdff1aSopenharmony_ci    }
1062cabdff1aSopenharmony_ci
1063cabdff1aSopenharmony_ci    /* Data must be flushed for the checksum and parity to be correct;
1064cabdff1aSopenharmony_ci     * notice that we already are word-aligned here. */
1065cabdff1aSopenharmony_ci    flush_put_bits(&pb);
1066cabdff1aSopenharmony_ci
1067cabdff1aSopenharmony_ci    parity   = ff_mlp_calculate_parity(buf, put_bytes_output(&pb)) ^ 0xa9;
1068cabdff1aSopenharmony_ci    checksum = ff_mlp_checksum8       (buf, put_bytes_output(&pb));
1069cabdff1aSopenharmony_ci
1070cabdff1aSopenharmony_ci    put_bits(&pb, 8, parity  );
1071cabdff1aSopenharmony_ci    put_bits(&pb, 8, checksum);
1072cabdff1aSopenharmony_ci
1073cabdff1aSopenharmony_ci    flush_put_bits(&pb);
1074cabdff1aSopenharmony_ci
1075cabdff1aSopenharmony_ci    end += put_bytes_output(&pb);
1076cabdff1aSopenharmony_ci    substream_data_len[0] = end;
1077cabdff1aSopenharmony_ci
1078cabdff1aSopenharmony_ci    buf += put_bytes_output(&pb);
1079cabdff1aSopenharmony_ci
1080cabdff1aSopenharmony_ci    ctx->major_cur_subblock_index += ctx->major_filter_state_subblock + 1;
1081cabdff1aSopenharmony_ci    ctx->major_filter_state_subblock = 0;
1082cabdff1aSopenharmony_ci
1083cabdff1aSopenharmony_ci    return buf;
1084cabdff1aSopenharmony_ci}
1085cabdff1aSopenharmony_ci
1086cabdff1aSopenharmony_ci/** Writes the access unit and substream headers to the bitstream. */
1087cabdff1aSopenharmony_cistatic void write_frame_headers(MLPEncodeContext *ctx, uint8_t *frame_header,
1088cabdff1aSopenharmony_ci                                uint8_t *substream_headers, unsigned int length,
1089cabdff1aSopenharmony_ci                                int restart_frame,
1090cabdff1aSopenharmony_ci                                uint16_t substream_data_len[1])
1091cabdff1aSopenharmony_ci{
1092cabdff1aSopenharmony_ci    uint16_t access_unit_header = 0;
1093cabdff1aSopenharmony_ci    uint16_t parity_nibble = 0;
1094cabdff1aSopenharmony_ci
1095cabdff1aSopenharmony_ci    parity_nibble  = ctx->dts;
1096cabdff1aSopenharmony_ci    parity_nibble ^= length;
1097cabdff1aSopenharmony_ci
1098cabdff1aSopenharmony_ci    for (unsigned int substr = 0; substr < ctx->num_substreams; substr++) {
1099cabdff1aSopenharmony_ci        uint16_t substr_hdr = 0;
1100cabdff1aSopenharmony_ci
1101cabdff1aSopenharmony_ci        substr_hdr |= (0 << 15); /* extraword */
1102cabdff1aSopenharmony_ci        substr_hdr |= (!restart_frame << 14); /* !restart_frame */
1103cabdff1aSopenharmony_ci        substr_hdr |= (1 << 13); /* checkdata */
1104cabdff1aSopenharmony_ci        substr_hdr |= (0 << 12); /* ??? */
1105cabdff1aSopenharmony_ci        substr_hdr |= (substream_data_len[substr] / 2) & 0x0FFF;
1106cabdff1aSopenharmony_ci
1107cabdff1aSopenharmony_ci        AV_WB16(substream_headers, substr_hdr);
1108cabdff1aSopenharmony_ci
1109cabdff1aSopenharmony_ci        parity_nibble ^= *substream_headers++;
1110cabdff1aSopenharmony_ci        parity_nibble ^= *substream_headers++;
1111cabdff1aSopenharmony_ci    }
1112cabdff1aSopenharmony_ci
1113cabdff1aSopenharmony_ci    parity_nibble ^= parity_nibble >> 8;
1114cabdff1aSopenharmony_ci    parity_nibble ^= parity_nibble >> 4;
1115cabdff1aSopenharmony_ci    parity_nibble &= 0xF;
1116cabdff1aSopenharmony_ci
1117cabdff1aSopenharmony_ci    access_unit_header |= (parity_nibble ^ 0xF) << 12;
1118cabdff1aSopenharmony_ci    access_unit_header |= length & 0xFFF;
1119cabdff1aSopenharmony_ci
1120cabdff1aSopenharmony_ci    AV_WB16(frame_header  , access_unit_header);
1121cabdff1aSopenharmony_ci    AV_WB16(frame_header+2, ctx->dts          );
1122cabdff1aSopenharmony_ci}
1123cabdff1aSopenharmony_ci
1124cabdff1aSopenharmony_ci/** Writes an entire access unit to the bitstream. */
1125cabdff1aSopenharmony_cistatic int write_access_unit(MLPEncodeContext *ctx, uint8_t *buf,
1126cabdff1aSopenharmony_ci                             int buf_size, int restart_frame)
1127cabdff1aSopenharmony_ci{
1128cabdff1aSopenharmony_ci    uint16_t substream_data_len[MAX_SUBSTREAMS];
1129cabdff1aSopenharmony_ci    uint8_t *buf1, *buf0 = buf;
1130cabdff1aSopenharmony_ci    int total_length;
1131cabdff1aSopenharmony_ci
1132cabdff1aSopenharmony_ci    /* Frame header will be written at the end. */
1133cabdff1aSopenharmony_ci    buf      += 4;
1134cabdff1aSopenharmony_ci    buf_size -= 4;
1135cabdff1aSopenharmony_ci
1136cabdff1aSopenharmony_ci    if (restart_frame) {
1137cabdff1aSopenharmony_ci        write_major_sync(ctx, buf, buf_size);
1138cabdff1aSopenharmony_ci        buf      += 28;
1139cabdff1aSopenharmony_ci        buf_size -= 28;
1140cabdff1aSopenharmony_ci    }
1141cabdff1aSopenharmony_ci
1142cabdff1aSopenharmony_ci    buf1 = buf;
1143cabdff1aSopenharmony_ci
1144cabdff1aSopenharmony_ci    /* Substream headers will be written at the end. */
1145cabdff1aSopenharmony_ci    for (unsigned int substr = 0; substr < ctx->num_substreams; substr++) {
1146cabdff1aSopenharmony_ci        buf      += 2;
1147cabdff1aSopenharmony_ci        buf_size -= 2;
1148cabdff1aSopenharmony_ci    }
1149cabdff1aSopenharmony_ci
1150cabdff1aSopenharmony_ci    buf = write_substr(ctx, buf, buf_size, restart_frame, &substream_data_len[0]);
1151cabdff1aSopenharmony_ci
1152cabdff1aSopenharmony_ci    total_length = buf - buf0;
1153cabdff1aSopenharmony_ci
1154cabdff1aSopenharmony_ci    write_frame_headers(ctx, buf0, buf1, total_length / 2, restart_frame, substream_data_len);
1155cabdff1aSopenharmony_ci
1156cabdff1aSopenharmony_ci    return total_length;
1157cabdff1aSopenharmony_ci}
1158cabdff1aSopenharmony_ci
1159cabdff1aSopenharmony_ci/****************************************************************************
1160cabdff1aSopenharmony_ci ****************** Functions that input data to context ********************
1161cabdff1aSopenharmony_ci ****************************************************************************/
1162cabdff1aSopenharmony_ci
1163cabdff1aSopenharmony_ci/** Inputs data from the samples passed by lavc into the context, shifts them
1164cabdff1aSopenharmony_ci *  appropriately depending on the bit-depth, and calculates the
1165cabdff1aSopenharmony_ci *  lossless_check_data that will be written to the restart header.
1166cabdff1aSopenharmony_ci */
1167cabdff1aSopenharmony_cistatic void input_data_internal(MLPEncodeContext *ctx, const uint8_t *samples,
1168cabdff1aSopenharmony_ci                                int nb_samples,
1169cabdff1aSopenharmony_ci                                int is24)
1170cabdff1aSopenharmony_ci{
1171cabdff1aSopenharmony_ci    int32_t *lossless_check_data = ctx->lossless_check_data;
1172cabdff1aSopenharmony_ci    const int32_t *samples_32 = (const int32_t *) samples;
1173cabdff1aSopenharmony_ci    const int16_t *samples_16 = (const int16_t *) samples;
1174cabdff1aSopenharmony_ci    RestartHeader *rh = &ctx->restart_header;
1175cabdff1aSopenharmony_ci    int32_t *sample_buffer = ctx->inout_buffer;
1176cabdff1aSopenharmony_ci    int32_t temp_lossless_check_data = 0;
1177cabdff1aSopenharmony_ci    uint32_t greatest = 0;
1178cabdff1aSopenharmony_ci
1179cabdff1aSopenharmony_ci    lossless_check_data += ctx->frame_index;
1180cabdff1aSopenharmony_ci
1181cabdff1aSopenharmony_ci    for (int i = 0; i < nb_samples; i++) {
1182cabdff1aSopenharmony_ci        for (unsigned int channel = 0; channel <= rh->max_channel; channel++) {
1183cabdff1aSopenharmony_ci            uint32_t abs_sample;
1184cabdff1aSopenharmony_ci            int32_t sample;
1185cabdff1aSopenharmony_ci
1186cabdff1aSopenharmony_ci            sample = is24 ? *samples_32++ >> 8 : *samples_16++ * 256;
1187cabdff1aSopenharmony_ci
1188cabdff1aSopenharmony_ci            /* TODO Find out if number_sbits can be used for negative values. */
1189cabdff1aSopenharmony_ci            abs_sample = FFABS(sample);
1190cabdff1aSopenharmony_ci            greatest = FFMAX(greatest, abs_sample);
1191cabdff1aSopenharmony_ci
1192cabdff1aSopenharmony_ci            temp_lossless_check_data ^= (sample & 0x00ffffff) << channel;
1193cabdff1aSopenharmony_ci            *sample_buffer++ = sample;
1194cabdff1aSopenharmony_ci        }
1195cabdff1aSopenharmony_ci
1196cabdff1aSopenharmony_ci        sample_buffer += 2; /* noise channels */
1197cabdff1aSopenharmony_ci    }
1198cabdff1aSopenharmony_ci
1199cabdff1aSopenharmony_ci    ctx->max_output_bits[ctx->frame_index] = number_sbits(greatest);
1200cabdff1aSopenharmony_ci
1201cabdff1aSopenharmony_ci    *lossless_check_data++ = temp_lossless_check_data;
1202cabdff1aSopenharmony_ci}
1203cabdff1aSopenharmony_ci
1204cabdff1aSopenharmony_ci/** Wrapper function for inputting data in two different bit-depths. */
1205cabdff1aSopenharmony_cistatic void input_data(MLPEncodeContext *ctx, void *samples, int nb_samples)
1206cabdff1aSopenharmony_ci{
1207cabdff1aSopenharmony_ci    input_data_internal(ctx, samples, nb_samples, ctx->avctx->sample_fmt == AV_SAMPLE_FMT_S32);
1208cabdff1aSopenharmony_ci}
1209cabdff1aSopenharmony_ci
1210cabdff1aSopenharmony_cistatic void input_to_sample_buffer(MLPEncodeContext *ctx)
1211cabdff1aSopenharmony_ci{
1212cabdff1aSopenharmony_ci    int32_t *sample_buffer = ctx->sample_buffer;
1213cabdff1aSopenharmony_ci
1214cabdff1aSopenharmony_ci    for (unsigned int index = 0; index < ctx->number_of_frames; index++) {
1215cabdff1aSopenharmony_ci        unsigned int cur_index = (ctx->frame_index + index + 1) % ctx->max_restart_interval;
1216cabdff1aSopenharmony_ci        int32_t *input_buffer = ctx->inout_buffer + cur_index * ctx->one_sample_buffer_size;
1217cabdff1aSopenharmony_ci
1218cabdff1aSopenharmony_ci        for (unsigned int i = 0; i < ctx->avctx->frame_size; i++) {
1219cabdff1aSopenharmony_ci            for (unsigned int channel = 0; channel < ctx->avctx->ch_layout.nb_channels; channel++)
1220cabdff1aSopenharmony_ci                *sample_buffer++ = *input_buffer++;
1221cabdff1aSopenharmony_ci            sample_buffer += 2; /* noise_channels */
1222cabdff1aSopenharmony_ci            input_buffer += 2; /* noise_channels */
1223cabdff1aSopenharmony_ci        }
1224cabdff1aSopenharmony_ci    }
1225cabdff1aSopenharmony_ci}
1226cabdff1aSopenharmony_ci
1227cabdff1aSopenharmony_ci/****************************************************************************
1228cabdff1aSopenharmony_ci ********* Functions that analyze the data and set the parameters ***********
1229cabdff1aSopenharmony_ci ****************************************************************************/
1230cabdff1aSopenharmony_ci
1231cabdff1aSopenharmony_ci/** Counts the number of trailing zeroes in a value */
1232cabdff1aSopenharmony_cistatic int number_trailing_zeroes(int32_t sample)
1233cabdff1aSopenharmony_ci{
1234cabdff1aSopenharmony_ci    int bits = ff_ctz(sample);
1235cabdff1aSopenharmony_ci
1236cabdff1aSopenharmony_ci    /* All samples are 0. TODO Return previous quant_step_size to avoid
1237cabdff1aSopenharmony_ci     * writing a new header. */
1238cabdff1aSopenharmony_ci    if (bits >= 24)
1239cabdff1aSopenharmony_ci        return 0;
1240cabdff1aSopenharmony_ci
1241cabdff1aSopenharmony_ci    return bits;
1242cabdff1aSopenharmony_ci}
1243cabdff1aSopenharmony_ci
1244cabdff1aSopenharmony_ci/** Determines how many bits are zero at the end of all samples so they can be
1245cabdff1aSopenharmony_ci *  shifted out.
1246cabdff1aSopenharmony_ci */
1247cabdff1aSopenharmony_cistatic void determine_quant_step_size(MLPEncodeContext *ctx)
1248cabdff1aSopenharmony_ci{
1249cabdff1aSopenharmony_ci    DecodingParams *dp = ctx->cur_decoding_params;
1250cabdff1aSopenharmony_ci    RestartHeader  *rh = ctx->cur_restart_header;
1251cabdff1aSopenharmony_ci    MatrixParams *mp = &dp->matrix_params;
1252cabdff1aSopenharmony_ci    int32_t *sample_buffer = ctx->sample_buffer;
1253cabdff1aSopenharmony_ci    int32_t sample_mask[MAX_CHANNELS];
1254cabdff1aSopenharmony_ci
1255cabdff1aSopenharmony_ci    memset(sample_mask, 0x00, sizeof(sample_mask));
1256cabdff1aSopenharmony_ci
1257cabdff1aSopenharmony_ci    for (unsigned int i = 0; i < ctx->number_of_samples; i++) {
1258cabdff1aSopenharmony_ci        for (unsigned int channel = 0; channel <= rh->max_channel; channel++)
1259cabdff1aSopenharmony_ci            sample_mask[channel] |= *sample_buffer++;
1260cabdff1aSopenharmony_ci
1261cabdff1aSopenharmony_ci        sample_buffer += 2; /* noise channels */
1262cabdff1aSopenharmony_ci    }
1263cabdff1aSopenharmony_ci
1264cabdff1aSopenharmony_ci    for (unsigned int channel = 0; channel <= rh->max_channel; channel++)
1265cabdff1aSopenharmony_ci        dp->quant_step_size[channel] = number_trailing_zeroes(sample_mask[channel]) - mp->shift[channel];
1266cabdff1aSopenharmony_ci}
1267cabdff1aSopenharmony_ci
1268cabdff1aSopenharmony_ci/** Determines the smallest number of bits needed to encode the filter
1269cabdff1aSopenharmony_ci *  coefficients, and if it's possible to right-shift their values without
1270cabdff1aSopenharmony_ci *  losing any precision.
1271cabdff1aSopenharmony_ci */
1272cabdff1aSopenharmony_cistatic void code_filter_coeffs(MLPEncodeContext *ctx, FilterParams *fp, int32_t *fcoeff)
1273cabdff1aSopenharmony_ci{
1274cabdff1aSopenharmony_ci    int min = INT_MAX, max = INT_MIN;
1275cabdff1aSopenharmony_ci    int bits, shift;
1276cabdff1aSopenharmony_ci    int coeff_mask = 0;
1277cabdff1aSopenharmony_ci
1278cabdff1aSopenharmony_ci    for (int order = 0; order < fp->order; order++) {
1279cabdff1aSopenharmony_ci        int coeff = fcoeff[order];
1280cabdff1aSopenharmony_ci
1281cabdff1aSopenharmony_ci        if (coeff < min)
1282cabdff1aSopenharmony_ci            min = coeff;
1283cabdff1aSopenharmony_ci        if (coeff > max)
1284cabdff1aSopenharmony_ci            max = coeff;
1285cabdff1aSopenharmony_ci
1286cabdff1aSopenharmony_ci        coeff_mask |= coeff;
1287cabdff1aSopenharmony_ci    }
1288cabdff1aSopenharmony_ci
1289cabdff1aSopenharmony_ci    bits = FFMAX(number_sbits(min), number_sbits(max));
1290cabdff1aSopenharmony_ci
1291cabdff1aSopenharmony_ci    for (shift = 0; shift < 7 && bits + shift < 16 && !(coeff_mask & (1<<shift)); shift++);
1292cabdff1aSopenharmony_ci
1293cabdff1aSopenharmony_ci    fp->coeff_bits  = bits;
1294cabdff1aSopenharmony_ci    fp->coeff_shift = shift;
1295cabdff1aSopenharmony_ci}
1296cabdff1aSopenharmony_ci
1297cabdff1aSopenharmony_ci/** Determines the best filter parameters for the given data and writes the
1298cabdff1aSopenharmony_ci *  necessary information to the context.
1299cabdff1aSopenharmony_ci *  TODO Add IIR filter predictor!
1300cabdff1aSopenharmony_ci */
1301cabdff1aSopenharmony_cistatic void set_filter_params(MLPEncodeContext *ctx,
1302cabdff1aSopenharmony_ci                              unsigned int channel, unsigned int filter,
1303cabdff1aSopenharmony_ci                              int clear_filter)
1304cabdff1aSopenharmony_ci{
1305cabdff1aSopenharmony_ci    ChannelParams *cp = &ctx->cur_channel_params[channel];
1306cabdff1aSopenharmony_ci    FilterParams *fp = &cp->filter_params[filter];
1307cabdff1aSopenharmony_ci
1308cabdff1aSopenharmony_ci    if ((filter == IIR && ctx->substream_info & SUBSTREAM_INFO_HIGH_RATE) ||
1309cabdff1aSopenharmony_ci        clear_filter) {
1310cabdff1aSopenharmony_ci        fp->order = 0;
1311cabdff1aSopenharmony_ci    } else if (filter == IIR) {
1312cabdff1aSopenharmony_ci        fp->order = 0;
1313cabdff1aSopenharmony_ci    } else if (filter == FIR) {
1314cabdff1aSopenharmony_ci        const int max_order = (ctx->substream_info & SUBSTREAM_INFO_HIGH_RATE)
1315cabdff1aSopenharmony_ci                              ? 4 : MLP_MAX_LPC_ORDER;
1316cabdff1aSopenharmony_ci        int32_t *sample_buffer = ctx->sample_buffer + channel;
1317cabdff1aSopenharmony_ci        int32_t coefs[MAX_LPC_ORDER][MAX_LPC_ORDER];
1318cabdff1aSopenharmony_ci        int32_t *lpc_samples = ctx->lpc_sample_buffer;
1319cabdff1aSopenharmony_ci        int32_t *fcoeff = ctx->cur_channel_params[channel].coeff[filter];
1320cabdff1aSopenharmony_ci        int shift[MLP_MAX_LPC_ORDER];
1321cabdff1aSopenharmony_ci        int order;
1322cabdff1aSopenharmony_ci
1323cabdff1aSopenharmony_ci        for (unsigned int i = 0; i < ctx->number_of_samples; i++) {
1324cabdff1aSopenharmony_ci            *lpc_samples++ = *sample_buffer;
1325cabdff1aSopenharmony_ci            sample_buffer += ctx->num_channels;
1326cabdff1aSopenharmony_ci        }
1327cabdff1aSopenharmony_ci
1328cabdff1aSopenharmony_ci        order = ff_lpc_calc_coefs(&ctx->lpc_ctx, ctx->lpc_sample_buffer,
1329cabdff1aSopenharmony_ci                                  ctx->number_of_samples, MLP_MIN_LPC_ORDER,
1330cabdff1aSopenharmony_ci                                  max_order, 11, coefs, shift, FF_LPC_TYPE_LEVINSON, 0,
1331cabdff1aSopenharmony_ci                                  ORDER_METHOD_EST, MLP_MIN_LPC_SHIFT,
1332cabdff1aSopenharmony_ci                                  MLP_MAX_LPC_SHIFT, MLP_MIN_LPC_SHIFT);
1333cabdff1aSopenharmony_ci
1334cabdff1aSopenharmony_ci        fp->order = order;
1335cabdff1aSopenharmony_ci        fp->shift = shift[order-1];
1336cabdff1aSopenharmony_ci
1337cabdff1aSopenharmony_ci        for (unsigned int i = 0; i < order; i++)
1338cabdff1aSopenharmony_ci            fcoeff[i] = coefs[order-1][i];
1339cabdff1aSopenharmony_ci
1340cabdff1aSopenharmony_ci        code_filter_coeffs(ctx, fp, fcoeff);
1341cabdff1aSopenharmony_ci    }
1342cabdff1aSopenharmony_ci}
1343cabdff1aSopenharmony_ci
1344cabdff1aSopenharmony_ci/** Tries to determine a good prediction filter, and applies it to the samples
1345cabdff1aSopenharmony_ci *  buffer if the filter is good enough. Sets the filter data to be cleared if
1346cabdff1aSopenharmony_ci *  no good filter was found.
1347cabdff1aSopenharmony_ci */
1348cabdff1aSopenharmony_cistatic void determine_filters(MLPEncodeContext *ctx)
1349cabdff1aSopenharmony_ci{
1350cabdff1aSopenharmony_ci    RestartHeader *rh = ctx->cur_restart_header;
1351cabdff1aSopenharmony_ci
1352cabdff1aSopenharmony_ci    for (int channel = rh->min_channel; channel <= rh->max_channel; channel++) {
1353cabdff1aSopenharmony_ci        for (int filter = 0; filter < NUM_FILTERS; filter++)
1354cabdff1aSopenharmony_ci            set_filter_params(ctx, channel, filter, 0);
1355cabdff1aSopenharmony_ci    }
1356cabdff1aSopenharmony_ci}
1357cabdff1aSopenharmony_ci
1358cabdff1aSopenharmony_cienum MLPChMode {
1359cabdff1aSopenharmony_ci    MLP_CHMODE_LEFT_RIGHT,
1360cabdff1aSopenharmony_ci    MLP_CHMODE_LEFT_SIDE,
1361cabdff1aSopenharmony_ci    MLP_CHMODE_RIGHT_SIDE,
1362cabdff1aSopenharmony_ci    MLP_CHMODE_MID_SIDE,
1363cabdff1aSopenharmony_ci};
1364cabdff1aSopenharmony_ci
1365cabdff1aSopenharmony_cistatic enum MLPChMode estimate_stereo_mode(MLPEncodeContext *ctx)
1366cabdff1aSopenharmony_ci{
1367cabdff1aSopenharmony_ci    uint64_t score[4], sum[4] = { 0, 0, 0, 0, };
1368cabdff1aSopenharmony_ci    int32_t *right_ch = ctx->sample_buffer + 1;
1369cabdff1aSopenharmony_ci    int32_t *left_ch  = ctx->sample_buffer;
1370cabdff1aSopenharmony_ci    int i;
1371cabdff1aSopenharmony_ci    enum MLPChMode best = 0;
1372cabdff1aSopenharmony_ci
1373cabdff1aSopenharmony_ci    for(i = 2; i < ctx->number_of_samples; i++) {
1374cabdff1aSopenharmony_ci        int32_t left  = left_ch [i * ctx->num_channels] - 2 * left_ch [(i - 1) * ctx->num_channels] + left_ch [(i - 2) * ctx->num_channels];
1375cabdff1aSopenharmony_ci        int32_t right = right_ch[i * ctx->num_channels] - 2 * right_ch[(i - 1) * ctx->num_channels] + right_ch[(i - 2) * ctx->num_channels];
1376cabdff1aSopenharmony_ci
1377cabdff1aSopenharmony_ci        sum[0] += FFABS( left        );
1378cabdff1aSopenharmony_ci        sum[1] += FFABS(        right);
1379cabdff1aSopenharmony_ci        sum[2] += FFABS((left + right) >> 1);
1380cabdff1aSopenharmony_ci        sum[3] += FFABS( left - right);
1381cabdff1aSopenharmony_ci    }
1382cabdff1aSopenharmony_ci
1383cabdff1aSopenharmony_ci    score[MLP_CHMODE_LEFT_RIGHT] = sum[0] + sum[1];
1384cabdff1aSopenharmony_ci    score[MLP_CHMODE_LEFT_SIDE]  = sum[0] + sum[3];
1385cabdff1aSopenharmony_ci    score[MLP_CHMODE_RIGHT_SIDE] = sum[1] + sum[3];
1386cabdff1aSopenharmony_ci    score[MLP_CHMODE_MID_SIDE]   = sum[2] + sum[3];
1387cabdff1aSopenharmony_ci
1388cabdff1aSopenharmony_ci    for(i = 1; i < 3; i++)
1389cabdff1aSopenharmony_ci        if(score[i] < score[best])
1390cabdff1aSopenharmony_ci            best = i;
1391cabdff1aSopenharmony_ci
1392cabdff1aSopenharmony_ci    return best;
1393cabdff1aSopenharmony_ci}
1394cabdff1aSopenharmony_ci
1395cabdff1aSopenharmony_ci/** Determines how many fractional bits are needed to encode matrix
1396cabdff1aSopenharmony_ci *  coefficients. Also shifts the coefficients to fit within 2.14 bits.
1397cabdff1aSopenharmony_ci */
1398cabdff1aSopenharmony_cistatic void code_matrix_coeffs(MLPEncodeContext *ctx, unsigned int mat)
1399cabdff1aSopenharmony_ci{
1400cabdff1aSopenharmony_ci    DecodingParams *dp = ctx->cur_decoding_params;
1401cabdff1aSopenharmony_ci    MatrixParams *mp = &dp->matrix_params;
1402cabdff1aSopenharmony_ci    int32_t coeff_mask = 0;
1403cabdff1aSopenharmony_ci    unsigned int bits;
1404cabdff1aSopenharmony_ci
1405cabdff1aSopenharmony_ci    for (unsigned int channel = 0; channel < ctx->num_channels; channel++) {
1406cabdff1aSopenharmony_ci        int32_t coeff = mp->coeff[mat][channel];
1407cabdff1aSopenharmony_ci        coeff_mask |= coeff;
1408cabdff1aSopenharmony_ci    }
1409cabdff1aSopenharmony_ci
1410cabdff1aSopenharmony_ci    for (bits = 0; bits < 14 && !(coeff_mask & (1<<bits)); bits++);
1411cabdff1aSopenharmony_ci
1412cabdff1aSopenharmony_ci    mp->fbits   [mat] = 14 - bits;
1413cabdff1aSopenharmony_ci}
1414cabdff1aSopenharmony_ci
1415cabdff1aSopenharmony_ci/** Determines best coefficients to use for the lossless matrix. */
1416cabdff1aSopenharmony_cistatic void lossless_matrix_coeffs(MLPEncodeContext *ctx)
1417cabdff1aSopenharmony_ci{
1418cabdff1aSopenharmony_ci    DecodingParams *dp = ctx->cur_decoding_params;
1419cabdff1aSopenharmony_ci    MatrixParams *mp = &dp->matrix_params;
1420cabdff1aSopenharmony_ci    unsigned int shift = 0;
1421cabdff1aSopenharmony_ci    enum MLPChMode mode;
1422cabdff1aSopenharmony_ci
1423cabdff1aSopenharmony_ci    /* No decorrelation for non-stereo. */
1424cabdff1aSopenharmony_ci    if (ctx->num_channels - 2 != 2) {
1425cabdff1aSopenharmony_ci        mp->count = 0;
1426cabdff1aSopenharmony_ci        return;
1427cabdff1aSopenharmony_ci    }
1428cabdff1aSopenharmony_ci
1429cabdff1aSopenharmony_ci    mode = estimate_stereo_mode(ctx);
1430cabdff1aSopenharmony_ci
1431cabdff1aSopenharmony_ci    switch (mode) {
1432cabdff1aSopenharmony_ci    /* TODO: add matrix for MID_SIDE */
1433cabdff1aSopenharmony_ci    case MLP_CHMODE_MID_SIDE:
1434cabdff1aSopenharmony_ci    case MLP_CHMODE_LEFT_RIGHT:
1435cabdff1aSopenharmony_ci        mp->count    = 0;
1436cabdff1aSopenharmony_ci        break;
1437cabdff1aSopenharmony_ci    case MLP_CHMODE_LEFT_SIDE:
1438cabdff1aSopenharmony_ci        mp->count    = 1;
1439cabdff1aSopenharmony_ci        mp->outch[0] = 1;
1440cabdff1aSopenharmony_ci        mp->coeff[0][0] =  1 << 14; mp->coeff[0][1] = -(1 << 14);
1441cabdff1aSopenharmony_ci        mp->coeff[0][2] =  0 << 14; mp->coeff[0][2] =   0 << 14;
1442cabdff1aSopenharmony_ci        mp->forco[0][0] =  1 << 14; mp->forco[0][1] = -(1 << 14);
1443cabdff1aSopenharmony_ci        mp->forco[0][2] =  0 << 14; mp->forco[0][2] =   0 << 14;
1444cabdff1aSopenharmony_ci        break;
1445cabdff1aSopenharmony_ci    case MLP_CHMODE_RIGHT_SIDE:
1446cabdff1aSopenharmony_ci        mp->count    = 1;
1447cabdff1aSopenharmony_ci        mp->outch[0] = 0;
1448cabdff1aSopenharmony_ci        mp->coeff[0][0] =  1 << 14; mp->coeff[0][1] =   1 << 14;
1449cabdff1aSopenharmony_ci        mp->coeff[0][2] =  0 << 14; mp->coeff[0][2] =   0 << 14;
1450cabdff1aSopenharmony_ci        mp->forco[0][0] =  1 << 14; mp->forco[0][1] = -(1 << 14);
1451cabdff1aSopenharmony_ci        mp->forco[0][2] =  0 << 14; mp->forco[0][2] =   0 << 14;
1452cabdff1aSopenharmony_ci        break;
1453cabdff1aSopenharmony_ci    }
1454cabdff1aSopenharmony_ci
1455cabdff1aSopenharmony_ci    for (int mat = 0; mat < mp->count; mat++)
1456cabdff1aSopenharmony_ci        code_matrix_coeffs(ctx, mat);
1457cabdff1aSopenharmony_ci
1458cabdff1aSopenharmony_ci    for (unsigned int channel = 0; channel < ctx->num_channels; channel++)
1459cabdff1aSopenharmony_ci        mp->shift[channel] = shift;
1460cabdff1aSopenharmony_ci}
1461cabdff1aSopenharmony_ci
1462cabdff1aSopenharmony_ci/** Min and max values that can be encoded with each codebook. The values for
1463cabdff1aSopenharmony_ci *  the third codebook take into account the fact that the sign shift for this
1464cabdff1aSopenharmony_ci *  codebook is outside the coded value, so it has one more bit of precision.
1465cabdff1aSopenharmony_ci *  It should actually be -7 -> 7, shifted down by 0.5.
1466cabdff1aSopenharmony_ci */
1467cabdff1aSopenharmony_cistatic const int codebook_extremes[3][2] = {
1468cabdff1aSopenharmony_ci    {-9, 8}, {-8, 7}, {-15, 14},
1469cabdff1aSopenharmony_ci};
1470cabdff1aSopenharmony_ci
1471cabdff1aSopenharmony_ci/** Determines the amount of bits needed to encode the samples using no
1472cabdff1aSopenharmony_ci *  codebooks and a specified offset.
1473cabdff1aSopenharmony_ci */
1474cabdff1aSopenharmony_cistatic void no_codebook_bits_offset(MLPEncodeContext *ctx,
1475cabdff1aSopenharmony_ci                                    unsigned int channel, int16_t offset,
1476cabdff1aSopenharmony_ci                                    int32_t min, int32_t max,
1477cabdff1aSopenharmony_ci                                    BestOffset *bo)
1478cabdff1aSopenharmony_ci{
1479cabdff1aSopenharmony_ci    DecodingParams *dp = ctx->cur_decoding_params;
1480cabdff1aSopenharmony_ci    int32_t unsign = 0;
1481cabdff1aSopenharmony_ci    int lsb_bits;
1482cabdff1aSopenharmony_ci
1483cabdff1aSopenharmony_ci    min -= offset;
1484cabdff1aSopenharmony_ci    max -= offset;
1485cabdff1aSopenharmony_ci
1486cabdff1aSopenharmony_ci    lsb_bits = FFMAX(number_sbits(min), number_sbits(max)) - 1;
1487cabdff1aSopenharmony_ci
1488cabdff1aSopenharmony_ci    lsb_bits += !!lsb_bits;
1489cabdff1aSopenharmony_ci
1490cabdff1aSopenharmony_ci    if (lsb_bits > 0)
1491cabdff1aSopenharmony_ci        unsign = 1 << (lsb_bits - 1);
1492cabdff1aSopenharmony_ci
1493cabdff1aSopenharmony_ci    bo->offset   = offset;
1494cabdff1aSopenharmony_ci    bo->lsb_bits = lsb_bits;
1495cabdff1aSopenharmony_ci    bo->bitcount = lsb_bits * dp->blocksize;
1496cabdff1aSopenharmony_ci    bo->min      = offset - unsign + 1;
1497cabdff1aSopenharmony_ci    bo->max      = offset + unsign;
1498cabdff1aSopenharmony_ci}
1499cabdff1aSopenharmony_ci
1500cabdff1aSopenharmony_ci/** Determines the least amount of bits needed to encode the samples using no
1501cabdff1aSopenharmony_ci *  codebooks.
1502cabdff1aSopenharmony_ci */
1503cabdff1aSopenharmony_cistatic void no_codebook_bits(MLPEncodeContext *ctx,
1504cabdff1aSopenharmony_ci                             unsigned int channel,
1505cabdff1aSopenharmony_ci                             int32_t min, int32_t max,
1506cabdff1aSopenharmony_ci                             BestOffset *bo)
1507cabdff1aSopenharmony_ci{
1508cabdff1aSopenharmony_ci    DecodingParams *dp = ctx->cur_decoding_params;
1509cabdff1aSopenharmony_ci    int16_t offset;
1510cabdff1aSopenharmony_ci    int32_t unsign = 0;
1511cabdff1aSopenharmony_ci    uint32_t diff;
1512cabdff1aSopenharmony_ci    int lsb_bits;
1513cabdff1aSopenharmony_ci
1514cabdff1aSopenharmony_ci    /* Set offset inside huffoffset's boundaries by adjusting extremes
1515cabdff1aSopenharmony_ci     * so that more bits are used, thus shifting the offset. */
1516cabdff1aSopenharmony_ci    if (min < HUFF_OFFSET_MIN)
1517cabdff1aSopenharmony_ci        max = FFMAX(max, 2 * HUFF_OFFSET_MIN - min + 1);
1518cabdff1aSopenharmony_ci    if (max > HUFF_OFFSET_MAX)
1519cabdff1aSopenharmony_ci        min = FFMIN(min, 2 * HUFF_OFFSET_MAX - max - 1);
1520cabdff1aSopenharmony_ci
1521cabdff1aSopenharmony_ci    /* Determine offset and minimum number of bits. */
1522cabdff1aSopenharmony_ci    diff = max - min;
1523cabdff1aSopenharmony_ci
1524cabdff1aSopenharmony_ci    lsb_bits = number_sbits(diff) - 1;
1525cabdff1aSopenharmony_ci
1526cabdff1aSopenharmony_ci    if (lsb_bits > 0)
1527cabdff1aSopenharmony_ci        unsign = 1 << (lsb_bits - 1);
1528cabdff1aSopenharmony_ci
1529cabdff1aSopenharmony_ci    /* If all samples are the same (lsb_bits == 0), offset must be
1530cabdff1aSopenharmony_ci     * adjusted because of sign_shift. */
1531cabdff1aSopenharmony_ci    offset = min + diff / 2 + !!lsb_bits;
1532cabdff1aSopenharmony_ci
1533cabdff1aSopenharmony_ci    bo->offset   = offset;
1534cabdff1aSopenharmony_ci    bo->lsb_bits = lsb_bits;
1535cabdff1aSopenharmony_ci    bo->bitcount = lsb_bits * dp->blocksize;
1536cabdff1aSopenharmony_ci    bo->min      = max - unsign + 1;
1537cabdff1aSopenharmony_ci    bo->max      = min + unsign;
1538cabdff1aSopenharmony_ci}
1539cabdff1aSopenharmony_ci
1540cabdff1aSopenharmony_ci/** Determines the least amount of bits needed to encode the samples using a
1541cabdff1aSopenharmony_ci *  given codebook and a given offset.
1542cabdff1aSopenharmony_ci */
1543cabdff1aSopenharmony_cistatic inline void codebook_bits_offset(MLPEncodeContext *ctx,
1544cabdff1aSopenharmony_ci                                        unsigned int channel, int codebook,
1545cabdff1aSopenharmony_ci                                        int32_t sample_min, int32_t sample_max,
1546cabdff1aSopenharmony_ci                                        int16_t offset, BestOffset *bo)
1547cabdff1aSopenharmony_ci{
1548cabdff1aSopenharmony_ci    int32_t codebook_min = codebook_extremes[codebook][0];
1549cabdff1aSopenharmony_ci    int32_t codebook_max = codebook_extremes[codebook][1];
1550cabdff1aSopenharmony_ci    int32_t *sample_buffer = ctx->sample_buffer + channel;
1551cabdff1aSopenharmony_ci    DecodingParams *dp = ctx->cur_decoding_params;
1552cabdff1aSopenharmony_ci    int codebook_offset  = 7 + (2 - codebook);
1553cabdff1aSopenharmony_ci    int32_t unsign_offset = offset;
1554cabdff1aSopenharmony_ci    int lsb_bits = 0, bitcount = 0;
1555cabdff1aSopenharmony_ci    int offset_min = INT_MAX, offset_max = INT_MAX;
1556cabdff1aSopenharmony_ci    int unsign, mask;
1557cabdff1aSopenharmony_ci
1558cabdff1aSopenharmony_ci    sample_min -= offset;
1559cabdff1aSopenharmony_ci    sample_max -= offset;
1560cabdff1aSopenharmony_ci
1561cabdff1aSopenharmony_ci    while (sample_min < codebook_min || sample_max > codebook_max) {
1562cabdff1aSopenharmony_ci        lsb_bits++;
1563cabdff1aSopenharmony_ci        sample_min >>= 1;
1564cabdff1aSopenharmony_ci        sample_max >>= 1;
1565cabdff1aSopenharmony_ci    }
1566cabdff1aSopenharmony_ci
1567cabdff1aSopenharmony_ci    unsign = 1 << lsb_bits;
1568cabdff1aSopenharmony_ci    mask   = unsign - 1;
1569cabdff1aSopenharmony_ci
1570cabdff1aSopenharmony_ci    if (codebook == 2) {
1571cabdff1aSopenharmony_ci        unsign_offset -= unsign;
1572cabdff1aSopenharmony_ci        lsb_bits++;
1573cabdff1aSopenharmony_ci    }
1574cabdff1aSopenharmony_ci
1575cabdff1aSopenharmony_ci    for (int i = 0; i < dp->blocksize; i++) {
1576cabdff1aSopenharmony_ci        int32_t sample = *sample_buffer >> dp->quant_step_size[channel];
1577cabdff1aSopenharmony_ci        int temp_min, temp_max;
1578cabdff1aSopenharmony_ci
1579cabdff1aSopenharmony_ci        sample -= unsign_offset;
1580cabdff1aSopenharmony_ci
1581cabdff1aSopenharmony_ci        temp_min = sample & mask;
1582cabdff1aSopenharmony_ci        if (temp_min < offset_min)
1583cabdff1aSopenharmony_ci            offset_min = temp_min;
1584cabdff1aSopenharmony_ci
1585cabdff1aSopenharmony_ci        temp_max = unsign - temp_min - 1;
1586cabdff1aSopenharmony_ci        if (temp_max < offset_max)
1587cabdff1aSopenharmony_ci            offset_max = temp_max;
1588cabdff1aSopenharmony_ci
1589cabdff1aSopenharmony_ci        sample >>= lsb_bits;
1590cabdff1aSopenharmony_ci
1591cabdff1aSopenharmony_ci        bitcount += ff_mlp_huffman_tables[codebook][sample + codebook_offset][1];
1592cabdff1aSopenharmony_ci
1593cabdff1aSopenharmony_ci        sample_buffer += ctx->num_channels;
1594cabdff1aSopenharmony_ci    }
1595cabdff1aSopenharmony_ci
1596cabdff1aSopenharmony_ci    bo->offset   = offset;
1597cabdff1aSopenharmony_ci    bo->lsb_bits = lsb_bits;
1598cabdff1aSopenharmony_ci    bo->bitcount = lsb_bits * dp->blocksize + bitcount;
1599cabdff1aSopenharmony_ci    bo->min      = FFMAX(offset - offset_min, HUFF_OFFSET_MIN);
1600cabdff1aSopenharmony_ci    bo->max      = FFMIN(offset + offset_max, HUFF_OFFSET_MAX);
1601cabdff1aSopenharmony_ci}
1602cabdff1aSopenharmony_ci
1603cabdff1aSopenharmony_ci/** Determines the least amount of bits needed to encode the samples using a
1604cabdff1aSopenharmony_ci *  given codebook. Searches for the best offset to minimize the bits.
1605cabdff1aSopenharmony_ci */
1606cabdff1aSopenharmony_cistatic inline void codebook_bits(MLPEncodeContext *ctx,
1607cabdff1aSopenharmony_ci                                 unsigned int channel, int codebook,
1608cabdff1aSopenharmony_ci                                 int offset, int32_t min, int32_t max,
1609cabdff1aSopenharmony_ci                                 BestOffset *bo, int direction)
1610cabdff1aSopenharmony_ci{
1611cabdff1aSopenharmony_ci    int previous_count = INT_MAX;
1612cabdff1aSopenharmony_ci    int offset_min, offset_max;
1613cabdff1aSopenharmony_ci    int is_greater = 0;
1614cabdff1aSopenharmony_ci
1615cabdff1aSopenharmony_ci    offset_min = FFMAX(min, HUFF_OFFSET_MIN);
1616cabdff1aSopenharmony_ci    offset_max = FFMIN(max, HUFF_OFFSET_MAX);
1617cabdff1aSopenharmony_ci
1618cabdff1aSopenharmony_ci    while (offset <= offset_max && offset >= offset_min) {
1619cabdff1aSopenharmony_ci        BestOffset temp_bo;
1620cabdff1aSopenharmony_ci
1621cabdff1aSopenharmony_ci        codebook_bits_offset(ctx, channel, codebook,
1622cabdff1aSopenharmony_ci                             min, max, offset,
1623cabdff1aSopenharmony_ci                             &temp_bo);
1624cabdff1aSopenharmony_ci
1625cabdff1aSopenharmony_ci        if (temp_bo.bitcount < previous_count) {
1626cabdff1aSopenharmony_ci            if (temp_bo.bitcount < bo->bitcount)
1627cabdff1aSopenharmony_ci                *bo = temp_bo;
1628cabdff1aSopenharmony_ci
1629cabdff1aSopenharmony_ci            is_greater = 0;
1630cabdff1aSopenharmony_ci        } else if (++is_greater >= ctx->max_codebook_search)
1631cabdff1aSopenharmony_ci            break;
1632cabdff1aSopenharmony_ci
1633cabdff1aSopenharmony_ci        previous_count = temp_bo.bitcount;
1634cabdff1aSopenharmony_ci
1635cabdff1aSopenharmony_ci        if (direction) {
1636cabdff1aSopenharmony_ci            offset = temp_bo.max + 1;
1637cabdff1aSopenharmony_ci        } else {
1638cabdff1aSopenharmony_ci            offset = temp_bo.min - 1;
1639cabdff1aSopenharmony_ci        }
1640cabdff1aSopenharmony_ci    }
1641cabdff1aSopenharmony_ci}
1642cabdff1aSopenharmony_ci
1643cabdff1aSopenharmony_ci/** Determines the least amount of bits needed to encode the samples using
1644cabdff1aSopenharmony_ci *  any or no codebook.
1645cabdff1aSopenharmony_ci */
1646cabdff1aSopenharmony_cistatic void determine_bits(MLPEncodeContext *ctx)
1647cabdff1aSopenharmony_ci{
1648cabdff1aSopenharmony_ci    DecodingParams *dp = ctx->cur_decoding_params;
1649cabdff1aSopenharmony_ci    RestartHeader  *rh = ctx->cur_restart_header;
1650cabdff1aSopenharmony_ci
1651cabdff1aSopenharmony_ci    for (unsigned int channel = 0; channel <= rh->max_channel; channel++) {
1652cabdff1aSopenharmony_ci        ChannelParams *cp = &ctx->cur_channel_params[channel];
1653cabdff1aSopenharmony_ci        int32_t *sample_buffer = ctx->sample_buffer + channel;
1654cabdff1aSopenharmony_ci        int32_t min = INT32_MAX, max = INT32_MIN;
1655cabdff1aSopenharmony_ci        int no_filters_used = !cp->filter_params[FIR].order;
1656cabdff1aSopenharmony_ci        int average = 0;
1657cabdff1aSopenharmony_ci        int offset = 0;
1658cabdff1aSopenharmony_ci
1659cabdff1aSopenharmony_ci        /* Determine extremes and average. */
1660cabdff1aSopenharmony_ci        for (int i = 0; i < dp->blocksize; i++) {
1661cabdff1aSopenharmony_ci            int32_t sample = *sample_buffer >> dp->quant_step_size[channel];
1662cabdff1aSopenharmony_ci            if (sample < min)
1663cabdff1aSopenharmony_ci                min = sample;
1664cabdff1aSopenharmony_ci            if (sample > max)
1665cabdff1aSopenharmony_ci                max = sample;
1666cabdff1aSopenharmony_ci            average += sample;
1667cabdff1aSopenharmony_ci            sample_buffer += ctx->num_channels;
1668cabdff1aSopenharmony_ci        }
1669cabdff1aSopenharmony_ci        average /= dp->blocksize;
1670cabdff1aSopenharmony_ci
1671cabdff1aSopenharmony_ci        /* If filtering is used, we always set the offset to zero, otherwise
1672cabdff1aSopenharmony_ci         * we search for the offset that minimizes the bitcount. */
1673cabdff1aSopenharmony_ci        if (no_filters_used) {
1674cabdff1aSopenharmony_ci            no_codebook_bits(ctx, channel, min, max, &ctx->cur_best_offset[channel][0]);
1675cabdff1aSopenharmony_ci            offset = av_clip(average, HUFF_OFFSET_MIN, HUFF_OFFSET_MAX);
1676cabdff1aSopenharmony_ci        } else {
1677cabdff1aSopenharmony_ci            no_codebook_bits_offset(ctx, channel, offset, min, max, &ctx->cur_best_offset[channel][0]);
1678cabdff1aSopenharmony_ci        }
1679cabdff1aSopenharmony_ci
1680cabdff1aSopenharmony_ci        for (int i = 1; i < NUM_CODEBOOKS; i++) {
1681cabdff1aSopenharmony_ci            BestOffset temp_bo = { 0, INT_MAX, 0, 0, 0, };
1682cabdff1aSopenharmony_ci            int16_t offset_max;
1683cabdff1aSopenharmony_ci
1684cabdff1aSopenharmony_ci            codebook_bits_offset(ctx, channel, i - 1,
1685cabdff1aSopenharmony_ci                                 min, max, offset,
1686cabdff1aSopenharmony_ci                                 &temp_bo);
1687cabdff1aSopenharmony_ci
1688cabdff1aSopenharmony_ci            if (no_filters_used) {
1689cabdff1aSopenharmony_ci                offset_max = temp_bo.max;
1690cabdff1aSopenharmony_ci
1691cabdff1aSopenharmony_ci                codebook_bits(ctx, channel, i - 1, temp_bo.min - 1,
1692cabdff1aSopenharmony_ci                            min, max, &temp_bo, 0);
1693cabdff1aSopenharmony_ci                codebook_bits(ctx, channel, i - 1, offset_max + 1,
1694cabdff1aSopenharmony_ci                            min, max, &temp_bo, 1);
1695cabdff1aSopenharmony_ci            }
1696cabdff1aSopenharmony_ci
1697cabdff1aSopenharmony_ci            ctx->cur_best_offset[channel][i] = temp_bo;
1698cabdff1aSopenharmony_ci        }
1699cabdff1aSopenharmony_ci    }
1700cabdff1aSopenharmony_ci}
1701cabdff1aSopenharmony_ci
1702cabdff1aSopenharmony_ci/****************************************************************************
1703cabdff1aSopenharmony_ci *************** Functions that process the data in some way ****************
1704cabdff1aSopenharmony_ci ****************************************************************************/
1705cabdff1aSopenharmony_ci
1706cabdff1aSopenharmony_ci#define SAMPLE_MAX(bitdepth) ((1 << (bitdepth - 1)) - 1)
1707cabdff1aSopenharmony_ci#define SAMPLE_MIN(bitdepth) (~SAMPLE_MAX(bitdepth))
1708cabdff1aSopenharmony_ci
1709cabdff1aSopenharmony_ci#define MSB_MASK(bits)  (-(int)(1u << (bits)))
1710cabdff1aSopenharmony_ci
1711cabdff1aSopenharmony_ci/** Applies the filter to the current samples, and saves the residual back
1712cabdff1aSopenharmony_ci *  into the samples buffer. If the filter is too bad and overflows the
1713cabdff1aSopenharmony_ci *  maximum amount of bits allowed (24), the samples buffer is left as is and
1714cabdff1aSopenharmony_ci *  the function returns -1.
1715cabdff1aSopenharmony_ci */
1716cabdff1aSopenharmony_cistatic int apply_filter(MLPEncodeContext *ctx, unsigned int channel)
1717cabdff1aSopenharmony_ci{
1718cabdff1aSopenharmony_ci    FilterParams *fp[NUM_FILTERS] = { &ctx->cur_channel_params[channel].filter_params[FIR],
1719cabdff1aSopenharmony_ci                                      &ctx->cur_channel_params[channel].filter_params[IIR], };
1720cabdff1aSopenharmony_ci    int32_t mask = MSB_MASK(ctx->cur_decoding_params->quant_step_size[channel]);
1721cabdff1aSopenharmony_ci    int32_t *sample_buffer = ctx->sample_buffer + channel;
1722cabdff1aSopenharmony_ci    unsigned int number_of_samples = ctx->number_of_samples;
1723cabdff1aSopenharmony_ci    unsigned int filter_shift = fp[FIR]->shift;
1724cabdff1aSopenharmony_ci    int ret = 0;
1725cabdff1aSopenharmony_ci
1726cabdff1aSopenharmony_ci    for (int i = 0; i < 8; i++) {
1727cabdff1aSopenharmony_ci        ctx->filter_state_buffer[FIR][i] = *sample_buffer;
1728cabdff1aSopenharmony_ci        ctx->filter_state_buffer[IIR][i] = *sample_buffer;
1729cabdff1aSopenharmony_ci
1730cabdff1aSopenharmony_ci        sample_buffer += ctx->num_channels;
1731cabdff1aSopenharmony_ci    }
1732cabdff1aSopenharmony_ci
1733cabdff1aSopenharmony_ci    for (int i = 8; i < number_of_samples; i++) {
1734cabdff1aSopenharmony_ci        int32_t sample = *sample_buffer;
1735cabdff1aSopenharmony_ci        int64_t accum = 0;
1736cabdff1aSopenharmony_ci        int64_t residual;
1737cabdff1aSopenharmony_ci
1738cabdff1aSopenharmony_ci        for (int filter = 0; filter < NUM_FILTERS; filter++) {
1739cabdff1aSopenharmony_ci            int32_t *fcoeff = ctx->cur_channel_params[channel].coeff[filter];
1740cabdff1aSopenharmony_ci            for (unsigned int order = 0; order < fp[filter]->order; order++)
1741cabdff1aSopenharmony_ci                accum += (int64_t)ctx->filter_state_buffer[filter][i - 1 - order] *
1742cabdff1aSopenharmony_ci                         fcoeff[order];
1743cabdff1aSopenharmony_ci        }
1744cabdff1aSopenharmony_ci
1745cabdff1aSopenharmony_ci        accum  >>= filter_shift;
1746cabdff1aSopenharmony_ci        residual = sample - (accum & mask);
1747cabdff1aSopenharmony_ci
1748cabdff1aSopenharmony_ci        if (residual < SAMPLE_MIN(24) || residual > SAMPLE_MAX(24)) {
1749cabdff1aSopenharmony_ci            ret = AVERROR_INVALIDDATA;
1750cabdff1aSopenharmony_ci            return ret;
1751cabdff1aSopenharmony_ci        }
1752cabdff1aSopenharmony_ci
1753cabdff1aSopenharmony_ci        ctx->filter_state_buffer[FIR][i] = sample;
1754cabdff1aSopenharmony_ci        ctx->filter_state_buffer[IIR][i] = (int32_t) residual;
1755cabdff1aSopenharmony_ci
1756cabdff1aSopenharmony_ci        sample_buffer += ctx->num_channels;
1757cabdff1aSopenharmony_ci    }
1758cabdff1aSopenharmony_ci
1759cabdff1aSopenharmony_ci    sample_buffer = ctx->sample_buffer + channel;
1760cabdff1aSopenharmony_ci    for (int i = 0; i < number_of_samples; i++) {
1761cabdff1aSopenharmony_ci        *sample_buffer = ctx->filter_state_buffer[IIR][i];
1762cabdff1aSopenharmony_ci
1763cabdff1aSopenharmony_ci        sample_buffer += ctx->num_channels;
1764cabdff1aSopenharmony_ci    }
1765cabdff1aSopenharmony_ci
1766cabdff1aSopenharmony_ci    return ret;
1767cabdff1aSopenharmony_ci}
1768cabdff1aSopenharmony_ci
1769cabdff1aSopenharmony_cistatic void apply_filters(MLPEncodeContext *ctx)
1770cabdff1aSopenharmony_ci{
1771cabdff1aSopenharmony_ci    RestartHeader *rh = ctx->cur_restart_header;
1772cabdff1aSopenharmony_ci
1773cabdff1aSopenharmony_ci    for (int channel = rh->min_channel; channel <= rh->max_channel; channel++) {
1774cabdff1aSopenharmony_ci        if (apply_filter(ctx, channel) < 0) {
1775cabdff1aSopenharmony_ci            /* Filter is horribly wrong.
1776cabdff1aSopenharmony_ci             * Clear filter params and update state. */
1777cabdff1aSopenharmony_ci            set_filter_params(ctx, channel, FIR, 1);
1778cabdff1aSopenharmony_ci            set_filter_params(ctx, channel, IIR, 1);
1779cabdff1aSopenharmony_ci            apply_filter(ctx, channel);
1780cabdff1aSopenharmony_ci        }
1781cabdff1aSopenharmony_ci    }
1782cabdff1aSopenharmony_ci}
1783cabdff1aSopenharmony_ci
1784cabdff1aSopenharmony_ci/** Generates two noise channels worth of data. */
1785cabdff1aSopenharmony_cistatic void generate_2_noise_channels(MLPEncodeContext *ctx)
1786cabdff1aSopenharmony_ci{
1787cabdff1aSopenharmony_ci    int32_t *sample_buffer = ctx->sample_buffer + ctx->num_channels - 2;
1788cabdff1aSopenharmony_ci    RestartHeader *rh = ctx->cur_restart_header;
1789cabdff1aSopenharmony_ci    uint32_t seed = rh->noisegen_seed;
1790cabdff1aSopenharmony_ci
1791cabdff1aSopenharmony_ci    for (unsigned int i = 0; i < ctx->number_of_samples; i++) {
1792cabdff1aSopenharmony_ci        uint16_t seed_shr7 = seed >> 7;
1793cabdff1aSopenharmony_ci        *sample_buffer++ = ((int8_t)(seed >> 15)) * (1 << rh->noise_shift);
1794cabdff1aSopenharmony_ci        *sample_buffer++ = ((int8_t) seed_shr7)   * (1 << rh->noise_shift);
1795cabdff1aSopenharmony_ci
1796cabdff1aSopenharmony_ci        seed = (seed << 16) ^ seed_shr7 ^ (seed_shr7 << 5);
1797cabdff1aSopenharmony_ci
1798cabdff1aSopenharmony_ci        sample_buffer += ctx->num_channels - 2;
1799cabdff1aSopenharmony_ci    }
1800cabdff1aSopenharmony_ci
1801cabdff1aSopenharmony_ci    rh->noisegen_seed = seed & ((1 << 24)-1);
1802cabdff1aSopenharmony_ci}
1803cabdff1aSopenharmony_ci
1804cabdff1aSopenharmony_ci/** Rematrixes all channels using chosen coefficients. */
1805cabdff1aSopenharmony_cistatic void rematrix_channels(MLPEncodeContext *ctx)
1806cabdff1aSopenharmony_ci{
1807cabdff1aSopenharmony_ci    DecodingParams *dp = ctx->cur_decoding_params;
1808cabdff1aSopenharmony_ci    MatrixParams *mp = &dp->matrix_params;
1809cabdff1aSopenharmony_ci    int32_t *sample_buffer = ctx->sample_buffer;
1810cabdff1aSopenharmony_ci    unsigned int maxchan = ctx->num_channels;
1811cabdff1aSopenharmony_ci
1812cabdff1aSopenharmony_ci    for (unsigned int mat = 0; mat < mp->count; mat++) {
1813cabdff1aSopenharmony_ci        unsigned int msb_mask_bits = (ctx->avctx->sample_fmt == AV_SAMPLE_FMT_S16 ? 8 : 0) - mp->shift[mat];
1814cabdff1aSopenharmony_ci        int32_t mask = MSB_MASK(msb_mask_bits);
1815cabdff1aSopenharmony_ci        unsigned int outch = mp->outch[mat];
1816cabdff1aSopenharmony_ci
1817cabdff1aSopenharmony_ci        sample_buffer = ctx->sample_buffer;
1818cabdff1aSopenharmony_ci        for (unsigned int i = 0; i < ctx->number_of_samples; i++) {
1819cabdff1aSopenharmony_ci            int64_t accum = 0;
1820cabdff1aSopenharmony_ci
1821cabdff1aSopenharmony_ci            for (unsigned int src_ch = 0; src_ch < maxchan; src_ch++) {
1822cabdff1aSopenharmony_ci                int32_t sample = *(sample_buffer + src_ch);
1823cabdff1aSopenharmony_ci                accum += (int64_t) sample * mp->forco[mat][src_ch];
1824cabdff1aSopenharmony_ci            }
1825cabdff1aSopenharmony_ci            sample_buffer[outch] = (accum >> 14) & mask;
1826cabdff1aSopenharmony_ci
1827cabdff1aSopenharmony_ci            sample_buffer += ctx->num_channels;
1828cabdff1aSopenharmony_ci        }
1829cabdff1aSopenharmony_ci    }
1830cabdff1aSopenharmony_ci}
1831cabdff1aSopenharmony_ci
1832cabdff1aSopenharmony_ci/****************************************************************************
1833cabdff1aSopenharmony_ci **** Functions that deal with determining the best parameters and output ***
1834cabdff1aSopenharmony_ci ****************************************************************************/
1835cabdff1aSopenharmony_ci
1836cabdff1aSopenharmony_citypedef struct {
1837cabdff1aSopenharmony_ci    char    path[MAJOR_HEADER_INTERVAL + 2];
1838cabdff1aSopenharmony_ci    int     cur_idx;
1839cabdff1aSopenharmony_ci    int     bitcount;
1840cabdff1aSopenharmony_ci} PathCounter;
1841cabdff1aSopenharmony_ci
1842cabdff1aSopenharmony_ci#define CODEBOOK_CHANGE_BITS    21
1843cabdff1aSopenharmony_ci
1844cabdff1aSopenharmony_cistatic void clear_path_counter(PathCounter *path_counter)
1845cabdff1aSopenharmony_ci{
1846cabdff1aSopenharmony_ci    memset(path_counter, 0, (NUM_CODEBOOKS + 1) * sizeof(*path_counter));
1847cabdff1aSopenharmony_ci}
1848cabdff1aSopenharmony_ci
1849cabdff1aSopenharmony_cistatic int compare_best_offset(const BestOffset *prev, const BestOffset *cur)
1850cabdff1aSopenharmony_ci{
1851cabdff1aSopenharmony_ci    return prev->lsb_bits != cur->lsb_bits;
1852cabdff1aSopenharmony_ci}
1853cabdff1aSopenharmony_ci
1854cabdff1aSopenharmony_cistatic int best_codebook_path_cost(MLPEncodeContext *ctx, unsigned int channel,
1855cabdff1aSopenharmony_ci                                   PathCounter *src, int cur_codebook)
1856cabdff1aSopenharmony_ci{
1857cabdff1aSopenharmony_ci    int idx = src->cur_idx;
1858cabdff1aSopenharmony_ci    const BestOffset *cur_bo = ctx->best_offset[idx][channel],
1859cabdff1aSopenharmony_ci                    *prev_bo = idx ? ctx->best_offset[idx - 1][channel] :
1860cabdff1aSopenharmony_ci                                     restart_best_offset;
1861cabdff1aSopenharmony_ci    int bitcount = src->bitcount;
1862cabdff1aSopenharmony_ci    int prev_codebook = src->path[idx];
1863cabdff1aSopenharmony_ci
1864cabdff1aSopenharmony_ci    bitcount += cur_bo[cur_codebook].bitcount;
1865cabdff1aSopenharmony_ci
1866cabdff1aSopenharmony_ci    if (prev_codebook != cur_codebook ||
1867cabdff1aSopenharmony_ci        compare_best_offset(&prev_bo[prev_codebook], &cur_bo[cur_codebook]))
1868cabdff1aSopenharmony_ci        bitcount += CODEBOOK_CHANGE_BITS;
1869cabdff1aSopenharmony_ci
1870cabdff1aSopenharmony_ci    return bitcount;
1871cabdff1aSopenharmony_ci}
1872cabdff1aSopenharmony_ci
1873cabdff1aSopenharmony_cistatic void set_best_codebook(MLPEncodeContext *ctx)
1874cabdff1aSopenharmony_ci{
1875cabdff1aSopenharmony_ci    DecodingParams *dp = ctx->cur_decoding_params;
1876cabdff1aSopenharmony_ci    RestartHeader *rh = ctx->cur_restart_header;
1877cabdff1aSopenharmony_ci
1878cabdff1aSopenharmony_ci    for (unsigned int channel = rh->min_channel; channel <= rh->max_channel; channel++) {
1879cabdff1aSopenharmony_ci        const BestOffset *prev_bo = restart_best_offset;
1880cabdff1aSopenharmony_ci        BestOffset *cur_bo;
1881cabdff1aSopenharmony_ci        PathCounter path_counter[NUM_CODEBOOKS + 1];
1882cabdff1aSopenharmony_ci        unsigned int best_codebook;
1883cabdff1aSopenharmony_ci        char *best_path;
1884cabdff1aSopenharmony_ci
1885cabdff1aSopenharmony_ci        clear_path_counter(path_counter);
1886cabdff1aSopenharmony_ci
1887cabdff1aSopenharmony_ci        for (unsigned int index = 0; index < ctx->number_of_subblocks; index++) {
1888cabdff1aSopenharmony_ci            unsigned int best_bitcount = INT_MAX;
1889cabdff1aSopenharmony_ci
1890cabdff1aSopenharmony_ci            cur_bo = ctx->best_offset[index][channel];
1891cabdff1aSopenharmony_ci
1892cabdff1aSopenharmony_ci            for (unsigned int codebook = 0; codebook < NUM_CODEBOOKS; codebook++) {
1893cabdff1aSopenharmony_ci                int prev_best_bitcount = INT_MAX;
1894cabdff1aSopenharmony_ci
1895cabdff1aSopenharmony_ci                for (unsigned int last_best = 0; last_best < 2; last_best++) {
1896cabdff1aSopenharmony_ci                    PathCounter *dst_path = &path_counter[codebook];
1897cabdff1aSopenharmony_ci                    PathCounter *src_path;
1898cabdff1aSopenharmony_ci                    int  temp_bitcount;
1899cabdff1aSopenharmony_ci
1900cabdff1aSopenharmony_ci                    /* First test last path with same headers,
1901cabdff1aSopenharmony_ci                     * then with last best. */
1902cabdff1aSopenharmony_ci                    if (last_best) {
1903cabdff1aSopenharmony_ci                        src_path = &path_counter[NUM_CODEBOOKS];
1904cabdff1aSopenharmony_ci                    } else {
1905cabdff1aSopenharmony_ci                        if (compare_best_offset(&prev_bo[codebook], &cur_bo[codebook]))
1906cabdff1aSopenharmony_ci                            continue;
1907cabdff1aSopenharmony_ci                        else
1908cabdff1aSopenharmony_ci                            src_path = &path_counter[codebook];
1909cabdff1aSopenharmony_ci                    }
1910cabdff1aSopenharmony_ci
1911cabdff1aSopenharmony_ci                    temp_bitcount = best_codebook_path_cost(ctx, channel, src_path, codebook);
1912cabdff1aSopenharmony_ci
1913cabdff1aSopenharmony_ci                    if (temp_bitcount < best_bitcount) {
1914cabdff1aSopenharmony_ci                        best_bitcount = temp_bitcount;
1915cabdff1aSopenharmony_ci                        best_codebook = codebook;
1916cabdff1aSopenharmony_ci                    }
1917cabdff1aSopenharmony_ci
1918cabdff1aSopenharmony_ci                    if (temp_bitcount < prev_best_bitcount) {
1919cabdff1aSopenharmony_ci                        prev_best_bitcount = temp_bitcount;
1920cabdff1aSopenharmony_ci                        if (src_path != dst_path)
1921cabdff1aSopenharmony_ci                            memcpy(dst_path, src_path, sizeof(PathCounter));
1922cabdff1aSopenharmony_ci                        if (dst_path->cur_idx < FF_ARRAY_ELEMS(dst_path->path) - 1)
1923cabdff1aSopenharmony_ci                            dst_path->path[++dst_path->cur_idx] = codebook;
1924cabdff1aSopenharmony_ci                        dst_path->bitcount = temp_bitcount;
1925cabdff1aSopenharmony_ci                    }
1926cabdff1aSopenharmony_ci                }
1927cabdff1aSopenharmony_ci            }
1928cabdff1aSopenharmony_ci
1929cabdff1aSopenharmony_ci            prev_bo = cur_bo;
1930cabdff1aSopenharmony_ci
1931cabdff1aSopenharmony_ci            memcpy(&path_counter[NUM_CODEBOOKS], &path_counter[best_codebook], sizeof(PathCounter));
1932cabdff1aSopenharmony_ci        }
1933cabdff1aSopenharmony_ci
1934cabdff1aSopenharmony_ci        best_path = path_counter[NUM_CODEBOOKS].path + 1;
1935cabdff1aSopenharmony_ci
1936cabdff1aSopenharmony_ci        /* Update context. */
1937cabdff1aSopenharmony_ci        for (unsigned int index = 0; index < ctx->number_of_subblocks; index++) {
1938cabdff1aSopenharmony_ci            ChannelParams *cp = ctx->seq_channel_params + index*(ctx->avctx->ch_layout.nb_channels) + channel;
1939cabdff1aSopenharmony_ci
1940cabdff1aSopenharmony_ci            best_codebook = *best_path++;
1941cabdff1aSopenharmony_ci            cur_bo = &ctx->best_offset[index][channel][best_codebook];
1942cabdff1aSopenharmony_ci
1943cabdff1aSopenharmony_ci            cp->huff_offset      = cur_bo->offset;
1944cabdff1aSopenharmony_ci            cp->huff_lsbs        = cur_bo->lsb_bits + dp->quant_step_size[channel];
1945cabdff1aSopenharmony_ci            cp->codebook         = best_codebook;
1946cabdff1aSopenharmony_ci        }
1947cabdff1aSopenharmony_ci    }
1948cabdff1aSopenharmony_ci}
1949cabdff1aSopenharmony_ci
1950cabdff1aSopenharmony_ci/** Analyzes all collected bitcounts and selects the best parameters for each
1951cabdff1aSopenharmony_ci *  individual access unit.
1952cabdff1aSopenharmony_ci *  TODO This is just a stub!
1953cabdff1aSopenharmony_ci */
1954cabdff1aSopenharmony_cistatic void set_major_params(MLPEncodeContext *ctx)
1955cabdff1aSopenharmony_ci{
1956cabdff1aSopenharmony_ci    RestartHeader *rh = ctx->cur_restart_header;
1957cabdff1aSopenharmony_ci    uint8_t max_huff_lsbs = 0;
1958cabdff1aSopenharmony_ci    uint8_t max_output_bits = 0;
1959cabdff1aSopenharmony_ci    int channels = ctx->avctx->ch_layout.nb_channels;
1960cabdff1aSopenharmony_ci    DecodingParams *seq_dp = ctx->decoding_params + ctx->seq_offset[0] * channels;
1961cabdff1aSopenharmony_ci    ChannelParams *seq_cp = ctx->channel_params + ctx->seq_offset[0] * channels;
1962cabdff1aSopenharmony_ci
1963cabdff1aSopenharmony_ci    for (unsigned int index = 0; index < ctx->seq_size[ctx->restart_intervals-1]; index++) {
1964cabdff1aSopenharmony_ci        memcpy(&ctx->major_decoding_params[index], seq_dp + index, sizeof(DecodingParams));
1965cabdff1aSopenharmony_ci        for (unsigned int channel = 0; channel < channels; channel++) {
1966cabdff1aSopenharmony_ci            uint8_t huff_lsbs = (seq_cp + index*(channels) + channel)->huff_lsbs;
1967cabdff1aSopenharmony_ci            if (max_huff_lsbs < huff_lsbs)
1968cabdff1aSopenharmony_ci                max_huff_lsbs = huff_lsbs;
1969cabdff1aSopenharmony_ci            memcpy(&ctx->major_channel_params[index][channel],
1970cabdff1aSopenharmony_ci                   (seq_cp + index*(channels) + channel),
1971cabdff1aSopenharmony_ci                   sizeof(ChannelParams));
1972cabdff1aSopenharmony_ci        }
1973cabdff1aSopenharmony_ci    }
1974cabdff1aSopenharmony_ci
1975cabdff1aSopenharmony_ci    rh->max_huff_lsbs = max_huff_lsbs;
1976cabdff1aSopenharmony_ci
1977cabdff1aSopenharmony_ci    for (unsigned int index = 0; index < ctx->number_of_frames; index++)
1978cabdff1aSopenharmony_ci        if (max_output_bits < ctx->max_output_bits[index])
1979cabdff1aSopenharmony_ci            max_output_bits = ctx->max_output_bits[index];
1980cabdff1aSopenharmony_ci    rh->max_output_bits = max_output_bits;
1981cabdff1aSopenharmony_ci
1982cabdff1aSopenharmony_ci    ctx->cur_restart_header = &ctx->restart_header;
1983cabdff1aSopenharmony_ci
1984cabdff1aSopenharmony_ci    ctx->prev_decoding_params = restart_decoding_params;
1985cabdff1aSopenharmony_ci    ctx->prev_channel_params = restart_channel_params;
1986cabdff1aSopenharmony_ci
1987cabdff1aSopenharmony_ci    for (unsigned int index = 0; index < MAJOR_HEADER_INTERVAL + 1; index++) {
1988cabdff1aSopenharmony_ci        ctx->cur_decoding_params = &ctx->major_decoding_params[index];
1989cabdff1aSopenharmony_ci        ctx->cur_channel_params = ctx->major_channel_params[index];
1990cabdff1aSopenharmony_ci
1991cabdff1aSopenharmony_ci        ctx->major_params_changed[index] = compare_decoding_params(ctx);
1992cabdff1aSopenharmony_ci
1993cabdff1aSopenharmony_ci        ctx->prev_decoding_params = ctx->cur_decoding_params;
1994cabdff1aSopenharmony_ci        ctx->prev_channel_params = ctx->cur_channel_params;
1995cabdff1aSopenharmony_ci    }
1996cabdff1aSopenharmony_ci
1997cabdff1aSopenharmony_ci    ctx->major_number_of_subblocks = ctx->number_of_subblocks;
1998cabdff1aSopenharmony_ci    ctx->major_filter_state_subblock = 1;
1999cabdff1aSopenharmony_ci    ctx->major_cur_subblock_index = 0;
2000cabdff1aSopenharmony_ci}
2001cabdff1aSopenharmony_ci
2002cabdff1aSopenharmony_cistatic void analyze_sample_buffer(MLPEncodeContext *ctx)
2003cabdff1aSopenharmony_ci{
2004cabdff1aSopenharmony_ci    ChannelParams *seq_cp = ctx->seq_channel_params;
2005cabdff1aSopenharmony_ci    DecodingParams *seq_dp = ctx->seq_decoding_params;
2006cabdff1aSopenharmony_ci
2007cabdff1aSopenharmony_ci    ctx->cur_restart_header = &ctx->restart_header;
2008cabdff1aSopenharmony_ci    ctx->cur_decoding_params = seq_dp + 1;
2009cabdff1aSopenharmony_ci    ctx->cur_channel_params = seq_cp + ctx->avctx->ch_layout.nb_channels;
2010cabdff1aSopenharmony_ci
2011cabdff1aSopenharmony_ci    determine_quant_step_size(ctx);
2012cabdff1aSopenharmony_ci    generate_2_noise_channels(ctx);
2013cabdff1aSopenharmony_ci    lossless_matrix_coeffs   (ctx);
2014cabdff1aSopenharmony_ci    rematrix_channels        (ctx);
2015cabdff1aSopenharmony_ci    determine_filters        (ctx);
2016cabdff1aSopenharmony_ci    apply_filters            (ctx);
2017cabdff1aSopenharmony_ci
2018cabdff1aSopenharmony_ci    copy_restart_frame_params(ctx);
2019cabdff1aSopenharmony_ci
2020cabdff1aSopenharmony_ci    /* Copy frame_size from frames 0...max to decoding_params 1...max + 1
2021cabdff1aSopenharmony_ci     * decoding_params[0] is for the filter state subblock.
2022cabdff1aSopenharmony_ci     */
2023cabdff1aSopenharmony_ci    for (unsigned int index = 0; index < ctx->number_of_frames; index++) {
2024cabdff1aSopenharmony_ci        DecodingParams *dp = seq_dp + (index + 1);
2025cabdff1aSopenharmony_ci        dp->blocksize = ctx->avctx->frame_size;
2026cabdff1aSopenharmony_ci    }
2027cabdff1aSopenharmony_ci    /* The official encoder seems to always encode a filter state subblock
2028cabdff1aSopenharmony_ci     * even if there are no filters. TODO check if it is possible to skip
2029cabdff1aSopenharmony_ci     * the filter state subblock for no filters.
2030cabdff1aSopenharmony_ci     */
2031cabdff1aSopenharmony_ci    (seq_dp + 0)->blocksize  = 8;
2032cabdff1aSopenharmony_ci    (seq_dp + 1)->blocksize -= 8;
2033cabdff1aSopenharmony_ci
2034cabdff1aSopenharmony_ci    for (unsigned int index = 0; index < ctx->number_of_subblocks; index++) {
2035cabdff1aSopenharmony_ci        ctx->cur_decoding_params = seq_dp + index;
2036cabdff1aSopenharmony_ci        ctx->cur_channel_params = seq_cp + index*(ctx->avctx->ch_layout.nb_channels);
2037cabdff1aSopenharmony_ci        ctx->cur_best_offset = ctx->best_offset[index];
2038cabdff1aSopenharmony_ci        determine_bits(ctx);
2039cabdff1aSopenharmony_ci        ctx->sample_buffer += ctx->cur_decoding_params->blocksize * ctx->num_channels;
2040cabdff1aSopenharmony_ci    }
2041cabdff1aSopenharmony_ci
2042cabdff1aSopenharmony_ci    set_best_codebook(ctx);
2043cabdff1aSopenharmony_ci}
2044cabdff1aSopenharmony_ci
2045cabdff1aSopenharmony_cistatic void process_major_frame(MLPEncodeContext *ctx)
2046cabdff1aSopenharmony_ci{
2047cabdff1aSopenharmony_ci    ctx->sample_buffer = ctx->major_inout_buffer;
2048cabdff1aSopenharmony_ci
2049cabdff1aSopenharmony_ci    ctx->number_of_frames = ctx->major_number_of_frames;
2050cabdff1aSopenharmony_ci    ctx->number_of_samples = ctx->major_frame_size;
2051cabdff1aSopenharmony_ci
2052cabdff1aSopenharmony_ci    ctx->cur_restart_header = &ctx->restart_header;
2053cabdff1aSopenharmony_ci
2054cabdff1aSopenharmony_ci    ctx->cur_decoding_params = &ctx->major_decoding_params[1];
2055cabdff1aSopenharmony_ci    ctx->cur_channel_params = ctx->major_channel_params[1];
2056cabdff1aSopenharmony_ci
2057cabdff1aSopenharmony_ci    generate_2_noise_channels(ctx);
2058cabdff1aSopenharmony_ci    rematrix_channels        (ctx);
2059cabdff1aSopenharmony_ci
2060cabdff1aSopenharmony_ci    apply_filters(ctx);
2061cabdff1aSopenharmony_ci}
2062cabdff1aSopenharmony_ci
2063cabdff1aSopenharmony_ci/****************************************************************************/
2064cabdff1aSopenharmony_ci
2065cabdff1aSopenharmony_cistatic int mlp_encode_frame(AVCodecContext *avctx, AVPacket *avpkt,
2066cabdff1aSopenharmony_ci                            const AVFrame *frame, int *got_packet)
2067cabdff1aSopenharmony_ci{
2068cabdff1aSopenharmony_ci    MLPEncodeContext *ctx = avctx->priv_data;
2069cabdff1aSopenharmony_ci    int bytes_written = 0;
2070cabdff1aSopenharmony_ci    int channels = avctx->ch_layout.nb_channels;
2071cabdff1aSopenharmony_ci    int restart_frame, ret;
2072cabdff1aSopenharmony_ci    uint8_t *data;
2073cabdff1aSopenharmony_ci
2074cabdff1aSopenharmony_ci    if (!frame && !ctx->last_frames)
2075cabdff1aSopenharmony_ci        ctx->last_frames = (ctx->afq.remaining_samples + avctx->frame_size - 1) / avctx->frame_size;
2076cabdff1aSopenharmony_ci
2077cabdff1aSopenharmony_ci    if (!frame && !ctx->last_frames--)
2078cabdff1aSopenharmony_ci        return 0;
2079cabdff1aSopenharmony_ci
2080cabdff1aSopenharmony_ci    if ((ret = ff_alloc_packet(avctx, avpkt, 87500 * channels)) < 0)
2081cabdff1aSopenharmony_ci        return ret;
2082cabdff1aSopenharmony_ci
2083cabdff1aSopenharmony_ci    if (frame) {
2084cabdff1aSopenharmony_ci        /* add current frame to queue */
2085cabdff1aSopenharmony_ci        if ((ret = ff_af_queue_add(&ctx->afq, frame)) < 0)
2086cabdff1aSopenharmony_ci            return ret;
2087cabdff1aSopenharmony_ci    }
2088cabdff1aSopenharmony_ci
2089cabdff1aSopenharmony_ci    data = frame ? frame->data[0] : NULL;
2090cabdff1aSopenharmony_ci
2091cabdff1aSopenharmony_ci    ctx->frame_index = avctx->frame_number % ctx->max_restart_interval;
2092cabdff1aSopenharmony_ci
2093cabdff1aSopenharmony_ci    ctx->inout_buffer = ctx->major_inout_buffer
2094cabdff1aSopenharmony_ci                      + ctx->frame_index * ctx->one_sample_buffer_size;
2095cabdff1aSopenharmony_ci
2096cabdff1aSopenharmony_ci    ctx->sample_buffer = ctx->major_scratch_buffer
2097cabdff1aSopenharmony_ci                       + ctx->frame_index * ctx->one_sample_buffer_size;
2098cabdff1aSopenharmony_ci
2099cabdff1aSopenharmony_ci    ctx->write_buffer = ctx->inout_buffer;
2100cabdff1aSopenharmony_ci
2101cabdff1aSopenharmony_ci    if (avctx->frame_number < ctx->max_restart_interval) {
2102cabdff1aSopenharmony_ci        if (data)
2103cabdff1aSopenharmony_ci            goto input_and_return;
2104cabdff1aSopenharmony_ci    }
2105cabdff1aSopenharmony_ci
2106cabdff1aSopenharmony_ci    restart_frame = !ctx->frame_index;
2107cabdff1aSopenharmony_ci
2108cabdff1aSopenharmony_ci    if (restart_frame) {
2109cabdff1aSopenharmony_ci        avpkt->flags |= AV_PKT_FLAG_KEY;
2110cabdff1aSopenharmony_ci        set_major_params(ctx);
2111cabdff1aSopenharmony_ci        if (ctx->min_restart_interval != ctx->max_restart_interval)
2112cabdff1aSopenharmony_ci            process_major_frame(ctx);
2113cabdff1aSopenharmony_ci    }
2114cabdff1aSopenharmony_ci
2115cabdff1aSopenharmony_ci    if (ctx->min_restart_interval == ctx->max_restart_interval)
2116cabdff1aSopenharmony_ci        ctx->write_buffer = ctx->sample_buffer;
2117cabdff1aSopenharmony_ci
2118cabdff1aSopenharmony_ci    bytes_written = write_access_unit(ctx, avpkt->data, avpkt->size, restart_frame);
2119cabdff1aSopenharmony_ci
2120cabdff1aSopenharmony_ci    ctx->timestamp += avctx->frame_size;
2121cabdff1aSopenharmony_ci    ctx->dts       += avctx->frame_size;
2122cabdff1aSopenharmony_ci
2123cabdff1aSopenharmony_ciinput_and_return:
2124cabdff1aSopenharmony_ci
2125cabdff1aSopenharmony_ci    if (frame) {
2126cabdff1aSopenharmony_ci        ctx->shorten_by = avctx->frame_size - frame->nb_samples;
2127cabdff1aSopenharmony_ci        ctx->next_major_frame_size += avctx->frame_size;
2128cabdff1aSopenharmony_ci        ctx->next_major_number_of_frames++;
2129cabdff1aSopenharmony_ci    }
2130cabdff1aSopenharmony_ci    if (data)
2131cabdff1aSopenharmony_ci        input_data(ctx, data, frame->nb_samples);
2132cabdff1aSopenharmony_ci
2133cabdff1aSopenharmony_ci    restart_frame = (ctx->frame_index + 1) % ctx->min_restart_interval;
2134cabdff1aSopenharmony_ci
2135cabdff1aSopenharmony_ci    if (!restart_frame) {
2136cabdff1aSopenharmony_ci        for (unsigned int seq_index = 0; seq_index < ctx->restart_intervals; seq_index++) {
2137cabdff1aSopenharmony_ci            unsigned int number_of_samples;
2138cabdff1aSopenharmony_ci
2139cabdff1aSopenharmony_ci            ctx->sample_buffer = ctx->major_scratch_buffer;
2140cabdff1aSopenharmony_ci            ctx->inout_buffer = ctx->major_inout_buffer;
2141cabdff1aSopenharmony_ci
2142cabdff1aSopenharmony_ci            ctx->number_of_frames = ctx->next_major_number_of_frames;
2143cabdff1aSopenharmony_ci            ctx->number_of_subblocks = ctx->next_major_number_of_frames + 1;
2144cabdff1aSopenharmony_ci
2145cabdff1aSopenharmony_ci            ctx->seq_channel_params = ctx->channel_params + ctx->seq_offset[seq_index] * channels;
2146cabdff1aSopenharmony_ci
2147cabdff1aSopenharmony_ci            ctx->seq_decoding_params = ctx->decoding_params + ctx->seq_offset[seq_index];
2148cabdff1aSopenharmony_ci
2149cabdff1aSopenharmony_ci            number_of_samples = avctx->frame_size * ctx->number_of_frames;
2150cabdff1aSopenharmony_ci            ctx->number_of_samples = number_of_samples;
2151cabdff1aSopenharmony_ci
2152cabdff1aSopenharmony_ci            for (unsigned int index = 0; index < ctx->seq_size[seq_index]; index++) {
2153cabdff1aSopenharmony_ci                clear_channel_params(ctx->seq_channel_params + index * channels, channels);
2154cabdff1aSopenharmony_ci                default_decoding_params(ctx, ctx->seq_decoding_params + index);
2155cabdff1aSopenharmony_ci            }
2156cabdff1aSopenharmony_ci
2157cabdff1aSopenharmony_ci            input_to_sample_buffer(ctx);
2158cabdff1aSopenharmony_ci
2159cabdff1aSopenharmony_ci            analyze_sample_buffer(ctx);
2160cabdff1aSopenharmony_ci        }
2161cabdff1aSopenharmony_ci
2162cabdff1aSopenharmony_ci        if (ctx->frame_index == (ctx->max_restart_interval - 1)) {
2163cabdff1aSopenharmony_ci            ctx->major_frame_size = ctx->next_major_frame_size;
2164cabdff1aSopenharmony_ci            ctx->next_major_frame_size = 0;
2165cabdff1aSopenharmony_ci            ctx->major_number_of_frames = ctx->next_major_number_of_frames;
2166cabdff1aSopenharmony_ci            ctx->next_major_number_of_frames = 0;
2167cabdff1aSopenharmony_ci        }
2168cabdff1aSopenharmony_ci    }
2169cabdff1aSopenharmony_ci
2170cabdff1aSopenharmony_ci    if (!frame && ctx->last_frames < ctx->max_restart_interval - 1)
2171cabdff1aSopenharmony_ci        avctx->frame_number++;
2172cabdff1aSopenharmony_ci
2173cabdff1aSopenharmony_ci    if (bytes_written > 0) {
2174cabdff1aSopenharmony_ci        ff_af_queue_remove(&ctx->afq,
2175cabdff1aSopenharmony_ci                           FFMIN(avctx->frame_size, ctx->afq.remaining_samples),
2176cabdff1aSopenharmony_ci                           &avpkt->pts,
2177cabdff1aSopenharmony_ci                           &avpkt->duration);
2178cabdff1aSopenharmony_ci
2179cabdff1aSopenharmony_ci        av_shrink_packet(avpkt, bytes_written);
2180cabdff1aSopenharmony_ci
2181cabdff1aSopenharmony_ci        *got_packet = 1;
2182cabdff1aSopenharmony_ci    } else {
2183cabdff1aSopenharmony_ci        *got_packet = 0;
2184cabdff1aSopenharmony_ci    }
2185cabdff1aSopenharmony_ci
2186cabdff1aSopenharmony_ci    return 0;
2187cabdff1aSopenharmony_ci}
2188cabdff1aSopenharmony_ci
2189cabdff1aSopenharmony_cistatic av_cold int mlp_encode_close(AVCodecContext *avctx)
2190cabdff1aSopenharmony_ci{
2191cabdff1aSopenharmony_ci    MLPEncodeContext *ctx = avctx->priv_data;
2192cabdff1aSopenharmony_ci
2193cabdff1aSopenharmony_ci    ff_lpc_end(&ctx->lpc_ctx);
2194cabdff1aSopenharmony_ci
2195cabdff1aSopenharmony_ci    av_freep(&ctx->lossless_check_data);
2196cabdff1aSopenharmony_ci    av_freep(&ctx->major_scratch_buffer);
2197cabdff1aSopenharmony_ci    av_freep(&ctx->major_inout_buffer);
2198cabdff1aSopenharmony_ci    av_freep(&ctx->lpc_sample_buffer);
2199cabdff1aSopenharmony_ci    av_freep(&ctx->decoding_params);
2200cabdff1aSopenharmony_ci    av_freep(&ctx->channel_params);
2201cabdff1aSopenharmony_ci    av_freep(&ctx->max_output_bits);
2202cabdff1aSopenharmony_ci    ff_af_queue_close(&ctx->afq);
2203cabdff1aSopenharmony_ci
2204cabdff1aSopenharmony_ci    for (int i = 0; i < NUM_FILTERS; i++)
2205cabdff1aSopenharmony_ci        av_freep(&ctx->filter_state_buffer[i]);
2206cabdff1aSopenharmony_ci
2207cabdff1aSopenharmony_ci    return 0;
2208cabdff1aSopenharmony_ci}
2209cabdff1aSopenharmony_ci
2210cabdff1aSopenharmony_ci#if CONFIG_MLP_ENCODER
2211cabdff1aSopenharmony_ciconst FFCodec ff_mlp_encoder = {
2212cabdff1aSopenharmony_ci    .p.name                 ="mlp",
2213cabdff1aSopenharmony_ci    .p.long_name            = NULL_IF_CONFIG_SMALL("MLP (Meridian Lossless Packing)"),
2214cabdff1aSopenharmony_ci    .p.type                 = AVMEDIA_TYPE_AUDIO,
2215cabdff1aSopenharmony_ci    .p.id                   = AV_CODEC_ID_MLP,
2216cabdff1aSopenharmony_ci    .priv_data_size         = sizeof(MLPEncodeContext),
2217cabdff1aSopenharmony_ci    .init                   = mlp_encode_init,
2218cabdff1aSopenharmony_ci    FF_CODEC_ENCODE_CB(mlp_encode_frame),
2219cabdff1aSopenharmony_ci    .close                  = mlp_encode_close,
2220cabdff1aSopenharmony_ci    .p.capabilities         = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_EXPERIMENTAL,
2221cabdff1aSopenharmony_ci    .p.sample_fmts          = (const enum AVSampleFormat[]) {AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_NONE},
2222cabdff1aSopenharmony_ci    .p.supported_samplerates = (const int[]) {44100, 48000, 88200, 96000, 176400, 192000, 0},
2223cabdff1aSopenharmony_ci#if FF_API_OLD_CHANNEL_LAYOUT
2224cabdff1aSopenharmony_ci    .p.channel_layouts      = ff_mlp_channel_layouts,
2225cabdff1aSopenharmony_ci#endif
2226cabdff1aSopenharmony_ci    .p.ch_layouts           = ff_mlp_ch_layouts,
2227cabdff1aSopenharmony_ci    .caps_internal          = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
2228cabdff1aSopenharmony_ci};
2229cabdff1aSopenharmony_ci#endif
2230cabdff1aSopenharmony_ci#if CONFIG_TRUEHD_ENCODER
2231cabdff1aSopenharmony_ciconst FFCodec ff_truehd_encoder = {
2232cabdff1aSopenharmony_ci    .p.name                 ="truehd",
2233cabdff1aSopenharmony_ci    .p.long_name            = NULL_IF_CONFIG_SMALL("TrueHD"),
2234cabdff1aSopenharmony_ci    .p.type                 = AVMEDIA_TYPE_AUDIO,
2235cabdff1aSopenharmony_ci    .p.id                   = AV_CODEC_ID_TRUEHD,
2236cabdff1aSopenharmony_ci    .priv_data_size         = sizeof(MLPEncodeContext),
2237cabdff1aSopenharmony_ci    .init                   = mlp_encode_init,
2238cabdff1aSopenharmony_ci    FF_CODEC_ENCODE_CB(mlp_encode_frame),
2239cabdff1aSopenharmony_ci    .close                  = mlp_encode_close,
2240cabdff1aSopenharmony_ci    .p.capabilities         = AV_CODEC_CAP_SMALL_LAST_FRAME | AV_CODEC_CAP_DELAY | AV_CODEC_CAP_EXPERIMENTAL,
2241cabdff1aSopenharmony_ci    .p.sample_fmts          = (const enum AVSampleFormat[]) {AV_SAMPLE_FMT_S16, AV_SAMPLE_FMT_S32, AV_SAMPLE_FMT_NONE},
2242cabdff1aSopenharmony_ci    .p.supported_samplerates = (const int[]) {44100, 48000, 88200, 96000, 176400, 192000, 0},
2243cabdff1aSopenharmony_ci#if FF_API_OLD_CHANNEL_LAYOUT
2244cabdff1aSopenharmony_ci    .p.channel_layouts      = (const uint64_t[]) {AV_CH_LAYOUT_STEREO, AV_CH_LAYOUT_5POINT0_BACK, AV_CH_LAYOUT_5POINT1_BACK, 0},
2245cabdff1aSopenharmony_ci#endif
2246cabdff1aSopenharmony_ci    .p.ch_layouts           = (const AVChannelLayout[]) {
2247cabdff1aSopenharmony_ci                                  AV_CHANNEL_LAYOUT_STEREO,
2248cabdff1aSopenharmony_ci                                  AV_CHANNEL_LAYOUT_5POINT0_BACK,
2249cabdff1aSopenharmony_ci                                  AV_CHANNEL_LAYOUT_5POINT1_BACK,
2250cabdff1aSopenharmony_ci                                  { 0 }
2251cabdff1aSopenharmony_ci                              },
2252cabdff1aSopenharmony_ci    .caps_internal          = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP,
2253cabdff1aSopenharmony_ci};
2254cabdff1aSopenharmony_ci#endif
2255