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
48 typedef struct CeltPVQ CeltPVQ;
49
50 enum CeltSpread {
51 CELT_SPREAD_NONE,
52 CELT_SPREAD_LIGHT,
53 CELT_SPREAD_NORMAL,
54 CELT_SPREAD_AGGRESSIVE
55 };
56
57 enum CeltBlockSize {
58 CELT_BLOCK_120,
59 CELT_BLOCK_240,
60 CELT_BLOCK_480,
61 CELT_BLOCK_960,
62
63 CELT_BLOCK_NB
64 };
65
66 typedef 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
93 struct 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 */
celt_rng(CeltFrame * f)144 static av_always_inline uint32_t celt_rng(CeltFrame *f)
145 {
146 f->seed = 1664525 * f->seed + 1013904223;
147 return f->seed;
148 }
149
celt_renormalize_vector(float * X,int N,float gain)150 static 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
162 int ff_celt_init(AVCodecContext *avctx, CeltFrame **f, int output_channels,
163 int apply_phase_inv);
164
165 void ff_celt_free(CeltFrame **f);
166
167 void ff_celt_flush(CeltFrame *f);
168
169 int 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