如何在android上发现framebuffer width?

Gui*_*tro 5 android ffmpeg framebuffer

我正在我的Android设备上捕获帧缓冲,但解码不能正确解析.

我发现我可以使用以下方式获得bbp和屏幕资源:

ioctl -rl 28 /dev/graphics/fb0 17920
Run Code Online (Sandbox Code Playgroud)

此命令返回:

返回buf:f0 00 00 00 40 01 00 00 f0 00 00 00 80 02 00 00 00 00 00 00 00 00 00 00 00 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
Run Code Online (Sandbox Code Playgroud)

我得到了这个警告:

缓冲区大小无效,数据包大小40960 <预期长度307200解码流#0时出错:0:无效参数

这两个图像:

在此输入图像描述 在此输入图像描述

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

fileSize = xres*yres*bpp/8*numberOfFrames

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

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

在此输入图像描述 在此输入图像描述

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

ama*_*llz 7

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

+-------------------------+----+
|                         |    |
|                         |    | 
|<-------- XRES --------->|    | = Xres is display resolution
|                         |    |
|                         |    |
|<------- LINE LENGTH -------->| = Memory Size per line
|                         |    |
|                         |    |
+-------------------------+----+
                      ^      ^
                      |      |
  display on screen --+      +----> This is stride
Run Code Online (Sandbox Code Playgroud)

右边的填充称为"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)是这样的:

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
                                                               ^_________^
Run Code Online (Sandbox Code Playgroud)

我的Galaxy Nexus有line_length:2944(0xb80).