[FFmpeg-user] minterpolate performance & alternative

Mark Filipak (ffmpeg) markfilipak at bog.us
Thu Jan 28 23:20:11 EET 2021


Synopsis:

I seek to use minterpolate to take advantage of its superior output. I present some performance 
issues followed by an alternative filter_complex. So, this presentation necessarily addresses 2 
subjects.

Problem:

I'm currently transcoding a 2:43:05 1920x1080, 24FPS progressive video to 60FPS via minterpolate 
filter. Apparently, the transcode will take a little more than 3 days.

Hardware:

There are 4 CPU cores (with 2 threads, each) that run at 3.6 GHz. There is also an NVIDIA GTX 980M 
GPU having 1536 CUDA cores with a driver that implements the Optimus, CUDA-as-coprocessors architecture.

Performance:

During the transcode, ffmpeg is consuming only between 10% & 20% of the CPU. It appears to be 
single-threaded, and it appears to not be using Optimus at all.

Is there a way to coax minterpolate to expand its hardware usage?

Alternative filter_complex:

minterpolate converts 24FPS to 60FPS by interpolating every frame via motion vectors to produce a 60 
picture/second stream in a 60FPS transport. It does a truly amazing job, but without expanded 
hardware usage, it takes too long to do it.

A viable alternative is to 55 telecine the source (which simply duplicates the n%5!=2 frames) while 
interpolating solely the n%5==2 frames. That should take much less time and would produce a 24 
picture/second stream in a 60FPS transport -- totally acceptable.

The problem is that motion vector interpolation requires that minterpolate be 'split' out and run in 
parallel with the main path in the filter_complex so that the interpolated frames can be plucked out 
(n%5==2) and interleaved at the end of the filter_complex. That doesn't make much sense because it 
doesn't decrease processing (or processing time) and, if the fully motion-interpolated stream is 
produced anyway, then output it directly instead of interleaving. What's needed is an interpolation 
alternative to minterpolate.

Alternative Interpolation:

55 telecine with no interpolation or smoothing works well even though the n%5==2 frames are combed 
but decombing is desired. The problem with that is: I can't find a deinterlace filter that does 
pixel interpolation without reintroducing some telecine judder. The issue involves spacial alignment 
of the odd & even lines in the existing filters.

Some existing filters align the decombed lines with the input's top field, some align the decombed 
lines with the input's bottom field. What's desired is a filter that aligns the decombed lines with 
the spacial mean. I suggest that the Sobel might be appropriate for the decombing (or at least, that 
the Sobel can be employed to visualize what's desired).

Sobel of line y:   ______/\_____________/\_________ (edges)
Sobel of line y+1: __________/\_____________/\_____
Desired output:
          line y:   ________/\_____________/\_______ (aligned to mean)
          line y+1: ________/\_____________/\_______ (aligned to mean)
I could find this:
          line y:   ______/\_____________/\_________
          line y+1: ______/\_____________/\_________ (aligned to top line edges)
and I could find this:
          line y:   __________/\_____________/\_____ (aligned to bottom line edges)
          line y+1: __________/\_____________/\_____

Does such a decomb filter exist? I've tested every deinterlacing filter, and I've failed to find one.

Thank you for reading all this. I'm sorry it's so long.

Regards,
Mark.
-- 
Someone's sneaking in and turning up the range so that my food burns.
I'm sure of it.
And the older I get, the more sure of it I become.


More information about the ffmpeg-user mailing list