示例#1
0
 private static extern NvEncStatus NvEncodeAPICreateInstance32(ref NvEncApiFunctionList functionList);
示例#2
0
 public static NvEncStatus NvEncodeAPICreateInstance(ref NvEncApiFunctionList functionList) =>
 Environment.Is64BitProcess
         ? NvEncodeAPICreateInstance64(ref functionList)
         : NvEncodeAPICreateInstance32(ref functionList);
示例#3
0
        /// <summary>
        /// Try to initialize NvEnc. Exceptions will not be thrown for failure.
        /// Once called, LibNvEnc.FunctionList becomes available. Calling after
        /// a successful initialization has no effect.
        /// </summary>
        /// <param name="failedDescription">Null if successful pr a detailed
        /// textual description of the failure reason.</param>
        ///
        /// <returns>Success or the category of failure.</returns>
        /// <seealso cref="Initialize()"/>
        /// <seealso cref="FunctionList"/>
        public static LibNcEncInitializeStatus TryInitialize(
            out string?failedDescription)
        {
            failedDescription = null;

            // Thread safety isn't an issue because there's no loss on
            // successful re-entrance.
            if (_isInitialized)
            {
                return(LibNcEncInitializeStatus.Success);
            }

            uint        version;
            NvEncStatus status;

            try
            {
                status = NvEncodeAPIGetMaxSupportedVersion(out version);
            }
            catch (DllNotFoundException e)
            {
                failedDescription = e.ToString();
                return(LibNcEncInitializeStatus.DllNotFound);
            }
            catch (Exception e)
            {
                failedDescription = e.ToString();
                return(LibNcEncInitializeStatus.Failure);
            }

            if (status != NvEncStatus.Success)
            {
                failedDescription = $"{nameof(NvEncodeAPIGetMaxSupportedVersion)} returned unexpected status, {status}";
                return(LibNcEncInitializeStatus.Failure);
            }

            const uint currentVersion = (NVENCAPI_MAJOR_VERSION << 4) | NVENCAPI_MINOR_VERSION;

            if (currentVersion > version)
            {
                failedDescription = $"Installed NvEnc version is {version >> 4}.{version & 0xF}, version must be at least {NVENCAPI_MAJOR_VERSION}.{NVENCAPI_MINOR_VERSION}. Please upgrade the nvidia display drivers.";
                return(LibNcEncInitializeStatus.UnsupportedVersion);
            }

            var functionList = new NvEncApiFunctionList
            {
                Version = NV_ENCODE_API_FUNCTION_LIST_VER
            };

            status = NvEncodeAPICreateInstance(ref functionList);

            if (status != NvEncStatus.Success)
            {
                failedDescription = $"{nameof(NvEncodeAPICreateInstance)} returned unexpected status, {status}";
                return(LibNcEncInitializeStatus.Failure);
            }

            FunctionList = functionList;

            _isInitialized = true;

            return(LibNcEncInitializeStatus.Success);
        }