snifer

[原创]基于ADI Blackfin的视频监控初始化

0
阅读(2381)

最近一直在做视频监控方面的工作,采用的主要是ADI Blackfin芯片。在此写一下该芯片的一般初始化过程,与大家共勉:

初始化阶段做的工作:
int ioctl(int fd, ind cmd, …) input output control 的缩写。用于和设备进行“对话”。 如果驱动程序提供了对ioctl的支持,用户就可以在用户程序中使用ioctl 函数控制设备的 I/O 通道。
fd:设备的文件描述符;cmd:用户程序对设备的控制命令 ;.省略号一般是一个表示类型长度的参数,也可以没有。
1.打开视频:
Open(”/dev/video0”,vdàfd);关闭视频设备用 close(”/dev/video0”,vdàfd);
2.读 video_capability 中信息:
ioctl(vd->fd, VIDIOCGCAP, &(vd->capability));成功后可读取 vd->capability
各分量。
3.读 video_picture 中信息:
ioctl(vd->fd, VIDIOCGPICT, &(vd->picture));
4.改变 video_picture 中分量的值:
先为分量赋新值,再调用VIDIOCSPICT。
vd->picture.colour = 65535;
if(ioctl(vd->fd, VIDIOCSPICT, &(vd->picture)) < 0)
{
perror("VIDIOCSPICT");
return -1;
}
5.初始化 channel:
必须先做得到vd->capability中的信息
for (i = 0; i < vd->capability.channels; i++)
{
vd->channel[i].channel = i;
if (ioctl(vd->fd, VIDIOCGCHAN, &(vd->channel[i])) < 0)
{
perror("v4l_get_channel:");
return -1;
}
}
截取图象的一种方法:用mmap(内存映射)方式截取视频。
mmap( )系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通
文件被映射到进程地址空间后,进程可以向访问普通内存一样对文件进行访问,
不必再调用read(),write()等操作。
两个不同进程A、B共享内存的意思是,同一块物理内存被映射到进程A、B
各自的进程地址空间。进程A可以即时看到进程B对共享内存中数据的更新,反
之亦然。采用共享内存通信的一个显而易见的好处是效率高,因为进程可以直接
读写内存,而不需要任何数据的拷贝。1.设置 picture 的属性。
2.初始化 video_mbuf,以得到所映射的 buffer 的信息。
ioctl(vd->fd, VIDIOCGMBUF, &(vd->mbuf))
3.可以修改 video_mmap 和帧状态的当前设置
vd->mmap.format = VIDEO_PALETTE_RGB24
vd->framestat[0] = vd->framestat[1] = 0; vd->frame = 0;
4.将 mmap 与 video_mbuf 绑定
void* mmap ( void * addr , size_t len , int prot , int flags , int fd ,
off_t offset )
len 为映射到调用进程地址空间的字节数,它从被映射文件开头,offset
个字节开始算起。Prot 为指定共享内存的访问权限 PROT_READ(可读),
PROT_WRITE(可写), PROT_EXEC (可执行)。Flags 为 MAP_SH
ARED MAP_PRIVATE 中必选一个,MAP_ FIXED 不推荐使用。addr 为共
内存享的起始地址,一般设 0,表示由系统分配。Mmap( ) 返回值是系统实
际分配的起始地址。
if((vd->map=(unsigned char*)mmap(0, vd->mbuf.size, PROT_READ| PR
OT_WRITE, MAP_SHARED, vd->fd, 0)) < 0)
{
perror("v4l_mmap mmap:");
return -1;
}
5.Mmap 方式下真正做视频截取的是 VIDIOCMCAPTURE。
ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap)) ;
若调用成功,开始一帧的截取,是非阻塞的,是否截取完毕留给VIDIOC
SYNC 来判断。
6.调用 VIDIOCSYNC 等待一帧截取结束
if(ioctl(vd->fd, VIDIOCSYNC, &frame) < 0)
{
perror("v4l_sync:VIDIOCSYNC");
return -1;
}
若成功,表明一帧截取已完成。可以开始做下一次 VIDIOCMCAPTURE,fra
me 是当前截取的帧的序号。

写的比较长,其中我在编程的时候也是参考了以为师兄的论文,在此表示感谢,视频监控在未来会大有作为,ADI Blackfin以他独有的魅力已经占领了一席之地(具体分析见我另外一篇博文),在这场决斗当中,取得了先手,下一个回合马上开始。。。。。。

Baidu
map