gstreamer_video/
video_buffer_pool.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use std::{marker::PhantomData, mem};
4
5use crate::ffi;
6use glib::translate::*;
7
8pub static BUFFER_POOL_OPTION_VIDEO_AFFINE_TRANSFORMATION_META: &glib::GStr = unsafe {
9    glib::GStr::from_utf8_with_nul_unchecked(
10        ffi::GST_BUFFER_POOL_OPTION_VIDEO_AFFINE_TRANSFORMATION_META,
11    )
12};
13pub static BUFFER_POOL_OPTION_VIDEO_ALIGNMENT: &glib::GStr = unsafe {
14    glib::GStr::from_utf8_with_nul_unchecked(ffi::GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT)
15};
16pub static BUFFER_POOL_OPTION_VIDEO_GL_TEXTURE_UPLOAD_META: &glib::GStr = unsafe {
17    glib::GStr::from_utf8_with_nul_unchecked(
18        ffi::GST_BUFFER_POOL_OPTION_VIDEO_GL_TEXTURE_UPLOAD_META,
19    )
20};
21pub static BUFFER_POOL_OPTION_VIDEO_META: &glib::GStr =
22    unsafe { glib::GStr::from_utf8_with_nul_unchecked(ffi::GST_BUFFER_POOL_OPTION_VIDEO_META) };
23
24#[derive(Debug, Clone)]
25#[doc(alias = "GstVideoAlignment")]
26pub struct VideoAlignment(pub(crate) ffi::GstVideoAlignment);
27
28impl VideoAlignment {
29    #[doc(alias = "get_padding_top")]
30    #[inline]
31    pub fn padding_top(&self) -> u32 {
32        self.0.padding_top
33    }
34    #[doc(alias = "get_padding_bottom")]
35    #[inline]
36    pub fn padding_bottom(&self) -> u32 {
37        self.0.padding_bottom
38    }
39    #[doc(alias = "get_padding_left")]
40    #[inline]
41    pub fn padding_left(&self) -> u32 {
42        self.0.padding_left
43    }
44    #[doc(alias = "get_padding_right")]
45    #[inline]
46    pub fn padding_right(&self) -> u32 {
47        self.0.padding_right
48    }
49    #[doc(alias = "get_stride_align")]
50    #[inline]
51    pub fn stride_align(&self) -> &[u32; ffi::GST_VIDEO_MAX_PLANES as usize] {
52        &self.0.stride_align
53    }
54
55    pub fn new(
56        padding_top: u32,
57        padding_bottom: u32,
58        padding_left: u32,
59        padding_right: u32,
60        stride_align: &[u32; ffi::GST_VIDEO_MAX_PLANES as usize],
61    ) -> Self {
62        skip_assert_initialized!();
63
64        let videoalignment = ffi::GstVideoAlignment {
65            padding_top,
66            padding_bottom,
67            padding_left,
68            padding_right,
69            stride_align: *stride_align,
70        };
71
72        Self(videoalignment)
73    }
74}
75
76impl PartialEq for VideoAlignment {
77    #[inline]
78    fn eq(&self, other: &Self) -> bool {
79        self.padding_top() == other.padding_top()
80            && self.padding_bottom() == other.padding_bottom()
81            && self.padding_left() == other.padding_left()
82            && self.padding_right() == other.padding_right()
83            && self.stride_align() == other.stride_align()
84    }
85}
86
87impl Eq for VideoAlignment {}
88
89#[doc(hidden)]
90impl<'a> ToGlibPtr<'a, *const ffi::GstVideoAlignment> for VideoAlignment {
91    type Storage = PhantomData<&'a Self>;
92
93    #[inline]
94    fn to_glib_none(&'a self) -> Stash<'a, *const ffi::GstVideoAlignment, Self> {
95        Stash(&self.0, PhantomData)
96    }
97}
98
99pub trait VideoBufferPoolConfig {
100    #[doc(alias = "get_video_alignment")]
101    fn video_alignment(&self) -> Option<VideoAlignment>;
102
103    fn set_video_alignment(&mut self, align: &VideoAlignment);
104}
105
106impl VideoBufferPoolConfig for gst::BufferPoolConfigRef {
107    #[doc(alias = "gst_buffer_pool_config_get_video_alignment")]
108    fn video_alignment(&self) -> Option<VideoAlignment> {
109        unsafe {
110            let mut alignment = mem::MaybeUninit::uninit();
111            let ret = from_glib(ffi::gst_buffer_pool_config_get_video_alignment(
112                self.as_ref().as_mut_ptr(),
113                alignment.as_mut_ptr(),
114            ));
115            if ret {
116                Some(VideoAlignment(alignment.assume_init()))
117            } else {
118                None
119            }
120        }
121    }
122
123    #[doc(alias = "gst_buffer_pool_config_set_video_alignment")]
124    fn set_video_alignment(&mut self, align: &VideoAlignment) {
125        unsafe {
126            ffi::gst_buffer_pool_config_set_video_alignment(
127                self.as_mut().as_mut_ptr(),
128                mut_override(&align.0),
129            )
130        }
131    }
132}