]> git.sesse.net Git - kdenlive/commitdiff
Cleanup: remove duplicate monitor code, allow fullscreen for record monitor
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 14 Mar 2012 13:59:56 +0000 (14:59 +0100)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Wed, 14 Mar 2012 13:59:56 +0000 (14:59 +0100)
17 files changed:
src/abstractmonitor.cpp
src/abstractmonitor.h
src/geometrywidget.cpp
src/mainwindow.cpp
src/mainwindow.h
src/mltdevicecapture.cpp
src/mltdevicecapture.h
src/monitor.cpp
src/monitor.h
src/monitoreditwidget.cpp
src/monitoreditwidget.h
src/monitormanager.cpp
src/monitormanager.h
src/recmonitor.cpp
src/recmonitor.h
src/stopmotion/stopmotion.cpp
src/stopmotion/stopmotion.h

index 8ba3527bdcdd2807a37b00dc5d8b076fc8816e98..02ed9a99ddc9304ade7c0e3035acac75f44c53d0 100644 (file)
 
 #include "abstractmonitor.h"
 #include "kdenlivesettings.h"
+#include "monitormanager.h"
 
 #include <KDebug>
 
 #include <QPaintEvent>
+#include <QDesktopWidget>
 
-VideoPreviewContainer::VideoPreviewContainer(QWidget *parent) :
-    QFrame(parent),
-    m_dar(1.0),
-    m_refresh(false)
-{
-    setFrameShape(QFrame::NoFrame);
-    setFocusPolicy(Qt::ClickFocus);
-    setAttribute(Qt::WA_PaintOnScreen);
-    setAttribute(Qt::WA_OpaquePaintEvent);
-    setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
-    connect(&m_refreshTimer, SIGNAL(timeout()), this, SLOT(update()));
-    m_refreshTimer.setSingleShot(false);
-    m_refreshTimer.setInterval(200);
-}
 
-VideoPreviewContainer::~VideoPreviewContainer()
+AbstractMonitor::AbstractMonitor(Kdenlive::MONITORID id, MonitorManager *manager, QWidget *parent): 
+    QWidget(parent),
+    m_id(id),
+    m_monitorManager(manager)
+{}
+
+bool AbstractMonitor::isActive() const
 {
-    qDeleteAll(m_imageQueue);
+    return m_monitorManager->isActive(m_id);
 }
 
-//virtual
-void VideoPreviewContainer::resizeEvent( QResizeEvent * /*event*/ )
+bool AbstractMonitor::slotActivateMonitor()
 {
-    updateDisplayZone();
+    return m_monitorManager->activateMonitor(m_id);
 }
 
-void VideoPreviewContainer::setRatio(double ratio)
+VideoContainer::VideoContainer(AbstractMonitor* monitor, QWidget *parent) :
+    QFrame(parent)
+    , m_monitor(monitor)
 {
-    m_dar = ratio;
-    updateDisplayZone();
+    setFrameShape(QFrame::NoFrame);
+    setFocusPolicy(Qt::ClickFocus);
+    setAttribute(Qt::WA_PaintOnScreen);
+    setAttribute(Qt::WA_OpaquePaintEvent);
+    //setEnabled(false);
+    setContentsMargins(0, 0, 0, 0);
+    setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
 }
 
-
-void VideoPreviewContainer::updateDisplayZone()
+// virtual
+void VideoContainer::mouseReleaseEvent(QMouseEvent * event)
 {
-    QRect rect = this->frameRect();
-    int paintW = rect.height() * m_dar + 0.5;
-    if (paintW > rect.width()) {
-        int paintH = rect.width() / m_dar + 0.5;
-        int diff = (rect.height() - paintH)  / 2;
-        rect.adjust(0, diff, 0, 0);
-        rect.setHeight(paintH);
-    }
-    else {
-        int diff = (rect.width() - paintW)  / 2;
-        rect.adjust(diff, 0, 0, 0);
-        rect.setWidth(paintW);
+    if (event->button() != Qt::RightButton) {
+        if (m_monitor->isActive()) {
+            m_monitor->slotPlay();
+        }
     }
-    m_displayRect = rect;
-    m_refresh = true;
 }
 
-void VideoPreviewContainer::setImage(QImage img)
+// virtual
+void VideoContainer::keyPressEvent(QKeyEvent *event)
 {
-    if (m_imageQueue.count() > 2) {
-        delete m_imageQueue.takeLast();
-    }
-    m_imageQueue.prepend(new QImage(img));
-    update();
+    // Exit fullscreen with Esc key
+    if (event->key() == Qt::Key_Escape && isFullScreen()) {
+        switchFullScreen();
+        event->setAccepted(true);
+    } else event->setAccepted(false);
 }
 
-void VideoPreviewContainer::stop()
+// virtual
+void VideoContainer::wheelEvent(QWheelEvent * event)
 {
-    //m_refreshTimer.stop();
-    qDeleteAll(m_imageQueue);
-    m_imageQueue.clear();
+    m_monitor->slotMouseSeek(event->delta(), event->modifiers() == Qt::ControlModifier);
+    event->accept();
 }
 
-void VideoPreviewContainer::start()
+void VideoContainer::mouseDoubleClickEvent(QMouseEvent * event)
 {
-    //m_refreshTimer.start();
+    if (!KdenliveSettings::openglmonitors())
+        switchFullScreen();
+    event->accept();
 }
 
-// virtual
-void VideoPreviewContainer::paintEvent(QPaintEvent *event)
+void VideoContainer::switchFullScreen()
 {
-    if (m_imageQueue.isEmpty()) return;
-    QImage *img = m_imageQueue.takeFirst();
-    QPainter painter(this);
-    if (m_refresh) {
-        painter.fillRect(event->rect(), QColor(KdenliveSettings::window_background()));
-        m_refresh = false;
+    // TODO: disable screensaver?
+    m_monitor->pause();
+    Qt::WindowFlags flags = windowFlags();
+    if (!isFullScreen()) {
+        // Check if we ahave a multiple monitor setup
+        setUpdatesEnabled(false);
+#if QT_VERSION >= 0x040600
+        int monitors = QApplication::desktop()->screenCount();
+#else
+        int monitors = QApplication::desktop()->numScreens();
+#endif
+        if (monitors > 1) {
+            QRect screenres;
+            // Move monitor widget to the second screen (one screen for Kdenlive, the other one for the Monitor widget
+            int currentScreen = QApplication::desktop()->screenNumber(this);
+            if (currentScreen < monitors - 1)
+                screenres = QApplication::desktop()->screenGeometry(currentScreen + 1);
+            else
+                screenres = QApplication::desktop()->screenGeometry(currentScreen - 1);
+            move(QPoint(screenres.x(), screenres.y()));
+            resize(screenres.width(), screenres.height());
+        }
+
+        m_baseFlags = flags & (Qt::Window | Qt::SubWindow);
+        flags |= Qt::Window;
+        flags ^= Qt::SubWindow;
+        setWindowFlags(flags);
+#ifdef Q_WS_X11
+        // This works around a bug with Compiz
+        // as the window must be visible before we can set the state
+        show();
+        raise();
+        setWindowState(windowState() | Qt::WindowFullScreen);   // set
+#else
+        setWindowState(windowState() | Qt::WindowFullScreen);   // set
+        setUpdatesEnabled(true);
+        show();
+#endif
+        setEnabled(true);
+    } else {
+        setUpdatesEnabled(false);
+        flags ^= (Qt::Window | Qt::SubWindow); //clear the flags...
+        flags |= m_baseFlags; //then we reset the flags (window and subwindow)
+        setWindowFlags(flags);
+        setWindowState(windowState()  ^ Qt::WindowFullScreen);   // reset
+        setUpdatesEnabled(true);
+        setEnabled(false);
+        show();
     }
-    painter.drawImage(m_displayRect, *img);
-    delete img;
+    m_monitor->unpause();
 }
-
-
index 8a6922048f745941a21f6706a6a1205738eb4d19..33154d40d969dad3dfad2921a3af32766aa255fe 100644 (file)
 
 #include <stdint.h>
 
-class VideoPreviewContainer : public QFrame
-{
-    Q_OBJECT
-public:
-    VideoPreviewContainer(QWidget *parent = 0);
-    ~VideoPreviewContainer();
-    /** @brief Set the image to be displayed, will be put in the queue. */
-    void setImage(QImage img);
-    /** @brief Start the display refresh timer. */
-    void start();
-    /** @brief Stop the display refresh timer. */
-    void stop();
-    /** @brief Set the display ratio for this display. */
-    void setRatio(double ratio);
-
-protected:
-    virtual void paintEvent(QPaintEvent */*event*/);
-    virtual void resizeEvent(QResizeEvent * event);
-
-private:
-    /** @brief The display aspect ratio for profile. */
-    double m_dar;
-    /** @brief When true, the whole widget surface will be repainted, useful when resizing widget. */
-    bool m_refresh;
-    /** @brief The rectangle defining the area for painting our image. */
-    QRect m_displayRect;
-    /** @brief The queue of images to be displayed. */
-    QList <QImage *> m_imageQueue;
-    /** @brief We refresh the image with a timer, since this widget is only for preview during capture. */
-    QTimer m_refreshTimer;
-    /** @brief Re-calculate the display zone after a resize or aspect ratio change. */
-    void updateDisplayZone();
-};
-
+class MonitorManager;
 
 
 class AbstractRender: public QObject
@@ -107,17 +74,44 @@ class AbstractMonitor : public QWidget
 {
     Q_OBJECT
 public:
-    AbstractMonitor(Kdenlive::MONITORID id, QWidget *parent = 0): QWidget(parent) {m_id = id;};
+    AbstractMonitor(Kdenlive::MONITORID id, MonitorManager *manager, QWidget *parent = 0);
     Kdenlive::MONITORID id() {return m_id;};
     virtual ~AbstractMonitor() {};
     virtual AbstractRender *abstractRender() = 0;
-
+    virtual void pause() = 0;
+    virtual void unpause() = 0;
+    bool isActive() const;
+    
 public slots:
     virtual void stop() = 0;
     virtual void start() = 0;
+    virtual void slotPlay() = 0;
+    virtual void slotMouseSeek(int eventDelta, bool fast) = 0;
+    bool slotActivateMonitor();
+    virtual void slotSwitchFullScreen() = 0;
 
 protected:
     Kdenlive::MONITORID m_id;
+    MonitorManager *m_monitorManager;
 };
 
+class VideoContainer : public QFrame
+{
+    Q_OBJECT
+public:
+    VideoContainer(AbstractMonitor *monitor, QWidget *parent = 0);
+    void switchFullScreen();
+
+protected:
+    virtual void mouseDoubleClickEvent(QMouseEvent * event);
+    virtual void mouseReleaseEvent(QMouseEvent *event);
+    void keyPressEvent(QKeyEvent *event);
+    virtual void wheelEvent(QWheelEvent * event);
+
+private:
+    Qt::WindowFlags m_baseFlags;
+    AbstractMonitor *m_monitor;
+};
+
+
 #endif
index 9cc3a27325a28806720808015b563d45e936b19d..66bc4e983191cb9ef08cf991f6fec3f9ecdc4192 100644 (file)
@@ -573,7 +573,6 @@ void GeometryWidget::slotUpdateGeometry()
             geom->insert(item2);
         }
     }
-    
     emit parameterChanged();
 }
 
index 5dd50a74b10dfd043e2ea9014c45b4e56f01a149..9baff75036b7183fa03642a99f99801f7e8e7940 100644 (file)
@@ -224,7 +224,7 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString &
 
     // Connect the project list
     connect(m_projectList, SIGNAL(clipSelected(DocClipBase *, QPoint, bool)), m_clipMonitor, SLOT(slotSetClipProducer(DocClipBase *, QPoint, bool)));
-    connect(m_projectList, SIGNAL(raiseClipMonitor()), m_clipMonitor, SLOT(activateMonitor()));
+    connect(m_projectList, SIGNAL(raiseClipMonitor()), m_clipMonitor, SLOT(slotActivateMonitor()));
     connect(m_projectList, SIGNAL(loadingIsOver()), this, SLOT(slotElapsedTime()));
     connect(m_projectList, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int)));
     connect(m_projectList, SIGNAL(updateRenderStatus()), this, SLOT(slotCheckRenderStatus()));
@@ -566,8 +566,6 @@ MainWindow::MainWindow(const QString &MltPath, const KUrl & Url, const QString &
 
     connect(m_projectMonitorDock, SIGNAL(visibilityChanged(bool)), m_projectMonitor, SLOT(refreshMonitor(bool)));
     connect(m_clipMonitorDock, SIGNAL(visibilityChanged(bool)), m_clipMonitor, SLOT(refreshMonitor(bool)));
-    //connect(m_monitorManager, SIGNAL(checkColorScopes()), this, SLOT(slotUpdateColorScopes()));
-    //connect(m_monitorManager, SIGNAL(clearScopes()), this, SLOT(slotClearColorScopes()));
     connect(m_effectList, SIGNAL(addEffect(const QDomElement)), this, SLOT(slotAddEffect(const QDomElement)));
     connect(m_effectList, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects()));
 
@@ -1277,7 +1275,7 @@ void MainWindow::setupActions()
     KAction *fullMon = collection.addAction("monitor_fullscreen");
     fullMon->setText(i18n("Switch monitor fullscreen"));
     fullMon->setIcon(KIcon("view-fullscreen"));
-    connect(fullMon, SIGNAL(triggered(bool)), this, SLOT(slotSwitchFullscreen()));
+    connect(fullMon, SIGNAL(triggered(bool)), m_monitorManager, SLOT(slotSwitchFullscreen()));
 
     KAction *insertTree = collection.addAction("insert_project_tree");
     insertTree->setText(i18n("Insert zone in project tree"));
@@ -2476,7 +2474,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
             disconnect(m_activeTimeline->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, bool, const int)), m_clipMonitor, SLOT(slotSetClipProducer(DocClipBase *, QPoint, bool, const int)));
             disconnect(m_projectList, SIGNAL(gotFilterJobResults(const QString &, int, int, const QString &, stringMap)), m_activeTimeline->projectView(), SLOT(slotGotFilterJobResults(const QString &, int, int, const QString &, stringMap)));
 
-            disconnect(m_activeTimeline, SIGNAL(cursorMoved()), m_projectMonitor, SLOT(activateMonitor()));
+            disconnect(m_activeTimeline, SIGNAL(cursorMoved()), m_projectMonitor, SLOT(slotActivateMonitor()));
             disconnect(m_activeTimeline, SIGNAL(configTrack(int)), this, SLOT(slotConfigTrack(int)));
             disconnect(m_activeDocument, SIGNAL(docModified(bool)), this, SLOT(slotUpdateDocumentState(bool)));
             disconnect(m_effectStack, SIGNAL(updateEffect(ClipItem*, int, QDomElement, QDomElement, int)), m_activeTimeline->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, int, QDomElement, QDomElement, int)));
@@ -2488,7 +2486,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
             disconnect(m_effectStack, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int)));
             disconnect(m_transitionConfig, SIGNAL(transitionUpdated(Transition *, QDomElement)), m_activeTimeline->projectView() , SLOT(slotTransitionUpdated(Transition *, QDomElement)));
             disconnect(m_transitionConfig, SIGNAL(seekTimeline(int)), m_activeTimeline->projectView() , SLOT(setCursorPos(int)));
-            disconnect(m_activeTimeline->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor()));
+            disconnect(m_activeTimeline->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(slotActivateMonitor()));
             disconnect(m_activeTimeline, SIGNAL(zoneMoved(int, int)), this, SLOT(slotZoneMoved(int, int)));
             disconnect(m_projectList, SIGNAL(loadingIsOver()), m_activeTimeline->projectView(), SLOT(slotUpdateAllThumbs()));
             disconnect(m_projectList, SIGNAL(refreshClip(const QString &)), m_activeTimeline->projectView(), SLOT(slotRefreshThumbs(const QString &)));
@@ -2567,7 +2565,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
     connect(m_effectStack, SIGNAL(reloadEffects()), this, SLOT(slotReloadEffects()));
     connect(m_effectStack, SIGNAL(displayMessage(const QString&, int)), this, SLOT(slotGotProgressInfo(const QString&, int)));
 
-    connect(trackView->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(activateMonitor()));
+    connect(trackView->projectView(), SIGNAL(activateDocumentMonitor()), m_projectMonitor, SLOT(slotActivateMonitor()));
     connect(trackView, SIGNAL(zoneMoved(int, int)), this, SLOT(slotZoneMoved(int, int)));
     connect(m_projectList, SIGNAL(loadingIsOver()), trackView->projectView(), SLOT(slotUpdateAllThumbs()));
     trackView->projectView()->setContextMenu(m_timelineContextMenu, m_timelineContextClipMenu, m_timelineContextTransitionMenu, m_clipTypeGroup, static_cast<QMenu*>(factory()->container("marker_menu", this)));
@@ -2920,7 +2918,7 @@ void MainWindow::slotRemoveSpace()
 
 void MainWindow::slotInsertTrack(int ix)
 {
-    m_projectMonitor->activateMonitor();
+    m_projectMonitor->slotActivateMonitor();
     if (m_activeTimeline) {
         if (ix == -1) ix = m_activeTimeline->projectView()->selectedTrack();
         m_activeTimeline->projectView()->slotInsertTrack(ix);
@@ -2931,7 +2929,7 @@ void MainWindow::slotInsertTrack(int ix)
 
 void MainWindow::slotDeleteTrack(int ix)
 {
-    m_projectMonitor->activateMonitor();
+    m_projectMonitor->slotActivateMonitor();
     if (m_activeTimeline) {
         if (ix == -1) ix = m_activeTimeline->projectView()->selectedTrack();
         m_activeTimeline->projectView()->slotDeleteTrack(ix);
@@ -2942,7 +2940,7 @@ void MainWindow::slotDeleteTrack(int ix)
 
 void MainWindow::slotConfigTrack(int ix)
 {
-    m_projectMonitor->activateMonitor();
+    m_projectMonitor->slotActivateMonitor();
     if (m_activeTimeline)
         m_activeTimeline->projectView()->slotConfigTracks(ix);
     if (m_activeDocument)
@@ -2951,7 +2949,7 @@ void MainWindow::slotConfigTrack(int ix)
 
 void MainWindow::slotSelectTrack()
 {
-    m_projectMonitor->activateMonitor();
+    m_projectMonitor->slotActivateMonitor();
     if (m_activeTimeline) {
         m_activeTimeline->projectView()->slotSelectClipsInTrack();
     }
@@ -2959,7 +2957,7 @@ void MainWindow::slotSelectTrack()
 
 void MainWindow::slotSelectAllTracks()
 {
-    m_projectMonitor->activateMonitor();
+    m_projectMonitor->slotActivateMonitor();
     if (m_activeTimeline)
         m_activeTimeline->projectView()->slotSelectAllClips();
 }
@@ -4247,12 +4245,6 @@ void MainWindow::slotSwitchMonitors()
     else m_projectList->focusTree();
 }
 
-void MainWindow::slotSwitchFullscreen()
-{
-    if (m_projectMonitor->isActive()) m_projectMonitor->slotSwitchFullScreen();
-    else m_clipMonitor->slotSwitchFullScreen();
-}
-
 void MainWindow::slotInsertZoneToTree()
 {
     if (!m_clipMonitor->isActive() || m_clipMonitor->activeClip() == NULL) return;
index e44456290a9c93ec361206886a8e9964c1efd3b4..9b9d2067c943ff8ca7a8b2b79adcaba183505e5f 100644 (file)
@@ -531,8 +531,6 @@ private slots:
 
     /** @brief The monitor informs that it needs (or not) to have frames sent by the renderer. */
     void slotMonitorRequestRenderFrame(bool request);
-    /** @brief Switch current monitor to fullscreen. */
-    void slotSwitchFullscreen();
     /** @brief Open the stopmotion dialog. */
     void slotOpenStopmotion();
     /** @brief Implements all the actions that are int he ActionsCollection. */
index 26dbf48d1dc2bc80fbf010f5845eba8fe456852b..419878bd6a203532885297a7293fc64cb9926d1d 100644 (file)
@@ -76,7 +76,7 @@ static void rec_consumer_frame_preview(mlt_consumer, MltDeviceCapture * self, ml
 }
 
 
-MltDeviceCapture::MltDeviceCapture(QString profile, VideoPreviewContainer *surface, QWidget *parent) :
+MltDeviceCapture::MltDeviceCapture(QString profile, VideoContainer *surface, QWidget *parent) :
     AbstractRender(Kdenlive::recordMonitor, parent),
     doCapture(0),
     sendFrameForAnalysis(false),
@@ -87,9 +87,9 @@ MltDeviceCapture::MltDeviceCapture(QString profile, VideoPreviewContainer *surfa
     m_showFrameEvent(NULL),
     m_droppedFrames(0),
     m_livePreview(KdenliveSettings::enable_recording_preview()),
-    m_captureDisplayWidget(surface),
     m_winid((int) surface->winId())
 {
+    m_captureDisplayWidget = surface;
     analyseAudio = KdenliveSettings::monitor_audio();
     if (profile.isEmpty()) profile = KdenliveSettings::current_profile();
     buildConsumer(profile);
@@ -163,12 +163,21 @@ void MltDeviceCapture::buildConsumer(const QString &profileName)
     //m_mltConsumer->set("real_time", 0);
 }
 
+void MltDeviceCapture::pause()
+{   
+    if (m_mltConsumer) {
+          m_mltConsumer->set("refresh", 0);
+         //m_mltProducer->set_speed(0.0);
+         m_mltConsumer->purge();
+    }
+}
+
 void MltDeviceCapture::stop()
 {
     m_droppedFramesTimer.stop();
     bool isPlaylist = false;
-    disconnect(this, SIGNAL(imageReady(QImage)), this, SIGNAL(frameUpdated(QImage)));
-    m_captureDisplayWidget->stop();
+    //disconnect(this, SIGNAL(imageReady(QImage)), this, SIGNAL(frameUpdated(QImage)));
+    //m_captureDisplayWidget->stop();
     
     if (m_showFrameEvent) delete m_showFrameEvent;
     m_showFrameEvent = NULL;
@@ -215,9 +224,16 @@ void MltDeviceCapture::stop()
 }
 
 
-void MltDeviceCapture::doRefresh()
+void MltDeviceCapture::slotDoRefresh()
 {
-    if (m_mltConsumer) m_mltConsumer->set("refresh", 1);
+    QMutexLocker locker(&m_mutex);
+    if (!m_mltProducer)
+        return;
+    if (m_mltConsumer) {
+        if (m_mltConsumer->is_stopped()) m_mltConsumer->start();
+        m_mltConsumer->purge();
+        m_mltConsumer->set("refresh", 1);
+    }
 }
 
 
@@ -308,7 +324,7 @@ bool MltDeviceCapture::slotStartPreview(const QString &producer, bool xmlFormat)
         return 0;
     }
     m_droppedFramesTimer.start();
-    connect(this, SIGNAL(imageReady(QImage)), this, SIGNAL(frameUpdated(QImage)));
+    //connect(this, SIGNAL(imageReady(QImage)), this, SIGNAL(frameUpdated(QImage)));
     return 1;
 }
 
@@ -343,7 +359,7 @@ void MltDeviceCapture::gotCapturedFrame(Mlt::Frame& frame)
     //memcpy(image.bits(), data, width * height * 3);
     QImage image((uchar *)data, width, height, QImage::Format_RGB888);
 
-    m_captureDisplayWidget->setImage(image);
+    //m_captureDisplayWidget->setImage(image);
 
     //TEST: is it better to process frame conversion ouside MLT???
     /*
@@ -731,7 +747,7 @@ void MltDeviceCapture::uyvy2rgb(unsigned char *yuv_buffer, int width, int height
         rgb_ptr += 3;
     }
     //emit imageReady(image);
-    m_captureDisplayWidget->setImage(image);
+    //m_captureDisplayWidget->setImage(image);
     emit unblockPreview();
     //processingImage = false;
 }
index f6fdfbe56207c8914d66b154238ab10e4d356033..27c5234636f11bf563180c67ad053d6f6f64141c 100644 (file)
@@ -50,7 +50,7 @@ Q_OBJECT public:
     /** @brief Build a MLT Renderer
      *  @param winid The parent widget identifier (required for SDL display). Set to 0 for OpenGL rendering
      *  @param profile The MLT profile used for the capture (default one will be used if empty). */
-    MltDeviceCapture(QString profile, VideoPreviewContainer *surface, QWidget *parent = 0);
+    MltDeviceCapture(QString profile, VideoContainer *surface, QWidget *parent = 0);
 
     /** @brief Destroy the MLT Renderer. */
     ~MltDeviceCapture();
@@ -80,7 +80,7 @@ Q_OBJECT public:
     void gotCapturedFrame(Mlt::Frame& frame);
     /** @brief Save current frame to file. */
     void captureFrame(const QString &path);
-    void doRefresh();
+    
     /** @brief This will add the video clip from path and add it in the overlay track. */
     void setOverlay(const QString &path);
 
@@ -92,6 +92,8 @@ Q_OBJECT public:
     
     /** @brief True if we are processing an image (yuv > rgb) when recording. */
     bool processingImage;
+    
+    void pause();
 
 private:
     Mlt::Consumer * m_mltConsumer;
@@ -106,7 +108,7 @@ private:
     int m_frameCount;
 
     /** @brief The surface onto which the captured frames should be painted. */
-    VideoPreviewContainer *m_captureDisplayWidget;
+    VideoContainer *m_captureDisplayWidget;
 
     /** @brief A human-readable description of this renderer. */
     int m_winid;
@@ -116,6 +118,8 @@ private:
     QString m_capturePath;
     
     QTimer m_droppedFramesTimer;
+    
+    QMutex m_mutex;
 
     /** @brief Build the MLT Consumer object with initial settings.
      *  @param profileName The MLT profile to use for the consumer */
@@ -146,6 +150,7 @@ public slots:
 
     /** @brief Stops the consumer. */
     void stop();
+    void slotDoRefresh();
 };
 
 #endif
index 7786b5076d2176e933159da28f65a0357dc4c1a2..9dc2aa3383e769672629166643714dcf157a4b31 100644 (file)
@@ -44,9 +44,8 @@
 
 
 Monitor::Monitor(Kdenlive::MONITORID id, MonitorManager *manager, QString profile, QWidget *parent) :
-    AbstractMonitor(id, parent),
+    AbstractMonitor(id, manager, parent),
     render(NULL),
-    m_monitorManager(manager),
     m_currentClip(NULL),
     m_ruler(new SmallRuler(m_monitorManager)),
     m_overlay(NULL),
@@ -66,8 +65,6 @@ Monitor::Monitor(Kdenlive::MONITORID id, MonitorManager *manager, QString profil
 
     // Video widget holder
     m_videoBox = new VideoContainer(this);
-    m_videoBox->setContentsMargins(0, 0, 0, 0);
-    m_videoBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
     layout->addWidget(m_videoBox, 10);
     layout->addStretch();
 
@@ -471,7 +468,7 @@ void Monitor::mouseReleaseEvent(QMouseEvent * event)
     if (m_dragStarted && event->button() != Qt::RightButton) {
         if (m_videoBox->geometry().contains(event->pos()) && (!m_effectWidget || !m_effectWidget->isVisible())) {
             if (isActive()) slotPlay();
-            else activateMonitor();
+            else slotActivateMonitor();
         } //else event->ignore(); //QWidget::mouseReleaseEvent(event);
         m_dragStarted = false;
     }
@@ -598,16 +595,6 @@ void Monitor::slotExtractCurrentFrame()
     }
 }
 
-bool Monitor::isActive() const
-{
-    return m_monitorManager->isActive(m_id);
-}
-
-bool Monitor::activateMonitor()
-{
-    return m_monitorManager->activateMonitor(m_id);
-}
-
 void Monitor::setTimePos(const QString &pos)
 {
     m_timePos->setValue(pos);
@@ -622,7 +609,7 @@ void Monitor::slotSeek()
 void Monitor::slotSeek(int pos)
 {
     if (render == NULL) return;
-    activateMonitor();
+    slotActivateMonitor();
     render->seekToFrame(pos);
 }
 
@@ -648,35 +635,35 @@ void Monitor::checkOverlay()
 
 void Monitor::slotStart()
 {
-    activateMonitor();
+    slotActivateMonitor();
     render->play(0);
     render->seekToFrame(0);
 }
 
 void Monitor::slotEnd()
 {
-    activateMonitor();
+    slotActivateMonitor();
     render->play(0);
     render->seekToFrame(render->getLength());
 }
 
 void Monitor::slotZoneStart()
 {
-    activateMonitor();
+    slotActivateMonitor();
     render->play(0);
     render->seekToFrame(m_ruler->zone().x());
 }
 
 void Monitor::slotZoneEnd()
 {
-    activateMonitor();
+    slotActivateMonitor();
     render->play(0);
     render->seekToFrame(m_ruler->zone().y());
 }
 
 void Monitor::slotRewind(double speed)
 {
-    activateMonitor();
+    slotActivateMonitor();
     if (speed == 0) {
         double currentspeed = render->playSpeed();
         if (currentspeed >= 0) render->play(-2);
@@ -688,7 +675,7 @@ void Monitor::slotRewind(double speed)
 
 void Monitor::slotForward(double speed)
 {
-    activateMonitor();
+    slotActivateMonitor();
     if (speed == 0) {
         double currentspeed = render->playSpeed();
         if (currentspeed <= 1) render->play(2);
@@ -700,21 +687,21 @@ void Monitor::slotForward(double speed)
 
 void Monitor::slotRewindOneFrame(int diff)
 {
-    activateMonitor();
+    slotActivateMonitor();
     render->play(0);
     render->seekToFrameDiff(-diff);
 }
 
 void Monitor::slotForwardOneFrame(int diff)
 {
-    activateMonitor();
+    slotActivateMonitor();
     render->play(0);
     render->seekToFrameDiff(diff);
 }
 
 void Monitor::seekCursor(int pos)
 {
-    //activateMonitor();
+    //slotActivateMonitor();
     if (m_ruler->slotNewValue(pos)) {
         checkOverlay();
         m_timePos->setValue(pos);
@@ -754,7 +741,7 @@ void Monitor::start()
 void Monitor::refreshMonitor(bool visible)
 {
     if (visible && render) {
-        if (!activateMonitor()) {
+        if (!slotActivateMonitor()) {
             // the monitor was already active, simply refreshClipThumbnail
             render->doRefresh();
         }
@@ -771,16 +758,20 @@ void Monitor::refreshMonitor()
 void Monitor::pause()
 {
     if (render == NULL) return;
-    activateMonitor();
+    slotActivateMonitor();
     render->pause();
     //m_playAction->setChecked(true);
     m_playAction->setIcon(m_playIcon);
 }
 
+void Monitor::unpause()
+{
+}
+
 void Monitor::slotPlay()
 {
     if (render == NULL) return;
-    activateMonitor();
+    slotActivateMonitor();
     if (render->playSpeed() == 0.0) {
         m_playAction->setIcon(m_pauseIcon);
         render->switchPlay(true);
@@ -793,7 +784,7 @@ void Monitor::slotPlay()
 void Monitor::slotPlayZone()
 {
     if (render == NULL) return;
-    activateMonitor();
+    slotActivateMonitor();
     QPoint p = m_ruler->zone();
     render->playZone(GenTime(p.x(), m_monitorManager->timecode().fps()), GenTime(p.y(), m_monitorManager->timecode().fps()));
     //m_playAction->setChecked(true);
@@ -803,7 +794,7 @@ void Monitor::slotPlayZone()
 void Monitor::slotLoopZone()
 {
     if (render == NULL) return;
-    activateMonitor();
+    slotActivateMonitor();
     QPoint p = m_ruler->zone();
     render->loopZone(GenTime(p.x(), m_monitorManager->timecode().fps()), GenTime(p.y(), m_monitorManager->timecode().fps()));
     //m_playAction->setChecked(true);
@@ -814,7 +805,7 @@ void Monitor::slotLoopClip()
 {
     if (render == NULL || m_selectedClip == NULL)
         return;
-    activateMonitor();
+    slotActivateMonitor();
     render->loopZone(m_selectedClip->startPos(), m_selectedClip->endPos());
     //m_playAction->setChecked(true);
     m_playAction->setIcon(m_pauseIcon);
@@ -839,7 +830,7 @@ void Monitor::slotSetClipProducer(DocClipBase *clip, QPoint zone, bool forceUpda
 
     if (clip != m_currentClip || forceUpdate) {
         m_currentClip = clip;
-        if (m_currentClip) activateMonitor();
+        if (m_currentClip) slotActivateMonitor();
         updateMarkers(clip);
         Mlt::Producer *prod = NULL;
         if (clip) prod = clip->getCloneProducer();
@@ -849,7 +840,7 @@ void Monitor::slotSetClipProducer(DocClipBase *clip, QPoint zone, bool forceUpda
         }
     } else {
         if (m_currentClip) {
-            activateMonitor();
+            slotActivateMonitor();
             if (position == -1) position = render->seekFramePosition();
             render->seek(position);
         }
@@ -863,7 +854,7 @@ void Monitor::slotSetClipProducer(DocClipBase *clip, QPoint zone, bool forceUpda
 void Monitor::slotOpenFile(const QString &file)
 {
     if (render == NULL) return;
-    activateMonitor();
+    slotActivateMonitor();
     QDomDocument doc;
     QDomElement mlt = doc.createElement("mlt");
     doc.appendChild(mlt);
@@ -887,7 +878,7 @@ void Monitor::resetProfile(const QString &profile)
     m_timePos->updateTimeCode(m_monitorManager->timecode());
     if (render == NULL) return;
     if (!render->hasProfile(profile)) {
-        activateMonitor();
+        slotActivateMonitor();
         render->resetProfile(profile);
     }
     if (m_effectWidget)
@@ -1123,103 +1114,5 @@ void Overlay::setOverlayText(const QString &text, bool isZone)
     update();
 }
 
-VideoContainer::VideoContainer(Monitor* parent) :
-    QFrame()
-    , m_monitor(parent)
-{
-    setFrameShape(QFrame::NoFrame);
-    setFocusPolicy(Qt::ClickFocus);
-    setEnabled(false);
-    setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
-}
-
-// virtual
-void VideoContainer::mouseReleaseEvent(QMouseEvent * event)
-{
-    if (event->button() != Qt::RightButton) {
-        if (m_monitor->isActive()) {
-            m_monitor->slotPlay();
-        }
-    }
-}
-
-
-// virtual
-void VideoContainer::keyPressEvent(QKeyEvent *event)
-{
-    // Exit fullscreen with Esc key
-    if (event->key() == Qt::Key_Escape && isFullScreen()) {
-        switchFullScreen();
-        event->setAccepted(true);
-    } else event->setAccepted(false);
-}
-
-// virtual
-void VideoContainer::wheelEvent(QWheelEvent * event)
-{
-    m_monitor->slotMouseSeek(event->delta(), event->modifiers() == Qt::ControlModifier);
-    event->accept();
-}
-
-void VideoContainer::mouseDoubleClickEvent(QMouseEvent * event)
-{
-    if (!KdenliveSettings::openglmonitors())
-        switchFullScreen();
-    event->accept();
-}
-
-void VideoContainer::switchFullScreen()
-{
-    // TODO: disable screensaver?
-    Qt::WindowFlags flags = windowFlags();
-    if (!isFullScreen()) {
-        // Check if we ahave a multiple monitor setup
-        setUpdatesEnabled(false);
-#if QT_VERSION >= 0x040600
-        int monitors = QApplication::desktop()->screenCount();
-#else
-        int monitors = QApplication::desktop()->numScreens();
-#endif
-        if (monitors > 1) {
-            QRect screenres;
-            // Move monitor widget to the second screen (one screen for Kdenlive, the other one for the Monitor widget
-            int currentScreen = QApplication::desktop()->screenNumber(this);
-            if (currentScreen < monitors - 1)
-                screenres = QApplication::desktop()->screenGeometry(currentScreen + 1);
-            else
-                screenres = QApplication::desktop()->screenGeometry(currentScreen - 1);
-            move(QPoint(screenres.x(), screenres.y()));
-            resize(screenres.width(), screenres.height());
-        }
-
-        m_baseFlags = flags & (Qt::Window | Qt::SubWindow);
-        flags |= Qt::Window;
-        flags ^= Qt::SubWindow;
-        setWindowFlags(flags);
-#ifdef Q_WS_X11
-        // This works around a bug with Compiz
-        // as the window must be visible before we can set the state
-        show();
-        raise();
-        setWindowState(windowState() | Qt::WindowFullScreen);   // set
-#else
-        setWindowState(windowState() | Qt::WindowFullScreen);   // set
-        setUpdatesEnabled(true);
-        show();
-#endif
-        setEnabled(true);
-    } else {
-        setUpdatesEnabled(false);
-        flags ^= (Qt::Window | Qt::SubWindow); //clear the flags...
-        flags |= m_baseFlags; //then we reset the flags (window and subwindow)
-        setWindowFlags(flags);
-        setWindowState(windowState()  ^ Qt::WindowFullScreen);   // reset
-        setUpdatesEnabled(true);
-        setEnabled(false);
-        show();
-    }
-    m_monitor->pause();
-}
-
 
 #include "monitor.moc"
index 8794c89c542ed82ccb3036bec90115469d342136..3ea5da5a58df1b3db144cf8fd48326ddc0c40419 100644 (file)
@@ -48,23 +48,6 @@ class MonitorEditWidget;
 class Monitor;
 class MonitorManager;
 
-class VideoContainer : public QFrame
-{
-    Q_OBJECT
-public:
-    VideoContainer(Monitor *parent = 0);
-    void switchFullScreen();
-
-protected:
-    virtual void mouseDoubleClickEvent(QMouseEvent * event);
-    virtual void mouseReleaseEvent(QMouseEvent *event);
-    void keyPressEvent(QKeyEvent *event);
-    virtual void wheelEvent(QWheelEvent * event);
-
-private:
-    Qt::WindowFlags m_baseFlags;
-    Monitor *m_monitor;
-};
 
 class MonitorRefresh : public QWidget
 {
@@ -107,8 +90,8 @@ public:
     AbstractRender *abstractRender();
     void resetProfile(const QString &profile);
     void resetSize();
-    bool isActive() const;
     void pause();
+    void unpause();
     void setupMenu(QMenu *goMenu, QAction *playZone, QAction *loopZone, QMenu *markerMenu = NULL, QAction *loopClip = NULL);
     const QString sceneList();
     DocClipBase *activeClip();
@@ -143,7 +126,6 @@ protected:
 
 private:
     Kdenlive::MONITORID m_name;
-    MonitorManager *m_monitorManager;
     DocClipBase *m_currentClip;
     SmallRuler *m_ruler;
     Overlay *m_overlay;
@@ -209,7 +191,6 @@ public slots:
     void slotSeek(int pos);
     void stop();
     void start();
-    bool activateMonitor();
     void slotPlay();
     void slotPlayZone();
     void slotLoopZone();
index 76109ba546a3774ea92e1d0936d87f5fecc84190..8e5bd1d77024ae19e38ff4b615412d6dcff72b57 100644 (file)
 MonitorEditWidget::MonitorEditWidget(Render* renderer, QWidget* parent) :
         QWidget(parent)
 {
+    setAutoFillBackground(true);
+    setAttribute(Qt::WA_PaintOnScreen, false);
+    setAttribute(Qt::WA_OpaquePaintEvent, false);
+    setContentsMargins(0, 0, 0, 0);
+    setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::MinimumExpanding);
     m_ui.setupUi(this);
-
     m_scene = new MonitorScene(renderer);
     m_view = new QGraphicsView(m_scene, m_ui.frameVideo);
+    m_view->setFrameShape(QFrame::NoFrame);
     m_view->setRenderHints(QFlags<QPainter::RenderHint>());
     m_view->scale(((double) renderer->renderWidth()) / renderer->frameRenderWidth(), 1.0);
     m_view->setMouseTracking(true);
index 81b5a2ad547bd7888b7a6ff3a4bfd45e5adabaf7..4b52c41493fbde30b2299923b4cad2bb6d4e0489 100644 (file)
@@ -60,7 +60,7 @@ public:
 private slots:
     /** @brief Sets the KdenliveSetting directupdate with true = update parameters (rerender frame) during mouse move (before mouse button is released) */
     void slotSetDirectUpdate(bool directUpdate);
-
+    
 private:
     Ui::MonitorEditWidget_UI m_ui;
     MonitorScene *m_scene;
index aa9bdfdf3d26b415480fac68404c063803c98184..09c6c1e149d46f761aab230ffc147251a0c3dbed 100644 (file)
@@ -113,13 +113,12 @@ void MonitorManager::slotSwitchMonitors(bool activateClip)
 void MonitorManager::stopActiveMonitor()
 {
     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->pause();
-    else m_projectMonitor->pause();
+    else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->pause();
 }
 
 void MonitorManager::slotPlay()
 {
-    if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotPlay();
-    else m_projectMonitor->slotPlay();
+    if (m_activeMonitor) m_activeMonitor->slotPlay();
 }
 
 void MonitorManager::slotPause()
@@ -130,7 +129,7 @@ void MonitorManager::slotPause()
 void MonitorManager::slotPlayZone()
 {
     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotPlayZone();
-    else m_projectMonitor->slotPlayZone();
+    else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->slotPlayZone();
 }
 
 void MonitorManager::slotLoopZone()
@@ -142,49 +141,49 @@ void MonitorManager::slotLoopZone()
 void MonitorManager::slotRewind(double speed)
 {
     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotRewind(speed);
-    else m_projectMonitor->slotRewind(speed);
+    else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->slotRewind(speed);
 }
 
 void MonitorManager::slotForward(double speed)
 {
     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotForward(speed);
-    else m_projectMonitor->slotForward(speed);
+    else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->slotForward(speed);
 }
 
 void MonitorManager::slotRewindOneFrame()
 {
     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotRewindOneFrame();
-    else m_projectMonitor->slotRewindOneFrame();
+    else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->slotRewindOneFrame();
 }
 
 void MonitorManager::slotForwardOneFrame()
 {
     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotForwardOneFrame();
-    else m_projectMonitor->slotForwardOneFrame();
+    else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->slotForwardOneFrame();
 }
 
 void MonitorManager::slotRewindOneSecond()
 {
     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotRewindOneFrame(m_timecode.fps());
-    else m_projectMonitor->slotRewindOneFrame(m_timecode.fps());
+    else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->slotRewindOneFrame(m_timecode.fps());
 }
 
 void MonitorManager::slotForwardOneSecond()
 {
     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotForwardOneFrame(m_timecode.fps());
-    else m_projectMonitor->slotForwardOneFrame(m_timecode.fps());
+    else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->slotForwardOneFrame(m_timecode.fps());
 }
 
 void MonitorManager::slotStart()
 {
     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotStart();
-    else m_projectMonitor->slotStart();
+    else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->slotStart();
 }
 
 void MonitorManager::slotEnd()
 {
     if (m_activeMonitor == m_clipMonitor) m_clipMonitor->slotEnd();
-    else m_projectMonitor->slotEnd();
+    else if (m_activeMonitor == m_projectMonitor) m_projectMonitor->slotEnd();
 }
 
 void MonitorManager::resetProfiles(Timecode tc)
@@ -247,4 +246,9 @@ AbstractRender *MonitorManager::activeRenderer()
     return NULL;
 }
 
+void MonitorManager::slotSwitchFullscreen()
+{
+    if (m_activeMonitor) m_activeMonitor->slotSwitchFullScreen();
+}
+
 #include "monitormanager.moc"
index 7064a33a4d16c10f3c2b5c48a72ae674aa706391..880b6d1279a924390725468115922258b7a12e46 100644 (file)
@@ -65,6 +65,9 @@ public slots:
     void slotStart();
     void slotEnd();
     void slotResetProfiles();
+    
+    /** @brief Switch current monitor to fullscreen. */
+    void slotSwitchFullscreen();
 
     /** @brief Switches between project and clip monitor.
      * @ref activateMonitor
index b9edc9afb17cc658899e751aa5f5b35a8243f927..c24adfaef6679139686f508b3583f7d6c3d24c46 100644 (file)
 
 
 RecMonitor::RecMonitor(Kdenlive::MONITORID name, MonitorManager *manager, QWidget *parent) :
-    AbstractMonitor(name, 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)));
 
@@ -62,10 +61,8 @@ RecMonitor::RecMonitor(Kdenlive::MONITORID name, MonitorManager *manager, QWidge
     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);
+    m_videoBox = new VideoContainer(this);
+    l->addWidget(m_videoBox, 10);
     video_frame->setLayout(l);
 
     QToolBar *toolbar = new QToolBar(this);
@@ -145,7 +142,7 @@ RecMonitor::RecMonitor(Kdenlive::MONITORID name, MonitorManager *manager, QWidge
     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(m_videoBox->winId()));
     if (!videoDriver.isEmpty()) {
         if (videoDriver == "x11_noaccel") {
             env.insert("SDL_VIDEO_YUV_HWACCEL", "0");
@@ -155,7 +152,7 @@ RecMonitor::RecMonitor(Kdenlive::MONITORID name, MonitorManager *manager, QWidge
     m_displayProcess->setProcessEnvironment(env);
 #else
     QStringList env = QProcess::systemEnvironment();
-    env << "SDL_WINDOWID=" + QString::number(video_frame->winId());
+    env << "SDL_WINDOWID=" + QString::number(m_videoBox->winId());
     if (!videoDriver.isEmpty()) {
         if (videoDriver == "x11_noaccel") {
             env << "SDL_VIDEO_YUV_HWACCEL=0";
@@ -166,7 +163,7 @@ RecMonitor::RecMonitor(Kdenlive::MONITORID name, MonitorManager *manager, QWidge
 #endif
     setenv("SDL_VIDEO_ALLOW_SCREENSAVER", "1", 1);
 
-    kDebug() << "/////// BUILDING MONITOR, ID: " << video_frame->winId();
+    kDebug() << "/////// BUILDING MONITOR, ID: " << m_videoBox->winId();
     slotVideoDeviceChanged(device_selector->currentIndex());
     m_previewSettings->setChecked(KdenliveSettings::enable_recording_preview());
     connect(m_previewSettings, SIGNAL(triggered(bool)), this, SLOT(slotChangeRecordingPreview(bool)));
@@ -180,6 +177,18 @@ RecMonitor::~RecMonitor()
     if (m_captureDevice) delete m_captureDevice;
 }
 
+void RecMonitor::mouseDoubleClickEvent(QMouseEvent * event)
+{
+    if (!KdenliveSettings::openglmonitors() && m_videoBox && m_videoBox->isVisible()) {
+        m_videoBox->switchFullScreen();
+        event->accept();
+    }
+}
+
+void RecMonitor::slotSwitchFullScreen()
+{
+    m_videoBox->switchFullScreen();
+}
 
 void RecMonitor::stop()
 {
@@ -188,6 +197,7 @@ void RecMonitor::stop()
 
 void RecMonitor::start()
 {
+    //slotStartPreview(true);
 }
 
 void RecMonitor::slotConfigure()
@@ -224,10 +234,10 @@ 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
@@ -430,6 +440,7 @@ void RecMonitor::slotStartPreview(bool play)
         }
         return;
     }
+    if (m_isPlaying) return;
     m_captureArgs.clear();
     m_displayArgs.clear();
     m_isPlaying = false;
@@ -485,7 +496,7 @@ void RecMonitor::slotStartPreview(bool play)
         break;
     case VIDEO4LINUX:
         path = KStandardDirs::locateLocal("appdata", "profiles/video4linux");
-        m_manager->activateMonitor(Kdenlive::recordMonitor);
+        slotActivateMonitor();
         buildMltDevice(path);
         profile = ProfilesDialog::getVideoProfile(path);
         producer = getV4lXmlPlaylist(profile);
@@ -505,7 +516,7 @@ 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)) {
@@ -586,10 +597,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);
 
@@ -645,10 +656,10 @@ void RecMonitor::slotRecord()
             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("<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());
@@ -881,9 +892,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()
@@ -899,16 +911,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()
@@ -939,10 +950,11 @@ void RecMonitor::slotDroppedFrames(int dropped)
 void RecMonitor::buildMltDevice(const QString &path)
 {
     if (m_captureDevice == NULL) {
+       m_monitorManager->updateScopeSource();
         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();
+        m_monitorManager->updateScopeSource();
     }
 }
 
@@ -951,5 +963,27 @@ void RecMonitor::slotChangeRecordingPreview(bool enable)
     KdenliveSettings::setEnable_recording_preview(enable);
 }
 
+void RecMonitor::pause()
+{
+    if (m_isCapturing) return;
+    slotStopCapture();
+    if (m_captureDevice) {
+       m_monitorManager->clearScopeSource();
+       delete m_captureDevice;
+       m_captureDevice = NULL;
+    }
+}
+
+void RecMonitor::unpause()
+{
+    if (m_isCapturing) return;
+    slotStartPreview(true);
+}
+
+void RecMonitor::slotMouseSeek(int /*eventDelta*/, bool /*fast*/)
+{
+}
+
+
 #include "recmonitor.moc"
 
index 325d1489cfa97406affd3f5b40194f44847fa6c6..8fc2f7bdf2b5a3fbea911b9e8d62c4dff1954f06 100644 (file)
@@ -57,10 +57,13 @@ public:
 
     AbstractRender *abstractRender();
     void analyseFrames(bool analyse);
+    void pause();
+    void unpause();
     enum CAPTUREDEVICE {FIREWIRE = 0, VIDEO4LINUX = 1, SCREENGRAB = 2, BLACKMAGIC = 3};
 
 protected:
     virtual void mousePressEvent(QMouseEvent * event);
+    virtual void mouseDoubleClickEvent(QMouseEvent * event);
 
 private:
     KDateTime m_captureTime;
@@ -96,7 +99,7 @@ private:
 
     MonitorManager *m_manager;
     MltDeviceCapture *m_captureDevice;
-    VideoPreviewContainer *m_videoBox;
+    VideoContainer *m_videoBox;
     QAction *m_addCapturedClip;
     QAction *m_previewSettings;
     
@@ -133,6 +136,8 @@ public slots:
     void start();
     void slotStopCapture();
     void slotUpdateCaptureFolder(const QString &currentProjectFolder);
+    void slotMouseSeek(int eventDelta, bool fast);
+    void slotSwitchFullScreen();
 
 signals:
     void renderPosition(int);
index d858410c03ef6bf471f7f72eb98cee3887285f65..5611f2d41a10efbf511d0f9a23b04810dc532f7e 100644 (file)
@@ -93,8 +93,8 @@ void MyLabel::paintEvent(QPaintEvent* event)
 }
 
 
-StopmotionMonitor::StopmotionMonitor(QWidget *parent) :
-    AbstractMonitor(Kdenlive::stopmotionMonitor, parent),
+StopmotionMonitor::StopmotionMonitor(MonitorManager *manager, QWidget *parent) :
+    AbstractMonitor(Kdenlive::stopmotionMonitor, manager, parent),
     m_captureDevice(NULL)
 {
 }
@@ -103,6 +103,10 @@ StopmotionMonitor::~StopmotionMonitor()
 {
 }
 
+void StopmotionMonitor::slotSwitchFullScreen()
+{
+}
+
 void StopmotionMonitor::setRender(MltDeviceCapture *render)
 {
     m_captureDevice = render;
@@ -129,6 +133,22 @@ void StopmotionMonitor::start()
 {
 }
 
+void StopmotionMonitor::pause()
+{
+}
+
+void StopmotionMonitor::unpause()
+{
+}
+
+void StopmotionMonitor::slotPlay()
+{
+}
+
+void StopmotionMonitor::slotMouseSeek(int /*eventDelta*/, bool /*fast*/)
+{
+}
+
 StopmotionWidget::StopmotionWidget(MonitorManager *manager, KUrl projectFolder, QList< QAction* > actions, QWidget* parent) :
     QDialog(parent)
     , Ui::Stopmotion_UI()
@@ -138,7 +158,7 @@ StopmotionWidget::StopmotionWidget(MonitorManager *manager, KUrl projectFolder,
     , m_animatedIndex(-1)
     , m_animate(false)
     , m_manager(manager)
-    , m_monitor(new StopmotionMonitor(this))
+    , m_monitor(new StopmotionMonitor(manager, this))
 {
     //setAttribute(Qt::WA_DeleteOnClose);
     //HACK: the monitor widget is hidden, it is just used to control the capturedevice from monitormanager
@@ -246,10 +266,7 @@ StopmotionWidget::StopmotionWidget(MonitorManager *manager, KUrl projectFolder,
     QVBoxLayout *layout = new QVBoxLayout;
     layout->setContentsMargins(0, 0, 0, 0);
     layout->setSpacing(0);
-    m_videoBox = new VideoPreviewContainer();
-    m_videoBox->setContentsMargins(0, 0, 0, 0);
-    m_videoBox->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
-    //m_videoBox->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Preferred);
+    m_videoBox = new VideoContainer(m_monitor);
     m_videoBox->setLineWidth(4);
     layout->addWidget(m_videoBox);
 
@@ -885,6 +902,7 @@ void StopmotionWidget::slotSwitchMirror(bool isOn)
     if (m_captureDevice) m_captureDevice->mirror(isOn);
 }
 
+
 const QString StopmotionWidget::createProducer(MltVideoProfile profile, const QString &service, const QString &resource)
 {
     Q_UNUSED(profile)
index fb1dee8e212101e47b9d0f7b9e01f5d94ec48950..32fe04e784ca29a949f3c9ef0b14af71e2cce79a 100644 (file)
@@ -62,18 +62,23 @@ class StopmotionMonitor : public AbstractMonitor
 {
     Q_OBJECT
 public:
-    StopmotionMonitor(QWidget *parent);
+    StopmotionMonitor(MonitorManager *manager, QWidget *parent);
     ~StopmotionMonitor();
     AbstractRender *abstractRender();
     Kdenlive::MONITORID id() const;
     void setRender(MltDeviceCapture *render);
+    void pause();
+    void unpause();
 
 private:
     MltDeviceCapture *m_captureDevice;
 
 public slots:
-    virtual void stop();
-    virtual void start();
+    void stop();
+    void start();
+    void slotPlay();
+    void slotMouseSeek(int eventDelta, bool fast);
+    void slotSwitchFullScreen();
 
 signals:
     void stopCapture();
@@ -103,7 +108,7 @@ private:
     /** @brief Capture holder that will handle all video operation. */
     MltDeviceCapture *m_captureDevice;
 
-    VideoPreviewContainer *m_videoBox;
+    VideoContainer *m_videoBox;
 
     /** @brief Holds the name of the current sequence.
      * Files will be saved in project folder with name: sequence001.png */