- case GST_MESSAGE_NEED_CONTEXT:{
- G_LOCK (context);
- /* We could filter something here, but instead we can also just pass the complete
- * context knowledge we have to the element. If we have what it needs, it will be
- * happy, otherwise we can't do anything else anyway */
- if (context)
- gst_element_set_context (GST_ELEMENT_CAST (GST_MESSAGE_SRC (message)),
- context);
- G_UNLOCK (context);
-
- break;
- }
- case GST_MESSAGE_HAVE_CONTEXT:{
- GstContext *context_new;
-
- gst_message_parse_have_context (message, &context_new);
-
- /* Merge the contexts here as soon as possible and not
- * in the async bus handler, in case something asks for
- * a specific context before the async bus handler is run.
- *
- * Don't set the context on the complete pipeline here as it
- * might deadlock, but do that from the async bus handler
- * instead.
- */
- G_LOCK (context);
- if (context) {
- const GstStructure *s1;
- GstStructure *s2;
-
- /* Merge structures */
- context = gst_context_make_writable (context);
- s1 = gst_context_get_structure (context_new);
- s2 = gst_context_writable_structure (context);
- gst_structure_foreach (s1, merge_structures, s2);
- } else {
- /* Copy over the context */
- gst_context_replace (&context, context_new);
- }
- gst_context_unref (context_new);
- G_UNLOCK (context);