[vlc-commits] drawable: use static variable rather than LibVLC variable

Rémi Denis-Courmont git at videolan.org
Mon Apr 11 17:22:36 CEST 2011


vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Mon Apr 11 18:09:03 2011 +0300| [4f6f08dd47aa0b9d7ab4802e1aa11983246b0a02] | committer: Rémi Denis-Courmont

drawable: use static variable rather than LibVLC variable

HWND are process-wide so there is not much point in a dedicated list
per LibVLC instance.

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

 modules/video_output/drawable.c |   50 +++++++++++++++-----------------------
 1 files changed, 20 insertions(+), 30 deletions(-)

diff --git a/modules/video_output/drawable.c b/modules/video_output/drawable.c
index 6648738..bf01e9b 100644
--- a/modules/video_output/drawable.c
+++ b/modules/video_output/drawable.c
@@ -49,7 +49,10 @@ vlc_module_end ()
 
 static int Control (vout_window_t *, int, va_list);
 
+/* Keep a list of busy drawables, so we don't overlap videos if there are
+ * more than one video track in the stream. */
 static vlc_mutex_t serializer = VLC_STATIC_MUTEX;
+static void **used = NULL;
 
 /**
  * Find the drawable set by libvlc application.
@@ -61,39 +64,29 @@ static int Open (vout_window_t *wnd, const vout_window_cfg_t *cfg)
     if (val == NULL)
         return VLC_EGENERIC;
 
-    if (var_Create (wnd->p_libvlc, "hwnd-in-use", VLC_VAR_ADDRESS))
-        return VLC_ENOMEM;
-
-    /* Keep a list of busy drawables, so we don't overlap videos if there are
-     * more than one video track in the stream. */
-    void **used;
+    void **tab;
     size_t n = 0;
 
     vlc_mutex_lock (&serializer);
-    used = var_GetAddress (wnd->p_libvlc, "hwnd-in-use");
     if (used != NULL)
-    {
-        while (used[n] != NULL)
-        {
+        for (/*n = 0*/; used[n] != NULL; n++)
             if (used[n] == val)
+            {
+                msg_Warn (wnd, "HWND %p is busy", val);
+                val = NULL;
                 goto skip;
-            n++;
-        }
-    }
+            }
 
-    used = realloc (used, sizeof (*used) * (n + 2));
-    if (used != NULL)
+    tab = realloc (used, sizeof (*used) * (n + 2));
+    if (likely(tab != NULL))
     {
+        used = tab;
         used[n] = val;
         used[n + 1] = NULL;
-        var_SetAddress (wnd->p_libvlc, "hwnd-in-use", used);
     }
     else
-    {
-skip:
-        msg_Warn (wnd, "HWND %p is busy", val);
         val = NULL;
-    }
+skip:
     vlc_mutex_unlock (&serializer);
 
     if (val == NULL)
@@ -110,16 +103,15 @@ skip:
  */
 static void Close (vout_window_t *wnd)
 {
-    void **used, *val = wnd->sys;
+    void *val = wnd->sys;
     size_t n = 0;
 
     /* Remove this drawable from the list of busy ones */
     vlc_mutex_lock (&serializer);
-    used = var_GetAddress (wnd->p_libvlc, "hwnd-in-use");
-    assert (used);
+    assert (used != NULL);
     while (used[n] != val)
     {
-        assert (used[n]);
+        assert (used[n] != NULL);
         n++;
     }
     do
@@ -127,13 +119,11 @@ static void Close (vout_window_t *wnd)
     while (used[++n] != NULL);
 
     if (n == 0)
-         var_SetAddress (wnd->p_libvlc, "hwnd-in-use", NULL);
+    {
+         free (used);
+         used = NULL;
+    }
     vlc_mutex_unlock (&serializer);
-
-    if (n == 0)
-        free (used);
-    /* Variables are reference-counted... */
-    var_Destroy (wnd->p_libvlc, "hwnd-in-use");
 }
 
 



More information about the vlc-commits mailing list