[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