SOLO6010通过memset或erase操作都可以达到清除屏幕OSD的效果,但是两者有本质区别,应该区分使用。
memset操作如下:
220 fb_mem = mmap(NULL, line_length * yres, (PROT_READ | PROT_WRITE), MAP_SHARED, fd, 0);
221 memset(fb_mem, 0xff, line_length * yres);
erase操作如下:
239 struct SOLO6010FB_RECT rect = {
240 .x = 0,
241 .y = 0,
242 .width = 720,
243 .height = 576,
244 };
……
273 ioctl(fd, IOCTL_FB_ERASE, &rect);
对于memset操作,确实清除了屏幕OSD数据,但是OSD层仍然存在;对于erase操作,不但屏幕OSD数据被清除,而且整个OSD层都不存在了。如果单考虑OSD,那么两者是没有多大区别的。如果要考虑不同视频分割的边缘(border)显示,那么就需要认真区分哪里使用memset哪里使用erase操作。由于border层处于OSD之下,因此,原理上每需要完全显示一次border时就应该先做一次erase操作。
最后请注意flush操作的区域,被掩盖的border多是由错误的flush操作区域导致。
补遗1:
尽量减少使用erase操作的频率,该操作会产生屏幕抖动的现像,容易被用户察觉。
阅读(715) | 评论(0) | 转发(0) |