annotate libvorbis.c @ 12530:63edd10ad4bc libavcodec tip

Try to fix crashes introduced by r25218 r25218 made assumptions about the existence of past reference frames that weren't necessarily true.
author darkshikari
date Tue, 28 Sep 2010 09:06:22 +0000
parents a2c993c7ae90
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
2b72f9bc4f06 license header consistency cosmetics
diego
parents: 5101
diff changeset
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
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
21 /**
11644
7dd2a45249a9 Remove explicit filename from Doxygen @file commands.
diego
parents: 11560
diff changeset
22 * @file
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
23 * Ogg Vorbis codec support via libvorbisenc.
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
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
bff60ecc02f9 Use AV_xx throughout libavcodec
ramiro
parents: 5058
diff changeset
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
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
47
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
48 /* decoder */
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
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
0960d775e97b libvorbis: Use 0-10 range for audio quality.
jbr
parents: 8718
diff changeset
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
e778b61f86f2 libvorbis: Hook up min/max bitrate
conrad
parents: 11644
diff changeset
64 int minrate = avccontext->rc_min_rate > 0 ? avccontext->rc_min_rate : -1;
e778b61f86f2 libvorbis: Hook up min/max bitrate
conrad
parents: 11644
diff changeset
65 int maxrate = avccontext->rc_min_rate > 0 ? avccontext->rc_max_rate : -1;
e778b61f86f2 libvorbis: Hook up min/max bitrate
conrad
parents: 11644
diff changeset
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
e778b61f86f2 libvorbis: Hook up min/max bitrate
conrad
parents: 11644
diff changeset
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
a2c993c7ae90 remove an unneeded av_realloc()
skal
parents: 12133
diff changeset
88 /* How many bytes are needed for a buffer of length 'l' */
a2c993c7ae90 remove an unneeded av_realloc()
skal
parents: 12133
diff changeset
89 static int xiph_len(int l) { return (1 + l / 255 + l); }
a2c993c7ae90 remove an unneeded av_realloc()
skal
parents: 12133
diff changeset
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
a2c993c7ae90 remove an unneeded av_realloc()
skal
parents: 12133
diff changeset
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
3f766c507a70 add missing \n to error message
bcoudurier
parents: 9007
diff changeset
99 av_log(avccontext, AV_LOG_ERROR, "oggvorbis_encode_init: init_encoder failed\n") ;
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
110
12203
a2c993c7ae90 remove an unneeded av_realloc()
skal
parents: 12133
diff changeset
111 avccontext->extradata_size=
a2c993c7ae90 remove an unneeded av_realloc()
skal
parents: 12133
diff changeset
112 1 + xiph_len(header.bytes) + xiph_len(header_comm.bytes) +
a2c993c7ae90 remove an unneeded av_realloc()
skal
parents: 12133
diff changeset
113 header_code.bytes;
a2c993c7ae90 remove an unneeded av_realloc()
skal
parents: 12133
diff changeset
114 p = avccontext->extradata =
a2c993c7ae90 remove an unneeded av_realloc()
skal
parents: 12133
diff changeset
115 av_malloc(avccontext->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
2676
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
116 p[0] = 2;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
117 offset = 1;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
118 offset += av_xiphlacing(&p[offset], header.bytes);
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
119 offset += av_xiphlacing(&p[offset], header_comm.bytes);
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
120 memcpy(&p[offset], header.packet, header.bytes);
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
121 offset += header.bytes;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
122 memcpy(&p[offset], header_comm.packet, header_comm.bytes);
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
123 offset += header_comm.bytes;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
124 memcpy(&p[offset], header_code.packet, header_code.bytes);
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
125 offset += header_code.bytes;
12203
a2c993c7ae90 remove an unneeded av_realloc()
skal
parents: 12133
diff changeset
126 assert(offset == avccontext->extradata_size);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
134
925
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 883
diff changeset
135 avccontext->coded_frame= avcodec_alloc_frame();
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 883
diff changeset
136 avccontext->coded_frame->key_frame= 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
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
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
142 static int oggvorbis_encode_frame(AVCodecContext *avccontext,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
143 unsigned char *packets,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
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 (Sigbjrn Skjret {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
189c04335897 use avccontext->frame_size where appropriate
skal
parents: 11977
diff changeset
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
e50d7ac76945 Cosmetics: fix indentation after previous commit.
benoit
parents: 8028
diff changeset
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
e50d7ac76945 Cosmetics: fix indentation after previous commit.
benoit
parents: 8028
diff changeset
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
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
162 }
8029
e50d7ac76945 Cosmetics: fix indentation after previous commit.
benoit
parents: 8028
diff changeset
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
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
171 vorbis_analysis(&context->vb, NULL);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
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
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
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
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
178 continue;
12133
24649290a14f add some buffer checks
skal
parents: 12132
diff changeset
179 if (context->buffer_index + sizeof(ogg_packet) + op.bytes > BUFFER_SIZE) {
24649290a14f add some buffer checks
skal
parents: 12132
diff changeset
180 av_log(avccontext, AV_LOG_ERROR, "libvorbis: buffer overflow.");
24649290a14f add some buffer checks
skal
parents: 12132
diff changeset
181 return -1;
24649290a14f add some buffer checks
skal
parents: 12132
diff changeset
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
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
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
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
196 l= op2->bytes;
2857
303b270eee3d pts must be in time_base units
michael
parents: 2851
diff changeset
197 avccontext->coded_frame->pts= av_rescale_q(op2->granulepos, (AVRational){1, avccontext->sample_rate}, avccontext->time_base);
2858
99a5981878a2 fixme note
michael
parents: 2857
diff changeset
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
24649290a14f add some buffer checks
skal
parents: 12132
diff changeset
200 if (l > buf_size) {
24649290a14f add some buffer checks
skal
parents: 12132
diff changeset
201 av_log(avccontext, AV_LOG_ERROR, "libvorbis: buffer overflow.");
24649290a14f add some buffer checks
skal
parents: 12132
diff changeset
202 return -1;
24649290a14f add some buffer checks
skal
parents: 12132
diff changeset
203 }
24649290a14f add some buffer checks
skal
parents: 12132
diff changeset
204
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
205 memcpy(packets, op2->packet, l);
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
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
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 883
diff changeset
224
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 883
diff changeset
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
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
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
85a709aa3657 vorbis encoder missed rename to libvorbis
aurel
parents: 4901
diff changeset
232 AVCodec libvorbis_encoder = {
85a709aa3657 vorbis encoder missed rename to libvorbis
aurel
parents: 4901
diff changeset
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
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
239 oggvorbis_encode_close,
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
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
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
243 } ;