mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-02-17 11:45:25 +00:00
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:
parent
d2ef095b80
commit
3747ede14a
1 changed files with 10 additions and 5 deletions
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue