aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2024-02-13 13:17:19 +0100
committerAndreas Rheinhardt <andreas.rheinhardt@outlook.com>2024-03-01 18:32:40 +0100
commitac7e72972c4e3be384bc3df1a42e25e4d2ba68e7 (patch)
tree253dfbbd09cd954e4158515c44af423da537481f
parent8d277de009c177fd7aeb3d3b1752bfbf361a9b89 (diff)
downloadffmpeg-ac7e72972c4e3be384bc3df1a42e25e4d2ba68e7.tar.gz
avutil/hwcontext_cuda: Allocate public and internal device ctx jointly
Reviewed-by: Timo Rothenpieler <timo@rothenpieler.org> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com>
-rw-r--r--libavutil/hwcontext_cuda.c43
1 files changed, 22 insertions, 21 deletions
diff --git a/libavutil/hwcontext_cuda.c b/libavutil/hwcontext_cuda.c
index 1c61b36d69..ffc8e01efe 100644
--- a/libavutil/hwcontext_cuda.c
+++ b/libavutil/hwcontext_cuda.c
@@ -35,6 +35,11 @@ typedef struct CUDAFramesContext {
int tex_alignment;
} CUDAFramesContext;
+typedef struct CUDADeviceContext {
+ AVCUDADeviceContext p;
+ AVCUDADeviceContextInternal internal;
+} CUDADeviceContext;
+
static const enum AVPixelFormat supported_formats[] = {
AV_PIX_FMT_NV12,
AV_PIX_FMT_YUV420P,
@@ -282,39 +287,35 @@ exit:
static void cuda_device_uninit(AVHWDeviceContext *device_ctx)
{
- AVCUDADeviceContext *hwctx = device_ctx->hwctx;
+ CUDADeviceContext *hwctx = device_ctx->hwctx;
- if (hwctx->internal) {
- CudaFunctions *cu = hwctx->internal->cuda_dl;
+ if (hwctx->p.internal) {
+ CudaFunctions *cu = hwctx->internal.cuda_dl;
- if (hwctx->internal->is_allocated && hwctx->cuda_ctx) {
- if (hwctx->internal->flags & AV_CUDA_USE_PRIMARY_CONTEXT)
- CHECK_CU(cu->cuDevicePrimaryCtxRelease(hwctx->internal->cuda_device));
- else if (!(hwctx->internal->flags & AV_CUDA_USE_CURRENT_CONTEXT))
- CHECK_CU(cu->cuCtxDestroy(hwctx->cuda_ctx));
+ if (hwctx->internal.is_allocated && hwctx->p.cuda_ctx) {
+ if (hwctx->internal.flags & AV_CUDA_USE_PRIMARY_CONTEXT)
+ CHECK_CU(cu->cuDevicePrimaryCtxRelease(hwctx->internal.cuda_device));
+ else if (!(hwctx->internal.flags & AV_CUDA_USE_CURRENT_CONTEXT))
+ CHECK_CU(cu->cuCtxDestroy(hwctx->p.cuda_ctx));
- hwctx->cuda_ctx = NULL;
+ hwctx->p.cuda_ctx = NULL;
}
- cuda_free_functions(&hwctx->internal->cuda_dl);
+ cuda_free_functions(&hwctx->internal.cuda_dl);
+ memset(&hwctx->internal, 0, sizeof(hwctx->internal));
+ hwctx->p.internal = NULL;
}
-
- av_freep(&hwctx->internal);
}
static int cuda_device_init(AVHWDeviceContext *ctx)
{
- AVCUDADeviceContext *hwctx = ctx->hwctx;
+ CUDADeviceContext *hwctx = ctx->hwctx;
int ret;
- if (!hwctx->internal) {
- hwctx->internal = av_mallocz(sizeof(*hwctx->internal));
- if (!hwctx->internal)
- return AVERROR(ENOMEM);
- }
+ hwctx->p.internal = &hwctx->internal;
- if (!hwctx->internal->cuda_dl) {
- ret = cuda_load_functions(&hwctx->internal->cuda_dl, ctx);
+ if (!hwctx->internal.cuda_dl) {
+ ret = cuda_load_functions(&hwctx->internal.cuda_dl, ctx);
if (ret < 0) {
av_log(ctx, AV_LOG_ERROR, "Could not dynamically load CUDA\n");
goto error;
@@ -562,7 +563,7 @@ const HWContextType ff_hwcontext_type_cuda = {
.type = AV_HWDEVICE_TYPE_CUDA,
.name = "CUDA",
- .device_hwctx_size = sizeof(AVCUDADeviceContext),
+ .device_hwctx_size = sizeof(CUDADeviceContext),
.frames_hwctx_size = sizeof(CUDAFramesContext),
.device_create = cuda_device_create,