[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