From 76fd9cb9b2efe77ea27f0f14e175f35bcdd32057 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Mon, 2 Feb 2009 20:28:18 +0200 Subject: [PATCH] Reimplement libvlc_video_set_parent back-end as a plugin If multiple video ouputs exist, only one will now use the drawable. This still does not implement drawable size, window type and probably Win64 support properly. Also, this is not currently used by libvlc_media_player_set_drawable although it probably should. This function looks pretty weirdly -to stay polite- implemented. --- modules/video_output/Modules.am | 7 ++ modules/video_output/drawable.c | 136 ++++++++++++++++++++++++++++++++ 2 files changed, 143 insertions(+) create mode 100644 modules/video_output/drawable.c diff --git a/modules/video_output/Modules.am b/modules/video_output/Modules.am index b8886fa17b..49a175598a 100644 --- a/modules/video_output/Modules.am +++ b/modules/video_output/Modules.am @@ -46,3 +46,10 @@ libxcb_window_plugin_la_LIBADD = $(AM_LIBADD) \ libxcb_window_plugin_la_DEPENDENCIES = EXTRA_LTLIBRARIES += libxcb_plugin.la libxcb_window_plugin.la + +# XXX: do we need yet another modules/ subdirectory? +libdrawable_plugin_la_SOURCES = drawable.c +libdrawable_plugin_la_CFLAGS = $(AM_CFLAGS) +libdrawable_plugin_la_LIBADD = $(AM_LIBADD) +libdrawable_plugin_la_DEPENDENCIES = +libvlc_LTLIBRARIES += libdrawable_plugin.la diff --git a/modules/video_output/drawable.c b/modules/video_output/drawable.c new file mode 100644 index 0000000000..bc64d434fb --- /dev/null +++ b/modules/video_output/drawable.c @@ -0,0 +1,136 @@ +/** + * @file drawable.c + * @brief Legacy monolithic LibVLC video window provider + */ +/***************************************************************************** + * Copyright © 2009 Rémi Denis-Courmont + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2.0 + * of the License, or (at your option) any later version. + * + * This library 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 General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + ****************************************************************************/ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include +#include + +#include +#include +#include +#include + +static int Open (vlc_object_t *); +static void Close (vlc_object_t *); + +/* + * Module descriptor + */ +vlc_module_begin () + set_shortname (N_("Drawable")) + set_description (N_("External embedded video window")) + set_category (CAT_VIDEO) + set_subcategory (SUBCAT_VIDEO_VOUT) +#ifdef WIN32 + set_capability ("hwnd", 70) +#else + set_capability ("xwindow", 70) +#endif + set_callbacks (Open, Close) + +vlc_module_end () + +static int Control (vout_window_t *, int, va_list); + +/** + * Find the drawable set by libvlc application. + */ +static int Open (vlc_object_t *obj) +{ + static vlc_mutex_t serializer = VLC_STATIC_MUTEX; + vout_window_t *wnd = (vout_window_t *)obj; + int drawable = 0; + + if (var_Create (obj->p_libvlc, "drawable-busy", VLC_VAR_BOOL)) + return VLC_ENOMEM; + + vlc_mutex_lock (&serializer); + /* Note: We cannot simply clear the drawable variable. + * It would break libvlc_video_get_parent(). */ + if (!var_GetBool (obj->p_libvlc, "drawable-busy")) + { + /* TODO: implement separate variables for XIDs and HWNDs */ + drawable = var_GetInteger (obj->p_libvlc, "drawable"); + if (drawable != 0) + var_SetBool (obj->p_libvlc, "drawable-busy", true); + } + vlc_mutex_unlock (&serializer); + + if (drawable == 0) + { + var_Destroy (obj->p_libvlc, "drawable-busy"); + return VLC_EGENERIC; + } + +#ifdef WIN32 + /* FIXME: don't loose critical bits on Win64 */ + wnd->handle.hwnd = (void *)drawable; +#else + /* FIXME: check that X server matches --x11-display (if specified) */ + /* FIXME: get X drawable dimensions */ + wnd->handle.xid = drawable; +#endif + /* FIXME: get window size (in platform-dependent ways) */ + + wnd->control = Control; + return VLC_SUCCESS; +} + + +/** + * Release the drawable. + */ +static void Close (vlc_object_t *obj) +{ + /* This is atomic with regards to var_GetBool() in Open(): */ + var_SetBool (obj->p_libvlc, "drawable-busy", false); + + /* Variables are reference-counted... */ + var_Destroy (obj->p_libvlc, "drawable-busy"); +} + + +static int Control (vout_window_t *wnd, int query, va_list ap) +{ + switch (query) + { + case VOUT_GET_SIZE: + { + unsigned int *pi_width = va_arg (ap, unsigned int *); + unsigned int *pi_height = va_arg (ap, unsigned int *); + *pi_width = wnd->width; + *pi_height = wnd->height; + return VLC_SUCCESS; + } + + case VOUT_SET_SIZE: /* not allowed */ + case VOUT_SET_STAY_ON_TOP: /* not allowed either, would be ugly */ + return VLC_EGENERIC; + } + + msg_Warn (wnd, "unsupported control query %d", query); + return VLC_EGENERIC; +} + -- 2.39.2