From: Jean-Baptiste Mardelle Date: Sat, 28 May 2011 19:37:56 +0000 (+0000) Subject: Report dropped frame on decklink capture X-Git-Url: https://git.sesse.net/?a=commitdiff_plain;h=eaf30e1dab73f87d24a3b589e074b8c1cfa6f058;p=kdenlive Report dropped frame on decklink capture svn path=/trunk/kdenlive/; revision=5613 --- diff --git a/src/kdenlivesettings.kcfg b/src/kdenlivesettings.kcfg index bac9fb88..c9116df5 100644 --- a/src/kdenlivesettings.kcfg +++ b/src/kdenlivesettings.kcfg @@ -504,7 +504,7 @@ - vcodec=mpeg2video minrate=0 b=12000k acodec=mp2 ab=128k ar=48000 threads=2 + vcodec=mpeg2video b=12000k minrate=0 pix_fmt=yuv420p g=15 acodec=mp2 ac=2 ab=128k ar=48000 threads=%threads diff --git a/src/mltdevicecapture.cpp b/src/mltdevicecapture.cpp index 172dd432..99a69791 100644 --- a/src/mltdevicecapture.cpp +++ b/src/mltdevicecapture.cpp @@ -35,6 +35,7 @@ #include #include #include +#include #include #include @@ -88,6 +89,8 @@ MltDeviceCapture::MltDeviceCapture(QString profile, VideoPreviewContainer *surfa m_mltConsumer(NULL), m_mltProducer(NULL), m_mltProfile(NULL), + m_droppedFrames(0), + m_livePreview(true), m_captureDisplayWidget(surface), m_winid((int) surface->winId()), m_analyseAudio(KdenliveSettings::monitor_audio()) @@ -301,6 +304,14 @@ bool MltDeviceCapture::slotStartPreview(const QString &producer, bool xmlFormat) void MltDeviceCapture::gotCapturedFrame(Mlt::Frame& frame) { + if (m_mltProducer) { + int dropped = m_mltProducer->get_int("dropped"); + if (dropped != m_droppedFrames) { + m_droppedFrames = dropped; + emit droppedFrames(m_droppedFrames); + } + } + if (!m_livePreview) return; mlt_image_format format = mlt_image_rgb24a; int width = 0; int height = 0; @@ -347,9 +358,11 @@ void MltDeviceCapture::captureFrame(const QString &path) doCapture = 5; } -bool MltDeviceCapture::slotStartCapture(const QString ¶ms, const QString &path, const QString &playlist, bool xmlPlaylist) +bool MltDeviceCapture::slotStartCapture(const QString ¶ms, const QString &path, const QString &playlist, bool livePreview, bool xmlPlaylist) { stop(); + m_livePreview = livePreview; + m_droppedFrames = 0; if (m_mltProfile) delete m_mltProfile; char *tmp = qstrdup(m_activeProfile.toUtf8().constData()); m_mltProfile = new Mlt::Profile(tmp); @@ -365,7 +378,9 @@ bool MltDeviceCapture::slotStartCapture(const QString ¶ms, const QString &pa char *tmp2; for (int i = 0; i < paramList.count(); i++) { tmp = qstrdup(paramList.at(i).section("=", 0, 0).toUtf8().constData()); - tmp2 = qstrdup(paramList.at(i).section("=", 1, 1).toUtf8().constData()); + QString value = paramList.at(i).section("=", 1, 1); + if (value == "%threads") value = QString::number(QThread::idealThreadCount()); + tmp2 = qstrdup(value.toUtf8().constData()); m_mltConsumer->set(tmp, tmp2); delete[] tmp; delete[] tmp2; diff --git a/src/mltdevicecapture.h b/src/mltdevicecapture.h index 158b7159..2a332bf9 100644 --- a/src/mltdevicecapture.h +++ b/src/mltdevicecapture.h @@ -76,7 +76,7 @@ Q_OBJECT public: /** @brief Starts the MLT Video4Linux process. * @param surface The widget onto which the frame should be painted */ - bool slotStartCapture(const QString ¶ms, const QString &path, const QString &playlist, bool xmlPlaylist = true); + bool slotStartCapture(const QString ¶ms, const QString &path, const QString &playlist, bool livePreview, bool xmlPlaylist = true); bool slotStartPreview(const QString &producer, bool xmlFormat = false); /** @brief A frame arrived from the MLT Video4Linux process. */ void gotCapturedFrame(Mlt::Frame& frame); @@ -97,6 +97,8 @@ private: Mlt::Producer * m_mltProducer; Mlt::Profile *m_mltProfile; QString m_activeProfile; + int m_droppedFrames; + bool m_livePreview; /** @brief The surface onto which the captured frames should be painted. */ VideoPreviewContainer *m_captureDisplayWidget; @@ -125,6 +127,8 @@ signals: void audioSamplesSignal(const QVector&, int freq, int num_channels, int num_samples); void frameSaved(const QString); + + void droppedFrames(int); public slots: diff --git a/src/recmonitor.cpp b/src/recmonitor.cpp index 8149d5d1..a3f92948 100644 --- a/src/recmonitor.cpp +++ b/src/recmonitor.cpp @@ -240,7 +240,6 @@ void RecMonitor::slotVideoDeviceChanged(int ix) checkDeviceAvailability(); break; case BLACKMAGIC: - //createBlackmagicDevice(); m_recAction->setEnabled(true); m_stopAction->setEnabled(false); m_playAction->setEnabled(true); @@ -292,24 +291,12 @@ void RecMonitor::slotVideoDeviceChanged(int ix) } } -void RecMonitor::createBlackmagicDevice() -{ - //video_capture->setVisible(true); - if (m_bmCapture == NULL) { - QVBoxLayout *lay = new QVBoxLayout; - m_bmCapture = new BmdCaptureHandler(lay); - connect(m_bmCapture, SIGNAL(gotTimeCode(ulong)), this, SLOT(slotGotBlackMagicFrameNumber(ulong))); - connect(m_bmCapture, SIGNAL(gotMessage(const QString &)), this, SLOT(slotGotBlackmagicMessage(const QString &))); - video_capture->setLayout(lay); - } -} - void RecMonitor::slotGotBlackmagicFrameNumber(ulong ix) { m_dvinfo.setText(QString::number(ix)); } -void RecMonitor::slotGotBlackmagicMessage(const QString &message) +void RecMonitor::slotSetInfoMessage(const QString &message) { m_logger.insertItem(0, message); } @@ -488,6 +475,7 @@ void RecMonitor::slotStartCapture(bool play) m_manager->activateMonitor("record"); if (m_captureDevice == NULL) { m_captureDevice = new MltDeviceCapture(path, m_videoBox, this); + connect(m_captureDevice, SIGNAL(droppedFrames(int)), this, SLOT(slotDroppedFrames(int))); m_captureDevice->sendFrameForAnalysis = m_analyse; m_manager->updateScopeSource(); } @@ -551,26 +539,11 @@ void RecMonitor::slotStartCapture(bool play) void RecMonitor::slotRecord() { - /*if (device_selector->currentIndex() == BLACKMAGIC) { - if (m_blackmagicCapturing) { - // We are capturing, stop it - m_bmCapture->stopCapture(); - m_blackmagicCapturing = false; - } else { - // Start capture, get capture filename first - QString path = m_capturePath; - if (!path.endsWith("/")) path.append("/"); - path.append(KdenliveSettings::hdmifilename()); - m_bmCapture->startCapture(path); - m_blackmagicCapturing = true; - } - return; - }*/ - if (m_captureProcess->state() == QProcess::NotRunning && device_selector->currentIndex() == FIREWIRE) { slotStartCapture(); } if (m_isCapturing) { + // User stopped capture switch (device_selector->currentIndex()) { case FIREWIRE: m_captureProcess->write("\e", 2); @@ -582,6 +555,7 @@ void RecMonitor::slotRecord() case VIDEO4LINUX: case BLACKMAGIC: slotStopCapture(); + slotSetInfoMessage(i18n("Capture stopped")); m_isCapturing = false; m_recAction->setChecked(false); if (autoaddbox->isChecked() && QFile::exists(m_captureFile.path())) emit addProjectClip(m_captureFile); @@ -657,7 +631,7 @@ void RecMonitor::slotRecord() playlist.append(""); - if (m_captureDevice->slotStartCapture(KdenliveSettings::v4l_parameters(), m_captureFile.path(), playlist)) { + if (m_captureDevice->slotStartCapture(KdenliveSettings::v4l_parameters(), m_captureFile.path(), playlist, enable_preview->isChecked())) { m_videoBox->setHidden(false); m_isCapturing = true; } @@ -681,18 +655,21 @@ void RecMonitor::slotRecord() profile = ProfilesDialog::getVideoProfile(path); if (m_captureDevice == NULL) { m_captureDevice = new MltDeviceCapture(path, m_videoBox, this); + connect(m_captureDevice, SIGNAL(droppedFrames(int)), this, SLOT(slotDroppedFrames(int))); m_captureDevice->sendFrameForAnalysis = m_analyse; m_manager->updateScopeSource(); } 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()), false)) { + if (m_captureDevice->slotStartCapture(KdenliveSettings::decklink_parameters(), m_captureFile.path(), QString("decklink:%1").arg(KdenliveSettings::decklink_capturedevice()), enable_preview->isChecked(), false)) { m_videoBox->setHidden(false); m_isCapturing = true; + slotSetInfoMessage(i18n("Capturing to %1", m_captureFile.fileName())); } else { - video_frame->setText(i18n("Failed to start Decklink,\ncheck your parameters...")); + video_frame->setText(i18n("Failed to start Decklink,\ncheck your parameters...")); + slotSetInfoMessage(i18n("Failed to start capture")); m_videoBox->setHidden(true); m_isCapturing = false; m_recAction->setChecked(false); @@ -937,6 +914,10 @@ void RecMonitor::analyseFrames(bool analyse) if (m_captureDevice) m_captureDevice->sendFrameForAnalysis = analyse; } +void RecMonitor::slotDroppedFrames(int dropped) +{ + slotSetInfoMessage(i18n("%1 dropped frames", dropped)); +} #include "recmonitor.moc" diff --git a/src/recmonitor.h b/src/recmonitor.h index c61b8041..5cfa920e 100644 --- a/src/recmonitor.h +++ b/src/recmonitor.h @@ -112,7 +112,6 @@ private: void checkDeviceAvailability(); QPixmap mergeSideBySide(const QPixmap& pix, const QString txt); void manageCapturedFiles(); - void createBlackmagicDevice(); private slots: void slotStartCapture(bool play = true); @@ -127,7 +126,8 @@ private slots: void slotReadDvgrabInfo(); void slotUpdateFreeSpace(); void slotGotBlackmagicFrameNumber(ulong ix); - void slotGotBlackmagicMessage(const QString &message); + void slotSetInfoMessage(const QString &message); + void slotDroppedFrames(int dropped); public slots: void refreshRecMonitor(bool visible); diff --git a/src/widgets/recmonitor_ui.ui b/src/widgets/recmonitor_ui.ui index 7a2a4c31..7393bb80 100644 --- a/src/widgets/recmonitor_ui.ui +++ b/src/widgets/recmonitor_ui.ui @@ -6,15 +6,15 @@ 0 0 - 210 - 152 + 371 + 186 0 - + QFrame::NoFrame @@ -27,7 +27,7 @@ - + Not connected @@ -37,7 +37,7 @@ - + @@ -69,7 +69,7 @@ - + @@ -93,6 +93,29 @@ + + + + Preview while capturing + + + true + + + + + + + Qt::Horizontal + + + + 40 + 20 + + + +