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
} }