#define DEFAULT_RTX_RETRY_TIMEOUT -1
#define DEFAULT_RTX_MIN_RETRY_TIMEOUT -1
#define DEFAULT_RTX_RETRY_PERIOD -1
+#define DEFAULT_RTX_MAX_RETRIES -1
#define DEFAULT_AUTO_RTX_DELAY (20 * GST_MSECOND)
#define DEFAULT_AUTO_RTX_TIMEOUT (40 * GST_MSECOND)
PROP_RTX_RETRY_TIMEOUT,
PROP_RTX_MIN_RETRY_TIMEOUT,
PROP_RTX_RETRY_PERIOD,
+ PROP_RTX_MAX_RETRIES,
PROP_STATS,
PROP_LAST
};
gint rtx_retry_timeout;
gint rtx_min_retry_timeout;
gint rtx_retry_period;
+ gint rtx_max_retries;
/* the last seqnum we pushed out */
guint32 last_popped_seqnum;
"(-1 automatic)", -1, G_MAXINT, DEFAULT_RTX_RETRY_PERIOD,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
+ * GstRtpJitterBuffer:rtx-max-retries:
+ *
+ * The maximum number of retries to request a retransmission.
+ *
+ * This implies that as maximum (rtx-max-retries + 1) retransmissions will be requested.
+ * When -1 is used, the number of retransmission request will not be limited.
+ *
+ * Since: 1.6
+ */
+ g_object_class_install_property (gobject_class, PROP_RTX_MAX_RETRIES,
+ g_param_spec_int ("rtx-max-retries", "RTX Max Retries",
+ "The maximum number of retries to request a retransmission. "
+ "(-1 not limited)", -1, G_MAXINT, DEFAULT_RTX_MAX_RETRIES,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ /**
* GstRtpJitterBuffer:stats:
*
* Various jitterbuffer statistics. This property returns a GstStructure
priv->rtx_retry_timeout = DEFAULT_RTX_RETRY_TIMEOUT;
priv->rtx_min_retry_timeout = DEFAULT_RTX_MIN_RETRY_TIMEOUT;
priv->rtx_retry_period = DEFAULT_RTX_RETRY_PERIOD;
+ priv->rtx_max_retries = DEFAULT_RTX_MAX_RETRIES;
priv->last_dts = -1;
priv->last_rtptime = -1;
GST_TIME_FORMAT ", retry %" GST_TIME_FORMAT ", num_retry %u",
GST_TIME_ARGS (timer->rtx_base), GST_TIME_ARGS (timer->rtx_delay),
GST_TIME_ARGS (timer->rtx_retry), timer->num_rtx_retry);
-
- if (timer->rtx_retry + timer->rtx_delay > rtx_retry_period) {
+ if ((priv->rtx_max_retries != -1
+ && timer->num_rtx_retry >= priv->rtx_max_retries)
+ || (timer->rtx_retry + timer->rtx_delay > rtx_retry_period)) {
GST_DEBUG_OBJECT (jitterbuffer, "reschedule as LOST timer");
/* too many retransmission request, we now convert the timer
* to a lost timer, leave the num_rtx_retry as it is for stats */
priv->rtx_retry_period = g_value_get_int (value);
JBUF_UNLOCK (priv);
break;
+ case PROP_RTX_MAX_RETRIES:
+ JBUF_LOCK (priv);
+ priv->rtx_max_retries = g_value_get_int (value);
+ JBUF_UNLOCK (priv);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
g_value_set_int (value, priv->rtx_retry_period);
JBUF_UNLOCK (priv);
break;
+ case PROP_RTX_MAX_RETRIES:
+ JBUF_LOCK (priv);
+ g_value_set_int (value, priv->rtx_max_retries);
+ JBUF_UNLOCK (priv);
+ break;
case PROP_STATS:
g_value_take_boxed (value,
gst_rtp_jitter_buffer_create_stats (jitterbuffer));