1

我正在尝试将 NV12 NVDEC 解码缓冲区直接复制到 NV12 d3d11 纹理中。到目前为止没有运气。我设法做的是使用 2 个 d3d11 纹理(亮度 + 色度)、 2 cuGraphicsMapResources、 2 cuGraphicsSubResourceGetMappedArray、 2CUDA_MEMCPY2D和一个像素着色器来合并所有的双镜头副本……无法执行单镜头副本,也没有响应到目前为止,来自 NVidia 论坛。

我发现这个老问题面临一个非常相似的问题,也没有解决方案。

4

2 回答 2

1

由于我不熟悉,不确定如何使用 NVidia/Cuda 完成此操作。但这就是我如何使用 Direct3D (D3D11va) 做到这一点,这可能会帮助您将其转化为您的情况:-

  1. (NV12 NDEC 设备).CopySubresourceRegion(src NV12 NVDEC 纹理, srcSubresourceArrayIndex, dst NV12 共享纹理)

(获取新创建的 NV12 共享纹理的共享句柄)

  1. (您的设备).OpenSharedResource(NV12 共享句柄)

(准备 VideoProcessorInputView、VideoProcessorOutputView 和 Streams)

  1. (Your Device).VideoProcessorBlt(src NV12 shared handle, dst Your RGBA/BGRA Render Texture)

这个过程是视频加速,它只发生在你的 GPU 中(不涉及 CPU/RAM)。您还应该确保 GPU 适配器支持这一点。

于 2020-06-05T08:01:29.563 回答
1

也许你需要这样的东西。此代码截取自 FFmpeg 项目(开源),libavutil/hwcontext_cude.c文件:

for (i = 0; i < FF_ARRAY_ELEMS(src->data) && src->data[i]; i++) {
    CUDA_MEMCPY2D cpy = {
        .srcMemoryType = CU_MEMORYTYPE_HOST,
        .dstMemoryType = CU_MEMORYTYPE_DEVICE,
        .srcHost       = src->data[i],
        .dstDevice     = (CUdeviceptr)dst->data[i],
        .srcPitch      = src->linesize[i],
        .dstPitch      = dst->linesize[i],
        .WidthInBytes  = FFMIN(src->linesize[i], dst->linesize[i]),
        .Height        = src->height >> (i ? priv->shift_height : 0),
    };

    ret = CHECK_CU(cu->cuMemcpy2DAsync(&cpy, hwctx->stream));
    if (ret < 0)
        goto exit;
}
于 2020-05-21T14:32:37.707 回答