[FFmpeg-devel] [PATCH] nvenc: Don't segfault on close if no cuda is available

Mark Thompson sw at jkqxz.net
Wed Aug 30 22:09:34 EEST 2017


---
"""
Cannot load libcuda.so.1

Thread 1 "ffmpeg_g" received signal SIGSEGV, Segmentation fault.
0x000055555657cd59 in ff_nvenc_encode_close (avctx=0x5555578ed920) at src/libavcodec/nvenc.c:1337
1337        cu_res = dl_fn->cuda_dl->cuCtxPushCurrent(ctx->cu_context);
"""

This only fixes the segfaults - some of the other stuff might want to be gated as well?


 libavcodec/nvenc.c | 26 +++++++++++++++-----------
 1 file changed, 15 insertions(+), 11 deletions(-)

diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
index 8c4fd31fec..5586a8901f 100644
--- a/libavcodec/nvenc.c
+++ b/libavcodec/nvenc.c
@@ -1334,10 +1334,12 @@ av_cold int ff_nvenc_encode_close(AVCodecContext *avctx)
     CUcontext dummy;
     int i;
 
-    cu_res = dl_fn->cuda_dl->cuCtxPushCurrent(ctx->cu_context);
-    if (cu_res != CUDA_SUCCESS) {
-        av_log(avctx, AV_LOG_ERROR, "cuCtxPushCurrent failed\n");
-        return AVERROR_EXTERNAL;
+    if (dl_fn->cuda_dl) {
+        cu_res = dl_fn->cuda_dl->cuCtxPushCurrent(ctx->cu_context);
+        if (cu_res != CUDA_SUCCESS) {
+            av_log(avctx, AV_LOG_ERROR, "cuCtxPushCurrent failed\n");
+            return AVERROR_EXTERNAL;
+        }
     }
 
     /* the encoder has to be flushed before it can be closed */
@@ -1381,14 +1383,16 @@ av_cold int ff_nvenc_encode_close(AVCodecContext *avctx)
         p_nvenc->nvEncDestroyEncoder(ctx->nvencoder);
     ctx->nvencoder = NULL;
 
-    cu_res = dl_fn->cuda_dl->cuCtxPopCurrent(&dummy);
-    if (cu_res != CUDA_SUCCESS) {
-        av_log(avctx, AV_LOG_ERROR, "cuCtxPopCurrent failed\n");
-        return AVERROR_EXTERNAL;
-    }
+    if (dl_fn->cuda_dl) {
+        cu_res = dl_fn->cuda_dl->cuCtxPopCurrent(&dummy);
+        if (cu_res != CUDA_SUCCESS) {
+            av_log(avctx, AV_LOG_ERROR, "cuCtxPopCurrent failed\n");
+            return AVERROR_EXTERNAL;
+        }
 
-    if (ctx->cu_context_internal)
-        dl_fn->cuda_dl->cuCtxDestroy(ctx->cu_context_internal);
+        if (ctx->cu_context_internal)
+            dl_fn->cuda_dl->cuCtxDestroy(ctx->cu_context_internal);
+    }
     ctx->cu_context = ctx->cu_context_internal = NULL;
 
     nvenc_free_functions(&dl_fn->nvenc_dl);
-- 
2.11.0


More information about the ffmpeg-devel mailing list