]> git.sesse.net Git - kdenlive/blobdiff - src/renderer.cpp
Fix crash on clip cut introduced in recent coverity fix:
[kdenlive] / src / renderer.cpp
index d675671fee0f66f0881973595109b2585a02e638..a506e4ef39cb815d950f7dcbfbe523823508a9d9 100644 (file)
@@ -1413,6 +1413,7 @@ void Render::start()
 
 void Render::stop()
 {
+    requestedSeekPosition = SEEK_INACTIVE;
     m_refreshTimer.stop();
     QMutexLocker locker(&m_mutex);
     if (m_mltProducer == NULL) return;
@@ -1429,6 +1430,7 @@ void Render::stop()
 
 void Render::stop(const GenTime & startTime)
 {
+    requestedSeekPosition = SEEK_INACTIVE;
     m_refreshTimer.stop();
     QMutexLocker locker(&m_mutex);
     if (m_mltProducer) {
@@ -1441,6 +1443,7 @@ void Render::stop(const GenTime & startTime)
 
 void Render::pause()
 {
+    requestedSeekPosition = SEEK_INACTIVE;
     if (!m_mltProducer || !m_mltConsumer)
         return;
     if (m_mltProducer->get_speed() == 0.0) return;
@@ -1484,6 +1487,7 @@ void Render::switchPlay(bool play)
 
 void Render::play(double speed)
 {
+    requestedSeekPosition = SEEK_INACTIVE;
     if (!m_mltProducer)
         return;
     // if (speed == 0.0) m_mltProducer->set("out", m_mltProducer->get_length() - 1);
@@ -1497,6 +1501,7 @@ void Render::play(double speed)
 
 void Render::play(const GenTime & startTime)
 {
+    requestedSeekPosition = SEEK_INACTIVE;
     if (!m_mltProducer || !m_mltConsumer)
         return;
     m_mltProducer->seek((int)(startTime.frames(m_fps)));
@@ -1506,6 +1511,7 @@ void Render::play(const GenTime & startTime)
 
 void Render::loopZone(const GenTime & startTime, const GenTime & stopTime)
 {
+    requestedSeekPosition = SEEK_INACTIVE;
     if (!m_mltProducer || !m_mltConsumer)
         return;
     //m_mltProducer->set("eof", "loop");
@@ -1516,6 +1522,7 @@ void Render::loopZone(const GenTime & startTime, const GenTime & stopTime)
 
 void Render::playZone(const GenTime & startTime, const GenTime & stopTime)
 {
+    requestedSeekPosition = SEEK_INACTIVE;
     if (!m_mltProducer || !m_mltConsumer)
         return;
     if (!m_isZoneMode) m_originalOut = m_mltProducer->get_playtime() - 1;
@@ -1545,7 +1552,9 @@ void Render::seekToFrame(int pos)
 void Render::seekToFrameDiff(int diff)
 {
     resetZoneMode();
-    seek(m_mltProducer->position() + diff);
+    if (requestedSeekPosition == SEEK_INACTIVE)
+       seek(m_mltProducer->position() + diff);
+    else seek(requestedSeekPosition + diff);
 }
 
 void Render::doRefresh()
@@ -1877,12 +1886,12 @@ int Render::mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *pro
 }
 
 
-void Render::mltCutClip(int track, GenTime position)
+bool Render::mltCutClip(int track, GenTime position)
 {
     Mlt::Service service(m_mltProducer->parent().get_service());
     if (service.type() != tractor_type) {
         kWarning() << "// TRACTOR PROBLEM";
-        return;
+        return false;
     }
 
     Mlt::Tractor tractor(service);
@@ -1905,7 +1914,7 @@ void Render::mltCutClip(int track, GenTime position)
     int clipIndex = trackPlaylist.get_clip_index_at(cutPos);
     if (trackPlaylist.is_blank(clipIndex)) {
         kDebug() << "// WARNING, TRYING TO CUT A BLANK";
-        return;
+        return false;
     }
     service.lock();
     int clipStart = trackPlaylist.clip_start(clipIndex);
@@ -1915,12 +1924,16 @@ void Render::mltCutClip(int track, GenTime position)
     // duplicate effects
     Mlt::Producer *original = trackPlaylist.get_clip_at(clipStart);
     Mlt::Producer *clip = trackPlaylist.get_clip_at(cutPos);
-
+    
     if (original == NULL || clip == NULL) {
         kDebug() << "// ERROR GRABBING CLIP AFTER SPLIT";
+       return false;
     }
+
     Mlt::Service clipService(original->get_service());
     Mlt::Service dupService(clip->get_service());
+
+
     delete original;
     delete clip;
     int ct = 0;
@@ -1942,7 +1955,7 @@ void Render::mltCutClip(int track, GenTime position)
         ct++;
         filter = clipService.filter(ct);
     }
-
+    return true;
     /* // Display playlist info
     kDebug()<<"////////////  AFTER";
     for (int i = 0; i < trackPlaylist.count(); i++) {
@@ -4450,5 +4463,7 @@ bool Render::getBlackMagicOutputDeviceList(KComboBox *devicelist)
     return true;
 }
 
+
+
 #include "renderer.moc"