1

FFmpeg 経由で VAAPI を使用して Linux にハードウェア デコードを実装しました。私は OpenGL アプリケーションを持っているので、vaCopySurfaceGLX を使用して、デコードされた VAAPI サーフェスを OpenGL テクスチャに変換しています。(GPU 上に) コピーが作成されることを除いて、これは正常に機能しています。EGL を使用して、VAAPI サーフェスを OpenGL テクスチャとして直接使用できると言われました。いくつかの例 (主に Kodi ソース コード) を見てきましたが、EGLImageKHR を作成できません。関数 eglCreateImageKHR は 0 を返し、エラーをチェックすると EGL_BAD_ATTRIBUTE エラーが発生しますが、その理由がわかりません。

以下は、VAAPI サーフェスを変換する方法です。

初期化中に、次のように EGL をセットアップしました。

// currentDisplay comes from call to glXGetCurrentDisplay() and is also used when getting the VADisplay like this: vaGetDisplay(currentDisplay)     

EGLint major, minor;
_eglDisplay = eglGetDisplay(currentDisplay);
eglInitialize(_eglDisplay, &major, &minor);
eglBindAPI(EGL_OPENGL_API);

その後、EGL イメージを作成するために、次のようにします。

// _vaapiContext.vaDisplay comes from vaGetDisplay(currentDisplay)
// surface is the VASurfaceID of the surface I want to use in OpenGL
vaDeriveImage(_vaapiContext.vaDisplay, surface, &_vaapiContext.vaImage);

VABufferInfo buf_info;
memset(&buf_info, 0, sizeof(buf_info));
buf_info.mem_type = VA_SURFACE_ATTRIB_MEM_TYPE_DRM_PRIME;
vaAcquireBufferHandle(_vaapiContext.vaDisplay, _vaapiContext.vaImage.buf, &buf_info);
EGLint attribs[] = {
    EGL_WIDTH, _vaapiContext.vaImage.width,
    EGL_HEIGHT, _vaapiContext.vaImage.height,
    EGL_LINUX_DRM_FOURCC_EXT, fourcc_code('R', '8', ' ', ' '),
    EGL_DMA_BUF_PLANE0_FD_EXT, buf_info.handle,
    EGL_DMA_BUF_PLANE0_OFFSET_EXT, _vaapiContext.vaImage.offsets[0],
    EGL_DMA_BUF_PLANE0_PITCH_EXT, _vaapiContext.vaImage.pitches[0],
    EGL_NONE
};

EGLImageKHR eglImage = eglCreateImageKHR(_eglDisplay, EGL_NO_CONTEXT, EGL_LINUX_DMA_BUF_EXT, (EGLClientBuffer)NULL, attribs);

次のドキュメントhttps://www.khronos.org/registry/egl/extensions/EXT/EGL_EXT_image_dma_buf_import.txtでこのエラーの原因を調べて、次のオプションを追加しようとしましたが、私の形式は平面

EGL_YUV_COLOR_SPACE_HINT_EXT, EGL_ITU_REC601_EXT,
EGL_SAMPLE_RANGE_HINT_EXT, EGL_YUV_FULL_RANGE_EXT,
EGL_YUV_CHROMA_HORIZONTAL_SITING_HINT_EXT, EGL_YUV_CHROMA_SITING_0_EXT,
EGL_YUV_CHROMA_VERTICAL_SITING_HINT_EXT, EGL_YUV_CHROMA_SITING_0_EXT

私が使用しているコードは、私が見たすべての例に似ているため、エラーが何であるかわかりません。

この投稿のすべてのエラー チェックを削除したことに注意してください。上記のすべての呼び出しは、eglCreateImageKHR を除いて成功します。

4

1 に答える 1

1

egl ログ レベルをデバッグに変更した後、エラーに関する詳細情報を取得し、egl ソース コードのどこでこのエラーが発生したかを特定することができました。mesa のバージョンが古すぎるため、fourcc_code('R', '8', ' ', ' ') という形式はサポートされていませんでした。mesa 11.0.0 以上がインストールされている必要があります。mesa (私は Ubuntu 15.04 を実行しています) を再コンパイルし、11.0.0 バージョンをインストールした後、最終的に EGL イメージを取得しています。

于 2016-04-28T22:36:15.970 に答える