]> git.sesse.net Git - kdenlive/blobdiff - src/recmonitor.cpp
small cleanup
[kdenlive] / src / recmonitor.cpp
index ba38afcbe1a262ebf0706c8709ca30fac3a3ce03..a3f92948a2595f3ca51bf61b09f6dd5ed200803b 100644 (file)
@@ -211,8 +211,8 @@ void RecMonitor::slotVideoDeviceChanged(int ix)
     if (m_captureDevice) {
         // MLT capture still running, abort
         m_captureDevice->stop();
-        //delete m_captureDevice;
-        //m_captureDevice = NULL;
+        delete m_captureDevice;
+        m_captureDevice = NULL;
     }
     switch (ix) {
     case SCREENGRAB:
@@ -240,14 +240,13 @@ void RecMonitor::slotVideoDeviceChanged(int ix)
         checkDeviceAvailability();
         break;
     case BLACKMAGIC:
-        createBlackmagicDevice();
-        m_recAction->setEnabled(false);
+        m_recAction->setEnabled(true);
         m_stopAction->setEnabled(false);
         m_playAction->setEnabled(true);
 
         capturefile = m_capturePath;
         if (!capturefile.endsWith("/")) capturefile.append("/");
-        capturename = KdenliveSettings::hdmifilename();
+        capturename = KdenliveSettings::decklink_filename();
         capturename.append("xxx.raw");
         capturefile.append(capturename);
         video_frame->setPixmap(mergeSideBySide(KIcon("camera-photo").pixmap(QSize(50, 50)), i18n("Plug your camcorder and\npress play button\nto start preview.\nFiles will be saved in:\n%1", capturefile)));
@@ -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);
 }
@@ -399,10 +386,13 @@ void RecMonitor::slotStopCapture()
         QTimer::singleShot(1000, m_captureProcess, SLOT(kill()));
         break;
     case BLACKMAGIC:
-        m_bmCapture->stopPreview();
+        if (m_captureDevice) {
+            m_captureDevice->stop();
+        }
+        //m_bmCapture->stopPreview();
         m_playAction->setEnabled(true);
         m_stopAction->setEnabled(false);
-        m_recAction->setEnabled(false);
+        m_recAction->setEnabled(true);
         break;
     default:
         break;
@@ -434,8 +424,8 @@ void RecMonitor::slotStartCapture(bool play)
     MltVideoProfile profile;
     QString producer;
     QStringList dvargs = KdenliveSettings::dvgrabextra().simplified().split(" ", QString::SkipEmptyParts);
-    video_capture->setVisible(device_selector->currentIndex() == BLACKMAGIC);
-    video_frame->setHidden(device_selector->currentIndex() == BLACKMAGIC);
+    //video_capture->setVisible(device_selector->currentIndex() == BLACKMAGIC);
+    //video_frame->setHidden(device_selector->currentIndex() == BLACKMAGIC);
 
     switch (device_selector->currentIndex()) {
     case FIREWIRE:
@@ -485,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();
         }
@@ -509,7 +500,26 @@ void RecMonitor::slotStartCapture(bool play)
         m_captureProcess->start("ffmpeg", m_captureArgs);*/
         break;
     case BLACKMAGIC:
-        m_bmCapture->startPreview(KdenliveSettings::hdmi_capturedevice(), KdenliveSettings::hdmi_capturemode());
+        path = KdenliveSettings::current_profile();
+        m_manager->activateMonitor("record");
+        if (m_captureDevice == NULL) {
+            m_captureDevice = new MltDeviceCapture(path, m_videoBox, this);
+            m_captureDevice->sendFrameForAnalysis = m_analyse;
+            m_manager->updateScopeSource();
+        }
+        profile = ProfilesDialog::getVideoProfile(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);
+            
+        } else {
+            m_videoBox->setHidden(false);
+            m_playAction->setEnabled(false);
+            m_stopAction->setEnabled(true);
+        }
+        //m_bmCapture->startPreview(KdenliveSettings::decklink_capturedevice(), KdenliveSettings::hdmi_capturemode());
         m_playAction->setEnabled(false);
         m_stopAction->setEnabled(true);
         m_recAction->setEnabled(true);
@@ -529,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);
@@ -558,7 +553,9 @@ void RecMonitor::slotRecord()
             m_recAction->setChecked(false);
             break;
         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);
@@ -584,9 +581,10 @@ void RecMonitor::slotRecord()
     }
     if (m_captureProcess->state() == QProcess::NotRunning) {
         m_recAction->setChecked(true);
-        QString extension = "mp4";
+        QString extension = "mpg";
         if (device_selector->currentIndex() == SCREENGRAB) extension = "ogv"; //KdenliveSettings::screengrabextension();
         else if (device_selector->currentIndex() == VIDEO4LINUX) extension = KdenliveSettings::v4l_extension();
+        else if (device_selector->currentIndex() == BLACKMAGIC) extension = KdenliveSettings::decklink_extension();
         QString path = KUrl(m_capturePath).path(KUrl::AddTrailingSlash) + "capture0000." + extension;
         int i = 1;
         while (QFile::exists(path)) {
@@ -633,7 +631,7 @@ void RecMonitor::slotRecord()
 
             playlist.append("</tractor></mlt>");
 
-            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;
             }
@@ -651,6 +649,33 @@ void RecMonitor::slotRecord()
             kDebug() << "Capture: Running ffmpeg " << m_captureArgs.join(" ");
             m_captureProcess->start("ffmpeg", m_captureArgs);*/
             break;
+            
+        case BLACKMAGIC:
+            path = KdenliveSettings::current_profile();
+            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("<producer id=\"producer0\" in=\"0\" out=\"99999\"><property name=\"mlt_type\">producer</property><property name=\"length\">100000</property><property name=\"eof\">pause</property><property name=\"resource\">%1</property><property name=\"mlt_service\">decklink</property></producer>").arg(KdenliveSettings::decklink_capturedevice());
+
+            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..."));
+                slotSetInfoMessage(i18n("Failed to start capture"));
+                m_videoBox->setHidden(true);
+                m_isCapturing = false;
+                m_recAction->setChecked(false);
+            }
+            break;
+            
         case SCREENGRAB:
             switch (KdenliveSettings::rmd_capture_type()) {
             case 0:
@@ -889,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"