|
|
|
@ -253,6 +253,49 @@ static int cuda_transfer_data_to(AVHWFramesContext *ctx, AVFrame *dst, |
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void cuda_device_free(AVHWDeviceContext *ctx) |
|
|
|
|
{ |
|
|
|
|
AVCUDADeviceContext *hwctx = ctx->hwctx; |
|
|
|
|
cuCtxDestroy(hwctx->cuda_ctx); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static int cuda_device_create(AVHWDeviceContext *ctx, const char *device, |
|
|
|
|
AVDictionary *opts, int flags) |
|
|
|
|
{ |
|
|
|
|
AVCUDADeviceContext *hwctx = ctx->hwctx; |
|
|
|
|
CUdevice cu_device; |
|
|
|
|
CUcontext dummy; |
|
|
|
|
CUresult err; |
|
|
|
|
int device_idx = 0; |
|
|
|
|
|
|
|
|
|
if (device) |
|
|
|
|
device_idx = strtol(device, NULL, 0); |
|
|
|
|
|
|
|
|
|
err = cuInit(0); |
|
|
|
|
if (err != CUDA_SUCCESS) { |
|
|
|
|
av_log(ctx, AV_LOG_ERROR, "Could not initialize the CUDA driver API\n"); |
|
|
|
|
return AVERROR_UNKNOWN; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
err = cuDeviceGet(&cu_device, device_idx); |
|
|
|
|
if (err != CUDA_SUCCESS) { |
|
|
|
|
av_log(ctx, AV_LOG_ERROR, "Could not get the device number %d\n", device_idx); |
|
|
|
|
return AVERROR_UNKNOWN; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
err = cuCtxCreate(&hwctx->cuda_ctx, 0, cu_device); |
|
|
|
|
if (err != CUDA_SUCCESS) { |
|
|
|
|
av_log(ctx, AV_LOG_ERROR, "Error creating a CUDA context\n"); |
|
|
|
|
return AVERROR_UNKNOWN; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
cuCtxPopCurrent(&dummy); |
|
|
|
|
|
|
|
|
|
ctx->free = cuda_device_free; |
|
|
|
|
|
|
|
|
|
return 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
const HWContextType ff_hwcontext_type_cuda = { |
|
|
|
|
.type = AV_HWDEVICE_TYPE_CUDA, |
|
|
|
|
.name = "CUDA", |
|
|
|
@ -260,6 +303,7 @@ const HWContextType ff_hwcontext_type_cuda = { |
|
|
|
|
.device_hwctx_size = sizeof(AVCUDADeviceContext), |
|
|
|
|
.frames_priv_size = sizeof(CUDAFramesContext), |
|
|
|
|
|
|
|
|
|
.device_create = cuda_device_create, |
|
|
|
|
.frames_init = cuda_frames_init, |
|
|
|
|
.frames_get_buffer = cuda_get_buffer, |
|
|
|
|
.transfer_get_formats = cuda_transfer_get_formats, |
|
|
|
|