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