📄 capture.c
字号:
#include"capture.h" pthread_mutex_t fd_lock=PTHREAD_MUTEX_INITIALIZER;int v4lgetcapability(v4ldevice *vd){ if(ioctl(vd->fd, VIDIOCGCAP, &(vd->capability)) < 0) { perror("v4lopen:VIDIOCGCAP"); return -1; } return 0;}int v4lopen(char *name, v4ldevice *vd){ if((vd->fd = open(name,O_RDWR)) < 0) { perror("open ,error"); return -1; } if(v4lgetcapability(vd)) return -1; return 0;}int v4lgetmbuf(v4ldevice *vd){ if(ioctl(vd->fd, VIDIOCGMBUF, &(vd->mbuf))<0) { perror("v4lgetmbuf:VIDIOCGMBUF"); return -1; } return 0;}unsigned char* v4lgetaddress(v4ldevice *vd){ unsigned char add[1]; //add=vd->map + vd->mbuf.offsets[vd->frame]; return add;ַ}int v4lgrabinit(v4ldevice *vd, int width, int height){ vd->mmap.width = width; vd->mmap.height = height; vd->mmap.format =VIDEO_PALETTE_RGB565; vd->frame = 0; vd->framestat[0] = 0; vd->framestat[1] = 0; return 0;}int v4lmmap(v4ldevice *vd){ if(v4lgetmbuf(vd)<0) return -1; if((vd->map =(unsigned char*) mmap(0, vd->mbuf.size, PROT_READ|PROT_WRITE, MAP_SHARED, vd->fd, 0)) < 0) { perror("mmap,error"); return -1; } return 0;}int v4lmunmap(v4ldevice *vd){ munmap(vd->map,vd->mbuf.size); return 0;}int v4lgrabstart(v4ldevice *vd, int frame){ vd->mmap.frame = frame; if(ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap)) < 0) { perror("vidiocmcapture,error"); return -1; } vd->framestat[frame] = 1; return 0;}void *v4lsync(void *pt){ pth_1 *pth=(pth_1 *)pt; int frame; frame=pth->frame; pthread_mutex_lock(&fd_lock); if(ioctl(pth->device->fd, VIDIOCSYNC, &frame) < 0) { perror("vidiocsync,error"); exit(1); } pthread_mutex_unlock(&fd_lock); pth->device->framestat[frame] = 0; return NULL;}int v4lcapture(v4ldevice *vd, int frame){ vd->mmap.frame = frame; if(ioctl(vd->fd, VIDIOCMCAPTURE, &(vd->mmap)) < 0) { perror("vidiocmcapture ,error"); return -1; } vd->framestat[frame] = 1; return 0;}int other_clear();int width = 320;int height = 240;int main(void *rect){ v4ldevice device; pthread_t t1,t2; pth_1 pth1_a; pth_2 pth2_a; struct Rect *rectt=(struct Rect *)rect; pth2_a.link=(char*)rectt->l; char *buffer; int frame = 0; v4lopen("/dev/video0",&device); v4lgrabinit(&device,width,height); v4lmmap(&device); v4lgrabstart(&device,frame); printf("ioctl,successfully"); printf("init,successfully\n"); printf("put image,successfully\n"); while(1){ pth1_a.device=&device; pth1_a.frame=frame; pthread_create(&t1,NULL,v4lsync,&pth1_a); buffer = (char*)v4lgetaddress(&device); pth2_a.x=rectt->x; pth2_a.y=rectt->y; pth2_a.buffer=buffer; pthread_create(&t2,NULL,other_set_image,&pth2_a); pthread_join(t1,NULL); pthread_join(t2,NULL); frame = (frame+1)%2; v4lcapture(&device,frame); } v4lmunmap(&device); close(device.fd); }void *other_set_image(void *pt){ pth_2 *pth=(pth_2 *)pt; char *image=pth->buffer; unsigned char *p; int i; p=(unsigned char *)pth->link; for(i=0;i<height;i++){ memcpy(p,image,640); image+=640; p+=1280; } return NULL; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -