]> git.sesse.net Git - kdenlive/blobdiff - src/renderer.cpp
Tell MLT the maximum number of threads we might need for avformat producer
[kdenlive] / src / renderer.cpp
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);