annotate libmp3lame.c @ 6323:e6da66f378c7 libavcodec

mpegvideo.h has two function declarations with the 'inline' specifier but no definition for those functions. The C standard requires a definition to appear in the same translation unit for any function declared with 'inline'. Most of the files including mpegvideo.h do not define those functions. Fix this by removing the 'inline' specifiers from the header. patch by Uoti Urpala
author diego
date Sun, 03 Feb 2008 17:54:30 +0000
parents 87d908152cb7
children 11a44fc273a5
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
1 /*
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
2 * Interface to libmp3lame for mp3 encoding
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
3 * Copyright (c) 2002 Lennert Buytenhek <buytenh@gnu.org>
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
4 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
5 * This file is part of FFmpeg.
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
6 *
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
9 * License as published by the Free Software Foundation; either
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
11 *
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
15 * Lesser General Public License for more details.
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
16 *
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
3947
c8c591fe26f8 Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents: 3036
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
3036
0b546eab515d Update licensing information: The FSF changed postal address.
diego
parents: 2979
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
20 */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2841
diff changeset
21
1106
1e39f273ecd6 per file doxy
michaelni
parents: 926
diff changeset
22 /**
1e39f273ecd6 per file doxy
michaelni
parents: 926
diff changeset
23 * @file mp3lameaudio.c
1e39f273ecd6 per file doxy
michaelni
parents: 926
diff changeset
24 * Interface to libmp3lame for mp3 encoding.
1e39f273ecd6 per file doxy
michaelni
parents: 926
diff changeset
25 */
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
26
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
27 #include "avcodec.h"
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
28 #include "mpegaudio.h"
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
29 #include <lame/lame.h>
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
30
5395
87d908152cb7 increase buffer size of LAME MP3 encoder
gpoirier
parents: 5127
diff changeset
31 #define BUFFER_SIZE (7200 + MPA_FRAME_SIZE + MPA_FRAME_SIZE/4)
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
32 typedef struct Mp3AudioContext {
4119
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
33 lame_global_flags *gfp;
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
34 int stereo;
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
35 uint8_t buffer[BUFFER_SIZE];
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
36 int buffer_index;
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
37 } Mp3AudioContext;
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
38
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
39 static int MP3lame_encode_init(AVCodecContext *avctx)
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
40 {
4119
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
41 Mp3AudioContext *s = avctx->priv_data;
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
42
4119
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
43 if (avctx->channels > 2)
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
44 return -1;
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
45
4119
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
46 s->stereo = avctx->channels > 1 ? 1 : 0;
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
47
4119
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
48 if ((s->gfp = lame_init()) == NULL)
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
49 goto err;
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
50 lame_set_in_samplerate(s->gfp, avctx->sample_rate);
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
51 lame_set_out_samplerate(s->gfp, avctx->sample_rate);
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
52 lame_set_num_channels(s->gfp, avctx->channels);
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
53 /* lame 3.91 dies on quality != 5 */
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
54 lame_set_quality(s->gfp, 5);
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
55 /* lame 3.91 doesn't work in mono */
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
56 lame_set_mode(s->gfp, JOINT_STEREO);
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
57 lame_set_brate(s->gfp, avctx->bit_rate/1000);
2841
bceeca1bb30f vbr audio encode patch by (Justin Ruggles: jruggle, earthlink net)
michael
parents: 2522
diff changeset
58 if(avctx->flags & CODEC_FLAG_QSCALE) {
bceeca1bb30f vbr audio encode patch by (Justin Ruggles: jruggle, earthlink net)
michael
parents: 2522
diff changeset
59 lame_set_brate(s->gfp, 0);
bceeca1bb30f vbr audio encode patch by (Justin Ruggles: jruggle, earthlink net)
michael
parents: 2522
diff changeset
60 lame_set_VBR(s->gfp, vbr_default);
bceeca1bb30f vbr audio encode patch by (Justin Ruggles: jruggle, earthlink net)
michael
parents: 2522
diff changeset
61 lame_set_VBR_q(s->gfp, avctx->global_quality / (float)FF_QP2LAMBDA);
bceeca1bb30f vbr audio encode patch by (Justin Ruggles: jruggle, earthlink net)
michael
parents: 2522
diff changeset
62 }
4119
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
63 lame_set_bWriteVbrTag(s->gfp,0);
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
64 if (lame_init_params(s->gfp) < 0)
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
65 goto err_close;
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
66
4119
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
67 avctx->frame_size = lame_get_framesize(s->gfp);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2841
diff changeset
68
4119
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
69 avctx->coded_frame= avcodec_alloc_frame();
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
70 avctx->coded_frame->key_frame= 1;
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
71
4119
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
72 return 0;
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
73
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
74 err_close:
4119
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
75 lame_close(s->gfp);
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
76 err:
4119
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
77 return -1;
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
78 }
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
79
1913
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
80 static const int sSampleRates[3] = {
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
81 44100, 48000, 32000
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
82 };
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
83
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
84 static const int sBitRates[2][3][15] = {
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
85 { { 0, 32, 64, 96,128,160,192,224,256,288,320,352,384,416,448},
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
86 { 0, 32, 48, 56, 64, 80, 96,112,128,160,192,224,256,320,384},
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
87 { 0, 32, 40, 48, 56, 64, 80, 96,112,128,160,192,224,256,320}
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
88 },
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
89 { { 0, 32, 48, 56, 64, 80, 96,112,128,144,160,176,192,224,256},
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
90 { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160},
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
91 { 0, 8, 16, 24, 32, 40, 48, 56, 64, 80, 96,112,128,144,160}
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
92 },
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
93 };
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
94
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
95 static const int sSamplesPerFrame[2][3] =
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
96 {
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
97 { 384, 1152, 1152 },
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
98 { 384, 1152, 576 }
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
99 };
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
100
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
101 static const int sBitsPerSlot[3] = {
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
102 32,
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
103 8,
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
104 8
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
105 };
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
106
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
107 static int mp3len(void *data, int *samplesPerFrame, int *sampleRate)
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
108 {
5089
bff60ecc02f9 Use AV_xx throughout libavcodec
ramiro
parents: 4170
diff changeset
109 uint32_t header = AV_RB32(data);
1913
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
110 int layerID = 3 - ((header >> 17) & 0x03);
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
111 int bitRateID = ((header >> 12) & 0x0f);
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
112 int sampleRateID = ((header >> 10) & 0x03);
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
113 int bitsPerSlot = sBitsPerSlot[layerID];
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
114 int isPadded = ((header >> 9) & 0x01);
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
115 static int const mode_tab[4]= {2,3,1,0};
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
116 int mode= mode_tab[(header >> 19) & 0x03];
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
117 int mpeg_id= mode>0;
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
118 int temp0, temp1, bitRate;
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
119
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
120 if ( (( header >> 21 ) & 0x7ff) != 0x7ff || mode == 3 || layerID==3 || sampleRateID==3) {
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
121 return -1;
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
122 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2841
diff changeset
123
1913
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
124 if(!samplesPerFrame) samplesPerFrame= &temp0;
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
125 if(!sampleRate ) sampleRate = &temp1;
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
126
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
127 // *isMono = ((header >> 6) & 0x03) == 0x03;
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
128
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
129 *sampleRate = sSampleRates[sampleRateID]>>mode;
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
130 bitRate = sBitRates[mpeg_id][layerID][bitRateID] * 1000;
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
131 *samplesPerFrame = sSamplesPerFrame[mpeg_id][layerID];
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
132 //av_log(NULL, AV_LOG_DEBUG, "sr:%d br:%d spf:%d l:%d m:%d\n", *sampleRate, bitRate, *samplesPerFrame, layerID, mode);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2841
diff changeset
133
1913
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
134 return *samplesPerFrame * bitRate / (bitsPerSlot * *sampleRate) + isPadded;
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
135 }
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
136
4170
f97a2081b5b1 make some symbols static
mru
parents: 4119
diff changeset
137 static int MP3lame_encode_frame(AVCodecContext *avctx,
f97a2081b5b1 make some symbols static
mru
parents: 4119
diff changeset
138 unsigned char *frame, int buf_size, void *data)
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
139 {
4119
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
140 Mp3AudioContext *s = avctx->priv_data;
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
141 int len;
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
142 int lame_result;
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
143
4119
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
144 /* lame 3.91 dies on '1-channel interleaved' data */
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
145
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
146 if(data){
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
147 if (s->stereo) {
1941
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
148 lame_result = lame_encode_buffer_interleaved(
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2841
diff changeset
149 s->gfp,
1913
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
150 data,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2841
diff changeset
151 avctx->frame_size,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2841
diff changeset
152 s->buffer + s->buffer_index,
1913
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
153 BUFFER_SIZE - s->buffer_index
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
154 );
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
155 } else {
1941
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
156 lame_result = lame_encode_buffer(
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2841
diff changeset
157 s->gfp,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2841
diff changeset
158 data,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2841
diff changeset
159 data,
1941
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
160 avctx->frame_size,
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2841
diff changeset
161 s->buffer + s->buffer_index,
1913
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
162 BUFFER_SIZE - s->buffer_index
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
163 );
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
164 }
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
165 }else{
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
166 lame_result= lame_encode_flush(
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2841
diff changeset
167 s->gfp,
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2841
diff changeset
168 s->buffer + s->buffer_index,
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
169 BUFFER_SIZE - s->buffer_index
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
170 );
1941
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
171 }
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
172
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
173 if(lame_result==-1) {
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
174 /* output buffer too small */
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
175 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);
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
176 return 0;
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
177 }
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
178
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
179 s->buffer_index += lame_result;
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
180
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
181 if(s->buffer_index<4)
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
182 return 0;
1871
9457292b0b65 disable lames leading zero "feature", fixes a few more flv encoding issues
michael
parents: 1448
diff changeset
183
1913
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
184 len= mp3len(s->buffer, NULL, NULL);
1941
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
185 //av_log(avctx, AV_LOG_DEBUG, "in:%d packet-len:%d index:%d\n", avctx->frame_size, len, s->buffer_index);
1913
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
186 if(len <= s->buffer_index){
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
187 memcpy(frame, s->buffer, len);
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
188 s->buffer_index -= len;
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
189
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
190 memmove(s->buffer, s->buffer+len, s->buffer_index);
5127
4dbe6578f811 misc spelling fixes
diego
parents: 5103
diff changeset
191 //FIXME fix the audio codec API, so we do not need the memcpy()
1913
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
192 /*for(i=0; i<len; i++){
1871
9457292b0b65 disable lames leading zero "feature", fixes a few more flv encoding issues
michael
parents: 1448
diff changeset
193 av_log(avctx, AV_LOG_DEBUG, "%2X ", frame[i]);
9457292b0b65 disable lames leading zero "feature", fixes a few more flv encoding issues
michael
parents: 1448
diff changeset
194 }*/
1913
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
195 return len;
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
196 }else
486236d25f89 split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents: 1871
diff changeset
197 return 0;
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
198 }
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
199
4170
f97a2081b5b1 make some symbols static
mru
parents: 4119
diff changeset
200 static int MP3lame_encode_close(AVCodecContext *avctx)
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
201 {
4119
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
202 Mp3AudioContext *s = avctx->priv_data;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2841
diff changeset
203
4119
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
204 av_freep(&avctx->coded_frame);
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
205
4119
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
206 lame_close(s->gfp);
85438e10d72d reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents: 3947
diff changeset
207 return 0;
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
208 }
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
209
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
210
5103
1deb3e53da27 Consistent naming and lib prefixes for x264, xvid and mp3lame within the code.
diego
parents: 5101
diff changeset
211 AVCodec libmp3lame_encoder = {
1deb3e53da27 Consistent naming and lib prefixes for x264, xvid and mp3lame within the code.
diego
parents: 5101
diff changeset
212 "libmp3lame",
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
213 CODEC_TYPE_AUDIO,
1448
317ba7ab73bd CODEC_ID_MP3LAME is obsolete
bellard
parents: 1106
diff changeset
214 CODEC_ID_MP3,
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
215 sizeof(Mp3AudioContext),
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
216 MP3lame_encode_init,
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
217 MP3lame_encode_frame,
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
218 MP3lame_encode_close,
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
219 .capabilities= CODEC_CAP_DELAY,
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
220 };