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