]> git.sesse.net Git - vlc/blobdiff - src/video_output/video_output.c
Fixed :drop-late-frames= inheritance in vout.
[vlc] / src / video_output / video_output.c
index a5e7d00f5820d99b8f4cdaf1a9d01ca41503e494..9e1b73d5c6a892c4a3fdfca0942c0fd681780f50 100644 (file)
@@ -299,7 +299,6 @@ vout_thread_t * (vout_Create)( vlc_object_t *p_parent, video_format_t *p_fmt )
     p_vout->p->b_filter_change = 0;
     p_vout->p->i_par_num =
     p_vout->p->i_par_den = 1;
-    p_vout->p->is_late_dropped = var_InheritBool( p_vout, "drop-late-frames" );
     p_vout->p->b_picture_empty = false;
     p_vout->p->displayed.date = VLC_TS_INVALID;
     p_vout->p->displayed.decoded = NULL;
@@ -345,6 +344,8 @@ vout_thread_t * (vout_Create)( vlc_object_t *p_parent, video_format_t *p_fmt )
 
     spu_Attach( p_vout->p->p_spu, VLC_OBJECT(p_vout), true );
 
+    p_vout->p->is_late_dropped = var_InheritBool( p_vout, "drop-late-frames" );
+
     /* Take care of some "interface/control" related initialisations */
     vout_IntfInit( p_vout );
 
@@ -567,17 +568,21 @@ void vout_GetResetStatistic( vout_thread_t *p_vout, int *pi_displayed, int *pi_l
                              pi_displayed, pi_lost );
 }
 
-static void Flush(vout_thread_t *vout, mtime_t date, bool below)
+static void Flush(vout_thread_t *vout, mtime_t date, bool reset, bool below)
 {
     vlc_assert_locked(&vout->p->picture_lock);
     vout->p->step.timestamp = VLC_TS_INVALID;
     vout->p->step.last      = VLC_TS_INVALID;
 
     picture_t *last = vout->p->displayed.decoded;
-    if (last &&
-        (( below  && last->date <= date) ||
-          (!below && last->date >= date))) {
-        vout->p->step.is_requested = true;
+    if (last) {
+        if (reset) {
+            picture_Release(last);
+            vout->p->displayed.decoded = NULL;
+        } else if (( below  && last->date <= date) ||
+                   (!below && last->date >= date)) {
+            vout->p->step.is_requested = true;
+        }
     }
     picture_fifo_Flush( vout->p->decoder_fifo, date, below );
 }
@@ -586,31 +591,28 @@ void vout_Flush(vout_thread_t *vout, mtime_t date)
 {
     vlc_mutex_lock(&vout->p->picture_lock);
 
-    Flush(vout, date, false);
+    Flush(vout, date, false, false);
 
     vlc_cond_signal(&vout->p->picture_wait);
     vlc_mutex_unlock(&vout->p->picture_lock);
 }
 
-static void vout_Reset(vout_thread_t *vout)
+void vout_Reset(vout_thread_t *vout)
 {
-#warning "TODO reset pause in vout_Reset"
     vlc_mutex_lock(&vout->p->picture_lock);
-    Flush(vout, INT64_MAX, true);
+
+    Flush(vout, INT64_MAX, true, true);
     if (vout->p->decoder_pool)
         picture_pool_NonEmpty(vout->p->decoder_pool, true);
+    vout->p->pause.is_on = false;
+    vout->p->pause.date  = mdate();
+
     vlc_cond_signal( &vout->p->picture_wait );
     vlc_mutex_unlock(&vout->p->picture_lock);
 }
 
-void vout_FixLeaks( vout_thread_t *vout, bool b_forced )
+void vout_FixLeaks( vout_thread_t *vout )
 {
-#warning "TODO split vout_FixLeaks into vout_FixLeaks and vout_Reset"
-    if (b_forced) {
-        vout_Reset(vout);
-        return;
-    }
-
     vlc_mutex_lock(&vout->p->picture_lock);
 
     picture_t *picture = picture_fifo_Peek(vout->p->decoder_fifo);