aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-06-21 12:58:21 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-06-26 07:12:31 +0200
commit36fa84e7ac805a774820d06b3d58e4e875cb11c9 (patch)
tree2c60903e06fc25817db77e875ea5f902713ac77d
parent82b64e9bf671e37c078a4aae26b6f5c68723d7f9 (diff)
downloadffmpeg-36fa84e7ac805a774820d06b3d58e4e875cb11c9.tar.gz
avformat/av1: Avoid using dynamic buffer when assembling av1c
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@gmail.com>
-rw-r--r--libavformat/av1.c18
1 files 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;