gstreamer_video/
video_buffer_pool.rs1use 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, Copy)]
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
35 #[doc(alias = "get_padding_bottom")]
36 #[inline]
37 pub fn padding_bottom(&self) -> u32 {
38 self.0.padding_bottom
39 }
40
41 #[doc(alias = "get_padding_left")]
42 #[inline]
43 pub fn padding_left(&self) -> u32 {
44 self.0.padding_left
45 }
46
47 #[doc(alias = "get_padding_right")]
48 #[inline]
49 pub fn padding_right(&self) -> u32 {
50 self.0.padding_right
51 }
52
53 #[doc(alias = "get_stride_align")]
54 #[inline]
55 pub fn stride_align(&self) -> &[u32; crate::VIDEO_MAX_PLANES] {
56 &self.0.stride_align
57 }
58
59 #[inline]
60 pub fn set_padding_top(&mut self, padding_top: u32) {
61 self.0.padding_top = padding_top;
62 }
63
64 #[inline]
65 pub fn set_padding_bottom(&mut self, padding_bottom: u32) {
66 self.0.padding_bottom = padding_bottom;
67 }
68
69 #[inline]
70 pub fn set_padding_left(&mut self, padding_left: u32) {
71 self.0.padding_left = padding_left;
72 }
73
74 #[inline]
75 pub fn set_padding_right(&mut self, padding_right: u32) {
76 self.0.padding_right = padding_right;
77 }
78
79 #[inline]
80 pub fn stride_align_mut(&mut self) -> &mut [u32; crate::VIDEO_MAX_PLANES] {
81 &mut self.0.stride_align
82 }
83
84 pub fn new(
85 padding_top: u32,
86 padding_bottom: u32,
87 padding_left: u32,
88 padding_right: u32,
89 stride_align: &[u32; crate::VIDEO_MAX_PLANES],
90 ) -> Self {
91 skip_assert_initialized!();
92
93 let videoalignment = ffi::GstVideoAlignment {
94 padding_top,
95 padding_bottom,
96 padding_left,
97 padding_right,
98 stride_align: *stride_align,
99 };
100
101 Self(videoalignment)
102 }
103}
104
105impl PartialEq for VideoAlignment {
106 #[inline]
107 fn eq(&self, other: &Self) -> bool {
108 self.padding_top() == other.padding_top()
109 && self.padding_bottom() == other.padding_bottom()
110 && self.padding_left() == other.padding_left()
111 && self.padding_right() == other.padding_right()
112 && self.stride_align() == other.stride_align()
113 }
114}
115
116impl Eq for VideoAlignment {}
117
118impl Default for VideoAlignment {
119 fn default() -> Self {
120 unsafe {
121 let mut align = mem::MaybeUninit::uninit();
122 ffi::gst_video_alignment_reset(align.as_mut_ptr());
123 VideoAlignment(align.assume_init())
124 }
125 }
126}
127
128#[doc(hidden)]
129impl<'a> ToGlibPtr<'a, *const ffi::GstVideoAlignment> for VideoAlignment {
130 type Storage = PhantomData<&'a Self>;
131
132 #[inline]
133 fn to_glib_none(&'a self) -> Stash<'a, *const ffi::GstVideoAlignment, Self> {
134 Stash(&self.0, PhantomData)
135 }
136}
137
138pub trait VideoBufferPoolConfig {
139 #[doc(alias = "get_video_alignment")]
140 fn video_alignment(&self) -> Option<VideoAlignment>;
141
142 fn set_video_alignment(&mut self, align: &VideoAlignment);
143}
144
145impl VideoBufferPoolConfig for gst::BufferPoolConfigRef {
146 #[doc(alias = "gst_buffer_pool_config_get_video_alignment")]
147 fn video_alignment(&self) -> Option<VideoAlignment> {
148 unsafe {
149 let mut alignment = mem::MaybeUninit::uninit();
150 let ret = from_glib(ffi::gst_buffer_pool_config_get_video_alignment(
151 self.as_ref().as_mut_ptr(),
152 alignment.as_mut_ptr(),
153 ));
154 if ret {
155 Some(VideoAlignment(alignment.assume_init()))
156 } else {
157 None
158 }
159 }
160 }
161
162 #[doc(alias = "gst_buffer_pool_config_set_video_alignment")]
163 fn set_video_alignment(&mut self, align: &VideoAlignment) {
164 unsafe {
165 ffi::gst_buffer_pool_config_set_video_alignment(
166 self.as_mut().as_mut_ptr(),
167 mut_override(&align.0),
168 )
169 }
170 }
171}