当前位置: 代码迷 >> 驱动开发 >> v4l Invalid argument解决方案
  详细解决方案

v4l Invalid argument解决方案

热度:89   发布时间:2016-04-28 10:47:46.0
v4l Invalid argument
先贴上代码:
openvideo中:
[code=C/C++][/code]int open_video( char *fileptr,fb_v41 *vd ,int dep,int pal,int width,int height)
{
// 打开视频设备
  if ((vd->fd = open(fileptr, O_RDWR)) < 0) 
{
  perror("v4l_open:");
  return ERR_VIDEO_OPEN;
  }
  // 获取设备
  if (ioctl(vd->fd, VIDIOCGCAP, &(vd->capability)) < 0) 
  {
  perror("v4l_get_capability:");
  return ERR_VIDEO_GCAP;
  }
   

   
// 获取图象  
  if (ioctl(vd->fd, VIDIOCGPICT, &(vd->picture)) < 0) 
  {
  perror("v4l_get_picture");
  return ERR_VIDEO_GPIC;
  }
  // 设置图象
  vd->picture.palette = pal; // 调色板
  vd->picture.depth = dep; // 像素深度

  vd->mmap.format =pal;
  if (ioctl(vd->fd, VIDIOCSPICT, &(vd->picture)) < 0) 
  {
  perror("v4l_set_palette");
  return ERR_VIDEO_SPIC;
  }
  // 
  vd->mmap.width = width; // width;
  vd->mmap.height = height; // height;
  vd->mmap.format = vd->picture.palette; 

  vd->frame_current = 0;
  vd->frame_using[0] = 0;
  vd->frame_using[1] = 0;
   
  // 获取缓冲影射信息
  if (ioctl(vd->fd, VIDIOCGMBUF, &(vd->mbuf)) < 0) 
  {
  perror("v4l_get_mbuf");
  return -1;
  }
   
  // 建立设备内存影射
  vd->map = mmap(0, vd->mbuf.size, PROT_READ|PROT_WRITE, MAP_SHARED, vd->fd, 0);
  if ( vd->map < 0) 
  {
  perror("v4l_mmap_init:mmap");
  return -1;
  }
  printf("The video device was opened successfully.\n");
  // return get_first_frame(vd);
  return 0;
}
主函数中这样调用:[code=C/C++][/code]
ret = open_video( V4L_FILE, &vd ,
16, // 像素深度
VIDEO_PALETTE_RGB24, // 设置调包板
240,160 );

运行结果如下:
The framebuffer device was opened successfully.  
480x272, 16bpp, xoffset=0 ,yoffset=0  
The framebuffer device was mapped to memory successfully.  
FrameBuffer OK!  
RGB_FB OK!  
The video device was opened successfully.  
v4l_get_picture:: Invalid argument  
板子上出现了v4l_get_picture:: Invalid argument,无法运行下去。
Google了很长时间,也没解决问题

------解决方案--------------------
视频设备是什么?有比较详细的信息么?首先得确保用别的V4L程序能够试用视频设备,确认设备没问题。

还有,用dmesg看看有没有驱动的警告信息。
------解决方案--------------------
VIDEO_PALETTE_RGB24格式对应的vd->picture.depth应该是24 (8bit*3)而不是16.
  相关解决方案