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