From a0dae25b94237f54ca30aadb95ed8b9ce3cf6104 Mon Sep 17 00:00:00 2001 From: meh Date: Sat, 16 May 2015 19:18:26 +0200 Subject: [PATCH] codec/threading: add threading configuration --- src/codec/context.rs | 21 ++++++++++++++- src/codec/mod.rs | 2 ++ src/codec/threading.rs | 61 ++++++++++++++++++++++++++++++++++++++++++ src/lib.rs | 2 ++ 4 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 src/codec/threading.rs diff --git a/src/codec/context.rs b/src/codec/context.rs index 3114006..c938e1e 100644 --- a/src/codec/context.rs +++ b/src/codec/context.rs @@ -1,10 +1,11 @@ use std::ops::Deref; use std::ptr; +use libc::c_int; use ffi::*; use ::media; use ::{Error, Codec, Dictionary}; -use super::{Id, Debug, Compliance}; +use super::{Id, Debug, Compliance, threading}; use super::decoder::Decoder; use super::encoder::Encoder; @@ -107,6 +108,24 @@ impl Context { (*self.ptr).debug = value.bits(); } } + + pub fn set_threading(&mut self, config: threading::Config) { + unsafe { + (*self.ptr).thread_type = config.kind.into(); + (*self.ptr).thread_count = config.count as c_int; + (*self.ptr).thread_safe_callbacks = if config.safe { 1 } else { 0 }; + } + } + + pub fn threading(&self) -> threading::Config { + unsafe { + threading::Config { + kind: threading::Type::from((*self.ptr).active_thread_type), + count: (*self.ptr).thread_count as usize, + safe: (*self.ptr).thread_safe_callbacks != 0, + } + } + } } impl Drop for Context { diff --git a/src/codec/mod.rs b/src/codec/mod.rs index f9746ce..56adc28 100644 --- a/src/codec/mod.rs +++ b/src/codec/mod.rs @@ -26,6 +26,8 @@ pub use self::debug::*; pub mod profile; pub use self::profile::Profile; +pub mod threading; + pub mod encoder; pub mod decoder; diff --git a/src/codec/threading.rs b/src/codec/threading.rs new file mode 100644 index 0000000..d7e01ed --- /dev/null +++ b/src/codec/threading.rs @@ -0,0 +1,61 @@ +use libc::c_int; +use ffi::*; + +#[derive(Eq, PartialEq, Clone, Copy, Debug)] +pub struct Config { + pub kind: Type, + pub count: usize, + pub safe: bool, +} + +impl Config { + pub fn kind(value: Type) -> Self { + Config { kind: value, .. Default::default() } + } + + pub fn count(value: usize) -> Self { + Config { count: value, .. Default::default() } + } + + pub fn safe(value: bool) -> Self { + Config { safe: value, .. Default::default() } + } +} + +impl Default for Config { + fn default() -> Self { + Config { + kind: Type::None, + count: 0, + safe: false, + } + } +} + +#[derive(Eq, PartialEq, Clone, Copy, Debug)] +pub enum Type { + None, + Frame, + Slice, +} + +impl From for Type { + fn from(value: c_int) -> Type { + match value { + FF_THREAD_FRAME => Type::Frame, + FF_THREAD_SLICE => Type::Slice, + + _ => Type::None, + } + } +} + +impl Into for Type { + fn into(self) -> c_int { + match self { + Type::None => 0, + Type::Frame => FF_THREAD_FRAME, + Type::Slice => FF_THREAD_SLICE + } + } +} diff --git a/src/lib.rs b/src/lib.rs index 113bf83..da12899 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -40,6 +40,8 @@ pub use codec::{decoder, encoder}; pub use codec::field_order::FieldOrder; #[cfg(feature = "codec")] pub use codec::audio_service::AudioService; +#[cfg(feature = "codec")] +pub use codec::threading; #[cfg(feature = "device")] pub mod device;