]> git.sesse.net Git - kdenlive/blobdiff - src/clipitem.cpp
Cleanup & fix multi clip transcoding
[kdenlive] / src / clipitem.cpp
index 7b95d695fcd774d49b5cad202f42bfbcfd4ac3f3..8df2212c3e73b994407be5e0c5aa041d5d3de2bf 100644 (file)
@@ -188,21 +188,21 @@ void ClipItem::setEffectList(const EffectsList effectList)
                         }
                     } else if (effectId == "fadeout") {
                         if (m_effectList.hasEffect(QString(), "fade_to_black") == -1) {
-                            if (e.attribute("name") == "out") fade -= e.attribute("value").toInt();
-                            else if (e.attribute("name") == "in") fade += e.attribute("value").toInt();
+                            if (e.attribute("name") == "out") fade += e.attribute("value").toInt();
+                            else if (e.attribute("name") == "in") fade -= e.attribute("value").toInt();
                         } else {
                             QDomElement fadeout = m_effectList.getEffectByTag(QString(), "fade_to_black");
-                            if (fadeout.attribute("name") == "out") fade -= fadeout.attribute("value").toInt();
-                            else if (fadeout.attribute("name") == "in") fade += fadeout.attribute("value").toInt();
+                            if (fadeout.attribute("name") == "out") fade += fadeout.attribute("value").toInt();
+                            else if (fadeout.attribute("name") == "in") fade -= fadeout.attribute("value").toInt();
                         }
                     } else if (effectId == "fade_to_black") {
                         if (m_effectList.hasEffect(QString(), "fadeout") == -1) {
-                            if (e.attribute("name") == "out") fade -= e.attribute("value").toInt();
-                            else if (e.attribute("name") == "in") fade += e.attribute("value").toInt();
+                            if (e.attribute("name") == "out") fade += e.attribute("value").toInt();
+                            else if (e.attribute("name") == "in") fade -= e.attribute("value").toInt();
                         } else {
                             QDomElement fadeout = m_effectList.getEffectByTag(QString(), "fadeout");
-                            if (fadeout.attribute("name") == "out") fade -= fadeout.attribute("value").toInt();
-                            else if (fadeout.attribute("name") == "in") fade += fadeout.attribute("value").toInt();
+                            if (fadeout.attribute("name") == "out") fade += fadeout.attribute("value").toInt();
+                            else if (fadeout.attribute("name") == "in") fade -= fadeout.attribute("value").toInt();
                         }
                     }
                 }
@@ -823,7 +823,7 @@ void ClipItem::paint(QPainter *painter,
             else {
 #if KDE_IS_VERSION(4,5,0)
                 if (m_clip && m_clip->thumbProducer()) {
-                    QString path = m_clip->fileURL().path() + "_";
+                    QString path = m_clip->fileURL().path() + '_';
                     QImage img;
                     QPen pen(Qt::white);
                     pen.setStyle(Qt::DotLine);
@@ -1026,8 +1026,8 @@ OPERATIONTYPE ClipItem::operationMode(QPointF pos)
     }
     QRectF rect = sceneBoundingRect();
     int addtransitionOffset = 10;
-    // Don't allow add transition if track height is very small
-    if (rect.height() < 30) addtransitionOffset = 0;
+    // Don't allow add transition if track height is very small. No transitions for audio only clips
+    if (rect.height() < 30 || isAudioOnly() || m_clipType == AUDIO) addtransitionOffset = 0;
 
     if (qAbs((int)(pos.x() - (rect.x() + m_startFade))) < maximumOffset  && qAbs((int)(pos.y() - rect.y())) < 6) {
         return FADEIN;
@@ -1060,7 +1060,8 @@ void ClipItem::resetFrameWidth(int width)
 QList <GenTime> ClipItem::snapMarkers() const
 {
     QList < GenTime > snaps;
-    QList < GenTime > markers = baseClip()->snapMarkers();
+    if (!m_clip) return snaps;
+    QList < GenTime > markers = m_clip->snapMarkers();
     GenTime pos;
 
     for (int i = 0; i < markers.size(); i++) {
@@ -1076,7 +1077,8 @@ QList <GenTime> ClipItem::snapMarkers() const
 QList <CommentedTime> ClipItem::commentedSnapMarkers() const
 {
     QList < CommentedTime > snaps;
-    QList < CommentedTime > markers = baseClip()->commentedSnapMarkers();
+    if (!m_clip) return snaps;
+    QList < CommentedTime > markers = m_clip->commentedSnapMarkers();
     GenTime pos;
 
     for (int i = 0; i < markers.size(); i++) {
@@ -1301,7 +1303,9 @@ QVariant ClipItem::itemChange(GraphicsItemChange change, const QVariant &value)
         int xpos = projectScene()->getSnapPointForPos((int) newPos.x(), KdenliveSettings::snaptopoints());
         xpos = qMax(xpos, 0);
         newPos.setX(xpos);
-        int newTrack = newPos.y() / KdenliveSettings::trackheight();
+       // Warning: newPos gives a position relative to the click event, so hack to get absolute pos
+       int yOffset = property("y_absolute").toInt() + newPos.y();
+        int newTrack = yOffset / KdenliveSettings::trackheight();
         newTrack = qMin(newTrack, projectScene()->tracksCount() - 1);
         newTrack = qMax(newTrack, 0);
         newPos.setY((int)(newTrack  * KdenliveSettings::trackheight() + 1));
@@ -1539,14 +1543,14 @@ EffectsParameterList ClipItem::addEffect(QDomElement effect, bool /*animate*/)
                 needInOutSync = true;
             }
             if (e.attribute("type") == "simplekeyframe") {
-                QStringList values = e.attribute("keyframes").split(";", QString::SkipEmptyParts);
+                QStringList values = e.attribute("keyframes").split(';', QString::SkipEmptyParts);
                 double factor = locale.toDouble(e.attribute("factor", "1"));
                 double offset = e.attribute("offset", "0").toDouble();
                 if (factor != 1 || offset != 0) {
                     for (int j = 0; j < values.count(); j++) {
                         QString pos = values.at(j).section(':', 0, 0);
                         double val = (locale.toDouble(values.at(j).section(':', 1, 1)) - offset) / factor;
-                        values[j] = pos + "=" + locale.toString(val);
+                        values[j] = pos + '=' + locale.toString(val);
                     }
                 }
                 parameters.addParam(e.attribute("name"), values.join(";"));
@@ -1650,8 +1654,8 @@ void ClipItem::setSpeed(const double speed, const int strobe)
     if (m_speed <= 0 && m_speed > -1)
         m_speed = -1.0;
     m_strobe = strobe;
-    if (m_speed == 1.0) m_clipName = baseClip()->name();
-    else m_clipName = baseClip()->name() + " - " + QString::number(speed * 100, 'f', 0) + '%';
+    if (m_speed == 1.0) m_clipName = m_clip->name();
+    else m_clipName = m_clip->name() + " - " + QString::number(speed * 100, 'f', 0) + '%';
     m_info.cropStart = GenTime((int)(m_speedIndependantInfo.cropStart.frames(m_fps) / qAbs(m_speed) + 0.5), m_fps);
     m_info.cropDuration = GenTime((int)(m_speedIndependantInfo.cropDuration.frames(m_fps) / qAbs(m_speed) + 0.5), m_fps);
     //update();
@@ -1797,18 +1801,18 @@ void ClipItem::insertKeyframe(QDomElement effect, int pos, int val)
                     newkfr.append(str);
                 } else if (!added) {
                     if (i == m_visibleParam)
-                        newkfr.append(QString::number(pos) + ":" + QString::number(val));
+                        newkfr.append(QString::number(pos) + ':' + QString::number(val));
                     else
-                        newkfr.append(QString::number(pos) + ":" + locale.toString(newval));
+                        newkfr.append(QString::number(pos) + ':' + locale.toString(newval));
                     if (kpos > pos) newkfr.append(str);
                     added = true;
                 } else newkfr.append(str);
             }
             if (!added) {
                 if (i == m_visibleParam)
-                    newkfr.append(QString::number(pos) + ":" + QString::number(val));
+                    newkfr.append(QString::number(pos) + ':' + QString::number(val));
                 else
-                    newkfr.append(QString::number(pos) + ":" + e.attribute("default"));
+                    newkfr.append(QString::number(pos) + ':' + e.attribute("default"));
             }
             e.setAttribute("keyframes", newkfr.join(";"));
         }
@@ -1836,9 +1840,9 @@ void ClipItem::movedKeyframe(QDomElement effect, int oldpos, int newpos, double
                     newpos = qMax(newpos, start);
                     newpos = qMin(newpos, end);
                     if (i == m_visibleParam)
-                        newkfr.append(QString::number(newpos) + ":" + locale.toString(value));
+                        newkfr.append(QString::number(newpos) + ':' + locale.toString(value));
                     else
-                        newkfr.append(QString::number(newpos) + ":" + str.section(':', 1, 1));
+                        newkfr.append(QString::number(newpos) + ':' + str.section(':', 1, 1));
                 }
             }
             e.setAttribute("keyframes", newkfr.join(";"));
@@ -1875,7 +1879,7 @@ Mlt::Producer *ClipItem::getProducer(int track, bool trackSpecific)
     if (isAudioOnly())
         return m_clip->audioProducer(track);
     else if (isVideoOnly())
-        return m_clip->videoProducer();
+        return m_clip->videoProducer(track);
     else
         return m_clip->getProducer(trackSpecific ? track : -1);
 }
@@ -2055,13 +2059,13 @@ void ClipItem::updateGeometryKeyframes(QDomElement effect, int paramIndex, int w
     if (offset > 0) {
         QStringList kfrs = data.split(';');
         data.clear();
-        foreach (QString keyframe, kfrs) {
+        foreach (const QString &keyframe, kfrs) {
             if (keyframe.contains('=')) {
                 int pos = keyframe.section('=', 0, 0).toInt();
                 pos += offset;
-                data.append(QString::number(pos) + "=" + keyframe.section('=', 1) + ";");
+                data.append(QString::number(pos) + '=' + keyframe.section('=', 1) + ";");
             }
-            else data.append(keyframe + ";");
+            else data.append(keyframe + ';');
         }
     }
     Mlt::Geometry geometry(data.toUtf8().data(), oldInfo.cropDuration.frames(m_fps), width, height);