Der Vormonat war ein Auf und Ab!
Anfang dieses Monats habe ich angefangen den neuen Producer zu testen. Ich hatte eine gute, grobe Struktur für den Producer Code und war nur auf ein paar kleinere Probleme gestoßen. Anfänglich war mir nicht klar wie genau der Producer vom Titler verwendet wird. So machte ich einen Schritt zurück und verbrachte einige Zeit damit herauszufinden, wie Kdenlivetitle funktioniert, welcher der verwendete Producer ist.
Anfangs hatte ich Integrationsprobleme (die normalerweise auftreten), als ich versuchte die QmlRenderer-Bibliothek zum Rendern und Laden von QML-Vorlagen zu verwenden. Die meisten dieser Probleme wurden durch einfaches Refactoring des Quellcodes der QmlRenderer-Bibliothek behoben. Ein Beispiel: Der Produzent speichert die QML-Vorlage traditionell in globalen Variablen, die als Zeichen-Zeiger-Argument (character pointer argument) verwendet werden (dies ist wiederum traditionelles C). Die QmlRenderer-Bibliothek verwendet eine QUrl als Parameter für das Laden der Qml-Datei. Um dieses Problem zu lösen, musste ich lediglich die loadQml() -Methode mit einer Methode überladen, die die Anforderungen des Producers erfüllen konnte – was einwandfrei funktionierte. Als Konsequenz musste ich auch den Renderprozess (weiter) unterteilen, sodass wir jetzt 3 Methoden haben. Diese laufen nacheinander ab wenn wir etwas mit der Bibliothek rendern möchten: initialiseRenderParams() -> prepareRenderer() -> renderQml().
(Code: https://github.com/akhilam512/mlt)
Ungefähr zu Beginn der 2. Woche habe ich den Producer Code erneut getestet. Ich habe melt für diesen Zweck verwendet:
melt qml:~/path/to/test.qml
und jetzt stand ich vor einem Blocker, der mich etwas länger als eine Woche aufhielt – einem SEGFAULT (Zugriffsverletzung).
Das SIGSEGV-Signal stammte von QtOpenGLContext::create() -> Die Methode versucht, einen OpenGL-Kontext für das Rendern zu erstellen (ausgeführt während dem Erstellen der QmlRenderer-Klasse). Der Fehler war an sich ziemlich seltsam. Ursprünglich dachte ich es könnte an etwas liegen, das mit dem Besitz von QObject zu tun hat. So versuchte ich eine Wrapper-Klasse (sowohl einen Wrapper für die Renderer-Klasse als auch einen Qt-Wrapper für den Producer-Wrapper selbst – was vielleicht dumm klingt) um meinen Producer-Wrapper zu legen. Doch der Code erzeugte immer noch ein SIGSEV. Das nächste woran ich dachte war, dass es vielleicht an OpenGL liegt. Ich war zuversichtlich als ich feststellte, dass wir Probleme mit der OpenGL-Kontexterstellung und dem Thread-Management hatten. Da OpenGL-Kontext und OpenGL-Funktionen im selben Thread erstellt und aufgerufen werden müssen.
(Eine ausgezeichnete Referenz: https://www.khronos.org/opengl/wiki/Common_Mistakes)
Das Problem konnte schlussendlich behoben werden (danke JB). Es lag nicht an OpenGL, sondern einfach daran, dass ich keine QApplication für den Producer erstellt hatte (was für den QT-Producer notwendig ist). Der ganze Monat war ein großer Lernprozess, definitiv nicht einfach, aber ich habe es genossen!
Nun habe ich einen Producer, der fast fertig ist und hoffentlich mit etwas mehr Optimierungen zum Einsatz kommt. Ich habe noch ein paar kleinere Probleme die ich hoffentlich bald lösen kann um einen funktionierenden Producer zu haben. Sobald ich das hinbekommen habe, kann ich auf der Kdenlive-Seite anfangen. Wir hoffen auf das Beste!