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>
36 typedef struct _GstVaapiPluginBase GstVaapiPluginBase;
37 typedef struct _GstVaapiPluginBaseClass GstVaapiPluginBaseClass;
38 typedef struct _GstVaapiPadPrivate GstVaapiPadPrivate;
40 #define GST_VAAPI_PLUGIN_BASE(plugin) \
41 ((GstVaapiPluginBase *)(plugin))
42 #define GST_VAAPI_PLUGIN_BASE_CLASS(plugin) \
43 ((GstVaapiPluginBaseClass *)(plugin))
44 #define GST_VAAPI_PLUGIN_BASE_GET_CLASS(plugin) \
45 GST_VAAPI_PLUGIN_BASE_CLASS(GST_ELEMENT_GET_CLASS( \
46 GST_VAAPI_PLUGIN_BASE_ELEMENT(plugin)))
47 #define GST_VAAPI_PLUGIN_BASE_PARENT(plugin) \
48 (&GST_VAAPI_PLUGIN_BASE(plugin)->parent_instance)
49 #define GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin) \
50 (&GST_VAAPI_PLUGIN_BASE_CLASS(plugin)->parent_class)
51 #define GST_VAAPI_PLUGIN_BASE_ELEMENT(plugin) \
52 (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->element)
53 #define GST_VAAPI_PLUGIN_BASE_ELEMENT_CLASS(plugin) \
54 (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->element)
55 #define GST_VAAPI_PLUGIN_BASE_DECODER(plugin) \
56 (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->decoder)
57 #define GST_VAAPI_PLUGIN_BASE_DECODER_CLASS(plugin) \
58 (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->decoder)
59 #define GST_VAAPI_PLUGIN_BASE_ENCODER(plugin) \
60 (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->encoder)
61 #define GST_VAAPI_PLUGIN_BASE_ENCODER_CLASS(plugin) \
62 (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->encoder)
63 #define GST_VAAPI_PLUGIN_BASE_TRANSFORM(plugin) \
64 (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->transform)
65 #define GST_VAAPI_PLUGIN_BASE_TRANSFORM_CLASS(plugin) \
66 (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->transform)
67 #define GST_VAAPI_PLUGIN_BASE_SINK(plugin) \
68 (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->sink)
69 #define GST_VAAPI_PLUGIN_BASE_SINK_CLASS(plugin) \
70 (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->sink)
72 #define GST_VAAPI_PLUGIN_BASE_INIT_INTERFACES \
73 gst_vaapi_plugin_base_init_interfaces(g_define_type_id);
75 #define GST_VAAPI_PLUGIN_BASE_SINK_PAD(plugin) \
76 (GST_VAAPI_PLUGIN_BASE(plugin)->sinkpad)
77 #define GST_VAAPI_PLUGIN_BASE_SINK_PAD_PRIVATE(plugin) \
78 (GST_VAAPI_PLUGIN_BASE(plugin)->sinkpriv)
79 #define GST_VAAPI_PLUGIN_BASE_SINK_PAD_CAPS(plugin) \
80 (GST_VAAPI_PLUGIN_BASE_SINK_PAD_PRIVATE(plugin)->caps)
81 #define GST_VAAPI_PLUGIN_BASE_SINK_PAD_INFO(plugin) \
82 (&GST_VAAPI_PLUGIN_BASE_SINK_PAD_PRIVATE(plugin)->info)
84 #define GST_VAAPI_PLUGIN_BASE_SRC_PAD(plugin) \
85 (GST_VAAPI_PLUGIN_BASE(plugin)->srcpad)
86 #define GST_VAAPI_PLUGIN_BASE_SRC_PAD_PRIVATE(plugin) \
87 (GST_VAAPI_PLUGIN_BASE(plugin)->srcpriv)
88 #define GST_VAAPI_PLUGIN_BASE_SRC_PAD_CAPS(plugin) \
89 (GST_VAAPI_PLUGIN_BASE_SRC_PAD_PRIVATE(plugin)->caps)
90 #define GST_VAAPI_PLUGIN_BASE_SRC_PAD_INFO(plugin) \
91 (&GST_VAAPI_PLUGIN_BASE_SRC_PAD_PRIVATE(plugin)->info)
92 #define GST_VAAPI_PLUGIN_BASE_SRC_PAD_CAN_DMABUF(plugin) \
93 (GST_VAAPI_PLUGIN_BASE_SRC_PAD_PRIVATE(plugin)->can_dmabuf)
94 #define GST_VAAPI_PLUGIN_BASE_SRC_PAD_BUFFER_POOL(plugin) \
95 (GST_VAAPI_PLUGIN_BASE_SRC_PAD_PRIVATE(plugin)->buffer_pool)
96 #define GST_VAAPI_PLUGIN_BASE_SRC_PAD_ALLOCATOR(plugin) \
97 (GST_VAAPI_PLUGIN_BASE_SRC_PAD_PRIVATE(plugin)->allocator)
98 #define GST_VAAPI_PLUGIN_BASE_OTHER_ALLOCATOR(plugin) \
99 (GST_VAAPI_PLUGIN_BASE_SRC_PAD_PRIVATE(plugin)->other_allocator)
100 #define GST_VAAPI_PLUGIN_BASE_OTHER_ALLOCATOR_PARAMS(plugin) \
101 (GST_VAAPI_PLUGIN_BASE_SRC_PAD_PRIVATE(plugin)->other_allocator_params)
103 #define GST_VAAPI_PLUGIN_BASE_COPY_OUTPUT_FRAME(plugin) \
104 (GST_VAAPI_PLUGIN_BASE(plugin)->copy_output_frame)
106 #define GST_VAAPI_PLUGIN_BASE_DISPLAY(plugin) \
107 (GST_VAAPI_PLUGIN_BASE(plugin)->display)
108 #define GST_VAAPI_PLUGIN_BASE_DISPLAY_TYPE(plugin) \
109 (GST_VAAPI_PLUGIN_BASE(plugin)->display_type)
110 #define GST_VAAPI_PLUGIN_BASE_DISPLAY_NAME(plugin) \
111 (GST_VAAPI_PLUGIN_BASE(plugin)->display_name)
112 #define GST_VAAPI_PLUGIN_BASE_DISPLAY_REPLACE(plugin, new_display) \
113 (gst_vaapi_display_replace(&GST_VAAPI_PLUGIN_BASE_DISPLAY(plugin), \
116 #define GST_VAAPI_PLUGIN_BASE_DEFINE_SET_CONTEXT(parent_class) \
118 gst_vaapi_base_set_context (GstElement * element, GstContext * context) \
120 GstVaapiPluginBase *const plugin = GST_VAAPI_PLUGIN_BASE (element); \
122 gst_vaapi_plugin_base_set_context (plugin, context); \
123 GST_ELEMENT_CLASS (parent_class)->set_context (element, context); \
126 struct _GstVaapiPadPrivate
130 GstBufferPool *buffer_pool;
131 GstAllocator *allocator;
133 gboolean caps_is_raw;
137 GstAllocator *other_allocator;
138 GstAllocationParams other_allocator_params;
141 struct _GstVaapiPluginBase
147 GstVideoDecoder decoder;
148 GstVideoEncoder encoder;
149 GstBaseTransform transform;
153 GstDebugCategory *debug_category;
158 GstVaapiPadPrivate *sinkpriv;
159 GstVaapiPadPrivate *srcpriv;
161 GstVaapiDisplay *display;
162 GstVaapiDisplayType display_type;
163 GstVaapiDisplayType display_type_req;
166 GstObject *gl_context;
167 GstObject *gl_display;
168 GstObject *gl_other_context;
170 GstCaps *allowed_raw_caps;
172 gboolean enable_direct_rendering;
173 gboolean copy_output_frame;
176 struct _GstVaapiPluginBaseClass
181 GstElementClass element;
182 GstVideoDecoderClass decoder;
183 GstVideoEncoderClass encoder;
184 GstBaseTransformClass transform;
185 GstVideoSinkClass sink;
188 gboolean (*has_interface) (GstVaapiPluginBase * plugin, GType type);
189 void (*display_changed) (GstVaapiPluginBase * plugin);
190 GstVaapiPadPrivate * (*get_vaapi_pad_private) (GstVaapiPluginBase * plugin, GstPad * pad);
195 gst_vaapi_plugin_base_init_interfaces (GType type);
199 gst_vaapi_plugin_base_class_init (GstVaapiPluginBaseClass * klass);
203 gst_vaapi_plugin_base_init (GstVaapiPluginBase * plugin,
204 GstDebugCategory * debug_category);
208 gst_vaapi_plugin_base_finalize (GstVaapiPluginBase * plugin);
212 gst_vaapi_plugin_base_open (GstVaapiPluginBase * plugin);
216 gst_vaapi_plugin_base_close (GstVaapiPluginBase * plugin);
220 gst_vaapi_plugin_base_has_display_type (GstVaapiPluginBase * plugin,
221 GstVaapiDisplayType display_type_req);
225 gst_vaapi_plugin_base_set_display_type (GstVaapiPluginBase * plugin,
226 GstVaapiDisplayType display_type);
230 gst_vaapi_plugin_base_set_display_name (GstVaapiPluginBase * plugin,
231 const gchar * display_name);
235 gst_vaapi_plugin_base_ensure_display (GstVaapiPluginBase * plugin);
239 gst_vaapi_plugin_base_set_caps (GstVaapiPluginBase * plugin, GstCaps * incaps,
244 gst_vaapi_plugin_base_propose_allocation (GstVaapiPluginBase * plugin,
249 gst_vaapi_plugin_base_decide_allocation (GstVaapiPluginBase * plugin,
254 gst_vaapi_plugin_base_get_input_buffer (GstVaapiPluginBase * plugin,
255 GstBuffer * inbuf, GstBuffer ** outbuf_ptr);
259 gst_vaapi_plugin_base_set_context (GstVaapiPluginBase * plugin,
260 GstContext * context);
264 gst_vaapi_plugin_base_set_gl_context (GstVaapiPluginBase * plugin,
269 gst_vaapi_plugin_base_create_gl_context (GstVaapiPluginBase * plugin);
273 gst_vaapi_plugin_base_get_allowed_sinkpad_raw_caps (GstVaapiPluginBase * plugin);
277 gst_vaapi_plugin_base_get_allowed_srcpad_raw_caps (
278 GstVaapiPluginBase * plugin, GstVideoFormat format);
282 gst_vaapi_plugin_base_set_srcpad_can_dmabuf (GstVaapiPluginBase * plugin,
287 gst_vaapi_plugin_copy_va_buffer (GstVaapiPluginBase * plugin,
288 GstBuffer * inbuf, GstBuffer * outbuf);
293 #endif /* GST_VAAPI_PLUGIN_BASE_H */