use std::ffi::CStr;
#[derive(Debug, Copy, Clone)]
pub enum CaptureType {
ToSystem = nvfbc_sys::_NVFBC_CAPTURE_TYPE_NVFBC_CAPTURE_TO_SYS as isize,
SharedCuda = nvfbc_sys::_NVFBC_CAPTURE_TYPE_NVFBC_CAPTURE_SHARED_CUDA as isize,
ToOpenGl = nvfbc_sys::_NVFBC_CAPTURE_TYPE_NVFBC_CAPTURE_TO_GL as isize,
}
#[derive(Debug, Copy, Clone)]
pub enum BufferFormat {
Argb = nvfbc_sys::_NVFBC_BUFFER_FORMAT_NVFBC_BUFFER_FORMAT_ARGB as isize,
Rgb = nvfbc_sys::_NVFBC_BUFFER_FORMAT_NVFBC_BUFFER_FORMAT_RGB as isize,
Nv12 = nvfbc_sys::_NVFBC_BUFFER_FORMAT_NVFBC_BUFFER_FORMAT_NV12 as isize,
Yuv444p = nvfbc_sys::_NVFBC_BUFFER_FORMAT_NVFBC_BUFFER_FORMAT_YUV444P as isize,
Rgba = nvfbc_sys::_NVFBC_BUFFER_FORMAT_NVFBC_BUFFER_FORMAT_RGBA as isize,
Bgra = nvfbc_sys::_NVFBC_BUFFER_FORMAT_NVFBC_BUFFER_FORMAT_BGRA as isize,
}
#[derive(Debug, Copy, Clone)]
pub struct Box {
pub x: u32,
pub y: u32,
pub w: u32,
pub h: u32,
}
#[derive(Debug, Copy, Clone)]
pub struct Size {
pub w: u32,
pub h: u32,
}
#[derive(Debug, Clone)]
pub struct Output {
pub id: u32,
pub name: String,
pub tracked_box: Box,
}
#[derive(Debug, Clone)]
pub struct Status {
pub is_capture_possible: bool,
pub currently_capturing: bool,
pub can_create_now: bool,
pub screen_size: Size,
pub xrandr_available: bool,
pub outputs: Vec<Output>,
pub nvfbc_version: u32,
pub in_modeset: bool,
}
impl From<nvfbc_sys::_NVFBC_GET_STATUS_PARAMS> for Status {
fn from(status: nvfbc_sys::_NVFBC_GET_STATUS_PARAMS) -> Self {
let mut outputs = Vec::with_capacity(status.dwOutputNum as usize);
for output_index in 0..status.dwOutputNum {
outputs.push(Output {
id: status.outputs[output_index as usize].dwId,
name: unsafe {
CStr::from_ptr(&status.outputs[output_index as usize].name as *const i8)
.to_str().unwrap().to_string()
},
tracked_box: Box {
x: status.outputs[output_index as usize].trackedBox.x,
y: status.outputs[output_index as usize].trackedBox.y,
w: status.outputs[output_index as usize].trackedBox.w,
h: status.outputs[output_index as usize].trackedBox.h,
},
});
}
Self {
is_capture_possible: status.bIsCapturePossible == nvfbc_sys::_NVFBC_BOOL_NVFBC_TRUE,
currently_capturing: status.bCurrentlyCapturing == nvfbc_sys::_NVFBC_BOOL_NVFBC_TRUE,
can_create_now: status.bCanCreateNow == nvfbc_sys::_NVFBC_BOOL_NVFBC_TRUE,
screen_size: Size { w: status.screenSize.w, h: status.screenSize.h },
xrandr_available: status.bXRandRAvailable == nvfbc_sys::_NVFBC_BOOL_NVFBC_TRUE,
outputs,
nvfbc_version: status.dwNvFBCVersion,
in_modeset: status.bInModeset == nvfbc_sys::_NVFBC_BOOL_NVFBC_TRUE,
}
}
}