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>
7 * This file is part of FFmpeg.
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.
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.
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
24 #ifndef AVCODEC_OPUS_CELT_H
25 #define AVCODEC_OPUS_CELT_H
32 #include "libavutil/float_dsp.h"
33 #include "libavutil/libm.h"
35 #define CELT_VECTORS 11
36 #define CELT_ALLOC_STEPS 6
37 #define CELT_FINE_OFFSET 21
38 #define CELT_MAX_FINE_BITS 8
39 #define CELT_NORM_SCALE 16384
40 #define CELT_QTHETA_OFFSET 4
41 #define CELT_QTHETA_OFFSET_TWOPHASE 16
42 #define CELT_EMPH_COEFF 0.85000610f
43 #define CELT_POSTFILTER_MINPERIOD 15
44 #define CELT_ENERGY_SILENCE (-28.0f)
50 CELT_SPREAD_AGGRESSIVE
62 typedef struct CeltBlock {
63 float energy[CELT_MAX_BANDS];
64 float lin_energy[CELT_MAX_BANDS];
65 float error_energy[CELT_MAX_BANDS];
66 float prev_energy[2][CELT_MAX_BANDS];
68 uint8_t collapse_masks[CELT_MAX_BANDS];
70 /* buffer for mdct output + postfilter */
71 DECLARE_ALIGNED(32, float, buf)[2048];
72 DECLARE_ALIGNED(32, float, coeffs)[CELT_MAX_FRAME_SIZE];
74 /* Used by the encoder */
75 DECLARE_ALIGNED(32, float, overlap)[120];
76 DECLARE_ALIGNED(32, float, samples)[CELT_MAX_FRAME_SIZE];
78 /* postfilter parameters */
80 float pf_gains_new[3];
84 float pf_gains_old[3];
90 // constant values that do not change during context lifetime
91 AVCodecContext *avctx;
92 MDCT15Context *imdct[4];
93 AVFloatDSPContext *dsp;
98 enum CeltBlockSize size;
107 int alloc_boost[CELT_MAX_BANDS];
108 int blocks; /* number of iMDCT blocks in the frame, depends on transient */
109 int blocksize; /* size of each block */
110 int silence; /* Frame is filled with silence */
111 int anticollapse_needed; /* Whether to expect an anticollapse bit */
112 int anticollapse; /* Encoded anticollapse bit */
113 int intensity_stereo;
117 enum CeltSpread spread;
123 int caps [CELT_MAX_BANDS];
124 int fine_bits [CELT_MAX_BANDS];
125 int fine_priority[CELT_MAX_BANDS];
126 int pulses [CELT_MAX_BANDS];
127 int tf_change [CELT_MAX_BANDS];
129 DECLARE_ALIGNED(32, float, scratch)[22 * 8]; // MAX(ff_celt_freq_range) * 1<<CELT_MAX_LOG_BLOCKS
132 /* LCG for noise generation */
133 static av_always_inline uint32_t celt_rng(CeltFrame *f)
135 f->seed = 1664525 * f->seed + 1013904223;
139 static av_always_inline void celt_renormalize_vector(float *X, int N, float gain)
143 for (i = 0; i < N; i++)
147 for (i = 0; i < N; i++)
151 int ff_celt_init(AVCodecContext *avctx, CeltFrame **f, int output_channels);
153 void ff_celt_free(CeltFrame **f);
155 void ff_celt_flush(CeltFrame *f);
157 int ff_celt_decode_frame(CeltFrame *f, OpusRangeCoder *rc, float **output,
158 int coded_channels, int frame_size, int startband, int endband);
160 #endif /* AVCODEC_OPUS_CELT_H */