vlc | branch: master | Thomas Guillem <[email protected]> | Wed Oct 25 19:04:29 2017 +0200| [a55b0a51119264f3908ef9550aa0f8f866097d30] | committer: Thomas Guillem
android: display: render opaque buffers earlier Using releaseOutputBufferAtTime() (if available). Fixes #18912 > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=a55b0a51119264f3908ef9550aa0f8f866097d30 --- modules/video_output/android/display.c | 12 ++++++++++++ modules/video_output/android/display.h | 29 +++++++++++++++++++++++++++-- 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/modules/video_output/android/display.c b/modules/video_output/android/display.c index 1d4e774913..a5b9c39738 100644 --- a/modules/video_output/android/display.c +++ b/modules/video_output/android/display.c @@ -1141,6 +1141,18 @@ static void Prepare(vout_display_t *vd, picture_t *picture, sys->b_has_subpictures = false; } } + if (sys->p_window->b_opaque + && AndroidOpaquePicture_CanReleaseAtTime(picture->p_sys)) + { + mtime_t now = mdate(); + if (picture->date > now) + { + if (picture->date - now <= INT64_C(1000000)) + AndroidOpaquePicture_ReleaseAtTime(picture->p_sys, picture->date); + else /* The picture will be displayed from the Display callback */ + msg_Warn(vd, "picture way too early to release at time"); + } + } } static void Display(vout_display_t *vd, picture_t *picture, diff --git a/modules/video_output/android/display.h b/modules/video_output/android/display.h index 65c2ad6283..cf94be5027 100644 --- a/modules/video_output/android/display.h +++ b/modules/video_output/android/display.h @@ -49,6 +49,8 @@ struct picture_sys_t int i_index; void (*pf_release)(decoder_t *p_dec, unsigned int i_index, bool b_render); + void (*pf_release_ts)(decoder_t *p_dec, unsigned int i_index, + mtime_t i_ts); } hw; struct { vout_display_sys_t *p_vd_sys; @@ -112,12 +114,35 @@ AndroidOpaquePicture_Release(picture_sys_t *p_picsys, bool b_render) { assert(p_picsys->hw.pf_release && p_picsys->hw.p_dec); p_picsys->hw.pf_release(p_picsys->hw.p_dec, - (unsigned int) p_picsys->hw.i_index, - b_render); + (unsigned int) p_picsys->hw.i_index, + b_render); p_picsys->hw.i_index = -1; } vlc_mutex_unlock(&p_picsys->hw.lock); p_picsys->b_locked = false; } +static inline void +AndroidOpaquePicture_ReleaseAtTime(picture_sys_t *p_picsys, mtime_t i_ts) +{ + if (!p_picsys->b_locked) + return; + vlc_mutex_lock(&p_picsys->hw.lock); + if (p_picsys->hw.i_index >= 0) + { + assert(p_picsys->hw.pf_release_ts && p_picsys->hw.p_dec); + p_picsys->hw.pf_release_ts(p_picsys->hw.p_dec, + (unsigned int) p_picsys->hw.i_index, i_ts); + p_picsys->hw.i_index = -1; + } + vlc_mutex_unlock(&p_picsys->hw.lock); + p_picsys->b_locked = false; +} + +static inline bool +AndroidOpaquePicture_CanReleaseAtTime(picture_sys_t *p_picsys) +{ + return p_picsys->hw.pf_release_ts != NULL; +} + #endif _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
