]> git.sesse.net Git - kdenlive/commitdiff
Fix various speed related issues
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 22 Sep 2009 08:19:09 +0000 (08:19 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 22 Sep 2009 08:19:09 +0000 (08:19 +0000)
svn path=/trunk/kdenlive/; revision=3915

13 files changed:
src/abstractclipitem.cpp
src/abstractclipitem.h
src/clipitem.cpp
src/customtrackscene.cpp
src/customtrackscene.h
src/customtrackview.cpp
src/definitions.h
src/mainwindow.cpp
src/monitor.cpp
src/renderer.cpp
src/trackview.cpp
src/trackview.h
src/transition.cpp

index 90641d762f738791ddd722b3f65b555c2c1d1f60..584ffab2bd3cddf925245ba95663e8188a7974d0 100644 (file)
 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: "<<durationDiff.frames(25)<<", POS: "<<pos().x();
-    m_startPos += durationDiff;
-    if (type() == AVWIDGET) m_cropStart += durationDiff * speed;
-    m_cropDuration = m_cropDuration - durationDiff * speed;
+    m_info.startPos += durationDiff;
+    GenTime originalDiff = GenTime((int) (durationDiff.frames(m_fps) * speed + 0.5), m_fps); 
+    
+    if (type() == AVWIDGET) {
+       m_info.cropStart += durationDiff;
+       m_info.originalcropStart += originalDiff;
+    }
+    m_info.cropDuration = m_info.cropDuration - originalDiff;
 
     setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height());
     moveBy(durationDiff.frames(m_fps), 0);
@@ -114,8 +114,12 @@ void AbstractClipItem::resizeStart(int posx, double speed)
     if ((int) scenePos().x() != posx) {
         //kDebug()<<"//////  WARNING, DIFF IN XPOS: "<<pos().x()<<" == "<<m_startPos.frames(m_fps);
         GenTime diff = GenTime((int) pos().x() - posx, m_fps);
-        if (type() == AVWIDGET) m_cropStart = m_cropStart + diff;
-        m_cropDuration = m_cropDuration - diff;
+       GenTime originalDiff = GenTime((int) (diff.frames(m_fps) * speed + 0.5), m_fps); 
+        if (type() == AVWIDGET) {
+           m_info.cropStart += diff;
+           m_info.originalcropStart += originalDiff;
+       }
+        m_info.cropDuration = m_info.cropDuration - originalDiff;
         setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height());
         //kDebug()<<"// NEW START: "<<m_startPos.frames(25)<<", NW DUR: "<<m_cropDuration.frames(25);
     }
@@ -151,7 +155,7 @@ void AbstractClipItem::resizeEnd(int posx, double speed)
         durationDiff = GenTime() - (cropDuration() - GenTime(3, m_fps));
     }
     //kDebug() << "// DUR DIFF2:" << durationDiff.frames(25) << ", ADJUSTED: " << durationDiff.frames(25) * speed << ", SPED:" << speed;
-    m_cropDuration += durationDiff * speed;
+    m_info.cropDuration += GenTime((int) (durationDiff.frames(m_fps) * speed + 0.5), m_fps);
     setRect(0, 0, cropDuration().frames(m_fps) - 0.02, rect().height());
     if (durationDiff > GenTime()) {
         QList <QGraphicsItem *> 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
index 226e20754f2efe5c2f631e469f0e503aabd8b282..129011a6b300eedbb43aef677443e17088344385 100644 (file)
@@ -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 <int, int> m_keyframes;
     double m_keyframeFactor;
index d16f1ad8b81fd730f22f05e40505050cc16f5013..87ea7ea48cdc019ffc38a278f525a8c92f3e8754 100644 (file)
@@ -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 <GenTime> 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 <CommentedTime> 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: "<<newPos.x()<<", mapped: "<<mapToScene(newPos.x(), 0).x();
         return newPos;
     }
@@ -1490,22 +1490,22 @@ void ClipItem::setSpeed(const double speed, const int strobe)
 
 GenTime ClipItem::maxDuration() const
 {
-    return m_maxDuration / m_speed;
+    return GenTime((int) (m_maxDuration.frames(m_fps) / m_speed + 0.5), m_fps);
 }
 
 GenTime ClipItem::cropStart() const
 {
-    return m_cropStart / m_speed;
+    return GenTime((int) (m_info.originalcropStart.frames(m_fps) / m_speed + 0.5), m_fps);
 }
 
 GenTime ClipItem::cropDuration() const
 {
-    return m_cropDuration / m_speed;
+    return GenTime((int) (m_info.cropDuration.frames(m_fps) / m_speed + 0.5), m_fps);
 }
 
 GenTime ClipItem::endPos() const
 {
-    return m_startPos + cropDuration();
+    return m_info.startPos + cropDuration();
 }
 
 //virtual
@@ -1518,7 +1518,7 @@ void ClipItem::dropEvent(QGraphicsSceneDragDropEvent * event)
     if (scene() && !scene()->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());
     }
 }
 
index 13672c1f0c18da2c20e7a8b1330be442961fa952..1364d22d8e33a96d9daef78770edbfde8cf8b6ee 100644 (file)
@@ -54,18 +54,18 @@ void CustomTrackScene::setSnapList(QList <GenTime> 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) {
index 983548278b40c382668f2beb95d81b7222eac853..961927dea2d732a333680b083def2935fd919184 100644 (file)
@@ -40,8 +40,8 @@ public:
     explicit CustomTrackScene(KdenliveDoc *doc, QObject *parent = 0);
     virtual ~ CustomTrackScene();
     void setSnapList(QList <GenTime> 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;
index 0ff1f3415de22f04a019e7d708f2e1b2e4ca8879..59a3d9ebc48ede5df86a9cc1b93b0450d7bbbfcd 100644 (file)
@@ -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 <ClipItem*>(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 <GenTime> offsetList;
         QList<QGraphicsItem *> 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 <ClipItem*>(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 <ClipItem *>(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();
index 90d5e31364ee4f2c29bc9812f30f977154b857f5..c8725fc0b00de5367ee976593e5990adda87c55a 100644 (file)
@@ -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;
 };
 
index a3ac44fb05a8010a92e5ded6f036557ce3ef8545..6b78ed7eaaee8d93be9baadc5e05c8767832abba 100644 (file)
@@ -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();
             }
         }
index 88259bf8690f062b87b020f6ee94ad69c9b72076..9bb76d83afaaeaeec2593b7ba928e897d2813c6f 100644 (file)
@@ -289,7 +289,7 @@ void Monitor::updateMarkers(DocClipBase *source)
         if (!markers.isEmpty()) {
             QList <int> 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)
index 57e2ef85120ef844da7d3423fdb95acc61f37e2f..733224cc8628c98c3f6bc2ddbd23ac523b58572f 100644 (file)
@@ -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);
index e790a4c1c0e3bf01690381651250980be004c682..85de754ca0bcdea23a108821a7cd27891c508ea9 100644 (file)
@@ -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 <TrackInfo> 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 <HeaderTrack *>(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()
index 24f47b762a9fc1dd669f466c09bffbbd4bb37833..d44b20cd99f864e1d2cb585fd3ebc2de8fa956f0 100644 (file)
@@ -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 <QString> m_invalidProducers;
index 0568c50cc9748bf36e5f0c8d12da5fd07931b5c6..fc2bb37a8a75fc5283bb7b8e17d9a628bf8fcf60 100644 (file)
@@ -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: "<<pos().y()<<", COLLIDING Y: "<<otherPos.y();
                     if (pos().x() < otherPos.x()) {
-                        int npos = (static_cast < AbstractClipItem* >(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: "<<newPos.x()<<", mapped: "<<mapToScene(newPos.x(), 0).x();
-                    m_startPos = GenTime((int) newPos.x(), m_fps);
+                    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: "<<newPos.x()<<", mapped: "<<mapToScene(newPos.x(), 0).x();
         return newPos;
     }