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