vlc | branch: master | Thomas Guillem <[email protected]> | 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) { _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
