簡體   English   中英

eglCreateImageKHR 返回 EGL_BAD_ATTRIBUTE 錯誤

[英]eglCreateImageKHR returning EGL_BAD_ATTRIBUTE error

我已經通過 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 之外,上面的所有調用都成功了。

將 egl 日志級別轉為調試后,我能夠獲得有關錯誤的更多信息,並指出該錯誤發生在 egl 源代碼中的何處。 原來是不支持格式fourcc_code('R', '8', ' ', ' ') 因為我的mesa版本太舊了。 您需要安裝 mesa 11.0.0 或更高版本。 重新編譯 mesa(我運行的是 Ubuntu 15.04)並安裝 11.0.0 版本后,我終於得到了一個 EGL 映像。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM