gst_plugin/
pipeline.rs

1// Copyright (C) 2017 Sebastian Dröge <sebastian@centricular.com>
2//
3// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
5// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
6// option. This file may not be copied, modified, or distributed
7// except according to those terms.
8
9use 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
69// FIXME: Boilerplate
70unsafe 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}