rtpbin: Free session if request pads are released
authorOlivier CrĂȘte <olivier.crete@collabora.co.uk>
Thu, 21 May 2009 23:03:55 +0000 (01:03 +0200)
committerWim Taymans <wim@metal.(none)>
Thu, 21 May 2009 23:03:55 +0000 (01:03 +0200)
Free the session when all the request pads are released.
Don't mess with the session list in free_session as it is called from a foreach
on that list.
Set the state of the upstream element to NULL first.

See #561752

gst/rtpmanager/gstrtpbin.c

index 075776e..11cc2dd 100644 (file)
@@ -554,8 +554,8 @@ free_session (GstRtpBinSession * sess)
 
   GST_DEBUG_OBJECT (bin, "freeing session %p", sess);
 
-  gst_element_set_state (sess->session, GST_STATE_NULL);
   gst_element_set_state (sess->demux, GST_STATE_NULL);
+  gst_element_set_state (sess->session, GST_STATE_NULL);
 
   if (sess->recv_rtp_sink != NULL) {
     gst_element_release_request_pad (sess->session, sess->recv_rtp_sink);
@@ -589,8 +589,6 @@ free_session (GstRtpBinSession * sess)
   g_mutex_free (sess->lock);
   g_hash_table_destroy (sess->ptmap);
 
-  bin->sessions = g_slist_remove (bin->sessions, sess);
-
   g_free (sess);
 }
 
@@ -2512,6 +2510,13 @@ gst_rtp_bin_release_pad (GstElement * element, GstPad * pad)
   } else if (session->send_rtcp_src == target) {
     remove_rtcp (rtpbin, session, pad);
   }
+
+  /* no more request pads, free the complete session */
+  if (session->recv_rtp_sink == NULL && session->recv_rtcp_sink == NULL &&
+      session->send_rtp_sink == NULL && session->send_rtcp_src == NULL) {
+    rtpbin->sessions = g_slist_remove (rtpbin->sessions, session);
+    free_session (session);
+  }
   GST_RTP_BIN_UNLOCK (rtpbin);
 
   gst_object_unref (target);