<div dir="ltr">This is a temporary (not production ready) patch that enables libvlc consumer in VLMC.<div><br></div><div>Basically something's messed up either with consumer or VLMC, and rendering to two windows at once</div><div>causes CPU usage to go bonkers, so I'm trying to debug that, and if someone wants to test my consumer</div><div>as well, here is a patch that allows to do that.</div><div><br></div><div>I moved producer+consumer to separate repo which is added as submodule in this patch.</div><div><br></div><div>Please check TODO comment before using this patch.</div><div><br></div><div><br></div><div>Best,</div><div>Paweł</div></div><div class="gmail_extra"><br><div class="gmail_quote">2016-07-25 14:20 GMT+02:00 Pawel Golinski <span dir="ltr"><<a href="mailto:golpaw1@gmail.com" target="_blank">golpaw1@gmail.com</a>></span>:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">---<br>
 .gitmodules                    |  3 +++<br>
 src/Backend/MLT/MLTBackend.cpp | 15 +++++++++++++++<br>
 src/Backend/MLT/MLTOutput.cpp  | 10 ++++++++--<br>
 src/Backend/MLT/MLTOutput.h    |  2 +-<br>
 src/Backend/libvlc-mlt         |  1 +<br>
 src/CMakeLists.txt             |  4 ++++<br>
 6 files changed, 32 insertions(+), 3 deletions(-)<br>
 create mode 160000 src/Backend/libvlc-mlt<br>
<br>
diff --git a/.gitmodules b/.gitmodules<br>
index e69de29..ed28514 100644<br>
--- a/.gitmodules<br>
+++ b/.gitmodules<br>
@@ -0,0 +1,3 @@<br>
+[submodule "src/Backend/libvlc-mlt"]<br>
+       path = src/Backend/libvlc-mlt<br>
+       url = <a href="https://github.com/qiubit/libvlc-mlt.git" rel="noreferrer" target="_blank">https://github.com/qiubit/libvlc-mlt.git</a><br>
diff --git a/src/Backend/MLT/MLTBackend.cpp b/src/Backend/MLT/MLTBackend.cpp<br>
index 3d39930..7eb4202 100644<br>
--- a/src/Backend/MLT/MLTBackend.cpp<br>
+++ b/src/Backend/MLT/MLTBackend.cpp<br>
@@ -43,6 +43,15 @@ using namespace Backend::MLT;<br>
 static Backend::IBackend::LogHandler    staticLogHandler;<br>
 static std::mutex                       logMutex;<br>
<br>
+extern "C" mlt_consumer consumer_libvlc_init( mlt_profile profile, mlt_service_type type, const char *id, const void *arg );<br>
+<br>
+static mlt_properties metadata( mlt_service_type type, const char *id, void *data )<br>
+{<br>
+    char file[ 4096 ];<br>
+    snprintf( file, 4096, "%s%s", LIBVLC_MLT_MODULES_PATH, (char*)data );<br>
+    return mlt_properties_parse_yaml( file );<br>
+}<br>
+<br>
 IBackend*<br>
 Backend::instance()<br>
 {<br>
@@ -54,6 +63,12 @@ MLTBackend::MLTBackend()<br>
     m_mltRepo = Mlt::Factory::init();<br>
     m_profile.setFrameRate( 2997, 100 );<br>
<br>
+    m_mltRepo->register_service( consumer_type, "libvlc", (mlt_register_callback)consumer_libvlc_init );<br>
+    m_mltRepo->register_service( consumer_type, "libvlc_window", (mlt_register_callback)consumer_libvlc_init );<br>
+    m_mltRepo->register_metadata( consumer_type, "libvlc", metadata, (void*)"/libvlc/consumer_libvlc.yml" );<br>
+    m_mltRepo->register_metadata( consumer_type, "libvlc_window", metadata, (void*)"/libvlc/consumer_libvlc_window.yml" );<br>
+<br>
+<br>
     for ( int i = 0; i < m_mltRepo->filters()->count(); ++i )<br>
     {<br>
         auto pro = std::unique_ptr<Mlt::Properties>( m_mltRepo->metadata( filter_type, m_mltRepo->filters()->get_name( i ) ) );<br>
diff --git a/src/Backend/MLT/MLTOutput.cpp b/src/Backend/MLT/MLTOutput.cpp<br>
index c99e850..6626a52 100644<br>
--- a/src/Backend/MLT/MLTOutput.cpp<br>
+++ b/src/Backend/MLT/MLTOutput.cpp<br>
@@ -31,10 +31,12 @@<br>
<br>
 #include <cassert><br>
<br>
+#include <stdio.h><br>
+<br>
 using namespace Backend::MLT;<br>
<br>
 MLTOutput::MLTOutput()<br>
-    : MLTOutput( Backend::instance()->profile(), "sdl" )<br>
+    : MLTOutput( Backend::instance()->profile(), "libvlc_window" )<br>
 {<br>
<br>
 }<br>
@@ -159,7 +161,11 @@ MLTOutput::isConnected() const<br>
 void<br>
 MLTSdlOutput::setWindowId( intptr_t id )<br>
 {<br>
-    consumer()->set( "window_id", std::to_string( id ).c_str() );<br>
+    consumer()->set( "output_dst", (void *)id, 0 );<br>
+    // TODO: Only Qt knows, which window type it spawns,<br>
+    // so this function should take window id AS WELL AS<br>
+    // window_type. Workaround - set window_type manually here.<br>
+    consumer()->set( "window_type", "nsobject" );<br>
 }<br>
<br>
 void<br>
diff --git a/src/Backend/MLT/MLTOutput.h b/src/Backend/MLT/MLTOutput.h<br>
index 79dcd9e..c0e9188 100644<br>
--- a/src/Backend/MLT/MLTOutput.h<br>
+++ b/src/Backend/MLT/MLTOutput.h<br>
@@ -81,7 +81,7 @@ class MLTSdlOutput : public MLTOutput<br>
 {<br>
     public:<br>
         MLTSdlOutput()<br>
-            : MLTOutput( Backend::instance()->profile(), "sdl" ) { }<br>
+            : MLTOutput( Backend::instance()->profile(), "libvlc_window" ) { }<br>
<br>
         void setWindowId( intptr_t id );<br>
 };<br>
diff --git a/src/Backend/libvlc-mlt b/src/Backend/libvlc-mlt<br>
new file mode 160000<br>
index 0000000..e13e8a0<br>
--- /dev/null<br>
+++ b/src/Backend/libvlc-mlt<br>
@@ -0,0 +1 @@<br>
+Subproject commit e13e8a017f78e22b84c8db27598541b8dba27b2e<br>
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt<br>
index a85cf0a..48c4508 100644<br>
--- a/src/CMakeLists.txt<br>
+++ b/src/CMakeLists.txt<br>
@@ -55,8 +55,12 @@ INCLUDE_DIRECTORIES(${FREI0R_INCLUDE_DIR})<br>
 # Instruct CMake to run moc automatically when needed.<br>
 SET(CMAKE_AUTOMOC ON)<br>
<br>
+SET(LIBVLC_MLT_MODULES Backend/libvlc-mlt)<br>
+ADD_DEFINITIONS(-DLIBVLC_MLT_MODULES_PATH="${CMAKE_CURRENT_BINARY_DIR}/src/${LIBVLC_MLT_MODULES}")<br>
+<br>
 SET(VLMC_SRCS<br>
     Commands/Commands.cpp<br>
+    Backend/libvlc-mlt/consumer_libvlc.c<br>
     Backend/IBackend.h<br>
     Backend/IOutput.h<br>
     Backend/IInput.h<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.7.4 (Apple Git-66)<br>
<br>
</font></span></blockquote></div><br></div>