Commit c51b2c79 authored by Anton Khirnov's avatar Anton Khirnov

Allow linking to CUDA dynamically instead of dlopen()ing it at runtime

parent bd49be88
...@@ -179,6 +179,7 @@ Individual component options: ...@@ -179,6 +179,7 @@ Individual component options:
External library support: External library support:
--enable-avisynth enable reading of AviSynth script files [no] --enable-avisynth enable reading of AviSynth script files [no]
--enable-bzlib enable bzlib [autodetect] --enable-bzlib enable bzlib [autodetect]
--enable-cuda enable dynamically linked CUDA [no]
--enable-frei0r enable frei0r video filtering --enable-frei0r enable frei0r video filtering
--enable-gnutls enable gnutls [no] --enable-gnutls enable gnutls [no]
--enable-libbs2b enable bs2b DSP library [no] --enable-libbs2b enable bs2b DSP library [no]
...@@ -1238,6 +1239,7 @@ EXAMPLE_LIST=" ...@@ -1238,6 +1239,7 @@ EXAMPLE_LIST="
EXTERNAL_LIBRARY_LIST=" EXTERNAL_LIBRARY_LIST="
avisynth avisynth
bzlib bzlib
cuda
frei0r frei0r
gnutls gnutls
libbs2b libbs2b
...@@ -4043,6 +4045,7 @@ die_license_disabled gpl libxavs ...@@ -4043,6 +4045,7 @@ die_license_disabled gpl libxavs
die_license_disabled gpl libxvid die_license_disabled gpl libxvid
die_license_disabled gpl x11grab die_license_disabled gpl x11grab
die_license_disabled nonfree cuda
die_license_disabled nonfree libfaac die_license_disabled nonfree libfaac
die_license_disabled nonfree libfdk_aac die_license_disabled nonfree libfdk_aac
die_license_disabled nonfree nvenc die_license_disabled nonfree nvenc
...@@ -4523,6 +4526,7 @@ done ...@@ -4523,6 +4526,7 @@ done
enabled avisynth && { check_lib2 "avisynth/avisynth_c.h windows.h" LoadLibrary || enabled avisynth && { check_lib2 "avisynth/avisynth_c.h windows.h" LoadLibrary ||
check_lib2 "avxsynth/avxsynth_c.h dlfcn.h" dlopen -ldl || check_lib2 "avxsynth/avxsynth_c.h dlfcn.h" dlopen -ldl ||
die "ERROR: LoadLibrary/dlopen not found, or avisynth header not found"; } die "ERROR: LoadLibrary/dlopen not found, or avisynth header not found"; }
enabled cuda && check_lib cuda.h cuInit -lcuda
enabled frei0r && { check_header frei0r.h || die "ERROR: frei0r.h header not found"; } enabled frei0r && { check_header frei0r.h || die "ERROR: frei0r.h header not found"; }
enabled gnutls && require_pkg_config gnutls gnutls/gnutls.h gnutls_global_init enabled gnutls && require_pkg_config gnutls gnutls/gnutls.h gnutls_global_init
enabled libbs2b && require_pkg_config libbs2b bs2b.h bs2b_open enabled libbs2b && require_pkg_config libbs2b bs2b.h bs2b_open
...@@ -4617,7 +4621,7 @@ if enabled libdc1394; then ...@@ -4617,7 +4621,7 @@ if enabled libdc1394; then
fi fi
if enabled nvenc; then if enabled nvenc; then
check_header cuda.h || die "ERROR: cuda.h not found."; enabled cuda || check_header cuda.h || die "ERROR: cuda.h not found.";
check_header nvEncodeAPI.h || die "ERROR: nvEncodeAPI.h not found."; check_header nvEncodeAPI.h || die "ERROR: nvEncodeAPI.h not found.";
check_cpp_condition nvEncodeAPI.h "NVENCAPI_MAJOR_VERSION >= 5" || check_cpp_condition nvEncodeAPI.h "NVENCAPI_MAJOR_VERSION >= 5" ||
die "ERROR: NVENC API version 4 or older is not supported"; die "ERROR: NVENC API version 4 or older is not supported";
......
...@@ -148,6 +148,16 @@ static av_cold int nvenc_load_libraries(AVCodecContext *avctx) ...@@ -148,6 +148,16 @@ static av_cold int nvenc_load_libraries(AVCodecContext *avctx)
PNVENCODEAPICREATEINSTANCE nvenc_create_instance; PNVENCODEAPICREATEINSTANCE nvenc_create_instance;
NVENCSTATUS err; NVENCSTATUS err;
#if CONFIG_CUDA
nvel->cu_init = cuInit;
nvel->cu_device_get_count = cuDeviceGetCount;
nvel->cu_device_get = cuDeviceGet;
nvel->cu_device_get_name = cuDeviceGetName;
nvel->cu_device_compute_capability = cuDeviceComputeCapability;
nvel->cu_ctx_create = cuCtxCreate_v2;
nvel->cu_ctx_pop_current = cuCtxPopCurrent_v2;
nvel->cu_ctx_destroy = cuCtxDestroy_v2;
#else
LOAD_LIBRARY(nvel->cuda, CUDA_LIBNAME); LOAD_LIBRARY(nvel->cuda, CUDA_LIBNAME);
LOAD_SYMBOL(nvel->cu_init, nvel->cuda, "cuInit"); LOAD_SYMBOL(nvel->cu_init, nvel->cuda, "cuInit");
...@@ -159,6 +169,7 @@ static av_cold int nvenc_load_libraries(AVCodecContext *avctx) ...@@ -159,6 +169,7 @@ static av_cold int nvenc_load_libraries(AVCodecContext *avctx)
LOAD_SYMBOL(nvel->cu_ctx_create, nvel->cuda, "cuCtxCreate_v2"); LOAD_SYMBOL(nvel->cu_ctx_create, nvel->cuda, "cuCtxCreate_v2");
LOAD_SYMBOL(nvel->cu_ctx_pop_current, nvel->cuda, "cuCtxPopCurrent_v2"); LOAD_SYMBOL(nvel->cu_ctx_pop_current, nvel->cuda, "cuCtxPopCurrent_v2");
LOAD_SYMBOL(nvel->cu_ctx_destroy, nvel->cuda, "cuCtxDestroy_v2"); LOAD_SYMBOL(nvel->cu_ctx_destroy, nvel->cuda, "cuCtxDestroy_v2");
#endif
LOAD_LIBRARY(nvel->nvenc, NVENC_LIBNAME); LOAD_LIBRARY(nvel->nvenc, NVENC_LIBNAME);
...@@ -859,8 +870,10 @@ av_cold int ff_nvenc_encode_close(AVCodecContext *avctx) ...@@ -859,8 +870,10 @@ av_cold int ff_nvenc_encode_close(AVCodecContext *avctx)
if (ctx->nvel.nvenc) if (ctx->nvel.nvenc)
dlclose(ctx->nvel.nvenc); dlclose(ctx->nvel.nvenc);
#if !CONFIG_CUDA
if (ctx->nvel.cuda) if (ctx->nvel.cuda)
dlclose(ctx->nvel.cuda); dlclose(ctx->nvel.cuda);
#endif
return 0; return 0;
} }
......
...@@ -22,6 +22,8 @@ ...@@ -22,6 +22,8 @@
#include <cuda.h> #include <cuda.h>
#include <nvEncodeAPI.h> #include <nvEncodeAPI.h>
#include "config.h"
#include "libavutil/fifo.h" #include "libavutil/fifo.h"
#include "libavutil/opt.h" #include "libavutil/opt.h"
...@@ -47,7 +49,9 @@ typedef NVENCSTATUS (NVENCAPI *PNVENCODEAPICREATEINSTANCE)(NV_ENCODE_API_FUNCTIO ...@@ -47,7 +49,9 @@ typedef NVENCSTATUS (NVENCAPI *PNVENCODEAPICREATEINSTANCE)(NV_ENCODE_API_FUNCTIO
typedef struct NVENCLibraryContext typedef struct NVENCLibraryContext
{ {
#if !CONFIG_CUDA
void *cuda; void *cuda;
#endif
void *nvenc; void *nvenc;
PCUINIT cu_init; PCUINIT cu_init;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment