]> git.sesse.net Git - kdenlive/blobdiff - src/clipitem.cpp
Prevent crash when deleting a clip while playing:
[kdenlive] / src / clipitem.cpp
index 62f71b42726ec2780ad02dcaff7883abc8388a17..2af20baf0aed36c8d4a0502b2549988a27826b35 100644 (file)
@@ -773,11 +773,13 @@ void ClipItem::paint(QPainter *painter,
             }
             else {
 #if KDE_IS_VERSION(4,5,0)
-                m_clip->thumbProducer()->queryIntraThumbs(left, right);
-                connect(m_clip->thumbProducer(), SIGNAL(thumbsCached()), this, SLOT(slotGotThumbsCache()));
-                QString path = m_clip->fileURL().path() + "%";
-                for (int i = left; i <= right; i++) {
-                    painter->drawImage(startPos + QPointF(twidth *(i - startOffset), 0), m_clip->thumbProducer()->findCachedThumb(path + QString::number(i)));
+                if (m_clip && m_clip->thumbProducer()) {
+                    m_clip->thumbProducer()->queryIntraThumbs(left, right);
+                    connect(m_clip->thumbProducer(), SIGNAL(thumbsCached()), this, SLOT(slotGotThumbsCache()));
+                    QString path = m_clip->fileURL().path() + "_";
+                    for (int i = left; i <= right; i++) {
+                        painter->drawImage(startPos + QPointF(twidth *(i - startOffset), 0), m_clip->thumbProducer()->findCachedThumb(path + QString::number(i)));
+                    }
                 }
 #endif
             }
@@ -1383,16 +1385,17 @@ EffectsParameterList ClipItem::addEffect(const QDomElement effect, bool /*animat
     parameters.addParam("id", effectId);
 
     // special case: the affine effect needs in / out points
-    if (effectId == "pan_zoom") {
-        parameters.addParam("in", QString::number(cropStart().frames(m_fps)));
-        parameters.addParam("out", QString::number((cropStart() + cropDuration()).frames(m_fps)));
-    }
 
     QDomNodeList params = effect.elementsByTagName("parameter");
     int fade = 0;
+    bool needInOutSync = false;
     for (int i = 0; i < params.count(); i++) {
         QDomElement e = params.item(i).toElement();
         if (!e.isNull()) {
+            if (e.attribute("type") == "geometry" && !e.hasAttribute("fixed")) {
+                // Effects with a geometry parameter need to sync in / out with parent clip
+                needInOutSync = true;
+            }
             if (e.attribute("type") == "simplekeyframe") {
                 QStringList values = e.attribute("keyframes").split(";", QString::SkipEmptyParts);
                 double factor = e.attribute("factor", "1").toDouble();
@@ -1468,6 +1471,11 @@ EffectsParameterList ClipItem::addEffect(const QDomElement effect, bool /*animat
             }
         }
     }
+    if (needInOutSync) {
+        parameters.addParam("in", QString::number(cropStart().frames(m_fps)));
+        parameters.addParam("out", QString::number((cropStart() + cropDuration()).frames(m_fps) - 1));
+        parameters.addParam("_sync_in_out", "1");
+    }
     m_effectNames = m_effectList.effectNames().join(" / ");
     if (fade > 0) m_startFade = fade;
     else if (fade < 0) m_endFade = -fade;
@@ -1728,28 +1736,6 @@ void ClipItem::updateKeyframes(QDomElement effect)
     if (!m_keyframes.contains(m_selectedKeyframe)) m_selectedKeyframe = -1;
 }
 
-/*void ClipItem::slotGetIntraThumbs(CustomTrackView *view, int start, int end)
-{
-    const int theight = KdenliveSettings::trackheight();
-    const int twidth = FRAME_SIZE;
-    QString path = m_clip->fileURL().path() + "%";
-    QPixmap p;
-    for (int i = start; i <= end; i++) {
-#if KDE_IS_VERSION(4,5,0)
-        if (!view->m_pixmapCache->contains(path + QString::number(i))) {
-            p = m_clip->extractImage(i, twidth, theight);
-            view->m_pixmapCache->insertPixmap(path + QString::number(i), p);
-        }
-#else
-        if (!view->m_pixmapCache->find(path + QString::number(i), p)) {
-            p = m_clip->extractImage(i, twidth, theight);
-            view->m_pixmapCache->insert(path + QString::number(i), p);
-        }
-#endif
-    }
-    update();
-}*/
-
 Mlt::Producer *ClipItem::getProducer(int track, bool trackSpecific)
 {
     if (isAudioOnly())
@@ -1770,7 +1756,7 @@ QMap<int, QDomElement> ClipItem::adjustEffectsToDuration(int width, int height,
             QString id = effect.attribute("id");
             int in = EffectsList::parameter(effect, "in").toInt();
             int out = EffectsList::parameter(effect, "out").toInt();
-            int clipEnd = (cropStart() + cropDuration()).frames(m_fps);
+            int clipEnd = (cropStart() + cropDuration()).frames(m_fps) - 1;
             if (id == "fade_from_black" || id == "fadein") {
                 if (in != cropStart().frames(m_fps)) {
                     effects[i] = effect.cloneNode().toElement();
@@ -1791,7 +1777,7 @@ QMap<int, QDomElement> ClipItem::adjustEffectsToDuration(int width, int height,
                 if (out != clipEnd) {
                     effects[i] = effect.cloneNode().toElement();
                     int diff = out - clipEnd;
-                    in -= diff;
+                    in = qMax(in - diff, (int) cropStart().frames(m_fps));
                     out -= diff;
                     EffectsList::setParameter(effect, "in", QString::number(in));
                     EffectsList::setParameter(effect, "out", QString::number(out));