Комментарии 13
Хм… печально.
Там люди советуют использовать eglCreateImageKHR() вместо eglCreateImage()… Может поможет?
Там люди советуют использовать eglCreateImageKHR() вместо eglCreateImage()… Может поможет?
Не помогает, проверял. В теории, должны сработать eglStreams, однако, wayland основанный на них, на проприетарных драйверах, у меня, опять же, не стартует. Возможно, руки кривые.
Рискну предположить, что причина того, что NVIDIA не дружит с DMABUF в этом
Рискну предположить, что причина того, что NVIDIA не дружит с DMABUF в этом
У 4-ой малины уже, вроде, есть GLES3 на борту.
Чтобы достичь zero-copy вам в первую очередь надо отказаться от плагинов videoconvert и decodebin.
На Rpi4 должен быть доступен omxh264dec, а он уже умеет сразу отдавать dmabuf, если выставить соответствующие параметры. Эту память уже можно сразу маппить на EGLImage.
Делать новый eglImage на каждый плейн не надо — как правило платформа поддерживает NV12, который отдается декодером.
На Rpi4 должен быть доступен omxh264dec, а он уже умеет сразу отдавать dmabuf, если выставить соответствующие параметры. Эту память уже можно сразу маппить на EGLImage.
Делать новый eglImage на каждый плейн не надо — как правило платформа поддерживает NV12, который отдается декодером.
Ну так-то я в конце приписал, что гораздо разумнее забирать YUV. То есть подразумевал, что videoconvert действительно не нужен. Тут согласен.
omxh264dec в Rpi4 есть, но как-то не очень работает. Вместо него теперь v4l драйвер и он дает аппаратное декодирование видео. decodebin его и подхватывает.
Вот как «выставить соответствующие параметры, чтоб получить dmabuf» для EGLImage нигде не нашел ни одного примера.
По поводу того, что не нужны несколько отдельных eglImage на каждую plane не соглашусь. Ведь тогда невозможно будет написать шейдер, особенно с NV12. Как?
omxh264dec в Rpi4 есть, но как-то не очень работает. Вместо него теперь v4l драйвер и он дает аппаратное декодирование видео. decodebin его и подхватывает.
Вот как «выставить соответствующие параметры, чтоб получить dmabuf» для EGLImage нигде не нашел ни одного примера.
По поводу того, что не нужны несколько отдельных eglImage на каждую plane не соглашусь. Ведь тогда невозможно будет написать шейдер, особенно с NV12. Как?
В v4l2h264dec есть опция «capture-io-mode», по-умолчанию стоит в «0 (auto)». Если поставить «4» то это будет DMABUF. Далее вам надо проверить что память в буффере и правда dma при помощи gst_is_dmabuf_memory() ну и далее извлечь файловые дескрипторы и страйд/оффсет для каждого плейна (см. документацию на GstVideoMeta).
При создании eglImage в аттрибуты можно добавить до трех плейнов, читайте спецификацию расширения EXT_image_dma_buf_import
Используйте другой target для текстуры —
По поводу того, что не нужны несколько отдельных 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 текстуры.
А то получается, что я к примеру сто раз читал спецификацию EXT_image_dma_buf_import и видел, что там может быть несколько plane, но из этой доки абсолютно не понятно, как потом в шейдере извлекать пикселы из такого image.
И наоборот, перечитав кучу примеров по шейдерам никогда не встретишь пример самплера из multi-plane текстуры.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Перезагрузка текстур OpenGLESv2 через DMABUF