diff options
author | Wim Taymans <wim.taymans@collabora.co.uk> | 2009-07-27 13:17:20 +0200 |
---|---|---|
committer | Tim-Philipp Müller <tim.muller@collabora.co.uk> | 2009-08-11 02:30:47 +0100 |
commit | 3747ede14a6909e11b19ae7363cd583f5ddb59ec (patch) | |
tree | bdd98731d996612f4ecc1ad847ad8f97656d3320 | |
parent | d2ef095b804182f5b2f4a7a8a4d5a55088ac811d (diff) |
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.
-rw-r--r-- | gst/rtpmanager/rtpsession.c | 15 |
1 files changed, 10 insertions, 5 deletions
diff --git a/gst/rtpmanager/rtpsession.c b/gst/rtpmanager/rtpsession.c index fe38c36a..9d73d51d 100644 --- a/gst/rtpmanager/rtpsession.c +++ b/gst/rtpmanager/rtpsession.c @@ -1577,7 +1577,7 @@ rtp_session_process_rb (RTPSession * sess, RTPSource * source, */ static void rtp_session_process_sr (RTPSession * sess, GstRTCPPacket * packet, - RTPArrivalStats * arrival) + RTPArrivalStats * arrival, gboolean * do_sync) { guint32 senderssrc, rtptime, packet_count, octet_count; guint64 ntptime; @@ -1594,6 +1594,12 @@ rtp_session_process_sr (RTPSession * sess, GstRTCPPacket * packet, if (!source) 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); /* first update the source */ @@ -1816,7 +1822,7 @@ rtp_session_process_rtcp (RTPSession * sess, GstBuffer * buffer, GstClockTime current_time) { GstRTCPPacket packet; - gboolean more, is_bye = FALSE, is_sr = FALSE; + gboolean more, is_bye = FALSE, do_sync = FALSE; RTPArrivalStats arrival; GstFlowReturn result = GST_FLOW_OK; @@ -1853,8 +1859,7 @@ rtp_session_process_rtcp (RTPSession * sess, GstBuffer * buffer, switch (type) { case GST_RTCP_TYPE_SR: - rtp_session_process_sr (sess, &packet, &arrival); - is_sr = TRUE; + rtp_session_process_sr (sess, &packet, &arrival, &do_sync); break; case GST_RTCP_TYPE_RR: rtp_session_process_rr (sess, &packet, &arrival); @@ -1891,7 +1896,7 @@ rtp_session_process_rtcp (RTPSession * sess, GstBuffer * buffer, RTP_SESSION_UNLOCK (sess); /* 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, sess->sync_rtcp_user_data); else |