static gboolean gst_rtp_dtmf_mux_accept_buffer_locked (GstRTPMux * rtp_mux, GstRTPMuxPadPrivate * padpriv, GstRTPBuffer * rtpbuffer) { GstRTPDTMFMux *mux = GST_RTP_DTMF_MUX (rtp_mux); GstClockTime running_ts; running_ts = GST_BUFFER_PTS (rtpbuffer->buffer); if (GST_CLOCK_TIME_IS_VALID (running_ts)) { if (padpriv && padpriv->segment.format == GST_FORMAT_TIME) running_ts = gst_segment_to_running_time (&padpriv->segment, GST_FORMAT_TIME, GST_BUFFER_PTS (rtpbuffer->buffer)); if (padpriv && padpriv->priority) { if (GST_BUFFER_PTS_IS_VALID (rtpbuffer->buffer)) { if (GST_CLOCK_TIME_IS_VALID (mux->last_priority_end)) mux->last_priority_end = MAX (running_ts + GST_BUFFER_DURATION (rtpbuffer->buffer), mux->last_priority_end); else mux->last_priority_end = running_ts + GST_BUFFER_DURATION (rtpbuffer->buffer); GST_LOG_OBJECT (mux, "Got buffer %p on priority pad, " " blocking regular pads until %" GST_TIME_FORMAT, rtpbuffer->buffer, GST_TIME_ARGS (mux->last_priority_end)); } else { GST_WARNING_OBJECT (mux, "Buffer %p has an invalid duration," " not blocking other pad", rtpbuffer->buffer); } } else { if (GST_CLOCK_TIME_IS_VALID (mux->last_priority_end) && running_ts < mux->last_priority_end) { GST_LOG_OBJECT (mux, "Dropping buffer %p because running time" " %" GST_TIME_FORMAT " < %" GST_TIME_FORMAT, rtpbuffer->buffer, GST_TIME_ARGS (running_ts), GST_TIME_ARGS (mux->last_priority_end)); return FALSE; } } } else { GST_LOG_OBJECT (mux, "Buffer %p has an invalid timestamp," " letting through", rtpbuffer->buffer); } return TRUE; }
static GstStateChangeReturn gst_rtp_dtmf_mux_change_state (GstElement * element, GstStateChange transition) { GstStateChangeReturn ret; GstRTPDTMFMux *mux = GST_RTP_DTMF_MUX (element); switch (transition) { case GST_STATE_CHANGE_READY_TO_PAUSED: { GST_OBJECT_LOCK (mux); mux->last_priority_end = GST_CLOCK_TIME_NONE; GST_OBJECT_UNLOCK (mux); break; } default: break; } ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition); return ret; }