12

XBMC を実行してテレビの周囲光の色を変更するときに、画面コンテンツの平均色を取得したいと考えています。XBMC は、Debian 派生ディストリビューションを実行する OpenGL ES 2.0 ハードウェア (Raspberry Pi) を備えた小さな HTPC 上で実行されています。XBMC が OpenGL を使用して描画する画面フレーム バッファーから読み取る必要があると思います。(少なくとも、XBMC が OpenGL を使用してすべてをレンダリングすることを願っています。)

画面出力全体を表す OpenGL フレーム バッファを読み取ることは可能ですか? アクセスするには何が必要ですか? 画面のフレーム バッファにアクセスするには、独自のレンダー コンテキストも必要ですか? (自分で画面に何もレンダリングしません。読みたいだけです)。

次のタスクは、平均色を効率的に計算することです。行/列ごとに8ピクセルまたは16ピクセルごとに読み取り(1080p HDムービーについて話しているので十分でしょう)、CPUで平均を計算することを考えています。より良い解決策のアイデアは大歓迎です。

4

1 に答える 1

6

Boblightのソースコードを確認する必要があります。

Boblightを拡張することは、実行可能な代替手段のように思われます(必要なものがすでにサポートされていない場合)。

そうでない場合は、src/clients/フォルダを見てください。boblight-getpixel.c(MS Windowsの場合)およびboblight-X11.cは「ピクセルグラバー」です。必要なことを正確に実行し、取得した色をboblightサーバーに伝達するスタンドアロンプ​​ログラム。

boblight-X11.cを使用した例や、を使用して画面の一部を読み取るXShmGetImageのが遅い例がある場合、そのコードの一部は次のように なります。XGetImageX11/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);
   }
}

[...]
于 2013-01-16T19:05:37.610 に答える