summaryrefslogtreecommitdiff
path: root/libavformat
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-09-07 15:47:07 +0200
committerAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-09-11 14:38:18 +0200
commit5fc3eda8de40a7fb19a8052dde39325eaad38ba5 (patch)
treed2d9267dd7fa790ac0adf5b388881b3ec364fcd4 /libavformat
parent13d72cecd5df776349f624565dc88158bf782e3b (diff)
avformat/utils: Avoid duplicating extradata from extract_extradata BSF
Instead move the extradata contained in packet side-data to its destination. This is possible because the side data already has zeroed padding. Notice that the check for FF_MAX_EXTRADATA_SIZE has been dropped, because said constant is from libavcodec/internal.h. If libavcodec wanted to enforce this, it should do so in the extract_extradata BSF instead. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Diffstat (limited to 'libavformat')
-rw-r--r--libavformat/utils.c23
1 files changed, 8 insertions, 15 deletions
diff --git a/libavformat/utils.c b/libavformat/utils.c
index 807d9f10cb..63952e31a0 100644
--- a/libavformat/utils.c
+++ b/libavformat/utils.c
@@ -3567,9 +3567,6 @@ static int extract_extradata(AVStream *st, const AVPacket *pkt)
}
while (ret >= 0 && !sti->avctx->extradata) {
- int extradata_size;
- uint8_t *extradata;
-
ret = av_bsf_receive_packet(sti->extract_extradata.bsf, pkt_ref);
if (ret < 0) {
if (ret != AVERROR(EAGAIN) && ret != AVERROR_EOF)
@@ -3577,19 +3574,15 @@ static int extract_extradata(AVStream *st, const AVPacket *pkt)
continue;
}
- extradata = av_packet_get_side_data(pkt_ref, AV_PKT_DATA_NEW_EXTRADATA,
- &extradata_size);
-
- if (extradata) {
- av_assert0(!sti->avctx->extradata);
- if ((unsigned)extradata_size < FF_MAX_EXTRADATA_SIZE)
- sti->avctx->extradata = av_mallocz(extradata_size + AV_INPUT_BUFFER_PADDING_SIZE);
- if (!sti->avctx->extradata) {
- av_packet_unref(pkt_ref);
- return AVERROR(ENOMEM);
+ for (int i = 0; i < pkt_ref->side_data_elems; i++) {
+ AVPacketSideData *side_data = &pkt_ref->side_data[i];
+ if (side_data->type == AV_PKT_DATA_NEW_EXTRADATA) {
+ sti->avctx->extradata = side_data->data;
+ sti->avctx->extradata_size = side_data->size;
+ side_data->data = NULL;
+ side_data->size = 0;
+ break;
}
- memcpy(sti->avctx->extradata, extradata, extradata_size);
- sti->avctx->extradata_size = extradata_size;
}
av_packet_unref(pkt_ref);
}