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