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
ac3enc_fixed.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
* fixed-point AC-3 encoder.
27
*/
28
29
#define CONFIG_FFT_FLOAT 0
30
#undef CONFIG_AC3ENC_FLOAT
31
#include "
internal.h
"
32
#include "
ac3enc.h
"
33
#include "
eac3enc.h
"
34
35
#define AC3ENC_TYPE AC3ENC_TYPE_AC3_FIXED
36
#include "
ac3enc_opts_template.c
"
37
38
static
const
AVClass
ac3enc_class
= {
39
.
class_name
=
"Fixed-Point AC-3 Encoder"
,
40
.item_name =
av_default_item_name
,
41
.option =
ac3_options
,
42
.version =
LIBAVUTIL_VERSION_INT
,
43
};
44
45
#include "
ac3enc_template.c
"
46
47
48
/**
49
* Finalize MDCT and free allocated memory.
50
*
51
* @param s AC-3 encoder private context
52
*/
53
av_cold
void
AC3_NAME
(
mdct_end
)(
AC3EncodeContext
*s)
54
{
55
ff_mdct_end
(&s->mdct);
56
}
57
58
59
/**
60
* Initialize MDCT tables.
61
*
62
* @param s AC-3 encoder private context
63
* @return 0 on success, negative error code on failure
64
*/
65
av_cold
int
AC3_NAME
(
mdct_init
)(
AC3EncodeContext
*s)
66
{
67
int
ret =
ff_mdct_init
(&s->mdct, 9, 0, -1.0);
68
s->mdct_window =
ff_ac3_window
;
69
return
ret;
70
}
71
72
73
/*
74
* Apply KBD window to input samples prior to MDCT.
75
*/
76
static
void
apply_window
(
void
*
dsp
, int16_t *output,
const
int16_t *input,
77
const
int16_t *window,
unsigned
int
len
)
78
{
79
DSPContext
*dsp0 =
dsp
;
80
dsp0->
apply_window_int16
(output, input, window, len);
81
}
82
83
84
/*
85
* Normalize the input samples to use the maximum available precision.
86
* This assumes signed 16-bit input samples.
87
*/
88
static
int
normalize_samples
(
AC3EncodeContext
*s)
89
{
90
int
v = s->
ac3dsp
.
ac3_max_msb_abs_int16
(s->
windowed_samples
,
AC3_WINDOW_SIZE
);
91
v = 14 -
av_log2
(v);
92
if
(v > 0)
93
s->
ac3dsp
.
ac3_lshift_int16
(s->
windowed_samples
,
AC3_WINDOW_SIZE
, v);
94
/* +6 to right-shift from 31-bit to 25-bit */
95
return
v + 6;
96
}
97
98
99
/*
100
* Scale MDCT coefficients to 25-bit signed fixed-point.
101
*/
102
static
void
scale_coefficients
(
AC3EncodeContext
*s)
103
{
104
int
blk
, ch;
105
106
for
(blk = 0; blk < s->
num_blocks
; blk++) {
107
AC3Block
*
block
= &s->
blocks
[
blk
];
108
for
(ch = 1; ch <= s->
channels
; ch++) {
109
s->
ac3dsp
.
ac3_rshift_int32
(block->
mdct_coef
[ch],
AC3_MAX_COEFS
,
110
block->
coeff_shift
[ch]);
111
}
112
}
113
}
114
115
static
void
sum_square_butterfly
(
AC3EncodeContext
*s, int64_t sum[4],
116
const
int32_t
*coef0,
const
int32_t
*coef1,
117
int
len
)
118
{
119
s->
ac3dsp
.
sum_square_butterfly_int32
(sum, coef0, coef1, len);
120
}
121
122
/*
123
* Clip MDCT coefficients to allowable range.
124
*/
125
static
void
clip_coefficients
(
DSPContext
*
dsp
,
int32_t
*coef,
unsigned
int
len
)
126
{
127
dsp->
vector_clip_int32
(coef, coef,
COEF_MIN
,
COEF_MAX
, len);
128
}
129
130
131
/*
132
* Calculate a single coupling coordinate.
133
*/
134
static
CoefType
calc_cpl_coord
(
CoefSumType
energy_ch,
CoefSumType
energy_cpl)
135
{
136
if
(energy_cpl <=
COEF_MAX
) {
137
return
1048576;
138
}
else
{
139
uint64_t coord = energy_ch / (energy_cpl >> 24);
140
uint32_t coord32 =
FFMIN
(coord, 1073741824);
141
coord32 =
ff_sqrt
(coord32) << 9;
142
return
FFMIN
(coord32,
COEF_MAX
);
143
}
144
}
145
146
147
static
av_cold
int
ac3_fixed_encode_init
(
AVCodecContext
*
avctx
)
148
{
149
AC3EncodeContext
*s = avctx->
priv_data
;
150
s->
fixed_point
= 1;
151
return
ff_ac3_encode_init
(avctx);
152
}
153
154
155
AVCodec
ff_ac3_fixed_encoder
= {
156
.
name
=
"ac3_fixed"
,
157
.type =
AVMEDIA_TYPE_AUDIO
,
158
.id =
AV_CODEC_ID_AC3
,
159
.priv_data_size =
sizeof
(
AC3EncodeContext
),
160
.
init
=
ac3_fixed_encode_init
,
161
.encode2 =
ff_ac3_fixed_encode_frame
,
162
.
close
=
ff_ac3_encode_close
,
163
.
sample_fmts
= (
const
enum
AVSampleFormat
[]){
AV_SAMPLE_FMT_S16P
,
164
AV_SAMPLE_FMT_NONE
},
165
.long_name =
NULL_IF_CONFIG_SMALL
(
"ATSC A/52A (AC-3)"
),
166
.priv_class = &
ac3enc_class
,
167
.channel_layouts =
ff_ac3_channel_layouts
,
168
.defaults =
ac3_defaults
,
169
};
Generated on Sat May 25 2013 03:58:30 for FFmpeg by
1.8.2