diff options
author | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2020-09-07 15:47:07 +0200 |
---|---|---|
committer | Andreas Rheinhardt <andreas.rheinhardt@gmail.com> | 2020-09-11 14:38:18 +0200 |
commit | 5fc3eda8de40a7fb19a8052dde39325eaad38ba5 (patch) | |
tree | d2d9267dd7fa790ac0adf5b388881b3ec364fcd4 | |
parent | 13d72cecd5df776349f624565dc88158bf782e3b (diff) | |
download | ffmpeg-5fc3eda8de40a7fb19a8052dde39325eaad38ba5.tar.gz |
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>
-rw-r--r-- | libavformat/utils.c | 23 |
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); } |