FFmpeg
Main Page
Related Pages
Modules
Namespaces
Namespace List
Namespace Members
All
Functions
Variables
Data Structures
Data Structures
Data Structure Index
Class Hierarchy
Data Fields
All
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
~
Functions
_
a
c
d
g
h
i
o
q
r
s
v
~
Variables
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Enumerations
Enumerator
a
d
e
f
h
i
j
l
m
n
p
r
s
v
Files
File List
Globals
All
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Functions
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Variables
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Typedefs
a
b
c
d
e
f
g
h
i
l
m
o
p
q
r
s
t
u
v
w
x
y
Enumerations
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Enumerator
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Macros
_
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
p
q
r
s
t
u
v
w
x
y
z
Examples
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Modules
Pages
libavcodec
ac3dec.h
Go to the documentation of this file.
1
/*
2
* Common code between the AC-3 and E-AC-3 decoders
3
* Copyright (c) 2007 Bartlomiej Wolowiec <bartek.wolowiec@gmail.com>
4
*
5
* This file is part of FFmpeg.
6
*
7
* FFmpeg is free software; you can redistribute it and/or
8
* modify it under the terms of the GNU Lesser General Public
9
* License as published by the Free Software Foundation; either
10
* version 2.1 of the License, or (at your option) any later version.
11
*
12
* FFmpeg is distributed in the hope that it will be useful,
13
* but WITHOUT ANY WARRANTY; without even the implied warranty of
14
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15
* Lesser General Public License for more details.
16
*
17
* You should have received a copy of the GNU Lesser General Public
18
* License along with FFmpeg; if not, write to the Free Software
19
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20
*/
21
22
/**
23
* @file
24
* Common code between the AC-3 and E-AC-3 decoders.
25
*
26
* Summary of MDCT Coefficient Grouping:
27
* The individual MDCT coefficient indices are often referred to in the
28
* (E-)AC-3 specification as frequency bins. These bins are grouped together
29
* into subbands of 12 coefficients each. The subbands are grouped together
30
* into bands as defined in the bitstream by the band structures, which
31
* determine the number of bands and the size of each band. The full spectrum
32
* of 256 frequency bins is divided into 1 DC bin + 21 subbands = 253 bins.
33
* This system of grouping coefficients is used for channel bandwidth, stereo
34
* rematrixing, channel coupling, enhanced coupling, and spectral extension.
35
*
36
* +-+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-+
37
* |1| |12| | [12|12|12|12] | | | | | | | | | | | | |3|
38
* +-+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+-+
39
* ~~~ ~~~~ ~~~~~~~~~~~~~ ~~~
40
* | | | |
41
* | | | 3 unused frequency bins--+
42
* | | |
43
* | | +--1 band containing 4 subbands
44
* | |
45
* | +--1 subband of 12 frequency bins
46
* |
47
* +--DC frequency bin
48
*/
49
50
#ifndef AVCODEC_AC3DEC_H
51
#define AVCODEC_AC3DEC_H
52
53
#include "
libavutil/tx.h
"
54
#include "
libavutil/float_dsp.h
"
55
#include "
libavutil/fixed_dsp.h
"
56
#include "
libavutil/lfg.h
"
57
#include "
libavutil/mem_internal.h
"
58
59
#include "
ac3.h
"
60
#include "
ac3dsp.h
"
61
#include "
avcodec.h
"
62
#include "
bswapdsp.h
"
63
#include "
get_bits.h
"
64
#include "
fmtconvert.h
"
65
66
#define AC3_OUTPUT_LFEON 8
67
68
#define SPX_MAX_BANDS 17
69
70
/** Large enough for maximum possible frame size when the specification limit is ignored */
71
#define AC3_FRAME_BUFFER_SIZE 32768
72
73
typedef
struct
AC3DecodeContext {
74
AVClass
*
class
;
///< class for AVOptions
75
AVCodecContext
*avctx;
///< parent context
76
GetBitContext
gbc;
///< bitstream reader
77
78
///@name Optimization
79
BswapDSPContext
bdsp;
80
#if USE_FIXED
81
AVFixedDSPContext
*fdsp;
82
#else
83
AVFloatDSPContext
*fdsp;
84
#endif
85
AC3DSPContext
ac3dsp;
86
FmtConvertContext
fmt_conv;
///< optimized conversion functions
87
///@}
88
89
AVTXContext
*tx_128, *tx_256;
90
av_tx_fn
tx_fn_128, tx_fn_256;
91
92
INTFLOAT
*xcfptr[
AC3_MAX_CHANNELS
];
93
INTFLOAT
*dlyptr[
AC3_MAX_CHANNELS
];
94
95
AVChannelLayout
downmix_layout;
96
SHORTFLOAT
*downmix_coeffs[2];
///< stereo downmix coefficients
97
98
// Start of flushable fields.
99
// frame_type must be the flushable field, or the offset changed in ac3_decode_flush().
100
101
///@name Bit stream information
102
///@{
103
int
frame_type
;
///< frame type (strmtyp)
104
int
substreamid;
///< substream identification
105
int
superframe_size;
///< current superframe size, in bytes
106
int
frame_size
;
///< current frame size, in bytes
107
int
bit_rate;
///< stream bit rate, in bits-per-second
108
int
sample_rate;
///< sample frequency, in Hz
109
int
num_blocks;
///< number of audio blocks
110
int
bitstream_id;
///< bitstream id (bsid)
111
int
bitstream_mode;
///< bitstream mode (bsmod)
112
int
channel_mode;
///< channel mode (acmod)
113
int
lfe_on;
///< lfe channel in use
114
int
dialog_normalization[2];
///< dialog level in dBFS (dialnorm)
115
int
compression_exists[2];
///< compression field is valid for frame (compre)
116
int
channel_map
;
///< custom channel map (chanmap)
117
int
preferred_downmix;
///< Preferred 2-channel downmix mode (dmixmod)
118
int
center_mix_level;
///< Center mix level index
119
int
center_mix_level_ltrt;
///< Center mix level index for Lt/Rt (ltrtcmixlev)
120
int
surround_mix_level;
///< Surround mix level index
121
int
surround_mix_level_ltrt;
///< Surround mix level index for Lt/Rt (ltrtsurmixlev)
122
int
lfe_mix_level_exists;
///< indicates if lfemixlevcod is specified (lfemixlevcode)
123
int
lfe_mix_level;
///< LFE mix level index (lfemixlevcod)
124
int
eac3;
///< indicates if current frame is E-AC-3
125
int
eac3_subsbtreamid_found;
///< bitstream has E-AC-3 additional substream(s)
126
int
eac3_extension_type_a;
///< bitstream has E-AC-3 extension type A enabled frame(s)
127
int
dolby_surround_mode;
///< dolby surround mode (dsurmod)
128
int
dolby_surround_ex_mode;
///< dolby surround ex mode (dsurexmod)
129
int
dolby_headphone_mode;
///< dolby headphone mode (dheadphonmod)
130
///@}
131
132
int
preferred_stereo_downmix;
133
float
ltrt_center_mix_level;
134
float
ltrt_surround_mix_level;
135
float
loro_center_mix_level;
136
float
loro_surround_mix_level;
137
int
target_level;
///< target level in dBFS
138
float
level_gain[2];
139
140
///@name Frame syntax parameters
141
int
snr_offset_strategy;
///< SNR offset strategy (snroffststr)
142
int
block_switch_syntax;
///< block switch syntax enabled (blkswe)
143
int
dither_flag_syntax;
///< dither flag syntax enabled (dithflage)
144
int
bit_allocation_syntax;
///< bit allocation model syntax enabled (bamode)
145
int
fast_gain_syntax;
///< fast gain codes enabled (frmfgaincode)
146
int
dba_syntax;
///< delta bit allocation syntax enabled (dbaflde)
147
int
skip_syntax;
///< skip field syntax enabled (skipflde)
148
///@}
149
150
///@name Standard coupling
151
int
cpl_in_use[
AC3_MAX_BLOCKS
];
///< coupling in use (cplinu)
152
int
cpl_strategy_exists[
AC3_MAX_BLOCKS
];
///< coupling strategy exists (cplstre)
153
int
channel_in_cpl[
AC3_MAX_CHANNELS
];
///< channel in coupling (chincpl)
154
int
phase_flags_in_use;
///< phase flags in use (phsflginu)
155
int
phase_flags[
AC3_MAX_CPL_BANDS
];
///< phase flags (phsflg)
156
int
num_cpl_bands;
///< number of coupling bands (ncplbnd)
157
uint8_t cpl_band_struct[
AC3_MAX_CPL_BANDS
];
158
uint8_t cpl_band_sizes[
AC3_MAX_CPL_BANDS
];
///< number of coeffs in each coupling band
159
int
firstchincpl;
///< first channel in coupling
160
int
first_cpl_coords[
AC3_MAX_CHANNELS
];
///< first coupling coordinates states (firstcplcos)
161
int
cpl_coords[
AC3_MAX_CHANNELS
][
AC3_MAX_CPL_BANDS
];
///< coupling coordinates (cplco)
162
///@}
163
164
///@name Spectral extension
165
///@{
166
int
spx_in_use;
///< spectral extension in use (spxinu)
167
uint8_t channel_uses_spx[
AC3_MAX_CHANNELS
];
///< channel uses spectral extension (chinspx)
168
int8_t spx_atten_code[
AC3_MAX_CHANNELS
];
///< spx attenuation code (spxattencod)
169
int
spx_src_start_freq;
///< spx start frequency bin
170
int
spx_dst_end_freq;
///< spx end frequency bin
171
int
spx_dst_start_freq;
///< spx starting frequency bin for copying (copystartmant)
172
///< the copy region ends at the start of the spx region.
173
int
num_spx_bands;
///< number of spx bands (nspxbnds)
174
uint8_t spx_band_struct[SPX_MAX_BANDS];
175
uint8_t spx_band_sizes[SPX_MAX_BANDS];
///< number of bins in each spx band
176
uint8_t first_spx_coords[
AC3_MAX_CHANNELS
];
///< first spx coordinates states (firstspxcos)
177
INTFLOAT
spx_noise_blend[
AC3_MAX_CHANNELS
][SPX_MAX_BANDS];
///< spx noise blending factor (nblendfact)
178
INTFLOAT
spx_signal_blend[
AC3_MAX_CHANNELS
][SPX_MAX_BANDS];
///< spx signal blending factor (sblendfact)
179
///@}
180
181
///@name Adaptive hybrid transform
182
int
channel_uses_aht[
AC3_MAX_CHANNELS
];
///< channel AHT in use (chahtinu)
183
int
pre_mantissa[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
][
AC3_MAX_BLOCKS
];
///< pre-IDCT mantissas
184
///@}
185
186
///@name Channel
187
int
fbw_channels;
///< number of full-bandwidth channels
188
int
channels
;
///< number of total channels
189
int
lfe_ch;
///< index of LFE channel
190
int
downmixed;
///< indicates if coeffs are currently downmixed
191
int
output_mode;
///< output channel configuration
192
int
prev_output_mode;
///< output channel configuration for previous frame
193
int
out_channels;
///< number of output channels
194
int
prev_bit_rate;
///< stream bit rate, in bits-per-second for previous frame
195
///@}
196
197
///@name Dynamic range
198
INTFLOAT
dynamic_range[2];
///< dynamic range
199
INTFLOAT
drc_scale;
///< percentage of dynamic range compression to be applied
200
int
heavy_compression;
///< apply heavy compression
201
INTFLOAT
heavy_dynamic_range[2];
///< heavy dynamic range compression
202
///@}
203
204
///@name Bandwidth
205
int
start_freq[
AC3_MAX_CHANNELS
];
///< start frequency bin (strtmant)
206
int
end_freq[
AC3_MAX_CHANNELS
];
///< end frequency bin (endmant)
207
///@}
208
209
///@name Consistent noise generation
210
int
consistent_noise_generation;
///< seed noise generation with AC-3 frame on decode
211
///@}
212
213
///@name Rematrixing
214
int
num_rematrixing_bands;
///< number of rematrixing bands (nrematbnd)
215
int
rematrixing_flags[4];
///< rematrixing flags (rematflg)
216
///@}
217
218
///@name Exponents
219
int
num_exp_groups[
AC3_MAX_CHANNELS
];
///< Number of exponent groups (nexpgrp)
220
int8_t dexps[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
];
///< decoded exponents
221
int
exp_strategy[
AC3_MAX_BLOCKS
][
AC3_MAX_CHANNELS
];
///< exponent strategies (expstr)
222
///@}
223
224
///@name Bit allocation
225
AC3BitAllocParameters
bit_alloc_params;
///< bit allocation parameters
226
int
first_cpl_leak;
///< first coupling leak state (firstcplleak)
227
int
snr_offset[
AC3_MAX_CHANNELS
];
///< signal-to-noise ratio offsets (snroffst)
228
int
fast_gain[
AC3_MAX_CHANNELS
];
///< fast gain values/SMR's (fgain)
229
uint8_t bap[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
];
///< bit allocation pointers
230
int16_t psd[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
];
///< scaled exponents
231
int16_t band_psd[
AC3_MAX_CHANNELS
][
AC3_CRITICAL_BANDS
];
///< interpolated exponents
232
int16_t
mask
[
AC3_MAX_CHANNELS
][
AC3_CRITICAL_BANDS
];
///< masking curve values
233
int
dba_mode[
AC3_MAX_CHANNELS
];
///< delta bit allocation mode
234
int
dba_nsegs[
AC3_MAX_CHANNELS
];
///< number of delta segments
235
uint8_t dba_offsets[
AC3_MAX_CHANNELS
][8];
///< delta segment offsets
236
uint8_t dba_lengths[
AC3_MAX_CHANNELS
][8];
///< delta segment lengths
237
uint8_t dba_values[
AC3_MAX_CHANNELS
][8];
///< delta values for each segment
238
///@}
239
240
///@name Zero-mantissa dithering
241
int
dither_flag[
AC3_MAX_CHANNELS
];
///< dither flags (dithflg)
242
AVLFG
dith_state;
///< for dither generation
243
///@}
244
245
///@name IMDCT
246
int
block_switch[
AC3_MAX_CHANNELS
];
///< block switch flags (blksw)
247
///@}
248
249
SHORTFLOAT
*outptr[
AC3_MAX_CHANNELS
];
250
251
///@name Aligned arrays
252
DECLARE_ALIGNED
(16,
int
,
fixed_coeffs
)[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
];
///< fixed-point transform coefficients
253
DECLARE_ALIGNED
(32,
INTFLOAT
, transform_coeffs)[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
];
///< transform coefficients
254
DECLARE_ALIGNED
(32,
INTFLOAT
, delay)[
EAC3_MAX_CHANNELS
][
AC3_BLOCK_SIZE
];
///< delay - added to the next block
255
DECLARE_ALIGNED
(32,
INTFLOAT
,
window
)[
AC3_BLOCK_SIZE
];
///< window coefficients
256
DECLARE_ALIGNED
(32,
INTFLOAT
, tmp_output)[
AC3_BLOCK_SIZE
];
///< temporary storage for output before windowing
257
DECLARE_ALIGNED
(32,
SHORTFLOAT
,
output
)[
EAC3_MAX_CHANNELS
][
AC3_BLOCK_SIZE
];
///< output after imdct transform and windowing
258
DECLARE_ALIGNED
(32, uint8_t, input_buffer)[AC3_FRAME_BUFFER_SIZE +
AV_INPUT_BUFFER_PADDING_SIZE
];
///< temp buffer to prevent overread
259
DECLARE_ALIGNED
(32,
SHORTFLOAT
, output_buffer)[
EAC3_MAX_CHANNELS
][
AC3_BLOCK_SIZE
* 6];
///< final output buffer
260
///@}
261
} AC3DecodeContext;
262
263
/**
264
* Parse the E-AC-3 frame header.
265
* This parses both the bit stream info and audio frame header.
266
*/
267
static
int
ff_eac3_parse_header
(AC3DecodeContext *
s
);
268
269
/**
270
* Decode mantissas in a single channel for the entire frame.
271
* This is used when AHT mode is enabled.
272
*/
273
static
void
ff_eac3_decode_transform_coeffs_aht_ch
(AC3DecodeContext *
s
,
int
ch);
274
275
/**
276
* Apply spectral extension to each channel by copying lower frequency
277
* coefficients to higher frequency bins and applying side information to
278
* approximate the original high frequency signal.
279
*/
280
static
void
ff_eac3_apply_spectral_extension
(AC3DecodeContext *
s
);
281
282
#if (!USE_FIXED)
283
extern
float
ff_ac3_heavy_dynamic_range_tab
[256];
284
#endif
285
286
#endif
/* AVCODEC_AC3DEC_H */
bswapdsp.h
ff_eac3_parse_header
static int ff_eac3_parse_header(AC3DecodeContext *s)
Definition:
eac3dec.c:290
mem_internal.h
AVTXContext
Definition:
tx_priv.h:235
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
AC3_CRITICAL_BANDS
#define AC3_CRITICAL_BANDS
Definition:
ac3defs.h:34
mask
int mask
Definition:
mediacodecdec_common.c:154
AC3DSPContext
Definition:
ac3dsp.h:34
AVFixedDSPContext
Definition:
fixed_dsp.h:55
AC3_MAX_CPL_BANDS
#define AC3_MAX_CPL_BANDS
Definition:
ac3defs.h:35
ff_eac3_decode_transform_coeffs_aht_ch
static void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch)
Definition:
eac3dec.c:197
fmtconvert.h
window
static SDL_Window * window
Definition:
ffplay.c:361
fixed_coeffs
static const int fixed_coeffs[][3]
Definition:
shorten.c:345
GetBitContext
Definition:
get_bits.h:108
av_tx_fn
void(* av_tx_fn)(AVTXContext *s, void *out, void *in, ptrdiff_t stride)
Function pointer to a function to perform the transform.
Definition:
tx.h:151
s
#define s(width, name)
Definition:
cbs_vp9.c:198
AC3_MAX_COEFS
#define AC3_MAX_COEFS
Definition:
ac3defs.h:29
frame_size
int frame_size
Definition:
mxfenc.c:2446
lfg.h
channels
channels
Definition:
aptx.h:31
get_bits.h
channel_map
static const uint8_t channel_map[8][8]
Definition:
atrac3plusdec.c:52
fixed_dsp.h
ff_ac3_heavy_dynamic_range_tab
float ff_ac3_heavy_dynamic_range_tab[256]
Definition:
ac3dec.c:74
SHORTFLOAT
float SHORTFLOAT
Definition:
aac_defines.h:104
AVClass
Describe the class of an AVClass context structure.
Definition:
log.h:75
ac3dsp.h
AC3_MAX_CHANNELS
#define AC3_MAX_CHANNELS
maximum number of channels, including coupling channel
Definition:
ac3defs.h:26
float_dsp.h
AVLFG
Context structure for the Lagged Fibonacci PRNG.
Definition:
lfg.h:33
AVChannelLayout
An AVChannelLayout holds information about the channel layout of audio data.
Definition:
channel_layout.h:319
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition:
mem_internal.h:104
AC3_BLOCK_SIZE
#define AC3_BLOCK_SIZE
Definition:
ac3defs.h:30
AVFloatDSPContext
Definition:
float_dsp.h:24
frame_type
frame_type
Definition:
jpeg2000_parser.c:31
ff_eac3_apply_spectral_extension
static void ff_eac3_apply_spectral_extension(AC3DecodeContext *s)
Definition:
eac3dec.c:58
AC3_MAX_BLOCKS
#define AC3_MAX_BLOCKS
Definition:
ac3defs.h:31
avcodec.h
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition:
defs.h:40
AC3BitAllocParameters
Definition:
ac3.h:95
AVCodecContext
main external API structure.
Definition:
avcodec.h:451
EAC3_MAX_CHANNELS
#define EAC3_MAX_CHANNELS
maximum number of channels in EAC3
Definition:
ac3defs.h:25
FmtConvertContext
Definition:
fmtconvert.h:28
ac3.h
BswapDSPContext
Definition:
bswapdsp.h:24
INTFLOAT
float INTFLOAT
Definition:
aac_defines.h:101
tx.h
Generated on Sat Mar 22 2025 19:21:23 for FFmpeg by
1.8.17