summaryrefslogtreecommitdiff
path: root/libavcodec/opus_celt.h (plain)
blob: 23c20891cdf27c7052b310c95c8b8dd6f85bc3eb
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
46enum CeltSpread {
47 CELT_SPREAD_NONE,
48 CELT_SPREAD_LIGHT,
49 CELT_SPREAD_NORMAL,
50 CELT_SPREAD_AGGRESSIVE
51};
52
53enum CeltBlockSize {
54 CELT_BLOCK_120,
55 CELT_BLOCK_240,
56 CELT_BLOCK_480,
57 CELT_BLOCK_960,
58
59 CELT_BLOCK_NB
60};
61
62typedef 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
92struct 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 */
137static av_always_inline uint32_t celt_rng(CeltFrame *f)
138{
139 f->seed = 1664525 * f->seed + 1013904223;
140 return f->seed;
141}
142
143static 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
155int ff_celt_init(AVCodecContext *avctx, CeltFrame **f, int output_channels);
156
157void ff_celt_free(CeltFrame **f);
158
159void ff_celt_flush(CeltFrame *f);
160
161int 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 */
165