framebuffer输出桌面,图像撕裂,调用FBIO_WAITFORVSYNC,FBIOPAN_DISPLAY失败

SimpleDrunk 2014-10-10 11:15:38
最近在捣腾利用framebuffer输出桌面的东西,视频和音频现在都能输出了,但是画面有撕裂现象。
我采用的是直接memcpy /dev/fb0的数据到SDL显示,造成了撕裂的原因我认为应该是cooy framebuffer的时候正好它在writing,所以framebuffer中分别有两帧的画面在所以造成了撕裂。
所以我考虑到利用 垂直同步信号 得到同步信号的时候copy,这样就能避免copy的同时正在write
但是在利用 FBIO_WAITFORVSYNC,FBIOPAN_DISPLAY都失败了

ioctl(fd, FBIO_WAITFORVSYNC, 0) errno: 25 (Inappropriate ioctl for device)
ioctl(fb, FBIOPAN_DISPLAY, &vi) ,errno: 22 (invalid argument)
下面是例子

#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/fb.h>
#include <sys/mman.h>

#ifndef FBIO_WAITFOVSYNC
#define FBIO_WAITFORVSYNC _IOW('F', 0x20, __u32)
#endif

int main(int argc, char* argv[])
{
int fbfd = 0;
struct fb_var_screeninfo vinfo;

fbfd = open("/dev/fb0", O_RDWR);
if (!fbfd)
{
printf("Error: cannot open framebuffer device.\n");
return 1;
}
printf("The framebuffer device was opened successfully.\n");

if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo))
printf("Error reading variable information.\n");

if (ioctl(fbfd, FBIO_WAITFORVSYNC, 0))
printf("VSync failed.\n");
vinfo.yoffset = vinfo.yres;
if (ioctl(fbfd, FBIOPAN_DISPLAY, &vinfo))
printf("VSync failed.\n");
close(fbfd).
}


测试的结果是VSync failed. VSync failed.

我用的系统是ubuntu 12.04 64位, 安装了fbset,这两个command在fb.h中都能找。

有没弄过相关的,怎么样才能调用这两个命令成功的,在线等!
...全文
1988 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
知遇_漫天星 2016-08-24
  • 打赏
  • 举报
回复
引用 3 楼 u011046042 的回复:
这个我也遇到了 ,现在还没有解决
我刚刚试过,就这代码,没出错
道亦无名 2016-08-16
  • 打赏
  • 举报
回复
这个我也遇到了 ,现在还没有解决
SimpleDrunk 2014-10-18
  • 打赏
  • 举报
回复
现在等于 把 桌面的数据 拷贝到指定的地方 发送。。 memcpy(dst, src, 1920*1080*4) 耗时 50多ms,这段时间内,其实framebuffer已经被刷新好几次了 有没有好一些的拷贝方法,不会汇编,不知道会不会提高很多。 另外,怎样才能知道framebuffer每次刷新完,这时拷贝可以避免被重新覆盖。 希望有谁接触过这方面能给一些指点,谢谢。。
SimpleDrunk 2014-10-18
  • 打赏
  • 举报
回复
没有人研究这方面的东西吗?

23,121

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 应用程序开发区
社区管理员
  • 应用程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧