# HG changeset patch # User michael # Date 1081098390 0 # Node ID d9f751c0f488c066d61544d7b27813267272ac9f # Parent 04f93474b3bbac50444d146624221bef07b035c7 pts hack (correct solution would be to pass the pts from the encoder to the muxer) diff -r 04f93474b3bb -r d9f751c0f488 oggvorbis.c --- 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 + #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; }