[vlc-devel] [PATCH 03/11] vout: drawable: implement OS/2 specific version of HWND drawable

KO Myung-Hun komh78 at gmail.com
Wed Jan 20 09:49:25 UTC 2021


This is from commit 72c10ed11fde80.
---
 modules/video_output/Makefile.am    |   3 +-
 modules/video_output/drawable_os2.c | 143 ++++++++++++++++++++++++++++
 2 files changed, 145 insertions(+), 1 deletion(-)
 create mode 100644 modules/video_output/drawable_os2.c

diff --git a/modules/video_output/Makefile.am b/modules/video_output/Makefile.am
index 8f56e4f734..31619425a7 100644
--- a/modules/video_output/Makefile.am
+++ b/modules/video_output/Makefile.am
@@ -207,8 +207,9 @@ endif
 
 
 ### OS/2 ###
+libdrawable_os2_plugin_la_SOURCES = video_output/drawable_os2.c
 if HAVE_OS2
-vout_LTLIBRARIES += libdrawable_plugin.la
+vout_LTLIBRARIES += libdrawable_os2_plugin.la
 endif
 
 libkva_plugin_la_SOURCES = video_output/kva.c
diff --git a/modules/video_output/drawable_os2.c b/modules/video_output/drawable_os2.c
new file mode 100644
index 0000000000..8d125fb554
--- /dev/null
+++ b/modules/video_output/drawable_os2.c
@@ -0,0 +1,143 @@
+/**
+ * @file drawable_os2.c
+ * @brief Legacy monolithic LibVLC video window provider
+ */
+/*****************************************************************************
+ * Copyright © 2009 Rémi Denis-Courmont
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as published by
+ * the Free Software Foundation; either version 2.1 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * along with this program; if not, write to the Free Software Foundation,
+ * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
+ *****************************************************************************/
+
+#ifdef HAVE_CONFIG_H
+# include <config.h>
+#endif
+
+#include <stdarg.h>
+#include <assert.h>
+
+#include <vlc_common.h>
+#include <vlc_plugin.h>
+#include <vlc_vout_window.h>
+
+#define HWND_TEXT N_("Window handle (HWND)")
+#define HWND_LONGTEXT N_( \
+    "Video will be embedded in this pre-existing window. " \
+    "If zero, a new window will be created.")
+
+static int Open(vout_window_t *);
+static void Close(vout_window_t *);
+
+/*
+ * Module descriptor
+ */
+vlc_module_begin ()
+    set_shortname (N_("Drawable"))
+    set_description (N_("Embedded window video"))
+    set_category (CAT_VIDEO)
+    set_subcategory (SUBCAT_VIDEO_VOUT)
+    set_capability ("vout window", 70)
+    set_callback(Open)
+    add_shortcut ("embed-hwnd")
+
+    add_integer ("drawable-hwnd", 0, HWND_TEXT, HWND_LONGTEXT, true)
+        change_volatile ()
+vlc_module_end ()
+
+/* 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 uintptr_t *used = NULL;
+
+static const struct vout_window_operations ops = {
+    .destroy = Close,
+};
+
+static void RemoveDrawable(uintptr_t val)
+{
+    size_t n = 0;
+
+    /* Remove this drawable from the list of busy ones */
+    vlc_mutex_lock (&serializer);
+    assert (used != NULL);
+    while (used[n] != val)
+    {
+        assert (used[n]);
+        n++;
+    }
+    do
+        used[n] = used[n + 1];
+    while (used[++n] != 0);
+
+    if (n == 1)
+    {
+        free (used);
+        used = NULL;
+    }
+    vlc_mutex_unlock (&serializer);
+}
+
+/**
+ * Find the drawable set by libvlc application.
+ */
+static int Open(vout_window_t *wnd)
+{
+    uintptr_t val = var_InheritInteger (wnd, "drawable-hwnd");
+    if (val == 0)
+        return VLC_EGENERIC;
+
+    uintptr_t *tab;
+    size_t n = 0;
+
+    vlc_mutex_lock (&serializer);
+    if (used != NULL)
+        for (/*n = 0*/; used[n]; n++)
+            if (used[n] == val)
+            {
+                msg_Warn (wnd, "HWND 0x%" PRIXPTR " is busy", val);
+                val = 0;
+                goto skip;
+            }
+
+    tab = realloc (used, sizeof (*used) * (n + 2));
+    if (likely(tab != NULL))
+    {
+        used = tab;
+        used[n] = val;
+        used[n + 1] = 0;
+    }
+    else
+        val = 0;
+skip:
+    vlc_mutex_unlock (&serializer);
+
+    if (val == 0)
+        return VLC_EGENERIC;
+
+    wnd->type = VOUT_WINDOW_TYPE_HWND;
+    wnd->handle.hwnd = (void *)val;
+    wnd->ops = &ops;
+    wnd->sys = (void *)val;
+    return VLC_SUCCESS;
+}
+
+/**
+ * Release the drawable.
+ */
+static void Close (vout_window_t *wnd)
+{
+    uintptr_t val = (uintptr_t)wnd->sys;
+
+    RemoveDrawable(val);
+}
-- 
2.22.0



More information about the vlc-devel mailing list