[FFmpeg-devel] Proposed vf_decimate enhancement
Anshul
anshul.ffmpeg at gmail.com
Tue Sep 29 09:35:19 CEST 2015
On 09/29/2015 12:46 PM, Paul B Mahol wrote:
> On 9/29/15, Ray Cole <the.other.ray.cole at gmail.com> wrote:
>> I hope this is the appropriate place to propose an enhancement. This is the
>> first time I've offered up code to any open source project...so be gentle
>> :-)
>>
>> First, I love ffmpeg. Wonderful software and thank you for your efforts.
>>
>> I have been pulling down a number of movies back to 24 FPS (24000/1001)
>> using fieldmatch and decimate. However decimate seemed to drop incorrect
>> frames from time-to-time particularly on scenes with little motion. The
>> pullup filter likewise made poor decisions under similar circumstances.
>>
>> So...I modified vf_decimate and it is working very well for me. I make no
>> claims that the enhancements would work for anyone else. My source is 1080i
>> 29.97 fps movies recording from component video. I'm pulling down to 24 fps
>> (24000/1001 actually).
>>
>> The changes are:
>> 1) The total and max diffs are used to find the lowest frame to drop rather
>> than just the max diff. If these two methods disagree with one another then
>> it goes through a 'conflict resolution'. The conflict resolution checks to
>> see if either method matches the most commonly-dropped frame (a simple
>> short-term history of drops is retained for this purpose). If so, the most
>> commonly-dropped frame is assumed to be correct. If they do not match then
>> it uses the last dropped frame. This keeps the filter from varying the frame
>> drop so often and made a big difference in detection, at least with the
>> stuff I'm working with.
>>
>> 2) The existing vf_decimate allows frame 4 to be dropped immediately
>> followed by frame 0 whereas frame 3 dropped could never be followed by frame
>> 4 dropped - similar with frames 0 through 2. Having 2 frames in a row
>> eligible to be dropped seems wrong and the biggest issue I had was when the
>> drop cycle was hitting frame 4. So I put in some code that says if the last
>> frame dropped was frame 4 then frame 0 and frame 1 is not eligible for drop.
>> If frame 3 was last dropped then frame 0 is not dropped. This enforces 2
>> undropped frames between drops. I'm not "married" to this...but it did help
>> quite a bit.
>>
>> 3) I had one movie where frame 4 was ALWAYS the correct frame to drop...so I
>> added an option to 'lock on' to a pattern in 1 of 2 ways. The first way is
>> for someone to pass force_drop=x where x is the frame number to drop each
>> time. The other is passing lock_on=1 to tell it to figure out what frame it
>> should lock onto. I mainly used this to assist in finding places where the
>> code was dropping incorrect frames. I'm not sure I really consider this
>> 'useful' for anything other than such testing where you know what should be
>> dropped. It still goes through all the computations as before but insists on
>> dropping the specified frame and noting if the computations resulted in a
>> different frame than requested.
>>
>> I realize the attached code needs cleanup to conform to standards but I just
>> wanted to put it up for discussion. The first change above is really the
>> major change and it could (obviously) be enabled/disabled by an option to
>> decimate if desired.
>>
>> -- Ray Cole
>>
> Whole file is unacceptable, how one can find what changed?, please
> learn how to produce patches.
To produce patch
Hint: > git add
> git commit
> git send mail or > git format patch
-Anshul
More information about the ffmpeg-devel
mailing list