FFmpeg
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/float_dsp.h
"
54
#include "
libavutil/fixed_dsp.h
"
55
#include "
libavutil/lfg.h
"
56
#include "
ac3.h
"
57
#include "
ac3dsp.h
"
58
#include "
bswapdsp.h
"
59
#include "
get_bits.h
"
60
#include "fft.h"
61
#include "
fmtconvert.h
"
62
63
#define AC3_OUTPUT_LFEON 8
64
65
#define SPX_MAX_BANDS 17
66
67
/** Large enough for maximum possible frame size when the specification limit is ignored */
68
#define AC3_FRAME_BUFFER_SIZE 32768
69
70
typedef
struct
AC3DecodeContext {
71
AVClass
*
class
;
///< class for AVOptions
72
AVCodecContext
*avctx;
///< parent context
73
GetBitContext
gbc;
///< bitstream reader
74
75
///@name Bit stream information
76
///@{
77
int
frame_type
;
///< frame type (strmtyp)
78
int
substreamid;
///< substream identification
79
int
superframe_size;
///< current superframe size, in bytes
80
int
frame_size
;
///< current frame size, in bytes
81
int
bit_rate;
///< stream bit rate, in bits-per-second
82
int
sample_rate
;
///< sample frequency, in Hz
83
int
num_blocks;
///< number of audio blocks
84
int
bitstream_id;
///< bitstream id (bsid)
85
int
bitstream_mode;
///< bitstream mode (bsmod)
86
int
channel_mode;
///< channel mode (acmod)
87
int
lfe_on;
///< lfe channel in use
88
int
dialog_normalization[2];
///< dialog level in dBFS (dialnorm)
89
int
compression_exists[2];
///< compression field is valid for frame (compre)
90
int
compression_gain[2];
///< gain to apply for heavy compression (compr)
91
int
channel_map;
///< custom channel map (chanmap)
92
int
preferred_downmix;
///< Preferred 2-channel downmix mode (dmixmod)
93
int
center_mix_level;
///< Center mix level index
94
int
center_mix_level_ltrt;
///< Center mix level index for Lt/Rt (ltrtcmixlev)
95
int
surround_mix_level;
///< Surround mix level index
96
int
surround_mix_level_ltrt;
///< Surround mix level index for Lt/Rt (ltrtsurmixlev)
97
int
lfe_mix_level_exists;
///< indicates if lfemixlevcod is specified (lfemixlevcode)
98
int
lfe_mix_level;
///< LFE mix level index (lfemixlevcod)
99
int
eac3;
///< indicates if current frame is E-AC-3
100
int
eac3_frame_dependent_found;
///< bitstream has E-AC-3 dependent frame(s)
101
int
eac3_subsbtreamid_found;
///< bitstream has E-AC-3 additional substream(s)
102
int
dolby_surround_mode;
///< dolby surround mode (dsurmod)
103
int
dolby_surround_ex_mode;
///< dolby surround ex mode (dsurexmod)
104
int
dolby_headphone_mode;
///< dolby headphone mode (dheadphonmod)
105
///@}
106
107
int
preferred_stereo_downmix;
108
float
ltrt_center_mix_level;
109
float
ltrt_surround_mix_level;
110
float
loro_center_mix_level;
111
float
loro_surround_mix_level;
112
int
target_level;
///< target level in dBFS
113
float
level_gain[2];
114
115
///@name Frame syntax parameters
116
int
snr_offset_strategy;
///< SNR offset strategy (snroffststr)
117
int
block_switch_syntax;
///< block switch syntax enabled (blkswe)
118
int
dither_flag_syntax;
///< dither flag syntax enabled (dithflage)
119
int
bit_allocation_syntax;
///< bit allocation model syntax enabled (bamode)
120
int
fast_gain_syntax;
///< fast gain codes enabled (frmfgaincode)
121
int
dba_syntax;
///< delta bit allocation syntax enabled (dbaflde)
122
int
skip_syntax;
///< skip field syntax enabled (skipflde)
123
///@}
124
125
///@name Standard coupling
126
int
cpl_in_use[
AC3_MAX_BLOCKS
];
///< coupling in use (cplinu)
127
int
cpl_strategy_exists[
AC3_MAX_BLOCKS
];
///< coupling strategy exists (cplstre)
128
int
channel_in_cpl[
AC3_MAX_CHANNELS
];
///< channel in coupling (chincpl)
129
int
phase_flags_in_use;
///< phase flags in use (phsflginu)
130
int
phase_flags[
AC3_MAX_CPL_BANDS
];
///< phase flags (phsflg)
131
int
num_cpl_bands;
///< number of coupling bands (ncplbnd)
132
uint8_t
cpl_band_struct[
AC3_MAX_CPL_BANDS
];
133
uint8_t
cpl_band_sizes[
AC3_MAX_CPL_BANDS
];
///< number of coeffs in each coupling band
134
int
firstchincpl;
///< first channel in coupling
135
int
first_cpl_coords[
AC3_MAX_CHANNELS
];
///< first coupling coordinates states (firstcplcos)
136
int
cpl_coords[
AC3_MAX_CHANNELS
][
AC3_MAX_CPL_BANDS
];
///< coupling coordinates (cplco)
137
///@}
138
139
///@name Spectral extension
140
///@{
141
int
spx_in_use;
///< spectral extension in use (spxinu)
142
uint8_t
channel_uses_spx[
AC3_MAX_CHANNELS
];
///< channel uses spectral extension (chinspx)
143
int8_t spx_atten_code[
AC3_MAX_CHANNELS
];
///< spx attenuation code (spxattencod)
144
int
spx_src_start_freq;
///< spx start frequency bin
145
int
spx_dst_end_freq;
///< spx end frequency bin
146
int
spx_dst_start_freq;
///< spx starting frequency bin for copying (copystartmant)
147
///< the copy region ends at the start of the spx region.
148
int
num_spx_bands;
///< number of spx bands (nspxbnds)
149
uint8_t
spx_band_struct[SPX_MAX_BANDS];
150
uint8_t
spx_band_sizes[SPX_MAX_BANDS];
///< number of bins in each spx band
151
uint8_t
first_spx_coords[
AC3_MAX_CHANNELS
];
///< first spx coordinates states (firstspxcos)
152
INTFLOAT
spx_noise_blend[
AC3_MAX_CHANNELS
][SPX_MAX_BANDS];
///< spx noise blending factor (nblendfact)
153
INTFLOAT
spx_signal_blend[
AC3_MAX_CHANNELS
][SPX_MAX_BANDS];
///< spx signal blending factor (sblendfact)
154
///@}
155
156
///@name Adaptive hybrid transform
157
int
channel_uses_aht[
AC3_MAX_CHANNELS
];
///< channel AHT in use (chahtinu)
158
int
pre_mantissa[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
][
AC3_MAX_BLOCKS
];
///< pre-IDCT mantissas
159
///@}
160
161
///@name Channel
162
int
fbw_channels;
///< number of full-bandwidth channels
163
int
channels
;
///< number of total channels
164
int
lfe_ch;
///< index of LFE channel
165
SHORTFLOAT
*downmix_coeffs[2];
///< stereo downmix coefficients
166
int
downmixed;
///< indicates if coeffs are currently downmixed
167
int
output_mode;
///< output channel configuration
168
int
prev_output_mode;
///< output channel configuration for previous frame
169
int
out_channels;
///< number of output channels
170
int
prev_bit_rate;
///< stream bit rate, in bits-per-second for previous frame
171
///@}
172
173
///@name Dynamic range
174
INTFLOAT
dynamic_range[2];
///< dynamic range
175
INTFLOAT
drc_scale;
///< percentage of dynamic range compression to be applied
176
int
heavy_compression;
///< apply heavy compression
177
INTFLOAT
heavy_dynamic_range[2];
///< heavy dynamic range compression
178
///@}
179
180
///@name Bandwidth
181
int
start_freq[
AC3_MAX_CHANNELS
];
///< start frequency bin (strtmant)
182
int
end_freq[
AC3_MAX_CHANNELS
];
///< end frequency bin (endmant)
183
///@}
184
185
///@name Consistent noise generation
186
int
consistent_noise_generation;
///< seed noise generation with AC-3 frame on decode
187
///@}
188
189
///@name Rematrixing
190
int
num_rematrixing_bands;
///< number of rematrixing bands (nrematbnd)
191
int
rematrixing_flags[4];
///< rematrixing flags (rematflg)
192
///@}
193
194
///@name Exponents
195
int
num_exp_groups[
AC3_MAX_CHANNELS
];
///< Number of exponent groups (nexpgrp)
196
int8_t dexps[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
];
///< decoded exponents
197
int
exp_strategy[
AC3_MAX_BLOCKS
][
AC3_MAX_CHANNELS
];
///< exponent strategies (expstr)
198
///@}
199
200
///@name Bit allocation
201
AC3BitAllocParameters
bit_alloc_params;
///< bit allocation parameters
202
int
first_cpl_leak;
///< first coupling leak state (firstcplleak)
203
int
snr_offset[
AC3_MAX_CHANNELS
];
///< signal-to-noise ratio offsets (snroffst)
204
int
fast_gain[
AC3_MAX_CHANNELS
];
///< fast gain values/SMR's (fgain)
205
uint8_t
bap[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
];
///< bit allocation pointers
206
int16_t psd[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
];
///< scaled exponents
207
int16_t band_psd[
AC3_MAX_CHANNELS
][
AC3_CRITICAL_BANDS
];
///< interpolated exponents
208
int16_t
mask
[
AC3_MAX_CHANNELS
][
AC3_CRITICAL_BANDS
];
///< masking curve values
209
int
dba_mode[
AC3_MAX_CHANNELS
];
///< delta bit allocation mode
210
int
dba_nsegs[
AC3_MAX_CHANNELS
];
///< number of delta segments
211
uint8_t
dba_offsets[
AC3_MAX_CHANNELS
][8];
///< delta segment offsets
212
uint8_t
dba_lengths[
AC3_MAX_CHANNELS
][8];
///< delta segment lengths
213
uint8_t
dba_values[
AC3_MAX_CHANNELS
][8];
///< delta values for each segment
214
///@}
215
216
///@name Zero-mantissa dithering
217
int
dither_flag[
AC3_MAX_CHANNELS
];
///< dither flags (dithflg)
218
AVLFG
dith_state;
///< for dither generation
219
///@}
220
221
///@name IMDCT
222
int
block_switch[
AC3_MAX_CHANNELS
];
///< block switch flags (blksw)
223
FFTContext
imdct_512;
///< for 512 sample IMDCT
224
FFTContext
imdct_256;
///< for 256 sample IMDCT
225
///@}
226
227
///@name Optimization
228
BswapDSPContext
bdsp;
229
#if USE_FIXED
230
AVFixedDSPContext
*fdsp;
231
#else
232
AVFloatDSPContext
*fdsp;
233
#endif
234
AC3DSPContext
ac3dsp;
235
FmtConvertContext
fmt_conv;
///< optimized conversion functions
236
///@}
237
238
SHORTFLOAT
*outptr[
AC3_MAX_CHANNELS
];
239
INTFLOAT
*xcfptr[
AC3_MAX_CHANNELS
];
240
INTFLOAT
*dlyptr[
AC3_MAX_CHANNELS
];
241
242
///@name Aligned arrays
243
DECLARE_ALIGNED
(16,
int
,
fixed_coeffs
)[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
];
///< fixed-point transform coefficients
244
DECLARE_ALIGNED
(32,
INTFLOAT
, transform_coeffs)[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
];
///< transform coefficients
245
DECLARE_ALIGNED
(32,
INTFLOAT
, delay)[
EAC3_MAX_CHANNELS
][
AC3_BLOCK_SIZE
];
///< delay - added to the next block
246
DECLARE_ALIGNED
(32,
INTFLOAT
,
window
)[
AC3_BLOCK_SIZE
];
///< window coefficients
247
DECLARE_ALIGNED
(32,
INTFLOAT
, tmp_output)[
AC3_BLOCK_SIZE
];
///< temporary storage for output before windowing
248
DECLARE_ALIGNED
(32,
SHORTFLOAT
,
output
)[
EAC3_MAX_CHANNELS
][
AC3_BLOCK_SIZE
];
///< output after imdct transform and windowing
249
DECLARE_ALIGNED
(32,
uint8_t
, input_buffer)[AC3_FRAME_BUFFER_SIZE +
AV_INPUT_BUFFER_PADDING_SIZE
];
///< temp buffer to prevent overread
250
DECLARE_ALIGNED
(32,
SHORTFLOAT
, output_buffer)[
EAC3_MAX_CHANNELS
][
AC3_BLOCK_SIZE
* 6];
///< final output buffer
251
///@}
252
} AC3DecodeContext;
253
254
/**
255
* Parse the E-AC-3 frame header.
256
* This parses both the bit stream info and audio frame header.
257
*/
258
static
int
ff_eac3_parse_header
(AC3DecodeContext *
s
);
259
260
/**
261
* Decode mantissas in a single channel for the entire frame.
262
* This is used when AHT mode is enabled.
263
*/
264
static
void
ff_eac3_decode_transform_coeffs_aht_ch
(AC3DecodeContext *
s
,
int
ch);
265
266
/**
267
* Apply spectral extension to each channel by copying lower frequency
268
* coefficients to higher frequency bins and applying side information to
269
* approximate the original high frequency signal.
270
*/
271
static
void
ff_eac3_apply_spectral_extension
(AC3DecodeContext *
s
);
272
273
#if (!USE_FIXED)
274
extern
float
ff_ac3_heavy_dynamic_range_tab
[256];
275
#endif
276
277
#endif
/* AVCODEC_AC3DEC_H */
bswapdsp.h
ff_eac3_parse_header
static int ff_eac3_parse_header(AC3DecodeContext *s)
Definition:
eac3dec.c:289
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
AC3DSPContext
Definition:
ac3dsp.h:33
AC3_MAX_COEFS
#define AC3_MAX_COEFS
Definition:
ac3.h:35
AC3_CRITICAL_BANDS
#define AC3_CRITICAL_BANDS
Definition:
ac3.h:40
AVFixedDSPContext
Definition:
fixed_dsp.h:56
ff_eac3_decode_transform_coeffs_aht_ch
static void ff_eac3_decode_transform_coeffs_aht_ch(AC3DecodeContext *s, int ch)
Definition:
eac3dec.c:196
sample_rate
sample_rate
Definition:
ffmpeg_filter.c:192
fmtconvert.h
window
static SDL_Window * window
Definition:
ffplay.c:368
AC3_MAX_BLOCKS
#define AC3_MAX_BLOCKS
Definition:
ac3.h:37
fixed_coeffs
static const int fixed_coeffs[][3]
Definition:
shorten.c:343
GetBitContext
Definition:
get_bits.h:61
AC3_MAX_CHANNELS
#define AC3_MAX_CHANNELS
maximum number of channels, including coupling channel
Definition:
ac3.h:32
AC3_MAX_CPL_BANDS
#define AC3_MAX_CPL_BANDS
Definition:
ac3.h:41
mask
static const uint16_t mask[17]
Definition:
lzw.c:38
s
#define s(width, name)
Definition:
cbs_vp9.c:257
frame_size
int frame_size
Definition:
mxfenc.c:2137
lfg.h
channels
channels
Definition:
aptx.h:33
get_bits.h
fixed_dsp.h
ff_ac3_heavy_dynamic_range_tab
float ff_ac3_heavy_dynamic_range_tab[256]
Definition:
ac3dec.c:69
SHORTFLOAT
float SHORTFLOAT
Definition:
aac_defines.h:89
AVClass
Describe the class of an AVClass context structure.
Definition:
log.h:67
ac3dsp.h
float_dsp.h
AVLFG
Context structure for the Lagged Fibonacci PRNG.
Definition:
lfg.h:33
AVFloatDSPContext
Definition:
float_dsp.h:24
EAC3_MAX_CHANNELS
#define EAC3_MAX_CHANNELS
maximum number of channels in EAC3
Definition:
ac3.h:31
DECLARE_ALIGNED
#define DECLARE_ALIGNED(n, t, v)
Definition:
mem.h:112
FFTContext
Definition:
fft.h:88
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:59
uint8_t
uint8_t
Definition:
audio_convert.c:194
AV_INPUT_BUFFER_PADDING_SIZE
#define AV_INPUT_BUFFER_PADDING_SIZE
Definition:
avcodec.h:215
AC3BitAllocParameters
Definition:
ac3.h:166
AVCodecContext
main external API structure.
Definition:
avcodec.h:526
FmtConvertContext
Definition:
fmtconvert.h:28
ac3.h
BswapDSPContext
Definition:
bswapdsp.h:24
INTFLOAT
float INTFLOAT
Definition:
aac_defines.h:86
AC3_BLOCK_SIZE
#define AC3_BLOCK_SIZE
Definition:
ac3.h:36
Generated on Wed Aug 24 2022 21:31:06 for FFmpeg by
1.8.17