annotate libvorbis.c @ 9707:b69723e55653 libavcodec

Move a DECLARE_ALIGNED_16 variable in the Nellymoser encoder from the stack into the context to avoid issues when stack variables can not be aligned reliably.
author reimar
date Mon, 25 May 2009 12:17:02 +0000
parents 043574c5c153
children 3f766c507a70
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 /**
8718
e9d9d946f213 Use full internal pathname in doxygen @file directives.
diego
parents: 8673
diff changeset
22 * @file libavcodec/libvorbis.c
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"
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
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
46
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
47 /* decoder */
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
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
0960d775e97b libvorbis: Use 0-10 range for audio quality.
jbr
parents: 8718
diff changeset
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 {
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
63 /* constant bitrate */
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
64 if(vorbis_encode_setup_managed(vi, avccontext->channels,
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
65 avccontext->sample_rate, -1, avccontext->bit_rate, -1))
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
66 return -1;
934
159333d9297e fixes crash patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents: 925
diff changeset
67
3058
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
68 #ifdef OGGVORBIS_VBR_BY_ESTIMATE
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
69 /* variable bitrate by estimate */
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
70 if(vorbis_encode_ctl(vi, OV_ECTL_RATEMANAGE_AVG, NULL))
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
71 return -1;
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
72 #endif
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
73 }
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
74
3058
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
75 /* cutoff frequency */
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
76 if(avccontext->cutoff > 0) {
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
77 cfreq = avccontext->cutoff / 1000.0;
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
78 if(vorbis_encode_ctl(vi, OV_ECTL_LOWPASS_SET, &cfreq))
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
79 return -1;
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
80 }
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
81
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
82 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
83 }
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
84
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 5875
diff changeset
85 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
86 OggVorbisContext *context = avccontext->priv_data ;
1923
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
87 ogg_packet header, header_comm, header_code;
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
88 uint8_t *p;
2676
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
89 unsigned int offset, len;
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
90
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
91 vorbis_info_init(&context->vi) ;
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
92 if(oggvorbis_init_encoder(&context->vi, avccontext) < 0) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
93 av_log(avccontext, AV_LOG_ERROR, "oggvorbis_encode_init: init_encoder failed") ;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
94 return -1 ;
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
95 }
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
96 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
97 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
98
1923
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
99 vorbis_comment_init(&context->vc);
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
100 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
101
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
102 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
103 &header_comm, &header_code);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
104
2676
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
105 len = header.bytes + header_comm.bytes + header_code.bytes;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
106 avccontext->extradata_size= 64 + len + len/255;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
107 p = avccontext->extradata= av_mallocz(avccontext->extradata_size);
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
108 p[0] = 2;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
109 offset = 1;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
110 offset += av_xiphlacing(&p[offset], header.bytes);
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
111 offset += av_xiphlacing(&p[offset], header_comm.bytes);
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
112 memcpy(&p[offset], header.packet, header.bytes);
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
113 offset += header.bytes;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
114 memcpy(&p[offset], header_comm.packet, header_comm.bytes);
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
115 offset += header_comm.bytes;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
116 memcpy(&p[offset], header_code.packet, header_code.bytes);
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
117 offset += header_code.bytes;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
118 avccontext->extradata_size = offset;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
119 avccontext->extradata= av_realloc(avccontext->extradata, avccontext->extradata_size);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
120
1923
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
121 /* vorbis_block_clear(&context->vb);
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
122 vorbis_dsp_clear(&context->vd);
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
123 vorbis_info_clear(&context->vi);*/
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
124 vorbis_comment_clear(&context->vc);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
125
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
126 avccontext->frame_size = OGGVORBIS_FRAME_SIZE ;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
127
925
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 883
diff changeset
128 avccontext->coded_frame= avcodec_alloc_frame();
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 883
diff changeset
129 avccontext->coded_frame->key_frame= 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
130
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
131 return 0 ;
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
132 }
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
133
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
134
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
135 static int oggvorbis_encode_frame(AVCodecContext *avccontext,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
136 unsigned char *packets,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
137 int buf_size, void *data)
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
138 {
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
139 OggVorbisContext *context = avccontext->priv_data ;
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
140 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
141 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
142 int l;
66ff451487a7 Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents: 7451
diff changeset
143
66ff451487a7 Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents: 7451
diff changeset
144 if(data) {
66ff451487a7 Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents: 7451
diff changeset
145 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
146 float **buffer ;
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
147
8029
e50d7ac76945 Cosmetics: fix indentation after previous commit.
benoit
parents: 8028
diff changeset
148 buffer = vorbis_analysis_buffer(&context->vd, samples) ;
e50d7ac76945 Cosmetics: fix indentation after previous commit.
benoit
parents: 8028
diff changeset
149 if(context->vi.channels == 1) {
e50d7ac76945 Cosmetics: fix indentation after previous commit.
benoit
parents: 8028
diff changeset
150 for(l = 0 ; l < samples ; l++)
e50d7ac76945 Cosmetics: fix indentation after previous commit.
benoit
parents: 8028
diff changeset
151 buffer[0][l]=audio[l]/32768.f;
e50d7ac76945 Cosmetics: fix indentation after previous commit.
benoit
parents: 8028
diff changeset
152 } else {
e50d7ac76945 Cosmetics: fix indentation after previous commit.
benoit
parents: 8028
diff changeset
153 for(l = 0 ; l < samples ; l++){
e50d7ac76945 Cosmetics: fix indentation after previous commit.
benoit
parents: 8028
diff changeset
154 buffer[0][l]=audio[l*2]/32768.f;
e50d7ac76945 Cosmetics: fix indentation after previous commit.
benoit
parents: 8028
diff changeset
155 buffer[1][l]=audio[l*2+1]/32768.f;
e50d7ac76945 Cosmetics: fix indentation after previous commit.
benoit
parents: 8028
diff changeset
156 }
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
157 }
8029
e50d7ac76945 Cosmetics: fix indentation after previous commit.
benoit
parents: 8028
diff changeset
158 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
159 } else {
66ff451487a7 Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents: 7451
diff changeset
160 if(!context->eof)
66ff451487a7 Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents: 7451
diff changeset
161 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
162 context->eof = 1;
66ff451487a7 Add a flag to avoid calling vorbis_analysis_wrote twice with an empty buffer.
benoit
parents: 7451
diff changeset
163 }
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
164
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
165 while(vorbis_analysis_blockout(&context->vd, &context->vb) == 1) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
166 vorbis_analysis(&context->vb, NULL);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
167 vorbis_bitrate_addblock(&context->vb) ;
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
168
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
169 while(vorbis_bitrate_flushpacket(&context->vd, &op)) {
4553
1a714d3f0233 cosmetics: Fix a common typo, sepErate --> sepArate.
diego
parents: 4122
diff changeset
170 /* 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
171 * not, apparently the end of stream decision is in libogg. */
1a714d3f0233 cosmetics: Fix a common typo, sepErate --> sepArate.
diego
parents: 4122
diff changeset
172 if(op.bytes==1)
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
173 continue;
1922
0ed2d7ecd1e9 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 1920
diff changeset
174 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
175 context->buffer_index += sizeof(ogg_packet);
0ed2d7ecd1e9 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 1920
diff changeset
176 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
177 context->buffer_index += op.bytes;
0ed2d7ecd1e9 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 1920
diff changeset
178 // 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
179 }
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
180 }
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
181
1924
d9f751c0f488 pts hack (correct solution would be to pass the pts from the encoder to the muxer)
michael
parents: 1923
diff changeset
182 l=0;
1922
0ed2d7ecd1e9 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 1920
diff changeset
183 if(context->buffer_index){
1923
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
184 ogg_packet *op2= (ogg_packet*)context->buffer;
1922
0ed2d7ecd1e9 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 1920
diff changeset
185 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
186
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
187 l= op2->bytes;
2857
303b270eee3d pts must be in time_base units
michael
parents: 2851
diff changeset
188 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
189 //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
190
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
191 memcpy(packets, op2->packet, l);
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
192 context->buffer_index -= l + sizeof(ogg_packet);
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
193 memcpy(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
194 // 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
195 }
0ed2d7ecd1e9 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 1920
diff changeset
196
1924
d9f751c0f488 pts hack (correct solution would be to pass the pts from the encoder to the muxer)
michael
parents: 1923
diff changeset
197 return l;
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
198 }
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
199
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
200
6517
48759bfbd073 Apply 'cold' attribute to init/uninit functions in libavcodec
zuxy
parents: 5875
diff changeset
201 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
202 OggVorbisContext *context = avccontext->priv_data ;
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
203 /* ogg_packet op ; */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
204
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
205 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
206
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
207 vorbis_block_clear(&context->vb);
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
208 vorbis_dsp_clear(&context->vd);
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
209 vorbis_info_clear(&context->vi);
925
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 883
diff changeset
210
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 883
diff changeset
211 av_freep(&avccontext->coded_frame);
1923
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
212 av_freep(&avccontext->extradata);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
213
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
214 return 0 ;
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
215 }
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
5058
85a709aa3657 vorbis encoder missed rename to libvorbis
aurel
parents: 4901
diff changeset
218 AVCodec libvorbis_encoder = {
85a709aa3657 vorbis encoder missed rename to libvorbis
aurel
parents: 4901
diff changeset
219 "libvorbis",
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
220 CODEC_TYPE_AUDIO,
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
221 CODEC_ID_VORBIS,
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
222 sizeof(OggVorbisContext),
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
223 oggvorbis_encode_init,
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
224 oggvorbis_encode_frame,
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
225 oggvorbis_encode_close,
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
226 .capabilities= CODEC_CAP_DELAY,
7451
85ab7655ad4d Modify all codecs to report their supported input and output sample format(s).
pross
parents: 7040
diff changeset
227 .sample_fmts = (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
228 .long_name= NULL_IF_CONFIG_SMALL("libvorbis Vorbis"),
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
229 } ;