video1层不能显示完整视频的解决过程

来源:互联网 发布:淘宝认证服务商 编辑:程序博客网 时间:2024/04/29 05:58

2011-11-14写的一个DVS6446调试文档,今天突然发现,贴出来,自己备用。

    用TI的例程soln07d_video_loopthru,在显示器上半部分显示很小的一块,显示花屏(完全看不清图像),但显示部分会随着摄像头的移动而变化。

    不能采用这个例程进行学习,只能分步进行。首先搞定视频采集,才能进行视频显示。

    视频采集,调用的是V4L2驱动,使用soln07b_video_record例程,能够采集摄像头视频,保存为UYVY格式(每个像素占2字节空间),该例程采集的视频可以在windows下用UYVY播放器打开显示。对该例程稍作修改,采集一帧图像(/dev/video0采集),保存为target#  /tmp/video.raw。

    为了将这一帧UYVY图像显示,做了如下测试:

    target# cp /tmp/video.raw/dev/fb/3  ;将其送到video1显示,但显示花屏

    而video.raw是完好的,可以用UYVY播放器播放,说明montavista linux的framebuffer驱动做的不是很好,不能直接用cp完成显示(而RGB565图片可以直接cp到OSD窗口,前提是要将attribute窗口每一个像素都先置为0x7,表示100%显示osd层)。

    framebuffer驱动不支持cp,就只能用其它方式进行试验,看video层到底怎么回事,为什么不能显示。所以,自己写代码,利用fbdev驱动,写video层(/dev/fb/3)。同时也要注意写attribute层的对应位置,否则可能会出现(0%video, 100%osd)。

    但是,发现不能写满屏,写了半个屏幕,在往下就写不下去了(单步调试,写了200多行,再往下虽然代码上有写屏,但显示器上不会在显示了)。

    并且,不仅仅是写不下去的问题,进行了某些操作(dd 清屏,清不同层,或用TI的demo,cp一些文件如allvideo到attribute)后,是可以显示大概0.7个整屏的,但都是屏幕靠上半部分显示,下半部分显示不了。

    显示不了,可能是attribute层的设置有问题,导致下半部分video被透明掉!!于是通过ioctl查看framebuffer与显卡的参数,发现attribute层的没行720个像素,每个像素用4个位表示,理论上虽然没行只需要360个字节表示,但显卡的属性表明每行需要1440个字节来表示(显卡本身的特性与framebuffer本身对attribute层的驱动出现矛盾,应该是framebuffer的一个bug)。

    最后,将写attribute层的数据字节数补齐,能够正常显示了。总结一下,同样是linux下写framebuffer的代码,TI给的代码在它官方的板子上能跑,在合众达的板子上就不行,可能是合众达板子硬件在设计上与TI不同吧。虽然显示半屏这个问题网上也有人发帖,我搜索过几乎所有中文和英文(用 half-scale做关键词)的网页,davinci社区邮件列表,都没有解决方案。

    我是通过用dd指令、cp指令将不同的数据送向不同层的窗口,写代码获取不同层窗口的所有参数,多次调试,才发现framebuffer对attribute层驱动与显卡本身有矛盾。

原创粉丝点击