summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--DOCS/interface-changes.rst1
-rw-r--r--DOCS/man/vf.rst6
-rw-r--r--video/filter/vf_vavpp.c27
3 files changed, 28 insertions, 6 deletions
diff --git a/DOCS/interface-changes.rst b/DOCS/interface-changes.rst
index c0ec882719..e18fec4c1d 100644
--- a/DOCS/interface-changes.rst
+++ b/DOCS/interface-changes.rst
@@ -75,6 +75,7 @@ Interface changes
- make --deinterlace=yes always deinterlace, instead of trying to check
certain unreliable video metadata. Also flip the defaults of all builtin
HW deinterlace filters to always deinterlace.
+ - change vf_vavpp default to use the best deinterlace algorithm by default
--- mpv 0.28.0 ---
- rename --hwdec=mediacodec option to mediacodec-copy, to reflect
conventions followed by other hardware video decoding APIs
diff --git a/DOCS/man/vf.rst b/DOCS/man/vf.rst
index 17df70f920..d979337e42 100644
--- a/DOCS/man/vf.rst
+++ b/DOCS/man/vf.rst
@@ -478,10 +478,14 @@ Available mpv-only filters are:
no
Don't perform deinterlacing.
+ auto
+ Select the best quality deinterlacing algorithm (default). This
+ goes by the order of the options as documented, with
+ ``motion-compensated`` being considered best quality.
first-field
Show only first field.
bob
- bob deinterlacing (default).
+ bob deinterlacing.
weave, motion-adaptive, motion-compensated
Advanced deinterlacing algorithms. Whether these actually work
depends on the GPU hardware, the GPU drivers, driver bugs, and
diff --git a/video/filter/vf_vavpp.c b/video/filter/vf_vavpp.c
index 598997ca24..8c41ba8734 100644
--- a/video/filter/vf_vavpp.c
+++ b/video/filter/vf_vavpp.c
@@ -86,6 +86,7 @@ static void add_surfaces(struct priv *p, struct surface_refs *refs, int dir)
}
// The array items must match with the "deint" suboption values.
+// They're also sorted by quality.
static const int deint_algorithm[] = {
[0] = VAProcDeinterlacingNone,
[1] = VAProcDeinterlacingBob, // first-field, special-cased
@@ -376,13 +377,26 @@ static bool initialize(struct mp_filter *vf)
buffers[i] = VA_INVALID_ID;
for (int i = 0; i < num_filters; i++) {
if (filters[i] == VAProcFilterDeinterlacing) {
- if (p->opts->deint_type < 1)
- continue;
VAProcFilterCapDeinterlacing caps[VAProcDeinterlacingCount];
int num = va_query_filter_caps(vf, VAProcFilterDeinterlacing, caps,
VAProcDeinterlacingCount);
if (!num)
continue;
+ if (p->opts->deint_type < 0) {
+ for (int n = MP_ARRAY_SIZE(deint_algorithm) - 1; n > 0; n--) {
+ for (int x = 0; x < num; x++) {
+ if (caps[x].type == deint_algorithm[n]) {
+ p->opts->deint_type = n;
+ MP_VERBOSE(vf, "Selected deinterlacing algorithm: "
+ "%d\n", deint_algorithm[n]);
+ goto found;
+ }
+ }
+ }
+ found: ;
+ }
+ if (p->opts->deint_type <= 0)
+ continue;
VAProcDeinterlacingType algorithm =
deint_algorithm[p->opts->deint_type];
for (int n=0; n < num; n++) { // find the algorithm
@@ -398,6 +412,8 @@ static bool initialize(struct mp_filter *vf)
MP_WARN(vf, "Selected deinterlacing algorithm not supported.\n");
} // check other filters
}
+ if (p->opts->deint_type < 0)
+ p->opts->deint_type = 0;
p->num_buffers = 0;
if (buffers[VAProcFilterDeinterlacing] != VA_INVALID_ID)
p->buffers[p->num_buffers++] = buffers[VAProcFilterDeinterlacing];
@@ -456,8 +472,9 @@ error:
#define OPT_BASE_STRUCT struct opts
static const m_option_t vf_opts_fields[] = {
OPT_CHOICE("deint", deint_type, 0,
- // The values must match with deint_algorithm[].
- ({"no", 0},
+ // The values >=0 must match with deint_algorithm[].
+ ({"auto", -1},
+ {"no", 0},
{"first-field", 1},
{"bob", 2},
{"weave", 3},
@@ -474,7 +491,7 @@ const struct mp_user_filter_entry vf_vavpp = {
.name = "vavpp",
.priv_size = sizeof(OPT_BASE_STRUCT),
.priv_defaults = &(const OPT_BASE_STRUCT){
- .deint_type = 2,
+ .deint_type = -1,
.interlaced_only = 0,
.reversal_bug = 1,
},