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 
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;
46  lame_global_flags *gfp;
50  int reservoir;
52  float *samples_flt[2];
55 } LAMEContext;
56 
57 
59 {
60  if (!s->buffer || s->buffer_size - s->buffer_index < BUFFER_SIZE) {
61  uint8_t *tmp;
62  int new_size = s->buffer_index + 2 * BUFFER_SIZE;
63 
64  av_dlog(s->avctx, "resizing output buffer: %d -> %d\n", s->buffer_size,
65  new_size);
66  tmp = av_realloc(s->buffer, new_size);
67  if (!tmp) {
68  av_freep(&s->buffer);
69  s->buffer_size = s->buffer_index = 0;
70  return AVERROR(ENOMEM);
71  }
72  s->buffer = tmp;
73  s->buffer_size = new_size;
74  }
75  return 0;
76 }
77 
79 {
80  LAMEContext *s = avctx->priv_data;
81 
82  av_freep(&s->samples_flt[0]);
83  av_freep(&s->samples_flt[1]);
84  av_freep(&s->buffer);
85 
87 
88  lame_close(s->gfp);
89  return 0;
90 }
91 
93 {
94  LAMEContext *s = avctx->priv_data;
95  int ret;
96 
97  s->avctx = avctx;
98 
99  /* initialize LAME and get defaults */
100  if ((s->gfp = lame_init()) == NULL)
101  return AVERROR(ENOMEM);
102 
103 
104  lame_set_num_channels(s->gfp, avctx->channels);
105  lame_set_mode(s->gfp, avctx->channels > 1 ? s->joint_stereo ? JOINT_STEREO : STEREO : MONO);
106 
107  /* sample rate */
108  lame_set_in_samplerate (s->gfp, avctx->sample_rate);
109  lame_set_out_samplerate(s->gfp, avctx->sample_rate);
110 
111  /* algorithmic quality */
113  lame_set_quality(s->gfp, 5);
114  else
115  lame_set_quality(s->gfp, avctx->compression_level);
116 
117  /* rate control */
118  if (avctx->flags & CODEC_FLAG_QSCALE) {
119  lame_set_VBR(s->gfp, vbr_default);
120  lame_set_VBR_quality(s->gfp, avctx->global_quality / (float)FF_QP2LAMBDA);
121  } else {
122  if (avctx->bit_rate)
123  lame_set_brate(s->gfp, avctx->bit_rate / 1000);
124  }
125 
126  /* do not get a Xing VBR header frame from LAME */
127  lame_set_bWriteVbrTag(s->gfp,0);
128 
129  /* bit reservoir usage */
130  lame_set_disable_reservoir(s->gfp, !s->reservoir);
131 
132  /* set specified parameters */
133  if (lame_init_params(s->gfp) < 0) {
134  ret = -1;
135  goto error;
136  }
137 
138  /* get encoder delay */
139  avctx->delay = lame_get_encoder_delay(s->gfp) + 528 + 1;
140  ff_af_queue_init(avctx, &s->afq);
141 
142  avctx->frame_size = lame_get_framesize(s->gfp);
143 
144  /* allocate float sample buffers */
145  if (avctx->sample_fmt == AV_SAMPLE_FMT_FLTP) {
146  int ch;
147  for (ch = 0; ch < avctx->channels; ch++) {
148  s->samples_flt[ch] = av_malloc(avctx->frame_size *
149  sizeof(*s->samples_flt[ch]));
150  if (!s->samples_flt[ch]) {
151  ret = AVERROR(ENOMEM);
152  goto error;
153  }
154  }
155  }
156 
157  ret = realloc_buffer(s);
158  if (ret < 0)
159  goto error;
160 
162 
163  return 0;
164 error:
165  mp3lame_encode_close(avctx);
166  return ret;
167 }
168 
169 #define ENCODE_BUFFER(func, buf_type, buf_name) do { \
170  lame_result = func(s->gfp, \
171  (const buf_type *)buf_name[0], \
172  (const buf_type *)buf_name[1], frame->nb_samples, \
173  s->buffer + s->buffer_index, \
174  s->buffer_size - s->buffer_index); \
175 } while (0)
176 
178  const AVFrame *frame, int *got_packet_ptr)
179 {
180  LAMEContext *s = avctx->priv_data;
181  MPADecodeHeader hdr;
182  int len, ret, ch;
183  int lame_result;
184 
185  if (frame) {
186  switch (avctx->sample_fmt) {
187  case AV_SAMPLE_FMT_S16P:
188  ENCODE_BUFFER(lame_encode_buffer, int16_t, frame->data);
189  break;
190  case AV_SAMPLE_FMT_S32P:
191  ENCODE_BUFFER(lame_encode_buffer_int, int32_t, frame->data);
192  break;
193  case AV_SAMPLE_FMT_FLTP:
194  if (frame->linesize[0] < 4 * FFALIGN(frame->nb_samples, 8)) {
195  av_log(avctx, AV_LOG_ERROR, "inadequate AVFrame plane padding\n");
196  return AVERROR(EINVAL);
197  }
198  for (ch = 0; ch < avctx->channels; ch++) {
200  (const float *)frame->data[ch],
201  32768.0f,
202  FFALIGN(frame->nb_samples, 8));
203  }
204  ENCODE_BUFFER(lame_encode_buffer_float, float, s->samples_flt);
205  break;
206  default:
207  return AVERROR_BUG;
208  }
209  } else {
210  lame_result = lame_encode_flush(s->gfp, s->buffer + s->buffer_index,
211  s->buffer_size - s->buffer_index);
212  }
213  if (lame_result < 0) {
214  if (lame_result == -1) {
215  av_log(avctx, AV_LOG_ERROR,
216  "lame: output buffer too small (buffer index: %d, free bytes: %d)\n",
218  }
219  return -1;
220  }
221  s->buffer_index += lame_result;
222  ret = realloc_buffer(s);
223  if (ret < 0) {
224  av_log(avctx, AV_LOG_ERROR, "error reallocating output buffer\n");
225  return ret;
226  }
227 
228  /* add current frame to the queue */
229  if (frame) {
230  if ((ret = ff_af_queue_add(&s->afq, frame)) < 0)
231  return ret;
232  }
233 
234  /* Move 1 frame from the LAME buffer to the output packet, if available.
235  We have to parse the first frame header in the output buffer to
236  determine the frame size. */
237  if (s->buffer_index < 4)
238  return 0;
240  av_log(avctx, AV_LOG_ERROR, "free format output not supported\n");
241  return -1;
242  }
243  len = hdr.frame_size;
244  av_dlog(avctx, "in:%d packet-len:%d index:%d\n", avctx->frame_size, len,
245  s->buffer_index);
246  if (len <= s->buffer_index) {
247  if ((ret = ff_alloc_packet2(avctx, avpkt, len)) < 0)
248  return ret;
249  memcpy(avpkt->data, s->buffer, len);
250  s->buffer_index -= len;
251  memmove(s->buffer, s->buffer + len, s->buffer_index);
252 
253  /* Get the next frame pts/duration */
254  ff_af_queue_remove(&s->afq, avctx->frame_size, &avpkt->pts,
255  &avpkt->duration);
256 
257  avpkt->size = len;
258  *got_packet_ptr = 1;
259  }
260  return 0;
261 }
262 
263 #define OFFSET(x) offsetof(LAMEContext, x)
264 #define AE AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
265 static const AVOption options[] = {
266  { "reservoir", "Use bit reservoir.", OFFSET(reservoir), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, AE },
267  { "joint_stereo", "Use joint stereo.", OFFSET(joint_stereo), AV_OPT_TYPE_INT, { .i64 = 1 }, 0, 1, AE },
268  { NULL },
269 };
270 
271 static const AVClass libmp3lame_class = {
272  .class_name = "libmp3lame encoder",
273  .item_name = av_default_item_name,
274  .option = options,
275  .version = LIBAVUTIL_VERSION_INT,
276 };
277 
279  { "b", "0" },
280  { NULL },
281 };
282 
283 static const int libmp3lame_sample_rates[] = {
284  44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000, 0
285 };
286 
288  .name = "libmp3lame",
289  .type = AVMEDIA_TYPE_AUDIO,
290  .id = AV_CODEC_ID_MP3,
291  .priv_data_size = sizeof(LAMEContext),
293  .encode2 = mp3lame_encode_frame,
296  .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S32P,
300  .supported_samplerates = libmp3lame_sample_rates,
301  .channel_layouts = (const uint64_t[]) { AV_CH_LAYOUT_MONO,
303  0 },
304  .long_name = NULL_IF_CONFIG_SMALL("libmp3lame MP3 (MPEG audio layer 3)"),
305  .priv_class = &libmp3lame_class,
306  .defaults = libmp3lame_defaults,
307 };
static int mp3lame_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, const AVFrame *frame, int *got_packet_ptr)
Definition: libmp3lame.c:177
static const AVClass libmp3lame_class
Definition: libmp3lame.c:271
const char * s
Definition: avisynth_c.h:668
#define FF_COMPRESSION_DEFAULT
This structure describes decoded (raw) audio or video data.
Definition: frame.h:76
AVOption.
Definition: opt.h:251
av_default_item_name
#define JOINT_STEREO
Definition: atrac3.c:51
static av_cold int mp3lame_encode_init(AVCodecContext *avctx)
Definition: libmp3lame.c:92
static av_cold int init(AVCodecContext *avctx)
Definition: avrndec.c:35
AudioFrameQueue afq
Definition: libmp3lame.c:53
static const int libmp3lame_sample_rates[]
Definition: libmp3lame.c:283
AVCodec ff_libmp3lame_encoder
Definition: libmp3lame.c:287
void * av_realloc(void *ptr, size_t size)
Allocate or reallocate a block of memory.
Definition: mem.c:141
av_dlog(ac->avr,"%d samples - audio_convert: %s to %s (%s)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt), use_generic?ac->func_descr_generic:ac->func_descr)
#define AV_CH_LAYOUT_STEREO
#define FFALIGN(x, a)
Definition: common.h:63
static av_cold int mp3lame_encode_close(AVCodecContext *avctx)
Definition: libmp3lame.c:78
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Definition: log.h:55
enum AVSampleFormat sample_fmt
audio sample format
uint8_t
#define av_cold
Definition: attributes.h:78
AVOptions.
int buffer_size
Definition: libmp3lame.c:49
#define AV_RB32
#define BUFFER_SIZE
Definition: libmp3lame.c:41
#define AE
Definition: libmp3lame.c:264
int reservoir
Definition: libmp3lame.c:50
uint8_t * data
int avpriv_mpegaudio_decode_header(MPADecodeHeader *s, uint32_t header)
#define CODEC_FLAG_BITEXACT
Use only bitexact stuff (except (I)DCT).
signed 32 bits, planar
Definition: samplefmt.h:59
int duration
Duration of this packet in AVStream->time_base units, 0 if unknown.
float, planar
Definition: samplefmt.h:60
frame
Definition: stft.m:14
uint8_t * buffer
Definition: libmp3lame.c:47
#define CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
#define CODEC_CAP_SMALL_LAST_FRAME
Codec can be fed a final frame with a smaller size.
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
preferred ID for decoding MPEG audio layer 1, 2 or 3
int flags
CODEC_FLAG_*.
#define CODEC_FLAG_QSCALE
Use fixed qscale.
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
const char * name
Name of the codec implementation.
static const AVOption options[]
Definition: libmp3lame.c:265
static const AVCodecDefault libmp3lame_defaults[]
Definition: libmp3lame.c:278
int ff_af_queue_add(AudioFrameQueue *afq, const AVFrame *f)
Add a frame to the queue.
external API header
#define STEREO
Definition: atrac3.c:52
static int realloc_buffer(LAMEContext *s)
Definition: libmp3lame.c:58
int bit_rate
the average bitrate
audio channel layout utility functions
ret
Definition: avfilter.c:821
int32_t
int joint_stereo
Definition: libmp3lame.c:51
int buffer_index
Definition: libmp3lame.c:48
AVCodecContext * avctx
Definition: libmp3lame.c:45
AVFloatDSPContext fdsp
Definition: libmp3lame.c:54
struct LAMEContext LAMEContext
LIBAVUTIL_VERSION_INT
Definition: eval.c:55
int ff_alloc_packet2(AVCodecContext *avctx, AVPacket *avpkt, int size)
Check AVPacket size and/or allocate data.
int frame_size
Number of samples per channel in an audio frame.
NULL
Definition: eval.c:55
int sample_rate
samples per second
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:101
main external API structure.
static void close(AVCodecParserContext *s)
Definition: h264_parser.c:375
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
Definition: error.h:50
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
Describe the class of an AVClass context structure.
Definition: log.h:50
#define MONO
Definition: cook.c:58
void(* vector_fmul_scalar)(float *dst, const float *src, float mul, int len)
Multiply a vector of floats by a scalar float.
Definition: float_dsp.h:69
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
int global_quality
Global quality for codecs which cannot change it per frame.
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:87
MPEG Audio header decoder.
common internal api header.
common internal and external API header
AVSampleFormat
Audio Sample Formats.
Definition: samplefmt.h:49
mpeg audio declarations for both encoder and decoder.
#define ENCODE_BUFFER(func, buf_type, buf_name)
Definition: libmp3lame.c:169
void ff_af_queue_init(AVCodecContext *avctx, AudioFrameQueue *afq)
Initialize AudioFrameQueue.
float * samples_flt[2]
Definition: libmp3lame.c:52
int len
void ff_af_queue_remove(AudioFrameQueue *afq, int nb_samples, int64_t *pts, int *duration)
Remove frame(s) from the queue.
int channels
number of audio channels
#define FF_QP2LAMBDA
factor to convert from H.263 QP to lambda
Definition: avutil.h:169
void ff_af_queue_close(AudioFrameQueue *afq)
Close AudioFrameQueue.
#define OFFSET(x)
Definition: libmp3lame.c:263
signed 16 bits, planar
Definition: samplefmt.h:58
static enum AVSampleFormat sample_fmts[]
Definition: adpcmenc.c:700
void avpriv_float_dsp_init(AVFloatDSPContext *fdsp, int bit_exact)
Initialize a float DSP context.
Definition: float_dsp.c:118
lame_global_flags * gfp
Definition: libmp3lame.c:46
#define AV_CH_LAYOUT_MONO
This structure stores compressed data.
int delay
Codec delay.
int nb_samples
number of audio samples (per channel) described by this frame
Definition: frame.h:127
int64_t pts
Presentation timestamp in AVStream->time_base units; the time at which the decompressed packet will b...