mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-01-02 21:48:55 +00:00
glupload: provide the sink template caps that could be used
https://bugzilla.gnome.org/show_bug.cgi?id=746399
This commit is contained in:
parent
cb56a6b32b
commit
0b7f65bbc3
7 changed files with 60 additions and 28 deletions
|
@ -61,17 +61,12 @@ static GstStaticPadTemplate _src_pad_template = GST_STATIC_PAD_TEMPLATE ("src",
|
||||||
GST_PAD_ALWAYS,
|
GST_PAD_ALWAYS,
|
||||||
GST_STATIC_CAPS ("video/x-raw(ANY)"));
|
GST_STATIC_CAPS ("video/x-raw(ANY)"));
|
||||||
|
|
||||||
static GstStaticPadTemplate _sink_pad_template =
|
|
||||||
GST_STATIC_PAD_TEMPLATE ("sink",
|
|
||||||
GST_PAD_SINK,
|
|
||||||
GST_PAD_ALWAYS,
|
|
||||||
GST_STATIC_CAPS ("video/x-raw(ANY)"));
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_gl_filter_bin_class_init (GstGLFilterBinClass * klass)
|
gst_gl_filter_bin_class_init (GstGLFilterBinClass * klass)
|
||||||
{
|
{
|
||||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||||
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
|
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
|
||||||
|
GstCaps *upload_caps;
|
||||||
|
|
||||||
element_class->change_state = gst_gl_filter_bin_change_state;
|
element_class->change_state = gst_gl_filter_bin_change_state;
|
||||||
|
|
||||||
|
@ -80,8 +75,11 @@ gst_gl_filter_bin_class_init (GstGLFilterBinClass * klass)
|
||||||
|
|
||||||
gst_element_class_add_pad_template (element_class,
|
gst_element_class_add_pad_template (element_class,
|
||||||
gst_static_pad_template_get (&_src_pad_template));
|
gst_static_pad_template_get (&_src_pad_template));
|
||||||
|
|
||||||
|
upload_caps = gst_gl_upload_get_input_template_caps ();
|
||||||
gst_element_class_add_pad_template (element_class,
|
gst_element_class_add_pad_template (element_class,
|
||||||
gst_static_pad_template_get (&_sink_pad_template));
|
gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, upload_caps));
|
||||||
|
gst_caps_unref (upload_caps);
|
||||||
|
|
||||||
g_object_class_install_property (gobject_class, PROP_FILTER,
|
g_object_class_install_property (gobject_class, PROP_FILTER,
|
||||||
g_param_spec_object ("filter",
|
g_param_spec_object ("filter",
|
||||||
|
|
|
@ -110,12 +110,6 @@ static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
|
||||||
GST_STATIC_CAPS ("video/x-raw(ANY)")
|
GST_STATIC_CAPS ("video/x-raw(ANY)")
|
||||||
);
|
);
|
||||||
|
|
||||||
static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink_%u",
|
|
||||||
GST_PAD_SINK,
|
|
||||||
GST_PAD_REQUEST,
|
|
||||||
GST_STATIC_CAPS ("video/x-raw(ANY)")
|
|
||||||
);
|
|
||||||
|
|
||||||
static void gst_gl_mixer_bin_set_property (GObject * object, guint prop_id,
|
static void gst_gl_mixer_bin_set_property (GObject * object, guint prop_id,
|
||||||
const GValue * value, GParamSpec * pspec);
|
const GValue * value, GParamSpec * pspec);
|
||||||
static void gst_gl_mixer_bin_get_property (GObject * object, guint prop_id,
|
static void gst_gl_mixer_bin_get_property (GObject * object, guint prop_id,
|
||||||
|
@ -133,6 +127,7 @@ gst_gl_mixer_bin_class_init (GstGLMixerBinClass * klass)
|
||||||
{
|
{
|
||||||
GObjectClass *gobject_class = (GObjectClass *) klass;
|
GObjectClass *gobject_class = (GObjectClass *) klass;
|
||||||
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
|
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
|
||||||
|
GstCaps *upload_caps;
|
||||||
|
|
||||||
g_type_class_add_private (klass, sizeof (GstGLMixerBinPrivate));
|
g_type_class_add_private (klass, sizeof (GstGLMixerBinPrivate));
|
||||||
|
|
||||||
|
@ -178,8 +173,12 @@ gst_gl_mixer_bin_class_init (GstGLMixerBinClass * klass)
|
||||||
|
|
||||||
gst_element_class_add_pad_template (element_class,
|
gst_element_class_add_pad_template (element_class,
|
||||||
gst_static_pad_template_get (&src_factory));
|
gst_static_pad_template_get (&src_factory));
|
||||||
|
|
||||||
|
upload_caps = gst_gl_upload_get_input_template_caps ();
|
||||||
gst_element_class_add_pad_template (element_class,
|
gst_element_class_add_pad_template (element_class,
|
||||||
gst_static_pad_template_get (&sink_factory));
|
gst_pad_template_new ("sink_%u", GST_PAD_SINK, GST_PAD_REQUEST,
|
||||||
|
upload_caps));
|
||||||
|
gst_caps_unref (upload_caps);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -43,12 +43,6 @@ static void gst_gl_sink_bin_video_overlay_init (gpointer g_iface,
|
||||||
static void gst_gl_sink_bin_navigation_interface_init (gpointer g_iface,
|
static void gst_gl_sink_bin_navigation_interface_init (gpointer g_iface,
|
||||||
gpointer g_iface_data);
|
gpointer g_iface_data);
|
||||||
|
|
||||||
static GstStaticPadTemplate gst_gl_sink_bin_template =
|
|
||||||
GST_STATIC_PAD_TEMPLATE ("sink",
|
|
||||||
GST_PAD_SINK,
|
|
||||||
GST_PAD_ALWAYS,
|
|
||||||
GST_STATIC_CAPS ("video/x-raw(ANY)"));
|
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
|
@ -79,6 +73,7 @@ gst_gl_sink_bin_class_init (GstGLSinkBinClass * klass)
|
||||||
{
|
{
|
||||||
GObjectClass *gobject_class;
|
GObjectClass *gobject_class;
|
||||||
GstElementClass *element_class;
|
GstElementClass *element_class;
|
||||||
|
GstCaps *upload_caps;
|
||||||
|
|
||||||
gobject_class = (GObjectClass *) klass;
|
gobject_class = (GObjectClass *) klass;
|
||||||
element_class = GST_ELEMENT_CLASS (klass);
|
element_class = GST_ELEMENT_CLASS (klass);
|
||||||
|
@ -119,8 +114,10 @@ gst_gl_sink_bin_class_init (GstGLSinkBinClass * klass)
|
||||||
"Infrastructure to process GL textures",
|
"Infrastructure to process GL textures",
|
||||||
"Matthew Waters <matthew@centricular.com>");
|
"Matthew Waters <matthew@centricular.com>");
|
||||||
|
|
||||||
|
upload_caps = gst_gl_upload_get_input_template_caps ();
|
||||||
gst_element_class_add_pad_template (element_class,
|
gst_element_class_add_pad_template (element_class,
|
||||||
gst_static_pad_template_get (&gst_gl_sink_bin_template));
|
gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, upload_caps));
|
||||||
|
gst_caps_unref (upload_caps);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -72,17 +72,12 @@ GST_STATIC_PAD_TEMPLATE ("src",
|
||||||
GST_PAD_ALWAYS,
|
GST_PAD_ALWAYS,
|
||||||
GST_STATIC_CAPS ("video/x-raw(ANY)"));
|
GST_STATIC_CAPS ("video/x-raw(ANY)"));
|
||||||
|
|
||||||
static GstStaticPadTemplate gst_gl_upload_element_sink_pad_template =
|
|
||||||
GST_STATIC_PAD_TEMPLATE ("sink",
|
|
||||||
GST_PAD_SINK,
|
|
||||||
GST_PAD_ALWAYS,
|
|
||||||
GST_STATIC_CAPS ("video/x-raw(ANY)"));
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_gl_upload_element_class_init (GstGLUploadElementClass * klass)
|
gst_gl_upload_element_class_init (GstGLUploadElementClass * klass)
|
||||||
{
|
{
|
||||||
GstBaseTransformClass *bt_class = GST_BASE_TRANSFORM_CLASS (klass);
|
GstBaseTransformClass *bt_class = GST_BASE_TRANSFORM_CLASS (klass);
|
||||||
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
|
GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
|
||||||
|
GstCaps *upload_caps;
|
||||||
|
|
||||||
bt_class->query = gst_gl_upload_element_query;
|
bt_class->query = gst_gl_upload_element_query;
|
||||||
bt_class->transform_caps = _gst_gl_upload_element_transform_caps;
|
bt_class->transform_caps = _gst_gl_upload_element_transform_caps;
|
||||||
|
@ -98,8 +93,11 @@ gst_gl_upload_element_class_init (GstGLUploadElementClass * klass)
|
||||||
|
|
||||||
gst_element_class_add_pad_template (element_class,
|
gst_element_class_add_pad_template (element_class,
|
||||||
gst_static_pad_template_get (&gst_gl_upload_element_src_pad_template));
|
gst_static_pad_template_get (&gst_gl_upload_element_src_pad_template));
|
||||||
|
|
||||||
|
upload_caps = gst_gl_upload_get_input_template_caps ();
|
||||||
gst_element_class_add_pad_template (element_class,
|
gst_element_class_add_pad_template (element_class,
|
||||||
gst_static_pad_template_get (&gst_gl_upload_element_sink_pad_template));
|
gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, upload_caps));
|
||||||
|
gst_caps_unref (upload_caps);
|
||||||
|
|
||||||
gst_element_class_set_metadata (element_class,
|
gst_element_class_set_metadata (element_class,
|
||||||
"OpenGL uploader", "Filter/Video",
|
"OpenGL uploader", "Filter/Video",
|
||||||
|
|
|
@ -109,6 +109,10 @@ struct _GstGLMemory
|
||||||
};
|
};
|
||||||
|
|
||||||
#define GST_CAPS_FEATURE_MEMORY_GL_MEMORY "memory:GLMemory"
|
#define GST_CAPS_FEATURE_MEMORY_GL_MEMORY "memory:GLMemory"
|
||||||
|
#define GST_GL_MEMORY_VIDEO_FORMATS_STR \
|
||||||
|
"{ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, " \
|
||||||
|
"AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, " \
|
||||||
|
"GRAY8, GRAY16_LE, GRAY16_BE }"
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GST_GL_MEMORY_ALLOCATOR:
|
* GST_GL_MEMORY_ALLOCATOR:
|
||||||
|
|
|
@ -97,6 +97,8 @@ struct _UploadMethod
|
||||||
const gchar *name;
|
const gchar *name;
|
||||||
GstGLUploadMethodFlags flags;
|
GstGLUploadMethodFlags flags;
|
||||||
|
|
||||||
|
GstStaticCaps input_template_caps;
|
||||||
|
|
||||||
gpointer (*new) (GstGLUpload * upload);
|
gpointer (*new) (GstGLUpload * upload);
|
||||||
GstCaps *(*transform_caps) (GstGLContext * context,
|
GstCaps *(*transform_caps) (GstGLContext * context,
|
||||||
GstPadDirection direction, GstCaps * caps);
|
GstPadDirection direction, GstCaps * caps);
|
||||||
|
@ -277,6 +279,8 @@ _gl_memory_upload_free (gpointer impl)
|
||||||
static const UploadMethod _gl_memory_upload = {
|
static const UploadMethod _gl_memory_upload = {
|
||||||
"GLMemory",
|
"GLMemory",
|
||||||
METHOD_FLAG_CAN_SHARE_CONTEXT,
|
METHOD_FLAG_CAN_SHARE_CONTEXT,
|
||||||
|
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
|
||||||
|
(GST_CAPS_FEATURE_MEMORY_GL_MEMORY, GST_GL_MEMORY_VIDEO_FORMATS_STR)),
|
||||||
&_gl_memory_upload_new,
|
&_gl_memory_upload_new,
|
||||||
&_gl_memory_upload_transform_caps,
|
&_gl_memory_upload_transform_caps,
|
||||||
&_gl_memory_upload_accept,
|
&_gl_memory_upload_accept,
|
||||||
|
@ -445,6 +449,8 @@ _egl_image_upload_free (gpointer impl)
|
||||||
static const UploadMethod _egl_image_upload = {
|
static const UploadMethod _egl_image_upload = {
|
||||||
"EGLImage",
|
"EGLImage",
|
||||||
0,
|
0,
|
||||||
|
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
|
||||||
|
(GST_CAPS_FEATURE_MEMORY_EGL_IMAGE, "RGBA")),
|
||||||
&_egl_image_upload_new,
|
&_egl_image_upload_new,
|
||||||
&_egl_image_upload_transform_caps,
|
&_egl_image_upload_transform_caps,
|
||||||
&_egl_image_upload_accept,
|
&_egl_image_upload_accept,
|
||||||
|
@ -651,6 +657,8 @@ _upload_meta_upload_free (gpointer impl)
|
||||||
static const UploadMethod _upload_meta_upload = {
|
static const UploadMethod _upload_meta_upload = {
|
||||||
"UploadMeta",
|
"UploadMeta",
|
||||||
METHOD_FLAG_CAN_SHARE_CONTEXT,
|
METHOD_FLAG_CAN_SHARE_CONTEXT,
|
||||||
|
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
|
||||||
|
(GST_CAPS_FEATURE_META_GST_VIDEO_GL_TEXTURE_UPLOAD_META, "RGBA")),
|
||||||
&_upload_meta_upload_new,
|
&_upload_meta_upload_new,
|
||||||
&_upload_meta_upload_transform_caps,
|
&_upload_meta_upload_transform_caps,
|
||||||
&_upload_meta_upload_accept,
|
&_upload_meta_upload_accept,
|
||||||
|
@ -780,6 +788,7 @@ _raw_data_upload_free (gpointer impl)
|
||||||
static const UploadMethod _raw_data_upload = {
|
static const UploadMethod _raw_data_upload = {
|
||||||
"Raw Data",
|
"Raw Data",
|
||||||
0,
|
0,
|
||||||
|
GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (GST_GL_MEMORY_VIDEO_FORMATS_STR)),
|
||||||
&_raw_data_upload_new,
|
&_raw_data_upload_new,
|
||||||
&_raw_data_upload_transform_caps,
|
&_raw_data_upload_transform_caps,
|
||||||
&_raw_data_upload_accept,
|
&_raw_data_upload_accept,
|
||||||
|
@ -796,6 +805,31 @@ static const UploadMethod *upload_methods[] = { &_gl_memory_upload,
|
||||||
&_upload_meta_upload, &_raw_data_upload
|
&_upload_meta_upload, &_raw_data_upload
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static GMutex upload_global_lock;
|
||||||
|
|
||||||
|
GstCaps *
|
||||||
|
gst_gl_upload_get_input_template_caps (void)
|
||||||
|
{
|
||||||
|
GstCaps *ret = NULL;
|
||||||
|
gint i;
|
||||||
|
|
||||||
|
g_mutex_lock (&upload_global_lock);
|
||||||
|
|
||||||
|
/* FIXME: cache this and invalidate on changes to upload_methods */
|
||||||
|
for (i = 0; i < G_N_ELEMENTS (upload_methods); i++) {
|
||||||
|
GstCaps *template =
|
||||||
|
gst_static_caps_get ((GstStaticCaps *) &
|
||||||
|
upload_methods[i]->input_template_caps);
|
||||||
|
ret = ret == NULL ? template : gst_caps_merge (ret, template);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = gst_caps_simplify (ret);
|
||||||
|
|
||||||
|
g_mutex_unlock (&upload_global_lock);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
#define DEBUG_INIT \
|
#define DEBUG_INIT \
|
||||||
GST_DEBUG_CATEGORY_INIT (gst_gl_upload_debug, "glupload", 0, "upload");
|
GST_DEBUG_CATEGORY_INIT (gst_gl_upload_debug, "glupload", 0, "upload");
|
||||||
|
|
||||||
|
|
|
@ -78,6 +78,8 @@ struct _GstGLUploadClass
|
||||||
GstObjectClass object_class;
|
GstObjectClass object_class;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
GstCaps * gst_gl_upload_get_input_template_caps (void);
|
||||||
|
|
||||||
GstGLUpload * gst_gl_upload_new (GstGLContext * context);
|
GstGLUpload * gst_gl_upload_new (GstGLContext * context);
|
||||||
|
|
||||||
GstCaps * gst_gl_upload_transform_caps (GstGLContext * context,
|
GstCaps * gst_gl_upload_transform_caps (GstGLContext * context,
|
||||||
|
|
Loading…
Reference in a new issue