From 65f2c6c71676e4359d313ecf27744e525b662134 Mon Sep 17 00:00:00 2001 From: wm4 Date: Wed, 31 Dec 2014 19:12:44 +0100 Subject: vo_opengl_cb: pass context directly This is simpler than setting the context after VO creation, which requires the code to check for the context on every entrypoint. --- player/video.c | 4 +- video/out/vo.h | 3 +- video/out/vo_opengl_cb.c | 98 ++++++++++++++++++++---------------------------- 3 files changed, 43 insertions(+), 62 deletions(-) diff --git a/player/video.c b/player/video.c index 3c46bb0ce8..f9a6a1c9a0 100644 --- a/player/video.c +++ b/player/video.c @@ -269,6 +269,7 @@ int reinit_video_chain(struct MPContext *mpctx) .input_ctx = mpctx->input, .osd = mpctx->osd, .encode_lavc_ctx = mpctx->encode_lavc_ctx, + .opengl_cb_context = mpctx->gl_cb_ctx, }; mpctx->video_out = init_best_video_out(mpctx->global, &ex); if (!mpctx->video_out) { @@ -278,9 +279,6 @@ int reinit_video_chain(struct MPContext *mpctx) goto err_out; } mpctx->mouse_cursor_visible = true; - - vo_control(mpctx->video_out, VOCTRL_SET_LIBMPV_OPENGL_CB_CONTEXT, - mpctx->gl_cb_ctx); } update_window_title(mpctx, true); diff --git a/video/out/vo.h b/video/out/vo.h index 60982c9d65..3d4d654738 100644 --- a/video/out/vo.h +++ b/video/out/vo.h @@ -105,8 +105,6 @@ enum mp_voctrl { VOCTRL_GET_RECENT_FLIP_TIME, // int64_t* (using mp_time_us()) VOCTRL_GET_PREF_DEINT, // int* - - VOCTRL_SET_LIBMPV_OPENGL_CB_CONTEXT,// struct mpv_opengl_cb_context* }; // VOCTRL_SET_EQUALIZER @@ -169,6 +167,7 @@ struct vo_extra { struct input_ctx *input_ctx; struct osd_state *osd; struct encode_lavc_context *encode_lavc_ctx; + struct mpv_opengl_cb_context *opengl_cb_context; }; struct vo_driver { diff --git a/video/out/vo_opengl_cb.c b/video/out/vo_opengl_cb.c index f431880ecb..d2d4221e94 100644 --- a/video/out/vo_opengl_cb.c +++ b/video/out/vo_opengl_cb.c @@ -236,26 +236,24 @@ int mpv_opengl_cb_render(struct mpv_opengl_cb_context *ctx, int fbo, int vp[4]) static void draw_image(struct vo *vo, mp_image_t *mpi) { struct vo_priv *p = vo->priv; - if (p->ctx) { - pthread_mutex_lock(&p->ctx->lock); - mp_image_setrefp(&p->ctx->waiting_frame, mpi); - pthread_mutex_unlock(&p->ctx->lock); - } + + pthread_mutex_lock(&p->ctx->lock); + mp_image_setrefp(&p->ctx->waiting_frame, mpi); talloc_free(mpi); + pthread_mutex_unlock(&p->ctx->lock); } static void flip_page(struct vo *vo) { struct vo_priv *p = vo->priv; - if (p->ctx) { - pthread_mutex_lock(&p->ctx->lock); - mp_image_unrefp(&p->ctx->next_frame); - p->ctx->next_frame = p->ctx->waiting_frame; - p->ctx->waiting_frame = NULL; - if (p->ctx->update_cb) - p->ctx->update_cb(p->ctx->update_cb_ctx); - pthread_mutex_unlock(&p->ctx->lock); - } + + pthread_mutex_lock(&p->ctx->lock); + mp_image_unrefp(&p->ctx->next_frame); + p->ctx->next_frame = p->ctx->waiting_frame; + p->ctx->waiting_frame = NULL; + if (p->ctx->update_cb) + p->ctx->update_cb(p->ctx->update_cb_ctx); + pthread_mutex_unlock(&p->ctx->lock); } static int query_format(struct vo *vo, uint32_t format) @@ -263,12 +261,10 @@ static int query_format(struct vo *vo, uint32_t format) struct vo_priv *p = vo->priv; bool ok = false; - if (p->ctx) { - pthread_mutex_lock(&p->ctx->lock); - if (format >= IMGFMT_START && format < IMGFMT_END) - ok = p->ctx->imgfmt_supported[format - IMGFMT_START]; - pthread_mutex_unlock(&p->ctx->lock); - } + pthread_mutex_lock(&p->ctx->lock); + if (format >= IMGFMT_START && format < IMGFMT_END) + ok = p->ctx->imgfmt_supported[format - IMGFMT_START]; + pthread_mutex_unlock(&p->ctx->lock); return ok ? VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW : 0; } @@ -276,15 +272,11 @@ static int reconfig(struct vo *vo, struct mp_image_params *params, int flags) { struct vo_priv *p = vo->priv; - if (p->ctx) { - pthread_mutex_lock(&p->ctx->lock); - mp_image_unrefp(&p->ctx->next_frame); - p->ctx->img_params = *params; - p->ctx->reconfigured = true; - pthread_mutex_unlock(&p->ctx->lock); - } else { - return -1; - } + pthread_mutex_lock(&p->ctx->lock); + mp_image_unrefp(&p->ctx->next_frame); + p->ctx->img_params = *params; + p->ctx->reconfigured = true; + pthread_mutex_unlock(&p->ctx->lock); return 0; } @@ -294,25 +286,6 @@ static int control(struct vo *vo, uint32_t request, void *data) struct vo_priv *p = vo->priv; switch (request) { - case VOCTRL_SET_LIBMPV_OPENGL_CB_CONTEXT: { - if (p->ctx) - return VO_FALSE; - struct mpv_opengl_cb_context *nctx = data; - if (nctx) { - pthread_mutex_lock(&nctx->lock); - if (nctx->active) { - MP_FATAL(vo, "There is already a VO using the OpenGL context.\n"); - } else { - nctx->active = vo; - nctx->reconfigured = true; - p->ctx = nctx; - assert(vo->osd == p->ctx->osd); - copy_vo_opts(vo); - } - pthread_mutex_unlock(&nctx->lock); - } - return VO_TRUE; - } case VOCTRL_GET_PANSCAN: return VO_TRUE; case VOCTRL_SET_PANSCAN: @@ -341,21 +314,32 @@ static void uninit(struct vo *vo) { struct vo_priv *p = vo->priv; - if (p->ctx) { - pthread_mutex_lock(&p->ctx->lock); - mp_image_unrefp(&p->ctx->next_frame); - mp_image_unrefp(&p->ctx->waiting_frame); - p->ctx->img_params = (struct mp_image_params){0}; - p->ctx->reconfigured = true; - p->ctx->active = NULL; - pthread_mutex_unlock(&p->ctx->lock); - } + pthread_mutex_lock(&p->ctx->lock); + mp_image_unrefp(&p->ctx->next_frame); + mp_image_unrefp(&p->ctx->waiting_frame); + p->ctx->img_params = (struct mp_image_params){0}; + p->ctx->reconfigured = true; + p->ctx->active = NULL; + pthread_mutex_unlock(&p->ctx->lock); } static int preinit(struct vo *vo) { struct vo_priv *p = vo->priv; p->vo = vo; + p->ctx = vo->extra.opengl_cb_context; + if (!p->ctx) { + MP_FATAL(vo, "No context set.\n"); + return -1; + } + + pthread_mutex_lock(&p->ctx->lock); + p->ctx->active = vo; + p->ctx->reconfigured = true; + assert(vo->osd == p->ctx->osd); + copy_vo_opts(vo); + pthread_mutex_unlock(&p->ctx->lock); + return 0; } -- cgit v1.2.3