eglCreateImageKHR возвращает ошибку EGL_BAD_ATTRIBUTE

Я реализовал аппаратное декодирование в Linux с использованием VAAPI через FFmpeg. Поскольку у меня есть приложение OpenGL, я конвертирую декодированные поверхности VAAPI в текстуры OpenGL с помощью vaCopySurfaceGLX. Это работает нормально, за исключением того, что есть копия (на графическом процессоре). Мне сказали, что я могу напрямую использовать поверхность VAAPI в качестве текстур OpenGL с помощью EGL. Я просмотрел несколько примеров (в основном исходный код 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.


person CD83    schedule 27.04.2016    source источник


Ответы (1)


Переключив уровень журнала egl на отладку, я смог получить больше информации об ошибке и точно определить, где в исходном коде egl произошла эта ошибка. Выяснилось, что формат fourcc_code('R', '8', ' ', ' ') не поддерживался, потому что моя версия mesa была слишком старой. У вас должна быть установлена ​​mesa 11.0.0 или выше. После перекомпиляции mesa (у меня Ubuntu 15.04) и установки версии 11.0.0 я наконец-то получил образ EGL.

person CD83    schedule 28.04.2016