gst/rtpmanager/: Clean up the dynamic pads when going to READY.
authorWim Taymans <wim.taymans@gmail.com>
Wed, 12 Dec 2007 16:59:03 +0000 (16:59 +0000)
committerTim-Philipp Müller <tim.muller@collabora.co.uk>
Tue, 11 Aug 2009 01:30:32 +0000 (02:30 +0100)
Original commit message from CVS:
* gst/rtpmanager/gstrtpptdemux.c: (gst_rtp_pt_demux_finalize),
(gst_rtp_pt_demux_setup), (gst_rtp_pt_demux_release),
(gst_rtp_pt_demux_change_state):
* gst/rtpmanager/gstrtpssrcdemux.c: (gst_rtp_ssrc_demux_reset),
(gst_rtp_ssrc_demux_dispose), (gst_rtp_ssrc_demux_src_query),
(gst_rtp_ssrc_demux_change_state):
Clean up the dynamic pads when going to READY.

gst/rtpmanager/gstrtpptdemux.c
gst/rtpmanager/gstrtpssrcdemux.c

index 58ce53d94117f095c840d5df1eee26c6e55de19b..b11ff11a4b426bd3a425f58a33b65c26bd844ee1 100644 (file)
@@ -126,8 +126,8 @@ GST_BOILERPLATE (GstRtpPtDemux, gst_rtp_pt_demux, GstElement, GST_TYPE_ELEMENT);
 
 static void gst_rtp_pt_demux_finalize (GObject * object);
 
-static void gst_rtp_pt_demux_release (GstElement * element);
-static gboolean gst_rtp_pt_demux_setup (GstElement * element);
+static void gst_rtp_pt_demux_release (GstRtpPtDemux * ptdemux);
+static gboolean gst_rtp_pt_demux_setup (GstRtpPtDemux * ptdemux);
 
 static GstFlowReturn gst_rtp_pt_demux_chain (GstPad * pad, GstBuffer * buf);
 static GstStateChangeReturn gst_rtp_pt_demux_change_state (GstElement * element,
@@ -249,7 +249,7 @@ gst_rtp_pt_demux_init (GstRtpPtDemux * ptdemux, GstRtpPtDemuxClass * g_class)
 static void
 gst_rtp_pt_demux_finalize (GObject * object)
 {
-  gst_rtp_pt_demux_release (GST_ELEMENT (object));
+  gst_rtp_pt_demux_release (GST_RTP_PT_DEMUX (object));
 
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
@@ -426,33 +426,31 @@ find_pad_for_pt (GstRtpPtDemux * rtpdemux, guint8 pt)
  * Reserves resources for the object.
  */
 static gboolean
-gst_rtp_pt_demux_setup (GstElement * element)
+gst_rtp_pt_demux_setup (GstRtpPtDemux * ptdemux)
 {
-  GstRtpPtDemux *ptdemux = GST_RTP_PT_DEMUX (element);
-  gboolean res = TRUE;
+  ptdemux->srcpads = NULL;
+  ptdemux->last_pt = 0xFFFF;
 
-  if (ptdemux) {
-    ptdemux->srcpads = NULL;
-    ptdemux->last_pt = 0xFFFF;
-  }
-
-  return res;
+  return TRUE;
 }
 
 /**
  * Free resources for the object.
  */
 static void
-gst_rtp_pt_demux_release (GstElement * element)
+gst_rtp_pt_demux_release (GstRtpPtDemux * ptdemux)
 {
-  GstRtpPtDemux *ptdemux = GST_RTP_PT_DEMUX (element);
+  GSList *walk;
+
+  for (walk = ptdemux->srcpads; walk; walk = g_slist_next (walk)) {
+    GstRtpPtDemuxPad *pad = walk->data;
 
-  if (ptdemux) {
-    /* note: GstElement's dispose() will handle the pads */
-    g_slist_foreach (ptdemux->srcpads, (GFunc) g_free, NULL);
-    g_slist_free (ptdemux->srcpads);
-    ptdemux->srcpads = NULL;
+    gst_pad_set_active (pad->pad, FALSE);
+    gst_element_remove_pad (GST_ELEMENT_CAST (ptdemux), pad->pad);
+    g_free (pad);
   }
+  g_slist_free (ptdemux->srcpads);
+  ptdemux->srcpads = NULL;
 }
 
 static GstStateChangeReturn
@@ -465,7 +463,7 @@ gst_rtp_pt_demux_change_state (GstElement * element, GstStateChange transition)
 
   switch (transition) {
     case GST_STATE_CHANGE_NULL_TO_READY:
-      if (gst_rtp_pt_demux_setup (element) != TRUE)
+      if (gst_rtp_pt_demux_setup (ptdemux) != TRUE)
         ret = GST_STATE_CHANGE_FAILURE;
       break;
     case GST_STATE_CHANGE_READY_TO_PAUSED:
@@ -481,7 +479,7 @@ gst_rtp_pt_demux_change_state (GstElement * element, GstStateChange transition)
     case GST_STATE_CHANGE_PAUSED_TO_READY:
       break;
     case GST_STATE_CHANGE_READY_TO_NULL:
-      gst_rtp_pt_demux_release (element);
+      gst_rtp_pt_demux_release (ptdemux);
       break;
     default:
       break;
index d8d03d25dbefeff0abba0add2c2e73d909436e6a..170ede31a4aeda672aff241df9abe4a6d6bb363c 100644 (file)
@@ -308,6 +308,25 @@ gst_rtp_ssrc_demux_init (GstRtpSsrcDemux * demux,
   gst_segment_init (&demux->segment, GST_FORMAT_UNDEFINED);
 }
 
+static void
+gst_rtp_ssrc_demux_reset (GstRtpSsrcDemux * demux)
+{
+  GSList *walk;
+
+  for (walk = demux->srcpads; walk; walk = g_slist_next (walk)) {
+    GstRtpSsrcDemuxPad *dpad = (GstRtpSsrcDemuxPad *) walk->data;
+
+    gst_pad_set_active (dpad->rtp_pad, FALSE);
+    gst_pad_set_active (dpad->rtcp_pad, FALSE);
+
+    gst_element_remove_pad (GST_ELEMENT_CAST (demux), dpad->rtp_pad);
+    gst_element_remove_pad (GST_ELEMENT_CAST (demux), dpad->rtcp_pad);
+    g_free (dpad);
+  }
+  g_slist_free (demux->srcpads);
+  demux->srcpads = NULL;
+}
+
 static void
 gst_rtp_ssrc_demux_dispose (GObject * object)
 {
@@ -315,9 +334,7 @@ gst_rtp_ssrc_demux_dispose (GObject * object)
 
   demux = GST_RTP_SSRC_DEMUX (object);
 
-  g_slist_foreach (demux->srcpads, (GFunc) g_free, NULL);
-  g_slist_free (demux->srcpads);
-  demux->srcpads = NULL;
+  gst_rtp_ssrc_demux_reset (demux);
 
   G_OBJECT_CLASS (parent_class)->dispose (object);
 }
@@ -592,12 +609,6 @@ gst_rtp_ssrc_demux_src_query (GstPad * pad, GstQuery * query)
             "latency for SSRC %08x, latency %" GST_TIME_FORMAT, demuxpad->ssrc,
             GST_TIME_ARGS (demuxpad->first_ts));
 
-#if 0
-        min_latency += demuxpad->first_ts;
-        if (max_latency != -1)
-          max_latency += demuxpad->first_ts;
-#endif
-
         gst_query_set_latency (query, live, min_latency, max_latency);
       }
       break;
@@ -633,6 +644,8 @@ gst_rtp_ssrc_demux_change_state (GstElement * element,
   switch (transition) {
     case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
     case GST_STATE_CHANGE_PAUSED_TO_READY:
+      gst_rtp_ssrc_demux_reset (demux);
+      break;
     case GST_STATE_CHANGE_READY_TO_NULL:
     default:
       break;