[vlc-devel] commit: XCB: use pf_render for image conversion (instead of pf_display) ( Rémi Denis-Courmont )

git version control git at videolan.org
Wed Mar 4 20:47:48 CET 2009


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Wed Mar  4 21:46:52 2009 +0200| [21e8f62d67eaa2e315d2dc6f10860782400e8bc1] | committer: Rémi Denis-Courmont 

XCB: use pf_render for image conversion (instead of pf_display)

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

 modules/video_output/xcb/xcb.c |   46 +++++++++++++++++++++++----------------
 1 files changed, 27 insertions(+), 19 deletions(-)

diff --git a/modules/video_output/xcb/xcb.c b/modules/video_output/xcb/xcb.c
index 53e463f..8d96b1b 100644
--- a/modules/video_output/xcb/xcb.c
+++ b/modules/video_output/xcb/xcb.c
@@ -88,6 +88,7 @@ struct vout_sys_t
 
 static int Init (vout_thread_t *);
 static void Deinit (vout_thread_t *);
+static void Render (vout_thread_t *, picture_t *);
 static void Display (vout_thread_t *, picture_t *);
 static int Manage (vout_thread_t *);
 
@@ -234,6 +235,7 @@ static int Open (vlc_object_t *obj)
 
     vout->pf_init = Init;
     vout->pf_end = Deinit;
+    vout->pf_render = Render;
     vout->pf_display = Display;
     vout->pf_manage = Manage;
     return VLC_SUCCESS;
@@ -261,9 +263,10 @@ static void Close (vlc_object_t *obj)
 
 struct picture_sys_t
 {
-    xcb_connection_t *conn;
-    xcb_image_t *image;
-    xcb_shm_seg_t segment;
+    xcb_connection_t *conn; /* Shared connection to X server */
+    xcb_image_t *image;  /* Picture buffer */
+    xcb_image_t *native; /* Rendered picture buffer (in X server format) */
+    xcb_shm_seg_t segment; /* Shared memory segment X ID */
 };
 
 static void PictureRelease (picture_t *pic);
@@ -345,14 +348,11 @@ static int PictureInit (vout_thread_t *vout, picture_t *pic)
         goto error;
     }
     if (shm != SHM_ERR && xcb_image_native (p_sys->conn, img, 0) == NULL)
-    {
-        msg_Err (vout, "incompatible X server image format");
-        xcb_image_destroy (img);
-        goto error;
-    }
+        msg_Warn (vout, "incompatible X server image format");
 
     priv->conn = p_sys->conn;
     priv->image = img;
+    priv->native = NULL;
     pic->p_sys = priv;
     pic->p->p_pixels = img->data;
     pic->pf_release = (shm != SHM_ERR) ? PictureShmRelease
@@ -376,6 +376,8 @@ static void PictureRelease (picture_t *pic)
 {
     struct picture_sys_t *p_sys = pic->p_sys;
 
+    if ((p_sys->native != NULL) && (p_sys->native != p_sys->image))
+        xcb_image_destroy (p_sys->native);
     xcb_image_destroy (p_sys->image);
     free (p_sys);
 }
@@ -507,15 +509,29 @@ static void Deinit (vout_thread_t *vout)
 }
 
 /**
+ * Prepares an image ahead of display.
+ */
+static void Render (vout_thread_t *vout, picture_t *pic)
+{
+    vout_sys_t *p_sys = vout->p_sys;
+    picture_sys_t *priv = pic->p_sys;
+
+    if ((priv->native != NULL) && (priv->native != priv->image))
+        xcb_image_destroy (priv->native);
+    priv->native = xcb_image_native (p_sys->conn, priv->image, 1);
+}
+
+
+/**
  * Sends an image to the X server.
  */
 static void Display (vout_thread_t *vout, picture_t *pic)
 {
     vout_sys_t *p_sys = vout->p_sys;
     picture_sys_t *priv = pic->p_sys;
-    xcb_image_t *img = priv->image;
+    xcb_image_t *img = priv->image, *native = priv->native;
 
-    if (img->base == NULL)
+    if ((native == img) && (img->base == NULL))
     {
         xcb_shm_segment_info_t info = {
             .shmseg = priv->segment,
@@ -527,16 +543,8 @@ static void Display (vout_thread_t *vout, picture_t *pic)
                         0, 0, 0, 0, img->width, img->height, 0);
     }
     else
-    {
-        xcb_image_t *native = xcb_image_native (p_sys->conn, img, 1);
-
-        if (native == NULL)
-            return;
-
+    if (native != NULL)
         xcb_image_put (p_sys->conn, p_sys->window, p_sys->gc, native, 0, 0, 0);
-        if (native != img)
-            xcb_image_destroy (native);
-    }
     xcb_flush (p_sys->conn);
 }
 




More information about the vlc-devel mailing list