Commit fb59f87c authored by Luca Barbato's avatar Luca Barbato

nvenc: Explicitly push the cuda context on encoding

Make sure that NVENC does not misbehave if other cuda usages happen
in the application.
parent 4795e4f6
...@@ -178,6 +178,7 @@ static av_cold int nvenc_load_libraries(AVCodecContext *avctx) ...@@ -178,6 +178,7 @@ static av_cold int nvenc_load_libraries(AVCodecContext *avctx)
nvel->cu_device_compute_capability = cuDeviceComputeCapability; nvel->cu_device_compute_capability = cuDeviceComputeCapability;
nvel->cu_ctx_create = cuCtxCreate_v2; nvel->cu_ctx_create = cuCtxCreate_v2;
nvel->cu_ctx_pop_current = cuCtxPopCurrent_v2; nvel->cu_ctx_pop_current = cuCtxPopCurrent_v2;
nvel->cu_ctx_push_current = cuCtxPushCurrent_v2;
nvel->cu_ctx_destroy = cuCtxDestroy_v2; nvel->cu_ctx_destroy = cuCtxDestroy_v2;
#else #else
LOAD_LIBRARY(nvel->cuda, CUDA_LIBNAME); LOAD_LIBRARY(nvel->cuda, CUDA_LIBNAME);
...@@ -190,6 +191,7 @@ static av_cold int nvenc_load_libraries(AVCodecContext *avctx) ...@@ -190,6 +191,7 @@ static av_cold int nvenc_load_libraries(AVCodecContext *avctx)
"cuDeviceComputeCapability"); "cuDeviceComputeCapability");
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_push_current, nvel->cuda, "cuCtxPushCurrent_v2");
LOAD_SYMBOL(nvel->cu_ctx_destroy, nvel->cuda, "cuCtxDestroy_v2"); LOAD_SYMBOL(nvel->cu_ctx_destroy, nvel->cuda, "cuCtxDestroy_v2");
#endif #endif
...@@ -1522,9 +1524,11 @@ int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt, ...@@ -1522,9 +1524,11 @@ int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
const AVFrame *frame, int *got_packet) const AVFrame *frame, int *got_packet)
{ {
NVENCContext *ctx = avctx->priv_data; NVENCContext *ctx = avctx->priv_data;
NVENCLibraryContext *nvel = &ctx->nvel;
NV_ENCODE_API_FUNCTION_LIST *nv = &ctx->nvel.nvenc_funcs; NV_ENCODE_API_FUNCTION_LIST *nv = &ctx->nvel.nvenc_funcs;
NV_ENC_PIC_PARAMS params = { 0 }; NV_ENC_PIC_PARAMS params = { 0 };
NVENCFrame *nvenc_frame = NULL; NVENCFrame *nvenc_frame = NULL;
CUcontext dummy;
int enc_ret, ret; int enc_ret, ret;
params.version = NV_ENC_PIC_PARAMS_VER; params.version = NV_ENC_PIC_PARAMS_VER;
...@@ -1570,7 +1574,10 @@ int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt, ...@@ -1570,7 +1574,10 @@ int ff_nvenc_encode_frame(AVCodecContext *avctx, AVPacket *pkt,
params.encodePicFlags = NV_ENC_PIC_FLAG_EOS; params.encodePicFlags = NV_ENC_PIC_FLAG_EOS;
} }
nvel->cu_ctx_push_current(ctx->cu_context);
enc_ret = nv->nvEncEncodePicture(ctx->nvenc_ctx, &params); enc_ret = nv->nvEncEncodePicture(ctx->nvenc_ctx, &params);
nvel->cu_ctx_pop_current(&dummy);
if (enc_ret != NV_ENC_SUCCESS && if (enc_ret != NV_ENC_SUCCESS &&
enc_ret != NV_ENC_ERR_NEED_MORE_INPUT) enc_ret != NV_ENC_ERR_NEED_MORE_INPUT)
return nvenc_print_error(avctx, enc_ret, "Error encoding the frame"); return nvenc_print_error(avctx, enc_ret, "Error encoding the frame");
......
...@@ -66,6 +66,7 @@ typedef CUresult(CUDAAPI *PCUDEVICEGETNAME)(char *name, int len, CUdevice dev); ...@@ -66,6 +66,7 @@ typedef CUresult(CUDAAPI *PCUDEVICEGETNAME)(char *name, int len, CUdevice dev);
typedef CUresult(CUDAAPI *PCUDEVICECOMPUTECAPABILITY)(int *major, int *minor, CUdevice dev); typedef CUresult(CUDAAPI *PCUDEVICECOMPUTECAPABILITY)(int *major, int *minor, CUdevice dev);
typedef CUresult(CUDAAPI *PCUCTXCREATE)(CUcontext *pctx, unsigned int flags, CUdevice dev); typedef CUresult(CUDAAPI *PCUCTXCREATE)(CUcontext *pctx, unsigned int flags, CUdevice dev);
typedef CUresult(CUDAAPI *PCUCTXPOPCURRENT)(CUcontext *pctx); typedef CUresult(CUDAAPI *PCUCTXPOPCURRENT)(CUcontext *pctx);
typedef CUresult(CUDAAPI *PCUCTXPUSHCURRENT)(CUcontext ctx);
typedef CUresult(CUDAAPI *PCUCTXDESTROY)(CUcontext ctx); typedef CUresult(CUDAAPI *PCUCTXDESTROY)(CUcontext ctx);
typedef NVENCSTATUS (NVENCAPI *PNVENCODEAPICREATEINSTANCE)(NV_ENCODE_API_FUNCTION_LIST *functionList); typedef NVENCSTATUS (NVENCAPI *PNVENCODEAPICREATEINSTANCE)(NV_ENCODE_API_FUNCTION_LIST *functionList);
...@@ -84,6 +85,7 @@ typedef struct NVENCLibraryContext ...@@ -84,6 +85,7 @@ typedef struct NVENCLibraryContext
PCUDEVICECOMPUTECAPABILITY cu_device_compute_capability; PCUDEVICECOMPUTECAPABILITY cu_device_compute_capability;
PCUCTXCREATE cu_ctx_create; PCUCTXCREATE cu_ctx_create;
PCUCTXPOPCURRENT cu_ctx_pop_current; PCUCTXPOPCURRENT cu_ctx_pop_current;
PCUCTXPUSHCURRENT cu_ctx_push_current;
PCUCTXDESTROY cu_ctx_destroy; PCUCTXDESTROY cu_ctx_destroy;
NV_ENCODE_API_FUNCTION_LIST nvenc_funcs; NV_ENCODE_API_FUNCTION_LIST nvenc_funcs;
......
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