#include <gst/video/gstvideosink.h>
#include <gst/vaapi/gstvaapidisplay.h>
-#if USE_GST_GL_HELPERS
-# include <gst/gl/gstglcontext.h>
-#endif
-
G_BEGIN_DECLS
typedef struct _GstVaapiPluginBase GstVaapiPluginBase;
typedef struct _GstVaapiPluginBaseClass GstVaapiPluginBaseClass;
+typedef struct _GstVaapiPadPrivate GstVaapiPadPrivate;
#define GST_VAAPI_PLUGIN_BASE(plugin) \
((GstVaapiPluginBase *)(plugin))
#define GST_VAAPI_PLUGIN_BASE_SINK_PAD(plugin) \
(GST_VAAPI_PLUGIN_BASE(plugin)->sinkpad)
+#define GST_VAAPI_PLUGIN_BASE_SINK_PAD_PRIVATE(plugin) \
+ (GST_VAAPI_PLUGIN_BASE(plugin)->sinkpriv)
#define GST_VAAPI_PLUGIN_BASE_SINK_PAD_CAPS(plugin) \
- (GST_VAAPI_PLUGIN_BASE(plugin)->sinkpad_caps)
+ (GST_VAAPI_PLUGIN_BASE_SINK_PAD_PRIVATE(plugin)->caps)
#define GST_VAAPI_PLUGIN_BASE_SINK_PAD_INFO(plugin) \
- (&GST_VAAPI_PLUGIN_BASE(plugin)->sinkpad_info)
+ (&GST_VAAPI_PLUGIN_BASE_SINK_PAD_PRIVATE(plugin)->info)
+
#define GST_VAAPI_PLUGIN_BASE_SRC_PAD(plugin) \
(GST_VAAPI_PLUGIN_BASE(plugin)->srcpad)
+#define GST_VAAPI_PLUGIN_BASE_SRC_PAD_PRIVATE(plugin) \
+ (GST_VAAPI_PLUGIN_BASE(plugin)->srcpriv)
#define GST_VAAPI_PLUGIN_BASE_SRC_PAD_CAPS(plugin) \
- (GST_VAAPI_PLUGIN_BASE(plugin)->srcpad_caps)
+ (GST_VAAPI_PLUGIN_BASE_SRC_PAD_PRIVATE(plugin)->caps)
#define GST_VAAPI_PLUGIN_BASE_SRC_PAD_INFO(plugin) \
- (&GST_VAAPI_PLUGIN_BASE(plugin)->srcpad_info)
+ (&GST_VAAPI_PLUGIN_BASE_SRC_PAD_PRIVATE(plugin)->info)
+#define GST_VAAPI_PLUGIN_BASE_SRC_PAD_CAN_DMABUF(plugin) \
+ (GST_VAAPI_PLUGIN_BASE_SRC_PAD_PRIVATE(plugin)->can_dmabuf)
+#define GST_VAAPI_PLUGIN_BASE_SRC_PAD_BUFFER_POOL(plugin) \
+ (GST_VAAPI_PLUGIN_BASE_SRC_PAD_PRIVATE(plugin)->buffer_pool)
+#define GST_VAAPI_PLUGIN_BASE_SRC_PAD_ALLOCATOR(plugin) \
+ (GST_VAAPI_PLUGIN_BASE_SRC_PAD_PRIVATE(plugin)->allocator)
+#define GST_VAAPI_PLUGIN_BASE_OTHER_ALLOCATOR(plugin) \
+ (GST_VAAPI_PLUGIN_BASE_SRC_PAD_PRIVATE(plugin)->other_allocator)
+#define GST_VAAPI_PLUGIN_BASE_OTHER_ALLOCATOR_PARAMS(plugin) \
+ (GST_VAAPI_PLUGIN_BASE_SRC_PAD_PRIVATE(plugin)->other_allocator_params)
+
+#define GST_VAAPI_PLUGIN_BASE_COPY_OUTPUT_FRAME(plugin) \
+ (GST_VAAPI_PLUGIN_BASE(plugin)->copy_output_frame)
#define GST_VAAPI_PLUGIN_BASE_DISPLAY(plugin) \
(GST_VAAPI_PLUGIN_BASE(plugin)->display)
(gst_vaapi_display_replace(&GST_VAAPI_PLUGIN_BASE_DISPLAY(plugin), \
(new_display)))
-#define GST_VAAPI_PLUGIN_BASE_DEFINE_VMETHODS(parent_class) \
- GST_VAAPI_PLUGIN_BASE_DEFINE_SET_CONTEXT(parent_class) \
- GST_VAAPI_PLUGIN_BASE_DEFINE_CHANGE_STATE(parent_class)
-
#define GST_VAAPI_PLUGIN_BASE_DEFINE_SET_CONTEXT(parent_class) \
static void \
gst_vaapi_base_set_context (GstElement * element, GstContext * context) \
GST_ELEMENT_CLASS (parent_class)->set_context (element, context); \
}
-#define GST_VAAPI_PLUGIN_BASE_DEFINE_CHANGE_STATE(parent_class) \
- static GstStateChangeReturn \
- gst_vaapi_base_change_state (GstElement * element, \
- GstStateChange transition) \
- { \
- GstStateChangeReturn ret; \
- \
- ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, \
- transition); \
- if (ret == GST_STATE_CHANGE_FAILURE) \
- return ret; \
- \
- switch (transition) { \
- case GST_STATE_CHANGE_NULL_TO_READY:{ \
- GstVaapiPluginBase *const plugin = GST_VAAPI_PLUGIN_BASE (element); \
- if (!gst_vaapi_plugin_base_driver_is_whitelisted (plugin)) \
- ret = GST_STATE_CHANGE_FAILURE; \
- break; \
- } \
- default: \
- break; \
- } \
- return ret; \
- }
+struct _GstVaapiPadPrivate
+{
+ GstCaps *caps;
+ GstVideoInfo info;
+ GstBufferPool *buffer_pool;
+ GstAllocator *allocator;
+ guint buffer_size;
+ gboolean caps_is_raw;
+
+ gboolean can_dmabuf;
+
+ GstAllocator *other_allocator;
+ GstAllocationParams other_allocator_params;
+};
struct _GstVaapiPluginBase
{
GstDebugCategory *debug_category;
GstPad *sinkpad;
- GstCaps *sinkpad_caps;
- gboolean sinkpad_caps_is_raw;
- GstVideoInfo sinkpad_info;
- GstBufferPool *sinkpad_buffer_pool;
- guint sinkpad_buffer_size;
-
GstPad *srcpad;
- GstCaps *srcpad_caps;
- GstVideoInfo srcpad_info;
- GstBufferPool *srcpad_buffer_pool;
+
+ GstVaapiPadPrivate *sinkpriv;
+ GstVaapiPadPrivate *srcpriv;
GstVaapiDisplay *display;
GstVaapiDisplayType display_type;
gchar *display_name;
GstObject *gl_context;
+ GstObject *gl_display;
+ GstObject *gl_other_context;
GstCaps *allowed_raw_caps;
- GstAllocator *sinkpad_allocator;
- GstAllocator *srcpad_allocator;
+
+ gboolean enable_direct_rendering;
+ gboolean copy_output_frame;
};
struct _GstVaapiPluginBaseClass
gboolean (*has_interface) (GstVaapiPluginBase * plugin, GType type);
void (*display_changed) (GstVaapiPluginBase * plugin);
+ GstVaapiPadPrivate * (*get_vaapi_pad_private) (GstVaapiPluginBase * plugin, GstPad * pad);
};
G_GNUC_INTERNAL
GstBuffer * inbuf, GstBuffer ** outbuf_ptr);
G_GNUC_INTERNAL
-gboolean
-gst_vaapi_plugin_base_driver_is_whitelisted (GstVaapiPluginBase * plugin);
-
-G_GNUC_INTERNAL
void
gst_vaapi_plugin_base_set_context (GstVaapiPluginBase * plugin,
GstContext * context);
GstObject * object);
G_GNUC_INTERNAL
+GstObject *
+gst_vaapi_plugin_base_create_gl_context (GstVaapiPluginBase * plugin);
+
+G_GNUC_INTERNAL
GstCaps *
-gst_vaapi_plugin_base_get_allowed_raw_caps (GstVaapiPluginBase * plugin);
+gst_vaapi_plugin_base_get_allowed_sinkpad_raw_caps (GstVaapiPluginBase * plugin);
+
+G_GNUC_INTERNAL
+GstCaps *
+gst_vaapi_plugin_base_get_allowed_srcpad_raw_caps (
+ GstVaapiPluginBase * plugin, GstVideoFormat format);
+
+G_GNUC_INTERNAL
+void
+gst_vaapi_plugin_base_set_srcpad_can_dmabuf (GstVaapiPluginBase * plugin,
+ GstObject * object);
+
+G_GNUC_INTERNAL
+gboolean
+gst_vaapi_plugin_copy_va_buffer (GstVaapiPluginBase * plugin,
+ GstBuffer * inbuf, GstBuffer * outbuf);
+
G_END_DECLS