1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * ATRAC9 decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2018 Rostislav Pehlivanov <atomnuker@gmail.com> 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h" 23cabdff1aSopenharmony_ci#include "libavutil/thread.h" 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci#include "codec_internal.h" 26cabdff1aSopenharmony_ci#include "internal.h" 27cabdff1aSopenharmony_ci#include "get_bits.h" 28cabdff1aSopenharmony_ci#include "fft.h" 29cabdff1aSopenharmony_ci#include "atrac9tab.h" 30cabdff1aSopenharmony_ci#include "libavutil/lfg.h" 31cabdff1aSopenharmony_ci#include "libavutil/float_dsp.h" 32cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h" 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_ci#define ATRAC9_SF_VLC_BITS 8 35cabdff1aSopenharmony_ci#define ATRAC9_COEFF_VLC_BITS 9 36cabdff1aSopenharmony_ci 37cabdff1aSopenharmony_citypedef struct ATRAC9ChannelData { 38cabdff1aSopenharmony_ci int band_ext; 39cabdff1aSopenharmony_ci int q_unit_cnt; 40cabdff1aSopenharmony_ci int band_ext_data[4]; 41cabdff1aSopenharmony_ci int32_t scalefactors[31]; 42cabdff1aSopenharmony_ci int32_t scalefactors_prev[31]; 43cabdff1aSopenharmony_ci 44cabdff1aSopenharmony_ci int precision_coarse[30]; 45cabdff1aSopenharmony_ci int precision_fine[30]; 46cabdff1aSopenharmony_ci int precision_mask[30]; 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_ci int codebookset[30]; 49cabdff1aSopenharmony_ci 50cabdff1aSopenharmony_ci int32_t q_coeffs_coarse[256]; 51cabdff1aSopenharmony_ci int32_t q_coeffs_fine[256]; 52cabdff1aSopenharmony_ci 53cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, float, coeffs )[256]; 54cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, float, prev_win)[128]; 55cabdff1aSopenharmony_ci} ATRAC9ChannelData; 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_citypedef struct ATRAC9BlockData { 58cabdff1aSopenharmony_ci ATRAC9ChannelData channel[2]; 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_ci /* Base */ 61cabdff1aSopenharmony_ci int band_count; 62cabdff1aSopenharmony_ci int q_unit_cnt; 63cabdff1aSopenharmony_ci int q_unit_cnt_prev; 64cabdff1aSopenharmony_ci 65cabdff1aSopenharmony_ci /* Stereo block only */ 66cabdff1aSopenharmony_ci int stereo_q_unit; 67cabdff1aSopenharmony_ci 68cabdff1aSopenharmony_ci /* Band extension only */ 69cabdff1aSopenharmony_ci int has_band_ext; 70cabdff1aSopenharmony_ci int has_band_ext_data; 71cabdff1aSopenharmony_ci int band_ext_q_unit; 72cabdff1aSopenharmony_ci 73cabdff1aSopenharmony_ci /* Gradient */ 74cabdff1aSopenharmony_ci int grad_mode; 75cabdff1aSopenharmony_ci int grad_boundary; 76cabdff1aSopenharmony_ci int gradient[31]; 77cabdff1aSopenharmony_ci 78cabdff1aSopenharmony_ci /* Stereo */ 79cabdff1aSopenharmony_ci int cpe_base_channel; 80cabdff1aSopenharmony_ci int is_signs[30]; 81cabdff1aSopenharmony_ci 82cabdff1aSopenharmony_ci int reuseable; 83cabdff1aSopenharmony_ci 84cabdff1aSopenharmony_ci} ATRAC9BlockData; 85cabdff1aSopenharmony_ci 86cabdff1aSopenharmony_citypedef struct ATRAC9Context { 87cabdff1aSopenharmony_ci AVCodecContext *avctx; 88cabdff1aSopenharmony_ci AVFloatDSPContext *fdsp; 89cabdff1aSopenharmony_ci FFTContext imdct; 90cabdff1aSopenharmony_ci ATRAC9BlockData block[5]; 91cabdff1aSopenharmony_ci AVLFG lfg; 92cabdff1aSopenharmony_ci 93cabdff1aSopenharmony_ci /* Set on init */ 94cabdff1aSopenharmony_ci int frame_log2; 95cabdff1aSopenharmony_ci int avg_frame_size; 96cabdff1aSopenharmony_ci int frame_count; 97cabdff1aSopenharmony_ci int samplerate_idx; 98cabdff1aSopenharmony_ci const ATRAC9BlockConfig *block_config; 99cabdff1aSopenharmony_ci 100cabdff1aSopenharmony_ci /* Generated on init */ 101cabdff1aSopenharmony_ci uint8_t alloc_curve[48][48]; 102cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, float, imdct_win)[256]; 103cabdff1aSopenharmony_ci 104cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, float, temp)[256]; 105cabdff1aSopenharmony_ci} ATRAC9Context; 106cabdff1aSopenharmony_ci 107cabdff1aSopenharmony_cistatic VLC sf_vlc[2][8]; /* Signed/unsigned, length */ 108cabdff1aSopenharmony_cistatic VLC coeff_vlc[2][8][4]; /* Cookbook, precision, cookbook index */ 109cabdff1aSopenharmony_ci 110cabdff1aSopenharmony_cistatic inline int parse_gradient(ATRAC9Context *s, ATRAC9BlockData *b, 111cabdff1aSopenharmony_ci GetBitContext *gb) 112cabdff1aSopenharmony_ci{ 113cabdff1aSopenharmony_ci int grad_range[2]; 114cabdff1aSopenharmony_ci int grad_value[2]; 115cabdff1aSopenharmony_ci int values, sign, base; 116cabdff1aSopenharmony_ci uint8_t *curve; 117cabdff1aSopenharmony_ci float scale; 118cabdff1aSopenharmony_ci 119cabdff1aSopenharmony_ci b->grad_mode = get_bits(gb, 2); 120cabdff1aSopenharmony_ci if (b->grad_mode) { 121cabdff1aSopenharmony_ci grad_range[0] = get_bits(gb, 5); 122cabdff1aSopenharmony_ci grad_range[1] = 31; 123cabdff1aSopenharmony_ci grad_value[0] = get_bits(gb, 5); 124cabdff1aSopenharmony_ci grad_value[1] = 31; 125cabdff1aSopenharmony_ci } else { 126cabdff1aSopenharmony_ci grad_range[0] = get_bits(gb, 6); 127cabdff1aSopenharmony_ci grad_range[1] = get_bits(gb, 6) + 1; 128cabdff1aSopenharmony_ci grad_value[0] = get_bits(gb, 5); 129cabdff1aSopenharmony_ci grad_value[1] = get_bits(gb, 5); 130cabdff1aSopenharmony_ci } 131cabdff1aSopenharmony_ci b->grad_boundary = get_bits(gb, 4); 132cabdff1aSopenharmony_ci 133cabdff1aSopenharmony_ci if (grad_range[0] >= grad_range[1] || grad_range[1] > 31) 134cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 135cabdff1aSopenharmony_ci 136cabdff1aSopenharmony_ci if (b->grad_boundary > b->q_unit_cnt) 137cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 138cabdff1aSopenharmony_ci 139cabdff1aSopenharmony_ci values = grad_value[1] - grad_value[0]; 140cabdff1aSopenharmony_ci sign = 1 - 2*(values < 0); 141cabdff1aSopenharmony_ci base = grad_value[0] + sign; 142cabdff1aSopenharmony_ci scale = (FFABS(values) - 1) / 31.0f; 143cabdff1aSopenharmony_ci curve = s->alloc_curve[grad_range[1] - grad_range[0] - 1]; 144cabdff1aSopenharmony_ci 145cabdff1aSopenharmony_ci for (int i = 0; i <= b->q_unit_cnt; i++) 146cabdff1aSopenharmony_ci b->gradient[i] = grad_value[i >= grad_range[0]]; 147cabdff1aSopenharmony_ci 148cabdff1aSopenharmony_ci for (int i = grad_range[0]; i < grad_range[1]; i++) 149cabdff1aSopenharmony_ci b->gradient[i] = base + sign*((int)(scale*curve[i - grad_range[0]])); 150cabdff1aSopenharmony_ci 151cabdff1aSopenharmony_ci return 0; 152cabdff1aSopenharmony_ci} 153cabdff1aSopenharmony_ci 154cabdff1aSopenharmony_cistatic inline void calc_precision(ATRAC9Context *s, ATRAC9BlockData *b, 155cabdff1aSopenharmony_ci ATRAC9ChannelData *c) 156cabdff1aSopenharmony_ci{ 157cabdff1aSopenharmony_ci memset(c->precision_mask, 0, sizeof(c->precision_mask)); 158cabdff1aSopenharmony_ci for (int i = 1; i < b->q_unit_cnt; i++) { 159cabdff1aSopenharmony_ci const int delta = FFABS(c->scalefactors[i] - c->scalefactors[i - 1]) - 1; 160cabdff1aSopenharmony_ci if (delta > 0) { 161cabdff1aSopenharmony_ci const int neg = c->scalefactors[i - 1] > c->scalefactors[i]; 162cabdff1aSopenharmony_ci c->precision_mask[i - neg] += FFMIN(delta, 5); 163cabdff1aSopenharmony_ci } 164cabdff1aSopenharmony_ci } 165cabdff1aSopenharmony_ci 166cabdff1aSopenharmony_ci if (b->grad_mode) { 167cabdff1aSopenharmony_ci for (int i = 0; i < b->q_unit_cnt; i++) { 168cabdff1aSopenharmony_ci c->precision_coarse[i] = c->scalefactors[i]; 169cabdff1aSopenharmony_ci c->precision_coarse[i] += c->precision_mask[i] - b->gradient[i]; 170cabdff1aSopenharmony_ci if (c->precision_coarse[i] < 0) 171cabdff1aSopenharmony_ci continue; 172cabdff1aSopenharmony_ci switch (b->grad_mode) { 173cabdff1aSopenharmony_ci case 1: 174cabdff1aSopenharmony_ci c->precision_coarse[i] >>= 1; 175cabdff1aSopenharmony_ci break; 176cabdff1aSopenharmony_ci case 2: 177cabdff1aSopenharmony_ci c->precision_coarse[i] = (3 * c->precision_coarse[i]) >> 3; 178cabdff1aSopenharmony_ci break; 179cabdff1aSopenharmony_ci case 3: 180cabdff1aSopenharmony_ci c->precision_coarse[i] >>= 2; 181cabdff1aSopenharmony_ci break; 182cabdff1aSopenharmony_ci } 183cabdff1aSopenharmony_ci } 184cabdff1aSopenharmony_ci } else { 185cabdff1aSopenharmony_ci for (int i = 0; i < b->q_unit_cnt; i++) 186cabdff1aSopenharmony_ci c->precision_coarse[i] = c->scalefactors[i] - b->gradient[i]; 187cabdff1aSopenharmony_ci } 188cabdff1aSopenharmony_ci 189cabdff1aSopenharmony_ci 190cabdff1aSopenharmony_ci for (int i = 0; i < b->q_unit_cnt; i++) 191cabdff1aSopenharmony_ci c->precision_coarse[i] = FFMAX(c->precision_coarse[i], 1); 192cabdff1aSopenharmony_ci 193cabdff1aSopenharmony_ci for (int i = 0; i < b->grad_boundary; i++) 194cabdff1aSopenharmony_ci c->precision_coarse[i]++; 195cabdff1aSopenharmony_ci 196cabdff1aSopenharmony_ci for (int i = 0; i < b->q_unit_cnt; i++) { 197cabdff1aSopenharmony_ci c->precision_fine[i] = 0; 198cabdff1aSopenharmony_ci if (c->precision_coarse[i] > 15) { 199cabdff1aSopenharmony_ci c->precision_fine[i] = FFMIN(c->precision_coarse[i], 30) - 15; 200cabdff1aSopenharmony_ci c->precision_coarse[i] = 15; 201cabdff1aSopenharmony_ci } 202cabdff1aSopenharmony_ci } 203cabdff1aSopenharmony_ci} 204cabdff1aSopenharmony_ci 205cabdff1aSopenharmony_cistatic inline int parse_band_ext(ATRAC9Context *s, ATRAC9BlockData *b, 206cabdff1aSopenharmony_ci GetBitContext *gb, int stereo) 207cabdff1aSopenharmony_ci{ 208cabdff1aSopenharmony_ci int ext_band = 0; 209cabdff1aSopenharmony_ci 210cabdff1aSopenharmony_ci if (b->has_band_ext) { 211cabdff1aSopenharmony_ci if (b->q_unit_cnt < 13 || b->q_unit_cnt > 20) 212cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 213cabdff1aSopenharmony_ci ext_band = at9_tab_band_ext_group[b->q_unit_cnt - 13][2]; 214cabdff1aSopenharmony_ci if (stereo) { 215cabdff1aSopenharmony_ci b->channel[1].band_ext = get_bits(gb, 2); 216cabdff1aSopenharmony_ci b->channel[1].band_ext = ext_band > 2 ? b->channel[1].band_ext : 4; 217cabdff1aSopenharmony_ci } else { 218cabdff1aSopenharmony_ci skip_bits1(gb); 219cabdff1aSopenharmony_ci } 220cabdff1aSopenharmony_ci } 221cabdff1aSopenharmony_ci 222cabdff1aSopenharmony_ci b->has_band_ext_data = get_bits1(gb); 223cabdff1aSopenharmony_ci if (!b->has_band_ext_data) 224cabdff1aSopenharmony_ci return 0; 225cabdff1aSopenharmony_ci 226cabdff1aSopenharmony_ci if (!b->has_band_ext) { 227cabdff1aSopenharmony_ci skip_bits(gb, 2); 228cabdff1aSopenharmony_ci skip_bits_long(gb, get_bits(gb, 5)); 229cabdff1aSopenharmony_ci return 0; 230cabdff1aSopenharmony_ci } 231cabdff1aSopenharmony_ci 232cabdff1aSopenharmony_ci b->channel[0].band_ext = get_bits(gb, 2); 233cabdff1aSopenharmony_ci b->channel[0].band_ext = ext_band > 2 ? b->channel[0].band_ext : 4; 234cabdff1aSopenharmony_ci 235cabdff1aSopenharmony_ci if (!get_bits(gb, 5)) { 236cabdff1aSopenharmony_ci for (int i = 0; i <= stereo; i++) { 237cabdff1aSopenharmony_ci ATRAC9ChannelData *c = &b->channel[i]; 238cabdff1aSopenharmony_ci const int count = at9_tab_band_ext_cnt[c->band_ext][ext_band]; 239cabdff1aSopenharmony_ci for (int j = 0; j < count; j++) { 240cabdff1aSopenharmony_ci int len = at9_tab_band_ext_lengths[c->band_ext][ext_band][j]; 241cabdff1aSopenharmony_ci c->band_ext_data[j] = av_clip_uintp2_c(c->band_ext_data[j], len); 242cabdff1aSopenharmony_ci } 243cabdff1aSopenharmony_ci } 244cabdff1aSopenharmony_ci 245cabdff1aSopenharmony_ci return 0; 246cabdff1aSopenharmony_ci } 247cabdff1aSopenharmony_ci 248cabdff1aSopenharmony_ci for (int i = 0; i <= stereo; i++) { 249cabdff1aSopenharmony_ci ATRAC9ChannelData *c = &b->channel[i]; 250cabdff1aSopenharmony_ci const int count = at9_tab_band_ext_cnt[c->band_ext][ext_band]; 251cabdff1aSopenharmony_ci for (int j = 0; j < count; j++) { 252cabdff1aSopenharmony_ci int len = at9_tab_band_ext_lengths[c->band_ext][ext_band][j]; 253cabdff1aSopenharmony_ci c->band_ext_data[j] = get_bits(gb, len); 254cabdff1aSopenharmony_ci } 255cabdff1aSopenharmony_ci } 256cabdff1aSopenharmony_ci 257cabdff1aSopenharmony_ci return 0; 258cabdff1aSopenharmony_ci} 259cabdff1aSopenharmony_ci 260cabdff1aSopenharmony_cistatic inline int read_scalefactors(ATRAC9Context *s, ATRAC9BlockData *b, 261cabdff1aSopenharmony_ci ATRAC9ChannelData *c, GetBitContext *gb, 262cabdff1aSopenharmony_ci int channel_idx, int first_in_pkt) 263cabdff1aSopenharmony_ci{ 264cabdff1aSopenharmony_ci static const uint8_t mode_map[2][4] = { { 0, 1, 2, 3 }, { 0, 2, 3, 4 } }; 265cabdff1aSopenharmony_ci const int mode = mode_map[channel_idx][get_bits(gb, 2)]; 266cabdff1aSopenharmony_ci 267cabdff1aSopenharmony_ci memset(c->scalefactors, 0, sizeof(c->scalefactors)); 268cabdff1aSopenharmony_ci 269cabdff1aSopenharmony_ci if (first_in_pkt && (mode == 4 || ((mode == 3) && !channel_idx))) { 270cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid scalefactor coding mode!\n"); 271cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 272cabdff1aSopenharmony_ci } 273cabdff1aSopenharmony_ci 274cabdff1aSopenharmony_ci switch (mode) { 275cabdff1aSopenharmony_ci case 0: { /* VLC delta offset */ 276cabdff1aSopenharmony_ci const uint8_t *sf_weights = at9_tab_sf_weights[get_bits(gb, 3)]; 277cabdff1aSopenharmony_ci const int base = get_bits(gb, 5); 278cabdff1aSopenharmony_ci const int len = get_bits(gb, 2) + 3; 279cabdff1aSopenharmony_ci const VLC *tab = &sf_vlc[0][len]; 280cabdff1aSopenharmony_ci 281cabdff1aSopenharmony_ci c->scalefactors[0] = get_bits(gb, len); 282cabdff1aSopenharmony_ci 283cabdff1aSopenharmony_ci for (int i = 1; i < b->band_ext_q_unit; i++) { 284cabdff1aSopenharmony_ci int val = c->scalefactors[i - 1] + get_vlc2(gb, tab->table, 285cabdff1aSopenharmony_ci ATRAC9_SF_VLC_BITS, 1); 286cabdff1aSopenharmony_ci c->scalefactors[i] = val & ((1 << len) - 1); 287cabdff1aSopenharmony_ci } 288cabdff1aSopenharmony_ci 289cabdff1aSopenharmony_ci for (int i = 0; i < b->band_ext_q_unit; i++) 290cabdff1aSopenharmony_ci c->scalefactors[i] += base - sf_weights[i]; 291cabdff1aSopenharmony_ci 292cabdff1aSopenharmony_ci break; 293cabdff1aSopenharmony_ci } 294cabdff1aSopenharmony_ci case 1: { /* CLC offset */ 295cabdff1aSopenharmony_ci const int len = get_bits(gb, 2) + 2; 296cabdff1aSopenharmony_ci const int base = len < 5 ? get_bits(gb, 5) : 0; 297cabdff1aSopenharmony_ci for (int i = 0; i < b->band_ext_q_unit; i++) 298cabdff1aSopenharmony_ci c->scalefactors[i] = base + get_bits(gb, len); 299cabdff1aSopenharmony_ci break; 300cabdff1aSopenharmony_ci } 301cabdff1aSopenharmony_ci case 2: 302cabdff1aSopenharmony_ci case 4: { /* VLC dist to baseline */ 303cabdff1aSopenharmony_ci const int *baseline = mode == 4 ? c->scalefactors_prev : 304cabdff1aSopenharmony_ci channel_idx ? b->channel[0].scalefactors : 305cabdff1aSopenharmony_ci c->scalefactors_prev; 306cabdff1aSopenharmony_ci const int baseline_len = mode == 4 ? b->q_unit_cnt_prev : 307cabdff1aSopenharmony_ci channel_idx ? b->band_ext_q_unit : 308cabdff1aSopenharmony_ci b->q_unit_cnt_prev; 309cabdff1aSopenharmony_ci 310cabdff1aSopenharmony_ci const int len = get_bits(gb, 2) + 2; 311cabdff1aSopenharmony_ci const int unit_cnt = FFMIN(b->band_ext_q_unit, baseline_len); 312cabdff1aSopenharmony_ci const VLC *tab = &sf_vlc[1][len]; 313cabdff1aSopenharmony_ci 314cabdff1aSopenharmony_ci for (int i = 0; i < unit_cnt; i++) { 315cabdff1aSopenharmony_ci int dist = get_vlc2(gb, tab->table, ATRAC9_SF_VLC_BITS, 1); 316cabdff1aSopenharmony_ci c->scalefactors[i] = baseline[i] + dist; 317cabdff1aSopenharmony_ci } 318cabdff1aSopenharmony_ci 319cabdff1aSopenharmony_ci for (int i = unit_cnt; i < b->band_ext_q_unit; i++) 320cabdff1aSopenharmony_ci c->scalefactors[i] = get_bits(gb, 5); 321cabdff1aSopenharmony_ci 322cabdff1aSopenharmony_ci break; 323cabdff1aSopenharmony_ci } 324cabdff1aSopenharmony_ci case 3: { /* VLC offset with baseline */ 325cabdff1aSopenharmony_ci const int *baseline = channel_idx ? b->channel[0].scalefactors : 326cabdff1aSopenharmony_ci c->scalefactors_prev; 327cabdff1aSopenharmony_ci const int baseline_len = channel_idx ? b->band_ext_q_unit : 328cabdff1aSopenharmony_ci b->q_unit_cnt_prev; 329cabdff1aSopenharmony_ci 330cabdff1aSopenharmony_ci const int base = get_bits(gb, 5) - (1 << (5 - 1)); 331cabdff1aSopenharmony_ci const int len = get_bits(gb, 2) + 1; 332cabdff1aSopenharmony_ci const int unit_cnt = FFMIN(b->band_ext_q_unit, baseline_len); 333cabdff1aSopenharmony_ci const VLC *tab = &sf_vlc[0][len]; 334cabdff1aSopenharmony_ci 335cabdff1aSopenharmony_ci c->scalefactors[0] = get_bits(gb, len); 336cabdff1aSopenharmony_ci 337cabdff1aSopenharmony_ci for (int i = 1; i < unit_cnt; i++) { 338cabdff1aSopenharmony_ci int val = c->scalefactors[i - 1] + get_vlc2(gb, tab->table, 339cabdff1aSopenharmony_ci ATRAC9_SF_VLC_BITS, 1); 340cabdff1aSopenharmony_ci c->scalefactors[i] = val & ((1 << len) - 1); 341cabdff1aSopenharmony_ci } 342cabdff1aSopenharmony_ci 343cabdff1aSopenharmony_ci for (int i = 0; i < unit_cnt; i++) 344cabdff1aSopenharmony_ci c->scalefactors[i] += base + baseline[i]; 345cabdff1aSopenharmony_ci 346cabdff1aSopenharmony_ci for (int i = unit_cnt; i < b->band_ext_q_unit; i++) 347cabdff1aSopenharmony_ci c->scalefactors[i] = get_bits(gb, 5); 348cabdff1aSopenharmony_ci break; 349cabdff1aSopenharmony_ci } 350cabdff1aSopenharmony_ci } 351cabdff1aSopenharmony_ci 352cabdff1aSopenharmony_ci for (int i = 0; i < b->band_ext_q_unit; i++) 353cabdff1aSopenharmony_ci if (c->scalefactors[i] < 0 || c->scalefactors[i] > 31) 354cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 355cabdff1aSopenharmony_ci 356cabdff1aSopenharmony_ci memcpy(c->scalefactors_prev, c->scalefactors, sizeof(c->scalefactors)); 357cabdff1aSopenharmony_ci 358cabdff1aSopenharmony_ci return 0; 359cabdff1aSopenharmony_ci} 360cabdff1aSopenharmony_ci 361cabdff1aSopenharmony_cistatic inline void calc_codebook_idx(ATRAC9Context *s, ATRAC9BlockData *b, 362cabdff1aSopenharmony_ci ATRAC9ChannelData *c) 363cabdff1aSopenharmony_ci{ 364cabdff1aSopenharmony_ci int avg = 0; 365cabdff1aSopenharmony_ci const int last_sf = c->scalefactors[c->q_unit_cnt]; 366cabdff1aSopenharmony_ci 367cabdff1aSopenharmony_ci memset(c->codebookset, 0, sizeof(c->codebookset)); 368cabdff1aSopenharmony_ci 369cabdff1aSopenharmony_ci if (c->q_unit_cnt <= 1) 370cabdff1aSopenharmony_ci return; 371cabdff1aSopenharmony_ci if (s->samplerate_idx > 7) 372cabdff1aSopenharmony_ci return; 373cabdff1aSopenharmony_ci 374cabdff1aSopenharmony_ci c->scalefactors[c->q_unit_cnt] = c->scalefactors[c->q_unit_cnt - 1]; 375cabdff1aSopenharmony_ci 376cabdff1aSopenharmony_ci if (c->q_unit_cnt > 12) { 377cabdff1aSopenharmony_ci for (int i = 0; i < 12; i++) 378cabdff1aSopenharmony_ci avg += c->scalefactors[i]; 379cabdff1aSopenharmony_ci avg = (avg + 6) / 12; 380cabdff1aSopenharmony_ci } 381cabdff1aSopenharmony_ci 382cabdff1aSopenharmony_ci for (int i = 8; i < c->q_unit_cnt; i++) { 383cabdff1aSopenharmony_ci const int prev = c->scalefactors[i - 1]; 384cabdff1aSopenharmony_ci const int cur = c->scalefactors[i ]; 385cabdff1aSopenharmony_ci const int next = c->scalefactors[i + 1]; 386cabdff1aSopenharmony_ci const int min = FFMIN(prev, next); 387cabdff1aSopenharmony_ci if ((cur - min >= 3 || 2*cur - prev - next >= 3)) 388cabdff1aSopenharmony_ci c->codebookset[i] = 1; 389cabdff1aSopenharmony_ci } 390cabdff1aSopenharmony_ci 391cabdff1aSopenharmony_ci 392cabdff1aSopenharmony_ci for (int i = 12; i < c->q_unit_cnt; i++) { 393cabdff1aSopenharmony_ci const int cur = c->scalefactors[i]; 394cabdff1aSopenharmony_ci const int cnd = at9_q_unit_to_coeff_cnt[i] == 16; 395cabdff1aSopenharmony_ci const int min = FFMIN(c->scalefactors[i + 1], c->scalefactors[i - 1]); 396cabdff1aSopenharmony_ci if (c->codebookset[i]) 397cabdff1aSopenharmony_ci continue; 398cabdff1aSopenharmony_ci 399cabdff1aSopenharmony_ci c->codebookset[i] = (((cur - min) >= 2) && (cur >= (avg - cnd))); 400cabdff1aSopenharmony_ci } 401cabdff1aSopenharmony_ci 402cabdff1aSopenharmony_ci c->scalefactors[c->q_unit_cnt] = last_sf; 403cabdff1aSopenharmony_ci} 404cabdff1aSopenharmony_ci 405cabdff1aSopenharmony_cistatic inline void read_coeffs_coarse(ATRAC9Context *s, ATRAC9BlockData *b, 406cabdff1aSopenharmony_ci ATRAC9ChannelData *c, GetBitContext *gb) 407cabdff1aSopenharmony_ci{ 408cabdff1aSopenharmony_ci const int max_prec = s->samplerate_idx > 7 ? 1 : 7; 409cabdff1aSopenharmony_ci 410cabdff1aSopenharmony_ci memset(c->q_coeffs_coarse, 0, sizeof(c->q_coeffs_coarse)); 411cabdff1aSopenharmony_ci 412cabdff1aSopenharmony_ci for (int i = 0; i < c->q_unit_cnt; i++) { 413cabdff1aSopenharmony_ci int *coeffs = &c->q_coeffs_coarse[at9_q_unit_to_coeff_idx[i]]; 414cabdff1aSopenharmony_ci const int bands = at9_q_unit_to_coeff_cnt[i]; 415cabdff1aSopenharmony_ci const int prec = c->precision_coarse[i] + 1; 416cabdff1aSopenharmony_ci 417cabdff1aSopenharmony_ci if (prec <= max_prec) { 418cabdff1aSopenharmony_ci const int cb = c->codebookset[i]; 419cabdff1aSopenharmony_ci const int cbi = at9_q_unit_to_codebookidx[i]; 420cabdff1aSopenharmony_ci const VLC *tab = &coeff_vlc[cb][prec][cbi]; 421cabdff1aSopenharmony_ci const HuffmanCodebook *huff = &at9_huffman_coeffs[cb][prec][cbi]; 422cabdff1aSopenharmony_ci const int groups = bands >> huff->value_cnt_pow; 423cabdff1aSopenharmony_ci 424cabdff1aSopenharmony_ci for (int j = 0; j < groups; j++) { 425cabdff1aSopenharmony_ci uint16_t val = get_vlc2(gb, tab->table, ATRAC9_COEFF_VLC_BITS, 2); 426cabdff1aSopenharmony_ci 427cabdff1aSopenharmony_ci for (int k = 0; k < huff->value_cnt; k++) { 428cabdff1aSopenharmony_ci coeffs[k] = sign_extend(val, huff->value_bits); 429cabdff1aSopenharmony_ci val >>= huff->value_bits; 430cabdff1aSopenharmony_ci } 431cabdff1aSopenharmony_ci 432cabdff1aSopenharmony_ci coeffs += huff->value_cnt; 433cabdff1aSopenharmony_ci } 434cabdff1aSopenharmony_ci } else { 435cabdff1aSopenharmony_ci for (int j = 0; j < bands; j++) 436cabdff1aSopenharmony_ci coeffs[j] = sign_extend(get_bits(gb, prec), prec); 437cabdff1aSopenharmony_ci } 438cabdff1aSopenharmony_ci } 439cabdff1aSopenharmony_ci} 440cabdff1aSopenharmony_ci 441cabdff1aSopenharmony_cistatic inline void read_coeffs_fine(ATRAC9Context *s, ATRAC9BlockData *b, 442cabdff1aSopenharmony_ci ATRAC9ChannelData *c, GetBitContext *gb) 443cabdff1aSopenharmony_ci{ 444cabdff1aSopenharmony_ci memset(c->q_coeffs_fine, 0, sizeof(c->q_coeffs_fine)); 445cabdff1aSopenharmony_ci 446cabdff1aSopenharmony_ci for (int i = 0; i < c->q_unit_cnt; i++) { 447cabdff1aSopenharmony_ci const int start = at9_q_unit_to_coeff_idx[i + 0]; 448cabdff1aSopenharmony_ci const int end = at9_q_unit_to_coeff_idx[i + 1]; 449cabdff1aSopenharmony_ci const int len = c->precision_fine[i] + 1; 450cabdff1aSopenharmony_ci 451cabdff1aSopenharmony_ci if (c->precision_fine[i] <= 0) 452cabdff1aSopenharmony_ci continue; 453cabdff1aSopenharmony_ci 454cabdff1aSopenharmony_ci for (int j = start; j < end; j++) 455cabdff1aSopenharmony_ci c->q_coeffs_fine[j] = sign_extend(get_bits(gb, len), len); 456cabdff1aSopenharmony_ci } 457cabdff1aSopenharmony_ci} 458cabdff1aSopenharmony_ci 459cabdff1aSopenharmony_cistatic inline void dequantize(ATRAC9Context *s, ATRAC9BlockData *b, 460cabdff1aSopenharmony_ci ATRAC9ChannelData *c) 461cabdff1aSopenharmony_ci{ 462cabdff1aSopenharmony_ci memset(c->coeffs, 0, sizeof(c->coeffs)); 463cabdff1aSopenharmony_ci 464cabdff1aSopenharmony_ci for (int i = 0; i < c->q_unit_cnt; i++) { 465cabdff1aSopenharmony_ci const int start = at9_q_unit_to_coeff_idx[i + 0]; 466cabdff1aSopenharmony_ci const int end = at9_q_unit_to_coeff_idx[i + 1]; 467cabdff1aSopenharmony_ci 468cabdff1aSopenharmony_ci const float coarse_c = at9_quant_step_coarse[c->precision_coarse[i]]; 469cabdff1aSopenharmony_ci const float fine_c = at9_quant_step_fine[c->precision_fine[i]]; 470cabdff1aSopenharmony_ci 471cabdff1aSopenharmony_ci for (int j = start; j < end; j++) { 472cabdff1aSopenharmony_ci const float vc = c->q_coeffs_coarse[j] * coarse_c; 473cabdff1aSopenharmony_ci const float vf = c->q_coeffs_fine[j] * fine_c; 474cabdff1aSopenharmony_ci c->coeffs[j] = vc + vf; 475cabdff1aSopenharmony_ci } 476cabdff1aSopenharmony_ci } 477cabdff1aSopenharmony_ci} 478cabdff1aSopenharmony_ci 479cabdff1aSopenharmony_cistatic inline void apply_intensity_stereo(ATRAC9Context *s, ATRAC9BlockData *b, 480cabdff1aSopenharmony_ci const int stereo) 481cabdff1aSopenharmony_ci{ 482cabdff1aSopenharmony_ci float *src = b->channel[ b->cpe_base_channel].coeffs; 483cabdff1aSopenharmony_ci float *dst = b->channel[!b->cpe_base_channel].coeffs; 484cabdff1aSopenharmony_ci 485cabdff1aSopenharmony_ci if (!stereo) 486cabdff1aSopenharmony_ci return; 487cabdff1aSopenharmony_ci 488cabdff1aSopenharmony_ci if (b->q_unit_cnt <= b->stereo_q_unit) 489cabdff1aSopenharmony_ci return; 490cabdff1aSopenharmony_ci 491cabdff1aSopenharmony_ci for (int i = b->stereo_q_unit; i < b->q_unit_cnt; i++) { 492cabdff1aSopenharmony_ci const int sign = b->is_signs[i]; 493cabdff1aSopenharmony_ci const int start = at9_q_unit_to_coeff_idx[i + 0]; 494cabdff1aSopenharmony_ci const int end = at9_q_unit_to_coeff_idx[i + 1]; 495cabdff1aSopenharmony_ci for (int j = start; j < end; j++) 496cabdff1aSopenharmony_ci dst[j] = sign*src[j]; 497cabdff1aSopenharmony_ci } 498cabdff1aSopenharmony_ci} 499cabdff1aSopenharmony_ci 500cabdff1aSopenharmony_cistatic inline void apply_scalefactors(ATRAC9Context *s, ATRAC9BlockData *b, 501cabdff1aSopenharmony_ci const int stereo) 502cabdff1aSopenharmony_ci{ 503cabdff1aSopenharmony_ci for (int i = 0; i <= stereo; i++) { 504cabdff1aSopenharmony_ci float *coeffs = b->channel[i].coeffs; 505cabdff1aSopenharmony_ci for (int j = 0; j < b->q_unit_cnt; j++) { 506cabdff1aSopenharmony_ci const int start = at9_q_unit_to_coeff_idx[j + 0]; 507cabdff1aSopenharmony_ci const int end = at9_q_unit_to_coeff_idx[j + 1]; 508cabdff1aSopenharmony_ci const int scalefactor = b->channel[i].scalefactors[j]; 509cabdff1aSopenharmony_ci const float scale = at9_scalefactor_c[scalefactor]; 510cabdff1aSopenharmony_ci for (int k = start; k < end; k++) 511cabdff1aSopenharmony_ci coeffs[k] *= scale; 512cabdff1aSopenharmony_ci } 513cabdff1aSopenharmony_ci } 514cabdff1aSopenharmony_ci} 515cabdff1aSopenharmony_ci 516cabdff1aSopenharmony_cistatic inline void fill_with_noise(ATRAC9Context *s, ATRAC9ChannelData *c, 517cabdff1aSopenharmony_ci int start, int count) 518cabdff1aSopenharmony_ci{ 519cabdff1aSopenharmony_ci float maxval = 0.0f; 520cabdff1aSopenharmony_ci for (int i = 0; i < count; i += 2) { 521cabdff1aSopenharmony_ci double tmp[2]; 522cabdff1aSopenharmony_ci av_bmg_get(&s->lfg, tmp); 523cabdff1aSopenharmony_ci c->coeffs[start + i + 0] = tmp[0]; 524cabdff1aSopenharmony_ci c->coeffs[start + i + 1] = tmp[1]; 525cabdff1aSopenharmony_ci maxval = FFMAX(FFMAX(FFABS(tmp[0]), FFABS(tmp[1])), maxval); 526cabdff1aSopenharmony_ci } 527cabdff1aSopenharmony_ci /* Normalize */ 528cabdff1aSopenharmony_ci for (int i = 0; i < count; i++) 529cabdff1aSopenharmony_ci c->coeffs[start + i] /= maxval; 530cabdff1aSopenharmony_ci} 531cabdff1aSopenharmony_ci 532cabdff1aSopenharmony_cistatic inline void scale_band_ext_coeffs(ATRAC9ChannelData *c, float sf[6], 533cabdff1aSopenharmony_ci const int s_unit, const int e_unit) 534cabdff1aSopenharmony_ci{ 535cabdff1aSopenharmony_ci for (int i = s_unit; i < e_unit; i++) { 536cabdff1aSopenharmony_ci const int start = at9_q_unit_to_coeff_idx[i + 0]; 537cabdff1aSopenharmony_ci const int end = at9_q_unit_to_coeff_idx[i + 1]; 538cabdff1aSopenharmony_ci for (int j = start; j < end; j++) 539cabdff1aSopenharmony_ci c->coeffs[j] *= sf[i - s_unit]; 540cabdff1aSopenharmony_ci } 541cabdff1aSopenharmony_ci} 542cabdff1aSopenharmony_ci 543cabdff1aSopenharmony_cistatic inline void apply_band_extension(ATRAC9Context *s, ATRAC9BlockData *b, 544cabdff1aSopenharmony_ci const int stereo) 545cabdff1aSopenharmony_ci{ 546cabdff1aSopenharmony_ci const int g_units[4] = { /* A, B, C, total units */ 547cabdff1aSopenharmony_ci b->q_unit_cnt, 548cabdff1aSopenharmony_ci at9_tab_band_ext_group[b->q_unit_cnt - 13][0], 549cabdff1aSopenharmony_ci at9_tab_band_ext_group[b->q_unit_cnt - 13][1], 550cabdff1aSopenharmony_ci FFMAX(g_units[2], 22), 551cabdff1aSopenharmony_ci }; 552cabdff1aSopenharmony_ci 553cabdff1aSopenharmony_ci const int g_bins[4] = { /* A, B, C, total bins */ 554cabdff1aSopenharmony_ci at9_q_unit_to_coeff_idx[g_units[0]], 555cabdff1aSopenharmony_ci at9_q_unit_to_coeff_idx[g_units[1]], 556cabdff1aSopenharmony_ci at9_q_unit_to_coeff_idx[g_units[2]], 557cabdff1aSopenharmony_ci at9_q_unit_to_coeff_idx[g_units[3]], 558cabdff1aSopenharmony_ci }; 559cabdff1aSopenharmony_ci 560cabdff1aSopenharmony_ci for (int ch = 0; ch <= stereo; ch++) { 561cabdff1aSopenharmony_ci ATRAC9ChannelData *c = &b->channel[ch]; 562cabdff1aSopenharmony_ci 563cabdff1aSopenharmony_ci /* Mirror the spectrum */ 564cabdff1aSopenharmony_ci for (int i = 0; i < 3; i++) 565cabdff1aSopenharmony_ci for (int j = 0; j < (g_bins[i + 1] - g_bins[i + 0]); j++) 566cabdff1aSopenharmony_ci c->coeffs[g_bins[i] + j] = c->coeffs[g_bins[i] - j - 1]; 567cabdff1aSopenharmony_ci 568cabdff1aSopenharmony_ci switch (c->band_ext) { 569cabdff1aSopenharmony_ci case 0: { 570cabdff1aSopenharmony_ci float sf[6] = { 0.0f }; 571cabdff1aSopenharmony_ci const int l = g_units[3] - g_units[0] - 1; 572cabdff1aSopenharmony_ci const int n_start = at9_q_unit_to_coeff_idx[g_units[3] - 1]; 573cabdff1aSopenharmony_ci const int n_cnt = at9_q_unit_to_coeff_cnt[g_units[3] - 1]; 574cabdff1aSopenharmony_ci switch (at9_tab_band_ext_group[b->q_unit_cnt - 13][2]) { 575cabdff1aSopenharmony_ci case 3: 576cabdff1aSopenharmony_ci sf[0] = at9_band_ext_scales_m0[0][0][c->band_ext_data[0]]; 577cabdff1aSopenharmony_ci sf[1] = at9_band_ext_scales_m0[0][1][c->band_ext_data[0]]; 578cabdff1aSopenharmony_ci sf[2] = at9_band_ext_scales_m0[0][2][c->band_ext_data[1]]; 579cabdff1aSopenharmony_ci sf[3] = at9_band_ext_scales_m0[0][3][c->band_ext_data[2]]; 580cabdff1aSopenharmony_ci sf[4] = at9_band_ext_scales_m0[0][4][c->band_ext_data[3]]; 581cabdff1aSopenharmony_ci break; 582cabdff1aSopenharmony_ci case 4: 583cabdff1aSopenharmony_ci sf[0] = at9_band_ext_scales_m0[1][0][c->band_ext_data[0]]; 584cabdff1aSopenharmony_ci sf[1] = at9_band_ext_scales_m0[1][1][c->band_ext_data[0]]; 585cabdff1aSopenharmony_ci sf[2] = at9_band_ext_scales_m0[1][2][c->band_ext_data[1]]; 586cabdff1aSopenharmony_ci sf[3] = at9_band_ext_scales_m0[1][3][c->band_ext_data[2]]; 587cabdff1aSopenharmony_ci sf[4] = at9_band_ext_scales_m0[1][4][c->band_ext_data[3]]; 588cabdff1aSopenharmony_ci break; 589cabdff1aSopenharmony_ci case 5: 590cabdff1aSopenharmony_ci sf[0] = at9_band_ext_scales_m0[2][0][c->band_ext_data[0]]; 591cabdff1aSopenharmony_ci sf[1] = at9_band_ext_scales_m0[2][1][c->band_ext_data[1]]; 592cabdff1aSopenharmony_ci sf[2] = at9_band_ext_scales_m0[2][2][c->band_ext_data[1]]; 593cabdff1aSopenharmony_ci break; 594cabdff1aSopenharmony_ci } 595cabdff1aSopenharmony_ci 596cabdff1aSopenharmony_ci sf[l] = at9_scalefactor_c[c->scalefactors[g_units[0]]]; 597cabdff1aSopenharmony_ci 598cabdff1aSopenharmony_ci fill_with_noise(s, c, n_start, n_cnt); 599cabdff1aSopenharmony_ci scale_band_ext_coeffs(c, sf, g_units[0], g_units[3]); 600cabdff1aSopenharmony_ci break; 601cabdff1aSopenharmony_ci } 602cabdff1aSopenharmony_ci case 1: { 603cabdff1aSopenharmony_ci float sf[6]; 604cabdff1aSopenharmony_ci for (int i = g_units[0]; i < g_units[3]; i++) 605cabdff1aSopenharmony_ci sf[i - g_units[0]] = at9_scalefactor_c[c->scalefactors[i]]; 606cabdff1aSopenharmony_ci 607cabdff1aSopenharmony_ci fill_with_noise(s, c, g_bins[0], g_bins[3] - g_bins[0]); 608cabdff1aSopenharmony_ci scale_band_ext_coeffs(c, sf, g_units[0], g_units[3]); 609cabdff1aSopenharmony_ci break; 610cabdff1aSopenharmony_ci } 611cabdff1aSopenharmony_ci case 2: { 612cabdff1aSopenharmony_ci const float g_sf[2] = { 613cabdff1aSopenharmony_ci at9_band_ext_scales_m2[c->band_ext_data[0]], 614cabdff1aSopenharmony_ci at9_band_ext_scales_m2[c->band_ext_data[1]], 615cabdff1aSopenharmony_ci }; 616cabdff1aSopenharmony_ci 617cabdff1aSopenharmony_ci for (int i = 0; i < 2; i++) 618cabdff1aSopenharmony_ci for (int j = g_bins[i + 0]; j < g_bins[i + 1]; j++) 619cabdff1aSopenharmony_ci c->coeffs[j] *= g_sf[i]; 620cabdff1aSopenharmony_ci break; 621cabdff1aSopenharmony_ci } 622cabdff1aSopenharmony_ci case 3: { 623cabdff1aSopenharmony_ci float scale = at9_band_ext_scales_m3[c->band_ext_data[0]][0]; 624cabdff1aSopenharmony_ci float rate = at9_band_ext_scales_m3[c->band_ext_data[1]][1]; 625cabdff1aSopenharmony_ci rate = pow(2, rate); 626cabdff1aSopenharmony_ci for (int i = g_bins[0]; i < g_bins[3]; i++) { 627cabdff1aSopenharmony_ci scale *= rate; 628cabdff1aSopenharmony_ci c->coeffs[i] *= scale; 629cabdff1aSopenharmony_ci } 630cabdff1aSopenharmony_ci break; 631cabdff1aSopenharmony_ci } 632cabdff1aSopenharmony_ci case 4: { 633cabdff1aSopenharmony_ci const float m = at9_band_ext_scales_m4[c->band_ext_data[0]]; 634cabdff1aSopenharmony_ci const float g_sf[3] = { 0.7079468f*m, 0.5011902f*m, 0.3548279f*m }; 635cabdff1aSopenharmony_ci 636cabdff1aSopenharmony_ci for (int i = 0; i < 3; i++) 637cabdff1aSopenharmony_ci for (int j = g_bins[i + 0]; j < g_bins[i + 1]; j++) 638cabdff1aSopenharmony_ci c->coeffs[j] *= g_sf[i]; 639cabdff1aSopenharmony_ci break; 640cabdff1aSopenharmony_ci } 641cabdff1aSopenharmony_ci } 642cabdff1aSopenharmony_ci } 643cabdff1aSopenharmony_ci} 644cabdff1aSopenharmony_ci 645cabdff1aSopenharmony_cistatic int atrac9_decode_block(ATRAC9Context *s, GetBitContext *gb, 646cabdff1aSopenharmony_ci ATRAC9BlockData *b, AVFrame *frame, 647cabdff1aSopenharmony_ci int frame_idx, int block_idx) 648cabdff1aSopenharmony_ci{ 649cabdff1aSopenharmony_ci const int first_in_pkt = !get_bits1(gb); 650cabdff1aSopenharmony_ci const int reuse_params = get_bits1(gb); 651cabdff1aSopenharmony_ci const int stereo = s->block_config->type[block_idx] == ATRAC9_BLOCK_TYPE_CPE; 652cabdff1aSopenharmony_ci 653cabdff1aSopenharmony_ci if (s->block_config->type[block_idx] == ATRAC9_BLOCK_TYPE_LFE) { 654cabdff1aSopenharmony_ci ATRAC9ChannelData *c = &b->channel[0]; 655cabdff1aSopenharmony_ci const int precision = reuse_params ? 8 : 4; 656cabdff1aSopenharmony_ci c->q_unit_cnt = b->q_unit_cnt = 2; 657cabdff1aSopenharmony_ci 658cabdff1aSopenharmony_ci memset(c->scalefactors, 0, sizeof(c->scalefactors)); 659cabdff1aSopenharmony_ci memset(c->q_coeffs_fine, 0, sizeof(c->q_coeffs_fine)); 660cabdff1aSopenharmony_ci memset(c->q_coeffs_coarse, 0, sizeof(c->q_coeffs_coarse)); 661cabdff1aSopenharmony_ci 662cabdff1aSopenharmony_ci for (int i = 0; i < b->q_unit_cnt; i++) { 663cabdff1aSopenharmony_ci c->scalefactors[i] = get_bits(gb, 5); 664cabdff1aSopenharmony_ci c->precision_coarse[i] = precision; 665cabdff1aSopenharmony_ci c->precision_fine[i] = 0; 666cabdff1aSopenharmony_ci } 667cabdff1aSopenharmony_ci 668cabdff1aSopenharmony_ci for (int i = 0; i < c->q_unit_cnt; i++) { 669cabdff1aSopenharmony_ci const int start = at9_q_unit_to_coeff_idx[i + 0]; 670cabdff1aSopenharmony_ci const int end = at9_q_unit_to_coeff_idx[i + 1]; 671cabdff1aSopenharmony_ci for (int j = start; j < end; j++) 672cabdff1aSopenharmony_ci c->q_coeffs_coarse[j] = get_bits(gb, c->precision_coarse[i] + 1); 673cabdff1aSopenharmony_ci } 674cabdff1aSopenharmony_ci 675cabdff1aSopenharmony_ci dequantize (s, b, c); 676cabdff1aSopenharmony_ci apply_scalefactors(s, b, 0); 677cabdff1aSopenharmony_ci 678cabdff1aSopenharmony_ci goto imdct; 679cabdff1aSopenharmony_ci } 680cabdff1aSopenharmony_ci 681cabdff1aSopenharmony_ci if (first_in_pkt && reuse_params) { 682cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid block flags!\n"); 683cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 684cabdff1aSopenharmony_ci } 685cabdff1aSopenharmony_ci 686cabdff1aSopenharmony_ci /* Band parameters */ 687cabdff1aSopenharmony_ci if (!reuse_params) { 688cabdff1aSopenharmony_ci int stereo_band, ext_band; 689cabdff1aSopenharmony_ci const int min_band_count = s->samplerate_idx > 7 ? 1 : 3; 690cabdff1aSopenharmony_ci b->reuseable = 0; 691cabdff1aSopenharmony_ci b->band_count = get_bits(gb, 4) + min_band_count; 692cabdff1aSopenharmony_ci b->q_unit_cnt = at9_tab_band_q_unit_map[b->band_count]; 693cabdff1aSopenharmony_ci 694cabdff1aSopenharmony_ci b->band_ext_q_unit = b->stereo_q_unit = b->q_unit_cnt; 695cabdff1aSopenharmony_ci 696cabdff1aSopenharmony_ci if (b->band_count > at9_tab_sri_max_bands[s->samplerate_idx]) { 697cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid band count %i!\n", 698cabdff1aSopenharmony_ci b->band_count); 699cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 700cabdff1aSopenharmony_ci } 701cabdff1aSopenharmony_ci 702cabdff1aSopenharmony_ci if (stereo) { 703cabdff1aSopenharmony_ci stereo_band = get_bits(gb, 4) + min_band_count; 704cabdff1aSopenharmony_ci if (stereo_band > b->band_count) { 705cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid stereo band %i!\n", 706cabdff1aSopenharmony_ci stereo_band); 707cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 708cabdff1aSopenharmony_ci } 709cabdff1aSopenharmony_ci b->stereo_q_unit = at9_tab_band_q_unit_map[stereo_band]; 710cabdff1aSopenharmony_ci } 711cabdff1aSopenharmony_ci 712cabdff1aSopenharmony_ci b->has_band_ext = get_bits1(gb); 713cabdff1aSopenharmony_ci if (b->has_band_ext) { 714cabdff1aSopenharmony_ci ext_band = get_bits(gb, 4) + min_band_count; 715cabdff1aSopenharmony_ci if (ext_band < b->band_count) { 716cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "Invalid extension band %i!\n", 717cabdff1aSopenharmony_ci ext_band); 718cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 719cabdff1aSopenharmony_ci } 720cabdff1aSopenharmony_ci b->band_ext_q_unit = at9_tab_band_q_unit_map[ext_band]; 721cabdff1aSopenharmony_ci } 722cabdff1aSopenharmony_ci b->reuseable = 1; 723cabdff1aSopenharmony_ci } 724cabdff1aSopenharmony_ci if (!b->reuseable) { 725cabdff1aSopenharmony_ci av_log(s->avctx, AV_LOG_ERROR, "invalid block reused!\n"); 726cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 727cabdff1aSopenharmony_ci } 728cabdff1aSopenharmony_ci 729cabdff1aSopenharmony_ci /* Calculate bit alloc gradient */ 730cabdff1aSopenharmony_ci if (parse_gradient(s, b, gb)) 731cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 732cabdff1aSopenharmony_ci 733cabdff1aSopenharmony_ci /* IS data */ 734cabdff1aSopenharmony_ci b->cpe_base_channel = 0; 735cabdff1aSopenharmony_ci if (stereo) { 736cabdff1aSopenharmony_ci b->cpe_base_channel = get_bits1(gb); 737cabdff1aSopenharmony_ci if (get_bits1(gb)) { 738cabdff1aSopenharmony_ci for (int i = b->stereo_q_unit; i < b->q_unit_cnt; i++) 739cabdff1aSopenharmony_ci b->is_signs[i] = 1 - 2*get_bits1(gb); 740cabdff1aSopenharmony_ci } else { 741cabdff1aSopenharmony_ci for (int i = 0; i < FF_ARRAY_ELEMS(b->is_signs); i++) 742cabdff1aSopenharmony_ci b->is_signs[i] = 1; 743cabdff1aSopenharmony_ci } 744cabdff1aSopenharmony_ci } 745cabdff1aSopenharmony_ci 746cabdff1aSopenharmony_ci /* Band extension */ 747cabdff1aSopenharmony_ci if (parse_band_ext(s, b, gb, stereo)) 748cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 749cabdff1aSopenharmony_ci 750cabdff1aSopenharmony_ci /* Scalefactors */ 751cabdff1aSopenharmony_ci for (int i = 0; i <= stereo; i++) { 752cabdff1aSopenharmony_ci ATRAC9ChannelData *c = &b->channel[i]; 753cabdff1aSopenharmony_ci c->q_unit_cnt = i == b->cpe_base_channel ? b->q_unit_cnt : 754cabdff1aSopenharmony_ci b->stereo_q_unit; 755cabdff1aSopenharmony_ci if (read_scalefactors(s, b, c, gb, i, first_in_pkt)) 756cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 757cabdff1aSopenharmony_ci 758cabdff1aSopenharmony_ci calc_precision (s, b, c); 759cabdff1aSopenharmony_ci calc_codebook_idx (s, b, c); 760cabdff1aSopenharmony_ci read_coeffs_coarse(s, b, c, gb); 761cabdff1aSopenharmony_ci read_coeffs_fine (s, b, c, gb); 762cabdff1aSopenharmony_ci dequantize (s, b, c); 763cabdff1aSopenharmony_ci } 764cabdff1aSopenharmony_ci 765cabdff1aSopenharmony_ci b->q_unit_cnt_prev = b->has_band_ext ? b->band_ext_q_unit : b->q_unit_cnt; 766cabdff1aSopenharmony_ci 767cabdff1aSopenharmony_ci apply_intensity_stereo(s, b, stereo); 768cabdff1aSopenharmony_ci apply_scalefactors (s, b, stereo); 769cabdff1aSopenharmony_ci 770cabdff1aSopenharmony_ci if (b->has_band_ext && b->has_band_ext_data) 771cabdff1aSopenharmony_ci apply_band_extension (s, b, stereo); 772cabdff1aSopenharmony_ci 773cabdff1aSopenharmony_ciimdct: 774cabdff1aSopenharmony_ci for (int i = 0; i <= stereo; i++) { 775cabdff1aSopenharmony_ci ATRAC9ChannelData *c = &b->channel[i]; 776cabdff1aSopenharmony_ci const int dst_idx = s->block_config->plane_map[block_idx][i]; 777cabdff1aSopenharmony_ci const int wsize = 1 << s->frame_log2; 778cabdff1aSopenharmony_ci const ptrdiff_t offset = wsize*frame_idx*sizeof(float); 779cabdff1aSopenharmony_ci float *dst = (float *)(frame->extended_data[dst_idx] + offset); 780cabdff1aSopenharmony_ci 781cabdff1aSopenharmony_ci s->imdct.imdct_half(&s->imdct, s->temp, c->coeffs); 782cabdff1aSopenharmony_ci s->fdsp->vector_fmul_window(dst, c->prev_win, s->temp, 783cabdff1aSopenharmony_ci s->imdct_win, wsize >> 1); 784cabdff1aSopenharmony_ci memcpy(c->prev_win, s->temp + (wsize >> 1), sizeof(float)*wsize >> 1); 785cabdff1aSopenharmony_ci } 786cabdff1aSopenharmony_ci 787cabdff1aSopenharmony_ci return 0; 788cabdff1aSopenharmony_ci} 789cabdff1aSopenharmony_ci 790cabdff1aSopenharmony_cistatic int atrac9_decode_frame(AVCodecContext *avctx, AVFrame *frame, 791cabdff1aSopenharmony_ci int *got_frame_ptr, AVPacket *avpkt) 792cabdff1aSopenharmony_ci{ 793cabdff1aSopenharmony_ci int ret; 794cabdff1aSopenharmony_ci GetBitContext gb; 795cabdff1aSopenharmony_ci ATRAC9Context *s = avctx->priv_data; 796cabdff1aSopenharmony_ci const int frames = FFMIN(avpkt->size / s->avg_frame_size, s->frame_count); 797cabdff1aSopenharmony_ci 798cabdff1aSopenharmony_ci frame->nb_samples = (1 << s->frame_log2) * frames; 799cabdff1aSopenharmony_ci ret = ff_get_buffer(avctx, frame, 0); 800cabdff1aSopenharmony_ci if (ret < 0) 801cabdff1aSopenharmony_ci return ret; 802cabdff1aSopenharmony_ci 803cabdff1aSopenharmony_ci init_get_bits8(&gb, avpkt->data, avpkt->size); 804cabdff1aSopenharmony_ci 805cabdff1aSopenharmony_ci for (int i = 0; i < frames; i++) { 806cabdff1aSopenharmony_ci for (int j = 0; j < s->block_config->count; j++) { 807cabdff1aSopenharmony_ci ret = atrac9_decode_block(s, &gb, &s->block[j], frame, i, j); 808cabdff1aSopenharmony_ci if (ret) 809cabdff1aSopenharmony_ci return ret; 810cabdff1aSopenharmony_ci align_get_bits(&gb); 811cabdff1aSopenharmony_ci } 812cabdff1aSopenharmony_ci } 813cabdff1aSopenharmony_ci 814cabdff1aSopenharmony_ci *got_frame_ptr = 1; 815cabdff1aSopenharmony_ci 816cabdff1aSopenharmony_ci return avctx->block_align; 817cabdff1aSopenharmony_ci} 818cabdff1aSopenharmony_ci 819cabdff1aSopenharmony_cistatic void atrac9_decode_flush(AVCodecContext *avctx) 820cabdff1aSopenharmony_ci{ 821cabdff1aSopenharmony_ci ATRAC9Context *s = avctx->priv_data; 822cabdff1aSopenharmony_ci 823cabdff1aSopenharmony_ci for (int j = 0; j < s->block_config->count; j++) { 824cabdff1aSopenharmony_ci ATRAC9BlockData *b = &s->block[j]; 825cabdff1aSopenharmony_ci const int stereo = s->block_config->type[j] == ATRAC9_BLOCK_TYPE_CPE; 826cabdff1aSopenharmony_ci for (int i = 0; i <= stereo; i++) { 827cabdff1aSopenharmony_ci ATRAC9ChannelData *c = &b->channel[i]; 828cabdff1aSopenharmony_ci memset(c->prev_win, 0, sizeof(c->prev_win)); 829cabdff1aSopenharmony_ci } 830cabdff1aSopenharmony_ci } 831cabdff1aSopenharmony_ci} 832cabdff1aSopenharmony_ci 833cabdff1aSopenharmony_cistatic av_cold int atrac9_decode_close(AVCodecContext *avctx) 834cabdff1aSopenharmony_ci{ 835cabdff1aSopenharmony_ci ATRAC9Context *s = avctx->priv_data; 836cabdff1aSopenharmony_ci 837cabdff1aSopenharmony_ci ff_mdct_end(&s->imdct); 838cabdff1aSopenharmony_ci av_freep(&s->fdsp); 839cabdff1aSopenharmony_ci 840cabdff1aSopenharmony_ci return 0; 841cabdff1aSopenharmony_ci} 842cabdff1aSopenharmony_ci 843cabdff1aSopenharmony_cistatic av_cold void atrac9_init_vlc(VLC *vlc, int nb_bits, int nb_codes, 844cabdff1aSopenharmony_ci const uint8_t (**tab)[2], 845cabdff1aSopenharmony_ci unsigned *buf_offset, int offset) 846cabdff1aSopenharmony_ci{ 847cabdff1aSopenharmony_ci static VLCElem vlc_buf[24812]; 848cabdff1aSopenharmony_ci 849cabdff1aSopenharmony_ci vlc->table = &vlc_buf[*buf_offset]; 850cabdff1aSopenharmony_ci vlc->table_allocated = FF_ARRAY_ELEMS(vlc_buf) - *buf_offset; 851cabdff1aSopenharmony_ci ff_init_vlc_from_lengths(vlc, nb_bits, nb_codes, 852cabdff1aSopenharmony_ci &(*tab)[0][1], 2, &(*tab)[0][0], 2, 1, 853cabdff1aSopenharmony_ci offset, INIT_VLC_STATIC_OVERLONG, NULL); 854cabdff1aSopenharmony_ci *buf_offset += vlc->table_size; 855cabdff1aSopenharmony_ci *tab += nb_codes; 856cabdff1aSopenharmony_ci} 857cabdff1aSopenharmony_ci 858cabdff1aSopenharmony_cistatic av_cold void atrac9_init_static(void) 859cabdff1aSopenharmony_ci{ 860cabdff1aSopenharmony_ci const uint8_t (*tab)[2]; 861cabdff1aSopenharmony_ci unsigned offset = 0; 862cabdff1aSopenharmony_ci 863cabdff1aSopenharmony_ci /* Unsigned scalefactor VLCs */ 864cabdff1aSopenharmony_ci tab = at9_sfb_a_tab; 865cabdff1aSopenharmony_ci for (int i = 1; i < 7; i++) { 866cabdff1aSopenharmony_ci const HuffmanCodebook *hf = &at9_huffman_sf_unsigned[i]; 867cabdff1aSopenharmony_ci 868cabdff1aSopenharmony_ci atrac9_init_vlc(&sf_vlc[0][i], ATRAC9_SF_VLC_BITS, 869cabdff1aSopenharmony_ci hf->size, &tab, &offset, 0); 870cabdff1aSopenharmony_ci } 871cabdff1aSopenharmony_ci 872cabdff1aSopenharmony_ci /* Signed scalefactor VLCs */ 873cabdff1aSopenharmony_ci tab = at9_sfb_b_tab; 874cabdff1aSopenharmony_ci for (int i = 2; i < 6; i++) { 875cabdff1aSopenharmony_ci const HuffmanCodebook *hf = &at9_huffman_sf_signed[i]; 876cabdff1aSopenharmony_ci 877cabdff1aSopenharmony_ci /* The symbols are signed integers in the range -16..15; 878cabdff1aSopenharmony_ci * the values in the source table are offset by 16 to make 879cabdff1aSopenharmony_ci * them fit into an uint8_t; the -16 reverses this shift. */ 880cabdff1aSopenharmony_ci atrac9_init_vlc(&sf_vlc[1][i], ATRAC9_SF_VLC_BITS, 881cabdff1aSopenharmony_ci hf->size, &tab, &offset, -16); 882cabdff1aSopenharmony_ci } 883cabdff1aSopenharmony_ci 884cabdff1aSopenharmony_ci /* Coefficient VLCs */ 885cabdff1aSopenharmony_ci tab = at9_coeffs_tab; 886cabdff1aSopenharmony_ci for (int i = 0; i < 2; i++) { 887cabdff1aSopenharmony_ci for (int j = 2; j < 8; j++) { 888cabdff1aSopenharmony_ci for (int k = i; k < 4; k++) { 889cabdff1aSopenharmony_ci const HuffmanCodebook *hf = &at9_huffman_coeffs[i][j][k]; 890cabdff1aSopenharmony_ci atrac9_init_vlc(&coeff_vlc[i][j][k], ATRAC9_COEFF_VLC_BITS, 891cabdff1aSopenharmony_ci hf->size, &tab, &offset, 0); 892cabdff1aSopenharmony_ci } 893cabdff1aSopenharmony_ci } 894cabdff1aSopenharmony_ci } 895cabdff1aSopenharmony_ci} 896cabdff1aSopenharmony_ci 897cabdff1aSopenharmony_cistatic av_cold int atrac9_decode_init(AVCodecContext *avctx) 898cabdff1aSopenharmony_ci{ 899cabdff1aSopenharmony_ci static AVOnce static_table_init = AV_ONCE_INIT; 900cabdff1aSopenharmony_ci GetBitContext gb; 901cabdff1aSopenharmony_ci ATRAC9Context *s = avctx->priv_data; 902cabdff1aSopenharmony_ci int version, block_config_idx, superframe_idx, alloc_c_len; 903cabdff1aSopenharmony_ci 904cabdff1aSopenharmony_ci s->avctx = avctx; 905cabdff1aSopenharmony_ci 906cabdff1aSopenharmony_ci av_lfg_init(&s->lfg, 0xFBADF00D); 907cabdff1aSopenharmony_ci 908cabdff1aSopenharmony_ci if (avctx->block_align <= 0) { 909cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Invalid block align\n"); 910cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 911cabdff1aSopenharmony_ci } 912cabdff1aSopenharmony_ci 913cabdff1aSopenharmony_ci if (avctx->extradata_size != 12) { 914cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Invalid extradata length!\n"); 915cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 916cabdff1aSopenharmony_ci } 917cabdff1aSopenharmony_ci 918cabdff1aSopenharmony_ci version = AV_RL32(avctx->extradata); 919cabdff1aSopenharmony_ci if (version > 2) { 920cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Unsupported version (%i)!\n", version); 921cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 922cabdff1aSopenharmony_ci } 923cabdff1aSopenharmony_ci 924cabdff1aSopenharmony_ci init_get_bits8(&gb, avctx->extradata + 4, avctx->extradata_size); 925cabdff1aSopenharmony_ci 926cabdff1aSopenharmony_ci if (get_bits(&gb, 8) != 0xFE) { 927cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Incorrect magic byte!\n"); 928cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 929cabdff1aSopenharmony_ci } 930cabdff1aSopenharmony_ci 931cabdff1aSopenharmony_ci s->samplerate_idx = get_bits(&gb, 4); 932cabdff1aSopenharmony_ci avctx->sample_rate = at9_tab_samplerates[s->samplerate_idx]; 933cabdff1aSopenharmony_ci 934cabdff1aSopenharmony_ci block_config_idx = get_bits(&gb, 3); 935cabdff1aSopenharmony_ci if (block_config_idx > 5) { 936cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Incorrect block config!\n"); 937cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 938cabdff1aSopenharmony_ci } 939cabdff1aSopenharmony_ci s->block_config = &at9_block_layout[block_config_idx]; 940cabdff1aSopenharmony_ci 941cabdff1aSopenharmony_ci av_channel_layout_uninit(&avctx->ch_layout); 942cabdff1aSopenharmony_ci avctx->ch_layout = s->block_config->channel_layout; 943cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; 944cabdff1aSopenharmony_ci 945cabdff1aSopenharmony_ci if (get_bits1(&gb)) { 946cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Incorrect verification bit!\n"); 947cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 948cabdff1aSopenharmony_ci } 949cabdff1aSopenharmony_ci 950cabdff1aSopenharmony_ci /* Average frame size in bytes */ 951cabdff1aSopenharmony_ci s->avg_frame_size = get_bits(&gb, 11) + 1; 952cabdff1aSopenharmony_ci 953cabdff1aSopenharmony_ci superframe_idx = get_bits(&gb, 2); 954cabdff1aSopenharmony_ci if (superframe_idx & 1) { 955cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Invalid superframe index!\n"); 956cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 957cabdff1aSopenharmony_ci } 958cabdff1aSopenharmony_ci 959cabdff1aSopenharmony_ci s->frame_count = 1 << superframe_idx; 960cabdff1aSopenharmony_ci s->frame_log2 = at9_tab_sri_frame_log2[s->samplerate_idx]; 961cabdff1aSopenharmony_ci 962cabdff1aSopenharmony_ci if (ff_mdct_init(&s->imdct, s->frame_log2 + 1, 1, 1.0f / 32768.0f)) 963cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 964cabdff1aSopenharmony_ci 965cabdff1aSopenharmony_ci s->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT); 966cabdff1aSopenharmony_ci if (!s->fdsp) 967cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 968cabdff1aSopenharmony_ci 969cabdff1aSopenharmony_ci /* iMDCT window */ 970cabdff1aSopenharmony_ci for (int i = 0; i < (1 << s->frame_log2); i++) { 971cabdff1aSopenharmony_ci const int len = 1 << s->frame_log2; 972cabdff1aSopenharmony_ci const float sidx = ( i + 0.5f) / len; 973cabdff1aSopenharmony_ci const float eidx = (len - i - 0.5f) / len; 974cabdff1aSopenharmony_ci const float s_c = sinf(sidx*M_PI - M_PI_2)*0.5f + 0.5f; 975cabdff1aSopenharmony_ci const float e_c = sinf(eidx*M_PI - M_PI_2)*0.5f + 0.5f; 976cabdff1aSopenharmony_ci s->imdct_win[i] = s_c / ((s_c * s_c) + (e_c * e_c)); 977cabdff1aSopenharmony_ci } 978cabdff1aSopenharmony_ci 979cabdff1aSopenharmony_ci /* Allocation curve */ 980cabdff1aSopenharmony_ci alloc_c_len = FF_ARRAY_ELEMS(at9_tab_b_dist); 981cabdff1aSopenharmony_ci for (int i = 1; i <= alloc_c_len; i++) 982cabdff1aSopenharmony_ci for (int j = 0; j < i; j++) 983cabdff1aSopenharmony_ci s->alloc_curve[i - 1][j] = at9_tab_b_dist[(j * alloc_c_len) / i]; 984cabdff1aSopenharmony_ci 985cabdff1aSopenharmony_ci ff_thread_once(&static_table_init, atrac9_init_static); 986cabdff1aSopenharmony_ci 987cabdff1aSopenharmony_ci return 0; 988cabdff1aSopenharmony_ci} 989cabdff1aSopenharmony_ci 990cabdff1aSopenharmony_ciconst FFCodec ff_atrac9_decoder = { 991cabdff1aSopenharmony_ci .p.name = "atrac9", 992cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("ATRAC9 (Adaptive TRansform Acoustic Coding 9)"), 993cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 994cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_ATRAC9, 995cabdff1aSopenharmony_ci .priv_data_size = sizeof(ATRAC9Context), 996cabdff1aSopenharmony_ci .init = atrac9_decode_init, 997cabdff1aSopenharmony_ci .close = atrac9_decode_close, 998cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(atrac9_decode_frame), 999cabdff1aSopenharmony_ci .flush = atrac9_decode_flush, 1000cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE | FF_CODEC_CAP_INIT_CLEANUP, 1001cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF, 1002cabdff1aSopenharmony_ci}; 1003