[FFmpeg-user] minterpolate problem

list+ffmpeg-user at jdlh.com list+ffmpeg-user at jdlh.com
Wed Jan 27 10:16:25 EET 2021


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




More information about the ffmpeg-user mailing list