Mastodon

Hallo! Es ist eine Weile her 🙂

Und Entschuldigung. Ich hatte für letzte Woche ein Update geplant, kam aber nicht dazu, da ich einige gesundheitliche Probleme hatte. Aber jetzt geht’s mir wieder gut.

The QML MLT producer – die bisherigen Fortschritte …

Soweit ich das verstanden habe (verzeihen Sie mir etwaige Fehler – es ist eine andere Codebasis und ein anderes Konzept – ich begrüße jede Art von Berichtigungen und Vorschlägen), besteht der gesamte Producer aus zwei Teilen – den tatsächlichen Producer-Code (der in C geschrieben ist und der den “Producer-Teil” enthält), und den Wrapper-Code (der den eigentlichen Rendering-Teil der QML-Frames ‘umhüllt’, ergänzt und erledigt). Die Wrapper-Dateien sind hauptsächlich dafür verantwortlich, die an sie übergebenen QML-Vorlagen zu rendern und sie dem Producer zur Verwendung zuzustellen. Infolgedessen muss der größte Teil der Arbeit in den Wrapper-Dateien erledigt werden, da der Producer an sich nicht viel macht, da er immer noch die gleichen Aktionen ausführt wie der vorhandene XML-Producer (producer_kdenlivetitle.c) – beispielsweise das Laden einer Datei , Generieren eines Frames, Aufrufen von Rendering-Methoden aus den Wrapper-Dateien.

Schauen wir mal welche Arbeit gemacht wurde. Beginnen wir mit der neuen Producer-Datei in mlt/src/modules/qt/producer_qml.c

void read_qml(mlt_properties properties)

Wie der Name schon sagt, wird eine “Ressourcen” -Datei geöffnet und speichert die QML-Datei in den globalen mlt_properties welche übergeben wurde.

static int producer_get_image( mlt_frame frame, uint8_t **buffer, 
                               mlt_image_format *format, int *width, 
                               int *height, int writable )

Diese Methode nimmt ein Frame auf und verwendet die Wrapper-Datei. Sie ruft die Methode auf, die den Rendering-Teil in den Wrapper-Dateien ausführt (renderKdenliveTitle ()) und setzt das gerenderte Bild mit mlt_frame_set_image auf den übergebenen Frame.

static int producer_get_frame( mlt_producer producer, mlt_frame_ptr frame, 
                               int index )

Diese Methode generiert ein Frame, ruft producer_get_image () auf, legt einen fertig gerenderten Frame für den Producer fest und bereitet den nächsten Frame vor.

Die Wrapper-Datei hat folgende Methoden:

void loadQml( producer_ktitle_qml self, const char *templateQml )

Diese Methode lädt eine QML-Datei, die ein Zeiger auf ein Character-Array ist, und führt eine Reihe von Aufgaben aus. Sie prüft, ob sie gültig ist, initialisiert einige Eigenschaften mit den Methoden mlt_properties_set () (width und height). Die nächste Methode, die wir haben, ist:

void renderKdenliveTitle( producer_ktitle_qml self, mlt_frame frame, 
                          mlt_image_format format, int width, int height, 
                          double position, int force_refresh )

Mit renderKdenliveTitle () wird der Rendering-Teil ausgeführt – unter Angabe eines mlt_frame-Formats und seiner Parameter. Und hier verwende ich QmlRenderer – meine Arbeit vom letzten Monat – der QML rendert kann. Ich habe den Code ein wenig überarbeitet, um ein gerendertes QImage in die Bibliothek zurückzugeben. Ich benutze die renderSingleFrame () -Methode, die einen QML-Frame für eine bestimmte Position (Zeit) rendert.

Der Programmierteil an sich war nicht schwierig (obwohl er weit davon entfernt ist, ein kompletter Producer zu sein – es gibt derzeit viele Speicherlecks). Die größte Aufwand war es, zu verstehen wie alles in einem Stück zusammenarbeitet. Tatsächlich habe ich etwas mehr als eine Woche gebraucht um die Arbeitsweise der Producer-Codebasis zu verstehen!

Ich glaube, dass 80% der Producer-Arbeit erledigt ist. Der Plan ist, bis nächste Woche einen funktionierenden, soliden Producer zu bekommen. Der aktuelle Code ist noch weit von einem fertigen Producer entfernt. Dies obschon die gesamte Struktur festgelegt ist und der größte Teil des Refactorings der QmlRenderer-Bibliothek abgeschlossen ist um die Producer Methoden aufzunehmen.

Außerdem wurde das Build-System für die QmlRenderer-Bibliothek überarbeitet. Es ist nun ein sauberes Build-System (dank Vincent). Zum Erstellen müssen Sie also nur das Repository klonen und um dies tun.

mkdir build
cd build
qmake -r ..
make 
cd bin
./QmlRender -o /path/to/output/directory -i /path/to/input/QML/file

Ordentlich 🙂

Sie finden den Code für den QML MLT-Producer hier.

Übersetzung des Artikels von