// Send a VCTRL, or if it doesn't work, translate it to a VOCTRL and try the VO. int video_vf_vo_control(struct dec_video *d_video, int vf_cmd, void *data) { if (d_video->vfilter && d_video->vfilter->initialized > 0) { int r = vf_control_any(d_video->vfilter, vf_cmd, data); if (r != CONTROL_UNKNOWN) return r; } switch (vf_cmd) { case VFCTRL_GET_DEINTERLACE: return vo_control(d_video->vo, VOCTRL_GET_DEINTERLACE, data) == VO_TRUE; case VFCTRL_SET_DEINTERLACE: return vo_control(d_video->vo, VOCTRL_SET_DEINTERLACE, data) == VO_TRUE; case VFCTRL_SET_EQUALIZER: { vf_equalizer_t *eq = data; if (!d_video->vo->config_ok) return CONTROL_FALSE; // vo not configured? struct voctrl_set_equalizer_args param = { eq->item, eq->value }; return vo_control(d_video->vo, VOCTRL_SET_EQUALIZER, ¶m) == VO_TRUE; } case VFCTRL_GET_EQUALIZER: { vf_equalizer_t *eq = data; if (!d_video->vo->config_ok) return CONTROL_FALSE; // vo not configured? struct voctrl_get_equalizer_args param = { eq->item, &eq->value }; return vo_control(d_video->vo, VOCTRL_GET_EQUALIZER, ¶m) == VO_TRUE; } } return CONTROL_UNKNOWN; }
static void recreate_video_filters(struct MPContext *mpctx) { struct MPOpts *opts = mpctx->opts; struct dec_video *d_video = mpctx->d_video; assert(d_video); vf_destroy(d_video->vfilter); d_video->vfilter = vf_new(mpctx->global); d_video->vfilter->hwdec = &d_video->hwdec_info; vf_append_filter_list(d_video->vfilter, opts->vf_settings); // for vf_sub vf_control_any(d_video->vfilter, VFCTRL_SET_OSD_OBJ, mpctx->osd); osd_set_render_subs_in_filter(mpctx->osd, vf_control_any(d_video->vfilter, VFCTRL_INIT_OSD, NULL) == CONTROL_OK); set_allowed_vo_formats(d_video->vfilter, mpctx->video_out); }
static void recreate_video_filters(struct MPContext *mpctx) { struct MPOpts *opts = mpctx->opts; struct dec_video *d_video = mpctx->d_video; assert(d_video); vf_destroy(d_video->vfilter); d_video->vfilter = vf_new(mpctx->global); d_video->vfilter->hwdec = d_video->hwdec_info; d_video->vfilter->wakeup_callback = wakeup_playloop; d_video->vfilter->wakeup_callback_ctx = mpctx; d_video->vfilter->container_fps = d_video->fps; vo_control(mpctx->video_out, VOCTRL_GET_DISPLAY_FPS, &d_video->vfilter->display_fps); vf_append_filter_list(d_video->vfilter, opts->vf_settings); // for vf_sub vf_control_any(d_video->vfilter, VFCTRL_SET_OSD_OBJ, mpctx->osd); osd_set_render_subs_in_filter(mpctx->osd, vf_control_any(d_video->vfilter, VFCTRL_INIT_OSD, NULL) == CONTROL_OK); set_allowed_vo_formats(d_video->vfilter, mpctx->video_out); }