Эффективно читайте средний цвет содержимого экрана, предоставленного XBMC

Я хочу получить средний цвет содержимого экрана при запуске XBMC, чтобы изменить цвет окружающего света телевизора. XBMC работает на небольшом HTPC с оборудованием OpenGL ES 2.0 (Raspberry Pi), работающим с дистрибутивом Debian. Думаю, мне нужно читать из буфера кадра экрана, в котором XBMC рисует с помощью OpenGL. (По крайней мере, я думаю и надеюсь, что XBMC отображает все, используя OpenGL.)

Можно ли читать буфер кадров OpenGL, представляющий весь экранный вывод? Что мне нужно получить к нему? Мне также нужен собственный контекст визуализации для доступа к буферу кадра экрана? (Я ничего не делаю для себя на экране, я только хочу прочитать).

Эффективным вычислением среднего цвета является следующая задача. Я думаю о чтении каждого 8-го или 16-го пикселя на строку/столбец (было бы достаточно, мы говорим о 1080p HD-фильмах), а затем вычисляем среднее значение на процессоре. Любые идеи для лучшего решения приветствуются.

Ответ 1

Вы должны взглянуть на [исходный код Boblight] [1].

Расширение Boblight кажется жизнеспособной альтернативой (если оно не поддерживает то, что вам уже нужно!).

Если нет, посмотрите на папку src/clients/. boblight-getpixel.c (для MS Windows) и boblight-X11.c являются " boblight-X11.c пикселей"; автономные программы, которые делают именно то, что вам нужно, а затем передают захваченный цвет на сервер boblight.

В boblight-X11.c вас есть примеры использования XShmGetImage или более медленного XGetImage для чтения частей экрана с помощью X11/extensions/XShm.h, часть этого кода делает:

[...]

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);
   }
}

[...]


  [1]: https://code.google.com/archive/p/boblight/source/default/source