rtpmanager: skip RTPSources which are not ready in the RTCP generation

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/7740>
This commit is contained in:
Ognyan Tonchev 2024-10-25 12:02:54 +02:00 committed by GStreamer Marge Bot
parent ec2b3cb200
commit 03b6226772
2 changed files with 19 additions and 4 deletions

View file

@ -3823,7 +3823,7 @@ typedef struct
gboolean timeout_inactive_sources; gboolean timeout_inactive_sources;
} ReportData; } ReportData;
static void static gboolean
session_start_rtcp (RTPSession * sess, ReportData * data) session_start_rtcp (RTPSession * sess, ReportData * data)
{ {
GstRTCPPacket *packet = &data->packet; GstRTCPPacket *packet = &data->packet;
@ -3848,8 +3848,11 @@ session_start_rtcp (RTPSession * sess, ReportData * data)
gst_rtcp_buffer_add_packet (rtcp, GST_RTCP_TYPE_SR, packet); gst_rtcp_buffer_add_packet (rtcp, GST_RTCP_TYPE_SR, packet);
/* get latest stats */ /* get latest stats */
rtp_source_get_new_sr (own, data->ntpnstime, data->running_time, if (!rtp_source_get_new_sr (own, data->ntpnstime, data->running_time,
&ntptime, &rtptime, &packet_count, &octet_count); &ntptime, &rtptime, &packet_count, &octet_count)) {
gst_rtcp_buffer_unmap (&data->rtcpbuf);
return FALSE;
}
/* store stats */ /* store stats */
rtp_source_process_sr (own, data->current_time, ntptime, rtptime, rtp_source_process_sr (own, data->current_time, ntptime, rtptime,
packet_count, octet_count); packet_count, octet_count);
@ -3865,6 +3868,8 @@ session_start_rtcp (RTPSession * sess, ReportData * data)
gst_rtcp_buffer_add_packet (rtcp, GST_RTCP_TYPE_RR, packet); gst_rtcp_buffer_add_packet (rtcp, GST_RTCP_TYPE_RR, packet);
gst_rtcp_packet_rr_set_ssrc (packet, own->ssrc); gst_rtcp_packet_rr_set_ssrc (packet, own->ssrc);
} }
return TRUE;
} }
/* construct a Sender or Receiver Report */ /* construct a Sender or Receiver Report */
@ -4545,7 +4550,10 @@ generate_rtcp (const gchar * key, RTPSource * source, ReportData * data)
data->source = source; data->source = source;
/* open packet */ /* 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) { if (source->marked_bye) {
/* send BYE */ /* send BYE */

View file

@ -1708,6 +1708,13 @@ rtp_source_get_new_sr (RTPSource * src, guint64 ntpnstime,
} }
if (src->clock_rate != -1) { 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. /* 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 * This is the elapsed time, as measured against the pipeline clock, between
* when the rtp timestamp was observed and the current running_time. * when the rtp timestamp was observed and the current running_time.