From c5e042e1e861fa7bec6d56cb61e80477e97569be Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Thu, 3 Jan 2013 19:16:43 +0100 Subject: [PATCH] Display log info when screen capture crashes: http://kdenlive.org/mantis/view.php?id=2643 --- src/recmonitor.cpp | 89 ++++++++++++++---- src/recmonitor.h | 17 +++- src/widgets/recmonitor_ui.ui | 172 ++++++++++++++++++----------------- 3 files changed, 173 insertions(+), 105 deletions(-) diff --git a/src/recmonitor.cpp b/src/recmonitor.cpp index 06dba63e..f2395efb 100644 --- a/src/recmonitor.cpp +++ b/src/recmonitor.cpp @@ -36,6 +36,7 @@ #include #include #include + #include #include #include @@ -57,7 +58,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 +67,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 +104,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 +113,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 +164,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))); @@ -227,6 +233,7 @@ void RecMonitor::slotVideoDeviceChanged(int ix) { QString capturefile; QString capturename; + m_infoMessage->animatedHide(); m_previewSettings->setEnabled(ix == VIDEO4LINUX || ix == BLACKMAGIC); control_frame->setVisible(ix == VIDEO4LINUX); m_playAction->setVisible(ix != SCREENGRAB); @@ -259,13 +266,13 @@ 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()) showMessage(i18n("ffmpeg or avconv not found,\n please install it for screen grabs"), "dialog-warning"); else KdenliveSettings::setFfmpegpath(exepath); } if (!KdenliveSettings::ffmpegpath().isEmpty()) { if (!Render::checkX11Grab()) { // FFmpeg does not support screen grab - video_frame->setPixmap(mergeSideBySide(KIcon("dialog-warning").pixmap(QSize(50, 50)), i18n("Your FFmpeg / Libav installation\n does not support screen grab"))); + showMessage("dialog-warning", 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))); @@ -298,7 +305,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()) { + showMessage(i18n("dvgrab utility not found,\n please install it for firewire capture"), "dialog-warning"); + } else KdenliveSettings::setDvgrab_path(dvgrabpath); } else { // Show capture info @@ -564,6 +573,7 @@ void RecMonitor::slotStartPreview(bool play) void RecMonitor::slotRecord() { + m_error.clear(); if (m_captureProcess->state() == QProcess::NotRunning && device_selector->currentIndex() == FIREWIRE) { slotStartPreview(); } @@ -746,6 +756,10 @@ void RecMonitor::slotRecord() } else m_captureArgs << "--no-sound";*/ m_captureProcess->start(KdenliveSettings::ffmpegpath(), m_captureArgs); + if (!m_captureProcess->waitForStarted()) { + // Problem launching capture app + showMessage(i18n("Failed to start the capture application:\n%1", KdenliveSettings::ffmpegpath()), "dialog-warning"); + } //kDebug() << "// Screen grab params: " << m_captureArgs; break; default: @@ -767,6 +781,30 @@ void RecMonitor::slotRecord() } } + +void RecMonitor::showMessage(const QString &text, const QString &icon, 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); + } + m_infoMessage->animatedShow(); +#else + if (!logAction) { + video_frame->setPixmap(mergeSideBySide(KIcon(icon).pixmap(QSize(50, 50)), text)); + + } + else { + video_frame->setText(QString("" + text + "
" + i18n("Show log") + "")); + connect(video_frame, SIGNAL(linkActivated (const QString &)), this, SLOT(slotShowLog())); + } +#endif +} + const QString RecMonitor::getV4lXmlPlaylist(MltVideoProfile profile, bool *isXml) { QString playlist; @@ -829,6 +867,7 @@ void RecMonitor::slotStartGrab(const QRect &rect) { void RecMonitor::slotProcessStatus(QProcess::ProcessState status) { + kDebug()<<"// STATUS CHANGED: "<kill(); if (m_isCapturing && device_selector->currentIndex() != FIREWIRE) @@ -853,14 +892,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")); + showMessage(i18n("Capture crashed, please check your parameters"), "dialog-warning", true); } else { if (device_selector->currentIndex() != SCREENGRAB) { 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()))); + showMessage(i18n("Capture crashed, please check your parameters"), "dialog-warning", 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))); } @@ -961,12 +1000,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() == SCREENGRAB) { + 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() diff --git a/src/recmonitor.h b/src/recmonitor.h index 16063faf..791f97cf 100644 --- a/src/recmonitor.h +++ b/src/recmonitor.h @@ -43,6 +43,10 @@ #include #include +#if KDE_IS_VERSION(4,7,0) +#include +#endif + class MonitorManager; class MltDeviceCapture; class AbstractRender; @@ -100,7 +104,12 @@ private: VideoContainer *m_videoBox; QAction *m_addCapturedClip; QAction *m_previewSettings; - + QString m_error; + +#if KDE_IS_VERSION(4,7,0) + KMessageWidget *m_infoMessage; +#endif + bool m_analyse; void checkDeviceAvailability(); QPixmap mergeSideBySide(const QPixmap& pix, const QString &txt); @@ -109,6 +118,8 @@ private: void buildMltDevice(const QString &path); /** @brief Create string containing an XML playlist for v4l capture. */ const QString getV4lXmlPlaylist(MltVideoProfile profile, bool *isXml); + /** @brief Display an error message to user. */ + void showMessage(const QString &text, const QString &icon, bool logAction = false); private slots: void slotStartPreview(bool play = true); @@ -120,12 +131,14 @@ private slots: void slotDisconnect(); //void slotStartGrab(const QRect &rect); void slotConfigure(); - void slotReadDvgrabInfo(); + void slotReadProcessInfo(); void slotUpdateFreeSpace(); void slotSetInfoMessage(const QString &message); void slotDroppedFrames(int dropped); /** @brief Change setting for preview while recording. */ void slotChangeRecordingPreview(bool enable); + /** @brief Show last jog error log. */ + void slotShowLog(); public slots: void refreshRecMonitor(bool visible); diff --git a/src/widgets/recmonitor_ui.ui b/src/widgets/recmonitor_ui.ui index d03ec1cc..2a701fa8 100644 --- a/src/widgets/recmonitor_ui.ui +++ b/src/widgets/recmonitor_ui.ui @@ -6,62 +6,34 @@ 0 0 - 298 - 163 + 312 + 204 - + 0 - - - - - Firewire - - - - - FFmpeg - - - - - Screen grab - - - - - Blackmagic card - - - - - + + + + 0 + 0 + + Not connected Qt::AlignCenter - - - - - - Qt::Horizontal + + false - - - 40 - 20 - - - + - + @@ -83,51 +55,85 @@ - - - - ... - - - QToolButton::InstantPopup - - - true - - - - - - - QFrame::NoFrame - - - QFrame::Plain - - - - 0 - - - + + + + + + ... + + + QToolButton::InstantPopup + + + true + + + + + + + QFrame::NoFrame + + + QFrame::Plain + + + + + + Video + + + + + + + Audio + + + + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + + + + + - Video + Firewire - - - - + + - Audio + FFmpeg - - - - rec_video - rec_audio - rec_video - rec_audio - + + + + Screen grab + + + + + Blackmagic card + + + + + -- 2.39.5