From 9d5d4f3acc4e27fef519365041a4a92b068692c9 Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Fri, 28 Dec 2012 15:01:52 +0100 Subject: [PATCH] Optimize seek requests --- src/customruler.cpp | 10 ++++++---- src/customtrackview.cpp | 6 ++++-- src/renderer.cpp | 14 ++++++++++++-- src/renderer.h | 3 +++ 4 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/customruler.cpp b/src/customruler.cpp index 82485665..0e5fb104 100644 --- a/src/customruler.cpp +++ b/src/customruler.cpp @@ -190,15 +190,17 @@ void CustomRuler::mouseMoveEvent(QMouseEvent * event) if (m_moveCursor == RULER_CURSOR) { QPoint diff = event->pos() - m_clickPoint; if (m_mouseMove == NO_MOVE) { - if (!KdenliveSettings::verticalzoom() || qAbs(diff.x()) >= QApplication::startDragDistance()) { + if (qAbs(diff.x()) >= QApplication::startDragDistance()) { m_mouseMove = HORIZONTAL_MOVE; - } else if (qAbs(diff.y()) >= QApplication::startDragDistance()) { + } else if (KdenliveSettings::verticalzoom() && qAbs(diff.y()) >= QApplication::startDragDistance()) { m_mouseMove = VERTICAL_MOVE; } else return; } if (m_mouseMove == HORIZONTAL_MOVE) { - m_view->seekCursorPos(pos); - m_view->slotCheckPositionScrolling(); + if (pos != m_lastSeekPosition && pos != m_view->cursorPos()) { + m_view->seekCursorPos(pos); + m_view->slotCheckPositionScrolling(); + } } else { int verticalDiff = m_startRate - (diff.y()) / 7; if (verticalDiff != m_rate) emit adjustZoom(verticalDiff); diff --git a/src/customtrackview.cpp b/src/customtrackview.cpp index 21488660..84513036 100644 --- a/src/customtrackview.cpp +++ b/src/customtrackview.cpp @@ -731,8 +731,10 @@ void CustomTrackView::mouseMoveEvent(QMouseEvent * event) if (event->buttons() != Qt::NoButton && event->modifiers() == Qt::NoModifier) { QGraphicsView::mouseMoveEvent(event); m_moveOpMode = SEEK; - seekCursorPos(mappedXPos); - slotCheckPositionScrolling(); + if (mappedXPos != m_document->renderer()->getCurrentSeekPosition() && mappedXPos != cursorPos()) { + seekCursorPos(mappedXPos); + slotCheckPositionScrolling(); + } return; } else m_moveOpMode = NONE; } diff --git a/src/renderer.cpp b/src/renderer.cpp index 6fbc63d7..6ba456ff 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -53,8 +53,8 @@ static void kdenlive_callback(void* /*ptr*/, int level, const char* fmt, va_list vl) { -// kDebug() << "log level" << level << QString().vsprintf(fmt, vl).simplified(); if (level > MLT_LOG_ERROR) return; + //kDebug() << "log level" << level << QString().vsprintf(fmt, vl).simplified(); QString error; QApplication::postEvent(qApp->activeWindow(), new MltErrorEvent(error.vsprintf(fmt, vl).simplified())); va_end(vl); @@ -429,6 +429,7 @@ void Render::seek(int time) m_mltProducer->seek(time); if (m_paused && !externalConsumer) { m_mltConsumer->set("refresh", 1); + m_paused = false; } else if (m_mltProducer->get_speed() == 0) { // workaround specific bug in MLT's SDL consumer @@ -1775,6 +1776,12 @@ void Render::emitFrameUpdated(Mlt::Frame& frame) emit frameUpdated(qimage.rgbSwapped()); } +int Render::getCurrentSeekPosition() const +{ + if (requestedSeekPosition != SEEK_INACTIVE) return requestedSeekPosition; + return (int) m_mltProducer->position(); +} + void Render::emitFrameNumber() { int currentPos = m_mltConsumer->position(); @@ -1783,7 +1790,10 @@ void Render::emitFrameNumber() if (requestedSeekPosition != SEEK_INACTIVE) { m_mltConsumer->purge(); m_mltProducer->seek(requestedSeekPosition); - if (m_mltProducer->get_speed() == 0) m_mltConsumer->set("refresh", 1); + if (m_mltProducer->get_speed() == 0 && m_paused) { + m_paused = false; + m_mltConsumer->set("refresh", 1); + } requestedSeekPosition = SEEK_INACTIVE; } } diff --git a/src/renderer.h b/src/renderer.h index 0955b243..3d05de8e 100644 --- a/src/renderer.h +++ b/src/renderer.h @@ -329,7 +329,10 @@ Q_OBJECT public: static bool getBlackMagicOutputDeviceList(KComboBox *devicelist, bool force = false); /** @brief Frame rendering is handeled by Kdenlive, don't show video through SDL display */ void disablePreview(bool disable); + /** @brief Get current seek pos requested of SEEK_INACTIVE if we are not currently seeking */ int requestedSeekPosition; + /** @brief Get current seek pos requested of current producer pos if not seeking */ + int getCurrentSeekPosition() const; QSemaphore showFrameSemaphore; bool externalConsumer; -- 2.39.2