#include "definitions.h"
#include "slideshowclip.h"
#include "profilesdialog.h"
+
+#ifdef USE_BLACKMAGIC
#include "blackmagic/devices.h"
+#endif
#include <mlt++/Mlt.h>
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();
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();
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)
{
if (m_processingClipId == id) return;
- 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();
}
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;
}
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");
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;
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;
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);
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;
}
{
if (!m_mltProducer)
return;
-
resetZoneMode();
m_mltProducer->seek(pos);
if (m_mltProducer->get_speed() == 0) {
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);
}
}
}
}
}
- 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();