Commit | Line | Data |
---|---|---|
0716b577 J |
1 | /* |
2 | * Interface to libmp3lame for mp3 encoding | |
3 | * Copyright (c) 2002 Lennert Buytenhek <buytenh@gnu.org> | |
4 | * | |
b78e7197 DB |
5 | * This file is part of FFmpeg. |
6 | * | |
7 | * FFmpeg is free software; you can redistribute it and/or | |
ff4ec49e FB |
8 | * modify it under the terms of the GNU Lesser General Public |
9 | * License as published by the Free Software Foundation; either | |
b78e7197 | 10 | * version 2.1 of the License, or (at your option) any later version. |
0716b577 | 11 | * |
b78e7197 | 12 | * FFmpeg is distributed in the hope that it will be useful, |
0716b577 | 13 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
ff4ec49e FB |
14 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
15 | * Lesser General Public License for more details. | |
0716b577 | 16 | * |
ff4ec49e | 17 | * You should have received a copy of the GNU Lesser General Public |
b78e7197 | 18 | * License along with FFmpeg; if not, write to the Free Software |
5509bffa | 19 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
0716b577 | 20 | */ |
115329f1 | 21 | |
983e3246 MN |
22 | /** |
23 | * @file mp3lameaudio.c | |
24 | * Interface to libmp3lame for mp3 encoding. | |
25 | */ | |
0716b577 J |
26 | |
27 | #include "avcodec.h" | |
0716b577 J |
28 | #include "mpegaudio.h" |
29 | #include <lame/lame.h> | |
30 | ||
c8af74a9 | 31 | #define BUFFER_SIZE (7200 + 2*MPA_FRAME_SIZE + MPA_FRAME_SIZE/4) |
0716b577 | 32 | typedef struct Mp3AudioContext { |
e344c1ea SH |
33 | lame_global_flags *gfp; |
34 | int stereo; | |
35 | uint8_t buffer[BUFFER_SIZE]; | |
36 | int buffer_index; | |
0716b577 J |
37 | } Mp3AudioContext; |
38 | ||
98a6fff9 | 39 | static av_cold int MP3lame_encode_init(AVCodecContext *avctx) |
0716b577 | 40 | { |
e344c1ea SH |
41 | Mp3AudioContext *s = avctx->priv_data; |
42 | ||
43 | if (avctx->channels > 2) | |
44 | return -1; | |
45 | ||
46 | s->stereo = avctx->channels > 1 ? 1 : 0; | |
47 | ||
48 | if ((s->gfp = lame_init()) == NULL) | |
49 | goto err; | |
50 | lame_set_in_samplerate(s->gfp, avctx->sample_rate); | |
51 | lame_set_out_samplerate(s->gfp, avctx->sample_rate); | |
52 | lame_set_num_channels(s->gfp, avctx->channels); | |
afffd357 NG |
53 | if(avctx->compression_level == FF_COMPRESSION_DEFAULT) { |
54 | lame_set_quality(s->gfp, 5); | |
55 | } else { | |
56 | lame_set_quality(s->gfp, avctx->compression_level); | |
57 | } | |
e344c1ea SH |
58 | /* lame 3.91 doesn't work in mono */ |
59 | lame_set_mode(s->gfp, JOINT_STEREO); | |
60 | lame_set_brate(s->gfp, avctx->bit_rate/1000); | |
c57c770d JR |
61 | if(avctx->flags & CODEC_FLAG_QSCALE) { |
62 | lame_set_brate(s->gfp, 0); | |
63 | lame_set_VBR(s->gfp, vbr_default); | |
64 | lame_set_VBR_q(s->gfp, avctx->global_quality / (float)FF_QP2LAMBDA); | |
65 | } | |
e344c1ea | 66 | lame_set_bWriteVbrTag(s->gfp,0); |
f1618fd9 | 67 | lame_set_disable_reservoir(s->gfp, avctx->flags2 & CODEC_FLAG2_BIT_RESERVOIR ? 0 : 1); |
e344c1ea SH |
68 | if (lame_init_params(s->gfp) < 0) |
69 | goto err_close; | |
0716b577 | 70 | |
e344c1ea | 71 | avctx->frame_size = lame_get_framesize(s->gfp); |
115329f1 | 72 | |
e344c1ea SH |
73 | avctx->coded_frame= avcodec_alloc_frame(); |
74 | avctx->coded_frame->key_frame= 1; | |
0716b577 | 75 | |
e344c1ea | 76 | return 0; |
0716b577 J |
77 | |
78 | err_close: | |
e344c1ea | 79 | lame_close(s->gfp); |
0716b577 | 80 | err: |
e344c1ea | 81 | return -1; |
0716b577 J |
82 | } |
83 | ||
2f996b83 MN |
84 | static const int sSampleRates[3] = { |
85 | 44100, 48000, 32000 | |
86 | }; | |
87 | ||
88 | static const int sBitRates[2][3][15] = { | |
89 | { { 0, 32, 64, 96,128,160,192,224,256,288,320,352,384,416,448}, | |
90 | { 0, 32, 48, 56, 64, 80, 96,112,128,160,192,224,256,320,384}, | |
91 | { 0, 32, 40, 48, 56, 64, 80, 96,112,128,160,192,224,256,320} | |
92 | }, | |
93 | { { 0, 32, 48, 56, 64, 80, 96,112,128,144,160,176,192,224,256}, | |
94 | { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160}, | |
95 | { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160} | |
96 | }, | |
97 | }; | |
98 | ||
99 | static const int sSamplesPerFrame[2][3] = | |
100 | { | |
101 | { 384, 1152, 1152 }, | |
102 | { 384, 1152, 576 } | |
103 | }; | |
104 | ||
105 | static const int sBitsPerSlot[3] = { | |
106 | 32, | |
107 | 8, | |
108 | 8 | |
109 | }; | |
110 | ||
111 | static int mp3len(void *data, int *samplesPerFrame, int *sampleRate) | |
112 | { | |
2c124cb6 | 113 | uint32_t header = AV_RB32(data); |
2f996b83 MN |
114 | int layerID = 3 - ((header >> 17) & 0x03); |
115 | int bitRateID = ((header >> 12) & 0x0f); | |
116 | int sampleRateID = ((header >> 10) & 0x03); | |
117 | int bitsPerSlot = sBitsPerSlot[layerID]; | |
118 | int isPadded = ((header >> 9) & 0x01); | |
119 | static int const mode_tab[4]= {2,3,1,0}; | |
120 | int mode= mode_tab[(header >> 19) & 0x03]; | |
121 | int mpeg_id= mode>0; | |
122 | int temp0, temp1, bitRate; | |
123 | ||
124 | if ( (( header >> 21 ) & 0x7ff) != 0x7ff || mode == 3 || layerID==3 || sampleRateID==3) { | |
125 | return -1; | |
126 | } | |
115329f1 | 127 | |
2f996b83 MN |
128 | if(!samplesPerFrame) samplesPerFrame= &temp0; |
129 | if(!sampleRate ) sampleRate = &temp1; | |
130 | ||
131 | // *isMono = ((header >> 6) & 0x03) == 0x03; | |
132 | ||
133 | *sampleRate = sSampleRates[sampleRateID]>>mode; | |
134 | bitRate = sBitRates[mpeg_id][layerID][bitRateID] * 1000; | |
135 | *samplesPerFrame = sSamplesPerFrame[mpeg_id][layerID]; | |
136 | //av_log(NULL, AV_LOG_DEBUG, "sr:%d br:%d spf:%d l:%d m:%d\n", *sampleRate, bitRate, *samplesPerFrame, layerID, mode); | |
115329f1 | 137 | |
2f996b83 MN |
138 | return *samplesPerFrame * bitRate / (bitsPerSlot * *sampleRate) + isPadded; |
139 | } | |
140 | ||
8e981daf MR |
141 | static int MP3lame_encode_frame(AVCodecContext *avctx, |
142 | unsigned char *frame, int buf_size, void *data) | |
0716b577 | 143 | { |
e344c1ea SH |
144 | Mp3AudioContext *s = avctx->priv_data; |
145 | int len; | |
146 | int lame_result; | |
0716b577 | 147 | |
e344c1ea | 148 | /* lame 3.91 dies on '1-channel interleaved' data */ |
6f824977 MN |
149 | |
150 | if(data){ | |
151 | if (s->stereo) { | |
0f5c3f21 | 152 | lame_result = lame_encode_buffer_interleaved( |
115329f1 | 153 | s->gfp, |
2f996b83 | 154 | data, |
115329f1 DB |
155 | avctx->frame_size, |
156 | s->buffer + s->buffer_index, | |
2f996b83 MN |
157 | BUFFER_SIZE - s->buffer_index |
158 | ); | |
6f824977 | 159 | } else { |
0f5c3f21 | 160 | lame_result = lame_encode_buffer( |
115329f1 DB |
161 | s->gfp, |
162 | data, | |
163 | data, | |
0f5c3f21 | 164 | avctx->frame_size, |
115329f1 | 165 | s->buffer + s->buffer_index, |
2f996b83 MN |
166 | BUFFER_SIZE - s->buffer_index |
167 | ); | |
6f824977 MN |
168 | } |
169 | }else{ | |
170 | lame_result= lame_encode_flush( | |
115329f1 DB |
171 | s->gfp, |
172 | s->buffer + s->buffer_index, | |
6f824977 MN |
173 | BUFFER_SIZE - s->buffer_index |
174 | ); | |
0f5c3f21 HD |
175 | } |
176 | ||
20836483 | 177 | if(lame_result < 0){ |
203fa6b4 MN |
178 | if(lame_result==-1) { |
179 | /* output buffer too small */ | |
180 | 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); | |
181 | } | |
20836483 | 182 | return -1; |
0f5c3f21 HD |
183 | } |
184 | ||
185 | s->buffer_index += lame_result; | |
186 | ||
187 | if(s->buffer_index<4) | |
188 | return 0; | |
2f996b83 | 189 | |
203fa6b4 | 190 | len= mp3len(s->buffer, NULL, NULL); |
0f5c3f21 | 191 | //av_log(avctx, AV_LOG_DEBUG, "in:%d packet-len:%d index:%d\n", avctx->frame_size, len, s->buffer_index); |
203fa6b4 MN |
192 | if(len <= s->buffer_index){ |
193 | memcpy(frame, s->buffer, len); | |
194 | s->buffer_index -= len; | |
2f996b83 | 195 | |
203fa6b4 | 196 | memmove(s->buffer, s->buffer+len, s->buffer_index); |
755bfeab | 197 | //FIXME fix the audio codec API, so we do not need the memcpy() |
2f996b83 | 198 | /*for(i=0; i<len; i++){ |
c276af04 MN |
199 | av_log(avctx, AV_LOG_DEBUG, "%2X ", frame[i]); |
200 | }*/ | |
203fa6b4 MN |
201 | return len; |
202 | }else | |
203 | return 0; | |
0716b577 J |
204 | } |
205 | ||
98a6fff9 | 206 | static av_cold int MP3lame_encode_close(AVCodecContext *avctx) |
0716b577 | 207 | { |
e344c1ea | 208 | Mp3AudioContext *s = avctx->priv_data; |
115329f1 | 209 | |
e344c1ea | 210 | av_freep(&avctx->coded_frame); |
0716b577 | 211 | |
e344c1ea SH |
212 | lame_close(s->gfp); |
213 | return 0; | |
0716b577 J |
214 | } |
215 | ||
216 | ||
1cc60c47 DB |
217 | AVCodec libmp3lame_encoder = { |
218 | "libmp3lame", | |
0716b577 | 219 | CODEC_TYPE_AUDIO, |
80783dc2 | 220 | CODEC_ID_MP3, |
0716b577 J |
221 | sizeof(Mp3AudioContext), |
222 | MP3lame_encode_init, | |
223 | MP3lame_encode_frame, | |
6f824977 MN |
224 | MP3lame_encode_close, |
225 | .capabilities= CODEC_CAP_DELAY, | |
fd76c37f | 226 | .sample_fmts = (enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE}, |
fe4bf374 | 227 | .long_name= NULL_IF_CONFIG_SMALL("libmp3lame MP3 (MPEG audio layer 3)"), |
0716b577 | 228 | }; |