From b769040273c8cd2cfdd721912b2d916f796c0cec Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Tue, 23 Dec 2008 01:38:58 +0000 Subject: [PATCH] Rewrite the spacer command, should hopefully solve: http://www.kdenlive.org:80/mantis/view.php?id=271 svn path=/branches/KDE4/; revision=2818 --- src/customtrackview.cpp | 173 +++++++++++++++++++++++++++++-------- src/customtrackview.h | 3 +- src/insertspacecommand.cpp | 12 ++- src/insertspacecommand.h | 5 +- src/renderer.cpp | 80 ++++++++++++----- src/renderer.h | 2 +- 6 files changed, 210 insertions(+), 65 deletions(-) diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index cebd5569..85c646a2 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -290,7 +290,7 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) { } else if (m_operationMode == SPACER && move) { // spacer tool int mappedClick = (int)(mapToScene(m_clickEvent).x() + 0.5); - m_selectionGroup->setPos(mappedXPos + (m_spacerStart - mappedClick) , m_selectionGroup->pos().y()); + m_selectionGroup->setPos(mappedXPos + (((int) m_selectionGroup->boundingRect().topLeft().x() + 0.5) - mappedClick) , m_selectionGroup->pos().y()); } } @@ -616,16 +616,11 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) { } m_selectionGroup = new AbstractGroupItem(m_document->fps()); scene()->addItem(m_selectionGroup); - m_spacerStart = -1; - int itemStart; + for (int i = 0; i < selection.count(); i++) { if (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET) { m_selectionGroup->addToGroup(selection.at(i)); selection.at(i)->setFlags(QGraphicsItem::ItemIsSelectable); - AbstractClipItem *item = static_cast (selection.at(i)); - itemStart = item->startPos().frames(m_document->fps()); - if (m_spacerStart == -1 || itemStart < m_spacerStart) - m_spacerStart = itemStart; } } QPointF top = m_selectionGroup->boundingRect().topLeft(); @@ -744,6 +739,8 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) { void CustomTrackView::resetSelectionGroup(bool selectItems) { if (m_selectionGroup) { // delete selection group + bool snap = KdenliveSettings::snaptopoints(); + KdenliveSettings::setSnaptopoints(false); QList children = m_selectionGroup->childItems(); for (int i = 0; i < children.count(); i++) { children.at(i)->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); @@ -751,11 +748,15 @@ void CustomTrackView::resetSelectionGroup(bool selectItems) { } scene()->destroyItemGroup(m_selectionGroup); m_selectionGroup = NULL; + KdenliveSettings::setSnaptopoints(snap); } } void CustomTrackView::groupSelectedItems() { - if (m_selectionGroup) kDebug() << "///// ERROR, TRYING TO OVERRIDE EXISTING GROUP"; + if (m_selectionGroup) { + kDebug() << "///// ERROR, TRYING TO OVERRIDE EXISTING GROUP"; + return; + } QList selection = m_scene->selectedItems(); if (selection.count() > 1) { m_selectionGroup = new AbstractGroupItem(m_document->fps()); @@ -770,9 +771,9 @@ void CustomTrackView::groupSelectedItems() { if (m_selectionGroup) { bool snap = KdenliveSettings::snaptopoints(); KdenliveSettings::setSnaptopoints(false); - QPointF top = m_selectionGroup->boundingRect().topLeft(); - m_selectionGroup->setPos(top); + QPointF top = m_selectionGroup->sceneBoundingRect().topLeft(); m_selectionGroup->translate(-top.x(), -top.y() + 1); + m_selectionGroup->setPos(top); m_selectionGroupInfo.startPos = GenTime(m_selectionGroup->scenePos().x(), m_document->fps()); m_selectionGroupInfo.track = m_selectionGroup->track(); KdenliveSettings::setSnaptopoints(snap); @@ -1415,9 +1416,10 @@ void CustomTrackView::removeTrack(int ix) { m_selectionGroup = new AbstractGroupItem(m_document->fps()); scene()->addItem(m_selectionGroup); for (int i = 0; i < selection.count(); i++) { - if (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET) + if (selection.at(i)->type() == AVWIDGET || selection.at(i)->type() == TRANSITIONWIDGET) { m_selectionGroup->addToGroup(selection.at(i)); - selection.at(i)->setFlags(QGraphicsItem::ItemIsSelectable); + selection.at(i)->setFlags(QGraphicsItem::ItemIsSelectable); + } } // Move graphic items qreal ydiff = 0 - (int) m_tracksHeight; @@ -1510,7 +1512,26 @@ void CustomTrackView::slotRemoveSpace() { emit displayMessage(i18n("You must be in an empty space to remove space (time=%1, track:%2)", m_document->timecode().getTimecodeFromFrames(mapToScene(m_menuPosition).x()), track), ErrorMessage); return; } - InsertSpaceCommand *command = new InsertSpaceCommand(this, pos, track, GenTime(-length, m_document->fps()), true); + + QRectF r(pos.frames(m_document->fps()), track * m_tracksHeight + m_tracksHeight / 2, sceneRect().width() - pos.frames(m_document->fps()), m_tracksHeight / 2 - 1); + QList items = m_scene->items(r); + + QList clipsToMove = QList (); + QList transitionsToMove = QList (); + + for (int i = 0; i < items.count(); i++) { + if (items.at(i)->type() == AVWIDGET || items.at(i)->type() == TRANSITIONWIDGET) { + AbstractClipItem *item = static_cast (items.at(i)); + ItemInfo info = item->info(); + if (item->type() == AVWIDGET) { + clipsToMove.append(info); + } else if (item->type() == TRANSITIONWIDGET) { + transitionsToMove.append(info); + } + } + } + + InsertSpaceCommand *command = new InsertSpaceCommand(this, clipsToMove, transitionsToMove, track, GenTime(-length, m_document->fps()), true); m_commandStack->push(command); } @@ -1530,29 +1551,81 @@ void CustomTrackView::slotInsertSpace() { ClipItem *item = getClipItemAt(pos, track); if (item) pos = item->startPos(); - InsertSpaceCommand *command = new InsertSpaceCommand(this, pos, track, spaceDuration, true); + int minh = 0; + int maxh = sceneRect().height(); + if (track != -1) { + minh = track * m_tracksHeight + m_tracksHeight / 2; + maxh = m_tracksHeight / 2 - 1; + } + + QRectF r(pos.frames(m_document->fps()), minh, sceneRect().width() - pos.frames(m_document->fps()), maxh); + QList items = m_scene->items(r); + + QList clipsToMove = QList (); + QList transitionsToMove = QList (); + + for (int i = 0; i < items.count(); i++) { + if (items.at(i)->type() == AVWIDGET || items.at(i)->type() == TRANSITIONWIDGET) { + AbstractClipItem *item = static_cast (items.at(i)); + ItemInfo info = item->info(); + if (item->type() == AVWIDGET) { + clipsToMove.append(info); + } else if (item->type() == TRANSITIONWIDGET) { + transitionsToMove.append(info); + } + } + } + + InsertSpaceCommand *command = new InsertSpaceCommand(this, clipsToMove, transitionsToMove, track, spaceDuration, true); m_commandStack->push(command); } -void CustomTrackView::insertSpace(const GenTime &pos, int track, const GenTime duration) { +void CustomTrackView::insertSpace(QList clipsToMove, QList transToMove, int track, const GenTime duration, const GenTime offset) { int diff = duration.frames(m_document->fps()); - QList itemList; - if (track == -1) itemList = scene()->items(pos.frames(m_document->fps()) , 1, sceneRect().width() - pos.frames(m_document->fps()), sceneRect().height()); - else itemList = scene()->items(pos.frames(m_document->fps()) , track * m_tracksHeight + 1, sceneRect().width() - pos.frames(m_document->fps()), m_tracksHeight - 2); resetSelectionGroup(); m_selectionGroup = new AbstractGroupItem(m_document->fps()); scene()->addItem(m_selectionGroup); - for (int i = 0; i < itemList.count(); i++) { - if (itemList.at(i)->type() == AVWIDGET || itemList.at(i)->type() == TRANSITIONWIDGET) { - m_selectionGroup->addToGroup(itemList.at(i)); - itemList.at(i)->setFlags(QGraphicsItem::ItemIsSelectable); - } - } - + ClipItem *clip; + Transition *transition; + + kDebug() << "/// STARTING SPACE INSERT"; + + + // Create lists with start pos for each track + QMap trackClipStartList; + QMap trackTransitionStartList; + + for (int i = 1; i < m_document->tracksCount() + 1; i++) { + trackClipStartList[i] = -1; + trackTransitionStartList[i] = -1; + } + + if (!clipsToMove.isEmpty()) for (int i = 0; i < clipsToMove.count(); i++) { + kDebug() << "/// FETCHING CLIP: " << i; + clip = getClipItemAtStart(clipsToMove.at(i).startPos + offset, clipsToMove.at(i).track); + if (clip) { + m_selectionGroup->addToGroup(clip); + if (trackClipStartList.value(m_document->tracksCount() - clipsToMove.at(i).track) == -1 || clipsToMove.at(i).startPos.frames(m_document->fps()) < trackClipStartList.value(m_document->tracksCount() - clipsToMove.at(i).track)) + trackClipStartList[m_document->tracksCount() - clipsToMove.at(i).track] = clipsToMove.at(i).startPos.frames(m_document->fps()); + clip->setFlags(QGraphicsItem::ItemIsSelectable); + } else emit displayMessage(i18n("Cannot move clip at position %1, track %2", m_document->timecode().getTimecodeFromFrames(clipsToMove.at(i).startPos.frames(m_document->fps())), clipsToMove.at(i).track), ErrorMessage); + } + if (!transToMove.isEmpty()) for (int i = 0; i < transToMove.count(); i++) { + kDebug() << "/// FETCHING TRANS: " << i; + transition = getTransitionItemAtStart(transToMove.at(i).startPos + offset, transToMove.at(i).track); + if (transition) { + m_selectionGroup->addToGroup(transition); + if (trackTransitionStartList.value(m_document->tracksCount() - transToMove.at(i).track) == -1 || transToMove.at(i).startPos.frames(m_document->fps()) < trackTransitionStartList.value(m_document->tracksCount() - transToMove.at(i).track)) + trackTransitionStartList[m_document->tracksCount() - transToMove.at(i).track] = transToMove.at(i).startPos.frames(m_document->fps()); + transition->setFlags(QGraphicsItem::ItemIsSelectable); + } else emit displayMessage(i18n("Cannot move transition at position %1, track %2", m_document->timecode().getTimecodeFromFrames(transToMove.at(i).startPos.frames(m_document->fps())), transToMove.at(i).track), ErrorMessage); + } + kDebug() << "/// STARTING SPACE DONE"; m_selectionGroup->translate(diff, 0); resetSelectionGroup(false); + kDebug() << "/// STARTING SPACE DONE2"; if (track != -1) track = m_document->tracksCount() - track; - m_document->renderer()->mltInsertSpace(pos, track, duration); + m_document->renderer()->mltInsertSpace(trackClipStartList, trackTransitionStartList, track, duration, offset); } void CustomTrackView::deleteClip(const QString &clipId) { @@ -1632,18 +1705,48 @@ void CustomTrackView::mouseReleaseEvent(QMouseEvent * event) { // We are moving all tracks track = -1; } - ClipItem *item = getClipItemAt(mappedClick, track); - if (item) mappedClick = item->startPos().frames(m_document->fps()); - int diff = m_selectionGroup->pos().x() - m_spacerStart;//endClick - mappedClick; - kDebug() << "// MOVING SPACER DIFF:" << diff; - if (diff < 0) mappedClick += diff; - InsertSpaceCommand *command = new InsertSpaceCommand(this, GenTime(mappedClick, m_document->fps()), track, GenTime(diff, m_document->fps()), false); - m_commandStack->push(command); - if (track != -1) track = m_document->tracksCount() - track; - m_document->renderer()->mltInsertSpace(GenTime(mappedClick, m_document->fps()), track, GenTime(diff, m_document->fps())); + + int startPos = (int) m_selectionGroup->boundingRect().topLeft().x(); + int diff = ((int) m_selectionGroup->pos().x()) - startPos; + //kDebug()<<"//////// SPACER DIFF: "<boundingRect().topLeft(); + if (diff != 0) { + QList items = m_selectionGroup->childItems(); + + QList clipsToMove = QList (); + QList transitionsToMove = QList (); + + // Create lists with start pos for each track + QMap trackClipStartList; + QMap trackTransitionStartList; + + for (int i = 1; i < m_document->tracksCount() + 1; i++) { + trackClipStartList[i] = -1; + trackTransitionStartList[i] = -1; + } + + for (int i = 0; i < items.count(); i++) { + AbstractClipItem *item = static_cast (items.at(i)); + ItemInfo info = item->info(); + if (item->type() == AVWIDGET) { + clipsToMove.append(info); + if (trackClipStartList.value(m_document->tracksCount() - info.track) == -1 || info.startPos.frames(m_document->fps()) < trackClipStartList.value(m_document->tracksCount() - info.track)) + trackClipStartList[m_document->tracksCount() - info.track] = info.startPos.frames(m_document->fps()); + } else if (item->type() == TRANSITIONWIDGET) { + transitionsToMove.append(info); + if (trackClipStartList.value(m_document->tracksCount() - info.track) == -1 || info.startPos.frames(m_document->fps()) < trackTransitionStartList.value(m_document->tracksCount() - info.track)) + trackTransitionStartList[m_document->tracksCount() - info.track] = info.startPos.frames(m_document->fps()); + } + } + + InsertSpaceCommand *command = new InsertSpaceCommand(this, clipsToMove, transitionsToMove, track, GenTime(diff, m_document->fps()), false); + m_commandStack->push(command); + if (track != -1) track = m_document->tracksCount() - track; + m_document->renderer()->mltInsertSpace(trackClipStartList, trackTransitionStartList, track, GenTime(diff, m_document->fps()), GenTime()); + } resetSelectionGroup(false); m_operationMode = NONE; } else if (m_operationMode == RUBBERSELECTION) { + kDebug() << "// END RUBBER SELECT"; resetSelectionGroup(); groupSelectedItems(); m_operationMode = NONE; diff --git a/src/customtrackview.h b/src/customtrackview.h index 994b6ab7..ae6b23b9 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -100,7 +100,7 @@ public: void setOutPoint(); void slotInsertSpace(); void slotRemoveSpace(); - void insertSpace(const GenTime &pos, int track, const GenTime duration); + void insertSpace(QList clipsToMove, QList transToMove, int track, const GenTime duration, const GenTime offset); ClipItem *getActiveClipUnderCursor(bool allowOutsideCursor = false) const; void deleteTimelineTrack(int ix, TrackInfo trackinfo); void changeTimelineTrack(int ix, TrackInfo trackinfo); @@ -158,7 +158,6 @@ private: uint m_selectedTrack; int m_projectDuration; int m_cursorPos; - int m_spacerStart; KdenliveDoc *m_document; CustomTrackScene *m_scene; QGraphicsLineItem *m_cursorLine; diff --git a/src/insertspacecommand.cpp b/src/insertspacecommand.cpp index a1149502..404e9748 100644 --- a/src/insertspacecommand.cpp +++ b/src/insertspacecommand.cpp @@ -22,20 +22,24 @@ #include "insertspacecommand.h" #include "customtrackview.h" -InsertSpaceCommand::InsertSpaceCommand(CustomTrackView *view, const GenTime &pos, int track, const GenTime &duration, bool doIt, QUndoCommand * parent) : QUndoCommand(parent), m_view(view), m_pos(pos), m_track(track), m_duration(duration), m_doIt(doIt) { +InsertSpaceCommand::InsertSpaceCommand(CustomTrackView *view, QList clipsToMove, QList transToMove, int track, const GenTime &duration, bool doIt, QUndoCommand * parent) + : QUndoCommand(parent), m_view(view), m_clipsToMove(clipsToMove), m_transToMove(transToMove), m_track(track), m_duration(duration), m_doIt(doIt) { setText(i18n("Insert space")); } // virtual void InsertSpaceCommand::undo() { // kDebug()<<"---- undoing action"; - m_view->insertSpace(m_pos + m_duration, m_track, GenTime() - m_duration); + if (m_duration > GenTime()) m_view->insertSpace(m_clipsToMove, m_transToMove, m_track, GenTime() - m_duration, m_duration); + else m_view->insertSpace(m_clipsToMove, m_transToMove, m_track, GenTime() - m_duration, m_duration); } // virtual void InsertSpaceCommand::redo() { // kDebug() << "---- redoing action cut: " << m_cutTime.frames(25); - if (m_doIt) - m_view->insertSpace(m_pos, m_track, m_duration); + if (m_doIt) { + if (m_duration < GenTime()) m_view->insertSpace(m_clipsToMove, m_transToMove, m_track, m_duration, GenTime()); + else m_view->insertSpace(m_clipsToMove, m_transToMove, m_track, m_duration, GenTime()); + } m_doIt = true; } diff --git a/src/insertspacecommand.h b/src/insertspacecommand.h index 42a9ba6d..aa56e5c3 100644 --- a/src/insertspacecommand.h +++ b/src/insertspacecommand.h @@ -31,13 +31,14 @@ class CustomTrackView; class InsertSpaceCommand : public QUndoCommand { public: - InsertSpaceCommand(CustomTrackView *view, const GenTime &pos, int track, const GenTime &duration, bool doIt, QUndoCommand * parent = 0); + InsertSpaceCommand(CustomTrackView *view, QList clipsToMove, QList transToMove, int track, const GenTime &duration, bool doIt, QUndoCommand * parent = 0); virtual void undo(); virtual void redo(); private: CustomTrackView *m_view; - GenTime m_pos; + QList m_clipsToMove; + QList m_transToMove; GenTime m_duration; int m_track; bool m_doIt; diff --git a/src/renderer.cpp b/src/renderer.cpp index acb242e5..9cafacb9 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -1451,7 +1451,7 @@ int Render::mltGetSpaceLength(const GenTime pos, int track, bool fromBlankStart) } -void Render::mltInsertSpace(const GenTime pos, int track, const GenTime duration) { +void Render::mltInsertSpace(QMap trackClipStartList, QMap trackTransitionStartList, int track, const GenTime duration, const GenTime timeOffset) { if (!m_mltProducer) { kDebug() << "PLAYLIST NOT INITIALISED //////"; return; @@ -1461,25 +1461,33 @@ void Render::mltInsertSpace(const GenTime pos, int track, const GenTime duration kDebug() << "PLAYLIST BROKEN, CANNOT INSERT CLIP //////"; return; } + //kDebug()<<"// CLP STRT LST: "< 0) trackPlaylist.insert_blank(clipIndex, diff - 1); - else { - int position = trackPlaylist.clip_start(clipIndex); - trackPlaylist.remove_region(position + diff, -diff - 1); + insertPos = trackClipStartList.value(track); + if (insertPos != -1) { + insertPos += offset; + int clipIndex = trackPlaylist.get_clip_index_at(insertPos); + if (diff > 0) trackPlaylist.insert_blank(clipIndex, diff - 1); + else { + if (!trackPlaylist.is_blank(clipIndex)) clipIndex --; + if (!trackPlaylist.is_blank(clipIndex)) kDebug() << "//// ERROR TRYING TO DELETE SPACE FROM " << insertPos; + int position = trackPlaylist.clip_start(clipIndex); + trackPlaylist.remove_region(position, - diff - 1); + } + trackPlaylist.consolidate_blanks(0); } - trackPlaylist.consolidate_blanks(0); - // now move transitions mlt_service serv = m_mltProducer->parent().get_service(); mlt_service nextservice = mlt_service_get_producer(serv); @@ -1492,9 +1500,12 @@ void Render::mltInsertSpace(const GenTime pos, int track, const GenTime duration int currentTrack = mlt_transition_get_b_track(tr); int currentIn = (int) mlt_transition_get_in(tr); int currentOut = (int) mlt_transition_get_out(tr); - - if (track == currentTrack && currentOut > insertPos && resource != "mix") { - mlt_transition_set_in_and_out(tr, currentIn + diff, currentOut + diff); + insertPos = trackTransitionStartList.value(track); + if (insertPos != -1) { + insertPos += offset; + if (track == currentTrack && currentOut > insertPos && resource != "mix") { + mlt_transition_set_in_and_out(tr, currentIn + diff, currentOut + diff); + } } nextservice = mlt_service_producer(nextservice); if (nextservice == NULL) break; @@ -1507,13 +1518,33 @@ void Render::mltInsertSpace(const GenTime pos, int track, const GenTime duration while (trackNb > 1) { Mlt::Producer trackProducer(tractor.track(trackNb - 1)); Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service()); - int clipIndex = trackPlaylist.get_clip_index_at(insertPos); - if (diff > 0) trackPlaylist.insert_blank(clipIndex, diff - 1); - else { - int position = trackPlaylist.clip_start(clipIndex); - trackPlaylist.remove_region(position + diff, -diff - 1); + + + int clipNb = trackPlaylist.count(); + insertPos = trackClipStartList.value(trackNb - 1); + if (insertPos != -1) { + insertPos += offset; + + /* kDebug()<<"-------------\nTRACK "< 0) trackPlaylist.insert_blank(clipIndex, diff - 1); + else { + if (!trackPlaylist.is_blank(clipIndex)) clipIndex --; + if (!trackPlaylist.is_blank(clipIndex)) kDebug() << "//// ERROR TRYING TO DELETE SPACE FROM " << insertPos; + int position = trackPlaylist.clip_start(clipIndex); + trackPlaylist.remove_region(position, - diff - 1); + } + trackPlaylist.consolidate_blanks(0); } - trackPlaylist.consolidate_blanks(0); trackNb--; } // now move transitions @@ -1527,9 +1558,13 @@ void Render::mltInsertSpace(const GenTime pos, int track, const GenTime duration mlt_transition tr = (mlt_transition) nextservice; int currentIn = (int) mlt_transition_get_in(tr); int currentOut = (int) mlt_transition_get_out(tr); - - if (currentOut > insertPos && resource != "mix") { - mlt_transition_set_in_and_out(tr, currentIn + diff, currentOut + diff); + int currentTrack = mlt_transition_get_b_track(tr); + insertPos = trackTransitionStartList.value(currentTrack); + if (insertPos != -1) { + insertPos += offset; + if (currentOut > insertPos && resource != "mix") { + mlt_transition_set_in_and_out(tr, currentIn + diff, currentOut + diff); + } } nextservice = mlt_service_producer(nextservice); if (nextservice == NULL) break; @@ -1540,6 +1575,7 @@ void Render::mltInsertSpace(const GenTime pos, int track, const GenTime duration } mlt_service_unlock(service.get_service()); mltCheckLength(); + m_mltConsumer->set("refresh", 1); } int Render::mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, Mlt::Producer *prod) { @@ -2004,6 +2040,7 @@ bool Render::mltResizeClipEnd(ItemInfo info, GenTime clipDuration) { mltAddClipTransparency(transpinfo, info.track - 1, QString(clip->parent().get("id")).toInt()); }*/ m_isBlocked = false; + m_mltConsumer->set("refresh", 1); return true; } @@ -2078,6 +2115,7 @@ bool Render::mltResizeClipStart(ItemInfo info, GenTime diff) { m_isBlocked = false; //m_mltConsumer->set("refresh", 1); mlt_service_unlock(service.get_service()); + m_mltConsumer->set("refresh", 1); return true; } diff --git a/src/renderer.h b/src/renderer.h index eb1f89a3..af212b73 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -150,7 +150,7 @@ Q_OBJECT public: void mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *prod); void mltUpdateClip(ItemInfo info, QDomElement element, Mlt::Producer *prod); void mltCutClip(int track, GenTime position); - void mltInsertSpace(const GenTime pos, int track, const GenTime duration); + void mltInsertSpace(QMap trackClipStartList, QMap trackTransitionStartList, int track, const GenTime duration, const GenTime timeOffset); int mltGetSpaceLength(const GenTime pos, int track, bool fromBlankStart); bool mltResizeClipEnd(ItemInfo info, GenTime clipDuration); bool mltResizeClipStart(ItemInfo info, GenTime diff); -- 2.39.5