2011-12-09 5 views
9

私は、OpenGL ESとffmpegを使用して、Apple TV向けのメディアプレーヤーフレームワークを作成しています。 OpenGL ESでのレンダリングにはRGBAへの変換が必要です。swscaleを使用したソフトコンバートはとても遅いので、インターネット上の情報を使用して、ネオン(hereなど)を使用するか、フラグメントシェーダーとGL_LUMINANCEおよびGL_LUMINANCE_ALPHAを使用します。私は、OpenGLについてほとんど何も知らないのでApple A4のYUVからRGBAにシェーダまたはNEONを使用する必要がありますか?

は、2番目のオプションはまだ動作しません:)

あなたは私進めるためにどのように任意のポインタを与えることはできますか? ありがとうございます。

答えて

19

それはほとんど間違いなく価値のある学習のOpenGL ES2.0シェーダです:

  1. (GPUが現在のフレームをレンダリングしながら、後続のフレームの、例えば映像復号化)あなたはGPUとCPUの間でバランスを読み込むことができます。
  2. いずれの場合でも、ビデオフレームはGPUに転送する必要があります。YCbCrを使用すると、ビデオに4:2:0サンプリングされたクロミナンスがある場合、25%のバス帯域幅が節約されます。
  3. GPUハードウェア・インターポレータを使用すると、4:2:0クロミナンス・アップサンプリングが無償で行われます。 (シェーダは、YC{b,r}テクスチャの同じ頂点座標を使用して、同じ領域上にクロミナンステクスチャを伸ばしてください)
  4. iOS5では、テクスチャをGPUにプッシュするのは高速ですまたはスウィズリング)をテクスチャキャッシュ(CVOpenGLESTextureCache* API関数を参照)と組み合わせて使用​​します。 NEONに比べて1〜2データコピーを節約します。

私はこれらの技術を最大限の効果のために使用していますin my super-fast iPhone camera app, SnappyCam

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

ための4:2:0の二平面YCbCrは(CbCrがインターリーブされている場合)簡単です:あなたは、これらのテクスチャを更新するglTexSubImage2D()またはiOS5をテクスチャキャッシュを使用することになり

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

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

+0

本当にありがとうございました。実際にあなたが説明したようにすべてをやっていましたが、iOS 5の新機能についてはわかりませんでした。 – pawlowski

+0

あなたの答えをありがとう。 iOS上のネイティブデコードピクセルフォーマットについての詳細はどこで知ることができますか? – fionbio

0

NEONを使用してYUVをRGBに変換するのは非常に遅いです。シェーダを使用してGPUに負荷をかけます。

関連する問題