当前位置: 代码迷 >> 驱动开发 >> 跪求大侠解释:用v4l编程采集数据放到frambuffer上,显示花屏(开发版是micro2440)解决办法
  详细解决方案

跪求大侠解释:用v4l编程采集数据放到frambuffer上,显示花屏(开发版是micro2440)解决办法

热度:50   发布时间:2016-04-28 10:58:33.0
跪求大侠解释:用v4l编程采集数据放到frambuffer上,显示花屏(开发版是micro2440)
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>[code=C/C++][/code]

#include <linux/videodev.h>
#include <sys/ioctl.h>

#include <fcntl.h>//上锁
#include <linux/fb.h>
#include <sys/mman.h>

#include "camera.h"

/*********************************************************************************************************
** Function name: get_grab_frame
** Descriptions: 获取图像帧,该函数调用了VIDIOCMCAPTURE的ioctl,获取一帧图片
** Input: *vd,参数指针
** frame,帧号
** Output : 无
** Created by:
** Created Date: 
**-------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------
********************************************************************************************************/
int get_grab_frame(fb_v41 *vd, int frame)
{
 //如果正在采集中
  if (vd->frame_using[frame]) {
  fprintf(stderr, "get_grab_frame: frame %d is already used.\n", frame);
  return ERR_FRAME_USING;
  }

  vd->mmap.frame = frame;

  if (ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap)) < 0) { //开始获取图片
  perror("v4l_grab_frame");
  return ERR_GET_FRAME;
  }
  //置为采集忙状态
  vd->frame_using[frame] = 1;
  vd->frame_current = frame;
  return 0;
}

/*********************************************************************************************************
** Function name: get_next_frame
** Descriptions: 获取下一帧的图像
** Input: *vd ,参数指针
** Output : 返回0表示正常完成返回。
** Created by:
** Created Date: 
**-------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------
********************************************************************************************************/
int get_next_frame(fb_v41 *vd)
{
 int ret;
 vd->frame_current ^= 1;//两帧采集不是0就是1
 ret = get_grab_frame( vd,vd->frame_current); // 获取图像数据
 if( ret < 0 )
  return ret;
  
 if (ioctl(vd->fd, VIDIOCSYNC, &(vd->frame_current)) < 0) // 等待帧同步
 { perror("v4l_grab_sync");
  return ERR_SYNC;
  }
  vd->frame_using[vd->frame_current] = 0 ;//采集完毕置0
 return 0; 
}

/*********************************************************************************************************
** Function name: get_next_frame_address
** Descriptions: 获取帧地址.调用该函数可以获取当前帧的缓冲地址
** Input: *vd ,参数指针
** Output : 返回帧图像数据的指针地址.
** Created by:
** Created Date: 
**-------------------------------------------------------------------
** Modified by:
** Modified Date: 
**------------------------------------------------------------------
********************************************************************************************************/
unsigned char *get_next_frame_address(fb_v41 *vd)
{
 return (vd->map + vd->mbuf.offsets[vd->frame_current]); // 从MAP内存中找到当前帧的起始指针
}

/*********************************************************************************************************
** Function name: rgb_to_framebuffer
** Descriptions: 写图像数据到Framebuffer,使用该函数前必须成功执行open_framebuffer函数.
  相关解决方案