Как стать автором
Обновить

Комментарии 13

С карточками NVIDIA на десктопе и родными драйверами, увы, трюк не прокатывает.
eglCreateImage
выдает 0x3008 (BadDisplay)

На эту тему даже у самой NVIDIA есть топик
Хм… печально.
Там люди советуют использовать eglCreateImageKHR() вместо eglCreateImage()… Может поможет?
Не помогает, проверял. В теории, должны сработать eglStreams, однако, wayland основанный на них, на проприетарных драйверах, у меня, опять же, не стартует. Возможно, руки кривые.

Рискну предположить, что причина того, что NVIDIA не дружит с DMABUF в этом
Спасибо за познавательную ссылку.
Вероятно вы правы. А у меня честно говоря все компьютеры с Intel графикой — я и не знал, что такие проблемы есть.
У 4-ой малины уже, вроде, есть GLES3 на борту.
Так и есть GLES3, но наличие DMABUF считаю полезной фичей.
Дли синхронизации пользую glFenceSync/glWaitSync. На малине не пробовал, но вроде, не gles3 должно работать
Чтобы достичь zero-copy вам в первую очередь надо отказаться от плагинов videoconvert и decodebin.
На Rpi4 должен быть доступен omxh264dec, а он уже умеет сразу отдавать dmabuf, если выставить соответствующие параметры. Эту память уже можно сразу маппить на EGLImage.
Делать новый eglImage на каждый плейн не надо — как правило платформа поддерживает NV12, который отдается декодером.
Ну так-то я в конце приписал, что гораздо разумнее забирать YUV. То есть подразумевал, что videoconvert действительно не нужен. Тут согласен.
omxh264dec в Rpi4 есть, но как-то не очень работает. Вместо него теперь v4l драйвер и он дает аппаратное декодирование видео. decodebin его и подхватывает.
Вот как «выставить соответствующие параметры, чтоб получить dmabuf» для EGLImage нигде не нашел ни одного примера.
По поводу того, что не нужны несколько отдельных eglImage на каждую plane не соглашусь. Ведь тогда невозможно будет написать шейдер, особенно с NV12. Как?
В v4l2h264dec есть опция «capture-io-mode», по-умолчанию стоит в «0 (auto)». Если поставить «4» то это будет DMABUF. Далее вам надо проверить что память в буффере и правда dma при помощи gst_is_dmabuf_memory() ну и далее извлечь файловые дескрипторы и страйд/оффсет для каждого плейна (см. документацию на GstVideoMeta).

По поводу того, что не нужны несколько отдельных eglImage на каждую plane не соглашусь. Ведь тогда невозможно будет написать шейдер, особенно с NV12. Как?


При создании eglImage в аттрибуты можно добавить до трех плейнов, читайте спецификацию расширения EXT_image_dma_buf_import
Используйте другой target для текстуры — GL_TEXTURE_EXTERNAL_OES вместо GL_TEXTURE_2D и аппаратный семплер samplerExternalOES в пиксельном шейдере.
Я был бы премного благодарен, если бы вы смогли кинуть ссылку на пример использования dmabuf с таким использованием, как вы рассказываете.
А то получается, что я к примеру сто раз читал спецификацию EXT_image_dma_buf_import и видел, что там может быть несколько plane, но из этой доки абсолютно не понятно, как потом в шейдере извлекать пикселы из такого image.
И наоборот, перечитав кучу примеров по шейдерам никогда не встретишь пример самплера из multi-plane текстуры.
Там у шейдера специальный сэмплер (GL_OES_EGL_image_external), который сам конвертирует YUV в RGB.

#extension GL_OES_EGL_image_external : require
uniform samplerExternalOES sTex;

У товарища w23 я нашел прекрасную доработку для проекта obs — стратегия использования DMABUF там аналогичная.
Спасибо, посмотрю…
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории