From: Jean-Baptiste Mardelle Date: Tue, 22 Sep 2009 08:19:09 +0000 (+0000) Subject: Fix various speed related issues X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=2b1c40908368fff4b20912551c266e45c89f6607;p=kdenlive Fix various speed related issues svn path=/trunk/kdenlive/; revision=3915 --- diff --git a/src/abstractclipitem.cpp b/src/abstractclipitem.cpp index 90641d76..584ffab2 100644 --- a/src/abstractclipitem.cpp +++ b/src/abstractclipitem.cpp @@ -32,57 +32,52 @@ AbstractClipItem::AbstractClipItem(const ItemInfo info, const QRectF& rect, double fps) : QObject(), QGraphicsRectItem(rect), - m_track(0), + m_info(info), m_editedKeyframe(-1), m_selectedKeyframe(0), m_keyframeFactor(1), m_fps(fps) { setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); - setTrack(info.track); - m_startPos = info.startPos; - m_cropDuration = info.endPos - info.startPos; } ItemInfo AbstractClipItem::info() const { - ItemInfo itemInfo; - itemInfo.startPos = startPos(); - itemInfo.endPos = endPos(); - itemInfo.cropStart = m_cropStart; - itemInfo.track = track(); - return itemInfo; + ItemInfo info = m_info; + info.cropStart = cropStart(); + info.endPos = endPos(); + return info; } GenTime AbstractClipItem::endPos() const { - return m_startPos + m_cropDuration; + return m_info.startPos + m_info.cropDuration; } int AbstractClipItem::track() const { - return m_track; + return m_info.track; } GenTime AbstractClipItem::cropStart() const { - return m_cropStart; + return m_info.cropStart; } GenTime AbstractClipItem::cropDuration() const { - return m_cropDuration; + return m_info.cropDuration; } void AbstractClipItem::setCropStart(GenTime pos) { - m_cropStart = pos; + m_info.cropStart = pos; } void AbstractClipItem::updateItem() { - m_track = (int)(scenePos().y() / KdenliveSettings::trackheight()); - m_startPos = GenTime((int) scenePos().x(), m_fps); + m_info.track = (int)(scenePos().y() / KdenliveSettings::trackheight()); + m_info.startPos = GenTime((int) scenePos().x(), m_fps); } void AbstractClipItem::updateRectGeometry() @@ -92,21 +87,26 @@ void AbstractClipItem::updateRectGeometry() void AbstractClipItem::resizeStart(int posx, double speed) { - GenTime durationDiff = GenTime(posx, m_fps) - m_startPos; + GenTime durationDiff = GenTime(posx, m_fps) - m_info.startPos; if (durationDiff == GenTime()) return; //kDebug() << "-- RESCALE DIFF=" << durationDiff.frames(25) << ", CLIP: " << startPos().frames(25) << "-" << endPos().frames(25); if (type() == AVWIDGET && cropStart() + durationDiff < GenTime()) { durationDiff = GenTime() - cropStart(); - } else if (durationDiff >= m_cropDuration) { + } else if (durationDiff >= cropDuration()) { return; - if (m_cropDuration > GenTime(3, m_fps)) durationDiff = GenTime(3, m_fps); + if (cropDuration() > GenTime(3, m_fps)) durationDiff = GenTime(3, m_fps); else return; } //kDebug()<<"// DURATION DIFF: "< GenTime()) { QList collisionList = collidingItems(Qt::IntersectsItemBoundingRect); @@ -162,7 +166,7 @@ void AbstractClipItem::resizeEnd(int posx, double speed) kDebug() << "///////// CURRENT: " << startPos().frames(25) << "x" << endPos().frames(25) << ", RECT: " << rect() << "-" << pos(); kDebug() << "///////// COLLISION: " << ((AbstractClipItem *)item)->startPos().frames(25) << "x" << ((AbstractClipItem *)item)->endPos().frames(25) << ", RECT: " << ((AbstractClipItem *)item)->rect() << "-" << item->pos();*/ GenTime diff = ((AbstractClipItem *)item)->startPos() - GenTime(1, m_fps) - startPos(); - m_cropDuration = diff * speed; + m_info.cropDuration = GenTime((int) (diff.frames(m_fps) * speed + 0.5), m_fps); setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height()); break; } @@ -172,12 +176,12 @@ void AbstractClipItem::resizeEnd(int posx, double speed) GenTime AbstractClipItem::startPos() const { - return m_startPos; + return m_info.startPos; } void AbstractClipItem::setTrack(int track) { - m_track = track; + m_info.track = track; } double AbstractClipItem::fps() const diff --git a/src/abstractclipitem.h b/src/abstractclipitem.h index 226e2075..129011a6 100644 --- a/src/abstractclipitem.h +++ b/src/abstractclipitem.h @@ -61,13 +61,14 @@ public: virtual GenTime maxDuration() const; virtual void setCropStart(GenTime pos); -protected: - int m_track; +protected: + ItemInfo m_info; +// int m_track; int m_editedKeyframe; int m_selectedKeyframe; - GenTime m_cropStart; +/* GenTime m_cropStart; GenTime m_cropDuration; - GenTime m_startPos; + GenTime m_startPos;*/ GenTime m_maxDuration; QMap m_keyframes; double m_keyframeFactor; diff --git a/src/clipitem.cpp b/src/clipitem.cpp index d16f1ad8..87ea7ea4 100644 --- a/src/clipitem.cpp +++ b/src/clipitem.cpp @@ -65,11 +65,10 @@ ClipItem::ClipItem(DocClipBase *clip, ItemInfo info, double fps, double speed, i if (m_speed == 1.0) m_clipName = clip->name(); else { m_clipName = clip->name() + " - " + QString::number(m_speed * 100, 'f', 0) + '%'; - m_cropDuration = m_cropDuration * m_speed; } m_producer = clip->getId(); m_clipType = clip->clipType(); - m_cropStart = info.cropStart; + //m_cropStart = info.cropStart; m_maxDuration = clip->maxDuration(); setAcceptDrops(true); m_audioThumbReady = clip->audioThumbCreated(); @@ -128,8 +127,8 @@ ClipItem *ClipItem::clone(ItemInfo info) const ClipItem *duplicate = new ClipItem(m_clip, info, m_fps, m_speed, m_strobe); if (m_clipType == IMAGE || m_clipType == TEXT) duplicate->slotSetStartThumb(m_startPix); else { - if (info.cropStart == m_cropStart) duplicate->slotSetStartThumb(m_startPix); - if (info.cropStart + (info.endPos - info.startPos) == m_cropStart + m_cropDuration) duplicate->slotSetEndThumb(m_endPix); + if (info.cropStart == m_info.cropStart) duplicate->slotSetStartThumb(m_startPix); + if (info.cropStart + (info.endPos - info.startPos) == m_info.cropStart + (m_info.endPos - m_info.startPos)) duplicate->slotSetEndThumb(m_endPix); } //kDebug() << "// CLoning clip: " << (info.cropStart + (info.endPos - info.startPos)).frames(m_fps) << ", CURRENT end: " << (cropStart() + duration()).frames(m_fps); duplicate->setEffectList(m_effectList); @@ -256,8 +255,8 @@ bool ClipItem::checkKeyFrames() bool modified = false; int lastPos = -1; double lastValue = -1; - int start = m_cropStart.frames(m_fps); - int end = (m_cropStart + m_cropDuration).frames(m_fps); + int start = cropStart().frames(m_fps); + int end = (cropStart() + cropDuration()).frames(m_fps); foreach(const QString &str, keyframes) { int pos = str.section(':', 0, 0).toInt(); double val = str.section(':', 1, 1).toDouble(); @@ -431,14 +430,14 @@ void ClipItem::refreshClip(bool checkDuration) if (checkDuration && (m_maxDuration != m_clip->maxDuration())) { m_maxDuration = m_clip->maxDuration(); if (m_clipType != IMAGE && m_clipType != TEXT && m_clipType != COLOR) { - if (m_maxDuration != GenTime() && m_cropStart + m_cropDuration > m_maxDuration) { + if (m_maxDuration != GenTime() && m_info.cropStart + m_info.cropDuration > m_maxDuration) { // Clip duration changed, make sure to stay in correct range - if (m_cropStart > m_maxDuration) { - m_cropStart = GenTime(); - m_cropDuration = qMin(m_cropDuration, m_maxDuration); + if (m_info.cropStart > m_maxDuration) { + m_info.cropStart = GenTime(); + m_info.cropDuration = qMin(m_info.cropDuration, m_maxDuration); updateRectGeometry(); } else { - m_cropDuration = m_maxDuration; + m_info.cropDuration = m_maxDuration; updateRectGeometry(); } } @@ -700,7 +699,7 @@ void ClipItem::paint(QPainter *painter, int channels = baseClip()->getProperty("channels").toInt(); if (scale != m_framePixelWidth) m_audioThumbCachePic.clear(); - double cropLeft = m_cropStart.frames(m_fps); + double cropLeft = m_info.cropStart.frames(m_fps); const int clipStart = mappedRect.x(); const int mappedStartPixel = painter->matrix().map(QPointF(startpixel + cropLeft, 0)).x() - clipStart; const int mappedEndPixel = painter->matrix().map(QPointF(endpixel + cropLeft, 0)).x() - clipStart; @@ -772,7 +771,7 @@ void ClipItem::paint(QPainter *painter, pen.setStyle(Qt::DotLine); painter->setPen(pen); for (; it != markers.end(); ++it) { - pos = (*it).time() / m_speed - cropStart(); + pos = GenTime((int) ((*it).time().frames(m_fps) / m_speed + 0.5), m_fps) - cropStart(); if (pos > GenTime()) { if (pos > cropDuration()) break; QLineF l(rect().x() + pos.frames(m_fps), rect().y(), rect().x() + pos.frames(m_fps), rect().bottom()); @@ -891,7 +890,8 @@ QList ClipItem::snapMarkers() const GenTime pos; for (int i = 0; i < markers.size(); i++) { - pos = markers.at(i) / m_speed - cropStart(); + + pos = GenTime((int) (markers.at(i).frames(m_fps) / m_speed + 0.5), m_fps) - cropStart(); if (pos > GenTime()) { if (pos > cropDuration()) break; else snaps.append(pos + startPos()); @@ -907,7 +907,7 @@ QList ClipItem::commentedSnapMarkers() const GenTime pos; for (int i = 0; i < markers.size(); i++) { - pos = markers.at(i).time() / m_speed - cropStart(); + pos = GenTime((int) (markers.at(i).time().frames(m_fps) / m_speed + 0.5), m_fps) - cropStart(); if (pos > GenTime()) { if (pos > cropDuration()) break; else snaps.append(CommentedTime(pos + startPos(), markers.at(i).comment())); @@ -1017,7 +1017,7 @@ void ClipItem::setFadeIn(int pos) if (pos == m_startFade) return; int oldIn = m_startFade; if (pos < 0) pos = 0; - if (pos > m_cropDuration.frames(m_fps)) pos = (int)(m_cropDuration.frames(m_fps)); + if (pos > cropDuration().frames(m_fps)) pos = (int)(cropDuration().frames(m_fps)); m_startFade = pos; QRectF rect = boundingRect(); update(rect.x(), rect.y(), qMax(oldIn, pos), rect.height()); @@ -1028,7 +1028,7 @@ void ClipItem::setFadeOut(int pos) if (pos == m_endFade) return; int oldOut = m_endFade; if (pos < 0) pos = 0; - if (pos > m_cropDuration.frames(m_fps)) pos = (int)(m_cropDuration.frames(m_fps)); + if (pos > cropDuration().frames(m_fps)) pos = (int)(cropDuration().frames(m_fps)); m_endFade = pos; QRectF rect = boundingRect(); update(rect.x() + rect.width() - qMax(oldOut, pos), rect.y(), qMax(oldOut, pos), rect.height()); @@ -1190,20 +1190,20 @@ QVariant ClipItem::itemChange(GraphicsItemChange change, const QVariant &value) subitems.removeAll(this); for (int j = 0; j < subitems.count(); j++) { if (subitems.at(j)->type() == type()) { - m_startPos = GenTime((int) pos().x(), m_fps); + m_info.startPos = GenTime((int) pos().x(), m_fps); return pos(); } } } - m_track = newTrack; - m_startPos = GenTime((int) newPos.x(), m_fps); + m_info.track = newTrack; + m_info.startPos = GenTime((int) newPos.x(), m_fps); return newPos; } } } - m_track = newTrack; - m_startPos = GenTime((int) newPos.x(), m_fps); + m_info.track = newTrack; + m_info.startPos = GenTime((int) newPos.x(), m_fps); //kDebug()<<"// ITEM NEW POS: "<views().isEmpty()) { event->accept(); CustomTrackView *view = (CustomTrackView *) scene()->views()[0]; - if (view) view->slotAddEffect(e, m_startPos, track()); + if (view) view->slotAddEffect(e, m_info.startPos, track()); } } diff --git a/src/customtrackscene.cpp b/src/customtrackscene.cpp index 13672c1f..1364d22d 100644 --- a/src/customtrackscene.cpp +++ b/src/customtrackscene.cpp @@ -54,18 +54,18 @@ void CustomTrackScene::setSnapList(QList snaps) m_snapPoints = snaps; } -GenTime CustomTrackScene::previousSnapPoint(GenTime pos) +GenTime CustomTrackScene::previousSnapPoint(GenTime pos) const { for (int i = 0; i < m_snapPoints.size(); ++i) { if (m_snapPoints.at(i) >= pos) { - if (i == 0) i = 1; + if (i == 0) return GenTime(); return m_snapPoints.at(i - 1); } } return GenTime(); } -GenTime CustomTrackScene::nextSnapPoint(GenTime pos) +GenTime CustomTrackScene::nextSnapPoint(GenTime pos) const { for (int i = 0; i < m_snapPoints.size(); ++i) { if (m_snapPoints.at(i) > pos) { diff --git a/src/customtrackscene.h b/src/customtrackscene.h index 98354827..961927de 100644 --- a/src/customtrackscene.h +++ b/src/customtrackscene.h @@ -40,8 +40,8 @@ public: explicit CustomTrackScene(KdenliveDoc *doc, QObject *parent = 0); virtual ~ CustomTrackScene(); void setSnapList(QList snaps); - GenTime previousSnapPoint(GenTime pos); - GenTime nextSnapPoint(GenTime pos); + GenTime previousSnapPoint(GenTime pos) const; + GenTime nextSnapPoint(GenTime pos) const; double getSnapPointForPos(double pos, bool doSnap = true); void setScale(double scale, double vscale); QPointF scale() const; diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 0ff1f341..59a3d9eb 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -863,8 +863,24 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) m_pasteEffectsAction->setEnabled(m_copiedItems.count() == 1); } + if (collisionClip != NULL || m_dragItem == NULL) { + if (m_dragItem && m_dragItem->type() == AVWIDGET && !m_dragItem->isItemLocked()) { + ClipItem *selected = static_cast (m_dragItem); + emit clipItemSelected(selected); + } else emit clipItemSelected(NULL); + } + + // If clicked item is selected, allow move + if (event->modifiers() != Qt::ControlModifier && m_operationMode == NONE) QGraphicsView::mousePressEvent(event); + + m_clickPoint = QPoint((int)(mapToScene(event->pos()).x() - m_dragItem->startPos().frames(m_document->fps())), (int)(event->pos().y() - m_dragItem->pos().y())); + m_operationMode = m_dragItem->operationMode(mapToScene(event->pos())); + // Update snap points - if (m_selectionGroup == NULL) updateSnapPoints(m_dragItem); + if (m_selectionGroup == NULL) { + if (m_operationMode == RESIZEEND || m_operationMode == RESIZESTART) updateSnapPoints(NULL); + else updateSnapPoints(m_dragItem); + } else { QList offsetList; QList children = m_selectionGroup->childItems(); @@ -889,19 +905,6 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event) } } - if (collisionClip != NULL || m_dragItem == NULL) { - if (m_dragItem && m_dragItem->type() == AVWIDGET && !m_dragItem->isItemLocked()) { - ClipItem *selected = static_cast (m_dragItem); - emit clipItemSelected(selected); - } else emit clipItemSelected(NULL); - } - - // If clicked item is selected, allow move - if (event->modifiers() != Qt::ControlModifier && m_operationMode == NONE) QGraphicsView::mousePressEvent(event); - - m_clickPoint = QPoint((int)(mapToScene(event->pos()).x() - m_dragItem->startPos().frames(m_document->fps())), (int)(event->pos().y() - m_dragItem->pos().y())); - m_operationMode = m_dragItem->operationMode(mapToScene(event->pos())); - if (m_operationMode == KEYFRAME) { m_dragItem->updateSelectedKeyFrame(); m_blockRefresh = false; @@ -1225,6 +1228,8 @@ bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint pos) info.startPos = GenTime(); info.cropStart = GenTime(list.at(1).toInt(), m_document->fps()); info.endPos = GenTime(list.at(2).toInt() - list.at(1).toInt(), m_document->fps()); + info.cropDuration = info.endPos - info.startPos; + info.originalcropStart = info.cropStart; info.track = 0; // Check if clip can be inserted at that position @@ -1266,7 +1271,8 @@ bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint pos) } ItemInfo info; info.startPos = start; - info.endPos = info.startPos + clip->duration(); + info.cropDuration = clip->duration(); + info.endPos = info.startPos + info.cropDuration; info.track = track; infoList.append(info); start += clip->duration(); @@ -1280,9 +1286,10 @@ bool CustomTrackView::insertDropClips(const QMimeData *data, const QPoint pos) DocClipBase *clip = m_document->getBaseClip(ids.at(i)); ItemInfo info; info.startPos = start; - info.endPos = info.startPos + clip->duration(); + info.cropDuration = clip->duration(); + info.endPos = info.startPos + info.cropDuration; info.track = 0; - start += clip->duration(); + start += info.cropDuration; offsetList.append(start); ClipItem *item = new ClipItem(clip, info, m_document->fps(), 1.0, 1, false); item->setFlags(QGraphicsItem::ItemIsSelectable); @@ -1633,7 +1640,7 @@ void CustomTrackView::cutClip(ItemInfo info, GenTime cutTime, bool cut) m_document->renderer()->mltCutClip(m_document->tracksCount() - info.track, cutTime); int cutPos = (int) cutTime.frames(m_document->fps()); - ItemInfo newPos; + ItemInfo newPos = info; double speed = item->speed(); newPos.startPos = cutTime; newPos.endPos = info.endPos; @@ -4252,11 +4259,10 @@ void CustomTrackView::pasteClip() // parse all clip names if (m_copiedItems.at(i) && m_copiedItems.at(i)->type() == AVWIDGET) { ClipItem *clip = static_cast (m_copiedItems.at(i)); - ItemInfo info; - info.startPos = clip->startPos() + offset; - info.endPos = clip->endPos() + offset; - info.cropStart = clip->cropStart(); - info.track = clip->track() + trackOffset; + ItemInfo info = clip->info(); + info.startPos += offset; + info.endPos += offset; + info.track += trackOffset; if (canBePastedTo(info, AVWIDGET)) { new AddTimelineClipCommand(this, clip->xml(), clip->clipProducer(), info, clip->effectList(), true, false, pasteClips); } else emit displayMessage(i18n("Cannot paste clip to selected place"), ErrorMessage); @@ -4766,10 +4772,7 @@ void CustomTrackView::doSplitAudio(const GenTime &pos, int track, bool split) if (freetrack == 0) { emit displayMessage(i18n("No empty space to put clip audio"), ErrorMessage); } else { - ItemInfo info; - info.startPos = clip->startPos(); - info.endPos = clip->endPos(); - info.cropStart = clip->cropStart(); + ItemInfo info = clip->info(); info.track = m_document->tracksCount() - freetrack; addClip(clip->xml(), clip->clipProducer(), info, clip->effectList()); scene()->clearSelection(); diff --git a/src/definitions.h b/src/definitions.h index 90d5e313..c8725fc0 100644 --- a/src/definitions.h +++ b/src/definitions.h @@ -62,9 +62,16 @@ struct TrackInfo { }; struct ItemInfo { + /** 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; + /** cropStart is the position where the sub-clip starts, relative to the clip's 0 position. Doe not depend on speed */ + GenTime originalcropStart; + /** adjustedCropStart is the position where the sub-clip starts, depend on effects (speed,...) */ GenTime cropStart; + /** cropDuration is the position where the sub-clip ends, relative to the clip's 0 position. Doe not depend on speed */ + GenTime cropDuration; int track; }; diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index a3ac44fb..6b78ed7e 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -1993,7 +1993,7 @@ void MainWindow::slotAddClipMarker() if (m_activeTimeline) { ClipItem *item = m_activeTimeline->projectView()->getActiveClipUnderCursor(); if (item) { - pos = (m_projectMonitor->position() - item->startPos() + item->cropStart()) / item->speed(); + pos = GenTime((int) ((m_projectMonitor->position() - item->startPos() + item->cropStart()).frames(m_activeDocument->fps()) * item->speed() + 0.5), m_activeDocument->fps()); clip = item->baseClip(); } } diff --git a/src/monitor.cpp b/src/monitor.cpp index 88259bf8..9bb76d83 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -289,7 +289,7 @@ void Monitor::updateMarkers(DocClipBase *source) if (!markers.isEmpty()) { QList marks; for (int i = 0; i < markers.count(); i++) { - int pos = (int) markers.at(i).time().frames(render->fps()); + int pos = (int) markers.at(i).time().frames(m_monitorManager->timecode().fps()); marks.append(pos); QString position = m_monitorManager->timecode().getTimecode(markers.at(i).time()) + ' ' + markers.at(i).comment(); QAction *go = m_markerMenu->addAction(position); @@ -720,7 +720,7 @@ void Monitor::slotPlayZone() if (render == NULL) return; activateMonitor(); QPoint p = m_ruler->zone(); - render->playZone(GenTime(p.x(), render->fps()), GenTime(p.y(), render->fps())); + render->playZone(GenTime(p.x(), m_monitorManager->timecode().fps()), GenTime(p.y(), m_monitorManager->timecode().fps())); m_playAction->setChecked(true); m_playAction->setIcon(m_pauseIcon); } @@ -730,7 +730,7 @@ void Monitor::slotLoopZone() if (render == NULL) return; activateMonitor(); QPoint p = m_ruler->zone(); - render->loopZone(GenTime(p.x(), render->fps()), GenTime(p.y(), render->fps())); + render->loopZone(GenTime(p.x(), m_monitorManager->timecode().fps()), GenTime(p.y(), m_monitorManager->timecode().fps())); m_playAction->setChecked(true); m_playAction->setIcon(m_pauseIcon); } @@ -751,7 +751,7 @@ void Monitor::slotSetXml(DocClipBase *clip, const int position) // MLT CONSUMER is broken emit blockMonitors(); } - } else if (position != -1) render->seek(GenTime(position, render->fps())); + } else if (position != -1) render->seek(GenTime(position, m_monitorManager->timecode().fps())); } void Monitor::slotOpenFile(const QString &file) diff --git a/src/renderer.cpp b/src/renderer.cpp index 57e2ef85..733224cc 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -958,6 +958,7 @@ int Render::setSceneList(QString playlist, int position) if (trackPlaylist.type() == playlist_type) trackPlaylist.clear(); trackNb--; } + delete field; } mlt_service_unlock(service.get_service()); @@ -2036,6 +2037,7 @@ int Render::mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, int } Mlt::Producer *clip = trackPlaylist.replace_with_blank(clipIndex); trackPlaylist.consolidate_blanks(0); + // Check that the blank space is long enough for our new duration clipIndex = trackPlaylist.get_clip_index_at(startPos); int blankEnd = trackPlaylist.clip_start(clipIndex) + trackPlaylist.clip_length(clipIndex); @@ -2064,12 +2066,12 @@ int Render::mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, int int blankEnd = trackPlaylist.clip_start(clipIndex) + trackPlaylist.clip_length(clipIndex); Mlt::Producer *cut; - GenTime oldDuration = GenTime(clipLength, m_fps); - GenTime newDuration = oldDuration * oldspeed; - if (clipIndex + 1 < trackPlaylist.count() && (info.startPos + newDuration).frames(m_fps) > blankEnd) { + GenTime duration = info.cropDuration; + int originalStart = (int)(info.originalcropStart.frames(m_fps)); + if (clipIndex + 1 < trackPlaylist.count() && (info.startPos + info.cropDuration).frames(m_fps) > blankEnd) { GenTime maxLength = GenTime(blankEnd, m_fps) - info.startPos; - cut = prod->cut((int)(info.cropStart.frames(m_fps)), (int)(info.cropStart.frames(m_fps) + maxLength.frames(m_fps) - 1)); - } else cut = prod->cut((int)(info.cropStart.frames(m_fps)), (int)((info.cropStart + newDuration).frames(m_fps)) - 1); + cut = prod->cut(originalStart, (int)(originalStart + maxLength.frames(m_fps) - 1)); + } else cut = prod->cut(originalStart, (int)(originalStart + info.cropDuration.frames(m_fps)) - 1); // move all effects to the correct producer mltPasteEffects(clip, cut); @@ -2102,19 +2104,19 @@ int Render::mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, int } Mlt::Producer *clip = trackPlaylist.replace_with_blank(clipIndex); trackPlaylist.consolidate_blanks(0); - - GenTime oldDuration = GenTime(clipLength, m_fps); - GenTime newDuration = oldDuration * (oldspeed / speed); + + GenTime duration = info.cropDuration / speed; + int originalStart = (int)(info.originalcropStart.frames(m_fps) / speed); // Check that the blank space is long enough for our new duration clipIndex = trackPlaylist.get_clip_index_at(startPos); int blankEnd = trackPlaylist.clip_start(clipIndex) + trackPlaylist.clip_length(clipIndex); Mlt::Producer *cut; - if (clipIndex + 1 < trackPlaylist.count() && (info.startPos + newDuration).frames(m_fps) > blankEnd) { + if (clipIndex + 1 < trackPlaylist.count() && (info.startPos + duration).frames(m_fps) > blankEnd) { GenTime maxLength = GenTime(blankEnd, m_fps) - info.startPos; - cut = slowprod->cut((int)(info.cropStart.frames(m_fps) / speed), (int)(info.cropStart.frames(m_fps) / speed + maxLength.frames(m_fps) - 1)); - } else cut = slowprod->cut((int)(info.cropStart.frames(m_fps) / speed), (int)((info.cropStart / speed + newDuration).frames(m_fps) - 1)); + cut = slowprod->cut(originalStart, (int)(originalStart + maxLength.frames(m_fps) - 1)); + } else cut = slowprod->cut(originalStart, (int)(originalStart + duration.frames(m_fps)) - 1); // move all effects to the correct producer mltPasteEffects(clip, cut); diff --git a/src/trackview.cpp b/src/trackview.cpp index e790a4c1..85de754c 100644 --- a/src/trackview.cpp +++ b/src/trackview.cpp @@ -46,8 +46,9 @@ TrackView::TrackView(KdenliveDoc *doc, bool *ok, QWidget *parent) : m_verticalZoom(1) { - m_view.setupUi(this); - + setupUi(this); +// ruler_frame->setMaximumHeight(); +// size_frame->setMaximumHeight(); m_scene = new CustomTrackScene(doc); m_trackview = new CustomTrackView(doc, m_scene, parent); m_trackview->scale(1, 1); @@ -59,13 +60,13 @@ TrackView::TrackView(KdenliveDoc *doc, bool *ok, QWidget *parent) : QHBoxLayout *layout = new QHBoxLayout; layout->setContentsMargins(m_trackview->frameWidth(), 0, 0, 0); layout->setSpacing(0); - m_view.ruler_frame->setLayout(layout); + ruler_frame->setLayout(layout); layout->addWidget(m_ruler); QHBoxLayout *sizeLayout = new QHBoxLayout; sizeLayout->setContentsMargins(0, 0, 0, 0); sizeLayout->setSpacing(0); - m_view.size_frame->setLayout(sizeLayout); + size_frame->setLayout(sizeLayout); QToolButton *butSmall = new QToolButton(this); butSmall->setIcon(KIcon("kdenlive-zoom-small")); @@ -84,20 +85,20 @@ TrackView::TrackView(KdenliveDoc *doc, bool *ok, QWidget *parent) : QHBoxLayout *tracksLayout = new QHBoxLayout; tracksLayout->setContentsMargins(0, 0, 0, 0); tracksLayout->setSpacing(0); - m_view.tracks_frame->setLayout(tracksLayout); + tracks_frame->setLayout(tracksLayout); - m_view.headers_area->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - m_view.headers_area->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); - m_view.headers_area->setFixedWidth(70); + headers_area->setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + headers_area->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + headers_area->setFixedWidth(70); QVBoxLayout *headersLayout = new QVBoxLayout; headersLayout->setContentsMargins(0, m_trackview->frameWidth(), 0, 0); headersLayout->setSpacing(0); - m_view.headers_container->setLayout(headersLayout); - connect(m_view.headers_area->verticalScrollBar(), SIGNAL(valueChanged(int)), m_trackview->verticalScrollBar(), SLOT(setValue(int))); + headers_container->setLayout(headersLayout); + connect(headers_area->verticalScrollBar(), SIGNAL(valueChanged(int)), m_trackview->verticalScrollBar(), SLOT(setValue(int))); tracksLayout->addWidget(m_trackview); - connect(m_trackview->verticalScrollBar(), SIGNAL(valueChanged(int)), m_view.headers_area->verticalScrollBar(), SLOT(setValue(int))); + connect(m_trackview->verticalScrollBar(), SIGNAL(valueChanged(int)), headers_area->verticalScrollBar(), SLOT(setValue(int))); connect(m_trackview, SIGNAL(trackHeightChanged()), this, SLOT(slotRebuildTrackHeaders())); parseDocument(m_doc->toXml()); @@ -444,7 +445,7 @@ void TrackView::slotRebuildTrackHeaders() { const QList list = m_doc->tracksList(); QLayoutItem *child; - while ((child = m_view.headers_container->layout()->takeAt(0)) != 0) { + while ((child = headers_container->layout()->takeAt(0)) != 0) { QWidget *wid = child->widget(); delete child; if (wid) wid->deleteLater(); @@ -454,14 +455,14 @@ void TrackView::slotRebuildTrackHeaders() HeaderTrack *header = NULL; QFrame *frame = NULL; for (int i = 0; i < max; i++) { - frame = new QFrame(m_view.headers_container); + frame = new QFrame(headers_container); frame->setFixedHeight(1); frame->setFrameStyle(QFrame::Plain); frame->setFrameShape(QFrame::Box); frame->setLineWidth(1); - m_view.headers_container->layout()->addWidget(frame); + headers_container->layout()->addWidget(frame); TrackInfo info = list.at(max - i - 1); - header = new HeaderTrack(i, info, height, m_view.headers_container); + header = new HeaderTrack(i, info, height, headers_container); connect(header, SIGNAL(switchTrackVideo(int)), m_trackview, SLOT(slotSwitchTrackVideo(int))); connect(header, SIGNAL(switchTrackAudio(int)), m_trackview, SLOT(slotSwitchTrackAudio(int))); connect(header, SIGNAL(switchTrackLock(int)), m_trackview, SLOT(slotSwitchTrackLock(int))); @@ -470,14 +471,14 @@ void TrackView::slotRebuildTrackHeaders() connect(header, SIGNAL(insertTrack(int)), this, SIGNAL(insertTrack(int))); connect(header, SIGNAL(changeTrack(int)), this, SIGNAL(changeTrack(int))); connect(header, SIGNAL(renameTrack(int)), this, SLOT(slotRenameTrack(int))); - m_view.headers_container->layout()->addWidget(header); + headers_container->layout()->addWidget(header); } frame = new QFrame(this); frame->setFixedHeight(1); frame->setFrameStyle(QFrame::Plain); frame->setFrameShape(QFrame::Box); frame->setLineWidth(1); - m_view.headers_container->layout()->addWidget(frame); + headers_container->layout()->addWidget(frame); } @@ -485,8 +486,8 @@ void TrackView::adjustTrackHeaders() { int height = KdenliveSettings::trackheight() * m_scene->scale().y() - 1; QLayoutItem *child; - for (int i = 0; i < m_view.headers_container->layout()->count(); i++) { - child = m_view.headers_container->layout()->itemAt(i); + for (int i = 0; i < headers_container->layout()->count(); i++) { + child = headers_container->layout()->itemAt(i); if (child->widget() && child->widget()->height() > 5)(static_cast (child->widget()))->adjustSize(height); } } @@ -560,6 +561,9 @@ int TrackView::slotAddProjectTrack(int ix, QDomElement xml, bool locked) clipinfo.startPos = GenTime(position, m_doc->fps()); clipinfo.endPos = clipinfo.startPos + GenTime(out - in + 1, m_doc->fps()); clipinfo.cropStart = GenTime(in, m_doc->fps()); + clipinfo.cropDuration = GenTime((int) ((clipinfo.endPos - clipinfo.startPos).frames(m_doc->fps()) * speed + 0.5), m_doc->fps()); + clipinfo.originalcropStart = GenTime((int) ((clipinfo.cropStart).frames(m_doc->fps()) * speed + 0.5), m_doc->fps()); + clipinfo.track = ix; //kDebug() << "// INSERTING CLIP: " << in << "x" << out << ", track: " << ix << ", ID: " << id << ", SCALE: " << m_scale << ", FPS: " << m_doc->fps(); ClipItem *item = new ClipItem(clip, clipinfo, m_doc->fps(), speed, strobe, false); @@ -830,7 +834,7 @@ void TrackView::slotVerticalZoomDown() if (m_verticalZoom == 0) m_trackview->setScale(m_scene->scale().x(), 0.5); else m_trackview->setScale(m_scene->scale().x(), 1); adjustTrackHeaders(); - m_trackview->verticalScrollBar()->setValue(m_view.headers_area->verticalScrollBar()->value()); + m_trackview->verticalScrollBar()->setValue(headers_area->verticalScrollBar()->value()); } void TrackView::slotVerticalZoomUp() @@ -841,7 +845,7 @@ void TrackView::slotVerticalZoomUp() if (m_verticalZoom == 2) m_trackview->setScale(m_scene->scale().x(), 2); else m_trackview->setScale(m_scene->scale().x(), 1); adjustTrackHeaders(); - m_trackview->verticalScrollBar()->setValue(m_view.headers_area->verticalScrollBar()->value()); + m_trackview->verticalScrollBar()->setValue(headers_area->verticalScrollBar()->value()); } void TrackView::updateProjectFps() diff --git a/src/trackview.h b/src/trackview.h index 24f47b76..d44b20cd 100644 --- a/src/trackview.h +++ b/src/trackview.h @@ -39,7 +39,7 @@ class KdenliveDoc; class CustomRuler; class DocClipBase; -class TrackView : public QWidget +class TrackView : public QWidget, public Ui::TimeLine_UI { Q_OBJECT @@ -66,7 +66,6 @@ public slots: void slotSetZone(QPoint p); private: - Ui::TimeLine_UI m_view; CustomRuler *m_ruler; CustomTrackView *m_trackview; QList m_invalidProducers; diff --git a/src/transition.cpp b/src/transition.cpp index 0568c50c..fc2bb37a 100644 --- a/src/transition.cpp +++ b/src/transition.cpp @@ -42,7 +42,7 @@ Transition::Transition(const ItemInfo info, int transitiontrack, double fps, QDo setRect(0, 0, (info.endPos - info.startPos).frames(fps) - 0.02, (qreal)(KdenliveSettings::trackheight() / 3 * 2 - 1)); setPos(info.startPos.frames(fps), (qreal)(info.track * KdenliveSettings::trackheight() + KdenliveSettings::trackheight() / 3 * 2)); - m_cropStart = GenTime(); + m_info.cropStart = GenTime(); m_maxDuration = GenTime(600); if (m_automaticTransition) setBrush(QColor(200, 200, 50, 100)); @@ -218,22 +218,22 @@ QVariant Transition::itemChange(GraphicsItemChange change, const QVariant &value if ((int) otherPos.y() != (int) pos().y()) return pos(); //kDebug()<<"//// CURRENT Y: "<(items.at(i))->startPos() - m_cropDuration).frames(m_fps); + int npos = (static_cast < AbstractClipItem* >(items.at(i))->startPos() - m_info.cropDuration).frames(m_fps); newPos.setX(npos); } else { // get pos just after colliding clip int npos = static_cast < AbstractClipItem* >(items.at(i))->endPos().frames(m_fps); newPos.setX(npos); } - m_track = newTrack; + m_info.track = newTrack; //kDebug()<<"// ITEM NEW POS: "<