[vlc-devel] [PATCH] kms: allocate the picture pool during the module init
Steve Lhomme
robux4 at ycbcr.xyz
Mon Nov 18 12:13:33 CET 2019
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;
}
--
2.17.1
More information about the vlc-devel
mailing list