summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorwm4 <wm4@mplayer2.org>2011-10-26 15:19:58 +0200
committerwm4 <wm4@mplayer2.org>2012-03-17 20:58:16 +0100
commit83889cebbc78e4a9087d95633ded1d65d5690c24 (patch)
treecbe7d7c3afec4cd49085af8c11d3dc21bd4f35dc
parentfdc8b0451c831addb5441d01b366e34ab3abdf28 (diff)
downloadmpv-83889cebbc78e4a9087d95633ded1d65d5690c24.tar.bz2
mpv-83889cebbc78e4a9087d95633ded1d65d5690c24.tar.xz
vo_direct3d: don't framestep when paused and OSD is updated
The required feature for this, VOCTRL_REDRAW_OSD, was unimplemented for unknown reasons. It is trivial to add. There is still a weird issue when switching the fullscreen state while paused. I have no idea why this happens. The contents of the video should survive the window reconfiguration (at least we don't free it), and we explicitly redraw the screen after fullscreen.
-rw-r--r--libvo/vo_direct3d.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/libvo/vo_direct3d.c b/libvo/vo_direct3d.c
index 4955c91afe..218dd761df 100644
--- a/libvo/vo_direct3d.c
+++ b/libvo/vo_direct3d.c
@@ -590,11 +590,13 @@ static void uninit_d3d(void)
priv->d3d_handle = NULL;
}
+static uint32_t d3d_draw_frame(void);
+
/** @brief Render a frame on the screen.
* @param mpi mpi structure with the decoded frame inside
* @return VO_TRUE on success, VO_ERROR on failure
*/
-static uint32_t render_d3d_frame(mp_image_t *mpi)
+static uint32_t d3d_upload_and_render_frame(mp_image_t *mpi)
{
/* Uncomment when direct rendering is implemented.
* if (mpi->flags & MP_IMGFLAG_DIRECT) ...
@@ -626,13 +628,18 @@ static uint32_t render_d3d_frame(mp_image_t *mpi)
mpi->height, priv->locked_rect.Pitch, mpi->stride[0]);
skip_upload:
- /* This unlock is used for both slice_draw path and render_d3d_frame path. */
+ /* This unlock is used for both slice_draw path and DRAW_IMAGE path. */
if (FAILED(IDirect3DSurface9_UnlockRect(priv->d3d_surface))) {
mp_msg(MSGT_VO, MSGL_V, "<vo_direct3d>Surface unlock failed.\n");
return VO_ERROR;
}
priv->locked_rect.pBits = NULL;
+ return d3d_draw_frame();
+}
+
+static uint32_t d3d_draw_frame(void)
+{
if (FAILED(IDirect3DDevice9_BeginScene(priv->d3d_device))) {
mp_msg(MSGT_VO, MSGL_ERR, "<vo_direct3d>BeginScene failed.\n");
return VO_ERROR;
@@ -816,7 +823,14 @@ err_out:
return -1;
}
-
+static void full_redraw(void)
+{
+ priv->is_clear_needed = 1;
+ d3d_draw_frame();
+ draw_osd();
+ draw_eosd();
+ flip_page();
+}
/** @brief libvo Callback: Handle control requests.
* @return VO_TRUE on success, VO_NOTIMPL when not implemented
@@ -831,10 +845,11 @@ static int control(uint32_t request, void *data)
"<vo_direct3d>Direct Rendering request. Not implemented yet.\n");
return VO_NOTIMPL;
case VOCTRL_DRAW_IMAGE:
- return render_d3d_frame(data);
+ return d3d_upload_and_render_frame(data);
case VOCTRL_FULLSCREEN:
vo_w32_fullscreen();
resize_d3d();
+ full_redraw();
return VO_TRUE;
case VOCTRL_RESET:
return VO_NOTIMPL;
@@ -844,6 +859,10 @@ static int control(uint32_t request, void *data)
case VOCTRL_RESUME:
priv->is_paused = 0;
return VO_TRUE;
+ case VOCTRL_REDRAW_FRAME:
+ priv->is_clear_needed = 1;
+ d3d_draw_frame();
+ return VO_TRUE;
case VOCTRL_SET_EQUALIZER:
return VO_NOTIMPL;
case VOCTRL_GET_EQUALIZER: