2017-08-10 21:41:55 +00:00
|
|
|
// Copyright (C) 2017 Sebastian Dröge <sebastian@centricular.com>
|
|
|
|
//
|
|
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
|
|
// option. This file may not be copied, modified, or distributed
|
|
|
|
// except according to those terms.
|
|
|
|
|
2019-03-19 07:58:20 +00:00
|
|
|
use gst_video_sys;
|
2017-08-10 21:41:55 +00:00
|
|
|
|
|
|
|
use std::ffi::CStr;
|
|
|
|
use std::fmt;
|
|
|
|
use std::str;
|
|
|
|
|
|
|
|
use glib::translate::{from_glib, FromGlib, ToGlib, ToGlibPtr};
|
|
|
|
|
2017-11-26 21:50:39 +00:00
|
|
|
#[derive(PartialEq, Eq, Copy, Clone, Debug, Hash)]
|
2017-08-10 21:41:55 +00:00
|
|
|
pub enum VideoEndianness {
|
|
|
|
Unknown,
|
|
|
|
LittleEndian = 1234,
|
|
|
|
BigEndian = 4321,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl FromGlib<i32> for VideoEndianness {
|
|
|
|
fn from_glib(value: i32) -> Self {
|
2017-08-30 09:48:01 +00:00
|
|
|
skip_assert_initialized!();
|
|
|
|
|
2017-08-10 21:41:55 +00:00
|
|
|
match value {
|
|
|
|
1234 => VideoEndianness::LittleEndian,
|
|
|
|
4321 => VideoEndianness::BigEndian,
|
|
|
|
_ => VideoEndianness::Unknown,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl ToGlib for VideoEndianness {
|
|
|
|
type GlibType = i32;
|
|
|
|
|
|
|
|
fn to_glib(&self) -> i32 {
|
|
|
|
match *self {
|
|
|
|
VideoEndianness::LittleEndian => 1234,
|
|
|
|
VideoEndianness::BigEndian => 4321,
|
|
|
|
_ => 0,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl ::VideoFormat {
|
|
|
|
pub fn from_string(s: &str) -> ::VideoFormat {
|
2017-08-30 09:48:01 +00:00
|
|
|
assert_initialized_main_thread!();
|
|
|
|
|
2019-03-19 07:58:20 +00:00
|
|
|
unsafe {
|
|
|
|
from_glib(gst_video_sys::gst_video_format_from_string(
|
|
|
|
s.to_glib_none().0,
|
|
|
|
))
|
|
|
|
}
|
2017-08-10 21:41:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn from_fourcc(fourcc: u32) -> ::VideoFormat {
|
2017-08-30 09:48:01 +00:00
|
|
|
assert_initialized_main_thread!();
|
|
|
|
|
2019-03-19 07:58:20 +00:00
|
|
|
unsafe { from_glib(gst_video_sys::gst_video_format_from_fourcc(fourcc)) }
|
2017-08-10 21:41:55 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn from_masks(
|
|
|
|
depth: u32,
|
|
|
|
bpp: u32,
|
|
|
|
endianness: ::VideoEndianness,
|
|
|
|
red_mask: u32,
|
|
|
|
blue_mask: u32,
|
|
|
|
green_mask: u32,
|
|
|
|
alpha_mask: u32,
|
|
|
|
) -> ::VideoFormat {
|
2017-08-30 09:48:01 +00:00
|
|
|
assert_initialized_main_thread!();
|
|
|
|
|
2017-08-10 21:41:55 +00:00
|
|
|
unsafe {
|
2019-03-19 07:58:20 +00:00
|
|
|
from_glib(gst_video_sys::gst_video_format_from_masks(
|
2017-08-10 21:41:55 +00:00
|
|
|
depth as i32,
|
|
|
|
bpp as i32,
|
|
|
|
endianness.to_glib(),
|
|
|
|
red_mask,
|
|
|
|
blue_mask,
|
|
|
|
green_mask,
|
|
|
|
alpha_mask,
|
|
|
|
))
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-07-20 07:21:06 +00:00
|
|
|
pub fn to_string<'a>(self) -> &'a str {
|
|
|
|
if self == ::VideoFormat::Unknown {
|
2017-12-16 08:58:10 +00:00
|
|
|
return "UNKNOWN";
|
|
|
|
}
|
|
|
|
|
2017-08-10 21:41:55 +00:00
|
|
|
unsafe {
|
2019-03-19 07:58:20 +00:00
|
|
|
CStr::from_ptr(gst_video_sys::gst_video_format_to_string(self.to_glib()))
|
2017-08-10 21:41:55 +00:00
|
|
|
.to_str()
|
|
|
|
.unwrap()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl str::FromStr for ::VideoFormat {
|
|
|
|
type Err = ();
|
|
|
|
|
|
|
|
fn from_str(s: &str) -> Result<Self, ()> {
|
2017-08-30 09:48:01 +00:00
|
|
|
skip_assert_initialized!();
|
|
|
|
|
2017-08-10 21:41:55 +00:00
|
|
|
let format = Self::from_string(s);
|
|
|
|
if format == ::VideoFormat::Unknown {
|
|
|
|
Err(())
|
|
|
|
} else {
|
|
|
|
Ok(format)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
impl fmt::Display for ::VideoFormat {
|
|
|
|
fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> {
|
2018-07-20 07:21:06 +00:00
|
|
|
f.write_str(self.to_string().as_str())
|
2017-08-10 21:41:55 +00:00
|
|
|
}
|
|
|
|
}
|