[FFmpeg-devel] [PATCH] avformat/matroskaenc: Remove unnecessary function calls

Andreas Rheinhardt andreas.rheinhardt at outlook.com
Fri Apr 16 14:08:01 EEST 2021


Andreas Rheinhardt:
> ffio_fill() is used when initially writing unknown length elements;
> yet it can happen that the amount of bytes written by it is zero in
> which case it is of course unnecessary to ever call it. Whether it is
> possible to know this during compiletime depends upon how aggressively
> the compiler inlines function calls (i.e. if it inlines calls to
> start_ebml_master() where the upper bound for the size of the element
> implies that the size will be written on one byte) and this depends upon
> optimization settings. It is not the aim of this patch to inline all
> calls where it is known that ffio_fill() will be unnecessary, but merely
> to make compilers that inline such calls aware of the fact that writing
> zero bytes with ffio_fill() is unnecessary. To this end
> av_builtin_constant_p() is used to check whether the size is a
> compiletime constant.
> 
> For GCC 10 this made a difference at -O3 only: The size of .text
> decreased from 0x747F (with 29 calls to ffio_fill(), eight of which
> use size zero) to 0x7337 (with 21 calls to ffio_fill(), zero of which
> use size zero).
> For Clang 11 it made a difference at -O2 and -O3: At -O2, the size of
> .text decreased from 0x879C to 0x871C (with eight calls to ffio_fill()
> eliminated); at -O3 the size of .text decreased from 0xAF2F to 0xAEBF.
> Once again, eight calls to ffio_fill() with size zero have been
> eliminated.
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
> ---
>  libavformat/matroskaenc.c | 2 ++
>  1 file changed, 2 insertions(+)
> 
> diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c
> index 3649ac25a2..0141fb0b8d 100644
> --- a/libavformat/matroskaenc.c
> +++ b/libavformat/matroskaenc.c
> @@ -195,6 +195,8 @@ static void put_ebml_size_unknown(AVIOContext *pb, int bytes)
>  {
>      av_assert0(bytes <= 8);
>      avio_w8(pb, 0x1ff >> bytes);
> +    if (av_builtin_constant_p(bytes) && bytes == 1)
> +        return;
>      ffio_fill(pb, 0xff, bytes - 1);
>  }
>  
> 
Will apply tomorrow unless there are  objections.

- Andreas


More information about the ffmpeg-devel mailing list