home *** CD-ROM | disk | FTP | other *** search
/ mail.altrad.com / 2015.02.mail.altrad.com.tar / mail.altrad.com / TEST / vlc-2-0-5-win32.exe / sdk / include / vlc / plugins / vlc_vout_display.h < prev    next >
C/C++ Source or Header  |  2012-12-12  |  15KB  |  441 lines

  1. /*****************************************************************************
  2.  * vlc_vout_display.h: vout_display_t definitions
  3.  *****************************************************************************
  4.  * Copyright (C) 2009 Laurent Aimar
  5.  * $Id: d99cf7eea9c1079754a3a47ea1df8ecd8e8d6163 $
  6.  *
  7.  * Authors: Laurent Aimar <fenrir _AT_ videolan _DOT_ org>
  8.  *
  9.  * This program is free software; you can redistribute it and/or modify it
  10.  * under the terms of the GNU Lesser General Public License as published by
  11.  * the Free Software Foundation; either version 2.1 of the License, or
  12.  * (at your option) any later version.
  13.  *
  14.  * This program is distributed in the hope that it will be useful,
  15.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17.  * GNU Lesser General Public License for more details.
  18.  *
  19.  * You should have received a copy of the GNU Lesser General Public License
  20.  * along with this program; if not, write to the Free Software Foundation,
  21.  * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  22.  *****************************************************************************/
  23.  
  24. #ifndef VLC_VOUT_DISPLAY_H
  25. #define VLC_VOUT_DISPLAY_H 1
  26.  
  27. /**
  28.  * \file
  29.  * This file defines vout display structures and functions in vlc
  30.  */
  31.  
  32. #include <vlc_es.h>
  33. #include <vlc_picture.h>
  34. #include <vlc_picture_pool.h>
  35. #include <vlc_subpicture.h>
  36. #include <vlc_keys.h>
  37. #include <vlc_mouse.h>
  38. #include <vlc_vout_window.h>
  39.  
  40. /* XXX
  41.  * Do NOT use video_format_t::i_aspect but i_sar_num/den everywhere. i_aspect
  42.  * will be removed as soon as possible.
  43.  *
  44.  */
  45. typedef struct vout_display_t vout_display_t;
  46. typedef struct vout_display_sys_t vout_display_sys_t;
  47. typedef struct vout_display_owner_t vout_display_owner_t;
  48. typedef struct vout_display_owner_sys_t vout_display_owner_sys_t;
  49.  
  50. /**
  51.  * Possible alignments for vout_display.
  52.  */
  53. typedef enum
  54. {
  55.     VOUT_DISPLAY_ALIGN_CENTER,
  56.     /* */
  57.     VOUT_DISPLAY_ALIGN_LEFT,
  58.     VOUT_DISPLAY_ALIGN_RIGHT,
  59.     /* */
  60.     VOUT_DISPLAY_ALIGN_TOP,
  61.     VOUT_DISPLAY_ALIGN_BOTTOM,
  62. } vout_display_align_t;
  63.  
  64. /**
  65.  * Window management state.
  66.  */
  67. enum {
  68.     VOUT_WINDOW_STATE_NORMAL=0,
  69.     VOUT_WINDOW_STATE_ABOVE=1,
  70.     VOUT_WINDOW_STATE_BELOW=2,
  71.     VOUT_WINDOW_STACK_MASK=3,
  72. };
  73.  
  74. /**
  75.  * Initial/Current configuration for a vout_display_t
  76.  */
  77. typedef struct {
  78.     bool is_fullscreen;  /* Is the display fullscreen */
  79.  
  80.     /* Display properties */
  81.     struct {
  82.         /* Window title (may be NULL) */
  83.         const char *title;
  84.  
  85.         /* Display size */
  86.         unsigned  width;
  87.         unsigned  height;
  88.  
  89.         /* Display SAR */
  90.         struct {
  91.             unsigned num;
  92.             unsigned den;
  93.         } sar;
  94.     } display;
  95.  
  96.     /* Alignment of the picture inside the display */
  97.     struct {
  98.         int horizontal;
  99.         int vertical;
  100.     } align;
  101.  
  102.     /* Do we fill up the display with the video */
  103.     bool is_display_filled;
  104.  
  105.     /* Zoom to use
  106.      * It will be applied to the whole display if b_display_filled is set, otherwise
  107.      * only on the video source */
  108.     struct {
  109.         int num;
  110.         int den;
  111.     } zoom;
  112.  
  113. } vout_display_cfg_t;
  114.  
  115. /**
  116.  * Information from a vout_display_t to configure
  117.  * the core behaviour.
  118.  *
  119.  * By default they are all false or NULL.
  120.  *
  121.  */
  122. typedef struct {
  123.     bool is_slow;                           /* The picture memory has slow read/write */
  124.     bool has_double_click;                  /* Is double-click generated */
  125.     bool has_hide_mouse;                    /* Is mouse automatically hidden */
  126.     bool has_pictures_invalid;              /* Will VOUT_DISPLAY_EVENT_PICTURES_INVALID be used */
  127.     bool has_event_thread;                  /* Will events (key at least) be emitted using an independent thread */
  128.     const vlc_fourcc_t *subpicture_chromas; /* List of supported chromas for subpicture rendering. */
  129. } vout_display_info_t;
  130.  
  131. /**
  132.  * Control query for vout_display_t
  133.  */
  134. enum {
  135.     /* Hide the mouse. It will be sent when
  136.      * vout_display_t::info.b_hide_mouse is false */
  137.     VOUT_DISPLAY_HIDE_MOUSE,
  138.  
  139.     /* Ask to reset the internal buffers after a VOUT_DISPLAY_EVENT_PICTURES_INVALID
  140.      * request.
  141.      */
  142.     VOUT_DISPLAY_RESET_PICTURES,
  143.  
  144.     /* Ask the module to acknowledge/refuse the fullscreen state change after
  145.      * being requested (externally or by VOUT_DISPLAY_EVENT_FULLSCREEN */
  146.     VOUT_DISPLAY_CHANGE_FULLSCREEN,     /* const vout_display_cfg_t *p_cfg */
  147.  
  148.     /* Ask the module to acknowledge/refuse the window management state change
  149.      * after being requested externally or by VOUT_DISPLAY_WINDOW_STATE */
  150.     VOUT_DISPLAY_CHANGE_WINDOW_STATE,         /* unsigned state */
  151.  
  152.     /* Ask the module to acknowledge/refuse the display size change requested
  153.      * (externally or by VOUT_DISPLAY_EVENT_DISPLAY_SIZE) */
  154.     VOUT_DISPLAY_CHANGE_DISPLAY_SIZE,   /* const vout_display_cfg_t *p_cfg, int is_forced */
  155.  
  156.     /* Ask the module to acknowledge/refuse fill display state change after
  157.      * being requested externally */
  158.     VOUT_DISPLAY_CHANGE_DISPLAY_FILLED, /* const vout_display_cfg_t *p_cfg */
  159.  
  160.     /* Ask the module to acknowledge/refuse zoom change after being requested
  161.      * externally */
  162.     VOUT_DISPLAY_CHANGE_ZOOM, /* const vout_display_cfg_t *p_cfg */
  163.  
  164.     /* Ask the module to acknowledge/refuse source aspect ratio after being
  165.      * requested externally */
  166.     VOUT_DISPLAY_CHANGE_SOURCE_ASPECT, /* const video_format_t *p_source */
  167.  
  168.     /* Ask the module to acknowledge/refuse source crop change after being
  169.      * requested externally.
  170.      * The cropping requested is stored by video_format_t::i_x/y_offset and
  171.      * video_format_t::i_visible_width/height */
  172.     VOUT_DISPLAY_CHANGE_SOURCE_CROP,   /* const video_format_t *p_source */
  173.  
  174.     /* Ask an opengl interface if available. */
  175.     VOUT_DISPLAY_GET_OPENGL,           /* vlc_gl_t ** */
  176. };
  177.  
  178. /**
  179.  * Event from vout_display_t
  180.  *
  181.  * Events modifiying the state may be sent multiple times.
  182.  * Only the transition will be retained and acted upon.
  183.  */
  184. enum {
  185.     /* TODO:
  186.      * ZOOM ? DISPLAY_FILLED ? ON_TOP ?
  187.      */
  188.     /* */
  189.     VOUT_DISPLAY_EVENT_PICTURES_INVALID,    /* The buffer are now invalid and need to be changed */
  190.  
  191.     VOUT_DISPLAY_EVENT_FULLSCREEN,
  192.     VOUT_DISPLAY_EVENT_WINDOW_STATE,
  193.  
  194.     VOUT_DISPLAY_EVENT_DISPLAY_SIZE,        /* The display size need to change : int i_width, int i_height, bool is_fullscreen */
  195.  
  196.     /* */
  197.     VOUT_DISPLAY_EVENT_CLOSE,
  198.     VOUT_DISPLAY_EVENT_KEY,
  199.  
  200.     /* Full mouse state.
  201.      * You can use it OR use the other mouse events. The core will do
  202.      * the conversion.
  203.      */
  204.     VOUT_DISPLAY_EVENT_MOUSE_STATE,
  205.  
  206.     /* Mouse event */
  207.     VOUT_DISPLAY_EVENT_MOUSE_MOVED,
  208.     VOUT_DISPLAY_EVENT_MOUSE_PRESSED,
  209.     VOUT_DISPLAY_EVENT_MOUSE_RELEASED,
  210.     VOUT_DISPLAY_EVENT_MOUSE_DOUBLE_CLICK,
  211. };
  212.  
  213. /**
  214.  * Vout owner structures
  215.  */
  216. struct vout_display_owner_t {
  217.     /* Private place holder for the vout_display_t creator
  218.      */
  219.     vout_display_owner_sys_t *sys;
  220.  
  221.     /* Event coming from the module
  222.      *
  223.      * This function is set prior to the module instantiation and must not
  224.      * be overwritten nor used directly (use the vout_display_SendEvent*
  225.      * wrapper.
  226.      *
  227.      * You can send it at any time i.e. from any vout_display_t functions or
  228.      * from another thread.
  229.      * Be careful, it does not ensure correct serialization if it is used
  230.      * from multiple threads.
  231.      */
  232.     void            (*event)(vout_display_t *, int, va_list);
  233.  
  234.     /* Window management
  235.      *
  236.      * These functions are set prior to the module instantiation and must not
  237.      * be overwritten nor used directly (use the vout_display_*Window
  238.      * wrapper */
  239.     vout_window_t *(*window_new)(vout_display_t *, const vout_window_cfg_t *);
  240.     void           (*window_del)(vout_display_t *, vout_window_t *);
  241. };
  242.  
  243. struct vout_display_t {
  244.     VLC_COMMON_MEMBERS
  245.  
  246.     /* Module */
  247.     module_t *module;
  248.  
  249.     /* Initial and current configuration.
  250.      * You cannot modify it directly, you must use the appropriate events.
  251.      *
  252.      * It reflects the current values, i.e. after the event has been accepted
  253.      * and applied/configured if needed.
  254.      */
  255.     const vout_display_cfg_t *cfg;
  256.  
  257.     /* video source format.
  258.      *
  259.      * Cropping is not requested while in the open function.
  260.      * You cannot change it.
  261.      */
  262.     video_format_t source;
  263.  
  264.     /* picture_t format.
  265.      *
  266.      * You can only change it inside the module open function to
  267.      * match what you want, and when a VOUT_DISPLAY_RESET_PICTURES control
  268.      * request is made and succeeds.
  269.      *
  270.      * By default, it is equal to ::source except for the aspect ratio
  271.      * which is undefined(0) and is ignored.
  272.      */
  273.     video_format_t fmt;
  274.  
  275.     /* Information
  276.      *
  277.      * You can only set them in the open function.
  278.      */
  279.     vout_display_info_t info;
  280.  
  281.     /* Return a pointer over the current picture_pool_t* (mandatory).
  282.      *
  283.      * For performance reasons, it is best to provide at least count
  284.      * pictures but it is not mandatory.
  285.      * You can return NULL when you cannot/do not want to allocate
  286.      * pictures.
  287.      * The vout display module keeps the ownership of the pool and can
  288.      * destroy it only when closing or on invalid pictures control.
  289.      */
  290.     picture_pool_t *(*pool)(vout_display_t *, unsigned count);
  291.  
  292.     /* Prepare a picture and an optional subpicture for display (optional).
  293.      *
  294.      * It is called before the next pf_display call to provide as much
  295.      * time as possible to prepare the given picture and the subpicture
  296.      * for display.
  297.      * You are guaranted that pf_display will always be called and using
  298.      * the exact same picture_t and subpicture_t.
  299.      * You cannot change the pixel content of the picture_t or of the
  300.      * subpicture_t.
  301.      */
  302.     void       (*prepare)(vout_display_t *, picture_t *, subpicture_t *);
  303.  
  304.     /* Display a picture and an optional subpicture (mandatory).
  305.      *
  306.      * The picture and the optional subpicture must be displayed as soon as
  307.      * possible.
  308.      * You cannot change the pixel content of the picture_t or of the
  309.      * subpicture_t.
  310.      *
  311.      * This function gives away the ownership of the picture and of the
  312.      * subpicture, so you must release them as soon as possible.
  313.      */
  314.     void       (*display)(vout_display_t *, picture_t *, subpicture_t *);
  315.  
  316.     /* Control on the module (mandatory) */
  317.     int        (*control)(vout_display_t *, int, va_list);
  318.  
  319.     /* Manage pending event (optional) */
  320.     void       (*manage)(vout_display_t *);
  321.  
  322.     /* Private place holder for the vout_display_t module (optional)
  323.      *
  324.      * A module is free to use it as it wishes.
  325.      */
  326.     vout_display_sys_t *sys;
  327.  
  328.     /* Reserved for the vout_display_t owner.
  329.      *
  330.      * It must not be overwritten nor used directly by a module.
  331.      */
  332.     vout_display_owner_t owner;
  333. };
  334.  
  335. static inline void vout_display_SendEvent(vout_display_t *vd, int query, ...)
  336. {
  337.     va_list args;
  338.     va_start(args, query);
  339.     vd->owner.event(vd, query, args);
  340.     va_end(args);
  341. }
  342.  
  343. static inline void vout_display_SendEventDisplaySize(vout_display_t *vd, int width, int height, bool is_fullscreen)
  344. {
  345.     vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_DISPLAY_SIZE, width, height, is_fullscreen);
  346. }
  347. static inline void vout_display_SendEventPicturesInvalid(vout_display_t *vd)
  348. {
  349.     vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_PICTURES_INVALID);
  350. }
  351. static inline void vout_display_SendEventClose(vout_display_t *vd)
  352. {
  353.     vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_CLOSE);
  354. }
  355. static inline void vout_display_SendEventKey(vout_display_t *vd, int key)
  356. {
  357.     vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_KEY, key);
  358. }
  359. static inline void vout_display_SendEventFullscreen(vout_display_t *vd, bool is_fullscreen)
  360. {
  361.     vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_FULLSCREEN, is_fullscreen);
  362. }
  363. static inline void vout_display_SendWindowState(vout_display_t *vd, unsigned state)
  364. {
  365.     vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_WINDOW_STATE, state);
  366. }
  367. /* The mouse position (State and Moved event) must be expressed against vout_display_t::source unit */
  368. static inline void vout_display_SendEventMouseState(vout_display_t *vd, int x, int y, int button_mask)
  369. {
  370.     vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_STATE, x, y, button_mask);
  371. }
  372. static inline void vout_display_SendEventMouseMoved(vout_display_t *vd, int x, int y)
  373. {
  374.     vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_MOVED, x, y);
  375. }
  376. static inline void vout_display_SendEventMousePressed(vout_display_t *vd, int button)
  377. {
  378.     vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_PRESSED, button);
  379. }
  380. static inline void vout_display_SendEventMouseReleased(vout_display_t *vd, int button)
  381. {
  382.     vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_RELEASED, button);
  383. }
  384. static inline void vout_display_SendEventMouseDoubleClick(vout_display_t *vd)
  385. {
  386.     vout_display_SendEvent(vd, VOUT_DISPLAY_EVENT_MOUSE_DOUBLE_CLICK);
  387. }
  388.  
  389. /**
  390.  * Asks for a new window with the given configuration as hint.
  391.  *
  392.  * b_standalone/i_x/i_y may be overwritten by the core
  393.  */
  394. static inline vout_window_t *vout_display_NewWindow(vout_display_t *vd, const vout_window_cfg_t *cfg)
  395. {
  396.     return vd->owner.window_new(vd, cfg);
  397. }
  398. /**
  399.  * Deletes a window created by vout_display_NewWindow if window is non NULL
  400.  * or any unused windows otherwise.
  401.  */
  402. static inline void vout_display_DeleteWindow(vout_display_t *vd,
  403.                                              vout_window_t *window)
  404. {
  405.     vd->owner.window_del(vd, window);
  406. }
  407.  
  408. /**
  409.  * Computes the default display size given the source and
  410.  * the display configuration.
  411.  *
  412.  * This asssumes that the picture is already cropped.
  413.  */
  414. VLC_API void vout_display_GetDefaultDisplaySize(unsigned *width, unsigned *height, const video_format_t *source, const vout_display_cfg_t *);
  415.  
  416.  
  417. /**
  418.  * Structure used to store the result of a vout_display_PlacePicture.
  419.  */
  420. typedef struct {
  421.     int x;
  422.     int y;
  423.     unsigned width;
  424.     unsigned height;
  425. } vout_display_place_t;
  426.  
  427. /**
  428.  * Computes how to place a picture inside the display to respect
  429.  * the given parameters.
  430.  * This assumes that cropping is done by an external mean.
  431.  *
  432.  * \param p_place Place inside the window (window pixel unit)
  433.  * \param p_source Video source format
  434.  * \param p_cfg Display configuration
  435.  * \param b_clip If true, prevent the video to go outside the display (break zoom).
  436.  */
  437. VLC_API void vout_display_PlacePicture(vout_display_place_t *place, const video_format_t *source, const vout_display_cfg_t *cfg, bool do_clipping);
  438.  
  439. #endif /* VLC_VOUT_DISPLAY_H */
  440.  
  441.