annotate ogg.c @ 1206:e60bf67d9bf8 libavformat

The reader ignores the size of the ASF data object and keeps on reading even beyond it. Therefore if the ASF file includes an index object at its end, the reader will treat the index like data, but of course will fail since it thinks that the data is corrupted. When reading an asf file with an index object, ffmpeg will complain at the end of the file that it read an invalid header. Patch by Kohn Emil Dan, < emild A cs P technion P ac P il > Original thead: Date: Apr 18, 2006 4:11 PM Subject: [Ffmpeg-devel] Two ASF related bugs and fixes
author gpoirier
date Sat, 29 Jul 2006 16:07:19 +0000
parents d18cc9a1fd02
children 8bf9be9bb107
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
1 /*
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
2 * Ogg bitstream support
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
3 * Mark Hills <mark@pogo.org.uk>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
4 *
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
5 * Uses libogg, but requires libvorbisenc to construct correct headers
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
6 * when containing Vorbis stream -- currently the only format supported
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
7 */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
8
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
9 #include <stdio.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
10
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
11 #include <ogg/ogg.h>
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
12
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
13 #include "avformat.h"
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
14
406
ea22a438ca79 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 405
diff changeset
15 #undef NDEBUG
ea22a438ca79 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 405
diff changeset
16 #include <assert.h>
ea22a438ca79 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 405
diff changeset
17
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
18 #define DECODER_BUFFER_SIZE 4096
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
19
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
20
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
21 typedef struct OggContext {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
22 /* output */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
23 ogg_stream_state os ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
24 int header_handled ;
406
ea22a438ca79 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 405
diff changeset
25 ogg_packet op;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
26
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
27 /* input */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
28 ogg_sync_state oy ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
29 } OggContext ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
30
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
31
858
66cc656ea404 Replace CONFIG_ENCODERS/CONFIG_DECODERS with CONFIG_MUXERS/CONFIG_DEMUXERS
diego
parents: 857
diff changeset
32 #ifdef CONFIG_MUXERS
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 884
diff changeset
33 static int ogg_write_header(AVFormatContext *avfcontext)
35
a16ccdf4a87c removed unneeded mallocs
bellard
parents: 0
diff changeset
34 {
a16ccdf4a87c removed unneeded mallocs
bellard
parents: 0
diff changeset
35 OggContext *context = avfcontext->priv_data;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 884
diff changeset
36 ogg_packet *op= &context->op;
857
26aaf3eed638 fix unused variable warnings
aurel
parents: 843
diff changeset
37 int n;
406
ea22a438ca79 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 405
diff changeset
38
404
6579fe3ade40 remove spyware from ogg*.c
michael
parents: 327
diff changeset
39 ogg_stream_init(&context->os, 31415);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 884
diff changeset
40
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
41 for(n = 0 ; n < avfcontext->nb_streams ; n++) {
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 726
diff changeset
42 AVCodecContext *codec = avfcontext->streams[n]->codec;
843
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
43 uint8_t *headers = codec->extradata;
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
44 int headers_len = codec->extradata_size;
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
45 uint8_t *header_start[3];
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
46 int header_len[3];
857
26aaf3eed638 fix unused variable warnings
aurel
parents: 843
diff changeset
47 int i, j;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 884
diff changeset
48
462
b69898ffc92a move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents: 454
diff changeset
49 av_set_pts_info(avfcontext->streams[n], 60, 1, AV_TIME_BASE);
b69898ffc92a move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents: 454
diff changeset
50
843
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
51 for(j=1,i=0;i<2;++i, ++j) {
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
52 header_len[i]=0;
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
53 while(j<headers_len && headers[j]==0xff) {
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
54 header_len[i]+=0xff;
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
55 ++j;
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
56 }
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
57 header_len[i]+=headers[j];
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
58 }
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
59 header_len[2]=headers_len-header_len[0]-header_len[1]-j;
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
60 headers+=j;
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
61 header_start[0] = headers;
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
62 header_start[1] = header_start[0] + header_len[0];
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
63 header_start[2] = header_start[1] + header_len[1];
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
64
843
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
65 for(i=0; i < 3; ++i){
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
66 op->bytes = header_len[i];
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
67
dcf6e35ddb72 Make ogg `muxer' expect new vorbis extradata format.
al
parents: 820
diff changeset
68 op->packet= header_start[i];
407
b9d16c18ee18 remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 406
diff changeset
69 op->b_o_s= op->packetno==0;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
70
407
b9d16c18ee18 remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 406
diff changeset
71 ogg_stream_packetin(&context->os, op);
b9d16c18ee18 remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 406
diff changeset
72
b9d16c18ee18 remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 406
diff changeset
73 op->packetno++; //FIXME multiple streams
b9d16c18ee18 remove function call from muxer->encoder and cleanly pass global headers
michael
parents: 406
diff changeset
74 }
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
75
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
76 context->header_handled = 0 ;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
77 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 884
diff changeset
78
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
79 return 0 ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
80 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
81
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 462
diff changeset
82 static int ogg_write_packet(AVFormatContext *avfcontext, AVPacket *pkt)
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
83 {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
84 OggContext *context = avfcontext->priv_data ;
820
feca73904e67 changing AVCodecContext codec -> *codec in AVStream so additions to AVCodecContext dont randomize AVStream and break binary compatibility
michael
parents: 726
diff changeset
85 AVCodecContext *avctx= avfcontext->streams[pkt->stream_index]->codec;
406
ea22a438ca79 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 405
diff changeset
86 ogg_packet *op= &context->op;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
87 ogg_page og ;
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 462
diff changeset
88 int64_t pts;
406
ea22a438ca79 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 405
diff changeset
89
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 462
diff changeset
90 pts= av_rescale(pkt->pts, avctx->sample_rate, AV_TIME_BASE);
406
ea22a438ca79 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 405
diff changeset
91
ea22a438ca79 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 405
diff changeset
92 // av_log(avfcontext, AV_LOG_DEBUG, "M%d\n", size);
ea22a438ca79 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 405
diff changeset
93
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
94 /* flush header packets so audio starts on a new page */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
95
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
96 if(!context->header_handled) {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
97 while(ogg_stream_flush(&context->os, &og)) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
98 put_buffer(&avfcontext->pb, og.header, og.header_len) ;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
99 put_buffer(&avfcontext->pb, og.body, og.body_len) ;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
100 put_flush_packet(&avfcontext->pb);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
101 }
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
102 context->header_handled = 1 ;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
103 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
104
468
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 462
diff changeset
105 op->packet = (uint8_t*) pkt->data;
60f897e8dd2d pass AVPacket into av_write_frame()
michael
parents: 462
diff changeset
106 op->bytes = pkt->size;
406
ea22a438ca79 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 405
diff changeset
107 op->b_o_s = op->packetno == 0;
ea22a438ca79 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 405
diff changeset
108 op->granulepos= pts;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
109
406
ea22a438ca79 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 405
diff changeset
110 /* correct the fields in the packet -- essential for streaming */
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 884
diff changeset
111
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 884
diff changeset
112 ogg_stream_packetin(&context->os, op);
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 884
diff changeset
113
406
ea22a438ca79 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 405
diff changeset
114 while(ogg_stream_pageout(&context->os, &og)) {
ea22a438ca79 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 405
diff changeset
115 put_buffer(&avfcontext->pb, og.header, og.header_len);
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
116 put_buffer(&avfcontext->pb, og.body, og.body_len);
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
117 put_flush_packet(&avfcontext->pb);
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 884
diff changeset
118 }
406
ea22a438ca79 fix obnoxious ogg_packet passing from encoder to muxer
michael
parents: 405
diff changeset
119 op->packetno++;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
120
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
121 return 0;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
122 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
123
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
124
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
125 static int ogg_write_trailer(AVFormatContext *avfcontext) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
126 OggContext *context = avfcontext->priv_data ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
127 ogg_page og ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
128
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
129 while(ogg_stream_flush(&context->os, &og)) {
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
130 put_buffer(&avfcontext->pb, og.header, og.header_len) ;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
131 put_buffer(&avfcontext->pb, og.body, og.body_len) ;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
132 put_flush_packet(&avfcontext->pb);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
133 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
134
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
135 ogg_stream_clear(&context->os) ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
136 return 0 ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
137 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
138
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
139
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
140 AVOutputFormat ogg_muxer = {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
141 "ogg",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
142 "Ogg Vorbis",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
143 "audio/x-vorbis",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
144 "ogg",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
145 sizeof(OggContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
146 CODEC_ID_VORBIS,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
147 0,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
148 ogg_write_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
149 ogg_write_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
150 ogg_write_trailer,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
151 } ;
858
66cc656ea404 Replace CONFIG_ENCODERS/CONFIG_DECODERS with CONFIG_MUXERS/CONFIG_DEMUXERS
diego
parents: 857
diff changeset
152 #endif //CONFIG_MUXERS
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
153
726
17178af951b4 Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents: 639
diff changeset
154 #if 0
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
155 static int next_packet(AVFormatContext *avfcontext, ogg_packet *op) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
156 OggContext *context = avfcontext->priv_data ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
157 ogg_page og ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
158 char *buf ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
159
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
160 while(ogg_stream_packetout(&context->os, op) != 1) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
161
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
162 /* while no pages are available, read in more data to the sync */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
163 while(ogg_sync_pageout(&context->oy, &og) != 1) {
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
164 buf = ogg_sync_buffer(&context->oy, DECODER_BUFFER_SIZE) ;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
165 if(get_buffer(&avfcontext->pb, buf, DECODER_BUFFER_SIZE) <= 0)
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
166 return 1 ;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
167 ogg_sync_wrote(&context->oy, DECODER_BUFFER_SIZE) ;
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
168 }
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 884
diff changeset
169
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
170 /* got a page. Feed it into the stream and get the packet */
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
171 if(ogg_stream_pagein(&context->os, &og) != 0)
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
172 return 1 ;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
173 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
174
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
175 return 0 ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
176 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
177
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
178
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
179 static int ogg_read_header(AVFormatContext *avfcontext, AVFormatParameters *ap)
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
180 {
35
a16ccdf4a87c removed unneeded mallocs
bellard
parents: 0
diff changeset
181 OggContext *context = avfcontext->priv_data;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 884
diff changeset
182 ogg_packet op ;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
183 char *buf ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
184 ogg_page og ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
185 AVStream *ast ;
408
237eeeb50fb8 fix global header passing from demuxer to decoder
michael
parents: 407
diff changeset
186 AVCodecContext *codec;
237eeeb50fb8 fix global header passing from demuxer to decoder
michael
parents: 407
diff changeset
187 uint8_t *p;
237eeeb50fb8 fix global header passing from demuxer to decoder
michael
parents: 407
diff changeset
188 int i;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 884
diff changeset
189
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
190 ogg_sync_init(&context->oy) ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
191 buf = ogg_sync_buffer(&context->oy, DECODER_BUFFER_SIZE) ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
192
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
193 if(get_buffer(&avfcontext->pb, buf, DECODER_BUFFER_SIZE) <= 0)
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
194 return AVERROR_IO ;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 884
diff changeset
195
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 884
diff changeset
196 ogg_sync_wrote(&context->oy, DECODER_BUFFER_SIZE) ;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
197 ogg_sync_pageout(&context->oy, &og) ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
198 ogg_stream_init(&context->os, ogg_page_serialno(&og)) ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
199 ogg_stream_pagein(&context->os, &og) ;
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 884
diff changeset
200
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
201 /* currently only one vorbis stream supported */
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
202
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
203 ast = av_new_stream(avfcontext, 0) ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
204 if(!ast)
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
205 return AVERROR_NOMEM ;
462
b69898ffc92a move time_base (pts_num/pts_den) from AVFormatContext -> AVStream
michael
parents: 454
diff changeset
206 av_set_pts_info(ast, 60, 1, AV_TIME_BASE);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
207
408
237eeeb50fb8 fix global header passing from demuxer to decoder
michael
parents: 407
diff changeset
208 codec= &ast->codec;
237eeeb50fb8 fix global header passing from demuxer to decoder
michael
parents: 407
diff changeset
209 codec->codec_type = CODEC_TYPE_AUDIO;
237eeeb50fb8 fix global header passing from demuxer to decoder
michael
parents: 407
diff changeset
210 codec->codec_id = CODEC_ID_VORBIS;
237eeeb50fb8 fix global header passing from demuxer to decoder
michael
parents: 407
diff changeset
211 for(i=0; i<3; i++){
237eeeb50fb8 fix global header passing from demuxer to decoder
michael
parents: 407
diff changeset
212 if(next_packet(avfcontext, &op)){
237eeeb50fb8 fix global header passing from demuxer to decoder
michael
parents: 407
diff changeset
213 return -1;
237eeeb50fb8 fix global header passing from demuxer to decoder
michael
parents: 407
diff changeset
214 }
639
0b52743104ac integer overflows, heap corruption
michael
parents: 587
diff changeset
215 if(op.bytes >= (1<<16) || op.bytes < 0)
0b52743104ac integer overflows, heap corruption
michael
parents: 587
diff changeset
216 return -1;
408
237eeeb50fb8 fix global header passing from demuxer to decoder
michael
parents: 407
diff changeset
217 codec->extradata_size+= 2 + op.bytes;
587
fe24632a577b allocate a few bytes more for extradata so the bitstream reader if its used by the codec for parsing extardata, doesnt read over the end
michael
parents: 486
diff changeset
218 codec->extradata= av_realloc(codec->extradata, codec->extradata_size + FF_INPUT_BUFFER_PADDING_SIZE);
884
2ece9c9dd94c malloc padding to avoid reading past the malloc()ed area.
henry
parents: 858
diff changeset
219 memset(codec->extradata + codec->extradata_size, 0, FF_INPUT_BUFFER_PADDING_SIZE);
408
237eeeb50fb8 fix global header passing from demuxer to decoder
michael
parents: 407
diff changeset
220 p= codec->extradata + codec->extradata_size - 2 - op.bytes;
237eeeb50fb8 fix global header passing from demuxer to decoder
michael
parents: 407
diff changeset
221 *(p++)= op.bytes>>8;
237eeeb50fb8 fix global header passing from demuxer to decoder
michael
parents: 407
diff changeset
222 *(p++)= op.bytes&0xFF;
237eeeb50fb8 fix global header passing from demuxer to decoder
michael
parents: 407
diff changeset
223 memcpy(p, op.packet, op.bytes);
237eeeb50fb8 fix global header passing from demuxer to decoder
michael
parents: 407
diff changeset
224 }
237eeeb50fb8 fix global header passing from demuxer to decoder
michael
parents: 407
diff changeset
225
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
226 return 0 ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
227 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
228
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
229
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
230 static int ogg_read_packet(AVFormatContext *avfcontext, AVPacket *pkt) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
231 ogg_packet op ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
232
885
da1d5db0ce5c COSMETICS: Remove all trailing whitespace.
diego
parents: 884
diff changeset
233 if(next_packet(avfcontext, &op))
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
234 return AVERROR_IO ;
405
04d7dda7ccd5 kill obnoxious ogg_packet passing from demuxer to decoder
michael
parents: 404
diff changeset
235 if(av_new_packet(pkt, op.bytes) < 0)
887
d70e50f1495f COSMETICS: tabs --> spaces, some prettyprinting
diego
parents: 885
diff changeset
236 return AVERROR_IO ;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
237 pkt->stream_index = 0 ;
405
04d7dda7ccd5 kill obnoxious ogg_packet passing from demuxer to decoder
michael
parents: 404
diff changeset
238 memcpy(pkt->data, op.packet, op.bytes);
454
7fa377b2f533 export pts if available
michael
parents: 409
diff changeset
239 if(avfcontext->streams[0]->codec.sample_rate && op.granulepos!=-1)
7fa377b2f533 export pts if available
michael
parents: 409
diff changeset
240 pkt->pts= av_rescale(op.granulepos, AV_TIME_BASE, avfcontext->streams[0]->codec.sample_rate);
7fa377b2f533 export pts if available
michael
parents: 409
diff changeset
241 // printf("%lld %d %d\n", pkt->pts, (int)op.granulepos, avfcontext->streams[0]->codec.sample_rate);
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
242
405
04d7dda7ccd5 kill obnoxious ogg_packet passing from demuxer to decoder
michael
parents: 404
diff changeset
243 return op.bytes;
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
244 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
245
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
246
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
247 static int ogg_read_close(AVFormatContext *avfcontext) {
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
248 OggContext *context = avfcontext->priv_data ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
249
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
250 ogg_stream_clear(&context->os) ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
251 ogg_sync_clear(&context->oy) ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
252
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
253 return 0 ;
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
254 }
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
255
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
256
1169
d18cc9a1fd02 allow individual selection of muxers and demuxers
mru
parents: 1167
diff changeset
257 static AVInputFormat ogg_iformat = {
0
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
258 "ogg",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
259 "Ogg Vorbis",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
260 sizeof(OggContext),
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
261 NULL,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
262 ogg_read_header,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
263 ogg_read_packet,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
264 ogg_read_close,
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
265 .extensions = "ogg",
05318cf2e886 renamed libav to libavformat
bellard
parents:
diff changeset
266 } ;
726
17178af951b4 Ogg demuxer ported from tcvp by Luca Barbato <lu_zero at gentoo dot org>,
mru
parents: 639
diff changeset
267 #endif