[vlc-devel] [PATCH 3/4] vout: drawable: restore drawable for OS/2
Alexandre Janniaux
ajanni at videolabs.io
Mon Jul 20 13:54:59 CEST 2020
Hi,
It would probably make more sense to have a separate plugin/name
for this drawable module when built for os/2.
Regards,
--
Alexandre Janniaux
Videolabs
On Mon, Jul 20, 2020 at 07:46:10PM +0900, KO Myung-Hun wrote:
> This is from commit 72c10ed11fde80.
> ---
> modules/video_output/Makefile.am | 3 +-
> modules/video_output/drawable.c | 143 +++++++++++++++++++++++++++++++
> 2 files changed, 145 insertions(+), 1 deletion(-)
> create mode 100644 modules/video_output/drawable.c
>
> diff --git a/modules/video_output/Makefile.am b/modules/video_output/Makefile.am
> index 83fc2bf96a..10d23200cc 100644
> --- a/modules/video_output/Makefile.am
> +++ b/modules/video_output/Makefile.am
> @@ -186,8 +186,8 @@ vout_LTLIBRARIES += libegl_win32_plugin.la
> endif
> endif
>
> -libdrawable_plugin_la_SOURCES = video_output/win32/drawable.c
> if HAVE_WIN32_DESKTOP
> +libdrawable_plugin_la_SOURCES = video_output/win32/drawable.c
> vout_LTLIBRARIES += libdrawable_plugin.la
> endif
>
> @@ -199,6 +199,7 @@ endif
>
> ### OS/2 ###
> if HAVE_OS2
> +libdrawable_plugin_la_SOURCES = video_output/drawable.c
> vout_LTLIBRARIES += libdrawable_plugin.la
> endif
>
> diff --git a/modules/video_output/drawable.c b/modules/video_output/drawable.c
> new file mode 100644
> index 0000000000..f9db604d56
> --- /dev/null
> +++ b/modules/video_output/drawable.c
> @@ -0,0 +1,143 @@
> +/**
> + * @file drawable.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
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list