[vlc-devel] [PATCH] kms: allocate the picture pool during the module init
Steve Lhomme
robux4 at ycbcr.xyz
Mon Nov 18 12:45:17 CET 2019
On 2019-11-18 12:18, Rémi Denis-Courmont wrote:
> Hi,
>
> It works but can you provide a rationale? Does it really get closer to
> removing the pool callback, which should presumably be the target?
No, not for now. Here it's just to avoid using a module that may fail to
work when it needs the pool, when this can be detected on open.
> Le 18 novembre 2019 13:13:33 GMT+02:00, Steve Lhomme <robux4 at ycbcr.xyz>
> a écrit :
>
> We already know the size is going to be 1
>
> Moved CustomDestroyPicture to avoid forward declaration.
> ------------------------------------------------------------------------
> modules/video_output/kms.c | 97 ++++++++++++++++++--------------------
> 1 file changed, 47 insertions(+), 50 deletions(-)
>
> diff --git a/modules/video_output/kms.c b/modules/video_output/kms.c
> index 7626254b658..a70ec213d61 100644
> --- a/modules/video_output/kms.c
> +++ b/modules/video_output/kms.c
> @@ -495,6 +495,22 @@ static bool ChromaNegotiation(vout_display_t *vd)
> return false;
> }
>
> +static void CustomDestroyPicture(picture_t *p_picture)
> +{
> + picture_sys_t *psys = (picture_sys_t*)p_picture->p_sys;
> + vout_display_sys_t *sys = (vout_display_sys_t *)psys->p_voutsys;
> + int c;
> +
> + for (c = 0; c < MAXHWBUF; c++)
> + DestroyFB(sys, c);
> +
> + drmSetClientCap(sys->drm_fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 0);
> + drmDropMaster(sys->drm_fd);
> + vlc_close(sys->drm_fd);
> + sys->drm_fd = 0;
> + free(p_picture->p_sys);
> +}
> +
>
> static int OpenDisplay(vout_display_t *vd)
> {
> @@ -573,6 +589,37 @@ static int OpenDisplay(vout_display_t *vd)
> if (!found_connector)
> goto err_out;
>
> + picture_resource_t rsc;
> + memset(&rsc, 0, sizeof(rsc));
> +
> + for (size_t i = 0; i < PICTURE_PLANE_MAX; i++) {
> + rsc.p[i].p_pixels = sys->map[0] + sys->offsets[i];
> + rsc.p[i].i_lines = sys->height;
> + rsc.p[i].i_pitch = sys->stride;
> + }
> +
> + picture_sys_t *psys = calloc(1, sizeof(*psys));
> + if (psys == NULL)
> + goto err_out;
> +
> + psys->p_voutsys = sys;
> + rsc.p_sys = psys;
> + rsc.pf_destroy = CustomDestroyPicture;
> +
> + sys->picture = picture_NewFromResource(&vd->fmt, &rsc);
> +
> + if (!sys->picture)
> + {
> + free(psys);
> + goto err_out;
> + }
> +
> + sys->pool = picture_pool_New(1, &sys->picture);
> + if (!sys->pool) {
> + picture_Release(sys->picture);
> + goto error;
> + }
> +
> return VLC_SUCCESS;
> err_out:
> drmDropMaster(sys->drm_fd);
> @@ -598,60 +645,10 @@ static int Control(vout_display_t *vd, int query, va_list args)
> }
>
>
> -static void CustomDestroyPicture(picture_t *p_picture)
> -{
> - picture_sys_t *psys = (picture_sys_t*)p_picture->p_sys;
> - vout_display_sys_t *sys = (vout_display_sys_t *)psys->p_voutsys;
> - int c;
> -
> - for (c = 0; c < MAXHWBUF; c++)
> - DestroyFB(sys, c);
> -
> - drmSetClientCap(sys->drm_fd, DRM_CLIENT_CAP_UNIVERSAL_PLANES, 0);
> - drmDropMaster(sys->drm_fd);
> - vlc_close(sys->drm_fd);
> - sys->drm_fd = 0;
> - free(p_picture->p_sys);
> -}
> -
> -
> static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
> {
> VLC_UNUSED(count);
> vout_display_sys_t *sys = vd->sys;
> - picture_sys_t *psys;
> - picture_resource_t rsc;
> - int i;
> -
> - if (!sys->pool && !sys->picture) {
> - memset(&rsc, 0, sizeof(rsc));
> -
> - for (i = 0; i < PICTURE_PLANE_MAX; i++) {
> - rsc.p[i].p_pixels = sys->map[0]+sys->offsets[i];
> - rsc.p[i].i_lines = sys->height;
> - rsc.p[i].i_pitch = sys->stride;
> - }
> -
> - psys = calloc(1, sizeof(*psys));
> - if (psys == NULL)
> - return NULL;
> -
> - psys->p_voutsys = sys;
> - rsc.p_sys = psys;
> - rsc.pf_destroy = CustomDestroyPicture;
> -
> - sys->picture = picture_NewFromResource(&vd->fmt, &rsc);
> -
> - if (!sys->picture) {
> - free((void*)psys);
> - return NULL;
> - }
> -
> - sys->pool = picture_pool_New(1, &sys->picture);
> - if (!sys->pool)
> - picture_Release(sys->picture);
> - }
> -
> return sys->pool;
> }
>
>
>
> --
> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser
> ma brièveté.
>
> _______________________________________________
> 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