mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer-rs.git
synced 2025-06-05 15:09:00 +00:00
gstreamer: Add some API to calculate the next state convert state changes into their component states and back
This commit is contained in:
parent
fdf56b1235
commit
774281a0c9
1 changed files with 54 additions and 0 deletions
|
@ -12,6 +12,8 @@ use std::{cmp, ops};
|
||||||
use ClockReturn;
|
use ClockReturn;
|
||||||
use FlowReturn;
|
use FlowReturn;
|
||||||
use PadLinkReturn;
|
use PadLinkReturn;
|
||||||
|
use State;
|
||||||
|
use StateChange;
|
||||||
use StateChangeReturn;
|
use StateChangeReturn;
|
||||||
|
|
||||||
use glib::translate::*;
|
use glib::translate::*;
|
||||||
|
@ -679,3 +681,55 @@ impl SetValue for MessageType {
|
||||||
gobject_sys::g_value_set_flags(value.to_glib_none_mut().0, this.to_glib())
|
gobject_sys::g_value_set_flags(value.to_glib_none_mut().0, this.to_glib())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl State {
|
||||||
|
pub fn next(self, pending: Self) -> Self {
|
||||||
|
let current = self.to_glib();
|
||||||
|
let pending = pending.to_glib();
|
||||||
|
|
||||||
|
let sign = (pending - current).signum();
|
||||||
|
|
||||||
|
from_glib(current + sign)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl StateChange {
|
||||||
|
pub fn new(current: State, next: State) -> Self {
|
||||||
|
skip_assert_initialized!();
|
||||||
|
let current = current.to_glib();
|
||||||
|
let next = next.to_glib();
|
||||||
|
from_glib((current << 3) | next)
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn current(self) -> State {
|
||||||
|
match self {
|
||||||
|
StateChange::NullToReady => State::Null,
|
||||||
|
StateChange::ReadyToPaused => State::Ready,
|
||||||
|
StateChange::PausedToPlaying => State::Paused,
|
||||||
|
StateChange::PlayingToPaused => State::Playing,
|
||||||
|
StateChange::PausedToReady => State::Paused,
|
||||||
|
StateChange::ReadyToNull => State::Ready,
|
||||||
|
StateChange::NullToNull => State::Null,
|
||||||
|
StateChange::ReadyToReady => State::Ready,
|
||||||
|
StateChange::PausedToPaused => State::Paused,
|
||||||
|
StateChange::PlayingToPlaying => State::Playing,
|
||||||
|
StateChange::__Unknown(value) => State::__Unknown(value >> 3),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn next(self) -> State {
|
||||||
|
match self {
|
||||||
|
StateChange::NullToReady => State::Ready,
|
||||||
|
StateChange::ReadyToPaused => State::Paused,
|
||||||
|
StateChange::PausedToPlaying => State::Playing,
|
||||||
|
StateChange::PlayingToPaused => State::Paused,
|
||||||
|
StateChange::PausedToReady => State::Ready,
|
||||||
|
StateChange::ReadyToNull => State::Null,
|
||||||
|
StateChange::NullToNull => State::Null,
|
||||||
|
StateChange::ReadyToReady => State::Ready,
|
||||||
|
StateChange::PausedToPaused => State::Paused,
|
||||||
|
StateChange::PlayingToPlaying => State::Playing,
|
||||||
|
StateChange::__Unknown(value) => State::__Unknown(value & 0x7),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue