/** * _owr_media_renderer_set_sink: * @renderer: * @sink: (transfer full) (allow-none): * * Returns: */ void _owr_media_renderer_set_sink(OwrMediaRenderer *renderer, gpointer sink_ptr) { OwrMediaRendererPrivate *priv; GstElement *sink = sink_ptr; g_return_if_fail(renderer); g_return_if_fail(!sink || GST_IS_ELEMENT(sink)); priv = renderer->priv; g_mutex_lock(&priv->media_renderer_lock); if (priv->sink) { gst_element_set_state(priv->pipeline, GST_STATE_NULL); gst_bin_remove(GST_BIN(priv->pipeline), priv->sink); priv->sink = NULL; } if (!sink) { if (priv->src) { _owr_media_source_release_source(priv->source, priv->src); gst_bin_remove(GST_BIN(priv->pipeline), priv->src); priv->src = NULL; } g_mutex_unlock(&priv->media_renderer_lock); return; } gst_bin_add(GST_BIN(priv->pipeline), sink); priv->sink = sink; maybe_start_renderer(renderer); g_mutex_unlock(&priv->media_renderer_lock); }
static gboolean set_source(GHashTable *args) { OwrMediaRenderer *renderer; OwrMediaSource *source; OwrMediaRendererPrivate *priv; g_return_val_if_fail(args, G_SOURCE_REMOVE); renderer = g_hash_table_lookup(args, "renderer"); source = g_hash_table_lookup(args, "source"); g_return_val_if_fail(OWR_IS_MEDIA_RENDERER(renderer), G_SOURCE_REMOVE); g_return_val_if_fail(!source || OWR_IS_MEDIA_SOURCE(source), G_SOURCE_REMOVE); priv = renderer->priv; g_mutex_lock(&priv->media_renderer_lock); if (source == priv->source) { g_mutex_unlock(&priv->media_renderer_lock); goto end; } if (priv->source) { _owr_media_source_release_source(priv->source, priv->src); gst_element_set_state(priv->src, GST_STATE_NULL); gst_bin_remove(GST_BIN(priv->pipeline), priv->src); priv->src = NULL; g_object_unref(priv->source); priv->source = NULL; } if (!source) { /* Shut down the pipeline if we have no source */ gst_element_set_state(priv->pipeline, GST_STATE_NULL); OWR_POST_EVENT(renderer, RENDERER_STOPPED, NULL); g_mutex_unlock(&priv->media_renderer_lock); goto end; } priv->source = g_object_ref(source); _owr_media_renderer_reconfigure_element(renderer); maybe_start_renderer(renderer); g_mutex_unlock(&priv->media_renderer_lock); end: g_object_unref(renderer); if (source) g_object_unref(source); g_hash_table_unref(args); return G_SOURCE_REMOVE; }