summaryrefslogtreecommitdiffstats
path: root/video/out
diff options
context:
space:
mode:
Diffstat (limited to 'video/out')
-rw-r--r--video/out/vo.c15
-rw-r--r--video/out/vo.h16
-rw-r--r--video/out/vo_caca.c8
-rw-r--r--video/out/vo_direct3d.c21
-rw-r--r--video/out/vo_image.c17
-rw-r--r--video/out/vo_null.c5
-rw-r--r--video/out/vo_sdl.c19
-rw-r--r--video/out/vo_tct.c11
-rw-r--r--video/out/vo_vaapi.c12
-rw-r--r--video/out/vo_x11.c35
-rw-r--r--video/out/vo_xv.c25
11 files changed, 58 insertions, 126 deletions
diff --git a/video/out/vo.c b/video/out/vo.c
index da655c47a2..84a900af5b 100644
--- a/video/out/vo.c
+++ b/video/out/vo.c
@@ -968,11 +968,7 @@ static bool render_frame(struct vo *vo)
stats_time_start(in->stats, "video-draw");
- if (vo->driver->draw_frame) {
- vo->driver->draw_frame(vo, frame);
- } else {
- vo->driver->draw_image(vo, mp_image_new_ref(frame->current));
- }
+ vo->driver->draw_frame(vo, frame);
stats_time_end(in->stats, "video-draw");
@@ -1065,14 +1061,7 @@ static void do_redraw(struct vo *vo)
frame->duration = -1;
pthread_mutex_unlock(&in->lock);
- if (vo->driver->draw_frame) {
- vo->driver->draw_frame(vo, frame);
- } else if ((full_redraw || vo->driver->control(vo, VOCTRL_REDRAW_FRAME, NULL) < 1)
- && frame->current)
- {
- vo->driver->draw_image(vo, mp_image_new_ref(frame->current));
- }
-
+ vo->driver->draw_frame(vo, frame);
vo->driver->flip_page(vo);
if (frame != &dummy)
diff --git a/video/out/vo.h b/video/out/vo.h
index c2d2044bce..e11c23a60a 100644
--- a/video/out/vo.h
+++ b/video/out/vo.h
@@ -78,11 +78,6 @@ enum mp_voctrl {
/* private to vo_gpu */
VOCTRL_LOAD_HWDEC_API,
- // Redraw the image previously passed to draw_image() (basically, repeat
- // the previous draw_image call). If this is handled, the OSD should also
- // be updated and redrawn. Optional; emulated if not available.
- VOCTRL_REDRAW_FRAME,
-
// Only used internally in vo_libmpv
VOCTRL_PREINIT,
VOCTRL_UNINIT,
@@ -383,17 +378,6 @@ struct vo_driver {
struct mp_image *(*get_image_ts)(struct vo *vo, int imgfmt, int w, int h,
int stride_align, int flags);
- /*
- * Render the given frame to the VO's backbuffer. This operation will be
- * followed by a draw_osd and a flip_page[_timed] call.
- * mpi belongs to the VO; the VO must free it eventually.
- *
- * This also should draw the OSD.
- *
- * Deprecated for draw_frame. A VO should have only either callback set.
- */
- void (*draw_image)(struct vo *vo, struct mp_image *mpi);
-
/* Render the given frame. Note that this is also called when repeating
* or redrawing frames.
*
diff --git a/video/out/vo_caca.c b/video/out/vo_caca.c
index 697d0d3f37..0625de0e5f 100644
--- a/video/out/vo_caca.c
+++ b/video/out/vo_caca.c
@@ -111,13 +111,15 @@ static int reconfig(struct vo *vo, struct mp_image_params *params)
return resize(vo);
}
-static void draw_image(struct vo *vo, mp_image_t *mpi)
+static void draw_frame(struct vo *vo, struct vo_frame *frame)
{
struct priv *priv = vo->priv;
+ struct mp_image *mpi = frame->current;
+ if (!mpi)
+ return;
memcpy_pic(priv->dither_buffer, mpi->planes[0], priv->image_width * depth, priv->image_height,
priv->image_width * depth, mpi->stride[0]);
caca_dither_bitmap(priv->canvas, 0, 0, priv->screen_w, priv->screen_h, priv->dither, priv->dither_buffer);
- talloc_free(mpi);
}
static void flip_page(struct vo *vo)
@@ -305,7 +307,7 @@ const struct vo_driver video_out_caca = {
.query_format = query_format,
.reconfig = reconfig,
.control = control,
- .draw_image = draw_image,
+ .draw_frame = draw_frame,
.flip_page = flip_page,
.uninit = uninit,
.priv_size = sizeof(struct priv),
diff --git a/video/out/vo_direct3d.c b/video/out/vo_direct3d.c
index 1c78cebbc6..af17b4cf59 100644
--- a/video/out/vo_direct3d.c
+++ b/video/out/vo_direct3d.c
@@ -850,9 +850,6 @@ static int control(struct vo *vo, uint32_t request, void *data)
d3d_priv *priv = vo->priv;
switch (request) {
- case VOCTRL_REDRAW_FRAME:
- d3d_draw_frame(priv);
- return VO_TRUE;
case VOCTRL_SET_PANSCAN:
calc_fs_rect(priv);
priv->vo->want_redraw = true;
@@ -993,27 +990,27 @@ static bool get_video_buffer(d3d_priv *priv, struct mp_image *out)
return true;
}
-static void draw_image(struct vo *vo, mp_image_t *mpi)
+static void draw_frame(struct vo *vo, struct vo_frame *frame)
{
d3d_priv *priv = vo->priv;
if (!priv->d3d_device)
- goto done;
+ return;
struct mp_image buffer;
if (!get_video_buffer(priv, &buffer))
- goto done;
+ return;
- mp_image_copy(&buffer, mpi);
+ if (!frame->current)
+ return;
+
+ mp_image_copy(&buffer, frame->current);
d3d_unlock_video_objects(priv);
priv->have_image = true;
- priv->osd_pts = mpi->pts;
+ priv->osd_pts = frame->current->pts;
d3d_draw_frame(priv);
-
-done:
- talloc_free(mpi);
}
static mp_image_t *get_window_screenshot(d3d_priv *priv)
@@ -1242,7 +1239,7 @@ const struct vo_driver video_out_direct3d = {
.query_format = query_format,
.reconfig = reconfig,
.control = control,
- .draw_image = draw_image,
+ .draw_frame = draw_frame,
.flip_page = flip_page,
.uninit = uninit,
.priv_size = sizeof(d3d_priv),
diff --git a/video/out/vo_image.c b/video/out/vo_image.c
index aece3e069b..cc48ab3404 100644
--- a/video/out/vo_image.c
+++ b/video/out/vo_image.c
@@ -87,20 +87,19 @@ static bool checked_mkdir(struct vo *vo, const char *buf)
static int reconfig(struct vo *vo, struct mp_image_params *params)
{
- struct priv *p = vo->priv;
- mp_image_unrefp(&p->current);
-
return 0;
}
-static void draw_image(struct vo *vo, mp_image_t *mpi)
+static void draw_frame(struct vo *vo, struct vo_frame *frame)
{
struct priv *p = vo->priv;
+ if (!frame->current)
+ return;
- p->current = mpi;
+ p->current = frame->current;
struct mp_osd_res dim = osd_res_from_image_params(vo->params);
- osd_draw_on_image(vo->osd, dim, mpi->pts, OSD_DRAW_SUB_ONLY, p->current);
+ osd_draw_on_image(vo->osd, dim, frame->current->pts, OSD_DRAW_SUB_ONLY, p->current);
}
static void flip_page(struct vo *vo)
@@ -122,7 +121,6 @@ static void flip_page(struct vo *vo)
write_image(p->current, p->opts->opts, filename, vo->global, vo->log);
talloc_free(t);
- mp_image_unrefp(&p->current);
}
static int query_format(struct vo *vo, int fmt)
@@ -134,9 +132,6 @@ static int query_format(struct vo *vo, int fmt)
static void uninit(struct vo *vo)
{
- struct priv *p = vo->priv;
-
- mp_image_unrefp(&p->current);
}
static int preinit(struct vo *vo)
@@ -163,7 +158,7 @@ const struct vo_driver video_out_image =
.query_format = query_format,
.reconfig = reconfig,
.control = control,
- .draw_image = draw_image,
+ .draw_frame = draw_frame,
.flip_page = flip_page,
.uninit = uninit,
.global_opts = &vo_image_conf,
diff --git a/video/out/vo_null.c b/video/out/vo_null.c
index 430cd8d12b..2aa46f785f 100644
--- a/video/out/vo_null.c
+++ b/video/out/vo_null.c
@@ -32,9 +32,8 @@ struct priv {
double cfg_fps;
};
-static void draw_image(struct vo *vo, mp_image_t *mpi)
+static void draw_frame(struct vo *vo, struct vo_frame *frame)
{
- talloc_free(mpi);
}
static void flip_page(struct vo *vo)
@@ -93,7 +92,7 @@ const struct vo_driver video_out_null = {
.query_format = query_format,
.reconfig = reconfig,
.control = control,
- .draw_image = draw_image,
+ .draw_frame = draw_frame,
.flip_page = flip_page,
.uninit = uninit,
.priv_size = sizeof(struct priv),
diff --git a/video/out/vo_sdl.c b/video/out/vo_sdl.c
index 4e2c20a681..b5e3d5b041 100644
--- a/video/out/vo_sdl.c
+++ b/video/out/vo_sdl.c
@@ -869,7 +869,7 @@ static int query_format(struct vo *vo, int format)
return 0;
}
-static void draw_image(struct vo *vo, mp_image_t *mpi)
+static void draw_frame(struct vo *vo, struct vo_frame *frame)
{
struct priv *vc = vo->priv;
@@ -879,20 +879,16 @@ static void draw_image(struct vo *vo, mp_image_t *mpi)
SDL_SetTextureBlendMode(vc->tex, SDL_BLENDMODE_NONE);
- if (mpi) {
- vc->osd_pts = mpi->pts;
+ if (frame->current) {
+ vc->osd_pts = frame->current->pts;
mp_image_t texmpi;
- if (!lock_texture(vo, &texmpi)) {
- talloc_free(mpi);
+ if (!lock_texture(vo, &texmpi))
return;
- }
- mp_image_copy(&texmpi, mpi);
+ mp_image_copy(&texmpi, frame->current);
SDL_UnlockTexture(vc->tex);
-
- talloc_free(mpi);
}
SDL_Rect src, dst;
@@ -940,9 +936,6 @@ static int control(struct vo *vo, uint32_t request, void *data)
}
return 1;
}
- case VOCTRL_REDRAW_FRAME:
- draw_image(vo, NULL);
- return 1;
case VOCTRL_SET_PANSCAN:
force_resize(vo);
return VO_TRUE;
@@ -987,7 +980,7 @@ const struct vo_driver video_out_sdl = {
.query_format = query_format,
.reconfig = reconfig,
.control = control,
- .draw_image = draw_image,
+ .draw_frame = draw_frame,
.uninit = uninit,
.flip_page = flip_page,
.wait_events = wait_events,
diff --git a/video/out/vo_tct.c b/video/out/vo_tct.c
index af7c7ffd48..8859095fa3 100644
--- a/video/out/vo_tct.c
+++ b/video/out/vo_tct.c
@@ -242,13 +242,14 @@ static int reconfig(struct vo *vo, struct mp_image_params *params)
return 0;
}
-static void draw_image(struct vo *vo, mp_image_t *mpi)
+static void draw_frame(struct vo *vo, struct vo_frame *frame)
{
struct priv *p = vo->priv;
- struct mp_image src = *mpi;
+ struct mp_image *src = frame->current;
+ if (!src)
+ return;
// XXX: pan, crop etc.
- mp_sws_scale(p->sws, p->frame, &src);
- talloc_free(mpi);
+ mp_sws_scale(p->sws, p->frame, src);
}
static void flip_page(struct vo *vo)
@@ -326,7 +327,7 @@ const struct vo_driver video_out_tct = {
.query_format = query_format,
.reconfig = reconfig,
.control = control,
- .draw_image = draw_image,
+ .draw_frame = draw_frame,
.flip_page = flip_page,
.uninit = uninit,
.priv_size = sizeof(struct priv),
diff --git a/video/out/vo_vaapi.c b/video/out/vo_vaapi.c
index 4cc6ded00f..12888fefe9 100644
--- a/video/out/vo_vaapi.c
+++ b/video/out/vo_vaapi.c
@@ -563,11 +563,12 @@ static void get_vsync(struct vo *vo, struct vo_vsync_info *info)
present_sync_get_info(x11->present, info);
}
-static void draw_image(struct vo *vo, struct mp_image *mpi)
+static void draw_frame(struct vo *vo, struct vo_frame *frame)
{
struct priv *p = vo->priv;
+ struct mp_image *mpi = frame->current;
- if (mpi->imgfmt != IMGFMT_VAAPI) {
+ if (mpi && mpi->imgfmt != IMGFMT_VAAPI) {
struct mp_image *dst = p->swdec_surfaces[p->output_surface];
if (!dst || va_surface_upload(p, dst, mpi) < 0) {
MP_WARN(vo, "Could not upload surface.\n");
@@ -575,7 +576,6 @@ static void draw_image(struct vo *vo, struct mp_image *mpi)
return;
}
mp_image_copy_attributes(dst, mpi);
- talloc_free(mpi);
mpi = mp_image_new_ref(dst);
}
@@ -715,10 +715,6 @@ static int control(struct vo *vo, uint32_t request, void *data)
struct priv *p = vo->priv;
switch (request) {
- case VOCTRL_REDRAW_FRAME:
- p->output_surface = p->visible_surface;
- draw_osd(vo);
- return true;
case VOCTRL_SET_PANSCAN:
resize(p);
return VO_TRUE;
@@ -858,7 +854,7 @@ const struct vo_driver video_out_vaapi = {
.query_format = query_format,
.reconfig = reconfig,
.control = control,
- .draw_image = draw_image,
+ .draw_frame = draw_frame,
.flip_page = flip_page,
.get_vsync = get_vsync,
.wakeup = vo_x11_wakeup,
diff --git a/video/out/vo_x11.c b/video/out/vo_x11.c
index 3579a3034b..9775b23948 100644
--- a/video/out/vo_x11.c
+++ b/video/out/vo_x11.c
@@ -168,10 +168,6 @@ static void freeMyXImage(struct priv *p, int foo)
static int reconfig(struct vo *vo, struct mp_image_params *fmt)
{
- struct priv *p = vo->priv;
-
- mp_image_unrefp(&p->original_image);
-
vo_x11_config_vo_window(vo);
if (!resize(vo))
@@ -327,8 +323,7 @@ static void get_vsync(struct vo *vo, struct vo_vsync_info *info)
present_sync_get_info(x11->present, info);
}
-// Note: REDRAW_FRAME can call this with NULL.
-static void draw_image(struct vo *vo, mp_image_t *mpi)
+static void draw_frame(struct vo *vo, struct vo_frame *frame)
{
struct priv *p = vo->priv;
@@ -339,29 +334,27 @@ static void draw_image(struct vo *vo, mp_image_t *mpi)
struct mp_image *img = &p->mp_ximages[p->current_buf];
- if (mpi) {
+ if (frame->current) {
mp_image_clear_rc_inv(img, p->dst);
- struct mp_image src = *mpi;
+ struct mp_image *src = frame->current;
struct mp_rect src_rc = p->src;
- src_rc.x0 = MP_ALIGN_DOWN(src_rc.x0, src.fmt.align_x);
- src_rc.y0 = MP_ALIGN_DOWN(src_rc.y0, src.fmt.align_y);
- mp_image_crop_rc(&src, src_rc);
+ src_rc.x0 = MP_ALIGN_DOWN(src_rc.x0, src->fmt.align_x);
+ src_rc.y0 = MP_ALIGN_DOWN(src_rc.y0, src->fmt.align_y);
+ mp_image_crop_rc(src, src_rc);
struct mp_image dst = *img;
mp_image_crop_rc(&dst, p->dst);
- mp_sws_scale(p->sws, &dst, &src);
+ mp_sws_scale(p->sws, &dst, src);
} else {
mp_image_clear(img, 0, 0, img->w, img->h);
}
- osd_draw_on_image(vo->osd, p->osd, mpi ? mpi->pts : 0, 0, img);
+ osd_draw_on_image(vo->osd, p->osd, frame->current ? frame->current->pts : 0, 0, img);
- if (mpi != p->original_image) {
- talloc_free(p->original_image);
- p->original_image = mpi;
- }
+ if (frame->current != p->original_image)
+ p->original_image = frame->current;
}
static int query_format(struct vo *vo, int format)
@@ -382,8 +375,6 @@ static void uninit(struct vo *vo)
if (p->gc)
XFreeGC(vo->x11->display, p->gc);
- talloc_free(p->original_image);
-
vo_x11_uninit(vo);
}
@@ -424,15 +415,11 @@ error:
static int control(struct vo *vo, uint32_t request, void *data)
{
- struct priv *p = vo->priv;
switch (request) {
case VOCTRL_SET_PANSCAN:
if (vo->config_ok)
resize(vo);
return VO_TRUE;
- case VOCTRL_REDRAW_FRAME:
- draw_image(vo, p->original_image);
- return true;
}
int events = 0;
@@ -451,7 +438,7 @@ const struct vo_driver video_out_x11 = {
.query_format = query_format,
.reconfig = reconfig,
.control = control,
- .draw_image = draw_image,
+ .draw_frame = draw_frame,
.flip_page = flip_page,
.get_vsync = get_vsync,
.wakeup = vo_x11_wakeup,
diff --git a/video/out/vo_xv.c b/video/out/vo_xv.c
index 9445979cd9..22bce03770 100644
--- a/video/out/vo_xv.c
+++ b/video/out/vo_xv.c
@@ -465,8 +465,6 @@ static int reconfig(struct vo *vo, struct mp_image_params *params)
struct xvctx *ctx = vo->priv;
int i;
- mp_image_unrefp(&ctx->original_image);
-
ctx->image_height = params->h;
ctx->image_width = params->w;
ctx->image_format = params->imgfmt;
@@ -702,8 +700,7 @@ static void get_vsync(struct vo *vo, struct vo_vsync_info *info)
present_sync_get_info(x11->present, info);
}
-// Note: REDRAW_FRAME can call this with NULL.
-static void draw_image(struct vo *vo, mp_image_t *mpi)
+static void draw_frame(struct vo *vo, struct vo_frame *frame)
{
struct xvctx *ctx = vo->priv;
@@ -713,19 +710,17 @@ static void draw_image(struct vo *vo, mp_image_t *mpi)
return;
struct mp_image xv_buffer = get_xv_buffer(vo, ctx->current_buf);
- if (mpi) {
- mp_image_copy(&xv_buffer, mpi);
+ if (frame->current) {
+ mp_image_copy(&xv_buffer, frame->current);
} else {
mp_image_clear(&xv_buffer, 0, 0, xv_buffer.w, xv_buffer.h);
}
struct mp_osd_res res = osd_res_from_image_params(vo->params);
- osd_draw_on_image(vo->osd, res, mpi ? mpi->pts : 0, 0, &xv_buffer);
+ osd_draw_on_image(vo->osd, res, frame->current ? frame->current->pts : 0, 0, &xv_buffer);
- if (mpi != ctx->original_image) {
- talloc_free(ctx->original_image);
- ctx->original_image = mpi;
- }
+ if (frame->current != ctx->original_image)
+ ctx->original_image = frame->current;
}
static int query_format(struct vo *vo, int format)
@@ -748,8 +743,6 @@ static void uninit(struct vo *vo)
struct xvctx *ctx = vo->priv;
int i;
- talloc_free(ctx->original_image);
-
if (ctx->ai)
XvFreeAdaptorInfo(ctx->ai);
ctx->ai = NULL;
@@ -872,14 +865,10 @@ static int preinit(struct vo *vo)
static int control(struct vo *vo, uint32_t request, void *data)
{
- struct xvctx *ctx = vo->priv;
switch (request) {
case VOCTRL_SET_PANSCAN:
resize(vo);
return VO_TRUE;
- case VOCTRL_REDRAW_FRAME:
- draw_image(vo, ctx->original_image);
- return true;
}
int events = 0;
int r = vo_x11_control(vo, &events, request, data);
@@ -898,7 +887,7 @@ const struct vo_driver video_out_xv = {
.query_format = query_format,
.reconfig = reconfig,
.control = control,
- .draw_image = draw_image,
+ .draw_frame = draw_frame,
.flip_page = flip_page,
.get_vsync = get_vsync,
.wakeup = vo_x11_wakeup,