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