X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=src%2Frenderer.cpp;h=a1106196a3d2df9db4778ffc6502f674efbdb136;hb=7e5766e97e9b0db202d7d85a64b7d2567f35f282;hp=d54c90e6f8d414a4d3fb72154306026d10d17f19;hpb=3b176bab2ad91159c0a4a7dbe5f278f646115218;p=kdenlive diff --git a/src/renderer.cpp b/src/renderer.cpp index d54c90e6..a1106196 100644 --- a/src/renderer.cpp +++ b/src/renderer.cpp @@ -116,7 +116,8 @@ Render::Render(Kdenlive::MONITORID rendererName, int winid, QString profile, QWi m_isLoopMode(false), m_isSplitView(false), m_blackClip(NULL), - m_winid(winid) + m_winid(winid), + m_paused(true) { qRegisterMetaType ("stringMap"); analyseAudio = KdenliveSettings::monitor_audio(); @@ -385,19 +386,20 @@ int Render::resetProfile(const QString &profileName, bool dropSceneList) void Render::seek(GenTime time) { + if (!m_mltProducer) + return; int pos = time.frames(m_fps); seek(pos); } void Render::seek(int time) { - if (!m_mltProducer) - return; + resetZoneMode(); if (requestedSeekPosition == SEEK_INACTIVE) { requestedSeekPosition = time; m_mltProducer->seek(time); //m_mltConsumer->purge(); - if (m_mltProducer->get_speed() == 0) { + if (m_paused) { refresh(); } } @@ -1162,7 +1164,9 @@ int Render::setProducer(Mlt::Producer *producer, int position) } m_mltProducer = producer; m_mltProducer->set_speed(0); - if (monitorIsActive) startConsumer(); + if (monitorIsActive) { + startConsumer(); + } emit durationChanged(m_mltProducer->get_playtime()); position = m_mltProducer->position(); emit rendererPosition(position); @@ -1535,11 +1539,11 @@ void Render::pause() requestedSeekPosition = SEEK_INACTIVE; if (!m_mltProducer || !m_mltConsumer) return; - if (m_mltProducer->get_speed() == 0.0) return; - if (m_isZoneMode) resetZoneMode(); - m_mltConsumer->set("refresh", 0); + m_paused = true; m_mltProducer->set_speed(0.0); - m_mltConsumer->purge(); + m_mltConsumer->set("refresh", 0); + if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop(); + m_mltProducer->seek(m_mltConsumer->position()); } void Render::switchPlay(bool play) @@ -1549,43 +1553,37 @@ void Render::switchPlay(bool play) if (!m_mltProducer || !m_mltConsumer) return; if (m_isZoneMode) resetZoneMode(); - if (play && m_mltProducer->get_speed() == 0.0) { + if (play && m_paused) { if (m_name == Kdenlive::clipMonitor && m_mltConsumer->position() == m_mltProducer->get_out()) m_mltProducer->seek(0); + m_paused = false; if (m_mltConsumer->is_stopped()) { m_mltConsumer->start(); } m_mltProducer->set_speed(1.0); m_mltConsumer->set("refresh", 1); } else if (!play) { + m_paused = true; m_mltProducer->set_speed(0.0); m_mltConsumer->set("refresh", 0); + if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop(); m_mltProducer->seek(m_mltConsumer->position()); - if (!m_mltConsumer->is_stopped()) m_mltConsumer->stop(); - if (m_isZoneMode) resetZoneMode(); - - //emitConsumerStopped(); - /*m_mltConsumer->set("refresh", 0); - m_mltConsumer->stop(); - m_mltConsumer->purge(); - m_mltProducer->set_speed(0.0); - //m_framePosition = m_mltProducer->position(); - m_mltProducer->seek(m_framePosition); - emit rendererPosition(m_framePosition);*/ } } void Render::play(double speed) { requestedSeekPosition = SEEK_INACTIVE; - if (!m_mltProducer) - return; + if (!m_mltProducer) return; + double current_speed = m_mltProducer->get_speed(); + if (current_speed == speed) return; + if (m_isZoneMode) resetZoneMode(); // if (speed == 0.0) m_mltProducer->set("out", m_mltProducer->get_length() - 1); m_mltProducer->set_speed(speed); - /*if (speed == 0.0) { - m_mltProducer->seek((int) m_framePosition + 1); - m_mltConsumer->purge(); - }*/ - refresh(); + if (m_mltConsumer->is_stopped() && speed != 0) { + m_mltConsumer->start(); + } + m_paused = speed == 0; + if (current_speed == 0 && speed != 0) m_mltConsumer->set("refresh", 1); } void Render::play(const GenTime & startTime) @@ -1593,6 +1591,7 @@ void Render::play(const GenTime & startTime) requestedSeekPosition = SEEK_INACTIVE; if (!m_mltProducer || !m_mltConsumer) return; + m_paused = false; m_mltProducer->seek((int)(startTime.frames(m_fps))); m_mltProducer->set_speed(1.0); m_mltConsumer->set("refresh", 1); @@ -1613,10 +1612,10 @@ void Render::playZone(const GenTime & startTime, const GenTime & stopTime) { requestedSeekPosition = SEEK_INACTIVE; if (!m_mltProducer || !m_mltConsumer) - return; - if (!m_isZoneMode) m_originalOut = m_mltProducer->get_playtime() - 1; + return; m_mltProducer->set("out", (int)(stopTime.frames(m_fps))); m_mltProducer->seek((int)(startTime.frames(m_fps))); + m_paused = false; m_mltProducer->set_speed(1.0); m_mltConsumer->set("refresh", 1); if (m_mltConsumer->is_stopped()) m_mltConsumer->start(); @@ -1625,8 +1624,8 @@ void Render::playZone(const GenTime & startTime, const GenTime & stopTime) void Render::resetZoneMode() { - if (!m_mltProducer || (!m_isZoneMode && !m_isLoopMode)) return; - m_mltProducer->set("out", m_originalOut); + if (!m_isZoneMode && !m_isLoopMode) return; + m_mltProducer->set("out", m_mltProducer->get_length()); //m_mltProducer->set("eof", "pause"); m_isZoneMode = false; m_isLoopMode = false; @@ -1634,12 +1633,16 @@ void Render::resetZoneMode() void Render::seekToFrame(int pos) { + if (!m_mltProducer) + return; resetZoneMode(); seek(pos); } void Render::seekToFrameDiff(int diff) { + if (!m_mltProducer) + return; resetZoneMode(); if (requestedSeekPosition == SEEK_INACTIVE) seek(m_mltProducer->position() + diff); @@ -1648,12 +1651,12 @@ void Render::seekToFrameDiff(int diff) void Render::refreshIfActive() { - if (!m_mltConsumer->is_stopped() && m_mltProducer && m_mltProducer->get_speed() == 0) m_refreshTimer.start(); + if (!m_mltConsumer->is_stopped() && m_mltProducer && m_paused) m_refreshTimer.start(); } void Render::doRefresh() { - if (m_mltProducer && m_mltProducer->get_speed() == 0) m_refreshTimer.start(); + if (m_mltProducer && m_paused) m_refreshTimer.start(); } void Render::refresh() @@ -1663,6 +1666,7 @@ void Render::refresh() return; if (m_mltConsumer) { if (m_mltConsumer->is_stopped()) m_mltConsumer->start(); + m_paused = false; //m_mltConsumer->purge(); m_mltConsumer->set("refresh", 1); } @@ -1687,6 +1691,12 @@ void Render::setDropFrames(bool show) } } +bool Render::isPlaying() const +{ + if (!m_mltConsumer || m_mltConsumer->is_stopped()) return false; + return !m_paused; +} + double Render::playSpeed() const { if (m_mltProducer) return m_mltProducer->get_speed(); @@ -1725,7 +1735,7 @@ void Render::emitFrameNumber() emit rendererPosition(currentPos); if (requestedSeekPosition != SEEK_INACTIVE) { m_mltProducer->seek(requestedSeekPosition); - if (m_mltProducer->get_speed() == 0) { + if (m_paused) { refresh(); } requestedSeekPosition = SEEK_INACTIVE; @@ -1737,6 +1747,7 @@ void Render::emitConsumerStopped() // This is used to know when the playing stopped if (m_mltProducer) { double pos = m_mltProducer->position(); + m_paused = true; if (m_isLoopMode) play(m_loopStart); //else if (m_isZoneMode) resetZoneMode(); emit rendererStopped((int) pos); @@ -1800,7 +1811,7 @@ void Render::slotCheckSeeking() { if (requestedSeekPosition != SEEK_INACTIVE) { m_mltProducer->seek(requestedSeekPosition); - if (m_mltProducer->get_speed() == 0) { + if (m_paused) { refresh(); } } @@ -1853,6 +1864,7 @@ void Render::mltCheckLength(Mlt::Tractor *tractor) int trackNb = tractor->count(); int duration = 0; int trackDuration; + if (m_isZoneMode) resetZoneMode(); if (trackNb == 1) { Mlt::Producer trackProducer(tractor->track(0)); duration = trackProducer.get_playtime() - 1; @@ -1926,6 +1938,7 @@ Mlt::Producer *Render::checkSlowMotionProducer(Mlt::Producer *prod, QDomElement int Render::mltInsertClip(ItemInfo info, QDomElement element, Mlt::Producer *prod, bool overwrite, bool push) { + m_refreshTimer.stop(); if (m_mltProducer == NULL) { kDebug() << "PLAYLIST NOT INITIALISED //////"; return -1; @@ -2155,6 +2168,7 @@ bool Render::mltUpdateClip(Mlt::Tractor *tractor, ItemInfo info, QDomElement ele bool Render::mltRemoveClip(int track, GenTime position) { + m_refreshTimer.stop(); Mlt::Service service(m_mltProducer->parent().get_service()); if (service.type() != tractor_type) { kWarning() << "// TRACTOR PROBLEM";