static gboolean gst_gl_view_convert_element_set_caps (GstGLFilter * filter, GstCaps * incaps, GstCaps * outcaps) { GstGLViewConvertElement *viewconvert_filter = GST_GL_VIEW_CONVERT_ELEMENT (filter); GstCapsFeatures *gl_features; gboolean ret; GST_DEBUG_OBJECT (filter, "incaps %" GST_PTR_FORMAT " outcaps %" GST_PTR_FORMAT, incaps, outcaps); /* The view_convert component needs RGBA caps */ incaps = gst_caps_copy (incaps); outcaps = gst_caps_copy (outcaps); gst_caps_set_simple (incaps, "format", G_TYPE_STRING, "RGBA", NULL); gl_features = gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_GL_MEMORY); gst_caps_set_features (incaps, 0, gl_features); gst_caps_set_simple (outcaps, "format", G_TYPE_STRING, "RGBA", NULL); gl_features = gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_GL_MEMORY); gst_caps_set_features (outcaps, 0, gl_features); ret = gst_gl_view_convert_set_caps (viewconvert_filter->viewconvert, incaps, outcaps); gst_caps_unref (incaps); gst_caps_unref (outcaps); return ret; }
/* Called after videoaggregator fixates our caps */ static gboolean _negotiated_caps (GstAggregator * agg, GstCaps * caps) { GstVideoAggregator *vagg = GST_VIDEO_AGGREGATOR (agg); GstGLStereoMix *mix = GST_GL_STEREO_MIX (vagg); GstCaps *in_caps; GST_LOG_OBJECT (mix, "Configured output caps %" GST_PTR_FORMAT, caps); if (GST_AGGREGATOR_CLASS (parent_class)->negotiated_src_caps) if (!GST_AGGREGATOR_CLASS (parent_class)->negotiated_src_caps (agg, caps)) return FALSE; /* Update the glview_convert output */ /* We can configure the view_converter now */ gst_gl_view_convert_set_context (mix->viewconvert, GST_GL_BASE_MIXER (mix)->context); in_caps = gst_video_info_to_caps (&mix->mix_info); gst_caps_set_features (in_caps, 0, gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_GL_MEMORY)); gst_caps_set_simple (in_caps, "texture-target", G_TYPE_STRING, GST_GL_TEXTURE_TARGET_2D_STR, NULL); gst_gl_view_convert_set_caps (mix->viewconvert, in_caps, caps); return TRUE; }
static void _init_upload (GstGLStereoSplit * split) { GstGLContext *context = split->context; if (!split->upload) { GstCaps *in_caps = gst_pad_get_current_caps (GST_PAD (split->sink_pad)); GstCaps *split_caps = gst_pad_get_current_caps (split->left_pad); GstCaps *upload_caps = gst_caps_copy (in_caps); GstCapsFeatures *gl_features = gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_GL_MEMORY); GstCaps *gl_caps; split->upload = gst_gl_upload_new (context); gst_caps_set_features (upload_caps, 0, gst_caps_features_copy (gl_features)); gst_gl_upload_set_caps (split->upload, in_caps, upload_caps); gst_caps_unref (in_caps); gl_caps = gst_caps_copy (upload_caps); gst_caps_set_simple (gl_caps, "format", G_TYPE_STRING, "RGBA", NULL); gst_caps_set_features (gl_caps, 0, gst_caps_features_copy (gl_features)); if (!split->convert) { split->convert = gst_gl_color_convert_new (context); gst_gl_color_convert_set_caps (split->convert, upload_caps, gl_caps); } gst_caps_unref (upload_caps); gst_caps_features_free (gl_features); gst_gl_view_convert_set_context (split->viewconvert, split->context); split_caps = gst_caps_make_writable (split_caps); gst_caps_set_simple (split_caps, "multiview-mode", G_TYPE_STRING, "separated", "views", G_TYPE_INT, 2, NULL); gst_gl_view_convert_set_caps (split->viewconvert, gl_caps, split_caps); gst_caps_unref (split_caps); gst_caps_unref (gl_caps); } }