X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;ds=sidebyside;f=src%2Frecmonitor.cpp;h=a9bcc382218e132be3ef48c2650cf5dfc2f0efa6;hb=0ff5ac351f12064d919439921af7142215a96ca1;hp=bb49cb426d9eba4e5701b4b4034d51631bc2ab79;hpb=8e2a50b4f83c6c775efa372e536fc066cb79f97b;p=kdenlive diff --git a/src/recmonitor.cpp b/src/recmonitor.cpp index bb49cb42..a9bcc382 100644 --- a/src/recmonitor.cpp +++ b/src/recmonitor.cpp @@ -31,13 +31,15 @@ #include #include #include +#include #include "gentime.h" #include "kdenlivesettings.h" +#include "managecapturesdialog.h" #include "recmonitor.h" RecMonitor::RecMonitor(QString name, QWidget *parent) - : QWidget(parent), m_name(name), m_isActive(false), m_isCapturing(false), m_isPlaying(false) { + : QWidget(parent), m_name(name), m_isActive(false), m_isCapturing(false), m_isPlaying(false), m_didCapture(false) { ui.setupUi(this); ui.video_frame->setAttribute(Qt::WA_PaintOnScreen); @@ -48,7 +50,7 @@ RecMonitor::RecMonitor(QString name, QWidget *parent) QToolBar *toolbar = new QToolBar(name, this); QHBoxLayout *layout = new QHBoxLayout; - + layout->setContentsMargins(0, 0, 0, 0); m_playIcon = KIcon("media-playback-start"); m_pauseIcon = KIcon("media-playback-pause"); @@ -71,6 +73,12 @@ RecMonitor::RecMonitor(QString name, QWidget *parent) connect(m_recAction, SIGNAL(triggered()), this, SLOT(slotRecord())); m_recAction->setCheckable(true); + toolbar->addSeparator(); + + QAction *configAction = toolbar->addAction(KIcon("configure"), i18n("Configure")); + connect(configAction, SIGNAL(triggered()), this, SLOT(slotConfigure())); + configAction->setCheckable(false); + layout->addWidget(toolbar); ui.control_frame_firewire->setLayout(layout); @@ -104,6 +112,10 @@ QString RecMonitor::name() const { return m_name; } +void RecMonitor::slotConfigure() { + emit showConfigDialog(4, ui.device_selector->currentIndex()); +} + void RecMonitor::slotVideoDeviceChanged(int ix) { switch (ix) { case SCREENGRAB: @@ -113,7 +125,8 @@ void RecMonitor::slotVideoDeviceChanged(int ix) { m_recAction->setEnabled(true); m_stopAction->setEnabled(false); m_playAction->setEnabled(false); - ui.video_frame->setText(i18n("Press record button\nto start screen capture")); + 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: m_discAction->setEnabled(false); @@ -131,21 +144,44 @@ void RecMonitor::slotVideoDeviceChanged(int ix) { m_playAction->setEnabled(false); m_rewAction->setEnabled(false); m_fwdAction->setEnabled(false); - ui.video_frame->setText(i18n("Press connect button\nto initialize connection")); + //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()))); break; } } +QPixmap RecMonitor::mergeSideBySide(const QPixmap& pix, const QString txt) { + QPainter p; + QRect r = p.fontMetrics().boundingRect(QRect(0, 0, ui.video_frame->width(), ui.video_frame->height()), Qt::AlignLeft, txt); + int strWidth = r.width(); + int strHeight = r.height(); + int pixWidth = pix.width(); + int pixHeight = pix.height(); + QPixmap res(strWidth + 8 + pixWidth, qMax(strHeight, pixHeight)); + res.fill(Qt::transparent); + p.begin(&res); + p.drawPixmap(0, 0, pix); + p.drawText(QRect(pixWidth + 8, 0, strWidth, strHeight), 0, txt); + p.end(); + return res; +} + + void RecMonitor::checkDeviceAvailability() { if (!KIO::NetAccess::exists(KUrl(KdenliveSettings::video4vdevice()), KIO::NetAccess::SourceSide , this)) { m_playAction->setEnabled(false); m_recAction->setEnabled(false); - ui.video_frame->setText(i18n("Cannot read from device %1\nPlease check drivers and access rights.", KdenliveSettings::video4vdevice())); - } else ui.video_frame->setText(i18n("Press play or record button\nto start video capture")); + ui.video_frame->setPixmap(mergeSideBySide(KIcon("camera-web").pixmap(QSize(50, 50)), i18n("Cannot read from device %1\nPlease check drivers and access rights.", KdenliveSettings::video4vdevice()))); + //ui.video_frame->setText(i18n("Cannot read from device %1\nPlease check drivers and access rights.", KdenliveSettings::video4vdevice())); + } else //ui.video_frame->setText(i18n("Press play or record button\nto start video capture")); + ui.video_frame->setPixmap(mergeSideBySide(KIcon("camera-web").pixmap(QSize(50, 50)), i18n("Press play or record button\nto start video capture\nFiles will be saved in:\n%1", KdenliveSettings::capturefolder()))); } void RecMonitor::slotDisconnect() { if (captureProcess->state() == QProcess::NotRunning) { + m_captureTime = KDateTime::currentLocalDateTime(); + kDebug() << "CURRENT TIME: " << m_captureTime.toString(); + m_didCapture = false; slotStartCapture(false); m_discAction->setIcon(KIcon("network-disconnect")); m_discAction->setText(i18n("Disonnect")); @@ -156,6 +192,9 @@ void RecMonitor::slotDisconnect() { m_fwdAction->setEnabled(true); } else { captureProcess->write("q", 1); + QTimer::singleShot(1000, captureProcess, SLOT(kill())); + if (m_didCapture) manageCapturedFiles(); + m_didCapture = false; } } @@ -250,8 +289,33 @@ void RecMonitor::slotStartCapture(bool play) { switch (ui.device_selector->currentIndex()) { case FIREWIRE: - m_captureArgs << "--format" << "hdv" << "-i" << "capture" << "-"; - m_displayArgs << "-f" << "mpegts" << "-x" << QString::number(ui.video_frame->width()) << "-y" << QString::number(ui.video_frame->height()) << "-"; + 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" << "mpegts"; + break; + } + if (KdenliveSettings::firewireautosplit()) m_captureArgs << "--autosplit"; + if (KdenliveSettings::firewiretimestamp()) m_captureArgs << "--timestamp"; + m_captureArgs << "-i" << "capture" << "-"; + m_displayArgs << "-x" << QString::number(ui.video_frame->width()) << "-y" << QString::number(ui.video_frame->height()) << "-"; + captureProcess->setStandardOutputProcess(displayProcess); captureProcess->setWorkingDirectory(KdenliveSettings::capturefolder()); captureProcess->start("dvgrab", m_captureArgs); @@ -303,6 +367,7 @@ void RecMonitor::slotRecord() { return; } else if (ui.device_selector->currentIndex() == FIREWIRE) { m_isCapturing = true; + m_didCapture = true; captureProcess->write("c\n", 3); return; } @@ -342,10 +407,10 @@ void RecMonitor::slotRecord() { const QRect rect = QApplication::desktop()->screenGeometry(); args = KdenliveSettings::screengrabcapture().replace("%size", QString::number(rect.width()) + "x" + QString::number(rect.height())).replace("%offset", QString()); kDebug() << "// capture params: " << args; - if (KdenliveSettings::screengrabenableaudio()) { - // also capture audio - m_captureArgs << KdenliveSettings::screengrabaudiocapture().simplified().split(' '); - } + if (KdenliveSettings::screengrabenableaudio()) { + // also capture audio + m_captureArgs << KdenliveSettings::screengrabaudiocapture().simplified().split(' '); + } m_captureArgs << args.simplified().split(' ') << KdenliveSettings::screengrabencoding().simplified().split(' ') << m_captureFile.path(); ui.video_frame->setText(i18n("Capturing...")); m_isCapturing = true; @@ -386,8 +451,8 @@ void RecMonitor::slotStartGrab(const QRect &rect) { QString args = KdenliveSettings::screengrabcapture().replace("%size", QString::number(width) + "x" + QString::number(height)).replace("%offset", "+" + QString::number(rect.x()) + "," + QString::number(rect.y())); kDebug() << "// capture params: " << args; if (KdenliveSettings::screengrabenableaudio()) { - // also capture audio - m_captureArgs << KdenliveSettings::screengrabaudiocapture().simplified().split(' '); + // also capture audio + m_captureArgs << KdenliveSettings::screengrabaudiocapture().simplified().split(' '); } m_captureArgs << args.simplified().split(' ') << KdenliveSettings::screengrabencoding().simplified().split(' ') << m_captureFile.path(); m_isCapturing = true; @@ -406,8 +471,8 @@ void RecMonitor::slotProcessStatus(QProcess::ProcessState status) { m_playAction->setEnabled(false); m_rewAction->setEnabled(false); m_fwdAction->setEnabled(false); + m_recAction->setEnabled(false); } - m_isCapturing = false; m_isPlaying = false; m_playAction->setIcon(m_playIcon); m_recAction->setChecked(false); @@ -415,13 +480,57 @@ void RecMonitor::slotProcessStatus(QProcess::ProcessState status) { ui.device_selector->setEnabled(true); 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")); + } else { + ui.video_frame->setText(i18n("Not connected")); + } + m_isCapturing = false; } else { if (ui.device_selector->currentIndex() != SCREENGRAB) m_stopAction->setEnabled(true); ui.device_selector->setEnabled(false); } } +void RecMonitor::manageCapturedFiles() { + QString extension; + switch (KdenliveSettings::firewireformat()) { + case 0: + extension = ".dv"; + break; + case 1: + case 2: + extension = ".avi"; + break; + case 3: + extension = ".m2t"; + break; + } + QDir dir(KdenliveSettings::capturefolder()); + QStringList filters; + filters << "capture*" + extension; + const QStringList result = dir.entryList(filters, QDir::Files, QDir::Time); + KUrl::List capturedFiles; + foreach(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); + if (file.time(KFileItem::ModificationTime) > m_captureTime) capturedFiles.append(url); + } + } + kDebug() << "Found : " << capturedFiles.count() << " new capture files"; + kDebug() << capturedFiles; + + if (capturedFiles.count() > 0) { + ManageCapturesDialog *d = new ManageCapturesDialog(capturedFiles, this); + if (d->exec() == QDialog::Accepted) { + capturedFiles = d->importFiles(); + foreach(KUrl url, capturedFiles) { + emit addProjectClip(url); + } + } + delete d; + } +} + // virtual void RecMonitor::mousePressEvent(QMouseEvent * event) { slotPlay();