FFmpeg
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
Examples
File List
Globals
•
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
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/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
frame_size
;
///< current frame size, in bytes
80
int
bit_rate
;
///< stream bit rate, in bits-per-second
81
int
sample_rate
;
///< sample frequency, in Hz
82
int
num_blocks
;
///< number of audio blocks
83
int
bitstream_id
;
///< bitstream id (bsid)
84
int
bitstream_mode
;
///< bitstream mode (bsmod)
85
int
channel_mode
;
///< channel mode (acmod)
86
int
lfe_on
;
///< lfe channel in use
87
int
dialog_normalization
[2];
///< dialog level in dBFS (dialnorm)
88
int
compression_exists
[2];
///< compression field is valid for frame (compre)
89
int
compression_gain
[2];
///< gain to apply for heavy compression (compr)
90
int
channel_map
;
///< custom channel map
91
int
preferred_downmix
;
///< Preferred 2-channel downmix mode (dmixmod)
92
int
center_mix_level
;
///< Center mix level index
93
int
center_mix_level_ltrt
;
///< Center mix level index for Lt/Rt (ltrtcmixlev)
94
int
surround_mix_level
;
///< Surround mix level index
95
int
surround_mix_level_ltrt
;
///< Surround mix level index for Lt/Rt (ltrtsurmixlev)
96
int
lfe_mix_level_exists
;
///< indicates if lfemixlevcod is specified (lfemixlevcode)
97
int
lfe_mix_level
;
///< LFE mix level index (lfemixlevcod)
98
int
eac3
;
///< indicates if current frame is E-AC-3
99
int
dolby_surround_mode
;
///< dolby surround mode (dsurmod)
100
int
dolby_surround_ex_mode
;
///< dolby surround ex mode (dsurexmod)
101
int
dolby_headphone_mode
;
///< dolby headphone mode (dheadphonmod)
102
///@}
103
104
int
preferred_stereo_downmix
;
105
float
ltrt_center_mix_level
;
106
float
ltrt_surround_mix_level
;
107
float
loro_center_mix_level
;
108
float
loro_surround_mix_level
;
109
int
target_level
;
///< target level in dBFS
110
float
level_gain
[2];
111
112
///@name Frame syntax parameters
113
int
snr_offset_strategy
;
///< SNR offset strategy (snroffststr)
114
int
block_switch_syntax
;
///< block switch syntax enabled (blkswe)
115
int
dither_flag_syntax
;
///< dither flag syntax enabled (dithflage)
116
int
bit_allocation_syntax
;
///< bit allocation model syntax enabled (bamode)
117
int
fast_gain_syntax
;
///< fast gain codes enabled (frmfgaincode)
118
int
dba_syntax
;
///< delta bit allocation syntax enabled (dbaflde)
119
int
skip_syntax
;
///< skip field syntax enabled (skipflde)
120
///@}
121
122
///@name Standard coupling
123
int
cpl_in_use
[
AC3_MAX_BLOCKS
];
///< coupling in use (cplinu)
124
int
cpl_strategy_exists
[
AC3_MAX_BLOCKS
];
///< coupling strategy exists (cplstre)
125
int
channel_in_cpl
[
AC3_MAX_CHANNELS
];
///< channel in coupling (chincpl)
126
int
phase_flags_in_use
;
///< phase flags in use (phsflginu)
127
int
phase_flags
[
AC3_MAX_CPL_BANDS
];
///< phase flags (phsflg)
128
int
num_cpl_bands
;
///< number of coupling bands (ncplbnd)
129
uint8_t
cpl_band_sizes
[
AC3_MAX_CPL_BANDS
];
///< number of coeffs in each coupling band
130
int
firstchincpl
;
///< first channel in coupling
131
int
first_cpl_coords
[
AC3_MAX_CHANNELS
];
///< first coupling coordinates states (firstcplcos)
132
int
cpl_coords
[
AC3_MAX_CHANNELS
][
AC3_MAX_CPL_BANDS
];
///< coupling coordinates (cplco)
133
///@}
134
135
///@name Spectral extension
136
///@{
137
int
spx_in_use
;
///< spectral extension in use (spxinu)
138
uint8_t
channel_uses_spx
[
AC3_MAX_CHANNELS
];
///< channel uses spectral extension (chinspx)
139
int8_t
spx_atten_code
[
AC3_MAX_CHANNELS
];
///< spx attenuation code (spxattencod)
140
int
spx_src_start_freq
;
///< spx start frequency bin
141
int
spx_dst_end_freq
;
///< spx end frequency bin
142
int
spx_dst_start_freq
;
///< spx starting frequency bin for copying (copystartmant)
143
///< the copy region ends at the start of the spx region.
144
int
num_spx_bands
;
///< number of spx bands (nspxbnds)
145
uint8_t
spx_band_sizes
[
SPX_MAX_BANDS
];
///< number of bins in each spx band
146
uint8_t
first_spx_coords
[
AC3_MAX_CHANNELS
];
///< first spx coordinates states (firstspxcos)
147
INTFLOAT
spx_noise_blend
[
AC3_MAX_CHANNELS
][
SPX_MAX_BANDS
];
///< spx noise blending factor (nblendfact)
148
INTFLOAT
spx_signal_blend
[
AC3_MAX_CHANNELS
][
SPX_MAX_BANDS
];
///< spx signal blending factor (sblendfact)
149
///@}
150
151
///@name Adaptive hybrid transform
152
int
channel_uses_aht
[
AC3_MAX_CHANNELS
];
///< channel AHT in use (chahtinu)
153
int
pre_mantissa
[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
][
AC3_MAX_BLOCKS
];
///< pre-IDCT mantissas
154
///@}
155
156
///@name Channel
157
int
fbw_channels
;
///< number of full-bandwidth channels
158
int
channels
;
///< number of total channels
159
int
lfe_ch
;
///< index of LFE channel
160
SHORTFLOAT
downmix_coeffs
[
AC3_MAX_CHANNELS
][2];
///< stereo downmix coefficients
161
int
downmixed
;
///< indicates if coeffs are currently downmixed
162
int
output_mode
;
///< output channel configuration
163
int
out_channels
;
///< number of output channels
164
///@}
165
166
///@name Dynamic range
167
INTFLOAT
dynamic_range
[2];
///< dynamic range
168
INTFLOAT
drc_scale
;
///< percentage of dynamic range compression to be applied
169
int
heavy_compression
;
///< apply heavy compression
170
INTFLOAT
heavy_dynamic_range
[2];
///< heavy dynamic range compression
171
///@}
172
173
///@name Bandwidth
174
int
start_freq
[
AC3_MAX_CHANNELS
];
///< start frequency bin (strtmant)
175
int
end_freq
[
AC3_MAX_CHANNELS
];
///< end frequency bin (endmant)
176
///@}
177
178
///@name Rematrixing
179
int
num_rematrixing_bands
;
///< number of rematrixing bands (nrematbnd)
180
int
rematrixing_flags
[4];
///< rematrixing flags (rematflg)
181
///@}
182
183
///@name Exponents
184
int
num_exp_groups
[
AC3_MAX_CHANNELS
];
///< Number of exponent groups (nexpgrp)
185
int8_t
dexps
[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
];
///< decoded exponents
186
int
exp_strategy
[
AC3_MAX_BLOCKS
][
AC3_MAX_CHANNELS
];
///< exponent strategies (expstr)
187
///@}
188
189
///@name Bit allocation
190
AC3BitAllocParameters
bit_alloc_params
;
///< bit allocation parameters
191
int
first_cpl_leak
;
///< first coupling leak state (firstcplleak)
192
int
snr_offset
[
AC3_MAX_CHANNELS
];
///< signal-to-noise ratio offsets (snroffst)
193
int
fast_gain
[
AC3_MAX_CHANNELS
];
///< fast gain values/SMR's (fgain)
194
uint8_t
bap
[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
];
///< bit allocation pointers
195
int16_t
psd
[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
];
///< scaled exponents
196
int16_t
band_psd
[
AC3_MAX_CHANNELS
][
AC3_CRITICAL_BANDS
];
///< interpolated exponents
197
int16_t
mask
[
AC3_MAX_CHANNELS
][
AC3_CRITICAL_BANDS
];
///< masking curve values
198
int
dba_mode
[
AC3_MAX_CHANNELS
];
///< delta bit allocation mode
199
int
dba_nsegs
[
AC3_MAX_CHANNELS
];
///< number of delta segments
200
uint8_t
dba_offsets
[
AC3_MAX_CHANNELS
][8];
///< delta segment offsets
201
uint8_t
dba_lengths
[
AC3_MAX_CHANNELS
][8];
///< delta segment lengths
202
uint8_t
dba_values
[
AC3_MAX_CHANNELS
][8];
///< delta values for each segment
203
///@}
204
205
///@name Zero-mantissa dithering
206
int
dither_flag
[
AC3_MAX_CHANNELS
];
///< dither flags (dithflg)
207
AVLFG
dith_state
;
///< for dither generation
208
///@}
209
210
///@name IMDCT
211
int
block_switch
[
AC3_MAX_CHANNELS
];
///< block switch flags (blksw)
212
FFTContext
imdct_512
;
///< for 512 sample IMDCT
213
FFTContext
imdct_256
;
///< for 256 sample IMDCT
214
///@}
215
216
///@name Optimization
217
BswapDSPContext
bdsp
;
218
#if USE_FIXED
219
AVFixedDSPContext
*
fdsp
;
220
#else
221
AVFloatDSPContext
*
fdsp
;
222
#endif
223
AC3DSPContext
ac3dsp
;
224
FmtConvertContext
fmt_conv
;
///< optimized conversion functions
225
///@}
226
227
SHORTFLOAT
*
outptr
[
AC3_MAX_CHANNELS
];
228
INTFLOAT
*
xcfptr
[
AC3_MAX_CHANNELS
];
229
INTFLOAT
*
dlyptr
[
AC3_MAX_CHANNELS
];
230
231
///@name Aligned arrays
232
DECLARE_ALIGNED
(16,
int
,
fixed_coeffs
)[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
];
///< fixed-point transform coefficients
233
DECLARE_ALIGNED
(32,
INTFLOAT
,
transform_coeffs
)[
AC3_MAX_CHANNELS
][
AC3_MAX_COEFS
];
///< transform coefficients
234
DECLARE_ALIGNED
(32,
INTFLOAT
,
delay
)[
AC3_MAX_CHANNELS
][
AC3_BLOCK_SIZE
];
///< delay - added to the next block
235
DECLARE_ALIGNED
(32,
INTFLOAT
,
window
)[
AC3_BLOCK_SIZE
];
///< window coefficients
236
DECLARE_ALIGNED
(32,
INTFLOAT
,
tmp_output
)[
AC3_BLOCK_SIZE
];
///< temporary storage for output before windowing
237
DECLARE_ALIGNED
(32,
SHORTFLOAT
,
output
)[
AC3_MAX_CHANNELS
][
AC3_BLOCK_SIZE
];
///< output after imdct transform and windowing
238
DECLARE_ALIGNED
(32,
uint8_t
,
input_buffer
)[
AC3_FRAME_BUFFER_SIZE
+
FF_INPUT_BUFFER_PADDING_SIZE
];
///< temp buffer to prevent overread
239
///@}
240
}
AC3DecodeContext
;
241
242
/**
243
* Parse the E-AC-3 frame header.
244
* This parses both the bit stream info and audio frame header.
245
*/
246
int
ff_eac3_parse_header
(
AC3DecodeContext
*
s
);
247
248
/**
249
* Decode mantissas in a single channel for the entire frame.
250
* This is used when AHT mode is enabled.
251
*/
252
void
ff_eac3_decode_transform_coeffs_aht_ch
(
AC3DecodeContext
*
s
,
int
ch);
253
254
/**
255
* Apply spectral extension to each channel by copying lower frequency
256
* coefficients to higher frequency bins and applying side information to
257
* approximate the original high frequency signal.
258
*/
259
void
ff_eac3_apply_spectral_extension
(
AC3DecodeContext
*
s
);
260
261
#endif
/* AVCODEC_AC3DEC_H */
Generated on Sun Mar 8 2015 02:34:47 for FFmpeg by
1.8.2