1use 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}