rtpbin: don't do lip-sync after a BYE

After a BYE packet from a source, stop forwarding the SR packets for lip-sync
to rtpbin. Some senders don't update their SR packets correctly after sending a
BYE and then we break lip-sync. We prefer to let the jitterbuffers drain with
the current lip-sync instead.
This commit is contained in:
Wim Taymans 2009-07-27 13:17:20 +02:00 committed by Tim-Philipp Müller
parent d2ef095b80
commit 3747ede14a

View file

@ -1577,7 +1577,7 @@ rtp_session_process_rb (RTPSession * sess, RTPSource * source,
*/ */
static void static void
rtp_session_process_sr (RTPSession * sess, GstRTCPPacket * packet, rtp_session_process_sr (RTPSession * sess, GstRTCPPacket * packet,
RTPArrivalStats * arrival) RTPArrivalStats * arrival, gboolean * do_sync)
{ {
guint32 senderssrc, rtptime, packet_count, octet_count; guint32 senderssrc, rtptime, packet_count, octet_count;
guint64 ntptime; guint64 ntptime;
@ -1594,6 +1594,12 @@ rtp_session_process_sr (RTPSession * sess, GstRTCPPacket * packet,
if (!source) if (!source)
return; return;
/* don't try to do lip-sync for sources that sent a BYE */
if (rtp_source_received_bye (source))
*do_sync = FALSE;
else
*do_sync = TRUE;
prevsender = RTP_SOURCE_IS_SENDER (source); prevsender = RTP_SOURCE_IS_SENDER (source);
/* first update the source */ /* first update the source */
@ -1816,7 +1822,7 @@ rtp_session_process_rtcp (RTPSession * sess, GstBuffer * buffer,
GstClockTime current_time) GstClockTime current_time)
{ {
GstRTCPPacket packet; GstRTCPPacket packet;
gboolean more, is_bye = FALSE, is_sr = FALSE; gboolean more, is_bye = FALSE, do_sync = FALSE;
RTPArrivalStats arrival; RTPArrivalStats arrival;
GstFlowReturn result = GST_FLOW_OK; GstFlowReturn result = GST_FLOW_OK;
@ -1853,8 +1859,7 @@ rtp_session_process_rtcp (RTPSession * sess, GstBuffer * buffer,
switch (type) { switch (type) {
case GST_RTCP_TYPE_SR: case GST_RTCP_TYPE_SR:
rtp_session_process_sr (sess, &packet, &arrival); rtp_session_process_sr (sess, &packet, &arrival, &do_sync);
is_sr = TRUE;
break; break;
case GST_RTCP_TYPE_RR: case GST_RTCP_TYPE_RR:
rtp_session_process_rr (sess, &packet, &arrival); rtp_session_process_rr (sess, &packet, &arrival);
@ -1891,7 +1896,7 @@ rtp_session_process_rtcp (RTPSession * sess, GstBuffer * buffer,
RTP_SESSION_UNLOCK (sess); RTP_SESSION_UNLOCK (sess);
/* notify caller of sr packets in the callback */ /* notify caller of sr packets in the callback */
if (is_sr && sess->callbacks.sync_rtcp) if (do_sync && sess->callbacks.sync_rtcp)
result = sess->callbacks.sync_rtcp (sess, sess->source, buffer, result = sess->callbacks.sync_rtcp (sess, sess->source, buffer,
sess->sync_rtcp_user_data); sess->sync_rtcp_user_data);
else else