Как заставить gstreamer записывать видеокадры с определенным адресом памяти, указателем пользователя? - PullRequest
2 голосов
/ 04 октября 2019

Я хочу написать конвейер gstreamer, в котором видео рендерится OpenGLES2. Моей первой реализацией была gstreamer appsink, которая заставляет glTexSubImage2D () писать в текстуру, а затем рендерить. Это работает, но очень медленно. OpenGLES2 glTexSubImage2D () - очень медленная функция.

Я знаю, что для этих целей есть специальный glimagesink, но для этого требуется Window Id, где будет выполняться рендеринг, а это не то, что мне нужно.

Iмне нужно, чтобы gstreamer вставил видеокадр в текстуру OpenGLES2, а затем я сам отрендерил его, используя свои собственные шейдеры OpenGLES2, используя мои собственные преобразования и преобразования и т. д.

Я могу создать 3 области памяти DMABUF для 3 плоскостей YUV, где 3 текстуры для YU и V отображаются. Процессор выполняет запись в область памяти DMABUF, а данные отображаются в текстуре графического процессора.

Поэтому я хотел бы, чтобы gstreamer (после декодирования HW video) просто записывал готовые кадры в мои указатели памяти. Но как это сделать?

Я могу написать свою собственную программу gstreamer, которая будет копировать фрейм в мои указатели DMABUF, но это дополнительная копия, которую я хочу избежать.

Есть несколько хороших презентаций идаже YouTube видео о нулевой копии gstreamer для отображения, но без подробностей и без примера кода. Как начать?

Я уже прочитал весь интернет, но не могу найти подходящую точку для начала. Может кто-нибудь дать мне совет?

...