From patchwork Tue Nov 8 11:45:01 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Wang, Fei W" X-Patchwork-Id: 39234 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a21:999a:b0:a4:2148:650a with SMTP id ve26csp2771793pzb; Tue, 8 Nov 2022 03:45:12 -0800 (PST) X-Google-Smtp-Source: AA0mqf61MLSYiZ3AcXtvHNH1RfSn35TAPDn4lBY7HR9Dnrf9/fX1sFmAOgujrDficfzPaOS+Jm8e X-Received: by 2002:a50:9e42:0:b0:466:94e3:5ec9 with SMTP id z60-20020a509e42000000b0046694e35ec9mr4904678ede.173.1667907912660; Tue, 08 Nov 2022 03:45:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1667907912; cv=none; d=google.com; s=arc-20160816; b=Yx3RiQFbnNdkP+FpddgDpdY57BanvEGwG6bS/Ngquc8Jm8bJxusq3AM7/Ltw7EWAYV 07wr0WSyUjUdjrywxR1AApsIYTgp+KvitYtKDz1sHJD/ojlcGua5nuLEeuqZi1i65kxd PQ9lTmSo1HU5MVd3IXhIrXOmrjXwIih3qconf/d/F5bLGr4ayNGBopfRdq8KK5yaSBhG RJyBxcAnbpquF10DXwFNLfd6J/+nxTTTpb3vUw1O/7vzWfamwS8NQqgmE4f8HBQSsLKg W9/A5IECgwmo5GzhgNLygbRCUCOBVaI90StHp1SSqO7wnX2L7DgmPUXZnbiQOxzFz94/ yg2g== 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:references:in-reply-to :message-id:date:to:from:dkim-signature:delivered-to; bh=+1y+wnEO2a81z9iEmpfWfoyXVnd86cKmQBZXpvblrPE=; b=bIwB/brtEnxQa31OUPv76QWdTDer4ZEF8yDFEQH8yr+bpAIQZ2g+1J8bo8AdBn7VKY Mne/CRcwaRaHbVAo9X9bZuL9RLHcz0RwhFoLrCb8FkviyPlnS8ssNFYV58P2zDYbfDIy 7omwZqxImZYRwVYkHhANRblZxqTyqlLMP03oS8trElo/gR9eqVb83GEnYE9MvG7ksX3Q CW9rag6HdzhQMrEFEWZixVjw3IC3DfxUpYPbPJlwqQZO1maA09uPI5m7JmryyjK7y3Qo REpWCiUVDcFIfAAZ/T6G11hQT/Gnw2bMrPK5vFj4WDaddUUUtxuAbIi5NtPO5YES+WDP RKkQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@intel.com header.s=Intel header.b=DA3pZtPr; 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 q7-20020a056402518700b0045d4f995ac0si12784525edd.588.2022.11.08.03.45.12; Tue, 08 Nov 2022 03:45:12 -0800 (PST) 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=DA3pZtPr; 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 5BF9168BBBC; Tue, 8 Nov 2022 13:45:06 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 8C16368BBAF for ; Tue, 8 Nov 2022 13:44:58 +0200 (EET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1667907903; x=1699443903; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=88p+YMCMjuzTYNLcMf5nJN2v/Ssn7ZoQ3Zv71tFgL40=; b=DA3pZtPrEcqBI5/DQIIY20nNi46JWGCfcOtnb1uJwMJIp3PzAdVqi2vN VN2UkHpePRJMrhocPdgFUveShOna/uYT5SfLzBz2qUbIe9yXmYWvrhmSp pzwjLDBJBHNRw1V1XfB+bjZC2RdKcJdrg6zgHKYsPXpZvfOaqRb6rJJZU pZUOqnJeZ9Va8CyqoTJ4a1cm2rTjB6vO1Smc8CaHevd3nXV8nIJ/76K5Z kZ8gpnWXq8agSAWv8wnuDFQudvkp+07mobfRr74FnZrOQYUNKPLoC0fHG BH6nLm0e4IA0TLoRRkU7p5cHxxGQXHQFfu6L+KR342MWyG9FPAedmTnRT Q==; X-IronPort-AV: E=McAfee;i="6500,9779,10524"; a="309382925" X-IronPort-AV: E=Sophos;i="5.96,147,1665471600"; d="scan'208";a="309382925" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Nov 2022 03:44:51 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6500,9779,10524"; a="699896197" X-IronPort-AV: E=Sophos;i="5.96,147,1665471600"; d="scan'208";a="699896197" Received: from t.sh.intel.com ([10.239.159.159]) by fmsmga008.fm.intel.com with ESMTP; 08 Nov 2022 03:44:50 -0800 From: Fei Wang To: ffmpeg-devel@ffmpeg.org Date: Tue, 8 Nov 2022 19:45:01 +0800 Message-Id: <20221108114501.570349-2-fei.w.wang@intel.com> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221108114501.570349-1-fei.w.wang@intel.com> References: <20221108114501.570349-1-fei.w.wang@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH v4 2/2] lavc/vaapi_decode: add support for HWACCEL_CAP_RESET_WITHOUT_UNINIT 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: Fei Wang Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: lswg9vp6ZKWu This can fix vp9 decode image corruption when the frame size is change, but the pervious frames still be referenced. Surfaces don't need to be bound to vaContext only after VAAPI 1.0.0: https://github.com/intel/libva/commit/492b692005ccd0d8da190209d5b3ae7b7825f4b8 Signed-off-by: Fei Wang --- libavcodec/vaapi_decode.c | 41 ++++++++++++++++++++++----------------- libavcodec/vaapi_vp9.c | 4 ++++ 2 files changed, 27 insertions(+), 18 deletions(-) diff --git a/libavcodec/vaapi_decode.c b/libavcodec/vaapi_decode.c index 134f10eca5..618f3c3e0a 100644 --- a/libavcodec/vaapi_decode.c +++ b/libavcodec/vaapi_decode.c @@ -658,8 +658,10 @@ int ff_vaapi_decode_init(AVCodecContext *avctx) VAStatus vas; int err; - ctx->va_config = VA_INVALID_ID; - ctx->va_context = VA_INVALID_ID; + if (!ctx->va_config && !ctx->va_context) { + ctx->va_config = VA_INVALID_ID; + ctx->va_context = VA_INVALID_ID; + } err = ff_decode_get_hw_frames_ctx(avctx, AV_HWDEVICE_TYPE_VAAPI); if (err < 0) @@ -670,24 +672,27 @@ int ff_vaapi_decode_init(AVCodecContext *avctx) ctx->device = ctx->frames->device_ctx; ctx->hwctx = ctx->device->hwctx; - err = vaapi_decode_make_config(avctx, ctx->frames->device_ref, - &ctx->va_config, NULL); - if (err) - goto fail; - - vas = vaCreateContext(ctx->hwctx->display, ctx->va_config, - avctx->coded_width, avctx->coded_height, - VA_PROGRESSIVE, - ctx->hwfc->surface_ids, - ctx->hwfc->nb_surfaces, - &ctx->va_context); - if (vas != VA_STATUS_SUCCESS) { - av_log(avctx, AV_LOG_ERROR, "Failed to create decode " - "context: %d (%s).\n", vas, vaErrorStr(vas)); - err = AVERROR(EIO); - goto fail; + if (ctx->va_config == VA_INVALID_ID) { + err = vaapi_decode_make_config(avctx, ctx->frames->device_ref, + &ctx->va_config, NULL); + if (err) + goto fail; } + if (ctx->va_context == VA_INVALID_ID) { + vas = vaCreateContext(ctx->hwctx->display, ctx->va_config, + avctx->coded_width, avctx->coded_height, + VA_PROGRESSIVE, + ctx->hwfc->surface_ids, + ctx->hwfc->nb_surfaces, + &ctx->va_context); + if (vas != VA_STATUS_SUCCESS) { + av_log(avctx, AV_LOG_ERROR, "Failed to create decode " + "context: %d (%s).\n", vas, vaErrorStr(vas)); + err = AVERROR(EIO); + goto fail; + } + } av_log(avctx, AV_LOG_DEBUG, "Decode context initialised: " "%#x/%#x.\n", ctx->va_config, ctx->va_context); diff --git a/libavcodec/vaapi_vp9.c b/libavcodec/vaapi_vp9.c index 776382f683..245b7a1b3a 100644 --- a/libavcodec/vaapi_vp9.c +++ b/libavcodec/vaapi_vp9.c @@ -181,5 +181,9 @@ const AVHWAccel ff_vp9_vaapi_hwaccel = { .uninit = ff_vaapi_decode_uninit, .frame_params = ff_vaapi_common_frame_params, .priv_data_size = sizeof(VAAPIDecodeContext), +#if VA_CHECK_VERSION(1, 0, 0) + .caps_internal = HWACCEL_CAP_ASYNC_SAFE | HWACCEL_CAP_RESET_WITHOUT_UNINIT, +#else .caps_internal = HWACCEL_CAP_ASYNC_SAFE, +#endif };