gstreamer_video/
video_filter.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use glib::{prelude::*, translate::*};
4use gst::prelude::*;
5use gst_base::prelude::*;
6
7use crate::{ffi, VideoFilter};
8
9pub trait VideoFilterExtManual: IsA<VideoFilter> + 'static {
10    fn input_video_info(&self) -> Option<crate::VideoInfo> {
11        unsafe {
12            let ptr = self.as_ptr() as *mut ffi::GstVideoFilter;
13            let sinkpad = self.as_ref().sink_pad();
14            let _guard = sinkpad.stream_lock();
15
16            let info = &(*ptr).in_info;
17
18            if info.finfo.is_null() || info.width <= 0 || info.height <= 0 {
19                return None;
20            }
21
22            Some(from_glib_none(mut_override(
23                info as *const ffi::GstVideoInfo,
24            )))
25        }
26    }
27
28    fn output_video_info(&self) -> Option<crate::VideoInfo> {
29        unsafe {
30            let ptr = self.as_ptr() as *mut ffi::GstVideoFilter;
31            let sinkpad = self.as_ref().sink_pad();
32            let _guard = sinkpad.stream_lock();
33
34            let info = &(*ptr).out_info;
35
36            if info.finfo.is_null() || info.width <= 0 || info.height <= 0 {
37                return None;
38            }
39
40            Some(from_glib_none(mut_override(
41                info as *const ffi::GstVideoInfo,
42            )))
43        }
44    }
45}
46
47impl<O: IsA<VideoFilter>> VideoFilterExtManual for O {}