shithub: opus-tools

Download patch

ref: c2ee5af26a6487ab3b3dfa95a4df28df82982236
parent: 3e3132bec1537562b541a3e4bb9fa7676e3e4513
author: Gregory Maxwell <greg@xiph.org>
date: Thu Aug 4 11:12:03 EDT 2011

Avoid high muxing delay by tracking and flushing, support for lower
overhead with newer libogg (still needs build system support).

--- a/src/opusenc.c
+++ b/src/opusenc.c
@@ -303,6 +303,7 @@
    ogg_stream_state os;
    ogg_page 		 og;
    ogg_packet 		 op;
+   ogg_int64_t last_granulepos = 0;
    int bytes_written=0, ret, result;
    int id=-1;
    OpusHeader header;
@@ -683,9 +684,23 @@
       /*printf ("granulepos: %d %d %d\n", (int)op.granulepos, op.packetno, op.bytes);*/
       ogg_stream_packetin(&os, &op);
 
-      /*Write all new pages (most likely 0 or 1)*/
-      while (ogg_stream_pageout(&os,&og))
+      /*Write all new pages (most likely 0 or 1)
+        Flush if we've buffered 1 second to avoid excessive framing delay. */
+      while (eos||(op.granulepos-last_granulepos+MAX_FRAME_SIZE>48000)?
+#if 0
+      /*Libogg > 1.2.2 allows us to achieve lower overhead by
+        producing larger pages. For 20ms frames this is only relevant
+        above ~32kbit/sec. We still target somewhat smaller than the
+        maximum size in order to avoid continued pages.*/
+             ogg_stream_flush_fill(&os, &og,255*255-7*MAX_FRAME_BYTES):
+             ogg_stream_pageout_fill(&os, &og,255*255-7*MAX_FRAME_BYTES))
+#else
+             ogg_stream_flush(&os, &og):
+             ogg_stream_pageout(&os, &og))
+#endif
       {
+         if (ogg_page_packets(&og)!=0)
+             last_granulepos = ogg_page_granulepos(&og);
          ret = oe_write_page(&og, fout);
          if(ret != og.header_len + og.body_len)
          {