1/* 2 * Opus decoder/demuxer common functions 3 * Copyright (c) 2012 Andrew D'Addesio 4 * Copyright (c) 2013-2014 Mozilla Corporation 5 * Copyright (c) 2016 Rostislav Pehlivanov <atomnuker@gmail.com> 6 * 7 * This file is part of FFmpeg. 8 * 9 * FFmpeg is free software; you can redistribute it and/or 10 * modify it under the terms of the GNU Lesser General Public 11 * License as published by the Free Software Foundation; either 12 * version 2.1 of the License, or (at your option) any later version. 13 * 14 * FFmpeg is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 17 * Lesser General Public License for more details. 18 * 19 * You should have received a copy of the GNU Lesser General Public 20 * License along with FFmpeg; if not, write to the Free Software 21 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 22 */ 23 24#ifndef AVCODEC_OPUS_CELT_H 25#define AVCODEC_OPUS_CELT_H 26 27#include <float.h> 28 29#include "opus.h" 30#include "opus_pvq.h" 31#include "opusdsp.h" 32 33#include "mdct15.h" 34#include "libavutil/float_dsp.h" 35#include "libavutil/libm.h" 36#include "libavutil/mem_internal.h" 37 38#define CELT_VECTORS 11 39#define CELT_ALLOC_STEPS 6 40#define CELT_FINE_OFFSET 21 41#define CELT_MAX_FINE_BITS 8 42#define CELT_NORM_SCALE 16384 43#define CELT_QTHETA_OFFSET 4 44#define CELT_QTHETA_OFFSET_TWOPHASE 16 45#define CELT_POSTFILTER_MINPERIOD 15 46#define CELT_ENERGY_SILENCE (-28.0f) 47 48typedef struct CeltPVQ CeltPVQ; 49 50enum CeltSpread { 51 CELT_SPREAD_NONE, 52 CELT_SPREAD_LIGHT, 53 CELT_SPREAD_NORMAL, 54 CELT_SPREAD_AGGRESSIVE 55}; 56 57enum CeltBlockSize { 58 CELT_BLOCK_120, 59 CELT_BLOCK_240, 60 CELT_BLOCK_480, 61 CELT_BLOCK_960, 62 63 CELT_BLOCK_NB 64}; 65 66typedef struct CeltBlock { 67 float energy[CELT_MAX_BANDS]; 68 float lin_energy[CELT_MAX_BANDS]; 69 float error_energy[CELT_MAX_BANDS]; 70 float prev_energy[2][CELT_MAX_BANDS]; 71 72 uint8_t collapse_masks[CELT_MAX_BANDS]; 73 74 /* buffer for mdct output + postfilter */ 75 DECLARE_ALIGNED(32, float, buf)[2048]; 76 DECLARE_ALIGNED(32, float, coeffs)[CELT_MAX_FRAME_SIZE]; 77 78 /* Used by the encoder */ 79 DECLARE_ALIGNED(32, float, overlap)[FFALIGN(CELT_OVERLAP, 16)]; 80 DECLARE_ALIGNED(32, float, samples)[FFALIGN(CELT_MAX_FRAME_SIZE, 16)]; 81 82 /* postfilter parameters */ 83 int pf_period_new; 84 float pf_gains_new[3]; 85 int pf_period; 86 float pf_gains[3]; 87 int pf_period_old; 88 float pf_gains_old[3]; 89 90 float emph_coeff; 91} CeltBlock; 92 93struct CeltFrame { 94 // constant values that do not change during context lifetime 95 AVCodecContext *avctx; 96 MDCT15Context *imdct[4]; 97 AVFloatDSPContext *dsp; 98 CeltBlock block[2]; 99 CeltPVQ *pvq; 100 OpusDSP opusdsp; 101 int channels; 102 int output_channels; 103 int apply_phase_inv; 104 105 enum CeltBlockSize size; 106 int start_band; 107 int end_band; 108 int coded_bands; 109 int transient; 110 int pfilter; 111 int skip_band_floor; 112 int tf_select; 113 int alloc_trim; 114 int alloc_boost[CELT_MAX_BANDS]; 115 int blocks; /* number of iMDCT blocks in the frame, depends on transient */ 116 int blocksize; /* size of each block */ 117 int silence; /* Frame is filled with silence */ 118 int anticollapse_needed; /* Whether to expect an anticollapse bit */ 119 int anticollapse; /* Encoded anticollapse bit */ 120 int intensity_stereo; 121 int dual_stereo; 122 int flushed; 123 uint32_t seed; 124 enum CeltSpread spread; 125 126 /* Encoder PF coeffs */ 127 int pf_octave; 128 int pf_period; 129 int pf_tapset; 130 float pf_gain; 131 132 /* Bit allocation */ 133 int framebits; 134 int remaining; 135 int remaining2; 136 int caps [CELT_MAX_BANDS]; 137 int fine_bits [CELT_MAX_BANDS]; 138 int fine_priority[CELT_MAX_BANDS]; 139 int pulses [CELT_MAX_BANDS]; 140 int tf_change [CELT_MAX_BANDS]; 141}; 142 143/* LCG for noise generation */ 144static av_always_inline uint32_t celt_rng(CeltFrame *f) 145{ 146 f->seed = 1664525 * f->seed + 1013904223; 147 return f->seed; 148} 149 150static av_always_inline void celt_renormalize_vector(float *X, int N, float gain) 151{ 152 int i; 153 float g = 1e-15f; 154 for (i = 0; i < N; i++) 155 g += X[i] * X[i]; 156 g = gain / sqrtf(g); 157 158 for (i = 0; i < N; i++) 159 X[i] *= g; 160} 161 162int ff_celt_init(AVCodecContext *avctx, CeltFrame **f, int output_channels, 163 int apply_phase_inv); 164 165void ff_celt_free(CeltFrame **f); 166 167void ff_celt_flush(CeltFrame *f); 168 169int ff_celt_decode_frame(CeltFrame *f, OpusRangeCoder *rc, float **output, 170 int coded_channels, int frame_size, int startband, int endband); 171 172#endif /* AVCODEC_OPUS_CELT_H */ 173