changeset 31246:cc6ee3017097

Limit buffered PTS only when we actually got a frame from the decoder. This avoids some issues with H.264 PAFF due to dropping PTS values too early because only every second packet actually produced output. Just keeping up to one additional pts value would have avoided this particular issue as well, but this is more generic.
author reimar
date Thu, 03 Jun 2010 20:59:40 +0000
parents a3adde0a5b83
children 5c77adfd862e
files libmpcodecs/dec_video.c
diffstat 1 files changed, 17 insertions(+), 14 deletions(-) [+]
line wrap: on
line diff
--- a/libmpcodecs/dec_video.c	Thu Jun 03 20:39:41 2010 +0000
+++ b/libmpcodecs/dec_video.c	Thu Jun 03 20:59:40 2010 +0000
@@ -394,20 +394,6 @@
     double tt;
 
     if (correct_pts && pts != MP_NOPTS_VALUE) {
-        int delay = get_current_video_decoder_lag(sh_video);
-        if (delay >= 0) {
-            if (delay > sh_video->num_buffered_pts)
-#if 0
-                // this is disabled because vd_ffmpeg reports the same lag
-                // after seek even when there are no buffered frames,
-                // leading to incorrect error messages
-                mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Not enough buffered pts\n");
-#else
-                ;
-#endif
-            else
-                sh_video->num_buffered_pts = delay;
-        }
         if (sh_video->num_buffered_pts ==
             sizeof(sh_video->buffered_pts) / sizeof(double))
             mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Too many buffered pts\n");
@@ -451,6 +437,7 @@
         mpi->fields &= ~MP_IMGFIELD_TOP_FIRST;
 
     if (correct_pts) {
+        int delay = get_current_video_decoder_lag(sh_video);
         if (sh_video->num_buffered_pts) {
             sh_video->num_buffered_pts--;
             sh_video->pts = sh_video->buffered_pts[sh_video->num_buffered_pts];
@@ -459,6 +446,22 @@
                    "No pts value from demuxer to " "use for frame!\n");
             sh_video->pts = MP_NOPTS_VALUE;
         }
+        if (delay >= 0) {
+            // limit buffered pts only afterwards so we do not get confused
+            // by packets that produce no output (e.g. a single field of a
+            // H.264 frame).
+            if (delay > sh_video->num_buffered_pts)
+#if 0
+                // this is disabled because vd_ffmpeg reports the same lag
+                // after seek even when there are no buffered frames,
+                // leading to incorrect error messages
+                mp_msg(MSGT_DECVIDEO, MSGL_ERR, "Not enough buffered pts\n");
+#else
+                ;
+#endif
+            else
+                sh_video->num_buffered_pts = delay;
+        }
     }
     return mpi;
 }