mirror of
https://github.com/nyanmisaka/ffmpeg-rockchip.git
synced 2025-10-26 18:30:52 +08:00
avformat/matroskaenc: Refactor writing EBML lengths
This commit factors the ability to write ordinary EBML numbers out of the functions for writing EBML lengths. This is in preparation for future commits. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
This commit is contained in:
@@ -189,18 +189,37 @@ static void put_ebml_size_unknown(AVIOContext *pb, int bytes)
|
|||||||
ffio_fill(pb, 0xff, bytes - 1);
|
ffio_fill(pb, 0xff, bytes - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns how many bytes are needed to represent a number
|
||||||
|
* as EBML variable length integer.
|
||||||
|
*/
|
||||||
|
static int ebml_num_size(uint64_t num)
|
||||||
|
{
|
||||||
|
int bytes = 0;
|
||||||
|
do {
|
||||||
|
bytes++;
|
||||||
|
} while (num >>= 7);
|
||||||
|
return bytes;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Calculate how many bytes are needed to represent the length field
|
* Calculate how many bytes are needed to represent the length field
|
||||||
* of an EBML element whose payload has a given length.
|
* of an EBML element whose payload has a given length.
|
||||||
*/
|
*/
|
||||||
static int ebml_length_size(uint64_t length)
|
static int ebml_length_size(uint64_t length)
|
||||||
{
|
{
|
||||||
int bytes = 0;
|
return ebml_num_size(length + 1);
|
||||||
length++;
|
}
|
||||||
do {
|
|
||||||
bytes++;
|
/**
|
||||||
} while (length >>= 7);
|
* Write a number as EBML variable length integer on `bytes` bytes.
|
||||||
return 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));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -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));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Reference in New Issue
Block a user