aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimo Rothenpieler <timo@rothenpieler.org>2016-08-28 19:46:44 +0200
committerTimo Rothenpieler <timo@rothenpieler.org>2016-08-28 19:46:44 +0200
commitdf615efcf275d87ec6e19be1c1b2f16e9b5d4e72 (patch)
tree2a0573f93f988663b622996a0846c3491bb481b8
parenta19989cae581817e8857623d3afc447372b1c0e3 (diff)
downloadffmpeg-df615efcf275d87ec6e19be1c1b2f16e9b5d4e72.tar.gz
avcodec/nvenc: check maximum driver API version
-rw-r--r--libavcodec/nvenc.c18
-rw-r--r--libavcodec/nvenc.h1
2 files changed, 19 insertions, 0 deletions
diff --git a/libavcodec/nvenc.c b/libavcodec/nvenc.c
index 8994af1681..553f223371 100644
--- a/libavcodec/nvenc.c
+++ b/libavcodec/nvenc.c
@@ -155,8 +155,10 @@ static av_cold int nvenc_load_libraries(AVCodecContext *avctx)
{
NvencContext *ctx = avctx->priv_data;
NvencDynLoadFunctions *dl_fn = &ctx->nvenc_dload_funcs;
+ PNVENCODEAPIGETMAXSUPPORTEDVERSION nvenc_get_max_ver;
PNVENCODEAPICREATEINSTANCE nvenc_create_instance;
NVENCSTATUS err;
+ uint32_t nvenc_max_ver;
#if CONFIG_CUDA
dl_fn->cu_init = cuInit;
@@ -183,9 +185,25 @@ static av_cold int nvenc_load_libraries(AVCodecContext *avctx)
LOAD_LIBRARY(dl_fn->nvenc, NVENC_LIBNAME);
+ LOAD_SYMBOL(nvenc_get_max_ver, dl_fn->nvenc,
+ "NvEncodeAPIGetMaxSupportedVersion");
LOAD_SYMBOL(nvenc_create_instance, dl_fn->nvenc,
"NvEncodeAPICreateInstance");
+ err = nvenc_get_max_ver(&nvenc_max_ver);
+ if (err != NV_ENC_SUCCESS)
+ return nvenc_print_error(avctx, err, "Failed to query nvenc max version");
+
+ av_log(avctx, AV_LOG_VERBOSE, "Loaded Nvenc version %d.%d\n", nvenc_max_ver >> 4, nvenc_max_ver & 0xf);
+
+ if ((NVENCAPI_MAJOR_VERSION << 4 | NVENCAPI_MINOR_VERSION) > nvenc_max_ver) {
+ av_log(avctx, AV_LOG_ERROR, "Driver does not support the required nvenc API version. "
+ "Required: %d.%d Found: %d.%d\n",
+ NVENCAPI_MAJOR_VERSION, NVENCAPI_MINOR_VERSION,
+ nvenc_max_ver >> 4, nvenc_max_ver & 0xf);
+ return AVERROR(ENOSYS);
+ }
+
dl_fn->nvenc_funcs.version = NV_ENCODE_API_FUNCTION_LIST_VER;
err = nvenc_create_instance(&dl_fn->nvenc_funcs);
diff --git a/libavcodec/nvenc.h b/libavcodec/nvenc.h
index cd86c47df0..c57f1ae524 100644
--- a/libavcodec/nvenc.h
+++ b/libavcodec/nvenc.h
@@ -72,6 +72,7 @@ typedef CUresult(CUDAAPI *PCUCTXCREATE)(CUcontext *pctx, unsigned int flags, CUd
typedef CUresult(CUDAAPI *PCUCTXPOPCURRENT)(CUcontext *pctx);
typedef CUresult(CUDAAPI *PCUCTXDESTROY)(CUcontext ctx);
+typedef NVENCSTATUS (NVENCAPI *PNVENCODEAPIGETMAXSUPPORTEDVERSION)(uint32_t* version);
typedef NVENCSTATUS (NVENCAPI *PNVENCODEAPICREATEINSTANCE)(NV_ENCODE_API_FUNCTION_LIST *functionList);
typedef struct NvencDynLoadFunctions