※SurfaceTextureのClass Overviewを日本語訳してみました。
OpenGL ESテクスチャーとしてのイメージストリームからのキャプチャーフレームです。
イメージストリームはカメラプレビューやビデオデコードから来ます。SurfaceTextureから作られたSurfaceはandroid.hardware.camera2, MediaCodec, MediaPlayer, Allocation等のAPIからの出力先として使用することができます。
updateTexImage()が呼ばれると、SurfaceTextureを作成するときに指定されたテクスチャーの内容がイメージストリームからの最新の画像に更新されます。これによりいくつかのフレームがスキップされることがあります。
SurfaceTextureは古いCamera APIでのSurfaceHolderとして使うこともできます。こうすることでデバイスのディスプレイの代わりに全てのイメージストリームがSurfaceTextureに送られるようになります。
テクスチャーからのサンプリングをする場合は、まずテクスチャー座標を変換するための行列をgetTransformMatrix(float[])で取得します。変換行列はupdateTexImage()が呼ばれるたびに変化するので、テクスチャーイメージが更新される度に再取得されるべきです。この行列は伝統的な2D OpenGL ESテクスチャー座標ベクトルを変換します。ベクトルは(s, t, 0, 1)
の形式でs
とt
は0以上、1以下で、サンプリング位置を表します。この変換によって異なるソースのイメージストリームを統一的に扱えるようになります。たとえば、画像の左下の隅は変換行列によってベクトル(0, 0, 0, 1)になり、画像の右上の隅はベクトル(1, 1, 0, 1)になります。
テクスチャーオブジェクトはGL_TEXTURE_EXTERNAL_OES
テクスチャーターゲットを使用します。これはGL_OES_EGL_image_external OpenGL ES 拡張で定義されています。これはテクスチャーがどのように使われるかを制限します。テクスチャーはGL_TEXTURE_2D
ではなくGL_TEXTURE_EXTERNAL_OES
ターゲットにバウンドされなければいけません。さらに、このテクスチャーからサンプリングを行う全てのOpenGL ES 2.0シェーダーはこの拡張を使用する宣言を行う必要があります。たとえば、"#extension GL_OES_EGL_image_external : require"
ディレクティブです。このようなシェーダーはsamplerExternalOES
GLSLサンプラータイプを使ってテクスチャーにアクセスする必要があります。
SurfaceTextureオブジェクトはどんなスレッドでも作成することができます。updateTexImage()はテクスチャーオブジェクトを持つOpenGL ESコンテキストのスレッドからしか呼べません。フレーム利用可能コールバックは任意のスレッドから呼ばれるので、updateTexImage()はこのコールバックから直接呼ばれるべきではありません。
…うーん、わかったようなわからないような…