[FFmpeg-cvslog] avutil/hwcontext_cuda: Allocate public and internal device ctx jointly

Andreas Rheinhardt git at videolan.org
Fri Mar 1 19:40:34 EET 2024


ffmpeg | branch: master | Andreas Rheinhardt <andreas.rheinhardt at outlook.com> | Tue Feb 13 13:17:19 2024 +0100| [ac7e72972c4e3be384bc3df1a42e25e4d2ba68e7] | committer: Andreas Rheinhardt

avutil/hwcontext_cuda: Allocate public and internal device ctx jointly

Reviewed-by: Timo Rothenpieler <timo at rothenpieler.org>
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=ac7e72972c4e3be384bc3df1a42e25e4d2ba68e7
---

 libavutil/hwcontext_cuda.c | 43 ++++++++++++++++++++++---------------------
 1 file 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,



More information about the ffmpeg-cvslog mailing list