Skip to main content

nvenc/
lib.rs

1// Copyright (C) The Strand-Braid Authors
2// SPDX-License-Identifier: MIT OR Apache-2.0
3
4use std::rc::Rc;
5
6mod error;
7
8pub use error::NvEncError;
9
10pub use dynlink_cuda::api::CudaDevice;
11pub use dynlink_nvidia_encode::{
12    NV_ENC_CODEC_H264_GUID, NV_ENC_PRESET_HP_GUID, Queue,
13    api::{
14        ApiVersion, BufferFormat, Encoder, InitParamsBuilder, InputBuffer, LibNvEncode,
15        OutputBuffer, RateControlMode,
16    },
17    guids::*,
18};
19
20pub struct NvEnc<'lib> {
21    pub libcuda: dynlink_cuda::api::LibCuda<'lib>,
22    pub libnvenc: Rc<LibNvEncode<'lib>>,
23    pub functions: dynlink_nvidia_encode::api::NvEncodeApiFunctionList<'lib>,
24}
25
26impl<'lib> NvEnc<'lib> {
27    pub fn new(libs: &'lib Dynlibs) -> Result<NvEnc<'lib>, NvEncError> {
28        let libcuda = dynlink_cuda::api::init(&libs.cuda_shlib)?;
29        libcuda.init(0)?;
30
31        let libnvenc = dynlink_nvidia_encode::api::init(&libs.nvenc_shlib)?;
32        let functions = LibNvEncode::api_create_instance(libnvenc.clone())?;
33        Ok(NvEnc {
34            libcuda,
35            libnvenc,
36            functions,
37        })
38    }
39    pub fn cuda_version(&self) -> Result<i32, NvEncError> {
40        Ok(self.libcuda.driver_get_version()?)
41    }
42    pub fn cuda_device_count(&self) -> Result<i32, NvEncError> {
43        Ok(self.libcuda.device_get_count()?)
44    }
45    pub fn new_cuda_device(&self, idx: i32) -> Result<dynlink_cuda::CudaDevice<'_>, NvEncError> {
46        Ok(self.libcuda.new_device(idx)?)
47    }
48}
49
50pub struct Dynlibs {
51    pub cuda_shlib: dynlink_cuda::load::SharedLibrary,
52    pub nvenc_shlib: dynlink_nvidia_encode::load::SharedLibrary,
53}
54
55impl Dynlibs {
56    pub fn new() -> Result<Self, NvEncError> {
57        let cuda_shlib = dynlink_cuda::load::load()?;
58        let nvenc_shlib = dynlink_nvidia_encode::load::load()?;
59        Ok(Self {
60            cuda_shlib,
61            nvenc_shlib,
62        })
63    }
64}
65
66#[ignore = "requires NVENC shared libraries to be present at runtime"]
67#[test]
68fn test_basics() {
69    check_basics().unwrap();
70}
71
72#[cfg(test)]
73fn check_basics() -> Result<(), NvEncError> {
74    let libs = Dynlibs::new()?;
75    let _nvenc = NvEnc::new(&libs)?;
76    Ok(())
77}