[FFmpeg-devel] [PATCH] avformat/av1: Avoid using dynamic buffer when assembling av1c

Andreas Rheinhardt andreas.rheinhardt at gmail.com
Wed Jun 24 17:25:02 EEST 2020


Andreas Rheinhardt:
> Given that AV1 only has exactly one sequence header, it is unnecessary
> to copy the content of said sequence header into an intermediate dynamic
> buffer; instead the sequence header can be copied from where it is in
> the input buffer.
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> ---
>  libavformat/av1.c | 18 +++++++-----------
>  1 file changed, 7 insertions(+), 11 deletions(-)
> 
> diff --git a/libavformat/av1.c b/libavformat/av1.c
> index 1e7a67d2f2..0cbffb1fd8 100644
> --- a/libavformat/av1.c
> +++ b/libavformat/av1.c
> @@ -363,11 +363,11 @@ int ff_av1_parse_seq_header(AV1SequenceParameters *seq, const uint8_t *buf, int
>  
>  int ff_isom_write_av1c(AVIOContext *pb, const uint8_t *buf, int size)
>  {
> -    AVIOContext *seq_pb = NULL, *meta_pb = NULL;
> +    AVIOContext *meta_pb;
>      AV1SequenceParameters seq_params;
>      PutBitContext pbc;
> -    uint8_t header[4];
> -    uint8_t *seq, *meta;
> +    uint8_t header[4], *meta;
> +    const uint8_t *seq;
>      int64_t obu_size;
>      int start_pos, type, temporal_id, spatial_id;
>      int ret, nb_seq = 0, seq_size, meta_size;
> @@ -375,12 +375,9 @@ int ff_isom_write_av1c(AVIOContext *pb, const uint8_t *buf, int size)
>      if (size <= 0)
>          return AVERROR_INVALIDDATA;
>  
> -    ret = avio_open_dyn_buf(&seq_pb);
> -    if (ret < 0)
> -        return ret;
>      ret = avio_open_dyn_buf(&meta_pb);
>      if (ret < 0)
> -        goto fail;
> +        return ret;
>  
>      while (size > 0) {
>          int len = parse_obu_header(buf, size, &obu_size, &start_pos,
> @@ -401,7 +398,8 @@ int ff_isom_write_av1c(AVIOContext *pb, const uint8_t *buf, int size)
>              if (ret < 0)
>                  goto fail;
>  
> -            avio_write(seq_pb, buf, len);
> +            seq      = buf;
> +            seq_size = len;
>              break;
>          case AV1_OBU_METADATA:
>              if (!obu_size) {
> @@ -417,8 +415,7 @@ int ff_isom_write_av1c(AVIOContext *pb, const uint8_t *buf, int size)
>          buf  += len;
>      }
>  
> -    seq_size  = avio_get_dyn_buf(seq_pb, &seq);
> -    if (!seq_size) {
> +    if (!nb_seq) {
>          ret = AVERROR_INVALIDDATA;
>          goto fail;
>      }
> @@ -447,7 +444,6 @@ int ff_isom_write_av1c(AVIOContext *pb, const uint8_t *buf, int size)
>          avio_write(pb, meta, meta_size);
>  
>  fail:
> -    ffio_free_dyn_buf(&seq_pb);
>      ffio_free_dyn_buf(&meta_pb);
>  
>      return ret;
> 
Will apply tomorrow unless there are objections.

- Andreas


More information about the ffmpeg-devel mailing list