mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer-rs.git
synced 2024-11-29 04:51:09 +00:00
Implement some functions on EventType and implement PartialOrd for serialized events
This commit is contained in:
parent
bc991708e5
commit
ec900d7e3f
1 changed files with 66 additions and 5 deletions
|
@ -12,6 +12,7 @@ use structure::*;
|
||||||
|
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
|
use std::cmp;
|
||||||
use std::ffi::CStr;
|
use std::ffi::CStr;
|
||||||
|
|
||||||
use glib;
|
use glib;
|
||||||
|
@ -21,6 +22,8 @@ use glib::translate::{from_glib, from_glib_full, from_glib_none, ToGlib, ToGlibP
|
||||||
#[cfg(any(feature = "v1_10", feature = "dox"))]
|
#[cfg(any(feature = "v1_10", feature = "dox"))]
|
||||||
use glib::translate::FromGlibPtrContainer;
|
use glib::translate::FromGlibPtrContainer;
|
||||||
|
|
||||||
|
use EventType;
|
||||||
|
|
||||||
#[repr(C)]
|
#[repr(C)]
|
||||||
pub struct EventRef(ffi::GstEvent);
|
pub struct EventRef(ffi::GstEvent);
|
||||||
|
|
||||||
|
@ -33,6 +36,60 @@ unsafe impl MiniObject for EventRef {
|
||||||
type GstType = ffi::GstEvent;
|
type GstType = ffi::GstEvent;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl EventType {
|
||||||
|
pub fn is_upstream(&self) -> bool {
|
||||||
|
(self.to_glib() as u32) & (ffi::GST_EVENT_TYPE_UPSTREAM.bits()) != 0
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_downstream(&self) -> bool {
|
||||||
|
(self.to_glib() as u32) & (ffi::GST_EVENT_TYPE_DOWNSTREAM.bits()) != 0
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_serialized(&self) -> bool {
|
||||||
|
(self.to_glib() as u32) & (ffi::GST_EVENT_TYPE_SERIALIZED.bits()) != 0
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_sticky(&self) -> bool {
|
||||||
|
(self.to_glib() as u32) & (ffi::GST_EVENT_TYPE_STICKY.bits()) != 0
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn is_sticky_multi(&self) -> bool {
|
||||||
|
(self.to_glib() as u32) & (ffi::GST_EVENT_TYPE_STICKY_MULTI.bits()) != 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl PartialOrd for EventType {
|
||||||
|
fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
|
||||||
|
if !self.is_serialized() || !other.is_serialized() {
|
||||||
|
return None;
|
||||||
|
}
|
||||||
|
|
||||||
|
let v1 = self.to_glib() as u32;
|
||||||
|
let v2 = other.to_glib() as u32;
|
||||||
|
|
||||||
|
let stream_start = ffi::GST_EVENT_STREAM_START as u32;
|
||||||
|
let segment = ffi::GST_EVENT_SEGMENT as u32;
|
||||||
|
let eos = ffi::GST_EVENT_EOS as u32;
|
||||||
|
|
||||||
|
// Strictly ordered range between stream_start and segment,
|
||||||
|
// and EOS is bigger than everything else
|
||||||
|
if v1 >= stream_start && v1 <= segment || v2 >= stream_start && v2 <= segment {
|
||||||
|
Some(v1.cmp(&v2))
|
||||||
|
// If one is EOS, the other is definitely less or equal
|
||||||
|
} else if v1 == eos || v2 == eos {
|
||||||
|
if v1 == v2 {
|
||||||
|
Some(cmp::Ordering::Equal)
|
||||||
|
} else if v1 == eos {
|
||||||
|
Some(cmp::Ordering::Greater)
|
||||||
|
} else {
|
||||||
|
Some(cmp::Ordering::Less)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl EventRef {
|
impl EventRef {
|
||||||
pub fn get_seqnum(&self) -> u32 {
|
pub fn get_seqnum(&self) -> u32 {
|
||||||
unsafe { ffi::gst_event_get_seqnum(self.as_mut_ptr()) }
|
unsafe { ffi::gst_event_get_seqnum(self.as_mut_ptr()) }
|
||||||
|
@ -51,23 +108,27 @@ impl EventRef {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_upstream(&self) -> bool {
|
pub fn is_upstream(&self) -> bool {
|
||||||
unsafe { ((*self.as_ptr()).type_ as u32) & (ffi::GST_EVENT_TYPE_UPSTREAM.bits()) != 0 }
|
self.get_type().is_upstream()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_downstream(&self) -> bool {
|
pub fn is_downstream(&self) -> bool {
|
||||||
unsafe { ((*self.as_ptr()).type_ as u32) & (ffi::GST_EVENT_TYPE_DOWNSTREAM.bits()) != 0 }
|
self.get_type().is_downstream()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_serialized(&self) -> bool {
|
pub fn is_serialized(&self) -> bool {
|
||||||
unsafe { ((*self.as_ptr()).type_ as u32) & (ffi::GST_EVENT_TYPE_SERIALIZED.bits()) != 0 }
|
self.get_type().is_serialized()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_sticky(&self) -> bool {
|
pub fn is_sticky(&self) -> bool {
|
||||||
unsafe { ((*self.as_ptr()).type_ as u32) & (ffi::GST_EVENT_TYPE_STICKY.bits()) != 0 }
|
self.get_type().is_sticky()
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn is_sticky_multi(&self) -> bool {
|
pub fn is_sticky_multi(&self) -> bool {
|
||||||
unsafe { ((*self.as_ptr()).type_ as u32) & (ffi::GST_EVENT_TYPE_STICKY_MULTI.bits()) != 0 }
|
self.get_type().is_sticky_multi()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_type(&self) -> EventType {
|
||||||
|
unsafe { from_glib((*self.as_ptr()).type_) }
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn view(&self) -> EventView {
|
pub fn view(&self) -> EventView {
|
||||||
|
|
Loading…
Reference in a new issue