From 6b565268fb9ade18f3ec4dc365a2e31ed6f76ee7 Mon Sep 17 00:00:00 2001 From: Jean-Marc Valin Date: Wed, 12 Jan 2011 11:27:03 -0500 Subject: [PATCH] Fixes constrained VBR Also removes the 8 byte/packet lower bound --- libcelt/celt.c | 6 ++++-- tools/celtdec.c | 4 ++-- tools/celtenc.c | 5 +---- 3 files changed, 7 insertions(+), 8 deletions(-) diff --git a/libcelt/celt.c b/libcelt/celt.c index d0ee4a02..f6d4609e 100644 --- a/libcelt/celt.c +++ b/libcelt/celt.c @@ -1164,7 +1164,10 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, i nbAvailableBytes = target+(1<<(BITRES+2))>>(BITRES+3); nbAvailableBytes=IMAX(min_allowed,nbAvailableBytes); - /* TODO: if we're busting, this will increase the reservoir by too much */ + + nbCompressedBytes = IMIN(nbCompressedBytes,nbAvailableBytes+nbFilledBytes); + nbAvailableBytes = nbCompressedBytes - nbFilledBytes; + target=nbAvailableBytes<<(BITRES+3); if (st->vbr_count < 970) @@ -1191,7 +1194,6 @@ int celt_encode_with_ec_float(CELTEncoder * restrict st, const celt_sig * pcm, i st->vbr_reservoir = 0; /*printf ("+%d\n", adjust);*/ } - nbCompressedBytes = IMIN(nbCompressedBytes,nbAvailableBytes+nbFilledBytes); /* This moves the raw bits to take into account the new compressed size */ ec_byte_shrink(&buf, nbCompressedBytes); diff --git a/tools/celtdec.c b/tools/celtdec.c index b12b50a1..23e1e1e3 100644 --- a/tools/celtdec.c +++ b/tools/celtdec.c @@ -533,9 +533,9 @@ int main(int argc, char **argv) /*printf ("page granulepos: %d %d %d\n", skip_samples, page_nb_packets, (int)page_granule);*/ last_granule = page_granule; /*Extract all available packets*/ - while (!eos && ogg_stream_packetout(&os, &op) == 1 && op.bytes>=8) + while (!eos && ogg_stream_packetout(&os, &op) == 1) { - if (!memcmp(op.packet, "CELT ", 8)) { + if (op.bytes>=8 && !memcmp(op.packet, "CELT ", 8)) { celt_serialno = os.serialno; } if (celt_serialno == -1 || os.serialno != celt_serialno) diff --git a/tools/celtenc.c b/tools/celtenc.c index 0a3554f4..65d93116 100644 --- a/tools/celtenc.c +++ b/tools/celtenc.c @@ -484,10 +484,7 @@ int main(int argc, char **argv) bytes_per_packet = (bitrate*1000*frame_size/rate+4)/8; - if (bytes_per_packet < 8) { - bytes_per_packet=8; - fprintf (stderr, "Warning: Requested bitrate (%0.3fkbit/sec) is too low. Setting CELT to 8 bytes/frame.\n",bitrate); - } else if (bytes_per_packet > MAX_FRAME_BYTES) { + if (bytes_per_packet > MAX_FRAME_BYTES) { bytes_per_packet=MAX_FRAME_BYTES; fprintf (stderr, "Warning: Requested bitrate (%0.3fkbit/sec) is too high. Setting CELT to %d bytes/frame.\n",bitrate,MAX_FRAME_BYTES); }