plugin: fix macro processor check
[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 #if USE_GST_GL_HELPERS
35 # include <gst/gl/gstglcontext.h>
36 #endif
37
38 G_BEGIN_DECLS
39
40 typedef struct _GstVaapiPluginBase GstVaapiPluginBase;
41 typedef struct _GstVaapiPluginBaseClass GstVaapiPluginBaseClass;
42
43 #define GST_VAAPI_PLUGIN_BASE(plugin) \
44   ((GstVaapiPluginBase *)(plugin))
45 #define GST_VAAPI_PLUGIN_BASE_CLASS(plugin) \
46   ((GstVaapiPluginBaseClass *)(plugin))
47 #define GST_VAAPI_PLUGIN_BASE_GET_CLASS(plugin) \
48   GST_VAAPI_PLUGIN_BASE_CLASS(GST_ELEMENT_GET_CLASS( \
49       GST_VAAPI_PLUGIN_BASE_ELEMENT(plugin)))
50 #define GST_VAAPI_PLUGIN_BASE_PARENT(plugin) \
51   (&GST_VAAPI_PLUGIN_BASE(plugin)->parent_instance)
52 #define GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin) \
53   (&GST_VAAPI_PLUGIN_BASE_CLASS(plugin)->parent_class)
54 #define GST_VAAPI_PLUGIN_BASE_ELEMENT(plugin) \
55   (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->element)
56 #define GST_VAAPI_PLUGIN_BASE_ELEMENT_CLASS(plugin) \
57   (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->element)
58 #define GST_VAAPI_PLUGIN_BASE_DECODER(plugin) \
59   (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->decoder)
60 #define GST_VAAPI_PLUGIN_BASE_DECODER_CLASS(plugin) \
61   (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->decoder)
62 #define GST_VAAPI_PLUGIN_BASE_ENCODER(plugin) \
63   (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->encoder)
64 #define GST_VAAPI_PLUGIN_BASE_ENCODER_CLASS(plugin) \
65   (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->encoder)
66 #define GST_VAAPI_PLUGIN_BASE_TRANSFORM(plugin) \
67   (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->transform)
68 #define GST_VAAPI_PLUGIN_BASE_TRANSFORM_CLASS(plugin) \
69   (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->transform)
70 #define GST_VAAPI_PLUGIN_BASE_SINK(plugin) \
71   (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->sink)
72 #define GST_VAAPI_PLUGIN_BASE_SINK_CLASS(plugin) \
73   (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->sink)
74
75 #define GST_VAAPI_PLUGIN_BASE_INIT_INTERFACES \
76   gst_vaapi_plugin_base_init_interfaces(g_define_type_id);
77
78 #define GST_VAAPI_PLUGIN_BASE_SINK_PAD(plugin) \
79   (GST_VAAPI_PLUGIN_BASE(plugin)->sinkpad)
80 #define GST_VAAPI_PLUGIN_BASE_SINK_PAD_CAPS(plugin) \
81   (GST_VAAPI_PLUGIN_BASE(plugin)->sinkpad_caps)
82 #define GST_VAAPI_PLUGIN_BASE_SINK_PAD_INFO(plugin) \
83   (&GST_VAAPI_PLUGIN_BASE(plugin)->sinkpad_info)
84 #define GST_VAAPI_PLUGIN_BASE_SINK_PAD_QUERYFUNC(plugin) \
85   (GST_VAAPI_PLUGIN_BASE(plugin)->sinkpad_query)
86 #define GST_VAAPI_PLUGIN_BASE_SRC_PAD(plugin) \
87   (GST_VAAPI_PLUGIN_BASE(plugin)->srcpad)
88 #define GST_VAAPI_PLUGIN_BASE_SRC_PAD_CAPS(plugin) \
89   (GST_VAAPI_PLUGIN_BASE(plugin)->srcpad_caps)
90 #define GST_VAAPI_PLUGIN_BASE_SRC_PAD_INFO(plugin) \
91   (&GST_VAAPI_PLUGIN_BASE(plugin)->srcpad_info)
92 #define GST_VAAPI_PLUGIN_BASE_SRC_PAD_QUERYFYNC(plugin) \
93   (GST_VAAPI_PLUGIN_BASE(plugin)->srcpad_query)
94
95 #define GST_VAAPI_PLUGIN_BASE_DISPLAY(plugin) \
96   (GST_VAAPI_PLUGIN_BASE(plugin)->display)
97 #define GST_VAAPI_PLUGIN_BASE_DISPLAY_TYPE(plugin) \
98   (GST_VAAPI_PLUGIN_BASE(plugin)->display_type)
99 #define GST_VAAPI_PLUGIN_BASE_DISPLAY_NAME(plugin) \
100   (GST_VAAPI_PLUGIN_BASE(plugin)->display_name)
101 #define GST_VAAPI_PLUGIN_BASE_DISPLAY_REPLACE(plugin, new_display) \
102   (gst_vaapi_display_replace(&GST_VAAPI_PLUGIN_BASE_DISPLAY(plugin), \
103        (new_display)))
104
105 #define GST_VAAPI_PLUGIN_BASE_DEFINE_VMETHODS(parent_class) \
106   GST_VAAPI_PLUGIN_BASE_DEFINE_SET_CONTEXT(parent_class) \
107   GST_VAAPI_PLUGIN_BASE_DEFINE_CHANGE_STATE(parent_class)
108
109 #define GST_VAAPI_PLUGIN_BASE_DEFINE_SET_CONTEXT(parent_class) \
110   static void \
111   gst_vaapi_base_set_context (GstElement * element, GstContext * context) \
112   { \
113     GstVaapiPluginBase *const plugin = GST_VAAPI_PLUGIN_BASE (element); \
114     \
115     gst_vaapi_plugin_base_set_context (plugin, context); \
116     GST_ELEMENT_CLASS (parent_class)->set_context (element, context); \
117   }
118
119 #define GST_VAAPI_PLUGIN_BASE_DEFINE_CHANGE_STATE(parent_class) \
120   static GstStateChangeReturn \
121   gst_vaapi_base_change_state (GstElement * element, \
122       GstStateChange transition) \
123   { \
124     GstStateChangeReturn ret; \
125     \
126     ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, \
127         transition);  \
128     if (ret == GST_STATE_CHANGE_FAILURE) \
129       return ret; \
130     \
131     switch (transition) { \
132       case GST_STATE_CHANGE_NULL_TO_READY:{ \
133         GstVaapiPluginBase *const plugin = GST_VAAPI_PLUGIN_BASE (element); \
134         if (!gst_vaapi_plugin_base_driver_is_whitelisted (plugin)) \
135           ret = GST_STATE_CHANGE_FAILURE; \
136         break; \
137       } \
138       default: \
139         break; \
140     }          \
141     return ret; \
142   }
143
144 struct _GstVaapiPluginBase
145 {
146   /*< private >*/
147   union
148   {
149     GstElement element;
150     GstVideoDecoder decoder;
151     GstVideoEncoder encoder;
152     GstBaseTransform transform;
153     GstVideoSink sink;
154   } parent_instance;
155
156   GstDebugCategory *debug_category;
157
158   GstPad *sinkpad;
159   GstCaps *sinkpad_caps;
160   gboolean sinkpad_caps_changed;
161   gboolean sinkpad_caps_is_raw;
162   GstVideoInfo sinkpad_info;
163   GstBufferPool *sinkpad_buffer_pool;
164   guint sinkpad_buffer_size;
165
166   GstPad *srcpad;
167   GstCaps *srcpad_caps;
168   gboolean srcpad_caps_changed;
169   GstVideoInfo srcpad_info;
170   GstBufferPool *srcpad_buffer_pool;
171
172   GstVaapiDisplay *display;
173   GstVaapiDisplayType display_type;
174   GstVaapiDisplayType display_type_req;
175   gchar *display_name;
176
177   GstObject *gl_context;
178
179   GstCaps *allowed_raw_caps;
180 };
181
182 struct _GstVaapiPluginBaseClass
183 {
184   /*< private >*/
185   union
186   {
187     GstElementClass element;
188     GstVideoDecoderClass decoder;
189     GstVideoEncoderClass encoder;
190     GstBaseTransformClass transform;
191     GstVideoSinkClass sink;
192   } parent_class;
193
194   gboolean  (*has_interface) (GstVaapiPluginBase * plugin, GType type);
195   void (*display_changed) (GstVaapiPluginBase * plugin);
196 };
197
198 G_GNUC_INTERNAL
199 void
200 gst_vaapi_plugin_base_init_interfaces (GType type);
201
202 G_GNUC_INTERNAL
203 void
204 gst_vaapi_plugin_base_class_init (GstVaapiPluginBaseClass * klass);
205
206 G_GNUC_INTERNAL
207 void
208 gst_vaapi_plugin_base_init (GstVaapiPluginBase * plugin,
209     GstDebugCategory * debug_category);
210
211 G_GNUC_INTERNAL
212 void
213 gst_vaapi_plugin_base_finalize (GstVaapiPluginBase * plugin);
214
215 G_GNUC_INTERNAL
216 gboolean
217 gst_vaapi_plugin_base_open (GstVaapiPluginBase * plugin);
218
219 G_GNUC_INTERNAL
220 void
221 gst_vaapi_plugin_base_close (GstVaapiPluginBase * plugin);
222
223 G_GNUC_INTERNAL
224 gboolean
225 gst_vaapi_plugin_base_has_display_type (GstVaapiPluginBase * plugin,
226     GstVaapiDisplayType display_type_req);
227
228 G_GNUC_INTERNAL
229 void
230 gst_vaapi_plugin_base_set_display_type (GstVaapiPluginBase * plugin,
231     GstVaapiDisplayType display_type);
232
233 G_GNUC_INTERNAL
234 void
235 gst_vaapi_plugin_base_set_display_name (GstVaapiPluginBase * plugin,
236     const gchar * display_name);
237
238 G_GNUC_INTERNAL
239 gboolean
240 gst_vaapi_plugin_base_ensure_display (GstVaapiPluginBase * plugin);
241
242 G_GNUC_INTERNAL
243 gboolean
244 gst_vaapi_plugin_base_set_caps (GstVaapiPluginBase * plugin, GstCaps * incaps,
245     GstCaps * outcaps);
246
247 G_GNUC_INTERNAL
248 gboolean
249 gst_vaapi_plugin_base_propose_allocation (GstVaapiPluginBase * plugin,
250     GstQuery * query);
251
252 G_GNUC_INTERNAL
253 gboolean
254 gst_vaapi_plugin_base_decide_allocation (GstVaapiPluginBase * plugin,
255     GstQuery * query);
256
257 G_GNUC_INTERNAL
258 GstFlowReturn
259 gst_vaapi_plugin_base_get_input_buffer (GstVaapiPluginBase * plugin,
260     GstBuffer * inbuf, GstBuffer ** outbuf_ptr);
261
262 G_GNUC_INTERNAL
263 gboolean
264 gst_vaapi_plugin_base_driver_is_whitelisted (GstVaapiPluginBase * plugin);
265
266 G_GNUC_INTERNAL
267 void
268 gst_vaapi_plugin_base_set_context (GstVaapiPluginBase * plugin,
269     GstContext * context);
270
271 G_GNUC_INTERNAL
272 void
273 gst_vaapi_plugin_base_set_gl_context (GstVaapiPluginBase * plugin,
274     GstObject * object);
275
276 G_GNUC_INTERNAL
277 GstCaps *
278 gst_vaapi_plugin_base_get_allowed_raw_caps (GstVaapiPluginBase * plugin);
279
280 G_END_DECLS
281
282 #endif /* GST_VAAPI_PLUGIN_BASE_H */