diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c index 0818ada117..67ae23b165 100644 --- a/libavfilter/qsvvpp.c +++ b/libavfilter/qsvvpp.c @@ -471,7 +471,8 @@ static QSVFrame *submit_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *p } /* get the output surface */ -static QSVFrame *query_frame(QSVVPPContext *s, AVFilterLink *outlink, const AVFrame *in) +static QSVFrame *query_frame(QSVVPPContext *s, AVFilterLink *outlink, const AVFrame *in, + const AVFrame *propref) { FilterLink *l = ff_filter_link(outlink); AVFilterContext *ctx = outlink->src; @@ -513,6 +514,15 @@ static QSVFrame *query_frame(QSVVPPContext *s, AVFilterLink *outlink, const AVFr return NULL; } + if (propref) { + ret = av_frame_copy_props(out_frame->frame, propref); + if (ret < 0) { + av_frame_free(&out_frame->frame); + av_log(ctx, AV_LOG_ERROR, "Failed to copy metadata fields from src to dst.\n"); + return NULL; + } + } + if (l->frame_rate.num && l->frame_rate.den) out_frame->frame->duration = av_rescale_q(1, av_inv_q(l->frame_rate), outlink->time_base); else @@ -985,7 +995,7 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picr } do { - out_frame = query_frame(s, outlink, in_frame->frame); + out_frame = query_frame(s, outlink, in_frame->frame, propref); if (!out_frame) { av_log(ctx, AV_LOG_ERROR, "Failed to query an output frame.\n"); return AVERROR(ENOMEM); @@ -1009,15 +1019,6 @@ int ff_qsvvpp_filter_frame(QSVVPPContext *s, AVFilterLink *inlink, AVFrame *picr break; } - if (propref) { - ret1 = av_frame_copy_props(out_frame->frame, propref); - if (ret1 < 0) { - av_frame_free(&out_frame->frame); - av_log(ctx, AV_LOG_ERROR, "Failed to copy metadata fields from src to dst.\n"); - return ret1; - } - } - out_frame->frame->pts = av_rescale_q(out_frame->surface.Data.TimeStamp, default_tb, outlink->time_base);