X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Frecmonitor.cpp;h=d2e78941dbd737bf81e21c44971a476885f1b4c3;hb=ba471399b55c3b761ccc7aa5008c25bd43cfe90b;hp=6a7140d5deddd3cbe5291e2165bc94186e5e9afe;hpb=9522922e9d58a72c762d668177662f7d7ab00e8e;p=kdenlive diff --git a/src/recmonitor.cpp b/src/recmonitor.cpp index 6a7140d5..d2e78941 100644 --- a/src/recmonitor.cpp +++ b/src/recmonitor.cpp @@ -43,19 +43,17 @@ #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))); @@ -63,11 +61,9 @@ RecMonitor::RecMonitor(QString name, MonitorManager *manager, QWidget *parent) : 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; @@ -141,12 +137,11 @@ RecMonitor::RecMonitor(QString name, MonitorManager *manager, QWidget *parent) : connect(m_captureProcess, SIGNAL(stateChanged(QProcess::ProcessState)), this, SLOT(slotProcessStatus(QProcess::ProcessState))); connect(m_captureProcess, SIGNAL(readyReadStandardError()), this, SLOT(slotReadDvgrabInfo())); - - + 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,10 @@ 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(); slotVideoDeviceChanged(device_selector->currentIndex()); m_previewSettings->setChecked(KdenliveSettings::enable_recording_preview()); connect(m_previewSettings, SIGNAL(triggered(bool)), this, SLOT(slotChangeRecordingPreview(bool))); @@ -181,9 +177,17 @@ RecMonitor::~RecMonitor() if (m_captureDevice) delete m_captureDevice; } -const QString RecMonitor::name() const +void RecMonitor::mouseDoubleClickEvent(QMouseEvent * event) +{ + if (!KdenliveSettings::openglmonitors() && videoBox && videoBox->isVisible()) { + videoBox->switchFullScreen(); + event->accept(); + } +} + +void RecMonitor::slotSwitchFullScreen() { - return m_name; + videoBox->switchFullScreen(); } void RecMonitor::stop() @@ -193,6 +197,7 @@ void RecMonitor::stop() void RecMonitor::start() { + //slotStartPreview(true); } void RecMonitor::slotConfigure() @@ -229,15 +234,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); @@ -262,7 +267,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()); @@ -284,7 +289,7 @@ void RecMonitor::slotVideoDeviceChanged(int ix) } 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; @@ -347,7 +352,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,7 +384,9 @@ void RecMonitor::slotStopCapture() { // stop capture if (!m_isCapturing && !m_isPlaying) return; - m_videoBox->setHidden(true); + videoBox->setHidden(true); + rec_audio->setEnabled(true); + rec_video->setEnabled(true); switch (device_selector->currentIndex()) { case FIREWIRE: m_captureProcess->write("\e", 2); @@ -420,6 +427,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); @@ -433,6 +441,8 @@ void RecMonitor::slotStartPreview(bool play) } return; } + slotActivateMonitor(); + if (m_isPlaying) return; m_captureArgs.clear(); m_displayArgs.clear(); m_isPlaying = false; @@ -440,9 +450,9 @@ 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); + videoBox->setHidden(ix != VIDEO4LINUX && ix != BLACKMAGIC && ix != FIREWIRE); switch (ix) { case FIREWIRE: switch (KdenliveSettings::firewireformat()) { @@ -476,7 +486,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); @@ -488,7 +498,6 @@ 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); @@ -497,7 +506,7 @@ void RecMonitor::slotStartPreview(bool play) if (!m_captureDevice->slotStartPreview(producer, true)) { // 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); @@ -508,13 +517,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); @@ -526,10 +535,13 @@ void RecMonitor::slotStartPreview(bool play) break; } + rec_audio->setEnabled(false); + rec_video->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 } @@ -537,6 +549,9 @@ void RecMonitor::slotStartPreview(bool play) void RecMonitor::slotRecord() { + rec_audio->setEnabled(false); + rec_video->setEnabled(false); + if (m_captureProcess->state() == QProcess::NotRunning && device_selector->currentIndex() == FIREWIRE) { slotStartPreview(); } @@ -583,10 +598,10 @@ void RecMonitor::slotRecord() switch (device_selector->currentIndex()) { case VIDEO4LINUX: - m_manager->activateMonitor(Kdenlive::recordMonitor); + 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); @@ -628,7 +643,7 @@ void RecMonitor::slotRecord() if (!rec_video->isChecked()) showPreview = false; if (m_captureDevice->slotStartCapture(v4lparameters, m_captureFile.path(), playlist, showPreview)) { - m_videoBox->setHidden(false); + videoBox->setHidden(false); m_isCapturing = true; m_recAction->setEnabled(false); m_stopAction->setEnabled(true); @@ -636,22 +651,22 @@ void RecMonitor::slotRecord() } else { video_frame->setText(i18n("Failed to start Video4Linux,\ncheck your parameters...")); - m_videoBox->setHidden(true); + videoBox->setHidden(true); 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); @@ -661,7 +676,7 @@ 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; @@ -689,7 +704,7 @@ void RecMonitor::slotRecord() 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); } @@ -719,7 +734,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 { @@ -775,7 +790,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) @@ -843,7 +858,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) { @@ -869,7 +884,7 @@ void RecMonitor::manageCapturedFiles() kDebug() << capturedFiles; if (capturedFiles.count() > 0) { - ManageCapturesDialog *d = new ManageCapturesDialog(capturedFiles, this); + QPointer d = new ManageCapturesDialog(capturedFiles, this); if (d->exec() == QDialog::Accepted) { emit addProjectClipList(d->importFiles()); } @@ -878,9 +893,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() @@ -896,16 +912,15 @@ 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() @@ -936,10 +951,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(); } } @@ -948,5 +964,11 @@ void RecMonitor::slotChangeRecordingPreview(bool enable) KdenliveSettings::setEnable_recording_preview(enable); } + +void RecMonitor::slotMouseSeek(int /*eventDelta*/, bool /*fast*/) +{ +} + + #include "recmonitor.moc"