X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Frecmonitor.cpp;h=6542c5fb938074aca591f6435a411555e3fef9e7;hb=7448dd52292cc53cd97ce3fdba5c26246faba3f1;hp=5d9749ebce1c71dba61696816721dfbd20fce1a9;hpb=189ef7e1a7e40e299e1b78cacc64a1d00e36f525;p=kdenlive diff --git a/src/recmonitor.cpp b/src/recmonitor.cpp index 5d9749eb..6542c5fb 100644 --- a/src/recmonitor.cpp +++ b/src/recmonitor.cpp @@ -30,6 +30,12 @@ #include #include #include +#include +#include + +#if KDE_IS_VERSION(4,2,0) +#include +#endif #include #include @@ -38,13 +44,19 @@ #include -RecMonitor::RecMonitor(QString name, QWidget *parent) - : QWidget(parent), m_name(name), m_isActive(false), m_isCapturing(false), m_isPlaying(false), m_didCapture(false) { - ui.setupUi(this); +RecMonitor::RecMonitor(QString name, QWidget *parent) : + QWidget(parent), + m_name(name), + m_isActive(false), + m_isCapturing(false), + m_didCapture(false), + m_isPlaying(false) +{ + setupUi(this); - ui.video_frame->setAttribute(Qt::WA_PaintOnScreen); - ui.device_selector->setCurrentIndex(KdenliveSettings::defaultcapture()); - connect(ui.device_selector, SIGNAL(currentIndexChanged(int)), this, SLOT(slotVideoDeviceChanged(int))); + video_frame->setAttribute(Qt::WA_PaintOnScreen); + device_selector->setCurrentIndex(KdenliveSettings::defaultcapture()); + connect(device_selector, SIGNAL(currentIndexChanged(int)), this, SLOT(slotVideoDeviceChanged(int))); @@ -80,16 +92,32 @@ RecMonitor::RecMonitor(QString name, QWidget *parent) configAction->setCheckable(false); layout->addWidget(toolbar); - ui.control_frame_firewire->setLayout(layout); - slotVideoDeviceChanged(ui.device_selector->currentIndex()); - displayProcess = new QProcess; - captureProcess = new QProcess; + layout->addWidget(&m_dvinfo); + +#if KDE_IS_VERSION(4,2,0) + 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); + connect(&m_spaceTimer, SIGNAL(timeout()), this, SLOT(slotUpdateFreeSpace())); + m_spaceTimer.setInterval(30000); + m_spaceTimer.setSingleShot(false); +#endif + + control_frame_firewire->setLayout(layout); - connect(captureProcess, SIGNAL(stateChanged(QProcess::ProcessState)), this, SLOT(slotProcessStatus(QProcess::ProcessState))); + slotVideoDeviceChanged(device_selector->currentIndex()); + 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())); QStringList env = QProcess::systemEnvironment(); - env << "SDL_WINDOWID=" + QString::number(ui.video_frame->winId()); + env << "SDL_WINDOWID=" + QString::number(video_frame->winId()); QString videoDriver = KdenliveSettings::videodrivername(); if (!videoDriver.isEmpty()) { @@ -100,33 +128,56 @@ RecMonitor::RecMonitor(QString name, QWidget *parent) } setenv("SDL_VIDEO_ALLOW_SCREENSAVER", "1", 1); - displayProcess->setEnvironment(env); + m_displayProcess->setEnvironment(env); 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); } - kDebug() << "/////// BUILDING MONITOR, ID: " << ui.video_frame->winId(); + kDebug() << "/////// BUILDING MONITOR, ID: " << video_frame->winId(); } -RecMonitor::~RecMonitor() { - delete captureProcess; - delete displayProcess; +RecMonitor::~RecMonitor() +{ +#if KDE_IS_VERSION(4,2,0) + m_spaceTimer.stop(); +#endif + delete m_captureProcess; + delete m_displayProcess; } -QString RecMonitor::name() const { +QString RecMonitor::name() const +{ return m_name; } -void RecMonitor::slotConfigure() { - emit showConfigDialog(4, ui.device_selector->currentIndex()); +void RecMonitor::slotConfigure() +{ + emit showConfigDialog(4, device_selector->currentIndex()); +} + +void RecMonitor::slotUpdateCaptureFolder() +{ + if (m_captureProcess) m_captureProcess->setWorkingDirectory(KdenliveSettings::capturefolder()); + 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 + slotUpdateFreeSpace(); +#endif } -void RecMonitor::slotVideoDeviceChanged(int ix) { +void RecMonitor::slotVideoDeviceChanged(int ix) +{ switch (ix) { case SCREENGRAB: m_discAction->setEnabled(false); @@ -137,11 +188,11 @@ void RecMonitor::slotVideoDeviceChanged(int ix) { m_playAction->setEnabled(false); if (KdenliveSettings::rmd_path().isEmpty()) { QString rmdpath = KStandardDirs::findExe("recordmydesktop"); - if (rmdpath.isEmpty()) ui.video_frame->setPixmap(mergeSideBySide(KIcon("dialog-warning").pixmap(QSize(50, 50)), i18n("Recordmydesktop utility not found,\n please install it for screen grabs"))); + 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()) 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")); + 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()))); + //video_frame->setText(i18n("Press record button\nto start screen capture")); break; case VIDEO4LINUX: m_discAction->setEnabled(false); @@ -159,21 +210,43 @@ void RecMonitor::slotVideoDeviceChanged(int ix) { m_playAction->setEnabled(false); m_rewAction->setEnabled(false); m_fwdAction->setEnabled(false); - //ui.video_frame->setText(i18n("Plug your camcorder and\npress connect button\nto initialize connection")); + + // Check that dvgab is available if (KdenliveSettings::dvgrab_path().isEmpty()) { QString dvgrabpath = KStandardDirs::findExe("dvgrab"); - if (dvgrabpath.isEmpty()) ui.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()) video_frame->setPixmap(mergeSideBySide(KIcon("dialog-warning").pixmap(QSize(50, 50)), i18n("dvgrab utility not found,\n please install it for firewire capture"))); else KdenliveSettings::setDvgrab_path(dvgrabpath); + } else { + // Show capture info + QString capturefile = KdenliveSettings::capturefolder(); + if (!capturefile.endsWith("/")) capturefile.append("/"); + QString capturename = KdenliveSettings::dvgrabfilename(); + if (capturename.isEmpty()) capturename = "capture"; + QString extension; + switch (KdenliveSettings::firewireformat()) { + case 0: + extension = ".dv"; + break; + case 1: + case 2: + extension = ".avi"; + break; + case 3: + extension = ".m2t"; + break; + } + capturename.append("xxx" + extension); + capturefile.append(capturename); + 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", capturefile))); } - - if (!KdenliveSettings::dvgrab_path().isEmpty()) 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) { +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); + QRect r = QApplication::fontMetrics().boundingRect(QRect(0, 0, video_frame->width(), video_frame->height()), Qt::AlignLeft, txt); int strWidth = r.width(); int strHeight = r.height(); int pixWidth = pix.width(); @@ -182,122 +255,86 @@ QPixmap RecMonitor::mergeSideBySide(const QPixmap& pix, const QString txt) { res.fill(Qt::transparent); p.begin(&res); p.drawPixmap(0, 0, pix); + p.setPen(kapp->palette().text().color()); p.drawText(QRect(pixWidth + 8, 0, strWidth, strHeight), 0, txt); p.end(); return res; } -void RecMonitor::checkDeviceAvailability() { +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->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()))); + 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()))); } -void RecMonitor::slotDisconnect() { - if (captureProcess->state() == QProcess::NotRunning) { +void RecMonitor::slotDisconnect() +{ + if (m_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")); + m_discAction->setText(i18n("Disconnect")); m_recAction->setEnabled(true); m_stopAction->setEnabled(true); m_playAction->setEnabled(true); m_rewAction->setEnabled(true); m_fwdAction->setEnabled(true); } else { - captureProcess->write("q", 1); - QTimer::singleShot(1000, captureProcess, SLOT(kill())); + m_captureProcess->write("q", 1); + QTimer::singleShot(1000, m_captureProcess, SLOT(kill())); if (m_didCapture) manageCapturedFiles(); m_didCapture = false; } } -void RecMonitor::slotRewind() { - captureProcess->write("a", 1); +void RecMonitor::slotRewind() +{ + m_captureProcess->write("a", 1); } -void RecMonitor::slotForward() { - captureProcess->write("z", 1); +void RecMonitor::slotForward() +{ + m_captureProcess->write("z", 1); } -void RecMonitor::slotStopCapture() { +void RecMonitor::slotStopCapture() +{ // stop capture - switch (ui.device_selector->currentIndex()) { + switch (device_selector->currentIndex()) { case FIREWIRE: - captureProcess->write("\e", 2); + m_captureProcess->write("\e", 2); m_playAction->setIcon(m_playIcon); m_isPlaying = false; break; case VIDEO4LINUX: - captureProcess->write("q\n", 3); - QTimer::singleShot(1000, captureProcess, SLOT(kill())); - - break; case SCREENGRAB: - captureProcess->write("q\n", 3); - QTimer::singleShot(1000, captureProcess, SLOT(kill())); + m_captureProcess->write("q\n", 3); + QTimer::singleShot(1000, m_captureProcess, SLOT(kill())); break; default: break; } } -void RecMonitor::slotStartCapture(bool play) { - - /* - *captureProcess<<"dvgrab"; - - bool isHdv = false; - - switch (m_recPanel->capture_format->currentItem()){ - case 0: - *captureProcess<<"--format"<<"dv1"; - break; - case 1: - *captureProcess<<"--format"<<"dv2"; - break; - case 3: - *captureProcess<<"--format"<<"hdv"; - isHdv = true; - break; - default: - *captureProcess<<"--format"<<"raw"; - break; - } - - if (KdenliveSettings::autosplit()) *captureProcess<<"--autosplit"; - if (KdenliveSettings::timestamp()) *captureProcess<<"--timestamp"; - *captureProcess<<"-i"<<"capture"<<"-";*/ - - /* - QStringList captureArgs; - captureArgs<<"--format"<<"hdv"<<"-i"<<"capture"<<"-"; - QStringList displayArgs; - - displayArgs<<"-f"<<"mpegts"<<"-x"<width())<<"-y"<height())<<"-"; - - captureProcess->setStandardOutputProcess(displayProcess); - ui.video_frame->setScaledContents(false); - captureProcess->start("dvgrab",captureArgs); - displayProcess->start("ffplay", displayArgs);*/ - - - if (captureProcess->state() != QProcess::NotRunning) { - if (ui.device_selector->currentIndex() == FIREWIRE) { +void RecMonitor::slotStartCapture(bool play) +{ + if (m_captureProcess->state() != QProcess::NotRunning) { + if (device_selector->currentIndex() == FIREWIRE) { if (m_isPlaying) { - captureProcess->write("k", 1); + m_captureProcess->write("k", 1); //captureProcess->write("\e", 2); m_playAction->setIcon(m_playIcon); m_isPlaying = false; } else { - captureProcess->write("p", 1); + m_captureProcess->write("p", 1); m_playAction->setIcon(m_pauseIcon); m_isPlaying = true; } @@ -307,8 +344,10 @@ void RecMonitor::slotStartCapture(bool play) { m_captureArgs.clear(); m_displayArgs.clear(); m_isPlaying = false; + QString capturename = KdenliveSettings::dvgrabfilename(); + QStringList dvargs = KdenliveSettings::dvgrabextra().simplified().split(" ", QString::SkipEmptyParts); - switch (ui.device_selector->currentIndex()) { + switch (device_selector->currentIndex()) { case FIREWIRE: switch (KdenliveSettings::firewireformat()) { case 0: @@ -329,79 +368,91 @@ void RecMonitor::slotStartCapture(bool play) { case 3: // HDV CAPTURE m_captureArgs << "--format" << "hdv"; - m_displayArgs << "-f" << "mpegts"; + m_displayArgs << "-f" << KdenliveSettings::video4container(); 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()) << "-"; + if (!dvargs.isEmpty()) { + m_captureArgs << dvargs; + } + m_captureArgs << "-i"; + if (capturename.isEmpty()) capturename = "capture"; + m_captureArgs << capturename << "-"; + + m_displayArgs << "-x" << QString::number(video_frame->width()) << "-y" << QString::number(video_frame->height()) << "-"; - captureProcess->setStandardOutputProcess(displayProcess); - captureProcess->setWorkingDirectory(KdenliveSettings::capturefolder()); + m_captureProcess->setStandardOutputProcess(m_displayProcess); + m_captureProcess->setWorkingDirectory(KdenliveSettings::capturefolder()); kDebug() << "Capture: Running dvgrab " << m_captureArgs.join(" "); - captureProcess->start(KdenliveSettings::dvgrab_path(), m_captureArgs); - if (play) captureProcess->write(" ", 1); + + m_captureProcess->start(KdenliveSettings::dvgrab_path(), m_captureArgs); + if (play) m_captureProcess->write(" ", 1); 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(ui.video_frame->width()) << "-y" << QString::number(ui.video_frame->height()) << "-"; - captureProcess->setStandardOutputProcess(displayProcess); + 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(" "); - captureProcess->start("ffmpeg", m_captureArgs); + m_captureProcess->start("ffmpeg", m_captureArgs); break; default: break; } - if (ui.device_selector->currentIndex() != SCREENGRAB) { + if (device_selector->currentIndex() != SCREENGRAB) { kDebug() << "Capture: Running ffplay " << m_displayArgs.join(" "); - displayProcess->start("ffplay", m_displayArgs); - ui.video_frame->setText(i18n("Initialising...")); + m_displayProcess->start("ffplay", m_displayArgs); + video_frame->setText(i18n("Initialising...")); } else { // do something when starting screen grab } } -void RecMonitor::slotRecord() { - if (captureProcess->state() == QProcess::NotRunning && ui.device_selector->currentIndex() == FIREWIRE) { +void RecMonitor::slotRecord() +{ + if (m_captureProcess->state() == QProcess::NotRunning && device_selector->currentIndex() == FIREWIRE) { slotStartCapture(); } if (m_isCapturing) { - switch (ui.device_selector->currentIndex()) { + switch (device_selector->currentIndex()) { case FIREWIRE: - captureProcess->write("\e", 2); + m_captureProcess->write("\e", 2); m_playAction->setIcon(m_playIcon); m_isCapturing = false; m_isPlaying = false; m_recAction->setChecked(false); break; case VIDEO4LINUX: - captureProcess->terminate(); + m_captureProcess->terminate(); slotStopCapture(); //m_isCapturing = false; QTimer::singleShot(1000, this, SLOT(slotStartCapture())); break; case SCREENGRAB: //captureProcess->write("q\n", 3); - captureProcess->terminate(); - ui.video_frame->setText(i18n("Encoding captured video...")); + m_captureProcess->terminate(); + video_frame->setText(i18n("Encoding captured video...")); // in case ffmpeg doesn't exit with the 'q' command, kill it one second later //QTimer::singleShot(1000, captureProcess, SLOT(kill())); break; } return; - } else if (ui.device_selector->currentIndex() == FIREWIRE) { + } else if (device_selector->currentIndex() == FIREWIRE) { m_isCapturing = true; m_didCapture = true; - captureProcess->write("c\n", 3); + m_captureProcess->write("c\n", 3); +#if KDE_IS_VERSION(4,2,0) + m_spaceTimer.start(); +#endif return; } - if (captureProcess->state() == QProcess::NotRunning) { + if (m_captureProcess->state() == QProcess::NotRunning) { m_recAction->setChecked(true); QString extension = "mp4"; - if (ui.device_selector->currentIndex() == SCREENGRAB) extension = "ogv"; //KdenliveSettings::screengrabextension(); + if (device_selector->currentIndex() == SCREENGRAB) extension = "ogv"; //KdenliveSettings::screengrabextension(); + else if (device_selector->currentIndex() == VIDEO4LINUX) extension = KdenliveSettings::video4extension(); QString path = KdenliveSettings::capturefolder() + "/capture0000." + extension; int i = 1; while (QFile::exists(path)) { @@ -409,27 +460,21 @@ void RecMonitor::slotRecord() { path = KdenliveSettings::capturefolder() + "/capture" + num + '.' + extension; i++; } - m_captureFile = KUrl(path); m_captureArgs.clear(); m_displayArgs.clear(); QString args; + QString capturename = KdenliveSettings::dvgrabfilename(); + if (capturename.isEmpty()) capturename = "capture"; - 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()) << "-"; - captureProcess->setStandardOutputProcess(displayProcess); - kDebug() << "Capture: Running dvgrab " << m_captureArgs.join(" "); - captureProcess->start(KdenliveSettings::dvgrab_path(), m_captureArgs); - break; + 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(ui.video_frame->width()) << "-y" << QString::number(ui.video_frame->height()) << "-"; - captureProcess->setStandardOutputProcess(displayProcess); + 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(" "); - captureProcess->start("ffmpeg", m_captureArgs); + m_captureProcess->start("ffmpeg", m_captureArgs); break; case SCREENGRAB: switch (KdenliveSettings::rmd_capture_type()) { @@ -438,7 +483,7 @@ void RecMonitor::slotRecord() { break; default: // Region capture - m_captureArgs << "-width" << QString::number(KdenliveSettings::rmd_width()) << "-height" << QString::number(KdenliveSettings::rmd_height()); + 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 { @@ -447,26 +492,33 @@ void RecMonitor::slotRecord() { } break; } + if (KdenliveSettings::rmd_hide_mouse()) m_captureArgs << "--no-cursor"; m_isCapturing = true; if (KdenliveSettings::rmd_capture_audio()) { - m_captureArgs << "-freq" << KdenliveSettings::rmd_freq(); - m_captureArgs << "-channels" << QString::number(KdenliveSettings::rmd_audio_channels()); + m_captureArgs << "--freq" << KdenliveSettings::rmd_freq(); + m_captureArgs << "--channels" << QString::number(KdenliveSettings::rmd_audio_channels()); if (KdenliveSettings::rmd_use_jack()) { - m_captureArgs << "-use-jack" << KdenliveSettings::rmd_jackports(); + m_captureArgs << "--use-jack"; + QStringList ports = KdenliveSettings::rmd_jackports().split(" ", QString::SkipEmptyParts); + for (int i = 0; i < ports.count(); ++i) { + m_captureArgs << ports.at(i); + } if (KdenliveSettings::rmd_jack_buffer() > 0.0) - m_captureArgs << "-ring-buffer-size" << QString::number(KdenliveSettings::rmd_jack_buffer()); + m_captureArgs << "--ring-buffer-size" << QString::number(KdenliveSettings::rmd_jack_buffer()); } else { if (!KdenliveSettings::rmd_alsadevicename().isEmpty()) - m_captureArgs << "-device" << KdenliveSettings::rmd_alsadevicename(); + m_captureArgs << "--device" << KdenliveSettings::rmd_alsadevicename(); if (KdenliveSettings::rmd_alsa_buffer() > 0) - m_captureArgs << "-buffer-size" << QString::number(KdenliveSettings::rmd_alsa_buffer()); + 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 << "-workdir" << KdenliveSettings::currenttmpfolder(); - m_captureArgs << "-fps" << QString::number(KdenliveSettings::rmd_fps()) << "-o" << m_captureFile.path(); - captureProcess->start(KdenliveSettings::rmd_path(), m_captureArgs); + 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; break; default: @@ -474,15 +526,15 @@ void RecMonitor::slotRecord() { } - if (ui.device_selector->currentIndex() != SCREENGRAB) { + if (device_selector->currentIndex() != SCREENGRAB) { m_isCapturing = true; kDebug() << "Capture: Running ffplay " << m_displayArgs.join(" "); - displayProcess->start("ffplay", m_displayArgs); - ui.video_frame->setText(i18n("Initialising...")); + m_displayProcess->start("ffplay", m_displayArgs); + video_frame->setText(i18n("Initialising...")); } } else { // stop capture - displayProcess->kill(); + m_displayProcess->kill(); //captureProcess->kill(); QTimer::singleShot(1000, this, SLOT(slotRecord())); } @@ -506,7 +558,7 @@ void RecMonitor::slotStartGrab(const QRect &rect) { } m_captureArgs << args.simplified().split(' ') << KdenliveSettings::screengrabencoding().simplified().split(' ') << m_captureFile.path(); m_isCapturing = true; - ui.video_frame->setText(i18n("Capturing...")); + video_frame->setText(i18n("Capturing...")); if (KdenliveSettings::screengrabenableaudio() && !KdenliveSettings::useosscapture()) { QStringList alsaArgs = KdenliveSettings::screengrabalsacapture().simplified().split(' '); alsaProcess->setStandardOutputProcess(captureProcess); @@ -517,12 +569,13 @@ void RecMonitor::slotStartGrab(const QRect &rect) { captureProcess->start("ffmpeg", m_captureArgs); }*/ -void RecMonitor::slotProcessStatus(QProcess::ProcessState status) { +void RecMonitor::slotProcessStatus(QProcess::ProcessState status) +{ if (status == QProcess::NotRunning) { - displayProcess->kill(); - if (m_isCapturing && ui.device_selector->currentIndex() != FIREWIRE) - if (ui.autoaddbox->isChecked() && QFile::exists(m_captureFile.path())) emit addProjectClip(m_captureFile); - if (ui.device_selector->currentIndex() == FIREWIRE) { + m_displayProcess->kill(); + if (m_isCapturing && device_selector->currentIndex() != FIREWIRE) + if (autoaddbox->isChecked() && QFile::exists(m_captureFile.path())) emit addProjectClip(m_captureFile); + if (device_selector->currentIndex() == FIREWIRE) { m_discAction->setIcon(KIcon("network-connect")); m_discAction->setText(i18n("Connect")); m_playAction->setEnabled(false); @@ -534,21 +587,36 @@ void RecMonitor::slotProcessStatus(QProcess::ProcessState status) { m_playAction->setIcon(m_playIcon); m_recAction->setChecked(false); m_stopAction->setEnabled(false); - ui.device_selector->setEnabled(true); - if (captureProcess && captureProcess->exitStatus() == QProcess::CrashExit) { - ui.video_frame->setText(i18n("Capture crashed, please check your parameters")); + device_selector->setEnabled(true); + if (m_captureProcess && m_captureProcess->exitStatus() == QProcess::CrashExit) { + video_frame->setText(i18n("Capture crashed, please check your parameters")); } else { - if (ui.device_selector->currentIndex() != SCREENGRAB) ui.video_frame->setText(i18n("Not connected")); - else 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()))); + 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", KdenliveSettings::capturefolder()))); + } + } } m_isCapturing = false; + +#if KDE_IS_VERSION(4,2,0) + m_spaceTimer.stop(); + // update free space info + slotUpdateFreeSpace(); +#endif + } else { - if (ui.device_selector->currentIndex() != SCREENGRAB) m_stopAction->setEnabled(true); - ui.device_selector->setEnabled(false); + if (device_selector->currentIndex() != SCREENGRAB) m_stopAction->setEnabled(true); + device_selector->setEnabled(false); } } -void RecMonitor::manageCapturedFiles() { +void RecMonitor::manageCapturedFiles() +{ QString extension; switch (KdenliveSettings::firewireformat()) { case 0: @@ -564,7 +632,9 @@ void RecMonitor::manageCapturedFiles() { } QDir dir(KdenliveSettings::capturefolder()); QStringList filters; - filters << "capture*" + extension; + 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) { @@ -590,36 +660,64 @@ void RecMonitor::manageCapturedFiles() { } // virtual -void RecMonitor::mousePressEvent(QMouseEvent * /*event*/) { - slotPlay(); +void RecMonitor::mousePressEvent(QMouseEvent * /*event*/) +{ +#if KDE_IS_VERSION(4,2,0) + if (m_freeSpace->underMouse()) slotUpdateFreeSpace(); +#endif } -void RecMonitor::activateRecMonitor() { +void RecMonitor::slotUpdateFreeSpace() +{ +#if KDE_IS_VERSION(4,2,0) + KDiskFreeSpaceInfo info = KDiskFreeSpaceInfo::freeSpaceInfo(KdenliveSettings::capturefolder()); + if (info.isValid()) { + m_freeSpace->setValue(100 * info.used() / info.size()); + m_freeSpace->setText(i18n("Free space: %1", KIO::convertSize(info.available()))); + m_freeSpace->update(); + } +#endif +} + +void RecMonitor::activateRecMonitor() +{ //if (!m_isActive) m_monitorManager->activateRecMonitor(m_name); } -void RecMonitor::stop() { +void RecMonitor::stop() +{ m_isActive = false; } -void RecMonitor::start() { +void RecMonitor::start() +{ m_isActive = true; } -void RecMonitor::refreshRecMonitor(bool visible) { +void RecMonitor::refreshRecMonitor(bool visible) +{ if (visible) { //if (!m_isActive) m_monitorManager->activateRecMonitor(m_name); } } -void RecMonitor::slotPlay() { +void RecMonitor::slotPlay() +{ //if (!m_isActive) m_monitorManager->activateRecMonitor(m_name); } +void RecMonitor::slotReadDvgrabInfo() +{ + QString data = m_captureProcess->readAllStandardError().simplified(); + data = data.section('"', 2, 2).simplified(); + m_dvinfo.setText(data.left(11)); + m_dvinfo.updateGeometry(); +} #include "recmonitor.moc" +