[vlc-devel] [PATCH 1/2] vout: android: only use a local pool for opaque surfaces
Thomas Guillem
thomas at gllm.fr
Wed Jul 31 13:26:36 CEST 2019
OK for the set
On Wed, Jul 31, 2019, at 12:21, Steve Lhomme wrote:
> For non-opaque we copy in a local surface during prepare. It was already using
> a single surface exposed as a pool. We do not use a pool in this case anymore.
>
> We can remove is_slow as the core allocates its own "fast" pool in this case.
> ---
> modules/video_output/android/display.c | 50 +++++++++++++++++---------
> 1 file changed, 34 insertions(+), 16 deletions(-)
>
> diff --git a/modules/video_output/android/display.c
> b/modules/video_output/android/display.c
> index edf335a8c7..195cdb8e80 100644
> --- a/modules/video_output/android/display.c
> +++ b/modules/video_output/android/display.c
> @@ -121,6 +121,8 @@ struct vout_display_sys_t
> android_window *p_window;
> android_window *p_sub_window;
>
> + picture_t *p_prepared_pic; // local surface
> +
> bool b_displayed;
> bool b_sub_invalid;
> filter_t *p_spu_blend;
> @@ -600,12 +602,28 @@ static int OpenCommon(vout_display_t *vd, const
> vout_display_cfg_t *cfg,
>
> *fmtp = fmt;
> /* Setup vout_display */
> - vd->pool = Pool;
> + if (sys->p_window->b_opaque)
> + vd->pool = Pool;
> + else
> + {
> + if (AndroidWindow_Setup(sys, sys->p_window, 1) != 0)
> + goto error;
> +
> + sys->p_prepared_pic = PictureAlloc(sys, &sys->p_window->fmt, false);
> + if (sys->p_prepared_pic == NULL)
> + {
> + msg_Err(vd, "cannot allocate prepare surface");
> + goto error;
> + }
> + msg_Dbg(vd, "PictureAlloc: got a frame");
> +
> + UpdateVideoSize(sys, &sys->p_window->fmt);
> + }
> +
> vd->prepare = Prepare;
> vd->display = Display;
> vd->control = Control;
> vd->close = Close;
> - vd->info.is_slow = !sys->p_window->b_opaque;
>
> return VLC_SUCCESS;
>
> @@ -711,6 +729,8 @@ static void Close(vout_display_t *vd)
> AndroidWindow_Destroy(vd, sys->p_window);
> }
>
> + if (sys->p_prepared_pic)
> + picture_Release(sys->p_prepared_pic);
> if (sys->p_sub_pic)
> picture_Release(sys->p_sub_pic);
> if (sys->p_spu_blend)
> @@ -779,8 +799,7 @@ static picture_pool_t *PoolAlloc(vout_display_t
> *vd, unsigned requested_count)
>
> for (i = 0; i < requested_count; i++)
> {
> - picture_t *p_pic = PictureAlloc(sys, &sys->p_window->fmt,
> - sys->p_window->b_opaque);
> + picture_t *p_pic = PictureAlloc(sys, &sys->p_window->fmt, true);
> if (!p_pic)
> goto error;
>
> @@ -791,16 +810,8 @@ static picture_pool_t *PoolAlloc(vout_display_t
> *vd, unsigned requested_count)
> memset(&pool_cfg, 0, sizeof(pool_cfg));
> pool_cfg.picture_count = requested_count;
> pool_cfg.picture = pp_pics;
> - if (sys->p_window->b_opaque)
> - {
> - pool_cfg.lock = PoolLockOpaquePicture;
> - pool_cfg.unlock = PoolUnlockOpaquePicture;
> - }
> - else
> - {
> - pool_cfg.lock = PoolLockPicture;
> - pool_cfg.unlock = PoolUnlockPicture;
> - }
> + pool_cfg.lock = PoolLockOpaquePicture;
> + pool_cfg.unlock = PoolUnlockOpaquePicture;
> pool = picture_pool_NewExtended(&pool_cfg);
>
> error:
> @@ -950,6 +961,15 @@ static void Prepare(vout_display_t *vd, picture_t *picture,
> {
> vout_display_sys_t *sys = vd->sys;
>
> + if (!sys->p_window->b_opaque)
> + {
> + if (PoolLockPicture(sys->p_prepared_pic) == 0)
> + {
> + picture_Copy(sys->p_prepared_pic, picture);
> + PoolUnlockPicture(sys->p_prepared_pic);
> + }
> + }
> +
> if (subpicture && sys->p_sub_window) {
> if (sys->b_sub_invalid) {
> sys->b_sub_invalid = false;
> @@ -1009,8 +1029,6 @@ static void Display(vout_display_t *vd, picture_t
> *picture)
>
> if (sys->p_window->b_opaque)
> AndroidOpaquePicture_Release(picture->p_sys, true);
> - else
> - AndroidWindow_UnlockPicture(sys, sys->p_window, picture);
>
> if (sys->p_sub_pic)
> AndroidWindow_UnlockPicture(sys, sys->p_sub_window, sys->p_sub_pic);
> --
> 2.17.1
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list