[vlc-commits] vout: pass system render time to prepare callback

Thomas Guillem git at videolan.org
Sat May 5 11:12:45 CEST 2018


vlc | branch: master | Thomas Guillem <thomas at gllm.fr> | Sat May  5 11:11:00 2018 +0200| [8d8c5b6bcb35b959e2b91b8bf53bca0ff84b0846] | committer: Thomas Guillem

vout: pass system render time to prepare callback

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

 include/vlc_vout_display.h              |  3 ++-
 include/vlc_vout_wrapper.h              |  7 ++++---
 modules/hw/mmal/vout.c                  |  3 ++-
 modules/hw/vdpau/display.c              |  5 +++--
 modules/video_output/android/display.c  | 10 +++++-----
 modules/video_output/caca.c             |  4 +++-
 modules/video_output/caopengllayer.m    |  7 +++++--
 modules/video_output/decklink.cpp       | 14 +++++++-------
 modules/video_output/ios.m              |  6 ++++--
 modules/video_output/macosx.m           |  8 +++++---
 modules/video_output/opengl/display.c   |  6 ++++--
 modules/video_output/vmem.c             |  6 ++++--
 modules/video_output/wayland/shm.c      |  4 +++-
 modules/video_output/win32/direct3d11.c |  6 ++++--
 modules/video_output/win32/direct3d9.c  |  6 ++++--
 modules/video_output/win32/glwin32.c    |  6 ++++--
 src/video_output/display.c              |  4 ++--
 src/video_output/video_output.c         |  5 +++--
 18 files changed, 68 insertions(+), 42 deletions(-)

diff --git a/include/vlc_vout_display.h b/include/vlc_vout_display.h
index 6c25f392fb..58fb1dca4f 100644
--- a/include/vlc_vout_display.h
+++ b/include/vlc_vout_display.h
@@ -307,7 +307,8 @@ struct vout_display_t {
      * You cannot change the pixel content of the picture_t or of the
      * subpicture_t.
      */
-    void       (*prepare)(vout_display_t *, picture_t *, subpicture_t *);
+    void       (*prepare)(vout_display_t *, picture_t *, subpicture_t *,
+                          mtime_t date);
 
     /* Display a picture and an optional subpicture (mandatory).
      *
diff --git a/include/vlc_vout_wrapper.h b/include/vlc_vout_wrapper.h
index 7c115473f8..98f9ddcfa9 100644
--- a/include/vlc_vout_wrapper.h
+++ b/include/vlc_vout_wrapper.h
@@ -41,10 +41,11 @@ static inline picture_pool_t *vout_display_Pool(vout_display_t *vd, unsigned cou
  */
 static inline void vout_display_Prepare(vout_display_t *vd,
                                         picture_t *picture,
-                                        subpicture_t *subpicture)
+                                        subpicture_t *subpicture,
+                                        mtime_t date)
 {
-    if (vd->prepare )
-        vd->prepare(vd, picture, subpicture);
+    if (vd->prepare)
+        vd->prepare(vd, picture, subpicture, date);
 }
 
 /**
diff --git a/modules/hw/mmal/vout.c b/modules/hw/mmal/vout.c
index aaa8fac5cc..ac69489b87 100644
--- a/modules/hw/mmal/vout.c
+++ b/modules/hw/mmal/vout.c
@@ -545,8 +545,9 @@ out:
 }
 
 static void vd_prepare(vout_display_t *vd, picture_t *picture,
-                subpicture_t *subpicture)
+                       subpicture_t *subpicture, mtime_t date)
 {
+    VLC_UNUSED(date);
     vout_display_sys_t *sys = vd->sys;
     picture_sys_t *pic_sys = picture->p_sys;
 
diff --git a/modules/hw/vdpau/display.c b/modules/hw/vdpau/display.c
index 87b1378c6e..7a463a1a9e 100644
--- a/modules/hw/vdpau/display.c
+++ b/modules/hw/vdpau/display.c
@@ -240,7 +240,8 @@ out:/* Destroy GPU surface */
     vdp_bitmap_surface_destroy(sys->vdp, surface);
 }
 
-static void Queue(vout_display_t *vd, picture_t *pic, subpicture_t *subpic)
+static void Queue(vout_display_t *vd, picture_t *pic, subpicture_t *subpic,
+                  mtime_t date)
 {
     vout_display_sys_t *sys = vd->sys;
     picture_sys_t *p_sys = pic->p_sys;
@@ -273,7 +274,7 @@ static void Queue(vout_display_t *vd, picture_t *pic, subpicture_t *subpic)
         return;
     }
 
-    mtime_t delay = pic->date - now;
+    mtime_t delay = date - now;
     if (delay < 0)
         delay = 0; /* core bug: date is not updated during pause */
     if (unlikely(delay > CLOCK_FREQ))
diff --git a/modules/video_output/android/display.c b/modules/video_output/android/display.c
index e1c969f3a1..e779f9e939 100644
--- a/modules/video_output/android/display.c
+++ b/modules/video_output/android/display.c
@@ -82,7 +82,7 @@ static const vlc_fourcc_t subpicture_chromas[] =
 };
 
 static picture_pool_t   *Pool  (vout_display_t *, unsigned);
-static void             Prepare(vout_display_t *, picture_t *, subpicture_t *);
+static void             Prepare(vout_display_t *, picture_t *, subpicture_t *, mtime_t);
 static void             Display(vout_display_t *, picture_t *, subpicture_t *);
 static int              Control(vout_display_t *, int, va_list);
 
@@ -944,7 +944,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned requested_count)
 }
 
 static void Prepare(vout_display_t *vd, picture_t *picture,
-                    subpicture_t *subpicture)
+                    subpicture_t *subpicture, mtime_t date)
 {
     vout_display_sys_t *sys = vd->sys;
     VLC_UNUSED(picture);
@@ -992,10 +992,10 @@ static void Prepare(vout_display_t *vd, picture_t *picture,
      && AndroidOpaquePicture_CanReleaseAtTime(picture->p_sys))
     {
         mtime_t now = mdate();
-        if (picture->date > now)
+        if (date > now)
         {
-            if (picture->date - now <= 1*CLOCK_FREQ)
-                AndroidOpaquePicture_ReleaseAtTime(picture->p_sys, picture->date);
+            if (date - now <= 1*CLOCK_FREQ)
+                AndroidOpaquePicture_ReleaseAtTime(picture->p_sys, date);
             else /* The picture will be displayed from the Display callback */
                 msg_Warn(vd, "picture way too early to release at time");
         }
diff --git a/modules/video_output/caca.c b/modules/video_output/caca.c
index ffea9625cc..1e10e3560b 100644
--- a/modules/video_output/caca.c
+++ b/modules/video_output/caca.c
@@ -146,8 +146,10 @@ static void Refresh(vout_display_t *vd)
 
 /**
  * Prepare a picture for display */
-static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
+static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture,
+                    mtime_t date)
 {
+    VLC_UNUSED(date);
     vout_display_sys_t *sys = vd->sys;
 
     if (!sys->dither) {
diff --git a/modules/video_output/caopengllayer.m b/modules/video_output/caopengllayer.m
index a8cffadb61..003fd99348 100644
--- a/modules/video_output/caopengllayer.m
+++ b/modules/video_output/caopengllayer.m
@@ -60,7 +60,8 @@ vlc_module_begin()
 vlc_module_end()
 
 static picture_pool_t *Pool (vout_display_t *vd, unsigned requested_count);
-static void PictureRender   (vout_display_t *vd, picture_t *pic, subpicture_t *subpicture);
+static void PictureRender   (vout_display_t *vd, picture_t *pic, subpicture_t *subpicture,
+                             mtime_t date);
 static void PictureDisplay  (vout_display_t *vd, picture_t *pic, subpicture_t *subpicture);
 static int Control          (vout_display_t *vd, int query, va_list ap);
 
@@ -281,8 +282,10 @@ static picture_pool_t *Pool (vout_display_t *vd, unsigned count)
     return sys->pool;
 }
 
-static void PictureRender (vout_display_t *vd, picture_t *pic, subpicture_t *subpicture)
+static void PictureRender (vout_display_t *vd, picture_t *pic, subpicture_t *subpicture,
+                           mtime_t date)
 {
+    VLC_UNUSED(date);
     vout_display_sys_t *sys = vd->sys;
 
     if (pic == NULL) {
diff --git a/modules/video_output/decklink.cpp b/modules/video_output/decklink.cpp
index 5f52446347..4c27d9e275 100644
--- a/modules/video_output/decklink.cpp
+++ b/modules/video_output/decklink.cpp
@@ -891,7 +891,8 @@ static void send_AFD(uint8_t afdcode, uint8_t ar, uint8_t *buf)
     }
 }
 
-static void PrepareVideo(vout_display_t *vd, picture_t *picture, subpicture_t *)
+static void PrepareVideo(vout_display_t *vd, picture_t *picture, subpicture_t *,
+                         mtime_t date)
 {
     decklink_sys_t *sys = (decklink_sys_t *) vd->sys;
     mtime_t now = mdate();
@@ -899,7 +900,7 @@ static void PrepareVideo(vout_display_t *vd, picture_t *picture, subpicture_t *)
     if (!picture)
         return;
 
-    if (now - picture->date > sys->video.nosignal_delay * CLOCK_FREQ) {
+    if (now - date > sys->video.nosignal_delay * CLOCK_FREQ) {
         msg_Dbg(vd, "no signal");
         if (sys->video.pic_nosignal) {
             picture = sys->video.pic_nosignal;
@@ -922,7 +923,7 @@ static void PrepareVideo(vout_display_t *vd, picture_t *picture, subpicture_t *)
                 }
             }
         }
-        picture->date = now;
+        date = now;
     }
 
     HRESULT result;
@@ -985,13 +986,12 @@ static void PrepareVideo(vout_display_t *vd, picture_t *picture, subpicture_t *)
     // compute frame duration in CLOCK_FREQ units
     length = (sys->frameduration * CLOCK_FREQ) / sys->timescale;
 
-    picture->date -= sys->offset;
+    date -= sys->offset;
     result = sys->p_output->ScheduleVideoFrame(pDLVideoFrame,
-        picture->date, length, CLOCK_FREQ);
+        date, length, CLOCK_FREQ);
 
     if (result != S_OK) {
-        msg_Err(vd, "Dropped Video frame %" PRId64 ": 0x%x",
-            picture->date, result);
+        msg_Err(vd, "Dropped Video frame %" PRId64 ": 0x%x", date, result);
         goto end;
     }
 
diff --git a/modules/video_output/ios.m b/modules/video_output/ios.m
index 31fd367bfe..36075488b7 100644
--- a/modules/video_output/ios.m
+++ b/modules/video_output/ios.m
@@ -55,7 +55,7 @@ static int Open(vlc_object_t *);
 static void Close(vlc_object_t *);
 
 static picture_pool_t* PicturePool(vout_display_t *, unsigned);
-static void PictureRender(vout_display_t *, picture_t *, subpicture_t *);
+static void PictureRender(vout_display_t *, picture_t *, subpicture_t *, mtime_t);
 static void PictureDisplay(vout_display_t *, picture_t *, subpicture_t *);
 static int Control(vout_display_t*, int, va_list);
 
@@ -314,8 +314,10 @@ static void PictureDisplay(vout_display_t *vd, picture_t *pic, subpicture_t *sub
         subpicture_Delete(subpicture);
 }
 
-static void PictureRender(vout_display_t *vd, picture_t *pic, subpicture_t *subpicture)
+static void PictureRender(vout_display_t *vd, picture_t *pic, subpicture_t *subpicture,
+                          mtime_t date)
 {
+    VLC_UNUSED(date);
     vout_display_sys_t *sys = vd->sys;
     struct gl_sys *glsys = sys->gl->sys;
 
diff --git a/modules/video_output/macosx.m b/modules/video_output/macosx.m
index 290d2fd462..cfeeed97c4 100644
--- a/modules/video_output/macosx.m
+++ b/modules/video_output/macosx.m
@@ -56,7 +56,8 @@ static int Open (vlc_object_t *);
 static void Close (vlc_object_t *);
 
 static picture_pool_t *Pool (vout_display_t *vd, unsigned requested_count);
-static void PictureRender (vout_display_t *vd, picture_t *pic, subpicture_t *subpicture);
+static void PictureRender (vout_display_t *vd, picture_t *pic, subpicture_t *subpicture,
+                           mtime_t date)
 static void PictureDisplay (vout_display_t *vd, picture_t *pic, subpicture_t *subpicture);
 static int Control (vout_display_t *vd, int query, va_list ap);
 
@@ -321,9 +322,10 @@ static picture_pool_t *Pool (vout_display_t *vd, unsigned requested_count)
     return sys->pool;
 }
 
-static void PictureRender (vout_display_t *vd, picture_t *pic, subpicture_t *subpicture)
+static void PictureRender (vout_display_t *vd, picture_t *pic, subpicture_t *subpicture,
+                           mtime_t date)
 {
-
+    VLC_UNUSED(date);
     vout_display_sys_t *sys = vd->sys;
 
     if (vlc_gl_MakeCurrent(sys->gl) == VLC_SUCCESS)
diff --git a/modules/video_output/opengl/display.c b/modules/video_output/opengl/display.c
index e87311f33c..328d096d2d 100644
--- a/modules/video_output/opengl/display.c
+++ b/modules/video_output/opengl/display.c
@@ -78,7 +78,7 @@ struct vout_display_sys_t
 
 /* Display callbacks */
 static picture_pool_t *Pool (vout_display_t *, unsigned);
-static void PictureRender (vout_display_t *, picture_t *, subpicture_t *);
+static void PictureRender (vout_display_t *, picture_t *, subpicture_t *, mtime_t);
 static void PictureDisplay (vout_display_t *, picture_t *, subpicture_t *);
 static int Control (vout_display_t *, int, va_list);
 
@@ -202,8 +202,10 @@ static picture_pool_t *Pool (vout_display_t *vd, unsigned count)
     return sys->pool;
 }
 
-static void PictureRender (vout_display_t *vd, picture_t *pic, subpicture_t *subpicture)
+static void PictureRender (vout_display_t *vd, picture_t *pic, subpicture_t *subpicture,
+                           mtime_t date)
 {
+    VLC_UNUSED(date);
     vout_display_sys_t *sys = vd->sys;
 
     if (vlc_gl_MakeCurrent (sys->gl) == VLC_SUCCESS)
diff --git a/modules/video_output/vmem.c b/modules/video_output/vmem.c
index a5e6fe130d..0b0db79dd1 100644
--- a/modules/video_output/vmem.c
+++ b/modules/video_output/vmem.c
@@ -105,7 +105,7 @@ typedef unsigned (*vlc_format_cb)(void **, char *, unsigned *, unsigned *,
                                   unsigned *, unsigned *);
 
 static picture_pool_t *Pool  (vout_display_t *, unsigned);
-static void           Prepare(vout_display_t *, picture_t *, subpicture_t *);
+static void           Prepare(vout_display_t *, picture_t *, subpicture_t *, mtime_t);
 static void           Display(vout_display_t *, picture_t *, subpicture_t *);
 static int            Control(vout_display_t *, int, va_list);
 
@@ -243,8 +243,10 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
     return sys->pool;
 }
 
-static void Prepare(vout_display_t *vd, picture_t *pic, subpicture_t *subpic)
+static void Prepare(vout_display_t *vd, picture_t *pic, subpicture_t *subpic,
+                    mtime_t date)
 {
+    VLC_UNUSED(date);
     vout_display_sys_t *sys = vd->sys;
     picture_resource_t rsc = { .p_sys = NULL };
     void *planes[PICTURE_PLANE_MAX];
diff --git a/modules/video_output/wayland/shm.c b/modules/video_output/wayland/shm.c
index 78dad4b7ef..7ae202bfe1 100644
--- a/modules/video_output/wayland/shm.c
+++ b/modules/video_output/wayland/shm.c
@@ -212,8 +212,10 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned req)
     return sys->pool;
 }
 
-static void Prepare(vout_display_t *vd, picture_t *pic, subpicture_t *subpic)
+static void Prepare(vout_display_t *vd, picture_t *pic, subpicture_t *subpic,
+                    mtime_t date)
 {
+    VLC_UNUSED(date);
     vout_display_sys_t *sys = vd->sys;
     struct wl_display *display = sys->embed->display.wl;
     struct wl_surface *surface = sys->embed->handle.wl;
diff --git a/modules/video_output/win32/direct3d11.c b/modules/video_output/win32/direct3d11.c
index 90cfa918b9..1cb2c2b614 100644
--- a/modules/video_output/win32/direct3d11.c
+++ b/modules/video_output/win32/direct3d11.c
@@ -215,7 +215,7 @@ typedef struct {
 
 static picture_pool_t *Pool(vout_display_t *vd, unsigned count);
 
-static void Prepare(vout_display_t *, picture_t *, subpicture_t *subpicture);
+static void Prepare(vout_display_t *, picture_t *, subpicture_t *subpicture, mtime_t);
 static void Display(vout_display_t *, picture_t *, subpicture_t *subpicture);
 
 static HINSTANCE Direct3D11LoadShaderLibrary(void);
@@ -1149,8 +1149,10 @@ static float GetFormatLuminance(vlc_object_t *o, const video_format_t *fmt)
     }
 }
 
-static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
+static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture,
+                    mtime_t date)
 {
+    VLC_UNUSED(date);
     vout_display_sys_t *sys = vd->sys;
 
     if (sys->picQuadConfig->formatTexture == DXGI_FORMAT_UNKNOWN)
diff --git a/modules/video_output/win32/direct3d9.c b/modules/video_output/win32/direct3d9.c
index 18406428af..3d12e454f5 100644
--- a/modules/video_output/win32/direct3d9.c
+++ b/modules/video_output/win32/direct3d9.c
@@ -174,7 +174,7 @@ static int  Open(vlc_object_t *);
 static picture_pool_t *Direct3D9CreatePicturePool  (vlc_object_t *, d3d9_device_t *,
      const d3d9_format_t *, const video_format_t *, unsigned);
 
-static void           Prepare(vout_display_t *, picture_t *, subpicture_t *subpicture);
+static void           Prepare(vout_display_t *, picture_t *, subpicture_t *subpicture, mtime_t);
 static void           Display(vout_display_t *, picture_t *, subpicture_t *subpicture);
 static picture_pool_t*DisplayPool(vout_display_t *, unsigned);
 static int            Control(vout_display_t *, int, va_list);
@@ -495,8 +495,10 @@ static picture_pool_t *DisplayPool(vout_display_t *vd, unsigned count)
     return vd->sys->sys.pool;
 }
 
-static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
+static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture,
+                    mtime_t date)
 {
+    VLC_UNUSED(date);
     vout_display_sys_t *sys = vd->sys;
     picture_sys_t *p_sys = picture->p_sys;
     LPDIRECT3DSURFACE9 surface = p_sys->surface;
diff --git a/modules/video_output/win32/glwin32.c b/modules/video_output/win32/glwin32.c
index 2d3debff6b..ec45764586 100644
--- a/modules/video_output/win32/glwin32.c
+++ b/modules/video_output/win32/glwin32.c
@@ -67,7 +67,7 @@ struct vout_display_sys_t
 };
 
 static picture_pool_t *Pool  (vout_display_t *, unsigned);
-static void           Prepare(vout_display_t *, picture_t *, subpicture_t *);
+static void           Prepare(vout_display_t *, picture_t *, subpicture_t *, mtime_t);
 static void           Display(vout_display_t *, picture_t *, subpicture_t *);
 static void           Manage (vout_display_t *);
 
@@ -210,8 +210,10 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
     return sys->sys.pool;
 }
 
-static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
+static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture,
+                    mtime_t date)
 {
+    VLC_UNUSED(date);
     vout_display_sys_t *sys = vd->sys;
 
     if (vlc_gl_MakeCurrent (sys->gl) == VLC_SUCCESS)
diff --git a/src/video_output/display.c b/src/video_output/display.c
index 909cb67001..a27d721de8 100644
--- a/src/video_output/display.c
+++ b/src/video_output/display.c
@@ -1334,7 +1334,7 @@ static picture_pool_t *SplitterPool(vout_display_t *vd, unsigned count)
 }
 static void SplitterPrepare(vout_display_t *vd,
                             picture_t *picture,
-                            subpicture_t *subpicture)
+                            subpicture_t *subpicture, mtime_t date)
 {
     vout_display_sys_t *sys = vd->sys;
 
@@ -1350,7 +1350,7 @@ static void SplitterPrepare(vout_display_t *vd,
     for (int i = 0; i < sys->count; i++) {
         sys->picture[i] = vout_FilterDisplay(sys->display[i], sys->picture[i]);
         if (sys->picture[i])
-            vout_display_Prepare(sys->display[i], sys->picture[i], NULL);
+            vout_display_Prepare(sys->display[i], sys->picture[i], NULL, date);
     }
 }
 static void SplitterDisplay(vout_display_t *vd,
diff --git a/src/video_output/video_output.c b/src/video_output/video_output.c
index f032269160..760a868c68 100644
--- a/src/video_output/video_output.c
+++ b/src/video_output/video_output.c
@@ -1141,11 +1141,12 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced)
     }
 
     if (sys->display.use_dr) {
-        vout_display_Prepare(vd, todisplay, subpic);
+        vout_display_Prepare(vd, todisplay, subpic, todisplay->date);
     } else {
         if (!do_dr_spu && !do_early_spu && vout->p->spu_blend && subpic)
             picture_BlendSubpicture(todisplay, vout->p->spu_blend, subpic);
-        vout_display_Prepare(vd, todisplay, do_dr_spu ? subpic : NULL);
+        vout_display_Prepare(vd, todisplay, do_dr_spu ? subpic : NULL,
+                             todisplay->date);
 
         if (!do_dr_spu && subpic)
         {



More information about the vlc-commits mailing list