mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer-rs.git
synced 2025-01-03 05:48:43 +00:00
audio: manually order AudioFormat and AudioFormatInfo
This commit is contained in:
parent
59cfdc5e1a
commit
a6faa83908
4 changed files with 86 additions and 1 deletions
|
@ -65,6 +65,9 @@ conversion_type = "scalar"
|
||||||
name = "GstAudio.AudioFormat"
|
name = "GstAudio.AudioFormat"
|
||||||
status = "generate"
|
status = "generate"
|
||||||
|
|
||||||
|
[[object.derive]]
|
||||||
|
name = "Debug, Eq, PartialEq, Hash"
|
||||||
|
|
||||||
[[object.member]]
|
[[object.member]]
|
||||||
name = "s16"
|
name = "s16"
|
||||||
# Platform dependant
|
# Platform dependant
|
||||||
|
|
|
@ -124,6 +124,18 @@ impl fmt::Display for ::AudioFormat {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl PartialOrd for ::AudioFormat {
|
||||||
|
fn partial_cmp(&self, other: &::AudioFormat) -> Option<std::cmp::Ordering> {
|
||||||
|
::AudioFormatInfo::from_format(*self).partial_cmp(&::AudioFormatInfo::from_format(*other))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Ord for ::AudioFormat {
|
||||||
|
fn cmp(&self, other: &::AudioFormat) -> std::cmp::Ordering {
|
||||||
|
::AudioFormatInfo::from_format(*self).cmp(&::AudioFormatInfo::from_format(*other))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pub const AUDIO_FORMAT_UNKNOWN: ::AudioFormat = ::AudioFormat::Unknown;
|
pub const AUDIO_FORMAT_UNKNOWN: ::AudioFormat = ::AudioFormat::Unknown;
|
||||||
pub const AUDIO_FORMAT_ENCODED: ::AudioFormat = ::AudioFormat::Encoded;
|
pub const AUDIO_FORMAT_ENCODED: ::AudioFormat = ::AudioFormat::Encoded;
|
||||||
pub const AUDIO_FORMAT_S8: ::AudioFormat = ::AudioFormat::S8;
|
pub const AUDIO_FORMAT_S8: ::AudioFormat = ::AudioFormat::S8;
|
||||||
|
@ -341,4 +353,15 @@ mod tests {
|
||||||
.build();
|
.build();
|
||||||
assert_eq!(caps.to_string(), "audio/x-raw, format=(string){ S16LE, S16BE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string)interleaved");
|
assert_eq!(caps.to_string(), "audio/x-raw, format=(string){ S16LE, S16BE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string)interleaved");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn sort() {
|
||||||
|
gst::init().unwrap();
|
||||||
|
|
||||||
|
assert!(
|
||||||
|
::AudioFormatInfo::from_format(::AudioFormat::F64be)
|
||||||
|
> ::AudioFormatInfo::from_format(::AudioFormat::U8)
|
||||||
|
);
|
||||||
|
assert!(::AudioFormat::S20be > ::AudioFormat::S18be);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,7 @@ use glib_sys;
|
||||||
use gobject_sys;
|
use gobject_sys;
|
||||||
use gst_audio_sys;
|
use gst_audio_sys;
|
||||||
|
|
||||||
|
use std::cmp::Ordering;
|
||||||
use std::ffi::CStr;
|
use std::ffi::CStr;
|
||||||
use std::fmt;
|
use std::fmt;
|
||||||
use std::str;
|
use std::str;
|
||||||
|
@ -218,6 +219,64 @@ impl PartialEq for AudioFormatInfo {
|
||||||
|
|
||||||
impl Eq for AudioFormatInfo {}
|
impl Eq for AudioFormatInfo {}
|
||||||
|
|
||||||
|
impl PartialOrd for AudioFormatInfo {
|
||||||
|
fn partial_cmp(&self, other: &AudioFormatInfo) -> Option<Ordering> {
|
||||||
|
Some(self.cmp(other))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Ord for AudioFormatInfo {
|
||||||
|
// See GST_AUDIO_FORMATS_ALL for the sorting algorithm
|
||||||
|
fn cmp(&self, other: &AudioFormatInfo) -> Ordering {
|
||||||
|
self.depth()
|
||||||
|
.cmp(&other.depth())
|
||||||
|
.then_with(|| self.width().cmp(&other.width()))
|
||||||
|
.then_with(|| {
|
||||||
|
match (
|
||||||
|
self.flags().contains(::AudioFormatFlags::FLOAT),
|
||||||
|
other.flags().contains(::AudioFormatFlags::FLOAT),
|
||||||
|
) {
|
||||||
|
(true, false) => Ordering::Greater,
|
||||||
|
(false, true) => Ordering::Less,
|
||||||
|
_ => Ordering::Equal,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then_with(|| {
|
||||||
|
match (
|
||||||
|
self.flags().contains(::AudioFormatFlags::SIGNED),
|
||||||
|
other.flags().contains(::AudioFormatFlags::SIGNED),
|
||||||
|
) {
|
||||||
|
(true, false) => Ordering::Greater,
|
||||||
|
(false, true) => Ordering::Less,
|
||||||
|
_ => Ordering::Equal,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then_with(|| match (self.endianness(), other.endianness()) {
|
||||||
|
(::AudioEndianness::LittleEndian, ::AudioEndianness::BigEndian) => {
|
||||||
|
#[cfg(target_endian = "little")]
|
||||||
|
{
|
||||||
|
Ordering::Greater
|
||||||
|
}
|
||||||
|
#[cfg(target_endian = "big")]
|
||||||
|
{
|
||||||
|
Ordering::Less
|
||||||
|
}
|
||||||
|
}
|
||||||
|
(::AudioEndianness::BigEndian, ::AudioEndianness::LittleEndian) => {
|
||||||
|
#[cfg(target_endian = "little")]
|
||||||
|
{
|
||||||
|
Ordering::Less
|
||||||
|
}
|
||||||
|
#[cfg(target_endian = "big")]
|
||||||
|
{
|
||||||
|
Ordering::Greater
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => Ordering::Equal,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl fmt::Debug for AudioFormatInfo {
|
impl fmt::Debug for AudioFormatInfo {
|
||||||
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
|
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
|
||||||
f.debug_struct("AudioFormatInfo")
|
f.debug_struct("AudioFormatInfo")
|
||||||
|
|
|
@ -193,7 +193,7 @@ impl SetValue for AudioChannelPosition {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Eq, PartialEq, Ord, PartialOrd, Hash, Clone, Copy)]
|
#[derive(Debug, Eq, PartialEq, Hash, Clone, Copy)]
|
||||||
#[non_exhaustive]
|
#[non_exhaustive]
|
||||||
pub enum AudioFormat {
|
pub enum AudioFormat {
|
||||||
Unknown,
|
Unknown,
|
||||||
|
|
Loading…
Reference in a new issue