gstrtpsession: protect recv_rtcp_segment_seqnum with a lock

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/8695>
This commit is contained in:
Ognyan Tonchev 2025-03-26 13:04:41 +01:00 committed by GStreamer Marge Bot
parent 961fc87168
commit ebb1d1a4ae
2 changed files with 12 additions and 9 deletions

View File

@ -296,6 +296,8 @@ struct _GstRtpSessionPrivate
GstBufferList *processed_list; GstBufferList *processed_list;
gboolean send_rtp_sink_eos; gboolean send_rtp_sink_eos;
guint32 recv_rtcp_segment_seqnum;
}; };
/* callbacks to handle actions from the session manager */ /* callbacks to handle actions from the session manager */
@ -937,7 +939,7 @@ gst_rtp_session_init (GstRtpSession * rtpsession)
rtpsession->priv->ptmap = g_hash_table_new_full (NULL, NULL, NULL, rtpsession->priv->ptmap = g_hash_table_new_full (NULL, NULL, NULL,
(GDestroyNotify) gst_caps_unref); (GDestroyNotify) gst_caps_unref);
rtpsession->recv_rtcp_segment_seqnum = GST_SEQNUM_INVALID; rtpsession->priv->recv_rtcp_segment_seqnum = GST_SEQNUM_INVALID;
gst_segment_init (&rtpsession->recv_rtp_seg, GST_FORMAT_UNDEFINED); gst_segment_init (&rtpsession->recv_rtp_seg, GST_FORMAT_UNDEFINED);
gst_segment_init (&rtpsession->send_rtp_seg, GST_FORMAT_UNDEFINED); gst_segment_init (&rtpsession->send_rtp_seg, GST_FORMAT_UNDEFINED);
@ -1537,9 +1539,9 @@ do_rtcp_events (GstRtpSession * rtpsession, GstPad * srcpad)
have_group_id = TRUE; have_group_id = TRUE;
group_id = gst_util_group_id_next (); group_id = gst_util_group_id_next ();
} }
GST_RTP_SESSION_UNLOCK (rtpsession);
rtpsession->recv_rtcp_segment_seqnum = seqnum; rtpsession->priv->recv_rtcp_segment_seqnum = seqnum;
GST_RTP_SESSION_UNLOCK (rtpsession);
gst_event_set_seqnum (stream_start, seqnum); gst_event_set_seqnum (stream_start, seqnum);
if (have_group_id) if (have_group_id)
@ -1598,7 +1600,7 @@ gst_rtp_session_send_rtcp (RTPSession * sess, RTPSource * src,
GST_LOG_OBJECT (rtpsession, "sending EOS"); GST_LOG_OBJECT (rtpsession, "sending EOS");
event = gst_event_new_eos (); event = gst_event_new_eos ();
gst_event_set_seqnum (event, rtpsession->recv_rtcp_segment_seqnum); gst_event_set_seqnum (event, rtpsession->priv->recv_rtcp_segment_seqnum);
gst_pad_push_event (rtcp_src, event); gst_pad_push_event (rtcp_src, event);
} }
GST_RTP_SESSION_UNLOCK (rtpsession); GST_RTP_SESSION_UNLOCK (rtpsession);
@ -1798,9 +1800,9 @@ gst_rtp_session_event_recv_rtp_sink (GstPad * pad, GstObject * parent,
} }
case GST_EVENT_FLUSH_STOP: case GST_EVENT_FLUSH_STOP:
gst_segment_init (&rtpsession->recv_rtp_seg, GST_FORMAT_UNDEFINED); gst_segment_init (&rtpsession->recv_rtp_seg, GST_FORMAT_UNDEFINED);
rtpsession->recv_rtcp_segment_seqnum = GST_SEQNUM_INVALID;
ret = gst_pad_push_event (rtpsession->recv_rtp_src, event); ret = gst_pad_push_event (rtpsession->recv_rtp_src, event);
GST_RTP_SESSION_LOCK (rtpsession); GST_RTP_SESSION_LOCK (rtpsession);
rtpsession->priv->recv_rtcp_segment_seqnum = GST_SEQNUM_INVALID;
rtpsession->priv->send_rtp_sink_eos = FALSE; rtpsession->priv->send_rtp_sink_eos = FALSE;
GST_RTP_SESSION_UNLOCK (rtpsession); GST_RTP_SESSION_UNLOCK (rtpsession);
break; break;
@ -1840,8 +1842,11 @@ gst_rtp_session_event_recv_rtp_sink (GstPad * pad, GstObject * parent,
if (rtcp_src) { if (rtcp_src) {
event = gst_event_new_eos (); event = gst_event_new_eos ();
if (rtpsession->recv_rtcp_segment_seqnum != GST_SEQNUM_INVALID) GST_RTP_SESSION_LOCK (rtpsession);
gst_event_set_seqnum (event, rtpsession->recv_rtcp_segment_seqnum); if (rtpsession->priv->recv_rtcp_segment_seqnum != GST_SEQNUM_INVALID)
gst_event_set_seqnum (event,
rtpsession->priv->recv_rtcp_segment_seqnum);
GST_RTP_SESSION_UNLOCK (rtpsession);
ret = gst_pad_push_event (rtcp_src, event); ret = gst_pad_push_event (rtcp_src, event);
gst_object_unref (rtcp_src); gst_object_unref (rtcp_src);
} else { } else {

View File

@ -53,8 +53,6 @@ struct _GstRtpSession {
GstPad *send_rtp_src; GstPad *send_rtp_src;
GstPad *send_rtcp_src; GstPad *send_rtcp_src;
guint32 recv_rtcp_segment_seqnum;
GstRtpSessionPrivate *priv; GstRtpSessionPrivate *priv;
}; };