linux opengl-es framebuffer screen-capture

linux - Lea eficientemente el color promedio del contenido de la pantalla prestado por XBMC



opengl-es framebuffer (1)

Deberías echarle un vistazo a esta publicación , y particularmente al código fuente de Boblight 1.3 .

La ampliación de Boblight parece una alternativa viable (¡si no es compatible con lo que ya necesitas!).

Si no, mira la carpeta src/clients/ . boblight-getpixel.c (para MS Windows) y boblight-X11.c son ''capturadores de píxeles''; programas independientes que hacen exactamente lo que necesita y luego comunica el color capturado al servidor boblight.

En boblight-X11.c tiene ejemplos del uso de XShmGetImage o del XGetImage más XGetImage para leer porciones de la pantalla usando X11/extensions/XShm.h , una porción de ese código:

[...] 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); } } [...]

Quiero obtener el color promedio del contenido de la pantalla cuando ejecuto XBMC para cambiar el color de una luz ambiental de TV. XBMC se ejecuta en un HTPC pequeño con hardware OpenGL ES 2.0 (Raspberry Pi) ejecutando una distribución derivada de Debian. Supongo que tengo que leer desde el buffer de marco de pantalla en el que XBMC dibuja usando OpenGL. (Al menos, creo y espero que XBMC represente todo usando OpenGL).

¿Es posible leer el buffer de cuadros de OpenGL que representa la salida de pantalla completa? ¿Qué voy a necesitar para acceder a él? ¿También necesito un contexto de renderizado propio para acceder al buffer del cuadro de la pantalla? (No renderizo nada solo en la pantalla, solo quiero leer ).

La siguiente tarea es calcular eficientemente el color promedio. Estoy pensando en leer cada 8 o 16 píxeles por fila / columna (sería suficiente, estamos hablando de películas HD de 1080p) y luego calcular el promedio en la CPU. Cualquier idea para una mejor solución es bienvenida.