📄 glmovie.c
字号:
/* HACK * If you stick glx.h before MPEG.h, the preprocessor * will start replacing the MPEG methods Status with an * X11 variable type... blech. */#include "smpeg.h"#include "SDL.h"#include <stdlib.h>#include <malloc.h>#include <string.h>#include <unistd.h>#include "glmovie.h"static void glmpeg_update( SDL_Surface*, Sint32, Sint32, Uint32, Uint32 );int main( int argc, char* argv[] ){ SMPEG* mpeg; SMPEG_Info mpeg_info; SDL_Surface* screen; SDL_Surface* surface; if( argc < 2 ) { fprintf( stderr, "Usage: %s file.mpg\n", argv[0]); return 1; } if( SDL_Init( SDL_INIT_VIDEO | SDL_INIT_AUDIO ) < 0 ) { fprintf( stderr, "glmovie: I couldn't initizlize SDL (shrug)\n" ); return 1; } mpeg = SMPEG_new( argv[1], &mpeg_info, 1 ); if( !mpeg ) { fprintf( stderr, "glmovie: I'm not so sure about this %s file...\n", argv[1] ); SDL_Quit(); return 1; } /* Grab the mouse and input and set the video mode */ SDL_ShowCursor(0); SDL_WM_GrabInput(SDL_GRAB_ON); screen = SDL_SetVideoMode(640, 480, 0, SDL_OPENGL|SDL_FULLSCREEN); if ( !screen ) { fprintf( stderr, "glmovie: Couldn't set 640x480 GL vide mode: %s\n", SDL_GetError()); SDL_Quit(); return 1; } /* Everything needs to be in RGB for GL, but needs to be 32-bit for SMPEG. */ surface = SDL_AllocSurface( SDL_SWSURFACE, mpeg_info.width, mpeg_info.height, 32, 0x000000FF, 0x0000FF00, 0x00FF0000, 0xFF000000 ); if( !surface ) { fprintf( stderr, "glmovie: I couldn't make a surface (boo hoo)\n" ); SDL_Quit(); exit( 1 ); } /* *Initialize* with mpeg size. */ if ( glmovie_init( mpeg_info.width, mpeg_info.height ) != GL_NO_ERROR ) { fprintf( stderr, "glmovie: glmovie_init() failed!\n" ); SDL_Quit(); exit( 1 ); } /* *Resize* with window size. */ glmovie_resize( screen->w, screen->h ); SMPEG_setdisplay( mpeg, surface, NULL, glmpeg_update ); SMPEG_play( mpeg ); while( SMPEG_status( mpeg ) == SMPEG_PLAYING ) { SDL_Event event; while ( SDL_PollEvent(&event) ) { switch (event.type) { case SDL_KEYDOWN: if ( event.key.keysym.sym == SDLK_ESCAPE ) { SMPEG_stop( mpeg ); } break; case SDL_MOUSEBUTTONDOWN: case SDL_QUIT: SMPEG_stop( mpeg ); break; } } SDL_Delay(100); } glmovie_quit( ); SDL_Quit(); return 0;}static void glmpeg_update( SDL_Surface* surface, Sint32 x, Sint32 y, Uint32 w, Uint32 h ){ GLenum error; glmovie_draw( (GLubyte*) surface->pixels ); error = glGetError( ); if( error != GL_NO_ERROR ) { fprintf( stderr, "glmovie: GL error: %s\n", gluErrorString( error ) ); exit( 1 ); } SDL_GL_SwapBuffers();}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -