11

OpenGL ES と ffmpeg を使用して、Apple TV 用のメディア プレーヤー フレームワークを作成しています。OpenGL ES でのレンダリングには RGBA への変換が必要で、swscale を使用したソフト コンバートは非常に遅いため、インターネットの情報を使用して、ネオンを使用する (ここのように) か、フラグメント シェーダーと GL_LUMINANCE および GL_LUMINANCE_ALPHA を使用するかの 2 つのアイデアを思いつきました。

私は OpenGL についてほとんど何も知らないので、2 番目のオプションはまだ機能しません :)

続行する方法を教えてもらえますか?前もって感謝します。

4

2 に答える 2

21

OpenGL ES2.0 シェーダーを学習する価値は間違いなくあります。

  1. GPU と CPU の間で負荷分散を行うことができます (たとえば、GPU が現在のフレームをレンダリングしている間に後続のフレームのビデオ デコードを行う)。
  2. どのような場合でも、ビデオ フレームは GPU に送られる必要がありYCbCrます。 ビデオのサンプル クロミナンスが 4:2:0 の場合、 を使用するとバス帯域幅が 25% 節約されます。
  3. GPU ハードウェア インターポレーターを使用すると、無料で 4:2:0 クロミナンス アップサンプリングを取得できます。(シェーダーは、YC{b,r}テクスチャの両方に同じ頂点座標を使用するように構成する必要があります。これにより、クロミナンス テクスチャが同じ領域に引き伸ばされます。)
  4. iOS5YCbCrでは、テクスチャ キャッシュを使用すると、GPU へのテクスチャのプッシュは高速です (データ コピーやスウィズリングはありません) ( CVOpenGLESTextureCache*API 関数を参照)。NEON と比較して 1 ~ 2 のデータ コピーを保存できます。

私はこれらのテクニックを使って、超高速の iPhone カメラ アプリ SnappyCam で大きな効果を上げています。

あなたは実装の正しい軌道に乗っています:GL_LUMINANCEテクスチャを使用し、がインターリーブされYているGL_LUMINANCE_ALPHA場合。それ以外の場合は、すべてのコンポーネントがインターリーブされていない場合は 3 つのテクスチャCbCrを使用します。GL_LUMINANCEYCbCr

4:2:0 バイプレーナーYCbCr(CbCrインターリーブされている) の 2 つのテクスチャを作成するのは簡単です。

    glBindTexture(GL_TEXTURE_2D, texture_y);
    glTexImage2D(
        GL_TEXTURE_2D, 
        0, 
        GL_LUMINANCE,        // Texture format (8bit)
        width,
        height,
        0,                   // No border
        GL_LUMINANCE,        // Source format (8bit)
        GL_UNSIGNED_BYTE,    // Source data format
        NULL
    );
    glBindTexture(GL_TEXTURE_2D, texture_cbcr);
    glTexImage2D(
        GL_TEXTURE_2D, 
        0, 
        GL_LUMINANCE_ALPHA, // Texture format (16-bit)
        width / 2,
        height / 2,
        0,                  // No border
        GL_LUMINANCE_ALPHA, // Source format (16-bits)
        GL_UNSIGNED_BYTE,   // Source data format
        NULL
    );

glTexSubImage2D()または iOS5 テクスチャ キャッシュを使用して、これらのテクスチャを更新します。

varyingまた、テクスチャ座標空間にまたがる2D を使用することをお勧めし(x: [0,1], y: [0,1])ます。これにより、フラグメント シェーダで依存するテクスチャの読み取りを回避できます。最終結果は超高速で、私の経験では GPU をまったくロードしません。

于 2011-12-28T09:11:14.587 に答える
0

NEON を使用して YUV を RGB に変換すると、非常に時間がかかります。シェーダーを使用して GPU にオフロードします。

于 2012-10-03T01:25:34.413 に答える