| @@ -253,6 +253,49 @@ static int cuda_transfer_data_to(AVHWFramesContext *ctx, AVFrame *dst, | |||||
| return 0; | 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 = { | const HWContextType ff_hwcontext_type_cuda = { | ||||
| .type = AV_HWDEVICE_TYPE_CUDA, | .type = AV_HWDEVICE_TYPE_CUDA, | ||||
| .name = "CUDA", | .name = "CUDA", | ||||
| @@ -260,6 +303,7 @@ const HWContextType ff_hwcontext_type_cuda = { | |||||
| .device_hwctx_size = sizeof(AVCUDADeviceContext), | .device_hwctx_size = sizeof(AVCUDADeviceContext), | ||||
| .frames_priv_size = sizeof(CUDAFramesContext), | .frames_priv_size = sizeof(CUDAFramesContext), | ||||
| .device_create = cuda_device_create, | |||||
| .frames_init = cuda_frames_init, | .frames_init = cuda_frames_init, | ||||
| .frames_get_buffer = cuda_get_buffer, | .frames_get_buffer = cuda_get_buffer, | ||||
| .transfer_get_formats = cuda_transfer_get_formats, | .transfer_get_formats = cuda_transfer_get_formats, | ||||