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