[FFmpeg-devel] [PATCH 1/2] avformat/yuv4mpegenc: Simplify writing global and packet headers

Paul B Mahol onemda at gmail.com
Fri Sep 4 14:27:06 EEST 2020


On 9/4/20, Andreas Rheinhardt <andreas.rheinhardt at gmail.com> wrote:
> YUV4MPEG writes a string as header for both the file itself as well as
> for every frame; these strings contain magic strings and these were up
> until now included in the string to write via %s. Yet they are compile
> time constants, so one can use the compile-time string concatentation
> instead of inserting these strings at runtime.
> Furthermore, the global header has been written via snprintf() to
> a local buffer first before writing it. This can be simplified by using
> avio_printf().
>
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> ---


lgtm

> That snprintf() call was weird: The buffer used had a size of
> Y4M_LINE_MAX + 1, yet snprintf has been told that the size was
> Y4M_LINE_MAX, despite snprintf always adding a trailing zero (i.e. it
> writes at most Y4M_LINE_MAX - 1 chars and then adds a zero).
> Furthermore, snprintf only returns something negative on format errors,
> not if the buffer is too small (this can be checked via the return
> value). And returning AVERROR(EIO) for this error is strange, too.
>
>  libavformat/yuv4mpegenc.c | 21 +++++++--------------
>  1 file changed, 7 insertions(+), 14 deletions(-)
>
> diff --git a/libavformat/yuv4mpegenc.c b/libavformat/yuv4mpegenc.c
> index c4781042bd..fdd020e13b 100644
> --- a/libavformat/yuv4mpegenc.c
> +++ b/libavformat/yuv4mpegenc.c
> @@ -24,18 +24,15 @@
>  #include "internal.h"
>  #include "yuv4mpeg.h"
>
> -#define Y4M_LINE_MAX 256
> -
>  static int yuv4_write_header(AVFormatContext *s)
>  {
>      AVStream *st;
>      AVIOContext *pb = s->pb;
>      int width, height;
> -    int raten, rated, aspectn, aspectd, n;
> +    int raten, rated, aspectn, aspectd, ret;
>      char inter;
>      const char *colorspace = "";
>      const char *colorrange = "";
> -    char buf[Y4M_LINE_MAX + 1];
>      int field_order;
>
>      st     = s->streams[0];
> @@ -170,19 +167,15 @@ static int yuv4_write_header(AVFormatContext *s)
>          break;
>      }
>
> -    /* construct stream header, if this is the first frame */
> -    n = snprintf(buf, Y4M_LINE_MAX, "%s W%d H%d F%d:%d I%c A%d:%d%s%s\n",
> -                 Y4M_MAGIC, width, height, raten, rated, inter,
> -                 aspectn, aspectd, colorspace, colorrange);
> -
> -    if (n < 0) {
> +    ret = avio_printf(pb, Y4M_MAGIC " W%d H%d F%d:%d I%c A%d:%d%s%s\n",
> +                      width, height, raten, rated, inter,
> +                      aspectn, aspectd, colorspace, colorrange);
> +    if (ret < 0) {
>          av_log(s, AV_LOG_ERROR,
>                 "Error. YUV4MPEG stream header write failed.\n");
> -        return AVERROR(EIO);
> +        return ret;
>      }
>
> -    avio_write(pb, buf, strlen(buf));
> -
>      return 0;
>  }
>
> @@ -200,7 +193,7 @@ static int yuv4_write_packet(AVFormatContext *s,
> AVPacket *pkt)
>
>      /* construct frame header */
>
> -    avio_printf(s->pb, "%s\n", Y4M_FRAME_MAGIC);
> +    avio_printf(s->pb, Y4M_FRAME_MAGIC "\n");
>
>      width  = st->codecpar->width;
>      height = st->codecpar->height;
> --
> 2.20.1
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>
> To unsubscribe, visit link above, or email
> ffmpeg-devel-request at ffmpeg.org with subject "unsubscribe".


More information about the ffmpeg-devel mailing list