command: use a list of potential deinterlacer filters

Instead of hardcoding a single filter. This might be helpful for
modeling the vaapi deinterlacer as a video filter. The idea is that a
software deinterlacer would be tried first, and if that fails (because
vaapi hardware decoding uses HW surfaces, which a software deinterlacer
does not accept), the vaapi filter would be tried.
This commit is contained in:
wm4 2013-09-20 15:09:29 +02:00
parent 2694b5f378
commit 0611c43b97
1 changed files with 22 additions and 13 deletions

View File

@ -68,8 +68,8 @@
#include "mpvcore/mp_core.h"
static void change_video_filters(MPContext *mpctx, const char *cmd,
const char *arg);
static int edit_filters(struct MPContext *mpctx, enum stream_type mediatype,
const char *cmd, const char *arg);
static int set_filters(struct MPContext *mpctx, enum stream_type mediatype,
struct m_obj_settings *new_chain);
@ -1135,11 +1135,26 @@ static int mp_property_fullscreen(m_option_t *prop,
#define VF_DEINTERLACE_LABEL "deinterlace"
static const char *deint_filters[] = {
#ifdef CONFIG_VF_LAVFI
#define VF_DEINTERLACE "@" VF_DEINTERLACE_LABEL ":lavfi=yadif"
#else
#define VF_DEINTERLACE "@" VF_DEINTERLACE_LABEL ":yadif"
"lavfi=yadif",
#endif
"yadif",
NULL
};
static int probe_deint_filters(struct MPContext *mpctx, const char *cmd)
{
for (int n = 0; deint_filters[n]; n++) {
char filter[80];
// add a label so that removing the filter is easier
snprintf(filter, sizeof(filter), "@%s:%s", VF_DEINTERLACE_LABEL,
deint_filters[n]);
if (edit_filters(mpctx, STREAM_VIDEO, cmd, filter) >= 0)
return 0;
}
return -1;
}
static int get_deinterlacing(struct MPContext *mpctx)
{
@ -1160,12 +1175,12 @@ static void set_deinterlacing(struct MPContext *mpctx, bool enable)
vf_instance_t *vf = mpctx->sh_video->vfilter;
if (vf_find_by_label(vf, VF_DEINTERLACE_LABEL)) {
if (!enable)
change_video_filters(mpctx, "del", VF_DEINTERLACE);
edit_filters(mpctx, STREAM_VIDEO, "del", "@" VF_DEINTERLACE_LABEL);
} else {
if ((get_deinterlacing(mpctx) > 0) != enable) {
int arg = enable;
if (vf->control(vf, VFCTRL_SET_DEINTERLACE, &arg) != CONTROL_OK)
change_video_filters(mpctx, "add", VF_DEINTERLACE);
probe_deint_filters(mpctx, "add");
}
}
mpctx->opts->deinterlace = get_deinterlacing(mpctx) > 0;
@ -2162,12 +2177,6 @@ static int edit_filters_osd(struct MPContext *mpctx, enum stream_type mediatype,
return r;
}
static void change_video_filters(MPContext *mpctx, const char *cmd,
const char *arg)
{
edit_filters(mpctx, STREAM_VIDEO, cmd, arg);
}
void run_command(MPContext *mpctx, mp_cmd_t *cmd)
{
struct MPOpts *opts = mpctx->opts;