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
ac3enc_float.c
Go to the documentation of this file.
1
/*
2
* The simplest AC-3 encoder
3
* Copyright (c) 2000 Fabrice Bellard
4
* Copyright (c) 2006-2010 Justin Ruggles <justin.ruggles@gmail.com>
5
* Copyright (c) 2006-2010 Prakash Punnoor <prakash@punnoor.de>
6
*
7
* This file is part of FFmpeg.
8
*
9
* FFmpeg is free software; you can redistribute it and/or
10
* modify it under the terms of the GNU Lesser General Public
11
* License as published by the Free Software Foundation; either
12
* version 2.1 of the License, or (at your option) any later version.
13
*
14
* FFmpeg is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
17
* Lesser General Public License for more details.
18
*
19
* You should have received a copy of the GNU Lesser General Public
20
* License along with FFmpeg; if not, write to the Free Software
21
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22
*/
23
24
/**
25
* @file
26
* floating-point AC-3 encoder.
27
*/
28
29
#define CONFIG_AC3ENC_FLOAT 1
30
#include "
internal.h
"
31
#include "
audiodsp.h
"
32
#include "
ac3enc.h
"
33
#include "
eac3enc.h
"
34
#include "
kbdwin.h
"
35
36
37
#define AC3ENC_TYPE AC3ENC_TYPE_AC3
38
#include "
ac3enc_opts_template.c
"
39
static
const
AVClass
ac3enc_class
= {
40
.
class_name
=
"AC-3 Encoder"
,
41
.item_name =
av_default_item_name
,
42
.option =
ac3_options
,
43
.version =
LIBAVUTIL_VERSION_INT
,
44
};
45
46
#include "
ac3enc_template.c
"
47
48
49
/**
50
* Finalize MDCT and free allocated memory.
51
*
52
* @param s AC-3 encoder private context
53
*/
54
av_cold
void
ff_ac3_float_mdct_end
(
AC3EncodeContext
*
s
)
55
{
56
ff_mdct_end
(&s->
mdct
);
57
av_freep
(&s->
mdct_window
);
58
}
59
60
61
/**
62
* Initialize MDCT tables.
63
*
64
* @param s AC-3 encoder private context
65
* @return 0 on success, negative error code on failure
66
*/
67
av_cold
int
ff_ac3_float_mdct_init
(
AC3EncodeContext
*
s
)
68
{
69
float
*window;
70
int
i,
n
, n2;
71
72
n = 1 << 9;
73
n2 = n >> 1;
74
75
window =
av_malloc_array
(n,
sizeof
(*window));
76
if
(!window) {
77
av_log
(s->
avctx
,
AV_LOG_ERROR
,
"Cannot allocate memory.\n"
);
78
return
AVERROR
(ENOMEM);
79
}
80
ff_kbd_window_init
(window, 5.0, n2);
81
for
(i = 0; i < n2; i++)
82
window[n-1-i] = window[i];
83
s->
mdct_window
= window;
84
85
return
ff_mdct_init
(&s->
mdct
, 9, 0, -2.0 / n);
86
}
87
88
89
/*
90
* Normalize the input samples.
91
* Not needed for the floating-point encoder.
92
*/
93
static
int
normalize_samples
(
AC3EncodeContext
*
s
)
94
{
95
return
0;
96
}
97
98
99
/*
100
* Scale MDCT coefficients from float to 24-bit fixed-point.
101
*/
102
static
void
scale_coefficients
(
AC3EncodeContext
*
s
)
103
{
104
int
chan_size =
AC3_MAX_COEFS
* s->
num_blocks
;
105
int
cpl = s->
cpl_on
;
106
s->
ac3dsp
.
float_to_fixed24
(s->
fixed_coef_buffer
+ (chan_size * !cpl),
107
s->
mdct_coef_buffer
+ (chan_size * !cpl),
108
chan_size * (s->
channels
+ cpl));
109
}
110
111
static
void
sum_square_butterfly
(
AC3EncodeContext
*
s
,
float
sum[4],
112
const
float
*coef0,
const
float
*coef1,
113
int
len
)
114
{
115
s->
ac3dsp
.
sum_square_butterfly_float
(sum, coef0, coef1, len);
116
}
117
118
/*
119
* Clip MDCT coefficients to allowable range.
120
*/
121
static
void
clip_coefficients
(
AudioDSPContext
*
adsp
,
float
*coef,
122
unsigned
int
len
)
123
{
124
adsp->
vector_clipf
(coef, coef,
COEF_MIN
,
COEF_MAX
, len);
125
}
126
127
128
/*
129
* Calculate a single coupling coordinate.
130
*/
131
static
CoefType
calc_cpl_coord
(
CoefSumType
energy_ch,
CoefSumType
energy_cpl)
132
{
133
float
coord = 0.125;
134
if
(energy_cpl > 0)
135
coord *= sqrtf(energy_ch / energy_cpl);
136
return
FFMIN
(coord,
COEF_MAX
);
137
}
138
139
av_cold
int
ff_ac3_float_encode_init
(
AVCodecContext
*
avctx
)
140
{
141
AC3EncodeContext
*
s
= avctx->
priv_data
;
142
s->
fdsp
=
avpriv_float_dsp_alloc
(avctx->
flags
&
CODEC_FLAG_BITEXACT
);
143
if
(!s->
fdsp
)
144
return
AVERROR
(ENOMEM);
145
return
ff_ac3_encode_init
(avctx);
146
}
147
148
AVCodec
ff_ac3_encoder
= {
149
.
name
=
"ac3"
,
150
.long_name =
NULL_IF_CONFIG_SMALL
(
"ATSC A/52A (AC-3)"
),
151
.type =
AVMEDIA_TYPE_AUDIO
,
152
.id =
AV_CODEC_ID_AC3
,
153
.priv_data_size =
sizeof
(
AC3EncodeContext
),
154
.
init
=
ff_ac3_float_encode_init
,
155
.encode2 =
ff_ac3_float_encode_frame
,
156
.close =
ff_ac3_encode_close
,
157
.
sample_fmts
= (
const
enum
AVSampleFormat
[]){
AV_SAMPLE_FMT_FLTP
,
158
AV_SAMPLE_FMT_NONE
},
159
.priv_class = &
ac3enc_class
,
160
.channel_layouts =
ff_ac3_channel_layouts
,
161
.defaults =
ac3_defaults
,
162
};
Generated on Sun Mar 8 2015 02:34:47 for FFmpeg by
1.8.2