int main(int argc, char** argv) { int ret = EXIT_SUCCESS; /* Initialize param struct to zero */ memset(&P, 0, sizeof(P)); if (!parse_input(argc, argv)) { return EXIT_FAILURE; } /* Initialize parameters corresponding to YUV-format */ setup_param(); if (!sdl_init()) { return EXIT_FAILURE; } if (!open_input()) { return EXIT_FAILURE; } if (!allocate_memory()) { ret = EXIT_FAILURE; goto cleanup; } /* Lets do some basic consistency check on input */ check_input(); /* send event to display first frame */ event.type = SDL_KEYDOWN; event.key.keysym.sym = SDLK_RIGHT; SDL_PushEvent(&event); /* while true */ event_loop(); cleanup: destroy_message_queue(); SDL_FreeYUVOverlay(my_overlay); free(P.raw); free(P.y_data); free(P.cb_data); free(P.cr_data); if (fd) { fclose(fd); } if (P.fd2) { fclose(P.fd2); } return ret; }
int main(int argc, char** argv) { my_msg the_msg; int retval; if (!strcmp(argv[1], "-d")) { destroy_message_queue(KEY); } else if (!strcmp(argv[1], "-c")) { create_message_queue(KEY); } else if (!strcmp(argv[1], "-rw")) { retval = receive_message(KEY, &the_msg, sizeof(my_msg),true); printf("Received message: %s\n", the_msg.msg_text); } else if (!strcmp(argv[1], "-r")) { retval = receive_message(KEY, &the_msg, sizeof(my_msg),false); if (!retval) printf("Received message: %s\n", the_msg.msg_text); } else if (!strcmp(argv[1], "-s")) { the_msg.msg_type = 1; strcpy(the_msg.msg_text, argv[2]); send_message(KEY, &the_msg, sizeof(my_msg),true); } return 0; }
/* loop inspired by yay * http://freecode.com/projects/yay */ Uint32 event_loop(void) { char caption[256]; Uint16 quit = 0; Uint32 frame = 0; int play_yuv = 0; unsigned int start_ticks = 0; while (!quit) { set_caption(caption, frame, 256); SDL_WM_SetCaption(caption, NULL); /* wait for SDL event */ if (P.mode == NONE || P.mode == MASTER) { SDL_WaitEvent(&event); } else if (P.mode == SLAVE) { if (!event_dispatcher()) { SDL_WaitEvent(&event); } } switch (event.type) { case SDL_KEYDOWN: switch (event.key.keysym.sym) { case SDLK_SPACE: play_yuv = 1; /* play it, sam! */ while (play_yuv) { start_ticks = SDL_GetTicks(); set_caption(caption, frame, 256); SDL_WM_SetCaption( caption, NULL ); /* check for next frame existing */ if (read_frame()) { draw_frame(); /* insert delay for real time viewing */ if (SDL_GetTicks() - start_ticks < 40) SDL_Delay(40 - (SDL_GetTicks() - start_ticks)); frame++; send_message(NEXT); } else { play_yuv = 0; } /* check for any key event */ if (SDL_PollEvent(&event)) { if (event.type == SDL_KEYDOWN) { /* stop playing */ play_yuv = 0; } } } break; case SDLK_RIGHT: /* next frame */ /* check for next frame existing */ if (read_frame()) { draw_frame(); frame++; send_message(NEXT); } break; case SDLK_LEFT: /* previous frame */ if (frame > 1) { frame--; fseek(fd, ((frame-1) * P.frame_size), SEEK_SET); if (P.diff) { fseek(P.fd2, ((frame-1) * P.frame_size), SEEK_SET); } read_frame(); draw_frame(); send_message(PREV); } break; case SDLK_UP: /* zoom in */ P.zoom++; set_zoom_rect(); screen = SDL_SetVideoMode(P.zoom_width, P.zoom_height, P.bpp, P.vflags); video_rect.w = P.zoom_width; video_rect.h = P.zoom_height; SDL_DisplayYUVOverlay(my_overlay, &video_rect); send_message(ZOOM_IN); break; case SDLK_DOWN: /* zoom out */ P.zoom--; set_zoom_rect(); screen = SDL_SetVideoMode(P.zoom_width, P.zoom_height, P.bpp, P.vflags); video_rect.w = P.zoom_width; video_rect.h = P.zoom_height; SDL_DisplayYUVOverlay(my_overlay, &video_rect); send_message(ZOOM_OUT); break; case SDLK_r: /* rewind */ if (frame > 1) { frame = 1; fseek(fd, 0, SEEK_SET); if (P.diff) { fseek(P.fd2, 0, SEEK_SET); } read_frame(); draw_frame(); send_message(REW); } break; case SDLK_g: /* display grid */ P.grid = ~P.grid; if (P.zoom < 1) P.grid = 0; draw_frame(); break; case SDLK_m: /* show mb-data on stdout */ P.mb = ~P.mb; if (P.zoom < 1) P.mb = 0; draw_frame(); break; case SDLK_F5: /* Luma data only */ P.y_only = ~P.y_only; P.cb_only = 0; P.cr_only = 0; draw_frame(); send_message(Y_ONLY); break; case SDLK_F6: /* Cb data only */ P.cb_only = ~P.cb_only; P.y_only = 0; P.cr_only = 0; draw_frame(); send_message(CB_ONLY); break; case SDLK_F7: /* Cr data only */ P.cr_only = ~P.cr_only; P.y_only = 0; P.cb_only = 0; send_message(CR_ONLY); draw_frame(); break; case SDLK_F8: /* display all color planes */ P.y_only = 0; P.cb_only = 0; P.cr_only = 0; draw_frame(); send_message(ALL_PLANES); break; case SDLK_h: /* histogram */ P.hist = ~P.hist; draw_frame(); break; case SDLK_F1: /* MASTER-mode */ if (create_message_queue()) { P.mode = MASTER; } break; case SDLK_F2: /* SLAVE-mode */ if (P.mode == MASTER) { destroy_message_queue(); } if (connect_message_queue()) { P.mode = SLAVE; } break; case SDLK_F3: /* NONE-mode */ destroy_message_queue(); P.mode = NONE; break; case SDLK_q: /* quit */ quit = 1; send_message(QUIT); break; default: break; } /* switch key */ break; case SDL_QUIT: quit = 1; break; case SDL_VIDEOEXPOSE: SDL_DisplayYUVOverlay(my_overlay, &video_rect); break; case SDL_MOUSEBUTTONDOWN: /* If the left mouse button was pressed */ if (event.button.button == SDL_BUTTON_LEFT ) { show_mb(event.button.x, event.button.y); } break; default: break; } /* switch event type */ } /* while */ return quit; }