]> git.sesse.net Git - kdenlive/blobdiff - src/renderer.cpp
Allow archiving proxy clips only
[kdenlive] / src / renderer.cpp
index ea95bf535a42872f5748cb9c9f92997a1a4e78b1..3dd02443f01c6d1c5783c37d01bed8a249109e9d 100644 (file)
 #include "definitions.h"
 #include "slideshowclip.h"
 #include "profilesdialog.h"
+
+#ifdef USE_BLACKMAGIC
 #include "blackmagic/devices.h"
+#endif
 
 #include <mlt++/Mlt.h>
 
@@ -201,6 +204,7 @@ void Render::buildConsumer(const QString &profileName)
     m_blackClip->set("mlt_type", "producer");
 
     if (KdenliveSettings::external_display() && m_name != "clip") {
+#ifdef USE_BLACKMAGIC
         // Use blackmagic card for video output
         QMap< QString, QString > profileProperties = ProfilesDialog::getSettingsFromFile(profileName);
         int device = KdenliveSettings::blackmagic_output_device();
@@ -221,6 +225,7 @@ void Render::buildConsumer(const QString &profileName)
                 if (m_mltConsumer && m_mltConsumer->is_valid()) return;
             } else KMessageBox::informationList(qApp->activeWindow(), i18n("Your project's profile %1 is not compatible with the blackmagic output card. Please see supported profiles below. Switching to normal video display.", m_mltProfile->description()), BMInterface::supportedModes(KdenliveSettings::blackmagic_output_device()));
         }
+#endif
     }
     m_externalConsumer = false;
     QString videoDriver = KdenliveSettings::videodrivername();
@@ -584,13 +589,15 @@ void Render::getFileProperties(const QDomElement &xml, const QString &clipId, in
     m_requestList.removeAll(info);
     m_requestList.append(info);
     m_infoMutex.unlock();
-    if (!m_infoThread.isRunning())
+    if (!m_infoThread.isRunning()) {
         m_infoThread = QtConcurrent::run(this, &Render::processFileProperties);
+    }
 }
 
 void Render::forceProcessing(const QString &id)
 {
-    m_infoMutex.lock();
+    if (m_processingClipId == id) return;
+    QMutexLocker lock(&m_infoMutex);
     for (int i = 0; i < m_requestList.count(); i++) {
         requestClipInfo info = m_requestList.at(i);
         if (info.clipId == id) {
@@ -602,33 +609,29 @@ void Render::forceProcessing(const QString &id)
             }
         }
     }
-    m_infoMutex.unlock();
 }
 
 int Render::processingItems()
 {
-    m_infoMutex.lock();
+    QMutexLocker lock(&m_infoMutex);
     int count = m_requestList.count();
     if (!m_processingClipId.isEmpty()) {
         // one clip is currently processed
         count++;
     }
-    m_infoMutex.unlock();
     return count;
 }
 
 bool Render::isProcessing(const QString &id)
 {
     if (m_processingClipId == id) return true;
-    m_infoMutex.lock();
+    QMutexLocker lock(&m_infoMutex);
     for (int i = 0; i < m_requestList.count(); i++) {
         requestClipInfo info = m_requestList.at(i);
         if (info.clipId == id) {
-            m_infoMutex.unlock();
             return true;
         }
     }
-    m_infoMutex.unlock();
     return false;
 }
 
@@ -639,13 +642,21 @@ void Render::processFileProperties()
     while (!m_requestList.isEmpty()) {
         m_infoMutex.lock();
         info = m_requestList.takeFirst();
-        m_infoMutex.unlock();
         m_processingClipId = info.clipId;
+        m_infoMutex.unlock();
+        
         QString path;
         bool proxyProducer;
         if (info.xml.hasAttribute("proxy") && info.xml.attribute("proxy") != "-") {
             path = info.xml.attribute("proxy");
-            proxyProducer = true;
+            // Check for missing proxies
+            if (QFileInfo(path).size() <= 0) {
+                // proxy is missing, re-create it
+                emit requestProxy(info.clipId);
+                proxyProducer = false;
+                path = info.xml.attribute("resource");
+            }
+            else proxyProducer = true;
         }
         else {
             path = info.xml.attribute("resource");
@@ -782,9 +793,9 @@ void Render::processFileProperties()
                 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);
                 }
+                if (frame) delete frame;
             }
             m_processingClipId.clear();
             emit replyGetFileProperties(info.clipId, producer, stringMap(), stringMap(), info.replaceProducer);
@@ -914,6 +925,9 @@ void Render::processFileProperties()
             int video_max = 0;
             int default_audio = producer->get_int("audio_index");
             int audio_max = 0;
+            
+            int scan = producer->get_int("meta.media.progressive");
+            filePropertyMap["progressive"] = QString::number(scan);
 
             // Find maximum stream index values
             for (int ix = 0; ix < producer->get_int("meta.media.nb_streams"); ix++) {
@@ -1238,14 +1252,15 @@ const QString Render::sceneList()
     QString playlist;
     Mlt::Profile profile((mlt_profile) 0);
     Mlt::Consumer xmlConsumer(profile, "xml:kdenlive_playlist");
+    if (!xmlConsumer.is_valid()) return QString();
     m_mltProducer->optimise();
     xmlConsumer.set("terminate_on_pause", 1);
     Mlt::Producer prod(m_mltProducer->get_producer());
+    if (!prod.is_valid()) return QString();
     bool split = m_isSplitView;
     if (split) slotSplitView(false);
     xmlConsumer.connect(prod);
-    xmlConsumer.start();
-    while (!xmlConsumer.is_stopped()) {}
+    xmlConsumer.run();
     playlist = QString::fromUtf8(xmlConsumer.get("kdenlive_playlist"));
     if (split) slotSplitView(true);
     return playlist;
@@ -1256,10 +1271,11 @@ bool Render::saveSceneList(QString path, QDomElement kdenliveData)
     QFile file(path);
     QDomDocument doc;
     doc.setContent(sceneList(), false);
-    if (!kdenliveData.isNull()) {
+    if (doc.isNull()) return false;
+    QDomElement root = doc.documentElement();
+    if (!kdenliveData.isNull() && !root.isNull()) {
         // add Kdenlive specific tags
-        QDomNode mlt = doc.elementsByTagName("mlt").at(0);
-        mlt.appendChild(doc.importNode(kdenliveData, true));
+        root.appendChild(doc.importNode(kdenliveData, true));
     }
     if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
         kWarning() << "//////  ERROR writing to file: " << path;
@@ -1414,7 +1430,7 @@ void Render::switchPlay(bool play)
             m_mltConsumer->start();
         }
         m_mltProducer->set_speed(1.0);
-        m_mltConsumer->set("refresh", "1");
+        m_mltConsumer->set("refresh", 1);
     } else if (!play) {
         m_mltProducer->set_speed(0.0);
         m_mltConsumer->set("refresh", 0);
@@ -1474,6 +1490,7 @@ void Render::playZone(const GenTime & startTime, const GenTime & stopTime)
     m_mltProducer->seek((int)(startTime.frames(m_fps)));
     m_mltProducer->set_speed(1.0);
     m_mltConsumer->set("refresh", 1);
+    if (m_mltConsumer->is_stopped()) m_mltConsumer->start();
     m_isZoneMode = true;
 }
 
@@ -1490,7 +1507,6 @@ void Render::seekToFrame(int pos)
 {
     if (!m_mltProducer)
         return;
-    
     resetZoneMode();
     m_mltProducer->seek(pos);
     if (m_mltProducer->get_speed() == 0) {
@@ -1589,7 +1605,7 @@ void Render::emitConsumerStopped()
     if (m_mltProducer) {
         double pos = m_mltProducer->position();
         if (m_isLoopMode) play(m_loopStart);
-        else if (m_isZoneMode) resetZoneMode();
+        //else if (m_isZoneMode) resetZoneMode();
         emit rendererStopped((int) pos);
     }
 }
@@ -4161,11 +4177,14 @@ QString Render::updateSceneListFps(double current_fps, double new_fps, QString s
             }
         }
     }
-    QDomElement tractor = doc.elementsByTagName("tractor").at(0).toElement();
-    int out = tractor.attribute("out").toInt();
-    out = factor * out + 0.5;
-    tractor.setAttribute("out", out);
-    emit durationChanged(out);
+    QDomElement root = doc.documentElement();
+    if (!root.isNull()) {
+        QDomElement tractor = root.firstChildElement("tractor");
+        int out = tractor.attribute("out").toInt();
+        out = factor * out + 0.5;
+        tractor.setAttribute("out", out);
+        emit durationChanged(out);
+    }
 
     //kDebug() << "///////////////////////////// " << out << " \n" << doc.toString() << "\n-------------------------";
     return doc.toString();
@@ -4186,6 +4205,11 @@ Mlt::Producer* Render::getProducer()
     return m_mltProducer;
 }
 
+const QString Render::activeClipId()
+{
+    if (m_mltProducer) return m_mltProducer->get("id");
+    return QString();
+}
 
 #include "renderer.moc"