From 7577ba45e2046a19caac1b360901669d12e0f3d1 Mon Sep 17 00:00:00 2001 From: Sjoerd Simons Date: Fri, 4 Nov 2011 18:46:24 +0000 Subject: When reset the source remove and re-insert it Setting an element to NULL resets various internal values (the clock, the base time etc). To make sure everything is reset as expected simply yank it from the bin and re-insert it (which will reset the values) --- src/empathy-video-src.c | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) (limited to 'src') diff --git a/src/empathy-video-src.c b/src/empathy-video-src.c index e2842114f..23b4dca52 100644 --- a/src/empathy-video-src.c +++ b/src/empathy-video-src.c @@ -444,13 +444,20 @@ empathy_video_src_set_resolution (GstElement *src, { EmpathyGstVideoSrcPrivate *priv = EMPATHY_GST_VIDEO_SRC_GET_PRIVATE (src); GstCaps *caps; - GstClock *gst_clock; + GstPad *srcpad, *peer; g_return_if_fail (priv->capsfilter != NULL); gst_element_set_locked_state (priv->src, TRUE); gst_element_set_state (priv->src, GST_STATE_NULL); + srcpad = gst_element_get_static_pad (priv->src, "src"); + peer = gst_pad_get_peer (srcpad); + + /* Keep a ref as removing it from the bin will loose our reference */ + gst_object_ref (priv->src); + gst_bin_remove (GST_BIN (src), priv->src); + g_object_get (priv->capsfilter, "caps", &caps, NULL); caps = gst_caps_make_writable (caps); @@ -461,13 +468,15 @@ empathy_video_src_set_resolution (GstElement *src, g_object_set (priv->capsfilter, "caps", caps, NULL); - /* Reset clock an base time, this is require for videotestsrc and hopefully - * has no side effect */ - gst_clock = gst_element_get_clock (src); - gst_element_set_clock (priv->src, gst_clock); - gst_element_set_base_time (priv->src, gst_element_get_base_time (src)); - gst_object_unref (gst_clock); + gst_bin_add (GST_BIN (src), priv->src); + /* We as the bin own the source again, so drop the temporary ref */ + gst_object_unref (priv->src); + + gst_pad_link (srcpad, peer); gst_element_set_locked_state (priv->src, FALSE); gst_element_sync_state_with_parent (priv->src); + + gst_object_unref (srcpad); + gst_object_unref (peer); } -- cgit v1.2.3