From 8ffaf8a85e22704616b16e4c489fe8cb471fcf13 Mon Sep 17 00:00:00 2001 From: pontscho Date: Tue, 8 May 2001 12:17:03 +0000 Subject: [PATCH] add gui support git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@724 b3059339-0415-0410-9bf9-f77b7e298cf2 --- Makefile | 5 +- cfg-mplayer.h | 6 +- configure | 17 ++++ libvo/vo_xmga.c | 115 ++++++++++++++------- libvo/vo_xv.c | 92 +++++++++++------ libvo/x11_common.c | 69 +++++++++---- libvo/x11_common.h | 11 +++ mplayer.c | 242 +++++++++++++++++++++++++++++++++++++-------- 8 files changed, 428 insertions(+), 129 deletions(-) diff --git a/Makefile b/Makefile index c2e1ca356b..9fe7f246c2 100644 --- a/Makefile +++ b/Makefile @@ -62,7 +62,10 @@ opendivx/libdecore.a: encore/libencore.a: $(MAKE) -C encore -$(PRG): .depend mplayer.o $(OBJS) loader/libloader.a $(DS_DEP) libmpeg2/libmpeg2.a opendivx/libdecore.a $(COMMONLIBS) encore/libencore.a +mplayerwithoutlink: .depend mplayer.o $(OBJS) loader/libloader.a $(DS_DEP) libmpeg2/libmpeg2.a opendivx/libdecore.a $(COMMONLIBS) encore/libencore.a + @for a in mp3lib libac3 libmpeg2 libvo opendivx encore loader/DirectShow ; do $(MAKE) -C $$a all ; done + +$(PRG): mplayerwithoutlink $(CC) $(CFLAGS) -o $(PRG) mplayer.o $(OBJS) $(XMM_LIBS) $(LIRC_LIBS) $(A_LIBS) -lm $(TERMCAP_LIB) -Lloader -lloader $(DS_LIB) -ldl -Llibmpeg2 -lmpeg2 -Lopendivx -ldecore $(VO_LIBS) $(CSS_LIB) -Lencore -lencore -lpthread # $(PRG_HQ): .depend mplayerHQ.o $(OBJS) loader/libloader.a libmpeg2/libmpeg2.a opendivx/libdecore.a $(COMMONLIBS) encore/libencore.a diff --git a/cfg-mplayer.h b/cfg-mplayer.h index 2b635e1daf..8bc95ec5b9 100644 --- a/cfg-mplayer.h +++ b/cfg-mplayer.h @@ -116,9 +116,9 @@ struct config conf[]={ {"verbose", &verbose, CONF_TYPE_INT, CONF_RANGE, 0, 100}, {"v", cfg_inc_verbose, CONF_TYPE_FUNC, 0, 0, 0}, - {"-help", help_text, CONF_TYPE_PRINT, CONF_NOCFG, 0, 0}, - {"help", help_text, CONF_TYPE_PRINT, CONF_NOCFG, 0, 0}, - {"h", help_text, CONF_TYPE_PRINT, CONF_NOCFG, 0, 0}, +// {"-help", help_text, CONF_TYPE_PRINT, CONF_NOCFG, 0, 0}, +// {"help", help_text, CONF_TYPE_PRINT, CONF_NOCFG, 0, 0}, +// {"h", help_text, CONF_TYPE_PRINT, CONF_NOCFG, 0, 0}, {NULL, NULL, 0, 0, 0, 0} }; diff --git a/configure b/configure index 21c0c99667..7519b990e3 100755 --- a/configure +++ b/configure @@ -229,6 +229,8 @@ _x11lib= _select='#define HAVE_AUDIO_SELECT' +_gui=no; + for i in `echo $pparam`; do case "$i" in @@ -589,6 +591,9 @@ do --enable-select) _select='#define HAVE_AUDIO_SELECT' ;; + --enable-gui) + _gui=yes + ;; --disable-css) _css=no ;; @@ -656,6 +661,9 @@ do --disable-fastmemcpy) _fastmemcpy=no ;; + --disable-gui) + _gui=no + ;; --with-win32libdir=*) _win32libdir=`echo $ac_option | cut -d '=' -f 2` _win32libdirnotify=no @@ -983,6 +991,12 @@ else _mpg123='#undef DEFAULT_MPG123' fi +if [ $_gui = yes ]; then + _gui='#define HAVE_GUI' +else + _gui='#undef HAVE_GUI' +fi + cat > $CCONF << EOF /* -------- Generated by ./configure ----------- */ @@ -1037,6 +1051,9 @@ $_dshow /* Use 3dnow/mmxext/sse/mmx optimized fast memcpy() [maybe buggy... signal 4]*/ $_fastmemcpy +/* gui support, please do not edit this option */ +$_gui + /* Define if your processor stores words with the most significant byte first (like Motorola and SPARC, unlike Intel and VAX). */ /* #define WORDS_BIGENDIAN */ diff --git a/libvo/vo_xmga.c b/libvo/vo_xmga.c index d3325ba989..a069b34dff 100644 --- a/libvo/vo_xmga.c +++ b/libvo/vo_xmga.c @@ -87,6 +87,10 @@ static Window mRoot; static uint32_t drwX,drwY,drwWidth,drwHeight,drwBorderWidth,drwDepth; static uint32_t drwcX,drwcY,dwidth,dheight,mFullscreen; +#ifdef HAVE_GUI + static uint32_t mdwidth,mdheight; +#endif + static XSetWindowAttributes xWAttribs; #include "mga_common.c" @@ -106,6 +110,20 @@ static void set_window(){ XTranslateCoordinates( mDisplay,mWindow,mRoot,0,0,&drwcX,&drwcY,&mRoot ); //fprintf( stderr,"[xmga] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n",drwcX,drwcY,drwX,drwY,drwWidth,drwHeight ); + #ifdef HAVE_GUI + if ( vo_window != None ) + { + mFullscreen=0; + dwidth=mdwidth; dheight=mdheight; + if ( ( drwWidth == vo_screenwidth )&&( drwHeight == vo_screenheight ) ) + { + mFullscreen=1; + dwidth=vo_screenwidth; + dheight=vo_screenwidth * mdheight / mdwidth; + } + } + #endif + if ( mFullscreen ) { drwX=( vo_screenwidth - (dwidth > vo_screenwidth?vo_screenwidth:dwidth) ) / 2; @@ -224,19 +242,11 @@ static uint32_t init( uint32_t width, uint32_t height, uint32_t d_width, uint32_ wndX=0; wndY=0; wndWidth=d_width; wndHeight=d_height; dwidth=d_width; dheight=d_height; + #ifdef HAVE_GUI + mdwidth=d_width; mdheight=d_height; + #endif mFullscreen=fullscreen; - if ( fullscreen ) - { - wndWidth=vo_screenwidth; - wndHeight=vo_screenheight; - } - - XGetWindowAttributes( mDisplay,DefaultRootWindow( mDisplay ),&attribs ); - mDepth=attribs.depth; - if ( mDepth != 15 && mDepth != 16 && mDepth != 24 && mDepth != 32 ) mDepth=24; - XMatchVisualInfo( mDisplay,mScreen,mDepth,TrueColor,&vinfo ); - xWAttribs.colormap=XCreateColormap( mDisplay,RootWindow( mDisplay,mScreen ),vinfo.visual,AllocNone ); switch ( vo_depthonscreen ) { case 32: @@ -245,34 +255,62 @@ static uint32_t init( uint32_t width, uint32_t height, uint32_t d_width, uint32_ case 15: fgColor=0x7c1fL; break; default: printf( "Sorry, this (%d) color depth not supported.\n",vo_depthonscreen ); return -1; } - xWAttribs.background_pixel=0; - xWAttribs.border_pixel=0; - xWAttribs.event_mask=StructureNotifyMask | ExposureMask | KeyPressMask; - xswamask=CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; - mWindow=XCreateWindow( mDisplay,RootWindow( mDisplay,mScreen ), - wndX,wndY, - wndWidth,wndHeight, - xWAttribs.border_pixel, - mDepth, - InputOutput, - vinfo.visual,xswamask,&xWAttribs ); - vo_hidecursor(mDisplay,mWindow); +#ifdef HAVE_GUI + if ( vo_window == None ) + { +#endif + if ( fullscreen ) + { + wndWidth=vo_screenwidth; + wndHeight=vo_screenheight; + } - if ( fullscreen ) vo_x11_decoration( mDisplay,mWindow,0 ); + XGetWindowAttributes( mDisplay,DefaultRootWindow( mDisplay ),&attribs ); + mDepth=attribs.depth; + if ( mDepth != 15 && mDepth != 16 && mDepth != 24 && mDepth != 32 ) mDepth=24; + XMatchVisualInfo( mDisplay,mScreen,mDepth,TrueColor,&vinfo ); + xWAttribs.colormap=XCreateColormap( mDisplay,RootWindow( mDisplay,mScreen ),vinfo.visual,AllocNone ); + xWAttribs.background_pixel=0; + xWAttribs.border_pixel=0; + xWAttribs.event_mask=StructureNotifyMask | ExposureMask | KeyPressMask; + xswamask=CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; - XGetNormalHints( mDisplay,mWindow,&hint ); - hint.x=wndX; hint.y=wndY; - hint.width=wndWidth; hint.height=wndHeight; - hint.base_width=wndWidth; hint.base_height=wndHeight; - hint.flags=USPosition | USSize; - XSetNormalHints( mDisplay,mWindow,&hint ); - XStoreName( mDisplay,mWindow,mTitle ); + mWindow=XCreateWindow( mDisplay,RootWindow( mDisplay,mScreen ), + wndX,wndY, + wndWidth,wndHeight, + xWAttribs.border_pixel, + mDepth, + InputOutput, + vinfo.visual,xswamask,&xWAttribs ); + vo_hidecursor(mDisplay,mWindow); + if ( fullscreen ) vo_x11_decoration( mDisplay,mWindow,0 ); + + XGetNormalHints( mDisplay,mWindow,&hint ); + hint.x=wndX; hint.y=wndY; + hint.width=wndWidth; hint.height=wndHeight; + hint.base_width=wndWidth; hint.base_height=wndHeight; + hint.flags=USPosition | USSize; + XSetNormalHints( mDisplay,mWindow,&hint ); + XStoreName( mDisplay,mWindow,mTitle ); + XMapWindow( mDisplay,mWindow ); +#ifdef HAVE_GUI + } + else + { + mWindow=vo_window; + fprintf( stderr,"[xmga] width: %d height: %d d_width: %d d_height: %d\n",width,height,d_width,d_height ); + if ( vo_screenwidth != d_width ) + { + XMoveWindow( mDisplay,mWindow,( vo_screenwidth - d_width ) / 2,( vo_screenheight - d_height ) / 2 ); + XResizeWindow( mDisplay,mWindow,d_width,d_height ); + } + else mFullscreen=1; + } +#endif mGC=XCreateGC( mDisplay,mWindow,GCForeground,&wGCV ); - XMapWindow( mDisplay,mWindow ); - set_window(); mga_vid_config.src_width=width; @@ -285,8 +323,15 @@ static uint32_t init( uint32_t width, uint32_t height, uint32_t d_width, uint32_ if(mga_init()) return -1; - XFlush( mDisplay ); - XSync( mDisplay,False ); +#ifdef HAVE_GUI + if ( vo_window == None ) + { +#endif + XFlush( mDisplay ); + XSync( mDisplay,False ); +#ifdef HAVE_GUI + } +#endif saver_off(mDisplay); diff --git a/libvo/vo_xv.c b/libvo/vo_xv.c index 2e013b8f5b..82d727cef5 100644 --- a/libvo/vo_xv.c +++ b/libvo/vo_xv.c @@ -85,6 +85,10 @@ static Window mRoot; static uint32_t drwX,drwY,drwWidth,drwHeight,drwBorderWidth,drwDepth; static uint32_t drwcX,drwcY,dwidth,dheight,mFullscreen; +#ifdef HAVE_GUI + static uint32_t mdwidth,mdheight; +#endif + /* * connect to server, create and map window, * allocate colors and (shared) memory @@ -121,36 +125,54 @@ static uint32_t init(uint32_t width, uint32_t height, uint32_t d_width, uint32_t screen = DefaultScreen(mydisplay); - hint.x = 0; - hint.y = 0; - hint.width = d_width; - hint.height = d_height; - if ( fullscreen ) +#ifdef HAVE_GUI + if ( vo_window == None ) { - hint.width=vo_screenwidth; - hint.height=vo_screenheight; +#endif + hint.x = 0; + hint.y = 0; + hint.width = d_width; + hint.height = d_height; + if ( fullscreen ) + { + hint.width=vo_screenwidth; + hint.height=vo_screenheight; + } + hint.flags = PPosition | PSize; + XGetWindowAttributes(mydisplay, DefaultRootWindow(mydisplay), &attribs); + depth=attribs.depth; + if (depth != 15 && depth != 16 && depth != 24 && depth != 32) depth = 24; + XMatchVisualInfo(mydisplay, screen, depth, TrueColor, &vinfo); + + xswa.background_pixel = 0; + xswa.border_pixel = 0; + xswamask = CWBackPixel | CWBorderPixel; + + mywindow = XCreateWindow(mydisplay, RootWindow(mydisplay,screen), + hint.x, hint.y, hint.width, hint.height, + 0, depth,CopyFromParent,vinfo.visual,xswamask,&xswa); + vo_hidecursor(mydisplay,mywindow); + + XSelectInput(mydisplay, mywindow, StructureNotifyMask | KeyPressMask ); + XSetStandardProperties(mydisplay, mywindow, hello, hello, None, NULL, 0, &hint); + if ( fullscreen ) vo_x11_decoration( mydisplay,mywindow,0 ); + XMapWindow(mydisplay, mywindow); + XFlush(mydisplay); + XSync(mydisplay, False); +#ifdef HAVE_GUI } - hint.flags = PPosition | PSize; - XGetWindowAttributes(mydisplay, DefaultRootWindow(mydisplay), &attribs); - depth=attribs.depth; - if (depth != 15 && depth != 16 && depth != 24 && depth != 32) depth = 24; - XMatchVisualInfo(mydisplay, screen, depth, TrueColor, &vinfo); - - xswa.background_pixel = 0; - xswa.border_pixel = 0; - xswamask = CWBackPixel | CWBorderPixel; - - mywindow = XCreateWindow(mydisplay, RootWindow(mydisplay,screen), - hint.x, hint.y, hint.width, hint.height, - 0, depth,CopyFromParent,vinfo.visual,xswamask,&xswa); - vo_hidecursor(mydisplay,mywindow); - - XSelectInput(mydisplay, mywindow, StructureNotifyMask | KeyPressMask ); - XSetStandardProperties(mydisplay, mywindow, hello, hello, None, NULL, 0, &hint); - if ( fullscreen ) vo_x11_decoration( mydisplay,mywindow,0 ); - XMapWindow(mydisplay, mywindow); - XFlush(mydisplay); - XSync(mydisplay, False); + else + { + mywindow=vo_window; + mygc=vo_gc; + if ( vo_screenwidth != d_width ) + { + XMoveWindow( mydisplay,mywindow,( vo_screenwidth - d_width ) / 2,( vo_screenheight - d_height ) / 2 ); + XResizeWindow( mydisplay,mywindow,d_width,d_height ); + } + else mFullscreen=1; + } +#endif mygc = XCreateGC(mydisplay, mywindow, 0L, &xgcv); @@ -253,6 +275,20 @@ static void check_events(void) XTranslateCoordinates( mydisplay,mywindow,mRoot,0,0,&drwcX,&drwcY,&mRoot ); printf( "[xv] dcx: %d dcy: %d dx: %d dy: %d dw: %d dh: %d\n",drwcX,drwcY,drwX,drwY,drwWidth,drwHeight ); + #ifdef HAVE_GUI + if ( vo_window != None ) + { + mFullscreen=0; + dwidth=mdwidth; dheight=mdheight; + if ( ( drwWidth == vo_screenwidth )&&( drwHeight == vo_screenheight ) ) + { + mFullscreen=1; + dwidth=vo_screenwidth; + dheight=vo_screenwidth * mdheight / mdwidth; + } + } + #endif + if ( mFullscreen ) { drwX=( vo_screenwidth - (dwidth > vo_screenwidth?vo_screenwidth:dwidth) ) / 2; diff --git a/libvo/x11_common.c b/libvo/x11_common.c index afbfd4ad05..2a6e25f949 100644 --- a/libvo/x11_common.c +++ b/libvo/x11_common.c @@ -149,6 +149,17 @@ void vo_x11_decoration( Display * vo_Display,Window w,int d ) } } +#ifdef HAVE_GUI + Window vo_window = None; + GC vo_gc; + int vo_xeventhandling = 1; + int vo_resize = 0; + int vo_expose = 0; + + void vo_setwindow( Window w,GC g ) + { vo_window=w; vo_gc=g; } +#endif + int vo_x11_check_events(Display *mydisplay){ int ret=0; XEvent Event; @@ -157,26 +168,46 @@ int vo_x11_check_events(Display *mydisplay){ XComposeStatus stat; // unsigned long vo_KeyTable[512]; - while ( XPending( mydisplay ) ) - { - XNextEvent( mydisplay,&Event ); - switch( Event.type ) - { - case Expose: - ret|=VO_EVENT_EXPOSE; - break; - case ConfigureNotify: - vo_dwidth=Event.xconfigure.width; - vo_dheight=Event.xconfigure.height; - ret|=VO_EVENT_RESIZE; - break; - case KeyPress: - XLookupString( &Event.xkey,buf,sizeof(buf),&keySym,&stat ); - vo_x11_putkey( ( (keySym&0xff00) != 0?( (keySym&0x00ff) + 256 ):( keySym ) ) ); - ret|=VO_EVENT_KEYPRESS; - break; +#ifdef HAVE_GUI + if ( vo_xeventhandling ) + { +#endif + while ( XPending( mydisplay ) ) + { + XNextEvent( mydisplay,&Event ); + switch( Event.type ) + { + case Expose: + ret|=VO_EVENT_EXPOSE; + break; + case ConfigureNotify: + vo_dwidth=Event.xconfigure.width; + vo_dheight=Event.xconfigure.height; + ret|=VO_EVENT_RESIZE; + break; + case KeyPress: + XLookupString( &Event.xkey,buf,sizeof(buf),&keySym,&stat ); + vo_x11_putkey( ( (keySym&0xff00) != 0?( (keySym&0x00ff) + 256 ):( keySym ) ) ); + ret|=VO_EVENT_KEYPRESS; + break; + } + } +#ifdef HAVE_GUI } - } + else + { + if ( vo_resize ) + { + vo_resize=0; + ret|=VO_EVENT_RESIZE; + } + if ( vo_expose ) + { + vo_expose=0; + ret|=VO_EVENT_EXPOSE; + } + } +#endif return ret; } diff --git a/libvo/x11_common.h b/libvo/x11_common.h index 8dab26385f..47e2a39fab 100644 --- a/libvo/x11_common.h +++ b/libvo/x11_common.h @@ -13,5 +13,16 @@ void vo_x11_decoration( Display * vo_Display,Window w,int d ); int vo_x11_check_events(Display *mydisplay); #endif +#ifdef HAVE_GUI + extern Window vo_window; + extern Display * vo_display; + extern GC vo_gc; + extern int vo_xeventhandling; + extern int vo_expose; + extern int vo_resize; + + extern void vo_setwindow( Window w,GC g ); +#endif + void saver_off( Display * ); void saver_on( Display * ); diff --git a/mplayer.c b/mplayer.c index 46192895dd..94b0e0446d 100644 --- a/mplayer.c +++ b/mplayer.c @@ -88,6 +88,9 @@ extern int errno; #include "help_mp.h" #define DEBUG if(0) +#ifdef HAVE_GUI + int nogui=1; // new +#endif int verbose=0; #define ABS(x) (((x)>=0)?(x):(-(x))) @@ -325,7 +328,25 @@ static int play_in_bg=0; extern void avi_fixate(); +#ifdef HAVE_GUI + #include "../Gui/mplayer/psignal.h" +#endif + void exit_player(char* how){ + +#ifdef HAVE_GUI + if ( !nogui ) + { + if ( how != NULL ) + { + if ( !strcmp( how,"Quit" ) ) mplSendMessage( mplEndOfFile ); + if ( !strcmp( how,"End of file" ) ) mplSendMessage( mplEndOfFile ); + if ( !strcmp( how,"audio_init" ) ) mplSendMessage( mplAudioError ); + } + else mplSendMessage( mplUnknowError ); + } +#endif + if(how) printf("\nExiting... (%s)\n",how); if(verbose) printf("max framesize was %d bytes\n",max_framesize); // restore terminal: @@ -340,6 +361,9 @@ void exit_player(char* how){ #endif if(encode_name) avi_fixate(); #ifdef HAVE_LIRC + #ifdef HAVE_GUI + if ( nogui ) + #endif lirc_mp_cleanup(); #endif //if(play_in_bg) system("xsetroot -solid \\#000000"); @@ -359,6 +383,13 @@ void exit_sighandler(int x){ printf("\nMPlayer interrupted by signal %d in module: %s \n",x, current_module?current_module:"unknown" ); + #ifdef HAVE_GUI + if ( !nogui ) + { + mplShMem->items.error.signal=x; + strcpy( mplShMem->items.error.module,current_module?current_module:"unknown" ); + } + #endif exit_player(NULL); } @@ -372,7 +403,6 @@ extern void write_avi_header_1(FILE *f,int fcc,float fps,int width,int height); extern int vo_init(void); extern int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int maxlen); -int main(int argc,char* argv[], char *envp[]){ char* filename=NULL; //"MI2-Trailer.avi"; int i; int seek_to_sec=0; @@ -437,11 +467,17 @@ char *stream_dump_name=NULL; int stream_dump_type=0; //int user_bpp=0; +int osd_visible=100; +int osd_function=OSD_PLAY; +int osd_last_pts=-303; + +int rel_seek_secs=0; + #include "mixer.h" #include "cfg-mplayer.h" - printf("%s",banner_text); - +void parse_cfgfiles( void ) +{ if (parse_config_file(conf, "/etc/mplayer.conf") < 0) exit(1); if ((conffile = get_path("")) == NULL) { @@ -462,26 +498,42 @@ if ((conffile = get_path("")) == NULL) { free(conffile); } } -if (parse_command_line(conf, argc, argv, envp, &filename) < 0) - exit(1); - -// Many users forget to include command line in bugreports... -if(verbose){ - printf("CommandLine:"); - for(i=1;iget_info (); - printf("\t%s\t%s\n", info->short_name, info->name); - } - printf("\n"); - exit(0); -} +#ifndef HAVE_GUI + int main(int argc,char* argv[], char *envp[]){ +#else + int mplayer(int argc,char* argv[], char *envp[]){ +#endif + + printf("%s",banner_text); + +#ifdef HAVE_GUI + if ( nogui ) + { +#endif + if (parse_command_line(conf, argc, argv, envp, &filename) < 0) exit(1); + + // Many users forget to include command line in bugreports... + if(verbose){ + printf("CommandLine:"); + for(i=1;iget_info (); + printf("\t%s\t%s\n", info->short_name, info->name); + } + printf("\n"); + exit(0); + } +#ifdef HAVE_GUI + } +#endif if(!filename){ if(vcd_track) filename="/dev/cdrom"; @@ -508,6 +560,9 @@ if(!filename){ // check codec.conf if(!parse_codec_cfg(get_path("codecs.conf"))){ printf("(copy/link DOCS/codecs.conf to ~/.mplayer/codecs.conf)\n"); + #ifdef HAVE_GUI + if ( !nogui ) { mplSendMessage( mplCodecConfNotFound ); usleep( 10000 ); } + #endif exit(1); } @@ -573,12 +628,20 @@ if(vcd_track){ if (dvdimportkey) { if (dvd_import_key(dvdimportkey)) { fprintf(stderr,"Error processing DVD KEY.\n"); + #ifdef HAVE_GUI + if ( !nogui ) { mplSendMessage( mplErrorDVDKeyProcess ); usleep( 10000 ); } + #endif exit(1); } printf("DVD command line requested key is stored for descrambling.\n"); } if (dvd_device) { - if (dvd_auth(dvd_device,f)) exit(0); + if (dvd_auth(dvd_device,f)) { + #ifdef HAVE_GUI + if ( !nogui ) { mplSendMessage( mplErrorDVDAuth ); usleep( 10000 ); } + #endif + exit(0); + } printf("DVD auth sequence seems to be OK.\n"); } #endif @@ -653,6 +716,9 @@ if(file_format==DEMUXER_TYPE_MPEG_ES){ // little hack, see above! if(file_format==DEMUXER_TYPE_UNKNOWN){ printf("============= Sorry, this file format not recognized/supported ===============\n"); printf("=== If this file is an AVI, ASF or MPEG stream, please contact the author! ===\n"); + #ifdef HAVE_GUI + if ( !nogui ) { mplSendMessage( mplUnknowFileType ); usleep( 10000 ); } + #endif exit(1); } //====== File format recognized, set up these for compatibility: ========= @@ -703,6 +769,9 @@ switch(file_format){ } if(v_pos==-1){ printf("AVI_NI: missing video stream!? contact the author, it may be a bug :(\n"); + #ifdef HAVE_GUI + if ( !nogui ) { mplSendMessage( mplErrorAVINI ); usleep( 10000 ); } + #endif exit(1); } if(a_pos==-1){ @@ -727,6 +796,9 @@ switch(file_format){ } if(!ds_fill_buffer(d_video)){ printf("AVI: missing video stream!? contact the author, it may be a bug :(\n"); + #ifdef HAVE_GUI + if ( !nogui ) { mplSendMessage( mplAVIErrorMissingVideoStream ); usleep( 10000 ); } + #endif exit(1); } sh_video=d_video->sh;sh_video->ds=d_video; @@ -768,6 +840,9 @@ switch(file_format){ // demuxer->endpos=avi_header.movi_end; if(!ds_fill_buffer(d_video)){ printf("ASF: missing video stream!? contact the author, it may be a bug :(\n"); + #ifdef HAVE_GUI + if ( !nogui ) { mplSendMessage( mplASFErrorMissingVideoStream ); usleep( 10000 ); } + #endif exit(1); } sh_video=d_video->sh;sh_video->ds=d_video; @@ -836,6 +911,9 @@ switch(file_format){ if(!i || !skip_video_packet(d_video)){ if(verbose) printf("NONE :(\n"); printf("MPEG: FATAL: EOF while searching for sequence header\n"); + #ifdef HAVE_GUI + if ( !nogui ) { mplSendMessage( mplMPEGErrorSeqHeaderSearch ); usleep( 10000 ); } + #endif exit(1); } } @@ -845,17 +923,43 @@ switch(file_format){ mpeg2_init(); // ========= Read & process sequence header & extension ============ videobuffer=shmem_alloc(VIDEOBUFFER_SIZE); - if(!videobuffer){ printf("Cannot allocate shared memory\n");exit(0);} + if(!videobuffer){ + printf("Cannot allocate shared memory\n"); + #ifdef HAVE_GUI + if ( !nogui ) { mplSendMessage( mplErrorShMemAlloc ); usleep( 10000 ); } + #endif + exit(0); + } videobuf_len=0; - if(!read_video_packet(d_video)){ printf("FATAL: Cannot read sequence header!\n");exit(1);} + if(!read_video_packet(d_video)){ + printf("FATAL: Cannot read sequence header!\n"); + #ifdef HAVE_GUI + if ( !nogui ) { mplSendMessage( mplMPEGErrorCannotReadSeqHeader ); usleep( 10000 ); } + #endif + exit(1); + } if(header_process_sequence_header (picture, &videobuffer[4])) { - printf ("bad sequence header!\n"); exit(1); + printf ("bad sequence header!\n"); + #ifdef HAVE_GUI + if ( !nogui ) { mplSendMessage( mplMPEGErrorBadSeqHeader ); usleep( 10000 ); } + #endif + exit(1); } if(sync_video_packet(d_video)==0x1B5){ // next packet is seq. ext. videobuf_len=0; - if(!read_video_packet(d_video)){ printf("FATAL: Cannot read sequence header extension!\n");exit(1);} + if(!read_video_packet(d_video)){ + printf("FATAL: Cannot read sequence header extension!\n"); + #ifdef HAVE_GUI + if ( !nogui ) { mplSendMessage( mplMPEGErrorCannotReadSeqHeaderExt ); usleep( 10000 ); } + #endif + exit(1); + } if(header_process_extension (picture, &videobuffer[4])) { - printf ("bad sequence header extension!\n"); exit(1); + printf ("bad sequence header extension!\n"); + #ifdef HAVE_GUI + if ( !nogui ) { mplSendMessage( mplMPEGErrorBadSeqHeaderExt ); usleep( 10000 ); } + #endif + exit(1); } } // display info: @@ -940,6 +1044,14 @@ while(1){ sh_video->bih?((unsigned int*) &sh_video->bih->biCompression):NULL,sh_video->codec,0); if(!sh_video->codec){ printf("Can't find codec for video format 0x%X !\n",sh_video->format); + #ifdef HAVE_GUI + if ( !nogui ) + { + mplShMem->items.videodata.format=sh_video->format; + mplSendMessage( mplCantFindCodecForVideoFormat ); + usleep( 10000 ); + } + #endif exit(1); } if(!allow_dshow && sh_video->codec->driver==4) continue; // skip DShow @@ -959,6 +1071,9 @@ for(i=0;i=CODECS_MAX_OUTFMT){ printf("Sorry, selected video_out device is incompatible with this codec.\n"); + #ifdef HAVE_GUI + if ( !nogui ) { mplSendMessage( mplIncompatibleVideoOutDevice ); usleep( 10000 ); } + #endif exit(1); } sh_video->outfmtidx=i; @@ -967,13 +1082,21 @@ if(verbose) printf("vo_debug1: out_fmt=0x%08X\n",out_fmt); switch(sh_video->codec->driver){ case 2: { - if(!init_video_codec(sh_video)) exit(1); + if(!init_video_codec(sh_video)) { + #ifdef HAVE_GUI + if ( !nogui ) { mplSendMessage( mplUnknowError ); usleep( 10000 ); } + #endif + exit(1); + } if(verbose) printf("INFO: Win32 video codec init OK!\n"); break; } case 4: { // Win32/DirectShow #ifndef USE_DIRECTSHOW printf("MPlayer was compiled WITHOUT directshow support!\n"); + #ifdef HAVE_GUI + if ( !nogui ) { mplSendMessage( mplCompileWithoutDSSupport ); usleep( 10000 ); } + #endif exit(1); #else sh_video->our_out_buffer=NULL; @@ -983,6 +1106,14 @@ switch(sh_video->codec->driver){ printf("Maybe you forget to upgrade your win32 codecs?? It's time to download the new\n"); printf("package from: ftp://thot.banki.hu/esp-team/linux/MPlayer/w32codec.zip !\n"); printf("Or you should disable DShow support: make distclean;make -f Makefile.No-DS\n"); + #ifdef HAVE_GUI + if ( !nogui ) + { + strcpy( mplShMem->items.videodata.codecdll,sh_video->codec->dll ); + mplSendMessage( mplDSCodecNotFound ); + usleep( 10000 ); + } + #endif exit(1); } @@ -1125,11 +1256,24 @@ make_pipe(&keyb_fifo_get,&keyb_fifo_put); if(verbose) printf("vo_debug3: out_fmt=0x%08X\n",out_fmt); + #ifdef HAVE_GUI + if ( !nogui ) + { + mplShMem->items.videodata.width=sh_video->disp_w; + mplShMem->items.videodata.height=sh_video->disp_h; + mplSendMessage( mplSetVideoData ); + } + #endif + if(video_out->init(sh_video->disp_w,sh_video->disp_h, screen_size_x,screen_size_y, fullscreen|(vidmode<<1)|(softzoom<<2), title,out_fmt)){ - printf("FATAL: Cannot initialize video driver!\n");exit(1); + printf("FATAL: Cannot initialize video driver!\n"); + #ifdef HAVE_GUI + if ( !nogui ) { mplSendMessage( mplCantInitVideoDriver ); usleep( 10000 ); } + #endif + exit(1); } if(verbose) printf("INFO: Video OUT driver init OK!\n"); @@ -1156,13 +1300,13 @@ double vout_time_usage=0; double audio_time_usage=0; int grab_frames=0; char osd_text_buffer[64]; -int osd_visible=100; -int osd_function=OSD_PLAY; -int osd_last_pts=-303; int drop_frame=0; int drop_frame_cnt=0; #ifdef HAVE_LIRC + #ifdef HAVE_GUI + if ( nogui ) + #endif lirc_mp_setup(); #endif @@ -1175,7 +1319,12 @@ int drop_frame_cnt=0; // terminate requests: signal(SIGTERM,exit_sighandler); // kill signal(SIGHUP,exit_sighandler); // kill -HUP / xterm closed - signal(SIGINT,exit_sighandler); // Interrupt from keyboard + + #ifdef HAVE_GUI + if ( nogui ) + #endif + signal(SIGINT,exit_sighandler); // Interrupt from keyboard + signal(SIGQUIT,exit_sighandler); // Quit from keyboard // fatal errors: signal(SIGBUS,exit_sighandler); // bus error @@ -1658,15 +1807,22 @@ switch(sh_video->codec->driver){ if(osd_function==OSD_PAUSE){ printf("\n------ PAUSED -------\r");fflush(stdout); - while( -#ifdef HAVE_LIRC - lirc_mp_getinput()<=0 && +#ifdef HAVE_GUI + if ( nogui ) + { +#endif + while( +#ifdef HAVE_LIRC + lirc_mp_getinput()<=0 && +#endif + (!f || getch2(20)<=0) && mplayer_get_key()<=0){ + video_out->check_events(); + if(!f) usleep(1000); // do not eat the CPU + } + osd_function=OSD_PLAY; +#ifdef HAVE_GUI + } else while( osd_function != OSD_PLAY ) usleep( 1000 ); #endif - (!f || getch2(20)<=0) && mplayer_get_key()<=0){ - video_out->check_events(); - if(!f) usleep(1000); // do not eat the CPU - } - osd_function=OSD_PLAY; } } // while(v_framecodec->driver){ //================= Keyboard events, SEEKing ==================== -{ int rel_seek_secs=0; - int c; +{ int c; while( #ifdef HAVE_LIRC (c=lirc_mp_getinput())>0 || @@ -2041,6 +2196,7 @@ switch(file_format){ // num_frames=real_num_frames=0; } + rel_seek_secs=0; } // keyboard event handler //================= Update OSD ====================