From patchwork Wed Jul 26 07:15:19 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Xiang, Haihao" X-Patchwork-Id: 42983 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:7528:b0:130:ccc6:6c4b with SMTP id r40csp340918pzd; Wed, 26 Jul 2023 00:16:07 -0700 (PDT) X-Google-Smtp-Source: APBJJlFAfKCmmqcMbUzTZLCCUP5U9MKs+mQFPIcZK+7wGBwpXlDWp7nZyoq4M3G/ZlfLbA1jg2GX X-Received: by 2002:a05:6402:386:b0:521:ad49:8493 with SMTP id o6-20020a056402038600b00521ad498493mr1344313edv.6.1690355767349; Wed, 26 Jul 2023 00:16:07 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1690355767; cv=none; d=google.com; s=arc-20160816; b=sB/s30Qx6QraqU+U2AJgSlh/fy8HUtC0G4MLczawiM0J8QcH+p8mnbajksNY75XxNs hOUJGxiU5kx/72Wlk8VrAbj1p+FND8LfpDzvaatnr7EakSBlDcCBBmZMqUHcLIfaNGjC wx8J6SpgvRDFpwwoVTzd0maVq7Xltn7BiN05Vu+M4BpKB//+By8tVhXfV8HTnZdGQKAm la54Y1l+KdftAm/ctlPj3Qs0rbWemBC2xttV8aV95U8Sv2nGUilIhkdw3ibfeqv0KTcz B1xcvHrhv2q3ZDLeLI3hbNvDzES9B+IzbehRHDVGERBsf9+NTLh4nnbw+KVM2fPB9kYL abTA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:mime-version:message-id:date:to:from :dkim-signature:delivered-to; bh=z52cJxS2qG7AGqZsuUJN6pSR/ldbhjUiDu7oCKhDDrk=; fh=Tt4aWcAPplwJLYowQh9cIyedJjsIqBA8GlwfHZgTuYo=; b=HdwQwf5BQCpYLJypwv26KOrmM3n6WN6ZdIEtvlxFBHJLLLC2UWwMWNjL3+cufqsRhf bWB/Nq92gSP2PB8zH57DCovmeA4paJEziHzRN+cAPbsDQklL9T7a0jI5R8iFNVzihZLt MCON+yttgCSZEA/d2XM183fsKya/khUwA7CDqQ0o8N480Du9fnsyyxVLdf453TyVoOY/ DhcjECcIH1zsNBVC6kkyMkUr0VlqGcwhD8lFwDPfviC8o0FC4TWrHeCIhP3Uu5vfw2iG fIpE+cnvHkoaEKxLY/PZfec5uTX7mPnDTU4zMZ2ZM8IGzb7X88sP6P4KIBR8KS4qekMC RhXQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=UWOYoKgw; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id f5-20020a056402150500b00522307b6ff7si3612972edw.428.2023.07.26.00.16.07; Wed, 26 Jul 2023 00:16:07 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=UWOYoKgw; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 06B9568C8FD; Wed, 26 Jul 2023 10:16:05 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga12.intel.com (mga12.intel.com [192.55.52.136]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 665C468C6CD for ; Wed, 26 Jul 2023 10:15:57 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1690355763; x=1721891763; h=from:to:cc:subject:date:message-id:mime-version: content-transfer-encoding; bh=ocCstuf3YRBZPZHf3zSwSPeHin/p4CNl+w1QwXquLWA=; b=UWOYoKgwvHMn74dwdS8fJh7sU+sSbkaVRFbGyrqTXJmrF4TaAGpkwdBW O0GXhRW3eWZPlncXvxeucPN3JbkoX5V06Lj9zMiWkWW/RvyB0lV7Ki4XJ hDCBqpKiEAxQyicQC2szWQNZtj7UISwcb95/AzpJ5YzFp6+q3nMur2U3F +hkq//QMlrLmAcDHZ9foGDt8docwGQVLkK7aOoQnP8hNjTDbBkAqK0I4v WmQhn/LS/Bs1ZaTpm8rM95zgkRzq00io+zkBYRCIfqi5eAWwAd92IjbeP J2MfU3Sw3h0DRo8ttarxS1lxUy03YlDoit4sU3V/Q1kU/uNi1GcJWoHfx g==; X-IronPort-AV: E=McAfee;i="6600,9927,10782"; a="347551658" X-IronPort-AV: E=Sophos;i="6.01,231,1684825200"; d="scan'208";a="347551658" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by fmsmga106.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Jul 2023 00:15:55 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10782"; a="756106873" X-IronPort-AV: E=Sophos;i="6.01,231,1684825200"; d="scan'208";a="756106873" Received: from xhh-tgl64.sh.intel.com ([10.238.2.19]) by orsmga008-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Jul 2023 00:15:52 -0700 From: "Xiang, Haihao" To: ffmpeg-devel@ffmpeg.org Date: Wed, 26 Jul 2023 15:15:19 +0800 Message-Id: <20230726071522.38149-1-haihao.xiang@intel.com> X-Mailer: git-send-email 2.34.1 MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 1/4] lavfi/qsvvpp: add set_frame_ext_params callback X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: Haihao Xiang Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: CvLW9kc2rO1c From: Haihao Xiang This allows we add mfxExtBuffer per frame later. Signed-off-by: Haihao Xiang --- libavfilter/qsvvpp.c | 67 +++++++++++++++++++++++++++++++++----------- libavfilter/qsvvpp.h | 10 +++++++ 2 files changed, 61 insertions(+), 16 deletions(-) diff --git a/libavfilter/qsvvpp.c b/libavfilter/qsvvpp.c index a03de05d9c..3c8dfea16a 100644 --- a/libavfilter/qsvvpp.c +++ b/libavfilter/qsvvpp.c @@ -731,6 +731,11 @@ static int init_vpp_session(AVFilterContext *avctx, QSVVPPContext *s) return 0; } +static int set_frame_ext_params_null(AVFilterContext *ctx, const AVFrame *in, AVFrame *out, QSVVPPFrameParam *fp) +{ + return 0; +} + int ff_qsvvpp_init(AVFilterContext *avctx, QSVVPPParam *param) { int i; @@ -742,6 +747,10 @@ int ff_qsvvpp_init(AVFilterContext *avctx, QSVVPPParam *param) s->filter_frame = ff_filter_frame; s->out_sw_format = param->out_sw_format; + s->set_frame_ext_params = param->set_frame_ext_params; + if (!s->set_frame_ext_params) + s->set_frame_ext_params = set_frame_ext_params_null; + /* create the vpp session */ ret = init_vpp_session(avctx, s); if (ret < 0) @@ -868,27 +877,53 @@ failed: static int qsvvpp_init_vpp_session(AVFilterContext *avctx, QSVVPPContext *s, const QSVFrame *in, QSVFrame *out) { int ret; + mfxExtBuffer *ext_param[QSVVPP_MAX_FRAME_EXTBUFS]; + QSVVPPFrameParam fp = { 0, ext_param }; - if (s->vpp_initted) - return 0; + ret = s->set_frame_ext_params(avctx, in->frame, out->frame, &fp); + if (ret) + return ret; - s->vpp_param.vpp.In.PicStruct = in->surface.Info.PicStruct; - s->vpp_param.vpp.Out.PicStruct = out->surface.Info.PicStruct; + if (fp.num_ext_buf) { + av_freep(&s->ext_buffers); + s->nb_ext_buffers = s->nb_seq_buffers + fp.num_ext_buf; - /* Query VPP params again, including params for frame */ - ret = MFXVideoVPP_Query(s->session, &s->vpp_param, &s->vpp_param); - if (ret < 0) - return ff_qsvvpp_print_error(avctx, ret, "Error querying VPP params"); - else if (ret > 0) - ff_qsvvpp_print_warning(avctx, ret, "Warning When querying VPP params"); + s->ext_buffers = av_calloc(s->nb_ext_buffers, sizeof(*s->ext_buffers)); + if (!s->ext_buffers) + return AVERROR(ENOMEM); - ret = MFXVideoVPP_Init(s->session, &s->vpp_param); - if (ret < 0) - return ff_qsvvpp_print_error(avctx, ret, "Failed to create a qsvvpp"); - else if (ret > 0) - ff_qsvvpp_print_warning(avctx, ret, "Warning When creating qsvvpp"); + memcpy(&s->ext_buffers[0], s->seq_buffers, s->nb_seq_buffers * sizeof(*s->seq_buffers)); + memcpy(&s->ext_buffers[s->nb_seq_buffers], fp.ext_buf, fp.num_ext_buf * sizeof(*fp.ext_buf)); + s->vpp_param.ExtParam = s->ext_buffers; + s->vpp_param.NumExtParam = s->nb_ext_buffers; + } + + if (!s->vpp_initted) { + s->vpp_param.vpp.In.PicStruct = in->surface.Info.PicStruct; + s->vpp_param.vpp.Out.PicStruct = out->surface.Info.PicStruct; + + /* Query VPP params again, including params for frame */ + ret = MFXVideoVPP_Query(s->session, &s->vpp_param, &s->vpp_param); + if (ret < 0) + return ff_qsvvpp_print_error(avctx, ret, "Error querying VPP params"); + else if (ret > 0) + ff_qsvvpp_print_warning(avctx, ret, "Warning When querying VPP params"); + + ret = MFXVideoVPP_Init(s->session, &s->vpp_param); + if (ret < 0) + return ff_qsvvpp_print_error(avctx, ret, "Failed to create a qsvvpp"); + else if (ret > 0) + ff_qsvvpp_print_warning(avctx, ret, "Warning When creating qsvvpp"); - s->vpp_initted = 1; + s->vpp_initted = 1; + } else if (fp.num_ext_buf) { + ret = MFXVideoVPP_Reset(s->session, &s->vpp_param); + if (ret < 0) { + ret = ff_qsvvpp_print_error(avctx, ret, "Failed to reset session for qsvvpp"); + return ret; + } else if (ret > 0) + ff_qsvvpp_print_warning(avctx, ret, "Warning When resetting session for qsvvpp"); + } return 0; } diff --git a/libavfilter/qsvvpp.h b/libavfilter/qsvvpp.h index fba5f037d4..4eea7a46c7 100644 --- a/libavfilter/qsvvpp.h +++ b/libavfilter/qsvvpp.h @@ -52,11 +52,20 @@ typedef struct QSVFrame { int queued; } QSVFrame; +#define QSVVPP_MAX_FRAME_EXTBUFS 8 + +typedef struct QSVVPPFrameParam { + /* To fill with MFX enhanced filter configurations */ + int num_ext_buf; + mfxExtBuffer **ext_buf; +} QSVVPPFrameParam; + typedef struct QSVVPPContext { const AVClass *class; mfxSession session; int (*filter_frame) (AVFilterLink *outlink, AVFrame *frame); /**< callback */ + int (*set_frame_ext_params)(AVFilterContext *ctx, const AVFrame *in, AVFrame *out, QSVVPPFrameParam *fp); /**< callbak */ enum AVPixelFormat out_sw_format; /**< Real output format */ mfxVideoParam vpp_param; mfxFrameInfo *frame_infos; /**< frame info for each input */ @@ -101,6 +110,7 @@ typedef struct QSVVPPCrop { typedef struct QSVVPPParam { /* default is ff_filter_frame */ int (*filter_frame)(AVFilterLink *outlink, AVFrame *frame); + int (*set_frame_ext_params)(AVFilterContext *ctx, const AVFrame *in, AVFrame *out, QSVVPPFrameParam *fp); /**< callbak */ /* To fill with MFX enhanced filter configurations */ int num_ext_buf;