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