From: Wim Taymans Date: Wed, 12 Dec 2007 16:59:03 +0000 (+0000) Subject: gst/rtpmanager/: Clean up the dynamic pads when going to READY. X-Git-Tag: 1.19.3~509^2~9919 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a965ebff09d986440c340b3d609e45579fe74903;p=platform%2Fupstream%2Fgstreamer.git gst/rtpmanager/: Clean up the dynamic pads when going to READY. 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. --- diff --git a/gst/rtpmanager/gstrtpptdemux.c b/gst/rtpmanager/gstrtpptdemux.c index 58ce53d..b11ff11 100644 --- a/gst/rtpmanager/gstrtpptdemux.c +++ b/gst/rtpmanager/gstrtpptdemux.c @@ -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; diff --git a/gst/rtpmanager/gstrtpssrcdemux.c b/gst/rtpmanager/gstrtpssrcdemux.c index d8d03d2..170ede3 100644 --- a/gst/rtpmanager/gstrtpssrcdemux.c +++ b/gst/rtpmanager/gstrtpssrcdemux.c @@ -309,15 +309,32 @@ gst_rtp_ssrc_demux_init (GstRtpSsrcDemux * demux, } 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) { GstRtpSsrcDemux *demux; 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;