rtpsession: Emit "notify::stats" when we update stats from RR or SR

Sensibily optimizing caching the pspecs and using them directly

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/2266>
This commit is contained in:
Thibault Saunier 2022-04-22 02:41:16 +00:00 committed by GStreamer Marge Bot
parent 7b5f867e40
commit d673a90aea

View file

@ -107,8 +107,11 @@ enum
PROP_RTCP_REDUCED_SIZE, PROP_RTCP_REDUCED_SIZE,
PROP_RTCP_DISABLE_SR_TIMESTAMP, PROP_RTCP_DISABLE_SR_TIMESTAMP,
PROP_TWCC_FEEDBACK_INTERVAL, PROP_TWCC_FEEDBACK_INTERVAL,
PROP_LAST,
}; };
static GParamSpec *properties[PROP_LAST];
/* update average packet size */ /* update average packet size */
#define INIT_AVG(avg, val) \ #define INIT_AVG(avg, val) \
(avg) = (val); (avg) = (val);
@ -449,64 +452,62 @@ rtp_session_class_init (RTPSessionClass * klass)
G_TYPE_UINT, 4, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_ARRAY, G_TYPE_UINT, 4, G_TYPE_UINT, G_TYPE_UINT, G_TYPE_ARRAY,
GST_TYPE_BUFFER | G_SIGNAL_TYPE_STATIC_SCOPE); GST_TYPE_BUFFER | G_SIGNAL_TYPE_STATIC_SCOPE);
g_object_class_install_property (gobject_class, PROP_INTERNAL_SSRC, properties[PROP_INTERNAL_SSRC] =
g_param_spec_uint ("internal-ssrc", "Internal SSRC", g_param_spec_uint ("internal-ssrc", "Internal SSRC",
"The internal SSRC used for the session (deprecated)", "The internal SSRC used for the session (deprecated)",
0, G_MAXUINT, 0, 0, G_MAXUINT, 0,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | GST_PARAM_DOC_SHOW_DEFAULT);
GST_PARAM_DOC_SHOW_DEFAULT));
g_object_class_install_property (gobject_class, PROP_INTERNAL_SOURCE, properties[PROP_INTERNAL_SOURCE] =
g_param_spec_object ("internal-source", "Internal Source", g_param_spec_object ("internal-source", "Internal Source",
"The internal source element of the session (deprecated)", "The internal source element of the session (deprecated)",
RTP_TYPE_SOURCE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); RTP_TYPE_SOURCE, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (gobject_class, PROP_BANDWIDTH, properties[PROP_BANDWIDTH] =
g_param_spec_double ("bandwidth", "Bandwidth", g_param_spec_double ("bandwidth", "Bandwidth",
"The bandwidth of the session in bits per second (0 for auto-discover)", "The bandwidth of the session in bits per second (0 for auto-discover)",
0.0, G_MAXDOUBLE, DEFAULT_BANDWIDTH, 0.0, G_MAXDOUBLE, DEFAULT_BANDWIDTH,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (gobject_class, PROP_RTCP_FRACTION, properties[PROP_RTCP_FRACTION] =
g_param_spec_double ("rtcp-fraction", "RTCP Fraction", g_param_spec_double ("rtcp-fraction", "RTCP Fraction",
"The fraction of the bandwidth used for RTCP in bits per second (or as a real fraction of the RTP bandwidth if < 1)", "The fraction of the bandwidth used for RTCP in bits per second (or as a real fraction of the RTP bandwidth if < 1)",
0.0, G_MAXDOUBLE, DEFAULT_RTCP_FRACTION, 0.0, G_MAXDOUBLE, DEFAULT_RTCP_FRACTION,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (gobject_class, PROP_RTCP_RR_BANDWIDTH, properties[PROP_RTCP_RR_BANDWIDTH] =
g_param_spec_int ("rtcp-rr-bandwidth", "RTCP RR bandwidth", g_param_spec_int ("rtcp-rr-bandwidth", "RTCP RR bandwidth",
"The RTCP bandwidth used for receivers in bits per second (-1 = default)", "The RTCP bandwidth used for receivers in bits per second (-1 = default)",
-1, G_MAXINT, DEFAULT_RTCP_RR_BANDWIDTH, -1, G_MAXINT, DEFAULT_RTCP_RR_BANDWIDTH,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (gobject_class, PROP_RTCP_RS_BANDWIDTH, properties[PROP_RTCP_RS_BANDWIDTH] =
g_param_spec_int ("rtcp-rs-bandwidth", "RTCP RS bandwidth", g_param_spec_int ("rtcp-rs-bandwidth", "RTCP RS bandwidth",
"The RTCP bandwidth used for senders in bits per second (-1 = default)", "The RTCP bandwidth used for senders in bits per second (-1 = default)",
-1, G_MAXINT, DEFAULT_RTCP_RS_BANDWIDTH, -1, G_MAXINT, DEFAULT_RTCP_RS_BANDWIDTH,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (gobject_class, PROP_RTCP_MTU, properties[PROP_RTCP_MTU] =
g_param_spec_uint ("rtcp-mtu", "RTCP MTU", g_param_spec_uint ("rtcp-mtu", "RTCP MTU",
"The maximum size of the RTCP packets", "The maximum size of the RTCP packets",
16, G_MAXINT16, DEFAULT_RTCP_MTU, 16, G_MAXINT16, DEFAULT_RTCP_MTU,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (gobject_class, PROP_SDES, properties[PROP_SDES] =
g_param_spec_boxed ("sdes", "SDES", g_param_spec_boxed ("sdes", "SDES",
"The SDES items of this session", "The SDES items of this session",
GST_TYPE_STRUCTURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS GST_TYPE_STRUCTURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS
| GST_PARAM_DOC_SHOW_DEFAULT)); | GST_PARAM_DOC_SHOW_DEFAULT);
g_object_class_install_property (gobject_class, PROP_NUM_SOURCES, properties[PROP_NUM_SOURCES] =
g_param_spec_uint ("num-sources", "Num Sources", g_param_spec_uint ("num-sources", "Num Sources",
"The number of sources in the session", 0, G_MAXUINT, "The number of sources in the session", 0, G_MAXUINT,
DEFAULT_NUM_SOURCES, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); DEFAULT_NUM_SOURCES, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (gobject_class, PROP_NUM_ACTIVE_SOURCES, properties[PROP_NUM_ACTIVE_SOURCES] =
g_param_spec_uint ("num-active-sources", "Num Active Sources", g_param_spec_uint ("num-active-sources", "Num Active Sources",
"The number of active sources in the session", 0, G_MAXUINT, "The number of active sources in the session", 0, G_MAXUINT,
DEFAULT_NUM_ACTIVE_SOURCES, DEFAULT_NUM_ACTIVE_SOURCES, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
/** /**
* RTPSource:sources * RTPSource:sources
* *
@ -532,56 +533,54 @@ rtp_session_class_init (RTPSessionClass * klass)
* } * }
* ``` * ```
*/ */
g_object_class_install_property (gobject_class, PROP_SOURCES, properties[PROP_SOURCES] =
g_param_spec_boxed ("sources", "Sources", g_param_spec_boxed ("sources", "Sources",
"An array of all known sources in the session", "An array of all known sources in the session",
G_TYPE_VALUE_ARRAY, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); G_TYPE_VALUE_ARRAY, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (gobject_class, PROP_FAVOR_NEW, properties[PROP_FAVOR_NEW] =
g_param_spec_boolean ("favor-new", "Favor new sources", g_param_spec_boolean ("favor-new", "Favor new sources",
"Resolve SSRC conflict in favor of new sources", FALSE, "Resolve SSRC conflict in favor of new sources", FALSE,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (gobject_class, PROP_RTCP_MIN_INTERVAL, properties[PROP_RTCP_MIN_INTERVAL] =
g_param_spec_uint64 ("rtcp-min-interval", "Minimum RTCP interval", g_param_spec_uint64 ("rtcp-min-interval", "Minimum RTCP interval",
"Minimum interval between Regular RTCP packet (in ns)", "Minimum interval between Regular RTCP packet (in ns)",
0, G_MAXUINT64, DEFAULT_RTCP_MIN_INTERVAL, 0, G_MAXUINT64, DEFAULT_RTCP_MIN_INTERVAL,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (gobject_class, properties[PROP_RTCP_FEEDBACK_RETENTION_WINDOW] =
PROP_RTCP_FEEDBACK_RETENTION_WINDOW,
g_param_spec_uint64 ("rtcp-feedback-retention-window", g_param_spec_uint64 ("rtcp-feedback-retention-window",
"RTCP Feedback retention window", "RTCP Feedback retention window",
"Duration during which RTCP Feedback packets are retained (in ns)", "Duration during which RTCP Feedback packets are retained (in ns)",
0, G_MAXUINT64, DEFAULT_RTCP_FEEDBACK_RETENTION_WINDOW, 0, G_MAXUINT64, DEFAULT_RTCP_FEEDBACK_RETENTION_WINDOW,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (gobject_class, properties[PROP_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD] =
PROP_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD,
g_param_spec_uint ("rtcp-immediate-feedback-threshold", g_param_spec_uint ("rtcp-immediate-feedback-threshold",
"RTCP Immediate Feedback threshold", "RTCP Immediate Feedback threshold",
"The maximum number of members of a RTP session for which immediate" "The maximum number of members of a RTP session for which immediate"
" feedback is used (DEPRECATED: has no effect and is not needed)", " feedback is used (DEPRECATED: has no effect and is not needed)",
0, G_MAXUINT, DEFAULT_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD, 0, G_MAXUINT, DEFAULT_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_DEPRECATED)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_DEPRECATED);
g_object_class_install_property (gobject_class, PROP_PROBATION, properties[PROP_PROBATION] =
g_param_spec_uint ("probation", "Number of probations", g_param_spec_uint ("probation", "Number of probations",
"Consecutive packet sequence numbers to accept the source", "Consecutive packet sequence numbers to accept the source",
0, G_MAXUINT, DEFAULT_PROBATION, 0, G_MAXUINT, DEFAULT_PROBATION,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (gobject_class, PROP_MAX_DROPOUT_TIME, properties[PROP_MAX_DROPOUT_TIME] =
g_param_spec_uint ("max-dropout-time", "Max dropout time", g_param_spec_uint ("max-dropout-time", "Max dropout time",
"The maximum time (milliseconds) of missing packets tolerated.", "The maximum time (milliseconds) of missing packets tolerated.",
0, G_MAXUINT, DEFAULT_MAX_DROPOUT_TIME, 0, G_MAXUINT, DEFAULT_MAX_DROPOUT_TIME,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (gobject_class, PROP_MAX_MISORDER_TIME, properties[PROP_MAX_MISORDER_TIME] =
g_param_spec_uint ("max-misorder-time", "Max misorder time", g_param_spec_uint ("max-misorder-time", "Max misorder time",
"The maximum time (milliseconds) of misordered packets tolerated.", "The maximum time (milliseconds) of misordered packets tolerated.",
0, G_MAXUINT, DEFAULT_MAX_MISORDER_TIME, 0, G_MAXUINT, DEFAULT_MAX_MISORDER_TIME,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
/** /**
* RTPSession:stats: * RTPSession:stats:
@ -598,21 +597,20 @@ rtp_session_class_init (RTPSessionClass * klass)
* *
* Since: 1.4 * Since: 1.4
*/ */
g_object_class_install_property (gobject_class, PROP_STATS, properties[PROP_STATS] =
g_param_spec_boxed ("stats", "Statistics", g_param_spec_boxed ("stats", "Statistics",
"Various statistics", GST_TYPE_STRUCTURE, "Various statistics", GST_TYPE_STRUCTURE,
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS)); G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (gobject_class, PROP_RTP_PROFILE, properties[PROP_RTP_PROFILE] =
g_param_spec_enum ("rtp-profile", "RTP Profile", g_param_spec_enum ("rtp-profile", "RTP Profile",
"RTP profile to use for this session", GST_TYPE_RTP_PROFILE, "RTP profile to use for this session", GST_TYPE_RTP_PROFILE,
DEFAULT_RTP_PROFILE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); DEFAULT_RTP_PROFILE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_property (gobject_class, PROP_RTCP_REDUCED_SIZE, properties[PROP_RTCP_REDUCED_SIZE] =
g_param_spec_boolean ("rtcp-reduced-size", "RTCP Reduced Size", g_param_spec_boolean ("rtcp-reduced-size", "RTCP Reduced Size",
"Use Reduced Size RTCP for feedback packets", "Use Reduced Size RTCP for feedback packets",
DEFAULT_RTCP_REDUCED_SIZE, DEFAULT_RTCP_REDUCED_SIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/** /**
* RTPSession:disable-sr-timestamp: * RTPSession:disable-sr-timestamp:
@ -621,13 +619,12 @@ rtp_session_class_init (RTPSessionClass * klass)
* *
* Since: 1.16 * Since: 1.16
*/ */
g_object_class_install_property (gobject_class, properties[PROP_RTCP_DISABLE_SR_TIMESTAMP] =
PROP_RTCP_DISABLE_SR_TIMESTAMP,
g_param_spec_boolean ("disable-sr-timestamp", g_param_spec_boolean ("disable-sr-timestamp",
"Disable Sender Report Timestamp", "Disable Sender Report Timestamp",
"Whether sender reports should be timestamped", "Whether sender reports should be timestamped",
DEFAULT_RTCP_DISABLE_SR_TIMESTAMP, DEFAULT_RTCP_DISABLE_SR_TIMESTAMP,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
/** /**
* RTPSession:twcc-feedback-interval: * RTPSession:twcc-feedback-interval:
@ -638,13 +635,14 @@ rtp_session_class_init (RTPSessionClass * klass)
* *
* Since: 1.20 * Since: 1.20
*/ */
g_object_class_install_property (gobject_class, properties[PROP_TWCC_FEEDBACK_INTERVAL] =
PROP_TWCC_FEEDBACK_INTERVAL,
g_param_spec_uint64 ("twcc-feedback-interval", g_param_spec_uint64 ("twcc-feedback-interval",
"TWCC Feedback Interval", "TWCC Feedback Interval",
"The interval to send TWCC reports on", "The interval to send TWCC reports on",
0, G_MAXUINT64, DEFAULT_TWCC_FEEDBACK_INTERVAL, 0, G_MAXUINT64, DEFAULT_TWCC_FEEDBACK_INTERVAL,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)); G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
g_object_class_install_properties (gobject_class, PROP_LAST, properties);
klass->get_source_by_ssrc = klass->get_source_by_ssrc =
GST_DEBUG_FUNCPTR (rtp_session_get_source_by_ssrc); GST_DEBUG_FUNCPTR (rtp_session_get_source_by_ssrc);
@ -3076,7 +3074,7 @@ rtp_session_process_rtcp (RTPSession * sess, GstBuffer * buffer,
GstClockTime current_time, GstClockTime running_time, guint64 ntpnstime) GstClockTime current_time, GstClockTime running_time, guint64 ntpnstime)
{ {
GstRTCPPacket packet; GstRTCPPacket packet;
gboolean more, is_bye = FALSE, do_sync = FALSE; gboolean more, is_bye = FALSE, do_sync = FALSE, has_report = FALSE;
RTPPacketInfo pinfo = { 0, }; RTPPacketInfo pinfo = { 0, };
GstFlowReturn result = GST_FLOW_OK; GstFlowReturn result = GST_FLOW_OK;
GstRTCPBuffer rtcp = { NULL, }; GstRTCPBuffer rtcp = { NULL, };
@ -3107,9 +3105,11 @@ rtp_session_process_rtcp (RTPSession * sess, GstBuffer * buffer,
switch (type) { switch (type) {
case GST_RTCP_TYPE_SR: case GST_RTCP_TYPE_SR:
has_report = TRUE;
rtp_session_process_sr (sess, &packet, &pinfo, &do_sync); rtp_session_process_sr (sess, &packet, &pinfo, &do_sync);
break; break;
case GST_RTCP_TYPE_RR: case GST_RTCP_TYPE_RR:
has_report = TRUE;
rtp_session_process_rr (sess, &packet, &pinfo); rtp_session_process_rr (sess, &packet, &pinfo);
break; break;
case GST_RTCP_TYPE_SDES: case GST_RTCP_TYPE_SDES:
@ -3157,6 +3157,10 @@ rtp_session_process_rtcp (RTPSession * sess, GstBuffer * buffer,
sess->stats.avg_rtcp_packet_size, pinfo.bytes); sess->stats.avg_rtcp_packet_size, pinfo.bytes);
RTP_SESSION_UNLOCK (sess); RTP_SESSION_UNLOCK (sess);
if (has_report) {
g_object_notify_by_pspec (G_OBJECT (sess), properties[PROP_STATS]);
}
pinfo.data = NULL; pinfo.data = NULL;
clean_packet_info (&pinfo); clean_packet_info (&pinfo);
@ -4712,7 +4716,7 @@ done:
RTP_SESSION_UNLOCK (sess); RTP_SESSION_UNLOCK (sess);
/* notify about updated statistics */ /* notify about updated statistics */
g_object_notify (G_OBJECT (sess), "stats"); g_object_notify_by_pspec (G_OBJECT (sess), properties[PROP_STATS]);
/* push out the RTCP packets */ /* push out the RTCP packets */
while ((output = g_queue_pop_head (&data.output))) { while ((output = g_queue_pop_head (&data.output))) {