mirror of
https://github.com/mpv-player/mpv
synced 2024-12-26 09:02:38 +00:00
command: redo deinterlace filter probing
Give up on the deint_filters[] array, and probe using explicit code instead. Add additional checks to test the pixel format to avoid annoying warnings when a hardware deinterlacer is inserted when the current video chain is obviously incompatible.
This commit is contained in:
parent
c42795f1ea
commit
3f060a19d8
@ -1533,27 +1533,36 @@ static int mp_property_fullscreen(m_option_t *prop,
|
||||
|
||||
#define VF_DEINTERLACE_LABEL "deinterlace"
|
||||
|
||||
static const char *deint_filters[] = {
|
||||
"yadif",
|
||||
static bool probe_deint_filter(struct MPContext *mpctx, const char *filt)
|
||||
{
|
||||
char filter[80];
|
||||
// add a label so that removing the filter is easier
|
||||
snprintf(filter, sizeof(filter), "@%s:%s", VF_DEINTERLACE_LABEL, filt);
|
||||
return edit_filters(mpctx, STREAM_VIDEO, "pre", filter) >= 0;
|
||||
}
|
||||
|
||||
static bool check_output_format(struct MPContext *mpctx, int imgfmt)
|
||||
{
|
||||
struct dec_video *vd = mpctx->d_video;
|
||||
if (!vd)
|
||||
return false;
|
||||
return vd->vfilter->allowed_output_formats[imgfmt - IMGFMT_START];
|
||||
}
|
||||
|
||||
static int probe_deint_filters(struct MPContext *mpctx)
|
||||
{
|
||||
#if HAVE_VDPAU
|
||||
"vdpaupp:deint=yes",
|
||||
if (check_output_format(mpctx, IMGFMT_VDPAU) &&
|
||||
probe_deint_filter(mpctx, "vdpaupp:deint=yes"))
|
||||
return 0;
|
||||
#endif
|
||||
#if HAVE_VAAPI_VPP
|
||||
"vavpp",
|
||||
if (check_output_format(mpctx, IMGFMT_VAAPI) &&
|
||||
probe_deint_filter(mpctx, "vavpp"))
|
||||
return 0;
|
||||
#endif
|
||||
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;
|
||||
}
|
||||
if (probe_deint_filter(mpctx, "yadif"))
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -1581,7 +1590,7 @@ static void set_deinterlacing(struct MPContext *mpctx, bool enable)
|
||||
if ((get_deinterlacing(mpctx) > 0) != enable) {
|
||||
int arg = enable;
|
||||
if (video_vf_vo_control(vd, VFCTRL_SET_DEINTERLACE, &arg) != CONTROL_OK)
|
||||
probe_deint_filters(mpctx, "pre");
|
||||
probe_deint_filters(mpctx);
|
||||
}
|
||||
}
|
||||
mpctx->opts->deinterlace = get_deinterlacing(mpctx) > 0;
|
||||
|
Loading…
Reference in New Issue
Block a user