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
aac.h
Go to the documentation of this file.
1
/*
2
* AAC definitions and structures
3
* Copyright (c) 2005-2006 Oded Shimon ( ods15 ods15 dyndns org )
4
* Copyright (c) 2006-2007 Maxim Gavrilov ( maxim.gavrilov gmail com )
5
*
6
* This file is part of FFmpeg.
7
*
8
* FFmpeg is free software; you can redistribute it and/or
9
* modify it under the terms of the GNU Lesser General Public
10
* License as published by the Free Software Foundation; either
11
* version 2.1 of the License, or (at your option) any later version.
12
*
13
* FFmpeg is distributed in the hope that it will be useful,
14
* but WITHOUT ANY WARRANTY; without even the implied warranty of
15
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16
* Lesser General Public License for more details.
17
*
18
* You should have received a copy of the GNU Lesser General Public
19
* License along with FFmpeg; if not, write to the Free Software
20
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21
*/
22
23
/**
24
* @file
25
* AAC definitions and structures
26
* @author Oded Shimon ( ods15 ods15 dyndns org )
27
* @author Maxim Gavrilov ( maxim.gavrilov gmail com )
28
*/
29
30
#ifndef AVCODEC_AAC_H
31
#define AVCODEC_AAC_H
32
33
#include "
libavutil/float_dsp.h
"
34
#include "
avcodec.h
"
35
#include "
imdct15.h
"
36
#include "
fft.h
"
37
#include "
mpeg4audio.h
"
38
#include "
sbr.h
"
39
40
#include <stdint.h>
41
42
#define MAX_CHANNELS 64
43
#define MAX_ELEM_ID 16
44
45
#define TNS_MAX_ORDER 20
46
#define MAX_LTP_LONG_SFB 40
47
48
enum
RawDataBlockType
{
49
TYPE_SCE
,
50
TYPE_CPE
,
51
TYPE_CCE
,
52
TYPE_LFE
,
53
TYPE_DSE
,
54
TYPE_PCE
,
55
TYPE_FIL
,
56
TYPE_END
,
57
};
58
59
enum
ExtensionPayloadID
{
60
EXT_FILL
,
61
EXT_FILL_DATA
,
62
EXT_DATA_ELEMENT
,
63
EXT_DYNAMIC_RANGE
= 0xb,
64
EXT_SBR_DATA
= 0xd,
65
EXT_SBR_DATA_CRC
= 0xe,
66
};
67
68
enum
WindowSequence
{
69
ONLY_LONG_SEQUENCE
,
70
LONG_START_SEQUENCE
,
71
EIGHT_SHORT_SEQUENCE
,
72
LONG_STOP_SEQUENCE
,
73
};
74
75
enum
BandType
{
76
ZERO_BT
= 0,
///< Scalefactors and spectral data are all zero.
77
FIRST_PAIR_BT
= 5,
///< This and later band types encode two values (rather than four) with one code word.
78
ESC_BT
= 11,
///< Spectral data are coded with an escape sequence.
79
NOISE_BT
= 13,
///< Spectral data are scaled white noise not coded in the bitstream.
80
INTENSITY_BT2
= 14,
///< Scalefactor data are intensity stereo positions.
81
INTENSITY_BT
= 15,
///< Scalefactor data are intensity stereo positions.
82
};
83
84
#define IS_CODEBOOK_UNSIGNED(x) (((x) - 1) & 10)
85
86
enum
ChannelPosition
{
87
AAC_CHANNEL_OFF
= 0,
88
AAC_CHANNEL_FRONT
= 1,
89
AAC_CHANNEL_SIDE
= 2,
90
AAC_CHANNEL_BACK
= 3,
91
AAC_CHANNEL_LFE
= 4,
92
AAC_CHANNEL_CC
= 5,
93
};
94
95
/**
96
* The point during decoding at which channel coupling is applied.
97
*/
98
enum
CouplingPoint
{
99
BEFORE_TNS
,
100
BETWEEN_TNS_AND_IMDCT
,
101
AFTER_IMDCT
= 3,
102
};
103
104
/**
105
* Output configuration status
106
*/
107
enum
OCStatus
{
108
OC_NONE
,
///< Output unconfigured
109
OC_TRIAL_PCE
,
///< Output configuration under trial specified by an inband PCE
110
OC_TRIAL_FRAME
,
///< Output configuration under trial specified by a frame header
111
OC_GLOBAL_HDR
,
///< Output configuration set in a global header but not yet locked
112
OC_LOCKED
,
///< Output configuration locked in place
113
};
114
115
typedef
struct
OutputConfiguration
{
116
MPEG4AudioConfig
m4ac
;
117
uint8_t
layout_map
[
MAX_ELEM_ID
*4][3];
118
int
layout_map_tags
;
119
int
channels
;
120
uint64_t
channel_layout
;
121
enum
OCStatus
status
;
122
}
OutputConfiguration
;
123
124
/**
125
* Predictor State
126
*/
127
typedef
struct
PredictorState
{
128
float
cor0
;
129
float
cor1
;
130
float
var0
;
131
float
var1
;
132
float
r0
;
133
float
r1
;
134
}
PredictorState
;
135
136
#define MAX_PREDICTORS 672
137
138
#define SCALE_DIV_512 36
///< scalefactor difference that corresponds to scale difference in 512 times
139
#define SCALE_ONE_POS 140
///< scalefactor index that corresponds to scale=1.0
140
#define SCALE_MAX_POS 255
///< scalefactor index maximum value
141
#define SCALE_MAX_DIFF 60
///< maximum scalefactor difference allowed by standard
142
#define SCALE_DIFF_ZERO 60
///< codebook index corresponding to zero scalefactor indices difference
143
144
/**
145
* Long Term Prediction
146
*/
147
typedef
struct
LongTermPrediction
{
148
int8_t
present
;
149
int16_t
lag
;
150
float
coef
;
151
int8_t
used
[
MAX_LTP_LONG_SFB
];
152
}
LongTermPrediction
;
153
154
/**
155
* Individual Channel Stream
156
*/
157
typedef
struct
IndividualChannelStream
{
158
uint8_t
max_sfb
;
///< number of scalefactor bands per group
159
enum
WindowSequence
window_sequence
[2];
160
uint8_t
use_kb_window
[2];
///< If set, use Kaiser-Bessel window, otherwise use a sine window.
161
int
num_window_groups
;
162
uint8_t
group_len
[8];
163
LongTermPrediction
ltp
;
164
const
uint16_t *
swb_offset
;
///< table of offsets to the lowest spectral coefficient of a scalefactor band, sfb, for a particular window
165
const
uint8_t
*
swb_sizes
;
///< table of scalefactor band sizes for a particular window
166
int
num_swb
;
///< number of scalefactor window bands
167
int
num_windows
;
168
int
tns_max_bands
;
169
int
predictor_present
;
170
int
predictor_initialized
;
171
int
predictor_reset_group
;
172
uint8_t
prediction_used
[41];
173
}
IndividualChannelStream
;
174
175
/**
176
* Temporal Noise Shaping
177
*/
178
typedef
struct
TemporalNoiseShaping
{
179
int
present
;
180
int
n_filt
[8];
181
int
length
[8][4];
182
int
direction
[8][4];
183
int
order
[8][4];
184
float
coef
[8][4][
TNS_MAX_ORDER
];
185
}
TemporalNoiseShaping
;
186
187
/**
188
* Dynamic Range Control - decoded from the bitstream but not processed further.
189
*/
190
typedef
struct
DynamicRangeControl
{
191
int
pce_instance_tag
;
///< Indicates with which program the DRC info is associated.
192
int
dyn_rng_sgn
[17];
///< DRC sign information; 0 - positive, 1 - negative
193
int
dyn_rng_ctl
[17];
///< DRC magnitude information
194
int
exclude_mask
[
MAX_CHANNELS
];
///< Channels to be excluded from DRC processing.
195
int
band_incr
;
///< Number of DRC bands greater than 1 having DRC info.
196
int
interpolation_scheme
;
///< Indicates the interpolation scheme used in the SBR QMF domain.
197
int
band_top
[17];
///< Indicates the top of the i-th DRC band in units of 4 spectral lines.
198
int
prog_ref_level
;
/**< A reference level for the long-term program audio level for all
199
* channels combined.
200
*/
201
}
DynamicRangeControl
;
202
203
typedef
struct
Pulse
{
204
int
num_pulse
;
205
int
start
;
206
int
pos
[4];
207
int
amp
[4];
208
}
Pulse
;
209
210
/**
211
* coupling parameters
212
*/
213
typedef
struct
ChannelCoupling
{
214
enum
CouplingPoint
coupling_point
;
///< The point during decoding at which coupling is applied.
215
int
num_coupled
;
///< number of target elements
216
enum
RawDataBlockType
type
[8];
///< Type of channel element to be coupled - SCE or CPE.
217
int
id_select
[8];
///< element id
218
int
ch_select
[8];
/**< [0] shared list of gains; [1] list of gains for right channel;
219
* [2] list of gains for left channel; [3] lists of gains for both channels
220
*/
221
float
gain
[16][120];
222
}
ChannelCoupling
;
223
224
/**
225
* Single Channel Element - used for both SCE and LFE elements.
226
*/
227
typedef
struct
SingleChannelElement
{
228
IndividualChannelStream
ics
;
229
TemporalNoiseShaping
tns
;
230
Pulse
pulse
;
231
enum
BandType
band_type
[128];
///< band types
232
int
band_type_run_end
[120];
///< band type run end points
233
float
sf
[120];
///< scalefactors
234
int
sf_idx
[128];
///< scalefactor indices (used by encoder)
235
uint8_t
zeroes
[128];
///< band is not coded (used by encoder)
236
DECLARE_ALIGNED
(32,
float
,
pcoeffs
)[1024];
///< coefficients for IMDCT, pristine
237
DECLARE_ALIGNED
(32,
float
,
coeffs
)[1024];
///< coefficients for IMDCT, maybe processed
238
DECLARE_ALIGNED
(32,
float
,
saved
)[1536];
///< overlap
239
DECLARE_ALIGNED
(32,
float
,
ret_buf
)[2048];
///< PCM output buffer
240
DECLARE_ALIGNED
(16,
float
,
ltp_state
)[3072];
///< time signal for LTP
241
PredictorState
predictor_state
[
MAX_PREDICTORS
];
242
float
*
ret
;
///< PCM output
243
}
SingleChannelElement
;
244
245
/**
246
* channel element - generic struct for SCE/CPE/CCE/LFE
247
*/
248
typedef
struct
ChannelElement
{
249
int
present
;
250
// CPE specific
251
int
common_window
;
///< Set if channels share a common 'IndividualChannelStream' in bitstream.
252
int
ms_mode
;
///< Signals mid/side stereo flags coding mode (used by encoder)
253
uint8_t
ms_mask
[128];
///< Set if mid/side stereo is used for each scalefactor window band
254
// shared
255
SingleChannelElement
ch
[2];
256
// CCE specific
257
ChannelCoupling
coup
;
258
SpectralBandReplication
sbr
;
259
}
ChannelElement
;
260
261
/**
262
* main AAC context
263
*/
264
struct
AACContext
{
265
AVClass
*
class
;
266
AVCodecContext
*
avctx
;
267
AVFrame
*
frame
;
268
269
int
is_saved
;
///< Set if elements have stored overlap from previous frame.
270
DynamicRangeControl
che_drc
;
271
272
/**
273
* @name Channel element related data
274
* @{
275
*/
276
ChannelElement
*
che
[4][
MAX_ELEM_ID
];
277
ChannelElement
*
tag_che_map
[4][
MAX_ELEM_ID
];
278
int
tags_mapped
;
279
int
warned_remapping_once
;
280
/** @} */
281
282
/**
283
* @name temporary aligned temporary buffers
284
* (We do not want to have these on the stack.)
285
* @{
286
*/
287
DECLARE_ALIGNED
(32,
float
,
buf_mdct
)[1024];
288
/** @} */
289
290
/**
291
* @name Computed / set up during initialization
292
* @{
293
*/
294
FFTContext
mdct
;
295
FFTContext
mdct_small
;
296
FFTContext
mdct_ld
;
297
FFTContext
mdct_ltp
;
298
IMDCT15Context
*
mdct480
;
299
AVFloatDSPContext
*
fdsp
;
300
int
random_state
;
301
/** @} */
302
303
/**
304
* @name Members used for output
305
* @{
306
*/
307
SingleChannelElement
*
output_element
[
MAX_CHANNELS
];
///< Points to each SingleChannelElement
308
/** @} */
309
310
311
/**
312
* @name Japanese DTV specific extension
313
* @{
314
*/
315
int
force_dmono_mode
;
///< 0->not dmono, 1->use first channel, 2->use second channel
316
int
dmono_mode
;
///< 0->not dmono, 1->use first channel, 2->use second channel
317
/** @} */
318
319
DECLARE_ALIGNED
(32,
float
,
temp
)[128];
320
321
OutputConfiguration
oc
[2];
322
int
warned_num_aac_frames
;
323
324
/* aacdec functions pointers */
325
void
(*
imdct_and_windowing
)(
AACContext
*ac,
SingleChannelElement
*sce);
326
void
(*
apply_ltp
)(
AACContext
*ac,
SingleChannelElement
*sce);
327
void
(*
apply_tns
)(
float
coef[1024],
TemporalNoiseShaping
*tns,
328
IndividualChannelStream
*ics,
int
decode
);
329
void
(*
windowing_and_mdct_ltp
)(
AACContext
*ac,
float
*
out
,
330
float
*
in
,
IndividualChannelStream
*ics);
331
void
(*
update_ltp
)(
AACContext
*ac,
SingleChannelElement
*sce);
332
333
};
334
335
void
ff_aacdec_init_mips
(
AACContext
*
c
);
336
337
#endif
/* AVCODEC_AAC_H */
Generated on Sun Mar 8 2015 02:34:46 for FFmpeg by
1.8.2