1use std::mem;
10use std::ptr;
11
12use glib_ffi;
13use gobject_ffi;
14use gst_ffi;
15
16use glib;
17use glib::translate::*;
18use gst;
19use gst::prelude::*;
20
21use gobject_subclass::anyimpl::*;
22use gobject_subclass::object::*;
23
24use bin::*;
25use element::*;
26use object::*;
27
28pub trait PipelineImpl<T: PipelineBase>:
29 AnyImpl + ObjectImpl<T> + ElementImpl<T> + BinImpl<T> + Send + Sync + 'static
30where
31 T::InstanceStructType: PanicPoison,
32{
33}
34
35any_impl!(PipelineBase, PipelineImpl, PanicPoison);
36
37pub unsafe trait PipelineBase:
38 IsA<gst::Element> + IsA<gst::Bin> + IsA<gst::Pipeline> + ObjectType
39{
40}
41
42pub unsafe trait PipelineClassExt<T: PipelineBase>
43where
44 T::ImplType: PipelineImpl<T>,
45 T::InstanceStructType: PanicPoison,
46{
47 fn override_vfuncs(&mut self, _: &ClassInitToken) {}
48}
49
50glib_wrapper! {
51 pub struct Pipeline(Object<ElementInstanceStruct<Pipeline>>):
52 [gst::Pipeline => gst_ffi::GstPipeline,
53 gst::Bin => gst_ffi::GstBin,
54 gst::Element => gst_ffi::GstElement,
55 gst::Object => gst_ffi::GstObject,
56 gst::ChildProxy => gst_ffi::GstChildProxy];
57
58 match fn {
59 get_type => || get_type::<Pipeline>(),
60 }
61}
62
63unsafe impl<T: IsA<gst::Element> + IsA<gst::Bin> + IsA<gst::Pipeline> + ObjectType> PipelineBase
64 for T
65{
66}
67pub type PipelineClass = ClassStruct<Pipeline>;
68
69unsafe impl PipelineClassExt<Pipeline> for PipelineClass {}
71unsafe impl BinClassExt<Pipeline> for PipelineClass {}
72unsafe impl ElementClassExt<Pipeline> for PipelineClass {}
73unsafe impl ObjectClassExt<Pipeline> for PipelineClass {}
74
75unsafe impl Send for Pipeline {}
76unsafe impl Sync for Pipeline {}
77
78#[macro_export]
79macro_rules! box_pipeline_impl(
80 ($name:ident) => {
81 box_bin_impl!($name);
82
83 impl<T: PipelineBase> PipelineImpl<T> for Box<$name<T>>
84 where
85 T::InstanceStructType: PanicPoison
86 {
87 }
88 };
89);
90box_pipeline_impl!(PipelineImpl);
91
92impl ObjectType for Pipeline {
93 const NAME: &'static str = "RsPipeline";
94 type ParentType = gst::Pipeline;
95 type ImplType = Box<PipelineImpl<Self>>;
96 type InstanceStructType = ElementInstanceStruct<Self>;
97
98 fn class_init(token: &ClassInitToken, klass: &mut PipelineClass) {
99 ObjectClassExt::override_vfuncs(klass, token);
100 ElementClassExt::override_vfuncs(klass, token);
101 BinClassExt::override_vfuncs(klass, token);
102 PipelineClassExt::override_vfuncs(klass, token);
103 }
104
105 object_type_fns!();
106}