Mercurial > libavcodec.hg
annotate libmp3lame.c @ 10311:943b63f364ca libavcodec
Make sure all the bits are written to output in fax data decoder.
This fixes decoding TIFF images with fax compression and width being not
multiple of eight (and issue 1429).
author | kostya |
---|---|
date | Tue, 29 Sep 2009 05:55:14 +0000 |
parents | 7955db355703 |
children | 8a4984c5cacc |
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 /** |
8718
e9d9d946f213
Use full internal pathname in doxygen @file directives.
diego
parents:
8673
diff
changeset
|
23 * @file libavcodec/libmp3lame.c |
1106 | 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 |
8571 | 31 #define BUFFER_SIZE (7200 + 2*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 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6346
diff
changeset
|
39 static av_cold int MP3lame_encode_init(AVCodecContext *avctx) |
259
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); |
7457
3c616a62a446
Use compression level to set mp3lame quality option.
benoit
parents:
7451
diff
changeset
|
53 if(avctx->compression_level == FF_COMPRESSION_DEFAULT) { |
3c616a62a446
Use compression level to set mp3lame quality option.
benoit
parents:
7451
diff
changeset
|
54 lame_set_quality(s->gfp, 5); |
3c616a62a446
Use compression level to set mp3lame quality option.
benoit
parents:
7451
diff
changeset
|
55 } else { |
3c616a62a446
Use compression level to set mp3lame quality option.
benoit
parents:
7451
diff
changeset
|
56 lame_set_quality(s->gfp, avctx->compression_level); |
3c616a62a446
Use compression level to set mp3lame quality option.
benoit
parents:
7451
diff
changeset
|
57 } |
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
3947
diff
changeset
|
58 /* lame 3.91 doesn't work in mono */ |
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
3947
diff
changeset
|
59 lame_set_mode(s->gfp, JOINT_STEREO); |
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
3947
diff
changeset
|
60 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
|
61 if(avctx->flags & CODEC_FLAG_QSCALE) { |
bceeca1bb30f
vbr audio encode patch by (Justin Ruggles: jruggle, earthlink net)
michael
parents:
2522
diff
changeset
|
62 lame_set_brate(s->gfp, 0); |
bceeca1bb30f
vbr audio encode patch by (Justin Ruggles: jruggle, earthlink net)
michael
parents:
2522
diff
changeset
|
63 lame_set_VBR(s->gfp, vbr_default); |
bceeca1bb30f
vbr audio encode patch by (Justin Ruggles: jruggle, earthlink net)
michael
parents:
2522
diff
changeset
|
64 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
|
65 } |
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
3947
diff
changeset
|
66 lame_set_bWriteVbrTag(s->gfp,0); |
6346
11a44fc273a5
Add 'reservoir' flag to lavc's flags2 controlling whether or not codes may
andoma
parents:
5395
diff
changeset
|
67 lame_set_disable_reservoir(s->gfp, avctx->flags2 & CODEC_FLAG2_BIT_RESERVOIR ? 0 : 1); |
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
3947
diff
changeset
|
68 if (lame_init_params(s->gfp) < 0) |
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
3947
diff
changeset
|
69 goto err_close; |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
70 |
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
3947
diff
changeset
|
71 avctx->frame_size = lame_get_framesize(s->gfp); |
2967 | 72 |
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
3947
diff
changeset
|
73 avctx->coded_frame= avcodec_alloc_frame(); |
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
3947
diff
changeset
|
74 avctx->coded_frame->key_frame= 1; |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
75 |
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
3947
diff
changeset
|
76 return 0; |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
77 |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
78 err_close: |
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
3947
diff
changeset
|
79 lame_close(s->gfp); |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
80 err: |
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
3947
diff
changeset
|
81 return -1; |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
82 } |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
83 |
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
|
84 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
|
85 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
|
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 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
|
89 { { 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
|
90 { 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
|
91 { 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
|
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 { { 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
|
94 { 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
|
95 { 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
|
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 }; |
486236d25f89
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 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
|
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 { 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
|
102 { 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
|
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 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
|
106 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
|
107 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
|
108 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
|
109 }; |
486236d25f89
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 |
486236d25f89
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 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
|
112 { |
5089 | 113 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
|
114 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
|
115 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
|
116 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
|
117 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
|
118 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
|
119 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
|
120 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
|
121 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
|
122 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
|
123 |
486236d25f89
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 ( (( 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
|
125 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
|
126 } |
2967 | 127 |
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
|
128 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
|
129 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
|
130 |
486236d25f89
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 // *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
|
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 *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
|
134 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
|
135 *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
|
136 //av_log(NULL, AV_LOG_DEBUG, "sr:%d br:%d spf:%d l:%d m:%d\n", *sampleRate, bitRate, *samplesPerFrame, layerID, mode); |
2967 | 137 |
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
|
138 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
|
139 } |
486236d25f89
split stream into valid mp3 frames, at least flv & nut absolutely need this, but probably most other formats too
michael
parents:
1871
diff
changeset
|
140 |
4170 | 141 static int MP3lame_encode_frame(AVCodecContext *avctx, |
142 unsigned char *frame, int buf_size, void *data) | |
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 Mp3AudioContext *s = avctx->priv_data; |
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
3947
diff
changeset
|
145 int len; |
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
3947
diff
changeset
|
146 int lame_result; |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
147 |
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
3947
diff
changeset
|
148 /* lame 3.91 dies on '1-channel interleaved' data */ |
2091 | 149 |
150 if(data){ | |
151 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
|
152 lame_result = lame_encode_buffer_interleaved( |
2967 | 153 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
|
154 data, |
2967 | 155 avctx->frame_size, |
156 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
|
157 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
|
158 ); |
2091 | 159 } else { |
1941
81a1a5be13aa
fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents:
1913
diff
changeset
|
160 lame_result = lame_encode_buffer( |
2967 | 161 s->gfp, |
162 data, | |
163 data, | |
1941
81a1a5be13aa
fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents:
1913
diff
changeset
|
164 avctx->frame_size, |
2967 | 165 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
|
166 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
|
167 ); |
2091 | 168 } |
169 }else{ | |
170 lame_result= lame_encode_flush( | |
2967 | 171 s->gfp, |
172 s->buffer + s->buffer_index, | |
2091 | 173 BUFFER_SIZE - s->buffer_index |
174 ); | |
1941
81a1a5be13aa
fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents:
1913
diff
changeset
|
175 } |
81a1a5be13aa
fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents:
1913
diff
changeset
|
176 |
8569 | 177 if(lame_result < 0){ |
8570 | 178 if(lame_result==-1) { |
179 /* output buffer too small */ | |
180 av_log(avctx, AV_LOG_ERROR, "lame: output buffer too small (buffer index: %d, free bytes: %d)\n", s->buffer_index, BUFFER_SIZE - s->buffer_index); | |
181 } | |
8569 | 182 return -1; |
1941
81a1a5be13aa
fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents:
1913
diff
changeset
|
183 } |
81a1a5be13aa
fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents:
1913
diff
changeset
|
184 |
81a1a5be13aa
fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents:
1913
diff
changeset
|
185 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
|
186 |
81a1a5be13aa
fixed buffering for low bitrates patch by (Hauke Duden <H.NS.Duden at gmx dot net>)
michael
parents:
1913
diff
changeset
|
187 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
|
188 return 0; |
1871
9457292b0b65
disable lames leading zero "feature", fixes a few more flv encoding issues
michael
parents:
1448
diff
changeset
|
189 |
8570 | 190 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
|
191 //av_log(avctx, AV_LOG_DEBUG, "in:%d packet-len:%d index:%d\n", avctx->frame_size, len, s->buffer_index); |
8570 | 192 if(len <= s->buffer_index){ |
193 memcpy(frame, s->buffer, len); | |
194 s->buffer_index -= len; | |
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 |
8570 | 196 memmove(s->buffer, s->buffer+len, s->buffer_index); |
5127 | 197 //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
|
198 /*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
|
199 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
|
200 }*/ |
8570 | 201 return len; |
202 }else | |
203 return 0; | |
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 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
6346
diff
changeset
|
206 static av_cold int MP3lame_encode_close(AVCodecContext *avctx) |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
207 { |
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
3947
diff
changeset
|
208 Mp3AudioContext *s = avctx->priv_data; |
2967 | 209 |
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
3947
diff
changeset
|
210 av_freep(&avctx->coded_frame); |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
211 |
4119
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
3947
diff
changeset
|
212 lame_close(s->gfp); |
85438e10d72d
reindentation, patch by From: Steve Lhomme, slhomme divxcorp com
diego
parents:
3947
diff
changeset
|
213 return 0; |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
214 } |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
215 |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
216 |
5103
1deb3e53da27
Consistent naming and lib prefixes for x264, xvid and mp3lame within the code.
diego
parents:
5101
diff
changeset
|
217 AVCodec libmp3lame_encoder = { |
1deb3e53da27
Consistent naming and lib prefixes for x264, xvid and mp3lame within the code.
diego
parents:
5101
diff
changeset
|
218 "libmp3lame", |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
219 CODEC_TYPE_AUDIO, |
1448 | 220 CODEC_ID_MP3, |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
221 sizeof(Mp3AudioContext), |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
222 MP3lame_encode_init, |
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
223 MP3lame_encode_frame, |
2091 | 224 MP3lame_encode_close, |
225 .capabilities= CODEC_CAP_DELAY, | |
10145
7955db355703
Make sample_fmts and channel_layouts compound literals const to reduce size of
reimar
parents:
8718
diff
changeset
|
226 .sample_fmts = (const enum SampleFormat[]){SAMPLE_FMT_S16,SAMPLE_FMT_NONE}, |
7040
e943e1409077
Make AVCodec long_names definition conditional depending on CONFIG_SMALL.
stefano
parents:
6712
diff
changeset
|
227 .long_name= NULL_IF_CONFIG_SMALL("libmp3lame MP3 (MPEG audio layer 3)"), |
259
cc6292eacba6
- Added MP3 encoding through libmp3lame contributed by Lennert Buytenhek.
pulento
parents:
diff
changeset
|
228 }; |