Commit b0fc931f authored by Laurent Aimar's avatar Laurent Aimar

Allowed a vout_display_t module to do the OSD/subtitles blending.

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.
parent 623941a7
...@@ -116,15 +116,16 @@ typedef struct { ...@@ -116,15 +116,16 @@ typedef struct {
* Information from a vout_display_t to configure * Information from a vout_display_t to configure
* the core behaviour. * the core behaviour.
* *
* By default they are all false. * By default they are all false or NULL.
* *
*/ */
typedef struct { typedef struct {
bool is_slow; /* The picture memory has slow read/write */ bool is_slow; /* The picture memory has slow read/write */
bool has_double_click; /* Is double-click generated */ bool has_double_click; /* Is double-click generated */
bool has_hide_mouse; /* Is mouse automatically hidden */ bool has_hide_mouse; /* Is mouse automatically hidden */
bool has_pictures_invalid;/* Will VOUT_DISPLAY_EVENT_PICTURES_INVALID be used */ 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 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; } vout_display_info_t;
/** /**
...@@ -288,25 +289,29 @@ struct vout_display_t { ...@@ -288,25 +289,29 @@ struct vout_display_t {
*/ */
picture_pool_t *(*pool)(vout_display_t *, unsigned count); 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 * 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 * You are guaranted that pf_display will always be called and using
* the exact same picture_t. * the exact same picture_t and subpicture_t.
* You cannot change the pixel content of the picture_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. * The picture and the optional subpicture must be displayed as soon as
* You cannot change the pixel content of the picture_t. * 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 * This function gives away the ownership of the picture and of the
* release it as soon as possible. * 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) */ /* Control on the module (mandatory) */
int (*control)(vout_display_t *, int, va_list); int (*control)(vout_display_t *, int, va_list);
......
...@@ -40,18 +40,22 @@ static inline picture_pool_t *vout_display_Pool(vout_display_t *vd, unsigned cou ...@@ -40,18 +40,22 @@ static inline picture_pool_t *vout_display_Pool(vout_display_t *vd, unsigned cou
/** /**
* It preparse a picture for display. * 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 ) if (vd->prepare )
vd->prepare(vd, picture); vd->prepare(vd, picture, subpicture);
} }
/** /**
* It display a picture. * 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);
} }
/** /**
......
...@@ -40,8 +40,8 @@ struct vout_display_sys_t { ...@@ -40,8 +40,8 @@ struct vout_display_sys_t {
picture_pool_t *pool; picture_pool_t *pool;
}; };
static picture_pool_t *Pool(vout_display_t *, unsigned count); static picture_pool_t *Pool(vout_display_t *, unsigned count);
static void Display(vout_display_t *, picture_t *); static void Display(vout_display_t *, picture_t *, subpicture_t *);
static void DisplayStat(vout_display_t *, picture_t *); static void DisplayStat(vout_display_t *, picture_t *, subpicture_t *);
static int Control(vout_display_t *, int, va_list); static int Control(vout_display_t *, int, va_list);
static void Manage (vout_display_t *); static void Manage (vout_display_t *);
...@@ -104,15 +104,17 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count) ...@@ -104,15 +104,17 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
return sys->pool; 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(vd);
VLC_UNUSED(subpicture);
picture_Release(picture); 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(vd);
VLC_UNUSED(subpicture);
if (vd->fmt.i_width*vd->fmt.i_height >= sizeof(mtime_t)) { if (vd->fmt.i_width*vd->fmt.i_height >= sizeof(mtime_t)) {
mtime_t date; mtime_t date;
memcpy(&date, picture->p->p_pixels, sizeof(date)); memcpy(&date, picture->p->p_pixels, sizeof(date));
......
...@@ -66,8 +66,8 @@ vlc_module_end() ...@@ -66,8 +66,8 @@ vlc_module_end()
* Local prototypes * Local prototypes
*****************************************************************************/ *****************************************************************************/
static picture_pool_t *Pool (vout_display_t *, unsigned); static picture_pool_t *Pool (vout_display_t *, unsigned);
static void Prepare(vout_display_t *, picture_t *); static void Prepare(vout_display_t *, picture_t *, subpicture_t *);
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 int Control(vout_display_t *, int, va_list);
/* */ /* */
...@@ -191,7 +191,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count) ...@@ -191,7 +191,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
/** /**
* Prepare a picture for display */ * 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; vout_display_sys_t *sys = vd->sys;
...@@ -208,6 +208,7 @@ static void Prepare(vout_display_t *vd, picture_t *picture) ...@@ -208,6 +208,7 @@ static void Prepare(vout_display_t *vd, picture_t *picture)
#else #else
VLC_UNUSED(picture); VLC_UNUSED(picture);
#endif #endif
VLC_UNUSED(subpicture);
aa_fastrender(sys->aa_context, 0, 0, aa_fastrender(sys->aa_context, 0, 0,
vd->fmt.i_width, vd->fmt.i_height); vd->fmt.i_width, vd->fmt.i_height);
...@@ -216,12 +217,13 @@ static void Prepare(vout_display_t *vd, picture_t *picture) ...@@ -216,12 +217,13 @@ static void Prepare(vout_display_t *vd, picture_t *picture)
/** /**
* Display a 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; vout_display_sys_t *sys = vd->sys;
aa_flush(sys->aa_context); aa_flush(sys->aa_context);
picture_Release(picture); picture_Release(picture);
VLC_UNUSED(subpicture);
} }
/** /**
......
...@@ -56,8 +56,8 @@ vlc_module_end() ...@@ -56,8 +56,8 @@ vlc_module_end()
* Local prototypes * Local prototypes
*****************************************************************************/ *****************************************************************************/
static picture_pool_t *Pool (vout_display_t *, unsigned); static picture_pool_t *Pool (vout_display_t *, unsigned);
static void Prepare(vout_display_t *, picture_t *); static void Prepare(vout_display_t *, picture_t *, subpicture_t *);
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 int Control(vout_display_t *, int, va_list);
/* */ /* */
...@@ -245,7 +245,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count) ...@@ -245,7 +245,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
/** /**
* Prepare a picture for display */ * 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; vout_display_sys_t *sys = vd->sys;
...@@ -278,15 +278,17 @@ static void Prepare(vout_display_t *vd, picture_t *picture) ...@@ -278,15 +278,17 @@ static void Prepare(vout_display_t *vd, picture_t *picture)
place.width, place.height, place.width, place.height,
sys->dither, sys->dither,
&picture->p->p_pixels[crop_offset]); &picture->p->p_pixels[crop_offset]);
VLC_UNUSED(subpicture);
} }
/** /**
* Display a picture * 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); Refresh(vd);
picture_Release(picture); picture_Release(picture);
VLC_UNUSED(subpicture);
} }
/** /**
......
...@@ -56,7 +56,7 @@ vlc_module_end() ...@@ -56,7 +56,7 @@ vlc_module_end()
* Local prototypes * Local prototypes
*****************************************************************************/ *****************************************************************************/
static picture_pool_t *Pool (vout_display_t *, 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 int Control(vout_display_t *, int, va_list);
static void Manage (vout_display_t *); static void Manage (vout_display_t *);
...@@ -192,7 +192,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count) ...@@ -192,7 +192,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
return sys->pool; 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; vout_display_sys_t *sys = vd->sys;
...@@ -218,6 +218,7 @@ static void Display(vout_display_t *vd, picture_t *picture) ...@@ -218,6 +218,7 @@ static void Display(vout_display_t *vd, picture_t *picture)
primary->Flip(primary, NULL, 0); primary->Flip(primary, NULL, 0);
} }
picture_Release(picture); picture_Release(picture);
VLC_UNUSED(subpicture);
} }
static int Control(vout_display_t *vd, int query, va_list args) static int Control(vout_display_t *vd, int query, va_list args)
......
...@@ -318,19 +318,21 @@ static picture_pool_t *Pool (vout_display_t *vd, unsigned count) ...@@ -318,19 +318,21 @@ static picture_pool_t *Pool (vout_display_t *vd, unsigned count)
return sys->pool; 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_sys_t *sys = vd->sys;
vout_display_opengl_Prepare (&sys->vgl, pic); 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_sys_t *sys = vd->sys;
vout_display_opengl_Display (&sys->vgl, &vd->source); vout_display_opengl_Display (&sys->vgl, &vd->source);
picture_Release (pic); picture_Release (pic);
(void)subpicture;
} }
static int Control (vout_display_t *vd, int query, va_list ap) static int Control (vout_display_t *vd, int query, va_list ap)
......
...@@ -101,7 +101,7 @@ vlc_module_end () ...@@ -101,7 +101,7 @@ vlc_module_end ()
* Local prototypes * Local prototypes
*****************************************************************************/ *****************************************************************************/
static picture_pool_t *Pool (vout_display_t *, 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 int Control(vout_display_t *, int, va_list);
static void Manage (vout_display_t *); static void Manage (vout_display_t *);
...@@ -366,7 +366,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count) ...@@ -366,7 +366,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
} }
return sys->pool; 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; vout_display_sys_t *sys = vd->sys;
...@@ -391,6 +391,7 @@ static void Display(vout_display_t *vd, picture_t *picture) ...@@ -391,6 +391,7 @@ static void Display(vout_display_t *vd, picture_t *picture)
picture_Copy(sys->picture, picture); picture_Copy(sys->picture, picture);
picture_Release(picture); picture_Release(picture);
VLC_UNUSED(subpicture);
} }
static int Control(vout_display_t *vd, int query, va_list args) static int Control(vout_display_t *vd, int query, va_list args)
{ {
......
...@@ -50,8 +50,8 @@ static int Open(vlc_object_t *); ...@@ -50,8 +50,8 @@ static int Open(vlc_object_t *);
static void Close(vlc_object_t *); static void Close(vlc_object_t *);
static picture_pool_t *Pool(vout_display_t *vd, unsigned requested_count); static picture_pool_t *Pool(vout_display_t *vd, unsigned requested_count);
static void PictureRender(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); 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 Control (vout_display_t *vd, int query, va_list ap);
static int OpenglClean(vout_opengl_t *gl); static int OpenglClean(vout_opengl_t *gl);
...@@ -216,19 +216,21 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned requested_count) ...@@ -216,19 +216,21 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned requested_count)
return sys->pool; 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_sys_t *sys = vd->sys;
vout_display_opengl_Prepare( &sys->vgl, pic ); 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_sys_t *sys = vd->sys;
vout_display_opengl_Display(&sys->vgl, &vd->fmt ); vout_display_opengl_Display(&sys->vgl, &vd->fmt );
picture_Release (pic); picture_Release (pic);
sys->has_first_frame = true; sys->has_first_frame = true;
(void)subpicture;
} }
static int Control (vout_display_t *vd, int query, va_list ap) static int Control (vout_display_t *vd, int query, va_list ap)
......
...@@ -52,8 +52,8 @@ static int Open(vlc_object_t *); ...@@ -52,8 +52,8 @@ static int Open(vlc_object_t *);
static void Close(vlc_object_t *); static void Close(vlc_object_t *);
static picture_pool_t *Pool(vout_display_t *vd, unsigned requested_count); static picture_pool_t *Pool(vout_display_t *vd, unsigned requested_count);
static void PictureRender(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); 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 Control (vout_display_t *vd, int query, va_list ap);
static int OpenglLock(vout_opengl_t *gl); static int OpenglLock(vout_opengl_t *gl);
...@@ -261,15 +261,16 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned requested_count) ...@@ -261,15 +261,16 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned requested_count)
return sys->pool; 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_sys_t *sys = vd->sys;
vout_display_opengl_Prepare( &sys->vgl, pic ); 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_sys_t *sys = vd->sys;
[sys->glView setVoutFlushing:YES]; [sys->glView setVoutFlushing:YES];
...@@ -277,6 +278,7 @@ static void PictureDisplay(vout_display_t *vd, picture_t *pic) ...@@ -277,6 +278,7 @@ static void PictureDisplay(vout_display_t *vd, picture_t *pic)
[sys->glView setVoutFlushing:NO]; [sys->glView setVoutFlushing:NO];
picture_Release (pic); picture_Release (pic);
sys->has_first_frame = true; sys->has_first_frame = true;
(void)subpicture;
} }
static int Control (vout_display_t *vd, int query, va_list ap) static int Control (vout_display_t *vd, int query, va_list ap)
......
...@@ -71,8 +71,8 @@ vlc_module_end () ...@@ -71,8 +71,8 @@ vlc_module_end ()
* Local prototypes * Local prototypes
*****************************************************************************/ *****************************************************************************/
static picture_pool_t *Pool (vout_display_t *, unsigned); static picture_pool_t *Pool (vout_display_t *, unsigned);
static void Prepare(vout_display_t *, picture_t *); static void Prepare(vout_display_t *, picture_t *, subpicture_t *);
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 int Control(vout_display_t *, int, va_list);
static void Manage (vout_display_t *); static void Manage (vout_display_t *);
...@@ -205,7 +205,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count) ...@@ -205,7 +205,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
/** /**
* Performs set up of ID2D1Bitmap memory ready for blitting * 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; vout_display_sys_t *sys = vd->sys;
...@@ -224,12 +224,13 @@ static void Prepare(vout_display_t *vd, picture_t *picture) ...@@ -224,12 +224,13 @@ static void Prepare(vout_display_t *vd, picture_t *picture)
sys->d2_render_target, pitch, sys->d2_bitmap);*/ sys->d2_render_target, pitch, sys->d2_bitmap);*/
#endif #endif
} }
VLC_UNUSED(subpicture);
} }
/** /**
* Blits a scaled picture_t to the render target * 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; vout_display_sys_t *sys = vd->sys;
...@@ -260,6 +261,7 @@ static void Display(vout_display_t *vd, picture_t *picture) ...@@ -260,6 +261,7 @@ static void Display(vout_display_t *vd, picture_t *picture)
} }
picture_Release(picture); picture_Release(picture);
VLC_UNUSED(subpicture);
CommonDisplay(vd); CommonDisplay(vd);
} }
......
...@@ -93,8 +93,8 @@ struct picture_sys_t ...@@ -93,8 +93,8 @@ struct picture_sys_t
static int Open(vlc_object_t *); static int Open(vlc_object_t *);
static picture_pool_t *Pool (vout_display_t *, unsigned); static picture_pool_t *Pool (vout_display_t *, unsigned);
static void Prepare(vout_display_t *, picture_t *); static void Prepare(vout_display_t *, picture_t *, subpicture_t *subpicture);
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 int Control(vout_display_t *, int, va_list);
static void Manage (vout_display_t *); static void Manage (vout_display_t *);
...@@ -240,11 +240,12 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count) ...@@ -240,11 +240,12 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
static int Direct3DLockSurface(picture_t *); static int Direct3DLockSurface(picture_t *);
static void Direct3DUnlockSurface(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; LPDIRECT3DSURFACE9 surface = picture->p_sys->surface;
#if 0 #if 0
picture_Release(picture); picture_Release(picture);
VLC_UNUSED(subpicture);
Direct3DRenderScene(vd, surface); Direct3DRenderScene(vd, surface);
#else #else
/* FIXME it is a bit ugly, we need the surface to be unlocked for /* 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) ...@@ -256,10 +257,11 @@ static void Prepare(vout_display_t *vd, picture_t *picture)
Direct3DUnlockSurface(picture); Direct3DUnlockSurface(picture);
Direct3DRenderScene(vd, surface); Direct3DRenderScene(vd, surface);
VLC_UNUSED(subpicture);
#endif #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; vout_display_sys_t *sys = vd->sys;
LPDIRECT3DDEVICE9 d3ddev = sys->d3ddev; LPDIRECT3DDEVICE9 d3ddev = sys->d3ddev;
...@@ -275,10 +277,12 @@ static void Display(vout_display_t *vd, picture_t *picture) ...@@ -275,10 +277,12 @@ static void Display(vout_display_t *vd, picture_t *picture)
#if 0 #if 0
VLC_UNUSED(picture); VLC_UNUSED(picture);
VLC_UNUSED(subpicture);
#else #else
/* XXX See Prepare() */ /* XXX See Prepare() */
Direct3DLockSurface(picture); Direct3DLockSurface(picture);
picture_Release(picture); picture_Release(picture);
VLC_UNUSED(subpicture);
#endif #endif
CommonDisplay(vd); CommonDisplay(vd);
......
...@@ -135,7 +135,7 @@ DEFINE_GUID(IID_IDirectDraw2, 0xB3A6F3E0,0x2B43,0x11CF,0xA2,0xDE,0x00,0xAA,0x00, ...@@ -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); 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 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 int Control(vout_display_t *, int, va_list);
static void Manage (vout_display_t *); static void Manage (vout_display_t *);
...@@ -256,7 +256,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count) ...@@ -256,7 +256,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
VLC_UNUSED(count); VLC_UNUSED(count);
return vd->sys->pool; 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; vout_display_sys_t *sys = vd->sys;
...@@ -313,6 +313,7 @@ static void Display(vout_display_t *vd, picture_t *picture) ...@@ -313,6 +313,7 @@ static void Display(vout_display_t *vd, picture_t *picture)
CommonDisplay(vd); CommonDisplay(vd);
picture_Release(picture); picture_Release(picture);
VLC_UNUSED(subpicture);
} }
static int Control(vout_display_t *vd, int query, va_list args) static int Control(vout_display_t *vd, int query, va_list args)
{ {
......
...@@ -62,8 +62,8 @@ vlc_module_end() ...@@ -62,8 +62,8 @@ vlc_module_end()
* Local prototypes. * Local prototypes.
*****************************************************************************/ *****************************************************************************/
static picture_pool_t *Pool (vout_display_t *, unsigned); static picture_pool_t *Pool (vout_display_t *, unsigned);
static void Prepare(vout_display_t *, picture_t *); static void Prepare(vout_display_t *, picture_t *, subpicture_t *);
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 int Control(vout_display_t *, int, va_list);
static void Manage (vout_display_t *); static void Manage (vout_display_t *);
...@@ -175,20 +175,22 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count) ...@@ -175,20 +175,22 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
return sys->pool; 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_sys_t *sys = vd->sys;
vout_display_opengl_Prepare(&sys->vgl, picture); 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_sys_t *sys = vd->sys;
vout_display_opengl_Display(&sys->vgl, &vd->source); vout_display_opengl_Display(&sys->vgl, &vd->source);
picture_Release(picture); picture_Release(picture);
VLC_UNUSED(subpicture);
CommonDisplay(vd); CommonDisplay(vd);
} }
......
...@@ -70,7 +70,7 @@ vlc_module_end () ...@@ -70,7 +70,7 @@ vlc_module_end ()
* Local prototypes * Local prototypes
*****************************************************************************/ *****************************************************************************/
static picture_pool_t *Pool (vout_display_t *, 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 *subpicture);
static int Control(vout_display_t *, int, va_list); static int Control(vout_display_t *, int, va_list);
static void Manage (vout_display_t *); static void Manage (vout_display_t *);
...@@ -174,7 +174,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count) ...@@ -174,7 +174,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
VLC_UNUSED(count); VLC_UNUSED(count);
return vd->sys->pool; 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; vout_display_sys_t *sys = vd->sys;
...@@ -217,6 +217,7 @@ static void Display(vout_display_t *vd, picture_t *picture) ...@@ -217,6 +217,7 @@ static void Display(vout_display_t *vd, picture_t *picture)
#endif #endif
/* TODO */ /* TODO */
picture_Release(picture); picture_Release(picture);
VLC_UNUSED(subpicture);
CommonDisplay(vd); CommonDisplay(vd);
} }
......
...@@ -79,7 +79,7 @@ vlc_module_end() ...@@ -79,7 +79,7 @@ vlc_module_end()
* Local prototypes * Local prototypes
*****************************************************************************/ *****************************************************************************/
static picture_pool_t *Pool (vout_display_t *, unsigned); 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 int Control(vout_display_t *, int, va_list);
static void Manage(vout_display_t *); static void Manage(vout_display_t *);
...@@ -438,7 +438,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count) ...@@ -438,7 +438,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
/** /**
* Display a picture * 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; vout_display_sys_t *sys = vd->sys;
...@@ -457,6 +457,7 @@ static void PictureDisplay(vout_display_t *vd, picture_t *p_pic) ...@@ -457,6 +457,7 @@ static void PictureDisplay(vout_display_t *vd, picture_t *p_pic)
} }
picture_Release(p_pic); picture_Release(p_pic);
VLC_UNUSED(p_subpicture);
} }
......
...@@ -91,7 +91,7 @@ vlc_module_end () ...@@ -91,7 +91,7 @@ vlc_module_end ()
* Local prototypes * Local prototypes
*****************************************************************************/ *****************************************************************************/
static picture_pool_t *Pool (vout_display_t *, 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 int Control(vout_display_t *, int, va_list);
static void Manage (vout_display_t *); static void Manage (vout_display_t *);
...@@ -297,7 +297,7 @@ static mtime_t snapshot_GetMovietime(vout_display_t *vd) ...@@ -297,7 +297,7 @@ static mtime_t snapshot_GetMovietime(vout_display_t *vd)
return var_GetTime(sys->input, "time") / 1000; 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; vout_display_sys_t *sys = vd->sys;
......
...@@ -105,7 +105,7 @@ typedef unsigned (*vlc_format_cb)(void **, char *, unsigned *, unsigned *, ...@@ -105,7 +105,7 @@ typedef unsigned (*vlc_format_cb)(void **, char *, unsigned *, unsigned *,
unsigned *, unsigned *); unsigned *, unsigned *);
static picture_pool_t *Pool (vout_display_t *, 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 int Control(vout_display_t *, int, va_list);
static void Manage (vout_display_t *); static void Manage (vout_display_t *);
...@@ -296,7 +296,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count) ...@@ -296,7 +296,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
return sys->pool; 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; vout_display_sys_t *sys = vd->sys;
...@@ -304,6 +304,7 @@ static void Display(vout_display_t *vd, picture_t *picture) ...@@ -304,6 +304,7 @@ static void Display(vout_display_t *vd, picture_t *picture)
if (sys->display != NULL) if (sys->display != NULL)
sys->display(sys->opaque, picture->p_sys->id); sys->display(sys->opaque, picture->p_sys->id);
picture_Release(picture); picture_Release(picture);
VLC_UNUSED(subpicture);
} }
static int Control(vout_display_t *vd, int query, va_list args) static int Control(vout_display_t *vd, int query, va_list args)
......
...@@ -76,8 +76,8 @@ struct vout_display_sys_t ...@@ -76,8 +76,8 @@ struct vout_display_sys_t
}; };
static picture_pool_t *Pool (vout_display_t *, unsigned); static picture_pool_t *Pool (vout_display_t *, unsigned);
static void PictureRender (vout_display_t *, picture_t *); static void PictureRender (vout_display_t *, picture_t *, subpicture_t *);
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 int Control (vout_display_t *, int, va_list);
static void Manage (vout_display_t *); static void Manage (vout_display_t *);
...@@ -456,19 +456,21 @@ static picture_pool_t *Pool (vout_display_t *vd, unsigned requested_count) ...@@ -456,19 +456,21 @@ static picture_pool_t *Pool (vout_display_t *vd, unsigned requested_count)
return sys->pool; 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_sys_t *sys = vd->sys;
vout_display_opengl_Prepare (&sys->vgl, pic); 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_sys_t *sys = vd->sys;
vout_display_opengl_Display (&sys->vgl, &vd->source); vout_display_opengl_Display (&sys->vgl, &vd->source);
picture_Release (pic); picture_Release (pic);
(void)subpicture;
} }
static int Control (vout_display_t *vd, int query, va_list ap) static int Control (vout_display_t *vd, int query, va_list ap)
......
...@@ -81,7 +81,7 @@ struct vout_display_sys_t ...@@ -81,7 +81,7 @@ struct vout_display_sys_t
}; };
static picture_pool_t *Pool (vout_display_t *, 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 *subpicture);
static int Control (vout_display_t *, int, va_list); static int Control (vout_display_t *, int, va_list);
static void Manage (vout_display_t *); static void Manage (vout_display_t *);
...@@ -421,7 +421,7 @@ static picture_pool_t *Pool (vout_display_t *vd, unsigned requested_count) ...@@ -421,7 +421,7 @@ static picture_pool_t *Pool (vout_display_t *vd, unsigned requested_count)
/** /**
* Sends an image to the X server. * 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; vout_display_sys_t *p_sys = vd->sys;
xcb_shm_seg_t segment = pic->p_sys->segment; xcb_shm_seg_t segment = pic->p_sys->segment;
...@@ -467,6 +467,7 @@ static void Display (vout_display_t *vd, picture_t *pic) ...@@ -467,6 +467,7 @@ static void Display (vout_display_t *vd, picture_t *pic)
* vout_display wrapper. */ * vout_display wrapper. */
out: out:
picture_Release (pic); picture_Release (pic);
(void)subpicture;
} }
static int Control (vout_display_t *vd, int query, va_list ap) static int Control (vout_display_t *vd, int query, va_list ap)
......
...@@ -96,7 +96,7 @@ struct vout_display_sys_t ...@@ -96,7 +96,7 @@ struct vout_display_sys_t
}; };
static picture_pool_t *Pool (vout_display_t *, 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 *subpicture);
static int Control (vout_display_t *, int, va_list); static int Control (vout_display_t *, int, va_list);
static void Manage (vout_display_t *); static void Manage (vout_display_t *);
...@@ -680,7 +680,7 @@ static picture_pool_t *Pool (vout_display_t *vd, unsigned requested_count) ...@@ -680,7 +680,7 @@ static picture_pool_t *Pool (vout_display_t *vd, unsigned requested_count)
/** /**
* Sends an image to the X server. * 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; vout_display_sys_t *p_sys = vd->sys;
xcb_shm_seg_t segment = pic->p_sys->segment; xcb_shm_seg_t segment = pic->p_sys->segment;
...@@ -719,6 +719,7 @@ static void Display (vout_display_t *vd, picture_t *pic) ...@@ -719,6 +719,7 @@ static void Display (vout_display_t *vd, picture_t *pic)
} }
out: out:
picture_Release (pic); picture_Release (pic);
(void)subpicture;
} }
static int Control (vout_display_t *vd, int query, va_list ap) static int Control (vout_display_t *vd, int query, va_list ap)
......
...@@ -81,7 +81,7 @@ static const char *const ppsz_vout_options[] = { ...@@ -81,7 +81,7 @@ static const char *const ppsz_vout_options[] = {
/* */ /* */
static picture_pool_t *Pool (vout_display_t *, 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 *subpicture);
static int Control(vout_display_t *, int, va_list); static int Control(vout_display_t *, int, va_list);
static void Manage (vout_display_t *); static void Manage (vout_display_t *);
...@@ -197,7 +197,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count) ...@@ -197,7 +197,7 @@ static picture_pool_t *Pool(vout_display_t *vd, unsigned count)
return sys->pool; 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; vout_display_sys_t *sys = vd->sys;
...@@ -260,6 +260,7 @@ static void Display(vout_display_t *vd, picture_t *picture) ...@@ -260,6 +260,7 @@ static void Display(vout_display_t *vd, picture_t *picture)
/* */ /* */
picture_Release(picture); picture_Release(picture);
VLC_UNUSED(subpicture);
} }
static int Control(vout_display_t *vd, int query, va_list args) static int Control(vout_display_t *vd, int query, va_list args)
......
...@@ -115,6 +115,7 @@ static vout_display_t *vout_display_New(vlc_object_t *obj, ...@@ -115,6 +115,7 @@ static vout_display_t *vout_display_New(vlc_object_t *obj,
vd->info.has_hide_mouse = false; vd->info.has_hide_mouse = false;
vd->info.has_pictures_invalid = false; vd->info.has_pictures_invalid = false;
vd->info.has_event_thread = false; vd->info.has_event_thread = false;
vd->info.subpicture_chromas = NULL;
vd->cfg = cfg; vd->cfg = cfg;
vd->pool = NULL; vd->pool = NULL;
...@@ -1431,11 +1432,14 @@ static picture_pool_t *SplitterPool(vout_display_t *vd, unsigned count) ...@@ -1431,11 +1432,14 @@ static picture_pool_t *SplitterPool(vout_display_t *vd, unsigned count)
sys->pool = picture_pool_NewFromFormat(&vd->fmt, count); sys->pool = picture_pool_NewFromFormat(&vd->fmt, count);
return sys->pool; 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; vout_display_sys_t *sys = vd->sys;
picture_Hold(picture); picture_Hold(picture);
assert(!subpicture);
if (video_splitter_Filter(sys->splitter, sys->picture, picture)) { if (video_splitter_Filter(sys->splitter, sys->picture, picture)) {
for (int i = 0; i < sys->count; i++) for (int i = 0; i < sys->count; i++)
...@@ -1448,16 +1452,19 @@ static void SplitterPrepare(vout_display_t *vd, picture_t *picture) ...@@ -1448,16 +1452,19 @@ static void SplitterPrepare(vout_display_t *vd, picture_t *picture)
if (vout_IsDisplayFiltered(sys->display[i])) if (vout_IsDisplayFiltered(sys->display[i]))
sys->picture[i] = vout_FilterDisplay(sys->display[i], sys->picture[i]); sys->picture[i] = vout_FilterDisplay(sys->display[i], sys->picture[i]);
if (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; vout_display_sys_t *sys = vd->sys;
assert(!subpicture);
for (int i = 0; i < sys->count; i++) { for (int i = 0; i < sys->count; i++) {
if (sys->picture[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); picture_Release(picture);
} }
......
...@@ -956,7 +956,7 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced) ...@@ -956,7 +956,7 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced)
vout_snapshot_Set(&vout->p->snapshot, &vd->source, direct); vout_snapshot_Set(&vout->p->snapshot, &vd->source, direct);
/* Render the direct buffer returned by vout_RenderPicture */ /* Render the direct buffer returned by vout_RenderPicture */
vout_RenderWrapper(vout, direct); vout_RenderWrapper(vout, direct, NULL);
vout_chrono_Stop(&vout->p->render); vout_chrono_Stop(&vout->p->render);
#if 0 #if 0
...@@ -980,7 +980,7 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced) ...@@ -980,7 +980,7 @@ static int ThreadDisplayRenderPicture(vout_thread_t *vout, bool is_forced)
/* Display the direct buffer returned by vout_RenderPicture */ /* Display the direct buffer returned by vout_RenderPicture */
vout->p->displayed.date = mdate(); vout->p->displayed.date = mdate();
vout_DisplayWrapper(vout, direct); vout_DisplayWrapper(vout, direct, NULL);
vout_statistic_Update(&vout->p->statistic, 1, 0); vout_statistic_Update(&vout->p->statistic, 1, 0);
......
...@@ -161,8 +161,8 @@ void vout_CloseWrapper(vout_thread_t *, vout_display_state_t *); ...@@ -161,8 +161,8 @@ void vout_CloseWrapper(vout_thread_t *, vout_display_state_t *);
int vout_InitWrapper(vout_thread_t *); int vout_InitWrapper(vout_thread_t *);
void vout_EndWrapper(vout_thread_t *); void vout_EndWrapper(vout_thread_t *);
void vout_ManageWrapper(vout_thread_t *); void vout_ManageWrapper(vout_thread_t *);
void vout_RenderWrapper(vout_thread_t *, picture_t *); void vout_RenderWrapper(vout_thread_t *, picture_t *, subpicture_t *);
void vout_DisplayWrapper(vout_thread_t *, picture_t *); void vout_DisplayWrapper(vout_thread_t *, picture_t *, subpicture_t *);
/* */ /* */
int spu_ProcessMouse(spu_t *, const vlc_mouse_t *, const video_format_t *); int spu_ProcessMouse(spu_t *, const vlc_mouse_t *, const video_format_t *);
......
...@@ -207,7 +207,8 @@ void vout_ManageWrapper(vout_thread_t *vout) ...@@ -207,7 +207,8 @@ void vout_ManageWrapper(vout_thread_t *vout)
/***************************************************************************** /*****************************************************************************
* Render * 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_thread_sys_t *sys = vout->p;
vout_display_t *vd = sys->display.vd; vout_display_t *vd = sys->display.vd;
...@@ -216,24 +217,28 @@ void vout_RenderWrapper(vout_thread_t *vout, picture_t *picture) ...@@ -216,24 +217,28 @@ void vout_RenderWrapper(vout_thread_t *vout, picture_t *picture)
vout_UpdateDisplaySourceProperties(vd, &picture->format); vout_UpdateDisplaySourceProperties(vd, &picture->format);
if (sys->display.use_dr) { if (sys->display.use_dr) {
vout_display_Prepare(vd, picture); vout_display_Prepare(vd, picture, subpicture);
} else { } else {
sys->display.filtered = vout_FilterDisplay(vd, picture); sys->display.filtered = vout_FilterDisplay(vd, picture);
if (sys->display.filtered) 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_thread_sys_t *sys = vout->p;
vout_display_t *vd = sys->display.vd; vout_display_t *vd = sys->display.vd;
vout_display_Display(vd, sys->display.filtered ? sys->display.filtered : picture); vout_display_Display(vd,
sys->display.filtered = NULL; sys->display.filtered ? sys->display.filtered
: picture,
subpicture);
sys->display.filtered = NULL;
} }
#ifdef WIN32 #ifdef WIN32
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment