[FFmpeg-devel] [PATCH 21/21] avformat/matroskaenc: Simplify writing Void elements
Andreas Rheinhardt
andreas.rheinhardt at gmail.com
Wed Apr 1 21:56:27 EEST 2020
Andreas Rheinhardt:
> Reserving space in Matroska works by writing a Void element. And until
> now this worked as follows: The current position was recorded and the
> EBML ID as well as the length field written; then the new position was
> recorded to know how much more to write. Afterwards the actual writing
> has been performed via ffio_fill().
>
> But it is unnecessary to explicitly use the positions (obtained via
> avio_tell()) to find out how much still needs to be written, because the
> length of the ID and the length field are known. So rewrite the function
> to no longer use them.
>
> Also, given that ffio_fill() uses an int parameter and given that no
> current caller (and no sane future caller) will want to reserve several
> GB of space, make the size parameter of put_ebml_void() itself an int.
>
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> ---
> libavformat/matroskaenc.c | 17 +++++++++--------
> 1 file changed, 9 insertions(+), 8 deletions(-)
>
> diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
> index 258638e459..e74d59d271 100644
> --- a/libavformat/matroskaenc.c
> +++ b/libavformat/matroskaenc.c
> @@ -288,21 +288,22 @@ static void put_ebml_string(AVIOContext *pb, uint32_t elementid,
> *
> * @param size The number of bytes to reserve, which must be at least 2.
> */
> -static void put_ebml_void(AVIOContext *pb, uint64_t size)
> +static void put_ebml_void(AVIOContext *pb, int size)
> {
> - int64_t currentpos = avio_tell(pb);
> -
> av_assert0(size >= 2);
>
> put_ebml_id(pb, EBML_ID_VOID);
> // we need to subtract the length needed to store the size from the
> // size we need to reserve so 2 cases, we use 8 bytes to store the
> // size if possible, 1 byte otherwise
> - if (size < 10)
> - put_ebml_num(pb, size - 2, 0);
> - else
> - put_ebml_num(pb, size - 9, 8);
> - ffio_fill(pb, 0, currentpos + size - avio_tell(pb));
> + if (size < 10) {
> + size -= 2;
> + put_ebml_num(pb, size, 0);
> + } else {
> + size -= 9;
> + put_ebml_num(pb, size, 8);
> + }
> + ffio_fill(pb, 0, size);
> }
>
> static ebml_master start_ebml_master(AVIOContext *pb, uint32_t elementid,
>
Any comments on this or the other Matroska muxer patches following this
one? If not, I will probably apply this tomorrow.
- Andreas
More information about the ffmpeg-devel
mailing list