+void RecMonitor::slotStopCapture()
+{
+ // stop capture
+ switch (device_selector->currentIndex()) {
+ case FIREWIRE:
+ m_captureProcess->write("\e", 2);
+ m_playAction->setIcon(m_playIcon);
+ m_isPlaying = false;
+ break;
+ case VIDEO4LINUX:
+ case SCREENGRAB:
+ m_captureProcess->write("q\n", 3);
+ QTimer::singleShot(1000, m_captureProcess, SLOT(kill()));
+ break;
+ case HDMI:
+ video_capture->setHidden(true);
+ video_frame->setHidden(false);
+ m_bmCapture->stopPreview();
+ m_playAction->setEnabled(true);
+ m_stopAction->setEnabled(false);
+ m_recAction->setEnabled(false);
+ break;
+ default:
+ break;
+ }
+}
+
+void RecMonitor::slotStartCapture(bool play)
+{
+ if (m_captureProcess->state() != QProcess::NotRunning) {
+ if (device_selector->currentIndex() == FIREWIRE) {
+ if (m_isPlaying) {
+ m_captureProcess->write("k", 1);
+ //captureProcess->write("\e", 2);
+ m_playAction->setIcon(m_playIcon);
+ m_isPlaying = false;
+ } else {
+ m_captureProcess->write("p", 1);
+ m_playAction->setIcon(m_pauseIcon);
+ m_isPlaying = true;
+ }
+ }
+ return;
+ }
+ m_captureArgs.clear();
+ m_displayArgs.clear();
+ m_isPlaying = false;
+ QString capturename = KdenliveSettings::dvgrabfilename();
+ QStringList dvargs = KdenliveSettings::dvgrabextra().simplified().split(" ", QString::SkipEmptyParts);
+
+ switch (device_selector->currentIndex()) {
+ case FIREWIRE:
+ switch (KdenliveSettings::firewireformat()) {
+ case 0:
+ // RAW DV CAPTURE
+ m_captureArgs << "--format" << "raw";
+ m_displayArgs << "-f" << "dv";
+ break;
+ case 1:
+ // DV type 1
+ m_captureArgs << "--format" << "dv1";
+ m_displayArgs << "-f" << "dv";
+ break;
+ case 2:
+ // DV type 2
+ m_captureArgs << "--format" << "dv2";
+ m_displayArgs << "-f" << "dv";
+ break;
+ case 3:
+ // HDV CAPTURE
+ m_captureArgs << "--format" << "hdv";
+ m_displayArgs << "-f" << KdenliveSettings::video4container();
+ break;
+ }
+ if (KdenliveSettings::firewireautosplit()) m_captureArgs << "--autosplit";
+ if (KdenliveSettings::firewiretimestamp()) m_captureArgs << "--timestamp";
+ if (!dvargs.isEmpty()) {
+ m_captureArgs << dvargs;
+ }
+ m_captureArgs << "-i";
+ if (capturename.isEmpty()) capturename = "capture";
+ m_captureArgs << capturename << "-";
+
+ m_displayArgs << "-x" << QString::number(video_frame->width()) << "-y" << QString::number(video_frame->height()) << "-";
+
+ m_captureProcess->setStandardOutputProcess(m_displayProcess);
+ m_captureProcess->setWorkingDirectory(m_capturePath);
+ kDebug() << "Capture: Running dvgrab " << m_captureArgs.join(" ");
+
+ m_captureProcess->start(KdenliveSettings::dvgrab_path(), m_captureArgs);
+ if (play) m_captureProcess->write(" ", 1);
+ m_discAction->setEnabled(true);
+ break;
+ case VIDEO4LINUX:
+ m_captureArgs << KdenliveSettings::video4capture().simplified().split(' ') << KdenliveSettings::video4encoding().simplified().split(' ') << "-f" << KdenliveSettings::video4container() << "-";
+ m_displayArgs << "-f" << KdenliveSettings::video4container() << "-x" << QString::number(video_frame->width()) << "-y" << QString::number(video_frame->height()) << "-";
+ m_captureProcess->setStandardOutputProcess(m_displayProcess);
+ kDebug() << "Capture: Running ffmpeg " << m_captureArgs.join(" ");
+ m_captureProcess->start("ffmpeg", m_captureArgs);
+ break;
+ case HDMI:
+ video_capture->setVisible(true);
+ video_frame->setHidden(true);
+ m_bmCapture->startPreview(KdenliveSettings::hdmi_capturedevice(), KdenliveSettings::hdmi_capturemode());
+ m_playAction->setEnabled(false);
+ m_stopAction->setEnabled(true);
+ m_recAction->setEnabled(true);
+ break;
+ default:
+ break;
+ }
+
+ if (device_selector->currentIndex() == FIREWIRE || device_selector->currentIndex() == VIDEO4LINUX) {
+ kDebug() << "Capture: Running ffplay " << m_displayArgs.join(" ");
+ m_displayProcess->start("ffplay", m_displayArgs);
+ video_frame->setText(i18n("Initialising..."));
+ } else {
+ // do something when starting screen grab
+ }
+}
+
+void RecMonitor::slotRecord()
+{
+ if (device_selector->currentIndex() == HDMI) {
+ if (m_hdmiCapturing) {
+ // We are capturing, stop it
+ m_bmCapture->stopCapture();
+ m_hdmiCapturing = false;
+ }
+ else {
+ // Start capture, get capture filename first
+ QString path = m_capturePath;
+ if (!path.endsWith("/")) path.append("/");
+ path.append(KdenliveSettings::hdmifilename());
+ m_bmCapture->startCapture(path);
+ m_hdmiCapturing = true;
+ }
+ return;
+ }
+
+ if (m_captureProcess->state() == QProcess::NotRunning && device_selector->currentIndex() == FIREWIRE) {
+ slotStartCapture();
+ }
+ if (m_isCapturing) {
+ switch (device_selector->currentIndex()) {
+ case FIREWIRE:
+ m_captureProcess->write("\e", 2);
+ m_playAction->setIcon(m_playIcon);
+ m_isCapturing = false;
+ m_isPlaying = false;
+ m_recAction->setChecked(false);
+ break;
+ case VIDEO4LINUX:
+ m_captureProcess->terminate();
+ slotStopCapture();
+ //m_isCapturing = false;
+ QTimer::singleShot(1000, this, SLOT(slotStartCapture()));
+ break;
+ case SCREENGRAB:
+ //captureProcess->write("q\n", 3);
+ m_captureProcess->terminate();
+ 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()));
+ break;
+ }
+ return;
+ } else if (device_selector->currentIndex() == FIREWIRE) {
+ m_isCapturing = true;
+ m_didCapture = true;
+ m_captureProcess->write("c\n", 3);
+#if KDE_IS_VERSION(4,2,0)
+ m_spaceTimer.start();
+#endif
+ return;
+ }
+ if (m_captureProcess->state() == QProcess::NotRunning) {
+ m_recAction->setChecked(true);
+ QString extension = "mp4";
+ if (device_selector->currentIndex() == SCREENGRAB) extension = "ogv"; //KdenliveSettings::screengrabextension();
+ else if (device_selector->currentIndex() == VIDEO4LINUX) extension = KdenliveSettings::video4extension();
+ QString path = m_capturePath + "/capture0000." + extension;