Mercurial > libavcodec.hg
annotate libmp3lame.c @ 6317:2f44646383c8 libavcodec
100l, since we already check for buf_size == 769 we should also
handle buf_size < 769 instead of just crashing in smacker decoder.
author | reimar |
---|---|
date | Sat, 02 Feb 2008 22:34:44 +0000 |
parents | 87d908152cb7 |
children | 11a44fc273a5 |
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 | 8 * modify it under the terms of the GNU Lesser General Public |
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 | 14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
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 | 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 | 21 |
1106 | 22 /** |
23 * @file mp3lameaudio.c | |
24 * Interface to libmp3lame for mp3 encoding. | |
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 | 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 | 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 | 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 | 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 | 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 | 137 static int MP3lame_encode_frame(AVCodecContext *avctx, |
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 | 145 |
146 if(data){ | |
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 | 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 | 151 avctx->frame_size, |
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 | 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 | 157 s->gfp, |
158 data, | |
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 | 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 | 164 } |
165 }else{ | |
166 lame_result= lame_encode_flush( | |
2967 | 167 s->gfp, |
168 s->buffer + s->buffer_index, | |
2091 | 169 BUFFER_SIZE - s->buffer_index |
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 | 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 | 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 | 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 | 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 | 218 MP3lame_encode_close, |
219 .capabilities= CODEC_CAP_DELAY, | |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
220 }; |