#ifdef _GPTS_PROJECT_FLAG_ // 定义电力项目-刀闸产品宏
#include "V4l2CaptureIr.h"
#include "Project/Gpts/Device/GptsDevice.h"
#include "Stream/GpFrameProcessCenter.h"
#include "Sensor/DaLiIrSensor.h"
//////////////////////////////////////////////////////////////////////////
//
CV4l2CaptureIr::CV4l2CaptureIr()
{
m_unIoMethod = V4L2_IO_METHOD_MMAP;
m_nBuffersCount = V4L2_VIDEO_LIST_BUFFER_DEFAULT_COUNT; // 申请一个拥有四个缓冲帧的缓冲区
m_pBuffers = NULL;
m_nFd = INVALID_FD_ID;
m_unImageSize = 0;
}
//////////////////////////////////////////////////////////////////////////
//
CV4l2CaptureIr::~CV4l2CaptureIr()
{
// 关闭SDK库,释放内存空间
this->deinit();
}
//////////////////////////////////////////////////////////////////////////
//
IMP_DATA_GET_METHOD(CV4l2CaptureIr, int, BuffersCount, m_nBuffersCount);
IMP_DATA_SET_METHOD(CV4l2CaptureIr, void, BuffersCount, m_nBuffersCount, int, nBuffersCount);
//////////////////////////////////////////////////////////////////////////
// 初始化
INT32 CV4l2CaptureIr::init(INT32 nIavFd, UINT32 unBuffSize)
{
LOGMSG("CV4l2CaptureIr::init nIavFd=[%d] unBuffSize=[%u]", nIavFd, unBuffSize);
// 等待耗时统计
TimePoint nTotalCostTm = currentTime();
// 获取相机配置文件参数
CDaLiIrSensor* pSensor = dynamic_cast<CDaLiIrSensor*>(this->getSensor());
CHECKI(pSensor);
CGptsDevice* pDev = dynamic_cast<CGptsDevice*>(pSensor->getDevice());
CHECKI(pDev);
StuGptsDeviceConfig* pDevConf = (StuGptsDeviceConfig*)pDev->getDevConfig();
CHECKI(pDevConf);
// 如果配置文件配置了读取配置文件
m_nBuffersCount = pDevConf->irParam.daLiIrParam.nBuffersCount == 0 ? m_nBuffersCount : pDevConf->irParam.daLiIrParam.nBuffersCount;
// 读取io模式
m_unIoMethod = (enum emV4l2IoMethod)pDevConf->irParam.daLiIrParam.nIoMethod;
LOGMSG("CV4l2CaptureIr::init read gpts dev config m_nBuffersCount=[%d] m_unIoMethod=[%u]", m_nBuffersCount, m_unIoMethod);
// 执行打开文件
CHECKI(this->openVideoDev() == ReturnCode_Success);
// 初始化视频设备
CHECKI(this->initVideoDev() == ReturnCode_Success);
LOGMSG("CV4l2CaptureIr::init is suc... costTm=[%llu]", (currentTime() - nTotalCostTm).count());
return ReturnCode_Success;
}
//////////////////////////////////////////////////////////////////////
// 打开视频设备节点
INT32 CV4l2CaptureIr::openVideoDev()
{
LOGMSG("CV4l2CaptureIr::openVideoDev");
// 等待耗时统计
TimePoint nTotalCostTm = currentTime();
struct stat stInfo;
MEMSET(stInfo);
// 获取文件信息
if (ReturnCode_Error == stat(DALI_IR_SENSOR_DEV_NAME, &stInfo))
{
LOGERROR("CV4l2CaptureIr::openVideoDev can't identify DALI_IR_SENSOR_DEV_NAME=[%s] errno=[%d] reason=[%s]", DALI_IR_SENSOR_DEV_NAME, errno, strerror(errno));
return ReturnCode_Error;
}
// 检查是否为一个字符设备
if (!S_ISCHR(stInfo.st_mode))
{
LOGERROR("CV4l2CaptureIr::openVideoDev isn't char device DALI_IR_SENSOR_DEV_NAME=[%s] errno=[%d] reason=[%s]", DALI_IR_SENSOR_DEV_NAME, errno, strerror(errno));
return ReturnCode_Error;
}
// 用户空间调用open打开对应的视频文件 非阻塞打开用户空间的/dev/video0文件
m_nFd = open(DALI_IR_SENSOR_DEV_NAME, O_RDWR | O_NONBLOCK, 0);
if (-1 == m_nFd)
{
LOGERROR("CV4l2CaptureIr::openVideoDev can't open the device DALI_IR_SENSOR_DEV_NAME=[%s] errno=[%d] reason=[%s]", DALI_IR_SENSOR_DEV_NAME, errno, strerror(errno));
return ReturnCode_Error;
}
LOGMSG("CV4l2CaptureIr::openVideoDev is suc... nTotalCostTm=[%llu] device node=[%s] m_nFd=[%d]", (currentTime() - nTotalCostTm).count(), DALI_IR_SENSOR_DEV_NAME, m_nFd);
return ReturnCode_Success;
}
//////////////////////////////////////////////////////////////////////
// 关闭视频设备节点
void CV4l2CaptureIr::closeVideoDev()
{
LOGMSG("CV4l2CaptureIr::closeVideoDev");
// 等待耗时统计
TimePoint nTotalCostTm = currentTime();
// 检查m_nFd
if (m_nFd != INVALID_FD_ID)
{
close(m_nFd);
m_nFd = INVALID_FD_ID;
}
LOGMSG("CV4l2CaptureIr::closeVideoDev is suc... nTotalCostTm=[%llu]", (currentTime() - nTotalCostTm).count());
}
//////////////////////////////////////////////////////////////////////
// 初始化视频设备
INT32 CV4l2CaptureIr::initVideoDev()
{
LOGMSG("CV4l2CaptureIr::initVideoDev");
// 等待耗时统计
TimePoint nTotalCostTm = currentTime();
// 检查m_nFd
CHECKI(m_nFd != INVALID_FD_ID);
/*
* 设备属性
* 原文链接:https://blog.csdn.net/u010661782/article/details/49020695
* 结构体来源:/usr/include/linux/videodev2.h文件。
* struct v4l2_capability {
* __u8 driver[16]; // 驱动名称
* __u8 card[32]; // 设备名称
* __u8 bus_info[32]; // 总线信息
* __u32 version; // 驱动版本号
* __u32 capabilities; // 设备具备的功能
* __u32 device_caps; // 通过特定设备(节点)访问的功能(不知道用处,网上其它资料没有该字段)
* __u32 reserved[3]; // 保留字段
* };
* capabilities 常用值:
* V4L2_CAP_VIDEO_CAPTURE 是否支持图像获取
*/
struct v4l2_capability v4l2CapInfo;
MEMSET(v4l2CapInfo);
/*
* 图像的缩放
* VIDIOC_CROPCAP
* int ioctl(int fd,int request, struct v4l2_cropcap *argp);
* struct v4l2_cropcap
* {
* enum v4l2_buf_type type; // 应用程序设置
* struct v4l2_rect bounds; // 最大边界
* struct v4l2_rect defrect; // 默认值
* struct v4l2_fract pixelaspect;
* };
*
* 原文链接: http://blog.chinaunix.net/uid-25501542-id-207390.html
* enum v4l2_buf_type
* {
* V4L2_BUF_TYPE_VIDEO_CAPTURE = 1,
* V4L2_BUF_TYPE_VIDEO_OUTPUT = 2,
* V4L2_BUF_TYPE_VIDEO_OVERLAY = 3,
* V4L2_BUF_TYPE_VBI_CAPTURE = 4,
* V4L2_BUF_TYPE_VBI_OUTPUT = 5,
* V4L2_BUF_TYPE_SLICED_VBI_CAPTURE = 6,
* V4L2_BUF_TYPE_SLICED_VBI_OUTPUT = 7,
* V4L2_BUF_TYPE_VIDEO_OUTPUT_OVERLAY = 8,
* V4L2_BUF_TYPE_PRIVATE = 0x80,
* };
*/
struct v4l2_cropcap v4l2CropCapInfo;
MEMSET(v4l2CropCapInfo);
/*
* 原文链接:http://blog.chinaunix.net/uid-22666248-id-280324.html
* 视频的采集窗口参数
* struct v4l2_crop
* {
* enum v4l2_buf_type type;
* struct v4l2_rect c;
* };
*/
struct v4l2_crop v4l2CropInfo;
MEMSET(v4l2CropInfo);
/*
* 原文链接:https://blog.csdn.net/u010661782/article/details/49020695
* VIDIOC_G_FMT,VIDIOC_S_FMT
* VIDIOC_G_FMT,VIDIOC_S_FMT
* struct v4l2_format
* {
* enum v4l2_buf_type type; // 帧类型,应用程序设置
* union fmt
* {
* struct v4l2_pix_format pix; // 视频设备使用 V4L2_BUF_TYPE_VIDEO_CAPTURE
* struct v4l2_window win; // V4L2_BUF_TYPE_VIDEO_OVERLAY
* struct v4l2_vbi_format vbi;
* struct v4l2_sliced_vbi_format sliced;
* __u8 raw_data[200]; // user-defined
* };
* };
* struct v4l2_pix_format
* {
* __u32 width; // 帧宽,单位像素
* __u32 height; // 帧高,单位像素
* __u32 pixelformat; // 帧格式
* enum v4l2_field field; // enum v4l2_field
* __u32 bytesperline; // 每一行的bit数
* __u32 sizeimage; // 图像总的bit数
* enum v4l2_colorspace colorspace; // enum v4l2_colorspace
* __u32 priv;
* };
* see also http://vektor.theorem.ca/graphics/ycbcr/
* enum v4l2
linux系统V4L2驱动对接代码C++撰写
需积分: 5 154 浏览量
2022-10-13
13:41:01
上传
评论 1
收藏 16KB RAR 举报
隨意的風
- 粉丝: 1w+
- 资源: 100
评论0