ffmpeg
の機能を使用してテクスチャを非同期に直接デコードすることはできますか?ジオメトリにビデオを出力する必要があります。ビデオを別のスレッドのテクスチャに直接デコードする
フレームバッファにビデオを直接出力し、他の金属機能に近いビデオプレーヤーを使用できるビデオプレーヤーがありますが、組み込みデバイス(OpenGL ES 2.0または3.0)に適した最小限の例はありますか?
テクスチャがフレーム時間全体にGPUメモリを残さないといいでしょう。
ffmpeg
の機能を使用してテクスチャを非同期に直接デコードすることはできますか?ジオメトリにビデオを出力する必要があります。ビデオを別のスレッドのテクスチャに直接デコードする
フレームバッファにビデオを直接出力し、他の金属機能に近いビデオプレーヤーを使用できるビデオプレーヤーがありますが、組み込みデバイス(OpenGL ES 2.0または3.0)に適した最小限の例はありますか?
テクスチャがフレーム時間全体にGPUメモリを残さないといいでしょう。
私は現在、mpegtsストリームフレームからエッジをトリミングするのにsws_scaleを使用しています。これは、デコード時にエッジに16または32ピクセルの余分なピクセルがあるためです。これはほとんどの用途では必要ではありません。代わりに私は自分のバッファに直接コピーするためにそれを使用します。
ff->scale_context = sws_getContext(wid, hgt, ff->vid_ctx->pix_fmt, // usually YUV420
wid, hgt, AV_PIX_FMT_YUV420P, // trim edges and copy
SWS_FAST_BILINEAR, NULL, NULL, NULL);
// setup my buffer to copy the frame into
uint8_t *data[] = { vframe->yframe, vframe->uframe, vframe->vframe };
int linesize[4] = { vid_ctx->width, vid_ctx->width/2, vid_ctx->width/2, 0 };
int ret = sws_scale(scale_context,
(const uint8_t **)frame->data, frame->linesize,
0, vid_ctx->height,
data, linesize);
フレームが別の形式である場合は、調整する必要があります。オーバーヘッドの多くを節約OpenGL ESのためのGPUのシェーダが使用
:
// YUV shader (converts YUV planes to RGB on the fly)
static char vertexYUV[] = "attribute vec4 qt_Vertex; \
attribute vec2 qt_InUVCoords; \
varying vec2 qt_TexCoord0; \
\
void main(void) \
{ \
gl_Position = qt_Vertex; \
gl_Position.z = 0.0;\
qt_TexCoord0 = qt_InUVCoords; \
} \
";
static char fragmentYUV[] = "precision mediump float; \
uniform sampler2D qt_TextureY; \
uniform sampler2D qt_TextureU; \
uniform sampler2D qt_TextureV; \
varying vec2 qt_TexCoord0; \
void main(void) \
{ \
float y = texture2D(qt_TextureY, qt_TexCoord0).r; \
float u = texture2D(qt_TextureU, qt_TexCoord0).r - 0.5; \
float v = texture2D(qt_TextureV, qt_TexCoord0).r - 0.5; \
gl_FragColor = vec4(y + 1.403 * v, \
y - 0.344 * u - 0.714 * v, \
y + 1.770 * u, 1.0); \
}";
場合は代わりにUVフレームがインターリーブされていると、あなただけのいずれかの「Rを使用して値をフェッチその後、YUV420のNV12の形式を使用して、 g "または" x、y "を使用しています。
バッファからの各YUVフレームは、「qt_TextureY、U、V」にアップロードされます。
コメントで述べたように、FFMpegsビルドは自動的にHWデコードを使用します。
また、CPUオーバーヘッドを削減するために、すべてのデコードストリームを独自のスレッドに分割します。
幸運。他に何か、ただ聞いてください。
これを指示しない限り、メモリを残すべきではありません。 – Reaper
フレームデータをGPUに転送する必要がありますが、YUVフラグメントシェーダーを使用してオンザフライでRGBに変換することができます。 – WLGfx
@WLGfx VDPAUを使用するとどうなりますか?私はGPUメモリをまったく残さないようにフレームを管理することは可能だと思います。 – Orient