diff options
Diffstat (limited to 'libvo')
-rw-r--r-- | libvo/video_out.c | 19 | ||||
-rw-r--r-- | libvo/video_out.h | 4 | ||||
-rw-r--r-- | libvo/vo_gl.c | 8 | ||||
-rw-r--r-- | libvo/vo_vdpau.c | 5 | ||||
-rw-r--r-- | libvo/vo_xv.c | 46 |
5 files changed, 40 insertions, 42 deletions
diff --git a/libvo/video_out.c b/libvo/video_out.c index 82cf0dbbfe..0b1f7d1fab 100644 --- a/libvo/video_out.c +++ b/libvo/video_out.c @@ -285,6 +285,17 @@ int vo_draw_image(struct vo *vo, struct mp_image *mpi, double pts) return 0; } +int vo_redraw_frame(struct vo *vo) +{ + if (!vo->config_ok) + return -1; + if (vo_control(vo, VOCTRL_REDRAW_FRAME, NULL) == true) { + vo->redrawing = true; + return 0; + } + return -1; +} + int vo_get_buffered_frame(struct vo *vo, bool eof) { if (!vo->config_ok) @@ -339,8 +350,11 @@ void vo_flip_page(struct vo *vo, unsigned int pts_us, int duration) { if (!vo->config_ok) return; - vo->frame_loaded = false; - vo->next_pts = MP_NOPTS_VALUE; + if (!vo->redrawing) { + vo->frame_loaded = false; + vo->next_pts = MP_NOPTS_VALUE; + } + vo->redrawing = false; if (vo->driver->flip_page_timed) vo->driver->flip_page_timed(vo, pts_us, duration); else @@ -486,6 +500,7 @@ int vo_config(struct vo *vo, uint32_t width, uint32_t height, } vo->frame_loaded = false; vo->waiting_mpi = NULL; + vo->redrawing = false; return ret; } diff --git a/libvo/video_out.h b/libvo/video_out.h index a710f7de4a..032a32b1cc 100644 --- a/libvo/video_out.h +++ b/libvo/video_out.h @@ -65,7 +65,7 @@ enum mp_voctrl { VOCTRL_NEWFRAME, VOCTRL_SKIPFRAME, - VOCTRL_REDRAW_OSD, + VOCTRL_REDRAW_FRAME, VOCTRL_ONTOP, VOCTRL_ROOTWIN, @@ -263,6 +263,7 @@ struct vo { struct mp_image *waiting_mpi; double next_pts; // pts value of the next frame if any double next_pts2; // optional pts of frame after that + bool redrawing; // between redrawing frame and flipping it double flip_queue_offset; // queue flip events at most this much in advance @@ -306,6 +307,7 @@ void list_video_out(void); int vo_control(struct vo *vo, uint32_t request, void *data); int vo_draw_image(struct vo *vo, struct mp_image *mpi, double pts); +int vo_redraw_frame(struct vo *vo); int vo_get_buffered_frame(struct vo *vo, bool eof); void vo_skip_frame(struct vo *vo); int vo_draw_frame(struct vo *vo, uint8_t *src[]); diff --git a/libvo/vo_gl.c b/libvo/vo_gl.c index b38a8d75e4..ec6e6573e6 100644 --- a/libvo/vo_gl.c +++ b/libvo/vo_gl.c @@ -1506,14 +1506,10 @@ static int control(struct vo *vo, uint32_t request, void *data) break; p->glctx->update_xinerama_info(vo); return VO_TRUE; - case VOCTRL_REDRAW_OSD: + case VOCTRL_REDRAW_FRAME: if (vo_doublebuffering) do_render(vo); - draw_osd(vo, data); - if (vo_doublebuffering) - do_render_osd(vo, 2); - flip_page(vo); - return VO_TRUE; + return true; case VOCTRL_SCREENSHOT: { struct voctrl_screenshot_args *args = data; if (args->full_window) diff --git a/libvo/vo_vdpau.c b/libvo/vo_vdpau.c index f087f6cf38..bb82b7613d 100644 --- a/libvo/vo_vdpau.c +++ b/libvo/vo_vdpau.c @@ -1872,11 +1872,8 @@ static int control(struct vo *vo, uint32_t request, void *data) case VOCTRL_SKIPFRAME: vc->deint_queue_pos = next_deint_queue_pos(vo, true); return true; - case VOCTRL_REDRAW_OSD: + case VOCTRL_REDRAW_FRAME: video_to_output_surface(vo); - draw_eosd(vo); - draw_osd(vo, data); - flip_page_timed(vo, 0, -1); return true; case VOCTRL_RESET: forget_frames(vo); diff --git a/libvo/vo_xv.c b/libvo/vo_xv.c index 694dbc048a..4d1a354937 100644 --- a/libvo/vo_xv.c +++ b/libvo/vo_xv.c @@ -89,10 +89,8 @@ struct xvctx { int current_ip_buf; int num_buffers; int total_buffers; - int have_visible_image_copy; - int have_next_image_copy; - int unchanged_visible_image; - int unchanged_next_image; + bool have_image_copy; + bool unchanged_image; int visible_buf; XvImage *xvimage[NUM_BUFFERS + 1]; uint32_t image_width; @@ -227,8 +225,7 @@ static int config(struct vo *vo, uint32_t width, uint32_t height, } ctx->visible_buf = -1; - ctx->have_visible_image_copy = false; - ctx->have_next_image_copy = false; + ctx->have_image_copy = false; /* check image formats */ ctx->xv_format = 0; @@ -447,26 +444,21 @@ static void draw_osd(struct vo *vo, struct osd_state *osd) vo->panscan_x), ctx->image_height, ctx->draw_alpha_fnc, vo); if (ctx->osd_objects_drawn) - ctx->unchanged_next_image = false; + ctx->unchanged_image = false; } -static int redraw_osd(struct vo *vo, struct osd_state *osd) +static int redraw_frame(struct vo *vo) { struct xvctx *ctx = vo->priv; - if (ctx->have_visible_image_copy) + if (ctx->have_image_copy) copy_backup_image(vo, ctx->visible_buf, ctx->num_buffers); - else if (ctx->unchanged_visible_image) { + else if (ctx->unchanged_image) { copy_backup_image(vo, ctx->num_buffers, ctx->visible_buf); - ctx->have_visible_image_copy = true; - } - else + ctx->have_image_copy = true; + } else return false; - int temp = ctx->current_buf; ctx->current_buf = ctx->visible_buf; - draw_osd(vo, osd); - ctx->current_buf = temp; - put_xvimage(vo, ctx->xvimage[ctx->visible_buf]); return true; } @@ -478,11 +470,6 @@ static void flip_page(struct vo *vo) /* remember the currently visible buffer */ ctx->visible_buf = ctx->current_buf; - ctx->have_visible_image_copy = ctx->have_next_image_copy; - ctx->have_next_image_copy = false; - ctx->unchanged_visible_image = ctx->unchanged_next_image; - ctx->unchanged_next_image = false; - if (ctx->num_buffers > 1) { ctx->current_buf = vo_directrendering ? 0 : ((ctx->current_buf + 1) % ctx->num_buffers); @@ -525,11 +512,12 @@ static int draw_slice(struct vo *vo, uint8_t *image[], int stride[], int w, return 0; } -static mp_image_t *get_screenshot(struct vo *vo) { +static mp_image_t *get_screenshot(struct vo *vo) +{ struct xvctx *ctx = vo->priv; // try to get an image without OSD - if (ctx->have_visible_image_copy) + if (ctx->have_image_copy) copy_backup_image(vo, ctx->visible_buf, ctx->num_buffers); XvImage *xv_image = ctx->xvimage[ctx->visible_buf]; @@ -571,7 +559,7 @@ static uint32_t draw_image(struct vo *vo, mp_image_t *mpi) { struct xvctx *ctx = vo->priv; - ctx->have_next_image_copy = false; + ctx->have_image_copy = false; if (mpi->flags & MP_IMGFLAG_DIRECT) // direct rendering: @@ -591,9 +579,9 @@ static uint32_t draw_image(struct vo *vo, mp_image_t *mpi) if (ctx->is_paused) { copy_backup_image(vo, ctx->num_buffers, ctx->current_buf); - ctx->have_next_image_copy = true; + ctx->have_image_copy = true; } - ctx->unchanged_next_image = true; + ctx->unchanged_image = true; return true; } @@ -873,8 +861,8 @@ static int control(struct vo *vo, uint32_t request, void *data) case VOCTRL_UPDATE_SCREENINFO: update_xinerama_info(vo); return VO_TRUE; - case VOCTRL_REDRAW_OSD: - return redraw_osd(vo, data); + case VOCTRL_REDRAW_FRAME: + return redraw_frame(vo); case VOCTRL_SCREENSHOT: { struct voctrl_screenshot_args *args = data; args->out_image = get_screenshot(vo); |