X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Frecmonitor.cpp;h=de9f07fa4fade8ec82bc78e8a0b6962b3318f51a;hb=d9b09bd1f1fbd5c1dbbbce217ae89ceb57f090c5;hp=cb117df95ecaba0ca923ee1047db9e35155c2d5a;hpb=543c6a23893c31ada5f20fada1767c02a3536346;p=kdenlive diff --git a/src/recmonitor.cpp b/src/recmonitor.cpp index cb117df9..de9f07fa 100644 --- a/src/recmonitor.cpp +++ b/src/recmonitor.cpp @@ -26,9 +26,10 @@ #include "monitormanager.h" #include "monitor.h" #include "profilesdialog.h" +#include "widgets/videosurface.h" #include -#include +#include #include #include #include @@ -36,6 +37,7 @@ #include #include #include + #include #include #include @@ -44,7 +46,7 @@ #include -RecMonitor::RecMonitor(Kdenlive::MONITORID name, MonitorManager *manager, QWidget *parent) : +RecMonitor::RecMonitor(Kdenlive::MonitorId name, MonitorManager *manager, QWidget *parent) : AbstractMonitor(name, manager, parent), m_isCapturing(false), m_didCapture(false), @@ -57,7 +59,6 @@ RecMonitor::RecMonitor(Kdenlive::MONITORID name, MonitorManager *manager, QWidge //video_frame->setAttribute(Qt::WA_PaintOnScreen); device_selector->setCurrentIndex(KdenliveSettings::defaultcapture()); connect(device_selector, SIGNAL(currentIndexChanged(int)), this, SLOT(slotVideoDeviceChanged(int))); - // Video widget holder QVBoxLayout *l = new QVBoxLayout; l->setContentsMargins(0, 0, 0, 0); @@ -67,8 +68,8 @@ RecMonitor::RecMonitor(Kdenlive::MONITORID name, MonitorManager *manager, QWidge createVideoSurface(); QToolBar *toolbar = new QToolBar(this); - QHBoxLayout *layout = new QHBoxLayout; - layout->setContentsMargins(0, 0, 0, 0); + QHBoxLayout *hlayout = new QHBoxLayout; + hlayout->setContentsMargins(0, 0, 0, 0); m_playIcon = KIcon("media-playback-start"); m_pauseIcon = KIcon("media-playback-pause"); @@ -104,7 +105,6 @@ RecMonitor::RecMonitor(Kdenlive::MONITORID name, MonitorManager *manager, QWidge m_previewSettings = new QAction(i18n("Recording Preview"), this); m_previewSettings->setCheckable(true); - rec_options->setMenu(menu); menu->addAction(m_previewSettings); @@ -114,30 +114,30 @@ RecMonitor::RecMonitor(Kdenlive::MONITORID name, MonitorManager *manager, QWidge connect(configAction, SIGNAL(triggered()), this, SLOT(slotConfigure())); configAction->setCheckable(false); - layout->addWidget(toolbar); - layout->addWidget(&m_logger); - layout->addWidget(&m_dvinfo); + hlayout->addWidget(toolbar); + hlayout->addWidget(&m_logger); + hlayout->addWidget(&m_dvinfo); m_logger.setMaxCount(10); m_logger.setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_logger.setFrame(false); //m_logger.setInsertPolicy(QComboBox::InsertAtTop); - + m_freeSpace = new KCapacityBar(KCapacityBar::DrawTextInline, this); m_freeSpace->setMaximumWidth(150); QFontMetricsF fontMetrics(font()); m_freeSpace->setMaximumHeight(fontMetrics.height() * 1.2); slotUpdateFreeSpace(); - layout->addWidget(m_freeSpace); + hlayout->addWidget(m_freeSpace); connect(&m_spaceTimer, SIGNAL(timeout()), this, SLOT(slotUpdateFreeSpace())); m_spaceTimer.setInterval(30000); m_spaceTimer.setSingleShot(false); - control_frame_firewire->setLayout(layout); + control_frame_firewire->setLayout(hlayout); m_displayProcess = new QProcess; m_captureProcess = new QProcess; connect(m_captureProcess, SIGNAL(stateChanged(QProcess::ProcessState)), this, SLOT(slotProcessStatus(QProcess::ProcessState))); - connect(m_captureProcess, SIGNAL(readyReadStandardError()), this, SLOT(slotReadDvgrabInfo())); + connect(m_captureProcess, SIGNAL(readyReadStandardError()), this, SLOT(slotReadProcessInfo())); QString videoDriver = KdenliveSettings::videodrivername(); #if QT_VERSION >= 0x040600 @@ -165,6 +165,13 @@ RecMonitor::RecMonitor(Kdenlive::MONITORID name, MonitorManager *manager, QWidge setenv("SDL_VIDEO_ALLOW_SCREENSAVER", "1", 1); kDebug() << "/////// BUILDING MONITOR, ID: " << videoSurface->winId(); +#if KDE_IS_VERSION(4,7,0) + m_infoMessage = new KMessageWidget; + QVBoxLayout *s = static_cast (layout()); + s->insertWidget(1, m_infoMessage); + m_infoMessage->hide(); +#endif + slotVideoDeviceChanged(device_selector->currentIndex()); m_previewSettings->setChecked(KdenliveSettings::enable_recording_preview()); connect(m_previewSettings, SIGNAL(triggered(bool)), this, SLOT(slotChangeRecordingPreview(bool))); @@ -175,15 +182,7 @@ RecMonitor::~RecMonitor() m_spaceTimer.stop(); delete m_captureProcess; delete m_displayProcess; - if (m_captureDevice) delete m_captureDevice; -} - -void RecMonitor::mouseDoubleClickEvent(QMouseEvent * event) -{ - if (!KdenliveSettings::openglmonitors() && videoBox && videoBox->isVisible()) { - videoBox->switchFullScreen(); - event->accept(); - } + delete m_captureDevice; } void RecMonitor::slotSwitchFullScreen() @@ -194,7 +193,7 @@ void RecMonitor::slotSwitchFullScreen() void RecMonitor::stop() { // Special case: when recording audio only, do not stop so that we can do voiceover. - if (device_selector->currentIndex() == SCREENGRAB || (device_selector->currentIndex() == VIDEO4LINUX && !rec_video->isChecked())) return; + if (device_selector->currentIndex() == ScreenBag || (device_selector->currentIndex() == Video4Linux && !rec_video->isChecked())) return; slotStopCapture(); } @@ -214,7 +213,7 @@ void RecMonitor::slotUpdateCaptureFolder(const QString ¤tProjectFolder) else m_capturePath = KdenliveSettings::capturefolder(); if (m_captureProcess) m_captureProcess->setWorkingDirectory(m_capturePath); if (m_captureProcess->state() != QProcess::NotRunning) { - if (device_selector->currentIndex() == FIREWIRE) + 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()); @@ -227,14 +226,23 @@ void RecMonitor::slotVideoDeviceChanged(int ix) { QString capturefile; QString capturename; - m_previewSettings->setEnabled(ix == VIDEO4LINUX || ix == BLACKMAGIC); - control_frame->setVisible(ix == VIDEO4LINUX); - m_playAction->setVisible(ix != SCREENGRAB); - m_fwdAction->setVisible(ix == FIREWIRE); - m_discAction->setVisible(ix == FIREWIRE); - m_rewAction->setVisible(ix == FIREWIRE); - m_recAction->setEnabled(ix != FIREWIRE); - m_logger.setVisible(ix == BLACKMAGIC); +#if KDE_IS_VERSION(4,7,0) + if (m_infoMessage->isVisible()) { +#if KDE_IS_VERSION(4,10,0) + m_infoMessage->animatedHide(); +#else + QTimer::singleShot(0, m_infoMessage, SLOT(animatedHide())); +#endif + } +#endif + m_previewSettings->setEnabled(ix == Video4Linux || ix == BlackMagic); + control_frame->setVisible(ix == Video4Linux); + m_playAction->setVisible(ix != ScreenBag); + m_fwdAction->setVisible(ix == Firewire); + m_discAction->setVisible(ix == Firewire); + m_rewAction->setVisible(ix == Firewire); + m_recAction->setEnabled(ix != Firewire); + m_logger.setVisible(ix == BlackMagic); if (m_captureDevice) { // MLT capture still running, abort m_monitorManager->clearScopeSource(); @@ -244,10 +252,10 @@ void RecMonitor::slotVideoDeviceChanged(int ix) } // The m_videoBox container has to be shown once before the MLT consumer is build, or preview will fail - videoBox->setHidden(ix != VIDEO4LINUX && ix != BLACKMAGIC); + videoBox->setHidden(ix != Video4Linux && ix != BlackMagic); videoBox->setHidden(true); switch (ix) { - case SCREENGRAB: + case ScreenBag: m_discAction->setEnabled(false); m_rewAction->setEnabled(false); m_fwdAction->setEnabled(false); @@ -259,18 +267,25 @@ void RecMonitor::slotVideoDeviceChanged(int ix) // Check for libav version exepath = KStandardDirs::findExe("avconv"); } - if (exepath.isEmpty()) video_frame->setPixmap(mergeSideBySide(KIcon("dialog-warning").pixmap(QSize(50, 50)), i18n("ffmpeg or avconv not found,\n please install it for screen grabs"))); + if (exepath.isEmpty()) showWarningMessage(i18n("ffmpeg or avconv not found,\n please install it for screen grabs")); else KdenliveSettings::setFfmpegpath(exepath); } - if (!KdenliveSettings::ffmpegpath().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))); + if (!KdenliveSettings::ffmpegpath().isEmpty()) { + if (!Render::checkX11Grab()) { + // FFmpeg does not support screen grab + showWarningMessage(i18n("Your FFmpeg / Libav installation\n does not support screen grab")); + m_recAction->setEnabled(false); + } + 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))); + } //video_frame->setText(i18n("Press record button\nto start screen capture")); break; - case VIDEO4LINUX: + case Video4Linux: m_stopAction->setEnabled(false); m_playAction->setEnabled(true); checkDeviceAvailability(); break; - case BLACKMAGIC: + case BlackMagic: m_stopAction->setEnabled(false); m_playAction->setEnabled(true); capturefile = m_capturePath; @@ -291,7 +306,9 @@ void RecMonitor::slotVideoDeviceChanged(int ix) // Check that dvgab is available if (KdenliveSettings::dvgrab_path().isEmpty()) { QString dvgrabpath = KStandardDirs::findExe("dvgrab"); - if (dvgrabpath.isEmpty()) video_frame->setPixmap(mergeSideBySide(KIcon("dialog-warning").pixmap(QSize(50, 50)), i18n("dvgrab utility not found,\n please install it for firewire capture"))); + if (dvgrabpath.isEmpty()) { + showWarningMessage(i18n("dvgrab utility not found,\n please install it for firewire capture")); + } else KdenliveSettings::setDvgrab_path(dvgrabpath); } else { // Show capture info @@ -396,19 +413,17 @@ void RecMonitor::slotStopCapture() control_frame->setEnabled(true); slotActivateMonitor(); switch (device_selector->currentIndex()) { - case FIREWIRE: + case Firewire: m_captureProcess->write("\e", 2); m_playAction->setIcon(m_playIcon); m_isPlaying = false; break; - case SCREENGRAB: - m_captureProcess->write("q\n", 3); - m_captureProcess->terminate(); - //video_frame->setText(i18n("Encoding captured video...")); - QTimer::singleShot(1000, m_captureProcess, SLOT(kill())); + case ScreenBag: + m_captureProcess->terminate(); + QTimer::singleShot(1500, m_captureProcess, SLOT(kill())); break; - case VIDEO4LINUX: - case BLACKMAGIC: + case Video4Linux: + case BlackMagic: if (m_captureDevice) { m_captureDevice->stop(); } @@ -434,7 +449,7 @@ void RecMonitor::slotStopCapture() void RecMonitor::slotStartPreview(bool play) { if (m_captureProcess->state() != QProcess::NotRunning) { - if (device_selector->currentIndex() == FIREWIRE) { + if (device_selector->currentIndex() == Firewire) { videoBox->setHidden(false); if (m_isPlaying) { m_captureProcess->write("k", 1); @@ -461,9 +476,9 @@ void RecMonitor::slotStartPreview(bool play) QStringList dvargs = KdenliveSettings::dvgrabextra().simplified().split(' ', QString::SkipEmptyParts); int ix = device_selector->currentIndex(); bool isXml; - videoBox->setHidden(ix != VIDEO4LINUX && ix != BLACKMAGIC && ix != FIREWIRE); + videoBox->setHidden(ix != Video4Linux && ix != BlackMagic && ix != Firewire); switch (ix) { - case FIREWIRE: + case Firewire: switch (KdenliveSettings::firewireformat()) { case 0: // RAW DV CAPTURE @@ -505,7 +520,7 @@ void RecMonitor::slotStartPreview(bool play) if (play) m_captureProcess->write(" ", 1); m_discAction->setEnabled(true); break; - case VIDEO4LINUX: + case Video4Linux: path = KStandardDirs::locateLocal("appdata", "profiles/video4linux"); buildMltDevice(path); profile = ProfilesDialog::getVideoProfile(path); @@ -524,7 +539,7 @@ void RecMonitor::slotStartPreview(bool play) } break; - case BLACKMAGIC: + case BlackMagic: path = KdenliveSettings::current_profile(); slotActivateMonitor(); buildMltDevice(path); @@ -546,7 +561,7 @@ void RecMonitor::slotStartPreview(bool play) control_frame->setEnabled(false); - if (device_selector->currentIndex() == FIREWIRE) { + if (device_selector->currentIndex() == Firewire) { kDebug() << "Capture: Running ffplay " << m_displayArgs.join(" "); m_displayProcess->start(KdenliveSettings::ffplaypath(), m_displayArgs); //video_frame->setText(i18n("Initialising...")); @@ -557,14 +572,15 @@ void RecMonitor::slotStartPreview(bool play) void RecMonitor::slotRecord() { - if (m_captureProcess->state() == QProcess::NotRunning && device_selector->currentIndex() == FIREWIRE) { + m_error.clear(); + if (m_captureProcess->state() == QProcess::NotRunning && device_selector->currentIndex() == Firewire) { slotStartPreview(); } if (m_isCapturing) { // User stopped capture slotStopCapture(); return; - } else if (device_selector->currentIndex() == FIREWIRE) { + } else if (device_selector->currentIndex() == Firewire) { m_isCapturing = true; m_didCapture = true; m_captureProcess->write("c\n", 3); @@ -575,21 +591,21 @@ void RecMonitor::slotRecord() m_logger.clear(); m_recAction->setChecked(true); QString extension = "mpg"; - if (device_selector->currentIndex() == SCREENGRAB) { + if (device_selector->currentIndex() == ScreenBag) { extension = KdenliveSettings::grab_extension(); } - else if (device_selector->currentIndex() == VIDEO4LINUX) { + else if (device_selector->currentIndex() == Video4Linux) { // TODO: when recording audio only, allow configuration? if (!rec_video->isChecked()) extension = "wav"; else extension = KdenliveSettings::v4l_extension(); } - else if (device_selector->currentIndex() == BLACKMAGIC) extension = KdenliveSettings::decklink_extension(); + else if (device_selector->currentIndex() == BlackMagic) extension = KdenliveSettings::decklink_extension(); QString path = KUrl(m_capturePath).path(KUrl::AddTrailingSlash) + "capture0000." + extension; int i = 1; while (QFile::exists(path)) { QString num = QString::number(i).rightJustified(4, '0', false); path = KUrl(m_capturePath).path(KUrl::AddTrailingSlash) + "capture" + num + '.' + extension; - i++; + ++i; } m_captureFile = KUrl(path); @@ -608,7 +624,7 @@ void RecMonitor::slotRecord() if (capturename.isEmpty()) capturename = "capture"; switch (device_selector->currentIndex()) { - case VIDEO4LINUX: + case Video4Linux: if (rec_video->isChecked()) slotActivateMonitor(); path = KStandardDirs::locateLocal("appdata", "profiles/video4linux"); profile = ProfilesDialog::getVideoProfile(path); @@ -671,7 +687,7 @@ void RecMonitor::slotRecord() } break; - case BLACKMAGIC: + case BlackMagic: slotActivateMonitor(); path = KdenliveSettings::current_profile(); profile = ProfilesDialog::getVideoProfile(path); @@ -696,18 +712,18 @@ void RecMonitor::slotRecord() } break; - case SCREENGRAB: + case ScreenBag: m_captureArgs << "-f" << "x11grab"; if (KdenliveSettings::grab_follow_mouse()) m_captureArgs << "-follow_mouse" << "centered"; if (!KdenliveSettings::grab_hide_frame()) m_captureArgs << "-show_region" << "1"; + captureSize = ":0.0"; if (KdenliveSettings::grab_capture_type() == 0) { // Full screen capture - captureSize = ":0.0"; m_captureArgs << "-s" << QString::number(screenSize.width()) + "x" + QString::number(screenSize.height()); } else { // Region capture m_captureArgs << "-s" << QString::number(KdenliveSettings::grab_width()) + "x" + QString::number(KdenliveSettings::grab_height()); - captureSize = ":" + QString::number(KdenliveSettings::grab_offsetx()) + "." + QString::number(KdenliveSettings::grab_offsetx()); + captureSize.append("+" + QString::number(KdenliveSettings::grab_offsetx()) + "." + QString::number(KdenliveSettings::grab_offsetx())); } // fps m_captureArgs << "-r" << QString::number(KdenliveSettings::grab_fps()); @@ -739,6 +755,10 @@ void RecMonitor::slotRecord() } else m_captureArgs << "--no-sound";*/ m_captureProcess->start(KdenliveSettings::ffmpegpath(), m_captureArgs); + if (!m_captureProcess->waitForStarted()) { + // Problem launching capture app + showWarningMessage(i18n("Failed to start the capture application:\n%1", KdenliveSettings::ffmpegpath())); + } //kDebug() << "// Screen grab params: " << m_captureArgs; break; default: @@ -746,7 +766,7 @@ void RecMonitor::slotRecord() } - if (device_selector->currentIndex() == FIREWIRE) { + if (device_selector->currentIndex() == Firewire) { m_isCapturing = true; kDebug() << "Capture: Running ffplay " << m_displayArgs.join(" "); m_displayProcess->start(KdenliveSettings::ffplaypath(), m_displayArgs); @@ -760,7 +780,36 @@ void RecMonitor::slotRecord() } } -const QString RecMonitor::getV4lXmlPlaylist(MltVideoProfile profile, bool *isXml) + +void RecMonitor::showWarningMessage(const QString &text, bool logAction) +{ +#if KDE_IS_VERSION(4,7,0) + m_infoMessage->setText(text); + m_infoMessage->setMessageType(KMessageWidget::Warning); + if (logAction) { + QAction *manualAction = new QAction(i18n("Show log"), this); + connect(manualAction, SIGNAL(triggered()), this, SLOT(slotShowLog())); + m_infoMessage->addAction(manualAction); + } +#if KDE_IS_VERSION(4,10,0) + if (isVisible()) + m_infoMessage->animatedShow(); +#else + QTimer::singleShot(0, m_infoMessage, SLOT(animatedShow())); +#endif +#else + if (!logAction) { + video_frame->setPixmap(mergeSideBySide(KIcon("dialog-warning").pixmap(QSize(50, 50)), text)); + + } + else { + video_frame->setText(QString("" + text + "
" + i18n("Show log") + "")); + connect(video_frame, SIGNAL(linkActivated(QString)), this, SLOT(slotShowLog())); + } +#endif +} + +const QString RecMonitor::getV4lXmlPlaylist(const MltVideoProfile &profile, bool *isXml) { QString playlist; if (rec_video->isChecked() && rec_audio->isChecked()) { @@ -824,12 +873,12 @@ void RecMonitor::slotProcessStatus(QProcess::ProcessState status) { if (status == QProcess::NotRunning) { m_displayProcess->kill(); - if (m_isCapturing && device_selector->currentIndex() != FIREWIRE) + if (m_isCapturing && device_selector->currentIndex() != Firewire) if (m_addCapturedClip->isChecked() && !m_captureFile.isEmpty() && QFile::exists(m_captureFile.path())) { emit addProjectClip(m_captureFile); m_captureFile.clear(); } - if (device_selector->currentIndex() == FIREWIRE) { + if (device_selector->currentIndex() == Firewire) { m_discAction->setIcon(KIcon("network-connect")); m_discAction->setText(i18n("Connect")); m_playAction->setEnabled(false); @@ -846,14 +895,14 @@ void RecMonitor::slotProcessStatus(QProcess::ProcessState status) m_stopAction->setEnabled(false); device_selector->setEnabled(true); if (m_captureProcess && m_captureProcess->exitStatus() == QProcess::CrashExit) { - video_frame->setText(i18n("Capture crashed, please check your parameters")); + showWarningMessage(i18n("Capture crashed, please check your parameters"), true); } else { - if (device_selector->currentIndex() != SCREENGRAB) { + if (device_selector->currentIndex() != ScreenBag) { video_frame->setText(i18n("Not connected")); } else { int code = m_captureProcess->exitCode(); if (code != 0 && code != 255) { - video_frame->setText(i18n("Capture crashed, please check your parameters.\nExit code: %1", QString::number(m_captureProcess->exitCode()))); + showWarningMessage(i18n("Capture crashed, please check your parameters"), true); } 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))); } @@ -914,7 +963,7 @@ void RecMonitor::manageCapturedFiles() kDebug() << "Found : " << capturedFiles.count() << " new capture files"; kDebug() << capturedFiles; - if (capturedFiles.count() > 0) { + if (!capturedFiles.isEmpty()) { QPointer d = new ManageCapturesDialog(capturedFiles, this); if (d->exec() == QDialog::Accepted) { emit addProjectClipList(d->importFiles()); @@ -954,12 +1003,22 @@ void RecMonitor::slotPlay() else slotStartPreview(true);*/ } -void RecMonitor::slotReadDvgrabInfo() +void RecMonitor::slotReadProcessInfo() { QString data = m_captureProcess->readAllStandardError().simplified(); - data = data.section('"', 2, 2).simplified(); - m_dvinfo.setText(data.left(11)); - m_dvinfo.updateGeometry(); + if (device_selector->currentIndex() == ScreenBag) { + m_error.append(data + "\n"); + } + else if (device_selector->currentIndex() == Firewire) { + data = data.section('"', 2, 2).simplified(); + m_dvinfo.setText(data.left(11)); + m_dvinfo.updateGeometry(); + } +} + +void RecMonitor::slotShowLog() +{ + KMessageBox::information(this, m_error); } AbstractRender *RecMonitor::abstractRender()