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 "dcaadpcm.h" 23cabdff1aSopenharmony_ci#include "dcadec.h" 24cabdff1aSopenharmony_ci#include "dcadata.h" 25cabdff1aSopenharmony_ci#include "dcahuff.h" 26cabdff1aSopenharmony_ci#include "dcamath.h" 27cabdff1aSopenharmony_ci#include "dca_syncwords.h" 28cabdff1aSopenharmony_ci#include "internal.h" 29cabdff1aSopenharmony_ci 30cabdff1aSopenharmony_ci#if ARCH_ARM 31cabdff1aSopenharmony_ci#include "arm/dca.h" 32cabdff1aSopenharmony_ci#endif 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_cienum HeaderType { 35cabdff1aSopenharmony_ci HEADER_CORE, 36cabdff1aSopenharmony_ci HEADER_XCH, 37cabdff1aSopenharmony_ci HEADER_XXCH 38cabdff1aSopenharmony_ci}; 39cabdff1aSopenharmony_ci 40cabdff1aSopenharmony_cistatic const int8_t prm_ch_to_spkr_map[DCA_AMODE_COUNT][5] = { 41cabdff1aSopenharmony_ci { DCA_SPEAKER_C, -1, -1, -1, -1 }, 42cabdff1aSopenharmony_ci { DCA_SPEAKER_L, DCA_SPEAKER_R, -1, -1, -1 }, 43cabdff1aSopenharmony_ci { DCA_SPEAKER_L, DCA_SPEAKER_R, -1, -1, -1 }, 44cabdff1aSopenharmony_ci { DCA_SPEAKER_L, DCA_SPEAKER_R, -1, -1, -1 }, 45cabdff1aSopenharmony_ci { DCA_SPEAKER_L, DCA_SPEAKER_R, -1, -1, -1 }, 46cabdff1aSopenharmony_ci { DCA_SPEAKER_C, DCA_SPEAKER_L, DCA_SPEAKER_R , -1, -1 }, 47cabdff1aSopenharmony_ci { DCA_SPEAKER_L, DCA_SPEAKER_R, DCA_SPEAKER_Cs, -1, -1 }, 48cabdff1aSopenharmony_ci { DCA_SPEAKER_C, DCA_SPEAKER_L, DCA_SPEAKER_R , DCA_SPEAKER_Cs, -1 }, 49cabdff1aSopenharmony_ci { DCA_SPEAKER_L, DCA_SPEAKER_R, DCA_SPEAKER_Ls, DCA_SPEAKER_Rs, -1 }, 50cabdff1aSopenharmony_ci { DCA_SPEAKER_C, DCA_SPEAKER_L, DCA_SPEAKER_R, DCA_SPEAKER_Ls, DCA_SPEAKER_Rs } 51cabdff1aSopenharmony_ci}; 52cabdff1aSopenharmony_ci 53cabdff1aSopenharmony_cistatic const uint8_t audio_mode_ch_mask[DCA_AMODE_COUNT] = { 54cabdff1aSopenharmony_ci DCA_SPEAKER_LAYOUT_MONO, 55cabdff1aSopenharmony_ci DCA_SPEAKER_LAYOUT_STEREO, 56cabdff1aSopenharmony_ci DCA_SPEAKER_LAYOUT_STEREO, 57cabdff1aSopenharmony_ci DCA_SPEAKER_LAYOUT_STEREO, 58cabdff1aSopenharmony_ci DCA_SPEAKER_LAYOUT_STEREO, 59cabdff1aSopenharmony_ci DCA_SPEAKER_LAYOUT_3_0, 60cabdff1aSopenharmony_ci DCA_SPEAKER_LAYOUT_2_1, 61cabdff1aSopenharmony_ci DCA_SPEAKER_LAYOUT_3_1, 62cabdff1aSopenharmony_ci DCA_SPEAKER_LAYOUT_2_2, 63cabdff1aSopenharmony_ci DCA_SPEAKER_LAYOUT_5POINT0 64cabdff1aSopenharmony_ci}; 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_cistatic const uint8_t block_code_nbits[7] = { 67cabdff1aSopenharmony_ci 7, 10, 12, 13, 15, 17, 19 68cabdff1aSopenharmony_ci}; 69cabdff1aSopenharmony_ci 70cabdff1aSopenharmony_cistatic int dca_get_vlc(GetBitContext *s, DCAVLC *v, int i) 71cabdff1aSopenharmony_ci{ 72cabdff1aSopenharmony_ci return get_vlc2(s, v->vlc[i].table, v->vlc[i].bits, v->max_depth) + v->offset; 73cabdff1aSopenharmony_ci} 74cabdff1aSopenharmony_ci 75cabdff1aSopenharmony_cistatic void get_array(GetBitContext *s, int32_t *array, int size, int n) 76cabdff1aSopenharmony_ci{ 77cabdff1aSopenharmony_ci int i; 78cabdff1aSopenharmony_ci 79cabdff1aSopenharmony_ci for (i = 0; i < size; i++) 80cabdff1aSopenharmony_ci array[i] = get_sbits(s, n); 81cabdff1aSopenharmony_ci} 82cabdff1aSopenharmony_ci 83cabdff1aSopenharmony_ci// 5.3.1 - Bit stream header 84cabdff1aSopenharmony_cistatic int parse_frame_header(DCACoreDecoder *s) 85cabdff1aSopenharmony_ci{ 86cabdff1aSopenharmony_ci DCACoreFrameHeader h = { 0 }; 87cabdff1aSopenharmony_ci int err = ff_dca_parse_core_frame_header(&h, &s->gb); 88cabdff1aSopenharmony_ci 89cabdff1aSopenharmony_ci if (err < 0) { 90cabdff1aSopenharmony_ci switch (err) { 91cabdff1aSopenharmony_ci case DCA_PARSE_ERROR_DEFICIT_SAMPLES: 92cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Deficit samples are not supported\n"); 93cabdff1aSopenharmony_ci return h.normal_frame ? AVERROR_INVALIDDATA : AVERROR_PATCHWELCOME; 94cabdff1aSopenharmony_ci 95cabdff1aSopenharmony_ci case DCA_PARSE_ERROR_PCM_BLOCKS: 96cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Unsupported number of PCM sample blocks (%d)\n", h.npcmblocks); 97cabdff1aSopenharmony_ci return (h.npcmblocks < 6 || h.normal_frame) ? AVERROR_INVALIDDATA : AVERROR_PATCHWELCOME; 98cabdff1aSopenharmony_ci 99cabdff1aSopenharmony_ci case DCA_PARSE_ERROR_FRAME_SIZE: 100cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid core frame size (%d bytes)\n", h.frame_size); 101cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 102cabdff1aSopenharmony_ci 103cabdff1aSopenharmony_ci case DCA_PARSE_ERROR_AMODE: 104cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Unsupported audio channel arrangement (%d)\n", h.audio_mode); 105cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 106cabdff1aSopenharmony_ci 107cabdff1aSopenharmony_ci case DCA_PARSE_ERROR_SAMPLE_RATE: 108cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid core audio sampling frequency\n"); 109cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 110cabdff1aSopenharmony_ci 111cabdff1aSopenharmony_ci case DCA_PARSE_ERROR_RESERVED_BIT: 112cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Reserved bit set\n"); 113cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 114cabdff1aSopenharmony_ci 115cabdff1aSopenharmony_ci case DCA_PARSE_ERROR_LFE_FLAG: 116cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid low frequency effects flag\n"); 117cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 118cabdff1aSopenharmony_ci 119cabdff1aSopenharmony_ci case DCA_PARSE_ERROR_PCM_RES: 120cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid source PCM resolution\n"); 121cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 122cabdff1aSopenharmony_ci 123cabdff1aSopenharmony_ci default: 124cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Unknown core frame header error\n"); 125cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 126cabdff1aSopenharmony_ci } 127cabdff1aSopenharmony_ci } 128cabdff1aSopenharmony_ci 129cabdff1aSopenharmony_ci s->crc_present = h.crc_present; 130cabdff1aSopenharmony_ci s->npcmblocks = h.npcmblocks; 131cabdff1aSopenharmony_ci s->frame_size = h.frame_size; 132cabdff1aSopenharmony_ci s->audio_mode = h.audio_mode; 133cabdff1aSopenharmony_ci s->sample_rate = ff_dca_sample_rates[h.sr_code]; 134cabdff1aSopenharmony_ci s->bit_rate = ff_dca_bit_rates[h.br_code]; 135cabdff1aSopenharmony_ci s->drc_present = h.drc_present; 136cabdff1aSopenharmony_ci s->ts_present = h.ts_present; 137cabdff1aSopenharmony_ci s->aux_present = h.aux_present; 138cabdff1aSopenharmony_ci s->ext_audio_type = h.ext_audio_type; 139cabdff1aSopenharmony_ci s->ext_audio_present = h.ext_audio_present; 140cabdff1aSopenharmony_ci s->sync_ssf = h.sync_ssf; 141cabdff1aSopenharmony_ci s->lfe_present = h.lfe_present; 142cabdff1aSopenharmony_ci s->predictor_history = h.predictor_history; 143cabdff1aSopenharmony_ci s->filter_perfect = h.filter_perfect; 144cabdff1aSopenharmony_ci s->source_pcm_res = ff_dca_bits_per_sample[h.pcmr_code]; 145cabdff1aSopenharmony_ci s->es_format = h.pcmr_code & 1; 146cabdff1aSopenharmony_ci s->sumdiff_front = h.sumdiff_front; 147cabdff1aSopenharmony_ci s->sumdiff_surround = h.sumdiff_surround; 148cabdff1aSopenharmony_ci 149cabdff1aSopenharmony_ci return 0; 150cabdff1aSopenharmony_ci} 151cabdff1aSopenharmony_ci 152cabdff1aSopenharmony_ci// 5.3.2 - Primary audio coding header 153cabdff1aSopenharmony_cistatic int parse_coding_header(DCACoreDecoder *s, enum HeaderType header, int xch_base) 154cabdff1aSopenharmony_ci{ 155cabdff1aSopenharmony_ci int n, ch, nchannels, header_size = 0, header_pos = get_bits_count(&s->gb); 156cabdff1aSopenharmony_ci unsigned int mask, index; 157cabdff1aSopenharmony_ci 158cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 0) 159cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 160cabdff1aSopenharmony_ci 161cabdff1aSopenharmony_ci switch (header) { 162cabdff1aSopenharmony_ci case HEADER_CORE: 163cabdff1aSopenharmony_ci // Number of subframes 164cabdff1aSopenharmony_ci s->nsubframes = get_bits(&s->gb, 4) + 1; 165cabdff1aSopenharmony_ci 166cabdff1aSopenharmony_ci // Number of primary audio channels 167cabdff1aSopenharmony_ci s->nchannels = get_bits(&s->gb, 3) + 1; 168cabdff1aSopenharmony_ci if (s->nchannels != ff_dca_channels[s->audio_mode]) { 169cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid number of primary audio channels (%d) for audio channel arrangement (%d)\n", s->nchannels, s->audio_mode); 170cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 171cabdff1aSopenharmony_ci } 172cabdff1aSopenharmony_ci av_assert1(s->nchannels <= DCA_CHANNELS - 2); 173cabdff1aSopenharmony_ci 174cabdff1aSopenharmony_ci s->ch_mask = audio_mode_ch_mask[s->audio_mode]; 175cabdff1aSopenharmony_ci 176cabdff1aSopenharmony_ci // Add LFE channel if present 177cabdff1aSopenharmony_ci if (s->lfe_present) 178cabdff1aSopenharmony_ci s->ch_mask |= DCA_SPEAKER_MASK_LFE1; 179cabdff1aSopenharmony_ci break; 180cabdff1aSopenharmony_ci 181cabdff1aSopenharmony_ci case HEADER_XCH: 182cabdff1aSopenharmony_ci s->nchannels = ff_dca_channels[s->audio_mode] + 1; 183cabdff1aSopenharmony_ci av_assert1(s->nchannels <= DCA_CHANNELS - 1); 184cabdff1aSopenharmony_ci s->ch_mask |= DCA_SPEAKER_MASK_Cs; 185cabdff1aSopenharmony_ci break; 186cabdff1aSopenharmony_ci 187cabdff1aSopenharmony_ci case HEADER_XXCH: 188cabdff1aSopenharmony_ci // Channel set header length 189cabdff1aSopenharmony_ci header_size = get_bits(&s->gb, 7) + 1; 190cabdff1aSopenharmony_ci 191cabdff1aSopenharmony_ci // Check CRC 192cabdff1aSopenharmony_ci if (s->xxch_crc_present 193cabdff1aSopenharmony_ci && ff_dca_check_crc(s->avctx, &s->gb, header_pos, header_pos + header_size * 8)) { 194cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XXCH channel set header checksum\n"); 195cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 196cabdff1aSopenharmony_ci } 197cabdff1aSopenharmony_ci 198cabdff1aSopenharmony_ci // Number of channels in a channel set 199cabdff1aSopenharmony_ci nchannels = get_bits(&s->gb, 3) + 1; 200cabdff1aSopenharmony_ci if (nchannels > DCA_XXCH_CHANNELS_MAX) { 201cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "%d XXCH channels", nchannels); 202cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 203cabdff1aSopenharmony_ci } 204cabdff1aSopenharmony_ci s->nchannels = ff_dca_channels[s->audio_mode] + nchannels; 205cabdff1aSopenharmony_ci av_assert1(s->nchannels <= DCA_CHANNELS); 206cabdff1aSopenharmony_ci 207cabdff1aSopenharmony_ci // Loudspeaker layout mask 208cabdff1aSopenharmony_ci mask = get_bits_long(&s->gb, s->xxch_mask_nbits - DCA_SPEAKER_Cs); 209cabdff1aSopenharmony_ci s->xxch_spkr_mask = mask << DCA_SPEAKER_Cs; 210cabdff1aSopenharmony_ci 211cabdff1aSopenharmony_ci if (av_popcount(s->xxch_spkr_mask) != nchannels) { 212cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XXCH speaker layout mask (%#x)\n", s->xxch_spkr_mask); 213cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 214cabdff1aSopenharmony_ci } 215cabdff1aSopenharmony_ci 216cabdff1aSopenharmony_ci if (s->xxch_core_mask & s->xxch_spkr_mask) { 217cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "XXCH speaker layout mask (%#x) overlaps with core (%#x)\n", s->xxch_spkr_mask, s->xxch_core_mask); 218cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 219cabdff1aSopenharmony_ci } 220cabdff1aSopenharmony_ci 221cabdff1aSopenharmony_ci // Combine core and XXCH masks together 222cabdff1aSopenharmony_ci s->ch_mask = s->xxch_core_mask | s->xxch_spkr_mask; 223cabdff1aSopenharmony_ci 224cabdff1aSopenharmony_ci // Downmix coefficients present in stream 225cabdff1aSopenharmony_ci if (get_bits1(&s->gb)) { 226cabdff1aSopenharmony_ci int *coeff_ptr = s->xxch_dmix_coeff; 227cabdff1aSopenharmony_ci 228cabdff1aSopenharmony_ci // Downmix already performed by encoder 229cabdff1aSopenharmony_ci s->xxch_dmix_embedded = get_bits1(&s->gb); 230cabdff1aSopenharmony_ci 231cabdff1aSopenharmony_ci // Downmix scale factor 232cabdff1aSopenharmony_ci index = get_bits(&s->gb, 6) * 4 - FF_DCA_DMIXTABLE_OFFSET - 3; 233cabdff1aSopenharmony_ci if (index >= FF_DCA_INV_DMIXTABLE_SIZE) { 234cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XXCH downmix scale index (%d)\n", index); 235cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 236cabdff1aSopenharmony_ci } 237cabdff1aSopenharmony_ci s->xxch_dmix_scale_inv = ff_dca_inv_dmixtable[index]; 238cabdff1aSopenharmony_ci 239cabdff1aSopenharmony_ci // Downmix channel mapping mask 240cabdff1aSopenharmony_ci for (ch = 0; ch < nchannels; ch++) { 241cabdff1aSopenharmony_ci mask = get_bits_long(&s->gb, s->xxch_mask_nbits); 242cabdff1aSopenharmony_ci if ((mask & s->xxch_core_mask) != mask) { 243cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XXCH downmix channel mapping mask (%#x)\n", mask); 244cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 245cabdff1aSopenharmony_ci } 246cabdff1aSopenharmony_ci s->xxch_dmix_mask[ch] = mask; 247cabdff1aSopenharmony_ci } 248cabdff1aSopenharmony_ci 249cabdff1aSopenharmony_ci // Downmix coefficients 250cabdff1aSopenharmony_ci for (ch = 0; ch < nchannels; ch++) { 251cabdff1aSopenharmony_ci for (n = 0; n < s->xxch_mask_nbits; n++) { 252cabdff1aSopenharmony_ci if (s->xxch_dmix_mask[ch] & (1U << n)) { 253cabdff1aSopenharmony_ci int code = get_bits(&s->gb, 7); 254cabdff1aSopenharmony_ci int sign = (code >> 6) - 1; 255cabdff1aSopenharmony_ci if (code &= 63) { 256cabdff1aSopenharmony_ci index = code * 4 - 3; 257cabdff1aSopenharmony_ci if (index >= FF_DCA_DMIXTABLE_SIZE) { 258cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XXCH downmix coefficient index (%d)\n", index); 259cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 260cabdff1aSopenharmony_ci } 261cabdff1aSopenharmony_ci *coeff_ptr++ = (ff_dca_dmixtable[index] ^ sign) - sign; 262cabdff1aSopenharmony_ci } else { 263cabdff1aSopenharmony_ci *coeff_ptr++ = 0; 264cabdff1aSopenharmony_ci } 265cabdff1aSopenharmony_ci } 266cabdff1aSopenharmony_ci } 267cabdff1aSopenharmony_ci } 268cabdff1aSopenharmony_ci } else { 269cabdff1aSopenharmony_ci s->xxch_dmix_embedded = 0; 270cabdff1aSopenharmony_ci } 271cabdff1aSopenharmony_ci 272cabdff1aSopenharmony_ci break; 273cabdff1aSopenharmony_ci } 274cabdff1aSopenharmony_ci 275cabdff1aSopenharmony_ci // Subband activity count 276cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) { 277cabdff1aSopenharmony_ci s->nsubbands[ch] = get_bits(&s->gb, 5) + 2; 278cabdff1aSopenharmony_ci if (s->nsubbands[ch] > DCA_SUBBANDS) { 279cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid subband activity count\n"); 280cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 281cabdff1aSopenharmony_ci } 282cabdff1aSopenharmony_ci } 283cabdff1aSopenharmony_ci 284cabdff1aSopenharmony_ci // High frequency VQ start subband 285cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) 286cabdff1aSopenharmony_ci s->subband_vq_start[ch] = get_bits(&s->gb, 5) + 1; 287cabdff1aSopenharmony_ci 288cabdff1aSopenharmony_ci // Joint intensity coding index 289cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) { 290cabdff1aSopenharmony_ci if ((n = get_bits(&s->gb, 3)) && header == HEADER_XXCH) 291cabdff1aSopenharmony_ci n += xch_base - 1; 292cabdff1aSopenharmony_ci if (n > s->nchannels) { 293cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid joint intensity coding index\n"); 294cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 295cabdff1aSopenharmony_ci } 296cabdff1aSopenharmony_ci s->joint_intensity_index[ch] = n; 297cabdff1aSopenharmony_ci } 298cabdff1aSopenharmony_ci 299cabdff1aSopenharmony_ci // Transient mode code book 300cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) 301cabdff1aSopenharmony_ci s->transition_mode_sel[ch] = get_bits(&s->gb, 2); 302cabdff1aSopenharmony_ci 303cabdff1aSopenharmony_ci // Scale factor code book 304cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) { 305cabdff1aSopenharmony_ci s->scale_factor_sel[ch] = get_bits(&s->gb, 3); 306cabdff1aSopenharmony_ci if (s->scale_factor_sel[ch] == 7) { 307cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid scale factor code book\n"); 308cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 309cabdff1aSopenharmony_ci } 310cabdff1aSopenharmony_ci } 311cabdff1aSopenharmony_ci 312cabdff1aSopenharmony_ci // Bit allocation quantizer select 313cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) { 314cabdff1aSopenharmony_ci s->bit_allocation_sel[ch] = get_bits(&s->gb, 3); 315cabdff1aSopenharmony_ci if (s->bit_allocation_sel[ch] == 7) { 316cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid bit allocation quantizer select\n"); 317cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 318cabdff1aSopenharmony_ci } 319cabdff1aSopenharmony_ci } 320cabdff1aSopenharmony_ci 321cabdff1aSopenharmony_ci // Quantization index codebook select 322cabdff1aSopenharmony_ci for (n = 0; n < DCA_CODE_BOOKS; n++) 323cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) 324cabdff1aSopenharmony_ci s->quant_index_sel[ch][n] = get_bits(&s->gb, ff_dca_quant_index_sel_nbits[n]); 325cabdff1aSopenharmony_ci 326cabdff1aSopenharmony_ci // Scale factor adjustment index 327cabdff1aSopenharmony_ci for (n = 0; n < DCA_CODE_BOOKS; n++) 328cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) 329cabdff1aSopenharmony_ci if (s->quant_index_sel[ch][n] < ff_dca_quant_index_group_size[n]) 330cabdff1aSopenharmony_ci s->scale_factor_adj[ch][n] = ff_dca_scale_factor_adj[get_bits(&s->gb, 2)]; 331cabdff1aSopenharmony_ci 332cabdff1aSopenharmony_ci if (header == HEADER_XXCH) { 333cabdff1aSopenharmony_ci // Reserved 334cabdff1aSopenharmony_ci // Byte align 335cabdff1aSopenharmony_ci // CRC16 of channel set header 336cabdff1aSopenharmony_ci if (ff_dca_seek_bits(&s->gb, header_pos + header_size * 8)) { 337cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Read past end of XXCH channel set header\n"); 338cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 339cabdff1aSopenharmony_ci } 340cabdff1aSopenharmony_ci } else { 341cabdff1aSopenharmony_ci // Audio header CRC check word 342cabdff1aSopenharmony_ci if (s->crc_present) 343cabdff1aSopenharmony_ci skip_bits(&s->gb, 16); 344cabdff1aSopenharmony_ci } 345cabdff1aSopenharmony_ci 346cabdff1aSopenharmony_ci return 0; 347cabdff1aSopenharmony_ci} 348cabdff1aSopenharmony_ci 349cabdff1aSopenharmony_cistatic inline int parse_scale(DCACoreDecoder *s, int *scale_index, int sel) 350cabdff1aSopenharmony_ci{ 351cabdff1aSopenharmony_ci const uint32_t *scale_table; 352cabdff1aSopenharmony_ci unsigned int scale_size; 353cabdff1aSopenharmony_ci 354cabdff1aSopenharmony_ci // Select the root square table 355cabdff1aSopenharmony_ci if (sel > 5) { 356cabdff1aSopenharmony_ci scale_table = ff_dca_scale_factor_quant7; 357cabdff1aSopenharmony_ci scale_size = FF_ARRAY_ELEMS(ff_dca_scale_factor_quant7); 358cabdff1aSopenharmony_ci } else { 359cabdff1aSopenharmony_ci scale_table = ff_dca_scale_factor_quant6; 360cabdff1aSopenharmony_ci scale_size = FF_ARRAY_ELEMS(ff_dca_scale_factor_quant6); 361cabdff1aSopenharmony_ci } 362cabdff1aSopenharmony_ci 363cabdff1aSopenharmony_ci // If Huffman code was used, the difference of scales was encoded 364cabdff1aSopenharmony_ci if (sel < 5) 365cabdff1aSopenharmony_ci *scale_index += dca_get_vlc(&s->gb, &ff_dca_vlc_scale_factor, sel); 366cabdff1aSopenharmony_ci else 367cabdff1aSopenharmony_ci *scale_index = get_bits(&s->gb, sel + 1); 368cabdff1aSopenharmony_ci 369cabdff1aSopenharmony_ci // Look up scale factor from the root square table 370cabdff1aSopenharmony_ci if ((unsigned int)*scale_index >= scale_size) { 371cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid scale factor index\n"); 372cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 373cabdff1aSopenharmony_ci } 374cabdff1aSopenharmony_ci 375cabdff1aSopenharmony_ci return scale_table[*scale_index]; 376cabdff1aSopenharmony_ci} 377cabdff1aSopenharmony_ci 378cabdff1aSopenharmony_cistatic inline int parse_joint_scale(DCACoreDecoder *s, int sel) 379cabdff1aSopenharmony_ci{ 380cabdff1aSopenharmony_ci int scale_index; 381cabdff1aSopenharmony_ci 382cabdff1aSopenharmony_ci // Absolute value was encoded even when Huffman code was used 383cabdff1aSopenharmony_ci if (sel < 5) 384cabdff1aSopenharmony_ci scale_index = dca_get_vlc(&s->gb, &ff_dca_vlc_scale_factor, sel); 385cabdff1aSopenharmony_ci else 386cabdff1aSopenharmony_ci scale_index = get_bits(&s->gb, sel + 1); 387cabdff1aSopenharmony_ci 388cabdff1aSopenharmony_ci // Bias by 64 389cabdff1aSopenharmony_ci scale_index += 64; 390cabdff1aSopenharmony_ci 391cabdff1aSopenharmony_ci // Look up joint scale factor 392cabdff1aSopenharmony_ci if ((unsigned int)scale_index >= FF_ARRAY_ELEMS(ff_dca_joint_scale_factors)) { 393cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid joint scale factor index\n"); 394cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 395cabdff1aSopenharmony_ci } 396cabdff1aSopenharmony_ci 397cabdff1aSopenharmony_ci return ff_dca_joint_scale_factors[scale_index]; 398cabdff1aSopenharmony_ci} 399cabdff1aSopenharmony_ci 400cabdff1aSopenharmony_ci// 5.4.1 - Primary audio coding side information 401cabdff1aSopenharmony_cistatic int parse_subframe_header(DCACoreDecoder *s, int sf, 402cabdff1aSopenharmony_ci enum HeaderType header, int xch_base) 403cabdff1aSopenharmony_ci{ 404cabdff1aSopenharmony_ci int ch, band, ret; 405cabdff1aSopenharmony_ci 406cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 0) 407cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 408cabdff1aSopenharmony_ci 409cabdff1aSopenharmony_ci if (header == HEADER_CORE) { 410cabdff1aSopenharmony_ci // Subsubframe count 411cabdff1aSopenharmony_ci s->nsubsubframes[sf] = get_bits(&s->gb, 2) + 1; 412cabdff1aSopenharmony_ci 413cabdff1aSopenharmony_ci // Partial subsubframe sample count 414cabdff1aSopenharmony_ci skip_bits(&s->gb, 3); 415cabdff1aSopenharmony_ci } 416cabdff1aSopenharmony_ci 417cabdff1aSopenharmony_ci // Prediction mode 418cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) 419cabdff1aSopenharmony_ci for (band = 0; band < s->nsubbands[ch]; band++) 420cabdff1aSopenharmony_ci s->prediction_mode[ch][band] = get_bits1(&s->gb); 421cabdff1aSopenharmony_ci 422cabdff1aSopenharmony_ci // Prediction coefficients VQ address 423cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) 424cabdff1aSopenharmony_ci for (band = 0; band < s->nsubbands[ch]; band++) 425cabdff1aSopenharmony_ci if (s->prediction_mode[ch][band]) 426cabdff1aSopenharmony_ci s->prediction_vq_index[ch][band] = get_bits(&s->gb, 12); 427cabdff1aSopenharmony_ci 428cabdff1aSopenharmony_ci // Bit allocation index 429cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) { 430cabdff1aSopenharmony_ci int sel = s->bit_allocation_sel[ch]; 431cabdff1aSopenharmony_ci 432cabdff1aSopenharmony_ci for (band = 0; band < s->subband_vq_start[ch]; band++) { 433cabdff1aSopenharmony_ci int abits; 434cabdff1aSopenharmony_ci 435cabdff1aSopenharmony_ci if (sel < 5) 436cabdff1aSopenharmony_ci abits = dca_get_vlc(&s->gb, &ff_dca_vlc_bit_allocation, sel); 437cabdff1aSopenharmony_ci else 438cabdff1aSopenharmony_ci abits = get_bits(&s->gb, sel - 1); 439cabdff1aSopenharmony_ci 440cabdff1aSopenharmony_ci if (abits > DCA_ABITS_MAX) { 441cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid bit allocation index\n"); 442cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 443cabdff1aSopenharmony_ci } 444cabdff1aSopenharmony_ci 445cabdff1aSopenharmony_ci s->bit_allocation[ch][band] = abits; 446cabdff1aSopenharmony_ci } 447cabdff1aSopenharmony_ci } 448cabdff1aSopenharmony_ci 449cabdff1aSopenharmony_ci // Transition mode 450cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) { 451cabdff1aSopenharmony_ci // Clear transition mode for all subbands 452cabdff1aSopenharmony_ci memset(s->transition_mode[sf][ch], 0, sizeof(s->transition_mode[0][0])); 453cabdff1aSopenharmony_ci 454cabdff1aSopenharmony_ci // Transient possible only if more than one subsubframe 455cabdff1aSopenharmony_ci if (s->nsubsubframes[sf] > 1) { 456cabdff1aSopenharmony_ci int sel = s->transition_mode_sel[ch]; 457cabdff1aSopenharmony_ci for (band = 0; band < s->subband_vq_start[ch]; band++) 458cabdff1aSopenharmony_ci if (s->bit_allocation[ch][band]) 459cabdff1aSopenharmony_ci s->transition_mode[sf][ch][band] = dca_get_vlc(&s->gb, &ff_dca_vlc_transition_mode, sel); 460cabdff1aSopenharmony_ci } 461cabdff1aSopenharmony_ci } 462cabdff1aSopenharmony_ci 463cabdff1aSopenharmony_ci // Scale factors 464cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) { 465cabdff1aSopenharmony_ci int sel = s->scale_factor_sel[ch]; 466cabdff1aSopenharmony_ci int scale_index = 0; 467cabdff1aSopenharmony_ci 468cabdff1aSopenharmony_ci // Extract scales for subbands up to VQ 469cabdff1aSopenharmony_ci for (band = 0; band < s->subband_vq_start[ch]; band++) { 470cabdff1aSopenharmony_ci if (s->bit_allocation[ch][band]) { 471cabdff1aSopenharmony_ci if ((ret = parse_scale(s, &scale_index, sel)) < 0) 472cabdff1aSopenharmony_ci return ret; 473cabdff1aSopenharmony_ci s->scale_factors[ch][band][0] = ret; 474cabdff1aSopenharmony_ci if (s->transition_mode[sf][ch][band]) { 475cabdff1aSopenharmony_ci if ((ret = parse_scale(s, &scale_index, sel)) < 0) 476cabdff1aSopenharmony_ci return ret; 477cabdff1aSopenharmony_ci s->scale_factors[ch][band][1] = ret; 478cabdff1aSopenharmony_ci } 479cabdff1aSopenharmony_ci } else { 480cabdff1aSopenharmony_ci s->scale_factors[ch][band][0] = 0; 481cabdff1aSopenharmony_ci } 482cabdff1aSopenharmony_ci } 483cabdff1aSopenharmony_ci 484cabdff1aSopenharmony_ci // High frequency VQ subbands 485cabdff1aSopenharmony_ci for (band = s->subband_vq_start[ch]; band < s->nsubbands[ch]; band++) { 486cabdff1aSopenharmony_ci if ((ret = parse_scale(s, &scale_index, sel)) < 0) 487cabdff1aSopenharmony_ci return ret; 488cabdff1aSopenharmony_ci s->scale_factors[ch][band][0] = ret; 489cabdff1aSopenharmony_ci } 490cabdff1aSopenharmony_ci } 491cabdff1aSopenharmony_ci 492cabdff1aSopenharmony_ci // Joint subband codebook select 493cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) { 494cabdff1aSopenharmony_ci if (s->joint_intensity_index[ch]) { 495cabdff1aSopenharmony_ci s->joint_scale_sel[ch] = get_bits(&s->gb, 3); 496cabdff1aSopenharmony_ci if (s->joint_scale_sel[ch] == 7) { 497cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid joint scale factor code book\n"); 498cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 499cabdff1aSopenharmony_ci } 500cabdff1aSopenharmony_ci } 501cabdff1aSopenharmony_ci } 502cabdff1aSopenharmony_ci 503cabdff1aSopenharmony_ci // Scale factors for joint subband coding 504cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) { 505cabdff1aSopenharmony_ci int src_ch = s->joint_intensity_index[ch] - 1; 506cabdff1aSopenharmony_ci if (src_ch >= 0) { 507cabdff1aSopenharmony_ci int sel = s->joint_scale_sel[ch]; 508cabdff1aSopenharmony_ci for (band = s->nsubbands[ch]; band < s->nsubbands[src_ch]; band++) { 509cabdff1aSopenharmony_ci if ((ret = parse_joint_scale(s, sel)) < 0) 510cabdff1aSopenharmony_ci return ret; 511cabdff1aSopenharmony_ci s->joint_scale_factors[ch][band] = ret; 512cabdff1aSopenharmony_ci } 513cabdff1aSopenharmony_ci } 514cabdff1aSopenharmony_ci } 515cabdff1aSopenharmony_ci 516cabdff1aSopenharmony_ci // Dynamic range coefficient 517cabdff1aSopenharmony_ci if (s->drc_present && header == HEADER_CORE) 518cabdff1aSopenharmony_ci skip_bits(&s->gb, 8); 519cabdff1aSopenharmony_ci 520cabdff1aSopenharmony_ci // Side information CRC check word 521cabdff1aSopenharmony_ci if (s->crc_present) 522cabdff1aSopenharmony_ci skip_bits(&s->gb, 16); 523cabdff1aSopenharmony_ci 524cabdff1aSopenharmony_ci return 0; 525cabdff1aSopenharmony_ci} 526cabdff1aSopenharmony_ci 527cabdff1aSopenharmony_ci#ifndef decode_blockcodes 528cabdff1aSopenharmony_cistatic inline int decode_blockcodes(int code1, int code2, int levels, int32_t *audio) 529cabdff1aSopenharmony_ci{ 530cabdff1aSopenharmony_ci int offset = (levels - 1) / 2; 531cabdff1aSopenharmony_ci int n, div; 532cabdff1aSopenharmony_ci 533cabdff1aSopenharmony_ci for (n = 0; n < DCA_SUBBAND_SAMPLES / 2; n++) { 534cabdff1aSopenharmony_ci div = FASTDIV(code1, levels); 535cabdff1aSopenharmony_ci audio[n] = code1 - div * levels - offset; 536cabdff1aSopenharmony_ci code1 = div; 537cabdff1aSopenharmony_ci } 538cabdff1aSopenharmony_ci for (; n < DCA_SUBBAND_SAMPLES; n++) { 539cabdff1aSopenharmony_ci div = FASTDIV(code2, levels); 540cabdff1aSopenharmony_ci audio[n] = code2 - div * levels - offset; 541cabdff1aSopenharmony_ci code2 = div; 542cabdff1aSopenharmony_ci } 543cabdff1aSopenharmony_ci 544cabdff1aSopenharmony_ci return code1 | code2; 545cabdff1aSopenharmony_ci} 546cabdff1aSopenharmony_ci#endif 547cabdff1aSopenharmony_ci 548cabdff1aSopenharmony_cistatic inline int parse_block_codes(DCACoreDecoder *s, int32_t *audio, int abits) 549cabdff1aSopenharmony_ci{ 550cabdff1aSopenharmony_ci // Extract block code indices from the bit stream 551cabdff1aSopenharmony_ci int code1 = get_bits(&s->gb, block_code_nbits[abits - 1]); 552cabdff1aSopenharmony_ci int code2 = get_bits(&s->gb, block_code_nbits[abits - 1]); 553cabdff1aSopenharmony_ci int levels = ff_dca_quant_levels[abits]; 554cabdff1aSopenharmony_ci 555cabdff1aSopenharmony_ci // Look up samples from the block code book 556cabdff1aSopenharmony_ci if (decode_blockcodes(code1, code2, levels, audio)) { 557cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Failed to decode block code(s)\n"); 558cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 559cabdff1aSopenharmony_ci } 560cabdff1aSopenharmony_ci 561cabdff1aSopenharmony_ci return 0; 562cabdff1aSopenharmony_ci} 563cabdff1aSopenharmony_ci 564cabdff1aSopenharmony_cistatic inline int parse_huffman_codes(DCACoreDecoder *s, int32_t *audio, int abits, int sel) 565cabdff1aSopenharmony_ci{ 566cabdff1aSopenharmony_ci int i; 567cabdff1aSopenharmony_ci 568cabdff1aSopenharmony_ci // Extract Huffman codes from the bit stream 569cabdff1aSopenharmony_ci for (i = 0; i < DCA_SUBBAND_SAMPLES; i++) 570cabdff1aSopenharmony_ci audio[i] = dca_get_vlc(&s->gb, &ff_dca_vlc_quant_index[abits - 1], sel); 571cabdff1aSopenharmony_ci 572cabdff1aSopenharmony_ci return 1; 573cabdff1aSopenharmony_ci} 574cabdff1aSopenharmony_ci 575cabdff1aSopenharmony_cistatic inline int extract_audio(DCACoreDecoder *s, int32_t *audio, int abits, int ch) 576cabdff1aSopenharmony_ci{ 577cabdff1aSopenharmony_ci av_assert1(abits >= 0 && abits <= DCA_ABITS_MAX); 578cabdff1aSopenharmony_ci 579cabdff1aSopenharmony_ci if (abits == 0) { 580cabdff1aSopenharmony_ci // No bits allocated 581cabdff1aSopenharmony_ci memset(audio, 0, DCA_SUBBAND_SAMPLES * sizeof(*audio)); 582cabdff1aSopenharmony_ci return 0; 583cabdff1aSopenharmony_ci } 584cabdff1aSopenharmony_ci 585cabdff1aSopenharmony_ci if (abits <= DCA_CODE_BOOKS) { 586cabdff1aSopenharmony_ci int sel = s->quant_index_sel[ch][abits - 1]; 587cabdff1aSopenharmony_ci if (sel < ff_dca_quant_index_group_size[abits - 1]) { 588cabdff1aSopenharmony_ci // Huffman codes 589cabdff1aSopenharmony_ci return parse_huffman_codes(s, audio, abits, sel); 590cabdff1aSopenharmony_ci } 591cabdff1aSopenharmony_ci if (abits <= 7) { 592cabdff1aSopenharmony_ci // Block codes 593cabdff1aSopenharmony_ci return parse_block_codes(s, audio, abits); 594cabdff1aSopenharmony_ci } 595cabdff1aSopenharmony_ci } 596cabdff1aSopenharmony_ci 597cabdff1aSopenharmony_ci // No further encoding 598cabdff1aSopenharmony_ci get_array(&s->gb, audio, DCA_SUBBAND_SAMPLES, abits - 3); 599cabdff1aSopenharmony_ci return 0; 600cabdff1aSopenharmony_ci} 601cabdff1aSopenharmony_ci 602cabdff1aSopenharmony_cistatic inline void inverse_adpcm(int32_t **subband_samples, 603cabdff1aSopenharmony_ci const int16_t *vq_index, 604cabdff1aSopenharmony_ci const int8_t *prediction_mode, 605cabdff1aSopenharmony_ci int sb_start, int sb_end, 606cabdff1aSopenharmony_ci int ofs, int len) 607cabdff1aSopenharmony_ci{ 608cabdff1aSopenharmony_ci int i, j; 609cabdff1aSopenharmony_ci 610cabdff1aSopenharmony_ci for (i = sb_start; i < sb_end; i++) { 611cabdff1aSopenharmony_ci if (prediction_mode[i]) { 612cabdff1aSopenharmony_ci const int pred_id = vq_index[i]; 613cabdff1aSopenharmony_ci int32_t *ptr = subband_samples[i] + ofs; 614cabdff1aSopenharmony_ci for (j = 0; j < len; j++) { 615cabdff1aSopenharmony_ci int32_t x = ff_dcaadpcm_predict(pred_id, ptr + j - DCA_ADPCM_COEFFS); 616cabdff1aSopenharmony_ci ptr[j] = clip23(ptr[j] + x); 617cabdff1aSopenharmony_ci } 618cabdff1aSopenharmony_ci } 619cabdff1aSopenharmony_ci } 620cabdff1aSopenharmony_ci} 621cabdff1aSopenharmony_ci 622cabdff1aSopenharmony_ci// 5.5 - Primary audio data arrays 623cabdff1aSopenharmony_cistatic int parse_subframe_audio(DCACoreDecoder *s, int sf, enum HeaderType header, 624cabdff1aSopenharmony_ci int xch_base, int *sub_pos, int *lfe_pos) 625cabdff1aSopenharmony_ci{ 626cabdff1aSopenharmony_ci int32_t audio[16], scale; 627cabdff1aSopenharmony_ci int n, ssf, ofs, ch, band; 628cabdff1aSopenharmony_ci 629cabdff1aSopenharmony_ci // Check number of subband samples in this subframe 630cabdff1aSopenharmony_ci int nsamples = s->nsubsubframes[sf] * DCA_SUBBAND_SAMPLES; 631cabdff1aSopenharmony_ci if (*sub_pos + nsamples > s->npcmblocks) { 632cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Subband sample buffer overflow\n"); 633cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 634cabdff1aSopenharmony_ci } 635cabdff1aSopenharmony_ci 636cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 0) 637cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 638cabdff1aSopenharmony_ci 639cabdff1aSopenharmony_ci // VQ encoded subbands 640cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) { 641cabdff1aSopenharmony_ci int32_t vq_index[DCA_SUBBANDS]; 642cabdff1aSopenharmony_ci 643cabdff1aSopenharmony_ci for (band = s->subband_vq_start[ch]; band < s->nsubbands[ch]; band++) 644cabdff1aSopenharmony_ci // Extract the VQ address from the bit stream 645cabdff1aSopenharmony_ci vq_index[band] = get_bits(&s->gb, 10); 646cabdff1aSopenharmony_ci 647cabdff1aSopenharmony_ci if (s->subband_vq_start[ch] < s->nsubbands[ch]) { 648cabdff1aSopenharmony_ci s->dcadsp->decode_hf(s->subband_samples[ch], vq_index, 649cabdff1aSopenharmony_ci ff_dca_high_freq_vq, s->scale_factors[ch], 650cabdff1aSopenharmony_ci s->subband_vq_start[ch], s->nsubbands[ch], 651cabdff1aSopenharmony_ci *sub_pos, nsamples); 652cabdff1aSopenharmony_ci } 653cabdff1aSopenharmony_ci } 654cabdff1aSopenharmony_ci 655cabdff1aSopenharmony_ci // Low frequency effect data 656cabdff1aSopenharmony_ci if (s->lfe_present && header == HEADER_CORE) { 657cabdff1aSopenharmony_ci unsigned int index; 658cabdff1aSopenharmony_ci 659cabdff1aSopenharmony_ci // Determine number of LFE samples in this subframe 660cabdff1aSopenharmony_ci int nlfesamples = 2 * s->lfe_present * s->nsubsubframes[sf]; 661cabdff1aSopenharmony_ci av_assert1((unsigned int)nlfesamples <= FF_ARRAY_ELEMS(audio)); 662cabdff1aSopenharmony_ci 663cabdff1aSopenharmony_ci // Extract LFE samples from the bit stream 664cabdff1aSopenharmony_ci get_array(&s->gb, audio, nlfesamples, 8); 665cabdff1aSopenharmony_ci 666cabdff1aSopenharmony_ci // Extract scale factor index from the bit stream 667cabdff1aSopenharmony_ci index = get_bits(&s->gb, 8); 668cabdff1aSopenharmony_ci if (index >= FF_ARRAY_ELEMS(ff_dca_scale_factor_quant7)) { 669cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid LFE scale factor index\n"); 670cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 671cabdff1aSopenharmony_ci } 672cabdff1aSopenharmony_ci 673cabdff1aSopenharmony_ci // Look up the 7-bit root square quantization table 674cabdff1aSopenharmony_ci scale = ff_dca_scale_factor_quant7[index]; 675cabdff1aSopenharmony_ci 676cabdff1aSopenharmony_ci // Account for quantizer step size which is 0.035 677cabdff1aSopenharmony_ci scale = mul23(4697620 /* 0.035 * (1 << 27) */, scale); 678cabdff1aSopenharmony_ci 679cabdff1aSopenharmony_ci // Scale and take the LFE samples 680cabdff1aSopenharmony_ci for (n = 0, ofs = *lfe_pos; n < nlfesamples; n++, ofs++) 681cabdff1aSopenharmony_ci s->lfe_samples[ofs] = clip23(audio[n] * scale >> 4); 682cabdff1aSopenharmony_ci 683cabdff1aSopenharmony_ci // Advance LFE sample pointer for the next subframe 684cabdff1aSopenharmony_ci *lfe_pos = ofs; 685cabdff1aSopenharmony_ci } 686cabdff1aSopenharmony_ci 687cabdff1aSopenharmony_ci // Audio data 688cabdff1aSopenharmony_ci for (ssf = 0, ofs = *sub_pos; ssf < s->nsubsubframes[sf]; ssf++) { 689cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) { 690cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 0) 691cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 692cabdff1aSopenharmony_ci 693cabdff1aSopenharmony_ci // Not high frequency VQ subbands 694cabdff1aSopenharmony_ci for (band = 0; band < s->subband_vq_start[ch]; band++) { 695cabdff1aSopenharmony_ci int ret, trans_ssf, abits = s->bit_allocation[ch][band]; 696cabdff1aSopenharmony_ci int32_t step_size; 697cabdff1aSopenharmony_ci 698cabdff1aSopenharmony_ci // Extract bits from the bit stream 699cabdff1aSopenharmony_ci if ((ret = extract_audio(s, audio, abits, ch)) < 0) 700cabdff1aSopenharmony_ci return ret; 701cabdff1aSopenharmony_ci 702cabdff1aSopenharmony_ci // Select quantization step size table and look up 703cabdff1aSopenharmony_ci // quantization step size 704cabdff1aSopenharmony_ci if (s->bit_rate == 3) 705cabdff1aSopenharmony_ci step_size = ff_dca_lossless_quant[abits]; 706cabdff1aSopenharmony_ci else 707cabdff1aSopenharmony_ci step_size = ff_dca_lossy_quant[abits]; 708cabdff1aSopenharmony_ci 709cabdff1aSopenharmony_ci // Identify transient location 710cabdff1aSopenharmony_ci trans_ssf = s->transition_mode[sf][ch][band]; 711cabdff1aSopenharmony_ci 712cabdff1aSopenharmony_ci // Determine proper scale factor 713cabdff1aSopenharmony_ci if (trans_ssf == 0 || ssf < trans_ssf) 714cabdff1aSopenharmony_ci scale = s->scale_factors[ch][band][0]; 715cabdff1aSopenharmony_ci else 716cabdff1aSopenharmony_ci scale = s->scale_factors[ch][band][1]; 717cabdff1aSopenharmony_ci 718cabdff1aSopenharmony_ci // Adjust scale factor when SEL indicates Huffman code 719cabdff1aSopenharmony_ci if (ret > 0) { 720cabdff1aSopenharmony_ci int64_t adj = s->scale_factor_adj[ch][abits - 1]; 721cabdff1aSopenharmony_ci scale = clip23(adj * scale >> 22); 722cabdff1aSopenharmony_ci } 723cabdff1aSopenharmony_ci 724cabdff1aSopenharmony_ci ff_dca_core_dequantize(s->subband_samples[ch][band] + ofs, 725cabdff1aSopenharmony_ci audio, step_size, scale, 0, DCA_SUBBAND_SAMPLES); 726cabdff1aSopenharmony_ci } 727cabdff1aSopenharmony_ci } 728cabdff1aSopenharmony_ci 729cabdff1aSopenharmony_ci // DSYNC 730cabdff1aSopenharmony_ci if ((ssf == s->nsubsubframes[sf] - 1 || s->sync_ssf) && get_bits(&s->gb, 16) != 0xffff) { 731cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "DSYNC check failed\n"); 732cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 733cabdff1aSopenharmony_ci } 734cabdff1aSopenharmony_ci 735cabdff1aSopenharmony_ci ofs += DCA_SUBBAND_SAMPLES; 736cabdff1aSopenharmony_ci } 737cabdff1aSopenharmony_ci 738cabdff1aSopenharmony_ci // Inverse ADPCM 739cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) { 740cabdff1aSopenharmony_ci inverse_adpcm(s->subband_samples[ch], s->prediction_vq_index[ch], 741cabdff1aSopenharmony_ci s->prediction_mode[ch], 0, s->nsubbands[ch], 742cabdff1aSopenharmony_ci *sub_pos, nsamples); 743cabdff1aSopenharmony_ci } 744cabdff1aSopenharmony_ci 745cabdff1aSopenharmony_ci // Joint subband coding 746cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) { 747cabdff1aSopenharmony_ci int src_ch = s->joint_intensity_index[ch] - 1; 748cabdff1aSopenharmony_ci if (src_ch >= 0) { 749cabdff1aSopenharmony_ci s->dcadsp->decode_joint(s->subband_samples[ch], s->subband_samples[src_ch], 750cabdff1aSopenharmony_ci s->joint_scale_factors[ch], s->nsubbands[ch], 751cabdff1aSopenharmony_ci s->nsubbands[src_ch], *sub_pos, nsamples); 752cabdff1aSopenharmony_ci } 753cabdff1aSopenharmony_ci } 754cabdff1aSopenharmony_ci 755cabdff1aSopenharmony_ci // Advance subband sample pointer for the next subframe 756cabdff1aSopenharmony_ci *sub_pos = ofs; 757cabdff1aSopenharmony_ci return 0; 758cabdff1aSopenharmony_ci} 759cabdff1aSopenharmony_ci 760cabdff1aSopenharmony_cistatic void erase_adpcm_history(DCACoreDecoder *s) 761cabdff1aSopenharmony_ci{ 762cabdff1aSopenharmony_ci int ch, band; 763cabdff1aSopenharmony_ci 764cabdff1aSopenharmony_ci // Erase ADPCM history from previous frame if 765cabdff1aSopenharmony_ci // predictor history switch was disabled 766cabdff1aSopenharmony_ci for (ch = 0; ch < DCA_CHANNELS; ch++) 767cabdff1aSopenharmony_ci for (band = 0; band < DCA_SUBBANDS; band++) 768cabdff1aSopenharmony_ci AV_ZERO128(s->subband_samples[ch][band] - DCA_ADPCM_COEFFS); 769cabdff1aSopenharmony_ci 770cabdff1aSopenharmony_ci emms_c(); 771cabdff1aSopenharmony_ci} 772cabdff1aSopenharmony_ci 773cabdff1aSopenharmony_cistatic int alloc_sample_buffer(DCACoreDecoder *s) 774cabdff1aSopenharmony_ci{ 775cabdff1aSopenharmony_ci int nchsamples = DCA_ADPCM_COEFFS + s->npcmblocks; 776cabdff1aSopenharmony_ci int nframesamples = nchsamples * DCA_CHANNELS * DCA_SUBBANDS; 777cabdff1aSopenharmony_ci int nlfesamples = DCA_LFE_HISTORY + s->npcmblocks / 2; 778cabdff1aSopenharmony_ci unsigned int size = s->subband_size; 779cabdff1aSopenharmony_ci int ch, band; 780cabdff1aSopenharmony_ci 781cabdff1aSopenharmony_ci // Reallocate subband sample buffer 782cabdff1aSopenharmony_ci av_fast_mallocz(&s->subband_buffer, &s->subband_size, 783cabdff1aSopenharmony_ci (nframesamples + nlfesamples) * sizeof(int32_t)); 784cabdff1aSopenharmony_ci if (!s->subband_buffer) 785cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 786cabdff1aSopenharmony_ci 787cabdff1aSopenharmony_ci if (size != s->subband_size) { 788cabdff1aSopenharmony_ci for (ch = 0; ch < DCA_CHANNELS; ch++) 789cabdff1aSopenharmony_ci for (band = 0; band < DCA_SUBBANDS; band++) 790cabdff1aSopenharmony_ci s->subband_samples[ch][band] = s->subband_buffer + 791cabdff1aSopenharmony_ci (ch * DCA_SUBBANDS + band) * nchsamples + DCA_ADPCM_COEFFS; 792cabdff1aSopenharmony_ci s->lfe_samples = s->subband_buffer + nframesamples; 793cabdff1aSopenharmony_ci } 794cabdff1aSopenharmony_ci 795cabdff1aSopenharmony_ci if (!s->predictor_history) 796cabdff1aSopenharmony_ci erase_adpcm_history(s); 797cabdff1aSopenharmony_ci 798cabdff1aSopenharmony_ci return 0; 799cabdff1aSopenharmony_ci} 800cabdff1aSopenharmony_ci 801cabdff1aSopenharmony_cistatic int parse_frame_data(DCACoreDecoder *s, enum HeaderType header, int xch_base) 802cabdff1aSopenharmony_ci{ 803cabdff1aSopenharmony_ci int sf, ch, ret, band, sub_pos, lfe_pos; 804cabdff1aSopenharmony_ci 805cabdff1aSopenharmony_ci if ((ret = parse_coding_header(s, header, xch_base)) < 0) 806cabdff1aSopenharmony_ci return ret; 807cabdff1aSopenharmony_ci 808cabdff1aSopenharmony_ci for (sf = 0, sub_pos = 0, lfe_pos = DCA_LFE_HISTORY; sf < s->nsubframes; sf++) { 809cabdff1aSopenharmony_ci if ((ret = parse_subframe_header(s, sf, header, xch_base)) < 0) 810cabdff1aSopenharmony_ci return ret; 811cabdff1aSopenharmony_ci if ((ret = parse_subframe_audio(s, sf, header, xch_base, &sub_pos, &lfe_pos)) < 0) 812cabdff1aSopenharmony_ci return ret; 813cabdff1aSopenharmony_ci } 814cabdff1aSopenharmony_ci 815cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) { 816cabdff1aSopenharmony_ci // Determine number of active subbands for this channel 817cabdff1aSopenharmony_ci int nsubbands = s->nsubbands[ch]; 818cabdff1aSopenharmony_ci if (s->joint_intensity_index[ch]) 819cabdff1aSopenharmony_ci nsubbands = FFMAX(nsubbands, s->nsubbands[s->joint_intensity_index[ch] - 1]); 820cabdff1aSopenharmony_ci 821cabdff1aSopenharmony_ci // Update history for ADPCM 822cabdff1aSopenharmony_ci for (band = 0; band < nsubbands; band++) { 823cabdff1aSopenharmony_ci int32_t *samples = s->subband_samples[ch][band] - DCA_ADPCM_COEFFS; 824cabdff1aSopenharmony_ci AV_COPY128(samples, samples + s->npcmblocks); 825cabdff1aSopenharmony_ci } 826cabdff1aSopenharmony_ci 827cabdff1aSopenharmony_ci // Clear inactive subbands 828cabdff1aSopenharmony_ci for (; band < DCA_SUBBANDS; band++) { 829cabdff1aSopenharmony_ci int32_t *samples = s->subband_samples[ch][band] - DCA_ADPCM_COEFFS; 830cabdff1aSopenharmony_ci memset(samples, 0, (DCA_ADPCM_COEFFS + s->npcmblocks) * sizeof(int32_t)); 831cabdff1aSopenharmony_ci } 832cabdff1aSopenharmony_ci } 833cabdff1aSopenharmony_ci 834cabdff1aSopenharmony_ci emms_c(); 835cabdff1aSopenharmony_ci 836cabdff1aSopenharmony_ci return 0; 837cabdff1aSopenharmony_ci} 838cabdff1aSopenharmony_ci 839cabdff1aSopenharmony_cistatic int parse_xch_frame(DCACoreDecoder *s) 840cabdff1aSopenharmony_ci{ 841cabdff1aSopenharmony_ci int ret; 842cabdff1aSopenharmony_ci 843cabdff1aSopenharmony_ci if (s->ch_mask & DCA_SPEAKER_MASK_Cs) { 844cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "XCH with Cs speaker already present\n"); 845cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 846cabdff1aSopenharmony_ci } 847cabdff1aSopenharmony_ci 848cabdff1aSopenharmony_ci if ((ret = parse_frame_data(s, HEADER_XCH, s->nchannels)) < 0) 849cabdff1aSopenharmony_ci return ret; 850cabdff1aSopenharmony_ci 851cabdff1aSopenharmony_ci // Seek to the end of core frame, don't trust XCH frame size 852cabdff1aSopenharmony_ci if (ff_dca_seek_bits(&s->gb, s->frame_size * 8)) { 853cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Read past end of XCH frame\n"); 854cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 855cabdff1aSopenharmony_ci } 856cabdff1aSopenharmony_ci 857cabdff1aSopenharmony_ci return 0; 858cabdff1aSopenharmony_ci} 859cabdff1aSopenharmony_ci 860cabdff1aSopenharmony_cistatic int parse_xxch_frame(DCACoreDecoder *s) 861cabdff1aSopenharmony_ci{ 862cabdff1aSopenharmony_ci int xxch_nchsets, xxch_frame_size; 863cabdff1aSopenharmony_ci int ret, mask, header_size, header_pos = get_bits_count(&s->gb); 864cabdff1aSopenharmony_ci 865cabdff1aSopenharmony_ci // XXCH sync word 866cabdff1aSopenharmony_ci if (get_bits_long(&s->gb, 32) != DCA_SYNCWORD_XXCH) { 867cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XXCH sync word\n"); 868cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 869cabdff1aSopenharmony_ci } 870cabdff1aSopenharmony_ci 871cabdff1aSopenharmony_ci // XXCH frame header length 872cabdff1aSopenharmony_ci header_size = get_bits(&s->gb, 6) + 1; 873cabdff1aSopenharmony_ci 874cabdff1aSopenharmony_ci // Check XXCH frame header CRC 875cabdff1aSopenharmony_ci if (ff_dca_check_crc(s->avctx, &s->gb, header_pos + 32, header_pos + header_size * 8)) { 876cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XXCH frame header checksum\n"); 877cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 878cabdff1aSopenharmony_ci } 879cabdff1aSopenharmony_ci 880cabdff1aSopenharmony_ci // CRC presence flag for channel set header 881cabdff1aSopenharmony_ci s->xxch_crc_present = get_bits1(&s->gb); 882cabdff1aSopenharmony_ci 883cabdff1aSopenharmony_ci // Number of bits for loudspeaker mask 884cabdff1aSopenharmony_ci s->xxch_mask_nbits = get_bits(&s->gb, 5) + 1; 885cabdff1aSopenharmony_ci if (s->xxch_mask_nbits <= DCA_SPEAKER_Cs) { 886cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid number of bits for XXCH speaker mask (%d)\n", s->xxch_mask_nbits); 887cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 888cabdff1aSopenharmony_ci } 889cabdff1aSopenharmony_ci 890cabdff1aSopenharmony_ci // Number of channel sets 891cabdff1aSopenharmony_ci xxch_nchsets = get_bits(&s->gb, 2) + 1; 892cabdff1aSopenharmony_ci if (xxch_nchsets > 1) { 893cabdff1aSopenharmony_ci avpriv_request_sample(s->avctx, "%d XXCH channel sets", xxch_nchsets); 894cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 895cabdff1aSopenharmony_ci } 896cabdff1aSopenharmony_ci 897cabdff1aSopenharmony_ci // Channel set 0 data byte size 898cabdff1aSopenharmony_ci xxch_frame_size = get_bits(&s->gb, 14) + 1; 899cabdff1aSopenharmony_ci 900cabdff1aSopenharmony_ci // Core loudspeaker activity mask 901cabdff1aSopenharmony_ci s->xxch_core_mask = get_bits_long(&s->gb, s->xxch_mask_nbits); 902cabdff1aSopenharmony_ci 903cabdff1aSopenharmony_ci // Validate the core mask 904cabdff1aSopenharmony_ci mask = s->ch_mask; 905cabdff1aSopenharmony_ci 906cabdff1aSopenharmony_ci if ((mask & DCA_SPEAKER_MASK_Ls) && (s->xxch_core_mask & DCA_SPEAKER_MASK_Lss)) 907cabdff1aSopenharmony_ci mask = (mask & ~DCA_SPEAKER_MASK_Ls) | DCA_SPEAKER_MASK_Lss; 908cabdff1aSopenharmony_ci 909cabdff1aSopenharmony_ci if ((mask & DCA_SPEAKER_MASK_Rs) && (s->xxch_core_mask & DCA_SPEAKER_MASK_Rss)) 910cabdff1aSopenharmony_ci mask = (mask & ~DCA_SPEAKER_MASK_Rs) | DCA_SPEAKER_MASK_Rss; 911cabdff1aSopenharmony_ci 912cabdff1aSopenharmony_ci if (mask != s->xxch_core_mask) { 913cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "XXCH core speaker activity mask (%#x) disagrees with core (%#x)\n", s->xxch_core_mask, mask); 914cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 915cabdff1aSopenharmony_ci } 916cabdff1aSopenharmony_ci 917cabdff1aSopenharmony_ci // Reserved 918cabdff1aSopenharmony_ci // Byte align 919cabdff1aSopenharmony_ci // CRC16 of XXCH frame header 920cabdff1aSopenharmony_ci if (ff_dca_seek_bits(&s->gb, header_pos + header_size * 8)) { 921cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Read past end of XXCH frame header\n"); 922cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 923cabdff1aSopenharmony_ci } 924cabdff1aSopenharmony_ci 925cabdff1aSopenharmony_ci // Parse XXCH channel set 0 926cabdff1aSopenharmony_ci if ((ret = parse_frame_data(s, HEADER_XXCH, s->nchannels)) < 0) 927cabdff1aSopenharmony_ci return ret; 928cabdff1aSopenharmony_ci 929cabdff1aSopenharmony_ci if (ff_dca_seek_bits(&s->gb, header_pos + header_size * 8 + xxch_frame_size * 8)) { 930cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Read past end of XXCH channel set\n"); 931cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 932cabdff1aSopenharmony_ci } 933cabdff1aSopenharmony_ci 934cabdff1aSopenharmony_ci return 0; 935cabdff1aSopenharmony_ci} 936cabdff1aSopenharmony_ci 937cabdff1aSopenharmony_cistatic int parse_xbr_subframe(DCACoreDecoder *s, int xbr_base_ch, int xbr_nchannels, 938cabdff1aSopenharmony_ci int *xbr_nsubbands, int xbr_transition_mode, int sf, int *sub_pos) 939cabdff1aSopenharmony_ci{ 940cabdff1aSopenharmony_ci int xbr_nabits[DCA_CHANNELS]; 941cabdff1aSopenharmony_ci int xbr_bit_allocation[DCA_CHANNELS][DCA_SUBBANDS]; 942cabdff1aSopenharmony_ci int xbr_scale_nbits[DCA_CHANNELS]; 943cabdff1aSopenharmony_ci int32_t xbr_scale_factors[DCA_CHANNELS][DCA_SUBBANDS][2]; 944cabdff1aSopenharmony_ci int ssf, ch, band, ofs; 945cabdff1aSopenharmony_ci 946cabdff1aSopenharmony_ci // Check number of subband samples in this subframe 947cabdff1aSopenharmony_ci if (*sub_pos + s->nsubsubframes[sf] * DCA_SUBBAND_SAMPLES > s->npcmblocks) { 948cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Subband sample buffer overflow\n"); 949cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 950cabdff1aSopenharmony_ci } 951cabdff1aSopenharmony_ci 952cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 0) 953cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 954cabdff1aSopenharmony_ci 955cabdff1aSopenharmony_ci // Number of bits for XBR bit allocation index 956cabdff1aSopenharmony_ci for (ch = xbr_base_ch; ch < xbr_nchannels; ch++) 957cabdff1aSopenharmony_ci xbr_nabits[ch] = get_bits(&s->gb, 2) + 2; 958cabdff1aSopenharmony_ci 959cabdff1aSopenharmony_ci // XBR bit allocation index 960cabdff1aSopenharmony_ci for (ch = xbr_base_ch; ch < xbr_nchannels; ch++) { 961cabdff1aSopenharmony_ci for (band = 0; band < xbr_nsubbands[ch]; band++) { 962cabdff1aSopenharmony_ci xbr_bit_allocation[ch][band] = get_bits(&s->gb, xbr_nabits[ch]); 963cabdff1aSopenharmony_ci if (xbr_bit_allocation[ch][band] > DCA_ABITS_MAX) { 964cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XBR bit allocation index\n"); 965cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 966cabdff1aSopenharmony_ci } 967cabdff1aSopenharmony_ci } 968cabdff1aSopenharmony_ci } 969cabdff1aSopenharmony_ci 970cabdff1aSopenharmony_ci // Number of bits for scale indices 971cabdff1aSopenharmony_ci for (ch = xbr_base_ch; ch < xbr_nchannels; ch++) { 972cabdff1aSopenharmony_ci xbr_scale_nbits[ch] = get_bits(&s->gb, 3); 973cabdff1aSopenharmony_ci if (!xbr_scale_nbits[ch]) { 974cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid number of bits for XBR scale factor index\n"); 975cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 976cabdff1aSopenharmony_ci } 977cabdff1aSopenharmony_ci } 978cabdff1aSopenharmony_ci 979cabdff1aSopenharmony_ci // XBR scale factors 980cabdff1aSopenharmony_ci for (ch = xbr_base_ch; ch < xbr_nchannels; ch++) { 981cabdff1aSopenharmony_ci const uint32_t *scale_table; 982cabdff1aSopenharmony_ci int scale_size; 983cabdff1aSopenharmony_ci 984cabdff1aSopenharmony_ci // Select the root square table 985cabdff1aSopenharmony_ci if (s->scale_factor_sel[ch] > 5) { 986cabdff1aSopenharmony_ci scale_table = ff_dca_scale_factor_quant7; 987cabdff1aSopenharmony_ci scale_size = FF_ARRAY_ELEMS(ff_dca_scale_factor_quant7); 988cabdff1aSopenharmony_ci } else { 989cabdff1aSopenharmony_ci scale_table = ff_dca_scale_factor_quant6; 990cabdff1aSopenharmony_ci scale_size = FF_ARRAY_ELEMS(ff_dca_scale_factor_quant6); 991cabdff1aSopenharmony_ci } 992cabdff1aSopenharmony_ci 993cabdff1aSopenharmony_ci // Parse scale factor indices and look up scale factors from the root 994cabdff1aSopenharmony_ci // square table 995cabdff1aSopenharmony_ci for (band = 0; band < xbr_nsubbands[ch]; band++) { 996cabdff1aSopenharmony_ci if (xbr_bit_allocation[ch][band]) { 997cabdff1aSopenharmony_ci int scale_index = get_bits(&s->gb, xbr_scale_nbits[ch]); 998cabdff1aSopenharmony_ci if (scale_index >= scale_size) { 999cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XBR scale factor index\n"); 1000cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1001cabdff1aSopenharmony_ci } 1002cabdff1aSopenharmony_ci xbr_scale_factors[ch][band][0] = scale_table[scale_index]; 1003cabdff1aSopenharmony_ci if (xbr_transition_mode && s->transition_mode[sf][ch][band]) { 1004cabdff1aSopenharmony_ci scale_index = get_bits(&s->gb, xbr_scale_nbits[ch]); 1005cabdff1aSopenharmony_ci if (scale_index >= scale_size) { 1006cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XBR scale factor index\n"); 1007cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1008cabdff1aSopenharmony_ci } 1009cabdff1aSopenharmony_ci xbr_scale_factors[ch][band][1] = scale_table[scale_index]; 1010cabdff1aSopenharmony_ci } 1011cabdff1aSopenharmony_ci } 1012cabdff1aSopenharmony_ci } 1013cabdff1aSopenharmony_ci } 1014cabdff1aSopenharmony_ci 1015cabdff1aSopenharmony_ci // Audio data 1016cabdff1aSopenharmony_ci for (ssf = 0, ofs = *sub_pos; ssf < s->nsubsubframes[sf]; ssf++) { 1017cabdff1aSopenharmony_ci for (ch = xbr_base_ch; ch < xbr_nchannels; ch++) { 1018cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 0) 1019cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1020cabdff1aSopenharmony_ci 1021cabdff1aSopenharmony_ci for (band = 0; band < xbr_nsubbands[ch]; band++) { 1022cabdff1aSopenharmony_ci int ret, trans_ssf, abits = xbr_bit_allocation[ch][band]; 1023cabdff1aSopenharmony_ci int32_t audio[DCA_SUBBAND_SAMPLES], step_size, scale; 1024cabdff1aSopenharmony_ci 1025cabdff1aSopenharmony_ci // Extract bits from the bit stream 1026cabdff1aSopenharmony_ci if (abits > 7) { 1027cabdff1aSopenharmony_ci // No further encoding 1028cabdff1aSopenharmony_ci get_array(&s->gb, audio, DCA_SUBBAND_SAMPLES, abits - 3); 1029cabdff1aSopenharmony_ci } else if (abits > 0) { 1030cabdff1aSopenharmony_ci // Block codes 1031cabdff1aSopenharmony_ci if ((ret = parse_block_codes(s, audio, abits)) < 0) 1032cabdff1aSopenharmony_ci return ret; 1033cabdff1aSopenharmony_ci } else { 1034cabdff1aSopenharmony_ci // No bits allocated 1035cabdff1aSopenharmony_ci continue; 1036cabdff1aSopenharmony_ci } 1037cabdff1aSopenharmony_ci 1038cabdff1aSopenharmony_ci // Look up quantization step size 1039cabdff1aSopenharmony_ci step_size = ff_dca_lossless_quant[abits]; 1040cabdff1aSopenharmony_ci 1041cabdff1aSopenharmony_ci // Identify transient location 1042cabdff1aSopenharmony_ci if (xbr_transition_mode) 1043cabdff1aSopenharmony_ci trans_ssf = s->transition_mode[sf][ch][band]; 1044cabdff1aSopenharmony_ci else 1045cabdff1aSopenharmony_ci trans_ssf = 0; 1046cabdff1aSopenharmony_ci 1047cabdff1aSopenharmony_ci // Determine proper scale factor 1048cabdff1aSopenharmony_ci if (trans_ssf == 0 || ssf < trans_ssf) 1049cabdff1aSopenharmony_ci scale = xbr_scale_factors[ch][band][0]; 1050cabdff1aSopenharmony_ci else 1051cabdff1aSopenharmony_ci scale = xbr_scale_factors[ch][band][1]; 1052cabdff1aSopenharmony_ci 1053cabdff1aSopenharmony_ci ff_dca_core_dequantize(s->subband_samples[ch][band] + ofs, 1054cabdff1aSopenharmony_ci audio, step_size, scale, 1, DCA_SUBBAND_SAMPLES); 1055cabdff1aSopenharmony_ci } 1056cabdff1aSopenharmony_ci } 1057cabdff1aSopenharmony_ci 1058cabdff1aSopenharmony_ci // DSYNC 1059cabdff1aSopenharmony_ci if ((ssf == s->nsubsubframes[sf] - 1 || s->sync_ssf) && get_bits(&s->gb, 16) != 0xffff) { 1060cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "XBR-DSYNC check failed\n"); 1061cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1062cabdff1aSopenharmony_ci } 1063cabdff1aSopenharmony_ci 1064cabdff1aSopenharmony_ci ofs += DCA_SUBBAND_SAMPLES; 1065cabdff1aSopenharmony_ci } 1066cabdff1aSopenharmony_ci 1067cabdff1aSopenharmony_ci // Advance subband sample pointer for the next subframe 1068cabdff1aSopenharmony_ci *sub_pos = ofs; 1069cabdff1aSopenharmony_ci return 0; 1070cabdff1aSopenharmony_ci} 1071cabdff1aSopenharmony_ci 1072cabdff1aSopenharmony_cistatic int parse_xbr_frame(DCACoreDecoder *s) 1073cabdff1aSopenharmony_ci{ 1074cabdff1aSopenharmony_ci int xbr_frame_size[DCA_EXSS_CHSETS_MAX]; 1075cabdff1aSopenharmony_ci int xbr_nchannels[DCA_EXSS_CHSETS_MAX]; 1076cabdff1aSopenharmony_ci int xbr_nsubbands[DCA_EXSS_CHSETS_MAX * DCA_EXSS_CHANNELS_MAX]; 1077cabdff1aSopenharmony_ci int xbr_nchsets, xbr_transition_mode, xbr_band_nbits, xbr_base_ch; 1078cabdff1aSopenharmony_ci int i, ch1, ch2, ret, header_size, header_pos = get_bits_count(&s->gb); 1079cabdff1aSopenharmony_ci 1080cabdff1aSopenharmony_ci // XBR sync word 1081cabdff1aSopenharmony_ci if (get_bits_long(&s->gb, 32) != DCA_SYNCWORD_XBR) { 1082cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XBR sync word\n"); 1083cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1084cabdff1aSopenharmony_ci } 1085cabdff1aSopenharmony_ci 1086cabdff1aSopenharmony_ci // XBR frame header length 1087cabdff1aSopenharmony_ci header_size = get_bits(&s->gb, 6) + 1; 1088cabdff1aSopenharmony_ci 1089cabdff1aSopenharmony_ci // Check XBR frame header CRC 1090cabdff1aSopenharmony_ci if (ff_dca_check_crc(s->avctx, &s->gb, header_pos + 32, header_pos + header_size * 8)) { 1091cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid XBR frame header checksum\n"); 1092cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1093cabdff1aSopenharmony_ci } 1094cabdff1aSopenharmony_ci 1095cabdff1aSopenharmony_ci // Number of channel sets 1096cabdff1aSopenharmony_ci xbr_nchsets = get_bits(&s->gb, 2) + 1; 1097cabdff1aSopenharmony_ci 1098cabdff1aSopenharmony_ci // Channel set data byte size 1099cabdff1aSopenharmony_ci for (i = 0; i < xbr_nchsets; i++) 1100cabdff1aSopenharmony_ci xbr_frame_size[i] = get_bits(&s->gb, 14) + 1; 1101cabdff1aSopenharmony_ci 1102cabdff1aSopenharmony_ci // Transition mode flag 1103cabdff1aSopenharmony_ci xbr_transition_mode = get_bits1(&s->gb); 1104cabdff1aSopenharmony_ci 1105cabdff1aSopenharmony_ci // Channel set headers 1106cabdff1aSopenharmony_ci for (i = 0, ch2 = 0; i < xbr_nchsets; i++) { 1107cabdff1aSopenharmony_ci xbr_nchannels[i] = get_bits(&s->gb, 3) + 1; 1108cabdff1aSopenharmony_ci xbr_band_nbits = get_bits(&s->gb, 2) + 5; 1109cabdff1aSopenharmony_ci for (ch1 = 0; ch1 < xbr_nchannels[i]; ch1++, ch2++) { 1110cabdff1aSopenharmony_ci xbr_nsubbands[ch2] = get_bits(&s->gb, xbr_band_nbits) + 1; 1111cabdff1aSopenharmony_ci if (xbr_nsubbands[ch2] > DCA_SUBBANDS) { 1112cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid number of active XBR subbands (%d)\n", xbr_nsubbands[ch2]); 1113cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1114cabdff1aSopenharmony_ci } 1115cabdff1aSopenharmony_ci } 1116cabdff1aSopenharmony_ci } 1117cabdff1aSopenharmony_ci 1118cabdff1aSopenharmony_ci // Reserved 1119cabdff1aSopenharmony_ci // Byte align 1120cabdff1aSopenharmony_ci // CRC16 of XBR frame header 1121cabdff1aSopenharmony_ci if (ff_dca_seek_bits(&s->gb, header_pos + header_size * 8)) { 1122cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Read past end of XBR frame header\n"); 1123cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1124cabdff1aSopenharmony_ci } 1125cabdff1aSopenharmony_ci 1126cabdff1aSopenharmony_ci // Channel set data 1127cabdff1aSopenharmony_ci for (i = 0, xbr_base_ch = 0; i < xbr_nchsets; i++) { 1128cabdff1aSopenharmony_ci header_pos = get_bits_count(&s->gb); 1129cabdff1aSopenharmony_ci 1130cabdff1aSopenharmony_ci if (xbr_base_ch + xbr_nchannels[i] <= s->nchannels) { 1131cabdff1aSopenharmony_ci int sf, sub_pos; 1132cabdff1aSopenharmony_ci 1133cabdff1aSopenharmony_ci for (sf = 0, sub_pos = 0; sf < s->nsubframes; sf++) { 1134cabdff1aSopenharmony_ci if ((ret = parse_xbr_subframe(s, xbr_base_ch, 1135cabdff1aSopenharmony_ci xbr_base_ch + xbr_nchannels[i], 1136cabdff1aSopenharmony_ci xbr_nsubbands, xbr_transition_mode, 1137cabdff1aSopenharmony_ci sf, &sub_pos)) < 0) 1138cabdff1aSopenharmony_ci return ret; 1139cabdff1aSopenharmony_ci } 1140cabdff1aSopenharmony_ci } 1141cabdff1aSopenharmony_ci 1142cabdff1aSopenharmony_ci xbr_base_ch += xbr_nchannels[i]; 1143cabdff1aSopenharmony_ci 1144cabdff1aSopenharmony_ci if (ff_dca_seek_bits(&s->gb, header_pos + xbr_frame_size[i] * 8)) { 1145cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Read past end of XBR channel set\n"); 1146cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1147cabdff1aSopenharmony_ci } 1148cabdff1aSopenharmony_ci } 1149cabdff1aSopenharmony_ci 1150cabdff1aSopenharmony_ci return 0; 1151cabdff1aSopenharmony_ci} 1152cabdff1aSopenharmony_ci 1153cabdff1aSopenharmony_ci// Modified ISO/IEC 9899 linear congruential generator 1154cabdff1aSopenharmony_ci// Returns pseudorandom integer in range [-2^30, 2^30 - 1] 1155cabdff1aSopenharmony_cistatic int rand_x96(DCACoreDecoder *s) 1156cabdff1aSopenharmony_ci{ 1157cabdff1aSopenharmony_ci s->x96_rand = 1103515245U * s->x96_rand + 12345U; 1158cabdff1aSopenharmony_ci return (s->x96_rand & 0x7fffffff) - 0x40000000; 1159cabdff1aSopenharmony_ci} 1160cabdff1aSopenharmony_ci 1161cabdff1aSopenharmony_cistatic int parse_x96_subframe_audio(DCACoreDecoder *s, int sf, int xch_base, int *sub_pos) 1162cabdff1aSopenharmony_ci{ 1163cabdff1aSopenharmony_ci int n, ssf, ch, band, ofs; 1164cabdff1aSopenharmony_ci 1165cabdff1aSopenharmony_ci // Check number of subband samples in this subframe 1166cabdff1aSopenharmony_ci int nsamples = s->nsubsubframes[sf] * DCA_SUBBAND_SAMPLES; 1167cabdff1aSopenharmony_ci if (*sub_pos + nsamples > s->npcmblocks) { 1168cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Subband sample buffer overflow\n"); 1169cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1170cabdff1aSopenharmony_ci } 1171cabdff1aSopenharmony_ci 1172cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 0) 1173cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1174cabdff1aSopenharmony_ci 1175cabdff1aSopenharmony_ci // VQ encoded or unallocated subbands 1176cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->x96_nchannels; ch++) { 1177cabdff1aSopenharmony_ci for (band = s->x96_subband_start; band < s->nsubbands[ch]; band++) { 1178cabdff1aSopenharmony_ci // Get the sample pointer and scale factor 1179cabdff1aSopenharmony_ci int32_t *samples = s->x96_subband_samples[ch][band] + *sub_pos; 1180cabdff1aSopenharmony_ci int32_t scale = s->scale_factors[ch][band >> 1][band & 1]; 1181cabdff1aSopenharmony_ci 1182cabdff1aSopenharmony_ci switch (s->bit_allocation[ch][band]) { 1183cabdff1aSopenharmony_ci case 0: // No bits allocated for subband 1184cabdff1aSopenharmony_ci if (scale <= 1) 1185cabdff1aSopenharmony_ci memset(samples, 0, nsamples * sizeof(int32_t)); 1186cabdff1aSopenharmony_ci else for (n = 0; n < nsamples; n++) 1187cabdff1aSopenharmony_ci // Generate scaled random samples 1188cabdff1aSopenharmony_ci samples[n] = mul31(rand_x96(s), scale); 1189cabdff1aSopenharmony_ci break; 1190cabdff1aSopenharmony_ci 1191cabdff1aSopenharmony_ci case 1: // VQ encoded subband 1192cabdff1aSopenharmony_ci for (ssf = 0; ssf < (s->nsubsubframes[sf] + 1) / 2; ssf++) { 1193cabdff1aSopenharmony_ci // Extract the VQ address from the bit stream and look up 1194cabdff1aSopenharmony_ci // the VQ code book for up to 16 subband samples 1195cabdff1aSopenharmony_ci const int8_t *vq_samples = ff_dca_high_freq_vq[get_bits(&s->gb, 10)]; 1196cabdff1aSopenharmony_ci // Scale and take the samples 1197cabdff1aSopenharmony_ci for (n = 0; n < FFMIN(nsamples - ssf * 16, 16); n++) 1198cabdff1aSopenharmony_ci *samples++ = clip23(vq_samples[n] * scale + (1 << 3) >> 4); 1199cabdff1aSopenharmony_ci } 1200cabdff1aSopenharmony_ci break; 1201cabdff1aSopenharmony_ci } 1202cabdff1aSopenharmony_ci } 1203cabdff1aSopenharmony_ci } 1204cabdff1aSopenharmony_ci 1205cabdff1aSopenharmony_ci // Audio data 1206cabdff1aSopenharmony_ci for (ssf = 0, ofs = *sub_pos; ssf < s->nsubsubframes[sf]; ssf++) { 1207cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->x96_nchannels; ch++) { 1208cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 0) 1209cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1210cabdff1aSopenharmony_ci 1211cabdff1aSopenharmony_ci for (band = s->x96_subband_start; band < s->nsubbands[ch]; band++) { 1212cabdff1aSopenharmony_ci int ret, abits = s->bit_allocation[ch][band] - 1; 1213cabdff1aSopenharmony_ci int32_t audio[DCA_SUBBAND_SAMPLES], step_size, scale; 1214cabdff1aSopenharmony_ci 1215cabdff1aSopenharmony_ci // Not VQ encoded or unallocated subbands 1216cabdff1aSopenharmony_ci if (abits < 1) 1217cabdff1aSopenharmony_ci continue; 1218cabdff1aSopenharmony_ci 1219cabdff1aSopenharmony_ci // Extract bits from the bit stream 1220cabdff1aSopenharmony_ci if ((ret = extract_audio(s, audio, abits, ch)) < 0) 1221cabdff1aSopenharmony_ci return ret; 1222cabdff1aSopenharmony_ci 1223cabdff1aSopenharmony_ci // Select quantization step size table and look up quantization 1224cabdff1aSopenharmony_ci // step size 1225cabdff1aSopenharmony_ci if (s->bit_rate == 3) 1226cabdff1aSopenharmony_ci step_size = ff_dca_lossless_quant[abits]; 1227cabdff1aSopenharmony_ci else 1228cabdff1aSopenharmony_ci step_size = ff_dca_lossy_quant[abits]; 1229cabdff1aSopenharmony_ci 1230cabdff1aSopenharmony_ci // Get the scale factor 1231cabdff1aSopenharmony_ci scale = s->scale_factors[ch][band >> 1][band & 1]; 1232cabdff1aSopenharmony_ci 1233cabdff1aSopenharmony_ci ff_dca_core_dequantize(s->x96_subband_samples[ch][band] + ofs, 1234cabdff1aSopenharmony_ci audio, step_size, scale, 0, DCA_SUBBAND_SAMPLES); 1235cabdff1aSopenharmony_ci } 1236cabdff1aSopenharmony_ci } 1237cabdff1aSopenharmony_ci 1238cabdff1aSopenharmony_ci // DSYNC 1239cabdff1aSopenharmony_ci if ((ssf == s->nsubsubframes[sf] - 1 || s->sync_ssf) && get_bits(&s->gb, 16) != 0xffff) { 1240cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "X96-DSYNC check failed\n"); 1241cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1242cabdff1aSopenharmony_ci } 1243cabdff1aSopenharmony_ci 1244cabdff1aSopenharmony_ci ofs += DCA_SUBBAND_SAMPLES; 1245cabdff1aSopenharmony_ci } 1246cabdff1aSopenharmony_ci 1247cabdff1aSopenharmony_ci // Inverse ADPCM 1248cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->x96_nchannels; ch++) { 1249cabdff1aSopenharmony_ci inverse_adpcm(s->x96_subband_samples[ch], s->prediction_vq_index[ch], 1250cabdff1aSopenharmony_ci s->prediction_mode[ch], s->x96_subband_start, s->nsubbands[ch], 1251cabdff1aSopenharmony_ci *sub_pos, nsamples); 1252cabdff1aSopenharmony_ci } 1253cabdff1aSopenharmony_ci 1254cabdff1aSopenharmony_ci // Joint subband coding 1255cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->x96_nchannels; ch++) { 1256cabdff1aSopenharmony_ci int src_ch = s->joint_intensity_index[ch] - 1; 1257cabdff1aSopenharmony_ci if (src_ch >= 0) { 1258cabdff1aSopenharmony_ci s->dcadsp->decode_joint(s->x96_subband_samples[ch], s->x96_subband_samples[src_ch], 1259cabdff1aSopenharmony_ci s->joint_scale_factors[ch], s->nsubbands[ch], 1260cabdff1aSopenharmony_ci s->nsubbands[src_ch], *sub_pos, nsamples); 1261cabdff1aSopenharmony_ci } 1262cabdff1aSopenharmony_ci } 1263cabdff1aSopenharmony_ci 1264cabdff1aSopenharmony_ci // Advance subband sample pointer for the next subframe 1265cabdff1aSopenharmony_ci *sub_pos = ofs; 1266cabdff1aSopenharmony_ci return 0; 1267cabdff1aSopenharmony_ci} 1268cabdff1aSopenharmony_ci 1269cabdff1aSopenharmony_cistatic void erase_x96_adpcm_history(DCACoreDecoder *s) 1270cabdff1aSopenharmony_ci{ 1271cabdff1aSopenharmony_ci int ch, band; 1272cabdff1aSopenharmony_ci 1273cabdff1aSopenharmony_ci // Erase ADPCM history from previous frame if 1274cabdff1aSopenharmony_ci // predictor history switch was disabled 1275cabdff1aSopenharmony_ci for (ch = 0; ch < DCA_CHANNELS; ch++) 1276cabdff1aSopenharmony_ci for (band = 0; band < DCA_SUBBANDS_X96; band++) 1277cabdff1aSopenharmony_ci AV_ZERO128(s->x96_subband_samples[ch][band] - DCA_ADPCM_COEFFS); 1278cabdff1aSopenharmony_ci 1279cabdff1aSopenharmony_ci emms_c(); 1280cabdff1aSopenharmony_ci} 1281cabdff1aSopenharmony_ci 1282cabdff1aSopenharmony_cistatic int alloc_x96_sample_buffer(DCACoreDecoder *s) 1283cabdff1aSopenharmony_ci{ 1284cabdff1aSopenharmony_ci int nchsamples = DCA_ADPCM_COEFFS + s->npcmblocks; 1285cabdff1aSopenharmony_ci int nframesamples = nchsamples * DCA_CHANNELS * DCA_SUBBANDS_X96; 1286cabdff1aSopenharmony_ci unsigned int size = s->x96_subband_size; 1287cabdff1aSopenharmony_ci int ch, band; 1288cabdff1aSopenharmony_ci 1289cabdff1aSopenharmony_ci // Reallocate subband sample buffer 1290cabdff1aSopenharmony_ci av_fast_mallocz(&s->x96_subband_buffer, &s->x96_subband_size, 1291cabdff1aSopenharmony_ci nframesamples * sizeof(int32_t)); 1292cabdff1aSopenharmony_ci if (!s->x96_subband_buffer) 1293cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 1294cabdff1aSopenharmony_ci 1295cabdff1aSopenharmony_ci if (size != s->x96_subband_size) { 1296cabdff1aSopenharmony_ci for (ch = 0; ch < DCA_CHANNELS; ch++) 1297cabdff1aSopenharmony_ci for (band = 0; band < DCA_SUBBANDS_X96; band++) 1298cabdff1aSopenharmony_ci s->x96_subband_samples[ch][band] = s->x96_subband_buffer + 1299cabdff1aSopenharmony_ci (ch * DCA_SUBBANDS_X96 + band) * nchsamples + DCA_ADPCM_COEFFS; 1300cabdff1aSopenharmony_ci } 1301cabdff1aSopenharmony_ci 1302cabdff1aSopenharmony_ci if (!s->predictor_history) 1303cabdff1aSopenharmony_ci erase_x96_adpcm_history(s); 1304cabdff1aSopenharmony_ci 1305cabdff1aSopenharmony_ci return 0; 1306cabdff1aSopenharmony_ci} 1307cabdff1aSopenharmony_ci 1308cabdff1aSopenharmony_cistatic int parse_x96_subframe_header(DCACoreDecoder *s, int xch_base) 1309cabdff1aSopenharmony_ci{ 1310cabdff1aSopenharmony_ci int ch, band, ret; 1311cabdff1aSopenharmony_ci 1312cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 0) 1313cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1314cabdff1aSopenharmony_ci 1315cabdff1aSopenharmony_ci // Prediction mode 1316cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->x96_nchannels; ch++) 1317cabdff1aSopenharmony_ci for (band = s->x96_subband_start; band < s->nsubbands[ch]; band++) 1318cabdff1aSopenharmony_ci s->prediction_mode[ch][band] = get_bits1(&s->gb); 1319cabdff1aSopenharmony_ci 1320cabdff1aSopenharmony_ci // Prediction coefficients VQ address 1321cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->x96_nchannels; ch++) 1322cabdff1aSopenharmony_ci for (band = s->x96_subband_start; band < s->nsubbands[ch]; band++) 1323cabdff1aSopenharmony_ci if (s->prediction_mode[ch][band]) 1324cabdff1aSopenharmony_ci s->prediction_vq_index[ch][band] = get_bits(&s->gb, 12); 1325cabdff1aSopenharmony_ci 1326cabdff1aSopenharmony_ci // Bit allocation index 1327cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->x96_nchannels; ch++) { 1328cabdff1aSopenharmony_ci int sel = s->bit_allocation_sel[ch]; 1329cabdff1aSopenharmony_ci int abits = 0; 1330cabdff1aSopenharmony_ci 1331cabdff1aSopenharmony_ci for (band = s->x96_subband_start; band < s->nsubbands[ch]; band++) { 1332cabdff1aSopenharmony_ci // If Huffman code was used, the difference of abits was encoded 1333cabdff1aSopenharmony_ci if (sel < 7) 1334cabdff1aSopenharmony_ci abits += dca_get_vlc(&s->gb, &ff_dca_vlc_quant_index[5 + 2 * s->x96_high_res], sel); 1335cabdff1aSopenharmony_ci else 1336cabdff1aSopenharmony_ci abits = get_bits(&s->gb, 3 + s->x96_high_res); 1337cabdff1aSopenharmony_ci 1338cabdff1aSopenharmony_ci if (abits < 0 || abits > 7 + 8 * s->x96_high_res) { 1339cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 bit allocation index\n"); 1340cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1341cabdff1aSopenharmony_ci } 1342cabdff1aSopenharmony_ci 1343cabdff1aSopenharmony_ci s->bit_allocation[ch][band] = abits; 1344cabdff1aSopenharmony_ci } 1345cabdff1aSopenharmony_ci } 1346cabdff1aSopenharmony_ci 1347cabdff1aSopenharmony_ci // Scale factors 1348cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->x96_nchannels; ch++) { 1349cabdff1aSopenharmony_ci int sel = s->scale_factor_sel[ch]; 1350cabdff1aSopenharmony_ci int scale_index = 0; 1351cabdff1aSopenharmony_ci 1352cabdff1aSopenharmony_ci // Extract scales for subbands which are transmitted even for 1353cabdff1aSopenharmony_ci // unallocated subbands 1354cabdff1aSopenharmony_ci for (band = s->x96_subband_start; band < s->nsubbands[ch]; band++) { 1355cabdff1aSopenharmony_ci if ((ret = parse_scale(s, &scale_index, sel)) < 0) 1356cabdff1aSopenharmony_ci return ret; 1357cabdff1aSopenharmony_ci s->scale_factors[ch][band >> 1][band & 1] = ret; 1358cabdff1aSopenharmony_ci } 1359cabdff1aSopenharmony_ci } 1360cabdff1aSopenharmony_ci 1361cabdff1aSopenharmony_ci // Joint subband codebook select 1362cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->x96_nchannels; ch++) { 1363cabdff1aSopenharmony_ci if (s->joint_intensity_index[ch]) { 1364cabdff1aSopenharmony_ci s->joint_scale_sel[ch] = get_bits(&s->gb, 3); 1365cabdff1aSopenharmony_ci if (s->joint_scale_sel[ch] == 7) { 1366cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 joint scale factor code book\n"); 1367cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1368cabdff1aSopenharmony_ci } 1369cabdff1aSopenharmony_ci } 1370cabdff1aSopenharmony_ci } 1371cabdff1aSopenharmony_ci 1372cabdff1aSopenharmony_ci // Scale factors for joint subband coding 1373cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->x96_nchannels; ch++) { 1374cabdff1aSopenharmony_ci int src_ch = s->joint_intensity_index[ch] - 1; 1375cabdff1aSopenharmony_ci if (src_ch >= 0) { 1376cabdff1aSopenharmony_ci int sel = s->joint_scale_sel[ch]; 1377cabdff1aSopenharmony_ci for (band = s->nsubbands[ch]; band < s->nsubbands[src_ch]; band++) { 1378cabdff1aSopenharmony_ci if ((ret = parse_joint_scale(s, sel)) < 0) 1379cabdff1aSopenharmony_ci return ret; 1380cabdff1aSopenharmony_ci s->joint_scale_factors[ch][band] = ret; 1381cabdff1aSopenharmony_ci } 1382cabdff1aSopenharmony_ci } 1383cabdff1aSopenharmony_ci } 1384cabdff1aSopenharmony_ci 1385cabdff1aSopenharmony_ci // Side information CRC check word 1386cabdff1aSopenharmony_ci if (s->crc_present) 1387cabdff1aSopenharmony_ci skip_bits(&s->gb, 16); 1388cabdff1aSopenharmony_ci 1389cabdff1aSopenharmony_ci return 0; 1390cabdff1aSopenharmony_ci} 1391cabdff1aSopenharmony_ci 1392cabdff1aSopenharmony_cistatic int parse_x96_coding_header(DCACoreDecoder *s, int exss, int xch_base) 1393cabdff1aSopenharmony_ci{ 1394cabdff1aSopenharmony_ci int n, ch, header_size = 0, header_pos = get_bits_count(&s->gb); 1395cabdff1aSopenharmony_ci 1396cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 0) 1397cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1398cabdff1aSopenharmony_ci 1399cabdff1aSopenharmony_ci if (exss) { 1400cabdff1aSopenharmony_ci // Channel set header length 1401cabdff1aSopenharmony_ci header_size = get_bits(&s->gb, 7) + 1; 1402cabdff1aSopenharmony_ci 1403cabdff1aSopenharmony_ci // Check CRC 1404cabdff1aSopenharmony_ci if (s->x96_crc_present 1405cabdff1aSopenharmony_ci && ff_dca_check_crc(s->avctx, &s->gb, header_pos, header_pos + header_size * 8)) { 1406cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 channel set header checksum\n"); 1407cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1408cabdff1aSopenharmony_ci } 1409cabdff1aSopenharmony_ci } 1410cabdff1aSopenharmony_ci 1411cabdff1aSopenharmony_ci // High resolution flag 1412cabdff1aSopenharmony_ci s->x96_high_res = get_bits1(&s->gb); 1413cabdff1aSopenharmony_ci 1414cabdff1aSopenharmony_ci // First encoded subband 1415cabdff1aSopenharmony_ci if (s->x96_rev_no < 8) { 1416cabdff1aSopenharmony_ci s->x96_subband_start = get_bits(&s->gb, 5); 1417cabdff1aSopenharmony_ci if (s->x96_subband_start > 27) { 1418cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 subband start index (%d)\n", s->x96_subband_start); 1419cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1420cabdff1aSopenharmony_ci } 1421cabdff1aSopenharmony_ci } else { 1422cabdff1aSopenharmony_ci s->x96_subband_start = DCA_SUBBANDS; 1423cabdff1aSopenharmony_ci } 1424cabdff1aSopenharmony_ci 1425cabdff1aSopenharmony_ci // Subband activity count 1426cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->x96_nchannels; ch++) { 1427cabdff1aSopenharmony_ci s->nsubbands[ch] = get_bits(&s->gb, 6) + 1; 1428cabdff1aSopenharmony_ci if (s->nsubbands[ch] < DCA_SUBBANDS) { 1429cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 subband activity count (%d)\n", s->nsubbands[ch]); 1430cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1431cabdff1aSopenharmony_ci } 1432cabdff1aSopenharmony_ci } 1433cabdff1aSopenharmony_ci 1434cabdff1aSopenharmony_ci // Joint intensity coding index 1435cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->x96_nchannels; ch++) { 1436cabdff1aSopenharmony_ci if ((n = get_bits(&s->gb, 3)) && xch_base) 1437cabdff1aSopenharmony_ci n += xch_base - 1; 1438cabdff1aSopenharmony_ci if (n > s->x96_nchannels) { 1439cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 joint intensity coding index\n"); 1440cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1441cabdff1aSopenharmony_ci } 1442cabdff1aSopenharmony_ci s->joint_intensity_index[ch] = n; 1443cabdff1aSopenharmony_ci } 1444cabdff1aSopenharmony_ci 1445cabdff1aSopenharmony_ci // Scale factor code book 1446cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->x96_nchannels; ch++) { 1447cabdff1aSopenharmony_ci s->scale_factor_sel[ch] = get_bits(&s->gb, 3); 1448cabdff1aSopenharmony_ci if (s->scale_factor_sel[ch] >= 6) { 1449cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 scale factor code book\n"); 1450cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1451cabdff1aSopenharmony_ci } 1452cabdff1aSopenharmony_ci } 1453cabdff1aSopenharmony_ci 1454cabdff1aSopenharmony_ci // Bit allocation quantizer select 1455cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->x96_nchannels; ch++) 1456cabdff1aSopenharmony_ci s->bit_allocation_sel[ch] = get_bits(&s->gb, 3); 1457cabdff1aSopenharmony_ci 1458cabdff1aSopenharmony_ci // Quantization index codebook select 1459cabdff1aSopenharmony_ci for (n = 0; n < 6 + 4 * s->x96_high_res; n++) 1460cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->x96_nchannels; ch++) 1461cabdff1aSopenharmony_ci s->quant_index_sel[ch][n] = get_bits(&s->gb, ff_dca_quant_index_sel_nbits[n]); 1462cabdff1aSopenharmony_ci 1463cabdff1aSopenharmony_ci if (exss) { 1464cabdff1aSopenharmony_ci // Reserved 1465cabdff1aSopenharmony_ci // Byte align 1466cabdff1aSopenharmony_ci // CRC16 of channel set header 1467cabdff1aSopenharmony_ci if (ff_dca_seek_bits(&s->gb, header_pos + header_size * 8)) { 1468cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Read past end of X96 channel set header\n"); 1469cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1470cabdff1aSopenharmony_ci } 1471cabdff1aSopenharmony_ci } else { 1472cabdff1aSopenharmony_ci if (s->crc_present) 1473cabdff1aSopenharmony_ci skip_bits(&s->gb, 16); 1474cabdff1aSopenharmony_ci } 1475cabdff1aSopenharmony_ci 1476cabdff1aSopenharmony_ci return 0; 1477cabdff1aSopenharmony_ci} 1478cabdff1aSopenharmony_ci 1479cabdff1aSopenharmony_cistatic int parse_x96_frame_data(DCACoreDecoder *s, int exss, int xch_base) 1480cabdff1aSopenharmony_ci{ 1481cabdff1aSopenharmony_ci int sf, ch, ret, band, sub_pos; 1482cabdff1aSopenharmony_ci 1483cabdff1aSopenharmony_ci if ((ret = parse_x96_coding_header(s, exss, xch_base)) < 0) 1484cabdff1aSopenharmony_ci return ret; 1485cabdff1aSopenharmony_ci 1486cabdff1aSopenharmony_ci for (sf = 0, sub_pos = 0; sf < s->nsubframes; sf++) { 1487cabdff1aSopenharmony_ci if ((ret = parse_x96_subframe_header(s, xch_base)) < 0) 1488cabdff1aSopenharmony_ci return ret; 1489cabdff1aSopenharmony_ci if ((ret = parse_x96_subframe_audio(s, sf, xch_base, &sub_pos)) < 0) 1490cabdff1aSopenharmony_ci return ret; 1491cabdff1aSopenharmony_ci } 1492cabdff1aSopenharmony_ci 1493cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->x96_nchannels; ch++) { 1494cabdff1aSopenharmony_ci // Determine number of active subbands for this channel 1495cabdff1aSopenharmony_ci int nsubbands = s->nsubbands[ch]; 1496cabdff1aSopenharmony_ci if (s->joint_intensity_index[ch]) 1497cabdff1aSopenharmony_ci nsubbands = FFMAX(nsubbands, s->nsubbands[s->joint_intensity_index[ch] - 1]); 1498cabdff1aSopenharmony_ci 1499cabdff1aSopenharmony_ci // Update history for ADPCM and clear inactive subbands 1500cabdff1aSopenharmony_ci for (band = 0; band < DCA_SUBBANDS_X96; band++) { 1501cabdff1aSopenharmony_ci int32_t *samples = s->x96_subband_samples[ch][band] - DCA_ADPCM_COEFFS; 1502cabdff1aSopenharmony_ci if (band >= s->x96_subband_start && band < nsubbands) 1503cabdff1aSopenharmony_ci AV_COPY128(samples, samples + s->npcmblocks); 1504cabdff1aSopenharmony_ci else 1505cabdff1aSopenharmony_ci memset(samples, 0, (DCA_ADPCM_COEFFS + s->npcmblocks) * sizeof(int32_t)); 1506cabdff1aSopenharmony_ci } 1507cabdff1aSopenharmony_ci } 1508cabdff1aSopenharmony_ci 1509cabdff1aSopenharmony_ci emms_c(); 1510cabdff1aSopenharmony_ci 1511cabdff1aSopenharmony_ci return 0; 1512cabdff1aSopenharmony_ci} 1513cabdff1aSopenharmony_ci 1514cabdff1aSopenharmony_cistatic int parse_x96_frame(DCACoreDecoder *s) 1515cabdff1aSopenharmony_ci{ 1516cabdff1aSopenharmony_ci int ret; 1517cabdff1aSopenharmony_ci 1518cabdff1aSopenharmony_ci // Revision number 1519cabdff1aSopenharmony_ci s->x96_rev_no = get_bits(&s->gb, 4); 1520cabdff1aSopenharmony_ci if (s->x96_rev_no < 1 || s->x96_rev_no > 8) { 1521cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 revision (%d)\n", s->x96_rev_no); 1522cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1523cabdff1aSopenharmony_ci } 1524cabdff1aSopenharmony_ci 1525cabdff1aSopenharmony_ci s->x96_crc_present = 0; 1526cabdff1aSopenharmony_ci s->x96_nchannels = s->nchannels; 1527cabdff1aSopenharmony_ci 1528cabdff1aSopenharmony_ci if ((ret = alloc_x96_sample_buffer(s)) < 0) 1529cabdff1aSopenharmony_ci return ret; 1530cabdff1aSopenharmony_ci 1531cabdff1aSopenharmony_ci if ((ret = parse_x96_frame_data(s, 0, 0)) < 0) 1532cabdff1aSopenharmony_ci return ret; 1533cabdff1aSopenharmony_ci 1534cabdff1aSopenharmony_ci // Seek to the end of core frame 1535cabdff1aSopenharmony_ci if (ff_dca_seek_bits(&s->gb, s->frame_size * 8)) { 1536cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Read past end of X96 frame\n"); 1537cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1538cabdff1aSopenharmony_ci } 1539cabdff1aSopenharmony_ci 1540cabdff1aSopenharmony_ci return 0; 1541cabdff1aSopenharmony_ci} 1542cabdff1aSopenharmony_ci 1543cabdff1aSopenharmony_cistatic int parse_x96_frame_exss(DCACoreDecoder *s) 1544cabdff1aSopenharmony_ci{ 1545cabdff1aSopenharmony_ci int x96_frame_size[DCA_EXSS_CHSETS_MAX]; 1546cabdff1aSopenharmony_ci int x96_nchannels[DCA_EXSS_CHSETS_MAX]; 1547cabdff1aSopenharmony_ci int x96_nchsets, x96_base_ch; 1548cabdff1aSopenharmony_ci int i, ret, header_size, header_pos = get_bits_count(&s->gb); 1549cabdff1aSopenharmony_ci 1550cabdff1aSopenharmony_ci // X96 sync word 1551cabdff1aSopenharmony_ci if (get_bits_long(&s->gb, 32) != DCA_SYNCWORD_X96) { 1552cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 sync word\n"); 1553cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1554cabdff1aSopenharmony_ci } 1555cabdff1aSopenharmony_ci 1556cabdff1aSopenharmony_ci // X96 frame header length 1557cabdff1aSopenharmony_ci header_size = get_bits(&s->gb, 6) + 1; 1558cabdff1aSopenharmony_ci 1559cabdff1aSopenharmony_ci // Check X96 frame header CRC 1560cabdff1aSopenharmony_ci if (ff_dca_check_crc(s->avctx, &s->gb, header_pos + 32, header_pos + header_size * 8)) { 1561cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 frame header checksum\n"); 1562cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1563cabdff1aSopenharmony_ci } 1564cabdff1aSopenharmony_ci 1565cabdff1aSopenharmony_ci // Revision number 1566cabdff1aSopenharmony_ci s->x96_rev_no = get_bits(&s->gb, 4); 1567cabdff1aSopenharmony_ci if (s->x96_rev_no < 1 || s->x96_rev_no > 8) { 1568cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid X96 revision (%d)\n", s->x96_rev_no); 1569cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1570cabdff1aSopenharmony_ci } 1571cabdff1aSopenharmony_ci 1572cabdff1aSopenharmony_ci // CRC presence flag for channel set header 1573cabdff1aSopenharmony_ci s->x96_crc_present = get_bits1(&s->gb); 1574cabdff1aSopenharmony_ci 1575cabdff1aSopenharmony_ci // Number of channel sets 1576cabdff1aSopenharmony_ci x96_nchsets = get_bits(&s->gb, 2) + 1; 1577cabdff1aSopenharmony_ci 1578cabdff1aSopenharmony_ci // Channel set data byte size 1579cabdff1aSopenharmony_ci for (i = 0; i < x96_nchsets; i++) 1580cabdff1aSopenharmony_ci x96_frame_size[i] = get_bits(&s->gb, 12) + 1; 1581cabdff1aSopenharmony_ci 1582cabdff1aSopenharmony_ci // Number of channels in channel set 1583cabdff1aSopenharmony_ci for (i = 0; i < x96_nchsets; i++) 1584cabdff1aSopenharmony_ci x96_nchannels[i] = get_bits(&s->gb, 3) + 1; 1585cabdff1aSopenharmony_ci 1586cabdff1aSopenharmony_ci // Reserved 1587cabdff1aSopenharmony_ci // Byte align 1588cabdff1aSopenharmony_ci // CRC16 of X96 frame header 1589cabdff1aSopenharmony_ci if (ff_dca_seek_bits(&s->gb, header_pos + header_size * 8)) { 1590cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Read past end of X96 frame header\n"); 1591cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1592cabdff1aSopenharmony_ci } 1593cabdff1aSopenharmony_ci 1594cabdff1aSopenharmony_ci if ((ret = alloc_x96_sample_buffer(s)) < 0) 1595cabdff1aSopenharmony_ci return ret; 1596cabdff1aSopenharmony_ci 1597cabdff1aSopenharmony_ci // Channel set data 1598cabdff1aSopenharmony_ci s->x96_nchannels = 0; 1599cabdff1aSopenharmony_ci for (i = 0, x96_base_ch = 0; i < x96_nchsets; i++) { 1600cabdff1aSopenharmony_ci header_pos = get_bits_count(&s->gb); 1601cabdff1aSopenharmony_ci 1602cabdff1aSopenharmony_ci if (x96_base_ch + x96_nchannels[i] <= s->nchannels) { 1603cabdff1aSopenharmony_ci s->x96_nchannels = x96_base_ch + x96_nchannels[i]; 1604cabdff1aSopenharmony_ci if ((ret = parse_x96_frame_data(s, 1, x96_base_ch)) < 0) 1605cabdff1aSopenharmony_ci return ret; 1606cabdff1aSopenharmony_ci } 1607cabdff1aSopenharmony_ci 1608cabdff1aSopenharmony_ci x96_base_ch += x96_nchannels[i]; 1609cabdff1aSopenharmony_ci 1610cabdff1aSopenharmony_ci if (ff_dca_seek_bits(&s->gb, header_pos + x96_frame_size[i] * 8)) { 1611cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Read past end of X96 channel set\n"); 1612cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1613cabdff1aSopenharmony_ci } 1614cabdff1aSopenharmony_ci } 1615cabdff1aSopenharmony_ci 1616cabdff1aSopenharmony_ci return 0; 1617cabdff1aSopenharmony_ci} 1618cabdff1aSopenharmony_ci 1619cabdff1aSopenharmony_cistatic int parse_aux_data(DCACoreDecoder *s) 1620cabdff1aSopenharmony_ci{ 1621cabdff1aSopenharmony_ci int aux_pos; 1622cabdff1aSopenharmony_ci 1623cabdff1aSopenharmony_ci if (get_bits_left(&s->gb) < 0) 1624cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1625cabdff1aSopenharmony_ci 1626cabdff1aSopenharmony_ci // Auxiliary data byte count (can't be trusted) 1627cabdff1aSopenharmony_ci skip_bits(&s->gb, 6); 1628cabdff1aSopenharmony_ci 1629cabdff1aSopenharmony_ci // 4-byte align 1630cabdff1aSopenharmony_ci skip_bits_long(&s->gb, -get_bits_count(&s->gb) & 31); 1631cabdff1aSopenharmony_ci 1632cabdff1aSopenharmony_ci // Auxiliary data sync word 1633cabdff1aSopenharmony_ci if (get_bits_long(&s->gb, 32) != DCA_SYNCWORD_REV1AUX) { 1634cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid auxiliary data sync word\n"); 1635cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1636cabdff1aSopenharmony_ci } 1637cabdff1aSopenharmony_ci 1638cabdff1aSopenharmony_ci aux_pos = get_bits_count(&s->gb); 1639cabdff1aSopenharmony_ci 1640cabdff1aSopenharmony_ci // Auxiliary decode time stamp flag 1641cabdff1aSopenharmony_ci if (get_bits1(&s->gb)) 1642cabdff1aSopenharmony_ci skip_bits_long(&s->gb, 47); 1643cabdff1aSopenharmony_ci 1644cabdff1aSopenharmony_ci // Auxiliary dynamic downmix flag 1645cabdff1aSopenharmony_ci if (s->prim_dmix_embedded = get_bits1(&s->gb)) { 1646cabdff1aSopenharmony_ci int i, m, n; 1647cabdff1aSopenharmony_ci 1648cabdff1aSopenharmony_ci // Auxiliary primary channel downmix type 1649cabdff1aSopenharmony_ci s->prim_dmix_type = get_bits(&s->gb, 3); 1650cabdff1aSopenharmony_ci if (s->prim_dmix_type >= DCA_DMIX_TYPE_COUNT) { 1651cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid primary channel set downmix type\n"); 1652cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1653cabdff1aSopenharmony_ci } 1654cabdff1aSopenharmony_ci 1655cabdff1aSopenharmony_ci // Size of downmix coefficients matrix 1656cabdff1aSopenharmony_ci m = ff_dca_dmix_primary_nch[s->prim_dmix_type]; 1657cabdff1aSopenharmony_ci n = ff_dca_channels[s->audio_mode] + !!s->lfe_present; 1658cabdff1aSopenharmony_ci 1659cabdff1aSopenharmony_ci // Dynamic downmix code coefficients 1660cabdff1aSopenharmony_ci for (i = 0; i < m * n; i++) { 1661cabdff1aSopenharmony_ci int code = get_bits(&s->gb, 9); 1662cabdff1aSopenharmony_ci int sign = (code >> 8) - 1; 1663cabdff1aSopenharmony_ci unsigned int index = code & 0xff; 1664cabdff1aSopenharmony_ci if (index >= FF_DCA_DMIXTABLE_SIZE) { 1665cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid downmix coefficient index\n"); 1666cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1667cabdff1aSopenharmony_ci } 1668cabdff1aSopenharmony_ci s->prim_dmix_coeff[i] = (ff_dca_dmixtable[index] ^ sign) - sign; 1669cabdff1aSopenharmony_ci } 1670cabdff1aSopenharmony_ci } 1671cabdff1aSopenharmony_ci 1672cabdff1aSopenharmony_ci // Byte align 1673cabdff1aSopenharmony_ci skip_bits(&s->gb, -get_bits_count(&s->gb) & 7); 1674cabdff1aSopenharmony_ci 1675cabdff1aSopenharmony_ci // CRC16 of auxiliary data 1676cabdff1aSopenharmony_ci skip_bits(&s->gb, 16); 1677cabdff1aSopenharmony_ci 1678cabdff1aSopenharmony_ci // Check CRC 1679cabdff1aSopenharmony_ci if (ff_dca_check_crc(s->avctx, &s->gb, aux_pos, get_bits_count(&s->gb))) { 1680cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid auxiliary data checksum\n"); 1681cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1682cabdff1aSopenharmony_ci } 1683cabdff1aSopenharmony_ci 1684cabdff1aSopenharmony_ci return 0; 1685cabdff1aSopenharmony_ci} 1686cabdff1aSopenharmony_ci 1687cabdff1aSopenharmony_cistatic int parse_optional_info(DCACoreDecoder *s) 1688cabdff1aSopenharmony_ci{ 1689cabdff1aSopenharmony_ci DCAContext *dca = s->avctx->priv_data; 1690cabdff1aSopenharmony_ci int ret = -1; 1691cabdff1aSopenharmony_ci 1692cabdff1aSopenharmony_ci // Time code stamp 1693cabdff1aSopenharmony_ci if (s->ts_present) 1694cabdff1aSopenharmony_ci skip_bits_long(&s->gb, 32); 1695cabdff1aSopenharmony_ci 1696cabdff1aSopenharmony_ci // Auxiliary data 1697cabdff1aSopenharmony_ci if (s->aux_present && (ret = parse_aux_data(s)) < 0 1698cabdff1aSopenharmony_ci && (s->avctx->err_recognition & AV_EF_EXPLODE)) 1699cabdff1aSopenharmony_ci return ret; 1700cabdff1aSopenharmony_ci 1701cabdff1aSopenharmony_ci if (ret < 0) 1702cabdff1aSopenharmony_ci s->prim_dmix_embedded = 0; 1703cabdff1aSopenharmony_ci 1704cabdff1aSopenharmony_ci // Core extensions 1705cabdff1aSopenharmony_ci if (s->ext_audio_present && !dca->core_only) { 1706cabdff1aSopenharmony_ci int sync_pos = FFMIN(s->frame_size / 4, s->gb.size_in_bits / 32) - 1; 1707cabdff1aSopenharmony_ci int last_pos = get_bits_count(&s->gb) / 32; 1708cabdff1aSopenharmony_ci int size, dist; 1709cabdff1aSopenharmony_ci uint32_t w1, w2 = 0; 1710cabdff1aSopenharmony_ci 1711cabdff1aSopenharmony_ci // Search for extension sync words aligned on 4-byte boundary. Search 1712cabdff1aSopenharmony_ci // must be done backwards from the end of core frame to work around 1713cabdff1aSopenharmony_ci // sync word aliasing issues. 1714cabdff1aSopenharmony_ci switch (s->ext_audio_type) { 1715cabdff1aSopenharmony_ci case DCA_EXT_AUDIO_XCH: 1716cabdff1aSopenharmony_ci if (dca->request_channel_layout) 1717cabdff1aSopenharmony_ci break; 1718cabdff1aSopenharmony_ci 1719cabdff1aSopenharmony_ci // The distance between XCH sync word and end of the core frame 1720cabdff1aSopenharmony_ci // must be equal to XCH frame size. Off by one error is allowed for 1721cabdff1aSopenharmony_ci // compatibility with legacy bitstreams. Minimum XCH frame size is 1722cabdff1aSopenharmony_ci // 96 bytes. AMODE and PCHS are further checked to reduce 1723cabdff1aSopenharmony_ci // probability of alias sync detection. 1724cabdff1aSopenharmony_ci for (; sync_pos >= last_pos; sync_pos--, w2 = w1) { 1725cabdff1aSopenharmony_ci w1 = AV_RB32(s->gb.buffer + sync_pos * 4); 1726cabdff1aSopenharmony_ci if (w1 == DCA_SYNCWORD_XCH) { 1727cabdff1aSopenharmony_ci size = (w2 >> 22) + 1; 1728cabdff1aSopenharmony_ci dist = s->frame_size - sync_pos * 4; 1729cabdff1aSopenharmony_ci if (size >= 96 1730cabdff1aSopenharmony_ci && (size == dist || size - 1 == dist) 1731cabdff1aSopenharmony_ci && (w2 >> 15 & 0x7f) == 0x08) { 1732cabdff1aSopenharmony_ci s->xch_pos = sync_pos * 32 + 49; 1733cabdff1aSopenharmony_ci break; 1734cabdff1aSopenharmony_ci } 1735cabdff1aSopenharmony_ci } 1736cabdff1aSopenharmony_ci } 1737cabdff1aSopenharmony_ci 1738cabdff1aSopenharmony_ci if (!s->xch_pos) { 1739cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "XCH sync word not found\n"); 1740cabdff1aSopenharmony_ci if (s->avctx->err_recognition & AV_EF_EXPLODE) 1741cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1742cabdff1aSopenharmony_ci } 1743cabdff1aSopenharmony_ci break; 1744cabdff1aSopenharmony_ci 1745cabdff1aSopenharmony_ci case DCA_EXT_AUDIO_X96: 1746cabdff1aSopenharmony_ci // The distance between X96 sync word and end of the core frame 1747cabdff1aSopenharmony_ci // must be equal to X96 frame size. Minimum X96 frame size is 96 1748cabdff1aSopenharmony_ci // bytes. 1749cabdff1aSopenharmony_ci for (; sync_pos >= last_pos; sync_pos--, w2 = w1) { 1750cabdff1aSopenharmony_ci w1 = AV_RB32(s->gb.buffer + sync_pos * 4); 1751cabdff1aSopenharmony_ci if (w1 == DCA_SYNCWORD_X96) { 1752cabdff1aSopenharmony_ci size = (w2 >> 20) + 1; 1753cabdff1aSopenharmony_ci dist = s->frame_size - sync_pos * 4; 1754cabdff1aSopenharmony_ci if (size >= 96 && size == dist) { 1755cabdff1aSopenharmony_ci s->x96_pos = sync_pos * 32 + 44; 1756cabdff1aSopenharmony_ci break; 1757cabdff1aSopenharmony_ci } 1758cabdff1aSopenharmony_ci } 1759cabdff1aSopenharmony_ci } 1760cabdff1aSopenharmony_ci 1761cabdff1aSopenharmony_ci if (!s->x96_pos) { 1762cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "X96 sync word not found\n"); 1763cabdff1aSopenharmony_ci if (s->avctx->err_recognition & AV_EF_EXPLODE) 1764cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1765cabdff1aSopenharmony_ci } 1766cabdff1aSopenharmony_ci break; 1767cabdff1aSopenharmony_ci 1768cabdff1aSopenharmony_ci case DCA_EXT_AUDIO_XXCH: 1769cabdff1aSopenharmony_ci if (dca->request_channel_layout) 1770cabdff1aSopenharmony_ci break; 1771cabdff1aSopenharmony_ci 1772cabdff1aSopenharmony_ci // XXCH frame header CRC must be valid. Minimum XXCH frame header 1773cabdff1aSopenharmony_ci // size is 11 bytes. 1774cabdff1aSopenharmony_ci for (; sync_pos >= last_pos; sync_pos--, w2 = w1) { 1775cabdff1aSopenharmony_ci w1 = AV_RB32(s->gb.buffer + sync_pos * 4); 1776cabdff1aSopenharmony_ci if (w1 == DCA_SYNCWORD_XXCH) { 1777cabdff1aSopenharmony_ci size = (w2 >> 26) + 1; 1778cabdff1aSopenharmony_ci dist = s->gb.size_in_bits / 8 - sync_pos * 4; 1779cabdff1aSopenharmony_ci if (size >= 11 && size <= dist && 1780cabdff1aSopenharmony_ci !av_crc(dca->crctab, 0xffff, s->gb.buffer + 1781cabdff1aSopenharmony_ci (sync_pos + 1) * 4, size - 4)) { 1782cabdff1aSopenharmony_ci s->xxch_pos = sync_pos * 32; 1783cabdff1aSopenharmony_ci break; 1784cabdff1aSopenharmony_ci } 1785cabdff1aSopenharmony_ci } 1786cabdff1aSopenharmony_ci } 1787cabdff1aSopenharmony_ci 1788cabdff1aSopenharmony_ci if (!s->xxch_pos) { 1789cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "XXCH sync word not found\n"); 1790cabdff1aSopenharmony_ci if (s->avctx->err_recognition & AV_EF_EXPLODE) 1791cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1792cabdff1aSopenharmony_ci } 1793cabdff1aSopenharmony_ci break; 1794cabdff1aSopenharmony_ci } 1795cabdff1aSopenharmony_ci } 1796cabdff1aSopenharmony_ci 1797cabdff1aSopenharmony_ci return 0; 1798cabdff1aSopenharmony_ci} 1799cabdff1aSopenharmony_ci 1800cabdff1aSopenharmony_ciint ff_dca_core_parse(DCACoreDecoder *s, const uint8_t *data, int size) 1801cabdff1aSopenharmony_ci{ 1802cabdff1aSopenharmony_ci int ret; 1803cabdff1aSopenharmony_ci 1804cabdff1aSopenharmony_ci s->ext_audio_mask = 0; 1805cabdff1aSopenharmony_ci s->xch_pos = s->xxch_pos = s->x96_pos = 0; 1806cabdff1aSopenharmony_ci 1807cabdff1aSopenharmony_ci if ((ret = init_get_bits8(&s->gb, data, size)) < 0) 1808cabdff1aSopenharmony_ci return ret; 1809cabdff1aSopenharmony_ci s->gb_in = s->gb; 1810cabdff1aSopenharmony_ci 1811cabdff1aSopenharmony_ci if ((ret = parse_frame_header(s)) < 0) 1812cabdff1aSopenharmony_ci return ret; 1813cabdff1aSopenharmony_ci if ((ret = alloc_sample_buffer(s)) < 0) 1814cabdff1aSopenharmony_ci return ret; 1815cabdff1aSopenharmony_ci if ((ret = parse_frame_data(s, HEADER_CORE, 0)) < 0) 1816cabdff1aSopenharmony_ci return ret; 1817cabdff1aSopenharmony_ci if ((ret = parse_optional_info(s)) < 0) 1818cabdff1aSopenharmony_ci return ret; 1819cabdff1aSopenharmony_ci 1820cabdff1aSopenharmony_ci // Workaround for DTS in WAV 1821cabdff1aSopenharmony_ci if (s->frame_size > size) 1822cabdff1aSopenharmony_ci s->frame_size = size; 1823cabdff1aSopenharmony_ci 1824cabdff1aSopenharmony_ci if (ff_dca_seek_bits(&s->gb, s->frame_size * 8)) { 1825cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Read past end of core frame\n"); 1826cabdff1aSopenharmony_ci if (s->avctx->err_recognition & AV_EF_EXPLODE) 1827cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1828cabdff1aSopenharmony_ci } 1829cabdff1aSopenharmony_ci 1830cabdff1aSopenharmony_ci return 0; 1831cabdff1aSopenharmony_ci} 1832cabdff1aSopenharmony_ci 1833cabdff1aSopenharmony_ciint ff_dca_core_parse_exss(DCACoreDecoder *s, const uint8_t *data, DCAExssAsset *asset) 1834cabdff1aSopenharmony_ci{ 1835cabdff1aSopenharmony_ci AVCodecContext *avctx = s->avctx; 1836cabdff1aSopenharmony_ci DCAContext *dca = avctx->priv_data; 1837cabdff1aSopenharmony_ci int exss_mask = asset ? asset->extension_mask : 0; 1838cabdff1aSopenharmony_ci int ret = 0, ext = 0; 1839cabdff1aSopenharmony_ci 1840cabdff1aSopenharmony_ci // Parse (X)XCH unless downmixing 1841cabdff1aSopenharmony_ci if (!dca->request_channel_layout) { 1842cabdff1aSopenharmony_ci if (exss_mask & DCA_EXSS_XXCH) { 1843cabdff1aSopenharmony_ci if ((ret = init_get_bits8(&s->gb, data + asset->xxch_offset, asset->xxch_size)) < 0) 1844cabdff1aSopenharmony_ci return ret; 1845cabdff1aSopenharmony_ci ret = parse_xxch_frame(s); 1846cabdff1aSopenharmony_ci ext = DCA_EXSS_XXCH; 1847cabdff1aSopenharmony_ci } else if (s->xxch_pos) { 1848cabdff1aSopenharmony_ci s->gb = s->gb_in; 1849cabdff1aSopenharmony_ci skip_bits_long(&s->gb, s->xxch_pos); 1850cabdff1aSopenharmony_ci ret = parse_xxch_frame(s); 1851cabdff1aSopenharmony_ci ext = DCA_CSS_XXCH; 1852cabdff1aSopenharmony_ci } else if (s->xch_pos) { 1853cabdff1aSopenharmony_ci s->gb = s->gb_in; 1854cabdff1aSopenharmony_ci skip_bits_long(&s->gb, s->xch_pos); 1855cabdff1aSopenharmony_ci ret = parse_xch_frame(s); 1856cabdff1aSopenharmony_ci ext = DCA_CSS_XCH; 1857cabdff1aSopenharmony_ci } 1858cabdff1aSopenharmony_ci 1859cabdff1aSopenharmony_ci // Revert to primary channel set in case (X)XCH parsing fails 1860cabdff1aSopenharmony_ci if (ret < 0) { 1861cabdff1aSopenharmony_ci if (avctx->err_recognition & AV_EF_EXPLODE) 1862cabdff1aSopenharmony_ci return ret; 1863cabdff1aSopenharmony_ci s->nchannels = ff_dca_channels[s->audio_mode]; 1864cabdff1aSopenharmony_ci s->ch_mask = audio_mode_ch_mask[s->audio_mode]; 1865cabdff1aSopenharmony_ci if (s->lfe_present) 1866cabdff1aSopenharmony_ci s->ch_mask |= DCA_SPEAKER_MASK_LFE1; 1867cabdff1aSopenharmony_ci } else { 1868cabdff1aSopenharmony_ci s->ext_audio_mask |= ext; 1869cabdff1aSopenharmony_ci } 1870cabdff1aSopenharmony_ci } 1871cabdff1aSopenharmony_ci 1872cabdff1aSopenharmony_ci // Parse XBR 1873cabdff1aSopenharmony_ci if (exss_mask & DCA_EXSS_XBR) { 1874cabdff1aSopenharmony_ci if ((ret = init_get_bits8(&s->gb, data + asset->xbr_offset, asset->xbr_size)) < 0) 1875cabdff1aSopenharmony_ci return ret; 1876cabdff1aSopenharmony_ci if ((ret = parse_xbr_frame(s)) < 0) { 1877cabdff1aSopenharmony_ci if (avctx->err_recognition & AV_EF_EXPLODE) 1878cabdff1aSopenharmony_ci return ret; 1879cabdff1aSopenharmony_ci } else { 1880cabdff1aSopenharmony_ci s->ext_audio_mask |= DCA_EXSS_XBR; 1881cabdff1aSopenharmony_ci } 1882cabdff1aSopenharmony_ci } 1883cabdff1aSopenharmony_ci 1884cabdff1aSopenharmony_ci // Parse X96 unless decoding XLL 1885cabdff1aSopenharmony_ci if (!(dca->packet & DCA_PACKET_XLL)) { 1886cabdff1aSopenharmony_ci if (exss_mask & DCA_EXSS_X96) { 1887cabdff1aSopenharmony_ci if ((ret = init_get_bits8(&s->gb, data + asset->x96_offset, asset->x96_size)) < 0) 1888cabdff1aSopenharmony_ci return ret; 1889cabdff1aSopenharmony_ci if ((ret = parse_x96_frame_exss(s)) < 0) { 1890cabdff1aSopenharmony_ci if (ret == AVERROR(ENOMEM) || (avctx->err_recognition & AV_EF_EXPLODE)) 1891cabdff1aSopenharmony_ci return ret; 1892cabdff1aSopenharmony_ci } else { 1893cabdff1aSopenharmony_ci s->ext_audio_mask |= DCA_EXSS_X96; 1894cabdff1aSopenharmony_ci } 1895cabdff1aSopenharmony_ci } else if (s->x96_pos) { 1896cabdff1aSopenharmony_ci s->gb = s->gb_in; 1897cabdff1aSopenharmony_ci skip_bits_long(&s->gb, s->x96_pos); 1898cabdff1aSopenharmony_ci if ((ret = parse_x96_frame(s)) < 0) { 1899cabdff1aSopenharmony_ci if (ret == AVERROR(ENOMEM) || (avctx->err_recognition & AV_EF_EXPLODE)) 1900cabdff1aSopenharmony_ci return ret; 1901cabdff1aSopenharmony_ci } else { 1902cabdff1aSopenharmony_ci s->ext_audio_mask |= DCA_CSS_X96; 1903cabdff1aSopenharmony_ci } 1904cabdff1aSopenharmony_ci } 1905cabdff1aSopenharmony_ci } 1906cabdff1aSopenharmony_ci 1907cabdff1aSopenharmony_ci return 0; 1908cabdff1aSopenharmony_ci} 1909cabdff1aSopenharmony_ci 1910cabdff1aSopenharmony_cistatic int map_prm_ch_to_spkr(DCACoreDecoder *s, int ch) 1911cabdff1aSopenharmony_ci{ 1912cabdff1aSopenharmony_ci int pos, spkr; 1913cabdff1aSopenharmony_ci 1914cabdff1aSopenharmony_ci // Try to map this channel to core first 1915cabdff1aSopenharmony_ci pos = ff_dca_channels[s->audio_mode]; 1916cabdff1aSopenharmony_ci if (ch < pos) { 1917cabdff1aSopenharmony_ci spkr = prm_ch_to_spkr_map[s->audio_mode][ch]; 1918cabdff1aSopenharmony_ci if (s->ext_audio_mask & (DCA_CSS_XXCH | DCA_EXSS_XXCH)) { 1919cabdff1aSopenharmony_ci if (s->xxch_core_mask & (1U << spkr)) 1920cabdff1aSopenharmony_ci return spkr; 1921cabdff1aSopenharmony_ci if (spkr == DCA_SPEAKER_Ls && (s->xxch_core_mask & DCA_SPEAKER_MASK_Lss)) 1922cabdff1aSopenharmony_ci return DCA_SPEAKER_Lss; 1923cabdff1aSopenharmony_ci if (spkr == DCA_SPEAKER_Rs && (s->xxch_core_mask & DCA_SPEAKER_MASK_Rss)) 1924cabdff1aSopenharmony_ci return DCA_SPEAKER_Rss; 1925cabdff1aSopenharmony_ci return -1; 1926cabdff1aSopenharmony_ci } 1927cabdff1aSopenharmony_ci return spkr; 1928cabdff1aSopenharmony_ci } 1929cabdff1aSopenharmony_ci 1930cabdff1aSopenharmony_ci // Then XCH 1931cabdff1aSopenharmony_ci if ((s->ext_audio_mask & DCA_CSS_XCH) && ch == pos) 1932cabdff1aSopenharmony_ci return DCA_SPEAKER_Cs; 1933cabdff1aSopenharmony_ci 1934cabdff1aSopenharmony_ci // Then XXCH 1935cabdff1aSopenharmony_ci if (s->ext_audio_mask & (DCA_CSS_XXCH | DCA_EXSS_XXCH)) { 1936cabdff1aSopenharmony_ci for (spkr = DCA_SPEAKER_Cs; spkr < s->xxch_mask_nbits; spkr++) 1937cabdff1aSopenharmony_ci if (s->xxch_spkr_mask & (1U << spkr)) 1938cabdff1aSopenharmony_ci if (pos++ == ch) 1939cabdff1aSopenharmony_ci return spkr; 1940cabdff1aSopenharmony_ci } 1941cabdff1aSopenharmony_ci 1942cabdff1aSopenharmony_ci // No mapping 1943cabdff1aSopenharmony_ci return -1; 1944cabdff1aSopenharmony_ci} 1945cabdff1aSopenharmony_ci 1946cabdff1aSopenharmony_cistatic void erase_dsp_history(DCACoreDecoder *s) 1947cabdff1aSopenharmony_ci{ 1948cabdff1aSopenharmony_ci memset(s->dcadsp_data, 0, sizeof(s->dcadsp_data)); 1949cabdff1aSopenharmony_ci s->output_history_lfe_fixed = 0; 1950cabdff1aSopenharmony_ci s->output_history_lfe_float = 0; 1951cabdff1aSopenharmony_ci} 1952cabdff1aSopenharmony_ci 1953cabdff1aSopenharmony_cistatic void set_filter_mode(DCACoreDecoder *s, int mode) 1954cabdff1aSopenharmony_ci{ 1955cabdff1aSopenharmony_ci if (s->filter_mode != mode) { 1956cabdff1aSopenharmony_ci erase_dsp_history(s); 1957cabdff1aSopenharmony_ci s->filter_mode = mode; 1958cabdff1aSopenharmony_ci } 1959cabdff1aSopenharmony_ci} 1960cabdff1aSopenharmony_ci 1961cabdff1aSopenharmony_ciint ff_dca_core_filter_fixed(DCACoreDecoder *s, int x96_synth) 1962cabdff1aSopenharmony_ci{ 1963cabdff1aSopenharmony_ci int n, ch, spkr, nsamples, x96_nchannels = 0; 1964cabdff1aSopenharmony_ci const int32_t *filter_coeff; 1965cabdff1aSopenharmony_ci int32_t *ptr; 1966cabdff1aSopenharmony_ci 1967cabdff1aSopenharmony_ci // Externally set x96_synth flag implies that X96 synthesis should be 1968cabdff1aSopenharmony_ci // enabled, yet actual X96 subband data should be discarded. This is a 1969cabdff1aSopenharmony_ci // special case for lossless residual decoder that ignores X96 data if 1970cabdff1aSopenharmony_ci // present. 1971cabdff1aSopenharmony_ci if (!x96_synth && (s->ext_audio_mask & (DCA_CSS_X96 | DCA_EXSS_X96))) { 1972cabdff1aSopenharmony_ci x96_nchannels = s->x96_nchannels; 1973cabdff1aSopenharmony_ci x96_synth = 1; 1974cabdff1aSopenharmony_ci } 1975cabdff1aSopenharmony_ci if (x96_synth < 0) 1976cabdff1aSopenharmony_ci x96_synth = 0; 1977cabdff1aSopenharmony_ci 1978cabdff1aSopenharmony_ci s->output_rate = s->sample_rate << x96_synth; 1979cabdff1aSopenharmony_ci s->npcmsamples = nsamples = (s->npcmblocks * DCA_PCMBLOCK_SAMPLES) << x96_synth; 1980cabdff1aSopenharmony_ci 1981cabdff1aSopenharmony_ci // Reallocate PCM output buffer 1982cabdff1aSopenharmony_ci av_fast_malloc(&s->output_buffer, &s->output_size, 1983cabdff1aSopenharmony_ci nsamples * av_popcount(s->ch_mask) * sizeof(int32_t)); 1984cabdff1aSopenharmony_ci if (!s->output_buffer) 1985cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 1986cabdff1aSopenharmony_ci 1987cabdff1aSopenharmony_ci ptr = (int32_t *)s->output_buffer; 1988cabdff1aSopenharmony_ci for (spkr = 0; spkr < DCA_SPEAKER_COUNT; spkr++) { 1989cabdff1aSopenharmony_ci if (s->ch_mask & (1U << spkr)) { 1990cabdff1aSopenharmony_ci s->output_samples[spkr] = ptr; 1991cabdff1aSopenharmony_ci ptr += nsamples; 1992cabdff1aSopenharmony_ci } else { 1993cabdff1aSopenharmony_ci s->output_samples[spkr] = NULL; 1994cabdff1aSopenharmony_ci } 1995cabdff1aSopenharmony_ci } 1996cabdff1aSopenharmony_ci 1997cabdff1aSopenharmony_ci // Handle change of filtering mode 1998cabdff1aSopenharmony_ci set_filter_mode(s, x96_synth | DCA_FILTER_MODE_FIXED); 1999cabdff1aSopenharmony_ci 2000cabdff1aSopenharmony_ci // Select filter 2001cabdff1aSopenharmony_ci if (x96_synth) 2002cabdff1aSopenharmony_ci filter_coeff = ff_dca_fir_64bands_fixed; 2003cabdff1aSopenharmony_ci else if (s->filter_perfect) 2004cabdff1aSopenharmony_ci filter_coeff = ff_dca_fir_32bands_perfect_fixed; 2005cabdff1aSopenharmony_ci else 2006cabdff1aSopenharmony_ci filter_coeff = ff_dca_fir_32bands_nonperfect_fixed; 2007cabdff1aSopenharmony_ci 2008cabdff1aSopenharmony_ci // Filter primary channels 2009cabdff1aSopenharmony_ci for (ch = 0; ch < s->nchannels; ch++) { 2010cabdff1aSopenharmony_ci // Map this primary channel to speaker 2011cabdff1aSopenharmony_ci spkr = map_prm_ch_to_spkr(s, ch); 2012cabdff1aSopenharmony_ci if (spkr < 0) 2013cabdff1aSopenharmony_ci return AVERROR(EINVAL); 2014cabdff1aSopenharmony_ci 2015cabdff1aSopenharmony_ci // Filter bank reconstruction 2016cabdff1aSopenharmony_ci s->dcadsp->sub_qmf_fixed[x96_synth]( 2017cabdff1aSopenharmony_ci &s->synth, 2018cabdff1aSopenharmony_ci &s->dcadct, 2019cabdff1aSopenharmony_ci s->output_samples[spkr], 2020cabdff1aSopenharmony_ci s->subband_samples[ch], 2021cabdff1aSopenharmony_ci ch < x96_nchannels ? s->x96_subband_samples[ch] : NULL, 2022cabdff1aSopenharmony_ci s->dcadsp_data[ch].u.fix.hist1, 2023cabdff1aSopenharmony_ci &s->dcadsp_data[ch].offset, 2024cabdff1aSopenharmony_ci s->dcadsp_data[ch].u.fix.hist2, 2025cabdff1aSopenharmony_ci filter_coeff, 2026cabdff1aSopenharmony_ci s->npcmblocks); 2027cabdff1aSopenharmony_ci } 2028cabdff1aSopenharmony_ci 2029cabdff1aSopenharmony_ci // Filter LFE channel 2030cabdff1aSopenharmony_ci if (s->lfe_present) { 2031cabdff1aSopenharmony_ci int32_t *samples = s->output_samples[DCA_SPEAKER_LFE1]; 2032cabdff1aSopenharmony_ci int nlfesamples = s->npcmblocks >> 1; 2033cabdff1aSopenharmony_ci 2034cabdff1aSopenharmony_ci // Check LFF 2035cabdff1aSopenharmony_ci if (s->lfe_present == DCA_LFE_FLAG_128) { 2036cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Fixed point mode doesn't support LFF=1\n"); 2037cabdff1aSopenharmony_ci return AVERROR(EINVAL); 2038cabdff1aSopenharmony_ci } 2039cabdff1aSopenharmony_ci 2040cabdff1aSopenharmony_ci // Offset intermediate buffer for X96 2041cabdff1aSopenharmony_ci if (x96_synth) 2042cabdff1aSopenharmony_ci samples += nsamples / 2; 2043cabdff1aSopenharmony_ci 2044cabdff1aSopenharmony_ci // Interpolate LFE channel 2045cabdff1aSopenharmony_ci s->dcadsp->lfe_fir_fixed(samples, s->lfe_samples + DCA_LFE_HISTORY, 2046cabdff1aSopenharmony_ci ff_dca_lfe_fir_64_fixed, s->npcmblocks); 2047cabdff1aSopenharmony_ci 2048cabdff1aSopenharmony_ci if (x96_synth) { 2049cabdff1aSopenharmony_ci // Filter 96 kHz oversampled LFE PCM to attenuate high frequency 2050cabdff1aSopenharmony_ci // (47.6 - 48.0 kHz) components of interpolation image 2051cabdff1aSopenharmony_ci s->dcadsp->lfe_x96_fixed(s->output_samples[DCA_SPEAKER_LFE1], 2052cabdff1aSopenharmony_ci samples, &s->output_history_lfe_fixed, 2053cabdff1aSopenharmony_ci nsamples / 2); 2054cabdff1aSopenharmony_ci 2055cabdff1aSopenharmony_ci } 2056cabdff1aSopenharmony_ci 2057cabdff1aSopenharmony_ci // Update LFE history 2058cabdff1aSopenharmony_ci for (n = DCA_LFE_HISTORY - 1; n >= 0; n--) 2059cabdff1aSopenharmony_ci s->lfe_samples[n] = s->lfe_samples[nlfesamples + n]; 2060cabdff1aSopenharmony_ci } 2061cabdff1aSopenharmony_ci 2062cabdff1aSopenharmony_ci return 0; 2063cabdff1aSopenharmony_ci} 2064cabdff1aSopenharmony_ci 2065cabdff1aSopenharmony_cistatic int filter_frame_fixed(DCACoreDecoder *s, AVFrame *frame) 2066cabdff1aSopenharmony_ci{ 2067cabdff1aSopenharmony_ci AVCodecContext *avctx = s->avctx; 2068cabdff1aSopenharmony_ci DCAContext *dca = avctx->priv_data; 2069cabdff1aSopenharmony_ci int i, n, ch, ret, spkr, nsamples; 2070cabdff1aSopenharmony_ci 2071cabdff1aSopenharmony_ci // Don't filter twice when falling back from XLL 2072cabdff1aSopenharmony_ci if (!(dca->packet & DCA_PACKET_XLL) && (ret = ff_dca_core_filter_fixed(s, 0)) < 0) 2073cabdff1aSopenharmony_ci return ret; 2074cabdff1aSopenharmony_ci 2075cabdff1aSopenharmony_ci avctx->sample_rate = s->output_rate; 2076cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_S32P; 2077cabdff1aSopenharmony_ci avctx->bits_per_raw_sample = 24; 2078cabdff1aSopenharmony_ci 2079cabdff1aSopenharmony_ci frame->nb_samples = nsamples = s->npcmsamples; 2080cabdff1aSopenharmony_ci if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) 2081cabdff1aSopenharmony_ci return ret; 2082cabdff1aSopenharmony_ci 2083cabdff1aSopenharmony_ci // Undo embedded XCH downmix 2084cabdff1aSopenharmony_ci if (s->es_format && (s->ext_audio_mask & DCA_CSS_XCH) 2085cabdff1aSopenharmony_ci && s->audio_mode >= DCA_AMODE_2F2R) { 2086cabdff1aSopenharmony_ci s->dcadsp->dmix_sub_xch(s->output_samples[DCA_SPEAKER_Ls], 2087cabdff1aSopenharmony_ci s->output_samples[DCA_SPEAKER_Rs], 2088cabdff1aSopenharmony_ci s->output_samples[DCA_SPEAKER_Cs], 2089cabdff1aSopenharmony_ci nsamples); 2090cabdff1aSopenharmony_ci 2091cabdff1aSopenharmony_ci } 2092cabdff1aSopenharmony_ci 2093cabdff1aSopenharmony_ci // Undo embedded XXCH downmix 2094cabdff1aSopenharmony_ci if ((s->ext_audio_mask & (DCA_CSS_XXCH | DCA_EXSS_XXCH)) 2095cabdff1aSopenharmony_ci && s->xxch_dmix_embedded) { 2096cabdff1aSopenharmony_ci int scale_inv = s->xxch_dmix_scale_inv; 2097cabdff1aSopenharmony_ci int *coeff_ptr = s->xxch_dmix_coeff; 2098cabdff1aSopenharmony_ci int xch_base = ff_dca_channels[s->audio_mode]; 2099cabdff1aSopenharmony_ci av_assert1(s->nchannels - xch_base <= DCA_XXCH_CHANNELS_MAX); 2100cabdff1aSopenharmony_ci 2101cabdff1aSopenharmony_ci // Undo embedded core downmix pre-scaling 2102cabdff1aSopenharmony_ci for (spkr = 0; spkr < s->xxch_mask_nbits; spkr++) { 2103cabdff1aSopenharmony_ci if (s->xxch_core_mask & (1U << spkr)) { 2104cabdff1aSopenharmony_ci s->dcadsp->dmix_scale_inv(s->output_samples[spkr], 2105cabdff1aSopenharmony_ci scale_inv, nsamples); 2106cabdff1aSopenharmony_ci } 2107cabdff1aSopenharmony_ci } 2108cabdff1aSopenharmony_ci 2109cabdff1aSopenharmony_ci // Undo downmix 2110cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) { 2111cabdff1aSopenharmony_ci int src_spkr = map_prm_ch_to_spkr(s, ch); 2112cabdff1aSopenharmony_ci if (src_spkr < 0) 2113cabdff1aSopenharmony_ci return AVERROR(EINVAL); 2114cabdff1aSopenharmony_ci for (spkr = 0; spkr < s->xxch_mask_nbits; spkr++) { 2115cabdff1aSopenharmony_ci if (s->xxch_dmix_mask[ch - xch_base] & (1U << spkr)) { 2116cabdff1aSopenharmony_ci int coeff = mul16(*coeff_ptr++, scale_inv); 2117cabdff1aSopenharmony_ci if (coeff) { 2118cabdff1aSopenharmony_ci s->dcadsp->dmix_sub(s->output_samples[spkr ], 2119cabdff1aSopenharmony_ci s->output_samples[src_spkr], 2120cabdff1aSopenharmony_ci coeff, nsamples); 2121cabdff1aSopenharmony_ci } 2122cabdff1aSopenharmony_ci } 2123cabdff1aSopenharmony_ci } 2124cabdff1aSopenharmony_ci } 2125cabdff1aSopenharmony_ci } 2126cabdff1aSopenharmony_ci 2127cabdff1aSopenharmony_ci if (!(s->ext_audio_mask & (DCA_CSS_XXCH | DCA_CSS_XCH | DCA_EXSS_XXCH))) { 2128cabdff1aSopenharmony_ci // Front sum/difference decoding 2129cabdff1aSopenharmony_ci if ((s->sumdiff_front && s->audio_mode > DCA_AMODE_MONO) 2130cabdff1aSopenharmony_ci || s->audio_mode == DCA_AMODE_STEREO_SUMDIFF) { 2131cabdff1aSopenharmony_ci s->fixed_dsp->butterflies_fixed(s->output_samples[DCA_SPEAKER_L], 2132cabdff1aSopenharmony_ci s->output_samples[DCA_SPEAKER_R], 2133cabdff1aSopenharmony_ci nsamples); 2134cabdff1aSopenharmony_ci } 2135cabdff1aSopenharmony_ci 2136cabdff1aSopenharmony_ci // Surround sum/difference decoding 2137cabdff1aSopenharmony_ci if (s->sumdiff_surround && s->audio_mode >= DCA_AMODE_2F2R) { 2138cabdff1aSopenharmony_ci s->fixed_dsp->butterflies_fixed(s->output_samples[DCA_SPEAKER_Ls], 2139cabdff1aSopenharmony_ci s->output_samples[DCA_SPEAKER_Rs], 2140cabdff1aSopenharmony_ci nsamples); 2141cabdff1aSopenharmony_ci } 2142cabdff1aSopenharmony_ci } 2143cabdff1aSopenharmony_ci 2144cabdff1aSopenharmony_ci // Downmix primary channel set to stereo 2145cabdff1aSopenharmony_ci if (s->request_mask != s->ch_mask) { 2146cabdff1aSopenharmony_ci ff_dca_downmix_to_stereo_fixed(s->dcadsp, 2147cabdff1aSopenharmony_ci s->output_samples, 2148cabdff1aSopenharmony_ci s->prim_dmix_coeff, 2149cabdff1aSopenharmony_ci nsamples, s->ch_mask); 2150cabdff1aSopenharmony_ci } 2151cabdff1aSopenharmony_ci 2152cabdff1aSopenharmony_ci for (i = 0; i < avctx->ch_layout.nb_channels; i++) { 2153cabdff1aSopenharmony_ci int32_t *samples = s->output_samples[s->ch_remap[i]]; 2154cabdff1aSopenharmony_ci int32_t *plane = (int32_t *)frame->extended_data[i]; 2155cabdff1aSopenharmony_ci for (n = 0; n < nsamples; n++) 2156cabdff1aSopenharmony_ci plane[n] = clip23(samples[n]) * (1 << 8); 2157cabdff1aSopenharmony_ci } 2158cabdff1aSopenharmony_ci 2159cabdff1aSopenharmony_ci return 0; 2160cabdff1aSopenharmony_ci} 2161cabdff1aSopenharmony_ci 2162cabdff1aSopenharmony_cistatic int filter_frame_float(DCACoreDecoder *s, AVFrame *frame) 2163cabdff1aSopenharmony_ci{ 2164cabdff1aSopenharmony_ci AVCodecContext *avctx = s->avctx; 2165cabdff1aSopenharmony_ci int x96_nchannels = 0, x96_synth = 0; 2166cabdff1aSopenharmony_ci int i, n, ch, ret, spkr, nsamples, nchannels; 2167cabdff1aSopenharmony_ci float *output_samples[DCA_SPEAKER_COUNT] = { NULL }, *ptr; 2168cabdff1aSopenharmony_ci const float *filter_coeff; 2169cabdff1aSopenharmony_ci 2170cabdff1aSopenharmony_ci if (s->ext_audio_mask & (DCA_CSS_X96 | DCA_EXSS_X96)) { 2171cabdff1aSopenharmony_ci x96_nchannels = s->x96_nchannels; 2172cabdff1aSopenharmony_ci x96_synth = 1; 2173cabdff1aSopenharmony_ci } 2174cabdff1aSopenharmony_ci 2175cabdff1aSopenharmony_ci avctx->sample_rate = s->sample_rate << x96_synth; 2176cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; 2177cabdff1aSopenharmony_ci avctx->bits_per_raw_sample = 0; 2178cabdff1aSopenharmony_ci 2179cabdff1aSopenharmony_ci frame->nb_samples = nsamples = (s->npcmblocks * DCA_PCMBLOCK_SAMPLES) << x96_synth; 2180cabdff1aSopenharmony_ci if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) 2181cabdff1aSopenharmony_ci return ret; 2182cabdff1aSopenharmony_ci 2183cabdff1aSopenharmony_ci // Build reverse speaker to channel mapping 2184cabdff1aSopenharmony_ci for (i = 0; i < avctx->ch_layout.nb_channels; i++) 2185cabdff1aSopenharmony_ci output_samples[s->ch_remap[i]] = (float *)frame->extended_data[i]; 2186cabdff1aSopenharmony_ci 2187cabdff1aSopenharmony_ci // Allocate space for extra channels 2188cabdff1aSopenharmony_ci nchannels = av_popcount(s->ch_mask) - avctx->ch_layout.nb_channels; 2189cabdff1aSopenharmony_ci if (nchannels > 0) { 2190cabdff1aSopenharmony_ci av_fast_malloc(&s->output_buffer, &s->output_size, 2191cabdff1aSopenharmony_ci nsamples * nchannels * sizeof(float)); 2192cabdff1aSopenharmony_ci if (!s->output_buffer) 2193cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 2194cabdff1aSopenharmony_ci 2195cabdff1aSopenharmony_ci ptr = (float *)s->output_buffer; 2196cabdff1aSopenharmony_ci for (spkr = 0; spkr < DCA_SPEAKER_COUNT; spkr++) { 2197cabdff1aSopenharmony_ci if (!(s->ch_mask & (1U << spkr))) 2198cabdff1aSopenharmony_ci continue; 2199cabdff1aSopenharmony_ci if (output_samples[spkr]) 2200cabdff1aSopenharmony_ci continue; 2201cabdff1aSopenharmony_ci output_samples[spkr] = ptr; 2202cabdff1aSopenharmony_ci ptr += nsamples; 2203cabdff1aSopenharmony_ci } 2204cabdff1aSopenharmony_ci } 2205cabdff1aSopenharmony_ci 2206cabdff1aSopenharmony_ci // Handle change of filtering mode 2207cabdff1aSopenharmony_ci set_filter_mode(s, x96_synth); 2208cabdff1aSopenharmony_ci 2209cabdff1aSopenharmony_ci // Select filter 2210cabdff1aSopenharmony_ci if (x96_synth) 2211cabdff1aSopenharmony_ci filter_coeff = ff_dca_fir_64bands; 2212cabdff1aSopenharmony_ci else if (s->filter_perfect) 2213cabdff1aSopenharmony_ci filter_coeff = ff_dca_fir_32bands_perfect; 2214cabdff1aSopenharmony_ci else 2215cabdff1aSopenharmony_ci filter_coeff = ff_dca_fir_32bands_nonperfect; 2216cabdff1aSopenharmony_ci 2217cabdff1aSopenharmony_ci // Filter primary channels 2218cabdff1aSopenharmony_ci for (ch = 0; ch < s->nchannels; ch++) { 2219cabdff1aSopenharmony_ci // Map this primary channel to speaker 2220cabdff1aSopenharmony_ci spkr = map_prm_ch_to_spkr(s, ch); 2221cabdff1aSopenharmony_ci if (spkr < 0) 2222cabdff1aSopenharmony_ci return AVERROR(EINVAL); 2223cabdff1aSopenharmony_ci 2224cabdff1aSopenharmony_ci // Filter bank reconstruction 2225cabdff1aSopenharmony_ci s->dcadsp->sub_qmf_float[x96_synth]( 2226cabdff1aSopenharmony_ci &s->synth, 2227cabdff1aSopenharmony_ci &s->imdct[x96_synth], 2228cabdff1aSopenharmony_ci output_samples[spkr], 2229cabdff1aSopenharmony_ci s->subband_samples[ch], 2230cabdff1aSopenharmony_ci ch < x96_nchannels ? s->x96_subband_samples[ch] : NULL, 2231cabdff1aSopenharmony_ci s->dcadsp_data[ch].u.flt.hist1, 2232cabdff1aSopenharmony_ci &s->dcadsp_data[ch].offset, 2233cabdff1aSopenharmony_ci s->dcadsp_data[ch].u.flt.hist2, 2234cabdff1aSopenharmony_ci filter_coeff, 2235cabdff1aSopenharmony_ci s->npcmblocks, 2236cabdff1aSopenharmony_ci 1.0f / (1 << (17 - x96_synth))); 2237cabdff1aSopenharmony_ci } 2238cabdff1aSopenharmony_ci 2239cabdff1aSopenharmony_ci // Filter LFE channel 2240cabdff1aSopenharmony_ci if (s->lfe_present) { 2241cabdff1aSopenharmony_ci int dec_select = (s->lfe_present == DCA_LFE_FLAG_128); 2242cabdff1aSopenharmony_ci float *samples = output_samples[DCA_SPEAKER_LFE1]; 2243cabdff1aSopenharmony_ci int nlfesamples = s->npcmblocks >> (dec_select + 1); 2244cabdff1aSopenharmony_ci 2245cabdff1aSopenharmony_ci // Offset intermediate buffer for X96 2246cabdff1aSopenharmony_ci if (x96_synth) 2247cabdff1aSopenharmony_ci samples += nsamples / 2; 2248cabdff1aSopenharmony_ci 2249cabdff1aSopenharmony_ci // Select filter 2250cabdff1aSopenharmony_ci if (dec_select) 2251cabdff1aSopenharmony_ci filter_coeff = ff_dca_lfe_fir_128; 2252cabdff1aSopenharmony_ci else 2253cabdff1aSopenharmony_ci filter_coeff = ff_dca_lfe_fir_64; 2254cabdff1aSopenharmony_ci 2255cabdff1aSopenharmony_ci // Interpolate LFE channel 2256cabdff1aSopenharmony_ci s->dcadsp->lfe_fir_float[dec_select]( 2257cabdff1aSopenharmony_ci samples, s->lfe_samples + DCA_LFE_HISTORY, 2258cabdff1aSopenharmony_ci filter_coeff, s->npcmblocks); 2259cabdff1aSopenharmony_ci 2260cabdff1aSopenharmony_ci if (x96_synth) { 2261cabdff1aSopenharmony_ci // Filter 96 kHz oversampled LFE PCM to attenuate high frequency 2262cabdff1aSopenharmony_ci // (47.6 - 48.0 kHz) components of interpolation image 2263cabdff1aSopenharmony_ci s->dcadsp->lfe_x96_float(output_samples[DCA_SPEAKER_LFE1], 2264cabdff1aSopenharmony_ci samples, &s->output_history_lfe_float, 2265cabdff1aSopenharmony_ci nsamples / 2); 2266cabdff1aSopenharmony_ci } 2267cabdff1aSopenharmony_ci 2268cabdff1aSopenharmony_ci // Update LFE history 2269cabdff1aSopenharmony_ci for (n = DCA_LFE_HISTORY - 1; n >= 0; n--) 2270cabdff1aSopenharmony_ci s->lfe_samples[n] = s->lfe_samples[nlfesamples + n]; 2271cabdff1aSopenharmony_ci } 2272cabdff1aSopenharmony_ci 2273cabdff1aSopenharmony_ci // Undo embedded XCH downmix 2274cabdff1aSopenharmony_ci if (s->es_format && (s->ext_audio_mask & DCA_CSS_XCH) 2275cabdff1aSopenharmony_ci && s->audio_mode >= DCA_AMODE_2F2R) { 2276cabdff1aSopenharmony_ci s->float_dsp->vector_fmac_scalar(output_samples[DCA_SPEAKER_Ls], 2277cabdff1aSopenharmony_ci output_samples[DCA_SPEAKER_Cs], 2278cabdff1aSopenharmony_ci -M_SQRT1_2, nsamples); 2279cabdff1aSopenharmony_ci s->float_dsp->vector_fmac_scalar(output_samples[DCA_SPEAKER_Rs], 2280cabdff1aSopenharmony_ci output_samples[DCA_SPEAKER_Cs], 2281cabdff1aSopenharmony_ci -M_SQRT1_2, nsamples); 2282cabdff1aSopenharmony_ci } 2283cabdff1aSopenharmony_ci 2284cabdff1aSopenharmony_ci // Undo embedded XXCH downmix 2285cabdff1aSopenharmony_ci if ((s->ext_audio_mask & (DCA_CSS_XXCH | DCA_EXSS_XXCH)) 2286cabdff1aSopenharmony_ci && s->xxch_dmix_embedded) { 2287cabdff1aSopenharmony_ci float scale_inv = s->xxch_dmix_scale_inv * (1.0f / (1 << 16)); 2288cabdff1aSopenharmony_ci int *coeff_ptr = s->xxch_dmix_coeff; 2289cabdff1aSopenharmony_ci int xch_base = ff_dca_channels[s->audio_mode]; 2290cabdff1aSopenharmony_ci av_assert1(s->nchannels - xch_base <= DCA_XXCH_CHANNELS_MAX); 2291cabdff1aSopenharmony_ci 2292cabdff1aSopenharmony_ci // Undo downmix 2293cabdff1aSopenharmony_ci for (ch = xch_base; ch < s->nchannels; ch++) { 2294cabdff1aSopenharmony_ci int src_spkr = map_prm_ch_to_spkr(s, ch); 2295cabdff1aSopenharmony_ci if (src_spkr < 0) 2296cabdff1aSopenharmony_ci return AVERROR(EINVAL); 2297cabdff1aSopenharmony_ci for (spkr = 0; spkr < s->xxch_mask_nbits; spkr++) { 2298cabdff1aSopenharmony_ci if (s->xxch_dmix_mask[ch - xch_base] & (1U << spkr)) { 2299cabdff1aSopenharmony_ci int coeff = *coeff_ptr++; 2300cabdff1aSopenharmony_ci if (coeff) { 2301cabdff1aSopenharmony_ci s->float_dsp->vector_fmac_scalar(output_samples[ spkr], 2302cabdff1aSopenharmony_ci output_samples[src_spkr], 2303cabdff1aSopenharmony_ci coeff * (-1.0f / (1 << 15)), 2304cabdff1aSopenharmony_ci nsamples); 2305cabdff1aSopenharmony_ci } 2306cabdff1aSopenharmony_ci } 2307cabdff1aSopenharmony_ci } 2308cabdff1aSopenharmony_ci } 2309cabdff1aSopenharmony_ci 2310cabdff1aSopenharmony_ci // Undo embedded core downmix pre-scaling 2311cabdff1aSopenharmony_ci for (spkr = 0; spkr < s->xxch_mask_nbits; spkr++) { 2312cabdff1aSopenharmony_ci if (s->xxch_core_mask & (1U << spkr)) { 2313cabdff1aSopenharmony_ci s->float_dsp->vector_fmul_scalar(output_samples[spkr], 2314cabdff1aSopenharmony_ci output_samples[spkr], 2315cabdff1aSopenharmony_ci scale_inv, nsamples); 2316cabdff1aSopenharmony_ci } 2317cabdff1aSopenharmony_ci } 2318cabdff1aSopenharmony_ci } 2319cabdff1aSopenharmony_ci 2320cabdff1aSopenharmony_ci if (!(s->ext_audio_mask & (DCA_CSS_XXCH | DCA_CSS_XCH | DCA_EXSS_XXCH))) { 2321cabdff1aSopenharmony_ci // Front sum/difference decoding 2322cabdff1aSopenharmony_ci if ((s->sumdiff_front && s->audio_mode > DCA_AMODE_MONO) 2323cabdff1aSopenharmony_ci || s->audio_mode == DCA_AMODE_STEREO_SUMDIFF) { 2324cabdff1aSopenharmony_ci s->float_dsp->butterflies_float(output_samples[DCA_SPEAKER_L], 2325cabdff1aSopenharmony_ci output_samples[DCA_SPEAKER_R], 2326cabdff1aSopenharmony_ci nsamples); 2327cabdff1aSopenharmony_ci } 2328cabdff1aSopenharmony_ci 2329cabdff1aSopenharmony_ci // Surround sum/difference decoding 2330cabdff1aSopenharmony_ci if (s->sumdiff_surround && s->audio_mode >= DCA_AMODE_2F2R) { 2331cabdff1aSopenharmony_ci s->float_dsp->butterflies_float(output_samples[DCA_SPEAKER_Ls], 2332cabdff1aSopenharmony_ci output_samples[DCA_SPEAKER_Rs], 2333cabdff1aSopenharmony_ci nsamples); 2334cabdff1aSopenharmony_ci } 2335cabdff1aSopenharmony_ci } 2336cabdff1aSopenharmony_ci 2337cabdff1aSopenharmony_ci // Downmix primary channel set to stereo 2338cabdff1aSopenharmony_ci if (s->request_mask != s->ch_mask) { 2339cabdff1aSopenharmony_ci ff_dca_downmix_to_stereo_float(s->float_dsp, output_samples, 2340cabdff1aSopenharmony_ci s->prim_dmix_coeff, 2341cabdff1aSopenharmony_ci nsamples, s->ch_mask); 2342cabdff1aSopenharmony_ci } 2343cabdff1aSopenharmony_ci 2344cabdff1aSopenharmony_ci return 0; 2345cabdff1aSopenharmony_ci} 2346cabdff1aSopenharmony_ci 2347cabdff1aSopenharmony_ciint ff_dca_core_filter_frame(DCACoreDecoder *s, AVFrame *frame) 2348cabdff1aSopenharmony_ci{ 2349cabdff1aSopenharmony_ci AVCodecContext *avctx = s->avctx; 2350cabdff1aSopenharmony_ci DCAContext *dca = avctx->priv_data; 2351cabdff1aSopenharmony_ci DCAExssAsset *asset = &dca->exss.assets[0]; 2352cabdff1aSopenharmony_ci enum AVMatrixEncoding matrix_encoding; 2353cabdff1aSopenharmony_ci int ret; 2354cabdff1aSopenharmony_ci 2355cabdff1aSopenharmony_ci // Handle downmixing to stereo request 2356cabdff1aSopenharmony_ci if (dca->request_channel_layout == DCA_SPEAKER_LAYOUT_STEREO 2357cabdff1aSopenharmony_ci && s->audio_mode > DCA_AMODE_MONO && s->prim_dmix_embedded 2358cabdff1aSopenharmony_ci && (s->prim_dmix_type == DCA_DMIX_TYPE_LoRo || 2359cabdff1aSopenharmony_ci s->prim_dmix_type == DCA_DMIX_TYPE_LtRt)) 2360cabdff1aSopenharmony_ci s->request_mask = DCA_SPEAKER_LAYOUT_STEREO; 2361cabdff1aSopenharmony_ci else 2362cabdff1aSopenharmony_ci s->request_mask = s->ch_mask; 2363cabdff1aSopenharmony_ci if (!ff_dca_set_channel_layout(avctx, s->ch_remap, s->request_mask)) 2364cabdff1aSopenharmony_ci return AVERROR(EINVAL); 2365cabdff1aSopenharmony_ci 2366cabdff1aSopenharmony_ci // Force fixed point mode when falling back from XLL 2367cabdff1aSopenharmony_ci if ((avctx->flags & AV_CODEC_FLAG_BITEXACT) || ((dca->packet & DCA_PACKET_EXSS) 2368cabdff1aSopenharmony_ci && (asset->extension_mask & DCA_EXSS_XLL))) 2369cabdff1aSopenharmony_ci ret = filter_frame_fixed(s, frame); 2370cabdff1aSopenharmony_ci else 2371cabdff1aSopenharmony_ci ret = filter_frame_float(s, frame); 2372cabdff1aSopenharmony_ci if (ret < 0) 2373cabdff1aSopenharmony_ci return ret; 2374cabdff1aSopenharmony_ci 2375cabdff1aSopenharmony_ci // Set profile, bit rate, etc 2376cabdff1aSopenharmony_ci if (s->ext_audio_mask & DCA_EXSS_MASK) 2377cabdff1aSopenharmony_ci avctx->profile = FF_PROFILE_DTS_HD_HRA; 2378cabdff1aSopenharmony_ci else if (s->ext_audio_mask & (DCA_CSS_XXCH | DCA_CSS_XCH)) 2379cabdff1aSopenharmony_ci avctx->profile = FF_PROFILE_DTS_ES; 2380cabdff1aSopenharmony_ci else if (s->ext_audio_mask & DCA_CSS_X96) 2381cabdff1aSopenharmony_ci avctx->profile = FF_PROFILE_DTS_96_24; 2382cabdff1aSopenharmony_ci else 2383cabdff1aSopenharmony_ci avctx->profile = FF_PROFILE_DTS; 2384cabdff1aSopenharmony_ci 2385cabdff1aSopenharmony_ci if (s->bit_rate > 3 && !(s->ext_audio_mask & DCA_EXSS_MASK)) 2386cabdff1aSopenharmony_ci avctx->bit_rate = s->bit_rate; 2387cabdff1aSopenharmony_ci else 2388cabdff1aSopenharmony_ci avctx->bit_rate = 0; 2389cabdff1aSopenharmony_ci 2390cabdff1aSopenharmony_ci if (s->audio_mode == DCA_AMODE_STEREO_TOTAL || (s->request_mask != s->ch_mask && 2391cabdff1aSopenharmony_ci s->prim_dmix_type == DCA_DMIX_TYPE_LtRt)) 2392cabdff1aSopenharmony_ci matrix_encoding = AV_MATRIX_ENCODING_DOLBY; 2393cabdff1aSopenharmony_ci else 2394cabdff1aSopenharmony_ci matrix_encoding = AV_MATRIX_ENCODING_NONE; 2395cabdff1aSopenharmony_ci if ((ret = ff_side_data_update_matrix_encoding(frame, matrix_encoding)) < 0) 2396cabdff1aSopenharmony_ci return ret; 2397cabdff1aSopenharmony_ci 2398cabdff1aSopenharmony_ci return 0; 2399cabdff1aSopenharmony_ci} 2400cabdff1aSopenharmony_ci 2401cabdff1aSopenharmony_ciav_cold void ff_dca_core_flush(DCACoreDecoder *s) 2402cabdff1aSopenharmony_ci{ 2403cabdff1aSopenharmony_ci if (s->subband_buffer) { 2404cabdff1aSopenharmony_ci erase_adpcm_history(s); 2405cabdff1aSopenharmony_ci memset(s->lfe_samples, 0, DCA_LFE_HISTORY * sizeof(int32_t)); 2406cabdff1aSopenharmony_ci } 2407cabdff1aSopenharmony_ci 2408cabdff1aSopenharmony_ci if (s->x96_subband_buffer) 2409cabdff1aSopenharmony_ci erase_x96_adpcm_history(s); 2410cabdff1aSopenharmony_ci 2411cabdff1aSopenharmony_ci erase_dsp_history(s); 2412cabdff1aSopenharmony_ci} 2413cabdff1aSopenharmony_ci 2414cabdff1aSopenharmony_ciav_cold int ff_dca_core_init(DCACoreDecoder *s) 2415cabdff1aSopenharmony_ci{ 2416cabdff1aSopenharmony_ci if (!(s->float_dsp = avpriv_float_dsp_alloc(0))) 2417cabdff1aSopenharmony_ci return -1; 2418cabdff1aSopenharmony_ci if (!(s->fixed_dsp = avpriv_alloc_fixed_dsp(0))) 2419cabdff1aSopenharmony_ci return -1; 2420cabdff1aSopenharmony_ci 2421cabdff1aSopenharmony_ci ff_dcadct_init(&s->dcadct); 2422cabdff1aSopenharmony_ci if (ff_mdct_init(&s->imdct[0], 6, 1, 1.0) < 0) 2423cabdff1aSopenharmony_ci return -1; 2424cabdff1aSopenharmony_ci if (ff_mdct_init(&s->imdct[1], 7, 1, 1.0) < 0) 2425cabdff1aSopenharmony_ci return -1; 2426cabdff1aSopenharmony_ci ff_synth_filter_init(&s->synth); 2427cabdff1aSopenharmony_ci 2428cabdff1aSopenharmony_ci s->x96_rand = 1; 2429cabdff1aSopenharmony_ci return 0; 2430cabdff1aSopenharmony_ci} 2431cabdff1aSopenharmony_ci 2432cabdff1aSopenharmony_ciav_cold void ff_dca_core_close(DCACoreDecoder *s) 2433cabdff1aSopenharmony_ci{ 2434cabdff1aSopenharmony_ci av_freep(&s->float_dsp); 2435cabdff1aSopenharmony_ci av_freep(&s->fixed_dsp); 2436cabdff1aSopenharmony_ci 2437cabdff1aSopenharmony_ci ff_mdct_end(&s->imdct[0]); 2438cabdff1aSopenharmony_ci ff_mdct_end(&s->imdct[1]); 2439cabdff1aSopenharmony_ci 2440cabdff1aSopenharmony_ci av_freep(&s->subband_buffer); 2441cabdff1aSopenharmony_ci s->subband_size = 0; 2442cabdff1aSopenharmony_ci 2443cabdff1aSopenharmony_ci av_freep(&s->x96_subband_buffer); 2444cabdff1aSopenharmony_ci s->x96_subband_size = 0; 2445cabdff1aSopenharmony_ci 2446cabdff1aSopenharmony_ci av_freep(&s->output_buffer); 2447cabdff1aSopenharmony_ci s->output_size = 0; 2448cabdff1aSopenharmony_ci} 2449