2017-07-18 7 views
0

ffmpegの機能を使用してテクスチャを非同期に直接デコードすることはできますか?ジオメトリにビデオを出力する必要があります。ビデオを別のスレッドのテクスチャに直接デコードする

フレームバッファにビデオを直接出力し、他の金属機能に近いビデオプレーヤーを使用できるビデオプレーヤーがありますが、組み込みデバイス(OpenGL ES 2.0または3.0)に適した最小限の例はありますか?

テクスチャがフレーム時間全体にGPUメモリを残さないといいでしょう。

+0

これを指示しない限り、メモリを残すべきではありません。 – Reaper

+0

フレームデータをGPUに転送する必要がありますが、YUVフラグメントシェーダーを使用してオンザフライでRGBに変換することができます。 – WLGfx

+0

@WLGfx VDPAUを使用するとどうなりますか?私はGPUメモリをまったく残さないようにフレームを管理することは可能だと思います。 – Orient

答えて

1

私は現在、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オーバーヘッドを削減するために、すべてのデコードストリームを独自のスレッドに分割します。

幸運。他に何か、ただ聞いてください。

関連する問題