rtpmanager: skip RTPSources which are not ready in the RTCP generation
authorOgnyan Tonchev <ognyan@axis.com>
Fri, 25 Oct 2024 10:02:54 +0000 (12:02 +0200)
committerBackport Bot <gitlab-backport-bot@gstreamer-foundation.org>
Tue, 29 Oct 2024 11:36:55 +0000 (11:36 +0000)
If a stream has an 'irregular' frame rate (e.g. metadata) RTCP SR
may be generated way too early, before the RTPSource has received
the first packet after Latency was configured in the pipeline.
We skip such RTPSources in the RTCP generation.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7777>

subprojects/gst-plugins-good/gst/rtpmanager/rtpsession.c
subprojects/gst-plugins-good/gst/rtpmanager/rtpsource.c

index f9202a7e8a7de7f8feda9cbf71a9fea31bd0eaf8..70f69db881837529613c38c3b6604b4311fc68ce 100644 (file)
@@ -3819,7 +3819,7 @@ typedef struct
   gboolean timeout_inactive_sources;
 } ReportData;
 
-static void
+static gboolean
 session_start_rtcp (RTPSession * sess, ReportData * data)
 {
   GstRTCPPacket *packet = &data->packet;
@@ -3844,8 +3844,11 @@ session_start_rtcp (RTPSession * sess, ReportData * data)
     gst_rtcp_buffer_add_packet (rtcp, GST_RTCP_TYPE_SR, packet);
 
     /* get latest stats */
-    rtp_source_get_new_sr (own, data->ntpnstime, data->running_time,
-        &ntptime, &rtptime, &packet_count, &octet_count);
+    if (!rtp_source_get_new_sr (own, data->ntpnstime, data->running_time,
+            &ntptime, &rtptime, &packet_count, &octet_count)) {
+      gst_rtcp_buffer_unmap (&data->rtcpbuf);
+      return FALSE;
+    }
     /* store stats */
     rtp_source_process_sr (own, data->current_time, ntptime, rtptime,
         packet_count, octet_count);
@@ -3861,6 +3864,8 @@ session_start_rtcp (RTPSession * sess, ReportData * data)
     gst_rtcp_buffer_add_packet (rtcp, GST_RTCP_TYPE_RR, packet);
     gst_rtcp_packet_rr_set_ssrc (packet, own->ssrc);
   }
+
+  return TRUE;
 }
 
 /* construct a Sender or Receiver Report */
@@ -4541,7 +4546,10 @@ generate_rtcp (const gchar * key, RTPSource * source, ReportData * data)
   data->source = source;
 
   /* open packet */
-  session_start_rtcp (sess, data);
+  if (!session_start_rtcp (sess, data)) {
+    GST_WARNING ("source %08x can not generate RTCP", source->ssrc);
+    return;
+  }
 
   if (source->marked_bye) {
     /* send BYE */
index 673f1ad682890ac9ebe801d6dacbeb618963bd2c..2c4fe559bd2536c90dbca4902831f6f65e142125 100644 (file)
@@ -1627,6 +1627,13 @@ rtp_source_get_new_sr (RTPSource * src, guint64 ntpnstime,
   }
 
   if (src->clock_rate != -1) {
+    /* if no running time has been set yet we wait until we get one */
+    if (src->last_rtime == -1) {
+      GST_WARNING ("running time not set, can not create SR for SSRC %u",
+          src->ssrc);
+      return FALSE;
+    }
+
     /* get the diff between the clock running_time and the buffer running_time.
      * This is the elapsed time, as measured against the pipeline clock, between
      * when the rtp timestamp was observed and the current running_time.