diff oggvorbis.c @ 1924:d9f751c0f488 libavcodec

pts hack (correct solution would be to pass the pts from the encoder to the muxer)
author michael
date Sun, 04 Apr 2004 17:06:30 +0000
parents 04f93474b3bb
children 48c1033bd23b
line wrap: on
line diff
--- a/oggvorbis.c	Sun Apr 04 15:19:20 2004 +0000
+++ b/oggvorbis.c	Sun Apr 04 17:06:30 2004 +0000
@@ -8,7 +8,9 @@
 
 #include "avcodec.h"
 
-//#define OGGVORBIS_FRAME_SIZE 1024
+#undef NDEBUG
+#include <assert.h>
+
 #define OGGVORBIS_FRAME_SIZE 64
 
 #define BUFFER_SIZE (1024*64)
@@ -19,6 +21,7 @@
     vorbis_block vb ;
     uint8_t buffer[BUFFER_SIZE];
     int buffer_index;
+    int64_t fake_pts; //pts which libavformat will guess, HACK FIXME
 
     /* decoder */
     vorbis_comment vc ;
@@ -130,20 +133,27 @@
 	}
     }
 
+    l=0;
     if(context->buffer_index){
         ogg_packet *op2= (ogg_packet*)context->buffer;
         op2->packet = context->buffer + sizeof(ogg_packet);
-        l=  op2->bytes;
-        
-        memcpy(packets, op2->packet, l);
-        context->buffer_index -= l + sizeof(ogg_packet);
-        memcpy(context->buffer, context->buffer + l + sizeof(ogg_packet), context->buffer_index);
-        
+
+        if(op2->granulepos <= context->fake_pts /*&& (context->fake_pts || context->buffer_index > 4*1024)*/){
+            assert(op2->granulepos == context->fake_pts);
+            l=  op2->bytes;
+
+            memcpy(packets, op2->packet, l);
+            context->buffer_index -= l + sizeof(ogg_packet);
+            memcpy(context->buffer, context->buffer + l + sizeof(ogg_packet), context->buffer_index);
+        }
 //        av_log(avccontext, AV_LOG_DEBUG, "E%d\n", l);
-        return l;
     }
 
-    return 0;
+    if(l || context->fake_pts){
+        context->fake_pts += avccontext->frame_size;
+    }
+        
+    return l;
 }