# HG changeset patch # User conrad # Date 1188951890 0 # Node ID 9a9c45b95c6f3e04f9ab13e4de1b283947d490e5 # Parent 5d8e311d768191d6b0f16264667d3f4dac21cade Modify put_ebml_size() so that the bytes parameter is exact rather than minimum diff -r 5d8e311d7681 -r 9a9c45b95c6f matroskaenc.c --- a/matroskaenc.c Wed Sep 05 00:24:48 2007 +0000 +++ b/matroskaenc.c Wed Sep 05 00:24:50 2007 +0000 @@ -106,11 +106,15 @@ return bytes; } -// XXX: test this thoroughly and get rid of minbytes hack (currently needed to -// use up all of the space reserved in start_ebml_master) -static void put_ebml_size(ByteIOContext *pb, uint64_t size, int minbytes) +/** + * Write a size in EBML variable length format. + * + * @param bytes The number of bytes that need to be used to write the size. + * If zero, any number of bytes can be used. + */ +static void put_ebml_size(ByteIOContext *pb, uint64_t size, int bytes) { - int i, bytes = FFMAX(minbytes, ebml_size_bytes(size)); + int i, needed_bytes = ebml_size_bytes(size); // sizes larger than this are currently undefined in EBML // so write "unknown" size @@ -119,6 +123,18 @@ return; } + if (bytes == 0) + // don't care how many bytes are used, so use the min + bytes = needed_bytes; + else if (needed_bytes > bytes) { + // the bytes needed to write the given size would exceed the bytes + // that we need to use, so write unknown size. This shouldn't happen. + av_log(NULL, AV_LOG_WARNING, "Size of %llu needs %d bytes but only %d bytes reserved\n", + size, needed_bytes, bytes); + put_ebml_size_unknown(pb, bytes); + return; + } + size |= 1ULL << bytes*7; for (i = bytes - 1; i >= 0; i--) put_byte(pb, size >> i*8);