]> git.sesse.net Git - kdenlive/blobdiff - src/recmonitor.cpp
Fix proxy and various other things when using libav instead of ffmpeg
[kdenlive] / src / recmonitor.cpp
index 8988df994501fa58ee04cde38725c5d5840244b5..d2e78941dbd737bf81e21c44971a476885f1b4c3 100644 (file)
 #include <QDir>
 
 
-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;
@@ -93,20 +89,20 @@ RecMonitor::RecMonitor(QString name, MonitorManager *manager, QWidget *parent) :
     m_recAction = toolbar->addAction(KIcon("media-record"), i18n("Record"));
     connect(m_recAction, SIGNAL(triggered()), this, SLOT(slotRecord()));
     m_recAction->setCheckable(true);
-    
+
     rec_options->setIcon(KIcon("system-run"));
     QMenu *menu = new QMenu(this);
     m_addCapturedClip = new QAction(i18n("Add Captured File to Project"), this);
     m_addCapturedClip->setCheckable(true);
     m_addCapturedClip->setChecked(true);
     menu->addAction(m_addCapturedClip);
-    
+
     rec_audio->setChecked(KdenliveSettings::v4l_captureaudio());
     rec_video->setChecked(KdenliveSettings::v4l_capturevideo());
-    
+
     m_previewSettings = new QAction(i18n("Recording Preview"), this);
     m_previewSettings->setCheckable(true);
-    
+
 
     rec_options->setMenu(menu);
     menu->addAction(m_previewSettings);
@@ -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)
 {
-    return m_name;
+    if (!KdenliveSettings::openglmonitors() && videoBox && videoBox->isVisible()) {
+        videoBox->switchFullScreen();
+        event->accept();
+    }
+}
+
+void RecMonitor::slotSwitchFullScreen()
+{
+    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,34 +498,33 @@ void RecMonitor::slotStartPreview(bool play)
         break;
     case VIDEO4LINUX:
         path = KStandardDirs::locateLocal("appdata", "profiles/video4linux");
-        m_manager->activateMonitor("record");
         buildMltDevice(path);
         profile = ProfilesDialog::getVideoProfile(path);
         producer = getV4lXmlPlaylist(profile);
-        
+
         //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)) {
             // 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);
             m_stopAction->setEnabled(true);
             m_isPlaying = true;
         }
-        
+
         break;
     case BLACKMAGIC:
         path = KdenliveSettings::current_profile();
-        m_manager->activateMonitor("record");
+        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);
             m_stopAction->setEnabled(true);
@@ -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,15 +598,15 @@ void RecMonitor::slotRecord()
 
         switch (device_selector->currentIndex()) {
         case VIDEO4LINUX:
-            m_manager->activateMonitor("record");
+            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);
 
             v4lparameters = KdenliveSettings::v4l_parameters();
-            
+
             // TODO: when recording audio only, allow param configuration?
             if (!rec_video->isChecked()) v4lparameters.clear();
 
@@ -623,35 +638,35 @@ void RecMonitor::slotRecord()
                     v4lparameters = QString(v4lparameters.section("acodec", 0, 0) + "an=1 " + endParam).simplified();
                 }
             }
-            
+
             showPreview = m_previewSettings->isChecked();
             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);
                 m_previewSettings->setEnabled(false);
             }
             else {
-                video_frame->setText(i18n("Failed to start Video4Linux,\ncheck your parameters..."));                
-                m_videoBox->setHidden(true);
+                video_frame->setText(i18n("Failed to start Video4Linux,\ncheck your parameters..."));
+                videoBox->setHidden(true);
                 m_isCapturing = false;
             }
             break;
-            
+
         case BLACKMAGIC:
-            m_manager->activateMonitor("record");
+            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("<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()), 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,11 +676,11 @@ 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:
@@ -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 {
@@ -731,13 +746,13 @@ void RecMonitor::slotRecord()
 }
 
 const QString RecMonitor::getV4lXmlPlaylist(MltVideoProfile profile) {
-    
+
     QString playlist = QString("<mlt title=\"capture\" LC_NUMERIC=\"C\"><profile description=\"v4l\" width=\"%1\" height=\"%2\" progressive=\"%3\" sample_aspect_num=\"%4\" sample_aspect_den=\"%5\" display_aspect_num=\"%6\" display_aspect_den=\"%7\" frame_rate_num=\"%8\" frame_rate_den=\"%9\" colorspace=\"%10\"/>").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("<producer id=\"producer0\" in=\"0\" out=\"999999\"><property name=\"mlt_type\">producer</property><property name=\"length\">1000000</property><property name=\"eof\">loop</property><property name=\"resource\">video4linux2:%1?width:%2&amp;height:%3&amp;frame_rate:%4</property><property name=\"mlt_service\">avformat-novalidate</property></producer><playlist id=\"playlist0\"><entry producer=\"producer0\" in=\"0\" out=\"999999\"/></playlist>").arg(KdenliveSettings::video4vdevice()).arg(profile.width).arg(profile.height).arg((double) profile.frame_rate_num / profile.frame_rate_den));
     }
-    
+
     if (rec_audio->isChecked()) {
         playlist.append(QString("<producer id=\"producer1\" in=\"0\" out=\"999999\"><property name=\"mlt_type\">producer</property><property name=\"length\">1000000</property><property name=\"eof\">loop</property><property name=\"resource\">alsa:%5</property><property name=\"audio_index\">0</property><property name=\"video_index\">-1</property><property name=\"mlt_service\">avformat-novalidate</property></producer><playlist id=\"playlist1\"><entry producer=\"producer1\" in=\"0\" out=\"999999\"/></playlist>").arg(KdenliveSettings::v4l_alsadevicename()));
     }
@@ -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) {
@@ -859,7 +874,7 @@ void RecMonitor::manageCapturedFiles()
                     if (QFile::rename(url.path(), newUrl)) {
                         url = KUrl(newUrl);
                     }
-                    
+
                 }
                 capturedFiles.append(url);
             }
@@ -869,7 +884,7 @@ void RecMonitor::manageCapturedFiles()
     kDebug() << capturedFiles;
 
     if (capturedFiles.count() > 0) {
-        ManageCapturesDialog *d = new ManageCapturesDialog(capturedFiles, this);
+        QPointer<ManageCapturesDialog> 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"