*: make internal pointer handling safer
This commit is contained in:
@ -9,7 +9,9 @@ use libc::c_int;
|
||||
|
||||
impl Context {
|
||||
pub fn devices(&self) -> Result<DeviceIter, Error> {
|
||||
DeviceIter::new(self.ptr)
|
||||
unsafe {
|
||||
DeviceIter::wrap(self.as_ptr())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -21,20 +23,20 @@ pub struct DeviceIter<'a> {
|
||||
}
|
||||
|
||||
impl<'a> DeviceIter<'a> {
|
||||
pub fn new(ctx: *mut AVFormatContext) -> Result<Self, Error> {
|
||||
unsafe {
|
||||
let mut ptr: *mut AVDeviceInfoList = ptr::null_mut();
|
||||
pub unsafe fn wrap(ctx: *const AVFormatContext) -> Result<Self, Error> {
|
||||
let mut ptr: *mut AVDeviceInfoList = ptr::null_mut();
|
||||
|
||||
match avdevice_list_devices(ctx, &mut ptr) {
|
||||
n if n < 0 =>
|
||||
Err(Error::from(n)),
|
||||
match avdevice_list_devices(ctx, &mut ptr) {
|
||||
n if n < 0 =>
|
||||
Err(Error::from(n)),
|
||||
|
||||
_ =>
|
||||
Ok(DeviceIter { ptr: ptr, cur: 0, _marker: PhantomData })
|
||||
}
|
||||
_ =>
|
||||
Ok(DeviceIter { ptr: ptr, cur: 0, _marker: PhantomData })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> DeviceIter<'a> {
|
||||
pub fn default(&self) -> usize {
|
||||
unsafe {
|
||||
(*self.ptr).default_device as usize
|
||||
|
@ -15,19 +15,29 @@ pub struct Info<'a> {
|
||||
}
|
||||
|
||||
impl<'a> Info<'a> {
|
||||
pub fn wrap(ptr: *mut AVDeviceInfo) -> Self {
|
||||
pub unsafe fn wrap(ptr: *mut AVDeviceInfo) -> Self {
|
||||
Info { ptr: ptr, _marker: PhantomData }
|
||||
}
|
||||
|
||||
pub unsafe fn as_ptr(&self) -> *const AVDeviceInfo {
|
||||
self.ptr as *const _
|
||||
}
|
||||
|
||||
pub unsafe fn as_mut_ptr(&mut self) -> *mut AVDeviceInfo {
|
||||
self.ptr
|
||||
}
|
||||
}
|
||||
|
||||
impl<'a> Info<'a> {
|
||||
pub fn name(&self) -> &str {
|
||||
unsafe {
|
||||
from_utf8_unchecked(CStr::from_ptr((*self.ptr).device_name).to_bytes())
|
||||
from_utf8_unchecked(CStr::from_ptr((*self.as_ptr()).device_name).to_bytes())
|
||||
}
|
||||
}
|
||||
|
||||
pub fn description(&self) -> &str {
|
||||
unsafe {
|
||||
from_utf8_unchecked(CStr::from_ptr((*self.ptr).device_description).to_bytes())
|
||||
from_utf8_unchecked(CStr::from_ptr((*self.as_ptr()).device_description).to_bytes())
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user