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);