[Kdenlive-devel] [Mlt-devel] non-25 fps broken
Dan Dennedy
dan at dennedy.org
Tue Oct 30 06:14:44 UTC 2007
On Sunday 28 October 2007, Dan Dennedy wrote:
> Hey, as a result of this bug:
> http://www.kdenlive.org/mantis/view.php?id=23
> I have determined that MLT and therefore kdenlive is currently broken for
> any profile not using 25 fps. By broken, I mean various things related to
> editing, particularly in and out points are not working as expected. This
> occurred with the introduction of mlt_profile. I have in my MLT working
> copy a bugfix that I am testing.
I want to document my findings during the analysis.
The framework maintains a "fps" property on all producers including tractor,
multitrack, and playlist, which are derived from producer. This makes "fps"
rather stateful with multiple instances of that state. A feature of
mlt_profile is to eliminate requirement of an environment variable
(MLT_NORMALISATION) as a means of passing parameters. It was a kludge for an
API defficiency. The profile property of mlt_consumer is intended to replace
it as a convenience over having to continually specifying all the profile's
properties.
Due to order of initialization, some objects are initialized with default
values, obviously, with the default equivalent to profile dv_pal. Typically,
the consumer is constructed last and connected to the last producer.
Therefore, with fps being stateful and the consumer profile property applied
in a late manner, some timings were based on the initial, default PAL fps
value of 25. Therefore, even with a NTSC-based consumer profile, the edit
points were interpreted with the wrong fps.
The framework does not really use the producer fps property much outside
setting it and propogating it (onto the frame and other producers). The
modules do not use it much either. Moreover, they _never_ set it. In fact,
there is an unofficial policy that a module's producer must conform to the
fps or fail initialization because there is no core module filter to
reconcile frame rate differences (between producers or between producer and
consumer). It just so happens producer_avformat is adaptive to any frame
rate.
To fix the bug, I made everything accessing the fps producer property use the
existing mlt_producer_get_fps() instead. Then, I changed
mlt_producer_get_fps() to simply return mlt_profile_fps(). However, really it
should reference the final consumer's fps property as, again, the profile is
merely a convenience to set the consumer property and can be overridden. As a
resolution to the redundant fps property, I totally removed it from the
producer side of the framework and all related modules. Left in its place is
a bunch of calls to mlt_producer_get_fps().
Perhaps some day we should require every producer to set its fps and then
allow a filter to reconcile differences. Similar to how fezzik "normalises"
resolution and audio sample rate, it could automatically add a framerate
normalisation filter. The core module could have a duplicate/drop algorithm
and motion_est could provide one as well. In some cases,
mlt_producer_get_fps() calls should be replaced with a mlt_consumer_get_fps(
mlt_service_get_last_consumer() ).
However, this bug also brings to light an issue if I change the consumer's fps
after editing. For example, I may want a low bitrate encoding with a lower
frame rate. Since all edit decisions are expressed in frames, they are no
longer valid at the lower frame rate.
All of this was not a major issue for the original requirements (ITU 601 NTSC
or PAL for SD broadcast) since each installation tended to pick one of the
two options and stick with it for all inputs and outputs.
More information about the Kdenlive
mailing list