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