1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (C) 2016 foo86 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * This file is part of FFmpeg. 5cabdff1aSopenharmony_ci * 6cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 7cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 8cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 9cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 12cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 13cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14cabdff1aSopenharmony_ci * Lesser General Public License for more details. 15cabdff1aSopenharmony_ci * 16cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 17cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 18cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19cabdff1aSopenharmony_ci */ 20cabdff1aSopenharmony_ci 21cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h" 22cabdff1aSopenharmony_ci#include "dcadec.h" 23cabdff1aSopenharmony_ci#include "dcadata.h" 24cabdff1aSopenharmony_ci#include "dcamath.h" 25cabdff1aSopenharmony_ci#include "dca_syncwords.h" 26cabdff1aSopenharmony_ci#include "internal.h" 27cabdff1aSopenharmony_ci#include "unary.h" 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_cistatic int get_linear(GetBitContext *gb, int n) 30cabdff1aSopenharmony_ci{ 31cabdff1aSopenharmony_ci unsigned int v = get_bits_long(gb, n); 32cabdff1aSopenharmony_ci return (v >> 1) ^ -(v & 1); 33cabdff1aSopenharmony_ci} 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_cistatic int get_rice_un(GetBitContext *gb, int k) 36cabdff1aSopenharmony_ci{ 37cabdff1aSopenharmony_ci unsigned int v = get_unary(gb, 1, get_bits_left(gb)); 38cabdff1aSopenharmony_ci return (v << k) | get_bits_long(gb, k); 39cabdff1aSopenharmony_ci} 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_cistatic int get_rice(GetBitContext *gb, int k) 42cabdff1aSopenharmony_ci{ 43cabdff1aSopenharmony_ci unsigned int v = get_rice_un(gb, k); 44cabdff1aSopenharmony_ci return (v >> 1) ^ -(v & 1); 45cabdff1aSopenharmony_ci} 46cabdff1aSopenharmony_ci 47cabdff1aSopenharmony_cistatic void get_array(GetBitContext *gb, int32_t *array, int size, int n) 48cabdff1aSopenharmony_ci{ 49cabdff1aSopenharmony_ci int i; 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_ci for (i = 0; i < size; i++) 52cabdff1aSopenharmony_ci array[i] = get_bits(gb, n); 53cabdff1aSopenharmony_ci} 54cabdff1aSopenharmony_ci 55cabdff1aSopenharmony_cistatic void get_linear_array(GetBitContext *gb, int32_t *array, int size, int n) 56cabdff1aSopenharmony_ci{ 57cabdff1aSopenharmony_ci int i; 58cabdff1aSopenharmony_ci 59cabdff1aSopenharmony_ci if (n == 0) 60cabdff1aSopenharmony_ci memset(array, 0, sizeof(*array) * size); 61cabdff1aSopenharmony_ci else for (i = 0; i < size; i++) 62cabdff1aSopenharmony_ci array[i] = get_linear(gb, n); 63cabdff1aSopenharmony_ci} 64cabdff1aSopenharmony_ci 65cabdff1aSopenharmony_cistatic void get_rice_array(GetBitContext *gb, int32_t *array, int size, int k) 66cabdff1aSopenharmony_ci{ 67cabdff1aSopenharmony_ci int i; 68cabdff1aSopenharmony_ci 69cabdff1aSopenharmony_ci for (i = 0; i < size; i++) 70cabdff1aSopenharmony_ci array[i] = get_rice(gb, k); 71cabdff1aSopenharmony_ci} 72cabdff1aSopenharmony_ci 73cabdff1aSopenharmony_cistatic int parse_dmix_coeffs(DCAXllDecoder *s, DCAXllChSet *c) 74cabdff1aSopenharmony_ci{ 75cabdff1aSopenharmony_ci // Size of downmix coefficient matrix 76cabdff1aSopenharmony_ci int m = c->primary_chset ? ff_dca_dmix_primary_nch[c->dmix_type] : c->hier_ofs; 77cabdff1aSopenharmony_ci int i, j, *coeff_ptr = c->dmix_coeff; 78cabdff1aSopenharmony_ci 79cabdff1aSopenharmony_ci for (i = 0; i < m; i++) { 80cabdff1aSopenharmony_ci int code, sign, coeff, scale, scale_inv = 0; 81cabdff1aSopenharmony_ci unsigned int index; 82cabdff1aSopenharmony_ci 83cabdff1aSopenharmony_ci // Downmix scale (only for non-primary channel sets) 84cabdff1aSopenharmony_ci if (!c->primary_chset) { 85cabdff1aSopenharmony_ci code = get_bits(&s->gb, 9); 86cabdff1aSopenharmony_ci sign = (code >> 8) - 1; 87cabdff1aSopenharmony_ci index = (code & 0xff) - FF_DCA_DMIXTABLE_OFFSET; 88cabdff1aSopenharmony_ci if (index >= FF_DCA_INV_DMIXTABLE_SIZE) { 89cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XLL downmix scale index\n"); 90cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 91cabdff1aSopenharmony_ci } 92cabdff1aSopenharmony_ci scale = ff_dca_dmixtable[index + FF_DCA_DMIXTABLE_OFFSET]; 93cabdff1aSopenharmony_ci scale_inv = ff_dca_inv_dmixtable[index]; 94cabdff1aSopenharmony_ci c->dmix_scale[i] = (scale ^ sign) - sign; 95cabdff1aSopenharmony_ci c->dmix_scale_inv[i] = (scale_inv ^ sign) - sign; 96cabdff1aSopenharmony_ci } 97cabdff1aSopenharmony_ci 98cabdff1aSopenharmony_ci // Downmix coefficients 99cabdff1aSopenharmony_ci for (j = 0; j < c->nchannels; j++) { 100cabdff1aSopenharmony_ci code = get_bits(&s->gb, 9); 101cabdff1aSopenharmony_ci sign = (code >> 8) - 1; 102cabdff1aSopenharmony_ci index = code & 0xff; 103cabdff1aSopenharmony_ci if (index >= FF_DCA_DMIXTABLE_SIZE) { 104cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XLL downmix coefficient index\n"); 105cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 106cabdff1aSopenharmony_ci } 107cabdff1aSopenharmony_ci coeff = ff_dca_dmixtable[index]; 108cabdff1aSopenharmony_ci if (!c->primary_chset) 109cabdff1aSopenharmony_ci // Multiply by |InvDmixScale| to get |UndoDmixScale| 110cabdff1aSopenharmony_ci coeff = mul16(scale_inv, coeff); 111cabdff1aSopenharmony_ci *coeff_ptr++ = (coeff ^ sign) - sign; 112cabdff1aSopenharmony_ci } 113cabdff1aSopenharmony_ci } 114cabdff1aSopenharmony_ci 115cabdff1aSopenharmony_ci return 0; 116cabdff1aSopenharmony_ci} 117cabdff1aSopenharmony_ci 118cabdff1aSopenharmony_cistatic int chs_parse_header(DCAXllDecoder *s, DCAXllChSet *c, DCAExssAsset *asset) 119cabdff1aSopenharmony_ci{ 120cabdff1aSopenharmony_ci int i, j, k, ret, band, header_size, header_pos = get_bits_count(&s->gb); 121cabdff1aSopenharmony_ci DCAXllChSet *p = &s->chset[0]; 122cabdff1aSopenharmony_ci DCAXllBand *b; 123cabdff1aSopenharmony_ci 124cabdff1aSopenharmony_ci // Size of channel set sub-header 125cabdff1aSopenharmony_ci header_size = get_bits(&s->gb, 10) + 1; 126cabdff1aSopenharmony_ci 127cabdff1aSopenharmony_ci // Check CRC 128cabdff1aSopenharmony_ci if (ff_dca_check_crc(s->avctx, &s->gb, header_pos, header_pos + header_size * 8)) { 129cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XLL sub-header checksum\n"); 130cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 131cabdff1aSopenharmony_ci } 132cabdff1aSopenharmony_ci 133cabdff1aSopenharmony_ci // Number of channels in the channel set 134cabdff1aSopenharmony_ci c->nchannels = get_bits(&s->gb, 4) + 1; 135cabdff1aSopenharmony_ci if (c->nchannels > DCA_XLL_CHANNELS_MAX) { 136cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "%d XLL channels", c->nchannels); 137cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 138cabdff1aSopenharmony_ci } 139cabdff1aSopenharmony_ci 140cabdff1aSopenharmony_ci // Residual type 141cabdff1aSopenharmony_ci c->residual_encode = get_bits(&s->gb, c->nchannels); 142cabdff1aSopenharmony_ci 143cabdff1aSopenharmony_ci // PCM bit resolution 144cabdff1aSopenharmony_ci c->pcm_bit_res = get_bits(&s->gb, 5) + 1; 145cabdff1aSopenharmony_ci 146cabdff1aSopenharmony_ci // Storage unit width 147cabdff1aSopenharmony_ci c->storage_bit_res = get_bits(&s->gb, 5) + 1; 148cabdff1aSopenharmony_ci if (c->storage_bit_res != 16 && c->storage_bit_res != 20 && c->storage_bit_res != 24) { 149cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "%d-bit XLL storage resolution", c->storage_bit_res); 150cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 151cabdff1aSopenharmony_ci } 152cabdff1aSopenharmony_ci 153cabdff1aSopenharmony_ci if (c->pcm_bit_res > c->storage_bit_res) { 154cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid PCM bit resolution for XLL channel set (%d > %d)\n", c->pcm_bit_res, c->storage_bit_res); 155cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 156cabdff1aSopenharmony_ci } 157cabdff1aSopenharmony_ci 158cabdff1aSopenharmony_ci // Original sampling frequency 159cabdff1aSopenharmony_ci c->freq = ff_dca_sampling_freqs[get_bits(&s->gb, 4)]; 160cabdff1aSopenharmony_ci if (c->freq > 192000) { 161cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "%d Hz XLL sampling frequency", c->freq); 162cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 163cabdff1aSopenharmony_ci } 164cabdff1aSopenharmony_ci 165cabdff1aSopenharmony_ci // Sampling frequency modifier 166cabdff1aSopenharmony_ci if (get_bits(&s->gb, 2)) { 167cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "XLL sampling frequency modifier"); 168cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 169cabdff1aSopenharmony_ci } 170cabdff1aSopenharmony_ci 171cabdff1aSopenharmony_ci // Which replacement set this channel set is member of 172cabdff1aSopenharmony_ci if (get_bits(&s->gb, 2)) { 173cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "XLL replacement set"); 174cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 175cabdff1aSopenharmony_ci } 176cabdff1aSopenharmony_ci 177cabdff1aSopenharmony_ci if (asset->one_to_one_map_ch_to_spkr) { 178cabdff1aSopenharmony_ci // Primary channel set flag 179cabdff1aSopenharmony_ci c->primary_chset = get_bits1(&s->gb); 180cabdff1aSopenharmony_ci if (c->primary_chset != (c == p)) { 181cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "The first (and only) XLL channel set must be primary\n"); 182cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 183cabdff1aSopenharmony_ci } 184cabdff1aSopenharmony_ci 185cabdff1aSopenharmony_ci // Downmix coefficients present in stream 186cabdff1aSopenharmony_ci c->dmix_coeffs_present = get_bits1(&s->gb); 187cabdff1aSopenharmony_ci 188cabdff1aSopenharmony_ci // Downmix already performed by encoder 189cabdff1aSopenharmony_ci c->dmix_embedded = c->dmix_coeffs_present && get_bits1(&s->gb); 190cabdff1aSopenharmony_ci 191cabdff1aSopenharmony_ci // Downmix type 192cabdff1aSopenharmony_ci if (c->dmix_coeffs_present && c->primary_chset) { 193cabdff1aSopenharmony_ci c->dmix_type = get_bits(&s->gb, 3); 194cabdff1aSopenharmony_ci if (c->dmix_type >= DCA_DMIX_TYPE_COUNT) { 195cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XLL primary channel set downmix type\n"); 196cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 197cabdff1aSopenharmony_ci } 198cabdff1aSopenharmony_ci } 199cabdff1aSopenharmony_ci 200cabdff1aSopenharmony_ci // Whether the channel set is part of a hierarchy 201cabdff1aSopenharmony_ci c->hier_chset = get_bits1(&s->gb); 202cabdff1aSopenharmony_ci if (!c->hier_chset && s->nchsets != 1) { 203cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "XLL channel set outside of hierarchy"); 204cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 205cabdff1aSopenharmony_ci } 206cabdff1aSopenharmony_ci 207cabdff1aSopenharmony_ci // Downmix coefficients 208cabdff1aSopenharmony_ci if (c->dmix_coeffs_present && (ret = parse_dmix_coeffs(s, c)) < 0) 209cabdff1aSopenharmony_ci return ret; 210cabdff1aSopenharmony_ci 211cabdff1aSopenharmony_ci // Channel mask enabled 212cabdff1aSopenharmony_ci if (!get_bits1(&s->gb)) { 213cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "Disabled XLL channel mask"); 214cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 215cabdff1aSopenharmony_ci } 216cabdff1aSopenharmony_ci 217cabdff1aSopenharmony_ci // Channel mask for set 218cabdff1aSopenharmony_ci c->ch_mask = get_bits_long(&s->gb, s->ch_mask_nbits); 219cabdff1aSopenharmony_ci if (av_popcount(c->ch_mask) != c->nchannels) { 220cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XLL channel mask\n"); 221cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 222cabdff1aSopenharmony_ci } 223cabdff1aSopenharmony_ci 224cabdff1aSopenharmony_ci // Build the channel to speaker map 225cabdff1aSopenharmony_ci for (i = 0, j = 0; i < s->ch_mask_nbits; i++) 226cabdff1aSopenharmony_ci if (c->ch_mask & (1U << i)) 227cabdff1aSopenharmony_ci c->ch_remap[j++] = i; 228cabdff1aSopenharmony_ci } else { 229cabdff1aSopenharmony_ci // Mapping coeffs present flag 230cabdff1aSopenharmony_ci if (c->nchannels != 2 || s->nchsets != 1 || get_bits1(&s->gb)) { 231cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "Custom XLL channel to speaker mapping"); 232cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 233cabdff1aSopenharmony_ci } 234cabdff1aSopenharmony_ci 235cabdff1aSopenharmony_ci // Setup for LtRt decoding 236cabdff1aSopenharmony_ci c->primary_chset = 1; 237cabdff1aSopenharmony_ci c->dmix_coeffs_present = 0; 238cabdff1aSopenharmony_ci c->dmix_embedded = 0; 239cabdff1aSopenharmony_ci c->hier_chset = 0; 240cabdff1aSopenharmony_ci c->ch_mask = DCA_SPEAKER_LAYOUT_STEREO; 241cabdff1aSopenharmony_ci c->ch_remap[0] = DCA_SPEAKER_L; 242cabdff1aSopenharmony_ci c->ch_remap[1] = DCA_SPEAKER_R; 243cabdff1aSopenharmony_ci } 244cabdff1aSopenharmony_ci 245cabdff1aSopenharmony_ci if (c->freq > 96000) { 246cabdff1aSopenharmony_ci // Extra frequency bands flag 247cabdff1aSopenharmony_ci if (get_bits1(&s->gb)) { 248cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "Extra XLL frequency bands"); 249cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 250cabdff1aSopenharmony_ci } 251cabdff1aSopenharmony_ci c->nfreqbands = 2; 252cabdff1aSopenharmony_ci } else { 253cabdff1aSopenharmony_ci c->nfreqbands = 1; 254cabdff1aSopenharmony_ci } 255cabdff1aSopenharmony_ci 256cabdff1aSopenharmony_ci // Set the sampling frequency to that of the first frequency band. 257cabdff1aSopenharmony_ci // Frequency will be doubled again after bands assembly. 258cabdff1aSopenharmony_ci c->freq >>= c->nfreqbands - 1; 259cabdff1aSopenharmony_ci 260cabdff1aSopenharmony_ci // Verify that all channel sets have the same audio characteristics 261cabdff1aSopenharmony_ci if (c != p && (c->nfreqbands != p->nfreqbands || c->freq != p->freq 262cabdff1aSopenharmony_ci || c->pcm_bit_res != p->pcm_bit_res 263cabdff1aSopenharmony_ci || c->storage_bit_res != p->storage_bit_res)) { 264cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "Different XLL audio characteristics"); 265cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 266cabdff1aSopenharmony_ci } 267cabdff1aSopenharmony_ci 268cabdff1aSopenharmony_ci // Determine number of bits to read bit allocation coding parameter 269cabdff1aSopenharmony_ci if (c->storage_bit_res > 16) 270cabdff1aSopenharmony_ci c->nabits = 5; 271cabdff1aSopenharmony_ci else if (c->storage_bit_res > 8) 272cabdff1aSopenharmony_ci c->nabits = 4; 273cabdff1aSopenharmony_ci else 274cabdff1aSopenharmony_ci c->nabits = 3; 275cabdff1aSopenharmony_ci 276cabdff1aSopenharmony_ci // Account for embedded downmix and decimator saturation 277cabdff1aSopenharmony_ci if ((s->nchsets > 1 || c->nfreqbands > 1) && c->nabits < 5) 278cabdff1aSopenharmony_ci c->nabits++; 279cabdff1aSopenharmony_ci 280cabdff1aSopenharmony_ci for (band = 0, b = c->bands; band < c->nfreqbands; band++, b++) { 281cabdff1aSopenharmony_ci // Pairwise channel decorrelation 282cabdff1aSopenharmony_ci if ((b->decor_enabled = get_bits1(&s->gb)) && c->nchannels > 1) { 283cabdff1aSopenharmony_ci int ch_nbits = av_ceil_log2(c->nchannels); 284cabdff1aSopenharmony_ci 285cabdff1aSopenharmony_ci // Original channel order 286cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels; i++) { 287cabdff1aSopenharmony_ci b->orig_order[i] = get_bits(&s->gb, ch_nbits); 288cabdff1aSopenharmony_ci if (b->orig_order[i] >= c->nchannels) { 289cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XLL original channel order\n"); 290cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 291cabdff1aSopenharmony_ci } 292cabdff1aSopenharmony_ci } 293cabdff1aSopenharmony_ci 294cabdff1aSopenharmony_ci // Pairwise channel coefficients 295cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels / 2; i++) 296cabdff1aSopenharmony_ci b->decor_coeff[i] = get_bits1(&s->gb) ? get_linear(&s->gb, 7) : 0; 297cabdff1aSopenharmony_ci } else { 298cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels; i++) 299cabdff1aSopenharmony_ci b->orig_order[i] = i; 300cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels / 2; i++) 301cabdff1aSopenharmony_ci b->decor_coeff[i] = 0; 302cabdff1aSopenharmony_ci } 303cabdff1aSopenharmony_ci 304cabdff1aSopenharmony_ci // Adaptive predictor order 305cabdff1aSopenharmony_ci b->highest_pred_order = 0; 306cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels; i++) { 307cabdff1aSopenharmony_ci b->adapt_pred_order[i] = get_bits(&s->gb, 4); 308cabdff1aSopenharmony_ci if (b->adapt_pred_order[i] > b->highest_pred_order) 309cabdff1aSopenharmony_ci b->highest_pred_order = b->adapt_pred_order[i]; 310cabdff1aSopenharmony_ci } 311cabdff1aSopenharmony_ci if (b->highest_pred_order > s->nsegsamples) { 312cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XLL adaptive predicition order\n"); 313cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 314cabdff1aSopenharmony_ci } 315cabdff1aSopenharmony_ci 316cabdff1aSopenharmony_ci // Fixed predictor order 317cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels; i++) 318cabdff1aSopenharmony_ci b->fixed_pred_order[i] = b->adapt_pred_order[i] ? 0 : get_bits(&s->gb, 2); 319cabdff1aSopenharmony_ci 320cabdff1aSopenharmony_ci // Adaptive predictor quantized reflection coefficients 321cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels; i++) { 322cabdff1aSopenharmony_ci for (j = 0; j < b->adapt_pred_order[i]; j++) { 323cabdff1aSopenharmony_ci k = get_linear(&s->gb, 8); 324cabdff1aSopenharmony_ci if (k == -128) { 325cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XLL reflection coefficient index\n"); 326cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 327cabdff1aSopenharmony_ci } 328cabdff1aSopenharmony_ci if (k < 0) 329cabdff1aSopenharmony_ci b->adapt_refl_coeff[i][j] = -(int)ff_dca_xll_refl_coeff[-k]; 330cabdff1aSopenharmony_ci else 331cabdff1aSopenharmony_ci b->adapt_refl_coeff[i][j] = (int)ff_dca_xll_refl_coeff[ k]; 332cabdff1aSopenharmony_ci } 333cabdff1aSopenharmony_ci } 334cabdff1aSopenharmony_ci 335cabdff1aSopenharmony_ci // Downmix performed by encoder in extension frequency band 336cabdff1aSopenharmony_ci b->dmix_embedded = c->dmix_embedded && (band == 0 || get_bits1(&s->gb)); 337cabdff1aSopenharmony_ci 338cabdff1aSopenharmony_ci // MSB/LSB split flag in extension frequency band 339cabdff1aSopenharmony_ci if ((band == 0 && s->scalable_lsbs) || (band != 0 && get_bits1(&s->gb))) { 340cabdff1aSopenharmony_ci // Size of LSB section in any segment 341cabdff1aSopenharmony_ci b->lsb_section_size = get_bits_long(&s->gb, s->seg_size_nbits); 342cabdff1aSopenharmony_ci if (b->lsb_section_size < 0 || b->lsb_section_size > s->frame_size) { 343cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid LSB section size\n"); 344cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 345cabdff1aSopenharmony_ci } 346cabdff1aSopenharmony_ci 347cabdff1aSopenharmony_ci // Account for optional CRC bytes after LSB section 348cabdff1aSopenharmony_ci if (b->lsb_section_size && (s->band_crc_present > 2 || 349cabdff1aSopenharmony_ci (band == 0 && s->band_crc_present > 1))) 350cabdff1aSopenharmony_ci b->lsb_section_size += 2; 351cabdff1aSopenharmony_ci 352cabdff1aSopenharmony_ci // Number of bits to represent the samples in LSB part 353cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels; i++) { 354cabdff1aSopenharmony_ci b->nscalablelsbs[i] = get_bits(&s->gb, 4); 355cabdff1aSopenharmony_ci if (b->nscalablelsbs[i] && !b->lsb_section_size) { 356cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "LSB section missing with non-zero LSB width\n"); 357cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 358cabdff1aSopenharmony_ci } 359cabdff1aSopenharmony_ci } 360cabdff1aSopenharmony_ci } else { 361cabdff1aSopenharmony_ci b->lsb_section_size = 0; 362cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels; i++) 363cabdff1aSopenharmony_ci b->nscalablelsbs[i] = 0; 364cabdff1aSopenharmony_ci } 365cabdff1aSopenharmony_ci 366cabdff1aSopenharmony_ci // Scalable resolution flag in extension frequency band 367cabdff1aSopenharmony_ci if ((band == 0 && s->scalable_lsbs) || (band != 0 && get_bits1(&s->gb))) { 368cabdff1aSopenharmony_ci // Number of bits discarded by authoring 369cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels; i++) 370cabdff1aSopenharmony_ci b->bit_width_adjust[i] = get_bits(&s->gb, 4); 371cabdff1aSopenharmony_ci } else { 372cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels; i++) 373cabdff1aSopenharmony_ci b->bit_width_adjust[i] = 0; 374cabdff1aSopenharmony_ci } 375cabdff1aSopenharmony_ci } 376cabdff1aSopenharmony_ci 377cabdff1aSopenharmony_ci // Reserved 378cabdff1aSopenharmony_ci // Byte align 379cabdff1aSopenharmony_ci // CRC16 of channel set sub-header 380cabdff1aSopenharmony_ci if (ff_dca_seek_bits(&s->gb, header_pos + header_size * 8)) { 381cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Read past end of XLL sub-header\n"); 382cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 383cabdff1aSopenharmony_ci } 384cabdff1aSopenharmony_ci 385cabdff1aSopenharmony_ci return 0; 386cabdff1aSopenharmony_ci} 387cabdff1aSopenharmony_ci 388cabdff1aSopenharmony_cistatic int chs_alloc_msb_band_data(DCAXllDecoder *s, DCAXllChSet *c) 389cabdff1aSopenharmony_ci{ 390cabdff1aSopenharmony_ci int ndecisamples = c->nfreqbands > 1 ? DCA_XLL_DECI_HISTORY_MAX : 0; 391cabdff1aSopenharmony_ci int nchsamples = s->nframesamples + ndecisamples; 392cabdff1aSopenharmony_ci int i, j, nsamples = nchsamples * c->nchannels * c->nfreqbands; 393cabdff1aSopenharmony_ci int32_t *ptr; 394cabdff1aSopenharmony_ci 395cabdff1aSopenharmony_ci // Reallocate MSB sample buffer 396cabdff1aSopenharmony_ci av_fast_malloc(&c->sample_buffer[0], &c->sample_size[0], nsamples * sizeof(int32_t)); 397cabdff1aSopenharmony_ci if (!c->sample_buffer[0]) 398cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 399cabdff1aSopenharmony_ci 400cabdff1aSopenharmony_ci ptr = c->sample_buffer[0] + ndecisamples; 401cabdff1aSopenharmony_ci for (i = 0; i < c->nfreqbands; i++) { 402cabdff1aSopenharmony_ci for (j = 0; j < c->nchannels; j++) { 403cabdff1aSopenharmony_ci c->bands[i].msb_sample_buffer[j] = ptr; 404cabdff1aSopenharmony_ci ptr += nchsamples; 405cabdff1aSopenharmony_ci } 406cabdff1aSopenharmony_ci } 407cabdff1aSopenharmony_ci 408cabdff1aSopenharmony_ci return 0; 409cabdff1aSopenharmony_ci} 410cabdff1aSopenharmony_ci 411cabdff1aSopenharmony_cistatic int chs_alloc_lsb_band_data(DCAXllDecoder *s, DCAXllChSet *c) 412cabdff1aSopenharmony_ci{ 413cabdff1aSopenharmony_ci int i, j, nsamples = 0; 414cabdff1aSopenharmony_ci int32_t *ptr; 415cabdff1aSopenharmony_ci 416cabdff1aSopenharmony_ci // Determine number of frequency bands that have MSB/LSB split 417cabdff1aSopenharmony_ci for (i = 0; i < c->nfreqbands; i++) 418cabdff1aSopenharmony_ci if (c->bands[i].lsb_section_size) 419cabdff1aSopenharmony_ci nsamples += s->nframesamples * c->nchannels; 420cabdff1aSopenharmony_ci if (!nsamples) 421cabdff1aSopenharmony_ci return 0; 422cabdff1aSopenharmony_ci 423cabdff1aSopenharmony_ci // Reallocate LSB sample buffer 424cabdff1aSopenharmony_ci av_fast_malloc(&c->sample_buffer[1], &c->sample_size[1], nsamples * sizeof(int32_t)); 425cabdff1aSopenharmony_ci if (!c->sample_buffer[1]) 426cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 427cabdff1aSopenharmony_ci 428cabdff1aSopenharmony_ci ptr = c->sample_buffer[1]; 429cabdff1aSopenharmony_ci for (i = 0; i < c->nfreqbands; i++) { 430cabdff1aSopenharmony_ci if (c->bands[i].lsb_section_size) { 431cabdff1aSopenharmony_ci for (j = 0; j < c->nchannels; j++) { 432cabdff1aSopenharmony_ci c->bands[i].lsb_sample_buffer[j] = ptr; 433cabdff1aSopenharmony_ci ptr += s->nframesamples; 434cabdff1aSopenharmony_ci } 435cabdff1aSopenharmony_ci } else { 436cabdff1aSopenharmony_ci for (j = 0; j < c->nchannels; j++) 437cabdff1aSopenharmony_ci c->bands[i].lsb_sample_buffer[j] = NULL; 438cabdff1aSopenharmony_ci } 439cabdff1aSopenharmony_ci } 440cabdff1aSopenharmony_ci 441cabdff1aSopenharmony_ci return 0; 442cabdff1aSopenharmony_ci} 443cabdff1aSopenharmony_ci 444cabdff1aSopenharmony_cistatic int chs_parse_band_data(DCAXllDecoder *s, DCAXllChSet *c, int band, int seg, int band_data_end) 445cabdff1aSopenharmony_ci{ 446cabdff1aSopenharmony_ci DCAXllBand *b = &c->bands[band]; 447cabdff1aSopenharmony_ci int i, j, k; 448cabdff1aSopenharmony_ci 449cabdff1aSopenharmony_ci // Start unpacking MSB portion of the segment 450cabdff1aSopenharmony_ci if (!(seg && get_bits1(&s->gb))) { 451cabdff1aSopenharmony_ci // Unpack segment type 452cabdff1aSopenharmony_ci // 0 - distinct coding parameters for each channel 453cabdff1aSopenharmony_ci // 1 - common coding parameters for all channels 454cabdff1aSopenharmony_ci c->seg_common = get_bits1(&s->gb); 455cabdff1aSopenharmony_ci 456cabdff1aSopenharmony_ci // Determine number of coding parameters encoded in segment 457cabdff1aSopenharmony_ci k = c->seg_common ? 1 : c->nchannels; 458cabdff1aSopenharmony_ci 459cabdff1aSopenharmony_ci // Unpack Rice coding parameters 460cabdff1aSopenharmony_ci for (i = 0; i < k; i++) { 461cabdff1aSopenharmony_ci // Unpack Rice coding flag 462cabdff1aSopenharmony_ci // 0 - linear code, 1 - Rice code 463cabdff1aSopenharmony_ci c->rice_code_flag[i] = get_bits1(&s->gb); 464cabdff1aSopenharmony_ci // Unpack Hybrid Rice coding flag 465cabdff1aSopenharmony_ci // 0 - Rice code, 1 - Hybrid Rice code 466cabdff1aSopenharmony_ci if (!c->seg_common && c->rice_code_flag[i] && get_bits1(&s->gb)) 467cabdff1aSopenharmony_ci // Unpack binary code length for isolated samples 468cabdff1aSopenharmony_ci c->bitalloc_hybrid_linear[i] = get_bits(&s->gb, c->nabits) + 1; 469cabdff1aSopenharmony_ci else 470cabdff1aSopenharmony_ci // 0 indicates no Hybrid Rice coding 471cabdff1aSopenharmony_ci c->bitalloc_hybrid_linear[i] = 0; 472cabdff1aSopenharmony_ci } 473cabdff1aSopenharmony_ci 474cabdff1aSopenharmony_ci // Unpack coding parameters 475cabdff1aSopenharmony_ci for (i = 0; i < k; i++) { 476cabdff1aSopenharmony_ci if (seg == 0) { 477cabdff1aSopenharmony_ci // Unpack coding parameter for part A of segment 0 478cabdff1aSopenharmony_ci c->bitalloc_part_a[i] = get_bits(&s->gb, c->nabits); 479cabdff1aSopenharmony_ci 480cabdff1aSopenharmony_ci // Adjust for the linear code 481cabdff1aSopenharmony_ci if (!c->rice_code_flag[i] && c->bitalloc_part_a[i]) 482cabdff1aSopenharmony_ci c->bitalloc_part_a[i]++; 483cabdff1aSopenharmony_ci 484cabdff1aSopenharmony_ci if (!c->seg_common) 485cabdff1aSopenharmony_ci c->nsamples_part_a[i] = b->adapt_pred_order[i]; 486cabdff1aSopenharmony_ci else 487cabdff1aSopenharmony_ci c->nsamples_part_a[i] = b->highest_pred_order; 488cabdff1aSopenharmony_ci } else { 489cabdff1aSopenharmony_ci c->bitalloc_part_a[i] = 0; 490cabdff1aSopenharmony_ci c->nsamples_part_a[i] = 0; 491cabdff1aSopenharmony_ci } 492cabdff1aSopenharmony_ci 493cabdff1aSopenharmony_ci // Unpack coding parameter for part B of segment 494cabdff1aSopenharmony_ci c->bitalloc_part_b[i] = get_bits(&s->gb, c->nabits); 495cabdff1aSopenharmony_ci 496cabdff1aSopenharmony_ci // Adjust for the linear code 497cabdff1aSopenharmony_ci if (!c->rice_code_flag[i] && c->bitalloc_part_b[i]) 498cabdff1aSopenharmony_ci c->bitalloc_part_b[i]++; 499cabdff1aSopenharmony_ci } 500cabdff1aSopenharmony_ci } 501cabdff1aSopenharmony_ci 502cabdff1aSopenharmony_ci // Unpack entropy codes 503cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels; i++) { 504cabdff1aSopenharmony_ci int32_t *part_a, *part_b; 505cabdff1aSopenharmony_ci int nsamples_part_b; 506cabdff1aSopenharmony_ci 507cabdff1aSopenharmony_ci // Select index of coding parameters 508cabdff1aSopenharmony_ci k = c->seg_common ? 0 : i; 509cabdff1aSopenharmony_ci 510cabdff1aSopenharmony_ci // Slice the segment into parts A and B 511cabdff1aSopenharmony_ci part_a = b->msb_sample_buffer[i] + seg * s->nsegsamples; 512cabdff1aSopenharmony_ci part_b = part_a + c->nsamples_part_a[k]; 513cabdff1aSopenharmony_ci nsamples_part_b = s->nsegsamples - c->nsamples_part_a[k]; 514cabdff1aSopenharmony_ci 515cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 0) 516cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 517cabdff1aSopenharmony_ci 518cabdff1aSopenharmony_ci if (!c->rice_code_flag[k]) { 519cabdff1aSopenharmony_ci // Linear codes 520cabdff1aSopenharmony_ci // Unpack all residuals of part A of segment 0 521cabdff1aSopenharmony_ci get_linear_array(&s->gb, part_a, c->nsamples_part_a[k], 522cabdff1aSopenharmony_ci c->bitalloc_part_a[k]); 523cabdff1aSopenharmony_ci 524cabdff1aSopenharmony_ci // Unpack all residuals of part B of segment 0 and others 525cabdff1aSopenharmony_ci get_linear_array(&s->gb, part_b, nsamples_part_b, 526cabdff1aSopenharmony_ci c->bitalloc_part_b[k]); 527cabdff1aSopenharmony_ci } else { 528cabdff1aSopenharmony_ci // Rice codes 529cabdff1aSopenharmony_ci // Unpack all residuals of part A of segment 0 530cabdff1aSopenharmony_ci get_rice_array(&s->gb, part_a, c->nsamples_part_a[k], 531cabdff1aSopenharmony_ci c->bitalloc_part_a[k]); 532cabdff1aSopenharmony_ci 533cabdff1aSopenharmony_ci if (c->bitalloc_hybrid_linear[k]) { 534cabdff1aSopenharmony_ci // Hybrid Rice codes 535cabdff1aSopenharmony_ci // Unpack the number of isolated samples 536cabdff1aSopenharmony_ci int nisosamples = get_bits(&s->gb, s->nsegsamples_log2); 537cabdff1aSopenharmony_ci 538cabdff1aSopenharmony_ci // Set all locations to 0 539cabdff1aSopenharmony_ci memset(part_b, 0, sizeof(*part_b) * nsamples_part_b); 540cabdff1aSopenharmony_ci 541cabdff1aSopenharmony_ci // Extract the locations of isolated samples and flag by -1 542cabdff1aSopenharmony_ci for (j = 0; j < nisosamples; j++) { 543cabdff1aSopenharmony_ci int loc = get_bits(&s->gb, s->nsegsamples_log2); 544cabdff1aSopenharmony_ci if (loc >= nsamples_part_b) { 545cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid isolated sample location\n"); 546cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 547cabdff1aSopenharmony_ci } 548cabdff1aSopenharmony_ci part_b[loc] = -1; 549cabdff1aSopenharmony_ci } 550cabdff1aSopenharmony_ci 551cabdff1aSopenharmony_ci // Unpack all residuals of part B of segment 0 and others 552cabdff1aSopenharmony_ci for (j = 0; j < nsamples_part_b; j++) { 553cabdff1aSopenharmony_ci if (part_b[j]) 554cabdff1aSopenharmony_ci part_b[j] = get_linear(&s->gb, c->bitalloc_hybrid_linear[k]); 555cabdff1aSopenharmony_ci else 556cabdff1aSopenharmony_ci part_b[j] = get_rice(&s->gb, c->bitalloc_part_b[k]); 557cabdff1aSopenharmony_ci } 558cabdff1aSopenharmony_ci } else { 559cabdff1aSopenharmony_ci // Rice codes 560cabdff1aSopenharmony_ci // Unpack all residuals of part B of segment 0 and others 561cabdff1aSopenharmony_ci get_rice_array(&s->gb, part_b, nsamples_part_b, c->bitalloc_part_b[k]); 562cabdff1aSopenharmony_ci } 563cabdff1aSopenharmony_ci } 564cabdff1aSopenharmony_ci } 565cabdff1aSopenharmony_ci 566cabdff1aSopenharmony_ci // Unpack decimator history for frequency band 1 567cabdff1aSopenharmony_ci if (seg == 0 && band == 1) { 568cabdff1aSopenharmony_ci int nbits = get_bits(&s->gb, 5) + 1; 569cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels; i++) 570cabdff1aSopenharmony_ci for (j = 1; j < DCA_XLL_DECI_HISTORY_MAX; j++) 571cabdff1aSopenharmony_ci c->deci_history[i][j] = get_sbits_long(&s->gb, nbits); 572cabdff1aSopenharmony_ci } 573cabdff1aSopenharmony_ci 574cabdff1aSopenharmony_ci // Start unpacking LSB portion of the segment 575cabdff1aSopenharmony_ci if (b->lsb_section_size) { 576cabdff1aSopenharmony_ci // Skip to the start of LSB portion 577cabdff1aSopenharmony_ci if (ff_dca_seek_bits(&s->gb, band_data_end - b->lsb_section_size * 8)) { 578cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Read past end of XLL band data\n"); 579cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 580cabdff1aSopenharmony_ci } 581cabdff1aSopenharmony_ci 582cabdff1aSopenharmony_ci // Unpack all LSB parts of residuals of this segment 583cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels; i++) { 584cabdff1aSopenharmony_ci if (b->nscalablelsbs[i]) { 585cabdff1aSopenharmony_ci get_array(&s->gb, 586cabdff1aSopenharmony_ci b->lsb_sample_buffer[i] + seg * s->nsegsamples, 587cabdff1aSopenharmony_ci s->nsegsamples, b->nscalablelsbs[i]); 588cabdff1aSopenharmony_ci } 589cabdff1aSopenharmony_ci } 590cabdff1aSopenharmony_ci } 591cabdff1aSopenharmony_ci 592cabdff1aSopenharmony_ci // Skip to the end of band data 593cabdff1aSopenharmony_ci if (ff_dca_seek_bits(&s->gb, band_data_end)) { 594cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Read past end of XLL band data\n"); 595cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 596cabdff1aSopenharmony_ci } 597cabdff1aSopenharmony_ci 598cabdff1aSopenharmony_ci return 0; 599cabdff1aSopenharmony_ci} 600cabdff1aSopenharmony_ci 601cabdff1aSopenharmony_cistatic av_cold void chs_clear_band_data(DCAXllDecoder *s, DCAXllChSet *c, int band, int seg) 602cabdff1aSopenharmony_ci{ 603cabdff1aSopenharmony_ci DCAXllBand *b = &c->bands[band]; 604cabdff1aSopenharmony_ci int i, offset, nsamples; 605cabdff1aSopenharmony_ci 606cabdff1aSopenharmony_ci if (seg < 0) { 607cabdff1aSopenharmony_ci offset = 0; 608cabdff1aSopenharmony_ci nsamples = s->nframesamples; 609cabdff1aSopenharmony_ci } else { 610cabdff1aSopenharmony_ci offset = seg * s->nsegsamples; 611cabdff1aSopenharmony_ci nsamples = s->nsegsamples; 612cabdff1aSopenharmony_ci } 613cabdff1aSopenharmony_ci 614cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels; i++) { 615cabdff1aSopenharmony_ci memset(b->msb_sample_buffer[i] + offset, 0, nsamples * sizeof(int32_t)); 616cabdff1aSopenharmony_ci if (b->lsb_section_size) 617cabdff1aSopenharmony_ci memset(b->lsb_sample_buffer[i] + offset, 0, nsamples * sizeof(int32_t)); 618cabdff1aSopenharmony_ci } 619cabdff1aSopenharmony_ci 620cabdff1aSopenharmony_ci if (seg <= 0 && band) 621cabdff1aSopenharmony_ci memset(c->deci_history, 0, sizeof(c->deci_history)); 622cabdff1aSopenharmony_ci 623cabdff1aSopenharmony_ci if (seg < 0) { 624cabdff1aSopenharmony_ci memset(b->nscalablelsbs, 0, sizeof(b->nscalablelsbs)); 625cabdff1aSopenharmony_ci memset(b->bit_width_adjust, 0, sizeof(b->bit_width_adjust)); 626cabdff1aSopenharmony_ci } 627cabdff1aSopenharmony_ci} 628cabdff1aSopenharmony_ci 629cabdff1aSopenharmony_cistatic void chs_filter_band_data(DCAXllDecoder *s, DCAXllChSet *c, int band) 630cabdff1aSopenharmony_ci{ 631cabdff1aSopenharmony_ci DCAXllBand *b = &c->bands[band]; 632cabdff1aSopenharmony_ci int nsamples = s->nframesamples; 633cabdff1aSopenharmony_ci int i, j, k; 634cabdff1aSopenharmony_ci 635cabdff1aSopenharmony_ci // Inverse adaptive or fixed prediction 636cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels; i++) { 637cabdff1aSopenharmony_ci int32_t *buf = b->msb_sample_buffer[i]; 638cabdff1aSopenharmony_ci int order = b->adapt_pred_order[i]; 639cabdff1aSopenharmony_ci if (order > 0) { 640cabdff1aSopenharmony_ci int coeff[DCA_XLL_ADAPT_PRED_ORDER_MAX]; 641cabdff1aSopenharmony_ci // Conversion from reflection coefficients to direct form coefficients 642cabdff1aSopenharmony_ci for (j = 0; j < order; j++) { 643cabdff1aSopenharmony_ci int rc = b->adapt_refl_coeff[i][j]; 644cabdff1aSopenharmony_ci for (k = 0; k < (j + 1) / 2; k++) { 645cabdff1aSopenharmony_ci int tmp1 = coeff[ k ]; 646cabdff1aSopenharmony_ci int tmp2 = coeff[j - k - 1]; 647cabdff1aSopenharmony_ci coeff[ k ] = tmp1 + mul16(rc, tmp2); 648cabdff1aSopenharmony_ci coeff[j - k - 1] = tmp2 + mul16(rc, tmp1); 649cabdff1aSopenharmony_ci } 650cabdff1aSopenharmony_ci coeff[j] = rc; 651cabdff1aSopenharmony_ci } 652cabdff1aSopenharmony_ci // Inverse adaptive prediction 653cabdff1aSopenharmony_ci for (j = 0; j < nsamples - order; j++) { 654cabdff1aSopenharmony_ci int64_t err = 0; 655cabdff1aSopenharmony_ci for (k = 0; k < order; k++) 656cabdff1aSopenharmony_ci err += (int64_t)buf[j + k] * coeff[order - k - 1]; 657cabdff1aSopenharmony_ci buf[j + k] -= (SUINT)clip23(norm16(err)); 658cabdff1aSopenharmony_ci } 659cabdff1aSopenharmony_ci } else { 660cabdff1aSopenharmony_ci // Inverse fixed coefficient prediction 661cabdff1aSopenharmony_ci for (j = 0; j < b->fixed_pred_order[i]; j++) 662cabdff1aSopenharmony_ci for (k = 1; k < nsamples; k++) 663cabdff1aSopenharmony_ci buf[k] += (unsigned)buf[k - 1]; 664cabdff1aSopenharmony_ci } 665cabdff1aSopenharmony_ci } 666cabdff1aSopenharmony_ci 667cabdff1aSopenharmony_ci // Inverse pairwise channel decorrellation 668cabdff1aSopenharmony_ci if (b->decor_enabled) { 669cabdff1aSopenharmony_ci int32_t *tmp[DCA_XLL_CHANNELS_MAX]; 670cabdff1aSopenharmony_ci 671cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels / 2; i++) { 672cabdff1aSopenharmony_ci int coeff = b->decor_coeff[i]; 673cabdff1aSopenharmony_ci if (coeff) { 674cabdff1aSopenharmony_ci s->dcadsp->decor(b->msb_sample_buffer[i * 2 + 1], 675cabdff1aSopenharmony_ci b->msb_sample_buffer[i * 2 ], 676cabdff1aSopenharmony_ci coeff, nsamples); 677cabdff1aSopenharmony_ci } 678cabdff1aSopenharmony_ci } 679cabdff1aSopenharmony_ci 680cabdff1aSopenharmony_ci // Reorder channel pointers to the original order 681cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels; i++) 682cabdff1aSopenharmony_ci tmp[i] = b->msb_sample_buffer[i]; 683cabdff1aSopenharmony_ci 684cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels; i++) 685cabdff1aSopenharmony_ci b->msb_sample_buffer[b->orig_order[i]] = tmp[i]; 686cabdff1aSopenharmony_ci } 687cabdff1aSopenharmony_ci 688cabdff1aSopenharmony_ci // Map output channel pointers for frequency band 0 689cabdff1aSopenharmony_ci if (c->nfreqbands == 1) 690cabdff1aSopenharmony_ci for (i = 0; i < c->nchannels; i++) 691cabdff1aSopenharmony_ci s->output_samples[c->ch_remap[i]] = b->msb_sample_buffer[i]; 692cabdff1aSopenharmony_ci} 693cabdff1aSopenharmony_ci 694cabdff1aSopenharmony_cistatic int chs_get_lsb_width(DCAXllDecoder *s, DCAXllChSet *c, int band, int ch) 695cabdff1aSopenharmony_ci{ 696cabdff1aSopenharmony_ci int adj = c->bands[band].bit_width_adjust[ch]; 697cabdff1aSopenharmony_ci int shift = c->bands[band].nscalablelsbs[ch]; 698cabdff1aSopenharmony_ci 699cabdff1aSopenharmony_ci if (s->fixed_lsb_width) 700cabdff1aSopenharmony_ci shift = s->fixed_lsb_width; 701cabdff1aSopenharmony_ci else if (shift && adj) 702cabdff1aSopenharmony_ci shift += adj - 1; 703cabdff1aSopenharmony_ci else 704cabdff1aSopenharmony_ci shift += adj; 705cabdff1aSopenharmony_ci 706cabdff1aSopenharmony_ci return shift; 707cabdff1aSopenharmony_ci} 708cabdff1aSopenharmony_ci 709cabdff1aSopenharmony_cistatic void chs_assemble_msbs_lsbs(DCAXllDecoder *s, DCAXllChSet *c, int band) 710cabdff1aSopenharmony_ci{ 711cabdff1aSopenharmony_ci DCAXllBand *b = &c->bands[band]; 712cabdff1aSopenharmony_ci int n, ch, nsamples = s->nframesamples; 713cabdff1aSopenharmony_ci 714cabdff1aSopenharmony_ci for (ch = 0; ch < c->nchannels; ch++) { 715cabdff1aSopenharmony_ci int shift = chs_get_lsb_width(s, c, band, ch); 716cabdff1aSopenharmony_ci if (shift) { 717cabdff1aSopenharmony_ci int32_t *msb = b->msb_sample_buffer[ch]; 718cabdff1aSopenharmony_ci if (b->nscalablelsbs[ch]) { 719cabdff1aSopenharmony_ci int32_t *lsb = b->lsb_sample_buffer[ch]; 720cabdff1aSopenharmony_ci int adj = b->bit_width_adjust[ch]; 721cabdff1aSopenharmony_ci for (n = 0; n < nsamples; n++) 722cabdff1aSopenharmony_ci msb[n] = msb[n] * (SUINT)(1 << shift) + (lsb[n] << adj); 723cabdff1aSopenharmony_ci } else { 724cabdff1aSopenharmony_ci for (n = 0; n < nsamples; n++) 725cabdff1aSopenharmony_ci msb[n] = msb[n] * (SUINT)(1 << shift); 726cabdff1aSopenharmony_ci } 727cabdff1aSopenharmony_ci } 728cabdff1aSopenharmony_ci } 729cabdff1aSopenharmony_ci} 730cabdff1aSopenharmony_ci 731cabdff1aSopenharmony_cistatic int chs_assemble_freq_bands(DCAXllDecoder *s, DCAXllChSet *c) 732cabdff1aSopenharmony_ci{ 733cabdff1aSopenharmony_ci int ch, nsamples = s->nframesamples; 734cabdff1aSopenharmony_ci int32_t *ptr; 735cabdff1aSopenharmony_ci 736cabdff1aSopenharmony_ci av_assert1(c->nfreqbands > 1); 737cabdff1aSopenharmony_ci 738cabdff1aSopenharmony_ci // Reallocate frequency band assembly buffer 739cabdff1aSopenharmony_ci av_fast_malloc(&c->sample_buffer[2], &c->sample_size[2], 740cabdff1aSopenharmony_ci 2 * nsamples * c->nchannels * sizeof(int32_t)); 741cabdff1aSopenharmony_ci if (!c->sample_buffer[2]) 742cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 743cabdff1aSopenharmony_ci 744cabdff1aSopenharmony_ci // Assemble frequency bands 0 and 1 745cabdff1aSopenharmony_ci ptr = c->sample_buffer[2]; 746cabdff1aSopenharmony_ci for (ch = 0; ch < c->nchannels; ch++) { 747cabdff1aSopenharmony_ci int32_t *band0 = c->bands[0].msb_sample_buffer[ch]; 748cabdff1aSopenharmony_ci int32_t *band1 = c->bands[1].msb_sample_buffer[ch]; 749cabdff1aSopenharmony_ci 750cabdff1aSopenharmony_ci // Copy decimator history 751cabdff1aSopenharmony_ci memcpy(band0 - DCA_XLL_DECI_HISTORY_MAX, 752cabdff1aSopenharmony_ci c->deci_history[ch], sizeof(c->deci_history[0])); 753cabdff1aSopenharmony_ci 754cabdff1aSopenharmony_ci // Filter 755cabdff1aSopenharmony_ci s->dcadsp->assemble_freq_bands(ptr, band0, band1, 756cabdff1aSopenharmony_ci ff_dca_xll_band_coeff, 757cabdff1aSopenharmony_ci nsamples); 758cabdff1aSopenharmony_ci 759cabdff1aSopenharmony_ci // Remap output channel pointer to assembly buffer 760cabdff1aSopenharmony_ci s->output_samples[c->ch_remap[ch]] = ptr; 761cabdff1aSopenharmony_ci ptr += nsamples * 2; 762cabdff1aSopenharmony_ci } 763cabdff1aSopenharmony_ci 764cabdff1aSopenharmony_ci return 0; 765cabdff1aSopenharmony_ci} 766cabdff1aSopenharmony_ci 767cabdff1aSopenharmony_cistatic int parse_common_header(DCAXllDecoder *s) 768cabdff1aSopenharmony_ci{ 769cabdff1aSopenharmony_ci int stream_ver, header_size, frame_size_nbits, nframesegs_log2; 770cabdff1aSopenharmony_ci 771cabdff1aSopenharmony_ci // XLL extension sync word 772cabdff1aSopenharmony_ci if (get_bits_long(&s->gb, 32) != DCA_SYNCWORD_XLL) { 773cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_VERBOSE, "Invalid XLL sync word\n"); 774cabdff1aSopenharmony_ci return AVERROR(EAGAIN); 775cabdff1aSopenharmony_ci } 776cabdff1aSopenharmony_ci 777cabdff1aSopenharmony_ci // Version number 778cabdff1aSopenharmony_ci stream_ver = get_bits(&s->gb, 4) + 1; 779cabdff1aSopenharmony_ci if (stream_ver > 1) { 780cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "XLL stream version %d", stream_ver); 781cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 782cabdff1aSopenharmony_ci } 783cabdff1aSopenharmony_ci 784cabdff1aSopenharmony_ci // Lossless frame header length 785cabdff1aSopenharmony_ci header_size = get_bits(&s->gb, 8) + 1; 786cabdff1aSopenharmony_ci 787cabdff1aSopenharmony_ci // Check CRC 788cabdff1aSopenharmony_ci if (ff_dca_check_crc(s->avctx, &s->gb, 32, header_size * 8)) { 789cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XLL common header checksum\n"); 790cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 791cabdff1aSopenharmony_ci } 792cabdff1aSopenharmony_ci 793cabdff1aSopenharmony_ci // Number of bits used to read frame size 794cabdff1aSopenharmony_ci frame_size_nbits = get_bits(&s->gb, 5) + 1; 795cabdff1aSopenharmony_ci 796cabdff1aSopenharmony_ci // Number of bytes in a lossless frame 797cabdff1aSopenharmony_ci s->frame_size = get_bits_long(&s->gb, frame_size_nbits); 798cabdff1aSopenharmony_ci if (s->frame_size < 0 || s->frame_size >= DCA_XLL_PBR_BUFFER_MAX) { 799cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XLL frame size (%d bytes)\n", s->frame_size); 800cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 801cabdff1aSopenharmony_ci } 802cabdff1aSopenharmony_ci s->frame_size++; 803cabdff1aSopenharmony_ci 804cabdff1aSopenharmony_ci // Number of channels sets per frame 805cabdff1aSopenharmony_ci s->nchsets = get_bits(&s->gb, 4) + 1; 806cabdff1aSopenharmony_ci if (s->nchsets > DCA_XLL_CHSETS_MAX) { 807cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "%d XLL channel sets", s->nchsets); 808cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 809cabdff1aSopenharmony_ci } 810cabdff1aSopenharmony_ci 811cabdff1aSopenharmony_ci // Number of segments per frame 812cabdff1aSopenharmony_ci nframesegs_log2 = get_bits(&s->gb, 4); 813cabdff1aSopenharmony_ci s->nframesegs = 1 << nframesegs_log2; 814cabdff1aSopenharmony_ci if (s->nframesegs > 1024) { 815cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Too many segments per XLL frame\n"); 816cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 817cabdff1aSopenharmony_ci } 818cabdff1aSopenharmony_ci 819cabdff1aSopenharmony_ci // Samples in segment per one frequency band for the first channel set 820cabdff1aSopenharmony_ci // Maximum value is 256 for sampling frequencies <= 48 kHz 821cabdff1aSopenharmony_ci // Maximum value is 512 for sampling frequencies > 48 kHz 822cabdff1aSopenharmony_ci s->nsegsamples_log2 = get_bits(&s->gb, 4); 823cabdff1aSopenharmony_ci if (!s->nsegsamples_log2) { 824cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Too few samples per XLL segment\n"); 825cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 826cabdff1aSopenharmony_ci } 827cabdff1aSopenharmony_ci s->nsegsamples = 1 << s->nsegsamples_log2; 828cabdff1aSopenharmony_ci if (s->nsegsamples > 512) { 829cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Too many samples per XLL segment\n"); 830cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 831cabdff1aSopenharmony_ci } 832cabdff1aSopenharmony_ci 833cabdff1aSopenharmony_ci // Samples in frame per one frequency band for the first channel set 834cabdff1aSopenharmony_ci s->nframesamples_log2 = s->nsegsamples_log2 + nframesegs_log2; 835cabdff1aSopenharmony_ci s->nframesamples = 1 << s->nframesamples_log2; 836cabdff1aSopenharmony_ci if (s->nframesamples > 65536) { 837cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Too many samples per XLL frame\n"); 838cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 839cabdff1aSopenharmony_ci } 840cabdff1aSopenharmony_ci 841cabdff1aSopenharmony_ci // Number of bits used to read segment size 842cabdff1aSopenharmony_ci s->seg_size_nbits = get_bits(&s->gb, 5) + 1; 843cabdff1aSopenharmony_ci 844cabdff1aSopenharmony_ci // Presence of CRC16 within each frequency band 845cabdff1aSopenharmony_ci // 0 - No CRC16 within band 846cabdff1aSopenharmony_ci // 1 - CRC16 placed at the end of MSB0 847cabdff1aSopenharmony_ci // 2 - CRC16 placed at the end of MSB0 and LSB0 848cabdff1aSopenharmony_ci // 3 - CRC16 placed at the end of MSB0 and LSB0 and other frequency bands 849cabdff1aSopenharmony_ci s->band_crc_present = get_bits(&s->gb, 2); 850cabdff1aSopenharmony_ci 851cabdff1aSopenharmony_ci // MSB/LSB split flag 852cabdff1aSopenharmony_ci s->scalable_lsbs = get_bits1(&s->gb); 853cabdff1aSopenharmony_ci 854cabdff1aSopenharmony_ci // Channel position mask 855cabdff1aSopenharmony_ci s->ch_mask_nbits = get_bits(&s->gb, 5) + 1; 856cabdff1aSopenharmony_ci 857cabdff1aSopenharmony_ci // Fixed LSB width 858cabdff1aSopenharmony_ci if (s->scalable_lsbs) 859cabdff1aSopenharmony_ci s->fixed_lsb_width = get_bits(&s->gb, 4); 860cabdff1aSopenharmony_ci else 861cabdff1aSopenharmony_ci s->fixed_lsb_width = 0; 862cabdff1aSopenharmony_ci 863cabdff1aSopenharmony_ci // Reserved 864cabdff1aSopenharmony_ci // Byte align 865cabdff1aSopenharmony_ci // Header CRC16 protection 866cabdff1aSopenharmony_ci if (ff_dca_seek_bits(&s->gb, header_size * 8)) { 867cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Read past end of XLL common header\n"); 868cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 869cabdff1aSopenharmony_ci } 870cabdff1aSopenharmony_ci 871cabdff1aSopenharmony_ci return 0; 872cabdff1aSopenharmony_ci} 873cabdff1aSopenharmony_ci 874cabdff1aSopenharmony_cistatic int is_hier_dmix_chset(DCAXllChSet *c) 875cabdff1aSopenharmony_ci{ 876cabdff1aSopenharmony_ci return !c->primary_chset && c->dmix_embedded && c->hier_chset; 877cabdff1aSopenharmony_ci} 878cabdff1aSopenharmony_ci 879cabdff1aSopenharmony_cistatic DCAXllChSet *find_next_hier_dmix_chset(DCAXllDecoder *s, DCAXllChSet *c) 880cabdff1aSopenharmony_ci{ 881cabdff1aSopenharmony_ci if (c->hier_chset) 882cabdff1aSopenharmony_ci while (++c < &s->chset[s->nchsets]) 883cabdff1aSopenharmony_ci if (is_hier_dmix_chset(c)) 884cabdff1aSopenharmony_ci return c; 885cabdff1aSopenharmony_ci 886cabdff1aSopenharmony_ci return NULL; 887cabdff1aSopenharmony_ci} 888cabdff1aSopenharmony_ci 889cabdff1aSopenharmony_cistatic void prescale_down_mix(DCAXllChSet *c, DCAXllChSet *o) 890cabdff1aSopenharmony_ci{ 891cabdff1aSopenharmony_ci int i, j, *coeff_ptr = c->dmix_coeff; 892cabdff1aSopenharmony_ci 893cabdff1aSopenharmony_ci for (i = 0; i < c->hier_ofs; i++) { 894cabdff1aSopenharmony_ci int scale = o->dmix_scale[i]; 895cabdff1aSopenharmony_ci int scale_inv = o->dmix_scale_inv[i]; 896cabdff1aSopenharmony_ci c->dmix_scale[i] = mul15(c->dmix_scale[i], scale); 897cabdff1aSopenharmony_ci c->dmix_scale_inv[i] = mul16(c->dmix_scale_inv[i], scale_inv); 898cabdff1aSopenharmony_ci for (j = 0; j < c->nchannels; j++) { 899cabdff1aSopenharmony_ci int coeff = mul16(*coeff_ptr, scale_inv); 900cabdff1aSopenharmony_ci *coeff_ptr++ = mul15(coeff, o->dmix_scale[c->hier_ofs + j]); 901cabdff1aSopenharmony_ci } 902cabdff1aSopenharmony_ci } 903cabdff1aSopenharmony_ci} 904cabdff1aSopenharmony_ci 905cabdff1aSopenharmony_cistatic int parse_sub_headers(DCAXllDecoder *s, DCAExssAsset *asset) 906cabdff1aSopenharmony_ci{ 907cabdff1aSopenharmony_ci DCAContext *dca = s->avctx->priv_data; 908cabdff1aSopenharmony_ci DCAXllChSet *c; 909cabdff1aSopenharmony_ci int i, ret; 910cabdff1aSopenharmony_ci 911cabdff1aSopenharmony_ci // Parse channel set headers 912cabdff1aSopenharmony_ci s->nfreqbands = 0; 913cabdff1aSopenharmony_ci s->nchannels = 0; 914cabdff1aSopenharmony_ci s->nreschsets = 0; 915cabdff1aSopenharmony_ci for (i = 0, c = s->chset; i < s->nchsets; i++, c++) { 916cabdff1aSopenharmony_ci c->hier_ofs = s->nchannels; 917cabdff1aSopenharmony_ci if ((ret = chs_parse_header(s, c, asset)) < 0) 918cabdff1aSopenharmony_ci return ret; 919cabdff1aSopenharmony_ci if (c->nfreqbands > s->nfreqbands) 920cabdff1aSopenharmony_ci s->nfreqbands = c->nfreqbands; 921cabdff1aSopenharmony_ci if (c->hier_chset) 922cabdff1aSopenharmony_ci s->nchannels += c->nchannels; 923cabdff1aSopenharmony_ci if (c->residual_encode != (1 << c->nchannels) - 1) 924cabdff1aSopenharmony_ci s->nreschsets++; 925cabdff1aSopenharmony_ci } 926cabdff1aSopenharmony_ci 927cabdff1aSopenharmony_ci // Pre-scale downmixing coefficients for all non-primary channel sets 928cabdff1aSopenharmony_ci for (i = s->nchsets - 1, c = &s->chset[i]; i > 0; i--, c--) { 929cabdff1aSopenharmony_ci if (is_hier_dmix_chset(c)) { 930cabdff1aSopenharmony_ci DCAXllChSet *o = find_next_hier_dmix_chset(s, c); 931cabdff1aSopenharmony_ci if (o) 932cabdff1aSopenharmony_ci prescale_down_mix(c, o); 933cabdff1aSopenharmony_ci } 934cabdff1aSopenharmony_ci } 935cabdff1aSopenharmony_ci 936cabdff1aSopenharmony_ci // Determine number of active channel sets to decode 937cabdff1aSopenharmony_ci switch (dca->request_channel_layout) { 938cabdff1aSopenharmony_ci case DCA_SPEAKER_LAYOUT_STEREO: 939cabdff1aSopenharmony_ci s->nactivechsets = 1; 940cabdff1aSopenharmony_ci break; 941cabdff1aSopenharmony_ci case DCA_SPEAKER_LAYOUT_5POINT0: 942cabdff1aSopenharmony_ci case DCA_SPEAKER_LAYOUT_5POINT1: 943cabdff1aSopenharmony_ci s->nactivechsets = (s->chset[0].nchannels < 5 && s->nchsets > 1) ? 2 : 1; 944cabdff1aSopenharmony_ci break; 945cabdff1aSopenharmony_ci default: 946cabdff1aSopenharmony_ci s->nactivechsets = s->nchsets; 947cabdff1aSopenharmony_ci break; 948cabdff1aSopenharmony_ci } 949cabdff1aSopenharmony_ci 950cabdff1aSopenharmony_ci return 0; 951cabdff1aSopenharmony_ci} 952cabdff1aSopenharmony_ci 953cabdff1aSopenharmony_cistatic int parse_navi_table(DCAXllDecoder *s) 954cabdff1aSopenharmony_ci{ 955cabdff1aSopenharmony_ci int chs, seg, band, navi_nb, navi_pos, *navi_ptr; 956cabdff1aSopenharmony_ci DCAXllChSet *c; 957cabdff1aSopenharmony_ci 958cabdff1aSopenharmony_ci // Determine size of NAVI table 959cabdff1aSopenharmony_ci navi_nb = s->nfreqbands * s->nframesegs * s->nchsets; 960cabdff1aSopenharmony_ci if (navi_nb > 1024) { 961cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Too many NAVI entries (%d)\n", navi_nb); 962cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 963cabdff1aSopenharmony_ci } 964cabdff1aSopenharmony_ci 965cabdff1aSopenharmony_ci // Reallocate NAVI table 966cabdff1aSopenharmony_ci av_fast_malloc(&s->navi, &s->navi_size, navi_nb * sizeof(*s->navi)); 967cabdff1aSopenharmony_ci if (!s->navi) 968cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 969cabdff1aSopenharmony_ci 970cabdff1aSopenharmony_ci // Parse NAVI 971cabdff1aSopenharmony_ci navi_pos = get_bits_count(&s->gb); 972cabdff1aSopenharmony_ci navi_ptr = s->navi; 973cabdff1aSopenharmony_ci for (band = 0; band < s->nfreqbands; band++) { 974cabdff1aSopenharmony_ci for (seg = 0; seg < s->nframesegs; seg++) { 975cabdff1aSopenharmony_ci for (chs = 0, c = s->chset; chs < s->nchsets; chs++, c++) { 976cabdff1aSopenharmony_ci int size = 0; 977cabdff1aSopenharmony_ci if (c->nfreqbands > band) { 978cabdff1aSopenharmony_ci size = get_bits_long(&s->gb, s->seg_size_nbits); 979cabdff1aSopenharmony_ci if (size < 0 || size >= s->frame_size) { 980cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid NAVI segment size (%d bytes)\n", size); 981cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 982cabdff1aSopenharmony_ci } 983cabdff1aSopenharmony_ci size++; 984cabdff1aSopenharmony_ci } 985cabdff1aSopenharmony_ci *navi_ptr++ = size; 986cabdff1aSopenharmony_ci } 987cabdff1aSopenharmony_ci } 988cabdff1aSopenharmony_ci } 989cabdff1aSopenharmony_ci 990cabdff1aSopenharmony_ci // Byte align 991cabdff1aSopenharmony_ci // CRC16 992cabdff1aSopenharmony_ci skip_bits(&s->gb, -get_bits_count(&s->gb) & 7); 993cabdff1aSopenharmony_ci skip_bits(&s->gb, 16); 994cabdff1aSopenharmony_ci 995cabdff1aSopenharmony_ci // Check CRC 996cabdff1aSopenharmony_ci if (ff_dca_check_crc(s->avctx, &s->gb, navi_pos, get_bits_count(&s->gb))) { 997cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid NAVI checksum\n"); 998cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 999cabdff1aSopenharmony_ci } 1000cabdff1aSopenharmony_ci 1001cabdff1aSopenharmony_ci return 0; 1002cabdff1aSopenharmony_ci} 1003cabdff1aSopenharmony_ci 1004cabdff1aSopenharmony_cistatic int parse_band_data(DCAXllDecoder *s) 1005cabdff1aSopenharmony_ci{ 1006cabdff1aSopenharmony_ci int ret, chs, seg, band, navi_pos, *navi_ptr; 1007cabdff1aSopenharmony_ci DCAXllChSet *c; 1008cabdff1aSopenharmony_ci 1009cabdff1aSopenharmony_ci for (chs = 0, c = s->chset; chs < s->nactivechsets; chs++, c++) { 1010cabdff1aSopenharmony_ci if ((ret = chs_alloc_msb_band_data(s, c)) < 0) 1011cabdff1aSopenharmony_ci return ret; 1012cabdff1aSopenharmony_ci if ((ret = chs_alloc_lsb_band_data(s, c)) < 0) 1013cabdff1aSopenharmony_ci return ret; 1014cabdff1aSopenharmony_ci } 1015cabdff1aSopenharmony_ci 1016cabdff1aSopenharmony_ci navi_pos = get_bits_count(&s->gb); 1017cabdff1aSopenharmony_ci navi_ptr = s->navi; 1018cabdff1aSopenharmony_ci for (band = 0; band < s->nfreqbands; band++) { 1019cabdff1aSopenharmony_ci for (seg = 0; seg < s->nframesegs; seg++) { 1020cabdff1aSopenharmony_ci for (chs = 0, c = s->chset; chs < s->nchsets; chs++, c++) { 1021cabdff1aSopenharmony_ci if (c->nfreqbands > band) { 1022cabdff1aSopenharmony_ci navi_pos += *navi_ptr * 8; 1023cabdff1aSopenharmony_ci if (navi_pos > s->gb.size_in_bits) { 1024cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid NAVI position\n"); 1025cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1026cabdff1aSopenharmony_ci } 1027cabdff1aSopenharmony_ci if (chs < s->nactivechsets && 1028cabdff1aSopenharmony_ci (ret = chs_parse_band_data(s, c, band, seg, navi_pos)) < 0) { 1029cabdff1aSopenharmony_ci if (s->avctx->err_recognition & AV_EF_EXPLODE) 1030cabdff1aSopenharmony_ci return ret; 1031cabdff1aSopenharmony_ci chs_clear_band_data(s, c, band, seg); 1032cabdff1aSopenharmony_ci } 1033cabdff1aSopenharmony_ci skip_bits_long(&s->gb, navi_pos - get_bits_count(&s->gb)); 1034cabdff1aSopenharmony_ci } 1035cabdff1aSopenharmony_ci navi_ptr++; 1036cabdff1aSopenharmony_ci } 1037cabdff1aSopenharmony_ci } 1038cabdff1aSopenharmony_ci } 1039cabdff1aSopenharmony_ci 1040cabdff1aSopenharmony_ci return 0; 1041cabdff1aSopenharmony_ci} 1042cabdff1aSopenharmony_ci 1043cabdff1aSopenharmony_cistatic int parse_frame(DCAXllDecoder *s, const uint8_t *data, int size, DCAExssAsset *asset) 1044cabdff1aSopenharmony_ci{ 1045cabdff1aSopenharmony_ci int ret; 1046cabdff1aSopenharmony_ci 1047cabdff1aSopenharmony_ci if ((ret = init_get_bits8(&s->gb, data, size)) < 0) 1048cabdff1aSopenharmony_ci return ret; 1049cabdff1aSopenharmony_ci if ((ret = parse_common_header(s)) < 0) 1050cabdff1aSopenharmony_ci return ret; 1051cabdff1aSopenharmony_ci if ((ret = parse_sub_headers(s, asset)) < 0) 1052cabdff1aSopenharmony_ci return ret; 1053cabdff1aSopenharmony_ci if ((ret = parse_navi_table(s)) < 0) 1054cabdff1aSopenharmony_ci return ret; 1055cabdff1aSopenharmony_ci if ((ret = parse_band_data(s)) < 0) 1056cabdff1aSopenharmony_ci return ret; 1057cabdff1aSopenharmony_ci if (ff_dca_seek_bits(&s->gb, s->frame_size * 8)) { 1058cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Read past end of XLL frame\n"); 1059cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1060cabdff1aSopenharmony_ci } 1061cabdff1aSopenharmony_ci return ret; 1062cabdff1aSopenharmony_ci} 1063cabdff1aSopenharmony_ci 1064cabdff1aSopenharmony_cistatic void clear_pbr(DCAXllDecoder *s) 1065cabdff1aSopenharmony_ci{ 1066cabdff1aSopenharmony_ci s->pbr_length = 0; 1067cabdff1aSopenharmony_ci s->pbr_delay = 0; 1068cabdff1aSopenharmony_ci} 1069cabdff1aSopenharmony_ci 1070cabdff1aSopenharmony_cistatic int copy_to_pbr(DCAXllDecoder *s, const uint8_t *data, int size, int delay) 1071cabdff1aSopenharmony_ci{ 1072cabdff1aSopenharmony_ci if (size > DCA_XLL_PBR_BUFFER_MAX) 1073cabdff1aSopenharmony_ci return AVERROR(ENOSPC); 1074cabdff1aSopenharmony_ci 1075cabdff1aSopenharmony_ci if (!s->pbr_buffer && !(s->pbr_buffer = av_malloc(DCA_XLL_PBR_BUFFER_MAX + AV_INPUT_BUFFER_PADDING_SIZE))) 1076cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 1077cabdff1aSopenharmony_ci 1078cabdff1aSopenharmony_ci memcpy(s->pbr_buffer, data, size); 1079cabdff1aSopenharmony_ci s->pbr_length = size; 1080cabdff1aSopenharmony_ci s->pbr_delay = delay; 1081cabdff1aSopenharmony_ci return 0; 1082cabdff1aSopenharmony_ci} 1083cabdff1aSopenharmony_ci 1084cabdff1aSopenharmony_cistatic int parse_frame_no_pbr(DCAXllDecoder *s, const uint8_t *data, int size, DCAExssAsset *asset) 1085cabdff1aSopenharmony_ci{ 1086cabdff1aSopenharmony_ci int ret = parse_frame(s, data, size, asset); 1087cabdff1aSopenharmony_ci 1088cabdff1aSopenharmony_ci // If XLL packet data didn't start with a sync word, we must have jumped 1089cabdff1aSopenharmony_ci // right into the middle of PBR smoothing period 1090cabdff1aSopenharmony_ci if (ret == AVERROR(EAGAIN) && asset->xll_sync_present && asset->xll_sync_offset < size) { 1091cabdff1aSopenharmony_ci // Skip to the next sync word in this packet 1092cabdff1aSopenharmony_ci data += asset->xll_sync_offset; 1093cabdff1aSopenharmony_ci size -= asset->xll_sync_offset; 1094cabdff1aSopenharmony_ci 1095cabdff1aSopenharmony_ci // If decoding delay is set, put the frame into PBR buffer and return 1096cabdff1aSopenharmony_ci // failure code. Higher level decoder is expected to switch to lossy 1097cabdff1aSopenharmony_ci // core decoding or mute its output until decoding delay expires. 1098cabdff1aSopenharmony_ci if (asset->xll_delay_nframes > 0) { 1099cabdff1aSopenharmony_ci if ((ret = copy_to_pbr(s, data, size, asset->xll_delay_nframes)) < 0) 1100cabdff1aSopenharmony_ci return ret; 1101cabdff1aSopenharmony_ci return AVERROR(EAGAIN); 1102cabdff1aSopenharmony_ci } 1103cabdff1aSopenharmony_ci 1104cabdff1aSopenharmony_ci // No decoding delay, just parse the frame in place 1105cabdff1aSopenharmony_ci ret = parse_frame(s, data, size, asset); 1106cabdff1aSopenharmony_ci } 1107cabdff1aSopenharmony_ci 1108cabdff1aSopenharmony_ci if (ret < 0) 1109cabdff1aSopenharmony_ci return ret; 1110cabdff1aSopenharmony_ci 1111cabdff1aSopenharmony_ci if (s->frame_size > size) 1112cabdff1aSopenharmony_ci return AVERROR(EINVAL); 1113cabdff1aSopenharmony_ci 1114cabdff1aSopenharmony_ci // If the XLL decoder didn't consume full packet, start PBR smoothing period 1115cabdff1aSopenharmony_ci if (s->frame_size < size) 1116cabdff1aSopenharmony_ci if ((ret = copy_to_pbr(s, data + s->frame_size, size - s->frame_size, 0)) < 0) 1117cabdff1aSopenharmony_ci return ret; 1118cabdff1aSopenharmony_ci 1119cabdff1aSopenharmony_ci return 0; 1120cabdff1aSopenharmony_ci} 1121cabdff1aSopenharmony_ci 1122cabdff1aSopenharmony_cistatic int parse_frame_pbr(DCAXllDecoder *s, const uint8_t *data, int size, DCAExssAsset *asset) 1123cabdff1aSopenharmony_ci{ 1124cabdff1aSopenharmony_ci int ret; 1125cabdff1aSopenharmony_ci 1126cabdff1aSopenharmony_ci if (size > DCA_XLL_PBR_BUFFER_MAX - s->pbr_length) { 1127cabdff1aSopenharmony_ci ret = AVERROR(ENOSPC); 1128cabdff1aSopenharmony_ci goto fail; 1129cabdff1aSopenharmony_ci } 1130cabdff1aSopenharmony_ci 1131cabdff1aSopenharmony_ci memcpy(s->pbr_buffer + s->pbr_length, data, size); 1132cabdff1aSopenharmony_ci s->pbr_length += size; 1133cabdff1aSopenharmony_ci 1134cabdff1aSopenharmony_ci // Respect decoding delay after synchronization error 1135cabdff1aSopenharmony_ci if (s->pbr_delay > 0 && --s->pbr_delay) 1136cabdff1aSopenharmony_ci return AVERROR(EAGAIN); 1137cabdff1aSopenharmony_ci 1138cabdff1aSopenharmony_ci if ((ret = parse_frame(s, s->pbr_buffer, s->pbr_length, asset)) < 0) 1139cabdff1aSopenharmony_ci goto fail; 1140cabdff1aSopenharmony_ci 1141cabdff1aSopenharmony_ci if (s->frame_size > s->pbr_length) { 1142cabdff1aSopenharmony_ci ret = AVERROR(EINVAL); 1143cabdff1aSopenharmony_ci goto fail; 1144cabdff1aSopenharmony_ci } 1145cabdff1aSopenharmony_ci 1146cabdff1aSopenharmony_ci if (s->frame_size == s->pbr_length) { 1147cabdff1aSopenharmony_ci // End of PBR smoothing period 1148cabdff1aSopenharmony_ci clear_pbr(s); 1149cabdff1aSopenharmony_ci } else { 1150cabdff1aSopenharmony_ci s->pbr_length -= s->frame_size; 1151cabdff1aSopenharmony_ci memmove(s->pbr_buffer, s->pbr_buffer + s->frame_size, s->pbr_length); 1152cabdff1aSopenharmony_ci } 1153cabdff1aSopenharmony_ci 1154cabdff1aSopenharmony_ci return 0; 1155cabdff1aSopenharmony_ci 1156cabdff1aSopenharmony_cifail: 1157cabdff1aSopenharmony_ci // For now, throw out all PBR state on failure. 1158cabdff1aSopenharmony_ci // Perhaps we can be smarter and try to resync somehow. 1159cabdff1aSopenharmony_ci clear_pbr(s); 1160cabdff1aSopenharmony_ci return ret; 1161cabdff1aSopenharmony_ci} 1162cabdff1aSopenharmony_ci 1163cabdff1aSopenharmony_ciint ff_dca_xll_parse(DCAXllDecoder *s, const uint8_t *data, DCAExssAsset *asset) 1164cabdff1aSopenharmony_ci{ 1165cabdff1aSopenharmony_ci int ret; 1166cabdff1aSopenharmony_ci 1167cabdff1aSopenharmony_ci if (s->hd_stream_id != asset->hd_stream_id) { 1168cabdff1aSopenharmony_ci clear_pbr(s); 1169cabdff1aSopenharmony_ci s->hd_stream_id = asset->hd_stream_id; 1170cabdff1aSopenharmony_ci } 1171cabdff1aSopenharmony_ci 1172cabdff1aSopenharmony_ci if (s->pbr_length) 1173cabdff1aSopenharmony_ci ret = parse_frame_pbr(s, data + asset->xll_offset, asset->xll_size, asset); 1174cabdff1aSopenharmony_ci else 1175cabdff1aSopenharmony_ci ret = parse_frame_no_pbr(s, data + asset->xll_offset, asset->xll_size, asset); 1176cabdff1aSopenharmony_ci 1177cabdff1aSopenharmony_ci return ret; 1178cabdff1aSopenharmony_ci} 1179cabdff1aSopenharmony_ci 1180cabdff1aSopenharmony_cistatic void undo_down_mix(DCAXllDecoder *s, DCAXllChSet *o, int band) 1181cabdff1aSopenharmony_ci{ 1182cabdff1aSopenharmony_ci int i, j, k, nchannels = 0, *coeff_ptr = o->dmix_coeff; 1183cabdff1aSopenharmony_ci DCAXllChSet *c; 1184cabdff1aSopenharmony_ci 1185cabdff1aSopenharmony_ci for (i = 0, c = s->chset; i < s->nactivechsets; i++, c++) { 1186cabdff1aSopenharmony_ci if (!c->hier_chset) 1187cabdff1aSopenharmony_ci continue; 1188cabdff1aSopenharmony_ci 1189cabdff1aSopenharmony_ci av_assert1(band < c->nfreqbands); 1190cabdff1aSopenharmony_ci for (j = 0; j < c->nchannels; j++) { 1191cabdff1aSopenharmony_ci for (k = 0; k < o->nchannels; k++) { 1192cabdff1aSopenharmony_ci int coeff = *coeff_ptr++; 1193cabdff1aSopenharmony_ci if (coeff) { 1194cabdff1aSopenharmony_ci s->dcadsp->dmix_sub(c->bands[band].msb_sample_buffer[j], 1195cabdff1aSopenharmony_ci o->bands[band].msb_sample_buffer[k], 1196cabdff1aSopenharmony_ci coeff, s->nframesamples); 1197cabdff1aSopenharmony_ci if (band) 1198cabdff1aSopenharmony_ci s->dcadsp->dmix_sub(c->deci_history[j], 1199cabdff1aSopenharmony_ci o->deci_history[k], 1200cabdff1aSopenharmony_ci coeff, DCA_XLL_DECI_HISTORY_MAX); 1201cabdff1aSopenharmony_ci } 1202cabdff1aSopenharmony_ci } 1203cabdff1aSopenharmony_ci } 1204cabdff1aSopenharmony_ci 1205cabdff1aSopenharmony_ci nchannels += c->nchannels; 1206cabdff1aSopenharmony_ci if (nchannels >= o->hier_ofs) 1207cabdff1aSopenharmony_ci break; 1208cabdff1aSopenharmony_ci } 1209cabdff1aSopenharmony_ci} 1210cabdff1aSopenharmony_ci 1211cabdff1aSopenharmony_cistatic void scale_down_mix(DCAXllDecoder *s, DCAXllChSet *o, int band) 1212cabdff1aSopenharmony_ci{ 1213cabdff1aSopenharmony_ci int i, j, nchannels = 0; 1214cabdff1aSopenharmony_ci DCAXllChSet *c; 1215cabdff1aSopenharmony_ci 1216cabdff1aSopenharmony_ci for (i = 0, c = s->chset; i < s->nactivechsets; i++, c++) { 1217cabdff1aSopenharmony_ci if (!c->hier_chset) 1218cabdff1aSopenharmony_ci continue; 1219cabdff1aSopenharmony_ci 1220cabdff1aSopenharmony_ci av_assert1(band < c->nfreqbands); 1221cabdff1aSopenharmony_ci for (j = 0; j < c->nchannels; j++) { 1222cabdff1aSopenharmony_ci int scale = o->dmix_scale[nchannels++]; 1223cabdff1aSopenharmony_ci if (scale != (1 << 15)) { 1224cabdff1aSopenharmony_ci s->dcadsp->dmix_scale(c->bands[band].msb_sample_buffer[j], 1225cabdff1aSopenharmony_ci scale, s->nframesamples); 1226cabdff1aSopenharmony_ci if (band) 1227cabdff1aSopenharmony_ci s->dcadsp->dmix_scale(c->deci_history[j], 1228cabdff1aSopenharmony_ci scale, DCA_XLL_DECI_HISTORY_MAX); 1229cabdff1aSopenharmony_ci } 1230cabdff1aSopenharmony_ci } 1231cabdff1aSopenharmony_ci 1232cabdff1aSopenharmony_ci if (nchannels >= o->hier_ofs) 1233cabdff1aSopenharmony_ci break; 1234cabdff1aSopenharmony_ci } 1235cabdff1aSopenharmony_ci} 1236cabdff1aSopenharmony_ci 1237cabdff1aSopenharmony_ci// Clear all band data and replace non-residual encoded channels with lossy 1238cabdff1aSopenharmony_ci// counterparts 1239cabdff1aSopenharmony_cistatic av_cold void force_lossy_output(DCAXllDecoder *s, DCAXllChSet *c) 1240cabdff1aSopenharmony_ci{ 1241cabdff1aSopenharmony_ci DCAContext *dca = s->avctx->priv_data; 1242cabdff1aSopenharmony_ci int band, ch; 1243cabdff1aSopenharmony_ci 1244cabdff1aSopenharmony_ci for (band = 0; band < c->nfreqbands; band++) 1245cabdff1aSopenharmony_ci chs_clear_band_data(s, c, band, -1); 1246cabdff1aSopenharmony_ci 1247cabdff1aSopenharmony_ci for (ch = 0; ch < c->nchannels; ch++) { 1248cabdff1aSopenharmony_ci if (!(c->residual_encode & (1 << ch))) 1249cabdff1aSopenharmony_ci continue; 1250cabdff1aSopenharmony_ci if (ff_dca_core_map_spkr(&dca->core, c->ch_remap[ch]) < 0) 1251cabdff1aSopenharmony_ci continue; 1252cabdff1aSopenharmony_ci c->residual_encode &= ~(1 << ch); 1253cabdff1aSopenharmony_ci } 1254cabdff1aSopenharmony_ci} 1255cabdff1aSopenharmony_ci 1256cabdff1aSopenharmony_cistatic int combine_residual_frame(DCAXllDecoder *s, DCAXllChSet *c) 1257cabdff1aSopenharmony_ci{ 1258cabdff1aSopenharmony_ci DCAContext *dca = s->avctx->priv_data; 1259cabdff1aSopenharmony_ci int ch, nsamples = s->nframesamples; 1260cabdff1aSopenharmony_ci DCAXllChSet *o; 1261cabdff1aSopenharmony_ci 1262cabdff1aSopenharmony_ci // Verify that core is compatible 1263cabdff1aSopenharmony_ci if (!(dca->packet & DCA_PACKET_CORE)) { 1264cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Residual encoded channels are present without core\n"); 1265cabdff1aSopenharmony_ci return AVERROR(EINVAL); 1266cabdff1aSopenharmony_ci } 1267cabdff1aSopenharmony_ci 1268cabdff1aSopenharmony_ci if (c->freq != dca->core.output_rate) { 1269cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_WARNING, "Sample rate mismatch between core (%d Hz) and XLL (%d Hz)\n", dca->core.output_rate, c->freq); 1270cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1271cabdff1aSopenharmony_ci } 1272cabdff1aSopenharmony_ci 1273cabdff1aSopenharmony_ci if (nsamples != dca->core.npcmsamples) { 1274cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_WARNING, "Number of samples per frame mismatch between core (%d) and XLL (%d)\n", dca->core.npcmsamples, nsamples); 1275cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1276cabdff1aSopenharmony_ci } 1277cabdff1aSopenharmony_ci 1278cabdff1aSopenharmony_ci // See if this channel set is downmixed and find the next channel set in 1279cabdff1aSopenharmony_ci // hierarchy. If downmixed, undo core pre-scaling before combining with 1280cabdff1aSopenharmony_ci // residual (residual is not scaled). 1281cabdff1aSopenharmony_ci o = find_next_hier_dmix_chset(s, c); 1282cabdff1aSopenharmony_ci 1283cabdff1aSopenharmony_ci // Reduce core bit width and combine with residual 1284cabdff1aSopenharmony_ci for (ch = 0; ch < c->nchannels; ch++) { 1285cabdff1aSopenharmony_ci int n, spkr, shift, round; 1286cabdff1aSopenharmony_ci int32_t *src, *dst; 1287cabdff1aSopenharmony_ci 1288cabdff1aSopenharmony_ci if (c->residual_encode & (1 << ch)) 1289cabdff1aSopenharmony_ci continue; 1290cabdff1aSopenharmony_ci 1291cabdff1aSopenharmony_ci // Map this channel to core speaker 1292cabdff1aSopenharmony_ci spkr = ff_dca_core_map_spkr(&dca->core, c->ch_remap[ch]); 1293cabdff1aSopenharmony_ci if (spkr < 0) { 1294cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_WARNING, "Residual encoded channel (%d) references unavailable core channel\n", c->ch_remap[ch]); 1295cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1296cabdff1aSopenharmony_ci } 1297cabdff1aSopenharmony_ci 1298cabdff1aSopenharmony_ci // Account for LSB width 1299cabdff1aSopenharmony_ci shift = 24 - c->pcm_bit_res + chs_get_lsb_width(s, c, 0, ch); 1300cabdff1aSopenharmony_ci if (shift > 24) { 1301cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_WARNING, "Invalid core shift (%d bits)\n", shift); 1302cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1303cabdff1aSopenharmony_ci } 1304cabdff1aSopenharmony_ci 1305cabdff1aSopenharmony_ci round = shift > 0 ? 1 << (shift - 1) : 0; 1306cabdff1aSopenharmony_ci 1307cabdff1aSopenharmony_ci src = dca->core.output_samples[spkr]; 1308cabdff1aSopenharmony_ci dst = c->bands[0].msb_sample_buffer[ch]; 1309cabdff1aSopenharmony_ci if (o) { 1310cabdff1aSopenharmony_ci // Undo embedded core downmix pre-scaling 1311cabdff1aSopenharmony_ci int scale_inv = o->dmix_scale_inv[c->hier_ofs + ch]; 1312cabdff1aSopenharmony_ci for (n = 0; n < nsamples; n++) 1313cabdff1aSopenharmony_ci dst[n] += (SUINT)clip23((mul16(src[n], scale_inv) + round) >> shift); 1314cabdff1aSopenharmony_ci } else { 1315cabdff1aSopenharmony_ci // No downmix scaling 1316cabdff1aSopenharmony_ci for (n = 0; n < nsamples; n++) 1317cabdff1aSopenharmony_ci dst[n] += (unsigned)((src[n] + round) >> shift); 1318cabdff1aSopenharmony_ci } 1319cabdff1aSopenharmony_ci } 1320cabdff1aSopenharmony_ci 1321cabdff1aSopenharmony_ci return 0; 1322cabdff1aSopenharmony_ci} 1323cabdff1aSopenharmony_ci 1324cabdff1aSopenharmony_ciint ff_dca_xll_filter_frame(DCAXllDecoder *s, AVFrame *frame) 1325cabdff1aSopenharmony_ci{ 1326cabdff1aSopenharmony_ci AVCodecContext *avctx = s->avctx; 1327cabdff1aSopenharmony_ci DCAContext *dca = avctx->priv_data; 1328cabdff1aSopenharmony_ci DCAExssAsset *asset = &dca->exss.assets[0]; 1329cabdff1aSopenharmony_ci DCAXllChSet *p = &s->chset[0], *c; 1330cabdff1aSopenharmony_ci enum AVMatrixEncoding matrix_encoding = AV_MATRIX_ENCODING_NONE; 1331cabdff1aSopenharmony_ci int i, j, k, ret, shift, nsamples, request_mask; 1332cabdff1aSopenharmony_ci int ch_remap[DCA_SPEAKER_COUNT]; 1333cabdff1aSopenharmony_ci 1334cabdff1aSopenharmony_ci // Force lossy downmixed output during recovery 1335cabdff1aSopenharmony_ci if (dca->packet & DCA_PACKET_RECOVERY) { 1336cabdff1aSopenharmony_ci for (i = 0, c = s->chset; i < s->nchsets; i++, c++) { 1337cabdff1aSopenharmony_ci if (i < s->nactivechsets) 1338cabdff1aSopenharmony_ci force_lossy_output(s, c); 1339cabdff1aSopenharmony_ci 1340cabdff1aSopenharmony_ci if (!c->primary_chset) 1341cabdff1aSopenharmony_ci c->dmix_embedded = 0; 1342cabdff1aSopenharmony_ci } 1343cabdff1aSopenharmony_ci 1344cabdff1aSopenharmony_ci s->scalable_lsbs = 0; 1345cabdff1aSopenharmony_ci s->fixed_lsb_width = 0; 1346cabdff1aSopenharmony_ci } 1347cabdff1aSopenharmony_ci 1348cabdff1aSopenharmony_ci // Filter frequency bands for active channel sets 1349cabdff1aSopenharmony_ci s->output_mask = 0; 1350cabdff1aSopenharmony_ci for (i = 0, c = s->chset; i < s->nactivechsets; i++, c++) { 1351cabdff1aSopenharmony_ci chs_filter_band_data(s, c, 0); 1352cabdff1aSopenharmony_ci 1353cabdff1aSopenharmony_ci if (c->residual_encode != (1 << c->nchannels) - 1 1354cabdff1aSopenharmony_ci && (ret = combine_residual_frame(s, c)) < 0) 1355cabdff1aSopenharmony_ci return ret; 1356cabdff1aSopenharmony_ci 1357cabdff1aSopenharmony_ci if (s->scalable_lsbs) 1358cabdff1aSopenharmony_ci chs_assemble_msbs_lsbs(s, c, 0); 1359cabdff1aSopenharmony_ci 1360cabdff1aSopenharmony_ci if (c->nfreqbands > 1) { 1361cabdff1aSopenharmony_ci chs_filter_band_data(s, c, 1); 1362cabdff1aSopenharmony_ci chs_assemble_msbs_lsbs(s, c, 1); 1363cabdff1aSopenharmony_ci } 1364cabdff1aSopenharmony_ci 1365cabdff1aSopenharmony_ci s->output_mask |= c->ch_mask; 1366cabdff1aSopenharmony_ci } 1367cabdff1aSopenharmony_ci 1368cabdff1aSopenharmony_ci // Undo hierarchial downmix and/or apply scaling 1369cabdff1aSopenharmony_ci for (i = 1, c = &s->chset[1]; i < s->nchsets; i++, c++) { 1370cabdff1aSopenharmony_ci if (!is_hier_dmix_chset(c)) 1371cabdff1aSopenharmony_ci continue; 1372cabdff1aSopenharmony_ci 1373cabdff1aSopenharmony_ci if (i >= s->nactivechsets) { 1374cabdff1aSopenharmony_ci for (j = 0; j < c->nfreqbands; j++) 1375cabdff1aSopenharmony_ci if (c->bands[j].dmix_embedded) 1376cabdff1aSopenharmony_ci scale_down_mix(s, c, j); 1377cabdff1aSopenharmony_ci break; 1378cabdff1aSopenharmony_ci } 1379cabdff1aSopenharmony_ci 1380cabdff1aSopenharmony_ci for (j = 0; j < c->nfreqbands; j++) 1381cabdff1aSopenharmony_ci if (c->bands[j].dmix_embedded) 1382cabdff1aSopenharmony_ci undo_down_mix(s, c, j); 1383cabdff1aSopenharmony_ci } 1384cabdff1aSopenharmony_ci 1385cabdff1aSopenharmony_ci // Assemble frequency bands for active channel sets 1386cabdff1aSopenharmony_ci if (s->nfreqbands > 1) { 1387cabdff1aSopenharmony_ci for (i = 0; i < s->nactivechsets; i++) 1388cabdff1aSopenharmony_ci if ((ret = chs_assemble_freq_bands(s, &s->chset[i])) < 0) 1389cabdff1aSopenharmony_ci return ret; 1390cabdff1aSopenharmony_ci } 1391cabdff1aSopenharmony_ci 1392cabdff1aSopenharmony_ci // Normalize to regular 5.1 layout if downmixing 1393cabdff1aSopenharmony_ci if (dca->request_channel_layout) { 1394cabdff1aSopenharmony_ci if (s->output_mask & DCA_SPEAKER_MASK_Lss) { 1395cabdff1aSopenharmony_ci s->output_samples[DCA_SPEAKER_Ls] = s->output_samples[DCA_SPEAKER_Lss]; 1396cabdff1aSopenharmony_ci s->output_mask = (s->output_mask & ~DCA_SPEAKER_MASK_Lss) | DCA_SPEAKER_MASK_Ls; 1397cabdff1aSopenharmony_ci } 1398cabdff1aSopenharmony_ci if (s->output_mask & DCA_SPEAKER_MASK_Rss) { 1399cabdff1aSopenharmony_ci s->output_samples[DCA_SPEAKER_Rs] = s->output_samples[DCA_SPEAKER_Rss]; 1400cabdff1aSopenharmony_ci s->output_mask = (s->output_mask & ~DCA_SPEAKER_MASK_Rss) | DCA_SPEAKER_MASK_Rs; 1401cabdff1aSopenharmony_ci } 1402cabdff1aSopenharmony_ci } 1403cabdff1aSopenharmony_ci 1404cabdff1aSopenharmony_ci // Handle downmixing to stereo request 1405cabdff1aSopenharmony_ci if (dca->request_channel_layout == DCA_SPEAKER_LAYOUT_STEREO 1406cabdff1aSopenharmony_ci && DCA_HAS_STEREO(s->output_mask) && p->dmix_embedded 1407cabdff1aSopenharmony_ci && (p->dmix_type == DCA_DMIX_TYPE_LoRo || 1408cabdff1aSopenharmony_ci p->dmix_type == DCA_DMIX_TYPE_LtRt)) 1409cabdff1aSopenharmony_ci request_mask = DCA_SPEAKER_LAYOUT_STEREO; 1410cabdff1aSopenharmony_ci else 1411cabdff1aSopenharmony_ci request_mask = s->output_mask; 1412cabdff1aSopenharmony_ci if (!ff_dca_set_channel_layout(avctx, ch_remap, request_mask)) 1413cabdff1aSopenharmony_ci return AVERROR(EINVAL); 1414cabdff1aSopenharmony_ci 1415cabdff1aSopenharmony_ci avctx->sample_rate = p->freq << (s->nfreqbands - 1); 1416cabdff1aSopenharmony_ci 1417cabdff1aSopenharmony_ci switch (p->storage_bit_res) { 1418cabdff1aSopenharmony_ci case 16: 1419cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_S16P; 1420cabdff1aSopenharmony_ci shift = 16 - p->pcm_bit_res; 1421cabdff1aSopenharmony_ci break; 1422cabdff1aSopenharmony_ci case 20: 1423cabdff1aSopenharmony_ci case 24: 1424cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_S32P; 1425cabdff1aSopenharmony_ci shift = 24 - p->pcm_bit_res; 1426cabdff1aSopenharmony_ci break; 1427cabdff1aSopenharmony_ci default: 1428cabdff1aSopenharmony_ci return AVERROR(EINVAL); 1429cabdff1aSopenharmony_ci } 1430cabdff1aSopenharmony_ci 1431cabdff1aSopenharmony_ci avctx->bits_per_raw_sample = p->storage_bit_res; 1432cabdff1aSopenharmony_ci avctx->profile = FF_PROFILE_DTS_HD_MA; 1433cabdff1aSopenharmony_ci avctx->bit_rate = 0; 1434cabdff1aSopenharmony_ci 1435cabdff1aSopenharmony_ci frame->nb_samples = nsamples = s->nframesamples << (s->nfreqbands - 1); 1436cabdff1aSopenharmony_ci if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) 1437cabdff1aSopenharmony_ci return ret; 1438cabdff1aSopenharmony_ci 1439cabdff1aSopenharmony_ci // Downmix primary channel set to stereo 1440cabdff1aSopenharmony_ci if (request_mask != s->output_mask) { 1441cabdff1aSopenharmony_ci ff_dca_downmix_to_stereo_fixed(s->dcadsp, s->output_samples, 1442cabdff1aSopenharmony_ci p->dmix_coeff, nsamples, 1443cabdff1aSopenharmony_ci s->output_mask); 1444cabdff1aSopenharmony_ci } 1445cabdff1aSopenharmony_ci 1446cabdff1aSopenharmony_ci for (i = 0; i < avctx->ch_layout.nb_channels; i++) { 1447cabdff1aSopenharmony_ci int32_t *samples = s->output_samples[ch_remap[i]]; 1448cabdff1aSopenharmony_ci if (frame->format == AV_SAMPLE_FMT_S16P) { 1449cabdff1aSopenharmony_ci int16_t *plane = (int16_t *)frame->extended_data[i]; 1450cabdff1aSopenharmony_ci for (k = 0; k < nsamples; k++) 1451cabdff1aSopenharmony_ci plane[k] = av_clip_int16(samples[k] * (SUINT)(1 << shift)); 1452cabdff1aSopenharmony_ci } else { 1453cabdff1aSopenharmony_ci int32_t *plane = (int32_t *)frame->extended_data[i]; 1454cabdff1aSopenharmony_ci for (k = 0; k < nsamples; k++) 1455cabdff1aSopenharmony_ci plane[k] = clip23(samples[k] * (SUINT)(1 << shift)) * (1 << 8); 1456cabdff1aSopenharmony_ci } 1457cabdff1aSopenharmony_ci } 1458cabdff1aSopenharmony_ci 1459cabdff1aSopenharmony_ci if (!asset->one_to_one_map_ch_to_spkr) { 1460cabdff1aSopenharmony_ci if (asset->representation_type == DCA_REPR_TYPE_LtRt) 1461cabdff1aSopenharmony_ci matrix_encoding = AV_MATRIX_ENCODING_DOLBY; 1462cabdff1aSopenharmony_ci else if (asset->representation_type == DCA_REPR_TYPE_LhRh) 1463cabdff1aSopenharmony_ci matrix_encoding = AV_MATRIX_ENCODING_DOLBYHEADPHONE; 1464cabdff1aSopenharmony_ci } else if (request_mask != s->output_mask && p->dmix_type == DCA_DMIX_TYPE_LtRt) { 1465cabdff1aSopenharmony_ci matrix_encoding = AV_MATRIX_ENCODING_DOLBY; 1466cabdff1aSopenharmony_ci } 1467cabdff1aSopenharmony_ci if ((ret = ff_side_data_update_matrix_encoding(frame, matrix_encoding)) < 0) 1468cabdff1aSopenharmony_ci return ret; 1469cabdff1aSopenharmony_ci 1470cabdff1aSopenharmony_ci return 0; 1471cabdff1aSopenharmony_ci} 1472cabdff1aSopenharmony_ci 1473cabdff1aSopenharmony_ciav_cold void ff_dca_xll_flush(DCAXllDecoder *s) 1474cabdff1aSopenharmony_ci{ 1475cabdff1aSopenharmony_ci clear_pbr(s); 1476cabdff1aSopenharmony_ci} 1477cabdff1aSopenharmony_ci 1478cabdff1aSopenharmony_ciav_cold void ff_dca_xll_close(DCAXllDecoder *s) 1479cabdff1aSopenharmony_ci{ 1480cabdff1aSopenharmony_ci DCAXllChSet *c; 1481cabdff1aSopenharmony_ci int i, j; 1482cabdff1aSopenharmony_ci 1483cabdff1aSopenharmony_ci for (i = 0, c = s->chset; i < DCA_XLL_CHSETS_MAX; i++, c++) { 1484cabdff1aSopenharmony_ci for (j = 0; j < DCA_XLL_SAMPLE_BUFFERS_MAX; j++) { 1485cabdff1aSopenharmony_ci av_freep(&c->sample_buffer[j]); 1486cabdff1aSopenharmony_ci c->sample_size[j] = 0; 1487cabdff1aSopenharmony_ci } 1488cabdff1aSopenharmony_ci } 1489cabdff1aSopenharmony_ci 1490cabdff1aSopenharmony_ci av_freep(&s->navi); 1491cabdff1aSopenharmony_ci s->navi_size = 0; 1492cabdff1aSopenharmony_ci 1493cabdff1aSopenharmony_ci av_freep(&s->pbr_buffer); 1494cabdff1aSopenharmony_ci clear_pbr(s); 1495cabdff1aSopenharmony_ci} 1496