[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