aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHendrik Leppkes <h.leppkes@gmail.com>2016-06-26 15:25:12 +0200
committerHendrik Leppkes <h.leppkes@gmail.com>2016-06-26 15:25:12 +0200
commitc5a0c16850fc8bcdd38f30824ee2acaeba45749c (patch)
tree3507c90775a9866e347c33e1d8ebdda2d8180b52
parent613ac3bf82cbdd18957a1260ecde96dc0e258424 (diff)
parent2e219b491bcc0845248345fdad31231b081e06d1 (diff)
downloadffmpeg-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.c44
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,