X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Frecmonitor.cpp;h=51e9b1bf202df2d50989b20e5f2a2ff851bfb0a1;hb=858d442f23c890f2973067d9b49a33da6e674de2;hp=645ab89e29df085bb1e832096e116d7f84b24e0f;hpb=5143c0fd6b774ee8a036427bb1630126270a6364;p=kdenlive diff --git a/src/recmonitor.cpp b/src/recmonitor.cpp index 645ab89e..51e9b1bf 100644 --- a/src/recmonitor.cpp +++ b/src/recmonitor.cpp @@ -45,12 +45,14 @@ RecMonitor::RecMonitor(QString name, QWidget *parent) : - QWidget(parent), - m_name(name), - m_isActive(false), - m_isCapturing(false), - m_didCapture(false), - m_isPlaying(false) + QWidget(parent), + m_name(name), + m_isActive(false), + m_isCapturing(false), + m_didCapture(false), + m_isPlaying(false), + m_bmCapture(NULL), + m_blackmagicCapturing(false) { setupUi(this); @@ -58,9 +60,7 @@ RecMonitor::RecMonitor(QString name, QWidget *parent) : device_selector->setCurrentIndex(KdenliveSettings::defaultcapture()); connect(device_selector, SIGNAL(currentIndexChanged(int)), this, SLOT(slotVideoDeviceChanged(int))); - - - QToolBar *toolbar = new QToolBar(name, this); + QToolBar *toolbar = new QToolBar(this); QHBoxLayout *layout = new QHBoxLayout; layout->setContentsMargins(0, 0, 0, 0); m_playIcon = KIcon("media-playback-start"); @@ -92,8 +92,12 @@ RecMonitor::RecMonitor(QString name, QWidget *parent) : configAction->setCheckable(false); layout->addWidget(toolbar); - + layout->addWidget(&m_logger); layout->addWidget(&m_dvinfo); + m_logger.setMaxCount(10); + m_logger.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + m_logger.setFrame(false); + //m_logger.setInsertPolicy(QComboBox::InsertAtTop); #if KDE_IS_VERSION(4,2,0) m_freeSpace = new KCapacityBar(KCapacityBar::DrawTextInline, this); @@ -132,9 +136,9 @@ RecMonitor::RecMonitor(QString name, QWidget *parent) : if (KdenliveSettings::video4capture().isEmpty()) { QString captureCommand; - if (!KdenliveSettings::video4adevice().isEmpty()) captureCommand = "-f " + KdenliveSettings::video4aformat() + " -i " + KdenliveSettings::video4adevice(); + if (!KdenliveSettings::video4adevice().isEmpty()) captureCommand = "-f " + KdenliveSettings::video4aformat() + " -i " + KdenliveSettings::video4adevice() + " -acodec " + KdenliveSettings::video4acodec(); - captureCommand += " -f " + KdenliveSettings::video4vformat() + " -s " + KdenliveSettings::video4size() + " -r " + QString::number(KdenliveSettings::video4rate()) + " -i " + KdenliveSettings::video4vdevice(); + captureCommand += " -f " + KdenliveSettings::video4vformat() + " -s " + KdenliveSettings::video4size() + " -r " + QString::number(KdenliveSettings::video4rate()) + " -i " + KdenliveSettings::video4vdevice() + " -vcodec " + KdenliveSettings::video4vcodec();; KdenliveSettings::setVideo4capture(captureCommand); } @@ -160,15 +164,16 @@ void RecMonitor::slotConfigure() emit showConfigDialog(4, device_selector->currentIndex()); } -void RecMonitor::slotUpdateCaptureFolder() +void RecMonitor::slotUpdateCaptureFolder(const QString currentProjectFolder) { - if (m_captureProcess) m_captureProcess->setWorkingDirectory(KdenliveSettings::capturefolder()); + if (KdenliveSettings::capturetoprojectfolder()) m_capturePath = currentProjectFolder; + else m_capturePath = KdenliveSettings::capturefolder(); + if (m_captureProcess) m_captureProcess->setWorkingDirectory(m_capturePath); if (m_captureProcess->state() != QProcess::NotRunning) { if (device_selector->currentIndex() == FIREWIRE) KMessageBox::information(this, i18n("You need to disconnect and reconnect in the capture monitor to apply your changes"), i18n("Capturing")); else KMessageBox::information(this, i18n("You need to stop capture before your changes can be applied"), i18n("Capturing")); } else slotVideoDeviceChanged(device_selector->currentIndex()); - kDebug() << "// UPDATE CAPT FOLD: " << KdenliveSettings::capturefolder(); #if KDE_IS_VERSION(4,2,0) // update free space info @@ -178,6 +183,14 @@ void RecMonitor::slotUpdateCaptureFolder() void RecMonitor::slotVideoDeviceChanged(int ix) { + QString capturefile; + QString capturename; + video_capture->setHidden(true); + video_frame->setHidden(false); + m_fwdAction->setVisible(ix != BLACKMAGIC); + m_discAction->setVisible(ix != BLACKMAGIC); + m_rewAction->setVisible(ix != BLACKMAGIC); + m_logger.setVisible(ix == BLACKMAGIC); switch (ix) { case SCREENGRAB: m_discAction->setEnabled(false); @@ -191,7 +204,7 @@ void RecMonitor::slotVideoDeviceChanged(int ix) if (rmdpath.isEmpty()) 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()) 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()) 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", m_capturePath))); //video_frame->setText(i18n("Press record button\nto start screen capture")); break; case VIDEO4LINUX: @@ -203,6 +216,19 @@ void RecMonitor::slotVideoDeviceChanged(int ix) m_playAction->setEnabled(true); checkDeviceAvailability(); break; + case BLACKMAGIC: + createBlackmagicDevice(); + m_recAction->setEnabled(false); + m_stopAction->setEnabled(false); + m_playAction->setEnabled(true); + + capturefile = m_capturePath; + if (!capturefile.endsWith("/")) capturefile.append("/"); + capturename = KdenliveSettings::hdmifilename(); + capturename.append("xxx.raw"); + capturefile.append(capturename); + video_frame->setPixmap(mergeSideBySide(KIcon("camera-photo").pixmap(QSize(50, 50)), i18n("Plug your camcorder and\npress play button\nto start preview.\nFiles will be saved in:\n%1", capturefile))); + break; default: // FIREWIRE m_discAction->setEnabled(true); m_recAction->setEnabled(false); @@ -218,9 +244,9 @@ void RecMonitor::slotVideoDeviceChanged(int ix) else KdenliveSettings::setDvgrab_path(dvgrabpath); } else { // Show capture info - QString capturefile = KdenliveSettings::capturefolder(); + capturefile = m_capturePath; if (!capturefile.endsWith("/")) capturefile.append("/"); - QString capturename = KdenliveSettings::dvgrabfilename(); + capturename = KdenliveSettings::dvgrabfilename(); if (capturename.isEmpty()) capturename = "capture"; QString extension; switch (KdenliveSettings::firewireformat()) { @@ -243,6 +269,28 @@ void RecMonitor::slotVideoDeviceChanged(int ix) } } +void RecMonitor::createBlackmagicDevice() +{ + //video_capture->setVisible(true); + if (m_bmCapture == NULL) { + QVBoxLayout *lay = new QVBoxLayout; + m_bmCapture = new BmdCaptureHandler(lay); + connect(m_bmCapture, SIGNAL(gotTimeCode(ulong)), this, SLOT(slotGotBlackMagicFrameNumber(ulong))); + connect(m_bmCapture, SIGNAL(gotMessage(const QString &)), this, SLOT(slotGotBlackmagicMessage(const QString &))); + video_capture->setLayout(lay); + } +} + +void RecMonitor::slotGotBlackmagicFrameNumber(ulong ix) +{ + m_dvinfo.setText(QString::number(ix)); +} + +void RecMonitor::slotGotBlackmagicMessage(const QString &message) +{ + m_logger.insertItem(0, message); +} + QPixmap RecMonitor::mergeSideBySide(const QPixmap& pix, const QString txt) { QPainter p; @@ -270,7 +318,7 @@ void RecMonitor::checkDeviceAvailability() 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()))); //video_frame->setText(i18n("Cannot read from device %1\nPlease check drivers and access rights.", KdenliveSettings::video4vdevice())); } else //video_frame->setText(i18n("Press play or record button\nto start video capture")); - 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()))); + 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", m_capturePath))); } void RecMonitor::slotDisconnect() @@ -308,6 +356,8 @@ void RecMonitor::slotForward() void RecMonitor::slotStopCapture() { // stop capture + video_capture->setHidden(true); + video_frame->setHidden(false); switch (device_selector->currentIndex()) { case FIREWIRE: m_captureProcess->write("\e", 2); @@ -315,14 +365,16 @@ void RecMonitor::slotStopCapture() m_isPlaying = false; break; case VIDEO4LINUX: - m_captureProcess->write("q\n", 3); - QTimer::singleShot(1000, m_captureProcess, SLOT(kill())); - - break; case SCREENGRAB: m_captureProcess->write("q\n", 3); QTimer::singleShot(1000, m_captureProcess, SLOT(kill())); break; + case BLACKMAGIC: + m_bmCapture->stopPreview(); + m_playAction->setEnabled(true); + m_stopAction->setEnabled(false); + m_recAction->setEnabled(false); + break; default: break; } @@ -350,6 +402,8 @@ void RecMonitor::slotStartCapture(bool play) m_isPlaying = false; QString capturename = KdenliveSettings::dvgrabfilename(); QStringList dvargs = KdenliveSettings::dvgrabextra().simplified().split(" ", QString::SkipEmptyParts); + video_capture->setVisible(device_selector->currentIndex() == BLACKMAGIC); + video_frame->setHidden(device_selector->currentIndex() == BLACKMAGIC); switch (device_selector->currentIndex()) { case FIREWIRE: @@ -387,7 +441,7 @@ void RecMonitor::slotStartCapture(bool play) m_displayArgs << "-x" << QString::number(video_frame->width()) << "-y" << QString::number(video_frame->height()) << "-"; m_captureProcess->setStandardOutputProcess(m_displayProcess); - m_captureProcess->setWorkingDirectory(KdenliveSettings::capturefolder()); + m_captureProcess->setWorkingDirectory(m_capturePath); kDebug() << "Capture: Running dvgrab " << m_captureArgs.join(" "); m_captureProcess->start(KdenliveSettings::dvgrab_path(), m_captureArgs); @@ -395,17 +449,23 @@ void RecMonitor::slotStartCapture(bool play) m_discAction->setEnabled(true); break; case VIDEO4LINUX: - m_captureArgs << KdenliveSettings::video4capture().simplified().split(' ') << KdenliveSettings::video4encoding().simplified().split(' ') << "-f" << "mpegts" << "-vcodec" << "mpeg4" << "-acodec" << "mp2" << "-"; - m_displayArgs << "-f" << "mpegts" << "-x" << QString::number(video_frame->width()) << "-y" << QString::number(video_frame->height()) << "-"; + 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 BLACKMAGIC: + 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() != SCREENGRAB) { + 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...")); @@ -416,6 +476,22 @@ void RecMonitor::slotStartCapture(bool play) void RecMonitor::slotRecord() { + if (device_selector->currentIndex() == BLACKMAGIC) { + if (m_blackmagicCapturing) { + // We are capturing, stop it + m_bmCapture->stopCapture(); + m_blackmagicCapturing = 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_blackmagicCapturing = true; + } + return; + } + if (m_captureProcess->state() == QProcess::NotRunning && device_selector->currentIndex() == FIREWIRE) { slotStartCapture(); } @@ -456,11 +532,12 @@ void RecMonitor::slotRecord() m_recAction->setChecked(true); QString extension = "mp4"; if (device_selector->currentIndex() == SCREENGRAB) extension = "ogv"; //KdenliveSettings::screengrabextension(); - QString path = KdenliveSettings::capturefolder() + "/capture0000." + extension; + else if (device_selector->currentIndex() == VIDEO4LINUX) extension = KdenliveSettings::video4extension(); + QString path = m_capturePath + "/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 = m_capturePath + "/capture" + num + '.' + extension; i++; } m_captureFile = KUrl(path); @@ -473,8 +550,8 @@ void RecMonitor::slotRecord() switch (device_selector->currentIndex()) { case VIDEO4LINUX: - 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(video_frame->width()) << "-y" << QString::number(video_frame->height()) << "-"; + m_captureArgs << KdenliveSettings::video4capture().simplified().split(' ') << KdenliveSettings::video4encoding().simplified().split(' ') << "-y" << m_captureFile.path() << "-f" << KdenliveSettings::video4container() << "-acodec" << KdenliveSettings::video4acodec() << "-vcodec" << KdenliveSettings::video4vcodec() << "-"; + 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); @@ -594,8 +671,15 @@ void RecMonitor::slotProcessStatus(QProcess::ProcessState status) if (m_captureProcess && m_captureProcess->exitStatus() == QProcess::CrashExit) { video_frame->setText(i18n("Capture crashed, please check your parameters")); } else { - if (device_selector->currentIndex() != SCREENGRAB) video_frame->setText(i18n("Not connected")); - else 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 (device_selector->currentIndex() != SCREENGRAB) { + video_frame->setText(i18n("Not connected")); + } else { + if (m_captureProcess->exitCode() != 0) { + video_frame->setText(i18n("Capture crashed, please check your parameters\nRecordMyDesktop exit code: %1", QString::number(m_captureProcess->exitCode()))); + } else { + 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", m_capturePath))); + } + } } m_isCapturing = false; @@ -626,14 +710,14 @@ void RecMonitor::manageCapturedFiles() extension = ".m2t"; break; } - QDir dir(KdenliveSettings::capturefolder()); + QDir dir(m_capturePath); QStringList filters; QString capturename = KdenliveSettings::dvgrabfilename(); if (capturename.isEmpty()) capturename = "capture"; filters << capturename + "*" + extension; const QStringList result = dir.entryList(filters, QDir::Files, QDir::Time); KUrl::List capturedFiles; - foreach(const 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); @@ -647,7 +731,7 @@ void RecMonitor::manageCapturedFiles() ManageCapturesDialog *d = new ManageCapturesDialog(capturedFiles, this); if (d->exec() == QDialog::Accepted) { capturedFiles = d->importFiles(); - foreach(const KUrl &url, capturedFiles) { + foreach(const KUrl & url, capturedFiles) { emit addProjectClip(url); } } @@ -666,7 +750,7 @@ void RecMonitor::mousePressEvent(QMouseEvent * /*event*/) void RecMonitor::slotUpdateFreeSpace() { #if KDE_IS_VERSION(4,2,0) - KDiskFreeSpaceInfo info = KDiskFreeSpaceInfo::freeSpaceInfo(KdenliveSettings::capturefolder()); + KDiskFreeSpaceInfo info = KDiskFreeSpaceInfo::freeSpaceInfo(m_capturePath); if (info.isValid()) { m_freeSpace->setValue(100 * info.used() / info.size()); m_freeSpace->setText(i18n("Free space: %1", KIO::convertSize(info.available())));