61 lines
1.3 KiB
Rust
61 lines
1.3 KiB
Rust
|
|
use std::{ffi::c_void, sync::Arc};
|
||
|
|
|
||
|
|
use crate::{encoder::EncoderInternal, sys::result::NVencError};
|
||
|
|
|
||
|
|
pub struct InputBuffer {
|
||
|
|
pub(crate) encoder: Arc<EncoderInternal>,
|
||
|
|
pub(crate) buffer: *mut c_void,
|
||
|
|
pub(crate) width: u32,
|
||
|
|
pub(crate) height: u32,
|
||
|
|
}
|
||
|
|
|
||
|
|
impl InputBuffer {
|
||
|
|
pub fn lock(&self) -> Result<InputBufferLock<'_>, NVencError> {
|
||
|
|
let (lock_ptr, pitch) = self.encoder.lock_input_buffer(self.buffer)?;
|
||
|
|
Ok(InputBufferLock {
|
||
|
|
input_buffer: self,
|
||
|
|
lock_ptr,
|
||
|
|
pitch,
|
||
|
|
})
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
impl Drop for InputBuffer {
|
||
|
|
fn drop(&mut self) {
|
||
|
|
self.encoder.destroy_input_buffer(self.buffer).unwrap()
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
pub struct InputBufferLock<'a> {
|
||
|
|
input_buffer: &'a InputBuffer,
|
||
|
|
lock_ptr: *mut c_void,
|
||
|
|
pitch: u32,
|
||
|
|
}
|
||
|
|
|
||
|
|
impl InputBufferLock<'_> {
|
||
|
|
pub unsafe fn data_ptr(&self) -> *mut u8 {
|
||
|
|
self.lock_ptr as _
|
||
|
|
}
|
||
|
|
|
||
|
|
pub fn width(&self) -> u32 {
|
||
|
|
self.input_buffer.width
|
||
|
|
}
|
||
|
|
|
||
|
|
pub fn height(&self) -> u32 {
|
||
|
|
self.input_buffer.height
|
||
|
|
}
|
||
|
|
|
||
|
|
pub fn pitch(&self) -> u32 {
|
||
|
|
self.pitch
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
impl Drop for InputBufferLock<'_> {
|
||
|
|
fn drop(&mut self) {
|
||
|
|
self.input_buffer
|
||
|
|
.encoder
|
||
|
|
.unlock_input_buffer(self.lock_ptr)
|
||
|
|
.unwrap();
|
||
|
|
}
|
||
|
|
}
|