Ejemplo n.º 1
0
static void owr_media_renderer_finalize(GObject *object)
{
    OwrMediaRenderer *renderer = OWR_MEDIA_RENDERER(object);
    OwrMediaRendererPrivate *priv = renderer->priv;

    owr_message_origin_bus_set_free(priv->message_origin_bus_set);
    priv->message_origin_bus_set = NULL;

    if (priv->pipeline) {
        gst_element_set_state(priv->pipeline, GST_STATE_NULL);
        gst_object_unref(priv->pipeline);
        priv->pipeline = NULL;
        priv->sink = NULL;
    }

    if (priv->source) {
        _owr_media_source_release_source(priv->source, priv->src);
        gst_element_set_state(priv->src, GST_STATE_NULL);
        g_object_unref(priv->source);
        priv->source = NULL;
        priv->src = NULL;
    }

    g_mutex_clear(&priv->media_renderer_lock);

    G_OBJECT_CLASS(owr_media_renderer_parent_class)->finalize(object);
}
Ejemplo n.º 2
0
/**
 * _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);
}
Ejemplo n.º 3
0
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;
}