]> git.sesse.net Git - kdenlive/commitdiff
Fix corruption in overwrite mode
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 27 Oct 2009 00:11:07 +0000 (00:11 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 27 Oct 2009 00:11:07 +0000 (00:11 +0000)
svn path=/trunk/kdenlive/; revision=4067

src/customtrackview.cpp
src/customtrackview.h
src/renderer.cpp
src/renderer.h

index 79b36521cd00353361314df6687fae3a671b6a0c..4dd28fd6fee83b33bcdfcdf67bcfe44251e7aa01 100644 (file)
@@ -72,7 +72,7 @@
 #include <QScrollBar>
 #include <QApplication>
 #include <QInputDialog>
-
+#include <KMessageBox>
 
 bool sortGuidesList(const Guide *g1 , const Guide *g2)
 {
@@ -2033,12 +2033,14 @@ void CustomTrackView::dropEvent(QDropEvent * event)
     setFocus();
 }
 
-void CustomTrackView::adjustTimelineClips(EDITMODE mode, AbstractClipItem *item, QUndoCommand *command)
+void CustomTrackView::adjustTimelineClips(EDITMODE mode, ClipItem *item, QUndoCommand *command)
 {
     if (mode == OVERWRITEEDIT) {
         // if we are in overwrite or push mode, move clips accordingly
+        bool snap = KdenliveSettings::snaptopoints();
+        KdenliveSettings::setSnaptopoints(false);
         ItemInfo info = item->info();
-        QRectF rect(info.startPos.frames(m_document->fps()), info.track * m_tracksHeight + m_tracksHeight / 2, (info.endPos - info.startPos).frames(m_document->fps()) - 1, m_tracksHeight / 2 - 2);
+        QRectF rect(info.startPos.frames(m_document->fps()), info.track * m_tracksHeight + m_tracksHeight / 2, (info.endPos - info.startPos).frames(m_document->fps()) - 1, 5);
         QList<QGraphicsItem *> selection = m_scene->items(rect);
         selection.removeAll(item);
         for (int i = 0; i < selection.count(); i++) {
@@ -2050,13 +2052,13 @@ void CustomTrackView::adjustTimelineClips(EDITMODE mode, AbstractClipItem *item,
                         ItemInfo dupInfo = clipInfo;
                         GenTime diff = info.startPos - clip->startPos();
                         dupInfo.startPos = info.startPos;
-                        dupInfo.cropStart += diff + GenTime(1, m_document->fps());
-                        dupInfo.cropDuration += GenTime() - diff;
+                        dupInfo.cropStart += diff;
+                        dupInfo.cropDuration = clipInfo.endPos - info.startPos;
                         ItemInfo newdupInfo = dupInfo;
                         GenTime diff2 = info.endPos - info.startPos;
-                        newdupInfo.startPos = GenTime(info.endPos.frames(m_document->fps()), m_document->fps());
+                        newdupInfo.startPos = info.endPos;
                         newdupInfo.cropStart += diff2;
-                        newdupInfo.cropDuration += GenTime() - diff2;
+                        newdupInfo.cropDuration = clipInfo.endPos - info.endPos;
                         new RazorClipCommand(this, clipInfo, info.startPos, false, command);
                         new ResizeClipCommand(this, dupInfo, newdupInfo, false, false, command);
                         ClipItem *dup = cutClip(clipInfo, info.startPos, true, false);
@@ -2081,6 +2083,7 @@ void CustomTrackView::adjustTimelineClips(EDITMODE mode, AbstractClipItem *item,
                 }
             }
         }
+        KdenliveSettings::setSnaptopoints(snap);
     }
 }
 
@@ -2089,6 +2092,8 @@ void CustomTrackView::adjustTimelineTransitions(EDITMODE mode, Transition *item,
 {
     if (mode == OVERWRITEEDIT) {
         // if we are in overwrite or push mode, move clips accordingly
+        bool snap = KdenliveSettings::snaptopoints();
+        KdenliveSettings::setSnaptopoints(false);
         ItemInfo info = item->info();
         QRectF rect(info.startPos.frames(m_document->fps()), info.track * m_tracksHeight + m_tracksHeight, (info.endPos - info.startPos).frames(m_document->fps()) - 1, 5);
         QList<QGraphicsItem *> selection = m_scene->items(rect);
@@ -2117,6 +2122,7 @@ void CustomTrackView::adjustTimelineTransitions(EDITMODE mode, Transition *item,
                 }
             }
         }
+        KdenliveSettings::setSnaptopoints(snap);
     }
 }
 
@@ -2724,7 +2730,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
                 if (success) {
                     QUndoCommand *moveCommand = new QUndoCommand();
                     moveCommand->setText(i18n("Move clip"));
-                    adjustTimelineClips(m_scene->editMode(), m_dragItem, moveCommand);
+                    adjustTimelineClips(m_scene->editMode(), item, moveCommand);
 
                     int tracknumber = m_document->tracksCount() - item->track() - 1;
                     bool isLocked = m_document->trackInfoAt(tracknumber).isLocked;
@@ -2830,6 +2836,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
                         }
                     }
                     m_commandStack->push(moveCommand);
+                    //checkTrackSequence(m_dragItem->track());
                 } else {
                     // undo last move and emit error message
                     bool snap = KdenliveSettings::snaptopoints();
@@ -2915,7 +2922,7 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
                         ClipItem *clip = static_cast <ClipItem*>(item);
                         info.track = m_document->tracksCount() - info.track;
                         Mlt::Producer *prod;
-                        adjustTimelineClips(m_scene->editMode(), item, moveGroup);
+                        adjustTimelineClips(m_scene->editMode(), clip, moveGroup);
                         if (clip->isAudioOnly()) prod = clip->baseClip()->audioProducer(info.track);
                         else if (clip->isVideoOnly()) prod = clip->baseClip()->videoProducer();
                         else prod = clip->baseClip()->producer(info.track);
@@ -3017,14 +3024,20 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event)
 
                 m_commandStack->push(resizeCommand);
             } else {
+                bool snap = KdenliveSettings::snaptopoints();
+                KdenliveSettings::setSnaptopoints(false);
                 m_dragItem->resizeStart((int) m_dragItemInfo.startPos.frames(m_document->fps()));
+                KdenliveSettings::setSnaptopoints(snap);
                 emit displayMessage(i18n("Error when resizing clip"), ErrorMessage);
             }
         } else if (m_dragItem->type() == TRANSITIONWIDGET) {
             Transition *transition = static_cast <Transition *>(m_dragItem);
             if (!m_document->renderer()->mltMoveTransition(transition->transitionTag(), (int)(m_document->tracksCount() - m_dragItemInfo.track), (int)(m_document->tracksCount() - m_dragItemInfo.track), transition->transitionEndTrack(), m_dragItemInfo.startPos, m_dragItemInfo.endPos, info.startPos, info.endPos)) {
                 // Cannot resize transition
+                bool snap = KdenliveSettings::snaptopoints();
+                KdenliveSettings::setSnaptopoints(false);
                 transition->resizeStart((int) m_dragItemInfo.startPos.frames(m_document->fps()));
+                KdenliveSettings::setSnaptopoints(snap);
                 emit displayMessage(i18n("Cannot resize transition"), ErrorMessage);
             } else {
                 MoveTransitionCommand *command = new MoveTransitionCommand(this, m_dragItemInfo, info, false);
@@ -5431,4 +5444,26 @@ void CustomTrackView::setEditMode(EDITMODE mode)
     m_scene->setEditMode(mode);
 }
 
+void CustomTrackView::checkTrackSequence(int track)
+{
+    QList <int> times = m_document->renderer()->checkTrackSequence(m_document->tracksCount() - track);
+    //track = m_document->tracksCount() -track;
+    QRectF rect(0, track * m_tracksHeight + m_tracksHeight / 2, sceneRect().width(), 2);
+    QList<QGraphicsItem *> selection = m_scene->items(rect);
+    QList <int> timelineList;
+    timelineList.append(0);
+    for (int i = 0; i < selection.count(); i++) {
+        if (selection.at(i)->type() == AVWIDGET) {
+            ClipItem *clip = static_cast <ClipItem *>(selection.at(i));
+            int start = clip->startPos().frames(m_document->fps());
+            int end = clip->endPos().frames(m_document->fps());
+            if (!timelineList.contains(start)) timelineList.append(start);
+            if (!timelineList.contains(end)) timelineList.append(end);
+        }
+    }
+    qSort(timelineList);
+    kDebug() << "// COMPARE:\n" << times << "\n" << timelineList << "\n-------------------";
+    if (times != timelineList) KMessageBox::sorry(this, i18n("error"), i18n("TRACTOR"));
+}
+
 
index b45e283a960e0a6e45287392dfeee485c7d21445..cdc5a3e8b9cd3743d00e25dbdecf21c7351f27c7 100644 (file)
@@ -266,7 +266,7 @@ private:
     /** Selects all items in the scene rect, and sets ok to false if a group going over several tracks is found in it */
     QList<QGraphicsItem *> checkForGroups(const QRectF &rect, bool *ok);
     /** Adjust clips under another one when working in overwrite mode */
-    void adjustTimelineClips(EDITMODE mode, AbstractClipItem *item, QUndoCommand *command);
+    void adjustTimelineClips(EDITMODE mode, ClipItem *item, QUndoCommand *command);
     void adjustTimelineTransitions(EDITMODE mode, Transition *item, QUndoCommand *command);
 
 private slots:
@@ -276,6 +276,7 @@ private slots:
     void slotEditTimeLineGuide();
     void slotDeleteTimeLineGuide();
     void slotFetchNextThumbs();
+    void checkTrackSequence(int track);
 
 signals:
     void cursorMoved(int, int);
index b984ca4ab1b187c1d5b0f067951af2991558d550..0ece7e18ab0ff30ccb7f6e9ee04c0e1d746b0233 100644 (file)
@@ -2830,6 +2830,7 @@ bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn
                 trackPlaylist.insert_blank(clipIndex, clipProducer->get_playtime() - 1);
             }
             int newIndex = trackPlaylist.insert_at(moveEnd, clipProducer, 1);
+            trackPlaylist.consolidate_blanks(1);
             delete clipProducer;
             /*if (QString(clipProducer.parent().get("transparency")).toInt() == 1) {
             mltMoveTransparency(moveStart, moveEnd, startTrack, endTrack, QString(clipProducer.parent().get("id")).toInt());
@@ -2856,7 +2857,7 @@ bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn
                 m_isBlocked--;
                 return false;
             }
-            trackPlaylist.consolidate_blanks(0);
+            trackPlaylist.consolidate_blanks(1);
             destTrackPlaylist.consolidate_blanks(1);
             Mlt::Producer *clip;
             // check if we are moving a slowmotion producer
@@ -2909,6 +2910,32 @@ bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn
     return true;
 }
 
+
+QList <int> Render::checkTrackSequence(int track)
+{
+    QList <int> list;
+    Mlt::Service service(m_mltProducer->parent().get_service());
+    if (service.type() != tractor_type) {
+        kWarning() << "// TRACTOR PROBLEM";
+        return list;
+    }
+    Mlt::Tractor tractor(service);
+    mlt_service_lock(service.get_service());
+    Mlt::Producer trackProducer(tractor.track(track));
+    Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
+    int clipNb = trackPlaylist.count();
+    //kDebug() << "// PARSING SCENE TRACK: " << t << ", CLIPS: " << clipNb;
+    for (int i = 0; i < clipNb; i++) {
+        Mlt::Producer *c = trackPlaylist.get_clip(i);
+        int pos = trackPlaylist.clip_start(i);
+        if (!list.contains(pos)) list.append(pos);
+        pos += c->get_playtime();
+        if (!list.contains(pos)) list.append(pos);
+        delete c;
+    }
+    return list;
+}
+
 bool Render::mltMoveTransition(QString type, int startTrack, int newTrack, int newTransitionTrack, GenTime oldIn, GenTime oldOut, GenTime newIn, GenTime newOut)
 {
     int new_in = (int)newIn.frames(m_fps);
index 8958def58559f5cf9efc3cd18d18f832e72f0e22..1ad5e5bfe51c997c414957bbfe98e64959c5e7a1 100644 (file)
@@ -221,6 +221,7 @@ Q_OBJECT public:
 #ifdef Q_WS_MAC
     void showFrame(Mlt::Frame&);
 #endif
+    QList <int> checkTrackSequence(int);
 
 private:   // Private attributes & methods
     /** The name of this renderer - useful to identify the renderes by what they do - e.g. background rendering, workspace monitor, etc... */