如何将 FFmpeg AVFrame 中的 CUdeviceptr 平面复制到我自己的 CUDA 内存中?

问题描述 投票:0回答:1

我试图将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
,都不起作用。 这只是一个非常简单的复制测试,不是吗?但为什么......:(

c# ffmpeg cuda gpu decoding
1个回答
0
投票

答案很简单:使 FFmpeg 的

CUcontext
正确当前。

© www.soinside.com 2019 - 2024. All rights reserved.