Mercurial > libavcodec.hg
annotate libvorbis.c @ 12197:fbf4d5b1b664 libavcodec
Remove FF_MM_SSE2/3 flags for CPUs where this is generally not faster than
regular MMX code. Examples of this are the Core1 CPU. Instead, set a new flag,
FF_MM_SSE2/3SLOW, which can be checked for particular SSE2/3 functions that
have been checked specifically on such CPUs and are actually faster than
their MMX counterparts.
In addition, use this flag to enable particular VP8 and LPC SSE2 functions
that are faster than their MMX counterparts.
Based on a patch by Loren Merritt <lorenm AT u washington edu>.
author | rbultje |
---|---|
date | Mon, 19 Jul 2010 22:38:23 +0000 |
parents | 24649290a14f |
children | a2c993c7ae90 |
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 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
5875
diff
changeset
|
88 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
|
89 OggVorbisContext *context = avccontext->priv_data ; |
1923
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
90 ogg_packet header, header_comm, header_code; |
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
91 uint8_t *p; |
2676 | 92 unsigned int offset, len; |
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
93 |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
94 vorbis_info_init(&context->vi) ; |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
95 if(oggvorbis_init_encoder(&context->vi, avccontext) < 0) { |
9901 | 96 av_log(avccontext, AV_LOG_ERROR, "oggvorbis_encode_init: init_encoder failed\n") ; |
2979 | 97 return -1 ; |
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
98 } |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
99 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
|
100 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
|
101 |
1923
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
102 vorbis_comment_init(&context->vc); |
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
103 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
|
104 |
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
105 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
|
106 &header_comm, &header_code); |
2967 | 107 |
2676 | 108 len = header.bytes + header_comm.bytes + header_code.bytes; |
109 avccontext->extradata_size= 64 + len + len/255; | |
110 p = avccontext->extradata= av_mallocz(avccontext->extradata_size); | |
111 p[0] = 2; | |
112 offset = 1; | |
113 offset += av_xiphlacing(&p[offset], header.bytes); | |
114 offset += av_xiphlacing(&p[offset], header_comm.bytes); | |
115 memcpy(&p[offset], header.packet, header.bytes); | |
116 offset += header.bytes; | |
117 memcpy(&p[offset], header_comm.packet, header_comm.bytes); | |
118 offset += header_comm.bytes; | |
119 memcpy(&p[offset], header_code.packet, header_code.bytes); | |
120 offset += header_code.bytes; | |
121 avccontext->extradata_size = offset; | |
122 avccontext->extradata= av_realloc(avccontext->extradata, avccontext->extradata_size); | |
2967 | 123 |
1923
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
124 /* vorbis_block_clear(&context->vb); |
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
125 vorbis_dsp_clear(&context->vd); |
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
126 vorbis_info_clear(&context->vi);*/ |
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
127 vorbis_comment_clear(&context->vc); |
2967 | 128 |
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
129 avccontext->frame_size = OGGVORBIS_FRAME_SIZE ; |
2967 | 130 |
925 | 131 avccontext->coded_frame= avcodec_alloc_frame(); |
132 avccontext->coded_frame->key_frame= 1; | |
2967 | 133 |
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
134 return 0 ; |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
135 } |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
136 |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
137 |
883 | 138 static int oggvorbis_encode_frame(AVCodecContext *avccontext, |
2979 | 139 unsigned char *packets, |
140 int buf_size, void *data) | |
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
141 { |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
142 OggVorbisContext *context = avccontext->priv_data ; |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
143 ogg_packet op ; |
2393
0433866b1075
fixes transcoding to vorbis with ffmpeg on big endian machines patch by (Sigbjrn Skjret {sskjer-1 broadpark no})
michael
parents:
2091
diff
changeset
|
144 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
|
145 int l; |
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
146 |
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
147 if(data) { |
12132 | 148 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
|
149 float **buffer ; |
11977
032a8dc03ced
Fix libvorbis encoding with more than 2 channels
mstorsjo
parents:
11907
diff
changeset
|
150 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
|
151 |
8029 | 152 buffer = vorbis_analysis_buffer(&context->vd, samples) ; |
11977
032a8dc03ced
Fix libvorbis encoding with more than 2 channels
mstorsjo
parents:
11907
diff
changeset
|
153 for (c = 0; c < channels; c++) { |
032a8dc03ced
Fix libvorbis encoding with more than 2 channels
mstorsjo
parents:
11907
diff
changeset
|
154 int co = (channels > 8) ? c : |
032a8dc03ced
Fix libvorbis encoding with more than 2 channels
mstorsjo
parents:
11907
diff
changeset
|
155 ff_vorbis_encoding_channel_layout_offsets[channels-1][c]; |
8029 | 156 for(l = 0 ; l < samples ; l++) |
11977
032a8dc03ced
Fix libvorbis encoding with more than 2 channels
mstorsjo
parents:
11907
diff
changeset
|
157 buffer[c][l]=audio[l*channels+co]/32768.f; |
2979 | 158 } |
8029 | 159 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
|
160 } else { |
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
161 if(!context->eof) |
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
162 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
|
163 context->eof = 1; |
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
164 } |
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
165 |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
166 while(vorbis_analysis_blockout(&context->vd, &context->vb) == 1) { |
2979 | 167 vorbis_analysis(&context->vb, NULL); |
168 vorbis_bitrate_addblock(&context->vb) ; | |
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
169 |
2979 | 170 while(vorbis_bitrate_flushpacket(&context->vd, &op)) { |
4553
1a714d3f0233
cosmetics: Fix a common typo, sepErate --> sepArate.
diego
parents:
4122
diff
changeset
|
171 /* 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
|
172 * 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
|
173 if(op.bytes==1 && op.e_o_s) |
2091 | 174 continue; |
12133 | 175 if (context->buffer_index + sizeof(ogg_packet) + op.bytes > BUFFER_SIZE) { |
176 av_log(avccontext, AV_LOG_ERROR, "libvorbis: buffer overflow."); | |
177 return -1; | |
178 } | |
1922
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
179 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
|
180 context->buffer_index += sizeof(ogg_packet); |
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
181 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
|
182 context->buffer_index += op.bytes; |
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
183 // av_log(avccontext, AV_LOG_DEBUG, "e%d / %d\n", context->buffer_index, op.bytes); |
2979 | 184 } |
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
185 } |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
186 |
1924
d9f751c0f488
pts hack (correct solution would be to pass the pts from the encoder to the muxer)
michael
parents:
1923
diff
changeset
|
187 l=0; |
1922
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
188 if(context->buffer_index){ |
1923
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
189 ogg_packet *op2= (ogg_packet*)context->buffer; |
1922
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
190 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
|
191 |
2091 | 192 l= op2->bytes; |
2857 | 193 avccontext->coded_frame->pts= av_rescale_q(op2->granulepos, (AVRational){1, avccontext->sample_rate}, avccontext->time_base); |
2858 | 194 //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
|
195 |
12133 | 196 if (l > buf_size) { |
197 av_log(avccontext, AV_LOG_ERROR, "libvorbis: buffer overflow."); | |
198 return -1; | |
199 } | |
200 | |
2091 | 201 memcpy(packets, op2->packet, l); |
202 context->buffer_index -= l + sizeof(ogg_packet); | |
11883
6a09fc06317a
libvorbis: Use memmove instead of memcpy for shifting data
mstorsjo
parents:
11829
diff
changeset
|
203 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
|
204 // 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
|
205 } |
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
206 |
1924
d9f751c0f488
pts hack (correct solution would be to pass the pts from the encoder to the muxer)
michael
parents:
1923
diff
changeset
|
207 return l; |
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
208 } |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
209 |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
210 |
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
5875
diff
changeset
|
211 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
|
212 OggVorbisContext *context = avccontext->priv_data ; |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
213 /* ogg_packet op ; */ |
2967 | 214 |
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
215 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
|
216 |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
217 vorbis_block_clear(&context->vb); |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
218 vorbis_dsp_clear(&context->vd); |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
219 vorbis_info_clear(&context->vi); |
925 | 220 |
221 av_freep(&avccontext->coded_frame); | |
1923
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
222 av_freep(&avccontext->extradata); |
2967 | 223 |
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
224 return 0 ; |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
225 } |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
226 |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
227 |
5058 | 228 AVCodec libvorbis_encoder = { |
229 "libvorbis", | |
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
10145
diff
changeset
|
230 AVMEDIA_TYPE_AUDIO, |
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
231 CODEC_ID_VORBIS, |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
232 sizeof(OggVorbisContext), |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
233 oggvorbis_encode_init, |
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
234 oggvorbis_encode_frame, |
2091 | 235 oggvorbis_encode_close, |
236 .capabilities= CODEC_CAP_DELAY, | |
10145
7955db355703
Make sample_fmts and channel_layouts compound literals const to reduce size of
reimar
parents:
9901
diff
changeset
|
237 .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
|
238 .long_name= NULL_IF_CONFIG_SMALL("libvorbis Vorbis"), |
883 | 239 } ; |