From 1150527c35982484cbcb24df9b049961bd644410 Mon Sep 17 00:00:00 2001 From: meh Date: Tue, 12 May 2015 03:58:26 +0200 Subject: [PATCH] device: add handling --- src/device/input.rs | 55 +++++++++++++++++++++++++++++++++++++++++++ src/device/mod.rs | 56 ++++++++++++++++++++++++++++++++++++++++++++ src/device/output.rs | 51 ++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 2 ++ 4 files changed, 164 insertions(+) create mode 100644 src/device/input.rs create mode 100644 src/device/mod.rs create mode 100644 src/device/output.rs diff --git a/src/device/input.rs b/src/device/input.rs new file mode 100644 index 0000000..bfb719a --- /dev/null +++ b/src/device/input.rs @@ -0,0 +1,55 @@ +use std::ptr; + +use ffi::*; +use ::format; +use ::Format; + +pub struct AudioIter(*mut AVInputFormat); + +impl Iterator for AudioIter { + type Item = Format; + + fn next(&mut self) -> Option<::Item> { + unsafe { + let ptr = av_input_audio_device_next(self.0); + + if ptr == ptr::null_mut() && self.0 != ptr::null_mut() { + None + } + else { + self.0 = ptr; + + Some(Format::Input(format::Input::wrap(ptr))) + } + } + } +} + +pub fn audio() -> AudioIter { + AudioIter(ptr::null_mut()) +} + +pub struct VideoIter(*mut AVInputFormat); + +impl Iterator for VideoIter { + type Item = Format; + + fn next(&mut self) -> Option<::Item> { + unsafe { + let ptr = av_input_video_device_next(self.0); + + if ptr == ptr::null_mut() && self.0 != ptr::null_mut() { + None + } + else { + self.0 = ptr; + + Some(Format::Input(format::Input::wrap(ptr))) + } + } + } +} + +pub fn video() -> VideoIter { + VideoIter(ptr::null_mut()) +} diff --git a/src/device/mod.rs b/src/device/mod.rs new file mode 100644 index 0000000..a076769 --- /dev/null +++ b/src/device/mod.rs @@ -0,0 +1,56 @@ +pub mod input; +pub mod output; + +use std::ffi::CStr; +use std::str::from_utf8_unchecked; +use std::marker::PhantomData; + +use ffi::*; + +pub struct Info<'a> { + ptr: *mut AVDeviceInfo, + + _marker: PhantomData<&'a i32>, +} + +impl<'a> Info<'a> { + pub fn wrap(ptr: *mut AVDeviceInfo) -> Self { + Info { ptr: ptr, _marker: PhantomData } + } + + pub fn name(&self) -> &'a str { + unsafe { + from_utf8_unchecked(CStr::from_ptr((*self.ptr).device_name).to_bytes()) + } + } + + pub fn description(&self) -> &'a str { + unsafe { + from_utf8_unchecked(CStr::from_ptr((*self.ptr).device_description).to_bytes()) + } + } +} + +pub fn register_all() { + unsafe { + avdevice_register_all(); + } +} + +pub fn version() -> u32 { + unsafe { + avdevice_version() + } +} + +pub fn configuration() -> &'static str { + unsafe { + from_utf8_unchecked(CStr::from_ptr(avdevice_configuration()).to_bytes()) + } +} + +pub fn license() -> &'static str { + unsafe { + from_utf8_unchecked(CStr::from_ptr(avdevice_license()).to_bytes()) + } +} diff --git a/src/device/output.rs b/src/device/output.rs new file mode 100644 index 0000000..029caab --- /dev/null +++ b/src/device/output.rs @@ -0,0 +1,51 @@ +use std::ptr; + +use ffi::*; +use ::format; +use ::Format; + +pub struct AudioIter(*mut AVOutputFormat); + +impl Iterator for AudioIter { + type Item = Format; + + fn next(&mut self) -> Option<::Item> { + unsafe { + let ptr = av_output_audio_device_next(self.0); + + if ptr == ptr::null_mut() && self.0 != ptr::null_mut() { + None + } + else { + Some(Format::Output(format::Output::wrap(ptr))) + } + } + } +} + +pub fn audio() -> AudioIter { + AudioIter(ptr::null_mut()) +} + +pub struct VideoIter(*mut AVOutputFormat); + +impl Iterator for VideoIter { + type Item = Format; + + fn next(&mut self) -> Option<::Item> { + unsafe { + let ptr = av_output_video_device_next(self.0); + + if ptr == ptr::null_mut() && self.0 != ptr::null_mut() { + None + } + else { + Some(Format::Output(format::Output::wrap(ptr))) + } + } + } +} + +pub fn video() -> VideoIter { + VideoIter(ptr::null_mut()) +} diff --git a/src/lib.rs b/src/lib.rs index caa3eca..10a0a64 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -25,3 +25,5 @@ pub use codec::discard::Discard; pub use codec::codec::Codec; pub use codec::encoder::{self, Encode}; pub use codec::decoder::{self, Decode}; + +pub mod device;