私はMediaCodec
を使ってカメラからフレームを符号化することに関して、特にグラフィックスメモリの使用量/ Androidの中の流れとを理解しようとしています。これを行うために、私には不明瞭なグラフィックス、OpenGL、Androidの用語/コンセプトを理解する必要があります。私はAndroidのグラフィックアーキテクチャの資料、SOの質問の束、およびソースの束を読んだが、主に用語が異なる文脈で異なる意味を持つように見えるので、私はまだ混乱している。理解AndroidのカメラSurfaceTextureとMediaCodec表面の使用
私はfaddenのサイトhereからCameraToMpegTestを見てきました。私の具体的な質問は、Camera::setPreviewTexture()
と一緒にMediaCodec::createInputSurface()
がどのように動作するかです。 OpenGLテクスチャが作成された後、これを使用してSurfaceTexture
というAndroidを作成し、setPreviewTexture()
に渡すことができます。私の具体的な質問:
setPreviewTexture()
は、フレームがカメラからどのメモリバッファに移動するのか実際に何をしていますか?私の理解から- OpenGLのテクスチャは、GPUによってアクセス可能なメモリの塊です。 Androidでは、正しい使用フラグを付けてgrallocを使用して割り当てる必要があります。
SurfaceTexture
のAndroidの説明には、「与えられたOpenGLテクスチャに画像をストリーミングする」ことができると言われています:https://developer.android.com/reference/android/graphics/SurfaceTexture.html#SurfaceTexture(int)。SurfaceTexture
はOpenGLテクスチャの上で何をしますか? MediaCodec::createInputSurface()
は、AndroidSurface
を返します。私が理解しているように、AndroidSurface
はバッファキューのプロデューサ側を表しているため、複数のバッファである可能性があります。 API referenceには、「サーフェスはOpenGL ESなどのハードウェアアクセラレーションAPIでレンダリングする必要があります」と記載されています。カメラでキャプチャしたフレームは、SurfaceTexture
からエンコーダに入力されたSurface
にどのように取得されますか?私はCameraToMpegTestは何とかこのSurface
を使用しますが、私はこの部分を得ることはありませんEGLについて多くを知らないEGLSurface
を作成します参照してください。- 「レンダリング」の使用法を明確にすることはできますか?私は、「表面にレンダリング」、「画面にレンダリング」など、さまざまなことを意味するような用途を見ています。
編集:私がしようとすると、より良いCamera::setPreviewTexture()
の内部の仕組みを理解し、いくつかのより多くの質問を持っているいくつかのより多くのにSurfaceTexture
とCameraClient::setPreviewTarget()
ためのコードの中に掘ら
- :mstorsjoさんへのフォローアップ。
SurfaceTexture
のようにそれはそうメモリ割り当てを理解する私の元の質問にBufferQueue
を作成し、は、プラットフォームのカメラHALの実装に関連するIGraphicBufferProducer
を渡します。カメラHALはgralloc使用フラグを適切に設定し(例えば、GRALLOC_USAGE_SW_READ_RARELY | GRALLOC_USAGE_SW_WRITE_NEVER | GRALLOC_USAGE_HW_TEXTURE
)、BufferQueue
からバッファをデキューできます。そのため、カメラがフレームをキャプチャするバッファには、grockocに割り当てられたバッファに、特別な使用フラグ(GRALLOC_USAGE_HW_TEXTURE
など)が割り当てられています。 GPUとCPUが同じメモリにアクセスできるように、統合されたメモリアーキテクチャを備えたARMプラットフォーム上で作業するので、バッファがどのように割り振られているかについてGRALLOC_USAGE_HW_TEXTURE
フラグがどのような影響を与えますか? SurfaceTexture
のOpenGL(ES)部分は、主にGLConsumer
の一部として実装されており、魔法はupdateTexImage()
にあるようです。 OpenGL(ES)テクスチャ用に追加のバッファが割り当てられているか、または使用可能なカメラでいっぱいになっている同じgrallocバッファがありますか? grallocバッファからOpenGL(ES)テクスチャにカメラピクセルデータを取得するためにここで行われなければならないメモリコピーがありますか?私はupdateTexImage()
が何を呼び出すのか分かりません。
あなたの答えに基づいて元の質問にいくつかのフォローアップを追加しました。 –
私はこれらの追加の質問にはほとんどコメントすることができません。最初の質問は、公開APIの観点から(私が知っている)公開APIの観点からであり、後者の質問はプラットフォームの実装方法と詳細のみですプラットフォームの実装者に関連しています。 – mstorsjo
私は、消費者(GLコンテキスト)が前のフレームのレンダリングを続けることができるように、プロデューサ(カメラ)が1つのフレームを書き込むことができるように、SurfaceTextureが実際に複数のバッファのセットであることを期待します。 'updateTexImage()'では、私はこれらのバッファを交換することを期待しています。それはユーザーの視点からの私の印象と仮定ですが、実際の実装はわかりません。 – mstorsjo