mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer-rs.git
synced 2024-11-22 17:41:05 +00:00
video: Fix ordering of video formats according to latest libgstvideo
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer-rs/-/merge_requests/1310>
This commit is contained in:
parent
72a5b1bdb9
commit
635b31614c
2 changed files with 91 additions and 93 deletions
|
@ -39,13 +39,13 @@ pub static VIDEO_FORMATS_ALL: Lazy<Box<[crate::VideoFormat]>> = Lazy::new(|| {
|
||||||
#[cfg(feature = "v1_16")]
|
#[cfg(feature = "v1_16")]
|
||||||
crate::VideoFormat::Y410,
|
crate::VideoFormat::Y410,
|
||||||
crate::VideoFormat::Gbra,
|
crate::VideoFormat::Gbra,
|
||||||
crate::VideoFormat::Abgr,
|
crate::VideoFormat::Ayuv,
|
||||||
#[cfg(feature = "v1_16")]
|
#[cfg(feature = "v1_16")]
|
||||||
crate::VideoFormat::Vuya,
|
crate::VideoFormat::Vuya,
|
||||||
crate::VideoFormat::Bgra,
|
|
||||||
crate::VideoFormat::Ayuv,
|
|
||||||
crate::VideoFormat::Argb,
|
|
||||||
crate::VideoFormat::Rgba,
|
crate::VideoFormat::Rgba,
|
||||||
|
crate::VideoFormat::Argb,
|
||||||
|
crate::VideoFormat::Bgra,
|
||||||
|
crate::VideoFormat::Abgr,
|
||||||
crate::VideoFormat::A420,
|
crate::VideoFormat::A420,
|
||||||
crate::VideoFormat::V216,
|
crate::VideoFormat::V216,
|
||||||
crate::VideoFormat::Y44412le,
|
crate::VideoFormat::Y44412le,
|
||||||
|
@ -66,46 +66,46 @@ pub static VIDEO_FORMATS_ALL: Lazy<Box<[crate::VideoFormat]>> = Lazy::new(|| {
|
||||||
crate::VideoFormat::Nv1610le32,
|
crate::VideoFormat::Nv1610le32,
|
||||||
#[cfg(feature = "v1_16")]
|
#[cfg(feature = "v1_16")]
|
||||||
crate::VideoFormat::Y210,
|
crate::VideoFormat::Y210,
|
||||||
crate::VideoFormat::V210,
|
|
||||||
crate::VideoFormat::Uyvp,
|
crate::VideoFormat::Uyvp,
|
||||||
|
crate::VideoFormat::V210,
|
||||||
crate::VideoFormat::I42010le,
|
crate::VideoFormat::I42010le,
|
||||||
crate::VideoFormat::I42010be,
|
crate::VideoFormat::I42010be,
|
||||||
crate::VideoFormat::P01010le,
|
crate::VideoFormat::P01010le,
|
||||||
crate::VideoFormat::Nv1210le32,
|
|
||||||
#[cfg(feature = "v1_16")]
|
#[cfg(feature = "v1_16")]
|
||||||
crate::VideoFormat::Nv1210le40,
|
crate::VideoFormat::Nv1210le40,
|
||||||
|
crate::VideoFormat::Nv1210le32,
|
||||||
crate::VideoFormat::P01010be,
|
crate::VideoFormat::P01010be,
|
||||||
crate::VideoFormat::Y444,
|
crate::VideoFormat::Y444,
|
||||||
crate::VideoFormat::Gbr,
|
crate::VideoFormat::Gbr,
|
||||||
crate::VideoFormat::Nv24,
|
crate::VideoFormat::Nv24,
|
||||||
crate::VideoFormat::Xbgr,
|
|
||||||
crate::VideoFormat::Bgrx,
|
|
||||||
crate::VideoFormat::Xrgb,
|
|
||||||
crate::VideoFormat::Rgbx,
|
|
||||||
crate::VideoFormat::Bgr,
|
|
||||||
crate::VideoFormat::Iyu2,
|
|
||||||
crate::VideoFormat::V308,
|
crate::VideoFormat::V308,
|
||||||
|
crate::VideoFormat::Iyu2,
|
||||||
|
crate::VideoFormat::Rgbx,
|
||||||
|
crate::VideoFormat::Xrgb,
|
||||||
|
crate::VideoFormat::Bgrx,
|
||||||
|
crate::VideoFormat::Xbgr,
|
||||||
crate::VideoFormat::Rgb,
|
crate::VideoFormat::Rgb,
|
||||||
|
crate::VideoFormat::Bgr,
|
||||||
crate::VideoFormat::Y42b,
|
crate::VideoFormat::Y42b,
|
||||||
crate::VideoFormat::Nv61,
|
|
||||||
crate::VideoFormat::Nv16,
|
crate::VideoFormat::Nv16,
|
||||||
crate::VideoFormat::Vyuy,
|
crate::VideoFormat::Nv61,
|
||||||
crate::VideoFormat::Uyvy,
|
|
||||||
crate::VideoFormat::Yvyu,
|
|
||||||
crate::VideoFormat::Yuy2,
|
crate::VideoFormat::Yuy2,
|
||||||
|
crate::VideoFormat::Yvyu,
|
||||||
|
crate::VideoFormat::Uyvy,
|
||||||
|
crate::VideoFormat::Vyuy,
|
||||||
crate::VideoFormat::I420,
|
crate::VideoFormat::I420,
|
||||||
crate::VideoFormat::Yv12,
|
crate::VideoFormat::Yv12,
|
||||||
crate::VideoFormat::Nv21,
|
|
||||||
crate::VideoFormat::Nv12,
|
crate::VideoFormat::Nv12,
|
||||||
|
crate::VideoFormat::Nv21,
|
||||||
crate::VideoFormat::Nv1264z32,
|
crate::VideoFormat::Nv1264z32,
|
||||||
crate::VideoFormat::Y41b,
|
crate::VideoFormat::Y41b,
|
||||||
crate::VideoFormat::Iyu1,
|
crate::VideoFormat::Iyu1,
|
||||||
crate::VideoFormat::Yvu9,
|
|
||||||
crate::VideoFormat::Yuv9,
|
crate::VideoFormat::Yuv9,
|
||||||
crate::VideoFormat::Rgb16,
|
crate::VideoFormat::Yvu9,
|
||||||
crate::VideoFormat::Bgr16,
|
crate::VideoFormat::Bgr16,
|
||||||
crate::VideoFormat::Rgb15,
|
crate::VideoFormat::Rgb16,
|
||||||
crate::VideoFormat::Bgr15,
|
crate::VideoFormat::Bgr15,
|
||||||
|
crate::VideoFormat::Rgb15,
|
||||||
crate::VideoFormat::Rgb8p,
|
crate::VideoFormat::Rgb8p,
|
||||||
crate::VideoFormat::Gray16Le,
|
crate::VideoFormat::Gray16Le,
|
||||||
crate::VideoFormat::Gray16Be,
|
crate::VideoFormat::Gray16Be,
|
||||||
|
@ -129,17 +129,17 @@ pub static VIDEO_FORMATS_ALL: Lazy<Box<[crate::VideoFormat]>> = Lazy::new(|| {
|
||||||
crate::VideoFormat::A42010be,
|
crate::VideoFormat::A42010be,
|
||||||
crate::VideoFormat::A42010le,
|
crate::VideoFormat::A42010le,
|
||||||
#[cfg(feature = "v1_16")]
|
#[cfg(feature = "v1_16")]
|
||||||
crate::VideoFormat::Y410,
|
|
||||||
#[cfg(feature = "v1_16")]
|
|
||||||
crate::VideoFormat::Bgr10a2Le,
|
crate::VideoFormat::Bgr10a2Le,
|
||||||
|
#[cfg(feature = "v1_16")]
|
||||||
|
crate::VideoFormat::Y410,
|
||||||
crate::VideoFormat::Gbra,
|
crate::VideoFormat::Gbra,
|
||||||
crate::VideoFormat::Abgr,
|
crate::VideoFormat::Ayuv,
|
||||||
#[cfg(feature = "v1_16")]
|
#[cfg(feature = "v1_16")]
|
||||||
crate::VideoFormat::Vuya,
|
crate::VideoFormat::Vuya,
|
||||||
crate::VideoFormat::Bgra,
|
|
||||||
crate::VideoFormat::Ayuv,
|
|
||||||
crate::VideoFormat::Argb,
|
|
||||||
crate::VideoFormat::Rgba,
|
crate::VideoFormat::Rgba,
|
||||||
|
crate::VideoFormat::Argb,
|
||||||
|
crate::VideoFormat::Bgra,
|
||||||
|
crate::VideoFormat::Abgr,
|
||||||
crate::VideoFormat::A420,
|
crate::VideoFormat::A420,
|
||||||
crate::VideoFormat::V216,
|
crate::VideoFormat::V216,
|
||||||
crate::VideoFormat::Y44412be,
|
crate::VideoFormat::Y44412be,
|
||||||
|
@ -160,46 +160,46 @@ pub static VIDEO_FORMATS_ALL: Lazy<Box<[crate::VideoFormat]>> = Lazy::new(|| {
|
||||||
crate::VideoFormat::Nv1610le32,
|
crate::VideoFormat::Nv1610le32,
|
||||||
#[cfg(feature = "v1_16")]
|
#[cfg(feature = "v1_16")]
|
||||||
crate::VideoFormat::Y210,
|
crate::VideoFormat::Y210,
|
||||||
crate::VideoFormat::V210,
|
|
||||||
crate::VideoFormat::Uyvp,
|
crate::VideoFormat::Uyvp,
|
||||||
|
crate::VideoFormat::V210,
|
||||||
crate::VideoFormat::I42010be,
|
crate::VideoFormat::I42010be,
|
||||||
crate::VideoFormat::I42010le,
|
crate::VideoFormat::I42010le,
|
||||||
crate::VideoFormat::P01010be,
|
crate::VideoFormat::P01010be,
|
||||||
crate::VideoFormat::P01010le,
|
|
||||||
crate::VideoFormat::Nv1210le32,
|
|
||||||
#[cfg(feature = "v1_16")]
|
#[cfg(feature = "v1_16")]
|
||||||
crate::VideoFormat::Nv1210le40,
|
crate::VideoFormat::Nv1210le40,
|
||||||
|
crate::VideoFormat::Nv1210le32,
|
||||||
|
crate::VideoFormat::P01010le,
|
||||||
crate::VideoFormat::Y444,
|
crate::VideoFormat::Y444,
|
||||||
crate::VideoFormat::Gbr,
|
crate::VideoFormat::Gbr,
|
||||||
crate::VideoFormat::Nv24,
|
crate::VideoFormat::Nv24,
|
||||||
crate::VideoFormat::Xbgr,
|
|
||||||
crate::VideoFormat::Bgrx,
|
|
||||||
crate::VideoFormat::Xrgb,
|
|
||||||
crate::VideoFormat::Rgbx,
|
|
||||||
crate::VideoFormat::Bgr,
|
|
||||||
crate::VideoFormat::Iyu2,
|
|
||||||
crate::VideoFormat::V308,
|
crate::VideoFormat::V308,
|
||||||
|
crate::VideoFormat::Iyu2,
|
||||||
|
crate::VideoFormat::Rgbx,
|
||||||
|
crate::VideoFormat::Xrgb,
|
||||||
|
crate::VideoFormat::Bgrx,
|
||||||
|
crate::VideoFormat::Xbgr,
|
||||||
crate::VideoFormat::Rgb,
|
crate::VideoFormat::Rgb,
|
||||||
|
crate::VideoFormat::Bgr,
|
||||||
crate::VideoFormat::Y42b,
|
crate::VideoFormat::Y42b,
|
||||||
crate::VideoFormat::Nv61,
|
|
||||||
crate::VideoFormat::Nv16,
|
crate::VideoFormat::Nv16,
|
||||||
crate::VideoFormat::Vyuy,
|
crate::VideoFormat::Nv61,
|
||||||
crate::VideoFormat::Uyvy,
|
|
||||||
crate::VideoFormat::Yvyu,
|
|
||||||
crate::VideoFormat::Yuy2,
|
crate::VideoFormat::Yuy2,
|
||||||
|
crate::VideoFormat::Yvyu,
|
||||||
|
crate::VideoFormat::Uyvy,
|
||||||
|
crate::VideoFormat::Vyuy,
|
||||||
crate::VideoFormat::I420,
|
crate::VideoFormat::I420,
|
||||||
crate::VideoFormat::Yv12,
|
crate::VideoFormat::Yv12,
|
||||||
crate::VideoFormat::Nv21,
|
|
||||||
crate::VideoFormat::Nv12,
|
crate::VideoFormat::Nv12,
|
||||||
|
crate::VideoFormat::Nv21,
|
||||||
crate::VideoFormat::Nv1264z32,
|
crate::VideoFormat::Nv1264z32,
|
||||||
crate::VideoFormat::Y41b,
|
crate::VideoFormat::Y41b,
|
||||||
crate::VideoFormat::Iyu1,
|
crate::VideoFormat::Iyu1,
|
||||||
crate::VideoFormat::Yvu9,
|
|
||||||
crate::VideoFormat::Yuv9,
|
crate::VideoFormat::Yuv9,
|
||||||
crate::VideoFormat::Rgb16,
|
crate::VideoFormat::Yvu9,
|
||||||
crate::VideoFormat::Bgr16,
|
crate::VideoFormat::Bgr16,
|
||||||
crate::VideoFormat::Rgb15,
|
crate::VideoFormat::Rgb16,
|
||||||
crate::VideoFormat::Bgr15,
|
crate::VideoFormat::Bgr15,
|
||||||
|
crate::VideoFormat::Rgb15,
|
||||||
crate::VideoFormat::Rgb8p,
|
crate::VideoFormat::Rgb8p,
|
||||||
crate::VideoFormat::Gray16Be,
|
crate::VideoFormat::Gray16Be,
|
||||||
crate::VideoFormat::Gray16Le,
|
crate::VideoFormat::Gray16Le,
|
||||||
|
@ -523,7 +523,6 @@ mod tests {
|
||||||
assert_eq!(caps.to_string(), "video/x-raw, format=(string){ NV12, NV16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]");
|
assert_eq!(caps.to_string(), "video/x-raw, format=(string){ NV12, NV16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "v1_18")]
|
|
||||||
#[test]
|
#[test]
|
||||||
fn sort() {
|
fn sort() {
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
|
@ -535,6 +534,8 @@ mod tests {
|
||||||
> crate::VideoFormatInfo::from_format(crate::VideoFormat::Nv12)
|
> crate::VideoFormatInfo::from_format(crate::VideoFormat::Nv12)
|
||||||
);
|
);
|
||||||
assert!(crate::VideoFormat::I420 > crate::VideoFormat::Yv12);
|
assert!(crate::VideoFormat::I420 > crate::VideoFormat::Yv12);
|
||||||
|
assert!(crate::VideoFormat::Nv12 > crate::VideoFormat::Nv21);
|
||||||
|
assert!(crate::VideoFormat::Xrgb > crate::VideoFormat::Rgb);
|
||||||
|
|
||||||
let sorted: Vec<crate::VideoFormat> =
|
let sorted: Vec<crate::VideoFormat> =
|
||||||
crate::VideoFormat::iter_raw().sorted().rev().collect();
|
crate::VideoFormat::iter_raw().sorted().rev().collect();
|
||||||
|
|
|
@ -395,48 +395,21 @@ impl Ord for VideoFormatInfo {
|
||||||
fn cmp(&self, other: &Self) -> Ordering {
|
fn cmp(&self, other: &Self) -> Ordering {
|
||||||
self.n_components()
|
self.n_components()
|
||||||
.cmp(&other.n_components())
|
.cmp(&other.n_components())
|
||||||
.then_with(|| self.depth().cmp(other.depth()))
|
.reverse()
|
||||||
.then_with(|| self.w_sub().cmp(other.w_sub()).reverse())
|
.then_with(|| self.depth().cmp(other.depth()).reverse())
|
||||||
.then_with(|| self.h_sub().cmp(other.h_sub()).reverse())
|
.then_with(|| self.w_sub().cmp(other.w_sub()))
|
||||||
.then_with(|| self.n_planes().cmp(&other.n_planes()))
|
.then_with(|| self.h_sub().cmp(other.h_sub()))
|
||||||
|
.then_with(|| self.n_planes().cmp(&other.n_planes()).reverse())
|
||||||
.then_with(|| {
|
.then_with(|| {
|
||||||
// Format using native endianness is considered as bigger
|
// Format using native endianness is considered smaller
|
||||||
|
let native_endianness = [crate::VideoFormat::Ayuv64, crate::VideoFormat::Argb64];
|
||||||
|
let want_le = cfg!(target_endian = "little");
|
||||||
|
|
||||||
match (
|
match (
|
||||||
self.flags().contains(crate::VideoFormatFlags::LE),
|
self.flags().contains(crate::VideoFormatFlags::LE) == want_le
|
||||||
other.flags().contains(crate::VideoFormatFlags::LE),
|
|| native_endianness.contains(&self.format()),
|
||||||
) {
|
other.flags().contains(crate::VideoFormatFlags::LE) == want_le
|
||||||
(true, false) => {
|
|| native_endianness.contains(&other.format()),
|
||||||
// a LE, b BE
|
|
||||||
#[cfg(target_endian = "little")]
|
|
||||||
{
|
|
||||||
Ordering::Greater
|
|
||||||
}
|
|
||||||
#[cfg(target_endian = "big")]
|
|
||||||
{
|
|
||||||
Ordering::Less
|
|
||||||
}
|
|
||||||
}
|
|
||||||
(false, true) => {
|
|
||||||
// a BE, b LE
|
|
||||||
#[cfg(target_endian = "little")]
|
|
||||||
{
|
|
||||||
Ordering::Less
|
|
||||||
}
|
|
||||||
#[cfg(target_endian = "big")]
|
|
||||||
{
|
|
||||||
Ordering::Greater
|
|
||||||
}
|
|
||||||
}
|
|
||||||
_ => Ordering::Equal,
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.then_with(|| self.pixel_stride().cmp(other.pixel_stride()))
|
|
||||||
.then_with(|| self.poffset().cmp(other.poffset()))
|
|
||||||
.then_with(|| {
|
|
||||||
// Prefer non-complex formats
|
|
||||||
match (
|
|
||||||
self.flags().contains(crate::VideoFormatFlags::COMPLEX),
|
|
||||||
other.flags().contains(crate::VideoFormatFlags::COMPLEX),
|
|
||||||
) {
|
) {
|
||||||
(true, false) => Ordering::Less,
|
(true, false) => Ordering::Less,
|
||||||
(false, true) => Ordering::Greater,
|
(false, true) => Ordering::Greater,
|
||||||
|
@ -444,32 +417,56 @@ impl Ord for VideoFormatInfo {
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.then_with(|| {
|
.then_with(|| {
|
||||||
// tiebreaker: YUV > RGB
|
// Prefer non-complex formats
|
||||||
|
match (
|
||||||
|
self.flags().contains(crate::VideoFormatFlags::COMPLEX),
|
||||||
|
other.flags().contains(crate::VideoFormatFlags::COMPLEX),
|
||||||
|
) {
|
||||||
|
(true, false) => Ordering::Greater,
|
||||||
|
(false, true) => Ordering::Less,
|
||||||
|
_ => Ordering::Equal,
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.then_with(|| {
|
||||||
|
// Prefer RGB over YUV
|
||||||
if self.flags().contains(crate::VideoFormatFlags::RGB)
|
if self.flags().contains(crate::VideoFormatFlags::RGB)
|
||||||
&& other.flags().contains(crate::VideoFormatFlags::YUV)
|
&& other.flags().contains(crate::VideoFormatFlags::YUV)
|
||||||
{
|
{
|
||||||
Ordering::Less
|
Ordering::Greater
|
||||||
} else if self.flags().contains(crate::VideoFormatFlags::YUV)
|
} else if self.flags().contains(crate::VideoFormatFlags::YUV)
|
||||||
&& other.flags().contains(crate::VideoFormatFlags::RGB)
|
&& other.flags().contains(crate::VideoFormatFlags::RGB)
|
||||||
{
|
{
|
||||||
Ordering::Greater
|
Ordering::Less
|
||||||
} else {
|
} else {
|
||||||
Ordering::Equal
|
Ordering::Equal
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
.then_with(|| {
|
.then_with(|| {
|
||||||
// Manual tiebreaker
|
// Prefer xRGB and permutations over RGB and permutations
|
||||||
match (self.format(), other.format()) {
|
let xrgb = [
|
||||||
// I420 is more commonly used in GStreamer
|
crate::VideoFormat::Xrgb,
|
||||||
(crate::VideoFormat::I420, crate::VideoFormat::Yv12) => Ordering::Greater,
|
crate::VideoFormat::Xbgr,
|
||||||
(crate::VideoFormat::Yv12, crate::VideoFormat::I420) => Ordering::Less,
|
crate::VideoFormat::Rgbx,
|
||||||
_ => Ordering::Equal,
|
crate::VideoFormat::Bgrx,
|
||||||
|
];
|
||||||
|
let rgb = [crate::VideoFormat::Rgb, crate::VideoFormat::Bgr];
|
||||||
|
|
||||||
|
if xrgb.contains(&self.format()) && rgb.contains(&other.format()) {
|
||||||
|
Ordering::Less
|
||||||
|
} else if rgb.contains(&self.format()) && xrgb.contains(&other.format()) {
|
||||||
|
Ordering::Greater
|
||||||
|
} else {
|
||||||
|
Ordering::Equal
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
.then_with(|| self.pixel_stride().cmp(other.pixel_stride()))
|
||||||
|
.then_with(|| self.poffset().cmp(other.poffset()))
|
||||||
.then_with(|| {
|
.then_with(|| {
|
||||||
// tie, sort by name
|
// tie, sort by name
|
||||||
self.name().cmp(other.name())
|
self.name().cmp(other.name())
|
||||||
})
|
})
|
||||||
|
// and reverse the whole ordering so that "better quality" > "lower quality"
|
||||||
|
.reverse()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue