xpra icon
Bug tracker and wiki

Opened 17 months ago

Closed 17 months ago

Last modified 17 months ago

#1414 closed defect (fixed)

recognising nvenc 7.1 fails

Reported by: Jens H. Goebbert Owned by: Jens H. Goebbert
Priority: major Milestone:
Component: encodings Version: trunk
Keywords: Cc:

Description (last modified by Antoine Martin)


Xpra currently fails for NVENC versions which have a minor number != 0.

In xpra/codecs/nvenc7 the following code checks the version of the NVENC API in init_module() (line 2531):

        raise Exception("unsupported version of NVENC: %#x" % NVENCAPI_VERSION)

NVENCAPI_VERION comes from header file Samples/common/inc/nvEncodeAPI.h of NVIDIAs NVENC SDK.
It is defined here like this (line 113):


This means that NVENCAPI_VERSION looks like this:

    0x0000007 == 0x7 for 7.0
    0x1000007 != 0x7 for 7.1

=> if NVENCAPI_VERSION!=0x7: fails for version 7.1

nvEncodeAPI.h also defines 

A possible fix could be:

        raise Exception("unsupported version of NVENC: %#x" % NVENCAPI_MAJOR_VERSION)

Jens Henrik

Change History (8)

comment:1 Changed 17 months ago by Antoine Martin

Description: modified (diff)
Status: newassigned

Thanks - will fix ASAP.

comment:2 Changed 17 months ago by Jens H. Goebbert

Component: androidencodings

One more thing in this context:

In xpra/codecs/nvenc7/encoder.py NVENCAPI_VERSION is currently of type 'unsigned int' and therefore not explicitly defined as 32 or 64 bit.

The #define from nvEncoderAPI.h "expects" an uint32 as it shifts the minor version number by 24 bits to the left.

comment:3 Changed 17 months ago by Antoine Martin

Owner: changed from Antoine Martin to Jens H. Goebbert
Status: assignednew

Fixed for trunk in r14809, r14810 for v1.0.x.
(only compile tested)

Please close if that works for you.

comment:4 Changed 17 months ago by Jens H. Goebbert


thanks for adding the fix.
I tested this on our system and the first problem is fixed!

Anyway, NVIDIA has extended the NV_ENCODE_API_FUNCTION_LIST to version 2 in NVENC_SDK 7.1.
This ends up in the following error:

>>xpra/install/lib/python2.7/site-packages/tests/xpra/codecs$ python test_nvenc7.py 
2017-01-18 10:24:54,446 CUDA initialization (this may take a few seconds)
2017-01-18 10:24:54,940 CUDA 8.0.0 / PyCUDA 2016.1.2, found 2 devices:
2017-01-18 10:24:54,940   + Tesla K40m @ 0000:02:00.0 (memory: 97% free, compute: 3.5)
2017-01-18 10:24:55,514   + Tesla K40m @ 0000:81:00.0 (memory: 99% free, compute: 3.5)
2017-01-18 10:24:55,757 NVidia driver version 367.48
2017-01-18 10:24:56,106 device matches preferred device id 0: Tesla K40m @ 0000:02:00.0
Traceback (most recent call last):
  File "test_nvenc7.py", line 23, in <module>
  File "test_nvenc7.py", line 12, in main
  File "/homeb/zam/goebbert/workspace/xpra/install/lib/python2.7/site-packages/tests/xpra/codecs/test_nvenc.py", line 30, in test_encode_one
  File "/homeb/zam/goebbert/workspace/xpra/install/lib/python2.7/site-packages/tests/xpra/codecs/test_encoder.py", line 45, in test_encoder
  File "xpra/codecs/nvenc7/encoder.pyx", line 2577, in xpra.codecs.nvenc7.encoder.init_module (xpra/codecs/nvenc7/encoder.c:36607)
  File "xpra/codecs/nvenc7/encoder.pyx", line 2497, in xpra.codecs.nvenc7.encoder.Encoder.open_encode_session (xpra/codecs/nvenc7/encoder.c:34916)
  File "xpra/codecs/nvenc7/encoder.pyx", line 1319, in xpra.codecs.nvenc7.encoder.raiseNVENC (xpra/codecs/nvenc7/encoder.c:9276)
xpra.codecs.nvenc7.encoder.NVENCException: getting API function list - returned 15: This indicates that an invalid struct version was used by the client.

The new NV_ENCODE_API_FUNCTION_LIST (version 2) looks like this and added three new functions at the end:

ctypedef struct NV_ENCODE_API_FUNCTION_LIST_2:
        uint32_t                        version
        uint32_t                        reserved
        PNVENCOPENENCODESESSION         nvEncOpenEncodeSession
        PNVENCGETENCODEGUIDS            nvEncGetEncodeGUIDs
        PNVENCGETINPUTFORMATCOUNT       nvEncGetInputFormatCount
        PNVENCGETINPUTFORMATS           nvEncGetInputFormats
        PNVENCGETENCODECAPS             nvEncGetEncodeCaps
        PNVENCGETENCODEPRESETCOUNT      nvEncGetEncodePresetCount
        PNVENCGETENCODEPRESETCONFIG     nvEncGetEncodePresetConfig
        PNVENCINITIALIZEENCODER         nvEncInitializeEncoder
        PNVENCCREATEINPUTBUFFER         nvEncCreateInputBuffer
        PNVENCDESTROYINPUTBUFFER        nvEncDestroyInputBuffer
        PNVENCCREATEBITSTREAMBUFFER     nvEncCreateBitstreamBuffer
        PNVENCDESTROYBITSTREAMBUFFER    nvEncDestroyBitstreamBuffer
        PNVENCENCODEPICTURE             nvEncEncodePicture
        PNVENCLOCKBITSTREAM             nvEncLockBitstream
        PNVENCUNLOCKBITSTREAM           nvEncUnlockBitstream
        PNVENCLOCKINPUTBUFFER           nvEncLockInputBuffer
        PNVENCUNLOCKINPUTBUFFER         nvEncUnlockInputBuffer
        PNVENCGETENCODESTATS            nvEncGetEncodeStats
        PNVENCGETSEQUENCEPARAMS         nvEncGetSequenceParams
        PNVENCREGISTERASYNCEVENT        nvEncRegisterAsyncEvent
        PNVENCUNREGISTERASYNCEVENT      nvEncUnregisterAsyncEvent
        PNVENCMAPINPUTRESOURCE          nvEncMapInputResource
        PNVENCUNMAPINPUTRESOURCE        nvEncUnmapInputResource
        PNVENCDESTROYENCODER            nvEncDestroyEncoder
        PNVENCINVALIDATEREFFRAMES       nvEncInvalidateRefFrames
        PNVENCOPENENCODESESSIONEX       nvEncOpenEncodeSessionEx
        PNVENCREGISTERRESOURCE          nvEncRegisterResource
        PNVENCUNREGISTERRESOURCE        nvEncUnregisterResource
        PNVENCRECONFIGUREENCODER        nvEncReconfigureEncoder
        void*                           reserved1
        PNVENCCREATEMVBUFFER            nvEncCreateMVBuffer
        PNVENCDESTROYMVBUFFER           nvEncDestroyMVBuffer
        PNVENCRUNMOTIONESTIMATIONONLY   nvEncRunMotionEstimationOnly
        void*                           reserved2[281]

A bug in NVENC_SDK 7.1.9 probably gives some problems right now with this struct and should be fixed first:

Jens Henrik

comment:5 Changed 17 months ago by Jens H. Goebbert

The error comes for a version check inside the Nvidia libs.
The requested version is not supported by the installed drivers.
Our installed NVIDIA driver is too old and does not support the version of the NV_ENCODE_API_FUNCTION_LIST.
I have to downgrade the NVENC_SDK and try again.

Anyway, just for completeness:
NV_ENCODE_API_FUNCTION_LIST is defined like this:

#define NVENCAPI_STRUCT_VERSION(ver) ((uint32_t)NVENCAPI_VERSION | ((ver)<<16) | (0x7 << 28))

It is not just "2", but includes the NVENCAPI_VERSION, which is expected to be of type uint32_t.

comment:6 Changed 17 months ago by Jens H. Goebbert

Video Codec SDK 6.0 is supported on R358 drivers and above.
Video Codec SDK 7.0 is supported on R367 drivers and above.
Video Codec SDK 7.1 is supported on R375 drivers and above.


comment:7 Changed 17 months ago by Jens H. Goebbert

Resolution: fixed
Status: newclosed

nvenc with the new patch runs fine for SDK 7.0.
It compiles fine for SDK 7.1 and fails in a later stage on our machines, because of an too old driver. This is not a Xpra related bug.

My last comments are just "nice-to-know" but no bugs. The mentioned three extra functions are not listed in Xpra but space is reserved.

Hence -> close ticket.

comment:8 Changed 17 months ago by Antoine Martin

Nice to see that nvidia has finally started documenting what SDK works with what driver version. (it was a guessing game previously)

FYI: better driver version validation has been added in r14817.

Note: See TracTickets for help on using tickets.