mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer-rs.git
synced 2024-11-22 09:31:06 +00:00
gstreamer: Add a MessageViewMut for mutable message access
This isn't very generally useful, but there are special cases where accessing the structure, or adding details is handy. Fixes: https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/issues/474 Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/merge_requests/1448>
This commit is contained in:
parent
d16b28fc2f
commit
6035bffbab
2 changed files with 128 additions and 2 deletions
|
@ -86,7 +86,7 @@ mod value_serde;
|
||||||
mod flag_serde;
|
mod flag_serde;
|
||||||
|
|
||||||
pub mod message;
|
pub mod message;
|
||||||
pub use crate::message::{Message, MessageErrorDomain, MessageRef, MessageView};
|
pub use crate::message::{Message, MessageErrorDomain, MessageRef, MessageView, MessageViewMut};
|
||||||
|
|
||||||
pub mod structure;
|
pub mod structure;
|
||||||
pub use crate::structure::{Structure, StructureRef};
|
pub use crate::structure::{Structure, StructureRef};
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
// Take a look at the license at the top of the repository in the LICENSE file.
|
// Take a look at the license at the top of the repository in the LICENSE file.
|
||||||
|
|
||||||
use std::{borrow::Borrow, ffi::CStr, fmt, mem, num::NonZeroU32, ops::Deref, ptr};
|
use std::{borrow::Borrow, ffi::CStr, fmt, mem, num::NonZeroU32, ops::Deref, ops::DerefMut, ptr};
|
||||||
|
|
||||||
use glib::{
|
use glib::{
|
||||||
translate::*,
|
translate::*,
|
||||||
|
@ -173,6 +173,57 @@ impl MessageRef {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn view_mut(&mut self) -> MessageViewMut {
|
||||||
|
unsafe {
|
||||||
|
let type_ = (*self.as_ptr()).type_;
|
||||||
|
|
||||||
|
match type_ {
|
||||||
|
ffi::GST_MESSAGE_EOS => Eos::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_ERROR => Error::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_WARNING => Warning::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_INFO => Info::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_TAG => Tag::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_BUFFERING => Buffering::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_STATE_CHANGED => StateChanged::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_STATE_DIRTY => StateDirty::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_STEP_DONE => StepDone::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_CLOCK_PROVIDE => ClockProvide::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_CLOCK_LOST => ClockLost::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_NEW_CLOCK => NewClock::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_STRUCTURE_CHANGE => StructureChange::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_STREAM_STATUS => StreamStatus::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_APPLICATION => Application::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_ELEMENT => Element::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_SEGMENT_START => SegmentStart::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_SEGMENT_DONE => SegmentDone::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_DURATION_CHANGED => DurationChanged::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_LATENCY => Latency::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_ASYNC_START => AsyncStart::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_ASYNC_DONE => AsyncDone::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_REQUEST_STATE => RequestState::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_STEP_START => StepStart::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_QOS => Qos::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_PROGRESS => Progress::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_TOC => Toc::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_RESET_TIME => ResetTime::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_STREAM_START => StreamStart::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_NEED_CONTEXT => NeedContext::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_HAVE_CONTEXT => HaveContext::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_DEVICE_ADDED => DeviceAdded::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_DEVICE_REMOVED => DeviceRemoved::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_REDIRECT => Redirect::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_PROPERTY_NOTIFY => PropertyNotify::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_STREAM_COLLECTION => StreamCollection::view_mut(self),
|
||||||
|
ffi::GST_MESSAGE_STREAMS_SELECTED => StreamsSelected::view_mut(self),
|
||||||
|
#[cfg(feature = "v1_16")]
|
||||||
|
ffi::GST_MESSAGE_DEVICE_CHANGED => DeviceChanged::view_mut(self),
|
||||||
|
#[cfg(feature = "v1_18")]
|
||||||
|
ffi::GST_MESSAGE_INSTANT_RATE_REQUEST => InstantRateRequest::view_mut(self),
|
||||||
|
_ => MessageViewMut::Other,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[doc(alias = "get_type")]
|
#[doc(alias = "get_type")]
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn type_(&self) -> MessageType {
|
pub fn type_(&self) -> MessageType {
|
||||||
|
@ -269,6 +320,55 @@ pub enum MessageView<'a> {
|
||||||
Other,
|
Other,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
#[non_exhaustive]
|
||||||
|
pub enum MessageViewMut<'a> {
|
||||||
|
Eos(&'a mut Eos),
|
||||||
|
Error(&'a mut Error),
|
||||||
|
Warning(&'a mut Warning),
|
||||||
|
Info(&'a mut Info),
|
||||||
|
Tag(&'a mut Tag),
|
||||||
|
Buffering(&'a mut Buffering),
|
||||||
|
StateChanged(&'a mut StateChanged),
|
||||||
|
StateDirty(&'a mut StateDirty),
|
||||||
|
StepDone(&'a mut StepDone),
|
||||||
|
ClockProvide(&'a mut ClockProvide),
|
||||||
|
ClockLost(&'a mut ClockLost),
|
||||||
|
NewClock(&'a mut NewClock),
|
||||||
|
StructureChange(&'a mut StructureChange),
|
||||||
|
StreamStatus(&'a mut StreamStatus),
|
||||||
|
Application(&'a mut Application),
|
||||||
|
Element(&'a mut Element),
|
||||||
|
SegmentStart(&'a mut SegmentStart),
|
||||||
|
SegmentDone(&'a mut SegmentDone),
|
||||||
|
DurationChanged(&'a mut DurationChanged),
|
||||||
|
Latency(&'a mut Latency),
|
||||||
|
AsyncStart(&'a mut AsyncStart),
|
||||||
|
AsyncDone(&'a mut AsyncDone),
|
||||||
|
RequestState(&'a mut RequestState),
|
||||||
|
StepStart(&'a mut StepStart),
|
||||||
|
Qos(&'a mut Qos),
|
||||||
|
Progress(&'a mut Progress),
|
||||||
|
Toc(&'a mut Toc),
|
||||||
|
ResetTime(&'a mut ResetTime),
|
||||||
|
StreamStart(&'a mut StreamStart),
|
||||||
|
NeedContext(&'a mut NeedContext),
|
||||||
|
HaveContext(&'a mut HaveContext),
|
||||||
|
DeviceAdded(&'a mut DeviceAdded),
|
||||||
|
DeviceRemoved(&'a mut DeviceRemoved),
|
||||||
|
PropertyNotify(&'a mut PropertyNotify),
|
||||||
|
StreamCollection(&'a mut StreamCollection),
|
||||||
|
StreamsSelected(&'a mut StreamsSelected),
|
||||||
|
Redirect(&'a mut Redirect),
|
||||||
|
#[cfg(feature = "v1_16")]
|
||||||
|
#[cfg_attr(docsrs, doc(cfg(feature = "v1_16")))]
|
||||||
|
DeviceChanged(&'a mut DeviceChanged),
|
||||||
|
#[cfg(feature = "v1_18")]
|
||||||
|
#[cfg_attr(docsrs, doc(cfg(feature = "v1_18")))]
|
||||||
|
InstantRateRequest(&'a mut InstantRateRequest),
|
||||||
|
Other,
|
||||||
|
}
|
||||||
|
|
||||||
macro_rules! declare_concrete_message(
|
macro_rules! declare_concrete_message(
|
||||||
($name:ident, $param:ident) => {
|
($name:ident, $param:ident) => {
|
||||||
#[repr(transparent)]
|
#[repr(transparent)]
|
||||||
|
@ -280,11 +380,22 @@ macro_rules! declare_concrete_message(
|
||||||
unsafe { &*(self as *const Self as *const MessageRef) }
|
unsafe { &*(self as *const Self as *const MessageRef) }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
pub fn message_mut(&mut self) -> &mut MessageRef {
|
||||||
|
unsafe { &mut *(self as *mut Self as *mut MessageRef) }
|
||||||
|
}
|
||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
unsafe fn view(message: &MessageRef) -> MessageView<'_> {
|
unsafe fn view(message: &MessageRef) -> MessageView<'_> {
|
||||||
let message = &*(message as *const MessageRef as *const Self);
|
let message = &*(message as *const MessageRef as *const Self);
|
||||||
MessageView::$name(message)
|
MessageView::$name(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[inline]
|
||||||
|
unsafe fn view_mut(message: &mut MessageRef) -> MessageViewMut<'_> {
|
||||||
|
let message = &mut *(message as *mut MessageRef as *mut Self);
|
||||||
|
MessageViewMut::$name(message)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Deref for $name {
|
impl Deref for $name {
|
||||||
|
@ -298,6 +409,13 @@ macro_rules! declare_concrete_message(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl DerefMut for $name {
|
||||||
|
#[inline]
|
||||||
|
fn deref_mut(&mut self) -> &mut Self::Target {
|
||||||
|
self.message_mut()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl ToOwned for $name {
|
impl ToOwned for $name {
|
||||||
type Owned = $name<Message>;
|
type Owned = $name<Message>;
|
||||||
|
|
||||||
|
@ -325,6 +443,14 @@ macro_rules! declare_concrete_message(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl DerefMut for $name<Message> {
|
||||||
|
#[inline]
|
||||||
|
fn deref_mut(&mut self) -> &mut Self::Target {
|
||||||
|
debug_assert!(self.0.is_writable());
|
||||||
|
unsafe { &mut *(self.0.as_mut_ptr() as *mut Self::Target) }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl Borrow<$name> for $name<Message> {
|
impl Borrow<$name> for $name<Message> {
|
||||||
#[inline]
|
#[inline]
|
||||||
fn borrow(&self) -> &$name {
|
fn borrow(&self) -> &$name {
|
||||||
|
|
Loading…
Reference in a new issue