]> git.sesse.net Git - kdenlive/blobdiff - src/recmonitor.cpp
const modifiers are useless on integral return types [PATCH by Ray Lehtiniemi]
[kdenlive] / src / recmonitor.cpp
index 828a5ea82f0a2dd20779c71bf5de0d3a572fbc5c..479d0568300512fd2bf658d76bb73a52955395bf 100644 (file)
  ***************************************************************************/
 
 
-#include <QMouseEvent>
-#include <QStylePainter>
-#include <QMenu>
-#include <QToolButton>
-#include <QFile>
-#include <QDir>
-#include <QDesktopWidget>
+#include "recmonitor.h"
+#include "gentime.h"
+#include "kdenlivesettings.h"
+#include "managecapturesdialog.h"
 
 #include <KDebug>
 #include <KLocale>
+#include <QPainter>
 #include <KStandardDirs>
 #include <KComboBox>
 #include <KIO/NetAccess>
 #include <KFileItem>
 
-#include "gentime.h"
-#include "kdenlivesettings.h"
-#include "managecapturesdialog.h"
-#include "recmonitor.h"
+#include <QMouseEvent>
+#include <QMenu>
+#include <QToolButton>
+#include <QFile>
+#include <QDir>
+
 
 RecMonitor::RecMonitor(QString name, QWidget *parent)
         : QWidget(parent), m_name(name), m_isActive(false), m_isCapturing(false), m_isPlaying(false), m_didCapture(false) {
@@ -85,7 +85,6 @@ RecMonitor::RecMonitor(QString name, QWidget *parent)
     slotVideoDeviceChanged(ui.device_selector->currentIndex());
     displayProcess = new QProcess;
     captureProcess = new QProcess;
-    alsaProcess = new QProcess;
 
     connect(captureProcess, SIGNAL(stateChanged(QProcess::ProcessState)), this, SLOT(slotProcessStatus(QProcess::ProcessState)));
 
@@ -107,23 +106,16 @@ RecMonitor::RecMonitor(QString name, QWidget *parent)
         QString captureCommand;
         if (!KdenliveSettings::video4adevice().isEmpty()) captureCommand = "-f " + KdenliveSettings::video4aformat() + " -i " + KdenliveSettings::video4adevice();
 
-        captureCommand +=  " -f " + KdenliveSettings::video4vformat() + " -s " + KdenliveSettings::video4size() + " -r " + QString::number(KdenliveSettings::video4rate()) + " -i " + KdenliveSettings::video4vdevice() + " -f " + KdenliveSettings::video4vencoding();
+        captureCommand +=  " -f " + KdenliveSettings::video4vformat() + " -s " + KdenliveSettings::video4size() + " -r " + QString::number(KdenliveSettings::video4rate()) + " -i " + KdenliveSettings::video4vdevice();
         KdenliveSettings::setVideo4capture(captureCommand);
     }
 
-    if (KdenliveSettings::video4playback().isEmpty()) {
-        QString playbackCommand;
-        playbackCommand =  "-f " + KdenliveSettings::video4vencoding();
-        KdenliveSettings::setVideo4playback(playbackCommand);
-    }
-
     kDebug() << "/////// BUILDING MONITOR, ID: " << ui.video_frame->winId();
 }
 
 RecMonitor::~RecMonitor() {
     delete captureProcess;
     delete displayProcess;
-    delete alsaProcess;
 }
 
 QString RecMonitor::name() const {
@@ -143,7 +135,12 @@ void RecMonitor::slotVideoDeviceChanged(int ix) {
         m_recAction->setEnabled(true);
         m_stopAction->setEnabled(false);
         m_playAction->setEnabled(false);
-        ui.video_frame->setPixmap(mergeSideBySide(KIcon("video-display").pixmap(QSize(50, 50)), i18n("Press record button\nto start screen capture\nFiles will be saved in:\n%1", KdenliveSettings::capturefolder())));
+        if (KdenliveSettings::rmd_path().isEmpty()) {
+            QString rmdpath = KStandardDirs::findExe("recordmydesktop");
+            if (rmdpath.isEmpty()) ui.video_frame->setPixmap(mergeSideBySide(KIcon("dialog-warning").pixmap(QSize(50, 50)), i18n("Recordmydesktop utility not found,\n please install it for screen grabs")));
+            else KdenliveSettings::setRmd_path(rmdpath);
+        }
+        if (!KdenliveSettings::rmd_path().isEmpty()) ui.video_frame->setPixmap(mergeSideBySide(KIcon("video-display").pixmap(QSize(50, 50)), i18n("Press record button\nto start screen capture\nFiles will be saved in:\n%1", KdenliveSettings::capturefolder())));
         //ui.video_frame->setText(i18n("Press record button\nto start screen capture"));
         break;
     case VIDEO4LINUX:
@@ -163,7 +160,13 @@ void RecMonitor::slotVideoDeviceChanged(int ix) {
         m_rewAction->setEnabled(false);
         m_fwdAction->setEnabled(false);
         //ui.video_frame->setText(i18n("Plug your camcorder and\npress connect button\nto initialize connection"));
-        ui.video_frame->setPixmap(mergeSideBySide(KIcon("network-connect").pixmap(QSize(50, 50)), i18n("Plug your camcorder and\npress connect button\nto initialize connection\nFiles will be saved in:\n%1", KdenliveSettings::capturefolder())));
+        if (KdenliveSettings::dvgrab_path().isEmpty()) {
+            QString dvgrabpath = KStandardDirs::findExe("dvgrab");
+            if (dvgrabpath.isEmpty()) ui.video_frame->setPixmap(mergeSideBySide(KIcon("dialog-warning").pixmap(QSize(50, 50)), i18n("dvgrab utility not found,\n please install it for firewire capture")));
+            else KdenliveSettings::setDvgrab_path(dvgrabpath);
+        }
+
+        if (!KdenliveSettings::dvgrab_path().isEmpty()) ui.video_frame->setPixmap(mergeSideBySide(KIcon("network-connect").pixmap(QSize(50, 50)), i18n("Plug your camcorder and\npress connect button\nto initialize connection\nFiles will be saved in:\n%1", KdenliveSettings::capturefolder())));
         break;
     }
 }
@@ -337,13 +340,13 @@ void RecMonitor::slotStartCapture(bool play) {
         captureProcess->setStandardOutputProcess(displayProcess);
         captureProcess->setWorkingDirectory(KdenliveSettings::capturefolder());
         kDebug() << "Capture: Running dvgrab " << m_captureArgs.join(" ");
-        captureProcess->start("dvgrab", m_captureArgs);
+        captureProcess->start(KdenliveSettings::dvgrab_path(), m_captureArgs);
         if (play) captureProcess->write(" ", 1);
         m_discAction->setEnabled(true);
         break;
     case VIDEO4LINUX:
-        m_captureArgs << KdenliveSettings::video4capture().simplified().split(' ') << "-";
-        m_displayArgs << KdenliveSettings::video4playback().simplified().split(' ') << "-x" << QString::number(ui.video_frame->width()) << "-y" << QString::number(ui.video_frame->height()) << "-";
+        m_captureArgs << KdenliveSettings::video4capture().simplified().split(' ') << KdenliveSettings::video4encoding().simplified().split(' ') << "-f" << "mpegts" << "-vcodec" << "mpeg4" << "-acodec" << "mp2" << "-";
+        m_displayArgs << "-f" << "mpegts" << "-x" << QString::number(ui.video_frame->width()) << "-y" << QString::number(ui.video_frame->height()) << "-";
         captureProcess->setStandardOutputProcess(displayProcess);
         kDebug() << "Capture: Running ffmpeg " << m_captureArgs.join(" ");
         captureProcess->start("ffmpeg", m_captureArgs);
@@ -353,7 +356,7 @@ void RecMonitor::slotStartCapture(bool play) {
     }
 
     if (ui.device_selector->currentIndex() != SCREENGRAB) {
-        kDebug() << "Capture: Running ffplay " << m_captureArgs.join(" ");
+        kDebug() << "Capture: Running ffplay " << m_displayArgs.join(" ");
         displayProcess->start("ffplay", m_displayArgs);
         ui.video_frame->setText(i18n("Initialising..."));
     } else {
@@ -381,12 +384,11 @@ void RecMonitor::slotRecord() {
             QTimer::singleShot(1000, this, SLOT(slotStartCapture()));
             break;
         case SCREENGRAB:
-            captureProcess->write("q\n", 3);
+            //captureProcess->write("q\n", 3);
             captureProcess->terminate();
-            alsaProcess->terminate();
-            alsaProcess->kill();
+            ui.video_frame->setText(i18n("Encoding captured video..."));
             // in case ffmpeg doesn't exit with the 'q' command, kill it one second later
-            QTimer::singleShot(1000, captureProcess, SLOT(kill()));
+            //QTimer::singleShot(1000, captureProcess, SLOT(kill()));
             break;
         }
         return;
@@ -398,13 +400,13 @@ void RecMonitor::slotRecord() {
     }
     if (captureProcess->state() == QProcess::NotRunning) {
         m_recAction->setChecked(true);
-        QString extension = "mpg";
-        if (ui.device_selector->currentIndex() == SCREENGRAB) extension = KdenliveSettings::screengrabextension();
+        QString extension = "mp4";
+        if (ui.device_selector->currentIndex() == SCREENGRAB) extension = "ogv"; //KdenliveSettings::screengrabextension();
         QString path = KdenliveSettings::capturefolder() + "/capture0000." + extension;
         int i = 1;
         while (QFile::exists(path)) {
             QString num = QString::number(i).rightJustified(4, '0', false);
-            path = KdenliveSettings::capturefolder() + "/capture" + num + "." + extension;
+            path = KdenliveSettings::capturefolder() + "/capture" + num + '.' + extension;
             i++;
         }
 
@@ -420,46 +422,58 @@ void RecMonitor::slotRecord() {
             m_displayArgs << "-f" << "mpegts" << "-x" << QString::number(ui.video_frame->width()) << "-y" << QString::number(ui.video_frame->height()) << "-";
             captureProcess->setStandardOutputProcess(displayProcess);
             kDebug() << "Capture: Running dvgrab " << m_captureArgs.join(" ");
-            captureProcess->start("dvgrab", m_captureArgs);
+            captureProcess->start(KdenliveSettings::dvgrab_path(), m_captureArgs);
             break;
         case VIDEO4LINUX:
-            m_captureArgs << KdenliveSettings::video4capture().simplified().split(' ') << "-y" << m_captureFile.path() << "-f" << KdenliveSettings::video4vencoding() << "-";
-            m_displayArgs << KdenliveSettings::video4playback().simplified().split(' ') << "-x" << QString::number(ui.video_frame->width()) << "-y" << QString::number(ui.video_frame->height()) << "-";
+            m_captureArgs << KdenliveSettings::video4capture().simplified().split(' ') << KdenliveSettings::video4encoding().simplified().split(' ') << "-vcodec" << "mpeg4" << "-acodec" << "mp2" << "-y" << m_captureFile.path() << "-f" << "mpegts" << "-vcodec" << "mpeg4" << "-acodec" << "mp2" << "-";
+            m_displayArgs << "-f" << "mpegts" << "-x" << QString::number(ui.video_frame->width()) << "-y" << QString::number(ui.video_frame->height()) << "-";
             captureProcess->setStandardOutputProcess(displayProcess);
             kDebug() << "Capture: Running ffmpeg " << m_captureArgs.join(" ");
             captureProcess->start("ffmpeg", m_captureArgs);
             break;
         case SCREENGRAB:
-            if (KdenliveSettings::fullscreengrab()) {
-                const QRect rect = QApplication::desktop()->screenGeometry();
-                args = KdenliveSettings::screengrabcapture().replace("%size", QString::number(rect.width()) + "x" + QString::number(rect.height())).replace("%offset", QString());
-                if (KdenliveSettings::screengrabenableaudio()) {
-                    // also capture audio
-                    if (KdenliveSettings::useosscapture()) m_captureArgs << KdenliveSettings::screengrabosscapture().simplified().split(' ');
-                    else m_captureArgs << KdenliveSettings::screengrabalsacapture2().simplified().split(' ');
-                }
-                m_captureArgs << args.simplified().split(' ') << KdenliveSettings::screengrabencoding().simplified().split(' ') << m_captureFile.path();
-                ui.video_frame->setText(i18n("Capturing..."));
-                m_isCapturing = true;
-                if (KdenliveSettings::screengrabenableaudio() && !KdenliveSettings::useosscapture()) {
-                    QStringList alsaArgs = KdenliveSettings::screengrabalsacapture().simplified().split(' ');
-                    alsaProcess->setStandardOutputProcess(captureProcess);
-                    kDebug() << "Capture: Running arecord " << alsaArgs.join(" ");
-                    alsaProcess->start("arecord", alsaArgs);
+            switch (KdenliveSettings::rmd_capture_type()) {
+            case 0:
+                // Full screen capture, nothing special to do
+                break;
+            default:
+                // Region capture
+                m_captureArgs << "-width" << QString::number(KdenliveSettings::rmd_width()) << "-height" << QString::number(KdenliveSettings::rmd_height());
+                if (!KdenliveSettings::rmd_follow_mouse()) {
+                    m_captureArgs << "-x" << QString::number(KdenliveSettings::rmd_offsetx()) << "-y" << QString::number(KdenliveSettings::rmd_offsety());
+                } else {
+                    m_captureArgs << "--follow-mouse";
+                    if (KdenliveSettings::rmd_hide_frame()) m_captureArgs << "--no-frame";
                 }
-                kDebug() << "Capture: Running ffmpeg " << m_captureArgs.join(" ");
-                captureProcess->start("ffmpeg", m_captureArgs);
-            } else {
-                ui.video_frame->setText(i18n("Select region..."));
-                rgnGrab = new RegionGrabber();
-                connect(rgnGrab, SIGNAL(regionGrabbed(const QRect&)), SLOT(slotStartGrab(const QRect &)));
+                break;
             }
+            m_isCapturing = true;
+            if (KdenliveSettings::rmd_capture_audio()) {
+                m_captureArgs << "-freq" << KdenliveSettings::rmd_freq();
+                m_captureArgs << "-channels" << QString::number(KdenliveSettings::rmd_audio_channels());
+                if (KdenliveSettings::rmd_use_jack()) {
+                    m_captureArgs << "-use-jack" << KdenliveSettings::rmd_jackports();
+                    if (KdenliveSettings::rmd_jack_buffer() > 0.0)
+                        m_captureArgs << "-ring-buffer-size" << QString::number(KdenliveSettings::rmd_jack_buffer());
+                } else {
+                    if (!KdenliveSettings::rmd_alsadevicename().isEmpty())
+                        m_captureArgs << "-device" << KdenliveSettings::rmd_alsadevicename();
+                    if (KdenliveSettings::rmd_alsa_buffer() > 0)
+                        m_captureArgs << "-buffer-size" << QString::number(KdenliveSettings::rmd_alsa_buffer());
+                }
+            } else m_captureArgs << "--no-sound";
+
+            if (KdenliveSettings::rmd_fullshots()) m_captureArgs << "--full-shots";
+            m_captureArgs << "-workdir" << KdenliveSettings::currenttmpfolder();
+            m_captureArgs << "-fps" << QString::number(KdenliveSettings::rmd_fps()) << "-o" << m_captureFile.path();
+            captureProcess->start(KdenliveSettings::rmd_path(), m_captureArgs);
+            kDebug() << "// RecordMyDesktop params: " << m_captureArgs;
             break;
         default:
             break;
         }
 
-        //ui.video_frame->setScaledContents(false);
+
         if (ui.device_selector->currentIndex() != SCREENGRAB) {
             m_isCapturing = true;
             kDebug() << "Capture: Running ffplay " << m_displayArgs.join(" ");
@@ -469,12 +483,12 @@ void RecMonitor::slotRecord() {
     } else {
         // stop capture
         displayProcess->kill();
-        captureProcess->kill();
-        alsaProcess->kill();
+        //captureProcess->kill();
         QTimer::singleShot(1000, this, SLOT(slotRecord()));
     }
 }
 
+/*
 void RecMonitor::slotStartGrab(const QRect &rect) {
     rgnGrab->deleteLater();
     QApplication::restoreOverrideCursor();
@@ -501,7 +515,7 @@ void RecMonitor::slotStartGrab(const QRect &rect) {
     }
     kDebug() << "Capture: Running ffmpeg " << m_captureArgs.join(" ");
     captureProcess->start("ffmpeg", m_captureArgs);
-}
+}*/
 
 void RecMonitor::slotProcessStatus(QProcess::ProcessState status) {
     if (status == QProcess::NotRunning) {
@@ -524,7 +538,8 @@ void RecMonitor::slotProcessStatus(QProcess::ProcessState status) {
         if (captureProcess && captureProcess->exitStatus() == QProcess::CrashExit) {
             ui.video_frame->setText(i18n("Capture crashed, please check your parameters"));
         } else {
-            ui.video_frame->setText(i18n("Not connected"));
+            if (ui.device_selector->currentIndex() != SCREENGRAB) ui.video_frame->setText(i18n("Not connected"));
+            else ui.video_frame->setPixmap(mergeSideBySide(KIcon("video-display").pixmap(QSize(50, 50)), i18n("Press record button\nto start screen capture\nFiles will be saved in:\n%1", KdenliveSettings::capturefolder())));
         }
         m_isCapturing = false;
     } else {
@@ -552,7 +567,7 @@ void RecMonitor::manageCapturedFiles() {
     filters << "capture*" + extension;
     const QStringList result = dir.entryList(filters, QDir::Files, QDir::Time);
     KUrl::List capturedFiles;
-    foreach(QString name, result) {
+    foreach(const QString &name, result) {
         KUrl url = KUrl(dir.filePath(name));
         if (KIO::NetAccess::exists(url, KIO::NetAccess::SourceSide, this)) {
             KFileItem file(KFileItem::Unknown, KFileItem::Unknown, url, true);
@@ -566,7 +581,7 @@ void RecMonitor::manageCapturedFiles() {
         ManageCapturesDialog *d = new ManageCapturesDialog(capturedFiles, this);
         if (d->exec() == QDialog::Accepted) {
             capturedFiles = d->importFiles();
-            foreach(KUrl url, capturedFiles) {
+            foreach(const KUrl &url, capturedFiles) {
                 emit addProjectClip(url);
             }
         }