]> git.sesse.net Git - kdenlive/blobdiff - src/renderer.cpp
Fix opening of title with profile different than current one
[kdenlive] / src / renderer.cpp
index 142c9b158be551a421d6855bbd6f539458c741a7..acc2c3888a12c2f3f8aa795669ff8d37686460c3 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 > 0) {
+                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;
@@ -210,15 +211,31 @@ int Render::resetProfile()
     m_mltConsumer = NULL;
     QString scene = sceneList();
     int pos = 0;
+
+    delete m_blackClip;
+    m_blackClip = NULL;
+
     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 > 0) {
+                Mlt::Producer trackProducer(tractor.track(trackNb - 1));
+                Mlt::Playlist trackPlaylist((mlt_playlist) trackProducer.get_service());
+                trackPlaylist.clear();
+                trackNb--;
+            }
+        }
+
         delete m_mltProducer;
     }
     m_mltProducer = 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 > 0) {
+                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;
@@ -1381,68 +1394,80 @@ void Render::exportCurrentFrame(KUrl url, bool /*notify*/)
 /** MLT PLAYLIST DIRECT MANIPULATON  **/
 
 
-void Render::mltCheckLength()
+void Render::mltCheckLength(Mlt::Tractor *tractor)
 {
     //kDebug()<<"checking track length: "<<track<<"..........";
 
-    Mlt::Service service(m_mltProducer->get_service());
-    Mlt::Tractor tractor(service);
-
-    int trackNb = tractor.count();
+    int trackNb = tractor->count();
     int duration = 0;
     int trackDuration;
     if (trackNb == 1) {
-        Mlt::Producer trackProducer(tractor.track(0));
+        Mlt::Producer trackProducer(tractor->track(0));
         duration = trackProducer.get_playtime() - 1;
         m_mltProducer->set("out", duration);
         emit durationChanged(duration);
         return;
     }
     while (trackNb > 1) {
-        Mlt::Producer trackProducer(tractor.track(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--;
     }
 
-    Mlt::Producer blackTrackProducer(tractor.track(0));
+    Mlt::Producer blackTrackProducer(tractor->track(0));
 
     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);
-           m_blackClip->set("out", duration - 1);
-            if (blackclip) blackclip->set("length", duration);
+        if (blackclip && blackclip->is_blank()) {
+            delete blackclip;
+            blackclip = NULL;
         }
-        if (blackclip == NULL || blackclip->is_blank() || blackTrackPlaylist.count() != 1) {
+
+        if (blackclip == NULL || blackTrackPlaylist.count() != 1) {
             blackTrackPlaylist.clear();
-            blackTrackPlaylist.append(*m_blackClip, 0, duration - 1);
-        } else blackTrackPlaylist.resize_clip(0, 0, duration - 1);
+            m_blackClip->set("length", duration);
+            m_blackClip->set("out", duration - 1);
+            blackclip = m_blackClip->cut(0, duration - 1);
+            blackTrackPlaylist.insert_at(0, blackclip, 1);
+        } else {
+            if (duration > blackclip->parent().get_length()) {
+                blackclip->parent().set("length", duration);
+                blackclip->parent().set("out", duration - 1);
+                blackclip->set("length", duration);
+            }
+            blackTrackPlaylist.resize_clip(0, 0, duration - 1);
+        }
+
         delete blackclip;
         m_mltProducer->set("out", duration);
         emit durationChanged(duration);
     }
 }
 
-void Render::mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *prod)
+int Render::mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *prod)
 {
     if (m_mltProducer == NULL) {
         kDebug() << "PLAYLIST NOT INITIALISED //////";
-        return;
+        return -1;
     }
     Mlt::Producer parentProd(m_mltProducer->parent());
     if (parentProd.get_producer() == NULL) {
         kDebug() << "PLAYLIST BROKEN, CANNOT INSERT CLIP //////";
-        return;
+        return -1;
     }
 
     Mlt::Service service(parentProd.get_service());
+    if (service.type() != tractor_type) {
+        kWarning() << "// TRACTOR PROBLEM";
+        return -1;
+    }
     Mlt::Tractor tractor(service);
     if (info.track > tractor.count() - 1) {
         kDebug() << "ERROR TRYING TO INSERT CLIP ON TRACK " << info.track << ", at POS: " << info.startPos.frames(25);
-        return;
+        return -1;
     }
     mlt_service_lock(service.get_service());
     Mlt::Producer trackProducer(tractor.track(info.track));
@@ -1480,11 +1505,11 @@ void Render::mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *pr
     /*if (QString(prod->get("transparency")).toInt() == 1)
         mltAddClipTransparency(info, info.track - 1, QString(prod->get("id")).toInt());*/
 
+    if (info.track != 0 && (newIndex + 1 == trackPlaylist.count())) mltCheckLength(&tractor);
     mlt_service_unlock(service.get_service());
-
-    if (info.track != 0 && (newIndex + 1 == trackPlaylist.count())) mltCheckLength();
-    //tractor.multitrack()->refresh();
-    //tractor.refresh();
+    /*tractor.multitrack()->refresh();
+    tractor.refresh();*/
+    return 0;
 }
 
 
@@ -1619,7 +1644,7 @@ bool Render::mltRemoveClip(int track, GenTime position)
     kDebug()<<"CLIP "<<i<<": ("<<blankStart<<'x'<<blankStart + blankDuration<<")"<<blk;
     }*/
     mlt_service_unlock(service.get_service());
-    if (track != 0 && trackPlaylist.count() <= clipIndex) mltCheckLength();
+    if (track != 0 && trackPlaylist.count() <= clipIndex) mltCheckLength(&tractor);
     m_isBlocked = false;
     return true;
 }
@@ -1798,7 +1823,7 @@ void Render::mltInsertSpace(QMap <int, int> trackClipStartList, QMap <int, int>
         }
     }
     mlt_service_unlock(service.get_service());
-    mltCheckLength();
+    mltCheckLength(&tractor);
     m_mltConsumer->set("refresh", 1);
 }
 
@@ -1886,7 +1911,7 @@ int Render::mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, int
         mltPasteEffects(clip, cut);
         trackPlaylist.insert_at(startPos, cut, 1);
         delete cut;
-       delete clip;
+        delete clip;
         clipIndex = trackPlaylist.get_clip_index_at(startPos);
         newLength = trackPlaylist.clip_length(clipIndex);
         mlt_service_unlock(service.get_service());
@@ -1913,7 +1938,7 @@ int Render::mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, int
 
         trackPlaylist.insert_at(startPos, cut, 1);
         delete cut;
-       delete clip;
+        delete clip;
         clipIndex = trackPlaylist.get_clip_index_at(startPos);
         newLength = trackPlaylist.clip_length(clipIndex);
         mlt_service_unlock(service.get_service());
@@ -1958,7 +1983,7 @@ int Render::mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, int
 
         trackPlaylist.insert_at(startPos, cut, 1);
         delete cut;
-       delete clip;
+        delete clip;
         clipIndex = trackPlaylist.get_clip_index_at(startPos);
         newLength = trackPlaylist.clip_length(clipIndex);
 
@@ -1966,7 +1991,7 @@ int Render::mltChangeClipSpeed(ItemInfo info, double speed, double oldspeed, int
     }
 
     delete clip;
-    if (clipIndex + 1 == trackPlaylist.count()) mltCheckLength();
+    if (clipIndex + 1 == trackPlaylist.count()) mltCheckLength(&tractor);
     m_isBlocked = false;
     return newLength;
 }
@@ -2324,7 +2349,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->parent().set("out", newDuration);
         clip->set("length", newDuration + 1);
     }
     if (newDuration > clip->get_out()) {
@@ -2356,7 +2381,7 @@ bool Render::mltResizeClipEnd(ItemInfo info, GenTime clipDuration)
     trackPlaylist.consolidate_blanks(0);
     mlt_service_unlock(service.get_service());
 
-    if (info.track != 0 && clipIndex == trackPlaylist.count()) mltCheckLength();
+    if (info.track != 0 && clipIndex == trackPlaylist.count()) mltCheckLength(&tractor);
     /*if (QString(clip->parent().get("transparency")).toInt() == 1) {
         //mltResizeTransparency(previousStart, previousStart, previousStart + newDuration, track, QString(clip->parent().get("id")).toInt());
         mltDeleteTransparency(info.startPos.frames(m_fps), info.track, QString(clip->parent().get("id")).toInt());
@@ -2594,9 +2619,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";
@@ -2607,7 +2636,7 @@ bool Render::mltMoveClip(int startTrack, int endTrack, int moveStart, int moveEn
         }
     }
     mlt_service_unlock(service.get_service());
-    if (checkLength) mltCheckLength();
+    if (checkLength) mltCheckLength(&tractor);
     m_isBlocked--;
     //askForRefresh();
     //m_mltConsumer->set("refresh", 1);
@@ -3183,7 +3212,17 @@ void Render::mltDeleteTrack(int ix)
     tractor.removeChild(track);
     //kDebug() << "/////////// RESULT SCENE: \n" << doc.toString();
     setSceneList(doc.toString(), m_framePosition);
-    mltCheckLength();
+
+    if (m_mltProducer != NULL) {
+        Mlt::Producer parentProd(m_mltProducer->parent());
+        if (parentProd.get_producer() != NULL) {
+            Mlt::Service service(parentProd.get_service());
+            if (service.type() == tractor_type) {
+                Mlt::Tractor tractor(service);
+                mltCheckLength(&tractor);
+            }
+        }
+    }
 }
 
 
@@ -3202,9 +3241,8 @@ void Render::updatePreviewSettings()
     int pos = 0;
     if (m_mltProducer) {
         pos = m_mltProducer->position();
-        delete m_mltProducer;
     }
-    m_mltProducer = NULL;
+
     setSceneList(scene, pos);
 }