1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Opus decoder/demuxer common functions 3cabdff1aSopenharmony_ci * Copyright (c) 2012 Andrew D'Addesio 4cabdff1aSopenharmony_ci * Copyright (c) 2013-2014 Mozilla Corporation 5cabdff1aSopenharmony_ci * Copyright (c) 2016 Rostislav Pehlivanov <atomnuker@gmail.com> 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#ifndef AVCODEC_OPUS_CELT_H 25cabdff1aSopenharmony_ci#define AVCODEC_OPUS_CELT_H 26cabdff1aSopenharmony_ci 27cabdff1aSopenharmony_ci#include <float.h> 28cabdff1aSopenharmony_ci 29cabdff1aSopenharmony_ci#include "opus.h" 30cabdff1aSopenharmony_ci#include "opus_pvq.h" 31cabdff1aSopenharmony_ci#include "opusdsp.h" 32cabdff1aSopenharmony_ci 33cabdff1aSopenharmony_ci#include "mdct15.h" 34cabdff1aSopenharmony_ci#include "libavutil/float_dsp.h" 35cabdff1aSopenharmony_ci#include "libavutil/libm.h" 36cabdff1aSopenharmony_ci#include "libavutil/mem_internal.h" 37cabdff1aSopenharmony_ci 38cabdff1aSopenharmony_ci#define CELT_VECTORS 11 39cabdff1aSopenharmony_ci#define CELT_ALLOC_STEPS 6 40cabdff1aSopenharmony_ci#define CELT_FINE_OFFSET 21 41cabdff1aSopenharmony_ci#define CELT_MAX_FINE_BITS 8 42cabdff1aSopenharmony_ci#define CELT_NORM_SCALE 16384 43cabdff1aSopenharmony_ci#define CELT_QTHETA_OFFSET 4 44cabdff1aSopenharmony_ci#define CELT_QTHETA_OFFSET_TWOPHASE 16 45cabdff1aSopenharmony_ci#define CELT_POSTFILTER_MINPERIOD 15 46cabdff1aSopenharmony_ci#define CELT_ENERGY_SILENCE (-28.0f) 47cabdff1aSopenharmony_ci 48cabdff1aSopenharmony_citypedef struct CeltPVQ CeltPVQ; 49cabdff1aSopenharmony_ci 50cabdff1aSopenharmony_cienum CeltSpread { 51cabdff1aSopenharmony_ci CELT_SPREAD_NONE, 52cabdff1aSopenharmony_ci CELT_SPREAD_LIGHT, 53cabdff1aSopenharmony_ci CELT_SPREAD_NORMAL, 54cabdff1aSopenharmony_ci CELT_SPREAD_AGGRESSIVE 55cabdff1aSopenharmony_ci}; 56cabdff1aSopenharmony_ci 57cabdff1aSopenharmony_cienum CeltBlockSize { 58cabdff1aSopenharmony_ci CELT_BLOCK_120, 59cabdff1aSopenharmony_ci CELT_BLOCK_240, 60cabdff1aSopenharmony_ci CELT_BLOCK_480, 61cabdff1aSopenharmony_ci CELT_BLOCK_960, 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_ci CELT_BLOCK_NB 64cabdff1aSopenharmony_ci}; 65cabdff1aSopenharmony_ci 66cabdff1aSopenharmony_citypedef struct CeltBlock { 67cabdff1aSopenharmony_ci float energy[CELT_MAX_BANDS]; 68cabdff1aSopenharmony_ci float lin_energy[CELT_MAX_BANDS]; 69cabdff1aSopenharmony_ci float error_energy[CELT_MAX_BANDS]; 70cabdff1aSopenharmony_ci float prev_energy[2][CELT_MAX_BANDS]; 71cabdff1aSopenharmony_ci 72cabdff1aSopenharmony_ci uint8_t collapse_masks[CELT_MAX_BANDS]; 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci /* buffer for mdct output + postfilter */ 75cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, float, buf)[2048]; 76cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, float, coeffs)[CELT_MAX_FRAME_SIZE]; 77cabdff1aSopenharmony_ci 78cabdff1aSopenharmony_ci /* Used by the encoder */ 79cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, float, overlap)[FFALIGN(CELT_OVERLAP, 16)]; 80cabdff1aSopenharmony_ci DECLARE_ALIGNED(32, float, samples)[FFALIGN(CELT_MAX_FRAME_SIZE, 16)]; 81cabdff1aSopenharmony_ci 82cabdff1aSopenharmony_ci /* postfilter parameters */ 83cabdff1aSopenharmony_ci int pf_period_new; 84cabdff1aSopenharmony_ci float pf_gains_new[3]; 85cabdff1aSopenharmony_ci int pf_period; 86cabdff1aSopenharmony_ci float pf_gains[3]; 87cabdff1aSopenharmony_ci int pf_period_old; 88cabdff1aSopenharmony_ci float pf_gains_old[3]; 89cabdff1aSopenharmony_ci 90cabdff1aSopenharmony_ci float emph_coeff; 91cabdff1aSopenharmony_ci} CeltBlock; 92cabdff1aSopenharmony_ci 93cabdff1aSopenharmony_cistruct CeltFrame { 94cabdff1aSopenharmony_ci // constant values that do not change during context lifetime 95cabdff1aSopenharmony_ci AVCodecContext *avctx; 96cabdff1aSopenharmony_ci MDCT15Context *imdct[4]; 97cabdff1aSopenharmony_ci AVFloatDSPContext *dsp; 98cabdff1aSopenharmony_ci CeltBlock block[2]; 99cabdff1aSopenharmony_ci CeltPVQ *pvq; 100cabdff1aSopenharmony_ci OpusDSP opusdsp; 101cabdff1aSopenharmony_ci int channels; 102cabdff1aSopenharmony_ci int output_channels; 103cabdff1aSopenharmony_ci int apply_phase_inv; 104cabdff1aSopenharmony_ci 105cabdff1aSopenharmony_ci enum CeltBlockSize size; 106cabdff1aSopenharmony_ci int start_band; 107cabdff1aSopenharmony_ci int end_band; 108cabdff1aSopenharmony_ci int coded_bands; 109cabdff1aSopenharmony_ci int transient; 110cabdff1aSopenharmony_ci int pfilter; 111cabdff1aSopenharmony_ci int skip_band_floor; 112cabdff1aSopenharmony_ci int tf_select; 113cabdff1aSopenharmony_ci int alloc_trim; 114cabdff1aSopenharmony_ci int alloc_boost[CELT_MAX_BANDS]; 115cabdff1aSopenharmony_ci int blocks; /* number of iMDCT blocks in the frame, depends on transient */ 116cabdff1aSopenharmony_ci int blocksize; /* size of each block */ 117cabdff1aSopenharmony_ci int silence; /* Frame is filled with silence */ 118cabdff1aSopenharmony_ci int anticollapse_needed; /* Whether to expect an anticollapse bit */ 119cabdff1aSopenharmony_ci int anticollapse; /* Encoded anticollapse bit */ 120cabdff1aSopenharmony_ci int intensity_stereo; 121cabdff1aSopenharmony_ci int dual_stereo; 122cabdff1aSopenharmony_ci int flushed; 123cabdff1aSopenharmony_ci uint32_t seed; 124cabdff1aSopenharmony_ci enum CeltSpread spread; 125cabdff1aSopenharmony_ci 126cabdff1aSopenharmony_ci /* Encoder PF coeffs */ 127cabdff1aSopenharmony_ci int pf_octave; 128cabdff1aSopenharmony_ci int pf_period; 129cabdff1aSopenharmony_ci int pf_tapset; 130cabdff1aSopenharmony_ci float pf_gain; 131cabdff1aSopenharmony_ci 132cabdff1aSopenharmony_ci /* Bit allocation */ 133cabdff1aSopenharmony_ci int framebits; 134cabdff1aSopenharmony_ci int remaining; 135cabdff1aSopenharmony_ci int remaining2; 136cabdff1aSopenharmony_ci int caps [CELT_MAX_BANDS]; 137cabdff1aSopenharmony_ci int fine_bits [CELT_MAX_BANDS]; 138cabdff1aSopenharmony_ci int fine_priority[CELT_MAX_BANDS]; 139cabdff1aSopenharmony_ci int pulses [CELT_MAX_BANDS]; 140cabdff1aSopenharmony_ci int tf_change [CELT_MAX_BANDS]; 141cabdff1aSopenharmony_ci}; 142cabdff1aSopenharmony_ci 143cabdff1aSopenharmony_ci/* LCG for noise generation */ 144cabdff1aSopenharmony_cistatic av_always_inline uint32_t celt_rng(CeltFrame *f) 145cabdff1aSopenharmony_ci{ 146cabdff1aSopenharmony_ci f->seed = 1664525 * f->seed + 1013904223; 147cabdff1aSopenharmony_ci return f->seed; 148cabdff1aSopenharmony_ci} 149cabdff1aSopenharmony_ci 150cabdff1aSopenharmony_cistatic av_always_inline void celt_renormalize_vector(float *X, int N, float gain) 151cabdff1aSopenharmony_ci{ 152cabdff1aSopenharmony_ci int i; 153cabdff1aSopenharmony_ci float g = 1e-15f; 154cabdff1aSopenharmony_ci for (i = 0; i < N; i++) 155cabdff1aSopenharmony_ci g += X[i] * X[i]; 156cabdff1aSopenharmony_ci g = gain / sqrtf(g); 157cabdff1aSopenharmony_ci 158cabdff1aSopenharmony_ci for (i = 0; i < N; i++) 159cabdff1aSopenharmony_ci X[i] *= g; 160cabdff1aSopenharmony_ci} 161cabdff1aSopenharmony_ci 162cabdff1aSopenharmony_ciint ff_celt_init(AVCodecContext *avctx, CeltFrame **f, int output_channels, 163cabdff1aSopenharmony_ci int apply_phase_inv); 164cabdff1aSopenharmony_ci 165cabdff1aSopenharmony_civoid ff_celt_free(CeltFrame **f); 166cabdff1aSopenharmony_ci 167cabdff1aSopenharmony_civoid ff_celt_flush(CeltFrame *f); 168cabdff1aSopenharmony_ci 169cabdff1aSopenharmony_ciint ff_celt_decode_frame(CeltFrame *f, OpusRangeCoder *rc, float **output, 170cabdff1aSopenharmony_ci int coded_channels, int frame_size, int startband, int endband); 171cabdff1aSopenharmony_ci 172cabdff1aSopenharmony_ci#endif /* AVCODEC_OPUS_CELT_H */ 173