📄 v4lxif.cc
字号:
v4l1if::~v4l1if(){#ifdef v4lDEBUG debug("v4l1: ::~v4l1if begin");#endif // mute all int i; for (i = 0; i < vcap.audios; i++) if (vaudio[i].flags & VIDEO_AUDIO_MUTABLE) { vaudio[i].flags |= VIDEO_AUDIO_MUTE; if ( -1 == ioctl(devv4l,VIDIOCSAUDIO,&vaudio[i]) ) VIF_FATAL("v4l1: VIDIOC_S_AUDIO in ::v4l1if"); } smute= true;#if 1 if (ggrab > gsync) { if ( -1 == ioctl(devv4l,VIDIOCSYNC,0) ) VIF_WARN("v4l1: VIDIOCSYNC in ::~v4l1if"); else gsync++; }#endif // capture off if ( -1 == ioctl(devv4l, VIDIOCCAPTURE, &zero) ) fatal("v4l1: ioctl VIDIOCCAPTURE in v4l1if::~v4l1if"); if ((char*)-1 != grabbermem) munmap(grabbermem,msize); free(vchan); free(vaudio);#ifdef v4lDEBUG debug("v4l1: ::~v4l1if end");#endif }void v4l1if::setCapture( bool on ){ if ( -1 == ioctl(devv4l, VIDIOCCAPTURE, (on?&one:&zero) ) ) VIF_FATAL("v4l1: VIDIOCCAPTURE in ::setCapture"); scapture= on;}void v4l1if::setFreq( unsigned long freq ){ if ( -1 == ioctl(devv4l, VIDIOCSFREQ, &freq) ) VIF_FATAL("v4l1: VIDIOC_S_FREQ in ::setFreq");}void v4l1if::setPicBrightness( int bri ){#ifdef PREREAD if ( -1 == ioctl(devv4l, VIDIOCGPICT, &vpic) ) VIF_FATAL("v4l1: VIDIOC_G_PICT in ::setBrightness");#endif vpic.brightness= (bri+128)<<8; if ( -1 == ioctl(devv4l, VIDIOCSPICT, &vpic) ) VIF_FATAL("v4l1: VIDIOC_S_PICT in ::setBrightness");}void v4l1if::setPicConstrast( int contr ){#ifdef PREREAD if ( -1 == ioctl(devv4l, VIDIOCGPICT, &vpic) ) VIF_FATAL("v4l1: VIDIOC_G_PICT in ::setContrast");#endif vpic.contrast= contr<<7; if ( -1 == ioctl(devv4l, VIDIOCSPICT, &vpic) ) VIF_FATAL("v4l1: VIDIOC_S_PICT in ::setContrast");}void v4l1if::setPicColor( int color ){#ifdef PREREAD if ( -1 == ioctl(devv4l, VIDIOCGPICT, &vpic) ) VIF_FATAL("v4l1: VIDIOC_G_PICT in ::setColor");#endif vpic.colour= color<<7; if ( -1 == ioctl(devv4l, VIDIOCSPICT, &vpic) ) VIF_FATAL("v4l1: VIDIOC_S_PICT in ::setColor");}void v4l1if::setPicHue( int hue ){#ifdef PREREAD if( -1 == ioctl(devv4l, VIDIOCGPICT, &vpic) ) VIF_FATAL("v4l1: VIDIOC_G_PICT in ::setHue");#endif vpic.hue= (hue+128)<<8; if ( -1 == ioctl(devv4l, VIDIOCSPICT, &vpic) ) VIF_FATAL("v4l1: VIDIOC_S_PICT in ::setHue");}void v4l1if::setChannel( int source ){ if((source<0)||(source>=vcap.channels)) fprintf(stderr, "warning: no such channel %d\n", source);#ifdef v4lDEBUG debug("v4l1: setChannel %d",source);#endif#if 0 if ( -1 == ioctl(devv4l, VIDIOCSCHAN, &source) ) VIF_WARN("v4l1: VIDIOC_S_CHAN in ::setChannel");#else if ( -1 == ioctl(devv4l, VIDIOCSCHAN, &vchan[source]) ) VIF_WARN("v4l1: VIDIOC_S_CHAN in ::setChannel");#endif achan= source; aaudio= source;}void v4l1if::setChannelNorm( int norm ){#ifdef v4lDEBUG debug("v4l1: setChannelNorm %d",norm);#endif vchan[achan].norm= norm; if ( -1 == ioctl(devv4l, VIDIOCSCHAN, &vchan[achan]) ) VIF_WARN("v4l1: VIDIOC_S_CHAN in ::setChannelNorm");}void v4l1if::setTuner( int no ){ atuner= no;}void v4l1if::setTunerMode( int norm ){ vtuner.tuner= atuner;#ifdef PREREAD if ( -1 == ioctl(devv4l, VIDIOCGTUNER, &vtuner) ) VIF_FATAL("v4l1: VIDIOC_G_TUNER in ::setTunerMode");#endif vtuner.mode= norm; if ( -1 == ioctl(devv4l, VIDIOCSCHAN, &vtuner) ) VIF_FATAL("v4l1: VIDIOC_S_TUNER in ::setTunerMode"); warning("v4l1: Use ::setChannelNorm to set input NORM in ::setTunerMode");}void v4l1if::setAudioMute( bool on ){ if ( vaudio[aaudio].flags & VIDEO_AUDIO_MUTABLE ) { if ( -1 == ioctl(devv4l,VIDIOCGAUDIO,&vaudio[aaudio]) ) VIF_FATAL("v4l1: VIDIOC_G_AUDIO in ::setMute"); if ( on ) vaudio[aaudio].flags |= VIDEO_AUDIO_MUTE; else vaudio[aaudio].flags &= ~VIDEO_AUDIO_MUTE; if ( -1 == ioctl(devv4l,VIDIOCSAUDIO,&vaudio[aaudio]) ) VIF_FATAL("v4l1: VIDIOC_S_AUDIO in ::setMute"); smute= on; }#ifdef v4lDEBUG debug("v4l1: setAudioMute [%d] %s",aaudio,smute?"muted":"unmuted");#endif}void v4l1if::setAudioVolume( int vol ){#ifdef PREREAD if ( -1 == ioctl(devv4l,VIDIOCGAUDIO,&vaudio[aaudio]) ) VIF_FATAL("v4l1: VIDIOC_G_AUDIO in ::setVolume");#endif vaudio[aaudio].volume= vol; if ( -1 == ioctl(devv4l,VIDIOCSAUDIO,&vaudio[aaudio]) ) VIF_FATAL("v4l1: VIDIOC_S_AUDIO in ::setVolume");}void v4l1if::setAudioMode( int mode ){#ifdef PREREAD if ( -1 == ioctl(devv4l,VIDIOCGAUDIO,&vaudio[aaudio]) ) VIF_FATAL("v4l1: VIDIOC_G_AUDIO in ::setAudioMode");#endif#ifdef v4lDEBUG debug("v4l1: setAudioMode= %d [%s]",mode,audiodescr[mode]);#endif vaudio[aaudio].mode= mode; if ( -1 == ioctl(devv4l,VIDIOCSAUDIO,&vaudio[aaudio]) ) VIF_FATAL("v4l1: VIDIOC_S_AUDIO in ::setAudioMode");}void v4l1if::setPalette( int pal ){#ifndef GUILESS x11_format = ((unsigned int)pal < sizeof(format2palette)/sizeof(unsigned short))?format2palette[pal]:0; vpic.palette= x11_format; if ( vpic.palette == 0 ) { VIF_FATAL_STR("v4l1: unsupported overlay video format <%s> in ::v4l1if", format_desc[x11_format]); }#else vpic.palette = VIDEO_RGB15_LE;#endif /* GUILESS */#ifdef v4lDEBUG //debug("v4l1: palette= %s, %s",PALETTE(vpic.palette),format_desc[pal]);#endif if ( -1 == ioctl(devv4l, VIDIOCSPICT, &vpic) ) VIF_FATAL("v4l1: VIDIOC_S_PICT in ::v4l1if");}bool v4l1if::getAudioMute(){ if ( -1 == ioctl(devv4l,VIDIOCGAUDIO,&vaudio[aaudio]) ) VIF_FATAL("v4l1: VIDIOC_G_AUDIO in ::getMute");#ifdef v4lDEBUG debug("v4l1: getAudioMute %s, %d", (vaudio[aaudio].flags & VIDEO_AUDIO_MUTE)?"true":"false", vaudio[aaudio].flags);#endif return ( vaudio[aaudio].flags & VIDEO_AUDIO_MUTE );}int v4l1if::getAudioVolume(){ if ( -1 == ioctl(devv4l,VIDIOCGAUDIO,&vaudio[aaudio]) ) VIF_FATAL("v4l1: VIDIOC_G_AUDIO in ::getVolume"); return vaudio[aaudio].volume;}int v4l1if::getAudioMode(){ if ( -1 == ioctl(devv4l,VIDIOCGAUDIO,&vaudio[aaudio]) ) VIF_FATAL("v4l1: VIDIOC_G_AUDIO in ::getAudioMode");#ifdef v4lDEBUG debug("v4l1: getAudioMode= %d",vaudio[aaudio].mode);#endif return vaudio[aaudio].mode;}unsigned long v4l1if::getTunerSignal(){ vtuner.tuner= atuner; if ( -1 == ioctl(devv4l, VIDIOCGTUNER, &vtuner) ) VIF_FATAL("v4l1: VIDIOC_G_TUNER in ::getTunerSignal"); return vtuner.signal;}int v4l1if::getTunerMode(){ vtuner.tuner= atuner; if ( -1 == ioctl(devv4l, VIDIOCGTUNER, &vtuner) ) VIF_FATAL("v4l1: VIDIOC_G_TUNER in ::getTunerMode"); return vtuner.mode;}int v4l1if::getTunerFlags(){ vtuner.tuner= atuner; if ( -1 == ioctl(devv4l, VIDIOCGTUNER, &vtuner) ) VIF_FATAL("v4l1: VIDIOC_G_TUNER in ::getTunerFlags"); return vtuner.flags;}bool v4l1if::capAudioVolume(){ if ( -1 == ioctl(devv4l,VIDIOCGAUDIO,&vaudio[aaudio]) ) VIF_FATAL("v4l1: VIDIOC_G_AUDIO in ::capAudioVolume"); return ( vaudio[aaudio].flags & VIDEO_AUDIO_VOLUME );}bool v4l1if::capAudioMutable(){ if ( -1 == ioctl(devv4l,VIDIOCGAUDIO,&vaudio[aaudio]) ) VIF_FATAL("v4l1: VIDIOC_G_AUDIO in ::capAudioMutable"); return ( vaudio[aaudio].flags & VIDEO_AUDIO_MUTABLE );}bool v4l1if::capTunerStereo(){ vtuner.tuner= atuner; if ( -1 == ioctl(devv4l, VIDIOCGTUNER, &vtuner) ) VIF_FATAL("v4l1: VIDIOC_G_TUNER in ::getTunerMode"); return vtuner.flags & VIDEO_TUNER_STEREO_ON;}bool v4l1if::capTunerNorm(){ vtuner.tuner= atuner; if ( -1 == ioctl(devv4l, VIDIOCGTUNER, &vtuner) ) VIF_FATAL("v4l1: VIDIOC_G_TUNER in ::getTunerMode"); return vtuner.flags & VIDEO_TUNER_NORM;}void v4l1if::capCapSize( unsigned int *minw, unsigned int *minh, unsigned int *maxw, unsigned int *maxh ){ #if 0 *minw= vcap.minwidth; *minh= vcap.minheight; *maxw= vcap.maxwidth; *maxh= vcap.maxheight;#else *minw= vcap.minwidth; *minh= vcap.minheight; *maxw= maxwidth[vchan[achan].norm]; *maxh= maxheight[vchan[achan].norm]; #endif#ifdef v4lDEBUG debug("v4l1: minw %d, maxw %d, minh %d, maxh %d in ::capCapSize",*minw,*maxw,*minh,*maxh);#endif}int v4l1if::addCapAClip( int x1,int y1, unsigned int x2, unsigned int y2, int xadj, int yadj ){// return 0; if ( vcap.type & VID_TYPE_CLIPPING ) {#ifdef v4lDEBUG debug("v4l1: addCapAClip: [%d] %dx%d+%d+%d",nrofclips,x2-x1,y2-y1,x1-xadj,y1-yadj);#endif if ( cliprecs[nrofclips].x != x1 - xadj || cliprecs[nrofclips].y != y1 - yadj || cliprecs[nrofclips].width != (int)x2 - x1 || cliprecs[nrofclips].height != (int)y2 - y1 ) clipTabChanged= true; cliprecs[nrofclips].x= x1 - xadj; cliprecs[nrofclips].y= y1 - yadj; cliprecs[nrofclips].width= x2 - x1; cliprecs[nrofclips].height= y2 - y1; nrofclips++; } return nrofclips;}int v4l1if::setCapAClip( int x, int y, unsigned int width, unsigned int height ){// return 0;#if 0 if ( -1 == ioctl(devv4l, VIDIOCGWIN, &vwin) ) VIF_FATAL("v4l1: VIDIOC_G_WIN in ::setCapAClip");#endif#ifdef v4lDEBUG_CAP debug("v4l1: setCapAClip: flags %d, chromakey %d",vwin.flags,vwin.chromakey);#endif if ( vcap.type & VID_TYPE_CHROMAKEY ) { vwin.chromakey = 0; /* XXX */ } vwin.flags= 0; if ( vcap.type & VID_TYPE_CLIPPING ) { vwin.clips= cliprecs; vwin.clipcount= nrofclips; } vwin.x= x; vwin.y= y; vwin.height= height; vwin.width= width;#ifdef v4lDEBUG_CAP debug("v4l1: setCapAClip new values: %d, %d, %d, %d",x,y,width,height);#endif return nrofclips;}int v4l1if::applyCapAClip( int n ){// return 0; int ox,oy,oh,ow; // save old values ox=vwin.x; oy=vwin.y; ow=vwin.width; oh=vwin.height;#ifdef v4lDEBUG_CAP debug("v4l1: applyCapAClip given %d, %d, %d, %d [%d]",x,y,width,height,nrofclips);#endif if ( n == 0 ) { vwin.clipcount= n; } if ( -1 == ioctl(devv4l, VIDIOCSWIN, &vwin) ) VIF_FATAL("v4l1: VIDIOC_S_WIN in ::setCapAClip");#if 1#if 0 if ( -1 == ioctl(devv4l, VIDIOCGWIN, &vwin) ) VIF_FATAL("v4l1: VIDIOC_G_WIN in ::setCapAClip"); if ( vwin.x != x ) vwin.x=x; if ( vwin.y != y ) vwin.y=y; if ( vwin.height != height ) vwin.height= height; if ( vwin.width != width ) vwin.width= width;#else // set old values vwin.x= ox; vwin.y= oy; vwin.height= oh; vwin.width= ow;#endif#endif #if 0 vpic.palette = x11_format;#ifdef v4lDEBUG //debug("v4l1: palette=%s",PALETTE(vpic.palette));#endif if ( -1 == ioctl(devv4l, VIDIOCSPICT, &vpic) ) VIF_FATAL("v4l1: VIDIOC_S_PICT in ::v4l1if"); if ( -1 == ioctl(devv4l, VIDIOCGPICT, &vpic) ) VIF_FATAL("v4l1: VIDIOC_G_PICT in ::v4l1if");#ifdef v4lDEBUG //debug("v4l1: palette=%s",PALETTE(vpic.palette));#endif#endif return n;}void v4l1if::getCapAClip( int *x,int *y, unsigned int *width, unsigned int *height ){//return 0;#if 0 if ( -1 == ioctl(devv4l, VIDIOCGWIN, &vwin) ) VIF_FATAL("v4l1: VIDIOC_G_WIN in ::getCapAClip");#endif *x= vwin.x; *y= vwin.y; *height= vwin.height; *width= vwin.width;#ifdef v4lDEBUG_CAP debug("v4l1: getCapAClip: %d, %d, %d, %d",*x,*y,*width,*height);#endif}bool v4l1if::grabSetParams( bool fixed, int * width, int * height, int palette ){ if ( fixed ) { vgrab[0].width= *width; vgrab[0].height= *height; } else { *width= vgrab[0].width= vwin.width; *height= vgrab[0].height= vwin.height; } vgrab[0].frame=0; vgrab[0].format= palette; memcpy(&(vgrab[1]),&(vgrab[0]),sizeof(struct video_mmap)); vgrab[1].frame=1; grabCapture( true ); return true;}char * v4l1if::grabCapture( bool single ){ // even frame: 0 // odd frame: 1 char * rmem; if ( !single && (ggrab == gsync) ) if ( !grabOne( geven ? 0 : 1 ) ) return NULL; if ( !grabOne( geven ? 1 : 0 ) ) return NULL; if ( ggrab > gsync+1 ) { grabWait( geven ? 0 : 1 ); rmem= (grabbermem + vmbuf.offsets[ geven ? 0 : 1 ]); } else { grabWait( geven ? 1 : 0 ); rmem= (grabbermem + vmbuf.offsets[ geven ? 1 : 0 ]); } geven= !geven; return rmem;}bool v4l1if::grabOne( int frame ){ if ( -1 == ioctl(devv4l,VIDIOCMCAPTURE,&(vgrab[frame])) ) { if (errno == EAGAIN) { VIF_WARN("v4l1: Grabber chip can't sync"); return false; } else { VIF_FATAL_STR("v4l1: VIDIOCMCAPTURE in ::grabOne: %s",strerror(errno)); } } ggrab++; return true;}void v4l1if::grabWait( int frame ){ if ( -1 == ioctl(devv4l,VIDIOCSYNC,&(vgrab[frame].frame)) ) { VIF_WARN_STR("v4l1: VIDIOCSYNC in ::grabWait (frame %d)",frame); } else gsync++;}//==============================================================================// local Variables: ***// compile-command: "make v4lx" ***// End: ***
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -