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>
This commit is contained in:
Andreas Rheinhardt
2020-06-21 12:58:21 +02:00
parent 82b64e9bf6
commit 36fa84e7ac

View File

@ -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) 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; AV1SequenceParameters seq_params;
PutBitContext pbc; PutBitContext pbc;
uint8_t header[4]; uint8_t header[4], *meta;
uint8_t *seq, *meta; const uint8_t *seq;
int64_t obu_size; int64_t obu_size;
int start_pos, type, temporal_id, spatial_id; int start_pos, type, temporal_id, spatial_id;
int ret, nb_seq = 0, seq_size, meta_size; 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) if (size <= 0)
return AVERROR_INVALIDDATA; return AVERROR_INVALIDDATA;
ret = avio_open_dyn_buf(&seq_pb);
if (ret < 0)
return ret;
ret = avio_open_dyn_buf(&meta_pb); ret = avio_open_dyn_buf(&meta_pb);
if (ret < 0) if (ret < 0)
goto fail; return ret;
while (size > 0) { while (size > 0) {
int len = parse_obu_header(buf, size, &obu_size, &start_pos, 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) if (ret < 0)
goto fail; goto fail;
avio_write(seq_pb, buf, len); seq = buf;
seq_size = len;
break; break;
case AV1_OBU_METADATA: case AV1_OBU_METADATA:
if (!obu_size) { if (!obu_size) {
@ -417,8 +415,7 @@ int ff_isom_write_av1c(AVIOContext *pb, const uint8_t *buf, int size)
buf += len; buf += len;
} }
seq_size = avio_get_dyn_buf(seq_pb, &seq); if (!nb_seq) {
if (!seq_size) {
ret = AVERROR_INVALIDDATA; ret = AVERROR_INVALIDDATA;
goto fail; 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); avio_write(pb, meta, meta_size);
fail: fail:
ffio_free_dyn_buf(&seq_pb);
ffio_free_dyn_buf(&meta_pb); ffio_free_dyn_buf(&meta_pb);
return ret; return ret;