From ffbd98f8303b09f3fd4f7cf2c74c20080c7fd115 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Mon, 4 Jan 2010 23:11:44 +0000 Subject: [PATCH] * Cleanup monitor / MLT communication * Change MLT video driver without restarting Kdenlive svn path=/trunk/kdenlive/; revision=4202 --- src/customtrackview.cpp | 2 +- src/customtrackview.h | 1 + src/mainwindow.cpp | 7 ++-- src/monitor.cpp | 36 +++++++++++---------- src/monitor.h | 1 - src/monitormanager.cpp | 14 -------- src/monitormanager.h | 1 - src/renderer.cpp | 71 +++++++++++++++++++++-------------------- src/renderer.h | 1 - src/smallruler.cpp | 5 +-- src/smallruler.h | 2 +- 11 files changed, 66 insertions(+), 75 deletions(-) diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 5b27c2f1..7e5b0329 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -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; diff --git a/src/customtrackview.h b/src/customtrackview.h index aaa0a9fb..1c3e33a9 100644 --- a/src/customtrackview.h +++ b/src/customtrackview.h @@ -297,6 +297,7 @@ signals: void doTrackLock(int, bool); void updateClipMarkers(DocClipBase *); void updateTrackHeaders(); + void playMonitor(); }; #endif diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 7edb8a6e..4a637549 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -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))); diff --git a/src/monitor.cpp b/src/monitor.cpp index 95ea7c08..ffa5d9ef 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -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()) { diff --git a/src/monitor.h b/src/monitor.h index aacf233d..f246af70 100644 --- a/src/monitor.h +++ b/src/monitor.h @@ -174,7 +174,6 @@ signals: void adjustMonitorSize(); void zoneUpdated(QPoint); void saveZone(Render *, QPoint); - void blockMonitors(); }; #endif diff --git a/src/monitormanager.cpp b/src/monitormanager.cpp index 6ec9e838..b8827fac 100644 --- a/src/monitormanager.cpp +++ b/src/monitormanager.cpp @@ -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" diff --git a/src/monitormanager.h b/src/monitormanager.h index bddda6b2..7a7a42f0 100644 --- a/src/monitormanager.h +++ b/src/monitormanager.h @@ -51,7 +51,6 @@ public slots: void slotStart(); void slotEnd(); void slotResetProfiles(); - void slotBlockMonitors(); void slotSwitchMonitors(); private: diff --git a/src/renderer.cpp b/src/renderer.cpp index 830488e8..8ca08514 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -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: "<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"; } } diff --git a/src/renderer.h b/src/renderer.h index f390d6ef..66b7022f 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -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); diff --git a/src/smallruler.cpp b/src/smallruler.cpp index c002c5c4..f138b972 100644 --- a/src/smallruler.cpp +++ b/src/smallruler.cpp @@ -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 diff --git a/src/smallruler.h b/src/smallruler.h index fc0956d4..ea506bc1 100644 --- a/src/smallruler.h +++ b/src/smallruler.h @@ -58,7 +58,7 @@ private: void updatePixmap(); public slots: - void slotNewValue(int value); + bool slotNewValue(int value); signals: void seekRenderer(int); -- 2.39.2