]> git.sesse.net Git - vlc/commitdiff
Premier service pack de la POLUX_SYNCHRO:
authorJean-Marc Dressler <polux@videolan.org>
Thu, 17 Feb 2000 16:36:25 +0000 (16:36 +0000)
committerJean-Marc Dressler <polux@videolan.org>
Thu, 17 Feb 2000 16:36:25 +0000 (16:36 +0000)
 o 0 bug fixe
 o several bugs added
 o synchro is now slower than ever

Si par chance cela marchait chez vous pr�venez moi vite.

Mise � 0 du flag DEBUG pour tester la synchro dans les meilleures conditions
possibles, attention les acc�s disque du mini-server ainsi que les nombreuses
irr�gularit�s du flux peuvent perturber le client de fa�on non n�gligeable.

include/config.h
include/vpar_synchro.h
src/video_output/video_output.c
src/video_parser/video_parser.c
src/video_parser/vpar_synchro.c

index 75b5c8a65c1404f9b5dbefadfa6c9d5920fece21..c756c5835c761d8d95324054eb0d5836b498c808 100644 (file)
  * Video parser configuration
  *****************************************************************************/
 
-#define VPAR_IDLE_SLEEP                 100000
+#define VPAR_IDLE_SLEEP                 10000
 
 /* Time to sleep when waiting for a buffer (from vout or the video fifo).
  * It should be approximately the time needed to perform a complete picture
index bde125bfc70e2c43884d0ec9cc6ddecc8e2d65b9..27e08aa27425820027e50f360fecc22dbe57e6de 100644 (file)
@@ -97,6 +97,8 @@ typedef struct video_synchro_s
 
 #ifdef POLUX_SYNCHRO
 
+#define SYNC_AVERAGE_COUNT 10
+
 typedef struct video_synchro_s
 {
     /* Date Section */
@@ -109,6 +111,7 @@ typedef struct video_synchro_s
     /* Frame Trashing Section */
     
     int         i_b_nb, i_p_nb;   /* number of decoded P and B between two I */
+    float       r_b_average, r_p_average;
     int         i_b_count, i_p_count, i_i_count;
     int         i_b_trasher;                /* used for brensenham algorithm */
     
index 0d5026926bc40d1670eba318570eb21b90c3ad0e..3dc7699fd15e2d7e98c1b0f59fc7097dd1a533aa 100644 (file)
@@ -942,6 +942,10 @@ static int InitThread( vout_thread_t *p_vout )
  *****************************************************************************/
 static void RunThread( vout_thread_t *p_vout)
 {
+    //?? welcome to gore land
+    static int i_trash_count = 0;
+    static mtime_t last_display_date = 0;
+    
     int             i_index;                                /* index in heap */
     mtime_t         current_date;                            /* current date */
     mtime_t         display_date;                            /* display date */
@@ -993,8 +997,12 @@ static void RunThread( vout_thread_t *p_vout)
             /* Computes FPS rate */
             p_vout->p_fps_sample[ p_vout->c_fps_samples++ % VOUT_FPS_SAMPLES ] = display_date;
 #endif
-#if 0
-            if( display_date < current_date )
+// ???
+i_trash_count++;
+fprintf( stderr, "gap : %Ld\n", display_date-last_display_date );
+last_display_date = display_date;
+#if 1
+            if( display_date < current_date && i_trash_count > 4 )
             {
                 /* Picture is late: it will be destroyed and the thread will sleep and
                  * go to next picture */
@@ -1012,12 +1020,13 @@ static void RunThread( vout_thread_t *p_vout)
                 intf_DbgMsg( "warning: late picture %p skipped refcount=%d\n", p_pic, p_pic->i_refcount );
                 vlc_mutex_unlock( &p_vout->picture_lock );
 
-                p_pic =         NULL;
-                display_date =  0;
-
                 /* Update synchronization information as if display delay 
                  * was 0 */
-                Synchronize( p_vout, 0 );                
+                Synchronize( p_vout, display_date - current_date );
+                
+                p_pic =         NULL;
+                display_date =  0;
+                i_trash_count = 0;
             }
             else 
 #endif                
@@ -1034,9 +1043,8 @@ static void RunThread( vout_thread_t *p_vout)
                 /* Picture will be displayed, update synchronization 
                  * information */
                 Synchronize( p_vout, display_date - current_date );
-            }            
+            }
         }
-
         /*
          * Find the subpicture to display - this operation does not need lock, since
          * only READY_SUBPICTURES are handled. If no picture has been selected,
@@ -1917,64 +1925,74 @@ static void Synchronize( vout_thread_t *p_vout, s64 i_delay )
 {
     int i_synchro_inc = 0;
     //???? gore following
-    //static int i_panic_count = 0;
+    static int i_panic_count = 0;
     static int i_last_synchro_inc = 0;
     static float r_synchro_level = VOUT_SYNCHRO_LEVEL_START;
-    static int i_truc = 1;
+    static int i_truc = 10;
 
-    //?? heap size is p_vout->i_pictures
-    //?? 
     if( i_delay < 0 )
     {
-//        intf_Msg("PANIC %d\n", i_panic_count++);
+        fprintf( stderr, "PANIC %d\n", i_panic_count );
+        i_panic_count++;
     }
-/*
+    
+    i_truc *= 2;
+    
     if( p_vout->i_pictures > VOUT_SYNCHRO_HEAP_IDEAL_SIZE+1 )
     {
-        i_synchro_inc++;
-    }
-    else if( p_vout->i_pictures < VOUT_SYNCHRO_HEAP_IDEAL_SIZE )
-    {
-        i_synchro_inc--;
+        i_truc = 40;
+        i_synchro_inc += p_vout->i_pictures - VOUT_SYNCHRO_HEAP_IDEAL_SIZE - 1;
+        
     }
-*/    
-    if( i_delay < 10000 )
+    else 
     {
-        i_truc = 4;
+        if( p_vout->i_pictures < VOUT_SYNCHRO_HEAP_IDEAL_SIZE )
+        {
+            i_truc = 32;
+            //i_synchro_inc += p_vout->i_pictures - VOUT_SYNCHRO_HEAP_IDEAL_SIZE;
+        }
+
+        if( i_delay < 1000 )
+        {
+            //i_truc = 4;
+        }
     }
-    
-    if( i_delay < 20000 )
+   
+    if( i_truc > VOUT_SYNCHRO_LEVEL_MAX*2*2*2*2*2 || 
+        i_synchro_inc*i_last_synchro_inc < 0 )
     {
-        i_synchro_inc--;
-    }   
-    else if( i_delay > 50000 )
-    {
-        i_synchro_inc++;
+        i_truc = 32;
     }
     
-    if( i_synchro_inc*i_last_synchro_inc < 0 )
+    if( i_delay < 6000 )
     {
-        i_truc = 2;
+        i_truc = 16;
+        i_synchro_inc -= 2;
     }
-    else
+    else if( i_delay < 70000 )
     {
-        i_truc *= 2;
-    }
-    if( i_truc > VOUT_SYNCHRO_LEVEL_MAX || i_delay == 0 )
+        i_truc = 24+(24*i_delay)/70000;
+        if( i_truc < 16 )
+            i_truc = 16;
+        i_synchro_inc -= 1+(5*(70000-i_delay))/70000;
+    }   
+    else if( i_delay > 100000 )
     {
-        i_truc = 2;
+        r_synchro_level += 1;
+        if( i_delay > 130000 )
+            r_synchro_level += 1;
     }
-    
+      
     r_synchro_level += (float)i_synchro_inc / i_truc;
-    p_vout->i_synchro_level = (int) r_synchro_level;
+    p_vout->i_synchro_level = (int)(r_synchro_level+0.5);
     
     if( r_synchro_level > VOUT_SYNCHRO_LEVEL_MAX )
     {
         r_synchro_level = VOUT_SYNCHRO_LEVEL_MAX;
     }
 
-//    printf( "synchro level : %d, (%d, %d) (%d, %f) - %Ld\n", p_vout->i_synchro_level,
-//            i_last_synchro_inc, i_synchro_inc, i_truc, r_synchro_level, i_delay );    
+    fprintf( stderr, "synchro level : %d, heap : %d (%d, %d) (%d, %f) - %Ld\n", p_vout->i_synchro_level,
+            p_vout->i_pictures, i_last_synchro_inc, i_synchro_inc, i_truc, r_synchro_level, i_delay );    
     i_last_synchro_inc = i_synchro_inc;    
 }
 
index 898de5c8324c4984c9fd610ffd2f81beb756ac65..87f78d6bf7171b2c07874ff7ed58ddead93bc37b 100644 (file)
@@ -306,8 +306,8 @@ static int InitThread( vpar_thread_t *p_vpar )
     p_vpar->synchro.i_current_frame_date = 0;
     p_vpar->synchro.i_backward_frame_date = 0;
     
-    p_vpar->synchro.i_p_nb = 5;
-    p_vpar->synchro.i_b_nb = 6;
+    p_vpar->synchro.r_p_average = p_vpar->synchro.i_p_nb = 6;
+    p_vpar->synchro.r_b_average = p_vpar->synchro.i_b_nb = 6;
     p_vpar->synchro.i_p_count = 0;
     p_vpar->synchro.i_b_count = 0;
     p_vpar->synchro.i_i_count = 0;
index 05c6758e367ee1feaa86f5b09638a937728209c5..6f9d71b564320143cb107c3a5433bd3d15cf3d07 100644 (file)
@@ -542,7 +542,7 @@ void vpar_SynchroSetCurrentDate( vpar_thread_t * p_vpar, int i_coding_type )
         }
         else
         {
-            p_vpar->synchro.i_current_frame_date += 1000000/(1+p_vpar->sequence.r_frame_rate);
+            p_vpar->synchro.i_current_frame_date += 1000000/(p_vpar->sequence.r_frame_rate);
         }
         break;
         
@@ -550,7 +550,7 @@ void vpar_SynchroSetCurrentDate( vpar_thread_t * p_vpar, int i_coding_type )
 
         if( p_vpar->synchro.i_backward_frame_date == 0 )
         {
-            p_vpar->synchro.i_current_frame_date += 1000000/(1+p_vpar->sequence.r_frame_rate);
+            p_vpar->synchro.i_current_frame_date += 1000000/(p_vpar->sequence.r_frame_rate);
         }
         else
         {
@@ -588,15 +588,22 @@ boolean_t vpar_SynchroChoose( vpar_thread_t * p_vpar, int i_coding_type,
     switch( i_coding_type )
     {
     case I_CODING_TYPE:
-       if( p_vpar->synchro.i_i_count != 0 )
-        {
-            p_vpar->synchro.i_p_nb = p_vpar->synchro.i_p_count;
-            p_vpar->synchro.i_b_nb = p_vpar->synchro.i_b_count;
-        }
+
+//fprintf( stderr, "p : %d (%d), b : %d (%d)\n", p_vpar->synchro.i_p_count, p_vpar->synchro.i_p_nb,
+//         p_vpar->synchro.i_b_count, p_vpar->synchro.i_b_nb );
+
+        p_vpar->synchro.r_p_average =
+            (p_vpar->synchro.r_p_average*(SYNC_AVERAGE_COUNT-1)+p_vpar->synchro.i_p_count)/SYNC_AVERAGE_COUNT;
+        p_vpar->synchro.r_b_average =
+            (p_vpar->synchro.r_b_average*(SYNC_AVERAGE_COUNT-1)+p_vpar->synchro.i_b_count)/SYNC_AVERAGE_COUNT;
+        
+        p_vpar->synchro.i_p_nb = (int)(p_vpar->synchro.r_p_average+0.5);
+        p_vpar->synchro.i_b_nb = (int)(p_vpar->synchro.r_b_average+0.5);
+
         p_vpar->synchro.i_p_count = p_vpar->synchro.i_b_count = 0;
         p_vpar->synchro.i_b_trasher = p_vpar->synchro.i_b_nb / 2;
         p_vpar->synchro.i_i_count++;
-        break;
+       break;
 
     case P_CODING_TYPE:
         p_vpar->synchro.i_p_count++;