Mercurial > mplayer.hg
view gui/mplayer/play.c @ 27839:9a46fffef0fc
vobsub: add sanity check
author | aurel |
---|---|
date | Sat, 01 Nov 2008 13:51:39 +0000 |
parents | 14c5017f40d2 |
children | 0f1b5b68af32 |
line wrap: on
line source
/* * This file is part of MPlayer. * * MPlayer is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * MPlayer is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License along * with MPlayer; if not, write to the Free Software Foundation, Inc., * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include <inttypes.h> #include <stdlib.h> #include <stdio.h> #include <string.h> #include <unistd.h> #include <signal.h> #include "config.h" #include "help_mp.h" #include "libvo/x11_common.h" #include "libvo/video_out.h" #include "input/input.h" #include "gui/wm/ws.h" #include "gui/wm/wsxdnd.h" #include "gui/app.h" #include "gui/wm/wskeys.h" #include "gui/interface.h" #include "widgets.h" #include "gmplayer.h" #include "play.h" #include "gui/skin/skin.h" #include "gui/skin/font.h" #include "stream/stream.h" extern float rel_seek_secs; extern int abs_seek_pos; int mplGotoTheNext = 1; void mplFullScreen( void ) { if ( guiIntfStruct.NoWindow && guiIntfStruct.Playing ) return; if ( ( guiIntfStruct.Playing )&&( appMPlayer.subWindow.isFullScreen ) ) { appMPlayer.subWindow.OldWidth=guiIntfStruct.MovieWidth; appMPlayer.subWindow.OldHeight=guiIntfStruct.MovieHeight; switch ( appMPlayer.sub.x ) { case -1: appMPlayer.subWindow.OldX=( wsMaxX / 2 ) - ( appMPlayer.subWindow.OldWidth / 2 ) + wsOrgX; break; case -2: appMPlayer.subWindow.OldX=wsMaxX - appMPlayer.subWindow.OldWidth + wsOrgX; break; default: appMPlayer.subWindow.OldX=appMPlayer.sub.x; break; } switch ( appMPlayer.sub.y ) { case -1: appMPlayer.subWindow.OldY=( wsMaxY / 2 ) - ( appMPlayer.subWindow.OldHeight / 2 ) + wsOrgY; break; case -2: appMPlayer.subWindow.OldY=wsMaxY - appMPlayer.subWindow.OldHeight + wsOrgY; break; default: appMPlayer.subWindow.OldY=appMPlayer.sub.y; break; } } if ( guiIntfStruct.Playing || gtkShowVideoWindow ) wsFullScreen( &appMPlayer.subWindow ); fullscreen=vo_fs=appMPlayer.subWindow.isFullScreen; wsSetLayer( wsDisplay,appMPlayer.mainWindow.WindowID,appMPlayer.subWindow.isFullScreen ); if ( appMPlayer.menuIsPresent ) wsSetLayer( wsDisplay,appMPlayer.menuWindow.WindowID,appMPlayer.subWindow.isFullScreen ); if ( guiIntfStruct.Playing ) wsSetBackgroundRGB( &appMPlayer.subWindow,0,0,0 ); else wsSetBackgroundRGB( &appMPlayer.subWindow,appMPlayer.sub.R,appMPlayer.sub.G,appMPlayer.sub.B ); } void mplEnd( void ) { plItem * next; if ( !mplGotoTheNext && guiIntfStruct.Playing) { mplGotoTheNext=1; return; } if ( guiIntfStruct.Playing && (next=gtkSet( gtkGetNextPlItem,0,NULL )) && plLastPlayed != next ) { plLastPlayed=next; guiSetDF( guiIntfStruct.Filename,next->path,next->name ); guiIntfStruct.StreamType=STREAMTYPE_FILE; guiIntfStruct.FilenameChanged=guiIntfStruct.NewPlay=1; gfree( (void **)&guiIntfStruct.AudioFile ); gfree( (void **)&guiIntfStruct.Subtitlename ); } else { if ( guiIntfStruct.FilenameChanged || guiIntfStruct.NewPlay ) return; guiIntfStruct.TimeSec=0; guiIntfStruct.Position=0; guiIntfStruct.AudioType=0; guiIntfStruct.NoWindow=False; #ifdef CONFIG_DVDREAD guiIntfStruct.DVD.current_title=1; guiIntfStruct.DVD.current_chapter=1; guiIntfStruct.DVD.current_angle=1; #endif if ( !appMPlayer.subWindow.isFullScreen && gtkShowVideoWindow) { wsResizeWindow( &appMPlayer.subWindow,appMPlayer.sub.width,appMPlayer.sub.height ); wsMoveWindow( &appMPlayer.subWindow,True,appMPlayer.sub.x,appMPlayer.sub.y ); } else wsVisibleWindow( &appMPlayer.subWindow,wsHideWindow ); guiGetEvent( guiCEvent,guiSetStop ); mplSubRender=1; wsSetBackgroundRGB( &appMPlayer.subWindow,appMPlayer.sub.R,appMPlayer.sub.G,appMPlayer.sub.B ); wsClearWindow( appMPlayer.subWindow ); wsPostRedisplay( &appMPlayer.subWindow ); } } void mplPlay( void ) { if ( ( !guiIntfStruct.Filename )|| ( guiIntfStruct.Filename[0] == 0 )|| ( guiIntfStruct.Playing == 1 ) ) return; if ( guiIntfStruct.Playing == 2 ) { mplPause(); return; } guiGetEvent( guiCEvent,(void *)guiSetPlay ); mplSubRender=0; wsSetBackgroundRGB( &appMPlayer.subWindow,0,0,0 ); wsClearWindow( appMPlayer.subWindow ); } void mplPause( void ) { if ( !guiIntfStruct.Playing ) return; if ( guiIntfStruct.Playing == 1 ) { mp_cmd_t * cmd = calloc( 1,sizeof( *cmd ) ); cmd->id=MP_CMD_PAUSE; cmd->name=strdup("pause"); mp_input_queue_cmd(cmd); } else guiIntfStruct.Playing=1; } void mplState( void ) { if ( ( guiIntfStruct.Playing == 0 )||( guiIntfStruct.Playing == 2 ) ) { btnModify( evPlaySwitchToPause,btnReleased ); btnModify( evPauseSwitchToPlay,btnDisabled ); } else { btnModify( evPlaySwitchToPause,btnDisabled ); btnModify( evPauseSwitchToPlay,btnReleased ); } } float mplGetPosition( void ) { // return 0.0 ... 100.0 return guiIntfStruct.Position; } void mplRelSeek( float s ) { // -+s rel_seek_secs=s; abs_seek_pos=0; } void mplAbsSeek( float s ) { // 0.0 ... 100.0 if ( guiIntfStruct.StreamType == STREAMTYPE_STREAM ) return; rel_seek_secs=0.01*s; abs_seek_pos=3; } listItems tmpList; void ChangeSkin( char * name ) { int ret; int prev = appMPlayer.menuIsPresent; int bprev = appMPlayer.barIsPresent; mainVisible=0; appInitStruct( &tmpList ); skinAppMPlayer=&tmpList; fntFreeFont(); ret=skinRead( name ); appInitStruct( &tmpList ); skinAppMPlayer=&appMPlayer; appInitStruct( &appMPlayer ); if ( ret ) name=skinName; if ( skinRead( name ) ) { mainVisible=1; return; } // --- reload menu window if ( prev && appMPlayer.menuIsPresent ) { if ( mplMenuDrawBuffer ) free( mplMenuDrawBuffer ); if ( ( mplMenuDrawBuffer = calloc( 1,appMPlayer.menuBase.Bitmap.ImageSize ) ) == NULL ) { mp_msg( MSGT_GPLAYER,MSGL_STATUS,MSGTR_NEMDB ); return; } wsResizeWindow( &appMPlayer.menuWindow,appMPlayer.menuBase.width,appMPlayer.menuBase.height ); wsResizeImage( &appMPlayer.menuWindow,appMPlayer.menuBase.width,appMPlayer.menuBase.height ); wsSetShape( &appMPlayer.menuWindow,appMPlayer.menuBase.Mask.Image ); wsVisibleWindow( &appMPlayer.menuWindow,wsHideWindow ); } else { mplMenuInit(); } // --- reload sub window if ( appMPlayer.sub.Bitmap.Image ) wsResizeImage( &appMPlayer.subWindow,appMPlayer.sub.Bitmap.Width,appMPlayer.sub.Bitmap.Height ); if ( ( !appMPlayer.subWindow.isFullScreen )&&( !guiIntfStruct.Playing ) ) { wsResizeWindow( &appMPlayer.subWindow,appMPlayer.sub.width,appMPlayer.sub.height ); wsMoveWindow( &appMPlayer.subWindow,True,appMPlayer.sub.x,appMPlayer.sub.y ); } if ( appMPlayer.sub.Bitmap.Image ) wsConvert( &appMPlayer.subWindow,appMPlayer.sub.Bitmap.Image,appMPlayer.sub.Bitmap.ImageSize ); if ( !guiIntfStruct.Playing ) { mplSubRender=1; wsSetBackgroundRGB( &appMPlayer.subWindow,appMPlayer.sub.R,appMPlayer.sub.G,appMPlayer.sub.B ); wsClearWindow( appMPlayer.subWindow ); wsPostRedisplay( &appMPlayer.subWindow ); } // --- reload play bar if ( bprev ) wsDestroyWindow( &appMPlayer.barWindow ); mplPBInit(); // --- reload main window if ( mplDrawBuffer ) free( mplDrawBuffer ); if ( ( mplDrawBuffer = calloc( 1,appMPlayer.main.Bitmap.ImageSize ) ) == NULL ) { mp_msg( MSGT_GPLAYER,MSGL_STATUS,MSGTR_NEMDB ); return; } wsDestroyWindow( &appMPlayer.mainWindow ); wsCreateWindow( &appMPlayer.mainWindow, appMPlayer.main.x,appMPlayer.main.y,appMPlayer.main.width,appMPlayer.main.height, wsNoBorder,wsShowMouseCursor|wsHandleMouseButton|wsHandleMouseMove,wsShowFrame|wsMaxSize|wsHideWindow,"MPlayer" ); wsCreateImage( &appMPlayer.mainWindow,appMPlayer.main.Bitmap.Width,appMPlayer.main.Bitmap.Height ); wsSetShape( &appMPlayer.mainWindow,appMPlayer.main.Mask.Image ); wsSetIcon( wsDisplay,appMPlayer.mainWindow.WindowID,guiIcon,guiIconMask ); appMPlayer.mainWindow.ReDraw=(void *)mplMainDraw; appMPlayer.mainWindow.MouseHandler=mplMainMouseHandle; appMPlayer.mainWindow.KeyHandler=mplMainKeyHandle; appMPlayer.mainWindow.DandDHandler=mplDandDHandler; wsXDNDMakeAwareness( &appMPlayer.mainWindow ); if ( !appMPlayer.mainDecoration ) wsWindowDecoration( &appMPlayer.mainWindow,0 ); wsVisibleWindow( &appMPlayer.mainWindow,wsShowWindow ); mainVisible=1; // --- btnModify( evSetVolume,guiIntfStruct.Volume ); btnModify( evSetBalance,guiIntfStruct.Balance ); btnModify( evSetMoviePosition,guiIntfStruct.Position ); btnModify( evFullScreen,!appMPlayer.subWindow.isFullScreen ); wsSetLayer( wsDisplay,appMPlayer.mainWindow.WindowID,appMPlayer.subWindow.isFullScreen ); wsSetLayer( wsDisplay,appMPlayer.menuWindow.WindowID,appMPlayer.subWindow.isFullScreen ); } void mplSetFileName( char * dir,char * name,int type ) { if ( !name ) return; if ( !dir ) guiSetFilename( guiIntfStruct.Filename,name ) else guiSetDF( guiIntfStruct.Filename,dir,name ); // filename=guiIntfStruct.Filename; guiIntfStruct.StreamType=type; gfree( (void **)&guiIntfStruct.AudioFile ); gfree( (void **)&guiIntfStruct.Subtitlename ); } void mplCurr( void ) { plItem * curr; int stop = 0; if ( guiIntfStruct.Playing == 2 ) return; switch ( guiIntfStruct.StreamType ) { #ifdef CONFIG_DVDREAD case STREAMTYPE_DVD: break; #endif #ifdef CONFIG_VCD case STREAMTYPE_VCD: break; #endif default: if ( (curr=gtkSet( gtkGetCurrPlItem,0,NULL)) ) { mplSetFileName( curr->path,curr->name,STREAMTYPE_FILE ); mplGotoTheNext=0; break; } return; } if ( stop ) mplEventHandling( evStop,0 ); if ( guiIntfStruct.Playing == 1 ) mplEventHandling( evPlay,0 ); } void mplPrev( void ) { plItem * prev; int stop = 0; if ( guiIntfStruct.Playing == 2 ) return; switch ( guiIntfStruct.StreamType ) { #ifdef CONFIG_DVDREAD case STREAMTYPE_DVD: if ( --guiIntfStruct.DVD.current_chapter == 0 ) { guiIntfStruct.DVD.current_chapter=1; if ( --guiIntfStruct.DVD.current_title <= 0 ) { guiIntfStruct.DVD.current_title=1; stop=1; } } guiIntfStruct.Track=guiIntfStruct.DVD.current_title; break; #endif #ifdef CONFIG_VCD case STREAMTYPE_VCD: if ( --guiIntfStruct.Track == 0 ) { guiIntfStruct.Track=1; stop=1; } break; #endif default: if ( (prev=gtkSet( gtkGetPrevPlItem,0,NULL)) ) { mplSetFileName( prev->path,prev->name,STREAMTYPE_FILE ); mplGotoTheNext=0; break; } return; } if ( stop ) mplEventHandling( evStop,0 ); if ( guiIntfStruct.Playing == 1 ) mplEventHandling( evPlay,0 ); } void mplNext( void ) { int stop = 0; plItem * next; if ( guiIntfStruct.Playing == 2 ) return; switch ( guiIntfStruct.StreamType ) { #ifdef CONFIG_DVDREAD case STREAMTYPE_DVD: if ( guiIntfStruct.DVD.current_chapter++ == guiIntfStruct.DVD.chapters ) { guiIntfStruct.DVD.current_chapter=1; if ( ++guiIntfStruct.DVD.current_title > guiIntfStruct.DVD.titles ) { guiIntfStruct.DVD.current_title=guiIntfStruct.DVD.titles; stop=1; } } guiIntfStruct.Track=guiIntfStruct.DVD.current_title; break; #endif #ifdef CONFIG_VCD case STREAMTYPE_VCD: if ( ++guiIntfStruct.Track > guiIntfStruct.VCDTracks ) { guiIntfStruct.Track=guiIntfStruct.VCDTracks; stop=1; } break; #endif default: if ( (next=gtkSet( gtkGetNextPlItem,0,NULL)) ) { mplSetFileName( next->path,next->name,STREAMTYPE_FILE ); mplGotoTheNext=0; break; } return; } if ( stop ) mplEventHandling( evStop,0 ); if ( guiIntfStruct.Playing == 1 ) mplEventHandling( evPlay,0 ); }