Ошибка SurfaceFlinger/gralloc Out of Memory при выделении буферной памяти для использования с виртуальным кадровым буфером на Android x86 Nougat

Мы настраиваем форк проекта Android x86 Nougat (Android v7.1). Поскольку в нашей системе нет оборудования для отображения видео, мы пытаемся настроить буфер виртуального кадра (VFB), чтобы мы могли затем обрабатывать видеоизображение в произвольном порядке (например, направлять отображение видео через VNC-сервер и т. Д.).

Когда мы загружаем систему, SurfaceError пытается инициализировать ее, но когда она пытается выделить память с помощью gralloc, происходит сбой. Ниже приводится выдержка из logcat:

03-02 18:31:21.757   986   986 E gralloc : #### gralloc_alloc
03-02 18:31:21.757   986   986 E gralloc : #### gralloc_alloc_framebuffer
03-02 18:31:21.757   986   986 E gralloc : #### gralloc_alloc_framebuffer_locked
03-02 18:31:21.757   986   986 E Gralloc1On0Adapter: gralloc0 allocation failed: -12 (Out of memory)
03-02 18:31:21.757   986   986 E GraphicBufferAllocator: Failed to allocate (360 x 480) format 5 usage 6656: 5
03-02 18:31:21.757   986   986 V Gralloc1On0Adapter: Destroying descriptor 3
03-02 18:31:21.757   986   986 V Gralloc1On0Adapter: dump(0 (0xbfe341f4), 0x0
03-02 18:31:21.757   986   986 V Gralloc1On0Adapter: dump(0 (0xbfe341f4), 0x0
03-02 18:31:21.757   986   986 D GraphicBufferAllocator: Allocated buffers:
03-02 18:31:21.757   986   986 D GraphicBufferAllocator: 0xab5f60c0:  675.00 KiB |  360 ( 360) x  480 |        5 | 0x00001a00 | FramebufferSurface
03-02 18:31:21.757   986   986 D GraphicBufferAllocator: 0xab5f60f0:  675.00 KiB |  360 ( 360) x  480 |        5 | 0x00001a00 | FramebufferSurface
03-02 18:31:21.757   986   986 D GraphicBufferAllocator: Total allocated (estimate): 1350.00 KB
03-02 18:31:21.757   986   986 E         : GraphicBufferAlloc::createGraphicBuffer(w=360, h=480) failed (Out of memory), handle=0x0
03-02 18:31:21.757   986   986 E BufferQueueProducer: [FramebufferSurface] allocateBuffers: failed to allocate buffer (0 x 0, format 5, usage 0)

Вот ссылки на полные журналы:

Журнал инициализации (dmesg): http://pastebin.com/sr1rAK43

Logcat: http://pastebin.com/SVYhvgu5

Что мы сделали, чтобы все заработало:

  1. В kernel/arch/x86/configs/android-x86_defconfig установите параметр: CONFIG_FB_VIRTUAL в M для режима модуля VFB

  2. В kernel/drivers/video/fbdev/vfb.c обновлен размер буфера кадра до 64 МБ: #define VIDEOMEMSIZE (64*1024*1024)

  3. В устройстве / generic / common / init.sh я запускаю VFB и отключаю буферизацию кадров UVESA:

функция do_init ()

# init_hal_gralloc

modprobe vfb vfb_enable = 1

И в том же init.sh в конце файла перед "return 0":

/ system / bin / fbset 360 480 20

Я хотел бы знать:

1) Как я могу устранить ошибку нехватки памяти?

2) Как вы включаете vfb из командной строки ядра?

3) Любые конфигурации / настройки, которые я мог пропустить, чтобы заставить VFB работать на ядре 4.4 в Android 7.x.

0 ответов

Другие вопросы по тегам