ビデオを yuv420p 形式にデコードし、OpenGLES を使用してビデオ フレームをレンダリングする Android アプリがあります。glTexSubImage2D() を使用して y/u/v バッファーを GPU にアップロードし、シェーダーを使用して YUV2RGB 変換を行います。すべての EGL/OpenGL セットアップ/レンダリング コードはネイティブ コードです。
私のコードに問題がないと言っているわけではありませんが、同じコードが iOS (iPad/iPhone)、Nexus 7、Kindle HD 8.9、Samsung Note 1、および他のいくつかの安価な中国製タブレット (A31/ Android 4.0/4.1/4.2 を実行する RockChip 3188)。私のコードが間違っている可能性は低いと思います。これらのデバイスでは、glTexSubImage2D() は 16 ミリ秒未満で SD または 720P HD テクスチャをアップロードします。
ただし、Nexus 10 では、glTexSubImage2D() は、SD または 720P HD テクスチャに対して約 50 ~ 90 ミリ秒かかり、30fps または 60fps ビデオには遅すぎます。
私が知りたいのですが
1) 別のテクスチャ フォーマット (RGBA または BGRA) を選択する必要がある場合。GPU で使用される最適なテクスチャ フォーマットを検出する方法はありますか?
2) 他のすべての SOC では「オフ」になっているが、Exynos 5 では「オン」に設定されている機能がある場合。たとえば、自動 MIPMAP 生成オプション。(私はそれをオフにしています、ところで)
3) これが Samsung Exynos SOC の既知の問題である場合 - Exynos CPU のサポート フォーラムが見つかりません。
4) EGL サーフェスを構成するときに設定する必要があるオプションはありますか? 透明度、表面のフォーマットなど?(何を言っているのかさっぱりわかりません)
5) GPU が暗黙的なフォーマット変換を行っている可能性がありますが、GL_LUMINANCE が常に使用されていることを確認しました。繰り返しますが、他のすべてのプラットフォームで動作します。
6) 他に何かありますか?
私の EGL 設定:
const EGLint attribs[] = {
EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
EGL_BLUE_SIZE, 8,
EGL_GREEN_SIZE, 8,
EGL_RED_SIZE, 8,
EGL_NONE
};
初期設定:
glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, ctx->frameW, ctx->frameH, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL); /* also for U/V */
その後の部分的な置換:
glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, ctx->frameW, ctx->frameH, GL_LUMINANCE, GL_UNSIGNED_BYTE, yBuffer); /*also for U/V */
SD または 720P HD 解像度で ~30FPS または ~60FPS でビデオをレンダリングしようとしています。