Mercurial > libavcodec.hg
annotate libvorbis.c @ 12475:9fef0a8ddd63 libavcodec
Move mm_support() from libavcodec to libavutil, make it a public
function and rename it to av_get_cpu_flags().
| author | stefano |
|---|---|
| date | Wed, 08 Sep 2010 15:07:14 +0000 |
| parents | a2c993c7ae90 |
| children |
| rev | line source |
|---|---|
|
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3058
diff
changeset
|
1 /* |
|
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3058
diff
changeset
|
2 * copyright (c) 2002 Mark Hills <mark@pogo.org.uk> |
|
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3058
diff
changeset
|
3 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
4 * This file is part of FFmpeg. |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
5 * |
|
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
6 * FFmpeg is free software; you can redistribute it and/or |
|
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3058
diff
changeset
|
7 * modify it under the terms of the GNU Lesser General Public |
|
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3058
diff
changeset
|
8 * 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:
3699
diff
changeset
|
9 * version 2.1 of the License, or (at your option) any later version. |
|
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3058
diff
changeset
|
10 * |
|
3947
c8c591fe26f8
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
3699
diff
changeset
|
11 * FFmpeg is distributed in the hope that it will be useful, |
|
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3058
diff
changeset
|
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3058
diff
changeset
|
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
|
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3058
diff
changeset
|
14 * Lesser General Public License for more details. |
|
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3058
diff
changeset
|
15 * |
|
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3058
diff
changeset
|
16 * 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:
3699
diff
changeset
|
17 * License along with FFmpeg; if not, write to the Free Software |
| 5215 | 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
|
3699
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3058
diff
changeset
|
19 */ |
|
c537a97eec66
Add official LGPL license headers to the files that were missing them.
diego
parents:
3058
diff
changeset
|
20 |
| 1106 | 21 /** |
|
11644
7dd2a45249a9
Remove explicit filename from Doxygen @file commands.
diego
parents:
11560
diff
changeset
|
22 * @file |
| 1106 | 23 * Ogg Vorbis codec support via libvorbisenc. |
| 24 * @author Mark Hills <mark@pogo.org.uk> | |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
25 */ |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
26 |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
27 #include <vorbis/vorbisenc.h> |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
28 |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
29 #include "avcodec.h" |
| 5089 | 30 #include "bytestream.h" |
|
11977
032a8dc03ced
Fix libvorbis encoding with more than 2 channels
mstorsjo
parents:
11907
diff
changeset
|
31 #include "vorbis.h" |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
32 |
|
1924
d9f751c0f488
pts hack (correct solution would be to pass the pts from the encoder to the muxer)
michael
parents:
1923
diff
changeset
|
33 #undef NDEBUG |
|
d9f751c0f488
pts hack (correct solution would be to pass the pts from the encoder to the muxer)
michael
parents:
1923
diff
changeset
|
34 #include <assert.h> |
|
d9f751c0f488
pts hack (correct solution would be to pass the pts from the encoder to the muxer)
michael
parents:
1923
diff
changeset
|
35 |
|
1922
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
36 #define OGGVORBIS_FRAME_SIZE 64 |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
37 |
|
1922
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
38 #define BUFFER_SIZE (1024*64) |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
39 |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
40 typedef struct OggVorbisContext { |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
41 vorbis_info vi ; |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
42 vorbis_dsp_state vd ; |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
43 vorbis_block vb ; |
|
1922
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
44 uint8_t buffer[BUFFER_SIZE]; |
|
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
45 int buffer_index; |
|
8028
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
46 int eof; |
| 883 | 47 |
| 48 /* decoder */ | |
| 49 vorbis_comment vc ; | |
|
1920
9b87ed973dda
kill obnoxious ogg_packet passing from demuxer to decoder
michael
parents:
1919
diff
changeset
|
50 ogg_packet op; |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
51 } OggVorbisContext ; |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
52 |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
53 |
|
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8781
diff
changeset
|
54 static av_cold int oggvorbis_init_encoder(vorbis_info *vi, AVCodecContext *avccontext) { |
|
3058
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
55 double cfreq; |
|
934
159333d9297e
fixes crash patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
925
diff
changeset
|
56 |
|
2850
c553a407b1b6
fixed quality / vbr encoding patch by (Justin Ruggles, jruggle, earthlink net)
michael
parents:
2716
diff
changeset
|
57 if(avccontext->flags & CODEC_FLAG_QSCALE) { |
|
3058
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
58 /* variable bitrate */ |
|
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
59 if(vorbis_encode_setup_vbr(vi, avccontext->channels, |
|
2850
c553a407b1b6
fixed quality / vbr encoding patch by (Justin Ruggles, jruggle, earthlink net)
michael
parents:
2716
diff
changeset
|
60 avccontext->sample_rate, |
| 8781 | 61 avccontext->global_quality / (float)FF_QP2LAMBDA / 10.0)) |
|
3058
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
62 return -1; |
|
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
63 } else { |
| 11827 | 64 int minrate = avccontext->rc_min_rate > 0 ? avccontext->rc_min_rate : -1; |
| 65 int maxrate = avccontext->rc_min_rate > 0 ? avccontext->rc_max_rate : -1; | |
| 66 | |
|
3058
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
67 /* constant bitrate */ |
|
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
68 if(vorbis_encode_setup_managed(vi, avccontext->channels, |
| 11827 | 69 avccontext->sample_rate, minrate, avccontext->bit_rate, maxrate)) |
|
3058
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
70 return -1; |
|
934
159333d9297e
fixes crash patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
925
diff
changeset
|
71 |
|
11829
582c0687fc63
libvorbis: Disable strict bitrate management when not requested
conrad
parents:
11828
diff
changeset
|
72 /* variable bitrate by estimate, disable slow rate management */ |
|
582c0687fc63
libvorbis: Disable strict bitrate management when not requested
conrad
parents:
11828
diff
changeset
|
73 if(minrate == -1 && maxrate == -1) |
|
582c0687fc63
libvorbis: Disable strict bitrate management when not requested
conrad
parents:
11828
diff
changeset
|
74 if(vorbis_encode_ctl(vi, OV_ECTL_RATEMANAGE2_SET, NULL)) |
|
582c0687fc63
libvorbis: Disable strict bitrate management when not requested
conrad
parents:
11828
diff
changeset
|
75 return -1; |
|
3058
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
76 } |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
77 |
|
3058
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
78 /* cutoff frequency */ |
|
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
79 if(avccontext->cutoff > 0) { |
|
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
80 cfreq = avccontext->cutoff / 1000.0; |
|
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
81 if(vorbis_encode_ctl(vi, OV_ECTL_LOWPASS_SET, &cfreq)) |
|
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
82 return -1; |
|
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
83 } |
|
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
84 |
|
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
85 return vorbis_encode_setup_init(vi); |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
86 } |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
87 |
| 12203 | 88 /* How many bytes are needed for a buffer of length 'l' */ |
| 89 static int xiph_len(int l) { return (1 + l / 255 + l); } | |
| 90 | |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
5875
diff
changeset
|
91 static av_cold int oggvorbis_encode_init(AVCodecContext *avccontext) { |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
92 OggVorbisContext *context = avccontext->priv_data ; |
|
1923
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
93 ogg_packet header, header_comm, header_code; |
|
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
94 uint8_t *p; |
| 12203 | 95 unsigned int offset; |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
96 |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
97 vorbis_info_init(&context->vi) ; |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
98 if(oggvorbis_init_encoder(&context->vi, avccontext) < 0) { |
| 9901 | 99 av_log(avccontext, AV_LOG_ERROR, "oggvorbis_encode_init: init_encoder failed\n") ; |
| 2979 | 100 return -1 ; |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
101 } |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
102 vorbis_analysis_init(&context->vd, &context->vi) ; |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
103 vorbis_block_init(&context->vd, &context->vb) ; |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
104 |
|
1923
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
105 vorbis_comment_init(&context->vc); |
|
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
106 vorbis_comment_add_tag(&context->vc, "encoder", LIBAVCODEC_IDENT) ; |
|
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
107 |
|
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
108 vorbis_analysis_headerout(&context->vd, &context->vc, &header, |
|
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
109 &header_comm, &header_code); |
| 2967 | 110 |
| 12203 | 111 avccontext->extradata_size= |
| 112 1 + xiph_len(header.bytes) + xiph_len(header_comm.bytes) + | |
| 113 header_code.bytes; | |
| 114 p = avccontext->extradata = | |
| 115 av_malloc(avccontext->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE); | |
| 2676 | 116 p[0] = 2; |
| 117 offset = 1; | |
| 118 offset += av_xiphlacing(&p[offset], header.bytes); | |
| 119 offset += av_xiphlacing(&p[offset], header_comm.bytes); | |
| 120 memcpy(&p[offset], header.packet, header.bytes); | |
| 121 offset += header.bytes; | |
| 122 memcpy(&p[offset], header_comm.packet, header_comm.bytes); | |
| 123 offset += header_comm.bytes; | |
| 124 memcpy(&p[offset], header_code.packet, header_code.bytes); | |
| 125 offset += header_code.bytes; | |
| 12203 | 126 assert(offset == avccontext->extradata_size); |
| 2967 | 127 |
|
1923
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
128 /* vorbis_block_clear(&context->vb); |
|
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
129 vorbis_dsp_clear(&context->vd); |
|
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
130 vorbis_info_clear(&context->vi);*/ |
|
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
131 vorbis_comment_clear(&context->vc); |
| 2967 | 132 |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
133 avccontext->frame_size = OGGVORBIS_FRAME_SIZE ; |
| 2967 | 134 |
| 925 | 135 avccontext->coded_frame= avcodec_alloc_frame(); |
| 136 avccontext->coded_frame->key_frame= 1; | |
| 2967 | 137 |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
138 return 0 ; |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
139 } |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
140 |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
141 |
| 883 | 142 static int oggvorbis_encode_frame(AVCodecContext *avccontext, |
| 2979 | 143 unsigned char *packets, |
| 144 int buf_size, void *data) | |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
145 { |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
146 OggVorbisContext *context = avccontext->priv_data ; |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
147 ogg_packet op ; |
|
2393
0433866b1075
fixes transcoding to vorbis with ffmpeg on big endian machines patch by (Sigbj?rn Skj?ret {sskjer-1 broadpark no})
michael
parents:
2091
diff
changeset
|
148 signed short *audio = data ; |
|
8028
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
149 int l; |
|
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
150 |
|
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
151 if(data) { |
| 12132 | 152 const int samples = avccontext->frame_size; |
|
8028
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
153 float **buffer ; |
|
11977
032a8dc03ced
Fix libvorbis encoding with more than 2 channels
mstorsjo
parents:
11907
diff
changeset
|
154 int c, channels = context->vi.channels; |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
155 |
| 8029 | 156 buffer = vorbis_analysis_buffer(&context->vd, samples) ; |
|
11977
032a8dc03ced
Fix libvorbis encoding with more than 2 channels
mstorsjo
parents:
11907
diff
changeset
|
157 for (c = 0; c < channels; c++) { |
|
032a8dc03ced
Fix libvorbis encoding with more than 2 channels
mstorsjo
parents:
11907
diff
changeset
|
158 int co = (channels > 8) ? c : |
|
032a8dc03ced
Fix libvorbis encoding with more than 2 channels
mstorsjo
parents:
11907
diff
changeset
|
159 ff_vorbis_encoding_channel_layout_offsets[channels-1][c]; |
| 8029 | 160 for(l = 0 ; l < samples ; l++) |
|
11977
032a8dc03ced
Fix libvorbis encoding with more than 2 channels
mstorsjo
parents:
11907
diff
changeset
|
161 buffer[c][l]=audio[l*channels+co]/32768.f; |
| 2979 | 162 } |
| 8029 | 163 vorbis_analysis_wrote(&context->vd, samples) ; |
|
8028
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
164 } else { |
|
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
165 if(!context->eof) |
|
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
166 vorbis_analysis_wrote(&context->vd, 0) ; |
|
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
167 context->eof = 1; |
|
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
168 } |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
169 |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
170 while(vorbis_analysis_blockout(&context->vd, &context->vb) == 1) { |
| 2979 | 171 vorbis_analysis(&context->vb, NULL); |
| 172 vorbis_bitrate_addblock(&context->vb) ; | |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
173 |
| 2979 | 174 while(vorbis_bitrate_flushpacket(&context->vd, &op)) { |
|
4553
1a714d3f0233
cosmetics: Fix a common typo, sepErate --> sepArate.
diego
parents:
4122
diff
changeset
|
175 /* i'd love to say the following line is a hack, but sadly it's |
|
1a714d3f0233
cosmetics: Fix a common typo, sepErate --> sepArate.
diego
parents:
4122
diff
changeset
|
176 * not, apparently the end of stream decision is in libogg. */ |
|
11907
defe337cf643
libvorbis: Only drop 1-byte packets at end of stream
mstorsjo
parents:
11883
diff
changeset
|
177 if(op.bytes==1 && op.e_o_s) |
| 2091 | 178 continue; |
| 12133 | 179 if (context->buffer_index + sizeof(ogg_packet) + op.bytes > BUFFER_SIZE) { |
| 180 av_log(avccontext, AV_LOG_ERROR, "libvorbis: buffer overflow."); | |
| 181 return -1; | |
| 182 } | |
|
1922
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
183 memcpy(context->buffer + context->buffer_index, &op, sizeof(ogg_packet)); |
|
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
184 context->buffer_index += sizeof(ogg_packet); |
|
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
185 memcpy(context->buffer + context->buffer_index, op.packet, op.bytes); |
|
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
186 context->buffer_index += op.bytes; |
|
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
187 // av_log(avccontext, AV_LOG_DEBUG, "e%d / %d\n", context->buffer_index, op.bytes); |
| 2979 | 188 } |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
189 } |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
190 |
|
1924
d9f751c0f488
pts hack (correct solution would be to pass the pts from the encoder to the muxer)
michael
parents:
1923
diff
changeset
|
191 l=0; |
|
1922
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
192 if(context->buffer_index){ |
|
1923
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
193 ogg_packet *op2= (ogg_packet*)context->buffer; |
|
1922
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
194 op2->packet = context->buffer + sizeof(ogg_packet); |
|
1924
d9f751c0f488
pts hack (correct solution would be to pass the pts from the encoder to the muxer)
michael
parents:
1923
diff
changeset
|
195 |
| 2091 | 196 l= op2->bytes; |
| 2857 | 197 avccontext->coded_frame->pts= av_rescale_q(op2->granulepos, (AVRational){1, avccontext->sample_rate}, avccontext->time_base); |
| 2858 | 198 //FIXME we should reorder the user supplied pts and not assume that they are spaced by 1/sample_rate |
|
1924
d9f751c0f488
pts hack (correct solution would be to pass the pts from the encoder to the muxer)
michael
parents:
1923
diff
changeset
|
199 |
| 12133 | 200 if (l > buf_size) { |
| 201 av_log(avccontext, AV_LOG_ERROR, "libvorbis: buffer overflow."); | |
| 202 return -1; | |
| 203 } | |
| 204 | |
| 2091 | 205 memcpy(packets, op2->packet, l); |
| 206 context->buffer_index -= l + sizeof(ogg_packet); | |
|
11883
6a09fc06317a
libvorbis: Use memmove instead of memcpy for shifting data
mstorsjo
parents:
11829
diff
changeset
|
207 memmove(context->buffer, context->buffer + l + sizeof(ogg_packet), context->buffer_index); |
|
1922
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
208 // av_log(avccontext, AV_LOG_DEBUG, "E%d\n", l); |
|
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
209 } |
|
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
210 |
|
1924
d9f751c0f488
pts hack (correct solution would be to pass the pts from the encoder to the muxer)
michael
parents:
1923
diff
changeset
|
211 return l; |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
212 } |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
213 |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
214 |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
5875
diff
changeset
|
215 static av_cold int oggvorbis_encode_close(AVCodecContext *avccontext) { |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
216 OggVorbisContext *context = avccontext->priv_data ; |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
217 /* ogg_packet op ; */ |
| 2967 | 218 |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
219 vorbis_analysis_wrote(&context->vd, 0) ; /* notify vorbisenc this is EOF */ |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
220 |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
221 vorbis_block_clear(&context->vb); |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
222 vorbis_dsp_clear(&context->vd); |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
223 vorbis_info_clear(&context->vi); |
| 925 | 224 |
| 225 av_freep(&avccontext->coded_frame); | |
|
1923
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
226 av_freep(&avccontext->extradata); |
| 2967 | 227 |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
228 return 0 ; |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
229 } |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
230 |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
231 |
| 5058 | 232 AVCodec libvorbis_encoder = { |
| 233 "libvorbis", | |
|
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
10145
diff
changeset
|
234 AVMEDIA_TYPE_AUDIO, |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
235 CODEC_ID_VORBIS, |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
236 sizeof(OggVorbisContext), |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
237 oggvorbis_encode_init, |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
238 oggvorbis_encode_frame, |
| 2091 | 239 oggvorbis_encode_close, |
| 240 .capabilities= CODEC_CAP_DELAY, | |
|
10145
7955db355703
Make sample_fmts and channel_layouts compound literals const to reduce size of
reimar
parents:
9901
diff
changeset
|
241 .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
|
242 .long_name= NULL_IF_CONFIG_SMALL("libvorbis Vorbis"), |
| 883 | 243 } ; |
