From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 188DA422AD for ; Fri, 1 Apr 2022 09:25:35 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 412D568B25F; Fri, 1 Apr 2022 12:25:23 +0300 (EEST) Received: from mga07.intel.com (mga07.intel.com [134.134.136.100]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 3AEC468B250 for ; Fri, 1 Apr 2022 12:25:16 +0300 (EEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1648805121; x=1680341121; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=c09yOcI0eAGA7LGyzaOR8dIu3yP1DpngyrMaXmjEA+Y=; b=G8oO1WBicUZW+lfpRIopWgwHpNxtzULq6JWp9ydPdNR1jZDmTWO4xp2I oBrW3foZVha1mj/otQpuE6Rbq2ZeHN5PsfOuwJdS1OWCQky8qqXkqxhry 1M7Ga5yJ24F8gAWiHTzQdOS6n5f8361Wl6u3aZgF9kvhCV5IveE9MkTjr 6R35rsfKpT3c4vPNOlSqY02wiUrbHtbzPIR2kn4UoJGZzVxVBGVx6dF+V ZuNlad29fYoS4BpytKROMXSJCLv/LBZalAzChfjKCFnyq1Flb3tYv9B05 aEFjLQYroKIndDaZ2WnzsEK4CN2yq+39TTb1QTpeOKpouZWLTC8xLsDK1 g==; X-IronPort-AV: E=McAfee;i="6200,9189,10303"; a="323261247" X-IronPort-AV: E=Sophos;i="5.90,226,1643702400"; d="scan'208";a="323261247" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga105.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Apr 2022 02:25:15 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.90,226,1643702400"; d="scan'208";a="567328812" Received: from desktop-qn7n0nf.sh.intel.com (HELO localhost.localdomain) ([10.239.160.39]) by orsmga008.jf.intel.com with ESMTP; 01 Apr 2022 02:25:14 -0700 From: Tong Wu To: ffmpeg-devel@ffmpeg.org Date: Fri, 1 Apr 2022 17:24:16 +0800 Message-Id: <20220401092416.1018-3-tong1.wu@intel.com> X-Mailer: git-send-email 2.35.1.windows.2 In-Reply-To: <20220401092416.1018-1-tong1.wu@intel.com> References: <20220401092416.1018-1-tong1.wu@intel.com> MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH 3/3] avutil/hwcontext_qsv: fix D3D11VA<->qsv hwmap errors 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: Tong Wu Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: For hwmap between qsv and d3d11va, The mfxHDLPair information should be put into texture_infos when deriving from qsv context. Moreover, when uploading from rawvideo, the ways that the textures are created are different, bindflag assertions are needed to make sure the right textures are derived during the process. Now after this fix, d3d_dec->qsv_vpp->qsv_enc, d3d_dec->qsv_vpp->qsv_download->yuv, yuv->d3d_upload->qsv_vpp->qsv->download->yuv, qsv_dec->qsv_vpp->d3d_download->yuv can all work properly. For d3d_dec->qsv_vpp->qsv_enc, one sample command line: ffmpeg.exe -hwaccel qsv -c:v h264_qsv -i input.264 -vf "hwmap=derive_device=d3d11va,format=d3d11,hwmap=derive_device=qsv,format=qsv" -c:v h264_qsv -y ./output.264 Signed-off-by: Tong Wu --- libavutil/hwcontext_qsv.c | 48 ++++++++++++++++++++++++++++++++------- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/libavutil/hwcontext_qsv.c b/libavutil/hwcontext_qsv.c index 95f8071abe..e6a7ac3ef0 100644 --- a/libavutil/hwcontext_qsv.c +++ b/libavutil/hwcontext_qsv.c @@ -806,12 +806,23 @@ static int qsv_frames_derive_from(AVHWFramesContext *dst_ctx, #if CONFIG_D3D11VA case AV_HWDEVICE_TYPE_D3D11VA: { + dst_ctx->initial_pool_size = src_ctx->initial_pool_size; AVD3D11VAFramesContext *dst_hwctx = dst_ctx->hwctx; - mfxHDLPair *pair = (mfxHDLPair*)src_hwctx->surfaces[i].Data.MemId; - dst_hwctx->texture = (ID3D11Texture2D*)pair->first; + dst_hwctx->texture_infos = av_calloc(src_hwctx->nb_surfaces, + sizeof(*dst_hwctx->texture_infos)); if (src_hwctx->frame_type & MFX_MEMTYPE_SHARED_RESOURCE) dst_hwctx->MiscFlags = D3D11_RESOURCE_MISC_SHARED; dst_hwctx->BindFlags = qsv_get_d3d11va_bind_flags(src_hwctx->frame_type); + for (i = 0; i < src_hwctx->nb_surfaces; i++) { + mfxHDLPair* pair = (mfxHDLPair*)src_hwctx->surfaces[i].Data.MemId; + dst_hwctx->texture_infos[i].texture = (ID3D11Texture2D*)pair->first; + if (dst_hwctx->BindFlags & D3D11_BIND_RENDER_TARGET) { + dst_hwctx->texture_infos[i].index = 0; + } + else { + dst_hwctx->texture_infos[i].index = (intptr_t)pair->second; + } + } } break; #endif @@ -900,9 +911,16 @@ static int qsv_map_from(AVHWFramesContext *ctx, dst->height = src->height; if (child_frames_ctx->device_ctx->type == AV_HWDEVICE_TYPE_D3D11VA) { +#if CONFIG_D3D11VA + AVD3D11VAFramesContext* child_frames_hwctx = child_frames_ctx->hwctx; mfxHDLPair *pair = (mfxHDLPair*)surf->Data.MemId; dst->data[0] = pair->first; - dst->data[1] = pair->second; + if (child_frames_hwctx->BindFlags & D3D11_BIND_RENDER_TARGET) { + dst->data[1] = 0; + } else { + dst->data[1] = pair->second; + } +#endif } else { dst->data[3] = child_data; } @@ -930,9 +948,16 @@ static int qsv_map_from(AVHWFramesContext *ctx, dummy->height = src->height; if (child_frames_ctx->device_ctx->type == AV_HWDEVICE_TYPE_D3D11VA) { +#if CONFIG_D3D11VA + AVD3D11VAFramesContext* child_frames_hwctx = child_frames_ctx->hwctx; mfxHDLPair *pair = (mfxHDLPair*)surf->Data.MemId; dummy->data[0] = pair->first; - dummy->data[1] = pair->second; + if (child_frames_hwctx->BindFlags & D3D11_BIND_RENDER_TARGET) { + dst->data[1] = 0; + } else { + dst->data[1] = pair->second; + } +#endif } else { dummy->data[3] = child_data; } @@ -1287,6 +1312,10 @@ static int qsv_frames_derive_to(AVHWFramesContext *dst_ctx, return AVERROR(ENOSYS); } + s->child_frames_ref = av_buffer_ref(dst_ctx->internal->source_frames); + if (!s->child_frames_ref) { + return AVERROR(ENOMEM); + } dst_hwctx->surfaces = s->surfaces_internal; return 0; @@ -1314,10 +1343,13 @@ static int qsv_map_to(AVHWFramesContext *dst_ctx, case AV_PIX_FMT_D3D11: { mfxHDLPair *pair = (mfxHDLPair*)hwctx->surfaces[i].Data.MemId; - if (pair->first == src->data[0] - && pair->second == src->data[1]) { - index = i; - break; + if (pair->first == src->data[0]) { + if (hwctx->frame_type & MFX_MEMTYPE_VIDEO_MEMORY_DECODER_TARGET + && pair->second == src->data[1] + || hwctx->frame_type & MFX_MEMTYPE_VIDEO_MEMORY_PROCESSOR_TARGET) { + index = i; + break; + } } } #endif -- 2.35.1.windows.2 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".