Mercurial > libavcodec.hg
annotate libvorbis.c @ 12186:fb2f04f70afe libavcodec
ASCII/ANSI art decoder
author | pross |
---|---|
date | Sun, 18 Jul 2010 08:03:35 +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 } ; |