[multimedia/kdenlive] src/dialogs: timeremap: expand keyframe type list with discrete and additional easing types

Jean-Baptiste Mardelle <[email protected]>
Newsgroups gmane.comp.kde.cvs
Message-ID <[email protected]>
Git commit e64d2eea21388e09e26786d5af410414501a4fd9 by Jean-Baptiste Mardelle, on behalf of Yash Bavadiya.
Committed on 18/08/2026 at 08:31.
Pushed by mardelle into branch 'master'.

timeremap: expand keyframe type list with discrete and additional easing types

The selector now offers the full set of interpolation types used elsewhere
in the effect stack, rather than the four it was restricted to.

Bounce and elastic were previously held back because their overshoot makes
the source time run backwards, so the clip plays in reverse for a few frames
around the keyframe. Measured against MLT, bounce reverses over 16 frames of
a 50 frame span and elastic over 23, with elastic also reaching source
positions outside the clip. They are included now that the behavior has been
confirmed as wanted, and are listed last so the well behaved types come
first. Exponential and circular turned out not to overshoot at all.

Note that discrete is not the old pre-selector behavior: it holds the source
frame and jumps at the keyframe, giving a freeze then a cut. The previous
default was linear.

M  +5    -4    src/dialogs/timeremap.cpp

https://invent.kde.org/multimedia/kdenlive/-/commit/e64d2eea21388e09e26786d5af410414501a4fd9

diff --git a/src/dialogs/timeremap.cpp b/src/dialogs/timeremap.cpp
index f0537efe19..72883b7d1d 100644
--- a/src/dialogs/timeremap.cpp
+++ b/src/dialogs/timeremap.cpp
@@ -1715,11 +1715,12 @@ TimeRemap::TimeRemap(QWidget *parent)
         QSignalBlocker bk5(kfr_type);
         kfr_type->setCurrentIndex(qMax(0, kfr_type->findData(m_view->keyframeTypeAt(selection.first))));
     });
-    // TODO: the list is restricted to non overshooting interpolation types for
-    // now, pending a decision on how to handle types like bounce and elastic
-    // whose overshoot makes the source time briefly play backwards
+    // Bounce and elastic overshoot the keyframe value, which on a time map means the
+    // source time briefly runs backwards and the clip plays in reverse for a few frames
     const QMap<KeyframeType::KeyframeEnum, QString> kfrTypes = KeyframeModel::getKeyframeTypes();
-    for (auto type : {KeyframeType::Linear, KeyframeType::CurveSmooth, KeyframeType::CubicIn, KeyframeType::CubicOut}) {
+    for (auto type : {KeyframeType::Linear, KeyframeType::Discrete, KeyframeType::CurveSmooth, KeyframeType::CubicIn, KeyframeType::CubicOut,
+                      KeyframeType::ExponentialIn, KeyframeType::ExponentialOut, KeyframeType::CircularIn, KeyframeType::CircularOut, KeyframeType::BounceIn,
+                      KeyframeType::BounceOut, KeyframeType::ElasticIn, KeyframeType::ElasticOut}) {
         kfr_type->addItem(kfrTypes.value(type), int(type));
     }
     connect(kfr_type, &QComboBox::activated, this, [this](int ix) { m_view->slotSetKeyframeType(kfr_type->itemData(ix).toInt()); });
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.