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)
{