]> git.sesse.net Git - ffmpeg/blob - libavcodec/libmp3lame.c
Merge remote-tracking branch 'qatar/master'
[ffmpeg] / libavcodec / libmp3lame.c
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 "libavutil/intreadwrite.h"
28 #include "avcodec.h"
29 #include "mpegaudio.h"
30 #include <lame/lame.h>
31
32 #define BUFFER_SIZE (7200 + 2*MPA_FRAME_SIZE + MPA_FRAME_SIZE/4)
33 typedef struct Mp3AudioContext {
34     lame_global_flags *gfp;
35     int stereo;
36     uint8_t buffer[BUFFER_SIZE];
37     int buffer_index;
38     struct {
39         int *left;
40         int *right;
41     } s32_data;
42 } Mp3AudioContext;
43
44 static av_cold int MP3lame_encode_init(AVCodecContext *avctx)
45 {
46     Mp3AudioContext *s = avctx->priv_data;
47
48     if (avctx->channels > 2)
49         return -1;
50
51     s->stereo = avctx->channels > 1 ? 1 : 0;
52
53     if ((s->gfp = lame_init()) == NULL)
54         goto err;
55     lame_set_in_samplerate(s->gfp, avctx->sample_rate);
56     lame_set_out_samplerate(s->gfp, avctx->sample_rate);
57     lame_set_num_channels(s->gfp, avctx->channels);
58     if(avctx->compression_level == FF_COMPRESSION_DEFAULT) {
59         lame_set_quality(s->gfp, 5);
60     } else {
61         lame_set_quality(s->gfp, avctx->compression_level);
62     }
63     lame_set_mode(s->gfp, s->stereo ? JOINT_STEREO : MONO);
64     lame_set_brate(s->gfp, avctx->bit_rate/1000);
65     if(avctx->flags & CODEC_FLAG_QSCALE) {
66         lame_set_brate(s->gfp, 0);
67         lame_set_VBR(s->gfp, vbr_default);
68         lame_set_VBR_quality(s->gfp, avctx->global_quality/(float)FF_QP2LAMBDA);
69     }
70     lame_set_bWriteVbrTag(s->gfp,0);
71     lame_set_disable_reservoir(s->gfp, avctx->flags2 & CODEC_FLAG2_BIT_RESERVOIR ? 0 : 1);
72     if (lame_init_params(s->gfp) < 0)
73         goto err_close;
74
75     avctx->frame_size = lame_get_framesize(s->gfp);
76
77     if(!(avctx->coded_frame= avcodec_alloc_frame())) {
78         lame_close(s->gfp);
79
80         return AVERROR(ENOMEM);
81     }
82     avctx->coded_frame->key_frame= 1;
83
84     if(AV_SAMPLE_FMT_S32 == avctx->sample_fmt && s->stereo) {
85         int nelem = 2 * avctx->frame_size;
86
87         if(! (s->s32_data.left = av_malloc(nelem * sizeof(int)))) {
88             av_freep(&avctx->coded_frame);
89             lame_close(s->gfp);
90
91             return AVERROR(ENOMEM);
92         }
93
94         s->s32_data.right = s->s32_data.left + avctx->frame_size;
95     }
96
97     return 0;
98
99 err_close:
100     lame_close(s->gfp);
101 err:
102     return -1;
103 }
104
105 static const int sSampleRates[] = {
106     44100, 48000,  32000, 22050, 24000, 16000, 11025, 12000, 8000, 0
107 };
108
109 static const int sBitRates[2][3][15] = {
110     {   {  0, 32, 64, 96,128,160,192,224,256,288,320,352,384,416,448},
111         {  0, 32, 48, 56, 64, 80, 96,112,128,160,192,224,256,320,384},
112         {  0, 32, 40, 48, 56, 64, 80, 96,112,128,160,192,224,256,320}
113     },
114     {   {  0, 32, 48, 56, 64, 80, 96,112,128,144,160,176,192,224,256},
115         {  0,  8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160},
116         {  0,  8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160}
117     },
118 };
119
120 static const int sSamplesPerFrame[2][3] =
121 {
122     {  384,     1152,    1152 },
123     {  384,     1152,     576 }
124 };
125
126 static const int sBitsPerSlot[3] = {
127     32,
128     8,
129     8
130 };
131
132 static int mp3len(void *data, int *samplesPerFrame, int *sampleRate)
133 {
134     uint32_t header = AV_RB32(data);
135     int layerID = 3 - ((header >> 17) & 0x03);
136     int bitRateID = ((header >> 12) & 0x0f);
137     int sampleRateID = ((header >> 10) & 0x03);
138     int bitsPerSlot = sBitsPerSlot[layerID];
139     int isPadded = ((header >> 9) & 0x01);
140     static int const mode_tab[4]= {2,3,1,0};
141     int mode= mode_tab[(header >> 19) & 0x03];
142     int mpeg_id= mode>0;
143     int temp0, temp1, bitRate;
144
145     if ( (( header >> 21 ) & 0x7ff) != 0x7ff || mode == 3 || layerID==3 || sampleRateID==3) {
146         return -1;
147     }
148
149     if(!samplesPerFrame) samplesPerFrame= &temp0;
150     if(!sampleRate     ) sampleRate     = &temp1;
151
152 //    *isMono = ((header >>  6) & 0x03) == 0x03;
153
154     *sampleRate = sSampleRates[sampleRateID]>>mode;
155     bitRate = sBitRates[mpeg_id][layerID][bitRateID] * 1000;
156     *samplesPerFrame = sSamplesPerFrame[mpeg_id][layerID];
157 //av_log(NULL, AV_LOG_DEBUG, "sr:%d br:%d spf:%d l:%d m:%d\n", *sampleRate, bitRate, *samplesPerFrame, layerID, mode);
158
159     return *samplesPerFrame * bitRate / (bitsPerSlot * *sampleRate) + isPadded;
160 }
161
162 static int MP3lame_encode_frame(AVCodecContext *avctx,
163                                 unsigned char *frame, int buf_size, void *data)
164 {
165     Mp3AudioContext *s = avctx->priv_data;
166     int len;
167     int lame_result;
168
169     /* lame 3.91 dies on '1-channel interleaved' data */
170
171     if(!data){
172         lame_result= lame_encode_flush(
173                 s->gfp,
174                 s->buffer + s->buffer_index,
175                 BUFFER_SIZE - s->buffer_index
176                 );
177 #if 2147483647 == INT_MAX
178     }else if(AV_SAMPLE_FMT_S32 == avctx->sample_fmt){
179         if (s->stereo) {
180             int32_t *rp = data;
181             int32_t *mp = rp + 2*avctx->frame_size;
182             int *wpl = s->s32_data.left;
183             int *wpr = s->s32_data.right;
184
185             while (rp < mp) {
186                 *wpl++ = *rp++;
187                 *wpr++ = *rp++;
188             }
189
190             lame_result = lame_encode_buffer_int(
191                 s->gfp,
192                 s->s32_data.left,
193                 s->s32_data.right,
194                 avctx->frame_size,
195                 s->buffer + s->buffer_index,
196                 BUFFER_SIZE - s->buffer_index
197                 );
198         } else {
199             lame_result = lame_encode_buffer_int(
200                 s->gfp,
201                 data,
202                 data,
203                 avctx->frame_size,
204                 s->buffer + s->buffer_index,
205                 BUFFER_SIZE - s->buffer_index
206                 );
207         }
208 #endif
209     }else{
210         if (s->stereo) {
211             lame_result = lame_encode_buffer_interleaved(
212                 s->gfp,
213                 data,
214                 avctx->frame_size,
215                 s->buffer + s->buffer_index,
216                 BUFFER_SIZE - s->buffer_index
217                 );
218         } else {
219             lame_result = lame_encode_buffer(
220                 s->gfp,
221                 data,
222                 data,
223                 avctx->frame_size,
224                 s->buffer + s->buffer_index,
225                 BUFFER_SIZE - s->buffer_index
226                 );
227         }
228     }
229
230     if(lame_result < 0){
231         if(lame_result==-1) {
232             /* output buffer too small */
233             av_log(avctx, AV_LOG_ERROR, "lame: output buffer too small (buffer index: %d, free bytes: %d)\n", s->buffer_index, BUFFER_SIZE - s->buffer_index);
234         }
235         return -1;
236     }
237
238     s->buffer_index += lame_result;
239
240     if(s->buffer_index<4)
241         return 0;
242
243     len= mp3len(s->buffer, NULL, NULL);
244 //av_log(avctx, AV_LOG_DEBUG, "in:%d packet-len:%d index:%d\n", avctx->frame_size, len, s->buffer_index);
245     if(len <= s->buffer_index){
246         memcpy(frame, s->buffer, len);
247         s->buffer_index -= len;
248
249         memmove(s->buffer, s->buffer+len, s->buffer_index);
250             //FIXME fix the audio codec API, so we do not need the memcpy()
251 /*for(i=0; i<len; i++){
252     av_log(avctx, AV_LOG_DEBUG, "%2X ", frame[i]);
253 }*/
254         return len;
255     }else
256         return 0;
257 }
258
259 static av_cold int MP3lame_encode_close(AVCodecContext *avctx)
260 {
261     Mp3AudioContext *s = avctx->priv_data;
262
263     av_freep(&s->s32_data.left);
264     av_freep(&avctx->coded_frame);
265
266     lame_close(s->gfp);
267     return 0;
268 }
269
270
271 AVCodec ff_libmp3lame_encoder = {
272     .name           = "libmp3lame",
273     .type           = AVMEDIA_TYPE_AUDIO,
274     .id             = CODEC_ID_MP3,
275     .priv_data_size = sizeof(Mp3AudioContext),
276     .init           = MP3lame_encode_init,
277     .encode         = MP3lame_encode_frame,
278     .close          = MP3lame_encode_close,
279     .capabilities= CODEC_CAP_DELAY,
280     .sample_fmts = (const enum AVSampleFormat[]){AV_SAMPLE_FMT_S16,
281 #if 2147483647 == INT_MAX
282     AV_SAMPLE_FMT_S32,
283 #endif
284     AV_SAMPLE_FMT_NONE},
285     .supported_samplerates= sSampleRates,
286     .long_name= NULL_IF_CONFIG_SMALL("libmp3lame MP3 (MPEG audio layer 3)"),
287 };