video: Generate VideoBufferFlags and add a extension trait for setting/getting them on buffers

This commit is contained in:
Sebastian Dröge 2019-07-16 11:30:57 +03:00
parent 36b0cafc5e
commit e3282c27f1
5 changed files with 88 additions and 1 deletions

View file

@ -39,6 +39,7 @@ generate = [
"GstVideo.VideoCaptionType", "GstVideo.VideoCaptionType",
"GstVideo.VideoBufferPool", "GstVideo.VideoBufferPool",
"GstVideo.VideoPackFlags", "GstVideo.VideoPackFlags",
"GstVideo.VideoBufferFlags",
] ]
manual = [ manual = [

View file

@ -12,6 +12,61 @@ use glib::Type;
use gobject_sys; use gobject_sys;
use gst_video_sys; use gst_video_sys;
bitflags! {
pub struct VideoBufferFlags: u32 {
const INTERLACED = 1048576;
const TFF = 2097152;
const RFF = 4194304;
const ONEFIELD = 8388608;
const MULTIPLE_VIEW = 16777216;
const FIRST_IN_BUNDLE = 33554432;
const TOP_FIELD = 10485760;
const BOTTOM_FIELD = 8388608;
const LAST = 268435456;
}
}
#[doc(hidden)]
impl ToGlib for VideoBufferFlags {
type GlibType = gst_video_sys::GstVideoBufferFlags;
fn to_glib(&self) -> gst_video_sys::GstVideoBufferFlags {
self.bits()
}
}
#[doc(hidden)]
impl FromGlib<gst_video_sys::GstVideoBufferFlags> for VideoBufferFlags {
fn from_glib(value: gst_video_sys::GstVideoBufferFlags) -> VideoBufferFlags {
skip_assert_initialized!();
VideoBufferFlags::from_bits_truncate(value)
}
}
impl StaticType for VideoBufferFlags {
fn static_type() -> Type {
unsafe { from_glib(gst_video_sys::gst_video_buffer_flags_get_type()) }
}
}
impl<'a> FromValueOptional<'a> for VideoBufferFlags {
unsafe fn from_value_optional(value: &Value) -> Option<Self> {
Some(FromValue::from_value(value))
}
}
impl<'a> FromValue<'a> for VideoBufferFlags {
unsafe fn from_value(value: &Value) -> Self {
from_glib(gobject_sys::g_value_get_flags(value.to_glib_none().0))
}
}
impl SetValue for VideoBufferFlags {
unsafe fn set_value(value: &mut Value, this: &Self) {
gobject_sys::g_value_set_flags(value.to_glib_none_mut().0, this.to_glib())
}
}
bitflags! { bitflags! {
pub struct VideoChromaSite: u32 { pub struct VideoChromaSite: u32 {
const UNKNOWN = 0; const UNKNOWN = 0;

View file

@ -35,6 +35,7 @@ pub use self::enums::VideoTileMode;
pub use self::enums::VideoTransferFunction; pub use self::enums::VideoTransferFunction;
mod flags; mod flags;
pub use self::flags::VideoBufferFlags;
pub use self::flags::VideoChromaSite; pub use self::flags::VideoChromaSite;
pub use self::flags::VideoCodecFrameFlags; pub use self::flags::VideoCodecFrameFlags;
pub use self::flags::VideoFlags; pub use self::flags::VideoFlags;

View file

@ -50,7 +50,7 @@ pub use video_format_info::*;
mod video_info; mod video_info;
pub use video_info::*; pub use video_info::*;
pub mod video_frame; pub mod video_frame;
pub use video_frame::{VideoFrame, VideoFrameRef}; pub use video_frame::{VideoBufferExt, VideoFrame, VideoFrameRef};
mod video_overlay; mod video_overlay;
pub use video_overlay::*; pub use video_overlay::*;
mod video_event; mod video_event;
@ -96,6 +96,7 @@ pub mod prelude {
pub use video_buffer_pool::VideoBufferPoolConfig; pub use video_buffer_pool::VideoBufferPoolConfig;
pub use video_decoder::VideoDecoderExtManual; pub use video_decoder::VideoDecoderExtManual;
pub use video_encoder::VideoEncoderExtManual; pub use video_encoder::VideoEncoderExtManual;
pub use video_frame::VideoBufferExt;
pub use video_overlay::VideoOverlayExtManual; pub use video_overlay::VideoOverlayExtManual;
} }

View file

@ -673,6 +673,35 @@ impl<T> Drop for VideoFrameRef<T> {
} }
} }
pub trait VideoBufferExt {
fn get_video_flags(&self) -> ::VideoBufferFlags;
fn set_video_flags(&mut self, flags: ::VideoBufferFlags);
fn unset_video_flags(&mut self, flags: ::VideoBufferFlags);
}
impl VideoBufferExt for gst::BufferRef {
fn get_video_flags(&self) -> ::VideoBufferFlags {
unsafe {
let ptr = self.as_mut_ptr();
::VideoBufferFlags::from_bits_truncate((*ptr).mini_object.flags)
}
}
fn set_video_flags(&mut self, flags: ::VideoBufferFlags) {
unsafe {
let ptr = self.as_mut_ptr();
(*ptr).mini_object.flags |= flags.bits();
}
}
fn unset_video_flags(&mut self, flags: ::VideoBufferFlags) {
unsafe {
let ptr = self.as_mut_ptr();
(*ptr).mini_object.flags &= !flags.bits();
}
}
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use super::*; use super::*;