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
eac3enc.c
Go to the documentation of this file.
1
/*
2
* E-AC-3 encoder
3
* Copyright (c) 2011 Justin Ruggles <justin.ruggles@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
* E-AC-3 encoder
25
*/
26
27
#define CONFIG_AC3ENC_FLOAT 1
28
29
#include "
libavutil/attributes.h
"
30
#include "
ac3enc.h
"
31
#include "
eac3enc.h
"
32
#include "
eac3_data.h
"
33
34
35
#define AC3ENC_TYPE AC3ENC_TYPE_EAC3
36
#include "
ac3enc_opts_template.c
"
37
38
static
const
AVClass
eac3enc_class
= {
39
.
class_name
=
"E-AC-3 Encoder"
,
40
.item_name =
av_default_item_name
,
41
.option =
ac3_options
,
42
.version =
LIBAVUTIL_VERSION_INT
,
43
};
44
45
/**
46
* LUT for finding a matching frame exponent strategy index from a set of
47
* exponent strategies for a single channel across all 6 blocks.
48
*/
49
static
int8_t
eac3_frame_expstr_index_tab
[3][4][4][4][4][4];
50
51
52
av_cold
void
ff_eac3_exponent_init
(
void
)
53
{
54
int
i;
55
56
memset(
eac3_frame_expstr_index_tab
, -1,
sizeof
(
eac3_frame_expstr_index_tab
));
57
for
(i = 0; i < 32; i++) {
58
eac3_frame_expstr_index_tab
[
ff_eac3_frm_expstr
[i][0]-1]
59
[
ff_eac3_frm_expstr
[i][1]]
60
[
ff_eac3_frm_expstr
[i][2]]
61
[
ff_eac3_frm_expstr
[i][3]]
62
[
ff_eac3_frm_expstr
[i][4]]
63
[
ff_eac3_frm_expstr
[i][5]] = i;
64
}
65
}
66
67
68
void
ff_eac3_get_frame_exp_strategy
(
AC3EncodeContext
*
s
)
69
{
70
int
ch;
71
72
if
(s->
num_blocks
< 6) {
73
s->
use_frame_exp_strategy
= 0;
74
return
;
75
}
76
77
s->
use_frame_exp_strategy
= 1;
78
for
(ch = !s->
cpl_on
; ch <= s->fbw_channels; ch++) {
79
int
expstr =
eac3_frame_expstr_index_tab
[s->
exp_strategy
[ch][0]-1]
80
[s->
exp_strategy
[ch][1]]
81
[s->
exp_strategy
[ch][2]]
82
[s->
exp_strategy
[ch][3]]
83
[s->
exp_strategy
[ch][4]]
84
[s->
exp_strategy
[ch][5]];
85
if
(expstr < 0) {
86
s->
use_frame_exp_strategy
= 0;
87
break
;
88
}
89
s->
frame_exp_strategy
[ch] = expstr;
90
}
91
}
92
93
94
95
void
ff_eac3_set_cpl_states
(
AC3EncodeContext
*
s
)
96
{
97
int
ch,
blk
;
98
int
first_cpl_coords[
AC3_MAX_CHANNELS
];
99
100
/* set first cpl coords */
101
for
(ch = 1; ch <= s->
fbw_channels
; ch++)
102
first_cpl_coords[ch] = 1;
103
for
(blk = 0; blk < s->
num_blocks
; blk++) {
104
AC3Block
*
block
= &s->
blocks
[
blk
];
105
for
(ch = 1; ch <= s->
fbw_channels
; ch++) {
106
if
(block->
channel_in_cpl
[ch]) {
107
if
(first_cpl_coords[ch]) {
108
block->
new_cpl_coords
[ch] = 2;
109
first_cpl_coords[ch] = 0;
110
}
111
}
else
{
112
first_cpl_coords[ch] = 1;
113
}
114
}
115
}
116
117
/* set first cpl leak */
118
for
(blk = 0; blk < s->
num_blocks
; blk++) {
119
AC3Block
*
block
= &s->
blocks
[
blk
];
120
if
(block->
cpl_in_use
) {
121
block->
new_cpl_leak
= 2;
122
break
;
123
}
124
}
125
}
126
127
128
void
ff_eac3_output_frame_header
(
AC3EncodeContext
*
s
)
129
{
130
int
blk
, ch;
131
AC3EncOptions
*opt = &s->
options
;
132
133
put_bits
(&s->
pb
, 16, 0x0b77);
/* sync word */
134
135
/* BSI header */
136
put_bits
(&s->
pb
, 2, 0);
/* stream type = independent */
137
put_bits
(&s->
pb
, 3, 0);
/* substream id = 0 */
138
put_bits
(&s->
pb
, 11, (s->
frame_size
/ 2) - 1);
/* frame size */
139
if
(s->
bit_alloc
.
sr_shift
) {
140
put_bits
(&s->
pb
, 2, 0x3);
/* fscod2 */
141
put_bits
(&s->
pb
, 2, s->
bit_alloc
.
sr_code
);
/* sample rate code */
142
}
else
{
143
put_bits
(&s->
pb
, 2, s->
bit_alloc
.
sr_code
);
/* sample rate code */
144
put_bits
(&s->
pb
, 2, s->
num_blks_code
);
/* number of blocks */
145
}
146
put_bits
(&s->
pb
, 3, s->
channel_mode
);
/* audio coding mode */
147
put_bits
(&s->
pb
, 1, s->
lfe_on
);
/* LFE channel indicator */
148
put_bits
(&s->
pb
, 5, s->
bitstream_id
);
/* bitstream id (EAC3=16) */
149
put_bits
(&s->
pb
, 5, -opt->
dialogue_level
);
/* dialogue normalization level */
150
put_bits
(&s->
pb
, 1, 0);
/* no compression gain */
151
/* mixing metadata*/
152
put_bits
(&s->
pb
, 1, opt->
eac3_mixing_metadata
);
153
if
(opt->
eac3_mixing_metadata
) {
154
if
(s->
channel_mode
>
AC3_CHMODE_STEREO
)
155
put_bits
(&s->
pb
, 2, opt->
preferred_stereo_downmix
);
156
if
(s->
has_center
) {
157
put_bits
(&s->
pb
, 3, s->
ltrt_center_mix_level
);
158
put_bits
(&s->
pb
, 3, s->
loro_center_mix_level
);
159
}
160
if
(s->
has_surround
) {
161
put_bits
(&s->
pb
, 3, s->
ltrt_surround_mix_level
);
162
put_bits
(&s->
pb
, 3, s->
loro_surround_mix_level
);
163
}
164
if
(s->
lfe_on
)
165
put_bits
(&s->
pb
, 1, 0);
166
put_bits
(&s->
pb
, 1, 0);
/* no program scale */
167
put_bits
(&s->
pb
, 1, 0);
/* no ext program scale */
168
put_bits
(&s->
pb
, 2, 0);
/* no mixing parameters */
169
if
(s->
channel_mode
<
AC3_CHMODE_STEREO
)
170
put_bits
(&s->
pb
, 1, 0);
/* no pan info */
171
put_bits
(&s->
pb
, 1, 0);
/* no frame mix config info */
172
}
173
/* info metadata*/
174
put_bits
(&s->
pb
, 1, opt->
eac3_info_metadata
);
175
if
(opt->
eac3_info_metadata
) {
176
put_bits
(&s->
pb
, 3, s->
bitstream_mode
);
177
put_bits
(&s->
pb
, 1, opt->
copyright
);
178
put_bits
(&s->
pb
, 1, opt->
original
);
179
if
(s->
channel_mode
==
AC3_CHMODE_STEREO
) {
180
put_bits
(&s->
pb
, 2, opt->
dolby_surround_mode
);
181
put_bits
(&s->
pb
, 2, opt->
dolby_headphone_mode
);
182
}
183
if
(s->
channel_mode
>=
AC3_CHMODE_2F2R
)
184
put_bits
(&s->
pb
, 2, opt->
dolby_surround_ex_mode
);
185
put_bits
(&s->
pb
, 1, opt->
audio_production_info
);
186
if
(opt->
audio_production_info
) {
187
put_bits
(&s->
pb
, 5, opt->
mixing_level
- 80);
188
put_bits
(&s->
pb
, 2, opt->
room_type
);
189
put_bits
(&s->
pb
, 1, opt->
ad_converter_type
);
190
}
191
put_bits
(&s->
pb
, 1, 0);
192
}
193
if
(s->
num_blocks
!= 6)
194
put_bits
(&s->
pb
, 1, !(s->
avctx
->
frame_number
% 6));
/* converter sync flag */
195
put_bits
(&s->
pb
, 1, 0);
/* no additional bit stream info */
196
197
/* frame header */
198
if
(s->
num_blocks
== 6) {
199
put_bits
(&s->
pb
, 1, !s->
use_frame_exp_strategy
);
/* exponent strategy syntax */
200
put_bits
(&s->
pb
, 1, 0);
/* aht enabled = no */
201
}
202
put_bits
(&s->
pb
, 2, 0);
/* snr offset strategy = 1 */
203
put_bits
(&s->
pb
, 1, 0);
/* transient pre-noise processing enabled = no */
204
put_bits
(&s->
pb
, 1, 0);
/* block switch syntax enabled = no */
205
put_bits
(&s->
pb
, 1, 0);
/* dither flag syntax enabled = no */
206
put_bits
(&s->
pb
, 1, 0);
/* bit allocation model syntax enabled = no */
207
put_bits
(&s->
pb
, 1, 0);
/* fast gain codes enabled = no */
208
put_bits
(&s->
pb
, 1, 0);
/* dba syntax enabled = no */
209
put_bits
(&s->
pb
, 1, 0);
/* skip field syntax enabled = no */
210
put_bits
(&s->
pb
, 1, 0);
/* spx enabled = no */
211
/* coupling strategy use flags */
212
if
(s->
channel_mode
>
AC3_CHMODE_MONO
) {
213
put_bits
(&s->
pb
, 1, s->
blocks
[0].
cpl_in_use
);
214
for
(blk = 1; blk < s->
num_blocks
; blk++) {
215
AC3Block
*
block
= &s->
blocks
[
blk
];
216
put_bits
(&s->
pb
, 1, block->
new_cpl_strategy
);
217
if
(block->
new_cpl_strategy
)
218
put_bits
(&s->
pb
, 1, block->
cpl_in_use
);
219
}
220
}
221
/* exponent strategy */
222
if
(s->
use_frame_exp_strategy
) {
223
for
(ch = !s->
cpl_on
; ch <= s->fbw_channels; ch++)
224
put_bits
(&s->
pb
, 5, s->
frame_exp_strategy
[ch]);
225
}
else
{
226
for
(blk = 0; blk < s->
num_blocks
; blk++)
227
for
(ch = !s->
blocks
[blk].
cpl_in_use
; ch <= s->fbw_channels; ch++)
228
put_bits
(&s->
pb
, 2, s->
exp_strategy
[ch][blk]);
229
}
230
if
(s->
lfe_on
) {
231
for
(blk = 0; blk < s->
num_blocks
; blk++)
232
put_bits
(&s->
pb
, 1, s->
exp_strategy
[s->
lfe_channel
][blk]);
233
}
234
/* E-AC-3 to AC-3 converter exponent strategy (not optional when num blocks == 6) */
235
if
(s->
num_blocks
!= 6) {
236
put_bits
(&s->
pb
, 1, 0);
237
}
else
{
238
for
(ch = 1; ch <= s->
fbw_channels
; ch++) {
239
if
(s->
use_frame_exp_strategy
)
240
put_bits
(&s->
pb
, 5, s->
frame_exp_strategy
[ch]);
241
else
242
put_bits
(&s->
pb
, 5, 0);
243
}
244
}
245
/* snr offsets */
246
put_bits
(&s->
pb
, 6, s->
coarse_snr_offset
);
247
put_bits
(&s->
pb
, 4, s->
fine_snr_offset
[1]);
248
/* block start info */
249
if
(s->
num_blocks
> 1)
250
put_bits
(&s->
pb
, 1, 0);
251
}
252
253
254
#if CONFIG_EAC3_ENCODER
255
AVCodec
ff_eac3_encoder = {
256
.
name
=
"eac3"
,
257
.long_name =
NULL_IF_CONFIG_SMALL
(
"ATSC A/52 E-AC-3"
),
258
.type =
AVMEDIA_TYPE_AUDIO
,
259
.id =
AV_CODEC_ID_EAC3
,
260
.priv_data_size =
sizeof
(
AC3EncodeContext
),
261
.
init
=
ff_ac3_encode_init
,
262
.encode2 =
ff_ac3_float_encode_frame
,
263
.
close
=
ff_ac3_encode_close
,
264
.
sample_fmts
= (
const
enum
AVSampleFormat
[]){
AV_SAMPLE_FMT_FLTP
,
265
AV_SAMPLE_FMT_NONE
},
266
.priv_class = &
eac3enc_class
,
267
.channel_layouts =
ff_ac3_channel_layouts
,
268
.defaults =
ac3_defaults
,
269
};
270
#endif
Generated on Sun Mar 23 2014 23:49:54 for FFmpeg by
1.8.2