plugins: factor out display creation process.
[platform/upstream/gstreamer.git] / gst / vaapi / gstvaapipluginbase.h
1 /*
2  *  gstvaapipluginbase.h - Base GStreamer VA-API Plugin element
3  *
4  *  Copyright (C) 2010-2011 Splitted-Desktop Systems
5  *    Author: Gwenole Beauchesne <gwenole.beauchesne@splitted-desktop.com>
6  *  Copyright (C) 2011-2013 Intel Corporation
7  *    Author: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
8  *
9  *  This library is free software; you can redistribute it and/or
10  *  modify it under the terms of the GNU Lesser General Public License
11  *  as published by the Free Software Foundation; either version 2.1
12  *  of the License, or (at your option) any later version.
13  *
14  *  This library is distributed in the hope that it will be useful,
15  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
16  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  *  Lesser General Public License for more details.
18  *
19  *  You should have received a copy of the GNU Lesser General Public
20  *  License along with this library; if not, write to the Free
21  *  Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
22  *  Boston, MA 02110-1301 USA
23  */
24
25 #ifndef GST_VAAPI_PLUGIN_BASE_H
26 #define GST_VAAPI_PLUGIN_BASE_H
27
28 #include <gst/base/gstbasetransform.h>
29 #include <gst/video/gstvideodecoder.h>
30 #include <gst/video/gstvideoencoder.h>
31 #include <gst/video/gstvideosink.h>
32 #include <gst/vaapi/gstvaapidisplay.h>
33
34 G_BEGIN_DECLS
35
36 typedef struct _GstVaapiPluginBase GstVaapiPluginBase;
37 typedef struct _GstVaapiPluginBaseClass GstVaapiPluginBaseClass;
38
39 #define GST_VAAPI_PLUGIN_BASE(plugin) \
40   ((GstVaapiPluginBase *)(plugin))
41 #define GST_VAAPI_PLUGIN_BASE_CLASS(plugin) \
42   ((GstVaapiPluginBaseClass *)(plugin))
43 #define GST_VAAPI_PLUGIN_BASE_GET_CLASS(plugin) \
44   GST_VAAPI_PLUGIN_BASE_CLASS(GST_ELEMENT_GET_CLASS( \
45       GST_VAAPI_PLUGIN_BASE_ELEMENT(plugin)))
46 #define GST_VAAPI_PLUGIN_BASE_PARENT(plugin) \
47   (&GST_VAAPI_PLUGIN_BASE(plugin)->parent_instance)
48 #define GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin) \
49   (&GST_VAAPI_PLUGIN_BASE_CLASS(plugin)->parent_class)
50 #define GST_VAAPI_PLUGIN_BASE_ELEMENT(plugin) \
51   (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->element)
52 #define GST_VAAPI_PLUGIN_BASE_ELEMENT_CLASS(plugin) \
53   (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->element)
54 #define GST_VAAPI_PLUGIN_BASE_DECODER(plugin) \
55   (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->decoder)
56 #define GST_VAAPI_PLUGIN_BASE_DECODER_CLASS(plugin) \
57   (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->decoder)
58 #define GST_VAAPI_PLUGIN_BASE_ENCODER(plugin) \
59   (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->encoder)
60 #define GST_VAAPI_PLUGIN_BASE_ENCODER_CLASS(plugin) \
61   (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->encoder)
62 #define GST_VAAPI_PLUGIN_BASE_TRANSFORM(plugin) \
63   (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->transform)
64 #define GST_VAAPI_PLUGIN_BASE_TRANSFORM_CLASS(plugin) \
65   (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->transform)
66 #define GST_VAAPI_PLUGIN_BASE_SINK(plugin) \
67   (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->sink)
68 #define GST_VAAPI_PLUGIN_BASE_SINK_CLASS(plugin) \
69   (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->sink)
70
71 #define GST_VAAPI_PLUGIN_BASE_DISPLAY(plugin) \
72   (GST_VAAPI_PLUGIN_BASE(plugin)->display)
73 #define GST_VAAPI_PLUGIN_BASE_DISPLAY_TYPE(plugin) \
74   (GST_VAAPI_PLUGIN_BASE(plugin)->display_type)
75 #define GST_VAAPI_PLUGIN_BASE_DISPLAY_REPLACE(plugin, new_display) \
76   (gst_vaapi_display_replace(&GST_VAAPI_PLUGIN_BASE_DISPLAY(plugin), \
77        (new_display)))
78
79 struct _GstVaapiPluginBase
80 {
81   /*< private >*/
82   union
83   {
84     GstElement element;
85     GstVideoDecoder decoder;
86     GstVideoEncoder encoder;
87     GstBaseTransform transform;
88     GstVideoSink sink;
89   } parent_instance;
90
91   GstDebugCategory *debug_category;
92
93   GstVaapiDisplay *display;
94   GstVaapiDisplayType display_type;
95   GstVaapiDisplayType display_type_req;
96 };
97
98 struct _GstVaapiPluginBaseClass
99 {
100   /*< private >*/
101   union
102   {
103     GstElementClass element;
104     GstVideoDecoderClass decoder;
105     GstVideoEncoderClass encoder;
106     GstBaseTransformClass transform;
107     GstVideoSinkClass sink;
108   } parent_class;
109
110   void (*display_changed) (GstVaapiPluginBase * plugin);
111 };
112
113 G_GNUC_INTERNAL
114 void
115 gst_vaapi_plugin_base_class_init (GstVaapiPluginBaseClass * klass);
116
117 G_GNUC_INTERNAL
118 void
119 gst_vaapi_plugin_base_init (GstVaapiPluginBase * plugin,
120     GstDebugCategory * debug_category);
121
122 G_GNUC_INTERNAL
123 void
124 gst_vaapi_plugin_base_finalize (GstVaapiPluginBase * plugin);
125
126 G_GNUC_INTERNAL
127 gboolean
128 gst_vaapi_plugin_base_open (GstVaapiPluginBase * plugin);
129
130 G_GNUC_INTERNAL
131 void
132 gst_vaapi_plugin_base_close (GstVaapiPluginBase * plugin);
133
134 G_GNUC_INTERNAL
135 void
136 gst_vaapi_plugin_base_set_display_type (GstVaapiPluginBase * plugin,
137     GstVaapiDisplayType display_type);
138
139 G_GNUC_INTERNAL
140 gboolean
141 gst_vaapi_plugin_base_ensure_display (GstVaapiPluginBase * plugin);
142
143 G_END_DECLS
144
145 #endif /* GST_VAAPI_PLUGIN_BASE_H */