From b473496bdd6f2b4b07c0d13af2077cf9126abd9d Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Mardelle Date: Tue, 25 Dec 2012 01:28:50 +0100 Subject: [PATCH] Fix freeze / crash introduced by recent commit when seeking outside clip range --- src/monitor.cpp | 2 +- src/renderer.cpp | 15 +++++++-------- src/smallruler.cpp | 4 ++-- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/monitor.cpp b/src/monitor.cpp index 7c2f5b85..d0f24fcf 100644 --- a/src/monitor.cpp +++ b/src/monitor.cpp @@ -52,7 +52,7 @@ Monitor::Monitor(Kdenlive::MONITORID id, MonitorManager *manager, QString profil m_currentClip(NULL), m_overlay(NULL), m_scale(1), - m_length(0), + m_length(2), m_dragStarted(false), m_contextMenu(NULL), m_effectWidget(NULL), diff --git a/src/renderer.cpp b/src/renderer.cpp index 6ad95641..96c22f5b 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -421,12 +421,15 @@ void Render::seek(GenTime time) void Render::seek(int time) { resetZoneMode(); + time = qMax(0, time); + time = qMin(m_mltProducer->get_playtime(), time); if (requestedSeekPosition == SEEK_INACTIVE) { requestedSeekPosition = time; m_mltProducer->seek(time); //m_mltConsumer->purge(); if (m_paused && !externalConsumer) { - refresh(); + m_mltConsumer->set("refresh", 1); + //refresh(); } } else requestedSeekPosition = time; @@ -1235,9 +1238,7 @@ void Render::refreshConsumerDisplay() m_mltConsumer->set("refresh", 1); // Make sure the first frame is displayed, otherwise if we change producer too fast // We can crash the avformat producer - Mlt::Event *ev = m_mltConsumer->setup_wait_for("consumer-frame-show"); - m_mltConsumer->wait_for(ev); - delete ev; + m_mltConsumer->wait_for("consumer-frame-show"); } int Render::setSceneList(QDomDocument list, int position) @@ -1326,6 +1327,7 @@ int Render::setSceneList(QString playlist, int position) m_mltProducer = m_blackClip->cut(0, 1); error = -1; } + m_mltProducer->set("eof", "pause"); checkMaxThreads(); int volume = KdenliveSettings::volume(); m_mltProducer->set("meta.volume", (double)volume / 100); @@ -1710,8 +1712,8 @@ void Render::refresh() return; if (m_mltConsumer) { if (m_mltConsumer->is_stopped()) m_mltConsumer->start(); - //m_mltConsumer->purge(); refreshConsumerDisplay(); + //m_mltConsumer->purge(); } } @@ -1778,9 +1780,6 @@ void Render::emitFrameNumber() emit rendererPosition(currentPos); if (requestedSeekPosition != SEEK_INACTIVE) { m_mltProducer->seek(requestedSeekPosition); - if (m_paused) { - refresh(); - } requestedSeekPosition = SEEK_INACTIVE; } } diff --git a/src/smallruler.cpp b/src/smallruler.cpp index 776743b0..0e035bc0 100644 --- a/src/smallruler.cpp +++ b/src/smallruler.cpp @@ -34,8 +34,7 @@ SmallRuler::SmallRuler(MonitorManager *manager, Render *render, QWidget *parent) : QWidget(parent) ,m_cursorFramePosition(0) - ,m_scale(1) - ,m_maxval(25) + ,m_maxval(2) ,m_manager(manager) ,m_render(render) ,m_lastSeekPosition(SEEK_INACTIVE) @@ -48,6 +47,7 @@ SmallRuler::SmallRuler(MonitorManager *manager, Render *render, QWidget *parent) setMouseTracking(true); setMinimumHeight(10); + adjustScale(m_maxval); } -- 2.39.2