diff options
author | Hendrik Leppkes <h.leppkes@gmail.com> | 2016-06-26 15:25:12 +0200 |
---|---|---|
committer | Hendrik Leppkes <h.leppkes@gmail.com> | 2016-06-26 15:25:12 +0200 |
commit | c5a0c16850fc8bcdd38f30824ee2acaeba45749c (patch) | |
tree | 3507c90775a9866e347c33e1d8ebdda2d8180b52 | |
parent | 613ac3bf82cbdd18957a1260ecde96dc0e258424 (diff) | |
parent | 2e219b491bcc0845248345fdad31231b081e06d1 (diff) | |
download | ffmpeg-c5a0c16850fc8bcdd38f30824ee2acaeba45749c.tar.gz |
Merge commit '2e219b491bcc0845248345fdad31231b081e06d1'
* commit '2e219b491bcc0845248345fdad31231b081e06d1':
hwcontext_cuda: implement device creation
Merged-by: Hendrik Leppkes <h.leppkes@gmail.com>
-rw-r--r-- | libavutil/hwcontext_cuda.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/libavutil/hwcontext_cuda.c b/libavutil/hwcontext_cuda.c index 2c5980d619..fa24c5d37b 100644 --- a/libavutil/hwcontext_cuda.c +++ b/libavutil/hwcontext_cuda.c @@ -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, |