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