ffplay: allow frame dropping if we redisplay an already displayed frame
authorMarton Balint <cus@passwd.hu>
Sat, 16 Feb 2013 13:24:34 +0000 (14:24 +0100)
committerMarton Balint <cus@passwd.hu>
Wed, 27 Feb 2013 20:34:12 +0000 (21:34 +0100)
Signed-off-by: Marton Balint <cus@passwd.hu>
ffplay.c

index 0d4fde6..b4394e3 100644 (file)
--- a/ffplay.c
+++ b/ffplay.c
@@ -1307,8 +1307,9 @@ static void video_refresh(void *opaque, double *remaining_time)
     }
 
     if (is->video_st) {
+        int redisplay = 0;
         if (is->force_refresh)
-            pictq_prev_picture(is);
+            redisplay = pictq_prev_picture(is);
 retry:
         if (is->pictq_size == 0) {
             SDL_LockMutex(is->pictq_mutex);
@@ -1325,6 +1326,7 @@ retry:
 
             if (vp->serial != is->videoq.serial) {
                 pictq_next_picture(is);
+                redisplay = 0;
                 goto retry;
             }
 
@@ -1355,9 +1357,11 @@ retry:
             if (is->pictq_size > 1) {
                 VideoPicture *nextvp = &is->pictq[(is->pictq_rindex + 1) % VIDEO_PICTURE_QUEUE_SIZE];
                 duration = nextvp->pts - vp->pts;
-                if(!is->step && (framedrop>0 || (framedrop && get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER)) && time > is->frame_timer + duration){
-                    is->frame_drops_late++;
+                if(!is->step && (redisplay || framedrop>0 || (framedrop && get_master_sync_type(is) != AV_SYNC_VIDEO_MASTER)) && time > is->frame_timer + duration){
+                    if (!redisplay)
+                        is->frame_drops_late++;
                     pictq_next_picture(is);
+                    redisplay = 0;
                     goto retry;
                 }
             }