static bool reparse_cmdline(struct vo *vo, char *args) { struct gl_priv *p = vo->priv; int r = 0; struct gl_priv *opts = p; if (strcmp(args, "-") == 0) { opts = p->original_opts; } else { r = m_config_parse_suboptions(vo->config, "opengl", args); } gl_video_set_options(p->renderer, opts->renderer_opts); get_and_update_icc_profile(p); gl_video_configure_queue(p->renderer, p->vo); p->vo->want_redraw = true; return r >= 0; }
static int control(struct vo *vo, uint32_t request, void *data) { struct gl_priv *p = vo->priv; switch (request) { case VOCTRL_GET_PANSCAN: return VO_TRUE; case VOCTRL_SET_PANSCAN: resize(p); return VO_TRUE; case VOCTRL_GET_EQUALIZER: { struct voctrl_get_equalizer_args *args = data; struct mp_csp_equalizer *eq = gl_video_eq_ptr(p->renderer); bool r = mp_csp_equalizer_get(eq, args->name, args->valueptr) >= 0; return r ? VO_TRUE : VO_NOTIMPL; } case VOCTRL_SET_EQUALIZER: { struct voctrl_set_equalizer_args *args = data; struct mp_csp_equalizer *eq = gl_video_eq_ptr(p->renderer); if (mp_csp_equalizer_set(eq, args->name, args->value) >= 0) { gl_video_eq_update(p->renderer); vo->want_redraw = true; return VO_TRUE; } return VO_NOTIMPL; } case VOCTRL_SCREENSHOT_WIN: { struct mp_image *screen = gl_read_window_contents(p->gl); // set image parameters according to the display, if possible if (screen) { screen->params.primaries = p->renderer_opts->target_prim; screen->params.gamma = p->renderer_opts->target_trc; if (p->glctx->flip_v) mp_image_vflip(screen); } *(struct mp_image **)data = screen; return true; } case VOCTRL_LOAD_HWDEC_API: request_hwdec_api(vo, data); return true; case VOCTRL_SET_COMMAND_LINE: { char *arg = data; return reparse_cmdline(p, arg); } case VOCTRL_RESET: gl_video_reset(p->renderer); return true; case VOCTRL_PAUSE: if (gl_video_showing_interpolated_frame(p->renderer)) { vo->want_redraw = true; vo_wakeup(vo); } return true; } int events = 0; int r = mpgl_control(p->glctx, &events, request, data); if (events & VO_EVENT_ICC_PROFILE_CHANGED) { get_and_update_icc_profile(p, &events); vo->want_redraw = true; } if (events & VO_EVENT_AMBIENT_LIGHTING_CHANGED) { get_and_update_ambient_lighting(p, &events); vo->want_redraw = true; } if (events & VO_EVENT_RESIZE) resize(p); if (events & VO_EVENT_EXPOSE) vo->want_redraw = true; vo_event(vo, events); return r; }
static int preinit(struct vo *vo) { struct gl_priv *p = vo->priv; p->vo = vo; p->log = vo->log; int vo_flags = 0; if (p->renderer_opts->alpha_mode == 1) vo_flags |= VOFLAG_ALPHA; if (p->use_gl_debug) vo_flags |= VOFLAG_GL_DEBUG; if (p->es == 1) vo_flags |= VOFLAG_GLES; if (p->es == -1) vo_flags |= VOFLAG_NO_GLES; if (p->allow_sw) vo_flags |= VOFLAG_SW; p->glctx = mpgl_init(vo, p->backend, vo_flags); if (!p->glctx) goto err_out; p->gl = p->glctx->gl; p->glctx->dwm_flush_opt = p->dwm_flush; if (p->gl->SwapInterval) { p->gl->SwapInterval(p->swap_interval); } else { MP_VERBOSE(vo, "swap_control extension missing.\n"); } p->renderer = gl_video_init(p->gl, vo->log, vo->global); if (!p->renderer) goto err_out; gl_video_set_osd_source(p->renderer, vo->osd); gl_video_set_options(p->renderer, p->renderer_opts); gl_video_configure_queue(p->renderer, vo); get_and_update_icc_profile(p); vo->hwdec_devs = hwdec_devices_create(); hwdec_devices_set_loader(vo->hwdec_devs, call_request_hwdec_api, vo); int hwdec = vo->opts->hwdec_preload_api; if (hwdec == HWDEC_NONE) hwdec = vo->global->opts->hwdec_api; if (hwdec != HWDEC_NONE) { p->hwdec = gl_hwdec_load_api(p->vo->log, p->gl, vo->global, vo->hwdec_devs, hwdec); gl_video_set_hwdec(p->renderer, p->hwdec); } p->original_opts = m_sub_options_copy(p, &opengl_conf, p); return 0; err_out: uninit(vo); return -1; }