From: Jean-Baptiste Mardelle Date: Tue, 27 Oct 2009 00:11:07 +0000 (+0000) Subject: Fix corruption in overwrite mode X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=7916aa43c5b20697c5220f4e40eb830d92ddabe3;p=kdenlive Fix corruption in overwrite mode svn path=/trunk/kdenlive/; revision=4067 --- diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 79b36521..4dd28fd6 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -72,7 +72,7 @@ #include #include #include - +#include 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 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 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 (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 (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 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 selection = m_scene->items(rect); + QList timelineList; + timelineList.append(0); + for (int i = 0; i < selection.count(); i++) { + if (selection.at(i)->type() == AVWIDGET) { + ClipItem *clip = static_cast (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")); +} + diff --git a/src/customtrackview.h b/src/customtrackview.h index b45e283a..cdc5a3e8 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -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 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); diff --git a/src/renderer.cpp b/src/renderer.cpp index b984ca4a..0ece7e18 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -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 Render::checkTrackSequence(int track) +{ + QList 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); diff --git a/src/renderer.h b/src/renderer.h index 8958def5..1ad5e5bf 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -221,6 +221,7 @@ Q_OBJECT public: #ifdef Q_WS_MAC void showFrame(Mlt::Frame&); #endif + QList 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... */