@ -190,19 +190,38 @@ static void put_ebml_size_unknown(AVIOContext *pb, int bytes)
}
}
/**
/**
* Calculate how many bytes are needed to represent the length field
* Returns how many bytes are needed to represent a number
* of an EBML element whose payload has a given length .
* as EBML variable length integer .
*/
*/
static int ebml_length_size ( uint64_t length )
static int ebml_num_size ( uint64_t num )
{
{
int bytes = 0 ;
int bytes = 0 ;
length + + ;
do {
do {
bytes + + ;
bytes + + ;
} while ( length > > = 7 ) ;
} while ( num > > = 7 ) ;
return bytes ;
return bytes ;
}
}
/**
* Calculate how many bytes are needed to represent the length field
* of an EBML element whose payload has a given length .
*/
static int ebml_length_size ( uint64_t length )
{
return ebml_num_size ( length + 1 ) ;
}
/**
* Write a number as EBML variable length integer on ` bytes ` bytes .
* ` bytes ` is taken literally without checking .
*/
static void put_ebml_num ( AVIOContext * pb , uint64_t num , int bytes )
{
num | = 1ULL < < bytes * 7 ;
for ( int i = bytes - 1 ; i > = 0 ; i - - )
avio_w8 ( pb , ( uint8_t ) ( num > > i * 8 ) ) ;
}
/**
/**
* Write a length as EBML variable length integer .
* Write a length as EBML variable length integer .
*
*
@ -211,7 +230,7 @@ static int ebml_length_size(uint64_t length)
*/
*/
static void put_ebml_length ( AVIOContext * pb , uint64_t length , int bytes )
static void put_ebml_length ( AVIOContext * pb , uint64_t length , int bytes )
{
{
int i , needed_bytes = ebml_length_size ( length ) ;
int needed_bytes = ebml_length_size ( length ) ;
// sizes larger than this are currently undefined in EBML
// sizes larger than this are currently undefined in EBML
av_assert0 ( length < ( 1ULL < < 56 ) - 1 ) ;
av_assert0 ( length < ( 1ULL < < 56 ) - 1 ) ;
@ -221,10 +240,7 @@ static void put_ebml_length(AVIOContext *pb, uint64_t length, int bytes)
// The bytes needed to write the given size must not exceed
// The bytes needed to write the given size must not exceed
// the bytes that we ought to use.
// the bytes that we ought to use.
av_assert0 ( bytes > = needed_bytes ) ;
av_assert0 ( bytes > = needed_bytes ) ;
put_ebml_num ( pb , length , bytes ) ;
length | = 1ULL < < bytes * 7 ;
for ( i = bytes - 1 ; i > = 0 ; i - - )
avio_w8 ( pb , ( uint8_t ) ( length > > i * 8 ) ) ;
}
}
/**
/**