]> git.sesse.net Git - kdenlive/blobdiff - src/renderer.cpp
Cleanup, fix mem leaks, fix unused clips not correctly updated on profile change
[kdenlive] / src / renderer.cpp
index cb5c8e2508700fc15cf37d8ad7618c848d4893e6..607f0d027e7bdb09d26030fbe18171e779233970 100644 (file)
@@ -100,21 +100,22 @@ Render::~Render()
 void Render::closeMlt()
 {
     //delete m_osdTimer;
-
-    Mlt::Service service(m_mltProducer->get_service());
-    if (service.type() == tractor_type) {
-        Mlt::Tractor tractor(service);
-        int trackNb = tractor.count();
-
-        while (trackNb > 1) {
-            Mlt::Producer trackProducer(tractor.track(trackNb - 1));
-            Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
-            trackPlaylist.clear();
-            trackNb--;
+    if (m_mltProducer) {
+        Mlt::Service service(m_mltProducer->get_service());
+        if (service.type() == tractor_type) {
+            Mlt::Tractor tractor(service);
+            int trackNb = tractor.count();
+
+            while (trackNb > 1) {
+                Mlt::Producer trackProducer(tractor.track(trackNb - 1));
+                Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
+                trackPlaylist.clear();
+                trackNb--;
+            }
         }
     }
 
-    kDebug() << "// // // CLOSE RENDERER";
+    kDebug() << "// // // CLOSE RENDERER " << m_name;
     delete m_mltConsumer;
     delete m_mltProducer;
     delete m_blackClip;
@@ -212,13 +213,29 @@ int Render::resetProfile()
     int pos = 0;
     if (m_mltProducer) {
         pos = m_mltProducer->position();
+
+
+        Mlt::Service service(m_mltProducer->get_service());
+        if (service.type() == tractor_type) {
+            Mlt::Tractor tractor(service);
+            int trackNb = tractor.count();
+            while (trackNb > 1) {
+                Mlt::Producer trackProducer(tractor.track(trackNb - 1));
+                Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
+                trackPlaylist.clear();
+                trackNb--;
+            }
+        }
+
+
         delete m_mltProducer;
     }
     m_mltProducer = NULL;
+    delete m_blackClip;
+    m_blackClip = NULL;
 
-    //WARNING: Trying to delete the profile will crash when trying to display a clip afterwards...
-    /*if (m_mltProfile) delete m_mltProfile;
-    m_mltProfile = NULL;*/
+    if (m_mltProfile) delete m_mltProfile;
+    m_mltProfile = NULL;
 
     buildConsumer();
 
@@ -864,6 +881,19 @@ int Render::setSceneList(QString playlist, int position)
         m_mltProducer->set_speed(0);
         //if (KdenliveSettings::osdtimecode() && m_osdInfo) m_mltProducer->detach(*m_osdInfo);
 
+
+        Mlt::Service service(m_mltProducer->get_service());
+        if (service.type() == tractor_type) {
+            Mlt::Tractor tractor(service);
+            int trackNb = tractor.count();
+            while (trackNb > 1) {
+                Mlt::Producer trackProducer(tractor.track(trackNb - 1));
+                Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
+                trackPlaylist.clear();
+                trackNb--;
+            }
+        }
+
         delete m_mltProducer;
         m_mltProducer = NULL;
         emit stopped();
@@ -1094,23 +1124,6 @@ void Render::start()
     m_isBlocked = false;
 }
 
-void Render::clear()
-{
-    kDebug() << " *********  RENDER CLEAR";
-    if (m_mltConsumer) {
-        //m_mltConsumer->set("refresh", 0);
-        if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
-    }
-
-    if (m_mltProducer) {
-        //if (KdenliveSettings::osdtimecode() && m_osdInfo) m_mltProducer->detach(*m_osdInfo);
-        m_mltProducer->set_speed(0.0);
-        delete m_mltProducer;
-        m_mltProducer = NULL;
-        emit stopped();
-    }
-}
-
 void Render::stop()
 {
     if (m_mltProducer == NULL) return;
@@ -1401,7 +1414,6 @@ void Render::mltCheckLength()
     while (trackNb > 1) {
         Mlt::Producer trackProducer(tractor.track(trackNb - 1));
         trackDuration = trackProducer.get_playtime() - 1;
-
         //kDebug() << " / / /DURATON FOR TRACK " << trackNb - 1 << " = " << trackDuration;
         if (trackDuration > duration) duration = trackDuration;
         trackNb--;
@@ -1412,12 +1424,15 @@ void Render::mltCheckLength()
     if (blackTrackProducer.get_playtime() - 1 != duration) {
         Mlt::Playlist blackTrackPlaylist((mlt_playlist) blackTrackProducer.get_service());
         Mlt::Producer *blackclip = blackTrackPlaylist.get_clip(0);
-        if (duration > m_blackClip->get_length()) {
-            m_blackClip->set("length", duration);
-            if (blackclip) blackclip->set("length", duration);
+        if (blackclip && duration > blackclip->parent().get_length()) {
+            blackclip->parent().set("length", duration);
+            blackclip->parent().set("out", duration - 1);
+            blackclip->set("length", duration);
         }
         if (blackclip == NULL || blackclip->is_blank() || blackTrackPlaylist.count() != 1) {
             blackTrackPlaylist.clear();
+            m_blackClip->set("length", duration);
+            m_blackClip->set("out", duration - 1);
             blackTrackPlaylist.append(*m_blackClip, 0, duration - 1);
         } else blackTrackPlaylist.resize_clip(0, 0, duration - 1);
         delete blackclip;
@@ -1872,7 +1887,6 @@ int Render::mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, int
             m_slowmotionProducers.insert(url, slowprod);
         }
         Mlt::Producer *clip = trackPlaylist.replace_with_blank(clipIndex);
-        delete clip;
         trackPlaylist.consolidate_blanks(0);
         // Check that the blank space is long enough for our new duration
         clipIndex = trackPlaylist.get_clip_index_at(startPos);
@@ -1885,9 +1899,9 @@ int Render::mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, int
 
         // move all effects to the correct producer
         mltPasteEffects(clip, cut);
-
         trackPlaylist.insert_at(startPos, cut, 1);
         delete cut;
+        delete clip;
         clipIndex = trackPlaylist.get_clip_index_at(startPos);
         newLength = trackPlaylist.clip_length(clipIndex);
         mlt_service_unlock(service.get_service());
@@ -1895,7 +1909,6 @@ int Render::mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, int
         mlt_service_lock(service.get_service());
 
         Mlt::Producer *clip = trackPlaylist.replace_with_blank(clipIndex);
-        delete clip;
         trackPlaylist.consolidate_blanks(0);
 
         // Check that the blank space is long enough for our new duration
@@ -1915,6 +1928,7 @@ int Render::mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, int
 
         trackPlaylist.insert_at(startPos, cut, 1);
         delete cut;
+        delete clip;
         clipIndex = trackPlaylist.get_clip_index_at(startPos);
         newLength = trackPlaylist.clip_length(clipIndex);
         mlt_service_unlock(service.get_service());
@@ -1939,7 +1953,6 @@ int Render::mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, int
             m_slowmotionProducers.insert(url, slowprod);
         }
         Mlt::Producer *clip = trackPlaylist.replace_with_blank(clipIndex);
-        delete clip;
         trackPlaylist.consolidate_blanks(0);
 
         GenTime oldDuration = GenTime(clipLength, m_fps);
@@ -1960,6 +1973,7 @@ int Render::mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, int
 
         trackPlaylist.insert_at(startPos, cut, 1);
         delete cut;
+        delete clip;
         clipIndex = trackPlaylist.get_clip_index_at(startPos);
         newLength = trackPlaylist.clip_length(clipIndex);
 
@@ -2325,6 +2339,7 @@ bool Render::mltResizeClipEnd(ItemInfo info, GenTime clipDuration)
     int diff = newDuration - (trackPlaylist.clip_length(clipIndex) - 1);
     if (newDuration > clip->get_length()) {
         clip->parent().set("length", newDuration + 1);
+        clip->parent().set("out", newDuration);
         clip->set("length", newDuration + 1);
     }
     if (newDuration > clip->get_out()) {
@@ -2594,9 +2609,13 @@ bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn
             mltPasteEffects(clipProducer, clip);
 
             int newIndex = destTrackPlaylist.insert_at(moveEnd, clip, 1);
-            delete clip;
-            clip = NULL;
-            if (clipProducer) delete clipProducer;
+            if (clip == clipProducer) {
+                delete clip;
+                clip = NULL;
+            } else {
+                delete clip;
+                delete clipProducer;
+            }
             destTrackPlaylist.consolidate_blanks(0);
             /*if (QString(clipProducer.parent().get("transparency")).toInt() == 1) {
                 kDebug() << "//////// moving clip transparency";
@@ -3202,9 +3221,8 @@ void Render::updatePreviewSettings()
     int pos = 0;
     if (m_mltProducer) {
         pos = m_mltProducer->position();
-        delete m_mltProducer;
     }
-    m_mltProducer = NULL;
+
     setSceneList(scene, pos);
 }