Skip to content

Commit

Permalink
Cleanup seeking logic, get rid of confusing blue bar indicating real …
Browse files Browse the repository at this point in the history
…MLT position, pause on seek
  • Loading branch information
j-b-m committed Nov 27, 2019
1 parent 0672d74 commit 1cf58f6
Show file tree
Hide file tree
Showing 21 changed files with 153 additions and 266 deletions.
4 changes: 2 additions & 2 deletions src/core.cpp
Expand Up @@ -713,8 +713,8 @@ Mlt::Profile *Core::thumbProfile()

int Core::getTimelinePosition() const
{
if (m_mainWindow && m_guiConstructed) {
return m_mainWindow->getCurrentTimeline()->controller()->timelinePosition();
if (m_guiConstructed) {
return m_monitorManager->projectMonitor()->position();
}
return 0;
}
Expand Down
2 changes: 1 addition & 1 deletion src/mainwindow.cpp
Expand Up @@ -346,7 +346,7 @@ void MainWindow::init()
case ObjectType::TimelineClip:
case ObjectType::TimelineComposition:
case ObjectType::Master:
getCurrentTimeline()->controller()->setPosition(pos);
m_projectMonitor->requestSeek(pos);
break;
case ObjectType::BinClip:
m_clipMonitor->requestSeek(pos);
Expand Down
65 changes: 13 additions & 52 deletions src/monitor/glwidget.cpp
Expand Up @@ -130,7 +130,6 @@ GLWidget::GLWidget(int id, QObject *parent)

registerTimelineItems();
m_proxy = new MonitorProxy(this);
connect(m_proxy, &MonitorProxy::seekRequestChanged, this, &GLWidget::requestSeek);
rootContext()->setContextProperty("controller", m_proxy);
}

Expand Down Expand Up @@ -645,42 +644,20 @@ void GLWidget::wheelEvent(QWheelEvent *event)
event->accept();
}

void GLWidget::requestSeek()
void GLWidget::requestSeek(int position)
{
if (!m_producer) {
return;
}
if (m_proxy->seeking()) {
m_producer->seek(m_proxy->seekPosition());
if (!qFuzzyIsNull(m_producer->get_speed())) {
m_consumer->purge();
}
if (m_consumer->is_stopped()) {
m_consumer->start();
}
m_consumer->set("refresh", 1);
m_producer->seek(position);
if (!qFuzzyIsNull(m_producer->get_speed())) {
m_consumer->purge();
}
}

void GLWidget::seek(int pos)
{
if (!m_proxy->seeking()) {
m_producer->seek(pos);
if (m_consumer->is_stopped()) {
m_consumer->start();
} else {
m_consumer->purge();
m_consumer->set("refresh", 1);
}
if (m_consumer->is_stopped()) {
m_consumer->start();
}
m_proxy->setSeekPosition(pos);
m_consumer->set("refresh", 1);
}

void GLWidget::requestRefresh()
{
if (m_proxy->seeking()) {
return;
}
if (m_producer && qFuzzyIsNull(m_producer->get_speed())) {
m_refreshTimer.start();
}
Expand All @@ -694,9 +671,6 @@ QString GLWidget::frameToTime(int frames) const
void GLWidget::refresh()
{
m_refreshTimer.stop();
if (m_proxy->seeking()) {
return;
}
QMutexLocker locker(&m_mltMutex);
if (m_consumer->is_stopped()) {
m_consumer->start();
Expand All @@ -707,19 +681,10 @@ void GLWidget::refresh()
bool GLWidget::checkFrameNumber(int pos, int offset)
{
emit consumerPosition(pos);
if (!m_proxy->setPosition(pos)) {
emit seekPosition(m_proxy->seekOrCurrentPosition());
}
const double speed = m_producer->get_speed();
if (m_proxy->seeking()) {
m_producer->set_speed(0);
m_producer->seek(m_proxy->seekPosition());
if (qFuzzyIsNull(speed)) {
m_consumer->set("refresh", 1);
} else {
m_producer->set_speed(speed);
}
return true;
bool isPlaying = !qFuzzyIsNull(speed);
if (isPlaying) {
m_proxy->positionFromConsumer(pos);
}
int maxPos = m_producer->get_int("out");
if (m_isLoopMode || m_isZoneMode) {
Expand Down Expand Up @@ -951,7 +916,7 @@ int GLWidget::setProducer(const std::shared_ptr<Mlt::Producer> &producer, bool i
if (isActive) {
startConsumer();
}
m_proxy->requestSeekPosition(position > 0 ? position : m_producer->position());
m_proxy->setPosition(position > 0 ? position : m_producer->position());
return error;
}

Expand Down Expand Up @@ -1301,7 +1266,7 @@ void GLWidget::purgeCache()
{
if (m_consumer) {
m_consumer->purge();
m_producer->seek(m_proxy->position() + 1);
m_producer->seek(m_proxy->getPosition() + 1);
}
}

Expand Down Expand Up @@ -1639,7 +1604,6 @@ void GLWidget::refreshSceneLayout()

void GLWidget::switchPlay(bool play, double speed)
{
m_proxy->setSeekPosition(-1);
if (!m_producer || !m_consumer) {
return;
}
Expand Down Expand Up @@ -1668,7 +1632,6 @@ bool GLWidget::playZone(bool loop)
pCore->displayMessage(i18n("Select a zone to play"), InformationMessage, 500);
return false;
}
m_proxy->setSeekPosition(-1);
m_producer->seek(m_proxy->zoneIn());
m_producer->set_speed(0);
m_consumer->purge();
Expand All @@ -1689,7 +1652,6 @@ bool GLWidget::loopClip()
pCore->displayMessage(i18n("Select a zone to play"), InformationMessage, 500);
return false;
}
m_proxy->setSeekPosition(-1);
m_producer->seek(0);
m_producer->set_speed(0);
m_consumer->purge();
Expand Down Expand Up @@ -1721,7 +1683,7 @@ MonitorProxy *GLWidget::getControllerProxy()

int GLWidget::getCurrentPos() const
{
return m_proxy->seeking() ? m_proxy->seekPosition() : m_consumer->position();
return m_consumer->position();
}

void GLWidget::setRulerInfo(int duration, const std::shared_ptr<MarkerListModel> &model)
Expand Down Expand Up @@ -1756,7 +1718,6 @@ void GLWidget::startConsumer()
void GLWidget::stop()
{
m_refreshTimer.stop();
m_proxy->setSeekPosition(-1);
// why this lock?
QMutexLocker locker(&m_mltMutex);
if (m_producer) {
Expand Down
5 changes: 2 additions & 3 deletions src/monitor/glwidget.h
Expand Up @@ -151,8 +151,8 @@ class GLWidget : public QQuickView, protected QOpenGLFunctions
QString frameToTime(int frames) const;

public slots:
void seek(int pos);
void requestSeek();
//void seek(int pos);
void requestSeek(int position);
void setZoom(float zoom);
void setOffsetX(int x, int max);
void setOffsetY(int y, int max);
Expand Down Expand Up @@ -182,7 +182,6 @@ public slots:
void lockMonitor(bool);
void passKeyEvent(QKeyEvent *);
void panView(const QPoint &diff);
void seekPosition(int);
void consumerPosition(int);
void activateMonitor();

Expand Down
42 changes: 27 additions & 15 deletions src/monitor/monitor.cpp
Expand Up @@ -156,7 +156,8 @@ Monitor::Monitor(Kdenlive::MonitorId id, MonitorManager *manager, QWidget *paren
m_glMonitor = new GLWidget((int)id);
connect(m_glMonitor, &GLWidget::passKeyEvent, this, &Monitor::doKeyPressEvent);
connect(m_glMonitor, &GLWidget::panView, this, &Monitor::panView);
connect(m_glMonitor, &GLWidget::seekPosition, this, &Monitor::seekPosition, Qt::DirectConnection);
connect(m_glMonitor->getControllerProxy(), &MonitorProxy::requestSeek, this, &Monitor::processSeek, Qt::DirectConnection);
connect(m_glMonitor, &GLWidget::consumerPosition, this, &Monitor::seekPosition, Qt::DirectConnection);
connect(m_glMonitor, &GLWidget::consumerPosition, this, &Monitor::slotSeekPosition);
connect(m_glMonitor, &GLWidget::activateMonitor, this, &AbstractMonitor::slotActivateMonitor, Qt::DirectConnection);
m_videoWidget = QWidget::createWindowContainer(qobject_cast<QWindow *>(m_glMonitor));
Expand Down Expand Up @@ -614,20 +615,20 @@ void Monitor::setGuides(const QMap<double, QString> &guides)
void Monitor::slotSeekToPreviousSnap()
{
if (m_controller) {
m_glMonitor->seek(getSnapForPos(true).frames(m_monitorManager->timecode().fps()));
m_glMonitor->getControllerProxy()->setPosition(getSnapForPos(true).frames(m_monitorManager->timecode().fps()));
}
}

void Monitor::slotSeekToNextSnap()
{
if (m_controller) {
m_glMonitor->seek(getSnapForPos(false).frames(m_monitorManager->timecode().fps()));
m_glMonitor->getControllerProxy()->setPosition(getSnapForPos(false).frames(m_monitorManager->timecode().fps()));
}
}

int Monitor::position()
{
return m_glMonitor->getCurrentPos();
return m_glMonitor->getControllerProxy()->getPosition();
}

GenTime Monitor::getSnapForPos(bool previous)
Expand Down Expand Up @@ -947,7 +948,7 @@ void Monitor::slotMouseSeek(int eventDelta, uint modifiers)
if (eventDelta > 0) {
delta = 0 - delta;
}
m_glMonitor->seek(m_glMonitor->getCurrentPos() - delta);
m_glMonitor->getControllerProxy()->setPosition(m_glMonitor->getCurrentPos() - delta);
} else if ((modifiers & Qt::AltModifier) != 0u) {
if (eventDelta >= 0) {
emit seekToPreviousSnap();
Expand Down Expand Up @@ -1082,7 +1083,7 @@ void Monitor::slotSeek()
void Monitor::slotSeek(int pos)
{
slotActivateMonitor();
m_glMonitor->seek(pos);
m_glMonitor->getControllerProxy()->setPosition(pos);
m_monitorManager->cleanMixer();
}

Expand Down Expand Up @@ -1128,13 +1129,13 @@ int Monitor::getZoneEnd()
void Monitor::slotZoneStart()
{
slotActivateMonitor();
m_glMonitor->getControllerProxy()->pauseAndSeek(m_glMonitor->getControllerProxy()->zoneIn());
m_glMonitor->getControllerProxy()->setPosition(m_glMonitor->getControllerProxy()->zoneIn());
}

void Monitor::slotZoneEnd()
{
slotActivateMonitor();
m_glMonitor->getControllerProxy()->pauseAndSeek(m_glMonitor->getControllerProxy()->zoneOut() - 1);
m_glMonitor->getControllerProxy()->setPosition(m_glMonitor->getControllerProxy()->zoneOut() - 1);
}

void Monitor::slotRewind(double speed)
Expand Down Expand Up @@ -1170,13 +1171,13 @@ void Monitor::slotForward(double speed)
void Monitor::slotRewindOneFrame(int diff)
{
slotActivateMonitor();
m_glMonitor->seek(m_glMonitor->getCurrentPos() - diff);
m_glMonitor->getControllerProxy()->setPosition(m_glMonitor->getCurrentPos() - diff);
}

void Monitor::slotForwardOneFrame(int diff)
{
slotActivateMonitor();
m_glMonitor->seek(m_glMonitor->getCurrentPos() + diff);
m_glMonitor->getControllerProxy()->setPosition(m_glMonitor->getCurrentPos() + diff);
}

void Monitor::adjustRulerSize(int length, const std::shared_ptr<MarkerListModel> &markerModel)
Expand Down Expand Up @@ -2036,12 +2037,18 @@ void Monitor::panView(QPoint diff)
}
}

void Monitor::requestSeek(int pos)
void Monitor::processSeek(int pos)
{
m_glMonitor->seek(pos);
pause();
m_glMonitor->requestSeek(pos);
m_monitorManager->cleanMixer();
}

void Monitor::requestSeek(int pos)
{
m_glMonitor->getControllerProxy()->setPosition(pos);
}

void Monitor::setProducer(std::shared_ptr<Mlt::Producer> producer, int pos)
{
m_glMonitor->setProducer(std::move(producer), isActive(), pos);
Expand All @@ -2062,17 +2069,17 @@ void Monitor::slotStart()
{
slotActivateMonitor();
m_glMonitor->switchPlay(false);
m_glMonitor->seek(0);
m_glMonitor->getControllerProxy()->setPosition(0);
}

void Monitor::slotEnd()
{
slotActivateMonitor();
m_glMonitor->switchPlay(false);
if (m_id == Kdenlive::ClipMonitor) {
m_glMonitor->seek(m_glMonitor->duration());
m_glMonitor->getControllerProxy()->setPosition(m_glMonitor->duration());
} else {
m_glMonitor->seek(pCore->projectDuration() - 1);
m_glMonitor->getControllerProxy()->setPosition(pCore->projectDuration() - 1);
}
}

Expand Down Expand Up @@ -2115,3 +2122,8 @@ void Monitor::updateBgColor()
{
m_glMonitor->m_bgColor = KdenliveSettings::window_background();
}

MonitorProxy *Monitor::getControllerProxy()
{
return m_glMonitor->getControllerProxy();
}
7 changes: 5 additions & 2 deletions src/monitor/monitor.h
Expand Up @@ -45,6 +45,7 @@ class RecManager;
class QmlManager;
class GLWidget;
class MonitorAudioLevel;
class MonitorProxy;

namespace Mlt {
class Profile;
Expand Down Expand Up @@ -153,6 +154,8 @@ class Monitor : public AbstractMonitor
void setConsumerProperty(const QString &name, const QString &value);
/** @brief Play or Loop zone sets a fake "out" on the producer. It is necessary to reset this before reloading the producer */
void resetPlayOrLoopZone(const QString &binId);
/** @brief Returns a pointer to monitor proxy, allowing to manage seek and consumer position */
MonitorProxy *getControllerProxy();

protected:
void mousePressEvent(QMouseEvent *event) override;
Expand Down Expand Up @@ -263,6 +266,8 @@ private slots:
void slotSeekPosition(int);
void addSnapPoint(int pos);
void removeSnapPoint(int pos);
/** @brief Pause monitor and process seek */
void processSeek(int pos);

public slots:
void slotSetScreen(int screenIndex);
Expand Down Expand Up @@ -324,8 +329,6 @@ public slots:
void screenChanged(int screenIndex);
void seekPosition(int pos);
void updateScene();
/** @brief Request a timeline seeking if diff is true, position is a relative offset, otherwise an absolute position */
void seekTimeline(int position);
void durationChanged(int);
void refreshClipThumbnail(const QString &);
void zoneUpdated(const QPoint &);
Expand Down

1 comment on commit 1cf58f6

@Bartoloni
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

On windows i'm not able anymore to place clips on project bin (kdenlive freezes) the loading bar is not appearing (sometimes appears but without an animation) .. the thumbnail of the clip is all gray.
not sure that this happens after these changes... but yesterday build is working fine.

Please sign in to comment.