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 {
* 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);
......
......@@ -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);
}
/**
......
......@@ -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));
......
......@@ -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);
}
/**
......
......@@ -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);
}
/**
......
......@@ -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)
......
......@@ -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)
......
......@@ -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)
{
......
......@@ -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)
......
......@@ -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)
......
......@@ -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);
}
......
......@@ -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);
......
......@@ -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)
{
......
......@@ -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);
}
......
......@@ -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);
}
......
......@@ -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);
}
......
......@@ -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;
......
......@@ -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)
......
......@@ -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)
......
......@@ -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)
......
......@@ -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)
......
......@@ -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)
......
......@@ -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);
}
......
......@@ -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);
......
......@@ -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 *);
......
......@@ -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
......
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