2012-12-08 13 views
9

Desidero ottenere il colore medio del contenuto dello schermo quando si esegue XBMC per modificare il colore di una luce ambientale TV. XBMC è in esecuzione su un piccolo HTPC con hardware OpenGL ES 2.0 (Raspberry Pi) che esegue una distribuzione derivata da Debian. Suppongo di dover leggere dallo schermo frame buffer in cui XBMC disegna usando OpenGL. (Almeno, penso e spero che XBMC restituisca tutto usando OpenGL.)Leggere in modo efficiente il colore medio del contenuto dello schermo reso da XBMC

E 'possibile leggere il buffer del frame OpenGL che rappresenta l'intero output dello schermo? Di cosa ho bisogno per accedervi? Ho anche bisogno di un proprio contesto di rendering per accedere al frame buffer dello schermo? (Non renderò nulla da solo sullo schermo, voglio solo leggere).

Calcolare in modo efficiente il colore medio è l'operazione successiva. Sto pensando di leggere ogni ottavo o sedicesimo pixel per riga/colonna (sarebbe sufficiente, stiamo parlando di filmati HD 1080p) e quindi di calcolare la media sulla CPU. Qualsiasi idea per una soluzione migliore è la benvenuta.

+0

frame, non buffer dello schermo, perché richiesto. Entrambi sono però corretti. – Linuxios

+0

@Linuxios Grazie. Ho pensato di dire "frame buffer", tuttavia, il lettore potrebbe pensare che io voglia rileggere qualcosa che ho reso prima. Che non è il caso qui. Sottolineerò semplicemente che è l'intero schermo. – leemes

+0

Il frame buffer contiene esattamente ciò che è attualmente sullo schermo. Ecco perché lo dico. – Linuxios

risposta

5

Si consiglia di dare un'occhiata a the source code of Boblight.

L'estensione di Boblight sembra un'alternativa valida (se non supporta già ciò che è necessario!).

In caso contrario, consultare la cartella src/clients/. boblight-getpixel.c (per MS Windows) e boblight-X11.c sono 'pixel grabber'; programmi autonomi che fanno esattamente ciò di cui hai bisogno e poi comunicano il colore catturato al server boblight.

In boblight-X11.c si hanno esempi di utilizzo XShmGetImage o più lenta XGetImage per leggere parti dello schermo utilizzando X11/extensions/XShm.h, una porzione di codice che fa: tampone

[...] 

if(!XShmGetImage(dpy, root_win, xim, 0, 0, AllPlanes)) 
{ 
sleep(1); 
pthread_mutex_unlock(&grabmutex); 
return; 
} 

XSync(dpy, True); 

for (x = 0; x < width; x += xadd) 
{ 
    for (y = 0; y < height; y += yadd) 
    { 
     pixel = XGetPixel(xim, x, y); 
     RGB[0] = (pixel >> 16) & 0xff; 
     RGB[1] = (pixel >> 8) & 0xff; 
     RGB[2] = (pixel >> 0) & 0xff; 

     /*add it to the RGB array*/ 
     boblight_add_pixel (&config, RGB, x, y); 
    } 
} 

[...] 
+0

Grazie! Molto interessante. Forse, posso solo usare questo programma principalmente invariato per il colore le mie luci! Mi chiedo se questo approccio è efficiente, dal momento che uso un hardware di fascia bassa (Raspberry Pi). Penso che devo solo provare questo. Grazie ancora per questo puntatore, che non ho trovato su google (forse ero troppo concentrato su OpenGL) – leemes

+0

Anche se XMBC usa OpenGL per la sua interfaccia utente, penso che abbia molte opzioni diverse per l'output video. Non dimenticare di accettare la risposta quando lo ritieni opportuno;) – istepaniuk

+0

I link non invecchiano bene . – Albin

Problemi correlati