diff --git a/libavcodec/oggvorbis.c b/libavcodec/oggvorbis.c
index 04eab33d8fbb57e82b9ab5e929a36a9cc72f9fb8..a6c892004781a48cd914cfb107a9b18fd80249fa 100644
--- a/libavcodec/oggvorbis.c
+++ b/libavcodec/oggvorbis.c
@@ -4,8 +4,6 @@
  * @author Mark Hills <mark@pogo.org.uk>
  */
 
-#include <time.h>
-
 #include <vorbis/vorbisenc.h>
 
 #include "avcodec.h"
@@ -185,22 +183,36 @@ static int oggvorbis_decode_frame(AVCodecContext *avccontext,
     OggVorbisContext *context = avccontext->priv_data ;
     ogg_packet *op = (ogg_packet*)buf ;
     float **pcm ;
-    int samples, total_samples, total_bytes ;
+    int samples, total_samples, total_bytes,i;
  
+    if(!buf_size){
+    //FIXME flush
+        *data_size=0;
+        return 0;
+    }
+    
     op->packet = (char*)op + sizeof(ogg_packet) ; /* correct data pointer */
 
+//    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);
+    
+/*    for(i=0; i<op->bytes; i++)
+      av_log(avccontext, AV_LOG_DEBUG, "%02X ", op->packet[i]);
+    av_log(avccontext, AV_LOG_DEBUG, "\n");*/
+//    op->b_o_s= op->packetno == 0;
     if(op->packetno < 3) {
-	vorbis_synthesis_headerin(&context->vi, &context->vc, op) ;
+	if(vorbis_synthesis_headerin(&context->vi, &context->vc, op)<0){
+            av_log(avccontext, AV_LOG_ERROR, "%lld. vorbis header damaged\n", op->packetno+1);
+            return -1;
+        }
+	avccontext->channels = context->vi.channels ;
+	avccontext->sample_rate = context->vi.rate ;
 	return buf_size ;
     }
 
     if(op->packetno == 3) {
-	av_log(avccontext, AV_LOG_ERROR, "vorbis_decode: %d channel, %ldHz, encoder `%s'\n",
-		context->vi.channels, context->vi.rate, context->vc.vendor);
+//	av_log(avccontext, AV_LOG_INFO, "vorbis_decode: %d channel, %ldHz, encoder `%s'\n",
+//		context->vi.channels, context->vi.rate, context->vc.vendor);
 
-	avccontext->channels = context->vi.channels ;
-	avccontext->sample_rate = context->vi.rate ;
-	
 	vorbis_synthesis_init(&context->vd, &context->vi) ;
 	vorbis_block_init(&context->vd, &context->vb); 
     }
diff --git a/libavformat/ogg.c b/libavformat/ogg.c
index 129c8c462e89d68d384e10c8d4e23aa94e78bc33..b3cc68bb9a006d09ebeaea9a83fe926bae300c82 100644
--- a/libavformat/ogg.c
+++ b/libavformat/ogg.c
@@ -7,7 +7,6 @@
  */
 
 #include <stdio.h>
-#include <time.h>
 
 #include <ogg/ogg.h>
 #include <vorbis/vorbisenc.h>
@@ -42,8 +41,7 @@ static int ogg_write_header(AVFormatContext *avfcontext)
     ogg_packet header, header_comm, header_code ; 
     int n ;
     
-    srand(time(NULL));
-    ogg_stream_init(&context->os, rand());
+    ogg_stream_init(&context->os, 31415);
     
     for(n = 0 ; n < avfcontext->nb_streams ; n++) {
 	avccontext = &avfcontext->streams[n]->codec ;
@@ -196,7 +194,9 @@ static int ogg_read_header(AVFormatContext *avfcontext, AVFormatParameters *ap)
     char *buf ;
     ogg_page og ;
     AVStream *ast ;
-    
+     
+    avfcontext->ctx_flags |= AVFMTCTX_NOHEADER;
+     
     ogg_sync_init(&context->oy) ;
     buf = ogg_sync_buffer(&context->oy, DECODER_BUFFER_SIZE) ;
 
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 1f07ac1ebe14ac628316371c9ddb984be91903c9..c170c03577500540863ef1e04a3557b2f21d8213 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -1476,6 +1476,7 @@ int av_find_stream_info(AVFormatContext *ic)
             (st->codec.codec_id == CODEC_ID_FLV1 ||
              st->codec.codec_id == CODEC_ID_H264 ||
              st->codec.codec_id == CODEC_ID_H263 ||
+             st->codec.codec_id == CODEC_ID_VORBIS ||
              (st->codec.codec_id == CODEC_ID_MPEG4 && !st->need_parsing)))
             try_decode_frame(st, pkt->data, pkt->size);
         
@@ -1864,7 +1865,7 @@ int parse_frame_rate(int *frame_rate, int *frame_rate_base, const char *arg)
     } 
     else {
         /* Finally we give up and parse it as double */
-        *frame_rate_base = DEFAULT_FRAME_RATE_BASE;
+        *frame_rate_base = DEFAULT_FRAME_RATE_BASE; //FIXME use av_d2q()
         *frame_rate = (int)(strtod(arg, 0) * (*frame_rate_base) + 0.5);
     }
     if (!*frame_rate || !*frame_rate_base)