On 2021-01-26 20:05, Mark Filipak (ffmpeg) wrote:

On 01/26/2021 09:49 PM, pdr0 wrote:
Jim DeLaHunt-2 wrote
Perhaps the character between 'mci' and 'mc_mode' should be ':' instead
of '='?

That works for me

-vf
minterpolate=fps=60000/1001:mi_mode=mci:mc_mode=obmc:scd=fdiff:scd_threshold=10

Each one is a separate option and argument

https://github.com/FFmpeg/FFmpeg/blob/master/libavfilter/vf_minterpolate.c

Thank you. It works for me, too. I don't know why it didn't work the 1st time (except maybe because I have so many balls in the air).

So, unlike what is shown in the documentation, 'mc_mode' is _not_ an argument of 'mci'.

Apparently, 1, 'mi_mode=mci' is a valid argument and, 2, that 'mc_mode' (and perhaps 'me_mode' & 'me') are valid solely if mi_mode=mci but are otherwise not arguments of 'mi_mode=mci' but are direct options of 'minterpolate'. That kind of scope is probably what the author intended when he/she indented them below 'mci', but the indenting is very misleading.

Having looked at the code, that is correct.  Yes, the indenting is misleading. Yes, 'mc_mode' and 'me_mode' and 'me' are top-level options for the minterpolate filter, but the filter only consults their values if 'mi_mode'='mci'.

This is the part of the minterpolate video filter which defines the options:
https://github.com/FFmpeg/FFmpeg/blob/master/libavfilter/vf_minterpolate.c#L205-L235

[The following looks better in a fixed-pitch font.]

static const AVOption minterpolate_options[] = {
    { "fps", "output's frame rate", OFFSET(frame_rate), AV_OPT_TYPE_VIDEO_RATE, {.str = "60"}, 0, INT_MAX, FLAGS },     { "mi_mode", "motion interpolation mode", OFFSET(mi_mode), AV_OPT_TYPE_INT, {.i64 = MI_MODE_MCI}, MI_MODE_DUP, MI_MODE_MCI, FLAGS, "mi_mode" },         CONST("dup",    "duplicate frames", MI_MODE_DUP,            "mi_mode"),
        CONST("blend",  "blend frames", MI_MODE_BLEND,          "mi_mode"),
        CONST("mci",    "motion compensated interpolation", MI_MODE_MCI,            "mi_mode"),     { "mc_mode", "motion compensation mode", OFFSET(mc_mode), AV_OPT_TYPE_INT, {.i64 = MC_MODE_OBMC}, MC_MODE_OBMC, MC_MODE_AOBMC, FLAGS, "mc_mode" },         CONST("obmc",   "overlapped block motion compensation", MC_MODE_OBMC,           "mc_mode"),         CONST("aobmc",  "adaptive overlapped block motion compensation", MC_MODE_AOBMC, "mc_mode"),     { "me_mode", "motion estimation mode", OFFSET(me_mode), AV_OPT_TYPE_INT, {.i64 = ME_MODE_BILAT}, ME_MODE_BIDIR, ME_MODE_BILAT, FLAGS, "me_mode" },         CONST("bidir",  "bidirectional motion estimation", ME_MODE_BIDIR,          "me_mode"),         CONST("bilat",  "bilateral motion estimation", ME_MODE_BILAT,          "me_mode"),     { "me", "motion estimation method", OFFSET(me_method), AV_OPT_TYPE_INT, {.i64 = AV_ME_METHOD_EPZS}, AV_ME_METHOD_ESA, AV_ME_METHOD_UMH, FLAGS, "me" },
        CONST("esa",    "exhaustive search", AV_ME_METHOD_ESA,       "me"),
        CONST("tss",    "three step search", AV_ME_METHOD_TSS,       "me"),
        CONST("tdls",   "two dimensional logarithmic search", AV_ME_METHOD_TDLS,      "me"),         CONST("ntss",   "new three step search", AV_ME_METHOD_NTSS,      "me"),
        CONST("fss",    "four step search", AV_ME_METHOD_FSS,       "me"),
        CONST("ds",     "diamond search", AV_ME_METHOD_DS,        "me"),
        CONST("hexbs",  "hexagon-based search", AV_ME_METHOD_HEXBS,     "me"),         CONST("epzs",   "enhanced predictive zonal search", AV_ME_METHOD_EPZS,      "me"),         CONST("umh",    "uneven multi-hexagon search", AV_ME_METHOD_UMH,       "me"),     { "mb_size", "macroblock size", OFFSET(mb_size), AV_OPT_TYPE_INT, {.i64 = 16}, 4, 16, FLAGS },     { "search_param", "search parameter", OFFSET(search_param), AV_OPT_TYPE_INT, {.i64 = 32}, 4, INT_MAX, FLAGS },     { "vsbmc", "variable-size block motion compensation", OFFSET(vsbmc), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, FLAGS },     { "scd", "scene change detection method", OFFSET(scd_method), AV_OPT_TYPE_INT, {.i64 = SCD_METHOD_FDIFF}, SCD_METHOD_NONE, SCD_METHOD_FDIFF, FLAGS, "scene" },         CONST("none",   "disable detection", SCD_METHOD_NONE,        "scene"),         CONST("fdiff",  "frame difference", SCD_METHOD_FDIFF,       "scene"),     { "scd_threshold", "scene change threshold", OFFSET(scd_threshold), AV_OPT_TYPE_DOUBLE, {.dbl = 10.}, 0, 100.0, FLAGS },
    { NULL }
};

What that means:

There is an option, "fps", which means "output's frame rate". It can (I believe) take any frame rate value describe in 7.5 "Frame Rate" (http://ffmpeg.org/ffmpeg-all.html#Video-rate), including integers, rational numbers, and 8 special names (because "AV_OPT_TYPE_VIDEO_RATE"). The default value is 60 (because '{.str = "60"}').

There is an option, "mi_mode", which means "motion interpolation mode". It can take any of the following values: "dup", meaning  "duplicate frames"; "blend", meaning  "blend frames"; or "mci", meaning "motion compensated interpolation". The default value is "mci" (because '{.i64 = MI_MODE_MCI}' and 'CONST("mci" … MI_MODE_MCI').

There is an option, "mc_mode",  which means "motion compensation mode". Reading the code elsewhere in that file, it seems that the filter only consults this option when "mi_mode"="mci". It can take any of the following values: "obmc", meaning "overlapped block motion compensation"; or "aobmc", meaning "adaptive overlapped block motion compensation". The default value is "obmc" (because '{.i64 = MC_MODE_OBMC}' and 'CONST("obmc" … MC_MODE_OBMC').

There is an option, "me_mode", which means "motion estimation mode". Reading the code elsewhere in that file, it seems that the filter only consults this option when "mi_mode"="mci". It can take any of the following values: "bidir", meaning "bidirectional motion estimation"; or "bilat", meaing "bilateral motion estimation". The default value is "bilat" (because '{.i64 = ME_MODE_BILAT}' and 'CONST("bilat" … ME_MODE_BILAT').

There is an option, "me", meaning "motion estimation method". Reading the code elsewhere in that file, it seems that the filter only consults this option when "mi_mode"="mci". It can take any of the following values: "esa", meaning "exhaustive search"; "tss", meaning "three step search"; "tdls", meaning "two dimensional logarithmic search"; "ntss", meaning "new three step search"; "fss", meaning "four step search"; "ds", meaning "diamond search"; "hexbs", meaning "hexagon-based search"; "epzs", meaning "enhanced predictive zonal search"; or "umh", meaning "uneven multi-hexagon search". The default value is "epzs" (because '{.i64 = AV_ME_METHOD_EPZS}' and 'CONST("epzs" … AV_ME_METHOD_EPZS').

There is an option, "mb_size", meaning "macroblock size". It takes an integer value of 4-16 (because 'AV_OPT_TYPE_INT' and  '4, 16'). The default value is 16 (because '{.i64 = 16}').

There is an option, "search_param", meaning "search parameter". It takes an integer value of 4 or more (because 'AV_OPT_TYPE_INT' and  '4, INT_MAX'). The default value is 32 (because '{.i64 = 32}').

There is an option, "vsbmc", meaning "variable-size block motion compensation". It takes an integer value of 0 or 1 (because 'AV_OPT_TYPE_INT' and '0, 1'). The default value is 0 (because '{.i64 = 0}').

There is an option, "scd", meaning "scene change detection method". It can take either of the following values:
"none", meaning "disable detection"; or "fdiff", meaning "frame difference".
The default value is "fdiff" (because '{.i64 = SCD_METHOD_FDIFF}' and 'CONST("fdiff", … SCD_METHOD_FDIFF').

There is an option, "scd_threshold", meaning "scene change threshold". It takes a real-number value of 0.0-100.0 (because 'AV_OPT_TYPE_DOUBLE' and '0, 100.0'). The default value is 10.0 (because '{.dbl = 10.}'.


I will try all combinations of minterpolate to resolve all the options and issues and return with a new beautified version of the minterpolate documentation. Perhaps that will save people in the future because minterpolate is an important and amazing function.


I wrote out that translation of the code into English in part to help you with your documentation, and in part to help others who want to learn how to read the idioms in source code. This skill is useful for checking where the documentation is incomplete or wrong.

Note that I just translated the options declaration in lines 205-235 of the source code. This describes only the names and data types of the options. To understand what FFmpeg actually does when presented with the various options, one has to read the rest of the source code. (For instance, are options 'mb_size', 'search_param', and 'vsbmc' consulted only when option 'mi_mode'='mci'? Lines 205-235 don't say.)

    —Jim DeLaHunt


_______________________________________________
ffmpeg-user mailing list
ffmpeg-user@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-user

To unsubscribe, visit link above, or email
ffmpeg-user-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to