[FFmpeg-devel] [PATCH v2] lavfi/qsvvpp: Copy frame props before modify it

Xiang, Haihao haihao.xiang at intel.com
Tue Nov 26 03:13:56 EET 2024


On Ma, 2024-11-25 at 11:18 +0800, fei.w.wang-at-intel.com at ffmpeg.org wrote:
> From: Fei Wang <fei.w.wang at intel.com>
> 
> The changes to output frame props in query_frame overlapped since
> 578ac59887. Move the copy frame props before the changes.
> 
> Signed-off-by: Fei Wang <fei.w.wang at intel.com>
> ---
>  libavfilter/qsvvpp.c | 23 ++++++++++++-----------
>  1 file changed, 12 insertions(+), 11 deletions(-)
> 
> 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);

LGTM, will apply

Thanks
Haihao
> 



More information about the ffmpeg-devel mailing list