ref: 74225cb4a4e32b32b76ec82c824a1f57fe215177
parent: 6e3f7008a4243e60ceef016bfa37f9702c1c0aa5
author: Jean-Marc Valin <jmvalin@jmvalin.ca>
date: Fri May 5 09:24:51 EDT 2017
shifting the buffer to avoid growing it all the time
--- a/src/ogg_packer.c
+++ b/src/ogg_packer.c
@@ -208,6 +208,28 @@
oggp->muxing_delay = delay;
}
+static void shift_buffer(oggpacker *oggp) {
+ int buf_shift;
+ int lacing_shift;
+ int i;
+ buf_shift = oggp->pages_fill ? oggp->pages[0].buf_pos : oggp->buf_begin;
+ lacing_shift = oggp->pages_fill ? oggp->pages[0].lacing_pos : oggp->lacing_begin;
+ assert(lacing_shift >= 0);
+ assert(buf_shift >= 0);
+ if (4*lacing_shift > oggp->lacing_fill) {
+ memmove(&oggp->lacing[0], &oggp->lacing[lacing_shift], oggp->lacing_fill-lacing_shift);
+ for (i=0;i<oggp->pages_fill;i++) oggp->pages[i].lacing_pos -= lacing_shift;
+ oggp->lacing_fill -= lacing_shift;
+ oggp->lacing_begin -= lacing_shift;
+ }
+ if (4*buf_shift > oggp->buf_fill) {
+ memmove(&oggp->buf[0], &oggp->buf[buf_shift], oggp->buf_fill-buf_shift);
+ for (i=0;i<oggp->pages_fill;i++) oggp->pages[i].buf_pos -= buf_shift;
+ oggp->buf_fill -= buf_shift;
+ oggp->buf_begin -= buf_shift;
+ }
+}
+
/** Get a buffer where to write the next packet. The buffer will have
size "bytes", but fewer bytes can be written. The buffer remains valid through
a call to oggp_close_page() or oggp_get_next_page(), but is invalidated by
@@ -214,7 +236,7 @@
another call to oggp_get_packet_buffer() or by a call to oggp_commit_packet(). */
unsigned char *oggp_get_packet_buffer(oggpacker *oggp, int bytes) {
if (oggp->buf_fill + bytes > oggp->buf_size) {
- /* FIXME: Check if it's worth shifting the buffer. */
+ shift_buffer(oggp);
/* If we didn't shift the buffer or if we did and there's still not enough room, make some more. */
if (oggp->buf_fill + bytes > oggp->buf_size) {
@@ -250,7 +272,7 @@
assert(oggp->user_buf >= &oggp->buf[oggp->buf_fill]);
oggp->buf_fill += bytes;
if (oggp->lacing_fill + nb_255s + 1 > oggp->lacing_size) {
- /* FIXME: Check if it's worth shifting the lacing values. */
+ shift_buffer(oggp);
/* If we didn't shift the values or if we did and there's still not enough room, make some more. */
if (oggp->lacing_fill + nb_255s + 1 > oggp->lacing_size) {