FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
opus_celt.h
Go to the documentation of this file.
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 
31 #include "mdct15.h"
32 #include "libavutil/float_dsp.h"
33 #include "libavutil/libm.h"
34 
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)
45 
46 enum CeltSpread {
51 };
52 
58 
60 };
61 
62 typedef struct CeltBlock {
67 
69 
70  int band_bins[CELT_MAX_BANDS]; /* MDCT bins per band */
72 
73  /* buffer for mdct output + postfilter */
74  DECLARE_ALIGNED(32, float, buf)[2048];
76 
77  /* Used by the encoder */
78  DECLARE_ALIGNED(32, float, overlap)[120];
80 
81  /* postfilter parameters */
83  float pf_gains_new[3];
84  int pf_period;
85  float pf_gains[3];
87  float pf_gains_old[3];
88 
89  float emph_coeff;
90 } CeltBlock;
91 
92 struct CeltFrame {
93  // constant values that do not change during context lifetime
98  int channels;
100 
103  int end_band;
105  int transient;
106  int intra;
107  int pfilter;
112  int blocks; /* number of iMDCT blocks in the frame, depends on transient */
113  int blocksize; /* size of each block */
114  int silence; /* Frame is filled with silence */
115  int anticollapse_needed; /* Whether to expect an anticollapse bit */
116  int anticollapse; /* Encoded anticollapse bit */
119  int flushed;
120  uint32_t seed;
122 
123  /* Bit allocation */
132 
133  DECLARE_ALIGNED(32, float, scratch)[22 * 8]; // MAX(ff_celt_freq_range) * 1<<CELT_MAX_LOG_BLOCKS
134 };
135 
136 /* LCG for noise generation */
138 {
139  f->seed = 1664525 * f->seed + 1013904223;
140  return f->seed;
141 }
142 
143 static av_always_inline void celt_renormalize_vector(float *X, int N, float gain)
144 {
145  int i;
146  float g = 1e-15f;
147  for (i = 0; i < N; i++)
148  g += X[i] * X[i];
149  g = gain / sqrtf(g);
150 
151  for (i = 0; i < N; i++)
152  X[i] *= g;
153 }
154 
155 int ff_celt_init(AVCodecContext *avctx, CeltFrame **f, int output_channels);
156 
157 void ff_celt_free(CeltFrame **f);
158 
159 void ff_celt_flush(CeltFrame *f);
160 
161 int ff_celt_decode_frame(CeltFrame *f, OpusRangeCoder *rc, float **output,
162  int coded_channels, int frame_size, int startband, int endband);
163 
164 #endif /* AVCODEC_OPUS_CELT_H */
int channels
Definition: opus_celt.h:98
int intra
Definition: opus_celt.h:106
int anticollapse
Definition: opus_celt.h:116
int framebits
Definition: opus_celt.h:124
int remaining2
Definition: opus_celt.h:126
float coeffs[CELT_MAX_FRAME_SIZE]
Definition: opus_celt.h:75
const char * g
Definition: vf_curves.c:112
int output_channels
Definition: opus_celt.h:99
float pf_gains_new[3]
Definition: opus_celt.h:83
int ff_celt_decode_frame(CeltFrame *f, OpusRangeCoder *rc, float **output, int coded_channels, int frame_size, int startband, int endband)
Definition: opus_celt.c:783
int pf_period_new
Definition: opus_celt.h:82
int fine_priority[CELT_MAX_BANDS]
Definition: opus_celt.h:129
CeltBlock block[2]
Definition: opus_celt.h:97
int flushed
Definition: opus_celt.h:119
uint8_t
int silence
Definition: opus_celt.h:114
#define N
Definition: vf_pp7.c:73
#define DECLARE_ALIGNED(n, t, v)
Declare a variable that is aligned in memory.
Definition: mem.h:104
int dual_stereo
Definition: opus_celt.h:118
int coded_bands
Definition: opus_celt.h:104
float lin_energy[CELT_MAX_BANDS]
Definition: opus_celt.h:64
int skip_band_floor
Definition: opus_celt.h:108
int end_band
Definition: opus_celt.h:103
float pf_gains[3]
Definition: opus_celt.h:85
int alloc_boost[CELT_MAX_BANDS]
Definition: opus_celt.h:111
int start_band
Definition: opus_celt.h:102
int tf_change[CELT_MAX_BANDS]
Definition: opus_celt.h:131
float emph_coeff
Definition: opus_celt.h:89
int pulses[CELT_MAX_BANDS]
Definition: opus_celt.h:130
int pfilter
Definition: opus_celt.h:107
float samples[CELT_MAX_FRAME_SIZE]
Definition: opus_celt.h:79
int anticollapse_needed
Definition: opus_celt.h:115
int fine_bits[CELT_MAX_BANDS]
Definition: opus_celt.h:128
float * band_coeffs[CELT_MAX_BANDS]
Definition: opus_celt.h:71
AVCodecContext * avctx
Definition: opus_celt.h:94
uint32_t seed
Definition: opus_celt.h:120
int caps[CELT_MAX_BANDS]
Definition: opus_celt.h:127
int ff_celt_init(AVCodecContext *avctx, CeltFrame **f, int output_channels)
Definition: opus_celt.c:995
void ff_celt_flush(CeltFrame *f)
Definition: opus_celt.c:953
int blocks
Definition: opus_celt.h:112
CeltBlockSize
Definition: opus_celt.h:53
float error_energy[CELT_MAX_BANDS]
Definition: opus_celt.h:65
int frame_size
Definition: mxfenc.c:1820
#define CELT_MAX_BANDS
Definition: opus.h:45
main external API structure.
Definition: avcodec.h:1732
int pf_period_old
Definition: opus_celt.h:86
AVFloatDSPContext * dsp
Definition: opus_celt.h:96
Replacements for frequently missing libm functions.
int band_bins[CELT_MAX_BANDS]
Definition: opus_celt.h:70
CeltSpread
Definition: opus_celt.h:46
static av_always_inline void celt_renormalize_vector(float *X, int N, float gain)
Definition: opus_celt.h:143
float pf_gains_old[3]
Definition: opus_celt.h:87
int remaining
Definition: opus_celt.h:125
float energy[CELT_MAX_BANDS]
Definition: opus_celt.h:63
float scratch[22 *8]
Definition: opus_celt.h:133
float overlap[120]
Definition: opus_celt.h:78
static av_always_inline uint32_t celt_rng(CeltFrame *f)
Definition: opus_celt.h:137
void ff_celt_free(CeltFrame **f)
Definition: opus_celt.c:980
enum CeltSpread spread
Definition: opus_celt.h:121
int tf_select
Definition: opus_celt.h:109
int blocksize
Definition: opus_celt.h:113
#define CELT_MAX_FRAME_SIZE
Definition: opus.h:44
#define av_always_inline
Definition: attributes.h:39
enum CeltBlockSize size
Definition: opus_celt.h:101
int alloc_trim
Definition: opus_celt.h:110
MDCT15Context * imdct[4]
Definition: opus_celt.h:95
int pf_period
Definition: opus_celt.h:84
float prev_energy[2][CELT_MAX_BANDS]
Definition: opus_celt.h:66
uint8_t collapse_masks[CELT_MAX_BANDS]
Definition: opus_celt.h:68
int intensity_stereo
Definition: opus_celt.h:117
float buf[2048]
Definition: opus_celt.h:74