]> git.sesse.net Git - ffmpeg/blob - libavcodec/opus_celt.h
Merge commit '03adfe913062c6995136eb1ca51152b6d596c0f4'
[ffmpeg] / libavcodec / 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
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 {
47     CELT_SPREAD_NONE,
48     CELT_SPREAD_LIGHT,
49     CELT_SPREAD_NORMAL,
50     CELT_SPREAD_AGGRESSIVE
51 };
52
53 enum CeltBlockSize {
54     CELT_BLOCK_120,
55     CELT_BLOCK_240,
56     CELT_BLOCK_480,
57     CELT_BLOCK_960,
58
59     CELT_BLOCK_NB
60 };
61
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];
67
68     uint8_t collapse_masks[CELT_MAX_BANDS];
69
70     int band_bins[CELT_MAX_BANDS]; /* MDCT bins per band */
71     float *band_coeffs[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)[120];
79     DECLARE_ALIGNED(32, float, samples)[CELT_MAX_FRAME_SIZE];
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     int channels;
99     int output_channels;
100
101     enum CeltBlockSize size;
102     int start_band;
103     int end_band;
104     int coded_bands;
105     int transient;
106     int intra;
107     int pfilter;
108     int skip_band_floor;
109     int tf_select;
110     int alloc_trim;
111     int alloc_boost[CELT_MAX_BANDS];
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 */
117     int intensity_stereo;
118     int dual_stereo;
119     int flushed;
120     uint32_t seed;
121     enum CeltSpread spread;
122
123     /* Bit allocation */
124     int framebits;
125     int remaining;
126     int remaining2;
127     int caps         [CELT_MAX_BANDS];
128     int fine_bits    [CELT_MAX_BANDS];
129     int fine_priority[CELT_MAX_BANDS];
130     int pulses       [CELT_MAX_BANDS];
131     int tf_change    [CELT_MAX_BANDS];
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 */
137 static av_always_inline uint32_t celt_rng(CeltFrame *f)
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 */