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