2010-06-18 17 views
11

Desidero visualizzare video ad altissima risoluzione direttamente con OpenGL.Display video con openGL

I dati dell'immagine verranno elaborati sulla GPU e voglio evitare un round-trip al PC per mostrare il video in una finestra standard basata su bitmap.
La piattaforma incrociata è carina, solo Windows sarebbe OK (quindi sarebbe solo nvidia)

Chiunque ha qualche link a come farlo?

C'è un povero tutorial NeHe e alcuni esempi per i widget openGL incorporati in Qt, ma ho bisogno di prestazioni molto migliori e di immagini molto più grandi.

risposta

10

Assumendo OpenGL 2.1, utilizzare un oggetto buffer di tipo GL_PIXEL_UNPACK_BUFFER per trasferire i dati dei pixel su una trama. È più veloce del caricamento di dati su ogni fotogramma poiché l'implementazione potrebbe utilizzare DMA per la copia quando si utilizza glMapBuffer, glMapBufferRange (OpenGL 3.2) o chiamare direttamente glBufferData. È anche possibile copiare diversi frame in ogni batch per ottenere un compromesso tra overhead di copia e overhead di mapping. Infine, crea uno shader per convertire YUV o YCbCr in RGB e visualizzare la trama con una striscia triangolare.

+0

Qualche motivo per il triangolo su un quad a schermo intero? –

+3

Sì, i quads succhiano in ogni senso e non dovrebbero essere usati, dimentica che sono mai esistiti. –

2

La cosa ovvia da fare con OpenGL sarebbe quella di visualizzare la bitmap come una trama.

+0

Sì, mi chiedevo solo se ci fossero alcuni trucchi specifici per le prestazioni video, piuttosto che copiare ogni fotogramma su un quad a schermo intero. –

+0

@Martin: Non di solito - purché tu mantenga tutta la memoria mischiata sulla scheda quasi tutte le schede video ragionevoli possono facilmente fornire la larghezza di banda per riscrivere ogni bit sullo schermo alla massima frequenza di aggiornamento (specialmente ora, dal momento che gli LCD non si aggiornano quasi mai più velocemente di 60 Hz) era più difficile con i CRT di fascia alta che ne facevano 100 + Hz aggiornamento). –

+0

Questo è il problema: devo fare 1080p a 120 Hz (e idealmente due di loro!) –

1

Quindi vuoi inviare il tuo video su una texture ed elaborarlo con framment shader? Here's un breve tutorial su come fare qualcosa di simile. È solo un semplice esempio di OpenGL 2.0 che crea 2 texture di dimensioni della finestra e le mescola in framment shader. Non ci sono video coinvolti, ma non dovrebbero essere difficili da modificare se hai già i mezzi per decodificarlo.

0

Se vuoi, ho creato un'API molto semplice che, tra le tante cose, può anche mostrare il video come una trama opengl. Puoi anche creare mappe di altezza dinamiche utilizzando un feed video dal vivo.

È possibile controllare l'API a http://www.barbato.us/category/programming-labs/

Molto facile da usare e rende il codice molto leggibile.

Buona fortuna !!!