Ciao! E’ passsato un po’ di tempo. 🙂
E sono spiacente di ciò, avevo pianificato di aggiornare la scorsa settimana ma non ce l’ho fatta perché ho avuto problemi di salute ma adesso sto bene.
Il QML MLT producer – il progresso fino ad ora…
Dalla mia comprensione fino ad adesso (chiedo perdono per eventuali errori che potrei fare – è una base di codice diversa e concetti diversi – accolgo con tutto il cuore correzioni e suggerimenti) l’intero produttore si riduce a due parti – il codice produttore effettivo (che è in C e che è la cosa che compone “l’oggetto produttore” e il codice wrapper (che “avvolge”, integra e fa la parte di rendering effettiva dei fotogrammi QML). I file wrapper sono responsabili principalmente del rendering dei modelli QML che gli vengono passati e resi disponibili per l’utilizzo da parte del vero producer. Di conseguenza, la maggior parte del lavoro deve essere eseguita nei file wrapper, poiché il produttore in sé non cambia molto in quanto farà comunque le stesse cose del producer XML esistente (producer_kdenlivetitle.c) – come caricare un file, generare un fotogramma, chiamare i metodi di rendering dai file wrapper.
Quindi vediamo il lavoro che è stato fatto. Partiamo con il nuovo file producer in mlt/src/modules/qt/producer_qml.c
void read_qml(mlt_properties properties)
Come suggerisce il nome, apre un file “risorsa” e memorizza il file QML che gli viene passato nel mlt_properties globale.
static int producer_get_image( mlt_frame frame, uint8_t **buffer, mlt_image_format *format, int *width, int *height, int writable )
Questo metodo include un fotogramma e utilizza il file wrapper: – chiama il metodo che esegue la parte di rendering nei file wrapper (renderKdenliveTitle ()) e imposta l’immagine renderizzata usando mlt_frame_set_image sul frame che è stato passato.
static int producer_get_frame( mlt_producer producer, mlt_frame_ptr frame, int index )
Questo metodo genera un fotogramma, chiama il producer_get_image () e imposta un frame renderizzato pronto per il producer e si prepara per il frame successivo.
Il file wrapper ha i seguenti metodi:
void loadQml( producer_ktitle_qml self, const char *templateQml )
Questo è ciò che fa questo metodo – carica un file QML che è un puntatore a un array di caratteri e le seguenti cose – controlla se è valido, inizializza alcune proprietà usando i metodi di mlt_properties_set () (larghezza e altezza). Il metodo successivo che abbiamo è –
void renderKdenliveTitle( producer_ktitle_qml self, mlt_frame frame, mlt_image_format format, int width, int height, double position, int force_refresh )
renderKdenliveTitle () esegue la parte di rendering – in base al formato e ai relativi parametri di un mlt_frame. Ed ecco dove uso QmlRenderer – il lavoro dell’ultimo mese – per calcolare il QML. Ho riscritto un po’ di codice per ottenere il calcolo di un QImage nella libreria. Uso il metodo renderSingleFrame () che esegue il rendering di un fotogramma QML per una determinata posizione (tempo)
La parte di programmazione in sé non è stata difficile (anche se lungi dall’essere un produttore completo – ci sono molte perdite di memoria in questo momento), ma capire come tutto potesse funzionare insieme in un pezzo unico è ciò che ha richiesto più tempo – infatti mi ci è voluto poco più di una settimana solo per capire il funzionamento alla base del codice del producer!
Per il resto, credo di aver terminato l’80% del lavoro sul producer. Il mio piano è quello di ottenere un produttore solido e funzionante entro la prossima settimana. Nonostante il codice attuale sia ancora lontano dal costituire un producer pronto, l’intera struttura è stata impostata e la maggior parte della riscrittura, che doveva essere fatta nella libreria QmlRenderer per soddisfare i metodi del producer, è stata fatta.
Inoltre, il sistema di compilazione per la libreria QmlRenderer lib è stato rinnovato. Ora è un sistema di compilazione pulito (grazie a Vincent), quindi, per compilare, tutto ciò che devi fare è clonare il repository e fare questo –
mkdir build cd build qmake -r .. make cd bin ./QmlRender -o /path/to/output/directory -i /path/to/input/QML/file
Ben fatto 🙂
Puoi vedere il codice per il QML MLT producer qui.
Traduzione dell’articolo di