]> git.sesse.net Git - kdenlive/commitdiff
Tell MLT the maximum number of threads we might need for avformat producer
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Fri, 14 Oct 2011 19:55:06 +0000 (19:55 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Fri, 14 Oct 2011 19:55:06 +0000 (19:55 +0000)
svn path=/trunk/kdenlive/; revision=5965

src/renderer.cpp
src/renderer.h

index deab382ba5a3b94cc0c4207ca878425f8243fe9b..2acfe0f6c2f45b697d09d00c9640bd77d9f7639f 100644 (file)
@@ -1080,6 +1080,7 @@ int Render::setSceneList(QString playlist, int position)
         m_mltProducer = m_blackClip->cut(0, 50);
         error = -1;
     }
+    checkMaxThreads();
     int volume = KdenliveSettings::volume();
     m_mltProducer->set("meta.volume", (double)volume / 100);
     m_mltProducer->optimise();
@@ -1122,6 +1123,27 @@ int Render::setSceneList(QString playlist, int position)
     //if (position != 0) emit rendererPosition(position);
 }
 
+void Render::checkMaxThreads()
+{
+    // Make sure we don't use too much threads, MLT avformat does not cope with too much threads
+    // Currently, Kdenlive uses the following avformat threads:
+    // One thread to get info when adding a clip
+    // One thread to create the timeline video thumbnails
+    // One thread to create the audio thumbnails
+    Mlt::Service service(m_mltProducer->parent().get_service());
+    if (service.type() != tractor_type) {
+        kWarning() << "// TRACTOR PROBLEM";
+        return;
+    }
+    Mlt::Tractor tractor(service);
+    int mltMaxThreads = mlt_service_cache_get_size(service.get_service(), "producer_avformat");
+    int requestedThreads = tractor.count() + 4;
+    if (requestedThreads > mltMaxThreads) {
+        mlt_service_cache_set_size(service.get_service(), "producer_avformat", requestedThreads);
+        kDebug()<<"// MLT threads updated to: "<<mlt_service_cache_get_size(service.get_service(), "producer_avformat");
+    }
+}
+
 const QString Render::sceneList()
 {
     QString playlist;
@@ -3876,6 +3898,8 @@ void Render::mltInsertTrack(int ix, bool videoTrack)
         if (!videoTrack) newProd.set("hide", 1);
     }
 
+    checkMaxThreads();
+
     // Move transitions
     mlt_service serv = m_mltProducer->parent().get_service();
     mlt_service nextservice = mlt_service_get_producer(serv);
index afbf50eb78164ea860f0bdc7fec0e201efc02ad1..9acd058a2df173d4f19e684f588ec9554f7fb8fd 100644 (file)
@@ -340,6 +340,8 @@ private:
 
     /** @brief Make sure our audio mixing transitions are applied to the lowest track */
     void fixAudioMixing(Mlt::Tractor tractor);
+    /** @brief Make sure we inform MLT if we need a lot of threads for avformat producer */
+    void checkMaxThreads();
 
 private slots: