gl: Let base transform relay the meta api for us

During allocation query, when this element is not passthrough, it must
relay the overlay compostion meta and it's parameters. Fortunatly, base
transform can do this for us.

https://bugzilla.gnome.org/show_bug.cgi?id=753850
This commit is contained in:
Nicolas Dufresne 2015-08-20 17:27:34 -07:00
parent 98457cb6ea
commit 206638c439
3 changed files with 29 additions and 32 deletions

View file

@ -41,6 +41,9 @@ static GstCaps *gst_gl_color_convert_element_transform_caps (GstBaseTransform *
bt, GstPadDirection direction, GstCaps * caps, GstCaps * filter); bt, GstPadDirection direction, GstCaps * caps, GstCaps * filter);
static gboolean gst_gl_color_convert_element_get_unit_size (GstBaseTransform * static gboolean gst_gl_color_convert_element_get_unit_size (GstBaseTransform *
trans, GstCaps * caps, gsize * size); trans, GstCaps * caps, gsize * size);
static gboolean
gst_gl_color_convert_element_filter_meta (GstBaseTransform * trans,
GstQuery * query, GType api, const GstStructure * params);
static gboolean gst_gl_color_convert_element_decide_allocation (GstBaseTransform static gboolean gst_gl_color_convert_element_decide_allocation (GstBaseTransform
* trans, GstQuery * query); * trans, GstQuery * query);
static GstFlowReturn static GstFlowReturn
@ -92,6 +95,7 @@ gst_gl_color_convert_element_class_init (GstGLColorConvertElementClass * klass)
bt_class->transform_caps = gst_gl_color_convert_element_transform_caps; bt_class->transform_caps = gst_gl_color_convert_element_transform_caps;
bt_class->set_caps = gst_gl_color_convert_element_set_caps; bt_class->set_caps = gst_gl_color_convert_element_set_caps;
bt_class->get_unit_size = gst_gl_color_convert_element_get_unit_size; bt_class->get_unit_size = gst_gl_color_convert_element_get_unit_size;
bt_class->filter_meta = gst_gl_color_convert_element_filter_meta;
bt_class->decide_allocation = gst_gl_color_convert_element_decide_allocation; bt_class->decide_allocation = gst_gl_color_convert_element_decide_allocation;
bt_class->prepare_output_buffer = bt_class->prepare_output_buffer =
gst_gl_color_convert_element_prepare_output_buffer; gst_gl_color_convert_element_prepare_output_buffer;
@ -159,6 +163,14 @@ gst_gl_color_convert_element_get_unit_size (GstBaseTransform * trans,
return TRUE; return TRUE;
} }
static gboolean
gst_gl_color_convert_element_filter_meta (GstBaseTransform * trans,
GstQuery * query, GType api, const GstStructure * params)
{
/* propose all metadata upstream */
return TRUE;
}
static gboolean static gboolean
gst_gl_color_convert_element_decide_allocation (GstBaseTransform * trans, gst_gl_color_convert_element_decide_allocation (GstBaseTransform * trans,
GstQuery * query) GstQuery * query)

View file

@ -45,6 +45,8 @@ static GstCaps *_gst_gl_upload_element_transform_caps (GstBaseTransform * bt,
GstPadDirection direction, GstCaps * caps, GstCaps * filter); GstPadDirection direction, GstCaps * caps, GstCaps * filter);
static gboolean _gst_gl_upload_element_set_caps (GstBaseTransform * bt, static gboolean _gst_gl_upload_element_set_caps (GstBaseTransform * bt,
GstCaps * in_caps, GstCaps * out_caps); GstCaps * in_caps, GstCaps * out_caps);
static gboolean gst_gl_upload_element_filter_meta (GstBaseTransform * trans,
GstQuery * query, GType api, const GstStructure * params);
static gboolean _gst_gl_upload_element_propose_allocation (GstBaseTransform * static gboolean _gst_gl_upload_element_propose_allocation (GstBaseTransform *
bt, GstQuery * decide_query, GstQuery * query); bt, GstQuery * decide_query, GstQuery * query);
static gboolean _gst_gl_upload_element_decide_allocation (GstBaseTransform * static gboolean _gst_gl_upload_element_decide_allocation (GstBaseTransform *
@ -72,6 +74,7 @@ gst_gl_upload_element_class_init (GstGLUploadElementClass * klass)
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;
bt_class->set_caps = _gst_gl_upload_element_set_caps; bt_class->set_caps = _gst_gl_upload_element_set_caps;
bt_class->filter_meta = gst_gl_upload_element_filter_meta;
bt_class->propose_allocation = _gst_gl_upload_element_propose_allocation; bt_class->propose_allocation = _gst_gl_upload_element_propose_allocation;
bt_class->decide_allocation = _gst_gl_upload_element_decide_allocation; bt_class->decide_allocation = _gst_gl_upload_element_decide_allocation;
bt_class->get_unit_size = gst_gl_upload_element_get_unit_size; bt_class->get_unit_size = gst_gl_upload_element_get_unit_size;
@ -139,37 +142,29 @@ _gst_gl_upload_element_transform_caps (GstBaseTransform * bt,
return gst_gl_upload_transform_caps (context, direction, caps, filter); return gst_gl_upload_transform_caps (context, direction, caps, filter);
} }
static gboolean
gst_gl_upload_element_filter_meta (GstBaseTransform * trans, GstQuery * query,
GType api, const GstStructure * params)
{
/* propose all metadata upstream */
return TRUE;
}
static gboolean static gboolean
_gst_gl_upload_element_propose_allocation (GstBaseTransform * bt, _gst_gl_upload_element_propose_allocation (GstBaseTransform * bt,
GstQuery * decide_query, GstQuery * query) GstQuery * decide_query, GstQuery * query)
{ {
guint alloc_index;
gboolean alloc_has_overlay_meta;
GstGLUploadElement *upload = GST_GL_UPLOAD_ELEMENT (bt); GstGLUploadElement *upload = GST_GL_UPLOAD_ELEMENT (bt);
gboolean ret;
if (!upload->upload) if (!upload->upload)
return FALSE; return FALSE;
alloc_has_overlay_meta = ret = GST_BASE_TRANSFORM_CLASS (parent_class)->propose_allocation (bt,
gst_query_find_allocation_meta (decide_query, decide_query, query);
GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, &alloc_index);
if (alloc_has_overlay_meta) {
const GstStructure *params;
GST_DEBUG ("adding allocation meta in upload for textoverlay");
/* read window size from decide_query */
gst_query_parse_nth_allocation_meta (decide_query, alloc_index, &params);
/* it does not matter if params are NULL (no known window size), forward
* the meta in any case */
gst_query_add_allocation_meta (query,
GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, params);
}
gst_gl_upload_propose_allocation (upload->upload, decide_query, query); gst_gl_upload_propose_allocation (upload->upload, decide_query, query);
return TRUE; return ret;
} }
static gboolean static gboolean

View file

@ -69,8 +69,6 @@ static gboolean gst_gl_base_filter_start (GstBaseTransform * bt);
static gboolean gst_gl_base_filter_stop (GstBaseTransform * bt); static gboolean gst_gl_base_filter_stop (GstBaseTransform * bt);
static gboolean gst_gl_base_filter_decide_allocation (GstBaseTransform * trans, static gboolean gst_gl_base_filter_decide_allocation (GstBaseTransform * trans,
GstQuery * query); GstQuery * query);
static gboolean gst_gl_base_filter_propose_allocation (GstBaseTransform * trans,
GstQuery * decide_query, GstQuery * query);
/* GstGLContextThreadFunc */ /* GstGLContextThreadFunc */
static void gst_gl_base_filter_gl_start (GstGLContext * context, gpointer data); static void gst_gl_base_filter_gl_start (GstGLContext * context, gpointer data);
@ -95,8 +93,6 @@ gst_gl_base_filter_class_init (GstGLBaseFilterClass * klass)
GST_BASE_TRANSFORM_CLASS (klass)->stop = gst_gl_base_filter_stop; GST_BASE_TRANSFORM_CLASS (klass)->stop = gst_gl_base_filter_stop;
GST_BASE_TRANSFORM_CLASS (klass)->decide_allocation = GST_BASE_TRANSFORM_CLASS (klass)->decide_allocation =
gst_gl_base_filter_decide_allocation; gst_gl_base_filter_decide_allocation;
GST_BASE_TRANSFORM_CLASS (klass)->propose_allocation =
gst_gl_base_filter_propose_allocation;
element_class->set_context = gst_gl_base_filter_set_context; element_class->set_context = gst_gl_base_filter_set_context;
element_class->change_state = gst_gl_base_filter_change_state; element_class->change_state = gst_gl_base_filter_change_state;
@ -365,7 +361,8 @@ gst_gl_base_filter_decide_allocation (GstBaseTransform * trans,
goto error; goto error;
} }
return TRUE; return GST_BASE_TRANSFORM_CLASS (parent_class)->decide_allocation (trans,
query);
context_error: context_error:
{ {
@ -381,13 +378,6 @@ error:
} }
} }
static gboolean
gst_gl_base_filter_propose_allocation (GstBaseTransform * trans,
GstQuery * decide_query, GstQuery * query)
{
return FALSE;
}
static GstStateChangeReturn static GstStateChangeReturn
gst_gl_base_filter_change_state (GstElement * element, gst_gl_base_filter_change_state (GstElement * element,
GstStateChange transition) GstStateChange transition)