]> git.sesse.net Git - vlc/commitdiff
Allowed a vout_display_t module to do the OSD/subtitles blending.
authorLaurent Aimar <fenrir@videolan.org>
Sun, 12 Dec 2010 16:19:36 +0000 (17:19 +0100)
committerLaurent Aimar <fenrir@videolan.org>
Sun, 9 Jan 2011 21:44:12 +0000 (22:44 +0100)
You have to set the list of chromas the module support in
vout_display_t::info.subpicture_chromas and then handle the subpicture_t
parameters in vout_display_t::prepare/display.

26 files changed:
include/vlc_vout_display.h
include/vlc_vout_wrapper.h
modules/misc/dummy/vout.c
modules/video_output/aa.c
modules/video_output/caca.c
modules/video_output/directfb.c
modules/video_output/egl.c
modules/video_output/fb.c
modules/video_output/ios.m
modules/video_output/macosx.m
modules/video_output/msw/direct2d.c
modules/video_output/msw/direct3d.c
modules/video_output/msw/directx.c
modules/video_output/msw/glwin32.c
modules/video_output/msw/wingdi.c
modules/video_output/sdl.c
modules/video_output/snapshot.c
modules/video_output/vmem.c
modules/video_output/xcb/glx.c
modules/video_output/xcb/x11.c
modules/video_output/xcb/xvideo.c
modules/video_output/yuv.c
src/video_output/display.c
src/video_output/video_output.c
src/video_output/vout_internal.h
src/video_output/vout_wrapper.c

index 503f92db13b46b212b32b24095ff674fa76200fa..5cf2136ad043ce631c554e37ffada90bdb662a0b 100644 (file)
@@ -116,15 +116,16 @@ typedef struct {
  * Information from a vout_display_t to configure
  * the core behaviour.
  *
- * By default they are all false.
+ * By default they are all false or NULL.
  *
  */
 typedef struct {
-    bool is_slow;            /* The picture memory has slow read/write */
-    bool has_double_click;    /* Is double-click generated */
-    bool has_hide_mouse;      /* Is mouse automatically hidden */
-    bool has_pictures_invalid;/* Will VOUT_DISPLAY_EVENT_PICTURES_INVALID be used */
-    bool has_event_thread;    /* Will events (key at least) be emitted using an independent thread */
+    bool is_slow;                           /* The picture memory has slow read/write */
+    bool has_double_click;                  /* Is double-click generated */
+    bool has_hide_mouse;                    /* Is mouse automatically hidden */
+    bool has_pictures_invalid;              /* Will VOUT_DISPLAY_EVENT_PICTURES_INVALID be used */
+    bool has_event_thread;                  /* Will events (key at least) be emitted using an independent thread */
+    const vlc_fourcc_t *subpicture_chromas; /* List of supported chromas for subpicture rendering. */
 } vout_display_info_t;
 
 /**
@@ -288,25 +289,29 @@ struct vout_display_t {
      */
     picture_pool_t *(*pool)(vout_display_t *, unsigned count);
 
-    /* Prepare a picture for display (optional).
+    /* Prepare a picture and an optional subpicture for display (optional).
      *
      * It is called before the next pf_display call to provide as much
-     * time as possible to prepare the given picture for display.
+     * time as possible to prepare the given picture and the subpicture
+     * for display.
      * You are guaranted that pf_display will always be called and using
-     * the exact same picture_t.
-     * You cannot change the pixel content of the picture_t.
+     * the exact same picture_t and subpicture_t.
+     * You cannot change the pixel content of the picture_t or of the
+     * subpicture_t.
      */
-    void       (*prepare)(vout_display_t *, picture_t *);
+    void       (*prepare)(vout_display_t *, picture_t *, subpicture_t *);
 
-    /* Display a picture (mandatory).
+    /* Display a picture and an optional subpicture (mandatory).
      *
-     * The picture must be displayed as soon as possible.
-     * You cannot change the pixel content of the picture_t.
+     * The picture and the optional subpicture must be displayed as soon as
+     * possible.
+     * You cannot change the pixel content of the picture_t or of the
+     * subpicture_t.
      *
-     * This function gives away the ownership of the picture, so you must
-     * release it as soon as possible.
+     * This function gives away the ownership of the picture and of the
+     * subpicture, so you must release them as soon as possible.
      */
-    void       (*display)(vout_display_t *, picture_t *);
+    void       (*display)(vout_display_t *, picture_t *, subpicture_t *);
 
     /* Control on the module (mandatory) */
     int        (*control)(vout_display_t *, int, va_list);
index b960e5c13eb62c41277a19bbb1c95b88f4173997..5f28f98e88527a3ed003f1e3407475b3270082e6 100644 (file)
@@ -40,18 +40,22 @@ static inline picture_pool_t *vout_display_Pool(vout_display_t *vd, unsigned cou
 /**
  * It preparse a picture for display.
  */
-static inline void vout_display_Prepare(vout_display_t *vd, picture_t *picture)
+static inline void vout_display_Prepare(vout_display_t *vd,
+                                        picture_t *picture,
+                                        subpicture_t *subpicture)
 {
     if (vd->prepare )
-        vd->prepare(vd, picture);
+        vd->prepare(vd, picture, subpicture);
 }
 
 /**
  * It display a picture.
  */
-static inline void vout_display_Display(vout_display_t *vd, picture_t *picture)
+static inline void vout_display_Display(vout_display_t *vd,
+                                        picture_t *picture,
+                                        subpicture_t *subpicture)
 {
-    vd->display(vd, picture);
+    vd->display(vd, picture, subpicture);
 }
 
 /**
index ae71e23ad74d6ace7e4435983204d3efb703a1f8..045bab655b93d8bf96873fc82e74949471bd8ed7 100644 (file)
@@ -40,8 +40,8 @@ struct vout_display_sys_t {
     picture_pool_t *pool;
 };
 static picture_pool_t *Pool(vout_display_t *, unsigned count);
-static void            Display(vout_display_t *, picture_t *);
-static void            DisplayStat(vout_display_t *, picture_t *);
+static void            Display(vout_display_t *, picture_t *, subpicture_t *);
+static void            DisplayStat(vout_display_t *, picture_t *, subpicture_t *);
 static int             Control(vout_display_t *, int, va_list);
 static void            Manage (vout_display_t *);
 
@@ -104,15 +104,17 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
     return sys->pool;
 }
 
-static void Display(vout_display_t *vd, picture_t *picture)
+static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
 {
     VLC_UNUSED(vd);
+    VLC_UNUSED(subpicture);
     picture_Release(picture);
 }
 
-static void DisplayStat(vout_display_t *vd, picture_t *picture)
+static void DisplayStat(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
 {
     VLC_UNUSED(vd);
+    VLC_UNUSED(subpicture);
     if (vd->fmt.i_width*vd->fmt.i_height >= sizeof(mtime_t)) {
         mtime_t date;
         memcpy(&date, picture->p->p_pixels, sizeof(date));
index 420767b587ead5383276bd47a4d67cb171294f02..007cb56c94495ca2cc3cae82b63d07b70bf3a3ae 100644 (file)
@@ -66,8 +66,8 @@ vlc_module_end()
  * Local prototypes
  *****************************************************************************/
 static picture_pool_t *Pool   (vout_display_t *, unsigned);
-static void            Prepare(vout_display_t *, picture_t *);
-static void            PictureDisplay(vout_display_t *, picture_t *);
+static void            Prepare(vout_display_t *, picture_t *, subpicture_t *);
+static void            PictureDisplay(vout_display_t *, picture_t *, subpicture_t *);
 static int             Control(vout_display_t *, int, va_list);
 
 /* */
@@ -191,7 +191,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
 
 /**
  * Prepare a picture for display */
-static void Prepare(vout_display_t *vd, picture_t *picture)
+static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
@@ -208,6 +208,7 @@ static void Prepare(vout_display_t *vd, picture_t *picture)
 #else
     VLC_UNUSED(picture);
 #endif
+    VLC_UNUSED(subpicture);
 
     aa_fastrender(sys->aa_context, 0, 0,
                   vd->fmt.i_width, vd->fmt.i_height);
@@ -216,12 +217,13 @@ static void Prepare(vout_display_t *vd, picture_t *picture)
 /**
  * Display a picture
  */
-static void PictureDisplay(vout_display_t *vd, picture_t *picture)
+static void PictureDisplay(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
     aa_flush(sys->aa_context);
     picture_Release(picture);
+    VLC_UNUSED(subpicture);
 }
 
 /**
index 6de1ca19a27898fd10f6947bd3a7eecb2d6bb392..55372eb31cc884fe6d2d51e7bc9c82ee93e22b74 100644 (file)
@@ -56,8 +56,8 @@ vlc_module_end()
  * Local prototypes
  *****************************************************************************/
 static picture_pool_t *Pool  (vout_display_t *, unsigned);
-static void           Prepare(vout_display_t *, picture_t *);
-static void           Display(vout_display_t *, picture_t *);
+static void           Prepare(vout_display_t *, picture_t *, subpicture_t *);
+static void           Display(vout_display_t *, picture_t *, subpicture_t *);
 static int            Control(vout_display_t *, int, va_list);
 
 /* */
@@ -245,7 +245,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
 
 /**
  * Prepare a picture for display */
-static void Prepare(vout_display_t *vd, picture_t *picture)
+static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
@@ -278,15 +278,17 @@ static void Prepare(vout_display_t *vd, picture_t *picture)
                         place.width, place.height,
                         sys->dither,
                         &picture->p->p_pixels[crop_offset]);
+    VLC_UNUSED(subpicture);
 }
 
 /**
  * Display a picture
  */
-static void Display(vout_display_t *vd, picture_t *picture)
+static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
 {
     Refresh(vd);
     picture_Release(picture);
+    VLC_UNUSED(subpicture);
 }
 
 /**
index fd18cbbe905f1378d8b8187f4f88579eced8b12f..29af5caead584da4b07a60664bed33153ac9b4f6 100644 (file)
@@ -56,7 +56,7 @@ vlc_module_end()
  * Local prototypes
  *****************************************************************************/
 static picture_pool_t *Pool  (vout_display_t *, unsigned);
-static void           Display(vout_display_t *, picture_t *);
+static void           Display(vout_display_t *, picture_t *, subpicture_t *);
 static int            Control(vout_display_t *, int, va_list);
 static void           Manage (vout_display_t *);
 
@@ -192,7 +192,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
     return sys->pool;
 }
 
-static void Display(vout_display_t *vd, picture_t *picture)
+static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
@@ -218,6 +218,7 @@ static void Display(vout_display_t *vd, picture_t *picture)
             primary->Flip(primary, NULL, 0);
     }
     picture_Release(picture);
+    VLC_UNUSED(subpicture);
 }
 
 static int Control(vout_display_t *vd, int query, va_list args)
index 5353051fa10beaf1ddf8b79e6048eaca49d87528..0fa293ae669e0a24308a6a8494ff05808eac2b54 100644 (file)
@@ -318,19 +318,21 @@ static picture_pool_t *Pool (vout_display_t *vd, unsigned count)
     return sys->pool;
 }
 
-static void PictureRender (vout_display_t *vd, picture_t *pic)
+static void PictureRender (vout_display_t *vd, picture_t *pic, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
     vout_display_opengl_Prepare (&sys->vgl, pic);
+    (void)subpicture;
 }
 
-static void PictureDisplay (vout_display_t *vd, picture_t *pic)
+static void PictureDisplay (vout_display_t *vd, picture_t *pic, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
     vout_display_opengl_Display (&sys->vgl, &vd->source);
     picture_Release (pic);
+    (void)subpicture;
 }
 
 static int Control (vout_display_t *vd, int query, va_list ap)
index 2d54669c34d8f906ede21d51172d48b5db357164..66ac404645a96688b001975235332adde95a919b 100644 (file)
@@ -101,7 +101,7 @@ vlc_module_end ()
  * Local prototypes
  *****************************************************************************/
 static picture_pool_t *Pool  (vout_display_t *, unsigned);
-static void           Display(vout_display_t *, picture_t *);
+static void           Display(vout_display_t *, picture_t *, subpicture_t *);
 static int            Control(vout_display_t *, int, va_list);
 static void           Manage (vout_display_t *);
 
@@ -366,7 +366,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
     }
     return sys->pool;
 }
-static void Display(vout_display_t *vd, picture_t *picture)
+static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
@@ -391,6 +391,7 @@ static void Display(vout_display_t *vd, picture_t *picture)
         picture_Copy(sys->picture, picture);
 
     picture_Release(picture);
+    VLC_UNUSED(subpicture);
 }
 static int Control(vout_display_t *vd, int query, va_list args)
 {
index 1a02a3d2cf527f72dc0e46697b1248a813c632d7..a651def9891fb652040f4db6147a26f05ca82624 100644 (file)
@@ -50,8 +50,8 @@ static int Open(vlc_object_t *);
 static void Close(vlc_object_t *);
 
 static picture_pool_t *Pool(vout_display_t *vd, unsigned requested_count);
-static void PictureRender(vout_display_t *vd, picture_t *pic);
-static void PictureDisplay(vout_display_t *vd, picture_t *pic);
+static void PictureRender(vout_display_t *vd, picture_t *pic, subpicture_t *subpicture);
+static void PictureDisplay(vout_display_t *vd, picture_t *pic, subpicture_t *subpicture);
 static int Control (vout_display_t *vd, int query, va_list ap);
 
 static int OpenglClean(vout_opengl_t *gl);
@@ -216,19 +216,21 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned requested_count)
     return sys->pool;
 }
 
-static void PictureRender(vout_display_t *vd, picture_t *pic)
+static void PictureRender(vout_display_t *vd, picture_t *pic, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
     vout_display_opengl_Prepare( &sys->vgl, pic );
+       (void)subpicture;
 }
 
-static void PictureDisplay(vout_display_t *vd, picture_t *pic)
+static void PictureDisplay(vout_display_t *vd, picture_t *pic, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
     vout_display_opengl_Display(&sys->vgl, &vd->fmt );
     picture_Release (pic);
     sys->has_first_frame = true;
+       (void)subpicture;
 }
 
 static int Control (vout_display_t *vd, int query, va_list ap)
index 6d6feadd072f98599630a18459a24a83d1609bf5..46d09840c16a91994b78c8fd4814291f89ce15a6 100644 (file)
@@ -52,8 +52,8 @@ static int Open(vlc_object_t *);
 static void Close(vlc_object_t *);
 
 static picture_pool_t *Pool(vout_display_t *vd, unsigned requested_count);
-static void PictureRender(vout_display_t *vd, picture_t *pic);
-static void PictureDisplay(vout_display_t *vd, picture_t *pic);
+static void PictureRender(vout_display_t *vd, picture_t *pic, subpicture_t *subpicture);
+static void PictureDisplay(vout_display_t *vd, picture_t *pic, subpicture_t *subpicture);
 static int Control (vout_display_t *vd, int query, va_list ap);
 
 static int OpenglLock(vout_opengl_t *gl);
@@ -261,15 +261,16 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned requested_count)
     return sys->pool;
 }
 
-static void PictureRender(vout_display_t *vd, picture_t *pic)
+static void PictureRender(vout_display_t *vd, picture_t *pic, subpicture_t *subpicture)
 {
 
     vout_display_sys_t *sys = vd->sys;
 
     vout_display_opengl_Prepare( &sys->vgl, pic );
+       (void)subpicture;
 }
 
-static void PictureDisplay(vout_display_t *vd, picture_t *pic)
+static void PictureDisplay(vout_display_t *vd, picture_t *pic, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
     [sys->glView setVoutFlushing:YES];
@@ -277,6 +278,7 @@ static void PictureDisplay(vout_display_t *vd, picture_t *pic)
     [sys->glView setVoutFlushing:NO];
     picture_Release (pic);
     sys->has_first_frame = true;
+       (void)subpicture;
 }
 
 static int Control (vout_display_t *vd, int query, va_list ap)
index 11757bd03fb8dc70e80cf010231c97b0c0d3f40f..0eff02d90b10d93e9056b5abb8df688825cc3dee 100644 (file)
@@ -71,8 +71,8 @@ vlc_module_end ()
  * Local prototypes
  *****************************************************************************/
 static picture_pool_t *Pool  (vout_display_t *, unsigned);
-static void           Prepare(vout_display_t *, picture_t *);
-static void           Display(vout_display_t *, picture_t *);
+static void           Prepare(vout_display_t *, picture_t *, subpicture_t *);
+static void           Display(vout_display_t *, picture_t *, subpicture_t *);
 static int            Control(vout_display_t *, int, va_list);
 static void           Manage (vout_display_t *);
 
@@ -205,7 +205,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
 /**
  * Performs set up of ID2D1Bitmap memory ready for blitting
  */
-static void Prepare(vout_display_t *vd, picture_t *picture)
+static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
@@ -224,12 +224,13 @@ static void Prepare(vout_display_t *vd, picture_t *picture)
                 sys->d2_render_target, pitch, sys->d2_bitmap);*/
 #endif
     }
+    VLC_UNUSED(subpicture);
 }
 
 /**
  * Blits a scaled picture_t to the render target
  */
-static void Display(vout_display_t *vd, picture_t *picture)
+static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
@@ -260,6 +261,7 @@ static void Display(vout_display_t *vd, picture_t *picture)
     }
 
     picture_Release(picture);
+    VLC_UNUSED(subpicture);
 
     CommonDisplay(vd);
 }
index 4163208faf0efaf69480939801ff12f1d79cc6e8..1592885277ba0a7aa6390436af6be3987a3cfe20 100644 (file)
@@ -93,8 +93,8 @@ struct picture_sys_t
 static int  Open(vlc_object_t *);
 
 static picture_pool_t *Pool  (vout_display_t *, unsigned);
-static void           Prepare(vout_display_t *, picture_t *);
-static void           Display(vout_display_t *, picture_t *);
+static void           Prepare(vout_display_t *, picture_t *, subpicture_t *subpicture);
+static void           Display(vout_display_t *, picture_t *, subpicture_t *subpicture);
 static int            Control(vout_display_t *, int, va_list);
 static void           Manage (vout_display_t *);
 
@@ -240,11 +240,12 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
 static int  Direct3DLockSurface(picture_t *);
 static void Direct3DUnlockSurface(picture_t *);
 
-static void Prepare(vout_display_t *vd, picture_t *picture)
+static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
 {
     LPDIRECT3DSURFACE9 surface = picture->p_sys->surface;
 #if 0
     picture_Release(picture);
+    VLC_UNUSED(subpicture);
     Direct3DRenderScene(vd, surface);
 #else
     /* FIXME it is a bit ugly, we need the surface to be unlocked for
@@ -256,10 +257,11 @@ static void Prepare(vout_display_t *vd, picture_t *picture)
     Direct3DUnlockSurface(picture);
 
     Direct3DRenderScene(vd, surface);
+    VLC_UNUSED(subpicture);
 #endif
 }
 
-static void Display(vout_display_t *vd, picture_t *picture)
+static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
     LPDIRECT3DDEVICE9 d3ddev = sys->d3ddev;
@@ -275,10 +277,12 @@ static void Display(vout_display_t *vd, picture_t *picture)
 
 #if 0
     VLC_UNUSED(picture);
+    VLC_UNUSED(subpicture);
 #else
     /* XXX See Prepare() */
     Direct3DLockSurface(picture);
     picture_Release(picture);
+    VLC_UNUSED(subpicture);
 #endif
 
     CommonDisplay(vd);
index 330352c1bf6819076a52f2b3277f291822e1b2ef..903135dbef6ddaf9cd52902479b9062e85b9eb1d 100644 (file)
@@ -135,7 +135,7 @@ DEFINE_GUID(IID_IDirectDraw2, 0xB3A6F3E0,0x2B43,0x11CF,0xA2,0xDE,0x00,0xAA,0x00,
 DEFINE_GUID(IID_IDirectDrawSurface2, 0x57805885,0x6eec,0x11cf,0x94,0x41,0xa8,0x23,0x03,0xc1,0x0e,0x27);
 
 static picture_pool_t *Pool  (vout_display_t *, unsigned);
-static void           Display(vout_display_t *, picture_t *);
+static void           Display(vout_display_t *, picture_t *, subpicture_t *);
 static int            Control(vout_display_t *, int, va_list);
 static void           Manage (vout_display_t *);
 
@@ -256,7 +256,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
     VLC_UNUSED(count);
     return vd->sys->pool;
 }
-static void Display(vout_display_t *vd, picture_t *picture)
+static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
@@ -313,6 +313,7 @@ static void Display(vout_display_t *vd, picture_t *picture)
     CommonDisplay(vd);
 
     picture_Release(picture);
+    VLC_UNUSED(subpicture);
 }
 static int Control(vout_display_t *vd, int query, va_list args)
 {
index f807bfeb0a4844e6b3501894d1de82c6a910c488..68c80a58a26dbc21572379c92b16f241be654160 100644 (file)
@@ -62,8 +62,8 @@ vlc_module_end()
  * Local prototypes.
  *****************************************************************************/
 static picture_pool_t *Pool  (vout_display_t *, unsigned);
-static void           Prepare(vout_display_t *, picture_t *);
-static void           Display(vout_display_t *, picture_t *);
+static void           Prepare(vout_display_t *, picture_t *, subpicture_t *);
+static void           Display(vout_display_t *, picture_t *, subpicture_t *);
 static int            Control(vout_display_t *, int, va_list);
 static void           Manage (vout_display_t *);
 
@@ -175,20 +175,22 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
     return sys->pool;
 }
 
-static void Prepare(vout_display_t *vd, picture_t *picture)
+static void Prepare(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
     vout_display_opengl_Prepare(&sys->vgl, picture);
+    VLC_UNUSED(subpicture);
 }
 
-static void Display(vout_display_t *vd, picture_t *picture)
+static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
     vout_display_opengl_Display(&sys->vgl, &vd->source);
 
     picture_Release(picture);
+    VLC_UNUSED(subpicture);
 
     CommonDisplay(vd);
 }
index eeb6ca89bbdcfd002b79bed0952ea6ad4b0779d5..e3e82a790253b82df9f3496da2e261dfbbecbc13 100644 (file)
@@ -70,7 +70,7 @@ vlc_module_end ()
  * Local prototypes
  *****************************************************************************/
 static picture_pool_t *Pool  (vout_display_t *, unsigned);
-static void           Display(vout_display_t *, picture_t *);
+static void           Display(vout_display_t *, picture_t *, subpicture_t *subpicture);
 static int            Control(vout_display_t *, int, va_list);
 static void           Manage (vout_display_t *);
 
@@ -174,7 +174,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
     VLC_UNUSED(count);
     return vd->sys->pool;
 }
-static void Display(vout_display_t *vd, picture_t *picture)
+static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
@@ -217,6 +217,7 @@ static void Display(vout_display_t *vd, picture_t *picture)
 #endif
     /* TODO */
     picture_Release(picture);
+    VLC_UNUSED(subpicture);
 
     CommonDisplay(vd);
 }
index ddd13c125335ca5b99d05be5c61aa485efb8e9a6..67d82d031494369f12ab675b9f42dbb410dd66fd 100644 (file)
@@ -79,7 +79,7 @@ vlc_module_end()
  * Local prototypes
  *****************************************************************************/
 static picture_pool_t *Pool  (vout_display_t *, unsigned);
-static void           PictureDisplay(vout_display_t *, picture_t *);
+static void           PictureDisplay(vout_display_t *, picture_t *, subpicture_t *);
 static int            Control(vout_display_t *, int, va_list);
 static void           Manage(vout_display_t *);
 
@@ -438,7 +438,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
 /**
  * Display a picture
  */
-static void PictureDisplay(vout_display_t *vd, picture_t *p_pic)
+static void PictureDisplay(vout_display_t *vd, picture_t *p_pic, subpicture_t *p_subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
@@ -457,6 +457,7 @@ static void PictureDisplay(vout_display_t *vd, picture_t *p_pic)
     }
 
     picture_Release(p_pic);
+    VLC_UNUSED(p_subpicture);
 }
 
 
index 2827a45807c17534ac848ed903f12cfb92d10162..c9283aad05959fa1b2850f43346d48b126b7fb48 100644 (file)
@@ -91,7 +91,7 @@ vlc_module_end ()
  * Local prototypes
  *****************************************************************************/
 static picture_pool_t *Pool  (vout_display_t *, unsigned);
-static void           Display(vout_display_t *, picture_t *);
+static void           Display(vout_display_t *, picture_t *, subpicture_t *);
 static int            Control(vout_display_t *, int, va_list);
 static void           Manage (vout_display_t *);
 
@@ -297,7 +297,7 @@ static mtime_t snapshot_GetMovietime(vout_display_t *vd)
     return var_GetTime(sys->input, "time") / 1000;
 }
 
-static void Display(vout_display_t *vd, picture_t *picture)
+static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
index 06ed1821354db3b6330891f1efec472a7e497bc5..340c55d3dcd817c89744b590d9a8e92e6fd8baa9 100644 (file)
@@ -105,7 +105,7 @@ typedef unsigned (*vlc_format_cb)(void **, char *, unsigned *, unsigned *,
                                   unsigned *, unsigned *);
 
 static picture_pool_t *Pool  (vout_display_t *, unsigned);
-static void           Display(vout_display_t *, picture_t *);
+static void           Display(vout_display_t *, picture_t *, subpicture_t *);
 static int            Control(vout_display_t *, int, va_list);
 static void           Manage (vout_display_t *);
 
@@ -296,7 +296,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
     return sys->pool;
 }
 
-static void Display(vout_display_t *vd, picture_t *picture)
+static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
@@ -304,6 +304,7 @@ static void Display(vout_display_t *vd, picture_t *picture)
     if (sys->display != NULL)
         sys->display(sys->opaque, picture->p_sys->id);
     picture_Release(picture);
+    VLC_UNUSED(subpicture);
 }
 
 static int Control(vout_display_t *vd, int query, va_list args)
index 6aa89765b05b95a30f9b3c981d9557fc0cdf6ceb..9a4413ef9f475e8e6863bc2a360a7cd1d8fa7787 100644 (file)
@@ -76,8 +76,8 @@ struct vout_display_sys_t
 };
 
 static picture_pool_t *Pool (vout_display_t *, unsigned);
-static void PictureRender (vout_display_t *, picture_t *);
-static void PictureDisplay (vout_display_t *, picture_t *);
+static void PictureRender (vout_display_t *, picture_t *, subpicture_t *);
+static void PictureDisplay (vout_display_t *, picture_t *, subpicture_t *);
 static int Control (vout_display_t *, int, va_list);
 static void Manage (vout_display_t *);
 
@@ -456,19 +456,21 @@ static picture_pool_t *Pool (vout_display_t *vd, unsigned requested_count)
     return sys->pool;
 }
 
-static void PictureRender (vout_display_t *vd, picture_t *pic)
+static void PictureRender (vout_display_t *vd, picture_t *pic, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
     vout_display_opengl_Prepare (&sys->vgl, pic);
+    (void)subpicture;
 }
 
-static void PictureDisplay (vout_display_t *vd, picture_t *pic)
+static void PictureDisplay (vout_display_t *vd, picture_t *pic, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
     vout_display_opengl_Display (&sys->vgl, &vd->source);
     picture_Release (pic);
+    (void)subpicture;
 }
 
 static int Control (vout_display_t *vd, int query, va_list ap)
index d9d8629079dd83dd75975b043bef5779e810f4b1..f674fcdd53775a70d995164f4b55ce7317346f47 100644 (file)
@@ -81,7 +81,7 @@ struct vout_display_sys_t
 };
 
 static picture_pool_t *Pool (vout_display_t *, unsigned);
-static void Display (vout_display_t *, picture_t *);
+static void Display (vout_display_t *, picture_t *, subpicture_t *subpicture);
 static int Control (vout_display_t *, int, va_list);
 static void Manage (vout_display_t *);
 
@@ -421,7 +421,7 @@ static picture_pool_t *Pool (vout_display_t *vd, unsigned requested_count)
 /**
  * Sends an image to the X server.
  */
-static void Display (vout_display_t *vd, picture_t *pic)
+static void Display (vout_display_t *vd, picture_t *pic, subpicture_t *subpicture)
 {
     vout_display_sys_t *p_sys = vd->sys;
     xcb_shm_seg_t segment = pic->p_sys->segment;
@@ -467,6 +467,7 @@ static void Display (vout_display_t *vd, picture_t *pic)
      * vout_display wrapper. */
 out:
     picture_Release (pic);
+    (void)subpicture;
 }
 
 static int Control (vout_display_t *vd, int query, va_list ap)
index d812f36977b41efeba6085f4e1165f3dc884ccee..91bc0eb62e7e767e84355e4d52da0a881a9d0fa1 100644 (file)
@@ -96,7 +96,7 @@ struct vout_display_sys_t
 };
 
 static picture_pool_t *Pool (vout_display_t *, unsigned);
-static void Display (vout_display_t *, picture_t *);
+static void Display (vout_display_t *, picture_t *, subpicture_t *subpicture);
 static int Control (vout_display_t *, int, va_list);
 static void Manage (vout_display_t *);
 
@@ -680,7 +680,7 @@ static picture_pool_t *Pool (vout_display_t *vd, unsigned requested_count)
 /**
  * Sends an image to the X server.
  */
-static void Display (vout_display_t *vd, picture_t *pic)
+static void Display (vout_display_t *vd, picture_t *pic, subpicture_t *subpicture)
 {
     vout_display_sys_t *p_sys = vd->sys;
     xcb_shm_seg_t segment = pic->p_sys->segment;
@@ -719,6 +719,7 @@ static void Display (vout_display_t *vd, picture_t *pic)
     }
 out:
     picture_Release (pic);
+    (void)subpicture;
 }
 
 static int Control (vout_display_t *vd, int query, va_list ap)
index cb2781a2814357e46d2b9888bc622e11b444f909..7868ded3658cadfffe62dee1712c048fdccb7f5d 100644 (file)
@@ -81,7 +81,7 @@ static const char *const ppsz_vout_options[] = {
 
 /* */
 static picture_pool_t *Pool  (vout_display_t *, unsigned);
-static void           Display(vout_display_t *, picture_t *);
+static void           Display(vout_display_t *, picture_t *, subpicture_t *subpicture);
 static int            Control(vout_display_t *, int, va_list);
 static void           Manage (vout_display_t *);
 
@@ -197,7 +197,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
     return sys->pool;
 }
 
-static void Display(vout_display_t *vd, picture_t *picture)
+static void Display(vout_display_t *vd, picture_t *picture, subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
@@ -260,6 +260,7 @@ static void Display(vout_display_t *vd, picture_t *picture)
 
     /* */
     picture_Release(picture);
+    VLC_UNUSED(subpicture);
 }
 
 static int Control(vout_display_t *vd, int query, va_list args)
index 434ffbff62f85da995647c06f32a883c00ab257d..94da01b804ee4c5d9fdf5880748e02b7e25cf497 100644 (file)
@@ -115,6 +115,7 @@ static vout_display_t *vout_display_New(vlc_object_t *obj,
     vd->info.has_hide_mouse = false;
     vd->info.has_pictures_invalid = false;
     vd->info.has_event_thread = false;
+    vd->info.subpicture_chromas = NULL;
 
     vd->cfg = cfg;
     vd->pool = NULL;
@@ -1431,11 +1432,14 @@ static picture_pool_t *SplitterPool(vout_display_t *vd, unsigned count)
         sys->pool = picture_pool_NewFromFormat(&vd->fmt, count);
     return sys->pool;
 }
-static void SplitterPrepare(vout_display_t *vd, picture_t *picture)
+static void SplitterPrepare(vout_display_t *vd,
+                            picture_t *picture,
+                            subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
     picture_Hold(picture);
+    assert(!subpicture);
 
     if (video_splitter_Filter(sys->splitter, sys->picture, picture)) {
         for (int i = 0; i < sys->count; i++)
@@ -1448,16 +1452,19 @@ static void SplitterPrepare(vout_display_t *vd, picture_t *picture)
         if (vout_IsDisplayFiltered(sys->display[i]))
             sys->picture[i] = vout_FilterDisplay(sys->display[i], sys->picture[i]);
         if (sys->picture[i])
-            vout_display_Prepare(sys->display[i], sys->picture[i]);
+            vout_display_Prepare(sys->display[i], sys->picture[i], NULL);
     }
 }
-static void SplitterDisplay(vout_display_t *vd, picture_t *picture)
+static void SplitterDisplay(vout_display_t *vd,
+                            picture_t *picture,
+                            subpicture_t *subpicture)
 {
     vout_display_sys_t *sys = vd->sys;
 
+    assert(!subpicture);
     for (int i = 0; i < sys->count; i++) {
         if (sys->picture[i])
-            vout_display_Display(sys->display[i], sys->picture[i]);
+            vout_display_Display(sys->display[i], sys->picture[i], NULL);
     }
     picture_Release(picture);
 }
index fe4d95681cad47441449f6c4e037ba3281c717ba..0c72b2d353722877aced1211f322f621e40c43ac 100644 (file)
@@ -956,7 +956,7 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced)
         vout_snapshot_Set(&vout->p->snapshot, &vd->source, direct);
 
     /* Render the direct buffer returned by vout_RenderPicture */
-    vout_RenderWrapper(vout, direct);
+    vout_RenderWrapper(vout, direct, NULL);
 
     vout_chrono_Stop(&vout->p->render);
 #if 0
@@ -980,7 +980,7 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced)
     /* Display the direct buffer returned by vout_RenderPicture */
     vout->p->displayed.date = mdate();
 
-    vout_DisplayWrapper(vout, direct);
+    vout_DisplayWrapper(vout, direct, NULL);
 
     vout_statistic_Update(&vout->p->statistic, 1, 0);
 
index 5b2d3011df4b7e730014bd5eeba604f96a6635b4..0dcd6f886cda79bc2995270420caa373e3732549 100644 (file)
@@ -161,8 +161,8 @@ void vout_CloseWrapper(vout_thread_t *, vout_display_state_t *);
 int  vout_InitWrapper(vout_thread_t *);
 void vout_EndWrapper(vout_thread_t *);
 void vout_ManageWrapper(vout_thread_t *);
-void vout_RenderWrapper(vout_thread_t *, picture_t *);
-void vout_DisplayWrapper(vout_thread_t *, picture_t *);
+void vout_RenderWrapper(vout_thread_t *, picture_t *, subpicture_t *);
+void vout_DisplayWrapper(vout_thread_t *, picture_t *, subpicture_t *);
 
 /* */
 int spu_ProcessMouse(spu_t *, const vlc_mouse_t *, const video_format_t *);
index 8ff36b8e80e2a44f82e877ce0a450aaff453b7f5..4ed32559c6030252a64cae33fcecfea564e5c747 100644 (file)
@@ -207,7 +207,8 @@ void vout_ManageWrapper(vout_thread_t *vout)
 /*****************************************************************************
  * Render
  *****************************************************************************/
-void vout_RenderWrapper(vout_thread_t *vout, picture_t *picture)
+void vout_RenderWrapper(vout_thread_t *vout,
+                        picture_t *picture, subpicture_t *subpicture)
 {
     vout_thread_sys_t *sys = vout->p;
     vout_display_t *vd = sys->display.vd;
@@ -216,24 +217,28 @@ void vout_RenderWrapper(vout_thread_t *vout, picture_t *picture)
 
     vout_UpdateDisplaySourceProperties(vd, &picture->format);
     if (sys->display.use_dr) {
-        vout_display_Prepare(vd, picture);
+        vout_display_Prepare(vd, picture, subpicture);
     } else {
         sys->display.filtered = vout_FilterDisplay(vd, picture);
         if (sys->display.filtered)
-            vout_display_Prepare(vd, sys->display.filtered);
+            vout_display_Prepare(vd, sys->display.filtered, subpicture);
     }
 }
 
 /*****************************************************************************
  *
  *****************************************************************************/
-void vout_DisplayWrapper(vout_thread_t *vout, picture_t *picture)
+void vout_DisplayWrapper(vout_thread_t *vout,
+                         picture_t *picture, subpicture_t *subpicture)
 {
     vout_thread_sys_t *sys = vout->p;
     vout_display_t *vd = sys->display.vd;
 
-     vout_display_Display(vd, sys->display.filtered ? sys->display.filtered : picture);
-     sys->display.filtered = NULL;
+    vout_display_Display(vd,
+                         sys->display.filtered ? sys->display.filtered
+                                                : picture,
+                         subpicture);
+    sys->display.filtered = NULL;
 }
 
 #ifdef WIN32