1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * This file is part of FFmpeg. 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 5cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 6cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 7cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12cabdff1aSopenharmony_ci * Lesser General Public License for more details. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 15cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 16cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17cabdff1aSopenharmony_ci */ 18cabdff1aSopenharmony_ci 19cabdff1aSopenharmony_ci#include "libavutil/crc.h" 20cabdff1aSopenharmony_ci#include "libavutil/float_dsp.h" 21cabdff1aSopenharmony_ci#include "libavutil/intreadwrite.h" 22cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h" 23cabdff1aSopenharmony_ci#include "libavutil/tx.h" 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci#include "avcodec.h" 26cabdff1aSopenharmony_ci#include "bytestream.h" 27cabdff1aSopenharmony_ci#include "codec_internal.h" 28cabdff1aSopenharmony_ci#include "get_bits.h" 29cabdff1aSopenharmony_ci#include "internal.h" 30cabdff1aSopenharmony_ci#include "hca_data.h" 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_citypedef struct ChannelContext { 33cabdff1aSopenharmony_ci float base[128]; 34cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, float, imdct_in)[128]; 35cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, float, imdct_out)[128]; 36cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, float, imdct_prev)[128]; 37cabdff1aSopenharmony_ci int8_t scale_factors[128]; 38cabdff1aSopenharmony_ci uint8_t scale[128]; 39cabdff1aSopenharmony_ci int8_t intensity[8]; 40cabdff1aSopenharmony_ci int8_t *hfr_scale; 41cabdff1aSopenharmony_ci unsigned count; 42cabdff1aSopenharmony_ci int chan_type; 43cabdff1aSopenharmony_ci} ChannelContext; 44cabdff1aSopenharmony_ci 45cabdff1aSopenharmony_citypedef struct HCAContext { 46cabdff1aSopenharmony_ci const AVCRC *crc_table; 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_ci ChannelContext ch[16]; 49cabdff1aSopenharmony_ci 50cabdff1aSopenharmony_ci uint8_t ath[128]; 51cabdff1aSopenharmony_ci 52cabdff1aSopenharmony_ci int ath_type; 53cabdff1aSopenharmony_ci unsigned hfr_group_count; 54cabdff1aSopenharmony_ci uint8_t track_count; 55cabdff1aSopenharmony_ci uint8_t channel_config; 56cabdff1aSopenharmony_ci uint8_t total_band_count; 57cabdff1aSopenharmony_ci uint8_t base_band_count; 58cabdff1aSopenharmony_ci uint8_t stereo_band_count; 59cabdff1aSopenharmony_ci uint8_t bands_per_hfr_group; 60cabdff1aSopenharmony_ci 61cabdff1aSopenharmony_ci av_tx_fn tx_fn; 62cabdff1aSopenharmony_ci AVTXContext *tx_ctx; 63cabdff1aSopenharmony_ci AVFloatDSPContext *fdsp; 64cabdff1aSopenharmony_ci} HCAContext; 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_cistatic void ath_init1(uint8_t *ath, int sample_rate) 67cabdff1aSopenharmony_ci{ 68cabdff1aSopenharmony_ci unsigned int index; 69cabdff1aSopenharmony_ci unsigned int acc = 0; 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_ci for (int i = 0; i < 128; i++) { 72cabdff1aSopenharmony_ci acc += sample_rate; 73cabdff1aSopenharmony_ci index = acc >> 13; 74cabdff1aSopenharmony_ci 75cabdff1aSopenharmony_ci if (index >= 654) { 76cabdff1aSopenharmony_ci memset(ath+i, 0xFF, (128 - i)); 77cabdff1aSopenharmony_ci break; 78cabdff1aSopenharmony_ci } 79cabdff1aSopenharmony_ci 80cabdff1aSopenharmony_ci ath[i] = ath_base_curve[index]; 81cabdff1aSopenharmony_ci } 82cabdff1aSopenharmony_ci} 83cabdff1aSopenharmony_ci 84cabdff1aSopenharmony_cistatic int ath_init(uint8_t *ath, int type, int sample_rate) 85cabdff1aSopenharmony_ci{ 86cabdff1aSopenharmony_ci switch (type) { 87cabdff1aSopenharmony_ci case 0: 88cabdff1aSopenharmony_ci /* nothing to do */ 89cabdff1aSopenharmony_ci break; 90cabdff1aSopenharmony_ci case 1: 91cabdff1aSopenharmony_ci ath_init1(ath, sample_rate); 92cabdff1aSopenharmony_ci break; 93cabdff1aSopenharmony_ci default: 94cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 95cabdff1aSopenharmony_ci } 96cabdff1aSopenharmony_ci 97cabdff1aSopenharmony_ci return 0; 98cabdff1aSopenharmony_ci} 99cabdff1aSopenharmony_ci 100cabdff1aSopenharmony_cistatic inline unsigned ceil2(unsigned a, unsigned b) 101cabdff1aSopenharmony_ci{ 102cabdff1aSopenharmony_ci return (b > 0) ? (a / b + ((a % b) ? 1 : 0)) : 0; 103cabdff1aSopenharmony_ci} 104cabdff1aSopenharmony_ci 105cabdff1aSopenharmony_cistatic av_cold int decode_init(AVCodecContext *avctx) 106cabdff1aSopenharmony_ci{ 107cabdff1aSopenharmony_ci HCAContext *c = avctx->priv_data; 108cabdff1aSopenharmony_ci GetByteContext gb0, *const gb = &gb0; 109cabdff1aSopenharmony_ci int8_t r[16] = { 0 }; 110cabdff1aSopenharmony_ci float scale = 1.f / 8.f; 111cabdff1aSopenharmony_ci unsigned b, chunk; 112cabdff1aSopenharmony_ci int version, ret; 113cabdff1aSopenharmony_ci 114cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; 115cabdff1aSopenharmony_ci c->crc_table = av_crc_get_table(AV_CRC_16_ANSI); 116cabdff1aSopenharmony_ci 117cabdff1aSopenharmony_ci if (avctx->ch_layout.nb_channels <= 0 || avctx->ch_layout.nb_channels > 16) 118cabdff1aSopenharmony_ci return AVERROR(EINVAL); 119cabdff1aSopenharmony_ci 120cabdff1aSopenharmony_ci if (avctx->extradata_size < 36) 121cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 122cabdff1aSopenharmony_ci bytestream2_init(gb, avctx->extradata, avctx->extradata_size); 123cabdff1aSopenharmony_ci 124cabdff1aSopenharmony_ci bytestream2_skipu(gb, 4); 125cabdff1aSopenharmony_ci version = bytestream2_get_be16(gb); 126cabdff1aSopenharmony_ci bytestream2_skipu(gb, 2); 127cabdff1aSopenharmony_ci 128cabdff1aSopenharmony_ci c->ath_type = version >= 0x200 ? 0 : 1; 129cabdff1aSopenharmony_ci 130cabdff1aSopenharmony_ci if (bytestream2_get_be32u(gb) != MKBETAG('f', 'm', 't', 0)) 131cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 132cabdff1aSopenharmony_ci bytestream2_skipu(gb, 4); 133cabdff1aSopenharmony_ci bytestream2_skipu(gb, 4); 134cabdff1aSopenharmony_ci bytestream2_skipu(gb, 4); 135cabdff1aSopenharmony_ci 136cabdff1aSopenharmony_ci chunk = bytestream2_get_be32u(gb); 137cabdff1aSopenharmony_ci if (chunk == MKBETAG('c', 'o', 'm', 'p')) { 138cabdff1aSopenharmony_ci bytestream2_skipu(gb, 2); 139cabdff1aSopenharmony_ci bytestream2_skipu(gb, 1); 140cabdff1aSopenharmony_ci bytestream2_skipu(gb, 1); 141cabdff1aSopenharmony_ci c->track_count = bytestream2_get_byteu(gb); 142cabdff1aSopenharmony_ci c->channel_config = bytestream2_get_byteu(gb); 143cabdff1aSopenharmony_ci c->total_band_count = bytestream2_get_byteu(gb); 144cabdff1aSopenharmony_ci c->base_band_count = bytestream2_get_byteu(gb); 145cabdff1aSopenharmony_ci c->stereo_band_count = bytestream2_get_byte (gb); 146cabdff1aSopenharmony_ci c->bands_per_hfr_group = bytestream2_get_byte (gb); 147cabdff1aSopenharmony_ci } else if (chunk == MKBETAG('d', 'e', 'c', 0)) { 148cabdff1aSopenharmony_ci bytestream2_skipu(gb, 2); 149cabdff1aSopenharmony_ci bytestream2_skipu(gb, 1); 150cabdff1aSopenharmony_ci bytestream2_skipu(gb, 1); 151cabdff1aSopenharmony_ci c->total_band_count = bytestream2_get_byteu(gb) + 1; 152cabdff1aSopenharmony_ci c->base_band_count = bytestream2_get_byteu(gb) + 1; 153cabdff1aSopenharmony_ci c->track_count = bytestream2_peek_byteu(gb) >> 4; 154cabdff1aSopenharmony_ci c->channel_config = bytestream2_get_byteu(gb) & 0xF; 155cabdff1aSopenharmony_ci if (!bytestream2_get_byteu(gb)) 156cabdff1aSopenharmony_ci c->base_band_count = c->total_band_count; 157cabdff1aSopenharmony_ci c->stereo_band_count = c->total_band_count - c->base_band_count; 158cabdff1aSopenharmony_ci c->bands_per_hfr_group = 0; 159cabdff1aSopenharmony_ci } else 160cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 161cabdff1aSopenharmony_ci 162cabdff1aSopenharmony_ci if (c->total_band_count > FF_ARRAY_ELEMS(c->ch->imdct_in)) 163cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 164cabdff1aSopenharmony_ci 165cabdff1aSopenharmony_ci 166cabdff1aSopenharmony_ci while (bytestream2_get_bytes_left(gb) >= 4) { 167cabdff1aSopenharmony_ci chunk = bytestream2_get_be32u(gb); 168cabdff1aSopenharmony_ci if (chunk == MKBETAG('v', 'b', 'r', 0)) { 169cabdff1aSopenharmony_ci bytestream2_skip(gb, 2 + 2); 170cabdff1aSopenharmony_ci } else if (chunk == MKBETAG('a', 't', 'h', 0)) { 171cabdff1aSopenharmony_ci c->ath_type = bytestream2_get_be16(gb); 172cabdff1aSopenharmony_ci } else if (chunk == MKBETAG('r', 'v', 'a', 0)) { 173cabdff1aSopenharmony_ci bytestream2_skip(gb, 4); 174cabdff1aSopenharmony_ci } else if (chunk == MKBETAG('c', 'o', 'm', 'm')) { 175cabdff1aSopenharmony_ci bytestream2_skip(gb, bytestream2_get_byte(gb) * 8); 176cabdff1aSopenharmony_ci } else if (chunk == MKBETAG('c', 'i', 'p', 'h')) { 177cabdff1aSopenharmony_ci bytestream2_skip(gb, 2); 178cabdff1aSopenharmony_ci } else if (chunk == MKBETAG('l', 'o', 'o', 'p')) { 179cabdff1aSopenharmony_ci bytestream2_skip(gb, 4 + 4 + 2 + 2); 180cabdff1aSopenharmony_ci } else if (chunk == MKBETAG('p', 'a', 'd', 0)) { 181cabdff1aSopenharmony_ci break; 182cabdff1aSopenharmony_ci } else { 183cabdff1aSopenharmony_ci break; 184cabdff1aSopenharmony_ci } 185cabdff1aSopenharmony_ci } 186cabdff1aSopenharmony_ci 187cabdff1aSopenharmony_ci ret = ath_init(c->ath, c->ath_type, avctx->sample_rate); 188cabdff1aSopenharmony_ci if (ret < 0) 189cabdff1aSopenharmony_ci return ret; 190cabdff1aSopenharmony_ci 191cabdff1aSopenharmony_ci if (!c->track_count) 192cabdff1aSopenharmony_ci c->track_count = 1; 193cabdff1aSopenharmony_ci 194cabdff1aSopenharmony_ci b = avctx->ch_layout.nb_channels / c->track_count; 195cabdff1aSopenharmony_ci if (c->stereo_band_count && b > 1) { 196cabdff1aSopenharmony_ci int8_t *x = r; 197cabdff1aSopenharmony_ci 198cabdff1aSopenharmony_ci for (int i = 0; i < c->track_count; i++, x+=b) { 199cabdff1aSopenharmony_ci switch (b) { 200cabdff1aSopenharmony_ci case 2: 201cabdff1aSopenharmony_ci case 3: 202cabdff1aSopenharmony_ci x[0] = 1; 203cabdff1aSopenharmony_ci x[1] = 2; 204cabdff1aSopenharmony_ci break; 205cabdff1aSopenharmony_ci case 4: 206cabdff1aSopenharmony_ci x[0]=1; x[1] = 2; 207cabdff1aSopenharmony_ci if (c->channel_config == 0) { 208cabdff1aSopenharmony_ci x[2]=1; 209cabdff1aSopenharmony_ci x[3]=2; 210cabdff1aSopenharmony_ci } 211cabdff1aSopenharmony_ci break; 212cabdff1aSopenharmony_ci case 5: 213cabdff1aSopenharmony_ci x[0]=1; x[1] = 2; 214cabdff1aSopenharmony_ci if (c->channel_config <= 2) { 215cabdff1aSopenharmony_ci x[3]=1; 216cabdff1aSopenharmony_ci x[4]=2; 217cabdff1aSopenharmony_ci } 218cabdff1aSopenharmony_ci break; 219cabdff1aSopenharmony_ci case 6: 220cabdff1aSopenharmony_ci case 7: 221cabdff1aSopenharmony_ci x[0] = 1; x[1] = 2; x[4] = 1; x[5] = 2; 222cabdff1aSopenharmony_ci break; 223cabdff1aSopenharmony_ci case 8: 224cabdff1aSopenharmony_ci x[0] = 1; x[1] = 2; x[4] = 1; x[5] = 2; x[6] = 1; x[7] = 2; 225cabdff1aSopenharmony_ci break; 226cabdff1aSopenharmony_ci } 227cabdff1aSopenharmony_ci } 228cabdff1aSopenharmony_ci } 229cabdff1aSopenharmony_ci 230cabdff1aSopenharmony_ci if (c->total_band_count < c->base_band_count) 231cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 232cabdff1aSopenharmony_ci 233cabdff1aSopenharmony_ci c->hfr_group_count = ceil2(c->total_band_count - (c->base_band_count + c->stereo_band_count), 234cabdff1aSopenharmony_ci c->bands_per_hfr_group); 235cabdff1aSopenharmony_ci 236cabdff1aSopenharmony_ci if (c->base_band_count + c->stereo_band_count + (unsigned long)c->hfr_group_count > 128ULL) 237cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 238cabdff1aSopenharmony_ci 239cabdff1aSopenharmony_ci for (int i = 0; i < avctx->ch_layout.nb_channels; i++) { 240cabdff1aSopenharmony_ci c->ch[i].chan_type = r[i]; 241cabdff1aSopenharmony_ci c->ch[i].count = c->base_band_count + ((r[i] != 2) ? c->stereo_band_count : 0); 242cabdff1aSopenharmony_ci c->ch[i].hfr_scale = &c->ch[i].scale_factors[c->base_band_count + c->stereo_band_count]; 243cabdff1aSopenharmony_ci if (c->ch[i].count > 128) 244cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 245cabdff1aSopenharmony_ci } 246cabdff1aSopenharmony_ci 247cabdff1aSopenharmony_ci c->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT); 248cabdff1aSopenharmony_ci if (!c->fdsp) 249cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 250cabdff1aSopenharmony_ci 251cabdff1aSopenharmony_ci return av_tx_init(&c->tx_ctx, &c->tx_fn, AV_TX_FLOAT_MDCT, 1, 128, &scale, 0); 252cabdff1aSopenharmony_ci} 253cabdff1aSopenharmony_ci 254cabdff1aSopenharmony_cistatic void run_imdct(HCAContext *c, ChannelContext *ch, int index, float *out) 255cabdff1aSopenharmony_ci{ 256cabdff1aSopenharmony_ci c->tx_fn(c->tx_ctx, ch->imdct_out, ch->imdct_in, sizeof(float)); 257cabdff1aSopenharmony_ci 258cabdff1aSopenharmony_ci c->fdsp->vector_fmul_window(out, ch->imdct_prev + (128 >> 1), 259cabdff1aSopenharmony_ci ch->imdct_out, window, 128 >> 1); 260cabdff1aSopenharmony_ci 261cabdff1aSopenharmony_ci memcpy(ch->imdct_prev, ch->imdct_out, 128 * sizeof(float)); 262cabdff1aSopenharmony_ci} 263cabdff1aSopenharmony_ci 264cabdff1aSopenharmony_cistatic void apply_intensity_stereo(HCAContext *s, ChannelContext *ch1, ChannelContext *ch2, 265cabdff1aSopenharmony_ci int index, unsigned band_count, unsigned base_band_count, 266cabdff1aSopenharmony_ci unsigned stereo_band_count) 267cabdff1aSopenharmony_ci{ 268cabdff1aSopenharmony_ci float ratio_l = intensity_ratio_table[ch2->intensity[index]]; 269cabdff1aSopenharmony_ci float ratio_r = ratio_l - 2.0f; 270cabdff1aSopenharmony_ci float *c1 = &ch1->imdct_in[base_band_count]; 271cabdff1aSopenharmony_ci float *c2 = &ch2->imdct_in[base_band_count]; 272cabdff1aSopenharmony_ci 273cabdff1aSopenharmony_ci if (ch1->chan_type != 1 || !stereo_band_count) 274cabdff1aSopenharmony_ci return; 275cabdff1aSopenharmony_ci 276cabdff1aSopenharmony_ci for (int i = 0; i < band_count; i++) { 277cabdff1aSopenharmony_ci *(c2++) = *c1 * ratio_r; 278cabdff1aSopenharmony_ci *(c1++) *= ratio_l; 279cabdff1aSopenharmony_ci } 280cabdff1aSopenharmony_ci} 281cabdff1aSopenharmony_ci 282cabdff1aSopenharmony_cistatic void reconstruct_hfr(HCAContext *s, ChannelContext *ch, 283cabdff1aSopenharmony_ci unsigned hfr_group_count, 284cabdff1aSopenharmony_ci unsigned bands_per_hfr_group, 285cabdff1aSopenharmony_ci unsigned start_band, unsigned total_band_count) 286cabdff1aSopenharmony_ci{ 287cabdff1aSopenharmony_ci if (ch->chan_type == 2 || !bands_per_hfr_group) 288cabdff1aSopenharmony_ci return; 289cabdff1aSopenharmony_ci 290cabdff1aSopenharmony_ci for (int i = 0, k = start_band, l = start_band - 1; i < hfr_group_count; i++){ 291cabdff1aSopenharmony_ci for (int j = 0; j < bands_per_hfr_group && k < total_band_count && l >= 0; j++, k++, l--){ 292cabdff1aSopenharmony_ci ch->imdct_in[k] = scale_conversion_table[ scale_conv_bias + 293cabdff1aSopenharmony_ci av_clip_intp2(ch->hfr_scale[i] - ch->scale_factors[l], 6) ] * ch->imdct_in[l]; 294cabdff1aSopenharmony_ci } 295cabdff1aSopenharmony_ci } 296cabdff1aSopenharmony_ci 297cabdff1aSopenharmony_ci ch->imdct_in[127] = 0; 298cabdff1aSopenharmony_ci} 299cabdff1aSopenharmony_ci 300cabdff1aSopenharmony_cistatic void dequantize_coefficients(HCAContext *c, ChannelContext *ch, 301cabdff1aSopenharmony_ci GetBitContext *gb) 302cabdff1aSopenharmony_ci{ 303cabdff1aSopenharmony_ci for (int i = 0; i < ch->count; i++) { 304cabdff1aSopenharmony_ci unsigned scale = ch->scale[i]; 305cabdff1aSopenharmony_ci int nb_bits = max_bits_table[scale]; 306cabdff1aSopenharmony_ci int value = get_bitsz(gb, nb_bits); 307cabdff1aSopenharmony_ci float factor; 308cabdff1aSopenharmony_ci 309cabdff1aSopenharmony_ci if (scale > 7) { 310cabdff1aSopenharmony_ci value = (1 - ((value & 1) << 1)) * (value >> 1); 311cabdff1aSopenharmony_ci if (!value) 312cabdff1aSopenharmony_ci skip_bits_long(gb, -1); 313cabdff1aSopenharmony_ci factor = value; 314cabdff1aSopenharmony_ci } else { 315cabdff1aSopenharmony_ci value += scale << 4; 316cabdff1aSopenharmony_ci skip_bits_long(gb, quant_spectrum_bits[value] - nb_bits); 317cabdff1aSopenharmony_ci factor = quant_spectrum_value[value]; 318cabdff1aSopenharmony_ci } 319cabdff1aSopenharmony_ci ch->imdct_in[i] = factor * ch->base[i]; 320cabdff1aSopenharmony_ci } 321cabdff1aSopenharmony_ci 322cabdff1aSopenharmony_ci memset(ch->imdct_in + ch->count, 0, sizeof(ch->imdct_in) - ch->count * sizeof(ch->imdct_in[0])); 323cabdff1aSopenharmony_ci} 324cabdff1aSopenharmony_ci 325cabdff1aSopenharmony_cistatic void unpack(HCAContext *c, ChannelContext *ch, 326cabdff1aSopenharmony_ci GetBitContext *gb, 327cabdff1aSopenharmony_ci unsigned hfr_group_count, 328cabdff1aSopenharmony_ci int packed_noise_level, 329cabdff1aSopenharmony_ci const uint8_t *ath) 330cabdff1aSopenharmony_ci{ 331cabdff1aSopenharmony_ci int delta_bits = get_bits(gb, 3); 332cabdff1aSopenharmony_ci 333cabdff1aSopenharmony_ci if (delta_bits > 5) { 334cabdff1aSopenharmony_ci for (int i = 0; i < ch->count; i++) 335cabdff1aSopenharmony_ci ch->scale_factors[i] = get_bits(gb, 6); 336cabdff1aSopenharmony_ci } else if (delta_bits) { 337cabdff1aSopenharmony_ci int factor = get_bits(gb, 6); 338cabdff1aSopenharmony_ci int max_value = (1 << delta_bits) - 1; 339cabdff1aSopenharmony_ci int half_max = max_value >> 1; 340cabdff1aSopenharmony_ci 341cabdff1aSopenharmony_ci ch->scale_factors[0] = factor; 342cabdff1aSopenharmony_ci for (int i = 1; i < ch->count; i++){ 343cabdff1aSopenharmony_ci int delta = get_bits(gb, delta_bits); 344cabdff1aSopenharmony_ci 345cabdff1aSopenharmony_ci if (delta == max_value) { 346cabdff1aSopenharmony_ci factor = get_bits(gb, 6); 347cabdff1aSopenharmony_ci } else { 348cabdff1aSopenharmony_ci factor += delta - half_max; 349cabdff1aSopenharmony_ci } 350cabdff1aSopenharmony_ci factor = av_clip_uintp2(factor, 6); 351cabdff1aSopenharmony_ci 352cabdff1aSopenharmony_ci ch->scale_factors[i] = factor; 353cabdff1aSopenharmony_ci } 354cabdff1aSopenharmony_ci } else { 355cabdff1aSopenharmony_ci memset(ch->scale_factors, 0, 128); 356cabdff1aSopenharmony_ci } 357cabdff1aSopenharmony_ci 358cabdff1aSopenharmony_ci if (ch->chan_type == 2){ 359cabdff1aSopenharmony_ci ch->intensity[0] = get_bits(gb, 4); 360cabdff1aSopenharmony_ci if (ch->intensity[0] < 15) { 361cabdff1aSopenharmony_ci for (int i = 1; i < 8; i++) 362cabdff1aSopenharmony_ci ch->intensity[i] = get_bits(gb, 4); 363cabdff1aSopenharmony_ci } 364cabdff1aSopenharmony_ci } else { 365cabdff1aSopenharmony_ci for (int i = 0; i < hfr_group_count; i++) 366cabdff1aSopenharmony_ci ch->hfr_scale[i] = get_bits(gb, 6); 367cabdff1aSopenharmony_ci } 368cabdff1aSopenharmony_ci 369cabdff1aSopenharmony_ci for (int i = 0; i < ch->count; i++) { 370cabdff1aSopenharmony_ci int scale = ch->scale_factors[i]; 371cabdff1aSopenharmony_ci 372cabdff1aSopenharmony_ci if (scale) { 373cabdff1aSopenharmony_ci scale = c->ath[i] + ((packed_noise_level + i) >> 8) - ((scale * 5) >> 1) + 2; 374cabdff1aSopenharmony_ci scale = scale_table[av_clip(scale, 0, 58)]; 375cabdff1aSopenharmony_ci } 376cabdff1aSopenharmony_ci ch->scale[i] = scale; 377cabdff1aSopenharmony_ci } 378cabdff1aSopenharmony_ci 379cabdff1aSopenharmony_ci memset(ch->scale + ch->count, 0, sizeof(ch->scale) - ch->count); 380cabdff1aSopenharmony_ci 381cabdff1aSopenharmony_ci for (int i = 0; i < ch->count; i++) 382cabdff1aSopenharmony_ci ch->base[i] = dequantizer_scaling_table[ch->scale_factors[i]] * quant_step_size[ch->scale[i]]; 383cabdff1aSopenharmony_ci} 384cabdff1aSopenharmony_ci 385cabdff1aSopenharmony_cistatic int decode_frame(AVCodecContext *avctx, AVFrame *frame, 386cabdff1aSopenharmony_ci int *got_frame_ptr, AVPacket *avpkt) 387cabdff1aSopenharmony_ci{ 388cabdff1aSopenharmony_ci HCAContext *c = avctx->priv_data; 389cabdff1aSopenharmony_ci int ch, ret, packed_noise_level; 390cabdff1aSopenharmony_ci GetBitContext gb0, *const gb = &gb0; 391cabdff1aSopenharmony_ci float **samples; 392cabdff1aSopenharmony_ci 393cabdff1aSopenharmony_ci if (avctx->err_recognition & AV_EF_CRCCHECK) { 394cabdff1aSopenharmony_ci if (av_crc(c->crc_table, 0, avpkt->data, avpkt->size)) 395cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 396cabdff1aSopenharmony_ci } 397cabdff1aSopenharmony_ci 398cabdff1aSopenharmony_ci if ((ret = init_get_bits8(gb, avpkt->data, avpkt->size)) < 0) 399cabdff1aSopenharmony_ci return ret; 400cabdff1aSopenharmony_ci 401cabdff1aSopenharmony_ci if (get_bits(gb, 16) != 0xFFFF) 402cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 403cabdff1aSopenharmony_ci 404cabdff1aSopenharmony_ci frame->nb_samples = 1024; 405cabdff1aSopenharmony_ci if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) 406cabdff1aSopenharmony_ci return ret; 407cabdff1aSopenharmony_ci samples = (float **)frame->extended_data; 408cabdff1aSopenharmony_ci 409cabdff1aSopenharmony_ci packed_noise_level = (get_bits(gb, 9) << 8) - get_bits(gb, 7); 410cabdff1aSopenharmony_ci 411cabdff1aSopenharmony_ci for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++) 412cabdff1aSopenharmony_ci unpack(c, &c->ch[ch], gb, c->hfr_group_count, packed_noise_level, c->ath); 413cabdff1aSopenharmony_ci 414cabdff1aSopenharmony_ci for (int i = 0; i < 8; i++) { 415cabdff1aSopenharmony_ci for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++) 416cabdff1aSopenharmony_ci dequantize_coefficients(c, &c->ch[ch], gb); 417cabdff1aSopenharmony_ci for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++) 418cabdff1aSopenharmony_ci reconstruct_hfr(c, &c->ch[ch], c->hfr_group_count, c->bands_per_hfr_group, 419cabdff1aSopenharmony_ci c->stereo_band_count + c->base_band_count, c->total_band_count); 420cabdff1aSopenharmony_ci for (ch = 0; ch < avctx->ch_layout.nb_channels - 1; ch++) 421cabdff1aSopenharmony_ci apply_intensity_stereo(c, &c->ch[ch], &c->ch[ch+1], i, 422cabdff1aSopenharmony_ci c->total_band_count - c->base_band_count, 423cabdff1aSopenharmony_ci c->base_band_count, c->stereo_band_count); 424cabdff1aSopenharmony_ci for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++) 425cabdff1aSopenharmony_ci run_imdct(c, &c->ch[ch], i, samples[ch] + i * 128); 426cabdff1aSopenharmony_ci } 427cabdff1aSopenharmony_ci 428cabdff1aSopenharmony_ci *got_frame_ptr = 1; 429cabdff1aSopenharmony_ci 430cabdff1aSopenharmony_ci return avpkt->size; 431cabdff1aSopenharmony_ci} 432cabdff1aSopenharmony_ci 433cabdff1aSopenharmony_cistatic av_cold int decode_close(AVCodecContext *avctx) 434cabdff1aSopenharmony_ci{ 435cabdff1aSopenharmony_ci HCAContext *c = avctx->priv_data; 436cabdff1aSopenharmony_ci 437cabdff1aSopenharmony_ci av_freep(&c->fdsp); 438cabdff1aSopenharmony_ci av_tx_uninit(&c->tx_ctx); 439cabdff1aSopenharmony_ci 440cabdff1aSopenharmony_ci return 0; 441cabdff1aSopenharmony_ci} 442cabdff1aSopenharmony_ci 443cabdff1aSopenharmony_ciconst FFCodec ff_hca_decoder = { 444cabdff1aSopenharmony_ci .p.name = "hca", 445cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("CRI HCA"), 446cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 447cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_HCA, 448cabdff1aSopenharmony_ci .priv_data_size = sizeof(HCAContext), 449cabdff1aSopenharmony_ci .init = decode_init, 450cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(decode_frame), 451cabdff1aSopenharmony_ci .close = decode_close, 452cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1, 453cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, 454cabdff1aSopenharmony_ci .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, 455cabdff1aSopenharmony_ci AV_SAMPLE_FMT_NONE }, 456cabdff1aSopenharmony_ci}; 457