2013-03-18 5 views
4

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

Я нашел я могу получить ББП и экран физического разрешения с помощью:

ioctl -rl 28 /dev/graphics/fb0 17920 

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

возвращение ЬиЕ: f0 00 00 00 40 01 00 00 f0 00 00 00 02 00 80 00 00 00 00 00 00 00 00 00

В Литтл е-младшему формат я есть:

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

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

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

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

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

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

enter image description here enter image description here

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

FileSize = XRES * yres * BPP/8 * numberOfFrames

FileSize = 240 * 320 * 32/8 * 2 (Android Использование двойного фреймбуфера) = 614,400

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

enter image description here enter image description here

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

+0

Я нашел ту же проблему на своем LG400 (Android 2.3.6). Странно то, что инструмент монитора (android-sdk/tools/monitor) имеет хороший скриншот шириной 256 пикселей. Поэтому я предполагаю, что этот инструмент мониторинга знает, как определить реальную ширину фреймбуфера, но я до сих пор не нашел, как это сделать. – Giacomo

ответ

6

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

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

Правая обивка называется "шаг" (шаг = (line_length в пикселях) - ширина). Многие устройства имели этот шаг в фреймбуфере, если разрешение дисплея не умножать на 8

Так формула:

FileSize = line_length * yres * numberOfFrames

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

Для retrive в line_length Вы должны использоваться FBIOGET_FSCREENINFO (0x4602 - 17922), а не FBIOGET_VSCREENINFO (0x4600 - 17922), как это:

IOCTL -rl 50/DEV/графика/fb0 17922

My 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 
                   ^_________^ 

У моей галактики Nexus есть длина линии: 2944 (0xb80).

Смежные вопросы