Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(55)

Side by Side Diff: patches/ugly/16_aac_oob_read.patch

Issue 789004: ffmpeg roll of source to mar 9 version... (Closed) Base URL: svn://chrome-svn/chrome/trunk/deps/third_party/ffmpeg/
Patch Set: '' Created 10 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 Index: patched-ffmpeg-mt/libavcodec/aac.c 1 Only in unpatched_ffmpeg-mt: ffmpeg-mt
2 =================================================================== 2 diff -rpu unpatched_ffmpeg-mt/libavcodec/Makefile ffmpeg-mt/libavcodec/Makefile
3 --- patched-ffmpeg-mt/libavcodec/aac.c» (revision 40662) 3 --- unpatched_ffmpeg-mt/libavcodec/Makefile» 2010-03-11 17:46:30 -0800
4 +++ patched-ffmpeg-mt/libavcodec/aac.c» (working copy) 4 +++ ffmpeg-mt/libavcodec/Makefile» 2010-03-11 19:12:33 -0800
5 @@ -434,6 +434,7 @@ 5 @@ -493,8 +493,7 @@ OBJS-$(CONFIG_MATROSKA_MUXER) +
6 OBJS-$(CONFIG_MOV_DEMUXER) += mpeg4audio.o mpegaudiodata.o
7 OBJS-$(CONFIG_MPEGTS_MUXER) += mpegvideo.o
8 OBJS-$(CONFIG_NUT_MUXER) += mpegaudiodata.o
9 -OBJS-$(CONFIG_OGG_DEMUXER) += flacdec.o flacdata.o flac.o \
10 - dirac.o mpeg12data.o
11 +OBJS-$(CONFIG_OGG_DEMUXER) += dirac.o mpeg12data.o
12 OBJS-$(CONFIG_OGG_MUXER) += xiph.o flacdec.o flacdata.o flac.o
13 OBJS-$(CONFIG_RTP_MUXER) += mpegvideo.o
14
15 @@ -564,6 +563,14 @@ OBJS-$(CONFIG_VP3_PARSER) +
16 OBJS-$(CONFIG_AAC_ADTSTOASC_BSF) += aac_adtstoasc_bsf.o
17 OBJS-$(CONFIG_DUMP_EXTRADATA_BSF) += dump_extradata_bsf.o
18 OBJS-$(CONFIG_H264_MP4TOANNEXB_BSF) += h264_mp4toannexb_bsf.o
19 +OBJS-$(CONFIG_MPEG4VIDEO_ES_BSF) += mpeg4video_es_bsf.o \
20 + mpeg4videoenc.o ituh263enc.o \
21 + mpegvideo_enc.o motion_est.o \
22 + ratecontrol.o mpeg12data.o \
23 + aandcttab.o jfdctfst.o \
24 + jfdctint.o faandct.o \
25 + mpeg4video_parser.o mpegvideo.o \
26 + error_resilience.o
27 OBJS-$(CONFIG_IMX_DUMP_HEADER_BSF) += imx_dump_header_bsf.o
28 OBJS-$(CONFIG_MJPEGA_DUMP_HEADER_BSF) += mjpega_dump_header_bsf.o
29 OBJS-$(CONFIG_MOV2TEXTSUB_BSF) += movsub_bsf.o
30 @@ -573,6 +580,9 @@ OBJS-$(CONFIG_MP3_HEADER_DECOMPRESS_BSF)
31 OBJS-$(CONFIG_NOISE_BSF) += noise_bsf.o
32 OBJS-$(CONFIG_REMOVE_EXTRADATA_BSF) += remove_extradata_bsf.o
33 OBJS-$(CONFIG_TEXT2MOVSUB_BSF) += movsub_bsf.o
34 +OBJS-$(CONFIG_VC1_ASFTORCV_BSF) += vc1_asftorcv_bsf.o
35 +OBJS-$(CONFIG_VC1_ASFTOANNEXG_BSF) += vc1_asftoannexg_bsf.o vc1.o \
36 + vc1data.o
37
38 # thread libraries
39 OBJS-$(HAVE_BEOSTHREADS) += beosthread.o
40 Only in ffmpeg-mt/libavcodec: Makefile~
41 diff -rpu unpatched_ffmpeg-mt/libavcodec/aac.c ffmpeg-mt/libavcodec/aac.c
42 --- unpatched_ffmpeg-mt/libavcodec/aac.c» 2010-03-11 17:46:29 -0800
43 +++ ffmpeg-mt/libavcodec/aac.c» 2010-03-11 19:13:44 -0800
44 @@ -449,6 +449,7 @@ static int decode_audio_specific_config(
6 int i; 45 int i;
7 46
8 init_get_bits(&gb, data, data_size * 8); 47 init_get_bits(&gb, data, data_size * 8);
9 + gb.buffer_enforcing = 1; 48 + gb.buffer_enforcing = 1;
10 49
11 if ((i = ff_mpeg4audio_get_config(&ac->m4ac, data, data_size)) < 0) 50 if ((i = ff_mpeg4audio_get_config(&ac->m4ac, data, data_size)) < 0)
12 return -1; 51 return -1;
13 @@ -1932,6 +1933,7 @@ 52 @@ -1965,6 +1966,7 @@ static int aac_decode_frame(AVCodecConte
14 int err, elem_id, data_size_tmp; 53 int samples = 1024, multiplier;
15 54
16 init_get_bits(&gb, buf, buf_size * 8); 55 init_get_bits(&gb, buf, buf_size * 8);
17 + gb.buffer_enforcing = 1; 56 + gb.buffer_enforcing = 1;
18 57
19 if (show_bits(&gb, 12) == 0xfff) { 58 if (show_bits(&gb, 12) == 0xfff) {
20 if (parse_adts_frame_header(ac, &gb) < 0) { 59 if (parse_adts_frame_header(ac, &gb) < 0) {
21 @@ -1946,6 +1948,12 @@ 60 @@ -1979,6 +1981,12 @@ static int aac_decode_frame(AVCodecConte
22 61
23 // parse 62 // parse
24 while ((elem_type = get_bits(&gb, 3)) != TYPE_END) { 63 while ((elem_type = get_bits(&gb, 3)) != TYPE_END) {
25 +#ifdef ALT_BITSTREAM_READER 64 +#ifdef ALT_BITSTREAM_READER
26 + if (gb.buffer_exhausted) { 65 + if (gb.buffer_exhausted) {
27 + av_log(ac->avccontext, AV_LOG_ERROR, "out of bounds read: index, si ze: %d, %d\n", gb.index, gb.size_in_bits); 66 + av_log(ac->avccontext, AV_LOG_ERROR, "out of bounds read: index, si ze: %d, %d\n", gb.index, gb.size_in_bits);
28 + return -1; 67 + return -1;
29 + } 68 + }
30 +#endif 69 +#endif
31 elem_id = get_bits(&gb, 4); 70 elem_id = get_bits(&gb, 4);
32 71
33 if (elem_type < TYPE_DSE && !(che=get_che(ac, elem_type, elem_id))) { 72 if (elem_type < TYPE_DSE && !(che=get_che(ac, elem_type, elem_id))) {
73 Only in ffmpeg-mt/libavcodec: aac.c~
74 diff -rpu unpatched_ffmpeg-mt/libavcodec/allcodecs.c ffmpeg-mt/libavcodec/allcod ecs.c
75 --- unpatched_ffmpeg-mt/libavcodec/allcodecs.c 2010-03-11 17:46:29 -0800
76 +++ ffmpeg-mt/libavcodec/allcodecs.c 2010-03-11 19:12:19 -0800
77 @@ -384,13 +384,15 @@ void avcodec_register_all(void)
78 REGISTER_BSF (AAC_ADTSTOASC, aac_adtstoasc);
79 REGISTER_BSF (DUMP_EXTRADATA, dump_extradata);
80 REGISTER_BSF (H264_MP4TOANNEXB, h264_mp4toannexb);
81 + REGISTER_BSF (MPEG4VIDEO_ES, mpeg4video_es);
82 REGISTER_BSF (IMX_DUMP_HEADER, imx_dump_header);
83 REGISTER_BSF (MJPEGA_DUMP_HEADER, mjpega_dump_header);
84 REGISTER_BSF (MP3_HEADER_COMPRESS, mp3_header_compress);
85 REGISTER_BSF (MP3_HEADER_DECOMPRESS, mp3_header_decompress);
86 + REGISTER_BSF (VC1_ASFTORCV, vc1_asftorcv);
87 + REGISTER_BSF (VC1_ASFTOANNEXG, vc1_asftoannexg);
88 REGISTER_BSF (MOV2TEXTSUB, mov2textsub);
89 REGISTER_BSF (NOISE, noise);
90 REGISTER_BSF (REMOVE_EXTRADATA, remove_extradata);
91 REGISTER_BSF (TEXT2MOVSUB, text2movsub);
92 }
93 -
94 Only in ffmpeg-mt/libavcodec: allcodecs.c~
95 diff -rpu unpatched_ffmpeg-mt/libavcodec/get_bits.h ffmpeg-mt/libavcodec/get_bit s.h
96 --- unpatched_ffmpeg-mt/libavcodec/get_bits.h 2010-03-11 17:46:30 -0800
97 +++ ffmpeg-mt/libavcodec/get_bits.h 2010-03-11 19:13:14 -0800
98 @@ -53,13 +53,21 @@
99 /* buffer, buffer_end and size_in_bits must be present and used by every reader */
100 typedef struct GetBitContext {
101 const uint8_t *buffer, *buffer_end;
102 + /* Ugly, but clients of this bit reader do not seem to check for enough
103 + * data before calling. So we'll return 0's on overrun rather than crashing
104 + * with random read faults.
105 + */
106 + int buffer_exhausted;
107 + int buffer_enforcing;
108 #ifdef ALT_BITSTREAM_READER
109 int index;
110 #elif defined LIBMPEG2_BITSTREAM_READER
111 +#error TODO - secure this against read overrun
112 uint8_t *buffer_ptr;
113 uint32_t cache;
114 int bit_count;
115 #elif defined A32_BITSTREAM_READER
116 +#warning TODO - secure this against read overrun
117 uint32_t *buffer_ptr;
118 uint32_t cache0;
119 uint32_t cache1;
120 @@ -139,13 +147,19 @@ for examples see get_bits, show_bits, sk
121
122 # ifdef ALT_BITSTREAM_READER_LE
123 # define UPDATE_CACHE(name, gb)\
124 + if (!(gb)->buffer_exhausted)\
125 name##_cache= AV_RL32( ((const uint8_t *)(gb)->buffer)+(name##_index>>3 ) ) >> (name##_index&0x07);\
126 + else\
127 + name##_cache = 0;\
128
129 # define SKIP_CACHE(name, gb, num)\
130 name##_cache >>= (num);
131 # else
132 # define UPDATE_CACHE(name, gb)\
133 + if (!(gb)->buffer_exhausted)\
134 name##_cache= AV_RB32( ((const uint8_t *)(gb)->buffer)+(name##_index>>3 ) ) << (name##_index&0x07);\
135 + else\
136 + name##_cache = 0;\
137
138 # define SKIP_CACHE(name, gb, num)\
139 name##_cache <<= (num);
140 @@ -154,6 +168,8 @@ for examples see get_bits, show_bits, sk
141 // FIXME name?
142 # define SKIP_COUNTER(name, gb, num)\
143 name##_index += (num);\
144 + if ((gb)->buffer_enforcing && name##_index >= (gb)->size_in_bits)\
145 + (gb)->buffer_exhausted = 1;\
146
147 # define SKIP_BITS(name, gb, num)\
148 {\
149 @@ -187,6 +203,12 @@ static inline int get_bits_count(const G
150
151 static inline void skip_bits_long(GetBitContext *s, int n){
152 s->index += n;
153 + if (s->buffer_enforcing) {
154 + if (n < 0 && s->index < s->size_in_bits)
155 + s->buffer_exhausted = 0;
156 + else if (s->index >= s->size_in_bits)
157 + s->buffer_exhausted = 1;
158 + }
159 }
160
161 #elif defined LIBMPEG2_BITSTREAM_READER
162 @@ -391,7 +413,10 @@ static inline void skip_bits(GetBitConte
163 }
164
165 static inline unsigned int get_bits1(GetBitContext *s){
166 + if (s->buffer_exhausted)
167 + return 0;
168 #ifdef ALT_BITSTREAM_READER
169 + {
170 unsigned int index= s->index;
171 uint8_t result= s->buffer[ index>>3 ];
172 #ifdef ALT_BITSTREAM_READER_LE
173 @@ -402,9 +427,12 @@ static inline unsigned int get_bits1(Get
174 result>>= 8 - 1;
175 #endif
176 index++;
177 + if (s->buffer_enforcing && index >= s->size_in_bits)
178 + s->buffer_exhausted = 1;
179 s->index= index;
180
181 return result;
182 + }
183 #else
184 return get_bits(s, 1);
185 #endif
186 @@ -482,6 +510,8 @@ static inline void init_get_bits(GetBitC
187 s->buffer= buffer;
188 s->size_in_bits= bit_size;
189 s->buffer_end= buffer + buffer_size;
190 + s->buffer_exhausted = 0;
191 + s->buffer_enforcing = 0;
192 #ifdef ALT_BITSTREAM_READER
193 s->index=0;
194 #elif defined LIBMPEG2_BITSTREAM_READER
195 Only in ffmpeg-mt/libavcodec: get_bits.h~
196 diff -rpu unpatched_ffmpeg-mt/libavcodec/h264.h ffmpeg-mt/libavcodec/h264.h
197 --- unpatched_ffmpeg-mt/libavcodec/h264.h 2010-03-11 17:46:30 -0800
198 +++ ffmpeg-mt/libavcodec/h264.h 2010-03-11 19:12:59 -0800
199 @@ -599,9 +599,20 @@ typedef struct H264Context{
200
201 extern const uint8_t ff_h264_chroma_qp[52];
202
203 +#if CONFIG_SVQ3_DECODER
204 void ff_svq3_luma_dc_dequant_idct_c(DCTELEM *block, int qp);
205
206 void ff_svq3_add_idct_c(uint8_t *dst, DCTELEM *block, int stride, int qp, int d c);
207 +#else
208 +
209 +#define SVQ3_DISABLED_FUNC { av_log(NULL, AV_LOG_FATAL, "Calling svq3 when disa bled.\n"); }
210 +
211 +static void inline ff_svq3_luma_dc_dequant_idct_c(DCTELEM *block, int qp) SVQ3_ DISABLED_FUNC;
212 +
213 +static void inline ff_svq3_add_idct_c(uint8_t *dst, DCTELEM *block, int stride, int qp, int dc) SVQ3_DISABLED_FUNC;
214 +
215 +#endif
216 +
217
218 /**
219 * Decode SEI
220 Only in ffmpeg-mt/libavcodec: h264.h~
221 diff -rpu unpatched_ffmpeg-mt/libavcodec/mpeg4video.h ffmpeg-mt/libavcodec/mpeg4 video.h
222 --- unpatched_ffmpeg-mt/libavcodec/mpeg4video.h 2010-03-11 17:46:30 -0800
223 +++ ffmpeg-mt/libavcodec/mpeg4video.h 2010-03-11 19:12:02 -0800
224 @@ -91,6 +91,9 @@ void mpeg4_encode_mb(MpegEncContext *s,
225 void mpeg4_pred_ac(MpegEncContext * s, DCTELEM *block, int n,
226 int dir);
227 void ff_set_mpeg4_time(MpegEncContext * s);
228 +void mpeg4_encode_gop_header(MpegEncContext * s);
229 +void mpeg4_encode_visual_object_header(MpegEncContext * s);
230 +void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number) ;
231 void mpeg4_encode_picture_header(MpegEncContext *s, int picture_number);
232
233 int ff_mpeg4_decode_picture_header(MpegEncContext * s, GetBitContext *gb);
234 Only in ffmpeg-mt/libavcodec: mpeg4video.h~
235 Only in ffmpeg-mt/libavcodec: mpeg4video_es_bsf.c
236 diff -rpu unpatched_ffmpeg-mt/libavcodec/mpeg4videoenc.c ffmpeg-mt/libavcodec/mp eg4videoenc.c
237 --- unpatched_ffmpeg-mt/libavcodec/mpeg4videoenc.c 2010-03-11 17:46:30 -080 0
238 +++ ffmpeg-mt/libavcodec/mpeg4videoenc.c 2010-03-11 19:12:02 -0800
239 @@ -872,7 +872,7 @@ void ff_set_mpeg4_time(MpegEncContext *
240 }
241 }
242
243 -static void mpeg4_encode_gop_header(MpegEncContext * s){
244 +void mpeg4_encode_gop_header(MpegEncContext * s){
245 int hours, minutes, seconds;
246 int64_t time;
247
248 @@ -902,7 +902,7 @@ static void mpeg4_encode_gop_header(Mpeg
249 ff_mpeg4_stuffing(&s->pb);
250 }
251
252 -static void mpeg4_encode_visual_object_header(MpegEncContext * s){
253 +void mpeg4_encode_visual_object_header(MpegEncContext * s){
254 int profile_and_level_indication;
255 int vo_ver_id;
256
257 @@ -947,7 +947,7 @@ static void mpeg4_encode_visual_object_h
258 ff_mpeg4_stuffing(&s->pb);
259 }
260
261 -static void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_ number)
262 +void mpeg4_encode_vol_header(MpegEncContext * s, int vo_number, int vol_number)
263 {
264 int vo_ver_id;
265
266 Only in ffmpeg-mt/libavcodec: vc1_asftoannexg_bsf.c
267 Only in ffmpeg-mt/libavcodec: vc1_asftorcv_bsf.c
268 diff -rpu unpatched_ffmpeg-mt/libavcodec/vorbis_dec.c ffmpeg-mt/libavcodec/vorbi s_dec.c
269 --- unpatched_ffmpeg-mt/libavcodec/vorbis_dec.c 2010-03-11 17:46:30 -0800
270 +++ ffmpeg-mt/libavcodec/vorbis_dec.c 2010-03-11 19:13:34 -0800
271 @@ -961,6 +961,7 @@ static av_cold int vorbis_decode_init(AV
272 }
273
274 init_get_bits(gb, header_start[0], header_len[0]*8);
275 + gb->buffer_enforcing=1;
276 hdr_type = get_bits(gb, 8);
277 if (hdr_type != 1) {
278 av_log(avccontext, AV_LOG_ERROR, "First header is not the id header.\n" );
279 @@ -973,6 +974,7 @@ static av_cold int vorbis_decode_init(AV
280 }
281
282 init_get_bits(gb, header_start[2], header_len[2]*8);
283 + gb->buffer_enforcing=1;
284 hdr_type = get_bits(gb, 8);
285 if (hdr_type != 5) {
286 av_log(avccontext, AV_LOG_ERROR, "Third header is not the setup header. \n");
287 @@ -1194,7 +1196,7 @@ static uint_fast8_t vorbis_floor1_decode
288 adx = vf->list[high_neigh_offs].x - vf->list[low_neigh_offs].x;
289 ady = FFABS(dy);
290 err = ady * (vf->list[i].x - vf->list[low_neigh_offs].x);
291 - off = (int16_t)err / (int16_t)adx;
292 + off = (int16_t)err / (int16_t)(adx?adx:1);
293 if (dy < 0) {
294 predicted = floor1_Y_final[low_neigh_offs] - off;
295 } else {
296 @@ -1281,7 +1283,7 @@ static av_always_inline int vorbis_resid
297 uint_fast16_t j_times_ptns_to_read;
298
299 voffset = vr->begin;
300 - for (partition_count = 0; partition_count < ptns_to_read;) { // SPEC error
301 + for(partition_count=0;partition_count<ptns_to_read && !(gb->buffer_exha usted && gb->index > gb->size_in_bits);) { // SPEC error
302 if (!pass) {
303 uint_fast32_t inverse_class = ff_inverse[vr->classifications];
304 for (j_times_ptns_to_read = 0, j = 0; j < ch_used; ++j) {
305 @@ -1601,6 +1603,7 @@ static int vorbis_decode_frame(AVCodecCo
306 AV_DEBUG("packet length %d \n", buf_size);
307
308 init_get_bits(gb, buf, buf_size*8);
309 + gb->buffer_enforcing=1;
310
311 len = vorbis_parse_audio_packet(vc);
312
313 Only in ffmpeg-mt/libavcodec: vorbis_dec.c~
314 diff -rpu unpatched_ffmpeg-mt/libavcodec/vp3.c ffmpeg-mt/libavcodec/vp3.c
315 --- unpatched_ffmpeg-mt/libavcodec/vp3.c 2010-03-11 17:46:30 -0800
316 +++ ffmpeg-mt/libavcodec/vp3.c 2010-03-11 19:13:21 -0800
317 @@ -922,6 +922,11 @@ static int unpack_vlcs(Vp3DecodeContext
318 int num_coeffs = s->num_coded_frags[plane][coeff_index];
319 int16_t *dct_tokens = s->dct_tokens[plane][coeff_index];
320
321 +#ifdef ALT_BITSTREAM_READER
322 + if (gb->buffer_exhausted && gb->index > gb->size_in_bits)
323 + return 0;
324 +#endif
325 +
326 /* local references to structure members to avoid repeated deferences */
327 int *coded_fragment_list = s->coded_fragment_list[plane];
328 Vp3Fragment *all_fragments = s->all_fragments;
329 @@ -1099,6 +1104,11 @@ static int unpack_dct_coeffs(Vp3DecodeCo
330 2, residual_eob_run);
331 }
332
333 +#ifdef ALT_BITSTREAM_READER
334 + if (gb->buffer_exhausted && gb->index > gb->size_in_bits)
335 + return 1;
336 +#endif
337 +
338 return 0;
339 }
340
341 @@ -1882,6 +1892,7 @@ static int vp3_decode_frame(AVCodecConte
342 int i;
343
344 init_get_bits(&gb, buf, buf_size * 8);
345 + gb.buffer_enforcing = 1;
346
347 if (s->theora && get_bits1(&gb))
348 {
349 @@ -2305,6 +2316,7 @@ static av_cold int theora_decode_init(AV
350
351 for(i=0;i<3;i++) {
352 init_get_bits(&gb, header_start[i], header_len[i] * 8);
353 + gb.buffer_enforcing = 1;
354
355 ptype = get_bits(&gb, 8);
356
357 Only in ffmpeg-mt/libavcodec: vp3.c~
358 diff -rpu unpatched_ffmpeg-mt/libavformat/Makefile ffmpeg-mt/libavformat/Makefil e
359 --- unpatched_ffmpeg-mt/libavformat/Makefile 2010-03-11 17:46:31 -0800
360 +++ ffmpeg-mt/libavformat/Makefile 2010-03-11 19:12:33 -0800
361 @@ -141,13 +141,13 @@ OBJS-$(CONFIG_NUT_DEMUXER)
362 OBJS-$(CONFIG_NUT_MUXER) += nutenc.o nut.o riff.o
363 OBJS-$(CONFIG_NUV_DEMUXER) += nuv.o riff.o
364 OBJS-$(CONFIG_OGG_DEMUXER) += oggdec.o \
365 - oggparsedirac.o \
366 - oggparseflac.o \
367 oggparseogm.o \
368 - oggparsespeex.o \
369 oggparsetheora.o \
370 oggparsevorbis.o \
371 riff.o
372 +OBJS-$(CONFIG_DIRAC_DEMUXER) += oggparsedirac.o
373 +OBJS-$(CONFIG_FLAC_DECODER) += oggparseflac.o
374 +OBJS-$(CONFIG_LIBSPEEX) += oggparsespeex.o
375 OBJS-$(CONFIG_OGG_MUXER) += oggenc.o
376 OBJS-$(CONFIG_OMA_DEMUXER) += oma.o raw.o
377 OBJS-$(CONFIG_PCM_ALAW_DEMUXER) += raw.o
378 diff -rpu unpatched_ffmpeg-mt/libavformat/mov.c ffmpeg-mt/libavformat/mov.c
379 --- unpatched_ffmpeg-mt/libavformat/mov.c 2010-03-11 17:46:31 -0800
380 +++ ffmpeg-mt/libavformat/mov.c 2010-03-11 19:08:40 -0800
381 @@ -312,6 +312,8 @@ static int mov_read_dref(MOVContext *c,
382 MOVDref *dref = &sc->drefs[i];
383 uint32_t size = get_be32(pb);
384 int64_t next = url_ftell(pb) + size - 4;
385 + if (size < 8)
386 + return -1;
387
388 dref->type = get_le32(pb);
389 get_be32(pb); // version + flags
390 Only in ffmpeg-mt/libavformat: mov.c~
391 diff -rpu unpatched_ffmpeg-mt/libavformat/oggdec.c ffmpeg-mt/libavformat/oggdec. c
392 --- unpatched_ffmpeg-mt/libavformat/oggdec.c 2010-03-11 17:46:31 -0800
393 +++ ffmpeg-mt/libavformat/oggdec.c 2010-03-11 19:12:46 -0800
394 @@ -38,13 +38,23 @@
395 #define DECODER_BUFFER_SIZE MAX_PAGE_SIZE
396
397 static const struct ogg_codec * const ogg_codecs[] = {
398 +#if CONFIG_DIRAC_DEMUXER
399 &ff_dirac_codec,
400 +#endif
401 +#if CONFIG_LIBSPEEX
402 &ff_speex_codec,
403 +#endif
404 &ff_vorbis_codec,
405 &ff_theora_codec,
406 +#if CONFIG_FLAC_DECODER
407 &ff_flac_codec,
408 +#endif
409 +#if CONFIG_DIRAC_DEMUXER
410 &ff_old_dirac_codec,
411 +#endif
412 +#if CONFIG_FLAC_DECODER
413 &ff_old_flac_codec,
414 +#endif
415 &ff_ogm_video_codec,
416 &ff_ogm_audio_codec,
417 &ff_ogm_text_codec,
418 @@ -200,7 +210,7 @@ ogg_new_buf(struct ogg *ogg, int idx)
419 }
420
421 static int
422 -ogg_read_page (AVFormatContext * s, int *str)
423 +ogg_read_page (AVFormatContext * s, int *str, int64_t *offset)
424 {
425 ByteIOContext *bc = s->pb;
426 struct ogg *ogg = s->priv_data;
427 @@ -214,6 +224,7 @@ ogg_read_page (AVFormatContext * s, int
428 int size, idx;
429 uint8_t sync[4];
430 int sp = 0;
431 + int64_t poffset = url_ftell(bc);
432
433 if (get_buffer (bc, sync, 4) < 4)
434 return -1;
435 @@ -298,18 +309,22 @@ ogg_read_page (AVFormatContext * s, int
436
437 if (str)
438 *str = idx;
439 + if (offset)
440 + *offset = poffset;
441
442 return 0;
443 }
444
445 static int
446 -ogg_packet (AVFormatContext * s, int *str, int *dstart, int *dsize)
447 +ogg_packet (AVFormatContext * s, int *str, int *dstart, int *dsize, int64_t* of fset)
448 {
449 struct ogg *ogg = s->priv_data;
450 int idx, i;
451 struct ogg_stream *os;
452 int complete = 0;
453 int segp = 0, psize = 0;
454 + int64_t poffset;
455 + int pnum = 0;
456
457 #if 0
458 av_log (s, AV_LOG_DEBUG, "ogg_packet: curidx=%i\n", ogg->curidx);
459 @@ -319,10 +334,13 @@ ogg_packet (AVFormatContext * s, int *st
460 idx = ogg->curidx;
461
462 while (idx < 0){
463 - if (ogg_read_page (s, &idx) < 0)
464 + if (ogg_read_page (s, &idx, &poffset) < 0)
465 return -1;
466 }
467
468 + if (pnum++ == 0 && offset)
469 + *offset = poffset;
470 +
471 os = ogg->streams + idx;
472
473 #if 0
474 @@ -418,12 +436,15 @@ static int
475 ogg_get_headers (AVFormatContext * s)
476 {
477 struct ogg *ogg = s->priv_data;
478 + int64_t pos = 0;
479
480 do{
481 - if (ogg_packet (s, NULL, NULL, NULL) < 0)
482 + if (ogg_packet (s, NULL, NULL, NULL, &pos) < 0)
483 return -1;
484 }while (!ogg->headers);
485
486 + s->data_offset = pos;
487 +
488 #if 0
489 av_log (s, AV_LOG_DEBUG, "found headers\n");
490 #endif
491 @@ -472,7 +493,7 @@ ogg_get_length (AVFormatContext * s)
492 ogg_save (s);
493 url_fseek (s->pb, end, SEEK_SET);
494
495 - while (!ogg_read_page (s, &i)){
496 + while (!ogg_read_page (s, &i, NULL)){
497 if (ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0 &&
498 ogg->streams[i].codec)
499 idx = i;
500 @@ -523,7 +544,7 @@ ogg_read_packet (AVFormatContext * s, AV
501
502 //Get an ogg packet
503 do{
504 - if (ogg_packet (s, &idx, &pstart, &psize) < 0)
505 + if (ogg_packet (s, &idx, &pstart, &psize, NULL) < 0)
506 return AVERROR(EIO);
507 }while (idx < 0 || !s->streams[idx]);
508
509 @@ -585,14 +606,17 @@ ogg_read_timestamp (AVFormatContext * s,
510 ByteIOContext *bc = s->pb;
511 int64_t pts = AV_NOPTS_VALUE;
512 int i;
513 + int64_t fpoffset = AV_NOPTS_VALUE;
514 + int64_t poffset;
515 url_fseek(bc, *pos_arg, SEEK_SET);
516 - while (url_ftell(bc) < pos_limit && !ogg_read_page (s, &i)) {
517 + while (url_ftell(bc) < pos_limit && !ogg_read_page (s, &i, &poffset)) {
518 + if (fpoffset == AV_NOPTS_VALUE && i == stream_index)
519 + fpoffset = poffset;
520 if (ogg->streams[i].granule != -1 && ogg->streams[i].granule != 0 &&
521 ogg->streams[i].codec && i == stream_index) {
522 pts = ogg_gptopts(s, i, ogg->streams[i].granule, NULL);
523 - // FIXME: this is the position of the packet after the one with abo ve
524 - // pts.
525 - *pos_arg = url_ftell(bc);
526 + *pos_arg = fpoffset;
527 + url_fseek(bc, fpoffset, SEEK_SET);
528 break;
529 }
530 }
531 Only in ffmpeg-mt/libavformat: oggdec.c~
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698