Чтение содержимого android-слоя

Я работаю над проектом, который включает в себя чтение содержимого слоя, который должен быть составлен с помощью SurfaceFlinger.

Мне особенно нужно проверить, является ли слой, который нужно скомпоновать, полностью 1-битным или 0-битным.

Это сделано для применения некоторых оптимизаций перед композицией с помощью SurfaceFlinger.

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

Может ли кто-нибудь сказать мне, возможно ли это вообще, и если да, то как?


person sg1993    schedule 06.06.2014    source источник


Ответы (1)


В общем, это не так. Например, если на слое отображается видео с защитой DRM, прочитать данные невозможно.

Для незащищенных слоев вы можете прочитать значения пикселей с помощью glReadPixels() — в коде скриншота SurfaceFlinger есть некоторый код, который можно включить для проверки пустых скриншотов — но это будет медленно.

Имейте в виду, что не все слои являются RGB. Если слой YUV, слой «все нули» на самом деле будет тускло-зеленым.

person fadden    schedule 06.06.2014
comment
Я отслеживал выделение буфера (используя adb logcat) и обнаружил, что возвращается дескриптор буфера (типа private_handle_t), этот дескриптор также имеет базовый адрес. Могу ли я прочитать содержимое буфера, используя это? И если да, поскольку каждый слой заканчивается в буфере, нельзя ли также прочитать содержимое слоя перед композицией? Пожалуйста, поправьте меня, если я ошибаюсь. - person sg1993; 06.06.2014
comment
Прежде чем вы сможете получить к нему доступ, вы должны заблокировать его. Его блокировка может включать memcpy из другого места, очистку кеша или другие действия и может завершиться ошибкой, если буфер защищен DRM (поскольку он находится в доверенной памяти, которую ЦП не может затронуть). Как упоминалось выше, вам также может понадобиться проверить формат буфера galloc, чтобы понять, на что вы смотрите. Предполагая, что буфер содержит выходные данные рендерера, вам также необходимо убедиться, что соответствующее ограждение сигнализировало о завершении. См. также source.android.com/devices/graphics.html . - person fadden; 07.06.2014