shithub: libopusenc

Download patch

ref: 664127e3af10c59d5149237704cbb0c4ab62a65d
parent: bca77956e012e4df078c64a4b30512f3971392bc
author: Jean-Marc Valin <[email protected]>
date: Thu May 4 23:48:30 EDT 2017

Adding some page-splitting code (not quite correct)

--- a/src/ogg_packer.c
+++ b/src/ogg_packer.c
@@ -287,25 +287,40 @@
     If there is too much data for one page, all page continuations will be closed too. */
 int oggp_flush_page(oggpacker *oggp) {
   oggp_page *p;
+  int cont = 0;
+  int nb_lacing;
   if (oggp->lacing_fill == oggp->lacing_begin) {
     return 1;
   }
-  /* FIXME: Check we have a free page. */
-  /* FIXME: Check there is at least one packet. */
-  p = &oggp->pages[oggp->pages_fill++];
-  p->granulepos = oggp->curr_granule;
+  nb_lacing = oggp->lacing_fill - oggp->lacing_begin;
+  do {
+    assert(oggp->pages_fill < oggp->pages_size);
+    /* FIXME: Check we have a free page. */
+    p = &oggp->pages[oggp->pages_fill++];
+    p->granulepos = oggp->curr_granule;
 
-  p->buf_pos = oggp->buf_begin;
-  p->buf_size = oggp->buf_fill - oggp->buf_begin;
-  p->lacing_pos = oggp->lacing_begin;
-  p->lacing_size = oggp->lacing_fill - oggp->lacing_begin;
-  p->pageno = oggp->pageno;
-  /* FIXME: Handle bos/eos and continued pages. */
-  p->flags = 0;
+    p->lacing_pos = oggp->lacing_begin;
+    p->lacing_size = nb_lacing;
+    p->flags = cont;
+    p->buf_pos = oggp->buf_begin;
+    if (p->lacing_size > 255) {
+      int bytes=0;
+      int i;
+      for (i=0;i<255;i++) bytes += oggp->lacing[oggp->lacing_begin+1];
+      p->buf_size = bytes;
+      p->lacing_size = 255;
+      p->granulepos = -1;
+      cont = 1;
+    } else {
+      p->buf_size = oggp->buf_fill - oggp->buf_begin;
+    }
+    nb_lacing -= p->lacing_size;
+    oggp->lacing_begin += p->lacing_size;
+    oggp->buf_begin += p->buf_size;
+    p->pageno = oggp->pageno++;
+    /* FIXME: Handle bos/eos and continued pages. */
+  } while (nb_lacing>0);
 
-  oggp->buf_begin = oggp->buf_fill;
-  oggp->lacing_begin = oggp->lacing_fill;
-  oggp->pageno++;
   oggp->last_granule = oggp->curr_granule;
   return 0;
 }
@@ -335,7 +350,7 @@
   ptr[4]=0x00;
 
   /* FIXME: handle eos/continuation */
-  ptr[5]=0x00;
+  ptr[5]=0x00 | p->flags;
   if (p->pageno == 0) ptr[5] |= 0x02;
   if (oggp->pages_fill==1 && oggp->is_eos) ptr[5] |= 0x04;