]> git.sesse.net Git - kdenlive/commitdiff
* Cleanup monitor / MLT communication
authorJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 4 Jan 2010 23:11:44 +0000 (23:11 +0000)
committerJean-Baptiste Mardelle <jb@kdenlive.org>
Mon, 4 Jan 2010 23:11:44 +0000 (23:11 +0000)
* Change MLT video driver without restarting Kdenlive

svn path=/trunk/kdenlive/; revision=4202

src/customtrackview.cpp
src/customtrackview.h
src/mainwindow.cpp
src/monitor.cpp
src/monitor.h
src/monitormanager.cpp
src/monitormanager.h
src/renderer.cpp
src/renderer.h
src/smallruler.cpp
src/smallruler.h

index 5b27c2f1ae5cb1cfde58d2687729efdfa5981d21..7e5b0329290ad129355c05243a9d274bb6dfd70d 100644 (file)
@@ -670,7 +670,7 @@ void CustomTrackView::mousePressEvent(QMouseEvent * event)
 
     // special cases (middle click button or ctrl / shift click
     if (event->button() == Qt::MidButton) {
-        m_document->renderer()->switchPlay();
+        emit playMonitor();
         m_blockRefresh = false;
         m_operationMode = NONE;
         return;
index aaa0a9fb3d87a4856a33dd9cf34cb7cfe34ed52b..1c3e33a91a9e27e318b146b0ee2bae49bd5e755a 100644 (file)
@@ -297,6 +297,7 @@ signals:
     void doTrackLock(int, bool);
     void updateClipMarkers(DocClipBase *);
     void updateTrackHeaders();
+    void playMonitor();
 };
 
 #endif
index 7edb8a6e7527a4187be5a7e56debeceb3a390456..4a6375497733639b43960629e1961ece2ef34b85 100644 (file)
@@ -1450,9 +1450,8 @@ void MainWindow::newFile(bool showProjectSettings, bool force)
     m_timelineArea->addTab(trackView, KIcon("kdenlive"), doc->description());
     if (!ok) {
         // MLT is broken
-        m_timelineArea->setEnabled(false);
-        m_projectList->setEnabled(false);
-        m_monitorManager->slotBlockMonitors();
+        //m_timelineArea->setEnabled(false);
+        //m_projectList->setEnabled(false);
         slotPreferences(6);
         return;
     }
@@ -1940,6 +1939,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
             disconnect(m_activeTimeline->projectView(), SIGNAL(clipItemSelected(ClipItem*, int)), this, SLOT(slotActivateEffectStackView()));
             disconnect(m_activeTimeline->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), m_transitionConfig, SLOT(slotTransitionItemSelected(Transition*, int, QPoint, bool)));
             disconnect(m_activeTimeline->projectView(), SIGNAL(transitionItemSelected(Transition*, int, QPoint, bool)), this, SLOT(slotActivateTransitionView(Transition *)));
+            disconnect(m_activeTimeline->projectView(), SIGNAL(playMonitor()), m_projectMonitor, SLOT(slotPlay()));
             disconnect(m_zoomSlider, SIGNAL(valueChanged(int)), m_activeTimeline, SLOT(slotChangeZoom(int)));
             disconnect(m_activeTimeline->projectView(), SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType)));
             disconnect(m_activeTimeline->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, const int)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, QPoint, const int)));
@@ -2016,6 +2016,7 @@ void MainWindow::connectDocument(TrackView *trackView, KdenliveDoc *doc)   //cha
     connect(trackView->projectView(), SIGNAL(displayMessage(const QString&, MessageType)), m_messageLabel, SLOT(setMessage(const QString&, MessageType)));
 
     connect(trackView->projectView(), SIGNAL(showClipFrame(DocClipBase *, QPoint, const int)), m_clipMonitor, SLOT(slotSetXml(DocClipBase *, QPoint, const int)));
+    connect(trackView->projectView(), SIGNAL(playMonitor()), m_projectMonitor, SLOT(slotPlay()));
 
 
     connect(m_effectStack, SIGNAL(updateClipEffect(ClipItem*, QDomElement, QDomElement, int)), trackView->projectView(), SLOT(slotUpdateClipEffect(ClipItem*, QDomElement, QDomElement, int)));
index 95ea7c088e7fec3957115c7b9404dac370fa66e1..ffa5d9efc833fb3b17cb397cf84669dc46b5b2ec 100644 (file)
@@ -152,9 +152,7 @@ Monitor::Monitor(QString name, MonitorManager *manager, QString profile, QWidget
 
     connect(m_ruler, SIGNAL(seekRenderer(int)), this, SLOT(slotSeek(int)));
     connect(render, SIGNAL(durationChanged(int)), this, SLOT(adjustRulerSize(int)));
-    connect(render, SIGNAL(rendererPosition(int)), this, SLOT(seekCursor(int)));
     connect(render, SIGNAL(rendererStopped(int)), this, SLOT(rendererStopped(int)));
-    connect(render, SIGNAL(blockMonitors()), this, SIGNAL(blockMonitors()));
 
     //render->createVideoXWindow(m_ui.video_frame->winId(), -1);
 
@@ -510,7 +508,9 @@ bool Monitor::isActive() const
 
 void Monitor::activateMonitor()
 {
-    if (!m_isActive) m_monitorManager->slotSwitchMonitors(); //m_monitorManager->activateMonitor(m_name);
+    if (!m_isActive) {
+        m_monitorManager->slotSwitchMonitors();
+    }
 }
 
 void Monitor::setTimePos(const QString &pos)
@@ -560,7 +560,7 @@ void Monitor::slotStart()
     activateMonitor();
     render->play(0);
     render->seekToFrame(0);
-    emit renderPosition(0);
+    //emit renderPosition(0);
 }
 
 void Monitor::slotEnd()
@@ -568,7 +568,7 @@ void Monitor::slotEnd()
     activateMonitor();
     render->play(0);
     render->seekToFrame(render->getLength());
-    emit renderPosition(render->seekFramePosition());
+    //emit renderPosition(render->seekFramePosition());
 }
 
 void Monitor::slotZoneStart()
@@ -630,10 +630,11 @@ void Monitor::slotForwardOneFrame(int diff)
 void Monitor::seekCursor(int pos)
 {
     activateMonitor();
-    checkOverlay();
-    if (m_frametimecode) m_timePos->setText(QString::number(pos));
-    else m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(pos));
-    m_ruler->slotNewValue(pos);
+    if (m_ruler->slotNewValue(pos)) {
+        checkOverlay();
+        if (m_frametimecode) m_timePos->setText(QString::number(pos));
+        else m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(pos));
+    }
 }
 
 void Monitor::rendererStopped(int pos)
@@ -645,11 +646,14 @@ void Monitor::rendererStopped(int pos)
             return;
         }
     }
-    m_ruler->slotNewValue(pos);
-    checkOverlay();
-    if (m_frametimecode) m_timePos->setText(QString::number(pos));
-    else m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(pos));
+    if (m_ruler->slotNewValue(pos)) {
+        checkOverlay();
+        if (m_frametimecode) m_timePos->setText(QString::number(pos));
+        else m_timePos->setText(m_monitorManager->timecode().getTimecodeFromFrames(pos));
+    }
+    disconnect(m_playAction, SIGNAL(triggered()), this, SLOT(slotPlay()));
     m_playAction->setChecked(false);
+    connect(m_playAction, SIGNAL(triggered()), this, SLOT(slotPlay()));
     m_playAction->setIcon(m_playIcon);
 }
 
@@ -679,15 +683,15 @@ void Monitor::adjustRulerSize(int length)
 void Monitor::stop()
 {
     m_isActive = false;
+    disconnect(render, SIGNAL(rendererPosition(int)), this, SLOT(seekCursor(int)));
     if (render) render->stop();
-    //kDebug()<<"/// MONITOR RENDER STOP";
 }
 
 void Monitor::start()
 {
     m_isActive = true;
     if (render) render->start();
-    //kDebug()<<"/// MONITOR RENDER START";
+    connect(render, SIGNAL(rendererPosition(int)), this, SLOT(seekCursor(int)));
 }
 
 void Monitor::refreshMonitor(bool visible)
@@ -755,7 +759,7 @@ void Monitor::slotSetXml(DocClipBase *clip, QPoint zone, const int position)
         updateMarkers(clip);
         if (render->setProducer(clip->producer(), position) == -1) {
             // MLT CONSUMER is broken
-            emit blockMonitors();
+            kdWarning() << "ERROR, Cannot start monitor";
         }
     } else if (position != -1) render->seek(GenTime(position, m_monitorManager->timecode().fps()));
     if (!zone.isNull()) {
index aacf233df2c754866c35413a6dfacd6851f628f7..f246af70d1b8645b75b9e56e627d3788032b0874 100644 (file)
@@ -174,7 +174,6 @@ signals:
     void adjustMonitorSize();
     void zoneUpdated(QPoint);
     void saveZone(Render *, QPoint);
-    void blockMonitors();
 };
 
 #endif
index 6ec9e8381dd875d56d59da45802ddff4cee51112..b8827fac124f51932505a4aaf4d4661ce843f7e3 100644 (file)
@@ -44,8 +44,6 @@ void MonitorManager::initMonitors(Monitor *clipMonitor, Monitor *projectMonitor)
 {
     m_clipMonitor = clipMonitor;
     m_projectMonitor = projectMonitor;
-    connect(m_clipMonitor, SIGNAL(blockMonitors()), this, SLOT(slotBlockMonitors()));
-    connect(m_projectMonitor, SIGNAL(blockMonitors()), this, SLOT(slotBlockMonitors()));
 }
 
 void MonitorManager::activateMonitor(QString name)
@@ -174,17 +172,5 @@ void MonitorManager::slotResetProfiles()
     //m_projectMonitor->refreshMonitor(true);
 }
 
-void MonitorManager::slotBlockMonitors()
-{
-    m_blocked = true;
-    if (m_clipMonitor) {
-        m_clipMonitor->blockSignals(true);
-        m_clipMonitor->setEnabled(false);
-    }
-    if (m_projectMonitor) {
-        m_projectMonitor->blockSignals(true);
-        m_projectMonitor->setEnabled(false);
-    }
-}
 
 #include "monitormanager.moc"
index bddda6b20d16ccb07fecc58d66bc2c263f923df5..7a7a42f090b611e96efd0dfbb2651a55d5ba17ec 100644 (file)
@@ -51,7 +51,6 @@ public slots:
     void slotStart();
     void slotEnd();
     void slotResetProfiles();
-    void slotBlockMonitors();
     void slotSwitchMonitors();
 
 private:
index 830488e8ea880f3be2929a4d726de53a817bd409..8ca08514e914f847d2d8f7558d0831deff5ac1dc 100644 (file)
@@ -65,10 +65,11 @@ static void consumer_frame_show(mlt_consumer, Render * self, mlt_frame frame_ptr
 #endif
 
     self->emitFrameNumber(mlt_frame_get_position(frame_ptr));
-    if (frame.get_double("_speed") == 0.0) self->emitConsumerStopped();
-    else if (frame.get_double("_speed") < 0.0 && mlt_frame_get_position(frame_ptr) <= 0) {
-       self->pause();
-       self->emitConsumerStopped();
+    if (frame.get_double("_speed") == 0.0) {
+        self->emitConsumerStopped();
+    } else if (frame.get_double("_speed") < 0.0 && mlt_frame_get_position(frame_ptr) <= 0) {
+        self->pause();
+        self->emitConsumerStopped();
     }
 }
 
@@ -244,17 +245,21 @@ void Render::buildConsumer(const QString profileName)
 
 int Render::resetProfile(const QString profileName)
 {
-    if (!m_mltConsumer) return 0;
-    if (m_activeProfile == profileName) {
-        kDebug() << "reset to same profile, nothing to do";
-        return 1;
+    if (m_mltConsumer) {
+        QString videoDriver = KdenliveSettings::videodrivername();
+        QString currentDriver = m_mltConsumer->get("video_driver");
+        if (getenv("SDL_VIDEO_YUV_HWACCEL") != NULL && currentDriver == "x11") currentDriver = "x11_noaccel";
+        if (m_activeProfile == profileName && currentDriver == videoDriver) {
+            kDebug() << "reset to same profile, nothing to do";
+            return 1;
+        }
+
+        if (m_isSplitView) slotSplitView(false);
+        if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
+        m_mltConsumer->purge();
+        delete m_mltConsumer;
+        m_mltConsumer = NULL;
     }
-    kDebug() << "// RESETTING PROFILE FROM: " << m_activeProfile << " TO: " << profileName; //KdenliveSettings::current_profile();
-    if (m_isSplitView) slotSplitView(false);
-    if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop();
-    m_mltConsumer->purge();
-    delete m_mltConsumer;
-    m_mltConsumer = NULL;
     QString scene = sceneList();
     int pos = 0;
     double current_fps = m_mltProfile->fps();
@@ -908,7 +913,7 @@ int Render::setProducer(Mlt::Producer *producer, int position)
 
     m_fps = m_mltProducer->get_fps();
     int error = connectPlaylist();
-    
+
     if (position != -1) {
         m_mltProducer->seek(position);
         emit rendererPosition(position);
@@ -934,16 +939,15 @@ int Render::setSceneList(QString playlist, int position)
 
     kDebug() << "//////  RENDER, SET SCENE LIST: " << playlist;
 
-    if (m_mltConsumer == NULL) {
+    if (m_mltConsumer) {
+        if (!m_mltConsumer->is_stopped()) {
+            m_mltConsumer->stop();
+        }
+        m_mltConsumer->set("refresh", 0);
+    } else {
         kWarning() << "///////  ERROR, TRYING TO USE NULL MLT CONSUMER";
-        m_isBlocked = false;
-        return -1;
-    }
-
-    if (!m_mltConsumer->is_stopped()) {
-        m_mltConsumer->stop();
+        error = -1;
     }
-    m_mltConsumer->set("refresh", 0);
 
     if (m_mltProducer) {
         m_mltProducer->set_speed(0);
@@ -1136,9 +1140,8 @@ int Render::connectPlaylist()
     if (m_mltConsumer->start() == -1) {
         // ARGH CONSUMER BROKEN!!!!
         KMessageBox::error(qApp->activeWindow(), i18n("Could not create the video preview window.\nThere is something wrong with your Kdenlive install or your driver settings, please fix it."));
-        emit blockMonitors();
-        delete m_mltProducer;
-        m_mltProducer = NULL;
+        delete m_mltConsumer;
+        m_mltConsumer = NULL;
         return -1;
     }
     emit durationChanged(m_mltProducer->get_playtime());
@@ -1205,10 +1208,8 @@ void Render::start()
     if (m_mltConsumer && m_mltConsumer->is_stopped()) {
         kDebug() << "-----  MONITOR: " << m_name << " WAS STOPPED";
         if (m_mltConsumer->start() == -1) {
-            KMessageBox::error(qApp->activeWindow(), i18n("Could not create the video preview window.\nThere is something wrong with your Kdenlive install or your driver settings, please fix it."));
-            emit blockMonitors();
-            delete m_mltProducer;
-            m_mltProducer = NULL;
+            //KMessageBox::error(qApp->activeWindow(), i18n("Could not create the video preview window.\nThere is something wrong with your Kdenlive install or your driver settings, please fix it."));
+            kdWarning() << "/ / / / CANNOT START MONITOR";
         } else {
             kDebug() << "-----  MONITOR: " << m_name << " REFRESH";
             m_isBlocked = false;
@@ -1262,8 +1263,10 @@ void Render::pause()
     m_isBlocked = true;
     m_mltConsumer->set("refresh", 0);
     m_mltProducer->set_speed(0.0);
+    /*
+    The 2 lines below create a flicker loop
     emit rendererPosition(m_framePosition);
-    m_mltProducer->seek(m_framePosition);
+    m_mltProducer->seek(m_framePosition);*/
     m_mltConsumer->purge();
 }
 
@@ -1280,7 +1283,7 @@ void Render::switchPlay()
         m_isBlocked = true;
         m_mltConsumer->set("refresh", 0);
         m_mltProducer->set_speed(0.0);
-        emit rendererPosition(m_framePosition);
+        //emit rendererPosition(m_framePosition);
         m_mltProducer->seek(m_framePosition);
         m_mltConsumer->purge();
         //kDebug()<<" *********  RENDER PAUSE: "<<m_mltProducer->get_speed();
@@ -1403,9 +1406,7 @@ void Render::setDropFrames(bool show)
         m_mltConsumer->set("play.real_time", dropFrames);
 #endif
         if (m_mltConsumer->start() == -1) {
-            emit blockMonitors();
-            delete m_mltProducer;
-            m_mltProducer = NULL;
+            kdWarning() << "ERROR, Cannot start monitor";
         }
 
     }
index f390d6ef652f0836b3407847383a1bc4d1c34e82..66b7022f7f1165bff3d43a2d51a0a3071099f919 100644 (file)
@@ -294,7 +294,6 @@ signals:   // Signals
     void rendererStopped(int);
     void removeInvalidClip(const QString &, bool replaceProducer);
     void refreshDocumentProducers();
-    void blockMonitors();
     /** Used on OS X - emitted when a frame's image is to be shown. */
     void showImageSignal(QImage);
 
index c002c5c46c4a03978b4d592595ca2ac49023a019..f138b972c5e11275439720f9d4fc484b78e4e27b 100644 (file)
@@ -121,16 +121,17 @@ void SmallRuler::mouseMoveEvent(QMouseEvent * event)
     }
 }
 
-void SmallRuler::slotNewValue(int value)
+bool SmallRuler::slotNewValue(int value)
 {
     m_cursorFramePosition = value;
     int oldPos = m_cursorPosition;
     m_cursorPosition = value * m_scale;
-    if (oldPos == m_cursorPosition) return;
+    if (oldPos == m_cursorPosition) return false;
     const int offset = 6;
     const int x = qMin(oldPos, m_cursorPosition);
     const int w = qAbs(oldPos - m_cursorPosition);
     update(x - offset, 4, w + 2 * offset, 6);
+    return true;
 }
 
 //virtual
index fc0956d40d787a2c4d85e315be7f69690974249e..ea506bc1046bccb634dadb89c16a0e86e31ce055 100644 (file)
@@ -58,7 +58,7 @@ private:
     void updatePixmap();
 
 public slots:
-    void slotNewValue(int value);
+    bool slotNewValue(int value);
 
 signals:
     void seekRenderer(int);