jitterbuffer: assume a full buffer when eos

Rework the logic to make buffering messages a little, make sure we
don't make the same message multiple times.
Consider the buffer full when EOS was received.

Fixes https://bugzilla.gnome.org/show_bug.cgi?id=728017
This commit is contained in:
Wim Taymans 2014-04-18 04:23:26 +02:00
parent 2149d5a9bd
commit 42cfedde7f

View file

@ -275,6 +275,7 @@ struct _GstRtpJitterBufferPrivate
/* state */ /* state */
gboolean eos; gboolean eos;
guint last_percent;
/* clock rate and rtp timestamp offset */ /* clock rate and rtp timestamp offset */
gint last_pt; gint last_pt;
@ -1565,31 +1566,32 @@ parse_failed:
} }
/* call with jbuf lock held */ /* call with jbuf lock held */
static void static GstMessage *
check_buffering_percent (GstRtpJitterBuffer * jitterbuffer, gint * percent) check_buffering_percent (GstRtpJitterBuffer * jitterbuffer, gint percent)
{ {
GstRtpJitterBufferPrivate *priv = jitterbuffer->priv; GstRtpJitterBufferPrivate *priv = jitterbuffer->priv;
GstMessage *message = NULL;
/* too short a stream, or too close to EOS will never really fill buffer */ if (percent == -1)
if (*percent != -1 && priv->npt_stop != -1 && return NULL;
priv->npt_stop - priv->npt_start <=
rtp_jitter_buffer_get_delay (priv->jbuf)) { if (priv->eos || (priv->npt_stop != -1 &&
priv->npt_stop - priv->npt_start <=
rtp_jitter_buffer_get_delay (priv->jbuf))) {
GST_DEBUG_OBJECT (jitterbuffer, "short stream; faking full buffer"); GST_DEBUG_OBJECT (jitterbuffer, "short stream; faking full buffer");
rtp_jitter_buffer_set_buffering (priv->jbuf, FALSE); rtp_jitter_buffer_set_buffering (priv->jbuf, FALSE);
*percent = 100; percent = 100;
} }
}
static void
post_buffering_percent (GstRtpJitterBuffer * jitterbuffer, gint percent)
{
GstMessage *message;
/* Post a buffering message */ /* Post a buffering message */
message = gst_message_new_buffering (GST_OBJECT_CAST (jitterbuffer), percent); if (priv->last_percent != percent) {
gst_message_set_buffering_stats (message, GST_BUFFERING_LIVE, -1, -1, -1); priv->last_percent = percent;
message =
gst_message_new_buffering (GST_OBJECT_CAST (jitterbuffer), percent);
gst_message_set_buffering_stats (message, GST_BUFFERING_LIVE, -1, -1, -1);
}
gst_element_post_message (GST_ELEMENT_CAST (jitterbuffer), message); return message;
} }
static GstClockTime static GstClockTime
@ -2087,6 +2089,7 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstObject * parent,
GstRTPBuffer rtp = GST_RTP_BUFFER_INIT; GstRTPBuffer rtp = GST_RTP_BUFFER_INIT;
gboolean do_next_seqnum = FALSE; gboolean do_next_seqnum = FALSE;
RTPJitterBufferItem *item; RTPJitterBufferItem *item;
GstMessage *msg = NULL;
jitterbuffer = GST_RTP_JITTER_BUFFER (parent); jitterbuffer = GST_RTP_JITTER_BUFFER (parent);
@ -2294,13 +2297,13 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstObject * parent,
GST_DEBUG_OBJECT (jitterbuffer, "Pushed packet #%d, now %d packets, tail: %d", GST_DEBUG_OBJECT (jitterbuffer, "Pushed packet #%d, now %d packets, tail: %d",
seqnum, rtp_jitter_buffer_num_packets (priv->jbuf), tail); seqnum, rtp_jitter_buffer_num_packets (priv->jbuf), tail);
check_buffering_percent (jitterbuffer, &percent); msg = check_buffering_percent (jitterbuffer, percent);
finished: finished:
JBUF_UNLOCK (priv); JBUF_UNLOCK (priv);
if (percent != -1) if (msg)
post_buffering_percent (jitterbuffer, percent); gst_element_post_message (GST_ELEMENT_CAST (jitterbuffer), msg);
return ret; return ret;
@ -2440,6 +2443,7 @@ pop_and_push_next (GstRtpJitterBuffer * jitterbuffer, guint seqnum)
gint percent = -1; gint percent = -1;
gboolean do_push = TRUE; gboolean do_push = TRUE;
guint type; guint type;
GstMessage *msg;
/* 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 */
item = rtp_jitter_buffer_pop (priv->jbuf, &percent); item = rtp_jitter_buffer_pop (priv->jbuf, &percent);
@ -2447,7 +2451,6 @@ pop_and_push_next (GstRtpJitterBuffer * jitterbuffer, guint seqnum)
switch (type) { switch (type) {
case ITEM_TYPE_BUFFER: case ITEM_TYPE_BUFFER:
check_buffering_percent (jitterbuffer, &percent);
/* we need to make writable to change the flags and timestamps */ /* we need to make writable to change the flags and timestamps */
outbuf = gst_buffer_make_writable (item->data); outbuf = gst_buffer_make_writable (item->data);
@ -2497,17 +2500,18 @@ pop_and_push_next (GstRtpJitterBuffer * jitterbuffer, guint seqnum)
priv->last_popped_seqnum = seqnum; priv->last_popped_seqnum = seqnum;
priv->next_seqnum = (seqnum + item->count) & 0xffff; priv->next_seqnum = (seqnum + item->count) & 0xffff;
} }
msg = check_buffering_percent (jitterbuffer, percent);
JBUF_UNLOCK (priv); JBUF_UNLOCK (priv);
item->data = NULL; item->data = NULL;
free_item (item); free_item (item);
if (msg)
gst_element_post_message (GST_ELEMENT_CAST (jitterbuffer), msg);
switch (type) { switch (type) {
case ITEM_TYPE_BUFFER: case ITEM_TYPE_BUFFER:
/* push buffer */ /* push buffer */
if (percent != -1)
post_buffering_percent (jitterbuffer, percent);
GST_DEBUG_OBJECT (jitterbuffer, GST_DEBUG_OBJECT (jitterbuffer,
"Pushing buffer %d, dts %" GST_TIME_FORMAT ", pts %" GST_TIME_FORMAT, "Pushing buffer %d, dts %" GST_TIME_FORMAT ", pts %" GST_TIME_FORMAT,
seqnum, GST_TIME_ARGS (GST_BUFFER_DTS (outbuf)), seqnum, GST_TIME_ARGS (GST_BUFFER_DTS (outbuf)),