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