static void rsn_dvdbin_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) { RsnDvdBin *dvdbin = RESINDVDBIN (object); switch (prop_id) { case ARG_DEVICE: DVDBIN_LOCK (dvdbin); g_free (dvdbin->device); if (g_value_get_string (value) == NULL) dvdbin->device = g_strdup (DEFAULT_DEVICE); else dvdbin->device = g_value_dup_string (value); if (dvdbin->pieces[DVD_ELEM_SOURCE]) { g_object_set_property (G_OBJECT (dvdbin->pieces[DVD_ELEM_SOURCE]), "device", value); } DVDBIN_UNLOCK (dvdbin); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
static gboolean try_create_piece (RsnDvdBin * dvdbin, gint index, const gchar * factory, GType type, const gchar * name, const gchar * descr) { GstElement *e; DVDBIN_LOCK (dvdbin); if (dvdbin->pieces[index] != NULL) { DVDBIN_UNLOCK (dvdbin); return TRUE; /* Already exists */ } DVDBIN_UNLOCK (dvdbin); if (factory != NULL) { e = gst_element_factory_make (factory, name); } else { if (name) e = g_object_new (type, "name", name, NULL); else e = g_object_new (type, NULL); } if (e == NULL) goto create_failed; if (!gst_bin_add (GST_BIN (dvdbin), e)) goto add_failed; GST_DEBUG_OBJECT (dvdbin, "Added %s element: %" GST_PTR_FORMAT, descr, e); DVDBIN_LOCK (dvdbin); dvdbin->pieces[index] = e; DVDBIN_UNLOCK (dvdbin); return TRUE; create_failed: gst_element_post_message (GST_ELEMENT_CAST (dvdbin), gst_missing_element_message_new (GST_ELEMENT_CAST (dvdbin), factory)); GST_ELEMENT_ERROR (dvdbin, CORE, MISSING_PLUGIN, (NULL), ("Could not create %s element '%s'", descr, factory)); return FALSE; add_failed: gst_object_unref (e); GST_ELEMENT_ERROR (dvdbin, CORE, FAILED, (NULL), ("Could not add %s element to bin", descr)); return FALSE; }
static void remove_elements (RsnDvdBin * dvdbin) { gint i; GList *tmp; if (dvdbin->pieces[DVD_ELEM_MQUEUE] != NULL) { for (tmp = dvdbin->mq_req_pads; tmp; tmp = g_list_next (tmp)) { gst_element_release_request_pad (dvdbin->pieces[DVD_ELEM_MQUEUE], GST_PAD (tmp->data)); } } g_list_free (dvdbin->mq_req_pads); dvdbin->mq_req_pads = NULL; for (i = 0; i < DVD_ELEM_LAST; i++) { DVDBIN_LOCK (dvdbin); if (dvdbin->pieces[i] != NULL) { GstElement *piece = dvdbin->pieces[i]; dvdbin->pieces[i] = NULL; DVDBIN_UNLOCK (dvdbin); gst_element_set_state (piece, GST_STATE_NULL); gst_bin_remove (GST_BIN (dvdbin), piece); } else DVDBIN_UNLOCK (dvdbin); } if (dvdbin->video_pad) { if (dvdbin->video_added) gst_element_remove_pad (GST_ELEMENT (dvdbin), dvdbin->video_pad); else gst_object_unref (dvdbin->video_pad); } if (dvdbin->audio_pad) { if (dvdbin->audio_added) gst_element_remove_pad (GST_ELEMENT (dvdbin), dvdbin->audio_pad); else gst_object_unref (dvdbin->audio_pad); } if (dvdbin->subpicture_pad) { if (dvdbin->subpicture_added) gst_element_remove_pad (GST_ELEMENT (dvdbin), dvdbin->subpicture_pad); else gst_object_unref (dvdbin->subpicture_pad); } dvdbin->video_added = dvdbin->audio_added = dvdbin->subpicture_added = FALSE; dvdbin->audio_broken = FALSE; dvdbin->video_pad = dvdbin->audio_pad = dvdbin->subpicture_pad = NULL; dvdbin->did_no_more_pads = FALSE; }
static const gchar * rsn_dvdbin_uri_get_uri (GstURIHandler * handler) { RsnDvdBin *dvdbin = RESINDVDBIN (handler); DVDBIN_LOCK (dvdbin); g_free (dvdbin->last_uri); if (dvdbin->device) dvdbin->last_uri = g_strdup_printf ("dvd://%s", dvdbin->device); else dvdbin->last_uri = g_strdup ("dvd://"); DVDBIN_UNLOCK (dvdbin); return dvdbin->last_uri; }