【问题标题】:How to discover framebuffer width on android?如何在android上发现帧缓冲区宽度?
【发布时间】:2013-08-18 08:18:07
【问题描述】:

我正在我的 android 设备上捕获帧缓冲区,但解码无法以正确的分辨率工作。

我发现我可以使用以下方法获取 bbp 和屏幕分辨率:

ioctl -rl 28 /dev/graphics/fb0 17920

此命令返回:

返回缓冲区:f0 00 00 00 40 01 00 00 f0 00 00 00 80 02 00 00 00 00 00 00 00 00 00 00 20 00 00 00

我有小端格式:

  • 最后四个字节 (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

还有这两张图片:

我的原始文件有 655.360 字节,但预期的正确值是 614.400 字节,使用以下公式:

fileSize = xres * yres * bpp/8 * numberOfFrames

fileSize = 240 * 320 * 32/8 * 2 (android 使用双帧缓冲) = 614.400

令我惊讶的是,我将 ffmpeg 上的宽度大小更改为 256 以匹配 655.360 字节并正常工作(有点,右侧有 16 个额外像素! 我得到了以下图片:

所以我的问题是为什么如果我的屏幕分辨率是 240,我必须使用 256 宽度。以及如何为其他分辨率发现这个神奇的数字。

【问题讨论】:

  • 我在我的 LG400 (Android 2.3.6) 上发现了同样的问题。奇怪的是监控工具(android-sdk/tools/monitor)截取了一个很好的 256px 宽的屏幕截图。所以我猜这个监控工具知道如何确定真正的帧缓冲区宽度,但我还没有找到。

标签: android ffmpeg framebuffer


【解决方案1】:

您应该使用 line_length 来计算线条的大小。

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

右边的填充被称为“stride”(stride = (line_length in pixel) - width)。如果显示分辨率不是 8 的倍数,许多设备在帧缓冲区中都有这个步幅。

所以公式是:

fileSize = line_length * yres * numberOfFrames

不要与 bpp/8 相乘,因为 line_length 是内存大小(不是像素大小)。

要检索 line_length,您应该像这样使用 FBIOGET_FSCREENINFO (0x4602 - 17922) 而不是 FBIOGET_VSCREENINFO (0x4600 - 17922): p>

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 的 line_length:2944 (0xb80)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    • 2014-02-16
    • 2020-07-13
    • 1970-01-01
    • 2021-11-27
    相关资源
    最近更新 更多