#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函数.