static GstStateChangeReturn rsn_dvdbin_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; RsnDvdBin *dvdbin = RESINDVDBIN (element); switch (transition) { case GST_STATE_CHANGE_NULL_TO_READY: if (!create_elements (dvdbin)) { remove_elements (dvdbin); return GST_STATE_CHANGE_FAILURE; } break; default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); if (ret == GST_STATE_CHANGE_FAILURE) return ret; switch (transition) { case GST_STATE_CHANGE_PAUSED_TO_READY: case GST_STATE_CHANGE_READY_TO_NULL: remove_elements (dvdbin); break; default: break; } return ret; }
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 void rsn_dvdbin_finalize (GObject * object) { RsnDvdBin *dvdbin = RESINDVDBIN (object); g_mutex_free (dvdbin->dvd_lock); g_free (dvdbin->last_uri); g_free (dvdbin->device); G_OBJECT_CLASS (parent_class)->finalize (object); }
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; }
static gboolean rsn_dvdbin_uri_set_uri (GstURIHandler * handler, const gchar * uri) { RsnDvdBin *dvdbin = RESINDVDBIN (handler); gboolean ret; gchar *protocol, *location; protocol = gst_uri_get_protocol (uri); ret = (protocol && !strcmp (protocol, "dvd")) ? TRUE : FALSE; g_free (protocol); protocol = NULL; if (!ret) return ret; location = gst_uri_get_location (uri); if (!location) return ret; /* * URI structure: dvd:///path/to/device */ if (g_str_has_prefix (uri, "dvd://")) { g_free (dvdbin->device); if (strlen (uri) > 6) dvdbin->device = g_strdup (uri + 6); else dvdbin->device = g_strdup (DEFAULT_DEVICE); } #if 0 /* * Parse out the new t/c/a and seek to them */ { gchar **strs; gchar **strcur; gint pos = 0; strcur = strs = g_strsplit (location, ",", 0); while (strcur && *strcur) { gint val; if (!sscanf (*strcur, "%d", &val)) break; switch (pos) { case 0: if (val != dvdbin->uri_title) { dvdbin->uri_title = val; dvdbin->new_seek = TRUE; } break; case 1: if (val != dvdbin->uri_chapter) { dvdbin->uri_chapter = val; dvdbin->new_seek = TRUE; } break; case 2: dvdbin->uri_angle = val; break; } strcur++; pos++; } g_strfreev (strs); } #endif g_free (location); return ret; }