]> git.sesse.net Git - kdenlive/blobdiff - renderer/renderjob.cpp
[PATCH by Ray Lehtiniemi] Add defaults for a few potentially uninitialized uses
[kdenlive] / renderer / renderjob.cpp
index 72339e1b4f9681b97cbebb32cec0758418bf790c..cb2628bd1dc06a5f49291a69d86490ce7c314437 100644 (file)
  *   51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA          *
  ***************************************************************************/
 
+
+#include "renderjob.h"
+
 #include <QtDBus>
 #include <QFile>
 #include <QThread>
-#include "renderjob.h"
 
 // Can't believe I need to do this to sleep.
 class SleepThread : QThread {
@@ -33,7 +35,7 @@ public:
 
 static QDBusConnection connection(QLatin1String(""));
 
-RenderJob::RenderJob(bool erase, const QString &renderer, const QString &profile, const QString &rendermodule, const QString &player, const QString &scenelist, const QString &dest, const QStringList &preargs, const QStringList &args, int in, int out) : QObject(), m_jobUiserver(NULL), m_kdenliveinterface(NULL) {
+RenderJob::RenderJob(bool erase, bool usekuiserver, const QString &renderer, const QString &profile, const QString &rendermodule, const QString &player, const QString &scenelist, const QString &dest, const QStringList &preargs, const QStringList &args, int in, int out) : QObject(), m_usekuiserver(usekuiserver), m_jobUiserver(NULL), m_kdenliveinterface(NULL) {
     m_scenelist = scenelist;
     m_dest = dest;
     m_player = player;
@@ -44,15 +46,22 @@ RenderJob::RenderJob(bool erase, const QString &renderer, const QString &profile
     m_args << scenelist;
     if (in != -1) m_args << "in=" + QString::number(in);
     if (out != -1) m_args << "out=" + QString::number(out);
+
     m_args << preargs;
     //qDebug()<<"PRE ARGS: "<<preargs;
     if (scenelist.startsWith("consumer:")) {
         // Use MLT's producer_consumer, needs a different syntax for profile:
         m_args << "profile=" + profile;
     } else m_args << "-profile" << profile;
-    m_args << "-consumer" << rendermodule + ":" + m_dest << "progress=1" << args;
+    m_args << "-consumer" << rendermodule + ':' + m_dest << "progress=1" << args;
+
+    m_dualpass = false;
+    if (args.contains("pass=1")) m_dualpass = true;
+
     connect(m_renderProcess, SIGNAL(finished(int, QProcess::ExitStatus)), this, SLOT(slotIsOver(int, QProcess::ExitStatus)));
     m_renderProcess->setReadChannel(QProcess::StandardError);
+
+    /*
     // Create a log of every render process.
     m_logfile.setAutoRemove(false);
     m_logfile.setFileTemplate(QDir::tempPath() + "/kdenlive_render.log.XXXXXXXX");
@@ -72,12 +81,13 @@ RenderJob::RenderJob(bool erase, const QString &renderer, const QString &profile
         QTextStream in(&file);
         m_logstream << in.readAll() << endl;
     }
+    */
 }
 
 
 RenderJob::~RenderJob() {
     if (m_renderProcess) delete m_renderProcess;
-    m_logfile.close();
+    // m_logfile.close();
 }
 
 void RenderJob::slotAbort(const QString& url) {
@@ -100,41 +110,58 @@ void RenderJob::slotAbort() {
     }
     QFile f(m_dest);
     f.remove();
+    /*
     m_logstream << "Job aborted by user" << endl;
     m_logstream.flush();
     m_logfile.close();
+    */
     qApp->quit();
 }
 
 void RenderJob::receivedStderr() {
     QString result = QString(m_renderProcess->readAllStandardError()).simplified();
     if (!result.startsWith("Current Frame")) m_errorMessage.append(result + "<br>");
-    m_logstream << "ReceivedStderr from inigo: " << result << endl;
-    result = result.section(" ", -1);
-    int pro = result.toInt();
-    if (m_kdenliveinterface && pro > m_progress) {
-        m_dbusargs[1] = pro;
-        m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, "setRenderingProgress", m_dbusargs);
-    }
-    if (m_jobUiserver && pro > m_progress) {
-        m_progress = pro;
-        m_jobUiserver->call("setPercent", (uint) m_progress);
-        int seconds = m_startTime.secsTo(QTime::currentTime());
-        seconds = seconds * (100 - m_progress) / m_progress;
-        m_jobUiserver->call("setDescriptionField", (uint) 1, tr("Remaining time"), QTime(0, 0, seconds).toString("hh:mm:ss"));
-    }
+    else {
+        // m_logstream << "ReceivedStderr from inigo: " << result << endl;
+        result = result.section(' ', -1);
+        int pro = result.toInt();
+        if (pro < 0 || pro > 100) return;
+        if (pro > m_progress) {
+            m_progress = pro;
+            if (m_kdenliveinterface) {
+                if (!m_kdenliveinterface->isValid()) {
+                    delete m_kdenliveinterface;
+                    m_kdenliveinterface = NULL;
+                    // qDebug() << "BROKEN COMMUNICATION WITH KDENLIVE";
+                } else {
+                    m_dbusargs[1] = pro;
+                    m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, "setRenderingProgress", m_dbusargs);
+                }
+            } else if (pro % 5 == 0) {
+                // Try to restart communication with Kdenlive every 5 percents
+                // qDebug() << "TRYING TO RESTART COMMUNICATION WITH KDENLIVE";
+                initKdenliveDbusInterface();
+            }
 
+            if (m_jobUiserver) {
+                m_jobUiserver->call("setPercent", (uint) m_progress);
+                /*int seconds = m_startTime.secsTo(QTime::currentTime());
+                seconds = seconds * (100 - m_progress) / m_progress;
+                m_jobUiserver->call("setDescriptionField", (uint) 1, tr("Remaining time"), QTime().addSecs(seconds).toString("hh:mm:ss"));*/
+            }
+        }
+    }
 }
 
 void RenderJob::start() {
     QDBusConnectionInterface* interface = QDBusConnection::sessionBus().interface();
-    if (interface) {
+    if (interface && m_usekuiserver) {
         if (!interface->isServiceRegistered("org.kde.JobViewServer")) {
             qDebug() << "No org.kde.JobViewServer registered, trying to start kuiserver";
-            m_logstream << "No org.kde.JobViewServer registered, trying to start kuiserver";
+            // m_logstream << "No org.kde.JobViewServer registered, trying to start kuiserver";
             if (QProcess::startDetached("kuiserver")) {
                 qDebug() << "Started kuiserver";
-                m_logstream << "Started kuiserver";
+                // m_logstream << "Started kuiserver";
                 // Give it a couple of seconds to start
                 QTime t;
                 t.start();
@@ -143,25 +170,36 @@ void RenderJob::start() {
                 }
             } else {
                 qDebug() << "Failed to start kuiserver";
-                m_logstream << "Failed to start kuiserver";
+                // m_logstream << "Failed to start kuiserver";
             }
         }
 
         if (interface->isServiceRegistered("org.kde.JobViewServer")) {
             QDBusInterface kuiserver("org.kde.JobViewServer", "/JobViewServer", "org.kde.JobViewServer");
-            QDBusReply<QDBusObjectPath> objectPath = kuiserver.call("requestView", "kdenlive", "kdenlive", 1);
+            QDBusReply<QDBusObjectPath> objectPath = kuiserver.call("requestView", "kdenlive", "kdenlive", 0x0001);
             QString reply = ((QDBusObjectPath) objectPath).path();
             m_jobUiserver = new QDBusInterface("org.kde.JobViewServer", reply, "org.kde.JobView");
             if (m_jobUiserver) {
                 m_startTime = QTime::currentTime();
                 m_jobUiserver->call("setPercent", (uint) 0);
-                QDBusReply<QString> reply = m_jobUiserver->call("setInfoMessage", tr("Rendering %1").arg(QFileInfo(m_dest).fileName()));
-                m_jobUiserver->call("setDescriptionField", (uint) 0, tr("Rendering to"), m_dest);
+                m_jobUiserver->call("setInfoMessage", tr("Rendering %1").arg(QFileInfo(m_dest).fileName()));
+                //m_jobUiserver->call("setDescriptionField", (uint) 0, tr("Rendering to"), m_dest);
                 QDBusConnection::sessionBus().connect("org.kde.JobViewServer", reply, "org.kde.JobView", "cancelRequested", this, SLOT(slotAbort()));
             }
         }
     }
 
+    initKdenliveDbusInterface();
+
+    // Because of the logging, we connect to stderr in all cases.
+    connect(m_renderProcess, SIGNAL(readyReadStandardError()), this, SLOT(receivedStderr()));
+    m_renderProcess->start(m_prog, m_args);
+    // m_logstream << "Started render process: " << m_prog << " " << m_args.join(" ") << endl;
+    qDebug() << "Started render process: " << m_prog << " " << m_args.join(" ");
+}
+
+
+void RenderJob::initKdenliveDbusInterface() {
     QString kdenliveId;
     QDBusConnection connection = QDBusConnection::sessionBus();
     QDBusConnectionInterface *ibus = connection.interface();
@@ -172,12 +210,12 @@ void RenderJob::start() {
         kdenliveId = service;
         break;
     }
-
-    QDBusConnection bus = QDBusConnection::sessionBus();
+    m_dbusargs.clear();
+    if (kdenliveId.isEmpty()) return;
     m_kdenliveinterface = new QDBusInterface(kdenliveId,
             "/MainWindow",
             "org.kdenlive.MainWindow",
-            bus,
+            connection,
             this);
 
     if (m_kdenliveinterface) {
@@ -187,12 +225,6 @@ void RenderJob::start() {
         connect(m_kdenliveinterface, SIGNAL(abortRenderJob(const QString &)),
                 this, SLOT(slotAbort(const QString&)));
     }
-
-    // Because of the logging, we connect to stderr in all cases.
-    connect(m_renderProcess, SIGNAL(readyReadStandardError()), this, SLOT(receivedStderr()));
-    m_renderProcess->start(m_prog, m_args);
-    m_logstream << "Started render process: " << m_prog << " " << m_args.join(" ") << endl;
-    qDebug() << "Started render process: " << m_prog << " " << m_args.join(" ");
 }
 
 
@@ -211,17 +243,18 @@ void RenderJob::slotIsOver(int exitcode, QProcess::ExitStatus status) {
         }
         QStringList args;
         args << "--error" << tr("Rendering of %1 aborted, resulting video will probably be corrupted.").arg(m_dest);
-        m_logstream << "Rendering of " << m_dest << " aborted, resulting video will probably be corrupted." << endl;
+        // m_logstream << "Rendering of " << m_dest << " aborted, resulting video will probably be corrupted." << endl;
         qDebug() << "Rendering of " << m_dest << " aborted, resulting video will probably be corrupted.";
         QProcess::startDetached("kdialog", args);
+        qApp->quit();
     } else {
-        if (m_kdenliveinterface) {
+        if (!m_dualpass && m_kdenliveinterface) {
             m_dbusargs[1] = (int) - 1;
             m_dbusargs.append(QString());
             m_kdenliveinterface->callWithArgumentList(QDBus::NoBlock, "setRenderingFinished", m_dbusargs);
         }
         QDBusConnectionInterface* interface = QDBusConnection::sessionBus().interface();
-        if (interface && interface->isServiceRegistered("org.kde.knotify")) {
+        if (!m_dualpass && interface && interface->isServiceRegistered("org.kde.knotify")) {
             QDBusMessage m = QDBusMessage::createMethodCall("org.kde.knotify",
                              "/Notify",
                              "org.kde.KNotify",
@@ -235,22 +268,25 @@ void RenderJob::slotIsOver(int exitcode, QProcess::ExitStatus status) {
             args.append(QByteArray());   // app icon
             QStringList actionList;
             args.append(actionList);   // actions
-            qlonglong wid;
+            qlonglong wid = 0;
             args.append(wid);   // win id
 
             m.setArguments(args);
             QDBusMessage replyMsg = QDBusConnection::sessionBus().call(m);
         }
-        m_logstream << "Rendering of " << m_dest << " finished" << endl;
+        // m_logstream << "Rendering of " << m_dest << " finished" << endl;
         qDebug() << "Rendering of " << m_dest << " finished";
-        if (m_player != "-") {
-            m_logstream << "Starting player" << endl;
+        if (!m_dualpass && m_player != "-") {
+            // m_logstream << "Starting player" << endl;
             QStringList args;
             args << m_dest;
             QProcess::startDetached(m_player, args);
         }
+        if (m_dualpass) {
+            emit renderingFinished();
+            deleteLater();
+        } else qApp->quit();
     }
-    qApp->quit();
 }
 
 #include "renderjob.moc"