Альтернатива Android 7 GraphicBuffer для прямого доступа к памяти текстур OpenGL

Единственный способ получить прибыль от того, что мобильные устройства имеют общую память для процессора и графического процессора, это использовать GrphicBuffer. Но так как Android 7 ограничивает доступ к приватным нативным библиотекам (включая gralloc), использовать его больше невозможно. Вопрос - есть ли альтернативный способ получить прямой доступ к памяти для данных пикселей текстуры?

Я знаю, что нечто подобное можно сделать с помощью PBO (объект пиксельного буфера). Но он по-прежнему делает дополнительное копирование памяти, что нежелательно. Особенно, если мы знаем, что есть способ сделать это с нулевым количеством копий.

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


person Maxim Metelskiy    schedule 10.11.2016    source источник


Ответы (2)


Начиная с Android 8/API 26 (извините, не для Android 7...)

API аппаратного буфера являются альтернативными вариантами для GrphicBuffer().

Собственный API-интерфейс аппаратного буфера позволяет напрямую выделять буферы для создания собственных конвейеров для управления буферами между процессами. Вы можете выделить AHardwareBuffer и использовать его для получения типа ресурса EGLClientBuffer через расширение eglGetNativeClientBufferANDROID.

история изменений NDK

Минимальная версия NDK – 15c (июль 2017 г.)

Android NDK, редакция 15c (июль 2017 г.)
Добавлены собственные API для Android 8.0.
* API аппаратного буфера

android/hardware_buffer_jni.h находится в каталоге (NDK)/sysroot/usr/include/

Ссылки:
NDK — собственный аппаратный буфер (Android /hardware_buffer_jni.h)
Android/Java – HardwareBuffer
Статья о GrphicBuffer Использование OpenGL ES для ускорения работы приложений с помощью устаревших двухмерных графических интерфейсов

NB: для Android 7 / API 24
Руководство по собственному API также указано в Графика /раздел EGL

В уровне API 24 добавлена ​​поддержка расширений EGL_KHR_mutable_render_buffer, ANDROID_create_native_client_buffer и ANDROID_front_buffer_auto_refresh.

и EGL_ANDROID_create_native_client_buffer — это расширение EGL, содержащее eglCreateNativeClientBufferANDROID(), которое возвращает EGLClientBuffer. (EGL/eglext.h)

person Toris    schedule 17.07.2019

Я думаю, вы можете использовать SurfaceTexture, SurfaceTexture может создавать с помощью MediaCore, SurfaceTexture может напрямую кодировать с помощью MediaCore. Этот план может обрабатывать видео 1080p за 2–5 мс на видеокадр.

person jeff    schedule 08.01.2019