X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Frecmonitor.cpp;h=e66a8f1572378476d6ca443285c4a25a2ef7b8ca;hb=c24658bd34221d735f0641c924b890e1a6be7101;hp=5e88caefc47f4ffbae0b397fcfbce78e2106c771;hpb=64130d72269ad9ae67606ed40abfa2be9b4d22da;p=kdenlive diff --git a/src/recmonitor.cpp b/src/recmonitor.cpp index 5e88caef..e66a8f15 100644 --- a/src/recmonitor.cpp +++ b/src/recmonitor.cpp @@ -28,7 +28,7 @@ #include "profilesdialog.h" #include -#include +#include #include #include #include @@ -36,42 +36,39 @@ #include #include #include + #include #include #include #include #include +#include -RecMonitor::RecMonitor(QString name, MonitorManager *manager, QWidget *parent) : - AbstractMonitor(parent), - m_name(name), +RecMonitor::RecMonitor(Kdenlive::MonitorId name, MonitorManager *manager, QWidget *parent) : + AbstractMonitor(name, manager, parent), m_isCapturing(false), m_didCapture(false), m_isPlaying(false), - m_manager(manager), m_captureDevice(NULL), m_analyse(false) { setupUi(this); - video_frame->setAttribute(Qt::WA_PaintOnScreen); + //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); l->setSpacing(0); - m_videoBox = new VideoPreviewContainer(); - m_videoBox->setContentsMargins(0, 0, 0, 0); - m_videoBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred); - l->addWidget(m_videoBox); + l->addWidget(videoBox, 10); video_frame->setLayout(l); + 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"); @@ -107,7 +104,6 @@ RecMonitor::RecMonitor(QString name, MonitorManager *manager, QWidget *parent) : m_previewSettings = new QAction(i18n("Recording Preview"), this); m_previewSettings->setCheckable(true); - rec_options->setMenu(menu); menu->addAction(m_previewSettings); @@ -117,36 +113,35 @@ RecMonitor::RecMonitor(QString name, MonitorManager *manager, QWidget *parent) : 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 QProcessEnvironment env = QProcessEnvironment::systemEnvironment(); - env.insert("SDL_WINDOWID", QString::number(video_frame->winId())); + env.insert("SDL_WINDOWID", QString::number(videoSurface->winId())); if (!videoDriver.isEmpty()) { if (videoDriver == "x11_noaccel") { env.insert("SDL_VIDEO_YUV_HWACCEL", "0"); @@ -156,7 +151,7 @@ RecMonitor::RecMonitor(QString name, MonitorManager *manager, QWidget *parent) : m_displayProcess->setProcessEnvironment(env); #else QStringList env = QProcess::systemEnvironment(); - env << "SDL_WINDOWID=" + QString::number(video_frame->winId()); + env << "SDL_WINDOWID=" + QString::number(videoSurface->winId()); if (!videoDriver.isEmpty()) { if (videoDriver == "x11_noaccel") { env << "SDL_VIDEO_YUV_HWACCEL=0"; @@ -165,9 +160,17 @@ RecMonitor::RecMonitor(QString name, MonitorManager *manager, QWidget *parent) : } m_displayProcess->setEnvironment(env); #endif + setenv("SDL_VIDEO_ALLOW_SCREENSAVER", "1", 1); - kDebug() << "/////// BUILDING MONITOR, ID: " << video_frame->winId(); + 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))); @@ -178,21 +181,32 @@ RecMonitor::~RecMonitor() m_spaceTimer.stop(); delete m_captureProcess; delete m_displayProcess; - if (m_captureDevice) delete m_captureDevice; + delete m_captureDevice; +} + +void RecMonitor::mouseDoubleClickEvent(QMouseEvent * event) +{ + if (!KdenliveSettings::openglmonitors() && videoBox && videoBox->isVisible()) { + videoBox->switchFullScreen(); + event->accept(); + } } -const QString RecMonitor::name() const +void RecMonitor::slotSwitchFullScreen() { - return m_name; + videoBox->switchFullScreen(); } 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; slotStopCapture(); } void RecMonitor::start() { + //slotStartPreview(true); } void RecMonitor::slotConfigure() @@ -219,9 +233,18 @@ void RecMonitor::slotVideoDeviceChanged(int ix) { QString capturefile; QString capturename; +#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); - rec_audio->setVisible(ix == VIDEO4LINUX); - rec_video->setVisible(ix == VIDEO4LINUX); + 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); @@ -229,15 +252,15 @@ void RecMonitor::slotVideoDeviceChanged(int ix) m_logger.setVisible(ix == BLACKMAGIC); if (m_captureDevice) { // MLT capture still running, abort + m_monitorManager->clearScopeSource(); m_captureDevice->stop(); delete m_captureDevice; m_captureDevice = NULL; - m_manager->clearScopeSource(); } // The m_videoBox container has to be shown once before the MLT consumer is build, or preview will fail - m_videoBox->setHidden(ix != VIDEO4LINUX && ix != BLACKMAGIC); - m_videoBox->setHidden(true); + videoBox->setHidden(ix != VIDEO4LINUX && ix != BLACKMAGIC); + videoBox->setHidden(true); switch (ix) { case SCREENGRAB: m_discAction->setEnabled(false); @@ -245,12 +268,23 @@ void RecMonitor::slotVideoDeviceChanged(int ix) m_fwdAction->setEnabled(false); m_stopAction->setEnabled(false); m_playAction->setEnabled(false); - if (KdenliveSettings::rmd_path().isEmpty()) { - QString rmdpath = KStandardDirs::findExe("recordmydesktop"); - 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", m_capturePath))); + if (KdenliveSettings::ffmpegpath().isEmpty()) { + QString exepath = KStandardDirs::findExe("ffmpeg"); + if (exepath.isEmpty()) { + // Check for libav version + exepath = KStandardDirs::findExe("avconv"); + } + 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()) { + 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: @@ -262,7 +296,7 @@ void RecMonitor::slotVideoDeviceChanged(int ix) m_stopAction->setEnabled(false); m_playAction->setEnabled(true); capturefile = m_capturePath; - if (!capturefile.endsWith("/")) capturefile.append("/"); + if (!capturefile.endsWith('/')) capturefile.append('/'); capturename = KdenliveSettings::decklink_filename(); capturename.append("xxx."); capturename.append(KdenliveSettings::decklink_extension()); @@ -279,12 +313,14 @@ 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 capturefile = m_capturePath; - if (!capturefile.endsWith("/")) capturefile.append("/"); + if (!capturefile.endsWith('/')) capturefile.append('/'); capturename = KdenliveSettings::dvgrabfilename(); if (capturename.isEmpty()) capturename = "capture"; QString extension; @@ -335,10 +371,11 @@ QPixmap RecMonitor::mergeSideBySide(const QPixmap& pix, const QString &txt) void RecMonitor::checkDeviceAvailability() { if (!KIO::NetAccess::exists(KUrl(KdenliveSettings::video4vdevice()), KIO::NetAccess::SourceSide , this)) { - m_playAction->setEnabled(false); - m_recAction->setEnabled(false); + rec_video->setChecked(false); + rec_video->setEnabled(false); 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()))); } else { + rec_video->setEnabled(true); 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))); } } @@ -347,7 +384,7 @@ void RecMonitor::slotDisconnect() { if (m_captureProcess->state() == QProcess::NotRunning) { m_captureTime = KDateTime::currentLocalDateTime(); - kDebug() << "CURRENT TIME: " << m_captureTime.toString(); + kDebug() << "CURRENT TIME: " << m_captureTime.toString(); m_didCapture = false; slotStartPreview(false); m_discAction->setIcon(KIcon("network-disconnect")); @@ -379,9 +416,9 @@ void RecMonitor::slotStopCapture() { // stop capture if (!m_isCapturing && !m_isPlaying) return; - m_videoBox->setHidden(true); - rec_audio->setEnabled(true); - rec_video->setEnabled(true); + videoBox->setHidden(true); + control_frame->setEnabled(true); + slotActivateMonitor(); switch (device_selector->currentIndex()) { case FIREWIRE: m_captureProcess->write("\e", 2); @@ -389,10 +426,8 @@ void RecMonitor::slotStopCapture() 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())); + m_captureProcess->terminate(); + QTimer::singleShot(1500, m_captureProcess, SLOT(kill())); break; case VIDEO4LINUX: case BLACKMAGIC: @@ -422,6 +457,7 @@ void RecMonitor::slotStartPreview(bool play) { if (m_captureProcess->state() != QProcess::NotRunning) { if (device_selector->currentIndex() == FIREWIRE) { + videoBox->setHidden(false); if (m_isPlaying) { m_captureProcess->write("k", 1); //captureProcess->write("\e", 2); @@ -435,6 +471,8 @@ void RecMonitor::slotStartPreview(bool play) } return; } + slotActivateMonitor(); + if (m_isPlaying) return; m_captureArgs.clear(); m_displayArgs.clear(); m_isPlaying = false; @@ -442,9 +480,10 @@ void RecMonitor::slotStartPreview(bool play) QString path; MltVideoProfile profile; QString producer; - QStringList dvargs = KdenliveSettings::dvgrabextra().simplified().split(" ", QString::SkipEmptyParts); + QStringList dvargs = KdenliveSettings::dvgrabextra().simplified().split(' ', QString::SkipEmptyParts); int ix = device_selector->currentIndex(); - m_videoBox->setHidden(ix != VIDEO4LINUX && ix != BLACKMAGIC); + bool isXml; + videoBox->setHidden(ix != VIDEO4LINUX && ix != BLACKMAGIC && ix != FIREWIRE); switch (ix) { case FIREWIRE: switch (KdenliveSettings::firewireformat()) { @@ -478,7 +517,7 @@ void RecMonitor::slotStartPreview(bool play) if (capturename.isEmpty()) capturename = "capture"; m_captureArgs << capturename << "-"; - m_displayArgs << "-x" << QString::number(video_frame->width()) << "-y" << QString::number(video_frame->height()) << "-"; + m_displayArgs << "-x" << QString::number(video_frame->width()) << "-y" << QString::number(video_frame->height()) << "-noframedrop" << "-"; m_captureProcess->setStandardOutputProcess(m_displayProcess); m_captureProcess->setWorkingDirectory(m_capturePath); @@ -490,16 +529,15 @@ void RecMonitor::slotStartPreview(bool play) break; case VIDEO4LINUX: path = KStandardDirs::locateLocal("appdata", "profiles/video4linux"); - m_manager->activateMonitor(Kdenlive::recordMonitor); buildMltDevice(path); profile = ProfilesDialog::getVideoProfile(path); - producer = getV4lXmlPlaylist(profile); + producer = getV4lXmlPlaylist(profile, &isXml); //producer = QString("avformat-novalidate:video4linux2:%1?width:%2&height:%3&frame_rate:%4").arg(KdenliveSettings::video4vdevice()).arg(profile.width).arg(profile.height).arg((double) profile.frame_rate_num / profile.frame_rate_den); - if (!m_captureDevice->slotStartPreview(producer, true)) { + if (!m_captureDevice->slotStartPreview(producer, isXml)) { // v4l capture failed to start video_frame->setText(i18n("Failed to start Video4Linux,\ncheck your parameters...")); - m_videoBox->setHidden(true); + videoBox->setHidden(true); } else { m_playAction->setEnabled(false); @@ -510,13 +548,13 @@ void RecMonitor::slotStartPreview(bool play) break; case BLACKMAGIC: path = KdenliveSettings::current_profile(); - m_manager->activateMonitor(Kdenlive::recordMonitor); + slotActivateMonitor(); buildMltDevice(path); producer = QString("decklink:%1").arg(KdenliveSettings::decklink_capturedevice()); if (!m_captureDevice->slotStartPreview(producer)) { // v4l capture failed to start video_frame->setText(i18n("Failed to start Decklink,\ncheck your parameters...")); - m_videoBox->setHidden(true); + videoBox->setHidden(true); } else { m_playAction->setEnabled(false); @@ -528,13 +566,12 @@ void RecMonitor::slotStartPreview(bool play) break; } - rec_audio->setEnabled(false); - rec_video->setEnabled(false); + control_frame->setEnabled(false); if (device_selector->currentIndex() == FIREWIRE) { kDebug() << "Capture: Running ffplay " << m_displayArgs.join(" "); - m_displayProcess->start("ffplay", m_displayArgs); - video_frame->setText(i18n("Initialising...")); + m_displayProcess->start(KdenliveSettings::ffplaypath(), m_displayArgs); + //video_frame->setText(i18n("Initialising...")); } else { // do something when starting screen grab } @@ -542,9 +579,7 @@ void RecMonitor::slotStartPreview(bool play) void RecMonitor::slotRecord() { - rec_audio->setEnabled(false); - rec_video->setEnabled(false); - + m_error.clear(); if (m_captureProcess->state() == QProcess::NotRunning && device_selector->currentIndex() == FIREWIRE) { slotStartPreview(); } @@ -563,7 +598,9 @@ void RecMonitor::slotRecord() m_logger.clear(); m_recAction->setChecked(true); QString extension = "mpg"; - if (device_selector->currentIndex() == SCREENGRAB) extension = "ogv"; //KdenliveSettings::screengrabextension(); + if (device_selector->currentIndex() == SCREENGRAB) { + extension = KdenliveSettings::grab_extension(); + } else if (device_selector->currentIndex() == VIDEO4LINUX) { // TODO: when recording audio only, allow configuration? if (!rec_video->isChecked()) extension = "wav"; @@ -575,7 +612,7 @@ void RecMonitor::slotRecord() 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); @@ -584,19 +621,23 @@ void RecMonitor::slotRecord() QString args; QString playlist; QString v4lparameters; + QStringList grabParameters; MltVideoProfile profile; bool showPreview; + bool isXml; + QString captureSize; + QRect screenSize = QApplication::desktop()->screenGeometry(); QString capturename = KdenliveSettings::dvgrabfilename(); if (capturename.isEmpty()) capturename = "capture"; switch (device_selector->currentIndex()) { case VIDEO4LINUX: - m_manager->activateMonitor(Kdenlive::recordMonitor); + if (rec_video->isChecked()) slotActivateMonitor(); path = KStandardDirs::locateLocal("appdata", "profiles/video4linux"); profile = ProfilesDialog::getVideoProfile(path); - m_videoBox->setRatio((double) profile.display_aspect_num / profile.display_aspect_den); + //m_videoBox->setRatio((double) profile.display_aspect_num / profile.display_aspect_den); buildMltDevice(path); - playlist = getV4lXmlPlaylist(profile); + playlist = getV4lXmlPlaylist(profile, &isXml); v4lparameters = KdenliveSettings::v4l_parameters(); @@ -635,31 +676,35 @@ void RecMonitor::slotRecord() showPreview = m_previewSettings->isChecked(); if (!rec_video->isChecked()) showPreview = false; - if (m_captureDevice->slotStartCapture(v4lparameters, m_captureFile.path(), playlist, showPreview)) { - m_videoBox->setHidden(false); + if (m_captureDevice->slotStartCapture(v4lparameters, m_captureFile.path(), playlist, showPreview, isXml)) { + videoBox->setHidden(false); m_isCapturing = true; m_recAction->setEnabled(false); m_stopAction->setEnabled(true); m_previewSettings->setEnabled(false); + control_frame->setEnabled(false); } else { video_frame->setText(i18n("Failed to start Video4Linux,\ncheck your parameters...")); - m_videoBox->setHidden(true); + videoBox->setHidden(true); + m_recAction->blockSignals(true); + m_recAction->setChecked(false); + m_recAction->blockSignals(false); m_isCapturing = false; } break; case BLACKMAGIC: - m_manager->activateMonitor(Kdenlive::recordMonitor); + slotActivateMonitor(); path = KdenliveSettings::current_profile(); profile = ProfilesDialog::getVideoProfile(path); - m_videoBox->setRatio((double) profile.display_aspect_num / profile.display_aspect_den); + //m_videoBox->setRatio((double) profile.display_aspect_num / profile.display_aspect_den); buildMltDevice(path); playlist = QString("producer100000pause%1decklink").arg(KdenliveSettings::decklink_capturedevice()); if (m_captureDevice->slotStartCapture(KdenliveSettings::decklink_parameters(), m_captureFile.path(), QString("decklink:%1").arg(KdenliveSettings::decklink_capturedevice()), m_previewSettings->isChecked(), false)) { - m_videoBox->setHidden(false); + videoBox->setHidden(false); m_isCapturing = true; slotSetInfoMessage(i18n("Capturing to %1", m_captureFile.fileName())); m_recAction->setEnabled(false); @@ -669,35 +714,40 @@ void RecMonitor::slotRecord() else { video_frame->setText(i18n("Failed to start Decklink,\ncheck your parameters...")); slotSetInfoMessage(i18n("Failed to start capture")); - m_videoBox->setHidden(true); + videoBox->setHidden(true); m_isCapturing = false; } break; case SCREENGRAB: - switch (KdenliveSettings::rmd_capture_type()) { - case 0: - // Full screen capture, nothing special to do - break; - default: + 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 + m_captureArgs << "-s" << QString::number(screenSize.width()) + "x" + QString::number(screenSize.height()); + } else { // Region capture - m_captureArgs << "--width" << QString::number(KdenliveSettings::rmd_width()) << "--height" << QString::number(KdenliveSettings::rmd_height()); - if (!KdenliveSettings::rmd_follow_mouse()) { - m_captureArgs << "-x" << QString::number(KdenliveSettings::rmd_offsetx()) << "-y" << QString::number(KdenliveSettings::rmd_offsety()); - } else { - m_captureArgs << "--follow-mouse"; - if (KdenliveSettings::rmd_hide_frame()) m_captureArgs << "--no-frame"; - } - break; + m_captureArgs << "-s" << QString::number(KdenliveSettings::grab_width()) + "x" + QString::number(KdenliveSettings::grab_height()); + captureSize.append("+" + QString::number(KdenliveSettings::grab_offsetx()) + "." + QString::number(KdenliveSettings::grab_offsetx())); } - if (KdenliveSettings::rmd_hide_mouse()) m_captureArgs << "--no-cursor"; + // fps + m_captureArgs << "-r" << QString::number(KdenliveSettings::grab_fps()); + if (KdenliveSettings::grab_hide_mouse()) captureSize.append("+nomouse"); + m_captureArgs << "-i" << captureSize; + grabParameters = KdenliveSettings::grab_parameters().simplified().split(" "); + m_captureArgs << grabParameters; + m_captureArgs << path; + m_isCapturing = true; - if (KdenliveSettings::rmd_capture_audio()) { + m_recAction->setEnabled(false); + /*if (KdenliveSettings::rmd_capture_audio()) { m_captureArgs << "--freq" << KdenliveSettings::rmd_freq(); m_captureArgs << "--channels" << QString::number(KdenliveSettings::rmd_audio_channels()); if (KdenliveSettings::rmd_use_jack()) { m_captureArgs << "--use-jack"; - QStringList ports = KdenliveSettings::rmd_jackports().split(" ", QString::SkipEmptyParts); + QStringList ports = KdenliveSettings::rmd_jackports().split(' ', QString::SkipEmptyParts); for (int i = 0; i < ports.count(); ++i) { m_captureArgs << ports.at(i); } @@ -709,15 +759,14 @@ void RecMonitor::slotRecord() if (KdenliveSettings::rmd_alsa_buffer() > 0) m_captureArgs << "--buffer-size" << QString::number(KdenliveSettings::rmd_alsa_buffer()); } - } else m_captureArgs << "--no-sound"; - - if (KdenliveSettings::rmd_fullshots()) m_captureArgs << "--full-shots"; - m_captureArgs << "--v_bitrate" << QString::number(KdenliveSettings::rmd_bitrate()); - m_captureArgs << "--v_quality" << QString::number(KdenliveSettings::rmd_quality()); - m_captureArgs << "--workdir" << KdenliveSettings::currenttmpfolder(); - m_captureArgs << "--fps" << QString::number(KdenliveSettings::rmd_fps()) << "-o" << m_captureFile.path(); - m_captureProcess->start(KdenliveSettings::rmd_path(), m_captureArgs); - kDebug() << "// RecordMyDesktop params: " << m_captureArgs; + } 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: break; @@ -727,7 +776,7 @@ void RecMonitor::slotRecord() if (device_selector->currentIndex() == FIREWIRE) { m_isCapturing = true; kDebug() << "Capture: Running ffplay " << m_displayArgs.join(" "); - m_displayProcess->start("ffplay", m_displayArgs); + m_displayProcess->start(KdenliveSettings::ffplaypath(), m_displayArgs); video_frame->setText(i18n("Initialising...")); } } else { @@ -738,22 +787,63 @@ void RecMonitor::slotRecord() } } -const QString RecMonitor::getV4lXmlPlaylist(MltVideoProfile profile) { - QString playlist = QString("").arg(profile.width).arg(profile.height).arg(profile.progressive).arg(profile.sample_aspect_num).arg(profile.sample_aspect_den).arg(profile.display_aspect_num).arg(profile.display_aspect_den).arg(profile.frame_rate_num).arg(profile.frame_rate_den).arg(profile.colorspace); +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()) { + // We want to capture audio and video, use xml playlist + *isXml = true; + playlist = QString("").arg(profile.width).arg(profile.height).arg(profile.progressive).arg(profile.sample_aspect_num).arg(profile.sample_aspect_den).arg(profile.display_aspect_num).arg(profile.display_aspect_den).arg(profile.frame_rate_num).arg(profile.frame_rate_den).arg(profile.colorspace); - if (rec_video->isChecked()) { playlist.append(QString("producer1000000loopvideo4linux2:%1?width:%2&height:%3&frame_rate:%4avformat-novalidate").arg(KdenliveSettings::video4vdevice()).arg(profile.width).arg(profile.height).arg((double) profile.frame_rate_num / profile.frame_rate_den)); - } + + playlist.append(QString("producer1000000alsa:%1?channels=%20-1avformat-novalidate").arg(KdenliveSettings::v4l_alsadevicename()).arg(KdenliveSettings::alsachannels())); - if (rec_audio->isChecked()) { - playlist.append(QString("producer1000000loopalsa:%50-1avformat-novalidate").arg(KdenliveSettings::v4l_alsadevicename())); + playlist.append(""); + playlist.append(""); + playlist.append(""); } - playlist.append(""); - if (rec_video->isChecked()) playlist.append(""); - if (rec_audio->isChecked()) playlist.append(""); - playlist.append("
"); - + else if (rec_audio->isChecked()) { + // Audio only recording + *isXml = false; + playlist =QString("alsa:%1?channels=%2").arg(KdenliveSettings::v4l_alsadevicename()).arg(KdenliveSettings::alsachannels()); + } + else { + // Video only recording + *isXml = false; + playlist =QString("video4linux2:%1?width:%2&height:%3&frame_rate:%4").arg(KdenliveSettings::video4vdevice()).arg(profile.width).arg(profile.height).arg((double) profile.frame_rate_num / profile.frame_rate_den); + + } + return playlist; } @@ -783,7 +873,7 @@ void RecMonitor::slotStartGrab(const QRect &rect) { alsaProcess->start("arecord", alsaArgs); } kDebug() << "Capture: Running ffmpeg " << m_captureArgs.join(" "); - captureProcess->start("ffmpeg", m_captureArgs); + captureProcess->start(KdenliveSettings::ffmpegpath(), m_captureArgs); }*/ void RecMonitor::slotProcessStatus(QProcess::ProcessState status) @@ -803,19 +893,23 @@ void RecMonitor::slotProcessStatus(QProcess::ProcessState status) m_fwdAction->setEnabled(false); m_recAction->setEnabled(false); } + else { + m_recAction->setEnabled(true); + } m_isPlaying = false; m_playAction->setIcon(m_playIcon); m_recAction->setChecked(false); 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) { 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()))); + int code = m_captureProcess->exitCode(); + if (code != 0 && code != 255) { + 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))); } @@ -827,7 +921,7 @@ void RecMonitor::slotProcessStatus(QProcess::ProcessState status) // update free space info slotUpdateFreeSpace(); } else { - if (device_selector->currentIndex() != SCREENGRAB) m_stopAction->setEnabled(true); + if (device_selector->currentIndex()) m_stopAction->setEnabled(true); device_selector->setEnabled(false); } } @@ -851,7 +945,7 @@ void RecMonitor::manageCapturedFiles() QStringList filters; QString capturename = KdenliveSettings::dvgrabfilename(); if (capturename.isEmpty()) capturename = "capture"; - filters << capturename + "*" + extension; + filters << capturename + '*' + extension; const QStringList result = dir.entryList(filters, QDir::Files, QDir::Time); KUrl::List capturedFiles; foreach(const QString & name, result) { @@ -876,8 +970,8 @@ void RecMonitor::manageCapturedFiles() kDebug() << "Found : " << capturedFiles.count() << " new capture files"; kDebug() << capturedFiles; - if (capturedFiles.count() > 0) { - ManageCapturesDialog *d = new ManageCapturesDialog(capturedFiles, this); + if (!capturedFiles.isEmpty()) { + QPointer d = new ManageCapturesDialog(capturedFiles, this); if (d->exec() == QDialog::Accepted) { emit addProjectClipList(d->importFiles()); } @@ -886,9 +980,10 @@ void RecMonitor::manageCapturedFiles() } // virtual -void RecMonitor::mousePressEvent(QMouseEvent * /*event*/) +void RecMonitor::mousePressEvent(QMouseEvent *event) { if (m_freeSpace->underMouse()) slotUpdateFreeSpace(); + else QWidget::mousePressEvent(event);//m_videoBox->mousePressEvent(event); } void RecMonitor::slotUpdateFreeSpace() @@ -904,24 +999,33 @@ void RecMonitor::slotUpdateFreeSpace() void RecMonitor::refreshRecMonitor(bool visible) { if (visible) { - //if (!m_isActive) m_monitorManager->activateRecMonitor(m_name); + //if (!m_isActive) activateMonitor(); } } void RecMonitor::slotPlay() { - - //if (!m_isActive) m_monitorManager->activateRecMonitor(m_name); - + /*if (m_isPlaying) slotStopCapture(); + 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() @@ -944,10 +1048,11 @@ void RecMonitor::slotDroppedFrames(int dropped) void RecMonitor::buildMltDevice(const QString &path) { if (m_captureDevice == NULL) { - m_captureDevice = new MltDeviceCapture(path, m_videoBox, this); + m_monitorManager->updateScopeSource(); + m_captureDevice = new MltDeviceCapture(path, videoSurface, this); connect(m_captureDevice, SIGNAL(droppedFrames(int)), this, SLOT(slotDroppedFrames(int))); m_captureDevice->sendFrameForAnalysis = m_analyse; - m_manager->updateScopeSource(); + m_monitorManager->updateScopeSource(); } } @@ -956,5 +1061,11 @@ void RecMonitor::slotChangeRecordingPreview(bool enable) KdenliveSettings::setEnable_recording_preview(enable); } + +void RecMonitor::slotMouseSeek(int /*eventDelta*/, bool /*fast*/) +{ +} + + #include "recmonitor.moc"