我正在尝试构建一个转码管道,其中视频使用D3D11VA解码,然后带到CUDA,可选地使用CUDA内核进行修改和/或分析,最后使用NVENC进行编码(使用CUDA-NVENC互操作);想法是在没有视频帧的情况下在GPU上做所有事情。我能做的一件事:
D3D11_USAGE_STAGING
和D3D11_CPU_ACCESS_READ
;一旦解码器为我提供了解码器阵列的索引,我只需从解码器阵列切片到此分段纹理CopySubresourceRegion
,然后映射分段纹理并读取数据(我可以成功读取Y和UV平面的数据) )cudaGraphicsSubResourceGetMappedArray
应用于资源,并将收到的cudaArray
中的数据复制到malloced CUDA内存中。所以问题是:我只能从cudaArray
复制Y平面。我尝试了一切我能想到的从纹理中获取UV数据的方法无济于事。只有"解决方案"其工作原理是以R8格式创建另一个纹理,其原始纹理高度为1.5倍,创建两个着色器视图到分段纹理,并使用着色器将两个视图中的数据复制到此辅助纹理中;然后我可以将这个纹理映射到CUDA并将所有数据复制到CUDA内存中。
我真的不喜欢这个解决方案 - 它丑陋,臃肿,涉及额外无用的数据拷贝。有没有其他方法来实现这一目标?让CUDA看到NV12纹理中的所有数据,或者将NV12纹理中的所有数据复制到单个R8纹理或一对R8 / R8或R8 / R8G8纹理中的方法?