drawable.c
上传用户:kjfoods
上传日期:2020-07-06
资源大小:29949k
文件大小:5k
源码类别:

midi

开发平台:

Unix_Linux

  1. /**
  2.  * @file drawable.c
  3.  * @brief Legacy monolithic LibVLC video window provider
  4.  */
  5. /*****************************************************************************
  6.  * Copyright © 2009 Rémi Denis-Courmont
  7.  *
  8.  * This library is free software; you can redistribute it and/or
  9.  * modify it under the terms of the GNU General Public License
  10.  * as published by the Free Software Foundation; either version 2.0
  11.  * of the License, or (at your option) any later version.
  12.  *
  13.  * This library is distributed in the hope that it will be useful,
  14.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16.  * GNU General Public License for more details.
  17.  *
  18.  * You should have received a copy of the GNU Lesser General Public
  19.  * License along with this library; if not, write to the Free Software
  20.  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
  21.  ****************************************************************************/
  22. #ifdef HAVE_CONFIG_H
  23. # include <config.h>
  24. #endif
  25. #include <stdarg.h>
  26. #include <assert.h>
  27. #include <vlc_common.h>
  28. #include <vlc_plugin.h>
  29. #include <vlc_vout.h>
  30. #include <vlc_window.h>
  31. static int  OpenXID (vlc_object_t *);
  32. static int  OpenHWND (vlc_object_t *);
  33. static void Close (vlc_object_t *);
  34. #define XID_TEXT N_("ID of the video output X window")
  35. #define XID_LONGTEXT N_( 
  36.     "VLC can embed its video output in an existing X11 window. " 
  37.     "This is the X identifier of that window (0 means none).")
  38. /*
  39.  * Module descriptor
  40.  */
  41. vlc_module_begin ()
  42.     set_shortname (N_("Drawable"))
  43.     set_description (N_("Embedded X window video"))
  44.     set_category (CAT_VIDEO)
  45.     set_subcategory (SUBCAT_VIDEO_VOUT)
  46.     set_capability ("xwindow", 70)
  47.     set_callbacks (OpenXID, Close)
  48.     add_integer ("drawable-xid", 0, NULL, XID_TEXT, XID_LONGTEXT, true)
  49.         change_unsaveable ()
  50.         /*change_integer_range (0, 0xffffffff)*/
  51.     add_submodule ()
  52.         set_description (N_("Embedded Windows video"))
  53.         set_capability ("hwnd", 70)
  54.         set_callbacks (OpenHWND, Close)
  55. vlc_module_end ()
  56. static int Control (vout_window_t *, int, va_list);
  57. /* TODO: move to vlc_variables.h */
  58. static inline void *var_GetAddress (vlc_object_t *o, const char *name)
  59. {
  60.     vlc_value_t val;
  61.     return var_Get (o, name, &val) ? NULL : val.p_address;
  62. }
  63. static vlc_mutex_t serializer = VLC_STATIC_MUTEX;
  64. /**
  65.  * Find the drawable set by libvlc application.
  66.  */
  67. static int Open (vlc_object_t *obj, const char *varname, bool ptr)
  68. {
  69.     vout_window_t *wnd = (vout_window_t *)obj;
  70.     void **used, *val;
  71.     size_t n = 0;
  72.     if (var_Create (obj->p_libvlc, "drawables-in-use", VLC_VAR_ADDRESS)
  73.      || var_Create (obj, varname, VLC_VAR_DOINHERIT
  74.                                   | (ptr ? VLC_VAR_ADDRESS : VLC_VAR_INTEGER)))
  75.         return VLC_ENOMEM;
  76.     if (ptr)
  77.         val = var_GetAddress (obj, varname);
  78.     else
  79.         val = (void *)(uintptr_t)var_GetInteger (obj, varname);
  80.     var_Destroy (obj, varname);
  81.     /* Keep a list of busy drawables, so we don't overlap videos if there are
  82.      * more than one video track in the stream. */
  83.     vlc_mutex_lock (&serializer);
  84.     /* TODO: per-type list of busy drawables */
  85.     used = var_GetAddress (VLC_OBJECT (obj->p_libvlc), "drawables-in-use");
  86.     if (used != NULL)
  87.     {
  88.         while (used[n] != NULL)
  89.         {
  90.             if (used[n] == val)
  91.                 goto skip;
  92.             n++;
  93.         }
  94.     }
  95.     used = realloc (used, sizeof (*used) * (n + 2));
  96.     if (used != NULL)
  97.     {
  98.         used[n] = val;
  99.         used[n + 1] = NULL;
  100.         var_SetAddress (obj->p_libvlc, "drawables-in-use", used);
  101.     }
  102.     else
  103.     {
  104. skip:
  105.         msg_Warn (wnd, "drawable %p is busy", val);
  106.         val = NULL;
  107.     }
  108.     vlc_mutex_unlock (&serializer);
  109.     if (val == NULL)
  110.         return VLC_EGENERIC;
  111.     if (ptr)
  112.         wnd->handle.hwnd = val;
  113.     else
  114.         wnd->handle.xid = (uintptr_t)val;
  115.     /* FIXME: check that X server matches --x11-display (if specified) */
  116.     /* FIXME: get window size (in platform-dependent ways) */
  117.     wnd->control = Control;
  118.     wnd->p_sys = val;
  119.     return VLC_SUCCESS;
  120. }
  121. static int  OpenXID (vlc_object_t *obj)
  122. {
  123.     return Open (obj, "drawable-xid", false);
  124. }
  125. static int  OpenHWND (vlc_object_t *obj)
  126. {
  127.     return Open (obj, "drawable-hwnd", true);
  128. }
  129. /**
  130.  * Release the drawable.
  131.  */
  132. static void Close (vlc_object_t *obj)
  133. {
  134.     vout_window_t *wnd = (vout_window_t *)obj;
  135.     void **used, *val = wnd->p_sys;
  136.     size_t n = 0;
  137.     /* Remove this drawable from the list of busy ones */
  138.     vlc_mutex_lock (&serializer);
  139.     used = var_GetAddress (VLC_OBJECT (obj->p_libvlc), "drawables-in-use");
  140.     assert (used);
  141.     while (used[n] != val)
  142.     {
  143.         assert (used[n]);
  144.         n++;
  145.     }
  146.     do
  147.         used[n] = used[n + 1];
  148.     while (used[++n] != NULL);
  149.     if (n == 0)
  150.       /* should not be needed (var_Destroy...) but better safe than sorry: */
  151.          var_SetAddress (obj->p_libvlc, "drawables-in-use", NULL);
  152.     vlc_mutex_unlock (&serializer);
  153.     if (n == 0)
  154.         free (used);
  155.     /* Variables are reference-counted... */
  156.     var_Destroy (obj->p_libvlc, "drawables-in-use");
  157. }
  158. static int Control (vout_window_t *wnd, int query, va_list ap)
  159. {
  160.     switch (query)
  161.     {
  162.         case VOUT_SET_SIZE: /* not allowed */
  163.         case VOUT_SET_STAY_ON_TOP: /* not allowed either, would be ugly */
  164.             return VLC_EGENERIC;
  165.     }
  166.     msg_Warn (wnd, "unsupported control query %d", query);
  167.     return VLC_EGENERIC;
  168. }