Il mese
All’inizio di questo mese ho iniziato a testare il nuovo produttore siccome avevo una struttura grezza ma di buona qualità del suo codice e stavo solamente sistemando alcuni problemi minori. All’inizio non avevo chiaro come il producer sarebbe stato precisamente utilizzato dalla titolatrice, quindi ho fatto un piccolo passo indietro e ho trascorso un po’ di tempo per capire il funzionamento di “kdenlivetitle” che è il producer in uso.
Inizialmente, ho riscontrato problemi d’integrazione (che sono quelli che ci si aspetta normalmente) quando ho cercato di utilizzare la libreria QmlRenderer per il rendering e il caricamento di modelli QML – ma la maggior parte di questi è stata risolta da un semplice refactoring del codice sorgente della libreria QmlRenderer. Per fare un esempio: il produttore archivia tradizionalmente il modello QML in variabili globali e viene preso come argomento del puntatore del carattere (che è, ancora una volta un C tradizionale) La libreria QmlRenderer prende un QUrl come parametro per caricare il file Qml. Così per risolvere questo problema tutto quello che dovevo fare era sovraccaricare il metodo loadQml () con uno che potesse soddisfare le esigenze del produttore – che funzionava perfettamente. Di conseguenza, ho anche dovuto compartimentare (ulteriormente) il processo di rendering. Quindi ora abbiamo 3 metodi che vanno in sequenza quando vogliamo calcolare qualcosa usando la libreria ( initialiseRenderParams( ) -> prepareRenderer( ) -> renderQml( ) )
(Codice: https://github.com/akhilam512/mlt)
Verso l’inizio della seconda settimana, ho ripreso a testare il codice del produttore. Ho usato melt per questo scopo:
melt qml:~/path/to/test.qml
e ora mi sono trovato di fronte a un blocco che mi ha trattenuto per poco più di una settimana – un SEGFAULT
Il segnale SIGSEGV veniva da QtOpenGLContext::create( ) -> il metodo tenta di creare un contesto OpenGL per il rendering (fatto durante la costruzione della classe QmlRenderer) e l’errore era abbastanza strano in sé – inizialmente pensavo che potesse essere dovuto a qualcosa legato alla proprietà di QObject e ho provato a mettere una classe wrapper (sia un wrapper per la classe renderer e un wrapper Qt per il wrapper del produttore stesso – anche se potrebbe sembrare stupido) attorno al wrapper del mio produttore – e il codice produceva ancora un SIGSEV. La cosa che mi viene in mente subito dopo è che forse il problema fosse dovuto a OpenGL e mi sentivo sicuro dopo aver scoperto che c’erano stati problemi con la creazione del contesto OpenGL e la gestione dei processi poiché il contesto OpenGL e le funzioni OpenGL devono essere creati e chiamati sullo stesso thread.
(ecco una referenza eccellente: https://www.khronos.org/opengl/wiki/Common_Mistakes )
Il problema è stato finalmente risolto (grazie JB) e non era dovuto a OpenGL ma era semplicemente dovuto al fatto che non avevo creato una QApplication per il producer (cosa necessario per i produttori di qt). Ho quindi passato un intero mese nelle curve, sicuramente non facile, ma mi sono divertito!
In questo momento, ho un produttore che è quasi completo e che con un po’ di modifiche, sarà messo a punto, almeno si spera. Sto ancora affrontando alcuni problemi minori che spero di risolvere presto per ottenere un produttore funzionante. Una volta fatto questo, potrò iniziare a lavorare sul lato Kdenlive. Speriamo in meglio!
Traduzione dell’articolo di