servfox解析

 


main()
{
  init_videoIn(&videoIn, videodevice, width, height, format,grabmethod)
  pthread_create (&w1, NULL, (void *) grab, NULL))  //   grab线程抓取图像数据,转换格式
 
  serv_sock = open_sock(serverport);
  printf("Waiting .... for connection. CTrl_c to stop !!!! \n"); 
  while (videoIn.signalquit)
    {
          sin_size = sizeof(struct sockaddr_in);
         if ((new_sock = accept(serv_sock, (struct sockaddr *)&their_addr, &sin_size)) == -1)
         {
          continue;
         }
        printf("Got connection from %s\n",inet_ntoa(their_addr.sin_addr));
        pthread_create(&server_th, NULL, (void *)service, &new_sock);  //service线程,先读取客户端的message消息,设置摄像头的参数,再向客户端先发送frame_t的headerframe图像信息,再发送图像数据
     }
  pthread_join (w1, NULL);
  close(serv_sock);
  close_v4l (&videoIn);

}


int  init_videoIn (struct vdIn *vd, char *device, int width, int height,int format, int grabmethod)                               


  vd->signalquit = 1;
  vd->hdrwidth = width;
  vd->hdrheight = height;
  vd->formatIn = format;
  vd->bppIn = GetDepth (vd->formatIn);
  vd->grabMethod = grabmethod;  //mmap or read
  vd->pFramebuffer = NULL;
  init_v4l (vd);
  /* allocate the 4 frames output buffer */
  for (i = 0; i < OUTFRMNUMB; i++)
    {
      vd->ptframe[i] = NULL;
      vd->ptframe[i] =
       (unsigned char *) realloc (vd->ptframe[i], sizeof(struct frame_t) + (size_t) vd->framesizeIn );
      vd->framelock[i] = 0;
    }
   vd->frame_cour = 0;
   pthread_mutex_init (&vd->grabmutex, NULL);

}

 

static int init_v4l (struct vdIn *vd)
{


 if (vd->grabMethod)
    {
      printf (" grabbing method default MMAP asked \n");
      memset (&(vd->videombuf), 0, sizeof (vd->videombuf));
      ioctl (vd->fd, VIDIOCGMBUF, &(vd->videombuf))
     printf ("VIDIOCGMBUF size %d  frames %d  offets[0]=%d offsets[1]=%d\n",
     vd->videombuf.size, vd->videombuf.frames,
     vd->videombuf.offsets[0], vd->videombuf.offsets[1]);
      vd->pFramebuffer =(unsigned char *) mmap (0, vd->videombuf.size, PROT_READ | PROT_WRITE,MAP_SHARED, vd->fd, 0);
      vd->mmapsize = vd->videombuf.size;
      vd->vmmap.height = vd->hdrheight;
      vd->vmmap.width = vd->hdrwidth;
      vd->vmmap.format = vd->formatIn;
      for (f = 0; f < vd->videombuf.frames; f++)
     {
       vd->vmmap.frame = f;
       ioctl (vd->fd, VIDIOCMCAPTURE, &(vd->vmmap))  
        vd->vmmap.frame = 0;
      }
    }
  else
    {
      /* read method */
      /* allocate the read buffer */
      vd->pFramebuffer =(unsigned char *) realloc (vd->pFramebuffer, (size_t) vd->framesizeIn);
      printf (" grabbing method READ asked \n");
      ioctl (vd->fd, VIDIOCGWIN, &(vd->videowin)
      vd->videowin.height = vd->hdrheight;
      vd->videowin.width = vd->hdrwidth;
      ioctl (vd->fd, VIDIOCSWIN, &(vd->videowin)
    }
   vd->frame_cour = 0;
  }

 


                                                                                                           
void grab (void)                                
{                                                                 
  for (;;)                                 
    {                                      
           v4lGrab(&videoIn);             
           break;                                   
   }                                        
                                          
}              

 

int  v4lGrab (struct vdIn *vd )

{
   if (vd->grabMethod)                                                                  
   {                                                                                                                                        
      ioctl (vd->fd, VIDIOCSYNC,&vd->vmmap.frame);
      jpegsize= convertframe(vd->ptframe[vd->frame_cour]+ sizeof(struct frame_t), vd->pFramebuffer + vd->videombuf.offsets[vd->vmmap.frame],vd->hdrwidth,vd->hdrheight,vd->formatIn,qualite);
      headerframe=(struct frame_t*)vd->ptframe[vd->frame_cour];
     snprintf(headerframe->header,5,"%s","SPCA");
     headerframe->seqtimes = ms_time();
     headerframe->deltatimes=(int)(headerframe->seqtimes-timecourant);
     headerframe->w = vd->hdrwidth;
     headerframe->h = vd->hdrheight;
     headerframe->size = (( jpegsize < 0)?0:jpegsize);
     headerframe->format = vd->formatIn;
     headerframe->nbframe = frame++;
     ioctl (vd->fd, VIDIOCMCAPTURE, &(vd->vmmap);
     vd->vmmap.frame = (vd->vmmap.frame + 1) % vd->videombuf.frames;
     vd->frame_cour = (vd->frame_cour +1) % OUTFRMNUMB;                                                  
  }   
  else
  {
           len = read (vd->fd, vd->pFramebuffer, size); 
           jpegsize= convertframe(vd->ptframe[vd->frame_cour]+ sizeof(struct frame_t), vd->pFramebuffer ,vd->hdrwidth,vd->hdrheight,vd->formatIn,qualite);                         
           headerframe=(struct frame_t*)vd->ptframe[vd->frame_cour];                    
            snprintf(headerframe->header,5,"%s","SPCA");                                                                          
            headerframe->seqtimes = ms_time();                                           
            headerframe->deltatimes=(int)(headerframe->seqtimes-timecourant);            
            headerframe->w = vd->hdrwidth;                                               
            headerframe->h = vd->hdrheight;                                              
            headerframe->size = (( jpegsize < 0)?0:jpegsize);;                           
            headerframe->format = vd->formatIn;                                          
            headerframe->nbframe = frame++;                                              
            vd->frame_cour = (vd->frame_cour +1) % OUTFRMNUMB;   
           
           
   }

}                                    


void   service (void *ir)
{         
     for (;;)                                                                       
        {                                                                    
          memset(&message,0,sizeof(struct client_t));                        
         ret = read(sock,(unsigned char*)&message,sizeof(struct client_t));    
                                                   
         if(ret && (message.message[0] != 'O')) break;                         
                                                                             
         if (message.updobright){                                              
          switch (message.updobright){                                         
         case 1:                                                              
          bright = upbright(&videoIn);                                       
         break;                                                               
         case 2: bright = downbright(&videoIn);                               
         break;                                                               
         }                                                                    
         ack = 1;                                                             
         } else if (message.updocontrast){                                     
          switch (message.updocontrast){                                       
         case 1: contrast = upcontrast(&videoIn);                             
         break;                                                               
         case 2: contrast = downcontrast(&videoIn);                           
         break;                                                               
         }                                                                    
         ack = 1;                                                             
        } else if (message.updoexposure){                                      
          switch (message.updoexposure){                                       
         case 1: spcaSetAutoExpo(&videoIn);                                   
         break;                                                               
         case 2:;                                                             
         break;                                                               
         }                                                                    
         ack = 1;                                                             
        } else if (message.updosize){ //compatibility FIX chg quality factor ATM
          switch (message.updosize){                                           
         case 1: qualityUp(&videoIn);                                         
         break;                                                               
         case 2: qualityDown(&videoIn);                                       
         break;                                                               
         }                                                                    
         ack = 1;                                                             
        } else if (message.fps){                                               
          switch (message.fps){                                                
         case 1: timeDown(&videoIn);                                          
         break;                                                               
         case 2: timeUp(&videoIn);                                            
         break;                                                               
         }                                                                    
         ack = 1;                                                             
        } else if (message.sleepon){                                           
         if(fd){                                                              
          switch (message.sleepon){                                          
          case 1:                                                            
           wakeup = !wakeup; //1;                                             
          break;                                                             
          case 2:                                                            
          cmd = 1;                                                           
          break;                                                             
          }                                                                  
         }                                                                    
         ack = 1;                                                             
         } else ack =0;      
 
redo:
       while ((frameout == videoIn.frame_cour) && videoIn.signalquit) usleep(1000);
       if (videoIn.signalquit)
       {
               videoIn.framelock[frameout]++;
               headerframe = (struct frame_t *) videoIn.ptframe[frameout];
               headerframe->acknowledge = ack;
               headerframe->bright = bright;
               headerframe->contrast = contrast;
               headerframe->wakeup = wakeup;
               if(headerframe->size == 0)
               {
           
                videoIn.framelock[frameout]--;
                frameout = (frameout+1)% OUTFRMNUMB; 
                 goto redo;
               }
   
               write_sock(sock, (unsigned char *)headerframe, sizeof(struct frame_t)) ; 
               write_sock(sock,(unsigned char*)(videoIn.ptframe[frameout]+sizeof(struct frame_t)),headerframe->size);
               videoIn.framelock[frameout]--;
               frameout = (frameout+1)% OUTFRMNUMB;    
                close_sock(sock);
                pthread_exit(NULL);
               
   }
  }                                                          

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值