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 Sep 14 2014 18:55:51 for FFmpeg by
1.8.2