void eosd_ass_init(ASS_Library *ass_library) { ass_renderer = ass_renderer_init(ass_library); if (!ass_renderer) return; ass_configure_fonts(ass_renderer); if (!eosd_registered(&eosd_ass)) eosd_register(&eosd_ass); }
static int control(struct vf_instance_s* vf, int request, void* data) { switch(request){ case VFCTRL_GET_DEINTERLACE: { if(!video_out) return CONTROL_FALSE; // vo not configured? return(video_out->control(VOCTRL_GET_DEINTERLACE, data) == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE; } case VFCTRL_SET_DEINTERLACE: { if(!video_out) return CONTROL_FALSE; // vo not configured? return(video_out->control(VOCTRL_SET_DEINTERLACE, data) == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE; } case VFCTRL_DRAW_OSD: if(!vo_config_count) return CONTROL_FALSE; // vo not configured? video_out->draw_osd(); return CONTROL_TRUE; case VFCTRL_FLIP_PAGE: { if(!vo_config_count) return CONTROL_FALSE; // vo not configured? video_out->flip_page(); return CONTROL_TRUE; } case VFCTRL_SET_EQUALIZER: { vf_equalizer_t *eq=data; if(!vo_config_count) return CONTROL_FALSE; // vo not configured? return((video_out->control(VOCTRL_SET_EQUALIZER, eq->item, eq->value) == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE); } case VFCTRL_GET_EQUALIZER: { vf_equalizer_t *eq=data; if(!vo_config_count) return CONTROL_FALSE; // vo not configured? return((video_out->control(VOCTRL_GET_EQUALIZER, eq->item, &eq->value) == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE); } #ifdef USE_ASS case VFCTRL_INIT_EOSD: { vf->priv->ass_priv = ass_renderer_init((ass_library_t*)data); if (!vf->priv->ass_priv) return CONTROL_FALSE; ass_configure_fonts(vf->priv->ass_priv); vf->priv->prev_visibility = 0; return CONTROL_TRUE; } case VFCTRL_DRAW_EOSD: { mp_eosd_images_t images = {NULL, 2}; double pts = vf->priv->pts; if (!vo_config_count || !vf->priv->ass_priv) return CONTROL_FALSE; if (sub_visibility && vf->priv->ass_priv && ass_track && (pts != MP_NOPTS_VALUE)) { mp_eosd_res_t res; memset(&res, 0, sizeof(res)); if (video_out->control(VOCTRL_GET_EOSD_RES, &res) == VO_TRUE) { ass_set_frame_size(vf->priv->ass_priv, res.w, res.h); ass_set_margins(vf->priv->ass_priv, res.mt, res.mb, res.ml, res.mr); ass_set_aspect_ratio(vf->priv->ass_priv, (double)res.w / res.h); } images.imgs = ass_render_frame(vf->priv->ass_priv, ass_track, (pts+sub_delay) * 1000 + .5, &images.changed); if (!vf->priv->prev_visibility) images.changed = 2; vf->priv->prev_visibility = 1; } else vf->priv->prev_visibility = 0; vf->priv->prev_visibility = sub_visibility; return (video_out->control(VOCTRL_DRAW_EOSD, &images) == VO_TRUE) ? CONTROL_TRUE : CONTROL_FALSE; } #endif case VFCTRL_GET_PTS: { *(double *)data = vf->priv->pts; return CONTROL_TRUE; } } // return video_out->control(request,data); return CONTROL_UNKNOWN; }