#define DEFAULT_NTP_TIME_SOURCE GST_RTP_NTP_TIME_SOURCE_NTP
#define DEFAULT_RTCP_SYNC_SEND_TIME TRUE
#define DEFAULT_MAX_RTCP_RTP_TIME_DIFF 1000
+#define DEFAULT_MAX_DROPOUT_TIME 60000
+#define DEFAULT_MAX_MISORDER_TIME 2000
enum
{
PROP_RTP_PROFILE,
PROP_NTP_TIME_SOURCE,
PROP_RTCP_SYNC_SEND_TIME,
- PROP_MAX_RTCP_RTP_TIME_DIFF
+ PROP_MAX_RTCP_RTP_TIME_DIFF,
+ PROP_MAX_DROPOUT_TIME,
+ PROP_MAX_MISORDER_TIME
};
#define GST_RTP_BIN_RTCP_SYNC_TYPE (gst_rtp_bin_rtcp_sync_get_type())
NULL);
else
g_object_set (session, "ntp-time-source", rtpbin->ntp_time_source, NULL);
+
+ g_object_set (session, "max-dropout-time", rtpbin->max_dropout_time,
+ "max-misorder-time", rtpbin->max_misorder_time, NULL);
GST_OBJECT_UNLOCK (rtpbin);
/* provide clock_rate to the session manager when needed */
GST_RTP_BIN_UNLOCK (bin);
}
+static void
+gst_rtp_bin_propagate_property_to_session (GstRtpBin * bin,
+ const gchar * name, const GValue * value)
+{
+ GSList *sessions;
+
+ GST_RTP_BIN_LOCK (bin);
+ for (sessions = bin->sessions; sessions; sessions = g_slist_next (sessions)) {
+ GstRtpBinSession *sess = (GstRtpBinSession *) sessions->data;
+
+ g_object_set_property (G_OBJECT (sess->session), name, value);
+ }
+ GST_RTP_BIN_UNLOCK (bin);
+}
+
/* get a client with the given SDES name. Must be called with RTP_BIN_LOCK */
static GstRtpBinClient *
get_client (GstRtpBin * bin, guint8 len, guint8 * data, gboolean * created)
g_object_set (buffer, "do-retransmission", rtpbin->do_retransmission, NULL);
g_object_set (buffer, "max-rtcp-rtp-time-diff",
rtpbin->max_rtcp_rtp_time_diff, NULL);
+ g_object_set (buffer, "max-dropout-time", rtpbin->max_dropout_time,
+ "max-misorder-time", rtpbin->max_misorder_time, NULL);
g_signal_emit (rtpbin, gst_rtp_bin_signals[SIGNAL_NEW_JITTERBUFFER], 0,
buffer, session->id, ssrc);
DEFAULT_MAX_RTCP_RTP_TIME_DIFF,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MAX_DROPOUT_TIME,
+ g_param_spec_uint ("max-dropout-time", "Max dropout time",
+ "The maximum time (milliseconds) of missing packets tolerated.",
+ 0, G_MAXUINT, DEFAULT_MAX_DROPOUT_TIME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_MAX_MISORDER_TIME,
+ g_param_spec_uint ("max-misorder-time", "Max misorder time",
+ "The maximum time (milliseconds) of misordered packets tolerated.",
+ 0, G_MAXUINT, DEFAULT_MAX_MISORDER_TIME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_rtp_bin_change_state);
gstelement_class->request_new_pad =
GST_DEBUG_FUNCPTR (gst_rtp_bin_request_new_pad);
rtpbin->ntp_time_source = DEFAULT_NTP_TIME_SOURCE;
rtpbin->rtcp_sync_send_time = DEFAULT_RTCP_SYNC_SEND_TIME;
rtpbin->max_rtcp_rtp_time_diff = DEFAULT_MAX_RTCP_RTP_TIME_DIFF;
+ rtpbin->max_dropout_time = DEFAULT_MAX_DROPOUT_TIME;
+ rtpbin->max_misorder_time = DEFAULT_MAX_MISORDER_TIME;
/* some default SDES entries */
cname = g_strdup_printf ("user%u@host-%x", g_random_int (), g_random_int ());
gst_rtp_bin_propagate_property_to_jitterbuffer (rtpbin,
"max-rtcp-rtp-time-diff", value);
break;
+ case PROP_MAX_DROPOUT_TIME:
+ GST_RTP_BIN_LOCK (rtpbin);
+ rtpbin->max_dropout_time = g_value_get_uint (value);
+ GST_RTP_BIN_UNLOCK (rtpbin);
+ gst_rtp_bin_propagate_property_to_jitterbuffer (rtpbin,
+ "max-dropout-time", value);
+ gst_rtp_bin_propagate_property_to_session (rtpbin, "max-dropout-time",
+ value);
+ break;
+ case PROP_MAX_MISORDER_TIME:
+ GST_RTP_BIN_LOCK (rtpbin);
+ rtpbin->max_misorder_time = g_value_get_uint (value);
+ GST_RTP_BIN_UNLOCK (rtpbin);
+ gst_rtp_bin_propagate_property_to_jitterbuffer (rtpbin,
+ "max-misorder-time", value);
+ gst_rtp_bin_propagate_property_to_session (rtpbin, "max-dropout-time",
+ value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
GST_RTP_BIN_LOCK (rtpbin);
g_value_set_int (value, rtpbin->max_rtcp_rtp_time_diff);
GST_RTP_BIN_UNLOCK (rtpbin);
+ case PROP_MAX_DROPOUT_TIME:
+ g_value_set_uint (value, rtpbin->max_dropout_time);
+ break;
+ case PROP_MAX_MISORDER_TIME:
+ g_value_set_uint (value, rtpbin->max_misorder_time);
+ break;
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
GstRTPProfile rtp_profile;
gboolean rtcp_sync_send_time;
gint max_rtcp_rtp_time_diff;
+ guint32 max_dropout_time;
+ guint32 max_misorder_time;
/* a list of session */
GSList *sessions;
#define DEFAULT_RTX_RETRY_PERIOD -1
#define DEFAULT_RTX_MAX_RETRIES -1
#define DEFAULT_MAX_RTCP_RTP_TIME_DIFF 1000
+#define DEFAULT_MAX_DROPOUT_TIME 60000
+#define DEFAULT_MAX_MISORDER_TIME 2000
#define DEFAULT_AUTO_RTX_DELAY (20 * GST_MSECOND)
#define DEFAULT_AUTO_RTX_TIMEOUT (40 * GST_MSECOND)
PROP_RTX_RETRY_PERIOD,
PROP_RTX_MAX_RETRIES,
PROP_STATS,
- PROP_MAX_RTCP_RTP_TIME_DIFF
+ PROP_MAX_RTCP_RTP_TIME_DIFF,
+ PROP_MAX_DROPOUT_TIME,
+ PROP_MAX_MISORDER_TIME
};
#define JBUF_LOCK(priv) (g_mutex_lock (&(priv)->jbuf_lock))
gint rtx_retry_period;
gint rtx_max_retries;
gint max_rtcp_rtp_time_diff;
+ guint32 max_dropout_time;
+ guint32 max_misorder_time;
/* the last seqnum we pushed out */
guint32 last_popped_seqnum;
"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));
+
+ g_object_class_install_property (gobject_class, PROP_MAX_DROPOUT_TIME,
+ g_param_spec_uint ("max-dropout-time", "Max dropout time",
+ "The maximum time (milliseconds) of missing packets tolerated.",
+ 0, G_MAXUINT, DEFAULT_MAX_DROPOUT_TIME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_MAX_MISORDER_TIME,
+ g_param_spec_uint ("max-misorder-time", "Max misorder time",
+ "The maximum time (milliseconds) of misordered packets tolerated.",
+ 0, G_MAXUINT, DEFAULT_MAX_MISORDER_TIME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
/**
* GstRtpJitterBuffer:stats:
*
priv->rtx_retry_period = DEFAULT_RTX_RETRY_PERIOD;
priv->rtx_max_retries = DEFAULT_RTX_MAX_RETRIES;
priv->max_rtcp_rtp_time_diff = DEFAULT_MAX_RTCP_RTP_TIME_DIFF;
+ priv->max_dropout_time = DEFAULT_MAX_DROPOUT_TIME;
+ priv->max_misorder_time = DEFAULT_MAX_MISORDER_TIME;
priv->last_dts = -1;
priv->last_rtptime = -1;
priv->max_rtcp_rtp_time_diff = g_value_get_int (value);
JBUF_UNLOCK (priv);
break;
+ case PROP_MAX_DROPOUT_TIME:
+ JBUF_LOCK (priv);
+ priv->max_dropout_time = g_value_get_uint (value);
+ JBUF_UNLOCK (priv);
+ break;
+ case PROP_MAX_MISORDER_TIME:
+ JBUF_LOCK (priv);
+ priv->max_misorder_time = g_value_get_uint (value);
+ JBUF_UNLOCK (priv);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
g_value_set_int (value, priv->max_rtcp_rtp_time_diff);
JBUF_UNLOCK (priv);
break;
+ case PROP_MAX_DROPOUT_TIME:
+ JBUF_LOCK (priv);
+ g_value_set_uint (value, priv->max_dropout_time);
+ JBUF_UNLOCK (priv);
+ break;
+ case PROP_MAX_MISORDER_TIME:
+ JBUF_LOCK (priv);
+ g_value_set_uint (value, priv->max_misorder_time);
+ JBUF_UNLOCK (priv);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
#define DEFAULT_USE_PIPELINE_CLOCK FALSE
#define DEFAULT_RTCP_MIN_INTERVAL (RTP_STATS_MIN_INTERVAL * GST_SECOND)
#define DEFAULT_PROBATION RTP_DEFAULT_PROBATION
+#define DEFAULT_MAX_DROPOUT_TIME 60000
+#define DEFAULT_MAX_MISORDER_TIME 2000
#define DEFAULT_RTP_PROFILE GST_RTP_PROFILE_AVP
#define DEFAULT_NTP_TIME_SOURCE GST_RTP_NTP_TIME_SOURCE_NTP
#define DEFAULT_RTCP_SYNC_SEND_TIME TRUE
PROP_USE_PIPELINE_CLOCK,
PROP_RTCP_MIN_INTERVAL,
PROP_PROBATION,
+ PROP_MAX_DROPOUT_TIME,
+ PROP_MAX_MISORDER_TIME,
PROP_STATS,
PROP_RTP_PROFILE,
PROP_NTP_TIME_SOURCE,
0, G_MAXUINT, DEFAULT_PROBATION,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MAX_DROPOUT_TIME,
+ g_param_spec_uint ("max-dropout-time", "Max dropout time",
+ "The maximum time (milliseconds) of missing packets tolerated.",
+ 0, G_MAXUINT, DEFAULT_MAX_DROPOUT_TIME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_MAX_MISORDER_TIME,
+ g_param_spec_uint ("max-misorder-time", "Max misorder time",
+ "The maximum time (milliseconds) of misordered packets tolerated.",
+ 0, G_MAXUINT, DEFAULT_MAX_MISORDER_TIME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
/**
* GstRtpSession::stats:
*
case PROP_PROBATION:
g_object_set_property (G_OBJECT (priv->session), "probation", value);
break;
+ case PROP_MAX_DROPOUT_TIME:
+ g_object_set_property (G_OBJECT (priv->session), "max-dropout-time",
+ value);
+ break;
+ case PROP_MAX_MISORDER_TIME:
+ g_object_set_property (G_OBJECT (priv->session), "max-misorder-time",
+ value);
+ break;
case PROP_RTP_PROFILE:
g_object_set_property (G_OBJECT (priv->session), "rtp-profile", value);
break;
case PROP_PROBATION:
g_object_get_property (G_OBJECT (priv->session), "probation", value);
break;
+ case PROP_MAX_DROPOUT_TIME:
+ g_object_get_property (G_OBJECT (priv->session), "max-dropout-time",
+ value);
+ break;
+ case PROP_MAX_MISORDER_TIME:
+ g_object_get_property (G_OBJECT (priv->session), "max-misorder-time",
+ value);
+ break;
case PROP_STATS:
g_value_take_boxed (value, gst_rtp_session_create_stats (rtpsession));
break;
#define DEFAULT_RTCP_FEEDBACK_RETENTION_WINDOW (2 * GST_SECOND)
#define DEFAULT_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD (3)
#define DEFAULT_PROBATION RTP_DEFAULT_PROBATION
+#define DEFAULT_MAX_DROPOUT_TIME 60000
+#define DEFAULT_MAX_MISORDER_TIME 2000
#define DEFAULT_RTP_PROFILE GST_RTP_PROFILE_AVP
enum
PROP_RTCP_FEEDBACK_RETENTION_WINDOW,
PROP_RTCP_IMMEDIATE_FEEDBACK_THRESHOLD,
PROP_PROBATION,
+ PROP_MAX_DROPOUT_TIME,
+ PROP_MAX_MISORDER_TIME,
PROP_STATS,
PROP_RTP_PROFILE
};
0, G_MAXUINT, DEFAULT_PROBATION,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MAX_DROPOUT_TIME,
+ g_param_spec_uint ("max-dropout-time", "Max dropout time",
+ "The maximum time (milliseconds) of missing packets tolerated.",
+ 0, G_MAXUINT, DEFAULT_MAX_DROPOUT_TIME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_MAX_MISORDER_TIME,
+ g_param_spec_uint ("max-misorder-time", "Max misorder time",
+ "The maximum time (milliseconds) of misordered packets tolerated.",
+ 0, G_MAXUINT, DEFAULT_MAX_MISORDER_TIME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
/**
* RTPSession::stats:
*
sess->mtu = DEFAULT_RTCP_MTU;
sess->probation = DEFAULT_PROBATION;
+ sess->max_dropout_time = DEFAULT_MAX_DROPOUT_TIME;
+ sess->max_misorder_time = DEFAULT_MAX_MISORDER_TIME;
/* some default SDES entries */
sess->sdes = gst_structure_new_empty ("application/x-rtp-source-sdes");
case PROP_PROBATION:
sess->probation = g_value_get_uint (value);
break;
+ case PROP_MAX_DROPOUT_TIME:
+ sess->max_dropout_time = g_value_get_uint (value);
+ break;
+ case PROP_MAX_MISORDER_TIME:
+ sess->max_misorder_time = g_value_get_uint (value);
+ break;
case PROP_RTP_PROFILE:
sess->rtp_profile = g_value_get_enum (value);
/* trigger reconsideration */
case PROP_PROBATION:
g_value_set_uint (value, sess->probation);
break;
+ case PROP_MAX_DROPOUT_TIME:
+ g_value_set_uint (value, sess->max_dropout_time);
+ break;
+ case PROP_MAX_MISORDER_TIME:
+ g_value_set_uint (value, sess->max_misorder_time);
+ break;
case PROP_STATS:
g_value_take_boxed (value, rtp_session_create_stats (sess));
break;
/* for RTP packets we need to set the source in probation. Receiving RTCP
* packets of an SSRC, on the other hand, is a strong indication that we
* are dealing with a valid source. */
- if (rtp)
- g_object_set (source, "probation", sess->probation, NULL);
- else
- g_object_set (source, "probation", 0, NULL);
+ g_object_set (source, "probation", rtp ? sess->probation : 0,
+ "max-dropout-time", sess->max_dropout_time, "max-misorder-time",
+ sess->max_misorder_time, NULL);
/* store from address, if any */
if (pinfo->address) {
GstStructure *sdes;
guint probation;
+ guint32 max_dropout_time;
+ guint32 max_misorder_time;
GstRTPProfile rtp_profile;
#define DEFAULT_IS_SENDER FALSE
#define DEFAULT_SDES NULL
#define DEFAULT_PROBATION RTP_DEFAULT_PROBATION
+#define DEFAULT_MAX_DROPOUT_TIME 60000
+#define DEFAULT_MAX_MISORDER_TIME 2000
enum
{
PROP_IS_SENDER,
PROP_SDES,
PROP_STATS,
- PROP_PROBATION
+ PROP_PROBATION,
+ PROP_MAX_DROPOUT_TIME,
+ PROP_MAX_MISORDER_TIME
};
/* GObject vmethods */
0, G_MAXUINT, DEFAULT_PROBATION,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+ g_object_class_install_property (gobject_class, PROP_MAX_DROPOUT_TIME,
+ g_param_spec_uint ("max-dropout-time", "Max dropout time",
+ "The maximum time (milliseconds) of missing packets tolerated.",
+ 0, G_MAXUINT, DEFAULT_MAX_DROPOUT_TIME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+ g_object_class_install_property (gobject_class, PROP_MAX_MISORDER_TIME,
+ g_param_spec_uint ("max-misorder-time", "Max misorder time",
+ "The maximum time (milliseconds) of misordered packets tolerated.",
+ 0, G_MAXUINT, DEFAULT_MAX_MISORDER_TIME,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
GST_DEBUG_CATEGORY_INIT (rtp_source_debug, "rtpsource", 0, "RTP Source");
}
src->probation = DEFAULT_PROBATION;
src->curr_probation = src->probation;
src->closing = FALSE;
+ src->max_dropout_time = DEFAULT_MAX_DROPOUT_TIME;
+ src->max_misorder_time = DEFAULT_MAX_MISORDER_TIME;
src->sdes = gst_structure_new_empty ("application/x-rtp-source-sdes");
case PROP_PROBATION:
src->probation = g_value_get_uint (value);
break;
+ case PROP_MAX_DROPOUT_TIME:
+ src->max_dropout_time = g_value_get_uint (value);
+ break;
+ case PROP_MAX_MISORDER_TIME:
+ src->max_misorder_time = g_value_get_uint (value);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
case PROP_PROBATION:
g_value_set_uint (value, src->probation);
break;
+ case PROP_MAX_DROPOUT_TIME:
+ g_value_set_uint (value, src->max_dropout_time);
+ break;
+ case PROP_MAX_MISORDER_TIME:
+ g_value_set_uint (value, src->max_misorder_time);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
guint64 bytes_received;
GQueue *packets;
+ guint32 max_dropout_time;
+ guint32 max_misorder_time;
RTPSourceCallbacks callbacks;
gpointer user_data;