]> git.sesse.net Git - kdenlive/commitdiff
Fix freeze / crash introduced by recent commit when seeking outside clip range
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 25 Dec 2012 00:28:50 +0000 (01:28 +0100)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Tue, 25 Dec 2012 00:28:50 +0000 (01:28 +0100)
src/monitor.cpp
src/renderer.cpp
src/smallruler.cpp

index 7c2f5b8599a265c47a9c2ecfaf5b8eef2e9dc9d6..d0f24fcf284a8444f049f7444fc96e54cad168d2 100644 (file)
@@ -52,7 +52,7 @@ Monitor::Monitor(Kdenlive::MONITORID id, MonitorManager *manager, QString profil
     m_currentClip(NULL),
     m_overlay(NULL),
     m_scale(1),
-    m_length(0),
+    m_length(2),
     m_dragStarted(false),
     m_contextMenu(NULL),
     m_effectWidget(NULL),
index 6ad956415a704121cfc5f1f910d0389120a45f91..96c22f5b301c23efee3fcd876024e596e5a9e242 100644 (file)
@@ -421,12 +421,15 @@ void Render::seek(GenTime time)
 void Render::seek(int time)
 {
     resetZoneMode();
+    time = qMax(0, time);
+    time = qMin(m_mltProducer->get_playtime(), time);
     if (requestedSeekPosition == SEEK_INACTIVE) {
        requestedSeekPosition = time;
        m_mltProducer->seek(time);
        //m_mltConsumer->purge();
        if (m_paused && !externalConsumer) {
-           refresh();
+           m_mltConsumer->set("refresh", 1);
+           //refresh();
        }
     }
     else requestedSeekPosition = time;
@@ -1235,9 +1238,7 @@ void Render::refreshConsumerDisplay()
     m_mltConsumer->set("refresh", 1);
     // Make sure the first frame is displayed, otherwise if we change producer too fast
     // We can crash the avformat producer
-    Mlt::Event *ev = m_mltConsumer->setup_wait_for("consumer-frame-show");
-    m_mltConsumer->wait_for(ev);
-    delete ev;
+    m_mltConsumer->wait_for("consumer-frame-show");
 }
 
 int Render::setSceneList(QDomDocument list, int position)
@@ -1326,6 +1327,7 @@ int Render::setSceneList(QString playlist, int position)
         m_mltProducer = m_blackClip->cut(0, 1);
         error = -1;
     }
+    m_mltProducer->set("eof", "pause");
     checkMaxThreads();
     int volume = KdenliveSettings::volume();
     m_mltProducer->set("meta.volume", (double)volume / 100);
@@ -1710,8 +1712,8 @@ void Render::refresh()
         return;
     if (m_mltConsumer) {
         if (m_mltConsumer->is_stopped()) m_mltConsumer->start();
-        //m_mltConsumer->purge();
        refreshConsumerDisplay();
+        //m_mltConsumer->purge();
     }
 }
 
@@ -1778,9 +1780,6 @@ void Render::emitFrameNumber()
     emit rendererPosition(currentPos);
     if (requestedSeekPosition != SEEK_INACTIVE) {
        m_mltProducer->seek(requestedSeekPosition);
-       if (m_paused) {
-           refresh();
-       }
        requestedSeekPosition = SEEK_INACTIVE;
     }
 }
index 776743b01ffb01391ce0e757878463e27aeb413b..0e035bc033d36c02d1db4e6e32b46b5669a342d2 100644 (file)
@@ -34,8 +34,7 @@
 SmallRuler::SmallRuler(MonitorManager *manager, Render *render, QWidget *parent) :
         QWidget(parent)
         ,m_cursorFramePosition(0)
-        ,m_scale(1)
-        ,m_maxval(25)
+        ,m_maxval(2)
         ,m_manager(manager)
        ,m_render(render)
        ,m_lastSeekPosition(SEEK_INACTIVE)
@@ -48,6 +47,7 @@ SmallRuler::SmallRuler(MonitorManager *manager, Render *render, QWidget *parent)
 
     setMouseTracking(true);
     setMinimumHeight(10);
+    adjustScale(m_maxval);
 }