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 Wed Jul 10 2013 23:47:54 for FFmpeg by
1.8.2