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
libmp3lame.c
Go to the documentation of this file.
1
/*
2
* Interface to libmp3lame for mp3 encoding
3
* Copyright (c) 2002 Lennert Buytenhek <buytenh@gnu.org>
4
*
5
* This file is part of FFmpeg.
6
*
7
* FFmpeg 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
* FFmpeg 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 FFmpeg; 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
* Interface to libmp3lame for mp3 encoding.
25
*/
26
27
#include <lame/lame.h>
28
29
#include "
libavutil/channel_layout.h
"
30
#include "
libavutil/common.h
"
31
#include "
libavutil/float_dsp.h
"
32
#include "
libavutil/intreadwrite.h
"
33
#include "
libavutil/log.h
"
34
#include "
libavutil/opt.h
"
35
#include "
avcodec.h
"
36
#include "
audio_frame_queue.h
"
37
#include "
internal.h
"
38
#include "
mpegaudio.h
"
39
#include "
mpegaudiodecheader.h
"
40
41
#define BUFFER_SIZE (7200 + 2 * MPA_FRAME_SIZE + MPA_FRAME_SIZE / 4+1000) // FIXME: Buffer size to small? Adding 1000 to make up for it.
42
43
typedef
struct
LAMEContext
{
44
AVClass
*
class
;
45
AVCodecContext
*
avctx
;
46
lame_global_flags *
gfp
;
47
uint8_t
*
buffer
;
48
int
buffer_index
;
49
int
buffer_size
;
50
int
reservoir
;
51
float
*
samples_flt
[2];
52
AudioFrameQueue
afq
;
53
AVFloatDSPContext
fdsp
;
54
}
LAMEContext
;
55
56
57
static
int
realloc_buffer
(
LAMEContext
*s)
58
{
59
if
(!s->
buffer
|| s->
buffer_size
- s->
buffer_index
<
BUFFER_SIZE
) {
60
uint8_t
*tmp;
61
int
new_size = s->
buffer_index
+ 2 *
BUFFER_SIZE
;
62
63
av_dlog
(s->
avctx
,
"resizing output buffer: %d -> %d\n"
, s->
buffer_size
,
64
new_size);
65
tmp =
av_realloc
(s->
buffer
, new_size);
66
if
(!tmp) {
67
av_freep
(&s->
buffer
);
68
s->
buffer_size
= s->
buffer_index
= 0;
69
return
AVERROR
(ENOMEM);
70
}
71
s->
buffer
= tmp;
72
s->
buffer_size
= new_size;
73
}
74
return
0;
75
}
76
77
static
av_cold
int
mp3lame_encode_close
(
AVCodecContext
*avctx)
78
{
79
LAMEContext
*s = avctx->
priv_data
;
80
81
#if FF_API_OLD_ENCODE_AUDIO
82
av_freep
(&avctx->
coded_frame
);
83
#endif
84
av_freep
(&s->
samples_flt
[0]);
85
av_freep
(&s->
samples_flt
[1]);
86
av_freep
(&s->
buffer
);
87
88
ff_af_queue_close
(&s->
afq
);
89
90
lame_close(s->
gfp
);
91
return
0;
92
}
93
94
static
av_cold
int
mp3lame_encode_init
(
AVCodecContext
*avctx)
95
{
96
LAMEContext
*s = avctx->
priv_data
;
97
int
ret;
98
99
s->
avctx
= avctx;
100
101
/* initialize LAME and get defaults */
102
if
((s->
gfp
= lame_init()) ==
NULL
)
103
return
AVERROR
(ENOMEM);
104
105
106
lame_set_num_channels(s->
gfp
, avctx->
channels
);
107
lame_set_mode(s->
gfp
, avctx->
channels
> 1 ?
JOINT_STEREO
:
MONO
);
108
109
/* sample rate */
110
lame_set_in_samplerate (s->
gfp
, avctx->
sample_rate
);
111
lame_set_out_samplerate(s->
gfp
, avctx->
sample_rate
);
112
113
/* algorithmic quality */
114
if
(avctx->
compression_level
==
FF_COMPRESSION_DEFAULT
)
115
lame_set_quality(s->
gfp
, 5);
116
else
117
lame_set_quality(s->
gfp
, avctx->
compression_level
);
118
119
/* rate control */
120
if
(avctx->
flags
&
CODEC_FLAG_QSCALE
) {
121
lame_set_VBR(s->
gfp
, vbr_default);
122
lame_set_VBR_quality(s->
gfp
, avctx->
global_quality
/ (
float
)
FF_QP2LAMBDA
);
123
}
else
{
124
if
(avctx->
bit_rate
)
125
lame_set_brate(s->
gfp
, avctx->
bit_rate
/ 1000);
126
}
127
128
/* do not get a Xing VBR header frame from LAME */
129
lame_set_bWriteVbrTag(s->
gfp
,0);
130
131
/* bit reservoir usage */
132
lame_set_disable_reservoir(s->
gfp
, !s->
reservoir
);
133
134
/* set specified parameters */
135
if
(lame_init_params(s->
gfp
) < 0) {
136
ret = -1;
137
goto
error;
138
}
139
140
/* get encoder delay */
141
avctx->
delay
= lame_get_encoder_delay(s->
gfp
) + 528 + 1;
142
ff_af_queue_init
(avctx, &s->
afq
);
143
144
avctx->
frame_size
= lame_get_framesize(s->
gfp
);
145
146
#if FF_API_OLD_ENCODE_AUDIO
147
avctx->
coded_frame
=
avcodec_alloc_frame
();
148
if
(!avctx->
coded_frame
) {
149
ret =
AVERROR
(ENOMEM);
150
goto
error;
151
}
152
#endif
153
154
/* allocate float sample buffers */
155
if
(avctx->
sample_fmt
==
AV_SAMPLE_FMT_FLTP
) {
156
int
ch;
157
for
(ch = 0; ch < avctx->
channels
; ch++) {
158
s->
samples_flt
[ch] =
av_malloc
(avctx->
frame_size
*
159
sizeof
(*s->
samples_flt
[ch]));
160
if
(!s->
samples_flt
[ch]) {
161
ret =
AVERROR
(ENOMEM);
162
goto
error;
163
}
164
}
165
}
166
167
ret =
realloc_buffer
(s);
168
if
(ret < 0)
169
goto
error;
170
171
avpriv_float_dsp_init
(&s->
fdsp
, avctx->
flags
&
CODEC_FLAG_BITEXACT
);
172
173
return
0;
174
error:
175
mp3lame_encode_close
(avctx);
176
return
ret;
177
}
178
179
#define ENCODE_BUFFER(func, buf_type, buf_name) do { \
180
lame_result = func(s->gfp, \
181
(const buf_type *)buf_name[0], \
182
(const buf_type *)buf_name[1], frame->nb_samples, \
183
s->buffer + s->buffer_index, \
184
s->buffer_size - s->buffer_index); \
185
} while (0)
186
187
static
int
mp3lame_encode_frame
(
AVCodecContext
*avctx,
AVPacket
*avpkt,
188
const
AVFrame
*
frame
,
int
*got_packet_ptr)
189
{
190
LAMEContext
*s = avctx->
priv_data
;
191
MPADecodeHeader
hdr;
192
int
len
, ret, ch;
193
int
lame_result;
194
195
if
(frame) {
196
switch
(avctx->
sample_fmt
) {
197
case
AV_SAMPLE_FMT_S16P
:
198
ENCODE_BUFFER
(lame_encode_buffer, int16_t, frame->
data
);
199
break
;
200
case
AV_SAMPLE_FMT_S32P
:
201
ENCODE_BUFFER
(lame_encode_buffer_int,
int32_t
, frame->
data
);
202
break
;
203
case
AV_SAMPLE_FMT_FLTP
:
204
if
(frame->
linesize
[0] < 4 *
FFALIGN
(frame->
nb_samples
, 8)) {
205
av_log
(avctx,
AV_LOG_ERROR
,
"inadequate AVFrame plane padding\n"
);
206
return
AVERROR
(EINVAL);
207
}
208
for
(ch = 0; ch < avctx->
channels
; ch++) {
209
s->
fdsp
.
vector_fmul_scalar
(s->
samples_flt
[ch],
210
(
const
float
*)frame->
data
[ch],
211
32768.0f,
212
FFALIGN
(frame->
nb_samples
, 8));
213
}
214
ENCODE_BUFFER
(lame_encode_buffer_float,
float
, s->
samples_flt
);
215
break
;
216
default
:
217
return
AVERROR_BUG
;
218
}
219
}
else
{
220
lame_result = lame_encode_flush(s->
gfp
, s->
buffer
+ s->
buffer_index
,
221
s->
buffer_size
- s->
buffer_index
);
222
}
223
if
(lame_result < 0) {
224
if
(lame_result == -1) {
225
av_log
(avctx,
AV_LOG_ERROR
,
226
"lame: output buffer too small (buffer index: %d, free bytes: %d)\n"
,
227
s->
buffer_index
, s->
buffer_size
- s->
buffer_index
);
228
}
229
return
-1;
230
}
231
s->
buffer_index
+= lame_result;
232
ret =
realloc_buffer
(s);
233
if
(ret < 0) {
234
av_log
(avctx,
AV_LOG_ERROR
,
"error reallocating output buffer\n"
);
235
return
ret;
236
}
237
238
/* add current frame to the queue */
239
if
(frame) {
240
if
((ret =
ff_af_queue_add
(&s->
afq
, frame)) < 0)
241
return
ret;
242
}
243
244
/* Move 1 frame from the LAME buffer to the output packet, if available.
245
We have to parse the first frame header in the output buffer to
246
determine the frame size. */
247
if
(s->
buffer_index
< 4)
248
return
0;
249
if
(
avpriv_mpegaudio_decode_header
(&hdr,
AV_RB32
(s->
buffer
))) {
250
av_log
(avctx,
AV_LOG_ERROR
,
"free format output not supported\n"
);
251
return
-1;
252
}
253
len = hdr.frame_size;
254
av_dlog
(avctx,
"in:%d packet-len:%d index:%d\n"
, avctx->
frame_size
, len,
255
s->
buffer_index
);
256
if
(len <= s->buffer_index) {
257
if
((ret =
ff_alloc_packet2
(avctx, avpkt, len)))
258
return
ret;
259
memcpy(avpkt->
data
, s->
buffer
, len);
260
s->
buffer_index
-=
len
;
261
memmove(s->
buffer
, s->
buffer
+ len, s->
buffer_index
);
262
263
/* Get the next frame pts/duration */
264
ff_af_queue_remove
(&s->
afq
, avctx->
frame_size
, &avpkt->
pts
,
265
&avpkt->
duration
);
266
267
avpkt->
size
=
len
;
268
*got_packet_ptr = 1;
269
}
270
return
0;
271
}
272
273
#define OFFSET(x) offsetof(LAMEContext, x)
274
#define AE AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
275
static
const
AVOption
options
[] = {
276
{
"reservoir"
,
"Use bit reservoir."
,
OFFSET
(reservoir),
AV_OPT_TYPE_INT
, { .i64 = 1 }, 0, 1,
AE
},
277
{
NULL
},
278
};
279
280
static
const
AVClass
libmp3lame_class
= {
281
.
class_name
=
"libmp3lame encoder"
,
282
.item_name =
av_default_item_name
,
283
.option =
options
,
284
.version =
LIBAVUTIL_VERSION_INT
,
285
};
286
287
static
const
AVCodecDefault
libmp3lame_defaults
[] = {
288
{
"b"
,
"0"
},
289
{
NULL
},
290
};
291
292
static
const
int
libmp3lame_sample_rates
[] = {
293
44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000, 0
294
};
295
296
AVCodec
ff_libmp3lame_encoder
= {
297
.
name
=
"libmp3lame"
,
298
.type =
AVMEDIA_TYPE_AUDIO
,
299
.id =
AV_CODEC_ID_MP3
,
300
.priv_data_size =
sizeof
(
LAMEContext
),
301
.
init
=
mp3lame_encode_init
,
302
.encode2 =
mp3lame_encode_frame
,
303
.
close
=
mp3lame_encode_close
,
304
.capabilities =
CODEC_CAP_DELAY
|
CODEC_CAP_SMALL_LAST_FRAME
,
305
.
sample_fmts
= (
const
enum
AVSampleFormat
[]) {
AV_SAMPLE_FMT_S32P
,
306
AV_SAMPLE_FMT_FLTP
,
307
AV_SAMPLE_FMT_S16P
,
308
AV_SAMPLE_FMT_NONE
},
309
.supported_samplerates =
libmp3lame_sample_rates
,
310
.channel_layouts = (
const
uint64_t[]) {
AV_CH_LAYOUT_MONO
,
311
AV_CH_LAYOUT_STEREO
,
312
0 },
313
.long_name =
NULL_IF_CONFIG_SMALL
(
"libmp3lame MP3 (MPEG audio layer 3)"
),
314
.priv_class = &
libmp3lame_class
,
315
.defaults =
libmp3lame_defaults
,
316
};
Generated on Sat May 25 2013 03:58:36 for FFmpeg by
1.8.2