免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1856 | 回复: 0
打印 上一主题 下一主题

linux v4l 编程(5) V4L2 数据格式处理准备 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-12-22 08:51 |只看该作者 |倒序浏览
Andrew Huang <bluedrum@163.com, > 转载请注明名字或网址,

一.V4L格式分类

   从V4L设备的视频数据格式五花八门,但是细分下来实现三大类。
   1) RGB类.
      即将视频频每一点数据用RGB的格式表示,这种解析相对简单,但是数据量较大
   2)YUV类
    它是压缩式RGB,对于每个点的RGB的数据相关分量进行压缩,相对数据量较小,是摄像头视频主流格式。比如 V4L2_PIX_FMT_YUYV

   3)JPEG 压缩类
      即输出的一帧数据就是一个幅JPG图像数据,这一种格式对软件处理相当简单,但是对硬件处理能力要求较高,现在很多摄像头不带了,在我手头这么多摄像头中,也只有老式的ZC301的支持这种格式,
    这个包念V4L2_PIX_FMT_JPEG 和V4L2_PIX_FMT_MPEG两种格式。

   4)还有一些是保留格式,针对一些特殊设备,不具有通用性。比如象 V4L2_PIX_FMT_SN9C10X 是sn9c10的专用格式。

    应用程序在解析时,需要按格式解析,才能正确显示,
    对设备的格式的查询,可以V4L2 可以使用VIDIOC_ENUM_FMTVIDIOC_G_FMT  ,具体使用请参见前面代码.
    
二。采集前格式设置
    在视频前采集,一般要设置采集格式,用VIDIOC_S_FMT来进行设置
  1. /*
  2.  *    V I D E O I M A G E F O R M A T
  3.  */
  4. struct v4l2_pix_format {
  5.     __u32         width;
  6.     __u32            height;
  7.     __u32            pixelformat;
  8.     enum v4l2_field     field;
  9.     __u32     bytesperline;    /* for padding, zero if unused */
  10.     __u32         sizeimage;
  11.     enum v4l2_colorspace    colorspace;
  12.     __u32            priv;        /* private data, depends on pixelformat */
  13. };

   
  1. /*    Stream data format
  2.  */
  3. struct v4l2_format {
  4.     enum v4l2_buf_type type;
  5.     union {
  6.         struct v4l2_pix_format        pix; /* V4L2_BUF_TYPE_VIDEO_CAPTURE */
  7.         struct v4l2_window        win; /* V4L2_BUF_TYPE_VIDEO_OVERLAY */
  8.         struct v4l2_vbi_format        vbi; /* V4L2_BUF_TYPE_VBI_CAPTURE */
  9.         struct v4l2_sliced_vbi_format    sliced; /* V4L2_BUF_TYPE_SLICED_VBI_CAPTURE */
  10.         __u8    raw_data[200]; /* user-defined */
  11.     } fmt;
  12. };
    不同的设备,设置的使用union fmt中不同成员,其中 Capture设备使用 v4l2_pix_format.其中的pixelformat 就是前文所述格式.

   设置样例:
   
  1. CLEAR (fmt);

  2.         fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  3.         fmt.fmt.pix.width = 640;
  4.         fmt.fmt.pix.height = 480;
  5.         fmt.fmt.pix.pixelformat = V4L2_PIX_FMT_YUYV;
  6.         fmt.fmt.pix.field = V4L2_FIELD_INTERLACED;

  7.         if (-1 == xioctl (fd, VIDIOC_S_FMT, &fmt))
  8.                 errno_exit ("VIDIOC_S_FMT");

  
  
三。

 有问题发邮件到 bluedrum@163.com 或在微博 http://weibo.com/bluedrum 留言
或加入微群"嵌入式开发学习“ http://q.weibo.com/318470


您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP