1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * IMC compatible decoder 3cabdff1aSopenharmony_ci * Copyright (c) 2002-2004 Maxim Poliakovski 4cabdff1aSopenharmony_ci * Copyright (c) 2006 Benjamin Larsson 5cabdff1aSopenharmony_ci * Copyright (c) 2006 Konstantin Shishkov 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * This file is part of FFmpeg. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 10cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 11cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 12cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 15cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 16cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17cabdff1aSopenharmony_ci * Lesser General Public License for more details. 18cabdff1aSopenharmony_ci * 19cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 20cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 21cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22cabdff1aSopenharmony_ci */ 23cabdff1aSopenharmony_ci 24cabdff1aSopenharmony_ci/** 25cabdff1aSopenharmony_ci * @file 26cabdff1aSopenharmony_ci * IMC - Intel Music Coder 27cabdff1aSopenharmony_ci * A mdct based codec using a 256 points large transform 28cabdff1aSopenharmony_ci * divided into 32 bands with some mix of scale factors. 29cabdff1aSopenharmony_ci * Only mono is supported. 30cabdff1aSopenharmony_ci */ 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_ci#include "config_components.h" 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_ci#include <math.h> 35cabdff1aSopenharmony_ci#include <stddef.h> 36cabdff1aSopenharmony_ci#include <stdio.h> 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_ci#include "libavutil/channel_layout.h" 39cabdff1aSopenharmony_ci#include "libavutil/ffmath.h" 40cabdff1aSopenharmony_ci#include "libavutil/float_dsp.h" 41cabdff1aSopenharmony_ci#include "libavutil/internal.h" 42cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h" 43cabdff1aSopenharmony_ci#include "libavutil/thread.h" 44cabdff1aSopenharmony_ci 45cabdff1aSopenharmony_ci#include "avcodec.h" 46cabdff1aSopenharmony_ci#include "bswapdsp.h" 47cabdff1aSopenharmony_ci#include "codec_internal.h" 48cabdff1aSopenharmony_ci#include "get_bits.h" 49cabdff1aSopenharmony_ci#include "fft.h" 50cabdff1aSopenharmony_ci#include "internal.h" 51cabdff1aSopenharmony_ci#include "sinewin.h" 52cabdff1aSopenharmony_ci 53cabdff1aSopenharmony_ci#include "imcdata.h" 54cabdff1aSopenharmony_ci 55cabdff1aSopenharmony_ci#define IMC_BLOCK_SIZE 64 56cabdff1aSopenharmony_ci#define IMC_FRAME_ID 0x21 57cabdff1aSopenharmony_ci#define BANDS 32 58cabdff1aSopenharmony_ci#define COEFFS 256 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_citypedef struct IMCChannel { 61cabdff1aSopenharmony_ci float old_floor[BANDS]; 62cabdff1aSopenharmony_ci float flcoeffs1[BANDS]; 63cabdff1aSopenharmony_ci float flcoeffs2[BANDS]; 64cabdff1aSopenharmony_ci float flcoeffs3[BANDS]; 65cabdff1aSopenharmony_ci float flcoeffs4[BANDS]; 66cabdff1aSopenharmony_ci float flcoeffs5[BANDS]; 67cabdff1aSopenharmony_ci float flcoeffs6[BANDS]; 68cabdff1aSopenharmony_ci float CWdecoded[COEFFS]; 69cabdff1aSopenharmony_ci 70cabdff1aSopenharmony_ci int bandWidthT[BANDS]; ///< codewords per band 71cabdff1aSopenharmony_ci int bitsBandT[BANDS]; ///< how many bits per codeword in band 72cabdff1aSopenharmony_ci int CWlengthT[COEFFS]; ///< how many bits in each codeword 73cabdff1aSopenharmony_ci int levlCoeffBuf[BANDS]; 74cabdff1aSopenharmony_ci int bandFlagsBuf[BANDS]; ///< flags for each band 75cabdff1aSopenharmony_ci int sumLenArr[BANDS]; ///< bits for all coeffs in band 76cabdff1aSopenharmony_ci int skipFlagRaw[BANDS]; ///< skip flags are stored in raw form or not 77cabdff1aSopenharmony_ci int skipFlagBits[BANDS]; ///< bits used to code skip flags 78cabdff1aSopenharmony_ci int skipFlagCount[BANDS]; ///< skipped coefficients per band 79cabdff1aSopenharmony_ci int skipFlags[COEFFS]; ///< skip coefficient decoding or not 80cabdff1aSopenharmony_ci int codewords[COEFFS]; ///< raw codewords read from bitstream 81cabdff1aSopenharmony_ci 82cabdff1aSopenharmony_ci float last_fft_im[COEFFS]; 83cabdff1aSopenharmony_ci 84cabdff1aSopenharmony_ci int decoder_reset; 85cabdff1aSopenharmony_ci} IMCChannel; 86cabdff1aSopenharmony_ci 87cabdff1aSopenharmony_citypedef struct IMCContext { 88cabdff1aSopenharmony_ci IMCChannel chctx[2]; 89cabdff1aSopenharmony_ci 90cabdff1aSopenharmony_ci /** MDCT tables */ 91cabdff1aSopenharmony_ci //@{ 92cabdff1aSopenharmony_ci float mdct_sine_window[COEFFS]; 93cabdff1aSopenharmony_ci float post_cos[COEFFS]; 94cabdff1aSopenharmony_ci float post_sin[COEFFS]; 95cabdff1aSopenharmony_ci float pre_coef1[COEFFS]; 96cabdff1aSopenharmony_ci float pre_coef2[COEFFS]; 97cabdff1aSopenharmony_ci //@} 98cabdff1aSopenharmony_ci 99cabdff1aSopenharmony_ci float sqrt_tab[30]; 100cabdff1aSopenharmony_ci GetBitContext gb; 101cabdff1aSopenharmony_ci 102cabdff1aSopenharmony_ci BswapDSPContext bdsp; 103cabdff1aSopenharmony_ci void (*butterflies_float)(float *av_restrict v1, float *av_restrict v2, int len); 104cabdff1aSopenharmony_ci FFTContext fft; 105cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, FFTComplex, samples)[COEFFS / 2]; 106cabdff1aSopenharmony_ci float *out_samples; 107cabdff1aSopenharmony_ci 108cabdff1aSopenharmony_ci int coef0_pos; 109cabdff1aSopenharmony_ci 110cabdff1aSopenharmony_ci int8_t cyclTab[32], cyclTab2[32]; 111cabdff1aSopenharmony_ci float weights1[31], weights2[31]; 112cabdff1aSopenharmony_ci 113cabdff1aSopenharmony_ci AVCodecContext *avctx; 114cabdff1aSopenharmony_ci} IMCContext; 115cabdff1aSopenharmony_ci 116cabdff1aSopenharmony_cistatic VLC huffman_vlc[4][4]; 117cabdff1aSopenharmony_ci 118cabdff1aSopenharmony_ci#define IMC_VLC_BITS 9 119cabdff1aSopenharmony_ci#define VLC_TABLES_SIZE 9512 120cabdff1aSopenharmony_ci 121cabdff1aSopenharmony_cistatic VLCElem vlc_tables[VLC_TABLES_SIZE]; 122cabdff1aSopenharmony_ci 123cabdff1aSopenharmony_cistatic inline double freq2bark(double freq) 124cabdff1aSopenharmony_ci{ 125cabdff1aSopenharmony_ci return 3.5 * atan((freq / 7500.0) * (freq / 7500.0)) + 13.0 * atan(freq * 0.00076); 126cabdff1aSopenharmony_ci} 127cabdff1aSopenharmony_ci 128cabdff1aSopenharmony_cistatic av_cold void iac_generate_tabs(IMCContext *q, int sampling_rate) 129cabdff1aSopenharmony_ci{ 130cabdff1aSopenharmony_ci double freqmin[32], freqmid[32], freqmax[32]; 131cabdff1aSopenharmony_ci double scale = sampling_rate / (256.0 * 2.0 * 2.0); 132cabdff1aSopenharmony_ci double nyquist_freq = sampling_rate * 0.5; 133cabdff1aSopenharmony_ci double freq, bark, prev_bark = 0, tf, tb; 134cabdff1aSopenharmony_ci int i, j; 135cabdff1aSopenharmony_ci 136cabdff1aSopenharmony_ci for (i = 0; i < 32; i++) { 137cabdff1aSopenharmony_ci freq = (band_tab[i] + band_tab[i + 1] - 1) * scale; 138cabdff1aSopenharmony_ci bark = freq2bark(freq); 139cabdff1aSopenharmony_ci 140cabdff1aSopenharmony_ci if (i > 0) { 141cabdff1aSopenharmony_ci tb = bark - prev_bark; 142cabdff1aSopenharmony_ci q->weights1[i - 1] = ff_exp10(-1.0 * tb); 143cabdff1aSopenharmony_ci q->weights2[i - 1] = ff_exp10(-2.7 * tb); 144cabdff1aSopenharmony_ci } 145cabdff1aSopenharmony_ci prev_bark = bark; 146cabdff1aSopenharmony_ci 147cabdff1aSopenharmony_ci freqmid[i] = freq; 148cabdff1aSopenharmony_ci 149cabdff1aSopenharmony_ci tf = freq; 150cabdff1aSopenharmony_ci while (tf < nyquist_freq) { 151cabdff1aSopenharmony_ci tf += 0.5; 152cabdff1aSopenharmony_ci tb = freq2bark(tf); 153cabdff1aSopenharmony_ci if (tb > bark + 0.5) 154cabdff1aSopenharmony_ci break; 155cabdff1aSopenharmony_ci } 156cabdff1aSopenharmony_ci freqmax[i] = tf; 157cabdff1aSopenharmony_ci 158cabdff1aSopenharmony_ci tf = freq; 159cabdff1aSopenharmony_ci while (tf > 0.0) { 160cabdff1aSopenharmony_ci tf -= 0.5; 161cabdff1aSopenharmony_ci tb = freq2bark(tf); 162cabdff1aSopenharmony_ci if (tb <= bark - 0.5) 163cabdff1aSopenharmony_ci break; 164cabdff1aSopenharmony_ci } 165cabdff1aSopenharmony_ci freqmin[i] = tf; 166cabdff1aSopenharmony_ci } 167cabdff1aSopenharmony_ci 168cabdff1aSopenharmony_ci for (i = 0; i < 32; i++) { 169cabdff1aSopenharmony_ci freq = freqmax[i]; 170cabdff1aSopenharmony_ci for (j = 31; j > 0 && freq <= freqmid[j]; j--); 171cabdff1aSopenharmony_ci q->cyclTab[i] = j + 1; 172cabdff1aSopenharmony_ci 173cabdff1aSopenharmony_ci freq = freqmin[i]; 174cabdff1aSopenharmony_ci for (j = 0; j < 32 && freq >= freqmid[j]; j++); 175cabdff1aSopenharmony_ci q->cyclTab2[i] = j - 1; 176cabdff1aSopenharmony_ci } 177cabdff1aSopenharmony_ci} 178cabdff1aSopenharmony_ci 179cabdff1aSopenharmony_cistatic av_cold void imc_init_static(void) 180cabdff1aSopenharmony_ci{ 181cabdff1aSopenharmony_ci /* initialize the VLC tables */ 182cabdff1aSopenharmony_ci for (int i = 0, offset = 0; i < 4 ; i++) { 183cabdff1aSopenharmony_ci for (int j = 0; j < 4; j++) { 184cabdff1aSopenharmony_ci huffman_vlc[i][j].table = &vlc_tables[offset]; 185cabdff1aSopenharmony_ci huffman_vlc[i][j].table_allocated = VLC_TABLES_SIZE - offset; 186cabdff1aSopenharmony_ci ff_init_vlc_from_lengths(&huffman_vlc[i][j], IMC_VLC_BITS, imc_huffman_sizes[i], 187cabdff1aSopenharmony_ci imc_huffman_lens[i][j], 1, 188cabdff1aSopenharmony_ci imc_huffman_syms[i][j], 1, 1, 189cabdff1aSopenharmony_ci 0, INIT_VLC_STATIC_OVERLONG, NULL); 190cabdff1aSopenharmony_ci offset += huffman_vlc[i][j].table_size; 191cabdff1aSopenharmony_ci } 192cabdff1aSopenharmony_ci } 193cabdff1aSopenharmony_ci} 194cabdff1aSopenharmony_ci 195cabdff1aSopenharmony_cistatic av_cold int imc_decode_init(AVCodecContext *avctx) 196cabdff1aSopenharmony_ci{ 197cabdff1aSopenharmony_ci int i, j, ret; 198cabdff1aSopenharmony_ci IMCContext *q = avctx->priv_data; 199cabdff1aSopenharmony_ci static AVOnce init_static_once = AV_ONCE_INIT; 200cabdff1aSopenharmony_ci AVFloatDSPContext *fdsp; 201cabdff1aSopenharmony_ci double r1, r2; 202cabdff1aSopenharmony_ci 203cabdff1aSopenharmony_ci if (avctx->codec_id == AV_CODEC_ID_IAC && avctx->sample_rate > 96000) { 204cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, 205cabdff1aSopenharmony_ci "Strange sample rate of %i, file likely corrupt or " 206cabdff1aSopenharmony_ci "needing a new table derivation method.\n", 207cabdff1aSopenharmony_ci avctx->sample_rate); 208cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 209cabdff1aSopenharmony_ci } 210cabdff1aSopenharmony_ci 211cabdff1aSopenharmony_ci if (avctx->codec_id == AV_CODEC_ID_IMC) { 212cabdff1aSopenharmony_ci av_channel_layout_uninit(&avctx->ch_layout); 213cabdff1aSopenharmony_ci avctx->ch_layout = (AVChannelLayout)AV_CHANNEL_LAYOUT_MONO; 214cabdff1aSopenharmony_ci } 215cabdff1aSopenharmony_ci 216cabdff1aSopenharmony_ci if (avctx->ch_layout.nb_channels > 2) { 217cabdff1aSopenharmony_ci avpriv_request_sample(avctx, "Number of channels > 2"); 218cabdff1aSopenharmony_ci return AVERROR_PATCHWELCOME; 219cabdff1aSopenharmony_ci } 220cabdff1aSopenharmony_ci 221cabdff1aSopenharmony_ci for (j = 0; j < avctx->ch_layout.nb_channels; j++) { 222cabdff1aSopenharmony_ci q->chctx[j].decoder_reset = 1; 223cabdff1aSopenharmony_ci 224cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) 225cabdff1aSopenharmony_ci q->chctx[j].old_floor[i] = 1.0; 226cabdff1aSopenharmony_ci 227cabdff1aSopenharmony_ci for (i = 0; i < COEFFS / 2; i++) 228cabdff1aSopenharmony_ci q->chctx[j].last_fft_im[i] = 0; 229cabdff1aSopenharmony_ci } 230cabdff1aSopenharmony_ci 231cabdff1aSopenharmony_ci /* Build mdct window, a simple sine window normalized with sqrt(2) */ 232cabdff1aSopenharmony_ci ff_sine_window_init(q->mdct_sine_window, COEFFS); 233cabdff1aSopenharmony_ci for (i = 0; i < COEFFS; i++) 234cabdff1aSopenharmony_ci q->mdct_sine_window[i] *= sqrt(2.0); 235cabdff1aSopenharmony_ci for (i = 0; i < COEFFS / 2; i++) { 236cabdff1aSopenharmony_ci q->post_cos[i] = (1.0f / 32768) * cos(i / 256.0 * M_PI); 237cabdff1aSopenharmony_ci q->post_sin[i] = (1.0f / 32768) * sin(i / 256.0 * M_PI); 238cabdff1aSopenharmony_ci 239cabdff1aSopenharmony_ci r1 = sin((i * 4.0 + 1.0) / 1024.0 * M_PI); 240cabdff1aSopenharmony_ci r2 = cos((i * 4.0 + 1.0) / 1024.0 * M_PI); 241cabdff1aSopenharmony_ci 242cabdff1aSopenharmony_ci if (i & 0x1) { 243cabdff1aSopenharmony_ci q->pre_coef1[i] = (r1 + r2) * sqrt(2.0); 244cabdff1aSopenharmony_ci q->pre_coef2[i] = -(r1 - r2) * sqrt(2.0); 245cabdff1aSopenharmony_ci } else { 246cabdff1aSopenharmony_ci q->pre_coef1[i] = -(r1 + r2) * sqrt(2.0); 247cabdff1aSopenharmony_ci q->pre_coef2[i] = (r1 - r2) * sqrt(2.0); 248cabdff1aSopenharmony_ci } 249cabdff1aSopenharmony_ci } 250cabdff1aSopenharmony_ci 251cabdff1aSopenharmony_ci /* Generate a square root table */ 252cabdff1aSopenharmony_ci 253cabdff1aSopenharmony_ci for (i = 0; i < 30; i++) 254cabdff1aSopenharmony_ci q->sqrt_tab[i] = sqrt(i); 255cabdff1aSopenharmony_ci 256cabdff1aSopenharmony_ci if (avctx->codec_id == AV_CODEC_ID_IAC) { 257cabdff1aSopenharmony_ci iac_generate_tabs(q, avctx->sample_rate); 258cabdff1aSopenharmony_ci } else { 259cabdff1aSopenharmony_ci memcpy(q->cyclTab, cyclTab, sizeof(cyclTab)); 260cabdff1aSopenharmony_ci memcpy(q->cyclTab2, cyclTab2, sizeof(cyclTab2)); 261cabdff1aSopenharmony_ci memcpy(q->weights1, imc_weights1, sizeof(imc_weights1)); 262cabdff1aSopenharmony_ci memcpy(q->weights2, imc_weights2, sizeof(imc_weights2)); 263cabdff1aSopenharmony_ci } 264cabdff1aSopenharmony_ci 265cabdff1aSopenharmony_ci fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT); 266cabdff1aSopenharmony_ci if (!fdsp) 267cabdff1aSopenharmony_ci return AVERROR(ENOMEM); 268cabdff1aSopenharmony_ci q->butterflies_float = fdsp->butterflies_float; 269cabdff1aSopenharmony_ci av_free(fdsp); 270cabdff1aSopenharmony_ci if ((ret = ff_fft_init(&q->fft, 7, 1))) { 271cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_INFO, "FFT init failed\n"); 272cabdff1aSopenharmony_ci return ret; 273cabdff1aSopenharmony_ci } 274cabdff1aSopenharmony_ci ff_bswapdsp_init(&q->bdsp); 275cabdff1aSopenharmony_ci 276cabdff1aSopenharmony_ci avctx->sample_fmt = AV_SAMPLE_FMT_FLTP; 277cabdff1aSopenharmony_ci 278cabdff1aSopenharmony_ci ff_thread_once(&init_static_once, imc_init_static); 279cabdff1aSopenharmony_ci 280cabdff1aSopenharmony_ci return 0; 281cabdff1aSopenharmony_ci} 282cabdff1aSopenharmony_ci 283cabdff1aSopenharmony_cistatic void imc_calculate_coeffs(IMCContext *q, float *flcoeffs1, 284cabdff1aSopenharmony_ci float *flcoeffs2, int *bandWidthT, 285cabdff1aSopenharmony_ci float *flcoeffs3, float *flcoeffs5) 286cabdff1aSopenharmony_ci{ 287cabdff1aSopenharmony_ci float workT1[BANDS]; 288cabdff1aSopenharmony_ci float workT2[BANDS]; 289cabdff1aSopenharmony_ci float workT3[BANDS]; 290cabdff1aSopenharmony_ci float snr_limit = 1.e-30; 291cabdff1aSopenharmony_ci float accum = 0.0; 292cabdff1aSopenharmony_ci int i, cnt2; 293cabdff1aSopenharmony_ci 294cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 295cabdff1aSopenharmony_ci flcoeffs5[i] = workT2[i] = 0.0; 296cabdff1aSopenharmony_ci if (bandWidthT[i]) { 297cabdff1aSopenharmony_ci workT1[i] = flcoeffs1[i] * flcoeffs1[i]; 298cabdff1aSopenharmony_ci flcoeffs3[i] = 2.0 * flcoeffs2[i]; 299cabdff1aSopenharmony_ci } else { 300cabdff1aSopenharmony_ci workT1[i] = 0.0; 301cabdff1aSopenharmony_ci flcoeffs3[i] = -30000.0; 302cabdff1aSopenharmony_ci } 303cabdff1aSopenharmony_ci workT3[i] = bandWidthT[i] * workT1[i] * 0.01; 304cabdff1aSopenharmony_ci if (workT3[i] <= snr_limit) 305cabdff1aSopenharmony_ci workT3[i] = 0.0; 306cabdff1aSopenharmony_ci } 307cabdff1aSopenharmony_ci 308cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 309cabdff1aSopenharmony_ci for (cnt2 = i; cnt2 < q->cyclTab[i]; cnt2++) 310cabdff1aSopenharmony_ci flcoeffs5[cnt2] = flcoeffs5[cnt2] + workT3[i]; 311cabdff1aSopenharmony_ci workT2[cnt2 - 1] = workT2[cnt2 - 1] + workT3[i]; 312cabdff1aSopenharmony_ci } 313cabdff1aSopenharmony_ci 314cabdff1aSopenharmony_ci for (i = 1; i < BANDS; i++) { 315cabdff1aSopenharmony_ci accum = (workT2[i - 1] + accum) * q->weights1[i - 1]; 316cabdff1aSopenharmony_ci flcoeffs5[i] += accum; 317cabdff1aSopenharmony_ci } 318cabdff1aSopenharmony_ci 319cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) 320cabdff1aSopenharmony_ci workT2[i] = 0.0; 321cabdff1aSopenharmony_ci 322cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 323cabdff1aSopenharmony_ci for (cnt2 = i - 1; cnt2 > q->cyclTab2[i]; cnt2--) 324cabdff1aSopenharmony_ci flcoeffs5[cnt2] += workT3[i]; 325cabdff1aSopenharmony_ci workT2[cnt2+1] += workT3[i]; 326cabdff1aSopenharmony_ci } 327cabdff1aSopenharmony_ci 328cabdff1aSopenharmony_ci accum = 0.0; 329cabdff1aSopenharmony_ci 330cabdff1aSopenharmony_ci for (i = BANDS-2; i >= 0; i--) { 331cabdff1aSopenharmony_ci accum = (workT2[i+1] + accum) * q->weights2[i]; 332cabdff1aSopenharmony_ci flcoeffs5[i] += accum; 333cabdff1aSopenharmony_ci // there is missing code here, but it seems to never be triggered 334cabdff1aSopenharmony_ci } 335cabdff1aSopenharmony_ci} 336cabdff1aSopenharmony_ci 337cabdff1aSopenharmony_ci 338cabdff1aSopenharmony_cistatic void imc_read_level_coeffs(IMCContext *q, int stream_format_code, 339cabdff1aSopenharmony_ci int *levlCoeffs) 340cabdff1aSopenharmony_ci{ 341cabdff1aSopenharmony_ci int i; 342cabdff1aSopenharmony_ci VLC *hufftab[4]; 343cabdff1aSopenharmony_ci int start = 0; 344cabdff1aSopenharmony_ci const uint8_t *cb_sel; 345cabdff1aSopenharmony_ci int s; 346cabdff1aSopenharmony_ci 347cabdff1aSopenharmony_ci s = stream_format_code >> 1; 348cabdff1aSopenharmony_ci hufftab[0] = &huffman_vlc[s][0]; 349cabdff1aSopenharmony_ci hufftab[1] = &huffman_vlc[s][1]; 350cabdff1aSopenharmony_ci hufftab[2] = &huffman_vlc[s][2]; 351cabdff1aSopenharmony_ci hufftab[3] = &huffman_vlc[s][3]; 352cabdff1aSopenharmony_ci cb_sel = imc_cb_select[s]; 353cabdff1aSopenharmony_ci 354cabdff1aSopenharmony_ci if (stream_format_code & 4) 355cabdff1aSopenharmony_ci start = 1; 356cabdff1aSopenharmony_ci if (start) 357cabdff1aSopenharmony_ci levlCoeffs[0] = get_bits(&q->gb, 7); 358cabdff1aSopenharmony_ci for (i = start; i < BANDS; i++) { 359cabdff1aSopenharmony_ci levlCoeffs[i] = get_vlc2(&q->gb, hufftab[cb_sel[i]]->table, 360cabdff1aSopenharmony_ci IMC_VLC_BITS, 2); 361cabdff1aSopenharmony_ci if (levlCoeffs[i] == 17) 362cabdff1aSopenharmony_ci levlCoeffs[i] += get_bits(&q->gb, 4); 363cabdff1aSopenharmony_ci } 364cabdff1aSopenharmony_ci} 365cabdff1aSopenharmony_ci 366cabdff1aSopenharmony_cistatic void imc_read_level_coeffs_raw(IMCContext *q, int stream_format_code, 367cabdff1aSopenharmony_ci int *levlCoeffs) 368cabdff1aSopenharmony_ci{ 369cabdff1aSopenharmony_ci int i; 370cabdff1aSopenharmony_ci 371cabdff1aSopenharmony_ci q->coef0_pos = get_bits(&q->gb, 5); 372cabdff1aSopenharmony_ci levlCoeffs[0] = get_bits(&q->gb, 7); 373cabdff1aSopenharmony_ci for (i = 1; i < BANDS; i++) 374cabdff1aSopenharmony_ci levlCoeffs[i] = get_bits(&q->gb, 4); 375cabdff1aSopenharmony_ci} 376cabdff1aSopenharmony_ci 377cabdff1aSopenharmony_cistatic void imc_decode_level_coefficients(IMCContext *q, int *levlCoeffBuf, 378cabdff1aSopenharmony_ci float *flcoeffs1, float *flcoeffs2) 379cabdff1aSopenharmony_ci{ 380cabdff1aSopenharmony_ci int i, level; 381cabdff1aSopenharmony_ci float tmp, tmp2; 382cabdff1aSopenharmony_ci // maybe some frequency division thingy 383cabdff1aSopenharmony_ci 384cabdff1aSopenharmony_ci flcoeffs1[0] = 20000.0 / exp2 (levlCoeffBuf[0] * 0.18945); // 0.18945 = log2(10) * 0.05703125 385cabdff1aSopenharmony_ci flcoeffs2[0] = log2f(flcoeffs1[0]); 386cabdff1aSopenharmony_ci tmp = flcoeffs1[0]; 387cabdff1aSopenharmony_ci tmp2 = flcoeffs2[0]; 388cabdff1aSopenharmony_ci 389cabdff1aSopenharmony_ci for (i = 1; i < BANDS; i++) { 390cabdff1aSopenharmony_ci level = levlCoeffBuf[i]; 391cabdff1aSopenharmony_ci if (level == 16) { 392cabdff1aSopenharmony_ci flcoeffs1[i] = 1.0; 393cabdff1aSopenharmony_ci flcoeffs2[i] = 0.0; 394cabdff1aSopenharmony_ci } else { 395cabdff1aSopenharmony_ci if (level < 17) 396cabdff1aSopenharmony_ci level -= 7; 397cabdff1aSopenharmony_ci else if (level <= 24) 398cabdff1aSopenharmony_ci level -= 32; 399cabdff1aSopenharmony_ci else 400cabdff1aSopenharmony_ci level -= 16; 401cabdff1aSopenharmony_ci 402cabdff1aSopenharmony_ci tmp *= imc_exp_tab[15 + level]; 403cabdff1aSopenharmony_ci tmp2 += 0.83048 * level; // 0.83048 = log2(10) * 0.25 404cabdff1aSopenharmony_ci flcoeffs1[i] = tmp; 405cabdff1aSopenharmony_ci flcoeffs2[i] = tmp2; 406cabdff1aSopenharmony_ci } 407cabdff1aSopenharmony_ci } 408cabdff1aSopenharmony_ci} 409cabdff1aSopenharmony_ci 410cabdff1aSopenharmony_ci 411cabdff1aSopenharmony_cistatic void imc_decode_level_coefficients2(IMCContext *q, int *levlCoeffBuf, 412cabdff1aSopenharmony_ci float *old_floor, float *flcoeffs1, 413cabdff1aSopenharmony_ci float *flcoeffs2) 414cabdff1aSopenharmony_ci{ 415cabdff1aSopenharmony_ci int i; 416cabdff1aSopenharmony_ci /* FIXME maybe flag_buf = noise coding and flcoeffs1 = new scale factors 417cabdff1aSopenharmony_ci * and flcoeffs2 old scale factors 418cabdff1aSopenharmony_ci * might be incomplete due to a missing table that is in the binary code 419cabdff1aSopenharmony_ci */ 420cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 421cabdff1aSopenharmony_ci flcoeffs1[i] = 0; 422cabdff1aSopenharmony_ci if (levlCoeffBuf[i] < 16) { 423cabdff1aSopenharmony_ci flcoeffs1[i] = imc_exp_tab2[levlCoeffBuf[i]] * old_floor[i]; 424cabdff1aSopenharmony_ci flcoeffs2[i] = (levlCoeffBuf[i] - 7) * 0.83048 + flcoeffs2[i]; // 0.83048 = log2(10) * 0.25 425cabdff1aSopenharmony_ci } else { 426cabdff1aSopenharmony_ci flcoeffs1[i] = old_floor[i]; 427cabdff1aSopenharmony_ci } 428cabdff1aSopenharmony_ci } 429cabdff1aSopenharmony_ci} 430cabdff1aSopenharmony_ci 431cabdff1aSopenharmony_cistatic void imc_decode_level_coefficients_raw(IMCContext *q, int *levlCoeffBuf, 432cabdff1aSopenharmony_ci float *flcoeffs1, float *flcoeffs2) 433cabdff1aSopenharmony_ci{ 434cabdff1aSopenharmony_ci int i, level, pos; 435cabdff1aSopenharmony_ci float tmp, tmp2; 436cabdff1aSopenharmony_ci 437cabdff1aSopenharmony_ci pos = q->coef0_pos; 438cabdff1aSopenharmony_ci flcoeffs1[pos] = 20000.0 / pow (2, levlCoeffBuf[0] * 0.18945); // 0.18945 = log2(10) * 0.05703125 439cabdff1aSopenharmony_ci flcoeffs2[pos] = log2f(flcoeffs1[pos]); 440cabdff1aSopenharmony_ci tmp = flcoeffs1[pos]; 441cabdff1aSopenharmony_ci tmp2 = flcoeffs2[pos]; 442cabdff1aSopenharmony_ci 443cabdff1aSopenharmony_ci levlCoeffBuf++; 444cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 445cabdff1aSopenharmony_ci if (i == pos) 446cabdff1aSopenharmony_ci continue; 447cabdff1aSopenharmony_ci level = *levlCoeffBuf++; 448cabdff1aSopenharmony_ci flcoeffs1[i] = tmp * powf(10.0, -level * 0.4375); //todo tab 449cabdff1aSopenharmony_ci flcoeffs2[i] = tmp2 - 1.4533435415 * level; // 1.4533435415 = log2(10) * 0.4375 450cabdff1aSopenharmony_ci } 451cabdff1aSopenharmony_ci} 452cabdff1aSopenharmony_ci 453cabdff1aSopenharmony_ci/** 454cabdff1aSopenharmony_ci * Perform bit allocation depending on bits available 455cabdff1aSopenharmony_ci */ 456cabdff1aSopenharmony_cistatic int bit_allocation(IMCContext *q, IMCChannel *chctx, 457cabdff1aSopenharmony_ci int stream_format_code, int freebits, int flag) 458cabdff1aSopenharmony_ci{ 459cabdff1aSopenharmony_ci int i, j; 460cabdff1aSopenharmony_ci const float limit = -1.e20; 461cabdff1aSopenharmony_ci float highest = 0.0; 462cabdff1aSopenharmony_ci int indx; 463cabdff1aSopenharmony_ci int t1 = 0; 464cabdff1aSopenharmony_ci int t2 = 1; 465cabdff1aSopenharmony_ci float summa = 0.0; 466cabdff1aSopenharmony_ci int iacc = 0; 467cabdff1aSopenharmony_ci int summer = 0; 468cabdff1aSopenharmony_ci int rres, cwlen; 469cabdff1aSopenharmony_ci float lowest = 1.e10; 470cabdff1aSopenharmony_ci int low_indx = 0; 471cabdff1aSopenharmony_ci float workT[32]; 472cabdff1aSopenharmony_ci int flg; 473cabdff1aSopenharmony_ci int found_indx = 0; 474cabdff1aSopenharmony_ci 475cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) 476cabdff1aSopenharmony_ci highest = FFMAX(highest, chctx->flcoeffs1[i]); 477cabdff1aSopenharmony_ci 478cabdff1aSopenharmony_ci for (i = 0; i < BANDS - 1; i++) { 479cabdff1aSopenharmony_ci if (chctx->flcoeffs5[i] <= 0) { 480cabdff1aSopenharmony_ci av_log(q->avctx, AV_LOG_ERROR, "flcoeffs5 %f invalid\n", chctx->flcoeffs5[i]); 481cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 482cabdff1aSopenharmony_ci } 483cabdff1aSopenharmony_ci chctx->flcoeffs4[i] = chctx->flcoeffs3[i] - log2f(chctx->flcoeffs5[i]); 484cabdff1aSopenharmony_ci } 485cabdff1aSopenharmony_ci chctx->flcoeffs4[BANDS - 1] = limit; 486cabdff1aSopenharmony_ci 487cabdff1aSopenharmony_ci highest = highest * 0.25; 488cabdff1aSopenharmony_ci 489cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 490cabdff1aSopenharmony_ci indx = -1; 491cabdff1aSopenharmony_ci if ((band_tab[i + 1] - band_tab[i]) == chctx->bandWidthT[i]) 492cabdff1aSopenharmony_ci indx = 0; 493cabdff1aSopenharmony_ci 494cabdff1aSopenharmony_ci if ((band_tab[i + 1] - band_tab[i]) > chctx->bandWidthT[i]) 495cabdff1aSopenharmony_ci indx = 1; 496cabdff1aSopenharmony_ci 497cabdff1aSopenharmony_ci if (((band_tab[i + 1] - band_tab[i]) / 2) >= chctx->bandWidthT[i]) 498cabdff1aSopenharmony_ci indx = 2; 499cabdff1aSopenharmony_ci 500cabdff1aSopenharmony_ci if (indx == -1) 501cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 502cabdff1aSopenharmony_ci 503cabdff1aSopenharmony_ci chctx->flcoeffs4[i] += xTab[(indx * 2 + (chctx->flcoeffs1[i] < highest)) * 2 + flag]; 504cabdff1aSopenharmony_ci } 505cabdff1aSopenharmony_ci 506cabdff1aSopenharmony_ci if (stream_format_code & 0x2) { 507cabdff1aSopenharmony_ci chctx->flcoeffs4[0] = limit; 508cabdff1aSopenharmony_ci chctx->flcoeffs4[1] = limit; 509cabdff1aSopenharmony_ci chctx->flcoeffs4[2] = limit; 510cabdff1aSopenharmony_ci chctx->flcoeffs4[3] = limit; 511cabdff1aSopenharmony_ci } 512cabdff1aSopenharmony_ci 513cabdff1aSopenharmony_ci for (i = (stream_format_code & 0x2) ? 4 : 0; i < BANDS - 1; i++) { 514cabdff1aSopenharmony_ci iacc += chctx->bandWidthT[i]; 515cabdff1aSopenharmony_ci summa += chctx->bandWidthT[i] * chctx->flcoeffs4[i]; 516cabdff1aSopenharmony_ci } 517cabdff1aSopenharmony_ci 518cabdff1aSopenharmony_ci if (!iacc) 519cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 520cabdff1aSopenharmony_ci 521cabdff1aSopenharmony_ci chctx->bandWidthT[BANDS - 1] = 0; 522cabdff1aSopenharmony_ci summa = (summa * 0.5 - freebits) / iacc; 523cabdff1aSopenharmony_ci 524cabdff1aSopenharmony_ci 525cabdff1aSopenharmony_ci for (i = 0; i < BANDS / 2; i++) { 526cabdff1aSopenharmony_ci rres = summer - freebits; 527cabdff1aSopenharmony_ci if ((rres >= -8) && (rres <= 8)) 528cabdff1aSopenharmony_ci break; 529cabdff1aSopenharmony_ci 530cabdff1aSopenharmony_ci summer = 0; 531cabdff1aSopenharmony_ci iacc = 0; 532cabdff1aSopenharmony_ci 533cabdff1aSopenharmony_ci for (j = (stream_format_code & 0x2) ? 4 : 0; j < BANDS; j++) { 534cabdff1aSopenharmony_ci cwlen = av_clipf(((chctx->flcoeffs4[j] * 0.5) - summa + 0.5), 0, 6); 535cabdff1aSopenharmony_ci 536cabdff1aSopenharmony_ci chctx->bitsBandT[j] = cwlen; 537cabdff1aSopenharmony_ci summer += chctx->bandWidthT[j] * cwlen; 538cabdff1aSopenharmony_ci 539cabdff1aSopenharmony_ci if (cwlen > 0) 540cabdff1aSopenharmony_ci iacc += chctx->bandWidthT[j]; 541cabdff1aSopenharmony_ci } 542cabdff1aSopenharmony_ci 543cabdff1aSopenharmony_ci flg = t2; 544cabdff1aSopenharmony_ci t2 = 1; 545cabdff1aSopenharmony_ci if (freebits < summer) 546cabdff1aSopenharmony_ci t2 = -1; 547cabdff1aSopenharmony_ci if (i == 0) 548cabdff1aSopenharmony_ci flg = t2; 549cabdff1aSopenharmony_ci if (flg != t2) 550cabdff1aSopenharmony_ci t1++; 551cabdff1aSopenharmony_ci 552cabdff1aSopenharmony_ci summa = (float)(summer - freebits) / ((t1 + 1) * iacc) + summa; 553cabdff1aSopenharmony_ci } 554cabdff1aSopenharmony_ci 555cabdff1aSopenharmony_ci for (i = (stream_format_code & 0x2) ? 4 : 0; i < BANDS; i++) { 556cabdff1aSopenharmony_ci for (j = band_tab[i]; j < band_tab[i + 1]; j++) 557cabdff1aSopenharmony_ci chctx->CWlengthT[j] = chctx->bitsBandT[i]; 558cabdff1aSopenharmony_ci } 559cabdff1aSopenharmony_ci 560cabdff1aSopenharmony_ci if (freebits > summer) { 561cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 562cabdff1aSopenharmony_ci workT[i] = (chctx->bitsBandT[i] == 6) ? -1.e20 563cabdff1aSopenharmony_ci : (chctx->bitsBandT[i] * -2 + chctx->flcoeffs4[i] - 0.415); 564cabdff1aSopenharmony_ci } 565cabdff1aSopenharmony_ci 566cabdff1aSopenharmony_ci highest = 0.0; 567cabdff1aSopenharmony_ci 568cabdff1aSopenharmony_ci do { 569cabdff1aSopenharmony_ci if (highest <= -1.e20) 570cabdff1aSopenharmony_ci break; 571cabdff1aSopenharmony_ci 572cabdff1aSopenharmony_ci found_indx = 0; 573cabdff1aSopenharmony_ci highest = -1.e20; 574cabdff1aSopenharmony_ci 575cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 576cabdff1aSopenharmony_ci if (workT[i] > highest) { 577cabdff1aSopenharmony_ci highest = workT[i]; 578cabdff1aSopenharmony_ci found_indx = i; 579cabdff1aSopenharmony_ci } 580cabdff1aSopenharmony_ci } 581cabdff1aSopenharmony_ci 582cabdff1aSopenharmony_ci if (highest > -1.e20) { 583cabdff1aSopenharmony_ci workT[found_indx] -= 2.0; 584cabdff1aSopenharmony_ci if (++chctx->bitsBandT[found_indx] == 6) 585cabdff1aSopenharmony_ci workT[found_indx] = -1.e20; 586cabdff1aSopenharmony_ci 587cabdff1aSopenharmony_ci for (j = band_tab[found_indx]; j < band_tab[found_indx + 1] && (freebits > summer); j++) { 588cabdff1aSopenharmony_ci chctx->CWlengthT[j]++; 589cabdff1aSopenharmony_ci summer++; 590cabdff1aSopenharmony_ci } 591cabdff1aSopenharmony_ci } 592cabdff1aSopenharmony_ci } while (freebits > summer); 593cabdff1aSopenharmony_ci } 594cabdff1aSopenharmony_ci if (freebits < summer) { 595cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 596cabdff1aSopenharmony_ci workT[i] = chctx->bitsBandT[i] ? (chctx->bitsBandT[i] * -2 + chctx->flcoeffs4[i] + 1.585) 597cabdff1aSopenharmony_ci : 1.e20; 598cabdff1aSopenharmony_ci } 599cabdff1aSopenharmony_ci if (stream_format_code & 0x2) { 600cabdff1aSopenharmony_ci workT[0] = 1.e20; 601cabdff1aSopenharmony_ci workT[1] = 1.e20; 602cabdff1aSopenharmony_ci workT[2] = 1.e20; 603cabdff1aSopenharmony_ci workT[3] = 1.e20; 604cabdff1aSopenharmony_ci } 605cabdff1aSopenharmony_ci while (freebits < summer) { 606cabdff1aSopenharmony_ci lowest = 1.e10; 607cabdff1aSopenharmony_ci low_indx = 0; 608cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 609cabdff1aSopenharmony_ci if (workT[i] < lowest) { 610cabdff1aSopenharmony_ci lowest = workT[i]; 611cabdff1aSopenharmony_ci low_indx = i; 612cabdff1aSopenharmony_ci } 613cabdff1aSopenharmony_ci } 614cabdff1aSopenharmony_ci // if (lowest >= 1.e10) 615cabdff1aSopenharmony_ci // break; 616cabdff1aSopenharmony_ci workT[low_indx] = lowest + 2.0; 617cabdff1aSopenharmony_ci 618cabdff1aSopenharmony_ci if (!--chctx->bitsBandT[low_indx]) 619cabdff1aSopenharmony_ci workT[low_indx] = 1.e20; 620cabdff1aSopenharmony_ci 621cabdff1aSopenharmony_ci for (j = band_tab[low_indx]; j < band_tab[low_indx+1] && (freebits < summer); j++) { 622cabdff1aSopenharmony_ci if (chctx->CWlengthT[j] > 0) { 623cabdff1aSopenharmony_ci chctx->CWlengthT[j]--; 624cabdff1aSopenharmony_ci summer--; 625cabdff1aSopenharmony_ci } 626cabdff1aSopenharmony_ci } 627cabdff1aSopenharmony_ci } 628cabdff1aSopenharmony_ci } 629cabdff1aSopenharmony_ci return 0; 630cabdff1aSopenharmony_ci} 631cabdff1aSopenharmony_ci 632cabdff1aSopenharmony_cistatic void imc_get_skip_coeff(IMCContext *q, IMCChannel *chctx) 633cabdff1aSopenharmony_ci{ 634cabdff1aSopenharmony_ci int i, j; 635cabdff1aSopenharmony_ci 636cabdff1aSopenharmony_ci memset(chctx->skipFlagBits, 0, sizeof(chctx->skipFlagBits)); 637cabdff1aSopenharmony_ci memset(chctx->skipFlagCount, 0, sizeof(chctx->skipFlagCount)); 638cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 639cabdff1aSopenharmony_ci if (!chctx->bandFlagsBuf[i] || !chctx->bandWidthT[i]) 640cabdff1aSopenharmony_ci continue; 641cabdff1aSopenharmony_ci 642cabdff1aSopenharmony_ci if (!chctx->skipFlagRaw[i]) { 643cabdff1aSopenharmony_ci chctx->skipFlagBits[i] = band_tab[i + 1] - band_tab[i]; 644cabdff1aSopenharmony_ci 645cabdff1aSopenharmony_ci for (j = band_tab[i]; j < band_tab[i + 1]; j++) { 646cabdff1aSopenharmony_ci chctx->skipFlags[j] = get_bits1(&q->gb); 647cabdff1aSopenharmony_ci if (chctx->skipFlags[j]) 648cabdff1aSopenharmony_ci chctx->skipFlagCount[i]++; 649cabdff1aSopenharmony_ci } 650cabdff1aSopenharmony_ci } else { 651cabdff1aSopenharmony_ci for (j = band_tab[i]; j < band_tab[i + 1] - 1; j += 2) { 652cabdff1aSopenharmony_ci if (!get_bits1(&q->gb)) { // 0 653cabdff1aSopenharmony_ci chctx->skipFlagBits[i]++; 654cabdff1aSopenharmony_ci chctx->skipFlags[j] = 1; 655cabdff1aSopenharmony_ci chctx->skipFlags[j + 1] = 1; 656cabdff1aSopenharmony_ci chctx->skipFlagCount[i] += 2; 657cabdff1aSopenharmony_ci } else { 658cabdff1aSopenharmony_ci if (get_bits1(&q->gb)) { // 11 659cabdff1aSopenharmony_ci chctx->skipFlagBits[i] += 2; 660cabdff1aSopenharmony_ci chctx->skipFlags[j] = 0; 661cabdff1aSopenharmony_ci chctx->skipFlags[j + 1] = 1; 662cabdff1aSopenharmony_ci chctx->skipFlagCount[i]++; 663cabdff1aSopenharmony_ci } else { 664cabdff1aSopenharmony_ci chctx->skipFlagBits[i] += 3; 665cabdff1aSopenharmony_ci chctx->skipFlags[j + 1] = 0; 666cabdff1aSopenharmony_ci if (!get_bits1(&q->gb)) { // 100 667cabdff1aSopenharmony_ci chctx->skipFlags[j] = 1; 668cabdff1aSopenharmony_ci chctx->skipFlagCount[i]++; 669cabdff1aSopenharmony_ci } else { // 101 670cabdff1aSopenharmony_ci chctx->skipFlags[j] = 0; 671cabdff1aSopenharmony_ci } 672cabdff1aSopenharmony_ci } 673cabdff1aSopenharmony_ci } 674cabdff1aSopenharmony_ci } 675cabdff1aSopenharmony_ci 676cabdff1aSopenharmony_ci if (j < band_tab[i + 1]) { 677cabdff1aSopenharmony_ci chctx->skipFlagBits[i]++; 678cabdff1aSopenharmony_ci if ((chctx->skipFlags[j] = get_bits1(&q->gb))) 679cabdff1aSopenharmony_ci chctx->skipFlagCount[i]++; 680cabdff1aSopenharmony_ci } 681cabdff1aSopenharmony_ci } 682cabdff1aSopenharmony_ci } 683cabdff1aSopenharmony_ci} 684cabdff1aSopenharmony_ci 685cabdff1aSopenharmony_ci/** 686cabdff1aSopenharmony_ci * Increase highest' band coefficient sizes as some bits won't be used 687cabdff1aSopenharmony_ci */ 688cabdff1aSopenharmony_cistatic void imc_adjust_bit_allocation(IMCContext *q, IMCChannel *chctx, 689cabdff1aSopenharmony_ci int summer) 690cabdff1aSopenharmony_ci{ 691cabdff1aSopenharmony_ci float workT[32]; 692cabdff1aSopenharmony_ci int corrected = 0; 693cabdff1aSopenharmony_ci int i, j; 694cabdff1aSopenharmony_ci float highest = 0; 695cabdff1aSopenharmony_ci int found_indx = 0; 696cabdff1aSopenharmony_ci 697cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 698cabdff1aSopenharmony_ci workT[i] = (chctx->bitsBandT[i] == 6) ? -1.e20 699cabdff1aSopenharmony_ci : (chctx->bitsBandT[i] * -2 + chctx->flcoeffs4[i] - 0.415); 700cabdff1aSopenharmony_ci } 701cabdff1aSopenharmony_ci 702cabdff1aSopenharmony_ci while (corrected < summer) { 703cabdff1aSopenharmony_ci if (highest <= -1.e20) 704cabdff1aSopenharmony_ci break; 705cabdff1aSopenharmony_ci 706cabdff1aSopenharmony_ci highest = -1.e20; 707cabdff1aSopenharmony_ci 708cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 709cabdff1aSopenharmony_ci if (workT[i] > highest) { 710cabdff1aSopenharmony_ci highest = workT[i]; 711cabdff1aSopenharmony_ci found_indx = i; 712cabdff1aSopenharmony_ci } 713cabdff1aSopenharmony_ci } 714cabdff1aSopenharmony_ci 715cabdff1aSopenharmony_ci if (highest > -1.e20) { 716cabdff1aSopenharmony_ci workT[found_indx] -= 2.0; 717cabdff1aSopenharmony_ci if (++(chctx->bitsBandT[found_indx]) == 6) 718cabdff1aSopenharmony_ci workT[found_indx] = -1.e20; 719cabdff1aSopenharmony_ci 720cabdff1aSopenharmony_ci for (j = band_tab[found_indx]; j < band_tab[found_indx+1] && (corrected < summer); j++) { 721cabdff1aSopenharmony_ci if (!chctx->skipFlags[j] && (chctx->CWlengthT[j] < 6)) { 722cabdff1aSopenharmony_ci chctx->CWlengthT[j]++; 723cabdff1aSopenharmony_ci corrected++; 724cabdff1aSopenharmony_ci } 725cabdff1aSopenharmony_ci } 726cabdff1aSopenharmony_ci } 727cabdff1aSopenharmony_ci } 728cabdff1aSopenharmony_ci} 729cabdff1aSopenharmony_ci 730cabdff1aSopenharmony_cistatic void imc_imdct256(IMCContext *q, IMCChannel *chctx, int channels) 731cabdff1aSopenharmony_ci{ 732cabdff1aSopenharmony_ci int i; 733cabdff1aSopenharmony_ci float re, im; 734cabdff1aSopenharmony_ci float *dst1 = q->out_samples; 735cabdff1aSopenharmony_ci float *dst2 = q->out_samples + (COEFFS - 1); 736cabdff1aSopenharmony_ci 737cabdff1aSopenharmony_ci /* prerotation */ 738cabdff1aSopenharmony_ci for (i = 0; i < COEFFS / 2; i++) { 739cabdff1aSopenharmony_ci q->samples[i].re = -(q->pre_coef1[i] * chctx->CWdecoded[COEFFS - 1 - i * 2]) - 740cabdff1aSopenharmony_ci (q->pre_coef2[i] * chctx->CWdecoded[i * 2]); 741cabdff1aSopenharmony_ci q->samples[i].im = (q->pre_coef2[i] * chctx->CWdecoded[COEFFS - 1 - i * 2]) - 742cabdff1aSopenharmony_ci (q->pre_coef1[i] * chctx->CWdecoded[i * 2]); 743cabdff1aSopenharmony_ci } 744cabdff1aSopenharmony_ci 745cabdff1aSopenharmony_ci /* FFT */ 746cabdff1aSopenharmony_ci q->fft.fft_permute(&q->fft, q->samples); 747cabdff1aSopenharmony_ci q->fft.fft_calc(&q->fft, q->samples); 748cabdff1aSopenharmony_ci 749cabdff1aSopenharmony_ci /* postrotation, window and reorder */ 750cabdff1aSopenharmony_ci for (i = 0; i < COEFFS / 2; i++) { 751cabdff1aSopenharmony_ci re = ( q->samples[i].re * q->post_cos[i]) + (-q->samples[i].im * q->post_sin[i]); 752cabdff1aSopenharmony_ci im = (-q->samples[i].im * q->post_cos[i]) - ( q->samples[i].re * q->post_sin[i]); 753cabdff1aSopenharmony_ci *dst1 = (q->mdct_sine_window[COEFFS - 1 - i * 2] * chctx->last_fft_im[i]) 754cabdff1aSopenharmony_ci + (q->mdct_sine_window[i * 2] * re); 755cabdff1aSopenharmony_ci *dst2 = (q->mdct_sine_window[i * 2] * chctx->last_fft_im[i]) 756cabdff1aSopenharmony_ci - (q->mdct_sine_window[COEFFS - 1 - i * 2] * re); 757cabdff1aSopenharmony_ci dst1 += 2; 758cabdff1aSopenharmony_ci dst2 -= 2; 759cabdff1aSopenharmony_ci chctx->last_fft_im[i] = im; 760cabdff1aSopenharmony_ci } 761cabdff1aSopenharmony_ci} 762cabdff1aSopenharmony_ci 763cabdff1aSopenharmony_cistatic int inverse_quant_coeff(IMCContext *q, IMCChannel *chctx, 764cabdff1aSopenharmony_ci int stream_format_code) 765cabdff1aSopenharmony_ci{ 766cabdff1aSopenharmony_ci int i, j; 767cabdff1aSopenharmony_ci int middle_value, cw_len, max_size; 768cabdff1aSopenharmony_ci const float *quantizer; 769cabdff1aSopenharmony_ci 770cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 771cabdff1aSopenharmony_ci for (j = band_tab[i]; j < band_tab[i + 1]; j++) { 772cabdff1aSopenharmony_ci chctx->CWdecoded[j] = 0; 773cabdff1aSopenharmony_ci cw_len = chctx->CWlengthT[j]; 774cabdff1aSopenharmony_ci 775cabdff1aSopenharmony_ci if (cw_len <= 0 || chctx->skipFlags[j]) 776cabdff1aSopenharmony_ci continue; 777cabdff1aSopenharmony_ci 778cabdff1aSopenharmony_ci max_size = 1 << cw_len; 779cabdff1aSopenharmony_ci middle_value = max_size >> 1; 780cabdff1aSopenharmony_ci 781cabdff1aSopenharmony_ci if (chctx->codewords[j] >= max_size || chctx->codewords[j] < 0) 782cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 783cabdff1aSopenharmony_ci 784cabdff1aSopenharmony_ci if (cw_len >= 4) { 785cabdff1aSopenharmony_ci quantizer = imc_quantizer2[(stream_format_code & 2) >> 1]; 786cabdff1aSopenharmony_ci if (chctx->codewords[j] >= middle_value) 787cabdff1aSopenharmony_ci chctx->CWdecoded[j] = quantizer[chctx->codewords[j] - 8] * chctx->flcoeffs6[i]; 788cabdff1aSopenharmony_ci else 789cabdff1aSopenharmony_ci chctx->CWdecoded[j] = -quantizer[max_size - chctx->codewords[j] - 8 - 1] * chctx->flcoeffs6[i]; 790cabdff1aSopenharmony_ci }else{ 791cabdff1aSopenharmony_ci quantizer = imc_quantizer1[((stream_format_code & 2) >> 1) | (chctx->bandFlagsBuf[i] << 1)]; 792cabdff1aSopenharmony_ci if (chctx->codewords[j] >= middle_value) 793cabdff1aSopenharmony_ci chctx->CWdecoded[j] = quantizer[chctx->codewords[j] - 1] * chctx->flcoeffs6[i]; 794cabdff1aSopenharmony_ci else 795cabdff1aSopenharmony_ci chctx->CWdecoded[j] = -quantizer[max_size - 2 - chctx->codewords[j]] * chctx->flcoeffs6[i]; 796cabdff1aSopenharmony_ci } 797cabdff1aSopenharmony_ci } 798cabdff1aSopenharmony_ci } 799cabdff1aSopenharmony_ci return 0; 800cabdff1aSopenharmony_ci} 801cabdff1aSopenharmony_ci 802cabdff1aSopenharmony_ci 803cabdff1aSopenharmony_cistatic void imc_get_coeffs(AVCodecContext *avctx, 804cabdff1aSopenharmony_ci IMCContext *q, IMCChannel *chctx) 805cabdff1aSopenharmony_ci{ 806cabdff1aSopenharmony_ci int i, j, cw_len, cw; 807cabdff1aSopenharmony_ci 808cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 809cabdff1aSopenharmony_ci if (!chctx->sumLenArr[i]) 810cabdff1aSopenharmony_ci continue; 811cabdff1aSopenharmony_ci if (chctx->bandFlagsBuf[i] || chctx->bandWidthT[i]) { 812cabdff1aSopenharmony_ci for (j = band_tab[i]; j < band_tab[i + 1]; j++) { 813cabdff1aSopenharmony_ci cw_len = chctx->CWlengthT[j]; 814cabdff1aSopenharmony_ci cw = 0; 815cabdff1aSopenharmony_ci 816cabdff1aSopenharmony_ci if (cw_len && (!chctx->bandFlagsBuf[i] || !chctx->skipFlags[j])) { 817cabdff1aSopenharmony_ci if (get_bits_count(&q->gb) + cw_len > 512) { 818cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_WARNING, 819cabdff1aSopenharmony_ci "Potential problem on band %i, coefficient %i" 820cabdff1aSopenharmony_ci ": cw_len=%i\n", i, j, cw_len); 821cabdff1aSopenharmony_ci } else 822cabdff1aSopenharmony_ci cw = get_bits(&q->gb, cw_len); 823cabdff1aSopenharmony_ci } 824cabdff1aSopenharmony_ci 825cabdff1aSopenharmony_ci chctx->codewords[j] = cw; 826cabdff1aSopenharmony_ci } 827cabdff1aSopenharmony_ci } 828cabdff1aSopenharmony_ci } 829cabdff1aSopenharmony_ci} 830cabdff1aSopenharmony_ci 831cabdff1aSopenharmony_cistatic void imc_refine_bit_allocation(IMCContext *q, IMCChannel *chctx) 832cabdff1aSopenharmony_ci{ 833cabdff1aSopenharmony_ci int i, j; 834cabdff1aSopenharmony_ci int summer; 835cabdff1aSopenharmony_ci 836cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 837cabdff1aSopenharmony_ci chctx->sumLenArr[i] = 0; 838cabdff1aSopenharmony_ci chctx->skipFlagRaw[i] = 0; 839cabdff1aSopenharmony_ci for (j = band_tab[i]; j < band_tab[i + 1]; j++) 840cabdff1aSopenharmony_ci chctx->sumLenArr[i] += chctx->CWlengthT[j]; 841cabdff1aSopenharmony_ci if (chctx->bandFlagsBuf[i]) 842cabdff1aSopenharmony_ci if (((int)((band_tab[i + 1] - band_tab[i]) * 1.5) > chctx->sumLenArr[i]) && (chctx->sumLenArr[i] > 0)) 843cabdff1aSopenharmony_ci chctx->skipFlagRaw[i] = 1; 844cabdff1aSopenharmony_ci } 845cabdff1aSopenharmony_ci 846cabdff1aSopenharmony_ci imc_get_skip_coeff(q, chctx); 847cabdff1aSopenharmony_ci 848cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 849cabdff1aSopenharmony_ci chctx->flcoeffs6[i] = chctx->flcoeffs1[i]; 850cabdff1aSopenharmony_ci /* band has flag set and at least one coded coefficient */ 851cabdff1aSopenharmony_ci if (chctx->bandFlagsBuf[i] && (band_tab[i + 1] - band_tab[i]) != chctx->skipFlagCount[i]) { 852cabdff1aSopenharmony_ci chctx->flcoeffs6[i] *= q->sqrt_tab[ band_tab[i + 1] - band_tab[i]] / 853cabdff1aSopenharmony_ci q->sqrt_tab[(band_tab[i + 1] - band_tab[i] - chctx->skipFlagCount[i])]; 854cabdff1aSopenharmony_ci } 855cabdff1aSopenharmony_ci } 856cabdff1aSopenharmony_ci 857cabdff1aSopenharmony_ci /* calculate bits left, bits needed and adjust bit allocation */ 858cabdff1aSopenharmony_ci summer = 0; 859cabdff1aSopenharmony_ci 860cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 861cabdff1aSopenharmony_ci if (chctx->bandFlagsBuf[i]) { 862cabdff1aSopenharmony_ci for (j = band_tab[i]; j < band_tab[i + 1]; j++) { 863cabdff1aSopenharmony_ci if (chctx->skipFlags[j]) { 864cabdff1aSopenharmony_ci summer += chctx->CWlengthT[j]; 865cabdff1aSopenharmony_ci chctx->CWlengthT[j] = 0; 866cabdff1aSopenharmony_ci } 867cabdff1aSopenharmony_ci } 868cabdff1aSopenharmony_ci summer -= chctx->skipFlagBits[i]; 869cabdff1aSopenharmony_ci } 870cabdff1aSopenharmony_ci } 871cabdff1aSopenharmony_ci imc_adjust_bit_allocation(q, chctx, summer); 872cabdff1aSopenharmony_ci} 873cabdff1aSopenharmony_ci 874cabdff1aSopenharmony_cistatic int imc_decode_block(AVCodecContext *avctx, IMCContext *q, int ch) 875cabdff1aSopenharmony_ci{ 876cabdff1aSopenharmony_ci int stream_format_code; 877cabdff1aSopenharmony_ci int imc_hdr, i, j, ret; 878cabdff1aSopenharmony_ci int flag; 879cabdff1aSopenharmony_ci int bits; 880cabdff1aSopenharmony_ci int bitscount; 881cabdff1aSopenharmony_ci IMCChannel *chctx = q->chctx + ch; 882cabdff1aSopenharmony_ci 883cabdff1aSopenharmony_ci 884cabdff1aSopenharmony_ci /* Check the frame header */ 885cabdff1aSopenharmony_ci imc_hdr = get_bits(&q->gb, 9); 886cabdff1aSopenharmony_ci if (imc_hdr & 0x18) { 887cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "frame header check failed!\n"); 888cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "got %X.\n", imc_hdr); 889cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 890cabdff1aSopenharmony_ci } 891cabdff1aSopenharmony_ci stream_format_code = get_bits(&q->gb, 3); 892cabdff1aSopenharmony_ci 893cabdff1aSopenharmony_ci if (stream_format_code & 0x04) 894cabdff1aSopenharmony_ci chctx->decoder_reset = 1; 895cabdff1aSopenharmony_ci 896cabdff1aSopenharmony_ci if (chctx->decoder_reset) { 897cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) 898cabdff1aSopenharmony_ci chctx->old_floor[i] = 1.0; 899cabdff1aSopenharmony_ci for (i = 0; i < COEFFS; i++) 900cabdff1aSopenharmony_ci chctx->CWdecoded[i] = 0; 901cabdff1aSopenharmony_ci chctx->decoder_reset = 0; 902cabdff1aSopenharmony_ci } 903cabdff1aSopenharmony_ci 904cabdff1aSopenharmony_ci flag = get_bits1(&q->gb); 905cabdff1aSopenharmony_ci if (stream_format_code & 0x1) 906cabdff1aSopenharmony_ci imc_read_level_coeffs_raw(q, stream_format_code, chctx->levlCoeffBuf); 907cabdff1aSopenharmony_ci else 908cabdff1aSopenharmony_ci imc_read_level_coeffs(q, stream_format_code, chctx->levlCoeffBuf); 909cabdff1aSopenharmony_ci 910cabdff1aSopenharmony_ci if (stream_format_code & 0x1) 911cabdff1aSopenharmony_ci imc_decode_level_coefficients_raw(q, chctx->levlCoeffBuf, 912cabdff1aSopenharmony_ci chctx->flcoeffs1, chctx->flcoeffs2); 913cabdff1aSopenharmony_ci else if (stream_format_code & 0x4) 914cabdff1aSopenharmony_ci imc_decode_level_coefficients(q, chctx->levlCoeffBuf, 915cabdff1aSopenharmony_ci chctx->flcoeffs1, chctx->flcoeffs2); 916cabdff1aSopenharmony_ci else 917cabdff1aSopenharmony_ci imc_decode_level_coefficients2(q, chctx->levlCoeffBuf, chctx->old_floor, 918cabdff1aSopenharmony_ci chctx->flcoeffs1, chctx->flcoeffs2); 919cabdff1aSopenharmony_ci 920cabdff1aSopenharmony_ci for(i=0; i<BANDS; i++) { 921cabdff1aSopenharmony_ci if(chctx->flcoeffs1[i] > INT_MAX) { 922cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "scalefactor out of range\n"); 923cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 924cabdff1aSopenharmony_ci } 925cabdff1aSopenharmony_ci } 926cabdff1aSopenharmony_ci 927cabdff1aSopenharmony_ci memcpy(chctx->old_floor, chctx->flcoeffs1, 32 * sizeof(float)); 928cabdff1aSopenharmony_ci 929cabdff1aSopenharmony_ci if (stream_format_code & 0x1) { 930cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 931cabdff1aSopenharmony_ci chctx->bandWidthT[i] = band_tab[i + 1] - band_tab[i]; 932cabdff1aSopenharmony_ci chctx->bandFlagsBuf[i] = 0; 933cabdff1aSopenharmony_ci chctx->flcoeffs3[i] = chctx->flcoeffs2[i] * 2; 934cabdff1aSopenharmony_ci chctx->flcoeffs5[i] = 1.0; 935cabdff1aSopenharmony_ci } 936cabdff1aSopenharmony_ci } else { 937cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 938cabdff1aSopenharmony_ci if (chctx->levlCoeffBuf[i] == 16) { 939cabdff1aSopenharmony_ci chctx->bandWidthT[i] = 0; 940cabdff1aSopenharmony_ci } else 941cabdff1aSopenharmony_ci chctx->bandWidthT[i] = band_tab[i + 1] - band_tab[i]; 942cabdff1aSopenharmony_ci } 943cabdff1aSopenharmony_ci 944cabdff1aSopenharmony_ci memset(chctx->bandFlagsBuf, 0, BANDS * sizeof(int)); 945cabdff1aSopenharmony_ci for (i = 0; i < BANDS - 1; i++) 946cabdff1aSopenharmony_ci if (chctx->bandWidthT[i]) 947cabdff1aSopenharmony_ci chctx->bandFlagsBuf[i] = get_bits1(&q->gb); 948cabdff1aSopenharmony_ci 949cabdff1aSopenharmony_ci imc_calculate_coeffs(q, chctx->flcoeffs1, chctx->flcoeffs2, 950cabdff1aSopenharmony_ci chctx->bandWidthT, chctx->flcoeffs3, 951cabdff1aSopenharmony_ci chctx->flcoeffs5); 952cabdff1aSopenharmony_ci } 953cabdff1aSopenharmony_ci 954cabdff1aSopenharmony_ci bitscount = 0; 955cabdff1aSopenharmony_ci /* first 4 bands will be assigned 5 bits per coefficient */ 956cabdff1aSopenharmony_ci if (stream_format_code & 0x2) { 957cabdff1aSopenharmony_ci bitscount += 15; 958cabdff1aSopenharmony_ci 959cabdff1aSopenharmony_ci chctx->bitsBandT[0] = 5; 960cabdff1aSopenharmony_ci chctx->CWlengthT[0] = 5; 961cabdff1aSopenharmony_ci chctx->CWlengthT[1] = 5; 962cabdff1aSopenharmony_ci chctx->CWlengthT[2] = 5; 963cabdff1aSopenharmony_ci for (i = 1; i < 4; i++) { 964cabdff1aSopenharmony_ci if (stream_format_code & 0x1) 965cabdff1aSopenharmony_ci bits = 5; 966cabdff1aSopenharmony_ci else 967cabdff1aSopenharmony_ci bits = (chctx->levlCoeffBuf[i] == 16) ? 0 : 5; 968cabdff1aSopenharmony_ci chctx->bitsBandT[i] = bits; 969cabdff1aSopenharmony_ci for (j = band_tab[i]; j < band_tab[i + 1]; j++) { 970cabdff1aSopenharmony_ci chctx->CWlengthT[j] = bits; 971cabdff1aSopenharmony_ci bitscount += bits; 972cabdff1aSopenharmony_ci } 973cabdff1aSopenharmony_ci } 974cabdff1aSopenharmony_ci } 975cabdff1aSopenharmony_ci if (avctx->codec_id == AV_CODEC_ID_IAC) { 976cabdff1aSopenharmony_ci bitscount += !!chctx->bandWidthT[BANDS - 1]; 977cabdff1aSopenharmony_ci if (!(stream_format_code & 0x2)) 978cabdff1aSopenharmony_ci bitscount += 16; 979cabdff1aSopenharmony_ci } 980cabdff1aSopenharmony_ci 981cabdff1aSopenharmony_ci if ((ret = bit_allocation(q, chctx, stream_format_code, 982cabdff1aSopenharmony_ci 512 - bitscount - get_bits_count(&q->gb), 983cabdff1aSopenharmony_ci flag)) < 0) { 984cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Bit allocations failed\n"); 985cabdff1aSopenharmony_ci chctx->decoder_reset = 1; 986cabdff1aSopenharmony_ci return ret; 987cabdff1aSopenharmony_ci } 988cabdff1aSopenharmony_ci 989cabdff1aSopenharmony_ci if (stream_format_code & 0x1) { 990cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) 991cabdff1aSopenharmony_ci chctx->skipFlags[i] = 0; 992cabdff1aSopenharmony_ci } else { 993cabdff1aSopenharmony_ci imc_refine_bit_allocation(q, chctx); 994cabdff1aSopenharmony_ci } 995cabdff1aSopenharmony_ci 996cabdff1aSopenharmony_ci for (i = 0; i < BANDS; i++) { 997cabdff1aSopenharmony_ci chctx->sumLenArr[i] = 0; 998cabdff1aSopenharmony_ci 999cabdff1aSopenharmony_ci for (j = band_tab[i]; j < band_tab[i + 1]; j++) 1000cabdff1aSopenharmony_ci if (!chctx->skipFlags[j]) 1001cabdff1aSopenharmony_ci chctx->sumLenArr[i] += chctx->CWlengthT[j]; 1002cabdff1aSopenharmony_ci } 1003cabdff1aSopenharmony_ci 1004cabdff1aSopenharmony_ci memset(chctx->codewords, 0, sizeof(chctx->codewords)); 1005cabdff1aSopenharmony_ci 1006cabdff1aSopenharmony_ci imc_get_coeffs(avctx, q, chctx); 1007cabdff1aSopenharmony_ci 1008cabdff1aSopenharmony_ci if (inverse_quant_coeff(q, chctx, stream_format_code) < 0) { 1009cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "Inverse quantization of coefficients failed\n"); 1010cabdff1aSopenharmony_ci chctx->decoder_reset = 1; 1011cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1012cabdff1aSopenharmony_ci } 1013cabdff1aSopenharmony_ci 1014cabdff1aSopenharmony_ci memset(chctx->skipFlags, 0, sizeof(chctx->skipFlags)); 1015cabdff1aSopenharmony_ci 1016cabdff1aSopenharmony_ci imc_imdct256(q, chctx, avctx->ch_layout.nb_channels); 1017cabdff1aSopenharmony_ci 1018cabdff1aSopenharmony_ci return 0; 1019cabdff1aSopenharmony_ci} 1020cabdff1aSopenharmony_ci 1021cabdff1aSopenharmony_cistatic int imc_decode_frame(AVCodecContext *avctx, AVFrame *frame, 1022cabdff1aSopenharmony_ci int *got_frame_ptr, AVPacket *avpkt) 1023cabdff1aSopenharmony_ci{ 1024cabdff1aSopenharmony_ci const uint8_t *buf = avpkt->data; 1025cabdff1aSopenharmony_ci int buf_size = avpkt->size; 1026cabdff1aSopenharmony_ci int ret, i; 1027cabdff1aSopenharmony_ci 1028cabdff1aSopenharmony_ci IMCContext *q = avctx->priv_data; 1029cabdff1aSopenharmony_ci 1030cabdff1aSopenharmony_ci LOCAL_ALIGNED_16(uint16_t, buf16, [(IMC_BLOCK_SIZE + AV_INPUT_BUFFER_PADDING_SIZE) / 2]); 1031cabdff1aSopenharmony_ci 1032cabdff1aSopenharmony_ci q->avctx = avctx; 1033cabdff1aSopenharmony_ci 1034cabdff1aSopenharmony_ci if (buf_size < IMC_BLOCK_SIZE * avctx->ch_layout.nb_channels) { 1035cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_ERROR, "frame too small!\n"); 1036cabdff1aSopenharmony_ci return AVERROR_INVALIDDATA; 1037cabdff1aSopenharmony_ci } 1038cabdff1aSopenharmony_ci 1039cabdff1aSopenharmony_ci /* get output buffer */ 1040cabdff1aSopenharmony_ci frame->nb_samples = COEFFS; 1041cabdff1aSopenharmony_ci if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) 1042cabdff1aSopenharmony_ci return ret; 1043cabdff1aSopenharmony_ci 1044cabdff1aSopenharmony_ci for (i = 0; i < avctx->ch_layout.nb_channels; i++) { 1045cabdff1aSopenharmony_ci q->out_samples = (float *)frame->extended_data[i]; 1046cabdff1aSopenharmony_ci 1047cabdff1aSopenharmony_ci q->bdsp.bswap16_buf(buf16, (const uint16_t *) buf, IMC_BLOCK_SIZE / 2); 1048cabdff1aSopenharmony_ci 1049cabdff1aSopenharmony_ci init_get_bits(&q->gb, (const uint8_t*)buf16, IMC_BLOCK_SIZE * 8); 1050cabdff1aSopenharmony_ci 1051cabdff1aSopenharmony_ci buf += IMC_BLOCK_SIZE; 1052cabdff1aSopenharmony_ci 1053cabdff1aSopenharmony_ci if ((ret = imc_decode_block(avctx, q, i)) < 0) 1054cabdff1aSopenharmony_ci return ret; 1055cabdff1aSopenharmony_ci } 1056cabdff1aSopenharmony_ci 1057cabdff1aSopenharmony_ci if (avctx->ch_layout.nb_channels == 2) { 1058cabdff1aSopenharmony_ci q->butterflies_float((float *)frame->extended_data[0], 1059cabdff1aSopenharmony_ci (float *)frame->extended_data[1], COEFFS); 1060cabdff1aSopenharmony_ci } 1061cabdff1aSopenharmony_ci 1062cabdff1aSopenharmony_ci *got_frame_ptr = 1; 1063cabdff1aSopenharmony_ci 1064cabdff1aSopenharmony_ci return IMC_BLOCK_SIZE * avctx->ch_layout.nb_channels; 1065cabdff1aSopenharmony_ci} 1066cabdff1aSopenharmony_ci 1067cabdff1aSopenharmony_cistatic av_cold int imc_decode_close(AVCodecContext * avctx) 1068cabdff1aSopenharmony_ci{ 1069cabdff1aSopenharmony_ci IMCContext *q = avctx->priv_data; 1070cabdff1aSopenharmony_ci 1071cabdff1aSopenharmony_ci ff_fft_end(&q->fft); 1072cabdff1aSopenharmony_ci 1073cabdff1aSopenharmony_ci return 0; 1074cabdff1aSopenharmony_ci} 1075cabdff1aSopenharmony_ci 1076cabdff1aSopenharmony_cistatic av_cold void flush(AVCodecContext *avctx) 1077cabdff1aSopenharmony_ci{ 1078cabdff1aSopenharmony_ci IMCContext *q = avctx->priv_data; 1079cabdff1aSopenharmony_ci 1080cabdff1aSopenharmony_ci q->chctx[0].decoder_reset = 1081cabdff1aSopenharmony_ci q->chctx[1].decoder_reset = 1; 1082cabdff1aSopenharmony_ci} 1083cabdff1aSopenharmony_ci 1084cabdff1aSopenharmony_ci#if CONFIG_IMC_DECODER 1085cabdff1aSopenharmony_ciconst FFCodec ff_imc_decoder = { 1086cabdff1aSopenharmony_ci .p.name = "imc", 1087cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("IMC (Intel Music Coder)"), 1088cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 1089cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_IMC, 1090cabdff1aSopenharmony_ci .priv_data_size = sizeof(IMCContext), 1091cabdff1aSopenharmony_ci .init = imc_decode_init, 1092cabdff1aSopenharmony_ci .close = imc_decode_close, 1093cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(imc_decode_frame), 1094cabdff1aSopenharmony_ci .flush = flush, 1095cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_CHANNEL_CONF, 1096cabdff1aSopenharmony_ci .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, 1097cabdff1aSopenharmony_ci AV_SAMPLE_FMT_NONE }, 1098cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, 1099cabdff1aSopenharmony_ci}; 1100cabdff1aSopenharmony_ci#endif 1101cabdff1aSopenharmony_ci#if CONFIG_IAC_DECODER 1102cabdff1aSopenharmony_ciconst FFCodec ff_iac_decoder = { 1103cabdff1aSopenharmony_ci .p.name = "iac", 1104cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("IAC (Indeo Audio Coder)"), 1105cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_AUDIO, 1106cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_IAC, 1107cabdff1aSopenharmony_ci .priv_data_size = sizeof(IMCContext), 1108cabdff1aSopenharmony_ci .init = imc_decode_init, 1109cabdff1aSopenharmony_ci .close = imc_decode_close, 1110cabdff1aSopenharmony_ci FF_CODEC_DECODE_CB(imc_decode_frame), 1111cabdff1aSopenharmony_ci .flush = flush, 1112cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DR1, 1113cabdff1aSopenharmony_ci .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, 1114cabdff1aSopenharmony_ci AV_SAMPLE_FMT_NONE }, 1115cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_THREADSAFE, 1116cabdff1aSopenharmony_ci}; 1117cabdff1aSopenharmony_ci#endif 1118