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