static int DeinterlaceCallback(vlc_object_t *object, char const *cmd, vlc_value_t oldval, vlc_value_t newval, void *data) { VLC_UNUSED(cmd); VLC_UNUSED(oldval); VLC_UNUSED(newval); VLC_UNUSED(data); vout_thread_t *vout = (vout_thread_t *)object; /* */ const int deinterlace_state = var_GetInteger(vout, "deinterlace"); char *mode = var_GetString(vout, "deinterlace-mode"); const bool is_needed = var_GetBool(vout, "deinterlace-needed"); if (!mode || !DeinterlaceIsModeValid(mode)) return VLC_EGENERIC; /* */ char *old = var_CreateGetString(vout, "sout-deinterlace-mode"); var_SetString(vout, "sout-deinterlace-mode", mode); msg_Dbg(vout, "deinterlace %d, mode %s, is_needed %d", deinterlace_state, mode, is_needed); if (deinterlace_state == 0 || (deinterlace_state == -1 && !is_needed)) DeinterlaceRemove(vout); else if (!DeinterlaceIsPresent(vout)) DeinterlaceAdd(vout); else if (old && strcmp(old, mode)) var_TriggerCallback(vout, "video-filter"); /* */ free(old); free(mode); return VLC_SUCCESS; }
static int DeinterlaceCallback(vlc_object_t *object, char const *cmd, vlc_value_t oldval, vlc_value_t newval, void *data) { VLC_UNUSED(cmd); VLC_UNUSED(oldval); VLC_UNUSED(newval); VLC_UNUSED(data); vout_thread_t *vout = (vout_thread_t *)object; /* */ const int deinterlace_state = var_GetInteger(vout, "deinterlace"); char *mode = var_GetString(vout, "deinterlace-mode"); const bool is_needed = var_GetBool(vout, "deinterlace-needed"); if (!mode || !DeinterlaceIsModeValid(mode)) { free(mode); return VLC_EGENERIC; } /* */ char *old = var_CreateGetString(vout, "sout-deinterlace-mode"); var_SetString(vout, "sout-deinterlace-mode", mode); msg_Dbg(vout, "deinterlace %d, mode %s, is_needed %d", deinterlace_state, mode, is_needed); if (deinterlace_state == 0 || (deinterlace_state < 0 && !is_needed)) vout_control_PushBool(&vout->p->control, VOUT_CONTROL_CHANGE_INTERLACE, false); else vout_control_PushBool(&vout->p->control, VOUT_CONTROL_CHANGE_INTERLACE, true); /* */ free(old); free(mode); return VLC_SUCCESS; }
void vout_InitInterlacingSupport(vout_thread_t *vout, bool is_interlaced) { vlc_value_t val, text; msg_Dbg(vout, "Deinterlacing available"); /* Create the configuration variables */ /* */ var_Create(vout, "deinterlace", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT | VLC_VAR_HASCHOICE); int deinterlace_state = var_GetInteger(vout, "deinterlace"); deinterlace_state = __MAX(__MIN(deinterlace_state, 1), -1); text.psz_string = _("Deinterlace"); var_Change(vout, "deinterlace", VLC_VAR_SETTEXT, &text, NULL); const module_config_t *optd = config_FindConfig(VLC_OBJECT(vout), "deinterlace"); var_Change(vout, "deinterlace", VLC_VAR_CLEARCHOICES, NULL, NULL); for (int i = 0; optd && i < optd->i_list; i++) { val.i_int = optd->pi_list[i]; text.psz_string = (char*)vlc_gettext(optd->ppsz_list_text[i]); var_Change(vout, "deinterlace", VLC_VAR_ADDCHOICE, &val, &text); } var_AddCallback(vout, "deinterlace", DeinterlaceCallback, NULL); /* */ var_Create(vout, "deinterlace-mode", VLC_VAR_STRING | VLC_VAR_DOINHERIT | VLC_VAR_HASCHOICE); char *deinterlace_mode = var_GetNonEmptyString(vout, "deinterlace-mode"); text.psz_string = _("Deinterlace mode"); var_Change(vout, "deinterlace-mode", VLC_VAR_SETTEXT, &text, NULL); const module_config_t *optm = config_FindConfig(VLC_OBJECT(vout), "deinterlace-mode"); var_Change(vout, "deinterlace-mode", VLC_VAR_CLEARCHOICES, NULL, NULL); for (int i = 0; optm && i < optm->i_list; i++) { if (!DeinterlaceIsModeValid(optm->ppsz_list[i])) continue; val.psz_string = optm->ppsz_list[i]; text.psz_string = (char*)vlc_gettext(optm->ppsz_list_text[i]); var_Change(vout, "deinterlace-mode", VLC_VAR_ADDCHOICE, &val, &text); } var_AddCallback(vout, "deinterlace-mode", DeinterlaceCallback, NULL); /* */ var_Create(vout, "deinterlace-needed", VLC_VAR_BOOL); var_AddCallback(vout, "deinterlace-needed", DeinterlaceCallback, NULL); /* Override the initial value from filters if present */ char *filter_mode = NULL; if (DeinterlaceIsPresent(vout)) filter_mode = var_CreateGetNonEmptyString(vout, "sout-deinterlace-mode"); if (filter_mode) { deinterlace_state = 1; free(deinterlace_mode); deinterlace_mode = filter_mode; } /* */ val.psz_string = deinterlace_mode ? deinterlace_mode : optm->orig.psz; var_Change(vout, "deinterlace-mode", VLC_VAR_SETVALUE, &val, NULL); val.b_bool = is_interlaced; var_Change(vout, "deinterlace-needed", VLC_VAR_SETVALUE, &val, NULL); var_SetInteger(vout, "deinterlace", deinterlace_state); free(deinterlace_mode); }
void vout_InitInterlacingSupport(vout_thread_t *vout) { vlc_value_t val; msg_Dbg(vout, "Deinterlacing available"); vout->p->filter.has_deint = false; /* Create the configuration variables */ /* */ var_Create(vout, "deinterlace", VLC_VAR_INTEGER | VLC_VAR_DOINHERIT ); int deinterlace_state = var_GetInteger(vout, "deinterlace"); var_Change(vout, "deinterlace", VLC_VAR_SETTEXT, _("Deinterlace")); const module_config_t *optd = config_FindConfig("deinterlace"); var_Change(vout, "deinterlace", VLC_VAR_CLEARCHOICES); if (likely(optd != NULL)) for (unsigned i = 0; i < optd->list_count; i++) { val.i_int = optd->list.i[i]; var_Change(vout, "deinterlace", VLC_VAR_ADDCHOICE, val, vlc_gettext(optd->list_text[i])); } var_AddCallback(vout, "deinterlace", DeinterlaceCallback, NULL); /* */ var_Create(vout, "deinterlace-mode", VLC_VAR_STRING | VLC_VAR_DOINHERIT ); char *deinterlace_mode = var_GetNonEmptyString(vout, "deinterlace-mode"); var_Change(vout, "deinterlace-mode", VLC_VAR_SETTEXT, _("Deinterlace mode")); const module_config_t *optm = config_FindConfig("deinterlace-mode"); var_Change(vout, "deinterlace-mode", VLC_VAR_CLEARCHOICES); if (likely(optm != NULL)) for (unsigned i = 0; i < optm->list_count; i++) { if (!DeinterlaceIsModeValid(optm->list.psz[i])) continue; val.psz_string = (char *)optm->list.psz[i]; var_Change(vout, "deinterlace-mode", VLC_VAR_ADDCHOICE, val, vlc_gettext(optm->list_text[i])); } var_AddCallback(vout, "deinterlace-mode", DeinterlaceCallback, NULL); /* */ var_Create(vout, "deinterlace-needed", VLC_VAR_BOOL); var_AddCallback(vout, "deinterlace-needed", DeinterlaceCallback, NULL); /* Override the initial value from filters if present */ char *filter_mode = NULL; if (vout->p->filter.has_deint) filter_mode = var_CreateGetNonEmptyString(vout, "sout-deinterlace-mode"); if (filter_mode) { deinterlace_state = 1; free(deinterlace_mode); deinterlace_mode = filter_mode; } /* */ val.psz_string = deinterlace_mode ? deinterlace_mode : optm->orig.psz; var_Change(vout, "deinterlace-mode", VLC_VAR_SETVALUE, val); var_SetInteger(vout, "deinterlace", deinterlace_state); free(deinterlace_mode); vout->p->interlacing.is_interlaced = false; }