]> git.sesse.net Git - kdenlive/commitdiff
Fix transition track not correctly updated after inserting track
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 7 Apr 2012 19:20:42 +0000 (21:20 +0200)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Sat, 7 Apr 2012 19:20:42 +0000 (21:20 +0200)
effects/mirror.xml
src/customtrackview.cpp
src/customtrackview.h
src/definitions.h
src/renderer.cpp
src/renderer.h
src/transition.cpp
src/transition.h

index 9f905c45ac342fc59cd6a3771c7c15540db9eb2e..903ea23e89775c5805565dc132f5f7b930d6e761 100644 (file)
@@ -4,6 +4,7 @@
        <description>Flip your image in any direction</description>
        <author>Charles Yates</author>
        <parameter type="list" name="mirror" default="horizontal" paramlist="horizontal;vertical;diagonal;xdiagonal;flip;flop">
+          <paramlistdisplay>Horizontal,Vertical,Diagonal,X Diagonal,Flip,Flop</paramlistdisplay>
                <name>Mirroring direction</name>
        </parameter>
        <parameter type="bool" name="reverse" default="0">
index 6a28783f1f0b850167bc359720fba832772cf51b..9e273c21a864722caf6c098f58484c83d45a0b55 100644 (file)
@@ -2666,13 +2666,14 @@ int CustomTrackView::duration() const
 
 void CustomTrackView::addTrack(TrackInfo type, int ix)
 {
+    QList <TransitionInfo> transitionInfos;
     if (ix == -1 || ix == m_document->tracksCount()) {
         m_document->insertTrack(0, type);
-        m_document->renderer()->mltInsertTrack(1, type.type == VIDEOTRACK);
+        transitionInfos = m_document->renderer()->mltInsertTrack(1, type.type == VIDEOTRACK);
     } else {
         m_document->insertTrack(m_document->tracksCount() - ix, type);
         // insert track in MLT playlist
-        m_document->renderer()->mltInsertTrack(m_document->tracksCount() - ix, type.type == VIDEOTRACK);
+        transitionInfos = m_document->renderer()->mltInsertTrack(m_document->tracksCount() - ix, type.type == VIDEOTRACK);
 
         double startY = ix * m_tracksHeight + 1 + m_tracksHeight / 2;
         QRectF r(0, startY, sceneRect().width(), sceneRect().height() - startY);
@@ -2714,14 +2715,25 @@ void CustomTrackView::addTrack(TrackInfo type, int ix)
                         emit displayMessage(i18n("Cannot update clip (time: %1, track: %2)", clipinfo.startPos.frames(m_document->fps()), clipinfo.track), ErrorMessage);
                     }
                 }
-            } else if (item->type() == TRANSITIONWIDGET) {
+            } /*else if (item->type() == TRANSITIONWIDGET) {
                 Transition *tr = static_cast <Transition *>(item);
                 int track = tr->transitionEndTrack();
                 if (track >= ix) {
                     tr->updateTransitionEndTrack(getPreviousVideoTrack(clipinfo.track));
                 }
-            }
+            }*/
         }
+        // Sync transition tracks with MLT playlist
+        
+        Transition *tr;        
+       TransitionInfo info;
+       for (int i = 0; i < transitionInfos.count(); i++) {
+           info = transitionInfos.at(i);
+           tr = getTransitionItem(info);
+           if (tr) tr->setForcedTrack(info.forceTrack, info.a_track);
+           else kDebug()<<"// Cannot update TRANSITION AT: "<<info.b_track<<" / "<<info.startPos.frames(m_document->fps()); 
+       }
+       
         resetSelectionGroup(false);
         m_document->renderer()->unlockService(tractor);
     }
@@ -4257,6 +4269,14 @@ ClipItem *CustomTrackView::getClipItemAt(GenTime pos, int track)
     return getClipItemAt((int) pos.frames(m_document->fps()), track);
 }
 
+
+Transition *CustomTrackView::getTransitionItem(TransitionInfo info)
+{
+    int pos = info.startPos.frames(m_document->fps());
+    int track = m_document->tracksCount() - info.b_track;
+    return getTransitionItemAt(pos, track);
+}
+
 Transition *CustomTrackView::getTransitionItemAt(int pos, int track)
 {
     const QPointF p(pos, track * m_tracksHeight + Transition::itemOffset() + 1);
index 76b5cfed76b29880e5e8cb9103cd77b1f2e02ac7..afde5018d51a83508628b37c949b957327940af0 100644 (file)
@@ -317,6 +317,7 @@ private:
     ClipItem *getClipItemAt(GenTime pos, int track);
     ClipItem *getClipItemAtEnd(GenTime pos, int track);
     ClipItem *getClipItemAtStart(GenTime pos, int track);
+    Transition *getTransitionItem(TransitionInfo info);
     Transition *getTransitionItemAt(int pos, int track);
     Transition *getTransitionItemAt(GenTime pos, int track);
     Transition *getTransitionItemAtEnd(GenTime pos, int track);
index fd2656f9fd25ac43e53f7f446c9c685b4445b83b..da7b3148037195b55dbcc0b90c2ae88aeeca8efb 100644 (file)
@@ -94,6 +94,19 @@ struct ItemInfo {
     int track;
 };
 
+struct TransitionInfo {
+/** startPos is the position where the clip starts on the track */
+    GenTime startPos;
+    /** endPos is the duration where the clip ends on the track */
+    GenTime endPos;
+    /** the track on which the transition is (b_track)*/
+    int b_track;
+    /** the track on which the transition is applied (a_track)*/
+    int a_track;
+    /** Does the user request for a special a_track */
+    bool forceTrack;
+};
+
 struct MltVideoProfile {
     QString path;
     QString description;
index 7c4d9ae99128d2c290cf82a4a09d4c6443100d4a..9f7da6d539105fdc963db274f691c05103944fba 100644 (file)
@@ -3952,19 +3952,17 @@ void Render::fillSlowMotionProducers()
     }
 }
 
-void Render::mltInsertTrack(int ix, bool videoTrack)
+QList <TransitionInfo> Render::mltInsertTrack(int ix, bool videoTrack)
 {
-    blockSignals(true);
-
     Mlt::Service service(m_mltProducer->parent().get_service());
-    service.lock();
     if (service.type() != tractor_type) {
         kWarning() << "// TRACTOR PROBLEM";
-        return;
+        return QList <TransitionInfo> ();
     }
-
+    blockSignals(true);
+    service.lock();
     Mlt::Tractor tractor(service);
-
+    QList <TransitionInfo> transitionInfos;
     Mlt::Playlist playlist;
     int ct = tractor.count();
     if (ix > ct) {
@@ -4006,9 +4004,10 @@ void Render::mltInsertTrack(int ix, bool videoTrack)
            nextservice = mlt_service_producer(nextservice);
             int currentbTrack = transition.get_b_track();
             int currentaTrack = transition.get_a_track();
-
            bool trackChanged = false;
+           bool forceTransitionTrack = false;
             if (currentbTrack >= ix) {
+               if (currentbTrack == ix && currentaTrack < ix) forceTransitionTrack = true;
                currentbTrack++;
                trackChanged = true;
            }
@@ -4016,6 +4015,7 @@ void Render::mltInsertTrack(int ix, bool videoTrack)
                currentaTrack++;
                trackChanged = true;
            }
+           kDebug()<<"// Newtrans: "<<currentaTrack<<"/"<<currentbTrack;
            
            // disconnect all transitions
            Mlt::Properties trans_props(transition.get_properties());
@@ -4024,9 +4024,17 @@ void Render::mltInsertTrack(int ix, bool videoTrack)
            new_trans_props.inherit(trans_props);
            
            if (trackChanged) {
-               // Transition track needs to be adjusted        
+               // Transition track needs to be adjusted
                cp->set("a_track", currentaTrack);
                cp->set("b_track", currentbTrack);
+               // Check if transition track was changed and needs to be forced
+               if (forceTransitionTrack) cp->set("force_track", 1);
+               TransitionInfo trInfo;
+               trInfo.startPos = GenTime(transition.get_in(), m_fps);
+               trInfo.a_track = currentaTrack;
+               trInfo.b_track = currentbTrack;
+               trInfo.forceTrack = cp->get_int("force_track");
+               transitionInfos.append(trInfo);
            }
            trList.append(cp);
            field->disconnect_service(transition);
@@ -4055,6 +4063,7 @@ void Render::mltInsertTrack(int ix, bool videoTrack)
     
     service.unlock();
     blockSignals(false);
+    return transitionInfos;
 }
 
 
index b7b53c7acc3a2532b25d8a2d6dd18caa41e87401..c71f4b6a9441c42550bd60e4fc0671f1e51393a5 100644 (file)
@@ -251,7 +251,7 @@ Q_OBJECT public:
     void mltMoveTransparency(int startTime, int endTime, int startTrack, int endTrack, int id);
     void mltDeleteTransparency(int pos, int track, int id);
     void mltResizeTransparency(int oldStart, int newStart, int newEnd, int track, int id);
-    void mltInsertTrack(int ix, bool videoTrack);
+    QList <TransitionInfo> mltInsertTrack(int ix, bool videoTrack);
     void mltDeleteTrack(int ix);
     bool mltUpdateClipProducer(Mlt::Tractor *tractor, int track, int pos, Mlt::Producer *prod);
     void mltPlantTransition(Mlt::Field *field, Mlt::Transition &tr, int a_track, int b_track);
index d9e931d2d9c3cefa920fdc772b1b75b80f8229b6..12519ea90e148cb155afd4f3ef490a7a6528a68e 100644 (file)
@@ -136,17 +136,6 @@ void Transition::setTransitionParameters(const QDomElement params)
     update();
 }
 
-
-bool Transition::invertedTransition() const
-{
-    return false; //m_parameters.attribute("reverse").toInt();
-}
-
-void Transition::setTransitionDirection(bool /*inv*/)
-{
-    //m_parameters.setAttribute("reverse", inv);
-}
-
 int Transition::transitionEndTrack() const
 {
     return m_transitionTrack;
@@ -335,16 +324,6 @@ Transition *Transition::clone() {
     return new Transition::Transition(rect(), m_referenceClip, toXML() , m_fps);
 }*/
 
-/*
-Transition *Transition::reparent(ClipItem * clip) {
-    return new Transition::Transition(rect(), clip, toXML(), m_fps, m_referenceClip->startPos());
-}*/
-
-bool Transition::isValid() const
-{
-    return true; //(m_transitionDuration != GenTime());
-}
-
 const ClipItem *Transition::referencedClip() const
 {
     return m_referenceClip;
index 614d37eaef2536309b10279c61f2447cf6d8d59b..a26f19d17511b55e6a03f551cfb52fe7b914f588 100644 (file)
@@ -55,7 +55,6 @@ public:
     int transitionEndTrack() const;
     bool hasClip(const ClipItem * clip) const;
     bool belongsToClip(const ClipItem * clip) const;
-    bool invertedTransition() const;
     QString transitionTag() const;
     QStringList transitionInfo() const;
     OPERATIONTYPE operationMode(QPointF pos);
@@ -63,10 +62,7 @@ public:
     static int itemOffset();
     //const QMap < QString, QString > transitionParameters() const;
     void setTransitionParameters(const QDomElement params);
-    void setTransitionDirection(bool inv);
     void setTransitionTrack(int track);
-    //Transition *reparent(ClipItem * clip);
-    bool isValid() const;
 
     /** @brief Links the transition to another track.
      *