* late, the thread will perform an idle loop. This time should be
* at least VOUT_IDLE_SLEEP plus the time required to render a few
* images, to avoid trashing of decoded images */
-#define VOUT_DISPLAY_DELAY ((int)(0.500*CLOCK_FREQ))
+#define VOUT_DISPLAY_DELAY ((int)(0.200*CLOCK_FREQ))
+
+/* Pictures which are VOUT_BOGUS_DELAY or more in advance probably have
+ * a bogus PTS and won't be displayed */
+#define VOUT_BOGUS_DELAY ((int)(0.800*CLOCK_FREQ))
/* Delay (in microseconds) before an idle screen is displayed */
#define VOUT_IDLE_DELAY (5*CLOCK_FREQ)
* thread, and destroy a previously oppened video output thread.
*****************************************************************************
* Copyright (C) 2000-2001 VideoLAN
- * $Id: video_output.c,v 1.175 2002/05/06 21:05:26 gbazin Exp $
+ * $Id: video_output.c,v 1.176 2002/05/17 14:17:05 lool Exp $
*
* Authors: Vincent Seguin <seguin@via.ecp.fr>
*
p_picture->i_status = DESTROYED_PICTURE;
p_vout->i_heap_size--;
}
- intf_WarnMsg( 1, "vout warning: late picture skipped (%p)",
- p_picture );
+ intf_WarnMsg( 1, "vout warning: late picture skipped (%lld)",
+ current_date - display_date );
+ vlc_mutex_unlock( &p_vout->picture_lock );
+
+ continue;
+ }
+ else if( display_date > current_date + VOUT_BOGUS_DELAY )
+ {
+ /* Picture is waaay too early: it will be destroyed */
+ vlc_mutex_lock( &p_vout->picture_lock );
+ if( p_picture->i_refcount )
+ {
+ /* Pretend we displayed the picture, but don't destroy
+ * it since the decoder might still need it. */
+ p_picture->i_status = DISPLAYED_PICTURE;
+ }
+ else
+ {
+ /* Destroy the picture without displaying it */
+ p_picture->i_status = DESTROYED_PICTURE;
+ p_vout->i_heap_size--;
+ }
+ intf_WarnMsg( 1, "vout warning: early picture skipped (%lld)",
+ display_date - current_date );
vlc_mutex_unlock( &p_vout->picture_lock );
continue;