From 3c9a4239bfb7e3a06a9dfefd4a9b696607b9e094 Mon Sep 17 00:00:00 2001 From: Mark Nauwelaerts Date: Mon, 7 Mar 2011 16:56:18 +0100 Subject: [PATCH] jitterbuffer: avoid trying to buffer more than is available. That is, in case of short (or near eos of) stream, deadlock (until timeout) would occur trying to buffer more than is yet forthcoming. --- gst/rtpmanager/gstrtpjitterbuffer.c | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/gst/rtpmanager/gstrtpjitterbuffer.c b/gst/rtpmanager/gstrtpjitterbuffer.c index ca83642..c8965ac 100644 --- a/gst/rtpmanager/gstrtpjitterbuffer.c +++ b/gst/rtpmanager/gstrtpjitterbuffer.c @@ -1232,6 +1232,22 @@ parse_failed: } } +/* call with jbuf lock held */ +static void +check_buffering_percent (GstRtpJitterBuffer * jitterbuffer, gint * percent) +{ + GstRtpJitterBufferPrivate *priv = jitterbuffer->priv; + + /* too short a stream, or too close to EOS will never really fill buffer */ + if (*percent != -1 && 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"); + rtp_jitter_buffer_set_buffering (priv->jbuf, FALSE); + *percent = 100; + } +} + static void post_buffering_percent (GstRtpJitterBuffer * jitterbuffer, gint percent) { @@ -1406,6 +1422,8 @@ gst_rtp_jitter_buffer_chain (GstPad * pad, GstBuffer * buffer) GST_DEBUG_OBJECT (jitterbuffer, "Pushed packet #%d, now %d packets, tail: %d", seqnum, rtp_jitter_buffer_num_packets (priv->jbuf), tail); + check_buffering_percent (jitterbuffer, &percent); + finished: JBUF_UNLOCK (priv); @@ -1836,6 +1854,8 @@ push_buffer: /* when we get here we are ready to pop and push the buffer */ outbuf = rtp_jitter_buffer_pop (priv->jbuf, &percent); + check_buffering_percent (jitterbuffer, &percent); + if (G_UNLIKELY (discont || priv->discont)) { /* set DISCONT flag when we missed a packet. We pushed the buffer writable * into the jitterbuffer so we can modify now. */ -- 2.7.4