2 * gstvaapipluginbase.h - Base GStreamer VA-API Plugin element
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>
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.
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.
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
25 #ifndef GST_VAAPI_PLUGIN_BASE_H
26 #define GST_VAAPI_PLUGIN_BASE_H
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>
34 #ifdef USE_GST_GL_HELPERS
35 # include <gst/gl/gstglcontext.h>
40 typedef struct _GstVaapiPluginBase GstVaapiPluginBase;
41 typedef struct _GstVaapiPluginBaseClass GstVaapiPluginBaseClass;
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)
75 #define GST_VAAPI_PLUGIN_BASE_INIT_INTERFACES \
76 gst_vaapi_plugin_base_init_interfaces(g_define_type_id);
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)
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), \
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)
109 #define GST_VAAPI_PLUGIN_BASE_DEFINE_SET_CONTEXT(parent_class) \
111 gst_vaapi_base_set_context (GstElement * element, GstContext * context) \
113 GstVaapiPluginBase *const plugin = GST_VAAPI_PLUGIN_BASE (element); \
115 gst_vaapi_plugin_base_set_context (plugin, context); \
116 GST_ELEMENT_CLASS (parent_class)->set_context (element, context); \
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) \
124 GstStateChangeReturn ret; \
126 ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, \
128 if (ret == GST_STATE_CHANGE_FAILURE) \
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; \
144 struct _GstVaapiPluginBase
150 GstVideoDecoder decoder;
151 GstVideoEncoder encoder;
152 GstBaseTransform transform;
156 GstDebugCategory *debug_category;
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;
167 GstCaps *srcpad_caps;
168 gboolean srcpad_caps_changed;
169 GstVideoInfo srcpad_info;
170 GstBufferPool *srcpad_buffer_pool;
172 GstVaapiDisplay *display;
173 GstVaapiDisplayType display_type;
174 GstVaapiDisplayType display_type_req;
177 GstObject *gl_context;
179 GstCaps *allowed_raw_caps;
182 struct _GstVaapiPluginBaseClass
187 GstElementClass element;
188 GstVideoDecoderClass decoder;
189 GstVideoEncoderClass encoder;
190 GstBaseTransformClass transform;
191 GstVideoSinkClass sink;
194 gboolean (*has_interface) (GstVaapiPluginBase * plugin, GType type);
195 void (*display_changed) (GstVaapiPluginBase * plugin);
200 gst_vaapi_plugin_base_init_interfaces (GType type);
204 gst_vaapi_plugin_base_class_init (GstVaapiPluginBaseClass * klass);
208 gst_vaapi_plugin_base_init (GstVaapiPluginBase * plugin,
209 GstDebugCategory * debug_category);
213 gst_vaapi_plugin_base_finalize (GstVaapiPluginBase * plugin);
217 gst_vaapi_plugin_base_open (GstVaapiPluginBase * plugin);
221 gst_vaapi_plugin_base_close (GstVaapiPluginBase * plugin);
225 gst_vaapi_plugin_base_has_display_type (GstVaapiPluginBase * plugin,
226 GstVaapiDisplayType display_type_req);
230 gst_vaapi_plugin_base_set_display_type (GstVaapiPluginBase * plugin,
231 GstVaapiDisplayType display_type);
235 gst_vaapi_plugin_base_set_display_name (GstVaapiPluginBase * plugin,
236 const gchar * display_name);
240 gst_vaapi_plugin_base_ensure_display (GstVaapiPluginBase * plugin);
244 gst_vaapi_plugin_base_set_caps (GstVaapiPluginBase * plugin, GstCaps * incaps,
249 gst_vaapi_plugin_base_propose_allocation (GstVaapiPluginBase * plugin,
254 gst_vaapi_plugin_base_decide_allocation (GstVaapiPluginBase * plugin,
259 gst_vaapi_plugin_base_get_input_buffer (GstVaapiPluginBase * plugin,
260 GstBuffer * inbuf, GstBuffer ** outbuf_ptr);
264 gst_vaapi_plugin_base_driver_is_whitelisted (GstVaapiPluginBase * plugin);
268 gst_vaapi_plugin_base_set_context (GstVaapiPluginBase * plugin,
269 GstContext * context);
273 gst_vaapi_plugin_base_set_gl_context (GstVaapiPluginBase * plugin,
278 gst_vaapi_plugin_base_get_allowed_raw_caps (GstVaapiPluginBase * plugin);
282 #endif /* GST_VAAPI_PLUGIN_BASE_H */