annotate oggvorbis.c @ 3604:dad0296d4522 libavcodec

replace MULL with asm too, no significnat speedup but its probably better to not take any chances, some versions of gcc will almost certainly mess it up too if they can
author michael
date Tue, 22 Aug 2006 12:07:02 +0000
parents 8936371f5a5c
children c537a97eec66
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1106
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
1 /**
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
2 * @file oggvorbis.c
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
3 * Ogg Vorbis codec support via libvorbisenc.
1e39f273ecd6 per file doxy
michaelni
parents: 1064
diff changeset
4 * @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
5 */
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
6
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
7 #include <vorbis/vorbisenc.h>
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
8
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
9 #include "avcodec.h"
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
10
1924
d9f751c0f488 pts hack (correct solution would be to pass the pts from the encoder to the muxer)
michael
parents: 1923
diff changeset
11 #undef NDEBUG
d9f751c0f488 pts hack (correct solution would be to pass the pts from the encoder to the muxer)
michael
parents: 1923
diff changeset
12 #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
13
1922
0ed2d7ecd1e9 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 1920
diff changeset
14 #define OGGVORBIS_FRAME_SIZE 64
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
15
1922
0ed2d7ecd1e9 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 1920
diff changeset
16 #define BUFFER_SIZE (1024*64)
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
17
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
18 typedef struct OggVorbisContext {
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
19 vorbis_info vi ;
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
20 vorbis_dsp_state vd ;
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
21 vorbis_block vb ;
1922
0ed2d7ecd1e9 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 1920
diff changeset
22 uint8_t buffer[BUFFER_SIZE];
0ed2d7ecd1e9 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 1920
diff changeset
23 int buffer_index;
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
24
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
25 /* decoder */
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
26 vorbis_comment vc ;
1920
9b87ed973dda kill obnoxious ogg_packet passing from demuxer to decoder
michael
parents: 1919
diff changeset
27 ogg_packet op;
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
28 } OggVorbisContext ;
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
29
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
30
1923
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
31 static int oggvorbis_init_encoder(vorbis_info *vi, AVCodecContext *avccontext) {
3058
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
32 double cfreq;
934
159333d9297e fixes crash patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents: 925
diff changeset
33
2850
c553a407b1b6 fixed quality / vbr encoding patch by (Justin Ruggles, jruggle, earthlink net)
michael
parents: 2716
diff changeset
34 if(avccontext->flags & CODEC_FLAG_QSCALE) {
3058
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
35 /* variable bitrate */
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
36 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
37 avccontext->sample_rate,
3058
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
38 avccontext->global_quality / (float)FF_QP2LAMBDA))
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
39 return -1;
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
40 } else {
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
41 /* constant bitrate */
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
42 if(vorbis_encode_setup_managed(vi, avccontext->channels,
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
43 avccontext->sample_rate, -1, avccontext->bit_rate, -1))
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
44 return -1;
934
159333d9297e fixes crash patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents: 925
diff changeset
45
3058
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
46 #ifdef OGGVORBIS_VBR_BY_ESTIMATE
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
47 /* variable bitrate by estimate */
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
48 if(vorbis_encode_ctl(vi, OV_ECTL_RATEMANAGE_AVG, NULL))
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
49 return -1;
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
50 #endif
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
51 }
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
52
3058
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
53 /* cutoff frequency */
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
54 if(avccontext->cutoff > 0) {
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
55 cfreq = avccontext->cutoff / 1000.0;
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
56 if(vorbis_encode_ctl(vi, OV_ECTL_LOWPASS_SET, &cfreq))
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
57 return -1;
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
58 }
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
59
8936371f5a5c Implement audio cutoff frequency to the vorbis encoder.
banan
parents: 2979
diff changeset
60 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
61 }
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
62
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
63 static int oggvorbis_encode_init(AVCodecContext *avccontext) {
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
64 OggVorbisContext *context = avccontext->priv_data ;
1923
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
65 ogg_packet header, header_comm, header_code;
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
66 uint8_t *p;
2676
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
67 unsigned int offset, len;
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
68
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
69 vorbis_info_init(&context->vi) ;
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
70 if(oggvorbis_init_encoder(&context->vi, avccontext) < 0) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
71 av_log(avccontext, AV_LOG_ERROR, "oggvorbis_encode_init: init_encoder failed") ;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
72 return -1 ;
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
73 }
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
74 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
75 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
76
1923
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
77 vorbis_comment_init(&context->vc);
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
78 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
79
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
80 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
81 &header_comm, &header_code);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
82
2676
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
83 len = header.bytes + header_comm.bytes + header_code.bytes;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
84 avccontext->extradata_size= 64 + len + len/255;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
85 p = avccontext->extradata= av_mallocz(avccontext->extradata_size);
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
86 p[0] = 2;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
87 offset = 1;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
88 offset += av_xiphlacing(&p[offset], header.bytes);
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
89 offset += av_xiphlacing(&p[offset], header_comm.bytes);
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
90 memcpy(&p[offset], header.packet, header.bytes);
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
91 offset += header.bytes;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
92 memcpy(&p[offset], header_comm.packet, header_comm.bytes);
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
93 offset += header_comm.bytes;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
94 memcpy(&p[offset], header_code.packet, header_code.bytes);
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
95 offset += header_code.bytes;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
96 avccontext->extradata_size = offset;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
97 avccontext->extradata= av_realloc(avccontext->extradata, avccontext->extradata_size);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
98
1923
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
99 /* vorbis_block_clear(&context->vb);
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
100 vorbis_dsp_clear(&context->vd);
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
101 vorbis_info_clear(&context->vi);*/
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
102 vorbis_comment_clear(&context->vc);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
103
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
104 avccontext->frame_size = OGGVORBIS_FRAME_SIZE ;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
105
925
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 883
diff changeset
106 avccontext->coded_frame= avcodec_alloc_frame();
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 883
diff changeset
107 avccontext->coded_frame->key_frame= 1;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
108
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
109 return 0 ;
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
110 }
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
111
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
112
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
113 static int oggvorbis_encode_frame(AVCodecContext *avccontext,
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
114 unsigned char *packets,
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
115 int buf_size, void *data)
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
116 {
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
117 OggVorbisContext *context = avccontext->priv_data ;
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
118 float **buffer ;
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
119 ogg_packet op ;
2393
0433866b1075 fixes transcoding to vorbis with ffmpeg on big endian machines patch by (Sigbj©Ìrn Skj©Áret {sskjer-1 broadpark no})
michael
parents: 2091
diff changeset
120 signed short *audio = data ;
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
121 int l, samples = data ? OGGVORBIS_FRAME_SIZE : 0;
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
122
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
123 buffer = vorbis_analysis_buffer(&context->vd, samples) ;
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
124
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
125 if(context->vi.channels == 1) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
126 for(l = 0 ; l < samples ; l++)
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
127 buffer[0][l]=audio[l]/32768.f;
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
128 } else {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
129 for(l = 0 ; l < samples ; l++){
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
130 buffer[0][l]=audio[l*2]/32768.f;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
131 buffer[1][l]=audio[l*2+1]/32768.f;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
132 }
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
133 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
134
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
135 vorbis_analysis_wrote(&context->vd, samples) ;
636
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 while(vorbis_analysis_blockout(&context->vd, &context->vb) == 1) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
138 vorbis_analysis(&context->vb, NULL);
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
139 vorbis_bitrate_addblock(&context->vb) ;
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
140
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
141 while(vorbis_bitrate_flushpacket(&context->vd, &op)) {
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
142 if(op.bytes==1) //id love to say this is a hack, bad sadly its not, appearently the end of stream decission is in libogg
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
143 continue;
1922
0ed2d7ecd1e9 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 1920
diff changeset
144 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
145 context->buffer_index += sizeof(ogg_packet);
0ed2d7ecd1e9 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 1920
diff changeset
146 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
147 context->buffer_index += op.bytes;
0ed2d7ecd1e9 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 1920
diff changeset
148 // 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
149 }
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
150 }
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
151
1924
d9f751c0f488 pts hack (correct solution would be to pass the pts from the encoder to the muxer)
michael
parents: 1923
diff changeset
152 l=0;
1922
0ed2d7ecd1e9 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 1920
diff changeset
153 if(context->buffer_index){
1923
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
154 ogg_packet *op2= (ogg_packet*)context->buffer;
1922
0ed2d7ecd1e9 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 1920
diff changeset
155 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
156
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
157 l= op2->bytes;
2857
303b270eee3d pts must be in time_base units
michael
parents: 2851
diff changeset
158 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
159 //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
160
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
161 memcpy(packets, op2->packet, l);
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
162 context->buffer_index -= l + sizeof(ogg_packet);
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
163 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
164 // 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
165 }
0ed2d7ecd1e9 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 1920
diff changeset
166
1924
d9f751c0f488 pts hack (correct solution would be to pass the pts from the encoder to the muxer)
michael
parents: 1923
diff changeset
167 return l;
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
168 }
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
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
171 static 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
172 OggVorbisContext *context = avccontext->priv_data ;
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
173 /* ogg_packet op ; */
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
174
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
175 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
176
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
177 vorbis_block_clear(&context->vb);
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
178 vorbis_dsp_clear(&context->vd);
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
179 vorbis_info_clear(&context->vi);
925
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 883
diff changeset
180
7fccaa0d699d AVVideoFrame -> AVFrame
michaelni
parents: 883
diff changeset
181 av_freep(&avccontext->coded_frame);
1923
04f93474b3bb remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 1922
diff changeset
182 av_freep(&avccontext->extradata);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
183
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
184 return 0 ;
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
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
187
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
188 AVCodec oggvorbis_encoder = {
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
189 "vorbis",
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
190 CODEC_TYPE_AUDIO,
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
191 CODEC_ID_VORBIS,
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
192 sizeof(OggVorbisContext),
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
193 oggvorbis_encode_init,
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
194 oggvorbis_encode_frame,
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
195 oggvorbis_encode_close,
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
196 .capabilities= CODEC_CAP_DELAY,
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
197 } ;
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
198
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
199 static int oggvorbis_decode_init(AVCodecContext *avccontext) {
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
200 OggVorbisContext *context = avccontext->priv_data ;
1925
48c1033bd23b fix global header passing from demuxer to decoder
michael
parents: 1924
diff changeset
201 uint8_t *p= avccontext->extradata;
2676
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
202 int i, hsizes[3];
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
203 unsigned char *headers[3], *extradata = avccontext->extradata;
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
204
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
205 vorbis_info_init(&context->vi) ;
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
206 vorbis_comment_init(&context->vc) ;
1925
48c1033bd23b fix global header passing from demuxer to decoder
michael
parents: 1924
diff changeset
207
2676
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
208 if(! avccontext->extradata_size || ! p) {
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
209 av_log(avccontext, AV_LOG_ERROR, "vorbis extradata absent\n");
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
210 return -1;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
211 }
2716
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
212
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
213 if(p[0] == 0 && p[1] == 30) {
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
214 for(i = 0; i < 3; i++){
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
215 hsizes[i] = *p++ << 8;
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
216 hsizes[i] += *p++;
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
217 headers[i] = p;
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
218 p += hsizes[i];
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
219 }
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
220 } else if(*p == 2) {
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
221 unsigned int offset = 1;
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
222 p++;
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
223 for(i=0; i<2; i++) {
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
224 hsizes[i] = 0;
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
225 while((*p == 0xFF) && (offset < avccontext->extradata_size)) {
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
226 hsizes[i] += 0xFF;
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
227 offset++;
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
228 p++;
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
229 }
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
230 if(offset >= avccontext->extradata_size - 1) {
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
231 av_log(avccontext, AV_LOG_ERROR,
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
232 "vorbis header sizes damaged\n");
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
233 return -1;
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
234 }
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
235 hsizes[i] += *p;
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
236 offset++;
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
237 p++;
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
238 }
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
239 hsizes[2] = avccontext->extradata_size - hsizes[0]-hsizes[1]-offset;
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
240 #if 0
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
241 av_log(avccontext, AV_LOG_DEBUG,
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
242 "vorbis header sizes: %d, %d, %d, / extradata_len is %d \n",
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
243 hsizes[0], hsizes[1], hsizes[2], avccontext->extradata_size);
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
244 #endif
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
245 headers[0] = extradata + offset;
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
246 headers[1] = extradata + offset + hsizes[0];
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
247 headers[2] = extradata + offset + hsizes[0] + hsizes[1];
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
248 } else {
2676
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
249 av_log(avccontext, AV_LOG_ERROR,
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
250 "vorbis initial header len is wrong: %d\n", *p);
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
251 return -1;
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
252 }
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
253
1925
48c1033bd23b fix global header passing from demuxer to decoder
michael
parents: 1924
diff changeset
254 for(i=0; i<3; i++){
48c1033bd23b fix global header passing from demuxer to decoder
michael
parents: 1924
diff changeset
255 context->op.b_o_s= i==0;
2676
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
256 context->op.bytes = hsizes[i];
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
257 context->op.packet = headers[i];
0975710cf7f4 change extradata format for vorbis
mru
parents: 2637
diff changeset
258 if(vorbis_synthesis_headerin(&context->vi, &context->vc, &context->op)<0){
1925
48c1033bd23b fix global header passing from demuxer to decoder
michael
parents: 1924
diff changeset
259 av_log(avccontext, AV_LOG_ERROR, "%d. vorbis header damaged\n", i+1);
48c1033bd23b fix global header passing from demuxer to decoder
michael
parents: 1924
diff changeset
260 return -1;
48c1033bd23b fix global header passing from demuxer to decoder
michael
parents: 1924
diff changeset
261 }
48c1033bd23b fix global header passing from demuxer to decoder
michael
parents: 1924
diff changeset
262 }
2716
040b965f2cd0 accept old extradata format
mru
parents: 2676
diff changeset
263
1925
48c1033bd23b fix global header passing from demuxer to decoder
michael
parents: 1924
diff changeset
264 avccontext->channels = context->vi.channels;
48c1033bd23b fix global header passing from demuxer to decoder
michael
parents: 1924
diff changeset
265 avccontext->sample_rate = context->vi.rate;
2637
ef44d24680d1 switch to native time bases
michael
parents: 2393
diff changeset
266 avccontext->time_base= (AVRational){1, avccontext->sample_rate};
1925
48c1033bd23b fix global header passing from demuxer to decoder
michael
parents: 1924
diff changeset
267
48c1033bd23b fix global header passing from demuxer to decoder
michael
parents: 1924
diff changeset
268 vorbis_synthesis_init(&context->vd, &context->vi);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
269 vorbis_block_init(&context->vd, &context->vb);
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
270
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
271 return 0 ;
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
272 }
636
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
273
57b9a37546a0 oggvorbis support patch by (Mark Hills <mark at pogo dot org dot uk>)
michaelni
parents:
diff changeset
274
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
275 static inline int conv(int samples, float **pcm, char *buf, int channels) {
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
276 int i, j, val ;
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
277 ogg_int16_t *ptr, *data = (ogg_int16_t*)buf ;
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
278 float *mono ;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
279
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
280 for(i = 0 ; i < channels ; i++){
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
281 ptr = &data[i];
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
282 mono = pcm[i] ;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
283
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
284 for(j = 0 ; j < samples ; j++) {
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
285
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
286 val = mono[j] * 32767.f;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
287
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
288 if(val > 32767) val = 32767 ;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
289 if(val < -32768) val = -32768 ;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
290
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
291 *ptr = val ;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
292 ptr += channels;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
293 }
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
294 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
295
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
296 return 0 ;
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
297 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
298
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
299
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
300 static int oggvorbis_decode_frame(AVCodecContext *avccontext,
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
301 void *data, int *data_size,
1064
b32afefe7d33 * UINTX -> uintx_t INTX -> intx_t
kabi
parents: 934
diff changeset
302 uint8_t *buf, int buf_size)
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
303 {
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
304 OggVorbisContext *context = avccontext->priv_data ;
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
305 float **pcm ;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
306 ogg_packet *op= &context->op;
2893
6f8bcb169256 fix unused variable warnings
aurel
parents: 2858
diff changeset
307 int samples, total_samples, total_bytes;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
308
1919
20e4d4511fd2 remove spyware from ogg*.c
michael
parents: 1598
diff changeset
309 if(!buf_size){
20e4d4511fd2 remove spyware from ogg*.c
michael
parents: 1598
diff changeset
310 //FIXME flush
20e4d4511fd2 remove spyware from ogg*.c
michael
parents: 1598
diff changeset
311 return 0;
20e4d4511fd2 remove spyware from ogg*.c
michael
parents: 1598
diff changeset
312 }
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
313
1920
9b87ed973dda kill obnoxious ogg_packet passing from demuxer to decoder
michael
parents: 1919
diff changeset
314 op->packet = buf;
9b87ed973dda kill obnoxious ogg_packet passing from demuxer to decoder
michael
parents: 1919
diff changeset
315 op->bytes = buf_size;
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
316
1919
20e4d4511fd2 remove spyware from ogg*.c
michael
parents: 1598
diff changeset
317 // av_log(avccontext, AV_LOG_DEBUG, "%d %d %d %lld %lld %d %d\n", op->bytes, op->b_o_s, op->e_o_s, op->granulepos, op->packetno, buf_size, context->vi.rate);
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
318
1919
20e4d4511fd2 remove spyware from ogg*.c
michael
parents: 1598
diff changeset
319 /* for(i=0; i<op->bytes; i++)
20e4d4511fd2 remove spyware from ogg*.c
michael
parents: 1598
diff changeset
320 av_log(avccontext, AV_LOG_DEBUG, "%02X ", op->packet[i]);
20e4d4511fd2 remove spyware from ogg*.c
michael
parents: 1598
diff changeset
321 av_log(avccontext, AV_LOG_DEBUG, "\n");*/
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
322
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
323 if(vorbis_synthesis(&context->vb, op) == 0)
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
324 vorbis_synthesis_blockin(&context->vd, &context->vb) ;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
325
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
326 total_samples = 0 ;
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
327 total_bytes = 0 ;
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
328
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
329 while((samples = vorbis_synthesis_pcmout(&context->vd, &pcm)) > 0) {
2979
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
330 conv(samples, pcm, (char*)data + total_bytes, context->vi.channels) ;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
331 total_bytes += samples * 2 * context->vi.channels ;
bfabfdf9ce55 COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 2967
diff changeset
332 total_samples += samples ;
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
333 vorbis_synthesis_read(&context->vd, samples) ;
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
334 }
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
335
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
336 *data_size = total_bytes ;
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
337 return buf_size ;
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
338 }
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
339
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
340
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
341 static int oggvorbis_decode_close(AVCodecContext *avccontext) {
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
342 OggVorbisContext *context = avccontext->priv_data ;
2967
ef2149182f1c COSMETICS: Remove all trailing whitespace.
diego
parents: 2893
diff changeset
343
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
344 vorbis_info_clear(&context->vi) ;
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
345 vorbis_comment_clear(&context->vc) ;
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
346
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
347 return 0 ;
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
348 }
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
349
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
350
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
351 AVCodec oggvorbis_decoder = {
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
352 "vorbis",
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
353 CODEC_TYPE_AUDIO,
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
354 CODEC_ID_VORBIS,
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
355 sizeof(OggVorbisContext),
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
356 oggvorbis_decode_init,
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
357 NULL,
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
358 oggvorbis_decode_close,
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
359 oggvorbis_decode_frame,
2091
02a4fd7c606c flush audio encoder buffers at the end
michael
parents: 2028
diff changeset
360 .capabilities= CODEC_CAP_DELAY,
883
b0d29bf1cecd * Ogg/Vorbis patch by Mark Hills
kabi
parents: 636
diff changeset
361 } ;