mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
gst/rtpmanager/gstrtpjitterbuffer.c: Disable sending out rtp packet lost events by default and make a property to ena...
Original commit message from CVS: * gst/rtpmanager/gstrtpjitterbuffer.c: (gst_rtp_jitter_buffer_class_init), (gst_rtp_jitter_buffer_init), (gst_rtp_jitter_buffer_loop), (gst_rtp_jitter_buffer_set_property), (gst_rtp_jitter_buffer_get_property): Disable sending out rtp packet lost events by default and make a property to enabe it. We will likely enable it by default when the base depayloaders have a default handler for them so that we don't send these events all through the pipeline for now.
This commit is contained in:
parent
e2ab966d14
commit
250c38a5ce
1 changed files with 52 additions and 14 deletions
|
@ -100,13 +100,16 @@ enum
|
||||||
#define DEFAULT_LATENCY_MS 200
|
#define DEFAULT_LATENCY_MS 200
|
||||||
#define DEFAULT_DROP_ON_LATENCY FALSE
|
#define DEFAULT_DROP_ON_LATENCY FALSE
|
||||||
#define DEFAULT_TS_OFFSET 0
|
#define DEFAULT_TS_OFFSET 0
|
||||||
|
#define DEFAULT_DO_LOST FALSE
|
||||||
|
|
||||||
enum
|
enum
|
||||||
{
|
{
|
||||||
PROP_0,
|
PROP_0,
|
||||||
PROP_LATENCY,
|
PROP_LATENCY,
|
||||||
PROP_DROP_ON_LATENCY,
|
PROP_DROP_ON_LATENCY,
|
||||||
PROP_TS_OFFSET
|
PROP_TS_OFFSET,
|
||||||
|
PROP_DO_LOST,
|
||||||
|
PROP_LAST
|
||||||
};
|
};
|
||||||
|
|
||||||
#define JBUF_LOCK(priv) (g_mutex_lock ((priv)->jbuf_lock))
|
#define JBUF_LOCK(priv) (g_mutex_lock ((priv)->jbuf_lock))
|
||||||
|
@ -136,11 +139,13 @@ struct _GstRtpJitterBufferPrivate
|
||||||
GMutex *jbuf_lock;
|
GMutex *jbuf_lock;
|
||||||
GCond *jbuf_cond;
|
GCond *jbuf_cond;
|
||||||
gboolean waiting;
|
gboolean waiting;
|
||||||
|
gboolean discont;
|
||||||
|
|
||||||
/* properties */
|
/* properties */
|
||||||
guint latency_ms;
|
guint latency_ms;
|
||||||
gboolean drop_on_latency;
|
gboolean drop_on_latency;
|
||||||
gint64 ts_offset;
|
gint64 ts_offset;
|
||||||
|
gboolean do_lost;
|
||||||
|
|
||||||
/* the last seqnum we pushed out */
|
/* the last seqnum we pushed out */
|
||||||
guint32 last_popped_seqnum;
|
guint32 last_popped_seqnum;
|
||||||
|
@ -288,13 +293,25 @@ gst_rtp_jitter_buffer_class_init (GstRtpJitterBufferClass * klass)
|
||||||
/**
|
/**
|
||||||
* GstRtpJitterBuffer::ts-offset:
|
* GstRtpJitterBuffer::ts-offset:
|
||||||
*
|
*
|
||||||
* Adjust RTP timestamps in the jitterbuffer with offset.
|
* Adjust GStreamer output buffer timestamps in the jitterbuffer with offset.
|
||||||
|
* This is mainly used to ensure interstream synchronisation.
|
||||||
*/
|
*/
|
||||||
g_object_class_install_property (gobject_class, PROP_TS_OFFSET,
|
g_object_class_install_property (gobject_class, PROP_TS_OFFSET,
|
||||||
g_param_spec_int64 ("ts-offset",
|
g_param_spec_int64 ("ts-offset", "Timestamp Offset",
|
||||||
"Timestamp Offset",
|
"Adjust buffer timestamps with offset in nanoseconds", G_MININT64,
|
||||||
"Adjust buffer RTP timestamps with offset in nanoseconds", G_MININT64,
|
G_MAXINT64, DEFAULT_TS_OFFSET,
|
||||||
G_MAXINT64, DEFAULT_TS_OFFSET, G_PARAM_READWRITE));
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GstRtpJitterBuffer::do-lost:
|
||||||
|
*
|
||||||
|
* Send out a GstRTPPacketLost event downstream when a packet is considered
|
||||||
|
* lost.
|
||||||
|
*/
|
||||||
|
g_object_class_install_property (gobject_class, PROP_DO_LOST,
|
||||||
|
g_param_spec_boolean ("do-lost", "Do Lost",
|
||||||
|
"Send an event downstream when a packet is lost", DEFAULT_DO_LOST,
|
||||||
|
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||||
/**
|
/**
|
||||||
* GstRtpJitterBuffer::request-pt-map:
|
* GstRtpJitterBuffer::request-pt-map:
|
||||||
* @buffer: the object which received the signal
|
* @buffer: the object which received the signal
|
||||||
|
@ -338,6 +355,7 @@ gst_rtp_jitter_buffer_init (GstRtpJitterBuffer * jitterbuffer,
|
||||||
|
|
||||||
priv->latency_ms = DEFAULT_LATENCY_MS;
|
priv->latency_ms = DEFAULT_LATENCY_MS;
|
||||||
priv->drop_on_latency = DEFAULT_DROP_ON_LATENCY;
|
priv->drop_on_latency = DEFAULT_DROP_ON_LATENCY;
|
||||||
|
priv->do_lost = DEFAULT_DO_LOST;
|
||||||
|
|
||||||
priv->jbuf = rtp_jitter_buffer_new ();
|
priv->jbuf = rtp_jitter_buffer_new ();
|
||||||
priv->jbuf_lock = g_mutex_new ();
|
priv->jbuf_lock = g_mutex_new ();
|
||||||
|
@ -1168,6 +1186,7 @@ again:
|
||||||
priv->num_late++;
|
priv->num_late++;
|
||||||
discont = TRUE;
|
discont = TRUE;
|
||||||
|
|
||||||
|
if (priv->do_lost) {
|
||||||
/* create paket lost event */
|
/* create paket lost event */
|
||||||
event = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM,
|
event = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM,
|
||||||
gst_structure_new ("GstRTPPacketLost",
|
gst_structure_new ("GstRTPPacketLost",
|
||||||
|
@ -1175,6 +1194,7 @@ again:
|
||||||
"timestamp", G_TYPE_UINT64, out_time,
|
"timestamp", G_TYPE_UINT64, out_time,
|
||||||
"duration", G_TYPE_UINT64, duration, NULL));
|
"duration", G_TYPE_UINT64, duration, NULL));
|
||||||
gst_pad_push_event (priv->srcpad, event);
|
gst_pad_push_event (priv->srcpad, event);
|
||||||
|
}
|
||||||
|
|
||||||
/* update our expected next packet */
|
/* update our expected next packet */
|
||||||
priv->last_popped_seqnum = next_seqnum;
|
priv->last_popped_seqnum = next_seqnum;
|
||||||
|
@ -1195,10 +1215,11 @@ push_buffer:
|
||||||
/* when we get here we are ready to pop and push the buffer */
|
/* when we get here we are ready to pop and push the buffer */
|
||||||
outbuf = rtp_jitter_buffer_pop (priv->jbuf);
|
outbuf = rtp_jitter_buffer_pop (priv->jbuf);
|
||||||
|
|
||||||
if (discont) {
|
if (discont || priv->discont) {
|
||||||
/* set DISCONT flag when we missed a packet. */
|
/* set DISCONT flag when we missed a packet. */
|
||||||
outbuf = gst_buffer_make_metadata_writable (outbuf);
|
outbuf = gst_buffer_make_metadata_writable (outbuf);
|
||||||
GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT);
|
GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT);
|
||||||
|
priv->discont = FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* apply timestamp with offset to buffer now */
|
/* apply timestamp with offset to buffer now */
|
||||||
|
@ -1347,11 +1368,21 @@ gst_rtp_jitter_buffer_set_property (GObject * object,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case PROP_DROP_ON_LATENCY:
|
case PROP_DROP_ON_LATENCY:
|
||||||
|
JBUF_LOCK (priv);
|
||||||
priv->drop_on_latency = g_value_get_boolean (value);
|
priv->drop_on_latency = g_value_get_boolean (value);
|
||||||
|
JBUF_UNLOCK (priv);
|
||||||
break;
|
break;
|
||||||
case PROP_TS_OFFSET:
|
case PROP_TS_OFFSET:
|
||||||
JBUF_LOCK (priv);
|
JBUF_LOCK (priv);
|
||||||
priv->ts_offset = g_value_get_int64 (value);
|
priv->ts_offset = g_value_get_int64 (value);
|
||||||
|
/* FIXME, we don't really have a method for signaling a timestamp
|
||||||
|
* DISCONT without also making this a data discont. */
|
||||||
|
/* priv->discont = TRUE; */
|
||||||
|
JBUF_UNLOCK (priv);
|
||||||
|
break;
|
||||||
|
case PROP_DO_LOST:
|
||||||
|
JBUF_LOCK (priv);
|
||||||
|
priv->do_lost = g_value_get_boolean (value);
|
||||||
JBUF_UNLOCK (priv);
|
JBUF_UNLOCK (priv);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -1377,13 +1408,20 @@ gst_rtp_jitter_buffer_get_property (GObject * object,
|
||||||
JBUF_UNLOCK (priv);
|
JBUF_UNLOCK (priv);
|
||||||
break;
|
break;
|
||||||
case PROP_DROP_ON_LATENCY:
|
case PROP_DROP_ON_LATENCY:
|
||||||
|
JBUF_LOCK (priv);
|
||||||
g_value_set_boolean (value, priv->drop_on_latency);
|
g_value_set_boolean (value, priv->drop_on_latency);
|
||||||
|
JBUF_UNLOCK (priv);
|
||||||
break;
|
break;
|
||||||
case PROP_TS_OFFSET:
|
case PROP_TS_OFFSET:
|
||||||
JBUF_LOCK (priv);
|
JBUF_LOCK (priv);
|
||||||
g_value_set_int64 (value, priv->ts_offset);
|
g_value_set_int64 (value, priv->ts_offset);
|
||||||
JBUF_UNLOCK (priv);
|
JBUF_UNLOCK (priv);
|
||||||
break;
|
break;
|
||||||
|
case PROP_DO_LOST:
|
||||||
|
JBUF_LOCK (priv);
|
||||||
|
g_value_set_boolean (value, priv->do_lost);
|
||||||
|
JBUF_UNLOCK (priv);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||||
break;
|
break;
|
||||||
|
|
Loading…
Reference in a new issue