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