我试图将FFmpeg(CUDA)解码的帧平面复制到我自己的CUDA内存中,但我尝试了很多次,但都失败了。
1,来自 FFmpeg 文档,它说:
/// <summary>HW acceleration through CUDA. data[i] contain CUdeviceptr pointers exactly as for system memory frames.</summary>
@AV_PIX_FMT_CUDA = 117
这意味着
AVFrame.data[n]
是要复制的 CUdeviceptr
。
2,我已经毫无问题地创建了自己的 CUDA 内存:
var dstPtr = new CUdeviceptr();
var error = cuMemAlloc_v2(ref dstPtr, length);
3、尝试从
AVFrame
复制到dstPtr
,但失败了:
var dstPtr = new CUdeviceptr();
var error = cuMemAlloc_v2(ref dstPtr, length); // allocate a CUDA mem for test
var plane = ffmpeg.av_frame_get_plane_buffer(avFrame, 0); // get the plane 0 info
var srcPtr = new CUdeviceptr((long)plane->data); // get CUdeviceptr from data[0]
error = cuMemcpyDtoD_v2(dstPtr, srcPtr, plane->size); // try to copy from avFrame into my own CUDA mem block
Debug.Assert(error == CUResult.Success); // alway fail.....
复制结果一直是
ErrorInvalidValue
表示从AVFrame.data[0]
返回的CUdeviceptr无效什么的....
我真的不知道我做错了什么...... 顺便说一句,我已经创建了一个用于内存分配的 CUDA 上下文,也就是说,我将在分配内存之前将自己的 CUDA 上下文设置为当前上下文,此操作是否会破坏 FFmpeg 的当前上下文?那么副本会失败吗?
但是无论如何,无论我使用
cuCtxPushCurrent_v2
还是cuCtxSetCurrent
,都不起作用。
这只是一个非常简单的复制测试,不是吗?但为什么......:(
答案很简单:使 FFmpeg 的
CUcontext
正确当前。