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 "codec_internal.h" 38#include "encode.h" 39#include "mpegaudio.h" 40#include "mpegaudiodecheader.h" 41 42#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. 43 44typedef struct LAMEContext { 45 AVClass *class; 46 AVCodecContext *avctx; 47 lame_global_flags *gfp; 48 uint8_t *buffer; 49 int buffer_index; 50 int buffer_size; 51 int reservoir; 52 int joint_stereo; 53 int abr; 54 int delay_sent; 55 float *samples_flt[2]; 56 AudioFrameQueue afq; 57 AVFloatDSPContext *fdsp; 58} LAMEContext; 59 60 61static int realloc_buffer(LAMEContext *s) 62{ 63 if (!s->buffer || s->buffer_size - s->buffer_index < BUFFER_SIZE) { 64 int new_size = s->buffer_index + 2 * BUFFER_SIZE, err; 65 66 ff_dlog(s->avctx, "resizing output buffer: %d -> %d\n", s->buffer_size, 67 new_size); 68 if ((err = av_reallocp(&s->buffer, new_size)) < 0) { 69 s->buffer_size = s->buffer_index = 0; 70 return err; 71 } 72 s->buffer_size = new_size; 73 } 74 return 0; 75} 76 77static av_cold int mp3lame_encode_close(AVCodecContext *avctx) 78{ 79 LAMEContext *s = avctx->priv_data; 80 81 av_freep(&s->samples_flt[0]); 82 av_freep(&s->samples_flt[1]); 83 av_freep(&s->buffer); 84 av_freep(&s->fdsp); 85 86 ff_af_queue_close(&s->afq); 87 88 lame_close(s->gfp); 89 return 0; 90} 91 92static av_cold int mp3lame_encode_init(AVCodecContext *avctx) 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())) 101 return AVERROR(ENOMEM); 102 103 104 lame_set_num_channels(s->gfp, avctx->ch_layout.nb_channels); 105 lame_set_mode(s->gfp, avctx->ch_layout.nb_channels > 1 ? 106 s->joint_stereo ? JOINT_STEREO : STEREO : MONO); 107 108 /* sample rate */ 109 lame_set_in_samplerate (s->gfp, avctx->sample_rate); 110 lame_set_out_samplerate(s->gfp, avctx->sample_rate); 111 112 /* algorithmic quality */ 113 if (avctx->compression_level != FF_COMPRESSION_DEFAULT) 114 lame_set_quality(s->gfp, avctx->compression_level); 115 116 /* rate control */ 117 if (avctx->flags & AV_CODEC_FLAG_QSCALE) { // VBR 118 lame_set_VBR(s->gfp, vbr_default); 119 lame_set_VBR_quality(s->gfp, avctx->global_quality / (float)FF_QP2LAMBDA); 120 } else { 121 if (avctx->bit_rate) { 122 if (s->abr) { // ABR 123 lame_set_VBR(s->gfp, vbr_abr); 124 lame_set_VBR_mean_bitrate_kbps(s->gfp, avctx->bit_rate / 1000); 125 } else // CBR 126 lame_set_brate(s->gfp, avctx->bit_rate / 1000); 127 } 128 } 129 130 /* lowpass cutoff frequency */ 131 if (avctx->cutoff) 132 lame_set_lowpassfreq(s->gfp, avctx->cutoff); 133 134 /* do not get a Xing VBR header frame from LAME */ 135 lame_set_bWriteVbrTag(s->gfp,0); 136 137 /* bit reservoir usage */ 138 lame_set_disable_reservoir(s->gfp, !s->reservoir); 139 140 /* set specified parameters */ 141 if (lame_init_params(s->gfp) < 0) { 142 ret = AVERROR_EXTERNAL; 143 goto error; 144 } 145 146 /* get encoder delay */ 147 avctx->initial_padding = lame_get_encoder_delay(s->gfp) + 528 + 1; 148 ff_af_queue_init(avctx, &s->afq); 149 150 avctx->frame_size = lame_get_framesize(s->gfp); 151 152 /* allocate float sample buffers */ 153 if (avctx->sample_fmt == AV_SAMPLE_FMT_FLTP) { 154 int ch; 155 for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++) { 156 s->samples_flt[ch] = av_malloc_array(avctx->frame_size, 157 sizeof(*s->samples_flt[ch])); 158 if (!s->samples_flt[ch]) { 159 ret = AVERROR(ENOMEM); 160 goto error; 161 } 162 } 163 } 164 165 ret = realloc_buffer(s); 166 if (ret < 0) 167 goto error; 168 169 s->fdsp = avpriv_float_dsp_alloc(avctx->flags & AV_CODEC_FLAG_BITEXACT); 170 if (!s->fdsp) { 171 ret = AVERROR(ENOMEM); 172 goto error; 173 } 174 175 176 return 0; 177error: 178 mp3lame_encode_close(avctx); 179 return ret; 180} 181 182#define ENCODE_BUFFER(func, buf_type, buf_name) do { \ 183 lame_result = func(s->gfp, \ 184 (const buf_type *)buf_name[0], \ 185 (const buf_type *)buf_name[1], frame->nb_samples, \ 186 s->buffer + s->buffer_index, \ 187 s->buffer_size - s->buffer_index); \ 188} while (0) 189 190static int mp3lame_encode_frame(AVCodecContext *avctx, AVPacket *avpkt, 191 const AVFrame *frame, int *got_packet_ptr) 192{ 193 LAMEContext *s = avctx->priv_data; 194 MPADecodeHeader hdr; 195 int len, ret, ch, discard_padding; 196 int lame_result; 197 uint32_t h; 198 199 if (frame) { 200 switch (avctx->sample_fmt) { 201 case AV_SAMPLE_FMT_S16P: 202 ENCODE_BUFFER(lame_encode_buffer, int16_t, frame->data); 203 break; 204 case AV_SAMPLE_FMT_S32P: 205 ENCODE_BUFFER(lame_encode_buffer_int, int32_t, frame->data); 206 break; 207 case AV_SAMPLE_FMT_FLTP: 208 if (frame->linesize[0] < 4 * FFALIGN(frame->nb_samples, 8)) { 209 av_log(avctx, AV_LOG_ERROR, "inadequate AVFrame plane padding\n"); 210 return AVERROR(EINVAL); 211 } 212 for (ch = 0; ch < avctx->ch_layout.nb_channels; ch++) { 213 s->fdsp->vector_fmul_scalar(s->samples_flt[ch], 214 (const float *)frame->data[ch], 215 32768.0f, 216 FFALIGN(frame->nb_samples, 8)); 217 } 218 ENCODE_BUFFER(lame_encode_buffer_float, float, s->samples_flt); 219 break; 220 default: 221 return AVERROR_BUG; 222 } 223 } else if (!s->afq.frame_alloc) { 224 lame_result = 0; 225 } else { 226 lame_result = lame_encode_flush(s->gfp, s->buffer + s->buffer_index, 227 s->buffer_size - s->buffer_index); 228 } 229 if (lame_result < 0) { 230 if (lame_result == -1) { 231 av_log(avctx, AV_LOG_ERROR, 232 "lame: output buffer too small (buffer index: %d, free bytes: %d)\n", 233 s->buffer_index, s->buffer_size - s->buffer_index); 234 } 235 return AVERROR(ENOMEM); 236 } 237 s->buffer_index += lame_result; 238 ret = realloc_buffer(s); 239 if (ret < 0) { 240 av_log(avctx, AV_LOG_ERROR, "error reallocating output buffer\n"); 241 return ret; 242 } 243 244 /* add current frame to the queue */ 245 if (frame) { 246 if ((ret = ff_af_queue_add(&s->afq, frame)) < 0) 247 return ret; 248 } 249 250 /* Move 1 frame from the LAME buffer to the output packet, if available. 251 We have to parse the first frame header in the output buffer to 252 determine the frame size. */ 253 if (s->buffer_index < 4) 254 return 0; 255 h = AV_RB32(s->buffer); 256 257 ret = avpriv_mpegaudio_decode_header(&hdr, h); 258 if (ret < 0) { 259 av_log(avctx, AV_LOG_ERROR, "Invalid mp3 header at start of buffer\n"); 260 return AVERROR_BUG; 261 } else if (ret) { 262 av_log(avctx, AV_LOG_ERROR, "free format output not supported\n"); 263 return AVERROR_INVALIDDATA; 264 } 265 len = hdr.frame_size; 266 ff_dlog(avctx, "in:%d packet-len:%d index:%d\n", avctx->frame_size, len, 267 s->buffer_index); 268 if (len <= s->buffer_index) { 269 if ((ret = ff_get_encode_buffer(avctx, avpkt, len, 0)) < 0) 270 return ret; 271 memcpy(avpkt->data, s->buffer, len); 272 s->buffer_index -= len; 273 memmove(s->buffer, s->buffer + len, s->buffer_index); 274 275 /* Get the next frame pts/duration */ 276 ff_af_queue_remove(&s->afq, avctx->frame_size, &avpkt->pts, 277 &avpkt->duration); 278 279 discard_padding = avctx->frame_size - avpkt->duration; 280 // Check if subtraction resulted in an overflow 281 if ((discard_padding < avctx->frame_size) != (avpkt->duration > 0)) { 282 av_log(avctx, AV_LOG_ERROR, "discard padding overflow\n"); 283 av_packet_unref(avpkt); 284 return AVERROR(EINVAL); 285 } 286 if ((!s->delay_sent && avctx->initial_padding > 0) || discard_padding > 0) { 287 uint8_t* side_data = av_packet_new_side_data(avpkt, 288 AV_PKT_DATA_SKIP_SAMPLES, 289 10); 290 if(!side_data) { 291 av_packet_unref(avpkt); 292 return AVERROR(ENOMEM); 293 } 294 if (!s->delay_sent) { 295 AV_WL32(side_data, avctx->initial_padding); 296 s->delay_sent = 1; 297 } 298 AV_WL32(side_data + 4, discard_padding); 299 } 300 301 *got_packet_ptr = 1; 302 } 303 return 0; 304} 305 306#define OFFSET(x) offsetof(LAMEContext, x) 307#define AE AV_OPT_FLAG_AUDIO_PARAM | AV_OPT_FLAG_ENCODING_PARAM 308static const AVOption options[] = { 309 { "reservoir", "use bit reservoir", OFFSET(reservoir), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, AE }, 310 { "joint_stereo", "use joint stereo", OFFSET(joint_stereo), AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, AE }, 311 { "abr", "use ABR", OFFSET(abr), AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, AE }, 312 { NULL }, 313}; 314 315static const AVClass libmp3lame_class = { 316 .class_name = "libmp3lame encoder", 317 .item_name = av_default_item_name, 318 .option = options, 319 .version = LIBAVUTIL_VERSION_INT, 320}; 321 322static const FFCodecDefault libmp3lame_defaults[] = { 323 { "b", "0" }, 324 { NULL }, 325}; 326 327static const int libmp3lame_sample_rates[] = { 328 44100, 48000, 32000, 22050, 24000, 16000, 11025, 12000, 8000, 0 329}; 330 331const FFCodec ff_libmp3lame_encoder = { 332 .p.name = "libmp3lame", 333 .p.long_name = NULL_IF_CONFIG_SMALL("libmp3lame MP3 (MPEG audio layer 3)"), 334 .p.type = AVMEDIA_TYPE_AUDIO, 335 .p.id = AV_CODEC_ID_MP3, 336 .p.capabilities = AV_CODEC_CAP_DR1 | AV_CODEC_CAP_DELAY | 337 AV_CODEC_CAP_SMALL_LAST_FRAME, 338 .priv_data_size = sizeof(LAMEContext), 339 .init = mp3lame_encode_init, 340 FF_CODEC_ENCODE_CB(mp3lame_encode_frame), 341 .close = mp3lame_encode_close, 342 .p.sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_S32P, 343 AV_SAMPLE_FMT_FLTP, 344 AV_SAMPLE_FMT_S16P, 345 AV_SAMPLE_FMT_NONE }, 346 .p.supported_samplerates = libmp3lame_sample_rates, 347#if FF_API_OLD_CHANNEL_LAYOUT 348 .p.channel_layouts = (const uint64_t[]) { AV_CH_LAYOUT_MONO, 349 AV_CH_LAYOUT_STEREO, 350 0 }, 351#endif 352 .p.ch_layouts = (const AVChannelLayout[]) { AV_CHANNEL_LAYOUT_MONO, 353 AV_CHANNEL_LAYOUT_STEREO, 354 { 0 }, 355 }, 356 .p.priv_class = &libmp3lame_class, 357 .defaults = libmp3lame_defaults, 358 .p.wrapper_name = "libmp3lame", 359}; 360