Commit c5a0c168 authored by Hendrik Leppkes's avatar Hendrik Leppkes

Merge commit '2e219b49'

* commit '2e219b49':
  hwcontext_cuda: implement device creation
Merged-by: 's avatarHendrik Leppkes <h.leppkes@gmail.com>
parents 613ac3bf 2e219b49
......@@ -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,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment