|
|
|
@ -104,7 +104,7 @@ static void put_ebml_id(ByteIOContext *pb, unsigned int id) |
|
|
|
|
*/ |
|
|
|
|
static void put_ebml_size_unknown(ByteIOContext *pb, int bytes) |
|
|
|
|
{ |
|
|
|
|
bytes = FFMIN(bytes, 8); |
|
|
|
|
assert(bytes <= 8); |
|
|
|
|
put_byte(pb, 0x1ff >> bytes); |
|
|
|
|
while (--bytes) |
|
|
|
|
put_byte(pb, 0xff); |
|
|
|
@ -140,14 +140,9 @@ static void put_ebml_size(ByteIOContext *pb, uint64_t size, int bytes) |
|
|
|
|
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 %" PRIu64 " needs %d bytes but only %d bytes reserved\n", |
|
|
|
|
size, needed_bytes, bytes); |
|
|
|
|
put_ebml_size_unknown(pb, bytes); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
assert(bytes >= needed_bytes); |
|
|
|
|
|
|
|
|
|
size |= 1ULL << bytes*7; |
|
|
|
|
for (i = bytes - 1; i >= 0; i--) |
|
|
|
@ -195,8 +190,7 @@ static void put_ebml_void(ByteIOContext *pb, uint64_t size) |
|
|
|
|
{ |
|
|
|
|
offset_t currentpos = url_ftell(pb); |
|
|
|
|
|
|
|
|
|
if (size < 2) |
|
|
|
|
return; |
|
|
|
|
assert(size >= 2); |
|
|
|
|
|
|
|
|
|
put_ebml_id(pb, EBML_ID_VOID); |
|
|
|
|
// we need to subtract the length needed to store the size from the
|
|
|
|
|