FFmpeg
libavcodec
opus_celt.h
Go to the documentation of this file.
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 */
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
150
static
av_always_inline
void
celt_renormalize_vector
(
float
*
X
,
int
N
,
float
gain)
151
{
152
int
i
;
153
float
g
= 1e-15
f
;
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 */
CeltFrame::dsp
AVFloatDSPContext * dsp
Definition:
opus_celt.h:97
libm.h
CeltBlock::buf
float buf[2048]
Definition:
opus_celt.h:75
mem_internal.h
CeltFrame::size
enum CeltBlockSize size
Definition:
opus_celt.h:105
output
filter_frame For filters that do not use the this method is called when a frame is pushed to the filter s input It can be called at any time except in a reentrant way If the input frame is enough to produce output
Definition:
filter_design.txt:225
X
@ X
Definition:
vf_addroi.c:26
CeltFrame::spread
enum CeltSpread spread
Definition:
opus_celt.h:124
opusdsp.h
CeltFrame::start_band
int start_band
Definition:
opus_celt.h:106
CELT_SPREAD_NONE
@ CELT_SPREAD_NONE
Definition:
opus_celt.h:51
CeltFrame::avctx
AVCodecContext * avctx
Definition:
opus_celt.h:95
opus.h
mdct15.h
CeltBlock::overlap
float overlap[FFALIGN(CELT_OVERLAP, 16)]
Definition:
opus_celt.h:79
CeltBlock::lin_energy
float lin_energy[CELT_MAX_BANDS]
Definition:
opus_celt.h:68
CELT_SPREAD_LIGHT
@ CELT_SPREAD_LIGHT
Definition:
opus_celt.h:52
float.h
CeltFrame::framebits
int framebits
Definition:
opus_celt.h:133
CELT_BLOCK_960
@ CELT_BLOCK_960
Definition:
opus_celt.h:61
CELT_MAX_FRAME_SIZE
#define CELT_MAX_FRAME_SIZE
Definition:
opus.h:45
CeltFrame::coded_bands
int coded_bands
Definition:
opus_celt.h:108
CeltBlock::coeffs
float coeffs[CELT_MAX_FRAME_SIZE]
Definition:
opus_celt.h:76
CeltBlock
Definition:
opus_celt.h:66
CeltBlockSize
CeltBlockSize
Definition:
opus_celt.h:57
ff_celt_flush
void ff_celt_flush(CeltFrame *f)
Definition:
opus_celt.c:490
ff_celt_decode_frame
int ff_celt_decode_frame(CeltFrame *f, OpusRangeCoder *rc, float **output, int coded_channels, int frame_size, int startband, int endband)
Definition:
opus_celt.c:320
CeltFrame::blocksize
int blocksize
Definition:
opus_celt.h:116
CeltPVQ
Definition:
opus_pvq.h:37
CeltFrame::output_channels
int output_channels
Definition:
opus_celt.h:102
CELT_BLOCK_480
@ CELT_BLOCK_480
Definition:
opus_celt.h:60
CeltBlock::pf_gains_new
float pf_gains_new[3]
Definition:
opus_celt.h:84
CeltFrame::anticollapse
int anticollapse
Definition:
opus_celt.h:119
CELT_BLOCK_120
@ CELT_BLOCK_120
Definition:
opus_celt.h:58
celt_renormalize_vector
static av_always_inline void celt_renormalize_vector(float *X, int N, float gain)
Definition:
opus_celt.h:150
CeltFrame::apply_phase_inv
int apply_phase_inv
Definition:
opus_celt.h:103
CeltBlock::samples
float samples[FFALIGN(CELT_MAX_FRAME_SIZE, 16)]
Definition:
opus_celt.h:80
CELT_BLOCK_240
@ CELT_BLOCK_240
Definition:
opus_celt.h:59
CeltFrame::remaining2
int remaining2
Definition:
opus_celt.h:135
CeltFrame::pf_gain
float pf_gain
Definition:
opus_celt.h:130
CeltBlock::energy
float energy[CELT_MAX_BANDS]
Definition:
opus_celt.h:67
CeltFrame::skip_band_floor
int skip_band_floor
Definition:
opus_celt.h:111
g
const char * g
Definition:
vf_curves.c:117
frame_size
int frame_size
Definition:
mxfenc.c:2206
CELT_SPREAD_NORMAL
@ CELT_SPREAD_NORMAL
Definition:
opus_celt.h:53
CeltFrame::seed
uint32_t seed
Definition:
opus_celt.h:123
CeltFrame::silence
int silence
Definition:
opus_celt.h:117
CeltFrame::alloc_boost
int alloc_boost[CELT_MAX_BANDS]
Definition:
opus_celt.h:114
CeltBlock::error_energy
float error_energy[CELT_MAX_BANDS]
Definition:
opus_celt.h:69
MDCT15Context
Definition:
mdct15.h:30
f
#define f(width, name)
Definition:
cbs_vp9.c:255
CeltFrame::dual_stereo
int dual_stereo
Definition:
opus_celt.h:121
CeltFrame::blocks
int blocks
Definition:
opus_celt.h:115
CeltFrame::tf_change
int tf_change[CELT_MAX_BANDS]
Definition:
opus_celt.h:140
CeltFrame::caps
int caps[CELT_MAX_BANDS]
Definition:
opus_celt.h:136
CeltFrame::fine_bits
int fine_bits[CELT_MAX_BANDS]
Definition:
opus_celt.h:137
CELT_MAX_BANDS
#define CELT_MAX_BANDS
Definition:
opus.h:46
CeltBlock::prev_energy
float prev_energy[2][CELT_MAX_BANDS]
Definition:
opus_celt.h:70
float_dsp.h
CeltBlock::pf_gains
float pf_gains[3]
Definition:
opus_celt.h:86
CeltFrame::fine_priority
int fine_priority[CELT_MAX_BANDS]
Definition:
opus_celt.h:138
opus_pvq.h
OpusRangeCoder
Definition:
opus_rc.h:40
CeltBlock::pf_period
int pf_period
Definition:
opus_celt.h:85
AVFloatDSPContext
Definition:
float_dsp.h:24
celt_rng
static av_always_inline uint32_t celt_rng(CeltFrame *f)
Definition:
opus_celt.h:144
N
#define N
Definition:
af_mcompand.c:54
CeltFrame::channels
int channels
Definition:
opus_celt.h:101
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition:
mem.h:117
i
int i
Definition:
input.c:407
CeltFrame::imdct
MDCT15Context * imdct[4]
Definition:
opus_celt.h:96
CeltFrame::pulses
int pulses[CELT_MAX_BANDS]
Definition:
opus_celt.h:139
CeltFrame::end_band
int end_band
Definition:
opus_celt.h:107
CeltFrame::intensity_stereo
int intensity_stereo
Definition:
opus_celt.h:120
av_always_inline
#define av_always_inline
Definition:
attributes.h:49
uint8_t
uint8_t
Definition:
audio_convert.c:194
CeltFrame::remaining
int remaining
Definition:
opus_celt.h:134
CELT_SPREAD_AGGRESSIVE
@ CELT_SPREAD_AGGRESSIVE
Definition:
opus_celt.h:54
CeltFrame::anticollapse_needed
int anticollapse_needed
Definition:
opus_celt.h:118
AVCodecContext
main external API structure.
Definition:
avcodec.h:536
CeltBlock::collapse_masks
uint8_t collapse_masks[CELT_MAX_BANDS]
Definition:
opus_celt.h:72
CeltFrame::opusdsp
OpusDSP opusdsp
Definition:
opus_celt.h:100
CeltFrame::pfilter
int pfilter
Definition:
opus_celt.h:110
CeltSpread
CeltSpread
Definition:
opus_celt.h:50
CeltFrame::pf_period
int pf_period
Definition:
opus_celt.h:128
CeltBlock::pf_period_old
int pf_period_old
Definition:
opus_celt.h:87
CeltBlock::emph_coeff
float emph_coeff
Definition:
opus_celt.h:90
CeltFrame::flushed
int flushed
Definition:
opus_celt.h:122
FFALIGN
#define FFALIGN(x, a)
Definition:
macros.h:48
CELT_BLOCK_NB
@ CELT_BLOCK_NB
Definition:
opus_celt.h:63
ff_celt_free
void ff_celt_free(CeltFrame **f)
Definition:
opus_celt.c:521
CELT_OVERLAP
#define CELT_OVERLAP
Definition:
opus.h:43
CeltBlock::pf_gains_old
float pf_gains_old[3]
Definition:
opus_celt.h:88
CeltFrame::pf_octave
int pf_octave
Definition:
opus_celt.h:127
CeltFrame::alloc_trim
int alloc_trim
Definition:
opus_celt.h:113
CeltFrame::block
CeltBlock block[2]
Definition:
opus_celt.h:98
CeltBlock::pf_period_new
int pf_period_new
Definition:
opus_celt.h:83
ff_celt_init
int ff_celt_init(AVCodecContext *avctx, CeltFrame **f, int output_channels, int apply_phase_inv)
Definition:
opus_celt.c:538
CeltFrame::tf_select
int tf_select
Definition:
opus_celt.h:112
CeltFrame
Definition:
opus_celt.h:93
CeltFrame::pvq
CeltPVQ * pvq
Definition:
opus_celt.h:99
CeltFrame::pf_tapset
int pf_tapset
Definition:
opus_celt.h:129
OpusDSP
Definition:
opusdsp.h:26
Generated on Wed Aug 24 2022 21:34:10 for FFmpeg by
1.8.17