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