Как определить ширину рамки для андроида?

Я захватываю фреймбуфер на моем устройстве Android, но декодер не работает для правильного разрешения.

Я нашел, что могу получить bbp и screen resoution, используя:

ioctl -rl 28 /dev/graphics/fb0 17920 

Эта команда возвращает:

Return buf: f0 00 00 00 40 01 00 00 f0 00 00 00 80 02 00 00 00 00 00 00 00 00 00 20 00 00 00

В little-endian формате у меня есть:

  • Последние четыре байта (20) – это число bbp 32 .
  • Первые четыре байта – ширина экрана 0xF0 = 240
  • Байты с 5 по 8 – высота экрана 0x0140 = 320

Я попытался декодировать fb (Galaxy 5), используя следующую команду:

 ./ffmpeg -vcodec rawvideo -f rawvideo -pix_fmt rgb32 -s 240x320 -i fb0 -f image2 -vcodec png image%d.png 

И я получил это предупреждение:

Недопустимый размер буфера, размер пакета 40960 <ожидаемая длина 307200 Ошибка при потоке декодирования # 0: 0: недопустимый аргумент

И эти два изображения:

Введите описание изображения здесьВведите описание изображения здесь

Мой сырой файл имеет 655.360 байт, но правильное значение ожидается 614.400 байт, используя это уравнение:

FileSize = xres * yres * bpp / 8 * numberOfFrames

FileSize = 240 * 320 * 32/8 * 2 (андроид использует двойной фреймбуфер) = 614.400

Для моего удивления я изменяю размер ширины на ffmpeg до 256, чтобы соответствовать 655.360 байт и работал (вроде, есть 16 дополнительных изображений с правой стороны! Я получил следующие изображения:

Введите описание изображения здесьВведите описание изображения здесь

Поэтому мой вопрос: ПОЧЕМУ я должен использовать ширину 256, если мое разрешение экрана составляет 240. И как открыть это магическое число для других резолюций.

Вы должны использовать line_length для вычисления размера строки.

 +-------------------------+----+ | | | | | | |<-------- XRES --------->| | = Xres is display resolution | | | | | | |<------- LINE LENGTH -------->| = Memory Size per line | | | | | | +-------------------------+----+ ^ ^ | | display on screen --+ +----> This is stride 

Правое заполнение называется «шаг» (stride = (line_length in pixel) – ширина). Многие устройства имели этот шаг в фреймбуфере, если разрешение дисплея не умножено на 8.

Таким образом, формула:

FileSize = line_length * yres * numberOfFrames

Не размножайте его с помощью bpp / 8 , потому что длина линии – это размер памяти (не размер пикселя).

Чтобы извлечь строку line_length, вы должны использовать FBIOGET_FSCREENINFO (0x4602 – 17922), а не FBIOGET_VSCREENINFO (0x4600 – 17922) следующим образом:

Ioctl -rl 50 / dev / graphics / fb0 17922

Моя Galaxy Nexus вернется так:

 return buf: 6f 6d 61 70 66 62 00 00 00 00 00 00 00 00 00 00 00 00 a0 ac 00 00 00 01 00 00 00 00 00 00 00 00 02 00 00 00 01 00 01 00 00 00 00 00 80 0b 00 00 00 00 ^_________^ 

Моя Galaxy Nexus имеет длину линии: 2944 (0xb80).