]> git.sesse.net Git - kdenlive/blobdiff - src/renderer.cpp
Do not uselessly switch monitors at startup
[kdenlive] / src / renderer.cpp
index c9c23e29c8688d7bd8a3fd76050bd82d7431f1bb..ebee863cd116ae0142af6eed8f44df8ae2a5874c 100644 (file)
@@ -187,7 +187,6 @@ void Render::buildConsumer(const QString &profileName)
     setenv("MLT_PROFILE", tmp, 1);
     m_mltProfile = new Mlt::Profile(tmp);
     m_mltProfile->set_explicit(true);
-    kDebug()<<"// *********  PROFILE AR: "<<m_mltProfile->dar();
     delete[] tmp;
 
     m_blackClip = new Mlt::Producer(*m_mltProfile, "colour", "black");
@@ -289,10 +288,13 @@ Mlt::Producer *Render::invalidProducer(const QString &id)
     return clip;
 }
 
+bool Render::hasProfile(const QString &profileName) const
+{
+    return m_activeProfile == profileName;
+}
+
 int Render::resetProfile(const QString &profileName, bool dropSceneList)
 {
-    QString scene;
-    if (!dropSceneList) scene = sceneList();
     if (m_mltConsumer) {
         if (m_externalConsumer == KdenliveSettings::external_display()) {
             if (KdenliveSettings::external_display() && m_activeProfile == profileName) return 1;
@@ -313,6 +315,8 @@ int Render::resetProfile(const QString &profileName, bool dropSceneList)
         delete m_mltConsumer;
         m_mltConsumer = NULL;
     }
+    QString scene;
+    if (!dropSceneList) scene = sceneList();
     int pos = 0;
     double current_fps = m_mltProfile->fps();
     double current_dar = m_mltProfile->dar();
@@ -749,20 +753,30 @@ void Render::processFileProperties()
 
         if (info.xml.hasAttribute("templatetext"))
             producer->set("templatetext", info.xml.attribute("templatetext").toUtf8().constData());
+
+        int imageWidth = (int)((double) info.imageHeight * m_mltProfile->width() / m_mltProfile->height() + 0.5);
+        int fullWidth = (int)((double) info.imageHeight * m_mltProfile->dar() + 0.5);
+        int frameNumber = info.xml.attribute("thumbnail", "-1").toInt();
         
         if ((!info.replaceProducer && info.xml.hasAttribute("file_hash")) || proxyProducer) {
             // Clip  already has all properties
-            emit replyGetFileProperties(info.clipId, producer, stringMap(), stringMap(), info.replaceProducer, true);
+            if (proxyProducer) {
+                // Recreate clip thumb
+                if (frameNumber > 0) producer->seek(frameNumber);
+                Mlt::Frame *frame = producer->get_frame();
+                if (frame && frame->is_valid()) {
+                    QImage img = KThumb::getFrame(frame, imageWidth, fullWidth, info.imageHeight);
+                    delete frame;
+                    emit replyGetImage(info.clipId, img);
+                }
+            }
+            emit replyGetFileProperties(info.clipId, producer, stringMap(), stringMap(), info.replaceProducer);
             m_processingClipId.clear();
             continue;
         }
 
-        int imageWidth = (int)((double) info.imageHeight * m_mltProfile->width() / m_mltProfile->height() + 0.5);
-        int fullWidth = (int)((double) info.imageHeight * m_mltProfile->dar() + 0.5);
         stringMap filePropertyMap;
         stringMap metadataPropertyMap;
-
-        int frameNumber = info.xml.attribute("thumbnail", "-1").toInt();
         if (frameNumber > 0) producer->seek(frameNumber);
         
         duration = duration > 0 ? duration : producer->get_playtime();
@@ -976,26 +990,22 @@ int Render::setProducer(Mlt::Producer *producer, int position)
     QMutexLocker locker(&m_mutex);
     QString currentId;
     int consumerPosition = 0;
-    if (m_winid == -1) return -1;
-    if (m_mltConsumer) {
-        consumerPosition = m_mltConsumer->position();
-        if (!m_mltConsumer->is_stopped()) {
-            m_mltConsumer->stop();
-            m_mltConsumer->purge();
-        }
-        m_mltConsumer->set("refresh", 0);
-    }
-    else {
-        return -1;
+    if (m_winid == -1 || !m_mltConsumer) return -1;
+    m_mltConsumer->set("refresh", 0);
+    if (!m_mltConsumer->is_stopped()) {
+        m_mltConsumer->stop();
     }
+    m_mltConsumer->purge();
+    consumerPosition = m_mltConsumer->position();
 
     if (m_mltProducer) {
-        currentId = m_mltProducer->get("id");
         m_mltProducer->set_speed(0);
+        currentId = m_mltProducer->get("id");
         delete m_mltProducer;
         m_mltProducer = NULL;
         emit stopped();
     }
+
     blockSignals(true);
     if (producer && producer->is_valid()) {
         m_mltProducer = producer;
@@ -1012,11 +1022,15 @@ int Render::setProducer(Mlt::Producer *producer, int position)
     m_fps = m_mltProducer->get_fps();
     blockSignals(false);
     int error = connectPlaylist();
-    if (producer == NULL) {
-        return error;
-    }
 
-    emit rendererPosition((int) m_mltProducer->position());
+    position = m_mltProducer->position();
+    m_mltConsumer->set("refresh", 1);
+    // Make sure the first frame is displayed, otherwise if we change producer too fast
+    // We can crash the avformat producer
+    Mlt::Event *ev = m_mltConsumer->setup_wait_for("consumer-frame-show");
+    m_mltConsumer->wait_for(ev);
+    delete ev;
+    emit rendererPosition(position);
     return error;
 }
 
@@ -1027,6 +1041,7 @@ int Render::setSceneList(QDomDocument list, int position)
 
 int Render::setSceneList(QString playlist, int position)
 {
+    QMutexLocker locker(&m_mutex);
     if (m_winid == -1) return -1;
     int error = 0;
 
@@ -1244,7 +1259,6 @@ double Render::fps() const
 int Render::connectPlaylist()
 {
     if (!m_mltConsumer) return -1;
-    //m_mltConsumer->set("refresh", "0");
     m_mltConsumer->connect(*m_mltProducer);
     m_mltProducer->set_speed(0);
     if (m_mltConsumer->start() == -1) {
@@ -1256,7 +1270,6 @@ int Render::connectPlaylist()
     }
     emit durationChanged(m_mltProducer->get_playtime());
     return 0;
-    //refresh();
 }
 
 
@@ -1299,6 +1312,7 @@ void Render::slotOsdTimeout()
 
 void Render::start()
 {
+    QMutexLocker locker(&m_mutex);
     if (m_winid == -1) {
         kDebug() << "-----  BROKEN MONITOR: " << m_name << ", RESTART";
         return;
@@ -1309,16 +1323,19 @@ void Render::start()
             //KMessageBox::error(qApp->activeWindow(), i18n("Could not create the video preview window.\nThere is something wrong with your Kdenlive install or your driver settings, please fix it."));
             kDebug(QtWarningMsg) << "/ / / / CANNOT START MONITOR";
         } else {
-            refresh();
+            m_mltConsumer->purge();
+            m_mltConsumer->set("refresh", 1);
         }
     }
 }
 
 void Render::stop()
 {
+    QMutexLocker locker(&m_mutex);
     if (m_mltProducer == NULL) return;
     if (m_mltConsumer && !m_mltConsumer->is_stopped()) {
         m_mltConsumer->stop();
+        m_mltConsumer->purge();
     }
 
     if (m_mltProducer) {
@@ -1329,6 +1346,7 @@ void Render::stop()
 
 void Render::stop(const GenTime & startTime)
 {
+    QMutexLocker locker(&m_mutex);
     if (m_mltProducer) {
         if (m_isZoneMode) resetZoneMode();
         m_mltProducer->set_speed(0.0);
@@ -1350,6 +1368,7 @@ void Render::pause()
 
 void Render::switchPlay(bool play)
 {
+    QMutexLocker locker(&m_mutex);
     if (!m_mltProducer || !m_mltConsumer)
         return;
     if (m_isZoneMode) resetZoneMode();
@@ -1361,9 +1380,12 @@ void Render::switchPlay(bool play)
         m_mltConsumer->set("refresh", "1");
         m_mltProducer->set_speed(1.0);
     } else if (!play) {
+        m_mltProducer->set_speed(0.0);
         m_mltConsumer->set("refresh", 0);
         m_mltProducer->seek(m_mltConsumer->position());
-        stop();
+        if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
+        if (m_isZoneMode) resetZoneMode();
+        
         //emitConsumerStopped();
         /*m_mltConsumer->set("refresh", 0);
         m_mltConsumer->stop();
@@ -1452,6 +1474,7 @@ void Render::seekToFrameDiff(int diff)
 void Render::doRefresh()
 {
     // Use a Timer so that we don't refresh too much
+    QMutexLocker locker(&m_mutex);
     if (m_mltConsumer) {
         if (m_mltConsumer->is_stopped()) m_mltConsumer->start();
         m_mltConsumer->set("refresh", 1);
@@ -1460,6 +1483,7 @@ void Render::doRefresh()
 
 void Render::refresh()
 {
+    QMutexLocker locker(&m_mutex);
     if (!m_mltProducer)
         return;
     if (m_mltConsumer) {
@@ -1471,6 +1495,7 @@ void Render::refresh()
 
 void Render::setDropFrames(bool show)
 {
+    QMutexLocker locker(&m_mutex);
     if (m_mltConsumer) {
         int dropFrames = KdenliveSettings::mltthreads();
         if (show == false) dropFrames = -dropFrames;
@@ -1840,6 +1865,7 @@ void Render::mltCutClip(int track, GenTime position)
 Mlt::Tractor *Render::lockService()
 {
     // we are going to replace some clips, purge consumer
+    QMutexLocker locker(&m_mutex);
     if (!m_mltProducer) return NULL;
     if (m_mltConsumer) {
         if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
@@ -4003,6 +4029,7 @@ void Render::updatePreviewSettings()
     kDebug() << "////// RESTARTING CONSUMER";
     if (!m_mltConsumer || !m_mltProducer) return;
     if (m_mltProducer->get_playtime() == 0) return;
+    QMutexLocker locker(&m_mutex);
     Mlt::Service service(m_mltProducer->parent().get_service());
     if (service.type() != tractor_type) return;