[vlc-commits] Wayland: fix attaching and detaching protocol-side buffer objects

Rémi Denis-Courmont git at videolan.org
Mon Nov 3 19:15:59 CET 2014


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Mon Nov  3 19:58:51 2014 +0200| [6672975cf04c162492507a2483180eddd45534dc] | committer: Rémi Denis-Courmont

Wayland: fix attaching and detaching protocol-side buffer objects

> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6672975cf04c162492507a2483180eddd45534dc
---

 modules/video_output/wayland/shm.c |   22 +++++++++++++++++++---
 1 file changed, 19 insertions(+), 3 deletions(-)

diff --git a/modules/video_output/wayland/shm.c b/modules/video_output/wayland/shm.c
index 92fa3f8..39719e1 100644
--- a/modules/video_output/wayland/shm.c
+++ b/modules/video_output/wayland/shm.c
@@ -61,12 +61,10 @@ struct vout_display_sys_t
 
 static void PictureDestroy(picture_t *pic)
 {
-    struct wl_buffer *buf = (struct wl_buffer *)pic->p_sys;
     const long pagemask = sysconf(_SC_PAGE_SIZE) - 1;
     size_t picsize = pic->p[0].i_pitch * pic->p[0].i_lines;
 
     munmap(pic->p[0].p_pixels, (picsize + pagemask) & ~pagemask);
-    wl_buffer_destroy(buf); /* XXX: what if wl_display is already gone? */
     free(pic);
 }
 
@@ -83,6 +81,22 @@ static const struct wl_buffer_listener buffer_cbs =
     buffer_release_cb,
 };
 
+static void PictureAttach(void *data, picture_t *pic)
+{
+    struct wl_buffer *buf = (struct wl_buffer *)pic->p_sys;
+
+    wl_buffer_add_listener(buf, &buffer_cbs, pic);
+    (void) data;
+}
+
+static void PictureDetach(void *data, picture_t *pic)
+{
+    struct wl_buffer *buf = (struct wl_buffer *)pic->p_sys;
+
+    wl_buffer_destroy(buf);
+    (void) data;
+}
+
 static picture_pool_t *Pool(vout_display_t *vd, unsigned req)
 {
     vout_display_sys_t *sys = vd->sys;
@@ -175,7 +189,6 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned req)
             break;
         }
 
-        wl_buffer_add_listener(buf, &buffer_cbs, pic);
         pics[count++] = pic;
     }
 
@@ -194,6 +207,8 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned req)
             picture_Release(pics[--count]);
         return NULL;
     }
+
+    picture_pool_Enum(sys->pool, PictureAttach, NULL);
     return sys->pool;
 }
 
@@ -234,6 +249,7 @@ static void ResetPictures(vout_display_t *vd)
     if (sys->pool == NULL)
         return;
 
+    picture_pool_Enum(sys->pool, PictureDetach, NULL);
     picture_pool_Release(sys->pool);
     sys->pool = NULL;
 }



More information about the vlc-commits mailing list