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.
This commit is contained in:
parent
df55cf2f08
commit
a965ebff09
@ -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_finalize (GObject * object);
|
||||||
|
|
||||||
static void gst_rtp_pt_demux_release (GstElement * element);
|
static void gst_rtp_pt_demux_release (GstRtpPtDemux * ptdemux);
|
||||||
static gboolean gst_rtp_pt_demux_setup (GstElement * element);
|
static gboolean gst_rtp_pt_demux_setup (GstRtpPtDemux * ptdemux);
|
||||||
|
|
||||||
static GstFlowReturn gst_rtp_pt_demux_chain (GstPad * pad, GstBuffer * buf);
|
static GstFlowReturn gst_rtp_pt_demux_chain (GstPad * pad, GstBuffer * buf);
|
||||||
static GstStateChangeReturn gst_rtp_pt_demux_change_state (GstElement * element,
|
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
|
static void
|
||||||
gst_rtp_pt_demux_finalize (GObject * object)
|
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);
|
G_OBJECT_CLASS (parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
@ -426,34 +426,32 @@ find_pad_for_pt (GstRtpPtDemux * rtpdemux, guint8 pt)
|
|||||||
* Reserves resources for the object.
|
* Reserves resources for the object.
|
||||||
*/
|
*/
|
||||||
static gboolean
|
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;
|
|
||||||
|
|
||||||
if (ptdemux) {
|
|
||||||
ptdemux->srcpads = NULL;
|
ptdemux->srcpads = NULL;
|
||||||
ptdemux->last_pt = 0xFFFF;
|
ptdemux->last_pt = 0xFFFF;
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Free resources for the object.
|
* Free resources for the object.
|
||||||
*/
|
*/
|
||||||
static void
|
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;
|
||||||
|
|
||||||
if (ptdemux) {
|
for (walk = ptdemux->srcpads; walk; walk = g_slist_next (walk)) {
|
||||||
/* note: GstElement's dispose() will handle the pads */
|
GstRtpPtDemuxPad *pad = walk->data;
|
||||||
g_slist_foreach (ptdemux->srcpads, (GFunc) g_free, 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);
|
g_slist_free (ptdemux->srcpads);
|
||||||
ptdemux->srcpads = NULL;
|
ptdemux->srcpads = NULL;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
static GstStateChangeReturn
|
static GstStateChangeReturn
|
||||||
gst_rtp_pt_demux_change_state (GstElement * element, GstStateChange transition)
|
gst_rtp_pt_demux_change_state (GstElement * element, GstStateChange transition)
|
||||||
@ -465,7 +463,7 @@ gst_rtp_pt_demux_change_state (GstElement * element, GstStateChange transition)
|
|||||||
|
|
||||||
switch (transition) {
|
switch (transition) {
|
||||||
case GST_STATE_CHANGE_NULL_TO_READY:
|
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;
|
ret = GST_STATE_CHANGE_FAILURE;
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_READY_TO_PAUSED:
|
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:
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
||||||
break;
|
break;
|
||||||
case GST_STATE_CHANGE_READY_TO_NULL:
|
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||||
gst_rtp_pt_demux_release (element);
|
gst_rtp_pt_demux_release (ptdemux);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -308,6 +308,25 @@ gst_rtp_ssrc_demux_init (GstRtpSsrcDemux * demux,
|
|||||||
gst_segment_init (&demux->segment, GST_FORMAT_UNDEFINED);
|
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
|
static void
|
||||||
gst_rtp_ssrc_demux_dispose (GObject * object)
|
gst_rtp_ssrc_demux_dispose (GObject * object)
|
||||||
{
|
{
|
||||||
@ -315,9 +334,7 @@ gst_rtp_ssrc_demux_dispose (GObject * object)
|
|||||||
|
|
||||||
demux = GST_RTP_SSRC_DEMUX (object);
|
demux = GST_RTP_SSRC_DEMUX (object);
|
||||||
|
|
||||||
g_slist_foreach (demux->srcpads, (GFunc) g_free, NULL);
|
gst_rtp_ssrc_demux_reset (demux);
|
||||||
g_slist_free (demux->srcpads);
|
|
||||||
demux->srcpads = NULL;
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (parent_class)->dispose (object);
|
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,
|
"latency for SSRC %08x, latency %" GST_TIME_FORMAT, demuxpad->ssrc,
|
||||||
GST_TIME_ARGS (demuxpad->first_ts));
|
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);
|
gst_query_set_latency (query, live, min_latency, max_latency);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@ -633,6 +644,8 @@ gst_rtp_ssrc_demux_change_state (GstElement * element,
|
|||||||
switch (transition) {
|
switch (transition) {
|
||||||
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
|
case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
|
||||||
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
case GST_STATE_CHANGE_PAUSED_TO_READY:
|
||||||
|
gst_rtp_ssrc_demux_reset (demux);
|
||||||
|
break;
|
||||||
case GST_STATE_CHANGE_READY_TO_NULL:
|
case GST_STATE_CHANGE_READY_TO_NULL:
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user