annotate mp3lameaudio.c @ 2497:69adfbbdcdeb libavcodec

- samples from mplayer ftp in the "adv" profile seem to have profile=2, which isn't the advanced one; and indeed, using adv. profile parser fails. Using normal parser works, and that's what is done - attempt at taking care of stride for NORM2 bitplane decoding - duplication of much code from msmpeg4.c; this code isn't yet used, but goes down as far as the block layer (mainly Transform Type stuff, the remains are wild editing without checking). Unusable yet, and lacks the AC decoding (but a step further in bitstream parsing) patch by anonymous
author michael
date Fri, 04 Feb 2005 02:20:38 +0000
parents 02a4fd7c606c
children e25782262d7d
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 *
429
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
5 * This library is free software; you can redistribute it and/or
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
6 * modify it under the terms of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
7 * License as published by the Free Software Foundation; either
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
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
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
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
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
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
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
15 * You should have received a copy of the GNU Lesser General Public
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
16 * License along with this library; if not, write to the Free Software
718a22dc121f license/copyright change
glantau
parents: 396
diff changeset
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
1e39f273ecd6 per file doxy
michaelni
parents: 926
diff changeset
19
1e39f273ecd6 per file doxy
michaelni
parents: 926
diff changeset
20 /**
1e39f273ecd6 per file doxy
michaelni
parents: 926
diff changeset
21 * @file mp3lameaudio.c
1e39f273ecd6 per file doxy
michaelni
parents: 926
diff changeset
22 * Interface to libmp3lame for mp3 encoding.
1e39f273ecd6 per file doxy
michaelni
parents: 926
diff changeset
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);
1871
9457292b0b65 disable lames leading zero "feature", fixes a few more flv encoding issues
michael
parents: 1448
diff changeset
56 lame_set_bWriteVbrTag(s->gfp,0);
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
57 if (lame_init_params(s->gfp) < 0)
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
58 goto err_close;
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
59
1941
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
60 avctx->frame_size = lame_get_framesize(s->gfp);
926
michaelni
parents: 632
diff changeset
61
michaelni
parents: 632
diff changeset
62 avctx->coded_frame= avcodec_alloc_frame();
michaelni
parents: 632
diff changeset
63 avctx->coded_frame->key_frame= 1;
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
64
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
65 return 0;
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
66
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
67 err_close:
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
68 lame_close(s->gfp);
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
69 err:
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
70 return -1;
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
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
73 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
74 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
75 };
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
76
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
77 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
78 { { 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
79 { 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
80 { 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
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 { { 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
83 { 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
84 { 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
85 },
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
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 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
89 {
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 { 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
91 { 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
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 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
95 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
96 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
97 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
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
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 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
101 {
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 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
103 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
104 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
105 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
106 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
107 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
108 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
109 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
110 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
111 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
112 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
113
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 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
115 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
116 }
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
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 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
119 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
120
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 // *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
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 *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
124 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
125 *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
126 //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
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 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
129 }
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
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
131 int MP3lame_encode_frame(AVCodecContext *avctx,
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
132 unsigned char *frame, int buf_size, void *data)
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
133 {
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
134 Mp3AudioContext *s = avctx->priv_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
135 int len, i;
1941
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
136 int lame_result;
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
137
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
138 /* lame 3.91 dies on '1-channel interleaved' data */
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
139
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
140 if(data){
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
141 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
142 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
143 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
144 data,
1941
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
145 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
146 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
147 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
148 );
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
149 } else {
1941
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
150 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
151 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
152 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
153 data,
1941
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
154 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
155 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
156 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
157 );
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
158 }
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
159 }else{
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
160 lame_result= lame_encode_flush(
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
161 s->gfp,
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
162 s->buffer + s->buffer_index,
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
163 BUFFER_SIZE - s->buffer_index
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
164 );
1941
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
165 }
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
166
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
167 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
168 /* 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
169 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
170 return 0;
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 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
174
81a1a5be13aa fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents: 1913
diff changeset
175 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
176 return 0;
1871
9457292b0b65 disable lames leading zero "feature", fixes a few more flv encoding issues
michael
parents: 1448
diff changeset
177
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
178 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
179 //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
180 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
181 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
182 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
183
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 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
185 //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
186 /*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
187 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
188 }*/
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
189 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
190 }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
191 return 0;
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
192 }
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
193
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
194 int MP3lame_encode_close(AVCodecContext *avctx)
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
195 {
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
196 Mp3AudioContext *s = avctx->priv_data;
926
michaelni
parents: 632
diff changeset
197
michaelni
parents: 632
diff changeset
198 av_freep(&avctx->coded_frame);
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
199
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
200 lame_close(s->gfp);
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
201 return 0;
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
202 }
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
203
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 AVCodec mp3lame_encoder = {
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
206 "mp3",
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
207 CODEC_TYPE_AUDIO,
1448
317ba7ab73bd CODEC_ID_MP3LAME is obsolete
bellard
parents: 1106
diff changeset
208 CODEC_ID_MP3,
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
209 sizeof(Mp3AudioContext),
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
210 MP3lame_encode_init,
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
211 MP3lame_encode_frame,
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
212 MP3lame_encode_close,
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 1941
diff changeset
213 .capabilities= CODEC_CAP_DELAY,
259
cc6292eacba6 - Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff changeset
214 };