[FFmpeg-devel] [PATCH] avformat/utils: Avoid duplicating extradata from extract_extradata BSF
Andreas Rheinhardt
andreas.rheinhardt at gmail.com
Thu Sep 10 13:41:55 EEST 2020
Andreas Rheinhardt:
> 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 at gmail.com>
> ---
> libavformat/utils.c | 23 ++++++++---------------
> 1 file 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);
> }
>
Will apply tomorrow unless there are objections.
- Andreas
More information about the ffmpeg-devel
mailing list