vlc | branch: master | Rémi Denis-Courmont <r...@remlab.net> | Mon Sep 15 
19:16:18 2014 +0300| [6e82ebed93d6f017af4369d8712f7063421ee9ca] | committer: 
Rémi Denis-Courmont

vdpau/chroma: skip forward to current picture if forced (fixes #11410)

VDPAU introduces a delay of one field (one picture if not deinterlacing).
This is normally not an issue as the PTS is preserved. But it does not
work if there is only one picture not followed by another one.

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6e82ebed93d6f017af4369d8712f7063421ee9ca
---

 modules/hw/vdpau/chroma.c |   23 ++++++++++++++++++++++-
 1 file changed, 22 insertions(+), 1 deletion(-)

diff --git a/modules/hw/vdpau/chroma.c b/modules/hw/vdpau/chroma.c
index ed57318..a4df8e6 100644
--- a/modules/hw/vdpau/chroma.c
+++ b/modules/hw/vdpau/chroma.c
@@ -462,11 +462,32 @@ static picture_t *VideoRender(filter_t *filter, picture_t 
*src)
         picture_Release(src);
     }
     else
+    {
         sys->history[MAX_PAST + MAX_FUTURE].field = NULL;
+        sys->history[MAX_PAST + MAX_FUTURE].force = false;
+    }
 
     vlc_vdp_video_field_t *f = sys->history[MAX_PAST].field;
     if (f == NULL)
-        goto skip;
+    {   /* There is no present field, probably just starting playback. */
+        if (!sys->history[MAX_PAST + MAX_FUTURE].force)
+            goto skip;
+
+        /* If the picture is forced, ignore deinterlacing and fast forward. */
+        /* FIXME: Remove the forced hack pictures in video output core and
+         * allow the last field of a video to be rendered properly. */
+        while (sys->history[MAX_PAST].field == NULL)
+        {
+            f = sys->history[0].field;
+            if (f != NULL)
+                f->destroy(f);
+
+            memmove(sys->history, sys->history + 1,
+                    sizeof (sys->history[0]) * (MAX_PAST + MAX_FUTURE));
+            sys->history[MAX_PAST + MAX_FUTURE].field = NULL;
+        }
+        f = sys->history[MAX_PAST].field;
+    }
 
     /* Get a VLC picture for a VDPAU output surface */
     dst = filter_NewPicture(filter);

_______________________________________________
vlc-commits mailing list
vlc-commits@videolan.org
https://mailman.videolan.org/listinfo/vlc-commits

Reply via email to