static void draw_image(struct vo *vo, mp_image_t *mpi) { struct gl_priv *p = vo->priv; if (p->vo_flipped) mp_image_vflip(mpi); mpgl_lock(p->glctx); gl_video_upload_image(p->renderer, mpi); gl_video_render_frame(p->renderer); mpgl_unlock(p->glctx); }
int mpv_opengl_cb_render(struct mpv_opengl_cb_context *ctx, int fbo, int vp[4]) { assert(ctx->renderer); gl_video_set_gl_state(ctx->renderer); pthread_mutex_lock(&ctx->lock); struct vo *vo = ctx->active; ctx->force_update |= ctx->reconfigured; int h = vp[3]; bool flip = h < 0 && h > INT_MIN; if (flip) h = -h; struct mp_rect wnd = {vp[0], vp[1], vp[0] + vp[2], vp[1] + h}; if (wnd.x0 != ctx->wnd.x0 || wnd.y0 != ctx->wnd.y0 || wnd.x1 != ctx->wnd.x1 || wnd.y1 != ctx->wnd.y1 || ctx->flip != flip) ctx->force_update = true; if (ctx->force_update && vo) { ctx->force_update = false; ctx->wnd = wnd; struct mp_rect src, dst; struct mp_osd_res osd; mp_get_src_dst_rects(ctx->log, &ctx->vo_opts, vo->driver->caps, &ctx->img_params, wnd.x1 - wnd.x0, wnd.y1 - wnd.y0, 1.0, &src, &dst, &osd); gl_video_resize(ctx->renderer, &wnd, &src, &dst, &osd, !ctx->flip); } if (vo) { struct vo_priv *p = vo->priv; if (ctx->reconfigured) gl_video_config(ctx->renderer, &ctx->img_params); if (ctx->reconfigured || ctx->update_new_opts) { struct vo_priv *opts = p->ctx->new_opts ? p->ctx->new_opts : p; gl_video_set_options(ctx->renderer, opts->renderer_opts); ctx->gl->debug_context = opts->use_gl_debug; gl_video_set_debug(ctx->renderer, opts->use_gl_debug); } ctx->reconfigured = false; ctx->update_new_opts = false; } struct mp_image *mpi = ctx->next_frame; ctx->next_frame = NULL; pthread_mutex_unlock(&ctx->lock); if (mpi) gl_video_upload_image(ctx->renderer, mpi); gl_video_render_frame(ctx->renderer, fbo); gl_video_unset_gl_state(ctx->renderer); return 0; }
int mpv_opengl_cb_render(struct mpv_opengl_cb_context *ctx, int fbo, int vp[4]) { assert(ctx->renderer); gl_video_set_gl_state(ctx->renderer); pthread_mutex_lock(&ctx->lock); struct vo *vo = ctx->active; ctx->force_update |= ctx->reconfigured; int vp_w = vp[2], vp_h = vp[3]; if (ctx->vp_w != vp_w || ctx->vp_h != vp_h) ctx->force_update = true; if (ctx->force_update && vo) { ctx->force_update = false; ctx->vp_w = vp_w; ctx->vp_h = vp_h; struct mp_rect src, dst; struct mp_osd_res osd; mp_get_src_dst_rects(ctx->log, &ctx->vo_opts, vo->driver->caps, &ctx->img_params, vp_w, abs(vp_h), 1.0, &src, &dst, &osd); gl_video_resize(ctx->renderer, vp_w, vp_h, &src, &dst, &osd); } if (ctx->reconfigured) { gl_video_set_osd_source(ctx->renderer, vo ? vo->osd : NULL); gl_video_config(ctx->renderer, &ctx->img_params); } if (ctx->update_new_opts) { struct vo_priv *p = vo ? vo->priv : NULL; struct vo_priv *opts = ctx->new_opts ? ctx->new_opts : p; if (opts) { gl_video_set_options(ctx->renderer, opts->renderer_opts, NULL); ctx->gl->debug_context = opts->use_gl_debug; gl_video_set_debug(ctx->renderer, opts->use_gl_debug); frame_queue_shrink(ctx, opts->frame_queue_size); } } ctx->reconfigured = false; ctx->update_new_opts = false; struct mp_csp_equalizer *eq = gl_video_eq_ptr(ctx->renderer); if (ctx->eq_changed) { memcpy(eq->values, ctx->eq.values, sizeof(eq->values)); gl_video_eq_update(ctx->renderer); } ctx->eq_changed = false; ctx->eq = *eq; struct mp_image *mpi = frame_queue_pop(ctx); pthread_mutex_unlock(&ctx->lock); if (mpi) gl_video_upload_image(ctx->renderer, mpi); gl_video_render_frame(ctx->renderer, fbo, NULL); gl_video_unset_gl_state(ctx->renderer); pthread_mutex_lock(&ctx->lock); const int left = ctx->queued_frames; if (vo && left > 0) update(vo->priv); pthread_mutex_unlock(&ctx->lock); return left; }