plugins: query upstream element for a GstContext.

Fix gst_vaapi_video_context_prepare() to also query upstream elements
for a valid GstContext. Improve comments regarding the steps used to
lookup or build that context, thus conforming to the GstContext API
recommendations.

https://bugzilla.gnome.org/show_bug.cgi?id=709112

Signed-off-by: Gwenole Beauchesne <gwenole.beauchesne@intel.com>
This commit is contained in:
Víctor Manuel Jáquez Leal 2013-10-01 12:09:44 +02:00 committed by Gwenole Beauchesne
parent 6b3c08a729
commit b56144e924

View file

@ -98,7 +98,15 @@ run_context_query(GstElement *element, GstQuery *query)
gst_iterator_resync(it); gst_iterator_resync(it);
gst_iterator_free(it); gst_iterator_free(it);
/* Ignore upstream neighbours */ if (g_value_get_boolean(&res))
return TRUE;
/* If none, ask upstream neighbour (auto-plugged case) */
it = gst_element_iterate_sink_pads(element);
while (gst_iterator_fold(it, func, &res, query) == GST_ITERATOR_RESYNC)
gst_iterator_resync(it);
gst_iterator_free(it);
return g_value_get_boolean(&res); return g_value_get_boolean(&res);
} }
@ -107,12 +115,23 @@ gst_vaapi_video_context_prepare(GstElement *element, const gchar **types)
{ {
GstContext *context; GstContext *context;
GstQuery *query; GstQuery *query;
GstMessage *msg;
if (!GST_CAT_CONTEXT) if (!GST_CAT_CONTEXT)
GST_DEBUG_CATEGORY_GET(GST_CAT_CONTEXT, "GST_CONTEXT"); GST_DEBUG_CATEGORY_GET(GST_CAT_CONTEXT, "GST_CONTEXT");
/* (2) Query downstream with GST_QUERY_CONTEXT for the context and /* 1) Check if the element already has a context of the specific
check if downstream already has a context of the specified type */ * type, i.e. it was previously set via
* gst_element_set_context(). */
/* This was already done by the caller of this function:
* gst_vaapi_ensure_display() */
/* 2) Query downstream with GST_QUERY_CONTEXT for the context and
check if downstream already has a context of the specific
type */
/* 3) Query upstream with GST_QUERY_CONTEXT for the context and
check if upstream already has a context of the specific
type */
context = NULL; context = NULL;
query = gst_query_new_context(GST_VAAPI_DISPLAY_CONTEXT_TYPE_NAME); query = gst_query_new_context(GST_VAAPI_DISPLAY_CONTEXT_TYPE_NAME);
if (run_context_query(element, query)) { if (run_context_query(element, query)) {
@ -122,24 +141,26 @@ gst_vaapi_video_context_prepare(GstElement *element, const gchar **types)
gst_element_set_context(element, context); gst_element_set_context(element, context);
} }
else { else {
/* (3) Post a GST_MESSAGE_NEED_CONTEXT message on the bus with /* 4) Post a GST_MESSAGE_NEED_CONTEXT message on the bus with
the required context types and afterwards check if a usable the required context types and afterwards check if an
context was set now as in (1). The message could be handled usable context was set now as in 1). The message could
by the parent bins of the element and the application */ be handled by the parent bins of the element and the
GstMessage *msg; application. */
GST_CAT_INFO_OBJECT(GST_CAT_CONTEXT, element, GST_CAT_INFO_OBJECT(GST_CAT_CONTEXT, element,
"posting `need-context' message"); "posting `need-context' message");
msg = gst_message_new_need_context(GST_OBJECT_CAST(element), msg = gst_message_new_need_context(GST_OBJECT_CAST(element),
GST_VAAPI_DISPLAY_CONTEXT_TYPE_NAME); GST_VAAPI_DISPLAY_CONTEXT_TYPE_NAME);
gst_element_post_message(element, msg); gst_element_post_message(element, msg);
/* The check of an usable context is done by the caller:
gst_vaapi_ensure_display() */
} }
gst_query_unref(query); gst_query_unref(query);
} }
/* (4) Create context by itself and post a GST_MESSAGE_HAVE_CONTEXT /* 5) Create a context by itself and post a GST_MESSAGE_HAVE_CONTEXT message
message and send a GST_EVENT_CONTEXT event downstream, thus on the bus. */
containing the complete context information at this time */
void void
gst_vaapi_video_context_propagate(GstElement *element, GstVaapiDisplay *display) gst_vaapi_video_context_propagate(GstElement *element, GstVaapiDisplay *display)
{ {