spcaview.c解析

来源:互联网 发布:梦里花落知多少txt下载 编辑:程序博客网 时间:2024/06/01 08:16

 main()

{

switch (funct) {
 case PLAYER:
  {
  /* that is spcaview player */
  spcaPlay (inputfile, owidth, oheight); //用AVILIB播放视频,sdl显示
 }
 break;
 case GRABBER:
 {
  /* spcaview grabber */

//抓取图像数据 ,并记录为视频
  spcaGrab (outputfile,fourcc , videodevice, image_width,image_height, format, owidth, oheight,   grabMethod, videoOn, audioout, videocomp, autobright, statOn, codeOn);
 }
 break;
 case CLIENT:
 {
  spcaClient(AdIp,ports,owidth,oheight, statOn);//从SERVER读取图像数据,sdl显示
 }
  
 
}

 

}

int spcaClient (char *Ip, short port,int owidth, int oheight, int statOn)
  init_sdlall();
 sock_client = open_clientsock(Ip,port);
 do{
   readjpeg(sock_client,&buf,headerframe,messcallback,statOn)
            write_sock(sock,(unsigned char*)message,sizeof(struct client_t));
              read_sock(sock,(unsigned char*)headerframe,sizeof(struct frame_t))
              read_sock(sock,*buf,headerframe->size)     
     jpeg_decode(&picture,buf,&width,&height);
   resize (p,picture,owidth,oheight,width,height) ;
   switch (run){
    case 1:
    if (SDL_PollEvent (&sdlevent) == 1) {
       switch (sdlevent.type) {
        case SDL_KEYDOWN:
         switch (sdlevent.key.keysym.sym) {
          case SDLK_s:
           //getPicture(buf,jpegsize);
           getJpegPicture(buf,width,height,
            VIDEO_PALETTE_JPEG,jpegsize,PICTURE,NULL); 
           break;
          case SDLK_w:
          messcallback->updocontrast =2;
          break;
          case SDLK_x:
          messcallback->updocontrast =1;
          break;
          case SDLK_b:
          messcallback->updobright=1;
          break;
          case SDLK_n:
          messcallback->updobright=2;
          break;
          case SDLK_l:
          messcallback->sleepon=1;
          break;
          case SDLK_c:
          messcallback->sleepon=2;
          break;
          case SDLK_j:
          messcallback->updoexposure=1;
          break;
          case SDLK_d:
          messcallback->updosize=1; //workaround change quality index
          break;
          case SDLK_f:
          messcallback->updosize=2; //workaround change quality index
          break;
          case SDLK_g:
          messcallback->fps=1; // decrease time_interval
          break;
          case SDLK_h:
          messcallback->fps=2; // increase time interval
          break;
          case SDLK_UP:
          if(messcallback->y -1 > 0)
           messcallback->y--;
           keypressed = SDLK_UP ; run = 2;
          break;
          case SDLK_DOWN:
          if(messcallback->y +1 < 256)
           messcallback->y++;
           keypressed = SDLK_DOWN; run = 2;
          break;
          case SDLK_RIGHT:
          if(messcallback->x -1 > 0)
           messcallback->x--;
           keypressed = SDLK_RIGHT; run = 2;
          break;
          case SDLK_LEFT:
          if(messcallback->x +1 < 256)
           messcallback->x++;
           keypressed = SDLK_LEFT; run = 2;
          break;
          case SDLK_SPACE:
           run = 0;
           break;
          case SDLK_q:
           quit =0;
           break;
         }
         break;
        case SDL_QUIT:
         quit = 0;
         break;
       }
    } //end Poll event
    break;
    case 0:
    if (SDL_WaitEvent (&sdlevent) == 1) {
       switch (sdlevent.type) {
        case SDL_KEYDOWN:
         switch (sdlevent.key.keysym.sym) {
          case SDLK_s:
           //getPicture(buf,jpegsize);
           break;
          case SDLK_SPACE:
           run = 1;
           break;
          case SDLK_q:
           quit =0;
           break;
         }
         break;
        case SDL_QUIT:
         quit = 0;
         break;
       }
    } //end wait event
    break;
    case 2:{
    if (SDL_PollEvent (&sdlevent) == 1) {
       switch (sdlevent.type) {
        case SDL_KEYDOWN:
        keypressed = 0;
        run = 1;
         break;
       } //end event type poll 2
    }
    switch (keypressed){
    case SDLK_UP:
     if(messcallback->y -1 > 0)
      messcallback->y--;
     break;
    case SDLK_DOWN:
     if(messcallback->y +1 < 256)
      messcallback->y++;
     break;
    case SDLK_RIGHT:
     if(messcallback->x -1 > 0)
     messcallback->x--;
     break;
    case SDLK_LEFT:
     if(messcallback->x +1 < 256)
     messcallback->x++;
     break;
    default:
    break;
    }
    } // end case 2
    break;
    }
      }while(quit);
     
     

 


int spcaPlay (char* inputfile, int width, int height)
    SDL_Init (SDL_INIT_VIDEO | SDL_INIT_TIMER)
    out_fd = AVI_open_input_file (inputfile, 1)
    framecount = (int) AVI_video_frames (out_fd);
  image_width = (int) AVI_video_width (out_fd);
  image_height = (int) AVI_video_height (out_fd);
  framerate = AVI_frame_rate (out_fd);
  audiobits = AVI_audio_bits (out_fd);
  audiorate = AVI_audio_rate (out_fd);
  audioformat = AVI_audio_format (out_fd);
  compressor = AVI_video_compressor (out_fd); 
  expect.format=AUDIO_FORMAT;
   expect.freq=audiorate;
   expect.callback=callback_play;
   expect.samples=AUDIO_SAMPLES;
   expect.channels=CHANNELS;
   expect.userdata=(void*)&RingBuffer;
  SDL_OpenAudio(&expect,NULL)
  do
  {
       if (run) {    
    readFrame (out_fd, i,&jpegData,&jpegSize,&RingBuffer, maxsound,&audiolength, &bytes_per_read,audioout, 1,videocomp);
     SDL_PauseAudio(0); // start play
    refresh_screen ( jpegData, p, format, image_width,image_height,owidth,oheight,jpegSize,0);
 
   }
  
    
    
    
    
    
    
     switch (run){
   case 1:
   if (SDL_PollEvent (&sdlevent) == 1) {
    switch (sdlevent.type) {
     case SDL_KEYDOWN:
      switch (sdlevent.key.keysym.sym) {
       
       case SDLK_DOWN:
        SDL_PauseAudio(1); // stop play
        run = 0;
        break;
       
       case SDLK_s:
        if (run == 0) {
         getJpegPicture(jpegData,image_width,image_height, format,jpegSize,PICTURE,NULL); 
        }
        break;
       case SDLK_SPACE:
       if (fullsize ==
            0) {
         pscreen = SDL_SetVideoMode (owidth, oheight, testbpp,SDL_DOUBLEBUF | SDL_FULLSCREEN | SDL_SWSURFACE);
         fullsize = 1;
        } else {
         pscreen = SDL_SetVideoMode (owidth, oheight, testbpp,SDL_DOUBLEBUF | SDL_SWSURFACE);
         fullsize = 0;
        }
        if (pscreen ==
            NULL) {
         printf ("Couldn't set %d*%dx%d video mode: %s\n", owidth, oheight, testbpp, SDL_GetError ());
         exit (1);
        }
        
        SDL_ShowCursor
         (0);
        
       
        break;
       default:
        printf ("\nStop asked\n");
        quit = 0;
        break;
      }
      break;
     case SDL_QUIT:
      quit = 0;
      break;
    }
   } //end if poll
   break;
   case 0:
   if (SDL_WaitEvent (&sdlevent) == 1) {
    switch (sdlevent.type) {
     case SDL_KEYDOWN:
      switch (sdlevent.key.keysym.sym) {
       case SDLK_UP:
        initAudio = 1;
        run = 1;
        break;
       case SDLK_RIGHT:
        if (i < (framecount- 1)) {
         i++;

         err = readFrame
          (out_fd, i,
          &jpegData,&jpegSize,
           &RingBuffer,
           maxsound,
           &audiolength,
           &bytes_per_read,
           audioout,
           1,videocomp);
         printf ("scanning up frame %d\n", i);
         refresh_screen
          (jpegData,
           p,
           format,
           image_width,
           image_height,
           owidth,
           oheight,
           jpegSize,0);

         SDL_Flip (pscreen); //switch the buffer and update screen
        }
        break;
       case SDLK_LEFT:
        if (i > 1) {
         i--;

         err = readFrame
          (out_fd, i,
          &jpegData,&jpegSize,
           &RingBuffer,
           maxsound,
           &audiolength,
           &bytes_per_read,
           audioout,
           0,videocomp);
         printf ("scanning down frame %d\n", i);
         refresh_screen
          (jpegData,
           p,
           format,
           image_width,
           image_height,
           owidth,
           oheight,
           jpegSize,0);

         SDL_Flip (pscreen); //switch the buffer and update screen
        }
        break;
       case SDLK_s:
        if (run == 0) {
         getJpegPicture(jpegData,image_width,image_height,format,jpegSize,PICTURE,NULL); 
        }
        break;
       case SDLK_SPACE:
       
        if (fullsize ==
            0) {
         pscreen = SDL_SetVideoMode (owidth, oheight, testbpp, SDL_DOUBLEBUF | SDL_FULLSCREEN | SDL_SWSURFACE);
         fullsize = 1;
        } else {
         pscreen = SDL_SetVideoMode (owidth, oheight, testbpp, SDL_DOUBLEBUF | SDL_SWSURFACE);
         fullsize = 0;
        }
        if (pscreen ==
            NULL) {
         printf ("Couldn't set %d*%dx%d video mode: %s\n", owidth, oheight, testbpp, SDL_GetError ());
         exit (1);
        }
        
        SDL_ShowCursor(0);
        refresh_screen(jpegData,p,format,image_width,image_height,owidth,oheight,jpegSize,0);
         SDL_Flip (pscreen); //switch the buffer and update screen
        break;
       default:
        printf ("\nStop asked\n");
        quit = 0;
        break;
      }
      break;
     case SDL_QUIT:
      quit = 0;
      break;
    }
   } //end if wait
   break;
   } //end switch run
  }while(i < framecount && quit == 1);