Userful gstreamer-vaapi
[vaapi:cpu-gstreamer-vaapi.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 #include "gstvaapiuploader.h"
34 #include "gst/vaapi/glibcompat.h"
35
36
37 G_BEGIN_DECLS
38
39 typedef struct _GstVaapiPluginBase GstVaapiPluginBase;
40 typedef struct _GstVaapiPluginBaseClass GstVaapiPluginBaseClass;
41
42 #define GST_VAAPI_PLUGIN_BASE(plugin) \
43   ((GstVaapiPluginBase *)(plugin))
44 #define GST_VAAPI_PLUGIN_BASE_CLASS(plugin) \
45   ((GstVaapiPluginBaseClass *)(plugin))
46 #define GST_VAAPI_PLUGIN_BASE_GET_CLASS(plugin) \
47   GST_VAAPI_PLUGIN_BASE_CLASS(GST_ELEMENT_GET_CLASS( \
48       GST_VAAPI_PLUGIN_BASE_ELEMENT(plugin)))
49 #define GST_VAAPI_PLUGIN_BASE_PARENT(plugin) \
50   (&GST_VAAPI_PLUGIN_BASE(plugin)->parent_instance)
51 #define GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin) \
52   (&GST_VAAPI_PLUGIN_BASE_CLASS(plugin)->parent_class)
53 #define GST_VAAPI_PLUGIN_BASE_ELEMENT(plugin) \
54   (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->element)
55 #define GST_VAAPI_PLUGIN_BASE_ELEMENT_CLASS(plugin) \
56   (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->element)
57 #define GST_VAAPI_PLUGIN_BASE_DECODER(plugin) \
58   (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->decoder)
59 #define GST_VAAPI_PLUGIN_BASE_DECODER_CLASS(plugin) \
60   (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->decoder)
61 #define GST_VAAPI_PLUGIN_BASE_ENCODER(plugin) \
62   (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->encoder)
63 #define GST_VAAPI_PLUGIN_BASE_ENCODER_CLASS(plugin) \
64   (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->encoder)
65 #define GST_VAAPI_PLUGIN_BASE_TRANSFORM(plugin) \
66   (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->transform)
67 #define GST_VAAPI_PLUGIN_BASE_TRANSFORM_CLASS(plugin) \
68   (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->transform)
69 #define GST_VAAPI_PLUGIN_BASE_SINK(plugin) \
70   (&GST_VAAPI_PLUGIN_BASE_PARENT(plugin)->sink)
71 #define GST_VAAPI_PLUGIN_BASE_SINK_CLASS(plugin) \
72   (&GST_VAAPI_PLUGIN_BASE_PARENT_CLASS(plugin)->sink)
73
74 #define GST_VAAPI_PLUGIN_BASE_INIT_INTERFACES \
75   gst_vaapi_plugin_base_init_interfaces(g_define_type_id);
76
77 #define GST_VAAPI_PLUGIN_BASE_SINK_PAD(plugin) \
78   (GST_VAAPI_PLUGIN_BASE(plugin)->sinkpad)
79 #define GST_VAAPI_PLUGIN_BASE_SINK_PAD_CAPS(plugin) \
80   (GST_VAAPI_PLUGIN_BASE(plugin)->sinkpad_caps)
81 #define GST_VAAPI_PLUGIN_BASE_SINK_PAD_INFO(plugin) \
82   (&GST_VAAPI_PLUGIN_BASE(plugin)->sinkpad_info)
83 #define GST_VAAPI_PLUGIN_BASE_SINK_PAD_QUERYFUNC(plugin) \
84   (GST_VAAPI_PLUGIN_BASE(plugin)->sinkpad_query)
85 #define GST_VAAPI_PLUGIN_BASE_SRC_PAD(plugin) \
86   (GST_VAAPI_PLUGIN_BASE(plugin)->srcpad)
87 #define GST_VAAPI_PLUGIN_BASE_SRC_PAD_CAPS(plugin) \
88   (GST_VAAPI_PLUGIN_BASE(plugin)->srcpad_caps)
89 #define GST_VAAPI_PLUGIN_BASE_SRC_PAD_INFO(plugin) \
90   (&GST_VAAPI_PLUGIN_BASE(plugin)->srcpad_info)
91 #define GST_VAAPI_PLUGIN_BASE_SRC_PAD_QUERYFYNC(plugin) \
92   (GST_VAAPI_PLUGIN_BASE(plugin)->srcpad_query)
93
94 #define GST_VAAPI_PLUGIN_BASE_DISPLAY(plugin) \
95   (GST_VAAPI_PLUGIN_BASE(plugin)->display)
96 #define GST_VAAPI_PLUGIN_BASE_DISPLAY_TYPE(plugin) \
97   (GST_VAAPI_PLUGIN_BASE(plugin)->display_type)
98 #define GST_VAAPI_PLUGIN_BASE_DISPLAY_REPLACE(plugin, new_display) \
99   (gst_vaapi_display_replace(&GST_VAAPI_PLUGIN_BASE_DISPLAY(plugin), \
100        (new_display)))
101
102 #define GST_VAAPI_PLUGIN_BASE_UPLOADER(plugin) \
103   (GST_VAAPI_PLUGIN_BASE(plugin)->uploader)
104 #define GST_VAAPI_PLUGIN_BASE_UPLOADER_CAPS(plugin) \
105   (gst_vaapi_uploader_get_caps(GST_VAAPI_PLUGIN_BASE_UPLOADER(plugin)))
106 #define GST_VAAPI_PLUGIN_BASE_UPLOADER_USED(plugin) \
107   (GST_VAAPI_PLUGIN_BASE(plugin)->uploader_used)
108
109 struct _GstVaapiPluginBase
110 {
111   /*< private >*/
112   union
113   {
114     GstElement element;
115     GstVideoDecoder decoder;
116     GstVideoEncoder encoder;
117     GstBaseTransform transform;
118     GstVideoSink sink;
119   } parent_instance;
120
121   GstDebugCategory *debug_category;
122
123   GstPad *sinkpad;
124   GstCaps *sinkpad_caps;
125   gboolean sinkpad_caps_changed;
126   GstVideoInfo sinkpad_info;
127   GstPadQueryFunction sinkpad_query;
128 #if GST_CHECK_VERSION(1,0,0)
129   GstBufferPool *sinkpad_buffer_pool;
130   guint sinkpad_buffer_size;
131 #endif
132
133   GstPad *srcpad;
134   GstCaps *srcpad_caps;
135   gboolean srcpad_caps_changed;
136   GstVideoInfo srcpad_info;
137   GstPadQueryFunction srcpad_query;
138
139   GstVaapiDisplay *display;
140   GstVaapiDisplayType display_type;
141   GstVaapiDisplayType display_type_req;
142
143   GstVaapiUploader *uploader;
144   gboolean uploader_used;
145 };
146
147 struct _GstVaapiPluginBaseClass
148 {
149   /*< private >*/
150   union
151   {
152     GstElementClass element;
153     GstVideoDecoderClass decoder;
154     GstVideoEncoderClass encoder;
155     GstBaseTransformClass transform;
156     GstVideoSinkClass sink;
157   } parent_class;
158
159   gboolean  (*has_interface) (GstVaapiPluginBase * plugin, GType type);
160   void (*display_changed) (GstVaapiPluginBase * plugin);
161 };
162
163 G_GNUC_INTERNAL
164 void
165 gst_vaapi_plugin_base_init_interfaces (GType type);
166
167 G_GNUC_INTERNAL
168 void
169 gst_vaapi_plugin_base_class_init (GstVaapiPluginBaseClass * klass);
170
171 G_GNUC_INTERNAL
172 void
173 gst_vaapi_plugin_base_init (GstVaapiPluginBase * plugin,
174     GstDebugCategory * debug_category);
175
176 G_GNUC_INTERNAL
177 void
178 gst_vaapi_plugin_base_finalize (GstVaapiPluginBase * plugin);
179
180 G_GNUC_INTERNAL
181 gboolean
182 gst_vaapi_plugin_base_open (GstVaapiPluginBase * plugin);
183
184 G_GNUC_INTERNAL
185 void
186 gst_vaapi_plugin_base_close (GstVaapiPluginBase * plugin);
187
188 G_GNUC_INTERNAL
189 void
190 gst_vaapi_plugin_base_set_display_type (GstVaapiPluginBase * plugin,
191     GstVaapiDisplayType display_type);
192
193 G_GNUC_INTERNAL
194 gboolean
195 gst_vaapi_plugin_base_ensure_display (GstVaapiPluginBase * plugin, gchar * displayname);
196
197 G_GNUC_INTERNAL
198 gboolean
199 gst_vaapi_plugin_base_ensure_uploader (GstVaapiPluginBase * plugin);
200
201 G_GNUC_INTERNAL
202 gboolean
203 gst_vaapi_plugin_base_set_caps (GstVaapiPluginBase * plugin, GstCaps * incaps,
204     GstCaps * outcaps, gchar * displayname);
205
206 G_GNUC_INTERNAL
207 gboolean
208 gst_vaapi_plugin_base_propose_allocation (GstVaapiPluginBase * plugin,
209     GstQuery * query, gchar * displayname);
210
211 G_GNUC_INTERNAL
212 GstFlowReturn
213 gst_vaapi_plugin_base_allocate_input_buffer (GstVaapiPluginBase * plugin,
214     GstCaps * caps, GstBuffer ** outbuf_ptr);
215
216 G_GNUC_INTERNAL
217 GstFlowReturn
218 gst_vaapi_plugin_base_get_input_buffer (GstVaapiPluginBase * plugin,
219     GstBuffer * inbuf, GstBuffer ** outbuf_ptr);
220
221 G_END_DECLS
222
223 #endif /* GST_VAAPI_PLUGIN_BASE_H */