[vlc-commits] input: improved buffering accuracy and no rebuffering on ignored

David Robison git at videolan.org
Sat Oct 12 13:01:53 CEST 2013


vlc | branch: master | David Robison <drrobison at openroadsconsulting.com> | Sat Oct 12 13:59:53 2013 +0300| [c3bd897e586d906d631a1cdc51232f76ff1ca1fe] | committer: Rémi Denis-Courmont

input: improved buffering accuracy and no rebuffering on ignored

To test this change, I used a MiniMaxwell which allows me to introduce
jitter, delay, and packet re-ordering in the video stream. I ran for
over 12 hours with no effect on the video and no increase in buffer
size. I'm reattaching the final patch here. I've made 2 basic changes
to the buffering strategy:

1) I now check to see if I and done buffering on both the
ES_OUT_SET_PCR and ES_OUT_SET_GROUP_PCR calls. This causes the buffered
amount to be checked more frequently and prevents over buffering which
I have seen in some instances
2) When ignoring the jitter, I do not flush the buffer and rebuffer,
since I am not increasing the buffer size anyway. Instead I just reset
the PCR and continue on.

Signed-off-by: Rémi Denis-Courmont <remi at remlab.net>

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=c3bd897e586d906d631a1cdc51232f76ff1ca1fe
---

 src/input/es_out.c |   28 ++++++++++++++++------------
 1 file changed, 16 insertions(+), 12 deletions(-)

diff --git a/src/input/es_out.c b/src/input/es_out.c
index b9069a4..d10ab6b 100644
--- a/src/input/es_out.c
+++ b/src/input/es_out.c
@@ -2309,14 +2309,14 @@ static int EsOutControlLocked( es_out_t *out, int i_query, va_list args )
                             EsOutIsExtraBufferingAllowed( out ),
                             i_pcr, mdate() );
 
-        if( p_pgrm == p_sys->p_pgrm )
+        if( p_sys->b_buffering )
         {
-            if( p_sys->b_buffering )
-            {
-                /* Check buffering state on master clock update */
-                EsOutDecodersStopBuffering( out, false );
-            }
-            else if( b_late && ( !p_sys->p_input->p->p_sout ||
+            /* Check buffering state on master clock update */
+            EsOutDecodersStopBuffering( out, false );
+        }
+        else if( p_pgrm == p_sys->p_pgrm )
+        {
+            if( b_late && ( !p_sys->p_input->p->p_sout ||
                                  !p_sys->p_input->p->b_out_pace_control ) )
             {
                 const mtime_t i_pts_delay_base = p_sys->i_pts_delay - p_sys->i_pts_jitter;
@@ -2330,19 +2330,23 @@ static int EsOutControlLocked( es_out_t *out, int i_query, va_list args )
                              "ES_OUT_SET_(GROUP_)PCR  is called too late (jitter of %d ms ignored)",
                              (int)(i_pts_delay - i_pts_delay_base) / 1000 );
                     i_pts_delay = p_sys->i_pts_delay;
+
+                    /* reset clock */
+                    for( int i = 0; i < p_sys->i_pgrm; i++ )
+                      input_clock_Reset( p_sys->pgrm[i]->p_clock );
                 }
                 else
                 {
                     msg_Err( p_sys->p_input,
                              "ES_OUT_SET_(GROUP_)PCR  is called too late (pts_delay increased to %d ms)",
                              (int)(i_pts_delay/1000) );
-                }
 
-                /* Force a rebufferization when we are too late */
+                    /* Force a rebufferization when we are too late */
 
-                /* It is not really good, as we throw away already buffered data
-                 * TODO have a mean to correctly reenter bufferization */
-                es_out_Control( out, ES_OUT_RESET_PCR );
+                    /* It is not really good, as we throw away already buffered data
+                     * TODO have a mean to correctly reenter bufferization */
+                    es_out_Control( out, ES_OUT_RESET_PCR );
+                }
 
                 es_out_SetJitter( out, i_pts_delay_base, i_pts_delay - i_pts_delay_base, p_sys->i_cr_average );
             }



More information about the vlc-commits mailing list