Mercurial > libavcodec.hg
annotate mp3lameaudio.c @ 2964:8f732838179d libavcodec
correctly deal with the alpha channel in 32-bit QT RLE (courtesy of John
Koleszar <jkoleszar at on2.com>)
author | melanson |
---|---|
date | Wed, 14 Dec 2005 08:02:03 +0000 |
parents | bceeca1bb30f |
children | ef2149182f1c |
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 * |
429 | 5 * This library is free software; you can redistribute it and/or |
6 * modify it under the terms of the GNU Lesser General Public | |
7 * License as published by the Free Software Foundation; either | |
8 * version 2 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
|
9 * |
429 | 10 * This library 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
|
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
429 | 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
13 * Lesser General Public License for more details. | |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
14 * |
429 | 15 * You should have received a copy of the GNU Lesser General Public |
16 * License along with this library; if not, write to the Free Software | |
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
18 */ |
1106 | 19 |
20 /** | |
21 * @file mp3lameaudio.c | |
22 * Interface to libmp3lame for mp3 encoding. | |
23 */ | |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
24 |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
25 #include "avcodec.h" |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
26 #include "mpegaudio.h" |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
27 #include <lame/lame.h> |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
28 |
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
|
29 #define BUFFER_SIZE (2*MPA_FRAME_SIZE) |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
30 typedef struct Mp3AudioContext { |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
31 lame_global_flags *gfp; |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
32 int stereo; |
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
|
33 uint8_t buffer[BUFFER_SIZE]; |
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
|
34 int buffer_index; |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
35 } Mp3AudioContext; |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
36 |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
37 static int MP3lame_encode_init(AVCodecContext *avctx) |
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 Mp3AudioContext *s = avctx->priv_data; |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
40 |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
41 if (avctx->channels > 2) |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
42 return -1; |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
43 |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
44 s->stereo = avctx->channels > 1 ? 1 : 0; |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
45 |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
46 if ((s->gfp = lame_init()) == NULL) |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
47 goto err; |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
48 lame_set_in_samplerate(s->gfp, avctx->sample_rate); |
261
d6521bbbab5e
- Bug fix on output sample rate for lame MP3 encoding.
pulento
parents:
259
diff
changeset
|
49 lame_set_out_samplerate(s->gfp, avctx->sample_rate); |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
50 lame_set_num_channels(s->gfp, avctx->channels); |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
51 /* lame 3.91 dies on quality != 5 */ |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
52 lame_set_quality(s->gfp, 5); |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
53 /* lame 3.91 doesn't work in mono */ |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
54 lame_set_mode(s->gfp, JOINT_STEREO); |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
55 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
|
56 if(avctx->flags & CODEC_FLAG_QSCALE) { |
bceeca1bb30f
vbr audio encode patch by (Justin Ruggles: jruggle, earthlink net)
michael
parents:
2522
diff
changeset
|
57 lame_set_brate(s->gfp, 0); |
bceeca1bb30f
vbr audio encode patch by (Justin Ruggles: jruggle, earthlink net)
michael
parents:
2522
diff
changeset
|
58 lame_set_VBR(s->gfp, vbr_default); |
bceeca1bb30f
vbr audio encode patch by (Justin Ruggles: jruggle, earthlink net)
michael
parents:
2522
diff
changeset
|
59 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
|
60 } |
1871
9457292b0b65
disable lames leading zero "feature", fixes a few more flv encoding issues
michael
parents:
1448
diff
changeset
|
61 lame_set_bWriteVbrTag(s->gfp,0); |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
62 if (lame_init_params(s->gfp) < 0) |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
63 goto err_close; |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
64 |
1941
81a1a5be13aa
fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents:
1913
diff
changeset
|
65 avctx->frame_size = lame_get_framesize(s->gfp); |
926 | 66 |
67 avctx->coded_frame= avcodec_alloc_frame(); | |
68 avctx->coded_frame->key_frame= 1; | |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
69 |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
70 return 0; |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
71 |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
72 err_close: |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
73 lame_close(s->gfp); |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
74 err: |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
75 return -1; |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
76 } |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
77 |
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
|
78 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
|
79 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
|
80 }; |
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 |
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 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
|
83 { { 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
|
84 { 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
|
85 { 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
|
86 }, |
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, 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
|
88 { 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
|
89 { 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
|
90 }, |
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 }; |
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 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
|
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 { 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
|
96 { 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
|
97 }; |
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 |
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 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
|
100 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
|
101 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
|
102 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
|
103 }; |
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 |
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 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
|
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 uint8_t *dataTmp = (uint8_t *)data; |
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 uint32_t header = ( (uint32_t)dataTmp[0] << 24 ) | ( (uint32_t)dataTmp[1] << 16 ) | ( (uint32_t)dataTmp[2] << 8 ) | (uint32_t)dataTmp[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
|
109 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
|
110 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
|
111 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
|
112 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
|
113 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
|
114 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
|
115 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
|
116 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
|
117 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
|
118 |
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 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
|
120 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
|
121 } |
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 |
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
|
123 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
|
124 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
|
125 |
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 // *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
|
127 |
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 *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
|
129 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
|
130 *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
|
131 //av_log(NULL, AV_LOG_DEBUG, "sr:%d br:%d spf:%d l:%d m:%d\n", *sampleRate, bitRate, *samplesPerFrame, layerID, 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
|
132 |
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
|
133 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
|
134 } |
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 |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
136 int MP3lame_encode_frame(AVCodecContext *avctx, |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
137 unsigned char *frame, int buf_size, void *data) |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
138 { |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
139 Mp3AudioContext *s = avctx->priv_data; |
2522
e25782262d7d
kill warnings patch by (Mns Rullgrd <mru inprovide com>)
michael
parents:
2091
diff
changeset
|
140 int len; |
1941
81a1a5be13aa
fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents:
1913
diff
changeset
|
141 int lame_result; |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
142 |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
143 /* lame 3.91 dies on '1-channel interleaved' data */ |
2091 | 144 |
145 if(data){ | |
146 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
|
147 lame_result = lame_encode_buffer_interleaved( |
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
|
148 s->gfp, |
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
|
149 data, |
1941
81a1a5be13aa
fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents:
1913
diff
changeset
|
150 avctx->frame_size, |
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
|
151 s->buffer + 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
|
152 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
|
153 ); |
2091 | 154 } else { |
1941
81a1a5be13aa
fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents:
1913
diff
changeset
|
155 lame_result = lame_encode_buffer( |
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
|
156 s->gfp, |
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
|
157 data, |
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
|
158 data, |
1941
81a1a5be13aa
fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents:
1913
diff
changeset
|
159 avctx->frame_size, |
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
|
160 s->buffer + 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
|
161 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
|
162 ); |
2091 | 163 } |
164 }else{ | |
165 lame_result= lame_encode_flush( | |
166 s->gfp, | |
167 s->buffer + s->buffer_index, | |
168 BUFFER_SIZE - s->buffer_index | |
169 ); | |
1941
81a1a5be13aa
fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents:
1913
diff
changeset
|
170 } |
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 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
|
173 /* 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
|
174 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
|
175 return 0; |
81a1a5be13aa
fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents:
1913
diff
changeset
|
176 } |
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 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
|
179 |
81a1a5be13aa
fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents:
1913
diff
changeset
|
180 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
|
181 return 0; |
1871
9457292b0b65
disable lames leading zero "feature", fixes a few more flv encoding issues
michael
parents:
1448
diff
changeset
|
182 |
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
|
183 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
|
184 //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
|
185 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
|
186 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
|
187 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
|
188 |
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 memmove(s->buffer, s->buffer+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
|
190 //FIXME fix the audio codec API, so we dont need the memcpy() |
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
|
191 /*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
|
192 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
|
193 }*/ |
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
|
194 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
|
195 }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
|
196 return 0; |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
197 } |
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 int MP3lame_encode_close(AVCodecContext *avctx) |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
200 { |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
201 Mp3AudioContext *s = avctx->priv_data; |
926 | 202 |
203 av_freep(&avctx->coded_frame); | |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
204 |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
205 lame_close(s->gfp); |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
206 return 0; |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
207 } |
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 AVCodec mp3lame_encoder = { |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
211 "mp3", |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
212 CODEC_TYPE_AUDIO, |
1448 | 213 CODEC_ID_MP3, |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
214 sizeof(Mp3AudioContext), |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
215 MP3lame_encode_init, |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
216 MP3lame_encode_frame, |
2091 | 217 MP3lame_encode_close, |
218 .capabilities= CODEC_CAP_DELAY, | |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
219 }; |