Mercurial > libavcodec.hg
annotate libvorbis.c @ 11969:3cd4cd0509cd libavcodec
Remove PPC perf counter support
This functionality is better accessed through tools like oprofile.
| author | mru |
|---|---|
| date | Sat, 26 Jun 2010 22:23:35 +0000 |
| parents | defe337cf643 |
| children | 032a8dc03ced |
| 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" |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
31 |
|
1924
d9f751c0f488
pts hack (correct solution would be to pass the pts from the encoder to the muxer)
michael
parents:
1923
diff
changeset
|
32 #undef NDEBUG |
|
d9f751c0f488
pts hack (correct solution would be to pass the pts from the encoder to the muxer)
michael
parents:
1923
diff
changeset
|
33 #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
|
34 |
|
1922
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
35 #define OGGVORBIS_FRAME_SIZE 64 |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
36 |
|
1922
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
37 #define BUFFER_SIZE (1024*64) |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
38 |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
39 typedef struct OggVorbisContext { |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
40 vorbis_info vi ; |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
41 vorbis_dsp_state vd ; |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
42 vorbis_block vb ; |
|
1922
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
43 uint8_t buffer[BUFFER_SIZE]; |
|
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
44 int buffer_index; |
|
8028
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
45 int eof; |
| 883 | 46 |
| 47 /* decoder */ | |
| 48 vorbis_comment vc ; | |
|
1920
9b87ed973dda
kill obnoxious ogg_packet passing from demuxer to decoder
michael
parents:
1919
diff
changeset
|
49 ogg_packet op; |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
50 } OggVorbisContext ; |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
51 |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
52 |
|
9007
043574c5c153
Add missing av_cold in static init/close functions.
stefano
parents:
8781
diff
changeset
|
53 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
|
54 double cfreq; |
|
934
159333d9297e
fixes crash patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
925
diff
changeset
|
55 |
|
2850
c553a407b1b6
fixed quality / vbr encoding patch by (Justin Ruggles, jruggle, earthlink net)
michael
parents:
2716
diff
changeset
|
56 if(avccontext->flags & CODEC_FLAG_QSCALE) { |
|
3058
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
57 /* variable bitrate */ |
|
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
58 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
|
59 avccontext->sample_rate, |
| 8781 | 60 avccontext->global_quality / (float)FF_QP2LAMBDA / 10.0)) |
|
3058
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
61 return -1; |
|
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
62 } else { |
| 11827 | 63 int minrate = avccontext->rc_min_rate > 0 ? avccontext->rc_min_rate : -1; |
| 64 int maxrate = avccontext->rc_min_rate > 0 ? avccontext->rc_max_rate : -1; | |
| 65 | |
|
3058
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
66 /* constant bitrate */ |
|
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
67 if(vorbis_encode_setup_managed(vi, avccontext->channels, |
| 11827 | 68 avccontext->sample_rate, minrate, avccontext->bit_rate, maxrate)) |
|
3058
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
69 return -1; |
|
934
159333d9297e
fixes crash patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
925
diff
changeset
|
70 |
|
11829
582c0687fc63
libvorbis: Disable strict bitrate management when not requested
conrad
parents:
11828
diff
changeset
|
71 /* variable bitrate by estimate, disable slow rate management */ |
|
582c0687fc63
libvorbis: Disable strict bitrate management when not requested
conrad
parents:
11828
diff
changeset
|
72 if(minrate == -1 && maxrate == -1) |
|
582c0687fc63
libvorbis: Disable strict bitrate management when not requested
conrad
parents:
11828
diff
changeset
|
73 if(vorbis_encode_ctl(vi, OV_ECTL_RATEMANAGE2_SET, NULL)) |
|
582c0687fc63
libvorbis: Disable strict bitrate management when not requested
conrad
parents:
11828
diff
changeset
|
74 return -1; |
|
3058
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
75 } |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
76 |
|
3058
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
77 /* cutoff frequency */ |
|
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
78 if(avccontext->cutoff > 0) { |
|
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
79 cfreq = avccontext->cutoff / 1000.0; |
|
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
80 if(vorbis_encode_ctl(vi, OV_ECTL_LOWPASS_SET, &cfreq)) |
|
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
81 return -1; |
|
8936371f5a5c
Implement audio cutoff frequency to the vorbis encoder.
banan
parents:
2979
diff
changeset
|
82 } |
|
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 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
|
85 } |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
86 |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
5875
diff
changeset
|
87 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
|
88 OggVorbisContext *context = avccontext->priv_data ; |
|
1923
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
89 ogg_packet header, header_comm, header_code; |
|
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
90 uint8_t *p; |
| 2676 | 91 unsigned int offset, len; |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
92 |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
93 vorbis_info_init(&context->vi) ; |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
94 if(oggvorbis_init_encoder(&context->vi, avccontext) < 0) { |
| 9901 | 95 av_log(avccontext, AV_LOG_ERROR, "oggvorbis_encode_init: init_encoder failed\n") ; |
| 2979 | 96 return -1 ; |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
97 } |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
98 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
|
99 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
|
100 |
|
1923
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
101 vorbis_comment_init(&context->vc); |
|
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
102 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
|
103 |
|
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
104 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
|
105 &header_comm, &header_code); |
| 2967 | 106 |
| 2676 | 107 len = header.bytes + header_comm.bytes + header_code.bytes; |
| 108 avccontext->extradata_size= 64 + len + len/255; | |
| 109 p = avccontext->extradata= av_mallocz(avccontext->extradata_size); | |
| 110 p[0] = 2; | |
| 111 offset = 1; | |
| 112 offset += av_xiphlacing(&p[offset], header.bytes); | |
| 113 offset += av_xiphlacing(&p[offset], header_comm.bytes); | |
| 114 memcpy(&p[offset], header.packet, header.bytes); | |
| 115 offset += header.bytes; | |
| 116 memcpy(&p[offset], header_comm.packet, header_comm.bytes); | |
| 117 offset += header_comm.bytes; | |
| 118 memcpy(&p[offset], header_code.packet, header_code.bytes); | |
| 119 offset += header_code.bytes; | |
| 120 avccontext->extradata_size = offset; | |
| 121 avccontext->extradata= av_realloc(avccontext->extradata, avccontext->extradata_size); | |
| 2967 | 122 |
|
1923
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
123 /* vorbis_block_clear(&context->vb); |
|
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
124 vorbis_dsp_clear(&context->vd); |
|
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
125 vorbis_info_clear(&context->vi);*/ |
|
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
126 vorbis_comment_clear(&context->vc); |
| 2967 | 127 |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
128 avccontext->frame_size = OGGVORBIS_FRAME_SIZE ; |
| 2967 | 129 |
| 925 | 130 avccontext->coded_frame= avcodec_alloc_frame(); |
| 131 avccontext->coded_frame->key_frame= 1; | |
| 2967 | 132 |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
133 return 0 ; |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
134 } |
|
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 |
| 883 | 137 static int oggvorbis_encode_frame(AVCodecContext *avccontext, |
| 2979 | 138 unsigned char *packets, |
| 139 int buf_size, void *data) | |
|
636
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 OggVorbisContext *context = avccontext->priv_data ; |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
142 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
|
143 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
|
144 int l; |
|
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
145 |
|
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
146 if(data) { |
|
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
147 int samples = OGGVORBIS_FRAME_SIZE; |
|
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
148 float **buffer ; |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
149 |
| 8029 | 150 buffer = vorbis_analysis_buffer(&context->vd, samples) ; |
| 151 if(context->vi.channels == 1) { | |
| 152 for(l = 0 ; l < samples ; l++) | |
| 153 buffer[0][l]=audio[l]/32768.f; | |
| 154 } else { | |
| 155 for(l = 0 ; l < samples ; l++){ | |
| 156 buffer[0][l]=audio[l*2]/32768.f; | |
| 157 buffer[1][l]=audio[l*2+1]/32768.f; | |
| 158 } | |
| 2979 | 159 } |
| 8029 | 160 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
|
161 } else { |
|
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
162 if(!context->eof) |
|
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
163 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
|
164 context->eof = 1; |
|
66ff451487a7
Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents:
7451
diff
changeset
|
165 } |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
166 |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
167 while(vorbis_analysis_blockout(&context->vd, &context->vb) == 1) { |
| 2979 | 168 vorbis_analysis(&context->vb, NULL); |
| 169 vorbis_bitrate_addblock(&context->vb) ; | |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
170 |
| 2979 | 171 while(vorbis_bitrate_flushpacket(&context->vd, &op)) { |
|
4553
1a714d3f0233
cosmetics: Fix a common typo, sepErate --> sepArate.
diego
parents:
4122
diff
changeset
|
172 /* 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
|
173 * 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
|
174 if(op.bytes==1 && op.e_o_s) |
| 2091 | 175 continue; |
|
1922
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
176 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
|
177 context->buffer_index += sizeof(ogg_packet); |
|
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
178 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
|
179 context->buffer_index += op.bytes; |
|
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
180 // av_log(avccontext, AV_LOG_DEBUG, "e%d / %d\n", context->buffer_index, op.bytes); |
| 2979 | 181 } |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
182 } |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
183 |
|
1924
d9f751c0f488
pts hack (correct solution would be to pass the pts from the encoder to the muxer)
michael
parents:
1923
diff
changeset
|
184 l=0; |
|
1922
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
185 if(context->buffer_index){ |
|
1923
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
186 ogg_packet *op2= (ogg_packet*)context->buffer; |
|
1922
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
187 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
|
188 |
| 2091 | 189 l= op2->bytes; |
| 2857 | 190 avccontext->coded_frame->pts= av_rescale_q(op2->granulepos, (AVRational){1, avccontext->sample_rate}, avccontext->time_base); |
| 2858 | 191 //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
|
192 |
| 2091 | 193 memcpy(packets, op2->packet, l); |
| 194 context->buffer_index -= l + sizeof(ogg_packet); | |
|
11883
6a09fc06317a
libvorbis: Use memmove instead of memcpy for shifting data
mstorsjo
parents:
11829
diff
changeset
|
195 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
|
196 // 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
|
197 } |
|
0ed2d7ecd1e9
fix obnoxious ogg_packet passing from encoder to muxer
michael
parents:
1920
diff
changeset
|
198 |
|
1924
d9f751c0f488
pts hack (correct solution would be to pass the pts from the encoder to the muxer)
michael
parents:
1923
diff
changeset
|
199 return l; |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
200 } |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
201 |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
202 |
|
6517
48759bfbd073
Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents:
5875
diff
changeset
|
203 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
|
204 OggVorbisContext *context = avccontext->priv_data ; |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
205 /* ogg_packet op ; */ |
| 2967 | 206 |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
207 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
|
208 |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
209 vorbis_block_clear(&context->vb); |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
210 vorbis_dsp_clear(&context->vd); |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
211 vorbis_info_clear(&context->vi); |
| 925 | 212 |
| 213 av_freep(&avccontext->coded_frame); | |
|
1923
04f93474b3bb
remove function call from muxer->encoder and cleanly pass global headers
michael
parents:
1922
diff
changeset
|
214 av_freep(&avccontext->extradata); |
| 2967 | 215 |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
216 return 0 ; |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
217 } |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
218 |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
219 |
| 5058 | 220 AVCodec libvorbis_encoder = { |
| 221 "libvorbis", | |
|
11560
8a4984c5cacc
Define AVMediaType enum, and use it instead of enum CodecType, which
stefano
parents:
10145
diff
changeset
|
222 AVMEDIA_TYPE_AUDIO, |
|
636
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
223 CODEC_ID_VORBIS, |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
224 sizeof(OggVorbisContext), |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
225 oggvorbis_encode_init, |
|
57b9a37546a0
oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff
changeset
|
226 oggvorbis_encode_frame, |
| 2091 | 227 oggvorbis_encode_close, |
| 228 .capabilities= CODEC_CAP_DELAY, | |
|
10145
7955db355703
Make sample_fmts and channel_layouts compound literals const to reduce size of
reimar
parents:
9901
diff
changeset
|
229 .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
|
230 .long_name= NULL_IF_CONFIG_SMALL("libvorbis Vorbis"), |
| 883 | 231 } ; |
