[Kdenlive-devel] RFC: patch to enable buffered playback
Dan Dennedy
dan at dennedy.org
Sat Apr 27 19:32:03 UTC 2013
Due to recent improvements in mlt_consumer_purge(), it is now possible
to enable to buffered playback in interactive apps and still have good
responsiveness.
More info can be found here:
https://sourceforge.net/p/mlt/bugs/187/
(there might be a corresponding kdenlive mantis bug)
and here:
https://plus.google.com/u/0/111864735906618411659/posts/amBMYp4Q1Td
diff --git a/src/renderer.cpp b/src/renderer.cpp
index b5d87dd..8b63854 100644
--- a/src/renderer.cpp
+++ b/src/renderer.cpp
@@ -241,7 +241,8 @@ void Render::buildConsumer(const QString &profileName)
m_mltConsumer->set("terminate_on_pause", 0);
m_mltConsumer->set("deinterlace_method",
denliveSettings::mltdeinterlacer().toUtf8().constData());
m_mltConsumer->set("rescale",
KdenliveSettings::mltinterpolation().toUtf8().constData());
- m_mltConsumer->set("buffer", "1");
+ m_mltConsumer->set("buffer", 25);
+ m_mltConsumer->set("prefill", 1);
m_mltConsumer->set("real_time",
KdenliveSettings::mltthreads());
}
if (m_mltConsumer && m_mltConsumer->is_valid()) {
@@ -286,7 +287,6 @@ void Render::buildConsumer(const QString &profileName)
m_mltConsumer->set("audio_buffer", 512);
m_mltConsumer->set("preview_format", mlt_image_rgb24a);
}
- m_mltConsumer->set("buffer", "1");
m_showFrameEvent = m_mltConsumer->listen("consumer-frame-show",
this, mlt_listener) consumer_gl_frame_show);
}
} else {
@@ -323,6 +323,8 @@ void Render::buildConsumer(const QString &profileName)
m_mltConsumer->set("frequency", 48000);
m_mltConsumer->set("real_time", KdenliveSettings::mltthreads());
+ m_mltConsumer->set("buffer", "25");
+ m_mltConsumer->set("prefill", "1");
}
Mlt::Producer *Render::invalidProducer(const QString &id)
@@ -1607,9 +1609,11 @@ void Render::pause()
return;
m_paused = true;
m_mltProducer->set_speed(0.0);
+ if (m_mltConsumer)
+ m_mltConsumer->purge();
/*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();*/
+ m_mltProducer->seek(m_mltConsumer->position() + 1);
}
void Render::setActiveMonitor()
@@ -1637,6 +1641,8 @@ void Render::switchPlay(bool play)
if (m_winid == 0) {
// OpenGL consumer
m_mltProducer->set_speed(0.0);
+ m_mltConsumer->purge();
+ m_mltProducer->seek(m_mltConsumer->position() + 1);
}
else {
// SDL consumer, hack to allow pausing near the end of the playlist
More information about the Kdenlive
mailing list