2001-06-27 13:39:17 +02:00
// AVI & MPEG Player v0.18 (C) 2000-2001. by A'rpi/ESP-team
2001-02-24 21:28:24 +01:00
2001-08-01 11:14:02 +02:00
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <unistd.h>
2001-02-24 21:28:24 +01:00
# include <sys/ioctl.h>
# include <sys/mman.h>
# include <sys/types.h>
# include <sys/wait.h>
# include <sys/time.h>
# include <sys/stat.h>
2001-08-01 01:18:16 +02:00
# include <signal.h>
# include <time.h>
2001-02-24 21:28:24 +01:00
# include <fcntl.h>
2002-03-15 23:25:57 +01:00
# include <errno.h>
2001-08-01 11:14:02 +02:00
# include "version.h"
# include "config.h"
2001-08-18 22:32:09 +02:00
2001-08-17 00:40:06 +02:00
# include "mp_msg.h"
2001-02-24 21:28:24 +01:00
2001-08-18 22:32:09 +02:00
# define HELP_MP_DEFINE_STATIC
# include "help_mp.h"
2001-03-19 00:32:31 +01:00
# include "cfgparser.h"
2001-03-19 03:29:37 +01:00
# include "cfg-mplayer-def.h"
2001-03-19 00:32:31 +01:00
2001-07-30 04:00:54 +02:00
# ifdef USE_SUB
2001-03-30 05:07:45 +02:00
# include "subreader.h"
2001-07-30 04:00:54 +02:00
# endif
2001-03-30 05:07:45 +02:00
2001-03-04 22:01:54 +01:00
# include "libvo/video_out.h"
2001-10-30 17:15:22 +01:00
extern void * mDisplay ; // Display* mDisplay;
2001-07-30 04:00:54 +02:00
2001-03-27 02:39:24 +02:00
# include "libvo/sub.h"
2001-03-04 22:01:54 +01:00
2001-06-03 01:30:26 +02:00
# include "libao2/audio_out.h"
2001-11-29 13:44:06 +01:00
# include "libao2/audio_plugin.h"
2001-06-03 01:30:26 +02:00
2001-02-24 21:28:24 +01:00
# include "libmpeg2/mpeg2.h"
# include "libmpeg2/mpeg2_internal.h"
2001-04-07 23:27:57 +02:00
# include "codec-cfg.h"
2001-03-20 23:11:38 +01:00
2001-04-18 00:04:44 +02:00
# include "dvdauth.h"
2001-11-28 13:44:39 +01:00
# ifdef USE_DVDREAD
2001-04-21 17:38:01 +02:00
# include "spudec.h"
2001-11-28 13:44:39 +01:00
# endif
2002-01-10 18:18:30 +01:00
# include "vobsub.h"
2001-04-18 00:04:44 +02:00
2001-02-24 21:28:24 +01:00
# include "linux/getch2.h"
# include "linux/keycodes.h"
# include "linux/timer.h"
# include "linux/shmem.h"
2001-10-19 04:00:45 +02:00
# include "cpudetect.h"
2001-02-24 21:28:24 +01:00
# ifdef HAVE_LIRC
# include "lirc_mp.h"
# endif
2001-10-01 19:25:07 +02:00
# ifdef HAVE_NEW_GUI
2002-02-21 23:48:47 +01:00
# include "Gui/interface.h"
2001-10-01 19:25:07 +02:00
# endif
2002-01-30 13:46:03 +01:00
# ifdef HAVE_NEW_INPUT
# include "input/input.h"
# endif
2001-12-04 22:04:28 +01:00
int slave_mode = 0 ;
2001-04-11 22:58:15 +02:00
int verbose = 0 ;
2001-08-06 02:30:29 +02:00
int quiet = 0 ;
2001-02-24 21:28:24 +01:00
2001-04-14 05:12:06 +02:00
# define ABS(x) (((x)>=0)?(x):(-(x)))
2001-11-20 08:53:20 +01:00
# ifdef HAVE_RTC
2001-11-14 01:26:28 +01:00
# include <linux/rtc.h>
# endif
2001-11-17 01:23:48 +01:00
# ifdef USE_TV
# include "libmpdemux/tv.h"
extern int tv_param_on ;
extern tvi_handle_t * tv_handler ;
# endif
2002-01-08 03:01:04 +01:00
//**************************************************************************//
// Playtree
//**************************************************************************//
# include "playtree.h"
play_tree_t * playtree ;
2002-01-15 00:38:49 +01:00
# define PT_NEXT_ENTRY 1
# define PT_PREV_ENTRY -1
# define PT_NEXT_SRC 2
# define PT_PREV_SRC -2
# define PT_UP_NEXT 3
# define PT_UP_PREV -3
//**************************************************************************//
// Config
//**************************************************************************//
m_config_t * mconfig ;
2002-01-27 18:02:38 +01:00
/**************************************************************************
Video accelerated architecture
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
vo_vaa_t vo_vaa ;
2002-01-27 19:39:53 +01:00
2001-03-30 05:07:45 +02:00
//**************************************************************************//
// Config file
//**************************************************************************//
2001-10-30 18:04:59 +01:00
static int cfg_inc_verbose ( struct config * conf ) { + + verbose ; return 0 ; }
2001-03-19 04:45:49 +01:00
2001-03-19 19:14:21 +01:00
static int cfg_include ( struct config * conf , char * filename ) {
2002-01-15 00:38:49 +01:00
return m_config_parse_config_file ( mconfig , filename ) ;
2001-03-19 19:14:21 +01:00
}
2001-10-30 18:04:59 +01:00
# include "get_path.c"
2001-03-21 01:14:42 +01:00
2001-04-15 05:40:37 +02:00
//**************************************************************************//
2001-04-15 21:13:38 +02:00
//**************************************************************************//
// Input media streaming & demultiplexer:
//**************************************************************************//
2001-07-07 20:46:15 +02:00
static int max_framesize = 0 ;
2001-04-22 18:56:20 +02:00
# include "stream.h"
2001-04-23 05:42:17 +02:00
# include "demuxer.h"
2001-04-15 21:13:38 +02:00
# include "stheader.h"
2001-07-22 00:37:55 +02:00
# include "parse_es.h"
2001-02-24 21:28:24 +01:00
2001-10-30 18:38:09 +01:00
# include "dec_audio.h"
# include "dec_video.h"
2001-02-24 21:28:24 +01:00
//**************************************************************************//
//**************************************************************************//
2001-03-16 01:05:52 +01:00
// Common FIFO functions, and keyboard/event FIFO code
# include "fifo.c"
2002-02-28 14:49:04 +01:00
int use_stdin = 0 ;
2001-02-24 21:28:24 +01:00
//**************************************************************************//
static vo_functions_t * video_out = NULL ;
2002-02-21 17:02:26 +01:00
ao_functions_t * audio_out = NULL ;
2001-02-24 21:28:24 +01:00
2001-10-30 18:04:59 +01:00
// benchmark:
2001-07-08 02:21:20 +02:00
double video_time_usage = 0 ;
double vout_time_usage = 0 ;
2001-07-07 20:46:15 +02:00
static double audio_time_usage = 0 ;
static int total_time_usage_start = 0 ;
2002-02-24 18:10:06 +01:00
int benchmark = 0 ;
2002-02-24 16:54:13 +01:00
static unsigned bench_dropped_frames = 0 ;
2001-06-13 23:55:24 +02:00
2001-10-30 18:04:59 +01:00
// static int play_in_bg=0;
2001-04-24 02:02:20 +02:00
2001-06-18 16:19:13 +02:00
// options:
2001-08-12 17:46:09 +02:00
static int auto_quality = 0 ;
static int output_quality = 0 ;
2001-08-04 15:52:41 +02:00
2001-08-27 02:55:25 +02:00
int use_gui = 0 ;
2001-08-04 15:52:41 +02:00
int osd_level = 2 ;
2001-10-30 18:04:59 +01:00
// seek:
2001-06-18 16:19:13 +02:00
char * seek_to_sec = NULL ;
2001-08-01 01:18:16 +02:00
off_t seek_to_byte = 0 ;
2001-10-23 22:15:00 +02:00
off_t step_sec = 0 ;
2001-10-22 16:42:47 +02:00
int loop_times = - 1 ;
2001-10-30 18:04:59 +01:00
float rel_seek_secs = 0 ;
int abs_seek_pos = 0 ;
2001-08-12 17:46:09 +02:00
2001-10-30 18:04:59 +01:00
// codecs:
int has_audio = 1 ;
2002-02-08 17:00:14 +01:00
int has_video = 1 ;
2001-07-07 11:53:47 +02:00
char * audio_codec = NULL ; // override audio codec
char * video_codec = NULL ; // override video codec
2001-07-09 00:45:56 +02:00
int audio_family = - 1 ; // override audio codec family
int video_family = - 1 ; // override video codec family
2001-07-06 23:17:22 +02:00
2001-07-09 00:45:56 +02:00
// IMHO this stuff is no longer of use, or is there a special
// reason why dshow should be completely disabled? - atmos ::
2001-07-16 14:53:48 +02:00
// yes, people without working c++ compiler can disable it - A'rpi
2001-06-18 16:19:13 +02:00
# ifdef USE_DIRECTSHOW
int allow_dshow = 1 ;
# else
int allow_dshow = 0 ;
# endif
// streaming:
2001-12-16 22:16:59 +01:00
int audio_id = - 1 ;
int video_id = - 1 ;
2001-12-19 17:55:32 +01:00
int dvdsub_id = - 1 ;
2002-01-10 18:18:30 +01:00
int vobsub_id = - 1 ;
2001-12-26 01:16:59 +01:00
char * audio_lang = NULL ;
char * dvdsub_lang = NULL ;
2001-08-12 17:46:09 +02:00
static int vcd_track = 0 ;
2001-06-18 16:19:13 +02:00
2001-10-22 01:05:05 +02:00
// cache2:
2001-10-30 18:04:59 +01:00
static int stream_cache_size = 0 ;
2001-10-22 01:05:05 +02:00
# ifdef USE_STREAM_CACHE
extern int cache_fill_status ;
# else
# define cache_fill_status 0
# endif
2001-10-30 18:04:59 +01:00
// dump:
2001-12-01 23:54:17 +01:00
static char * stream_dump_name = " stream.dump " ;
2001-10-30 18:04:59 +01:00
static int stream_dump_type = 0 ;
// A-V sync:
2001-08-12 22:52:35 +02:00
static float default_max_pts_correction = - 1 ; //0.01f;
static float max_pts_correction = 0 ; //default_max_pts_correction;
2001-10-30 18:04:59 +01:00
static float c_total = 0 ;
static float audio_delay = 0 ;
2001-06-18 16:19:13 +02:00
2001-11-14 01:26:28 +01:00
static int dapsync = 0 ;
static int softsleep = 0 ;
2001-10-30 18:04:59 +01:00
static float force_fps = 0 ;
static int force_srate = 0 ;
static int frame_dropping = 0 ; // option 0=no drop 1= drop vo 2= drop decode
static int play_n_frames = - 1 ;
2001-06-18 16:19:13 +02:00
// screen info:
char * video_driver = NULL ; //"mga"; // default
char * audio_driver = NULL ;
2002-03-15 00:28:51 +01:00
// libvo opts: (defiend at libmpcodecs/vd.c)
extern int opt_screen_size_x ;
extern int opt_screen_size_y ;
extern int screen_size_xy ;
extern float movie_aspect ;
extern int fullscreen ;
extern int vidmode ;
extern int softzoom ;
extern int flip ;
extern int vo_flags ;
2001-06-18 16:19:13 +02:00
// sub:
char * font_name = NULL ;
float font_factor = 0.75 ;
char * sub_name = NULL ;
float sub_delay = 0 ;
float sub_fps = 0 ;
int sub_auto = 1 ;
2002-01-10 18:18:30 +01:00
char * vobsub_name = NULL ;
2001-07-02 21:25:34 +02:00
/*DSP!!char *dsp=NULL;*/
2001-06-18 16:19:13 +02:00
2001-06-22 00:34:02 +02:00
extern char * vo_subdevice ;
extern char * ao_subdevice ;
2001-05-08 14:17:03 +02:00
2001-10-21 01:48:56 +02:00
static stream_t * stream = NULL ;
2002-02-23 16:12:55 +01:00
char * current_module = NULL ; // for debugging
2001-08-22 23:35:44 +02:00
2002-03-12 19:02:02 +01:00
# ifdef HAVE_RTC
int nortc ;
# endif
2001-09-05 12:49:04 +02:00
static unsigned int inited_flags = 0 ;
# define INITED_VO 1
# define INITED_AO 2
# define INITED_GUI 4
# define INITED_GETCH2 8
# define INITED_LIRC 16
2001-11-20 19:36:50 +01:00
# define INITED_SPUDEC 32
2001-10-21 01:48:56 +02:00
# define INITED_STREAM 64
2002-01-31 10:37:12 +01:00
# define INITED_INPUT 128
2001-09-05 12:49:04 +02:00
# define INITED_ALL 0xFFFF
void uninit_player ( unsigned int mask ) {
mask = inited_flags & mask ;
2002-03-17 03:28:32 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_DBG2 , " \n *** uninit(0x%X) \n " , mask ) ;
if ( mask & INITED_STREAM ) {
inited_flags & = ~ INITED_STREAM ;
current_module = " uninit_stream " ;
if ( stream ) free_stream ( stream ) ;
stream = NULL ;
}
if ( mask & INITED_GETCH2 ) {
inited_flags & = ~ INITED_GETCH2 ;
current_module = " uninit_getch2 " ;
mp_msg ( MSGT_CPLAYER , MSGL_DBG2 , " \n [[[uninit getch2]]] \n " ) ;
// restore terminal:
getch2_disable ( ) ;
}
2001-11-28 13:44:39 +01:00
# ifdef USE_DVDREAD
2001-11-20 19:36:50 +01:00
if ( mask & INITED_SPUDEC ) {
inited_flags & = ~ INITED_SPUDEC ;
current_module = " uninit_spudec " ;
spudec_free ( vo_spudec ) ;
}
2001-11-28 13:44:39 +01:00
# endif
2001-09-05 12:49:04 +02:00
if ( mask & INITED_VO ) {
inited_flags & = ~ INITED_VO ;
current_module = " uninit_vo " ;
2002-03-17 03:28:32 +01:00
video_out - > uninit ( ) ; video_out = NULL ;
2001-09-05 12:49:04 +02:00
}
if ( mask & INITED_AO ) {
inited_flags & = ~ INITED_AO ;
current_module = " uninit_ao " ;
2002-03-17 03:28:32 +01:00
audio_out - > uninit ( ) ; audio_out = NULL ;
2001-09-05 12:49:04 +02:00
}
2001-08-28 01:56:44 +02:00
# ifdef HAVE_NEW_GUI
2001-09-05 12:49:04 +02:00
if ( mask & INITED_GUI ) {
inited_flags & = ~ INITED_GUI ;
current_module = " uninit_gui " ;
2002-02-23 16:12:55 +01:00
guiDone ( ) ;
2001-09-05 12:49:04 +02:00
}
2001-08-28 01:56:44 +02:00
# endif
2002-02-23 22:22:55 +01:00
# if defined(HAVE_LIRC) && ! defined(HAVE_NEW_INPUT)
2001-09-05 12:49:04 +02:00
if ( mask & INITED_LIRC ) {
inited_flags & = ~ INITED_LIRC ;
current_module = " uninit_lirc " ;
lirc_mp_cleanup ( ) ;
}
2001-02-24 21:28:24 +01:00
# endif
2001-08-22 23:35:44 +02:00
2002-01-31 10:37:12 +01:00
# ifdef HAVE_NEW_INPUT
if ( mask & INITED_INPUT ) {
inited_flags & = INITED_INPUT ;
current_module = " uninit_input " ;
mp_input_uninit ( ) ;
}
# endif
2001-09-06 22:44:42 +02:00
current_module = NULL ;
2001-09-05 12:49:04 +02:00
}
void exit_player ( char * how ) {
uninit_player ( INITED_ALL ) ;
current_module = " exit_player " ;
2002-03-15 22:37:10 +01:00
if ( how ) mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_Exiting , mp_gettext ( how ) ) ;
2002-02-17 02:07:45 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_DBG2 , " max framesize was %d bytes \n " , max_framesize ) ;
2001-08-28 01:56:44 +02:00
2001-02-24 21:28:24 +01:00
exit ( 1 ) ;
}
void exit_sighandler ( int x ) {
static int sig_count = 0 ;
+ + sig_count ;
if ( sig_count = = 2 ) exit ( 1 ) ;
if ( sig_count > 2 ) {
// can't stop :(
kill ( getpid ( ) , SIGKILL ) ;
}
2002-03-16 02:56:19 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , " \n " MSGTR_IntBySignal , x ,
2002-03-15 22:37:10 +01:00
current_module ? current_module : mp_gettext ( " unknown " )
2001-02-24 21:28:24 +01:00
) ;
2002-03-16 02:56:19 +01:00
switch ( x ) {
case SIGINT :
case SIGQUIT :
case SIGTERM :
case SIGKILL :
break ; // killed from keyboard (^C) or killed [-9]
case SIGILL :
2002-03-16 03:15:10 +01:00
# ifdef RUNTIME_CPUDETECT
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , " - MPlayer crashed by 'Illegal Instruction'. It may be a bug in our new runtime cpu-detection code... please read DOCS/bugreports.html \n " ) ;
# else
2002-03-16 02:56:19 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , " - MPlayer crashed by 'Illegal Instruction'. It usually happens when you run it on different CPU than it was compiled for. Verify this! \n " ) ;
2002-03-16 03:15:10 +01:00
# endif
2002-03-16 02:56:19 +01:00
case SIGFPE :
case SIGSEGV :
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , " - MPlayer crashed by bad usage of CPU/FPU/RAM. Recompile MPlayer with --enable-debug and make a 'gdb' backtrace and disassembly. For details, see DOCS/bugreports.html section 5.b. \n " ) ;
default :
2002-03-16 03:15:10 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , " - MPlayer crashed. This shouldn't happen. It can be a bug in the MPlayer code _or_ in your drivers _or_ in your gcc version. If you think it's MPlayer's fault, please read DOCS/bugreports.html and follow instructions there. We can't and won't help unless you provide these informations when reporting a possible bug. \n " ) ;
2002-03-16 02:56:19 +01:00
}
2001-02-24 21:28:24 +01:00
exit_player ( NULL ) ;
}
2001-10-30 18:04:59 +01:00
//extern void write_avi_header_1(FILE *f,int fcc,float fps,int width,int height);
2001-08-04 15:52:41 +02:00
2002-02-11 12:46:27 +01:00
extern void mp_register_options ( m_config_t * cfg ) ;
2001-04-16 02:09:53 +02:00
# include "mixer.h"
2001-03-19 00:32:31 +01:00
# include "cfg-mplayer.h"
2001-02-24 21:28:24 +01:00
2002-01-15 00:38:49 +01:00
void parse_cfgfiles ( m_config_t * conf )
2001-05-08 14:17:03 +02:00
{
2001-06-05 02:58:51 +02:00
char * conffile ;
int conffile_fd ;
2002-01-15 00:38:49 +01:00
if ( m_config_parse_config_file ( conf , " /etc/mplayer.conf " ) < 0 )
2001-03-19 00:32:31 +01:00
exit ( 1 ) ;
2001-03-21 01:14:42 +01:00
if ( ( conffile = get_path ( " " ) ) = = NULL ) {
2001-08-18 21:52:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_WARN , MSGTR_NoHomeDir ) ;
2001-03-19 00:32:31 +01:00
} else {
2001-03-21 01:14:42 +01:00
mkdir ( conffile , 0777 ) ;
free ( conffile ) ;
if ( ( conffile = get_path ( " config " ) ) = = NULL ) {
2001-08-18 21:52:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_GetpathProblem ) ;
2001-03-21 01:14:42 +01:00
} else {
if ( ( conffile_fd = open ( conffile , O_CREAT | O_EXCL | O_WRONLY , 0666 ) ) ! = - 1 ) {
2001-08-18 21:51:21 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_CreatingCfgFile , conffile ) ;
2001-03-21 01:14:42 +01:00
write ( conffile_fd , default_config , strlen ( default_config ) ) ;
close ( conffile_fd ) ;
}
2002-01-15 00:38:49 +01:00
if ( m_config_parse_config_file ( conf , conffile ) < 0 )
2001-03-21 01:14:42 +01:00
exit ( 1 ) ;
free ( conffile ) ;
2001-03-19 03:29:37 +01:00
}
2001-02-24 21:28:24 +01:00
}
}
2002-02-23 22:22:55 +01:00
// When libmpdemux perform a blocking operation (network connection or cache filling)
// if the operation fail we use this function to check if it was interrupted by the user.
// The function return a new value for eof.
static int libmpdemux_was_interrupted ( int eof ) {
# ifdef HAVE_NEW_INPUT
mp_cmd_t * cmd ;
if ( ( cmd = mp_input_get_cmd ( 0 , 0 ) ) ! = NULL ) {
switch ( cmd - > id ) {
case MP_CMD_QUIT :
exit_player ( MSGTR_Exit_quit ) ;
case MP_CMD_PLAY_TREE_STEP : {
eof = ( cmd - > args [ 0 ] . v . i > 0 ) ? PT_NEXT_ENTRY : PT_PREV_ENTRY ;
} break ;
case MP_CMD_PLAY_TREE_UP_STEP : {
eof = ( cmd - > args [ 0 ] . v . i > 0 ) ? PT_UP_NEXT : PT_UP_PREV ;
} break ;
case MP_CMD_PLAY_ALT_SRC_STEP : {
eof = ( cmd - > args [ 0 ] . v . i > 0 ) ? PT_NEXT_SRC : PT_PREV_SRC ;
} break ;
}
mp_cmd_free ( cmd ) ;
}
return eof ;
# else
return 0 ;
# endif
}
2001-09-27 14:59:35 +02:00
int main ( int argc , char * argv [ ] , char * envp [ ] ) {
2001-05-08 14:17:03 +02:00
2001-07-30 04:00:54 +02:00
# ifdef USE_SUB
2001-07-07 20:46:15 +02:00
static subtitle * subtitles = NULL ;
2001-12-03 02:03:17 +01:00
float sub_last_pts = - 303 ;
2001-07-30 04:00:54 +02:00
# endif
2001-07-07 20:46:15 +02:00
static demuxer_t * demuxer = NULL ;
static demux_stream_t * d_audio = NULL ;
static demux_stream_t * d_video = NULL ;
static demux_stream_t * d_dvdsub = NULL ;
static sh_audio_t * sh_audio = NULL ;
static sh_video_t * sh_video = NULL ;
2001-08-22 21:29:47 +02:00
// for multifile support:
2002-01-08 03:01:04 +01:00
play_tree_iter_t * playtree_iter = NULL ;
2001-08-22 21:29:47 +02:00
2001-06-05 02:58:51 +02:00
char * filename = NULL ; //"MI2-Trailer.avi";
int file_format = DEMUXER_TYPE_UNKNOWN ;
2002-01-15 00:38:49 +01:00
2001-06-05 02:58:51 +02:00
int delay_corrected = 1 ;
2002-03-15 00:28:51 +01:00
//char* title="MPlayer";
2001-06-05 02:58:51 +02:00
// movie info:
int out_fmt = 0 ;
2002-01-08 03:01:04 +01:00
int eof = 0 ;
2001-06-05 02:58:51 +02:00
int osd_visible = 100 ;
int osd_function = OSD_PLAY ;
int osd_last_pts = - 303 ;
2001-12-27 01:59:40 +01:00
int osd_show_av_delay = 0 ;
2001-12-01 00:44:04 +01:00
int osd_show_sub_delay = 0 ;
2001-06-05 02:58:51 +02:00
2002-01-28 08:29:17 +01:00
int v_hw_equ_cap = 0 ;
int v_bright = 50 ;
int v_cont = 50 ;
int v_hue = 50 ;
int v_saturation = 50 ;
2002-01-27 19:39:53 +01:00
/*
For future :
int v_red_intensity = 0 ;
int v_green_intensity = 0 ;
int v_blue_intensity = 0 ;
*/
2001-08-01 03:02:33 +02:00
2001-11-14 01:26:28 +01:00
int rtc_fd = - 1 ;
2001-07-21 03:17:00 +02:00
//float a_frame=0; // Audio
2001-06-05 02:58:51 +02:00
int i ;
2001-08-30 23:14:34 +02:00
int gui_no_filename = 0 ;
2002-03-15 00:28:51 +01:00
//vo_tune_info_t vtune;
2002-02-01 09:50:45 +01:00
2001-08-17 02:40:25 +02:00
mp_msg_init ( MSGL_STATUS ) ;
2002-03-15 22:37:10 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , banner_text ) ;
2002-03-15 00:28:51 +01:00
// memset(&vtune,0,sizeof(vo_tune_info_t));
2001-10-19 04:00:45 +02:00
/* Test for cpu capabilities (and corresponding OS support) for optimizing */
# ifdef ARCH_X86
GetCpuCaps ( & gCpuCaps ) ;
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " CPUflags: Type: %d MMX: %d MMX2: %d 3DNow: %d 3DNow2: %d SSE: %d SSE2: %d \n " ,
gCpuCaps . cpuType , gCpuCaps . hasMMX , gCpuCaps . hasMMX2 ,
gCpuCaps . has3DNow , gCpuCaps . has3DNowExt ,
gCpuCaps . hasSSE , gCpuCaps . hasSSE2 ) ;
2001-12-25 18:53:31 +01:00
# ifdef RUNTIME_CPUDETECT
2002-03-19 19:49:39 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " Compiled with RUNTIME CPU Detection - warning, it's not optimal! To get best performance, recompile mplayer from sources with --disable-runtime-cpudetection \n " ) ;
2001-12-25 18:53:31 +01:00
# else
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " Compiled for x86 CPU with features: " ) ;
# ifdef HAVE_MMX
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " MMX " ) ;
# endif
# ifdef HAVE_MMX2
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " MMX2 " ) ;
# endif
# ifdef HAVE_3DNOW
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " 3DNow " ) ;
# endif
# ifdef HAVE_3DNOWEX
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " 3DNowEx " ) ;
# endif
# ifdef HAVE_SSE
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " SSE " ) ;
# endif
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " \n " ) ;
# endif
2001-10-19 04:00:45 +02:00
# endif
2001-08-27 02:55:25 +02:00
if ( argv [ 0 ] )
if ( ! strcmp ( argv [ 0 ] , " gmplayer " ) | |
( strrchr ( argv [ 0 ] , ' / ' ) & & ! strcmp ( strrchr ( argv [ 0 ] , ' / ' ) , " /gmplayer " ) ) )
use_gui = 1 ;
2001-08-22 23:35:44 +02:00
2002-01-08 03:01:04 +01:00
playtree = play_tree_new ( ) ;
2002-01-15 00:38:49 +01:00
mconfig = m_config_new ( playtree ) ;
m_config_register_options ( mconfig , mplayer_opts ) ;
// TODO : add something to let modules register their options
2002-02-11 12:46:27 +01:00
mp_register_options ( mconfig ) ;
2002-01-15 00:38:49 +01:00
parse_cfgfiles ( mconfig ) ;
if ( m_config_parse_command_line ( mconfig , argc , argv , envp ) < 0 ) exit ( 1 ) ; // error parsing cmdline
2002-01-08 03:01:04 +01:00
playtree = play_tree_cleanup ( playtree ) ;
if ( playtree ) {
2002-01-15 00:38:49 +01:00
playtree_iter = play_tree_iter_new ( playtree , mconfig ) ;
2002-01-08 03:01:04 +01:00
if ( playtree_iter ) {
if ( play_tree_iter_step ( playtree_iter , 0 , 0 ) ! = PLAY_TREE_ITER_ENTRY ) {
play_tree_iter_free ( playtree_iter ) ;
playtree_iter = NULL ;
}
filename = play_tree_iter_get_file ( playtree_iter , 1 ) ;
2001-11-03 03:55:03 +01:00
}
}
2002-01-08 03:01:04 +01:00
2001-08-27 02:55:25 +02:00
# ifndef HAVE_NEW_GUI
if ( use_gui ) {
2001-09-26 23:35:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_WARN , MSGTR_NoGui ) ;
2001-08-27 02:55:25 +02:00
use_gui = 0 ;
}
2001-08-28 01:56:44 +02:00
# else
if ( use_gui & & ! vo_init ( ) ) {
2001-09-26 23:35:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_WARN , MSGTR_GuiNeedsX ) ;
2001-08-28 01:56:44 +02:00
use_gui = 0 ;
}
2001-08-27 02:55:25 +02:00
# endif
2001-05-08 14:17:03 +02:00
if ( video_driver & & strcmp ( video_driver , " help " ) = = 0 ) {
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " Available video output drivers: \n " ) ;
2001-05-08 14:17:03 +02:00
i = 0 ;
while ( video_out_drivers [ i ] ) {
const vo_info_t * info = video_out_drivers [ i + + ] - > get_info ( ) ;
printf ( " \t %s \t %s \n " , info - > short_name , info - > name ) ;
}
printf ( " \n " ) ;
exit ( 0 ) ;
2001-06-03 02:24:49 +02:00
}
2002-03-14 22:31:25 +01:00
2001-06-03 02:24:49 +02:00
if ( audio_driver & & strcmp ( audio_driver , " help " ) = = 0 ) {
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " Available audio output drivers: \n " ) ;
2001-06-03 02:24:49 +02:00
i = 0 ;
while ( audio_out_drivers [ i ] ) {
const ao_info_t * info = audio_out_drivers [ i + + ] - > info ;
printf ( " \t %s \t %s \n " , info - > short_name , info - > name ) ;
}
printf ( " \n " ) ;
exit ( 0 ) ;
}
2001-08-25 21:11:24 +02:00
2001-09-27 14:59:35 +02:00
// check codec.conf
if ( ! parse_codec_cfg ( get_path ( " codecs.conf " ) ) ) {
2001-12-25 22:59:07 +01:00
if ( ! parse_codec_cfg ( CONFDIR " /codecs.conf " ) ) {
2001-09-27 14:59:35 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_HINT , MSGTR_CopyCodecsConf ) ;
2002-01-01 23:46:07 +01:00
exit ( 0 ) ; // From unknown reason a hangup occurs here :((((((
2001-09-27 14:59:35 +02:00
}
}
if ( audio_codec & & strcmp ( audio_codec , " help " ) = = 0 ) {
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " Available audio codecs: \n " ) ;
2001-09-27 14:59:35 +02:00
list_codecs ( 1 ) ;
printf ( " \n " ) ;
exit ( 0 ) ;
}
if ( video_codec & & strcmp ( video_codec , " help " ) = = 0 ) {
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " Available video codecs: \n " ) ;
2001-09-27 14:59:35 +02:00
list_codecs ( 0 ) ;
printf ( " \n " ) ;
exit ( 0 ) ;
}
2002-01-08 03:01:04 +01:00
if ( ! filename & & ! vcd_track & & ! dvd_title & & ! tv_param_on ) {
2001-08-30 23:14:34 +02:00
if ( ! use_gui ) {
2001-08-25 21:11:24 +02:00
// no file/vcd/dvd -> show HELP:
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , help_text ) ;
2001-08-25 21:11:24 +02:00
exit ( 0 ) ;
2001-08-30 23:14:34 +02:00
} else gui_no_filename = 1 ;
2001-08-25 21:11:24 +02:00
}
// Many users forget to include command line in bugreports...
if ( verbose ) {
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " CommandLine: " ) ;
2001-08-25 21:11:24 +02:00
for ( i = 1 ; i < argc ; i + + ) printf ( " '%s' " , argv [ i ] ) ;
printf ( " \n " ) ;
}
2001-08-22 23:35:44 +02:00
2002-01-14 18:39:02 +01:00
mp_msg_init ( verbose + MSGL_STATUS ) ;
2001-08-22 23:35:44 +02:00
//------ load global data first ------
2001-03-30 05:07:45 +02:00
2001-08-22 23:35:44 +02:00
// check font
# ifdef USE_OSD
if ( font_name ) {
vo_font = read_font_desc ( font_name , font_factor , verbose > 1 ) ;
if ( ! vo_font ) mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_CantLoadFont , font_name ) ;
} else {
// try default:
vo_font = read_font_desc ( get_path ( " font/font.desc " ) , font_factor , verbose > 1 ) ;
if ( ! vo_font )
vo_font = read_font_desc ( DATADIR " /font/font.desc " , font_factor , verbose > 1 ) ;
}
# endif
2002-01-31 10:37:12 +01:00
# if defined(HAVE_LIRC) && ! defined(HAVE_NEW_INPUT)
2001-08-22 23:35:44 +02:00
lirc_mp_setup ( ) ;
2001-09-05 12:49:04 +02:00
inited_flags | = INITED_LIRC ;
2001-08-22 23:35:44 +02:00
# endif
2001-11-20 08:53:20 +01:00
# ifdef HAVE_RTC
2002-03-12 19:02:02 +01:00
if ( ! nortc )
{
2001-11-14 01:26:28 +01:00
if ( ( rtc_fd = open ( " /dev/rtc " , O_RDONLY ) ) < 0 )
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , " Linux RTC init error: %s \n " , strerror ( errno ) ) ;
2001-11-14 01:26:28 +01:00
else {
unsigned long irqp ;
/* if (ioctl(rtc_fd, RTC_IRQP_SET, _) < 0) { */
if ( ioctl ( rtc_fd , RTC_IRQP_READ , & irqp ) < 0 ) {
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , " Linux RTC init error in ioctl (rtc_irqp_read): %s \n " , strerror ( errno ) ) ;
2001-11-14 01:26:28 +01:00
close ( rtc_fd ) ;
rtc_fd = - 1 ;
} else if ( ioctl ( rtc_fd , RTC_PIE_ON , 0 ) < 0 ) {
/* variable only by the root */
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , " Linux RTC init error in ioctl (rtc_pie_on): %s \n " , strerror ( errno ) ) ;
2001-11-14 01:26:28 +01:00
close ( rtc_fd ) ;
rtc_fd = - 1 ;
} else
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " Using Linux's hardware RTC timing (%ldHz) \n " , irqp ) ;
2001-11-14 01:26:28 +01:00
}
2002-03-12 19:02:02 +01:00
}
2002-01-15 18:03:19 +01:00
# ifdef HAVE_NEW_GUI
2001-12-28 03:04:06 +01:00
// breaks DGA and SVGAlib and VESA drivers: --A'rpi
2002-01-15 18:03:19 +01:00
// and now ? -- Pontscho
if ( use_gui ) setuid ( getuid ( ) ) ; // strongly test, please check this.
# endif
2001-11-14 01:26:28 +01:00
if ( rtc_fd < 0 )
# endif
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " Using %s timing \n " , softsleep ? " software " : " usleep() " ) ;
2001-11-14 01:26:28 +01:00
2001-08-22 23:35:44 +02:00
# ifdef USE_TERMCAP
2001-12-19 17:55:32 +01:00
if ( ! use_gui ) load_termcap ( NULL ) ; // load key-codes
2001-08-22 23:35:44 +02:00
# endif
2001-09-01 00:35:04 +02:00
// ========== Init keyboard FIFO (connection to libvo) ============
make_pipe ( & keyb_fifo_get , & keyb_fifo_put ) ;
2001-08-25 23:05:23 +02:00
2002-01-30 13:46:03 +01:00
// Init input system
# ifdef HAVE_NEW_INPUT
current_module = " init_input " ;
mp_input_init ( ) ;
if ( keyb_fifo_get > 0 )
mp_input_add_key_fd ( keyb_fifo_get , 1 , NULL , NULL ) ;
if ( slave_mode )
mp_input_add_cmd_fd ( 0 , 1 , NULL , NULL ) ;
2002-02-28 14:49:04 +01:00
else if ( ! use_stdin )
2002-01-30 13:46:03 +01:00
mp_input_add_key_fd ( 0 , 1 , NULL , NULL ) ;
2002-01-31 10:37:12 +01:00
inited_flags | = INITED_INPUT ;
2002-01-30 13:46:03 +01:00
current_module = NULL ;
# endif
2001-08-22 23:35:44 +02:00
//========= Catch terminate signals: ================
// terminate requests:
signal ( SIGTERM , exit_sighandler ) ; // kill
signal ( SIGHUP , exit_sighandler ) ; // kill -HUP / xterm closed
2001-08-28 17:55:02 +02:00
signal ( SIGINT , exit_sighandler ) ; // Interrupt from keyboard
2001-08-22 23:35:44 +02:00
signal ( SIGQUIT , exit_sighandler ) ; // Quit from keyboard
// fatal errors:
signal ( SIGBUS , exit_sighandler ) ; // bus error
signal ( SIGSEGV , exit_sighandler ) ; // segfault
signal ( SIGILL , exit_sighandler ) ; // illegal instruction
signal ( SIGFPE , exit_sighandler ) ; // floating point exc.
signal ( SIGABRT , exit_sighandler ) ; // abort()
// ******************* Now, let's see the per-file stuff ********************
2002-03-07 00:54:20 +01:00
# ifdef HAVE_NEW_GUI
if ( use_gui ) {
guiInit ( argc , argv , envp ) ;
inited_flags | = INITED_GUI ;
2002-03-07 12:57:33 +01:00
guiGetEvent ( guiCEvent , ( char * ) ( ( gui_no_filename ) ? 0 : 1 ) ) ;
2002-03-07 00:54:20 +01:00
}
# endif
2001-08-22 23:35:44 +02:00
play_next_file :
2001-08-30 23:14:34 +02:00
2002-02-24 13:05:12 +01:00
// We must enable getch2 here to be able to interrupt network connection
// or cache filling
if ( ! use_stdin & & ! slave_mode ) {
getch2_enable ( ) ; // prepare stdin for hotkeys...
inited_flags | = INITED_GETCH2 ;
2002-03-17 03:28:32 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_DBG2 , " \n [[[init getch2]]] \n " ) ;
2002-02-24 13:05:12 +01:00
}
2002-02-23 22:22:55 +01:00
2001-08-29 17:08:43 +02:00
# ifdef HAVE_NEW_GUI
2001-08-30 23:14:34 +02:00
if ( use_gui ) {
2001-12-19 17:55:32 +01:00
# ifdef USE_DVDREAD
2002-02-23 16:12:55 +01:00
if ( guiIntfStruct . DVDChanged )
2001-12-19 17:55:32 +01:00
{
2002-02-23 16:12:55 +01:00
guiIntfStruct . DVDChanged = 0 ;
2002-03-07 12:57:33 +01:00
guiGetEvent ( guiCEvent , ( char * ) guiSetPlay ) ;
2001-12-19 17:55:32 +01:00
filename = " /dev/dvd " ;
goto play_dvd ;
}
# endif
2002-02-23 16:12:55 +01:00
while ( guiIntfStruct . Playing ! = 1 ) {
2002-03-15 17:13:27 +01:00
# ifdef HAVE_NEW_INPUT
2002-02-25 14:14:27 +01:00
mp_cmd_t * cmd ;
2002-03-15 17:13:27 +01:00
# endif
2001-08-30 23:14:34 +02:00
usleep ( 20000 ) ;
2002-02-21 23:48:47 +01:00
guiEventHandling ( ) ;
2002-03-15 17:13:27 +01:00
# ifdef HAVE_NEW_INPUT
2002-02-25 14:14:27 +01:00
if ( ( cmd = mp_input_get_cmd ( 0 , 0 ) ) ! = NULL ) guiGetEvent ( guiIEvent , ( char * ) cmd - > id ) ;
2002-03-15 17:13:27 +01:00
# endif
2001-08-30 23:14:34 +02:00
}
2001-12-17 17:05:36 +01:00
2001-12-19 17:55:32 +01:00
play_dvd :
2001-12-15 16:36:07 +01:00
# ifdef USE_SUB
2002-02-23 16:12:55 +01:00
if ( guiIntfStruct . SubtitleChanged | | ! guiIntfStruct . FilenameChanged )
2001-12-17 17:05:36 +01:00
{
2002-02-23 16:12:55 +01:00
if ( ( guiIntfStruct . Subtitlename ) & & ( guiIntfStruct . Subtitlename [ 0 ] ! = 0 ) ) sub_name = guiIntfStruct . Subtitlename ;
guiIntfStruct . SubtitleChanged = 0 ;
2001-12-17 17:05:36 +01:00
}
2001-12-15 16:36:07 +01:00
# endif
2002-02-23 16:12:55 +01:00
if ( guiIntfStruct . FilenameChanged | | ! filename )
2001-12-17 01:07:20 +01:00
{
2002-03-06 19:42:56 +01:00
play_tree_t * entry = play_tree_new ( ) ;
play_tree_add_file ( entry , guiIntfStruct . Filename ) ;
2002-03-07 12:57:33 +01:00
if ( playtree ) play_tree_free_list ( playtree - > child , 1 ) ;
else playtree = play_tree_new ( ) ;
play_tree_set_child ( playtree , entry ) ;
if ( playtree )
2002-03-06 19:42:56 +01:00
{
2002-03-07 12:57:33 +01:00
playtree_iter = play_tree_iter_new ( playtree , mconfig ) ;
2002-03-06 19:42:56 +01:00
if ( playtree_iter )
{
if ( play_tree_iter_step ( playtree_iter , 0 , 0 ) ! = PLAY_TREE_ITER_ENTRY )
{
play_tree_iter_free ( playtree_iter ) ;
playtree_iter = NULL ;
}
filename = play_tree_iter_get_file ( playtree_iter , 1 ) ;
}
}
2002-03-07 12:57:33 +01:00
// filename=playtree->child->files[0];
2002-03-06 19:42:56 +01:00
guiIntfStruct . FilenameChanged = 0 ;
2002-03-07 12:57:33 +01:00
}
2001-08-30 23:14:34 +02:00
}
# endif
2001-09-26 23:35:14 +02:00
if ( filename ) mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_Playing , filename ) ;
2001-08-23 13:33:58 +02:00
2002-02-20 23:41:06 +01:00
current_module = " vobsub " ;
if ( vobsub_name ) {
2002-02-21 16:44:51 +01:00
vo_vobsub = vobsub_open ( vobsub_name , 1 ) ;
2002-02-20 23:41:06 +01:00
if ( vo_vobsub = = NULL )
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_CantLoadSub , vobsub_name ) ;
} else if ( sub_auto & & filename & & ( strlen ( filename ) > = 5 ) ) {
/* try to autodetect vobsub from movie filename ::atmos */
char * buf = malloc ( ( strlen ( filename ) - 3 ) * sizeof ( char ) ) ;
memset ( buf , 0 , strlen ( filename ) - 3 ) ; // make sure string is terminated
strncpy ( buf , filename , strlen ( filename ) - 4 ) ;
2002-02-21 16:44:51 +01:00
vo_vobsub = vobsub_open ( buf , 0 ) ;
2002-02-20 23:41:06 +01:00
free ( buf ) ;
}
if ( vo_vobsub )
sub_auto = 0 ; // don't do autosub for textsubs if vobsub found
2001-08-23 14:24:59 +02:00
stream = NULL ;
demuxer = NULL ;
d_audio = NULL ;
d_video = NULL ;
sh_audio = NULL ;
sh_video = NULL ;
2001-08-23 01:48:18 +02:00
2001-02-24 21:28:24 +01:00
// check video_out driver name:
2001-06-22 00:34:02 +02:00
if ( video_driver )
if ( ( i = strcspn ( video_driver , " : " ) ) > 0 )
{
size_t i2 = strlen ( video_driver ) ;
2001-06-22 01:03:03 +02:00
if ( video_driver [ i ] = = ' : ' )
{
vo_subdevice = malloc ( i2 - i ) ;
if ( vo_subdevice ! = NULL )
strncpy ( vo_subdevice , ( char * ) ( video_driver + i + 1 ) , i2 - i ) ;
video_driver [ i ] = ' \0 ' ;
}
2001-06-22 00:34:02 +02:00
// printf("video_driver: %s, subdevice: %s\n", video_driver, vo_subdevice);
}
2001-02-24 21:28:24 +01:00
if ( ! video_driver )
video_out = video_out_drivers [ 0 ] ;
else
for ( i = 0 ; video_out_drivers [ i ] ! = NULL ; i + + ) {
const vo_info_t * info = video_out_drivers [ i ] - > get_info ( ) ;
if ( strcmp ( info - > short_name , video_driver ) = = 0 ) {
video_out = video_out_drivers [ i ] ; break ;
}
}
2002-03-14 22:31:25 +01:00
2001-02-24 21:28:24 +01:00
if ( ! video_out ) {
2001-08-18 21:51:21 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_InvalidVOdriver , video_driver ? video_driver : " ? " ) ;
2001-08-22 23:35:44 +02:00
exit_player ( MSGTR_Exit_error ) ;
2001-06-03 02:24:49 +02:00
}
// check audio_out driver name:
2001-06-22 00:34:02 +02:00
if ( audio_driver )
if ( ( i = strcspn ( audio_driver , " : " ) ) > 0 )
{
size_t i2 = strlen ( audio_driver ) ;
2001-06-22 01:03:03 +02:00
if ( audio_driver [ i ] = = ' : ' )
{
ao_subdevice = malloc ( i2 - i ) ;
if ( ao_subdevice ! = NULL )
strncpy ( ao_subdevice , ( char * ) ( audio_driver + i + 1 ) , i2 - i ) ;
audio_driver [ i ] = ' \0 ' ;
}
2001-06-22 00:34:02 +02:00
// printf("audio_driver: %s, subdevice: %s\n", audio_driver, ao_subdevice);
}
2001-06-03 02:24:49 +02:00
if ( ! audio_driver )
audio_out = audio_out_drivers [ 0 ] ;
else
for ( i = 0 ; audio_out_drivers [ i ] ! = NULL ; i + + ) {
const ao_info_t * info = audio_out_drivers [ i ] - > info ;
if ( strcmp ( info - > short_name , audio_driver ) = = 0 ) {
audio_out = audio_out_drivers [ i ] ; break ;
}
}
if ( ! audio_out ) {
2001-08-18 21:51:21 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_InvalidAOdriver , audio_driver ) ;
2001-08-22 23:35:44 +02:00
exit_player ( MSGTR_Exit_error ) ;
2001-02-24 21:28:24 +01:00
}
2001-11-25 15:29:54 +01:00
/* Initailize audio plugin interface if used */
2001-11-29 13:44:06 +01:00
if ( ao_plugin_cfg . plugin_list ) {
2001-11-25 15:29:54 +01:00
for ( i = 0 ; audio_out_drivers [ i ] ! = NULL ; i + + ) {
const ao_info_t * info = audio_out_drivers [ i ] - > info ;
if ( strcmp ( info - > short_name , " plugin " ) = = 0 ) {
audio_out_drivers [ i ] - > control ( AOCONTROL_SET_PLUGIN_DRIVER , ( int ) audio_out ) ;
audio_out = audio_out_drivers [ i ] ;
break ;
}
}
}
2002-03-17 01:47:15 +01:00
//============ Open & Sync STREAM --- fork cache2 ====================
2001-08-22 23:35:44 +02:00
current_module = " open_stream " ;
2001-08-09 03:17:24 +02:00
stream = open_stream ( filename , vcd_track , & file_format ) ;
2002-01-08 03:01:04 +01:00
if ( ! stream ) { // error...
2002-02-23 22:22:55 +01:00
eof = libmpdemux_was_interrupted ( PT_NEXT_ENTRY ) ;
goto goto_next_file ;
2002-01-08 03:01:04 +01:00
}
2001-10-21 01:48:56 +02:00
inited_flags | = INITED_STREAM ;
2002-03-17 01:47:15 +01:00
2002-01-08 03:01:04 +01:00
if ( stream - > type = = STREAMTYPE_PLAYLIST ) {
play_tree_t * entry ;
// Handle playlist
2002-03-17 01:47:15 +01:00
current_module = " handle_playlist " ;
2002-01-08 03:01:04 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_V , " Parsing playlist %s... \n " , filename ) ;
entry = parse_playtree ( stream ) ;
if ( ! entry ) {
entry = playtree_iter - > tree ;
2002-02-23 22:22:55 +01:00
if ( play_tree_iter_step ( playtree_iter , 1 , 0 ) ! = PLAY_TREE_ITER_ENTRY ) {
eof = PT_NEXT_ENTRY ;
2002-01-08 03:01:04 +01:00
goto goto_next_file ;
2002-02-23 22:22:55 +01:00
}
if ( playtree_iter - > tree = = entry ) { // Loop with a single file
if ( play_tree_iter_up_step ( playtree_iter , 1 , 0 ) ! = PLAY_TREE_ITER_ENTRY ) {
eof = PT_NEXT_ENTRY ;
2002-01-08 03:01:04 +01:00
goto goto_next_file ;
2002-02-23 22:22:55 +01:00
}
2002-01-08 03:01:04 +01:00
}
play_tree_remove ( entry , 1 , 1 ) ;
2002-02-23 22:22:55 +01:00
eof = PT_NEXT_SRC ;
goto goto_next_file ;
2002-01-08 03:01:04 +01:00
}
play_tree_insert_entry ( playtree_iter - > tree , entry ) ;
entry = playtree_iter - > tree ;
2002-02-23 22:22:55 +01:00
if ( play_tree_iter_step ( playtree_iter , 1 , 0 ) ! = PLAY_TREE_ITER_ENTRY ) {
eof = PT_NEXT_ENTRY ;
2002-01-08 03:01:04 +01:00
goto goto_next_file ;
2002-02-23 22:22:55 +01:00
}
2002-01-08 03:01:04 +01:00
play_tree_remove ( entry , 1 , 1 ) ;
2002-02-23 22:22:55 +01:00
eof = PT_NEXT_SRC ;
goto goto_next_file ;
2002-01-08 03:01:04 +01:00
}
2001-08-12 19:28:16 +02:00
stream - > start_pos + = seek_to_byte ;
2001-04-23 23:25:09 +02:00
2002-03-17 01:47:15 +01:00
# ifdef HAVE_LIBCSS
current_module = " libcss " ;
if ( dvdimportkey ) {
if ( dvd_import_key ( dvdimportkey ) ) {
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_ErrorDVDkey ) ;
exit_player ( MSGTR_Exit_error ) ;
}
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_CmdlineDVDkey ) ;
}
if ( dvd_auth_device ) {
if ( dvd_auth ( dvd_auth_device , filename ) ) {
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , " Error in DVD auth... \n " ) ;
exit_player ( MSGTR_Exit_error ) ;
}
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_DVDauthOk ) ;
}
# endif
2001-12-01 23:54:17 +01:00
if ( stream_dump_type = = 5 ) {
unsigned char buf [ 4096 ] ;
int len ;
FILE * f ;
2002-03-17 01:47:15 +01:00
current_module = " dumpstream " ;
2001-12-01 23:54:17 +01:00
stream_reset ( stream ) ;
stream_seek ( stream , stream - > start_pos ) ;
f = fopen ( stream_dump_name , " wb " ) ;
if ( ! f ) {
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_CantOpenDumpfile ) ;
exit_player ( MSGTR_Exit_error ) ;
}
while ( ! stream - > eof ) {
len = stream_read ( stream , buf , 4096 ) ;
if ( len > 0 ) fwrite ( buf , len , 1 , f ) ;
}
fclose ( f ) ;
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_CoreDumped ) ;
exit_player ( MSGTR_Exit_eof ) ;
}
2002-01-20 01:39:54 +01:00
# ifdef USE_DVDREAD
current_module = " dvd lang->id " ;
if ( audio_lang & & audio_id = = - 1 ) audio_id = dvd_aid_from_lang ( stream , audio_lang ) ;
if ( dvdsub_lang & & dvdsub_id = = - 1 ) dvdsub_id = dvd_sid_from_lang ( stream , dvdsub_lang ) ;
current_module = NULL ;
# endif
2002-03-17 01:47:15 +01:00
// CACHE2: initial prefill: 20% later: 5% (should be set by -cacheopts)
if ( stream_cache_size ) {
current_module = " enable_cache " ;
if ( ! stream_enable_cache ( stream , stream_cache_size * 1024 , stream_cache_size * 1024 / 5 , stream_cache_size * 1024 / 20 ) )
if ( ( eof = libmpdemux_was_interrupted ( PT_NEXT_ENTRY ) ) ) goto goto_next_file ;
}
2001-02-24 21:28:24 +01:00
2002-03-17 01:47:15 +01:00
//============ Open DEMUXERS --- DETECT file type =======================
2001-12-01 23:54:17 +01:00
2001-04-15 21:13:38 +02:00
if ( ! has_audio ) audio_id = - 2 ; // do NOT read audio packets...
2001-02-24 21:28:24 +01:00
2001-08-22 23:35:44 +02:00
current_module = " demux_open " ;
2001-08-12 17:46:09 +02:00
demuxer = demux_open ( stream , file_format , audio_id , video_id , dvdsub_id ) ;
2001-08-23 01:48:18 +02:00
if ( ! demuxer ) goto goto_next_file ; // exit_player(MSGTR_Exit_error); // ERROR
2001-07-22 00:37:55 +02:00
2002-03-18 02:49:42 +01:00
current_module = " demux_open2 " ;
2001-08-23 15:21:21 +02:00
//file_format=demuxer->file_format;
2001-07-22 00:37:55 +02:00
2001-02-24 21:28:24 +01:00
d_audio = demuxer - > audio ;
d_video = demuxer - > video ;
2001-04-21 01:00:11 +02:00
d_dvdsub = demuxer - > sub ;
2001-02-24 21:28:24 +01:00
2001-05-14 00:45:21 +02:00
// DUMP STREAMS:
2002-01-24 16:17:12 +01:00
if ( ( stream_dump_type ) & & ( stream_dump_type ! = 4 ) ) {
2001-05-14 00:45:21 +02:00
FILE * f ;
demux_stream_t * ds = NULL ;
2001-08-22 23:35:44 +02:00
current_module = " dump " ;
2001-05-14 00:45:21 +02:00
// select stream to dump
switch ( stream_dump_type ) {
case 1 : ds = d_audio ; break ;
case 2 : ds = d_video ; break ;
2002-01-24 16:17:12 +01:00
case 3 : ds = d_dvdsub ; break ;
2001-05-14 00:45:21 +02:00
}
if ( ! ds ) {
2001-08-18 21:51:21 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_DumpSelectedSteramMissing ) ;
2001-08-22 23:35:44 +02:00
exit_player ( MSGTR_Exit_error ) ;
2001-05-14 00:45:21 +02:00
}
// disable other streams:
if ( d_audio & & d_audio ! = ds ) { ds_free_packs ( d_audio ) ; d_audio - > id = - 2 ; }
if ( d_video & & d_video ! = ds ) { ds_free_packs ( d_video ) ; d_video - > id = - 2 ; }
if ( d_dvdsub & & d_dvdsub ! = ds ) { ds_free_packs ( d_dvdsub ) ; d_dvdsub - > id = - 2 ; }
// let's dump it!
2001-12-01 23:54:17 +01:00
f = fopen ( stream_dump_name , " wb " ) ;
2001-08-22 23:35:44 +02:00
if ( ! f ) {
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_CantOpenDumpfile ) ;
exit_player ( MSGTR_Exit_error ) ;
}
2001-05-14 00:45:21 +02:00
while ( ! ds - > eof ) {
unsigned char * start ;
int in_size = ds_get_packet ( ds , & start ) ;
2001-10-06 02:59:45 +02:00
if ( ( demuxer - > file_format = = DEMUXER_TYPE_AVI | | demuxer - > file_format = = DEMUXER_TYPE_ASF | | demuxer - > file_format = = DEMUXER_TYPE_MOV )
2001-06-29 23:35:30 +02:00
& & stream_dump_type = = 2 ) fwrite ( & in_size , 1 , 4 , f ) ;
2001-05-14 00:45:21 +02:00
if ( in_size > 0 ) fwrite ( start , in_size , 1 , f ) ;
}
fclose ( f ) ;
2001-08-18 21:51:21 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_CoreDumped ) ;
2001-08-22 23:35:44 +02:00
exit_player ( MSGTR_Exit_eof ) ;
2001-05-14 00:45:21 +02:00
}
2001-07-22 00:37:55 +02:00
sh_audio = d_audio - > sh ;
sh_video = d_video - > sh ;
2001-05-14 00:45:21 +02:00
2001-07-22 00:37:55 +02:00
if ( sh_video ) {
2001-02-24 21:28:24 +01:00
2002-03-17 01:47:15 +01:00
current_module = " video_read_properties " ;
2002-02-08 17:00:14 +01:00
if ( ! video_read_properties ( sh_video ) ) {
mp_msg ( MSGT_CPLAYER , MSGL_ERR , " Video: can't read properties \n " ) ;
sh_video = d_video - > sh = NULL ;
} else {
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " [V] filefmt:%d fourcc:0x%X size:%dx%d fps:%5.2f ftime:=%6.4f \n " ,
demuxer - > file_format , sh_video - > format , sh_video - > disp_w , sh_video - > disp_h ,
sh_video - > fps , sh_video - > frametime
) ;
2002-02-09 02:29:11 +01:00
vo_fps = sh_video - > fps ;
/* need to set fps here for output encoders to pick it up in their init */
if ( force_fps ) {
sh_video - > fps = force_fps ;
sh_video - > frametime = 1.0f / sh_video - > fps ;
vo_fps = force_fps ;
}
2002-02-08 17:00:14 +01:00
if ( ! sh_video - > fps & & ! force_fps ) {
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_FPSnotspecified ) ;
sh_video = d_video - > sh = NULL ;
}
2001-07-22 00:37:55 +02:00
}
}
2001-04-14 05:12:06 +02:00
2001-02-24 21:28:24 +01:00
fflush ( stdout ) ;
2002-02-08 17:00:14 +01:00
if ( ! sh_video & & ! sh_audio ) {
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , " No stream found \n " ) ;
2001-08-23 01:48:18 +02:00
goto goto_next_file ; // exit_player(MSGTR_Exit_error);
2001-05-12 03:57:18 +02:00
}
2002-03-17 01:47:15 +01:00
/* display clip info */
demux_info_print ( demuxer ) ;
//================== Read SUBTITLES (DVD & TEXT) ==========================
if ( sh_video ) {
2002-02-08 17:00:14 +01:00
2002-01-11 13:14:29 +01:00
# ifdef USE_DVDREAD
2002-03-17 01:47:15 +01:00
current_module = " spudec_init " ;
2002-02-06 21:26:19 +01:00
vo_spudec = spudec_new_scaled ( stream - > type = = STREAMTYPE_DVD ? ( ( dvd_priv_t * ) ( stream - > priv ) ) - > cur_pgc - > palette : NULL ,
2002-01-11 13:14:29 +01:00
sh_video - > disp_w , sh_video - > disp_h ) ;
if ( vo_spudec ! = NULL )
inited_flags | = INITED_SPUDEC ;
2002-01-20 01:39:54 +01:00
# endif
2002-01-08 15:10:22 +01:00
# ifdef USE_SUB
2002-01-09 17:35:24 +01:00
// after reading video params we should load subtitles because
2002-01-08 15:10:22 +01:00
// we know fps so now we can adjust subtitles time to ~6 seconds AST
2002-01-09 17:35:24 +01:00
// check .sub
2002-03-17 01:47:15 +01:00
current_module = " read_subtitles_file " ;
if ( sub_name ) {
subtitles = sub_read_file ( sub_name , sh_video - > fps ) ;
if ( ! subtitles ) mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_CantLoadSub , sub_name ) ;
} else
if ( sub_auto ) { // auto load sub file ...
subtitles = sub_read_file ( filename ? sub_filename ( get_path ( " sub/ " ) , filename )
: " default.sub " , sh_video - > fps ) ;
2002-01-09 17:35:24 +01:00
}
if ( subtitles & & stream_dump_type = = 3 ) list_sub_file ( subtitles ) ;
if ( subtitles & & stream_dump_type = = 4 ) dump_mpsub ( subtitles , sh_video - > fps ) ;
2002-01-08 15:10:22 +01:00
# endif
2002-01-09 17:35:24 +01:00
2002-03-17 01:47:15 +01:00
}
2001-04-07 23:27:57 +02:00
//================== Init AUDIO (codec) ==========================
2001-08-22 23:35:44 +02:00
current_module = " init_audio_codec " ;
2001-07-21 03:17:00 +02:00
if ( sh_audio ) {
2001-04-07 23:27:57 +02:00
// Go through the codec.conf and find the best codec...
2001-04-25 00:51:05 +02:00
sh_audio - > codec = NULL ;
2001-08-18 21:51:21 +02:00
if ( audio_family ! = - 1 ) mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_TryForceAudioFmt , audio_family ) ;
2001-04-25 00:51:05 +02:00
while ( 1 ) {
sh_audio - > codec = find_codec ( sh_audio - > format , NULL , sh_audio - > codec , 1 ) ;
if ( ! sh_audio - > codec ) {
2001-07-09 00:45:56 +02:00
if ( audio_family ! = - 1 ) {
sh_audio - > codec = NULL ; /* re-search */
2001-08-18 21:51:21 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_CantFindAfmtFallback ) ;
2001-07-09 00:45:56 +02:00
audio_family = - 1 ;
continue ;
}
2001-08-18 21:51:21 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_CantFindAudioCodec , sh_audio - > format ) ;
mp_msg ( MSGT_CPLAYER , MSGL_HINT , MSGTR_TryUpgradeCodecsConfOrRTFM , get_path ( " codecs.conf " ) ) ;
2001-08-31 00:56:27 +02:00
sh_audio = d_audio - > sh = NULL ;
2001-04-25 00:51:05 +02:00
break ;
}
2001-07-07 11:53:47 +02:00
if ( audio_codec & & strcmp ( sh_audio - > codec - > name , audio_codec ) ) continue ;
2001-07-09 00:45:56 +02:00
else if ( audio_family ! = - 1 & & sh_audio - > codec - > driver ! = audio_family ) continue ;
2002-03-15 22:37:10 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " %s audio codec: [%s] drv:%d (%s) \n " ,
audio_codec ? mp_gettext ( " Forcing " ) : mp_gettext ( " Detected " ) , sh_audio - > codec - > name , sh_audio - > codec - > driver , sh_audio - > codec - > info ) ;
2001-04-25 00:51:05 +02:00
break ;
2001-04-07 23:27:57 +02:00
}
}
2001-07-21 03:17:00 +02:00
if ( sh_audio ) {
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_V , " Initializing audio codec... \n " ) ;
2001-04-15 21:13:38 +02:00
if ( ! init_audio ( sh_audio ) ) {
2001-08-18 21:51:21 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_CouldntInitAudioCodec ) ;
2001-08-31 00:56:27 +02:00
sh_audio = d_audio - > sh = NULL ;
2001-04-07 23:27:57 +02:00
} else {
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " AUDIO: srate=%d chans=%d bps=%d sfmt=0x%X ratio: %d->%d \n " , sh_audio - > samplerate , sh_audio - > channels , sh_audio - > samplesize ,
2001-05-11 03:22:35 +02:00
sh_audio - > sample_format , sh_audio - > i_bps , sh_audio - > o_bps ) ;
2001-09-13 00:19:36 +02:00
}
2001-04-07 23:27:57 +02:00
}
2001-02-24 21:28:24 +01:00
//================== Init VIDEO (codec & libvo) ==========================
2002-02-08 17:00:14 +01:00
if ( ! sh_video )
goto main ;
2002-03-17 03:28:32 +01:00
current_module = " preinit_libvo " ;
if ( ( i = video_out - > preinit ( vo_subdevice ) ) ! = 0 ) {
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , " error on vo preinit = %u \n " , i ) ;
goto goto_next_file ; // exit_player(MSGTR_Exit_error);
}
2002-03-15 00:28:51 +01:00
sh_video - > video_out = video_out ;
2002-03-17 03:28:32 +01:00
inited_flags | = INITED_VO ;
current_module = " init_video_codec " ;
2001-04-17 20:37:15 +02:00
2002-03-18 02:49:42 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " ========================================================================== \n " ) ;
// Go through the codec.conf and find the best codec...
sh_video - > inited = 0 ;
if ( video_codec ) {
// forced codec by name:
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " Forced video codec: %s \n " , video_codec ) ;
init_video ( sh_video , video_codec , - 1 , - 1 ) ;
} else {
int status ;
// try in stability order: UNTESTED, WORKING, BUGGY, BROKEN
if ( video_family > = 0 ) mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_TryForceVideoFmt , video_family ) ;
for ( status = CODECS_STATUS__MAX ; status > = CODECS_STATUS__MIN ; - - status ) {
if ( video_family > = 0 ) // try first the preferred codec family:
if ( init_video ( sh_video , NULL , video_family , status ) ) break ;
if ( init_video ( sh_video , NULL , - 1 , status ) ) break ;
}
}
if ( ! sh_video - > inited ) {
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_CantFindVideoCodec , sh_video - > format ) ;
mp_msg ( MSGT_CPLAYER , MSGL_HINT , MSGTR_TryUpgradeCodecsConfOrRTFM , get_path ( " codecs.conf " ) ) ;
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " ========================================================================== \n " ) ;
if ( ! sh_audio ) goto goto_next_file ;
sh_video = d_video - > sh = NULL ;
goto main ; // exit_player(MSGTR_Exit_error);
2001-02-24 21:28:24 +01:00
}
2002-03-18 02:49:42 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " %s video codec: [%s] drv:%d prio:%d (%s) \n " ,
video_codec ? mp_gettext ( " Forcing " ) : mp_gettext ( " Detected " ) , sh_video - > codec - > name , sh_video - > codec - > driver , sh_video - > codec - > priority ! = - 1 ? sh_video - > codec - > priority : 0 , sh_video - > codec - > info ) ;
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " ========================================================================== \n " ) ;
2001-08-04 15:52:41 +02:00
if ( auto_quality > 0 ) {
// Auto quality option enabled
output_quality = get_video_quality_max ( sh_video ) ;
if ( auto_quality > output_quality ) auto_quality = output_quality ;
else output_quality = auto_quality ;
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_V , " AutoQ: setting quality to %d \n " , output_quality ) ;
2001-08-04 15:52:41 +02:00
set_video_quality ( sh_video , output_quality ) ;
}
2001-04-14 05:12:06 +02:00
// ========== Init display (sh_video->disp_w*sh_video->disp_h/out_fmt) ============
2001-02-24 21:28:24 +01:00
2001-08-29 19:37:03 +02:00
# ifdef HAVE_NEW_GUI
if ( use_gui )
{
2001-09-25 16:00:19 +02:00
mplResizeToMovieSize ( sh_video - > disp_w , sh_video - > disp_h ) ;
2002-02-23 16:12:55 +01:00
guiIntfStruct . MovieWidth = sh_video - > disp_w ;
guiIntfStruct . MovieHeight = sh_video - > disp_h ;
guiIntfStruct . StreamType = stream - > type ;
2002-03-07 00:54:20 +01:00
guiSetFilename ( guiIntfStruct . Filename , filename ) ;
if ( sh_audio ) guiIntfStruct . AudioType = sh_audio - > channels ;
else guiIntfStruct . AudioType = 0 ;
# ifdef USE_DVDREAD
if ( stream - > type = = STREAMTYPE_DVD )
{
dvd_priv_t * dvdp = stream - > priv ;
guiIntfStruct . DVD . titles = dvdp - > vmg_file - > tt_srpt - > nr_of_srpts ;
guiIntfStruct . DVD . chapters = dvdp - > vmg_file - > tt_srpt - > title [ dvd_title ] . nr_of_ptts ;
guiIntfStruct . DVD . angles = dvdp - > vmg_file - > tt_srpt - > title [ dvd_title ] . nr_of_angles ;
guiIntfStruct . DVD . nr_of_audio_channels = dvdp - > nr_of_channels ;
memcpy ( guiIntfStruct . DVD . audio_streams , dvdp - > audio_streams , sizeof ( dvdp - > audio_streams ) ) ;
guiIntfStruct . DVD . nr_of_subtitles = dvdp - > nr_of_subtitles ;
memcpy ( guiIntfStruct . DVD . subtitles , dvdp - > subtitles , sizeof ( dvdp - > subtitles ) ) ;
guiIntfStruct . DVD . current_title = dvd_title + 1 ;
guiIntfStruct . DVD . current_chapter = dvd_chapter + 1 ;
guiIntfStruct . DVD . current_angle = dvd_angle + 1 ;
guiIntfStruct . Track = dvd_title + 1 ;
}
# endif
2001-08-29 19:37:03 +02:00
}
# endif
2002-03-17 03:28:32 +01:00
current_module = " init_vo_vaa " ;
2002-02-09 01:47:55 +01:00
if ( video_out - > control ( VOCTRL_QUERY_VAA , & vo_vaa ) = = VO_NOTIMPL )
memset ( & vo_vaa , 0 , sizeof ( vo_vaa_t ) ) ;
2002-01-27 19:39:53 +01:00
/*
get_hw_eq
*/
if ( vo_vaa . get_video_eq )
{
vidix_video_eq_t veq ;
if ( vo_vaa . get_video_eq ( & veq ) = = 0 )
{
v_hw_equ_cap = veq . cap ;
2002-01-28 08:29:17 +01:00
if ( veq . cap & VEQ_CAP_BRIGHTNESS ) v_bright = veq . brightness / 10 ;
if ( veq . cap & VEQ_CAP_CONTRAST ) v_cont = veq . contrast / 10 ;
if ( veq . cap & VEQ_CAP_HUE ) v_hue = veq . hue / 10 ;
if ( veq . cap & VEQ_CAP_SATURATION ) v_saturation = veq . saturation / 10 ;
2002-01-27 19:39:53 +01:00
/*
v_red_intensity = veq . red_intensity / 10 ;
v_green_intensity = veq . green_intensity / 10 ;
v_blue_intensity = veq . blue_intensity / 10 ;
*/
}
}
2002-02-11 08:30:05 +01:00
2001-02-24 21:28:24 +01:00
//================== MAIN: ==========================
2002-02-08 17:00:14 +01:00
main :
if ( ! sh_video ) osd_level = 0 ;
2001-05-10 05:39:54 +02:00
2002-03-17 03:28:32 +01:00
fflush ( stdout ) ;
2002-03-17 01:47:15 +01:00
{
2001-07-29 19:42:06 +02:00
//int frame_corr_num=0; //
2001-07-21 03:17:00 +02:00
//float v_frame=0; // Video
2001-02-24 21:28:24 +01:00
float time_frame = 0 ; // Timer
int force_redraw = 0 ;
2001-07-28 22:33:51 +02:00
//float num_frames=0; // number of frames played
2001-07-23 22:02:58 +02:00
int grab_frames = 0 ;
2001-03-25 06:27:39 +02:00
char osd_text_buffer [ 64 ] ;
2001-05-07 02:03:30 +02:00
int drop_frame = 0 ;
int drop_frame_cnt = 0 ;
2001-11-14 01:26:28 +01:00
int too_slow_frame_cnt = 0 ;
int too_fast_frame_cnt = 0 ;
2001-08-04 15:52:41 +02:00
// for auto-quality:
2001-08-10 03:27:02 +02:00
float AV_delay = 0 ; // average of A-V timestamp differences
2001-08-04 15:52:41 +02:00
double cvideo_base_vtime ;
double cvideo_base_vframe ;
double vdecode_time ;
2001-11-14 01:26:28 +01:00
unsigned int lastframeout_ts ;
float time_frame_corr_avg = 0 ;
2001-02-24 21:28:24 +01:00
//================ SETUP AUDIO ==========================
2001-07-21 03:17:00 +02:00
if ( sh_audio ) {
2001-06-27 13:39:17 +02:00
const ao_info_t * info = audio_out - > info ;
2002-03-17 01:47:15 +01:00
current_module = " setup_audio " ;
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " AO: [%s] %iHz %s %s \n " ,
2001-06-27 13:39:17 +02:00
info - > short_name ,
force_srate ? force_srate : sh_audio - > samplerate ,
sh_audio - > channels > 1 ? " Stereo " : " Mono " ,
2001-08-07 01:59:50 +02:00
audio_out_format_name ( sh_audio - > sample_format )
2002-03-17 01:47:15 +01:00
) ;
mp_msg ( MSGT_CPLAYER , MSGL_V , " AO: Description: %s \n AO: Author: %s \n " ,
info - > name , info - > author ) ;
if ( strlen ( info - > comment ) > 0 )
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_V , " AO: Comment: %s \n " , info - > comment ) ;
2002-03-17 01:47:15 +01:00
2001-06-03 21:46:22 +02:00
if ( ! audio_out - > init ( force_srate ? force_srate : sh_audio - > samplerate ,
sh_audio - > channels , sh_audio - > sample_format , 0 ) ) {
2001-08-18 21:51:21 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_CannotInitAO ) ;
2001-08-31 00:56:27 +02:00
sh_audio = d_audio - > sh = NULL ;
2002-02-08 17:00:14 +01:00
if ( sh_video = = NULL )
goto goto_next_file ;
2001-09-05 12:49:04 +02:00
} else {
inited_flags | = INITED_AO ;
2001-05-10 05:39:54 +02:00
}
2001-02-24 21:28:24 +01:00
}
2002-03-17 01:47:15 +01:00
current_module = " av_init " ;
if ( sh_video ) sh_video - > timer = 0 ;
if ( sh_audio ) sh_audio - > timer = - audio_delay ;
2001-02-24 21:28:24 +01:00
2001-07-21 03:17:00 +02:00
if ( ! sh_audio ) {
2001-09-26 23:35:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_NoSound ) ;
2001-08-17 02:40:25 +02:00
if ( verbose ) mp_msg ( MSGT_CPLAYER , MSGL_V , " Freeing %d unused audio chunks \n " , d_audio - > packs ) ;
2001-02-24 21:28:24 +01:00
ds_free_packs ( d_audio ) ; // free buffered chunks
d_audio - > id = - 2 ; // do not read audio chunks
2002-03-17 03:28:32 +01:00
uninit_player ( INITED_AO ) ; // close device
2001-02-24 21:28:24 +01:00
}
2002-03-17 01:47:15 +01:00
if ( ! sh_video ) {
2002-02-08 17:00:14 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " Video: no video!!! \n " ) ;
if ( verbose ) mp_msg ( MSGT_CPLAYER , MSGL_V , " Freeing %d unused video chunks \n " , d_video - > packs ) ;
ds_free_packs ( d_video ) ;
d_video - > id = - 2 ;
2002-03-17 03:28:32 +01:00
uninit_player ( INITED_VO ) ;
2002-03-17 01:47:15 +01:00
}
2001-02-24 21:28:24 +01:00
2001-08-23 15:21:21 +02:00
if ( demuxer - > file_format ! = DEMUXER_TYPE_AVI ) pts_from_bps = 0 ; // it must be 0 for mpeg/asf!
2001-04-14 05:12:06 +02:00
if ( force_fps ) {
2002-02-09 02:29:11 +01:00
vo_fps = sh_video - > fps = force_fps ;
2001-04-14 05:12:06 +02:00
sh_video - > frametime = 1.0f / sh_video - > fps ;
2001-09-26 23:35:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_FPSforced , sh_video - > fps , sh_video - > frametime ) ;
2001-04-14 05:12:06 +02:00
}
2001-02-24 21:28:24 +01:00
2001-08-22 23:35:44 +02:00
//==================== START PLAYING =======================
2001-08-18 21:51:21 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_StartPlaying ) ; fflush ( stdout ) ;
2001-02-24 21:28:24 +01:00
InitTimer ( ) ;
2001-06-13 23:55:24 +02:00
total_time_usage_start = GetTimer ( ) ;
2002-01-01 23:46:07 +01:00
audio_time_usage = 0 ; video_time_usage = 0 ; vout_time_usage = 0 ;
2001-02-24 21:28:24 +01:00
while ( ! eof ) {
2001-10-30 21:36:20 +01:00
// unsigned int aq_total_time=GetTimer();
2001-08-04 15:52:41 +02:00
float aq_sleep_time = 0 ;
2001-02-24 21:28:24 +01:00
2001-06-13 23:57:36 +02:00
if ( play_n_frames > = 0 ) {
- - play_n_frames ;
2002-01-19 18:22:57 +01:00
if ( play_n_frames < 0 ) eof = PT_NEXT_ENTRY ;
2001-06-13 23:57:36 +02:00
}
2001-02-24 21:28:24 +01:00
/*========================== PLAY AUDIO ============================*/
2001-07-21 03:17:00 +02:00
while ( sh_audio ) {
2001-05-10 05:39:54 +02:00
unsigned int t ;
2002-02-24 12:23:48 +01:00
double tt ;
2001-11-05 03:53:53 +01:00
int playsize ;
2001-11-24 06:29:56 +01:00
ao_data . pts = sh_audio - > timer * 90000.0 ;
2001-11-05 03:53:53 +01:00
playsize = audio_out - > get_space ( ) ;
2001-05-10 05:39:54 +02:00
2002-02-23 22:22:55 +01:00
if ( ! playsize ) {
if ( sh_video )
break ; // buffer is full, do not block here!!!
usec_sleep ( 10000 ) ; // Wait a tick before retry
continue ;
}
2001-05-10 05:39:54 +02:00
if ( playsize > MAX_OUTBURST ) playsize = MAX_OUTBURST ; // we shouldn't exceed it!
//if(playsize>outburst) playsize=outburst;
2001-04-06 03:18:59 +02:00
// Update buffer if needed
2001-02-24 21:28:24 +01:00
current_module = " decode_audio " ; // Enter AUDIO decoder module
2001-08-22 23:35:44 +02:00
t = GetTimer ( ) ;
2001-05-10 05:39:54 +02:00
while ( sh_audio - > a_buffer_len < playsize & & ! d_audio - > eof ) {
int ret = decode_audio ( sh_audio , & sh_audio - > a_buffer [ sh_audio - > a_buffer_len ] ,
playsize - sh_audio - > a_buffer_len , sh_audio - > a_buffer_size - sh_audio - > a_buffer_len ) ;
2002-02-08 17:00:14 +01:00
if ( ret > 0 ) sh_audio - > a_buffer_len + = ret ;
else {
if ( ! sh_video )
eof = PT_NEXT_ENTRY ;
break ;
}
2001-02-24 21:28:24 +01:00
}
current_module = NULL ; // Leave AUDIO decoder module
2002-02-24 12:23:48 +01:00
t = GetTimer ( ) - t ;
tt = t * 0.000001f ;
audio_time_usage + = tt ;
2001-05-10 05:39:54 +02:00
if ( playsize > sh_audio - > a_buffer_len ) playsize = sh_audio - > a_buffer_len ;
2001-06-03 01:30:26 +02:00
playsize = audio_out - > play ( sh_audio - > a_buffer , playsize , 0 ) ;
2001-02-24 21:28:24 +01:00
2001-06-03 01:30:26 +02:00
if ( playsize > 0 ) {
2001-05-10 05:39:54 +02:00
sh_audio - > a_buffer_len - = playsize ;
memcpy ( sh_audio - > a_buffer , & sh_audio - > a_buffer [ playsize ] , sh_audio - > a_buffer_len ) ;
2001-07-21 03:17:00 +02:00
sh_audio - > timer + = playsize / ( float ) ( sh_audio - > o_bps ) ;
2001-02-24 21:28:24 +01:00
}
break ;
2001-07-21 03:17:00 +02:00
} // if(sh_audio)
2001-02-24 21:28:24 +01:00
/*========================== UPDATE TIMERS ============================*/
2001-05-10 05:39:54 +02:00
#if 0
2001-02-24 21:28:24 +01:00
if ( alsa ) {
// Use system timer for sync, not audio card/driver
time_frame - = GetRelativeTime ( ) ;
if ( time_frame < - 0.1 | | time_frame > 0.1 ) {
time_frame = 0 ;
} else {
2001-04-14 05:12:06 +02:00
while ( time_frame > 0.022 ) {
2001-06-05 20:40:44 +02:00
usec_sleep ( time_frame - 0.022 ) ;
2001-04-14 05:12:06 +02:00
time_frame - = GetRelativeTime ( ) ;
}
2001-03-13 03:22:47 +01:00
while ( time_frame > 0.007 ) {
2001-06-05 20:40:44 +02:00
usec_sleep ( 1000 ) ; // sleeps 1 clock tick (10ms)!
2001-03-13 03:22:47 +01:00
time_frame - = GetRelativeTime ( ) ;
}
2001-04-14 05:12:06 +02:00
}
2001-02-24 21:28:24 +01:00
}
2001-05-10 05:39:54 +02:00
# endif
2001-02-24 21:28:24 +01:00
2002-02-08 17:00:14 +01:00
if ( ! sh_video ) {
if ( ! quiet ) mp_msg ( MSGT_AVSYNC , MSGL_STATUS , " A:%6.1f %4.1f%% %d%% \r "
, sh_audio - > timer - audio_out - > get_delay ( )
, ( sh_audio - > timer > 0.5 ) ? 100.0 * audio_time_usage / ( double ) sh_audio - > timer : 0
, cache_fill_status
) ;
goto read_input ;
}
2001-02-24 21:28:24 +01:00
/*========================== PLAY VIDEO ============================*/
2002-02-08 17:00:14 +01:00
vo_pts = sh_video - > timer * 90000.0 ;
vo_fps = sh_video - > fps ;
2001-08-04 15:52:41 +02:00
cvideo_base_vframe = sh_video - > timer ;
cvideo_base_vtime = video_time_usage ;
2001-02-24 21:28:24 +01:00
if ( 1 )
2001-05-10 05:39:54 +02:00
while ( 1 ) {
2001-04-16 01:22:01 +02:00
2001-10-30 21:36:20 +01:00
float frame_time = 0 ;
2001-07-08 02:21:20 +02:00
int blit_frame = 0 ;
2001-05-07 02:03:30 +02:00
2001-10-30 21:36:20 +01:00
//-------------------- Decode a frame: -----------------------
vdecode_time = video_time_usage ;
{ unsigned char * start = NULL ;
int in_size ;
// get it!
current_module = " video_read_frame " ;
in_size = video_read_frame ( sh_video , & frame_time , & start , force_fps ) ;
if ( in_size < 0 ) { eof = 1 ; break ; }
if ( in_size > max_framesize ) max_framesize = in_size ; // stats
// decode:
current_module = " decode_video " ;
// printf("Decode! %p %d \n",start,in_size);
blit_frame = decode_video ( video_out , sh_video , start , in_size , drop_frame ) ;
2001-07-08 02:21:20 +02:00
}
2001-10-30 21:36:20 +01:00
vdecode_time = video_time_usage - vdecode_time ;
//------------------------ frame decoded. --------------------
2001-08-13 13:08:18 +02:00
//------------------------ add OSD to frame contents ---------
2001-08-30 13:54:27 +02:00
current_module = " draw_osd " ;
2001-08-13 13:08:18 +02:00
video_out - > draw_osd ( ) ;
2001-02-24 21:28:24 +01:00
2001-08-30 13:54:27 +02:00
current_module = " av_sync " ;
2001-07-21 03:17:00 +02:00
sh_video - > timer + = frame_time ;
2001-05-10 05:39:54 +02:00
time_frame + = frame_time ; // for nosound
2001-08-17 02:40:25 +02:00
mp_dbg ( MSGT_AVSYNC , MSGL_DBG2 , " *** ftime=%5.3f *** \n " , frame_time ) ;
2001-05-13 05:00:57 +02:00
2001-05-14 11:35:51 +02:00
if ( drop_frame ) {
2001-05-13 05:00:57 +02:00
2001-07-21 03:17:00 +02:00
if ( sh_audio & & ! d_audio - > eof ) {
2001-11-24 06:29:56 +01:00
float delay = audio_out - > get_delay ( ) ;
mp_dbg ( MSGT_AVSYNC , MSGL_DBG2 , " delay=%f \n " , delay ) ;
2001-07-21 03:17:00 +02:00
time_frame = sh_video - > timer ;
2001-11-24 06:29:56 +01:00
time_frame - = sh_audio - > timer - delay ;
2001-06-05 20:40:44 +02:00
if ( time_frame > - 2 * frame_time ) {
drop_frame = 0 ; // stop dropping frames
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_AVSYNC , MSGL_DBG2 , " \n stop frame drop %.2f \n " , time_frame ) ;
2001-06-05 20:40:44 +02:00
} else {
+ + drop_frame_cnt ;
if ( verbose > 0 & & drop_frame_cnt % 10 = = 0 )
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_AVSYNC , MSGL_DBG2 , " \n still dropping, %.2f \n " , time_frame ) ;
2001-06-05 20:40:44 +02:00
}
2001-05-14 11:35:51 +02:00
}
2001-08-27 02:55:25 +02:00
# ifdef HAVE_NEW_GUI
2002-02-21 23:48:47 +01:00
if ( use_gui ) guiEventHandling ( ) ;
2001-08-27 02:55:25 +02:00
# endif
2001-08-28 17:55:02 +02:00
video_out - > check_events ( ) ; // check events AST
2001-05-14 11:35:51 +02:00
} else {
2001-05-13 05:00:57 +02:00
// It's time to sleep...
current_module = " sleep " ;
time_frame - = GetRelativeTime ( ) ; // reset timer
2001-05-10 05:39:54 +02:00
2001-07-21 03:17:00 +02:00
if ( sh_audio & & ! d_audio - > eof ) {
2001-11-24 06:29:56 +01:00
float delay = audio_out - > get_delay ( ) ;
mp_dbg ( MSGT_AVSYNC , MSGL_DBG2 , " delay=%f \n " , delay ) ;
2001-11-14 01:26:28 +01:00
if ( ! dapsync ) {
/* Arpi's AV-sync */
2001-07-21 03:17:00 +02:00
time_frame = sh_video - > timer ;
2001-11-24 06:29:56 +01:00
time_frame - = sh_audio - > timer - delay ;
2001-05-14 11:35:51 +02:00
// we are out of time... drop next frame!
2001-06-02 03:00:22 +02:00
if ( time_frame < - 2 * frame_time ) {
2001-08-10 03:27:02 +02:00
static int drop_message = 0 ;
2001-05-14 11:35:51 +02:00
drop_frame = frame_dropping ; // tricky!
+ + drop_frame_cnt ;
2001-08-10 03:27:02 +02:00
if ( drop_frame_cnt > 50 & & AV_delay > 0.5 & & ! drop_message ) {
drop_message = 1 ;
2001-08-18 21:51:21 +02:00
mp_msg ( MSGT_AVSYNC , MSGL_WARN , MSGTR_SystemTooSlow ) ;
2001-08-10 03:27:02 +02:00
}
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_AVSYNC , MSGL_DBG2 , " \n frame drop %d, %.2f \n " , drop_frame , time_frame ) ;
2001-05-14 11:35:51 +02:00
}
2001-11-14 01:26:28 +01:00
} else {
/* DaP's AV-sync */
float SH_AV_delay ;
/* SH_AV_delay = sh_video->timer - (sh_audio->timer - (float)((float)delay + sh_audio->a_buffer_len) / (float)sh_audio->o_bps); */
SH_AV_delay = sh_video - > timer - ( sh_audio - > timer - ( float ) ( ( float ) delay ) / ( float ) sh_audio - > o_bps ) ;
// printf ("audio slp req: %.3f TF: %.3f delta: %.3f (v: %.3f a: %.3f) | ", i, time_frame,
// i - time_frame, sh_video->timer, sh_audio->timer - (float)((float)delay / (float)sh_audio->o_bps));
if ( SH_AV_delay < - 2 * frame_time ) {
static int drop_message = 0 ;
drop_frame = frame_dropping ; // tricky!
+ + drop_frame_cnt ;
if ( drop_frame_cnt > 50 & & AV_delay > 0.5 & & ! drop_message ) {
drop_message = 1 ;
mp_msg ( MSGT_AVSYNC , MSGL_WARN , MSGTR_SystemTooSlow ) ;
}
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_AVSYNC , MSGL_INFO , " A-V SYNC: FRAMEDROP (SH_AV_delay=%.3f)! \n " , SH_AV_delay ) ;
2001-11-14 01:26:28 +01:00
mp_msg ( MSGT_AVSYNC , MSGL_DBG2 , " \n frame drop %d, %.2f \n " , drop_frame , time_frame ) ;
/* go into unlimited-TF cycle */
time_frame = SH_AV_delay ;
} else {
# define SL_CORR_AVG_LEN 125
/* don't adjust under framedropping */
time_frame_corr_avg = ( time_frame_corr_avg * ( SL_CORR_AVG_LEN - 1 ) +
( SH_AV_delay - time_frame ) ) / SL_CORR_AVG_LEN ;
# define UNEXP_CORR_MAX 0.1 /* limit of unexpected correction between two frames (percentage) */
# define UNEXP_CORR_WARN 1.0 /* warn limit of A-V lag (percentage) */
time_frame + = time_frame_corr_avg ;
// printf ("{%.3f - %.3f}\n", i - time_frame, frame_time + frame_time_corr_avg);
if ( SH_AV_delay - time_frame < ( frame_time + time_frame_corr_avg ) * UNEXP_CORR_MAX & &
SH_AV_delay - time_frame > ( frame_time + time_frame_corr_avg ) * - UNEXP_CORR_MAX )
time_frame = SH_AV_delay ;
else {
if ( SH_AV_delay - time_frame > ( frame_time + time_frame_corr_avg ) * UNEXP_CORR_WARN | |
SH_AV_delay - time_frame < ( frame_time + time_frame_corr_avg ) * - UNEXP_CORR_WARN )
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_AVSYNC , MSGL_WARN , " WARNING: A-V SYNC LAG TOO LARGE: %.3f {%.3f - %.3f} (too little UNEXP_CORR_MAX?) \n " ,
2001-11-14 01:26:28 +01:00
SH_AV_delay - time_frame , SH_AV_delay , time_frame ) ;
time_frame + = ( frame_time + time_frame_corr_avg ) * ( ( SH_AV_delay > time_frame ) ?
UNEXP_CORR_MAX : - UNEXP_CORR_MAX ) ;
}
} /* /start dropframe */
}
2001-05-13 05:00:57 +02:00
} else {
2001-11-14 01:26:28 +01:00
// NOSOUND:
2001-06-13 23:55:24 +02:00
if ( ( time_frame < - 3 * frame_time | | time_frame > 3 * frame_time ) | | benchmark )
time_frame = 0 ;
2001-05-13 05:00:57 +02:00
}
2001-05-14 11:35:51 +02:00
2001-07-21 03:17:00 +02:00
// if(verbose>1)printf("sleep: %5.3f a:%6.3f v:%6.3f \n",time_frame,sh_audio->timer,sh_video->timer);
2001-08-04 15:52:41 +02:00
aq_sleep_time + = time_frame ;
2001-08-27 02:55:25 +02:00
# ifdef HAVE_NEW_GUI
2002-03-07 00:54:20 +01:00
if ( use_gui ) guiEventHandling ( ) ;
2001-08-27 02:55:25 +02:00
# endif
2001-11-05 03:53:53 +01:00
if ( ! ( vo_flags & 256 ) ) { // flag 256 means: libvo driver does its timing (dvb card)
2001-11-14 01:26:28 +01:00
2001-11-20 08:53:20 +01:00
# ifdef HAVE_RTC
2001-11-14 01:26:28 +01:00
if ( rtc_fd > = 0 ) {
// -------- RTC -----------
while ( time_frame > 0.000 ) {
unsigned long long rtc_ts ;
if ( read ( rtc_fd , & rtc_ts , sizeof ( rtc_ts ) ) < = 0 )
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , " Linux RTC read error: %s \n " , strerror ( errno ) ) ;
2001-11-14 01:26:28 +01:00
time_frame - = GetRelativeTime ( ) ;
}
} else
# endif
{
// -------- USLEEP + SOFTSLEEP -----------
float min = softsleep ? 0.021 : 0.005 ;
while ( time_frame > min ) {
2001-05-10 05:39:54 +02:00
if ( time_frame < = 0.020 )
2001-08-04 15:52:41 +02:00
usec_sleep ( 0 ) ; // sleeps 1 clock tick (10ms)!
2001-05-10 05:39:54 +02:00
else
2001-11-07 03:15:04 +01:00
usec_sleep ( 1000000 * ( time_frame - 0.020 ) ) ;
2001-05-10 05:39:54 +02:00
time_frame - = GetRelativeTime ( ) ;
2001-11-14 01:26:28 +01:00
}
if ( softsleep ) {
2002-03-15 23:25:57 +01:00
if ( time_frame < 0 ) mp_msg ( MSGT_AVSYNC , MSGL_WARN , " Warning! Softsleep underflow! \n " ) ;
2001-11-14 01:26:28 +01:00
while ( time_frame > 0 ) time_frame - = GetRelativeTime ( ) ; // burn the CPU
}
}
2001-11-05 03:53:53 +01:00
}
2001-03-16 19:08:58 +01:00
2001-05-07 02:03:30 +02:00
current_module = " flip_page " ;
2001-08-13 13:08:18 +02:00
video_out - > check_events ( ) ;
2001-09-25 22:28:40 +02:00
if ( blit_frame ) {
unsigned int t2 = GetTimer ( ) ;
2002-02-24 16:54:13 +01:00
double tt ;
2001-11-14 01:26:28 +01:00
float j ;
# define FRAME_LAG_WARN 0.2
j = ( ( float ) t2 - lastframeout_ts ) / 1000000 ;
lastframeout_ts = GetTimer ( ) ;
if ( j < frame_time + frame_time * - FRAME_LAG_WARN )
too_fast_frame_cnt + + ;
/* printf ("PANIC: too fast frame (%.3f)!\n", j); */
else if ( j > frame_time + frame_time * FRAME_LAG_WARN )
too_slow_frame_cnt + + ;
/* printf ("PANIC: too slow frame (%.3f)!\n", j); */
2001-09-25 22:28:40 +02:00
video_out - > flip_page ( ) ;
2002-02-24 16:54:13 +01:00
t2 = GetTimer ( ) - t2 ;
tt = t2 * 0.000001f ;
vout_time_usage + = tt ;
2001-09-25 22:28:40 +02:00
}
2001-06-05 20:40:44 +02:00
// usec_sleep(50000); // test only!
2001-05-13 05:00:57 +02:00
2001-05-07 02:03:30 +02:00
}
2001-05-13 05:00:57 +02:00
current_module = NULL ;
2001-05-07 02:03:30 +02:00
2001-02-24 21:28:24 +01:00
if ( eof ) break ;
2001-03-27 02:39:24 +02:00
if ( force_redraw ) {
- - force_redraw ;
2001-04-22 18:29:25 +02:00
if ( ! force_redraw ) osd_function = OSD_PLAY ;
2001-05-10 05:39:54 +02:00
continue ;
2001-03-27 02:39:24 +02:00
}
2001-02-24 21:28:24 +01:00
2001-07-21 03:17:00 +02:00
// printf("A:%6.1f V:%6.1f A-V:%7.3f frame=%5.2f \r",d_audio->pts,d_video->pts,d_audio->pts-d_video->pts,sh_audio->timer);
2001-02-24 21:28:24 +01:00
// fflush(stdout);
# if 1
/*================ A-V TIMESTAMP CORRECTION: =========================*/
2001-07-21 03:17:00 +02:00
if ( sh_audio ) {
2001-05-13 05:00:57 +02:00
float a_pts = 0 ;
float v_pts = 0 ;
2001-05-10 05:39:54 +02:00
// unplayed bytes in our and soundcard/dma buffer:
2001-11-24 06:29:56 +01:00
float delay = audio_out - > get_delay ( ) + ( float ) sh_audio - > a_buffer_len / ( float ) sh_audio - > o_bps ;
2001-05-10 05:39:54 +02:00
2001-05-13 05:00:57 +02:00
if ( pts_from_bps ) {
2001-08-12 22:52:35 +02:00
# if 1
unsigned int samples = ( sh_audio - > audio . dwSampleSize ) ?
( ( ds_tell ( d_audio ) - sh_audio - > a_in_buffer_len ) / sh_audio - > audio . dwSampleSize ) :
( d_audio - > pack_no ) ; // <- used for VBR audio
2001-12-04 01:26:45 +01:00
samples + = sh_audio - > audio . dwStart ; // offset
2001-08-12 22:52:35 +02:00
a_pts = samples * ( float ) sh_audio - > audio . dwScale / ( float ) sh_audio - > audio . dwRate ;
# else
2001-08-11 02:53:45 +02:00
if ( sh_audio - > audio . dwSampleSize )
a_pts = ( ds_tell ( d_audio ) - sh_audio - > a_in_buffer_len ) / ( float ) sh_audio - > wf - > nAvgBytesPerSec ;
else // VBR:
a_pts = d_audio - > pack_no * ( float ) sh_audio - > audio . dwScale / ( float ) sh_audio - > audio . dwRate ;
2001-08-12 22:52:35 +02:00
# endif
// v_pts=d_video->pack_no*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate;
// printf("V_PTS: PTS: %8.3f BPS: %8.3f \n",d_video->pts,v_pts);
delay_corrected = 1 ;
2001-05-13 05:00:57 +02:00
} else {
// PTS = (last timestamp) + (bytes after last timestamp)/(bytes per sec)
2001-05-10 05:39:54 +02:00
a_pts = d_audio - > pts ;
2001-08-12 22:52:35 +02:00
if ( ! delay_corrected ) if ( a_pts ) delay_corrected = 1 ;
2001-08-10 03:27:02 +02:00
//printf("*** %5.3f ***\n",a_pts);
2001-05-10 05:39:54 +02:00
a_pts + = ( ds_tell_pts ( d_audio ) - sh_audio - > a_in_buffer_len ) / ( float ) sh_audio - > i_bps ;
2001-08-07 01:59:50 +02:00
// v_pts=d_video->pts-frame_time;
2001-08-12 22:52:35 +02:00
// v_pts=d_video->pts;
2001-02-24 21:28:24 +01:00
}
2001-08-12 22:52:35 +02:00
v_pts = d_video - > pts ;
2001-05-13 05:00:57 +02:00
2001-08-17 02:40:25 +02:00
mp_dbg ( MSGT_AVSYNC , MSGL_DBG2 , " ### A:%8.3f (%8.3f) V:%8.3f A-V:%7.4f \n " , a_pts , a_pts - audio_delay - delay , v_pts , ( a_pts - delay - audio_delay ) - v_pts ) ;
2001-05-13 05:00:57 +02:00
2001-04-14 05:12:06 +02:00
if ( delay_corrected ) {
2001-08-10 03:27:02 +02:00
float x ;
AV_delay = ( a_pts - delay - audio_delay ) - v_pts ;
x = AV_delay * 0.1f ;
2001-02-24 21:28:24 +01:00
if ( x < - max_pts_correction ) x = - max_pts_correction ; else
if ( x > max_pts_correction ) x = max_pts_correction ;
2001-05-13 05:00:57 +02:00
if ( default_max_pts_correction > = 0 )
max_pts_correction = default_max_pts_correction ;
else
max_pts_correction = sh_video - > frametime * 0.10 ; // +-10% of time
2001-07-21 03:17:00 +02:00
sh_audio - > timer + = x ; c_total + = x ;
2001-10-22 01:05:05 +02:00
if ( ! quiet ) mp_msg ( MSGT_AVSYNC , MSGL_STATUS , " A:%6.1f V:%6.1f A-V:%7.3f ct:%7.3f %3d/%3d %2d%% %2d%% %4.1f%% %d %d %d%% \r " ,
2001-08-12 22:52:35 +02:00
a_pts - audio_delay - delay , v_pts , AV_delay , c_total ,
2001-08-16 03:03:51 +02:00
( int ) sh_video - > num_frames , ( int ) sh_video - > num_frames_decoded ,
2001-08-12 22:52:35 +02:00
( sh_video - > timer > 0.5 ) ? ( int ) ( 100.0 * video_time_usage / ( double ) sh_video - > timer ) : 0 ,
( sh_video - > timer > 0.5 ) ? ( int ) ( 100.0 * vout_time_usage / ( double ) sh_video - > timer ) : 0 ,
( sh_video - > timer > 0.5 ) ? ( 100.0 * audio_time_usage / ( double ) sh_video - > timer ) : 0
, drop_frame_cnt
, output_quality
2001-10-22 01:05:05 +02:00
, cache_fill_status
2001-02-24 21:28:24 +01:00
) ;
fflush ( stdout ) ;
}
2001-05-13 05:00:57 +02:00
2001-02-24 21:28:24 +01:00
} else {
// No audio:
2001-07-29 19:42:06 +02:00
2001-08-06 02:30:29 +02:00
if ( ! quiet )
2001-10-22 01:05:05 +02:00
mp_msg ( MSGT_AVSYNC , MSGL_STATUS , " V:%6.1f %3d %2d%% %2d%% %4.1f%% %d %d %d%% \r " , d_video - > pts ,
2001-07-28 22:33:51 +02:00
( int ) sh_video - > num_frames ,
2001-07-21 03:17:00 +02:00
( sh_video - > timer > 0.5 ) ? ( int ) ( 100.0 * video_time_usage / ( double ) sh_video - > timer ) : 0 ,
( sh_video - > timer > 0.5 ) ? ( int ) ( 100.0 * vout_time_usage / ( double ) sh_video - > timer ) : 0 ,
( sh_video - > timer > 0.5 ) ? ( 100.0 * audio_time_usage / ( double ) sh_video - > timer ) : 0
2001-10-22 01:05:05 +02:00
, drop_frame_cnt
, output_quality
, cache_fill_status
2001-04-15 21:13:38 +02:00
) ;
2001-02-24 21:28:24 +01:00
fflush ( stdout ) ;
2001-07-29 19:42:06 +02:00
2001-02-24 21:28:24 +01:00
}
# endif
2001-08-04 15:52:41 +02:00
/*Output quality adjustments:*/
if ( auto_quality > 0 ) {
#if 0
/*If we took a long time decoding this frame, downgrade the quality.*/
if ( output_quality > 0 & &
( video_time_usage - cvideo_base_vtime ) * sh_video - > timer > =
( 0.95 * sh_video - > timer - ( vout_time_usage + audio_time_usage ) ) *
( sh_video - > timer - cvideo_base_vframe - frame_correction ) ) {
output_quality > > = 1 ;
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_AUTOQ , MSGL_DBG2 , " Downgrading quality to %i. \n " , output_quality ) ;
2001-08-04 15:52:41 +02:00
set_video_quality ( sh_video , output_quality ) ;
} else
/*If we had plenty of extra time, upgrade the quality.*/
if ( output_quality < auto_quality & &
vdecode_time < 0.5 * frame_time & &
( video_time_usage - cvideo_base_vtime ) * sh_video - > timer <
( 0.67 * sh_video - > timer - ( vout_time_usage + audio_time_usage ) ) *
( sh_video - > timer - cvideo_base_vframe - frame_correction ) ) {
output_quality + + ;
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_AUTOQ , MSGL_DBG2 , " Upgrading quality to %i. \n " , output_quality ) ;
2001-08-04 15:52:41 +02:00
set_video_quality ( sh_video , output_quality ) ;
}
# else
2001-08-12 17:46:09 +02:00
// float total=0.000001f * (GetTimer()-aq_total_time);
2001-08-04 15:52:41 +02:00
// if(output_quality<auto_quality && aq_sleep_time>0.05f*total)
if ( output_quality < auto_quality & & aq_sleep_time > 0 )
+ + output_quality ;
else
// if(output_quality>0 && aq_sleep_time<-0.05f*total)
if ( output_quality > 1 & & aq_sleep_time < 0 )
- - output_quality ;
else
if ( output_quality > 0 & & aq_sleep_time < - 0.050f ) // 50ms
output_quality = 0 ;
// printf("total: %8.6f sleep: %8.6f q: %d\n",(0.000001f*aq_total_time),aq_sleep_time,output_quality);
set_video_quality ( sh_video , output_quality ) ;
# endif
}
2002-02-08 17:00:14 +01:00
read_input :
2001-07-30 04:00:54 +02:00
# ifdef USE_OSD
2001-03-27 02:39:24 +02:00
if ( osd_visible ) {
2001-08-13 15:12:49 +02:00
if ( ! - - osd_visible ) { vo_osd_progbar_type = - 1 ; // disable
if ( osd_function ! = OSD_PAUSE )
osd_function = OSD_PLAY ;
}
2001-03-27 02:39:24 +02:00
}
2001-07-30 04:00:54 +02:00
# endif
2001-04-12 02:40:42 +02:00
if ( osd_function = = OSD_PAUSE ) {
2002-01-30 13:46:03 +01:00
# ifdef HAVE_NEW_INPUT
mp_cmd_t * cmd ;
2002-01-15 00:38:49 +01:00
# endif
2002-02-08 17:00:14 +01:00
if ( ! quiet ) {
mp_msg ( MSGT_CPLAYER , MSGL_STATUS , " \n ------ PAUSED ------- \r " ) ;
fflush ( stdout ) ;
}
2001-08-31 01:11:06 +02:00
# ifdef HAVE_NEW_GUI
2002-03-07 12:57:33 +01:00
if ( use_gui ) guiGetEvent ( guiCEvent , ( char * ) guiSetPause ) ;
2001-08-31 01:11:06 +02:00
# endif
2002-02-18 18:34:20 +01:00
if ( video_out & & sh_video )
video_out - > control ( VOCTRL_PAUSE , NULL ) ;
2001-07-21 03:17:00 +02:00
if ( audio_out & & sh_audio )
2001-06-18 16:19:13 +02:00
audio_out - > pause ( ) ; // pause audio, keep data if possible
2001-12-04 22:04:28 +01:00
2002-01-30 13:46:03 +01:00
# ifdef HAVE_NEW_INPUT
while ( ( cmd = mp_input_get_cmd ( 20 , 1 ) ) = = NULL ) {
# else /* HAVE_NEW_INPUT */
2001-12-04 22:04:28 +01:00
if ( slave_mode ) {
fd_set set ;
struct timeval timeout ;
while ( 1 ) {
usec_sleep ( 1000 ) ;
FD_ZERO ( & set ) ;
FD_SET ( STDIN_FILENO , & set ) ;
timeout . tv_sec = 0 ;
timeout . tv_usec = 1000 ;
if ( 1 = = select ( FD_SETSIZE , & set , NULL , NULL , & timeout ) ) {
break ;
}
}
} else {
while (
2001-04-12 02:40:42 +02:00
# ifdef HAVE_LIRC
2001-05-08 14:17:03 +02:00
lirc_mp_getinput ( ) < = 0 & &
# endif
2001-08-09 03:17:24 +02:00
( use_stdin | | getch2 ( 20 ) < = 0 ) & & mplayer_get_key ( ) < = 0 ) {
2002-02-24 22:20:20 +01:00
# endif /* HAVE_NEW_INPUT */
2002-02-08 17:00:14 +01:00
if ( sh_video & & video_out ) video_out - > check_events ( ) ;
2001-08-27 02:55:25 +02:00
# ifdef HAVE_NEW_GUI
if ( use_gui ) {
2002-02-21 23:48:47 +01:00
guiEventHandling ( ) ;
2002-03-07 00:54:20 +01:00
if ( guiIntfStruct . Playing ! = 2 | | ( rel_seek_secs | | abs_seek_pos ) ) break ;
2001-08-27 02:55:25 +02:00
}
2001-07-30 04:00:54 +02:00
# endif
2002-03-07 00:54:20 +01:00
usleep ( 20000 ) ;
2002-01-30 13:46:03 +01:00
# ifdef HAVE_NEW_INPUT
}
2002-03-11 10:19:15 +01:00
mp_cmd_free ( cmd ) ;
2002-01-30 13:46:03 +01:00
# else
2001-08-09 03:17:24 +02:00
if ( use_stdin ) usec_sleep ( 1000 ) ; // do not eat the CPU
2001-05-08 14:17:03 +02:00
}
2001-12-04 22:04:28 +01:00
}
2002-01-30 13:46:03 +01:00
# endif /* HAVE_NEW_INPUT */
2001-05-08 14:17:03 +02:00
osd_function = OSD_PLAY ;
2001-07-21 03:17:00 +02:00
if ( audio_out & & sh_audio )
2001-06-18 16:19:13 +02:00
audio_out - > resume ( ) ; // resume audio
2002-02-18 18:34:20 +01:00
if ( video_out & & sh_video )
video_out - > control ( VOCTRL_RESUME , NULL ) ; // resume video
2001-11-14 01:26:28 +01:00
( void ) GetRelativeTime ( ) ; // keep TF around FT in next cycle
2001-08-31 01:11:06 +02:00
# ifdef HAVE_NEW_GUI
2002-03-07 12:57:33 +01:00
if ( use_gui ) guiGetEvent ( guiCEvent , ( char * ) guiSetPlay ) ;
2001-08-31 01:11:06 +02:00
# endif
2001-04-12 02:40:42 +02:00
}
2001-05-10 05:39:54 +02:00
if ( ! force_redraw ) break ;
2001-07-21 03:17:00 +02:00
} // while(sh_video->timer<sh_audio->timer || force_redraw)
2001-03-25 06:27:39 +02:00
2001-10-23 22:15:00 +02:00
// skip some seconds... added by fly
if ( step_sec > 0 ) {
osd_function = OSD_FFW ;
rel_seek_secs + = step_sec ;
}
2001-03-25 06:27:39 +02:00
2001-02-24 21:28:24 +01:00
//================= Keyboard events, SEEKing ====================
2002-01-30 13:46:03 +01:00
# ifndef HAVE_NEW_INPUT
2001-12-04 22:04:28 +01:00
/* slave mode */
if ( slave_mode ) {
char buffer [ 1024 ] ;
fd_set set ;
struct timeval timeout ;
int arg ;
FD_ZERO ( & set ) ;
FD_SET ( STDIN_FILENO , & set ) ;
timeout . tv_sec = 0 ;
timeout . tv_usec = 1000 ;
if ( 1 = = select ( FD_SETSIZE , & set , NULL , NULL , & timeout ) ) {
fgets ( buffer , 1024 , stdin ) ;
if ( ! strcmp ( " play \n " , buffer ) ) {
osd_function = OSD_PLAY ;
} else if ( ! strcmp ( " stop \n " , buffer ) ) {
osd_function = OSD_PAUSE ;
} else if ( ! strncmp ( " seek " , buffer , 5 ) ) {
sscanf ( buffer + 5 , " %d " , & arg ) ;
rel_seek_secs = arg - d_video - > pts ;
} else if ( ! strncmp ( " skip " , buffer , 5 ) ) {
sscanf ( buffer + 5 , " %d " , & arg ) ;
rel_seek_secs = arg ;
} else if ( ! strcmp ( " quit \n " , buffer ) ) {
exit_player ( MSGTR_Exit_quit ) ;
}
} else {
osd_function = OSD_PLAY ;
}
} else
/* interactive mode */
2001-05-08 14:17:03 +02:00
{ int c ;
2001-02-24 21:28:24 +01:00
while (
# ifdef HAVE_LIRC
( c = lirc_mp_getinput ( ) ) > 0 | |
# endif
2001-08-09 03:17:24 +02:00
( ! use_stdin & & ( c = getch2 ( 0 ) ) > 0 ) | | ( c = mplayer_get_key ( ) ) > 0 ) switch ( c ) {
2001-02-24 21:28:24 +01:00
// seek 10 sec
case KEY_RIGHT :
2001-03-27 02:39:24 +02:00
osd_function = OSD_FFW ;
2001-02-24 21:28:24 +01:00
rel_seek_secs + = 10 ; break ;
case KEY_LEFT :
2001-03-27 02:39:24 +02:00
osd_function = OSD_REW ;
2001-02-24 21:28:24 +01:00
rel_seek_secs - = 10 ; break ;
// seek 1 min
case KEY_UP :
2001-03-27 02:39:24 +02:00
osd_function = OSD_FFW ;
2001-02-24 21:28:24 +01:00
rel_seek_secs + = 60 ; break ;
case KEY_DOWN :
2001-03-27 02:39:24 +02:00
osd_function = OSD_REW ;
2001-02-24 21:28:24 +01:00
rel_seek_secs - = 60 ; break ;
2001-04-27 00:10:25 +02:00
// seek 10 min
case KEY_PAGE_UP :
rel_seek_secs + = 600 ; break ;
case KEY_PAGE_DOWN :
rel_seek_secs - = 600 ; break ;
2001-02-24 21:28:24 +01:00
// delay correction:
case ' + ' :
2001-05-10 05:39:54 +02:00
audio_delay + = 0.1 ; // increase audio buffer delay
2001-12-27 01:59:40 +01:00
osd_show_av_delay = 9 ; // show the A-V delay in OSD
2001-07-21 03:17:00 +02:00
if ( sh_audio ) sh_audio - > timer - = 0.1 ;
2001-02-24 21:28:24 +01:00
break ;
case ' - ' :
2001-05-10 05:39:54 +02:00
audio_delay - = 0.1 ; // decrease audio buffer delay
2001-12-27 01:59:40 +01:00
osd_show_av_delay = 9 ; // show the A-V delay in OSD
2001-07-21 03:17:00 +02:00
if ( sh_audio ) sh_audio - > timer + = 0.1 ;
2001-02-24 21:28:24 +01:00
break ;
// quit
case KEY_ESC : // ESC
2002-01-15 00:38:49 +01:00
case ' q ' :
exit_player ( MSGTR_Exit_quit ) ;
2001-08-22 23:35:44 +02:00
case KEY_ENTER : // ESC
2002-01-15 00:38:49 +01:00
eof = 1 ; // force jump to next file : quit if no next file
2001-11-03 03:55:03 +01:00
break ;
2001-03-04 22:01:54 +01:00
case ' g ' : grab_frames = 2 ; break ;
2001-02-24 21:28:24 +01:00
// pause
case ' p ' :
case ' ' :
2001-03-27 02:39:24 +02:00
osd_function = OSD_PAUSE ;
2001-04-12 02:40:42 +02:00
break ;
2002-01-08 03:01:04 +01:00
case KEY_HOME :
{
play_tree_iter_t * i = play_tree_iter_new_copy ( playtree_iter ) ;
2002-01-15 00:38:49 +01:00
if ( play_tree_iter_up_step ( i , 1 , 0 ) = = PLAY_TREE_ITER_ENTRY )
eof = PT_UP_NEXT ;
2002-01-08 03:01:04 +01:00
play_tree_iter_free ( i ) ;
}
break ;
case KEY_END :
2002-01-15 00:38:49 +01:00
{
play_tree_iter_t * i = play_tree_iter_new_copy ( playtree_iter ) ;
if ( play_tree_iter_up_step ( i , - 1 , 0 ) = = PLAY_TREE_ITER_ENTRY )
eof = PT_UP_PREV ;
play_tree_iter_free ( i ) ;
}
break ;
case ' > ' :
{
play_tree_iter_t * i = play_tree_iter_new_copy ( playtree_iter ) ;
if ( play_tree_iter_step ( i , 1 , 0 ) = = PLAY_TREE_ITER_ENTRY )
eof = PT_NEXT_ENTRY ;
play_tree_iter_free ( i ) ;
}
break ;
case ' < ' :
2002-01-08 03:01:04 +01:00
{
play_tree_iter_t * i = play_tree_iter_new_copy ( playtree_iter ) ;
if ( play_tree_iter_step ( i , - 1 , 0 ) = = PLAY_TREE_ITER_ENTRY )
2002-01-15 00:38:49 +01:00
eof = PT_PREV_ENTRY ;
2002-01-08 03:01:04 +01:00
play_tree_iter_free ( i ) ;
}
break ;
case KEY_INS :
if ( playtree_iter - > num_files > 1 & & playtree_iter - > file < playtree_iter - > num_files )
2002-01-15 00:38:49 +01:00
eof = PT_NEXT_SRC ;
2002-01-08 03:01:04 +01:00
break ;
case KEY_DEL :
if ( playtree_iter - > num_files > 1 & & playtree_iter - > file > 1 )
2002-01-15 00:38:49 +01:00
eof = PT_PREV_SRC ;
2002-01-08 03:01:04 +01:00
break ;
2001-04-12 02:40:42 +02:00
case ' o ' : // toggle OSD
2002-02-08 17:00:14 +01:00
if ( sh_video )
osd_level = ( osd_level + 1 ) % 3 ;
2001-02-24 21:28:24 +01:00
break ;
2001-06-02 01:45:04 +02:00
case ' z ' :
sub_delay - = 0.1 ;
2001-12-01 00:44:04 +01:00
osd_show_sub_delay = 9 ; // show the subdelay in OSD
2001-06-02 01:45:04 +02:00
break ;
case ' x ' :
sub_delay + = 0.1 ;
2001-12-01 00:44:04 +01:00
osd_show_sub_delay = 9 ; // show the subdelay in OSD
2001-06-02 01:45:04 +02:00
break ;
2001-08-22 20:51:13 +02:00
case ' 9 ' :
case ' 0 ' :
2001-04-16 02:09:53 +02:00
case ' * ' :
2001-04-21 02:14:49 +02:00
case ' / ' : {
2001-08-22 20:51:13 +02:00
if ( c = = ' * ' | | c = = ' 0 ' ) {
2001-09-11 18:26:41 +02:00
mixer_incvolume ( ) ;
2001-04-21 02:14:49 +02:00
} else {
2001-09-11 18:26:41 +02:00
mixer_decvolume ( ) ;
2001-04-21 02:14:49 +02:00
}
2001-07-30 04:00:54 +02:00
# ifdef USE_OSD
2001-04-21 02:14:49 +02:00
if ( osd_level ) {
osd_visible = sh_video - > fps ; // 1 sec
vo_osd_progbar_type = OSD_VOLUME ;
2001-09-11 18:26:41 +02:00
vo_osd_progbar_value = ( mixer_getbothvolume ( ) * 256.0 ) / 100.0 ;
2001-09-04 17:21:00 +02:00
//printf("volume: %d\n",vo_osd_progbar_value);
2001-04-21 02:14:49 +02:00
}
2001-07-30 04:00:54 +02:00
# endif
2001-04-21 02:14:49 +02:00
}
break ;
2001-08-01 03:02:33 +02:00
2001-08-22 21:02:28 +02:00
#if 0 // change to 1 for absolute seeking tests
case ' 1 ' :
case ' 2 ' :
case ' 3 ' :
case ' 4 ' :
case ' 5 ' :
case ' 6 ' :
case ' 7 ' :
case ' 8 ' :
rel_seek_secs = 0.99 * ( float ) ( c - ' 1 ' ) / 7.0 ;
abs_seek_pos = 3 ;
2002-03-15 23:25:57 +01:00
printf ( " ABS seek to %5.3f \n " , rel_seek_secs ) ;
2001-08-22 21:02:28 +02:00
break ;
# else
2002-02-17 10:25:09 +01:00
/* User wants to have screen shot */
case ' S ' :
case ' s ' :
video_out - > control ( VOCTRL_SCREENSHOT , NULL ) ;
break ;
2001-08-01 03:02:33 +02:00
// Contrast:
case ' 1 ' :
case ' 2 ' :
if ( c = = ' 2 ' ) {
2001-08-13 13:08:18 +02:00
if ( + + v_cont > 100 ) v_cont = 100 ;
2001-08-01 03:02:33 +02:00
} else {
2002-01-27 19:39:53 +01:00
- - v_cont ;
2002-01-28 08:29:17 +01:00
if ( v_hw_equ_cap & VEQ_CAP_CONTRAST )
2002-01-27 19:39:53 +01:00
{
if ( v_cont < - 100 ) v_cont = - 100 ;
}
else
{
if ( v_cont < 0 ) v_cont = 0 ;
}
2001-08-01 03:02:33 +02:00
}
if ( set_video_colors ( sh_video , " Contrast " , v_cont ) ) {
# ifdef USE_OSD
if ( osd_level ) {
osd_visible = sh_video - > fps ; // 1 sec
vo_osd_progbar_type = OSD_CONTRAST ;
2001-08-28 14:43:41 +02:00
vo_osd_progbar_value = ( ( v_cont ) < < 8 ) / 100 ;
2002-01-27 19:39:53 +01:00
if ( v_hw_equ_cap ) vo_osd_progbar_value = ( ( v_cont + 100 ) < < 8 ) / 200 ;
2001-08-01 03:02:33 +02:00
}
# endif
}
break ;
// Brightness:
case ' 3 ' :
case ' 4 ' :
if ( c = = ' 4 ' ) {
2001-08-13 13:08:18 +02:00
if ( + + v_bright > 100 ) v_bright = 100 ;
2001-08-01 03:02:33 +02:00
} else {
2002-01-27 19:39:53 +01:00
- - v_bright ;
2002-01-28 08:29:17 +01:00
if ( v_hw_equ_cap & VEQ_CAP_BRIGHTNESS )
2002-01-27 19:39:53 +01:00
{
if ( v_bright < - 100 ) v_bright = - 100 ;
}
else
{
if ( v_bright < 0 ) v_bright = 0 ;
}
2001-08-01 03:02:33 +02:00
}
if ( set_video_colors ( sh_video , " Brightness " , v_bright ) ) {
# ifdef USE_OSD
if ( osd_level ) {
osd_visible = sh_video - > fps ; // 1 sec
vo_osd_progbar_type = OSD_BRIGHTNESS ;
2001-08-28 14:43:41 +02:00
vo_osd_progbar_value = ( ( v_bright ) < < 8 ) / 100 ;
2002-01-27 19:39:53 +01:00
if ( v_hw_equ_cap ) vo_osd_progbar_value = ( ( v_bright + 100 ) < < 8 ) / 200 ;
2001-08-01 03:02:33 +02:00
}
# endif
}
break ;
// Hue:
case ' 5 ' :
case ' 6 ' :
if ( c = = ' 6 ' ) {
2001-08-13 13:08:18 +02:00
if ( + + v_hue > 100 ) v_hue = 100 ;
2001-08-01 03:02:33 +02:00
} else {
2002-01-27 19:39:53 +01:00
- - v_hue ;
2002-01-28 08:29:17 +01:00
if ( v_hw_equ_cap & VEQ_CAP_HUE )
2002-01-27 19:39:53 +01:00
{
if ( v_hue < - 100 ) v_hue = - 100 ;
}
else
{
if ( v_hue < 0 ) v_hue = 0 ;
}
2001-08-01 03:02:33 +02:00
}
if ( set_video_colors ( sh_video , " Hue " , v_hue ) ) {
# ifdef USE_OSD
if ( osd_level ) {
osd_visible = sh_video - > fps ; // 1 sec
vo_osd_progbar_type = OSD_HUE ;
2001-08-28 14:43:41 +02:00
vo_osd_progbar_value = ( ( v_hue ) < < 8 ) / 100 ;
2002-01-27 19:39:53 +01:00
if ( v_hw_equ_cap ) vo_osd_progbar_value = ( ( v_hue + 100 ) < < 8 ) / 200 ;
2001-08-01 03:02:33 +02:00
}
# endif
}
break ;
// Saturation:
case ' 7 ' :
case ' 8 ' :
if ( c = = ' 8 ' ) {
2001-08-13 13:08:18 +02:00
if ( + + v_saturation > 100 ) v_saturation = 100 ;
2001-08-01 03:02:33 +02:00
} else {
2002-01-27 19:39:53 +01:00
- - v_saturation ;
2002-01-28 08:29:17 +01:00
if ( v_hw_equ_cap & VEQ_CAP_SATURATION )
2002-01-27 19:39:53 +01:00
{
if ( v_saturation < - 100 ) v_saturation = - 100 ;
}
else
{
if ( v_saturation < 0 ) v_saturation = 0 ;
}
2001-08-01 03:02:33 +02:00
}
if ( set_video_colors ( sh_video , " Saturation " , v_saturation ) ) {
# ifdef USE_OSD
if ( osd_level ) {
osd_visible = sh_video - > fps ; // 1 sec
vo_osd_progbar_type = OSD_SATURATION ;
2001-08-28 14:43:41 +02:00
vo_osd_progbar_value = ( ( v_saturation ) < < 8 ) / 100 ;
2002-01-27 19:39:53 +01:00
if ( v_hw_equ_cap ) vo_osd_progbar_value = ( ( v_saturation + 100 ) < < 8 ) / 200 ;
2001-08-01 03:02:33 +02:00
}
# endif
}
break ;
2001-08-22 21:02:28 +02:00
# endif
2001-08-01 03:02:33 +02:00
2001-05-07 02:03:30 +02:00
case ' d ' :
2001-05-14 11:35:51 +02:00
frame_dropping = ( frame_dropping + 1 ) % 3 ;
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_V , " == drop: %d == \n " , frame_dropping ) ;
2001-05-07 02:03:30 +02:00
break ;
2001-11-17 01:23:48 +01:00
# ifdef USE_TV
case ' h ' :
if ( tv_param_on = = 1 )
tv_step_channel ( tv_handler , TV_CHANNEL_HIGHER ) ;
break ;
case ' l ' :
if ( tv_param_on = = 1 )
tv_step_channel ( tv_handler , TV_CHANNEL_LOWER ) ;
break ;
case ' n ' :
if ( tv_param_on = = 1 )
tv_step_norm ( tv_handler ) ;
break ;
case ' b ' :
if ( tv_param_on = = 1 )
tv_step_chanlist ( tv_handler ) ;
break ;
# endif
2002-02-17 02:07:45 +01:00
case ' f ' :
video_out - > control ( VOCTRL_FULLSCREEN , 0 ) ;
break ;
2001-02-24 21:28:24 +01:00
}
2001-07-29 00:08:38 +02:00
} // keyboard event handler
2002-01-30 13:46:03 +01:00
# else /* HAVE_NEW_INPUT */
{
mp_cmd_t * cmd ;
while ( ( cmd = mp_input_get_cmd ( 0 , 0 ) ) ! = NULL ) {
switch ( cmd - > id ) {
case MP_CMD_SEEK : {
int v , abs ;
v = cmd - > args [ 0 ] . v . i ;
abs = ( cmd - > nargs > 1 ) ? cmd - > args [ 1 ] . v . i : 0 ;
if ( abs ) {
abs_seek_pos = 3 ;
osd_function = ( v > sh_video - > timer ) ? OSD_FFW : OSD_REW ;
rel_seek_secs = v ;
}
else {
rel_seek_secs + = v ;
osd_function = ( v > 0 ) ? OSD_FFW : OSD_REW ;
}
} break ;
case MP_CMD_AUDIO_DELAY : {
float v = cmd - > args [ 0 ] . v . f ;
audio_delay + = v ;
osd_show_av_delay = 9 ;
if ( sh_audio ) sh_audio - > timer + = v ;
} break ;
case MP_CMD_PAUSE : {
osd_function = OSD_PAUSE ;
} break ;
case MP_CMD_QUIT : {
exit_player ( MSGTR_Exit_quit ) ;
}
case MP_CMD_GRAB_FRAMES : {
grab_frames = 2 ;
} break ;
case MP_CMD_PLAY_TREE_STEP : {
int n = cmd - > args [ 0 ] . v . i > 0 ? 1 : - 1 ;
2002-03-16 17:36:32 +01:00
int force = cmd - > args [ 1 ] . v . i ;
if ( ! force ) {
play_tree_iter_t * i = play_tree_iter_new_copy ( playtree_iter ) ;
if ( play_tree_iter_step ( i , n , 0 ) = = PLAY_TREE_ITER_ENTRY )
eof = ( n > 0 ) ? PT_NEXT_ENTRY : PT_PREV_ENTRY ;
play_tree_iter_free ( i ) ;
} else
2002-01-30 13:46:03 +01:00
eof = ( n > 0 ) ? PT_NEXT_ENTRY : PT_PREV_ENTRY ;
} break ;
case MP_CMD_PLAY_TREE_UP_STEP : {
int n = cmd - > args [ 0 ] . v . i > 0 ? 1 : - 1 ;
2002-03-16 17:36:32 +01:00
int force = cmd - > args [ 1 ] . v . i ;
if ( ! force ) {
play_tree_iter_t * i = play_tree_iter_new_copy ( playtree_iter ) ;
if ( play_tree_iter_up_step ( i , n , 0 ) = = PLAY_TREE_ITER_ENTRY )
eof = ( n > 0 ) ? PT_UP_NEXT : PT_UP_PREV ;
play_tree_iter_free ( i ) ;
} else
2002-01-30 13:46:03 +01:00
eof = ( n > 0 ) ? PT_UP_NEXT : PT_UP_PREV ;
} break ;
case MP_CMD_PLAY_ALT_SRC_STEP : {
if ( playtree_iter - > num_files > 1 ) {
int v = cmd - > args [ 0 ] . v . i ;
if ( v > 0 & & playtree_iter - > file < playtree_iter - > num_files )
eof = PT_NEXT_SRC ;
else if ( v < 0 & & playtree_iter - > file > 1 )
eof = PT_PREV_SRC ;
}
} break ;
case MP_CMD_SUB_DELAY : {
int abs = cmd - > args [ 1 ] . v . i ;
float v = cmd - > args [ 0 ] . v . f ;
if ( abs )
sub_delay = v ;
else
sub_delay + = v ;
osd_show_sub_delay = 9 ; // show the subdelay in OSD
} break ;
2002-02-08 17:00:14 +01:00
case MP_CMD_OSD :
if ( sh_video ) {
int v = cmd - > args [ 0 ] . v . i ;
if ( v < 0 )
osd_level = ( osd_level + 1 ) % 3 ;
else
osd_level = v > 2 ? 2 : v ;
} break ;
2002-01-30 13:46:03 +01:00
case MP_CMD_VOLUME : {
int v = cmd - > args [ 0 ] . v . i ;
if ( v > 0 )
mixer_incvolume ( ) ;
else
mixer_decvolume ( ) ;
# ifdef USE_OSD
if ( osd_level ) {
osd_visible = sh_video - > fps ; // 1 sec
vo_osd_progbar_type = OSD_VOLUME ;
vo_osd_progbar_value = ( mixer_getbothvolume ( ) * 256.0 ) / 100.0 ;
}
# endif
} break ;
case MP_CMD_MIXER_USEMASTER : {
} break ;
case MP_CMD_CONTRAST : {
int v = cmd - > args [ 0 ] . v . i , abs = cmd - > args [ 1 ] . v . i ;
if ( abs )
v_cont = v > 100 ? 100 : v ;
else {
if ( ( v_cont + = v ) > 100 ) v_cont = 100 ;
}
if ( v_cont < 0 ) v_cont = 0 ;
if ( set_video_colors ( sh_video , " Contrast " , v_cont ) ) {
# ifdef USE_OSD
if ( osd_level ) {
osd_visible = sh_video - > fps ; // 1 sec
vo_osd_progbar_type = OSD_CONTRAST ;
vo_osd_progbar_value = ( ( v_cont ) < < 8 ) / 100 ;
}
# endif
}
} break ;
case MP_CMD_BRIGHTNESS : {
int v = cmd - > args [ 0 ] . v . i , abs = cmd - > args [ 1 ] . v . i ;
if ( abs )
v_bright = v > 100 ? 100 : v ;
else {
2002-03-05 09:51:57 +01:00
if ( ( v_bright + = v ) > 100 ) v_bright = 100 ;
2002-01-30 13:46:03 +01:00
}
if ( v_hw_equ_cap & VEQ_CAP_BRIGHTNESS ) {
if ( v_bright < - 100 ) v_bright = - 100 ;
} else {
if ( v_bright < 0 ) v_bright = 0 ;
}
if ( set_video_colors ( sh_video , " Brightness " , v_bright ) ) {
# ifdef USE_OSD
if ( osd_level ) {
osd_visible = sh_video - > fps ; // 1 sec
vo_osd_progbar_type = OSD_BRIGHTNESS ;
vo_osd_progbar_value = ( ( v_bright ) < < 8 ) / 100 ;
}
# endif
}
} break ;
case MP_CMD_HUE : {
int v = cmd - > args [ 0 ] . v . i , abs = cmd - > args [ 1 ] . v . i ;
if ( abs )
v_hue = v > 100 ? 100 : v ;
else {
if ( ( v_hue + = v ) > 100 ) v_hue = 100 ;
}
if ( v_hw_equ_cap & VEQ_CAP_HUE ) {
if ( v_hue < - 100 ) v_hue = - 100 ;
} else {
if ( v_hue < 0 ) v_hue = 0 ;
}
if ( set_video_colors ( sh_video , " Hue " , v_hue ) ) {
# ifdef USE_OSD
if ( osd_level ) {
osd_visible = sh_video - > fps ; // 1 sec
vo_osd_progbar_type = OSD_HUE ;
vo_osd_progbar_value = ( ( v_hue ) < < 8 ) / 100 ;
}
# endif
}
} break ;
case MP_CMD_SATURATION : {
int v = cmd - > args [ 0 ] . v . i , abs = cmd - > args [ 1 ] . v . i ;
if ( abs )
v_saturation = v > 100 ? 100 : v ;
else {
if ( ( v_saturation + = v ) > 100 ) v_saturation = 100 ;
}
if ( v_hw_equ_cap & VEQ_CAP_SATURATION ) {
if ( v_saturation < - 100 ) v_saturation = - 100 ;
} else {
if ( v_saturation < 0 ) v_saturation = 0 ;
}
if ( set_video_colors ( sh_video , " Saturation " , v_saturation ) ) {
# ifdef USE_OSD
if ( osd_level ) {
osd_visible = sh_video - > fps ; // 1 sec
vo_osd_progbar_type = OSD_SATURATION ;
vo_osd_progbar_value = ( ( v_saturation ) < < 8 ) / 100 ;
}
# endif
}
} break ;
case MP_CMD_FRAMEDROPPING : {
int v = cmd - > args [ 0 ] . v . i ;
if ( v < 0 )
frame_dropping = ( frame_dropping + 1 ) % 3 ;
else
frame_dropping = v > 2 ? 2 : v ;
} break ;
# ifdef USE_TV
case MP_CMD_TV_STEP_CHANNEL : {
if ( tv_param_on = = 1 ) {
int v = cmd - > args [ 0 ] . v . i ;
if ( v > 0 )
tv_step_channel ( tv_handler , TV_CHANNEL_HIGHER ) ;
else
tv_step_channel ( tv_handler , TV_CHANNEL_LOWER ) ;
}
} break ;
case MP_CMD_TV_STEP_NORM : {
if ( tv_param_on = = 1 )
tv_step_norm ( tv_handler ) ;
} break ;
case MP_CMD_TV_STEP_CHANNEL_LIST : {
if ( tv_param_on = = 1 )
tv_step_chanlist ( tv_handler ) ;
} break ;
2002-02-24 22:20:20 +01:00
# endif
2002-02-17 02:07:45 +01:00
case MP_CMD_VO_FULLSCREEN :
{
2002-02-25 14:14:27 +01:00
# ifdef HAVE_NEW_GUI
if ( use_gui ) guiGetEvent ( guiIEvent , ( char * ) MP_CMD_GUI_FULLSCREEN ) ;
else
# endif
2002-03-18 02:49:42 +01:00
if ( video_out ) video_out - > control ( VOCTRL_FULLSCREEN , 0 ) ;
2002-02-17 02:07:45 +01:00
} break ;
2002-03-10 04:47:53 +01:00
case MP_CMD_SUB_POS :
{
int v ;
v = cmd - > args [ 0 ] . v . i ;
sub_pos + = v ;
if ( sub_pos > 100 ) sub_pos = 100 ;
if ( sub_pos < 0 ) sub_pos = 0 ;
} break ;
2002-02-25 14:14:27 +01:00
default : {
# ifdef HAVE_NEW_GUI
if ( ( use_gui ) & & ( cmd - > id > MP_CMD_GUI_EVENTS ) ) guiGetEvent ( guiIEvent , ( char * ) cmd - > id ) ;
else
# endif
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_V , " Received unknow cmd %s \n " , cmd - > name ) ;
2002-01-30 13:46:03 +01:00
}
2002-02-25 14:14:27 +01:00
}
2002-01-30 13:46:03 +01:00
mp_cmd_free ( cmd ) ;
}
}
# endif
2001-04-27 00:10:25 +02:00
if ( seek_to_sec ) {
2001-06-02 00:48:50 +02:00
int a , b ; float d ;
if ( sscanf ( seek_to_sec , " %d:%d:%f " , & a , & b , & d ) = = 3 )
rel_seek_secs + = 3600 * a + 60 * b + d ;
else if ( sscanf ( seek_to_sec , " %d:%f " , & a , & d ) = = 2 )
rel_seek_secs + = 60 * a + d ;
else if ( sscanf ( seek_to_sec , " %f " , & d ) = = 1 )
rel_seek_secs + = d ;
seek_to_sec = NULL ;
2001-04-27 00:10:25 +02:00
}
2001-06-02 00:48:50 +02:00
2001-10-22 16:42:47 +02:00
/* Looping. */
2001-12-17 00:59:13 +01:00
if ( eof = = 1 & & loop_times > = 0 ) {
mp_msg ( MSGT_CPLAYER , MSGL_V , " loop_times = %d, eof = %d \n " , loop_times , eof ) ;
if ( loop_times > 1 ) loop_times - - ; else
if ( loop_times = = 1 ) loop_times = - 1 ;
2001-10-22 16:42:47 +02:00
eof = 0 ;
2001-12-17 00:59:13 +01:00
abs_seek_pos = 3 ; rel_seek_secs = 0 ; // seek to start of movie (0%)
2001-10-22 16:42:47 +02:00
}
2001-08-22 21:02:28 +02:00
if ( rel_seek_secs | | abs_seek_pos ) {
2001-08-08 21:37:45 +02:00
current_module = " seek " ;
2001-08-22 21:02:28 +02:00
if ( demux_seek ( demuxer , rel_seek_secs , abs_seek_pos ) ) {
2001-07-28 23:57:21 +02:00
// success:
2002-01-10 18:18:30 +01:00
/* FIXME there should be real seeking for vobsub */
if ( vo_vobsub )
vobsub_reset ( vo_vobsub ) ;
2001-02-24 21:28:24 +01:00
2001-08-07 18:03:30 +02:00
if ( sh_audio ) {
if ( verbose ) {
float a_pts = d_audio - > pts ;
a_pts + = ( ds_tell_pts ( d_audio ) - sh_audio - > a_in_buffer_len ) / ( float ) sh_audio - > i_bps ;
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_AVSYNC , MSGL_V , " SEEK: A: %5.3f V: %5.3f A-V: %5.3f \n " , a_pts , d_video - > pts , a_pts - d_video - > pts ) ;
2001-08-07 18:03:30 +02:00
}
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_AVSYNC , MSGL_STATUS , " A:%6.1f V:%6.1f A-V:%7.3f ct: ? \r " , d_audio - > pts , d_video - > pts , 0.0f ) ;
2001-08-07 18:03:30 +02:00
} else {
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_AVSYNC , MSGL_STATUS , " A: --- V:%6.1f \r " , d_video - > pts ) ;
2001-08-07 18:03:30 +02:00
}
fflush ( stdout ) ;
2002-02-09 01:47:55 +01:00
if ( sh_video ) {
current_module = " seek_video_reset " ;
video_out - > control ( VOCTRL_RESET , NULL ) ;
}
2001-07-21 03:17:00 +02:00
if ( sh_audio ) {
2001-08-08 21:37:45 +02:00
current_module = " seek_audio_reset " ;
2001-06-05 20:40:44 +02:00
audio_out - > reset ( ) ; // stop audio, throwing away buffered data
2001-02-24 21:28:24 +01:00
}
2001-07-30 04:00:54 +02:00
# ifdef USE_OSD
2001-07-16 19:07:13 +02:00
// Set OSD:
if ( osd_level ) {
int len = ( ( demuxer - > movi_end - demuxer - > movi_start ) > > 8 ) ;
2001-08-28 16:22:37 +02:00
if ( len > 0 ) {
osd_visible = sh_video - > fps ; // 1 sec
vo_osd_progbar_type = 0 ;
vo_osd_progbar_value = ( demuxer - > filepos - demuxer - > movi_start ) / len ;
}
2001-07-16 19:07:13 +02:00
}
2001-07-30 04:00:54 +02:00
# endif
2002-02-08 17:00:14 +01:00
if ( sh_video ) {
c_total = 0 ;
max_pts_correction = 0.1 ;
osd_visible = sh_video - > fps ; // to rewert to PLAY pointer after 1 sec
audio_time_usage = 0 ; video_time_usage = 0 ; vout_time_usage = 0 ;
drop_frame_cnt = 0 ;
too_slow_frame_cnt = 0 ;
too_fast_frame_cnt = 0 ;
2001-12-25 21:32:02 +01:00
# ifdef USE_DVDREAD
if ( vo_spudec ) spudec_reset ( vo_spudec ) ;
# endif
2002-02-08 17:00:14 +01:00
}
2001-02-24 21:28:24 +01:00
}
2001-07-28 23:57:21 +02:00
rel_seek_secs = 0 ;
2001-08-22 21:02:28 +02:00
abs_seek_pos = 0 ;
2001-08-08 21:37:45 +02:00
current_module = NULL ;
}
2001-08-28 01:56:44 +02:00
# ifdef HAVE_NEW_GUI
if ( use_gui ) {
2001-08-28 23:35:04 +02:00
if ( demuxer - > file_format = = DEMUXER_TYPE_AVI & & sh_video - > video . dwLength > 2 ) {
// get pos from frame number / total frames
2002-02-23 16:12:55 +01:00
guiIntfStruct . Position = ( float ) d_video - > pack_no * 100.0f / sh_video - > video . dwLength ;
2001-08-28 23:35:04 +02:00
} else {
// get pos from file position / filesize
int len = ( ( demuxer - > movi_end - demuxer - > movi_start ) ) ;
int pos = ( demuxer - > file_format = = DEMUXER_TYPE_AVI ) ? demuxer - > filepos : d_video - > pos ;
2002-02-23 16:12:55 +01:00
guiIntfStruct . Position = ( len < = 0 ) ? 0 : ( ( float ) ( pos - demuxer - > movi_start ) / len * 100.0f ) ;
2001-08-28 23:35:04 +02:00
}
2002-02-23 16:12:55 +01:00
guiIntfStruct . TimeSec = d_video - > pts ;
if ( guiIntfStruct . Playing = = 0 ) break ; // STOP
if ( guiIntfStruct . Playing = = 2 ) osd_function = OSD_PAUSE ;
if ( guiIntfStruct . VolumeChanged )
2001-09-02 23:49:21 +02:00
{
2002-02-23 16:12:55 +01:00
mixer_setvolume ( guiIntfStruct . Volume , guiIntfStruct . Volume ) ;
guiIntfStruct . VolumeChanged = 0 ;
2001-09-04 17:21:00 +02:00
# ifdef USE_OSD
if ( osd_level )
{
osd_visible = sh_video - > fps ; // 1 sec
vo_osd_progbar_type = OSD_VOLUME ;
2002-02-23 16:12:55 +01:00
vo_osd_progbar_value = ( ( guiIntfStruct . Volume ) * 256.0 ) / 100.0 ;
2001-09-04 17:21:00 +02:00
}
2001-09-02 23:49:21 +02:00
# endif
2001-09-04 17:21:00 +02:00
}
2002-02-23 16:12:55 +01:00
guiIntfStruct . Volume = ( float ) mixer_getbothvolume ( ) ;
2001-11-21 18:43:57 +01:00
# ifdef USE_DVDREAD
2002-02-23 16:12:55 +01:00
if ( guiIntfStruct . DVDChanged ) goto goto_next_file ;
2001-11-21 18:43:57 +01:00
if ( stream - > type = = STREAMTYPE_DVD )
{
dvd_priv_t * dvdp = stream - > priv ;
2002-02-23 16:12:55 +01:00
guiIntfStruct . DVD . current_chapter = dvdp - > cur_cell + 1 ;
2001-11-21 18:43:57 +01:00
}
# endif
2001-08-28 01:56:44 +02:00
}
# endif
2001-03-27 02:39:24 +02:00
//================= Update OSD ====================
2001-07-30 04:00:54 +02:00
# ifdef USE_OSD
2002-03-19 20:22:00 +01:00
if ( osd_level > = 1 ) {
2001-05-13 05:00:57 +02:00
int pts = d_video - > pts ;
2002-02-22 16:25:11 +01:00
char osd_text_tmp [ 50 ] ;
2001-04-23 21:20:44 +02:00
if ( pts = = osd_last_pts - 1 ) + + pts ; else osd_last_pts = pts ;
2001-04-12 02:40:42 +02:00
vo_osd_text = osd_text_buffer ;
2001-12-01 00:44:04 +01:00
if ( osd_show_sub_delay ) {
2002-02-22 16:25:11 +01:00
sprintf ( osd_text_tmp , " Sub delay: %d ms " , ( int ) ( sub_delay * 1000 ) ) ;
2001-12-01 00:44:04 +01:00
osd_show_sub_delay - - ;
2001-12-27 01:59:40 +01:00
} else
if ( osd_show_av_delay ) {
2002-02-22 16:25:11 +01:00
sprintf ( osd_text_tmp , " A-V delay: %d ms " , ( int ) ( audio_delay * 1000 ) ) ;
2001-12-27 01:59:40 +01:00
osd_show_av_delay - - ;
2002-03-19 20:22:00 +01:00
} else if ( osd_level > = 2 )
2002-02-22 16:25:11 +01:00
sprintf ( osd_text_tmp , " %c %02d:%02d:%02d " , osd_function , pts / 3600 , ( pts / 60 ) % 60 , pts % 60 ) ;
2002-03-19 20:22:00 +01:00
else osd_text_tmp [ 0 ] = 0 ;
2002-02-22 16:25:11 +01:00
if ( strcmp ( vo_osd_text , osd_text_tmp ) ) {
strcpy ( vo_osd_text , osd_text_tmp ) ;
vo_osd_changed ( 1 ) ;
}
2001-04-12 02:40:42 +02:00
} else {
2002-02-22 16:25:11 +01:00
if ( vo_osd_text ) {
2001-04-12 02:40:42 +02:00
vo_osd_text = NULL ;
2002-02-22 16:25:11 +01:00
vo_osd_changed ( 1 ) ;
}
2001-04-12 02:40:42 +02:00
}
2001-03-27 02:39:24 +02:00
// for(i=1;i<=11;i++) osd_text_buffer[10+i]=i;osd_text_buffer[10+i]=0;
2001-04-12 02:40:42 +02:00
// vo_osd_text=osd_text_buffer;
2001-07-30 04:00:54 +02:00
# endif
2001-04-16 01:22:01 +02:00
2001-07-30 04:00:54 +02:00
# ifdef USE_SUB
2001-03-30 05:07:45 +02:00
// find sub
2001-06-23 19:10:52 +02:00
if ( subtitles & & d_video - > pts > 0 ) {
2001-08-29 22:22:23 +02:00
float pts = d_video - > pts ;
2001-04-14 05:12:06 +02:00
if ( sub_fps = = 0 ) sub_fps = sh_video - > fps ;
2001-04-17 02:08:56 +02:00
current_module = " find_sub " ;
2001-12-03 02:03:17 +01:00
if ( pts > sub_last_pts | | pts < sub_last_pts - 1.0 ) {
find_sub ( subtitles , sub_uses_time ? ( 100 * ( pts + sub_delay ) ) : ( ( pts + sub_delay ) * sub_fps ) ) ; // FIXME! frame counter...
sub_last_pts = pts ;
}
2001-04-17 02:08:56 +02:00
current_module = NULL ;
2001-03-30 05:07:45 +02:00
}
2001-07-30 04:00:54 +02:00
# endif
2001-04-21 01:00:11 +02:00
2001-11-28 13:44:39 +01:00
2002-01-10 18:18:30 +01:00
// VobSub subtitles
if ( vo_vobsub ) {
current_module = " vobsub " ;
vobsub_process ( vo_vobsub , d_video - > pts ) ;
2002-02-22 16:25:11 +01:00
/* Don't know how to detect wether the sub has changed or not */
vo_osd_changed ( 1 ) ;
2002-01-10 18:18:30 +01:00
current_module = NULL ;
}
2001-11-28 13:44:39 +01:00
# ifdef USE_DVDREAD
2001-04-21 01:00:11 +02:00
// DVD sub:
2002-01-15 01:23:16 +01:00
if ( vo_flags & 0x08 ) {
static vo_mpegpes_t packet ;
static vo_mpegpes_t * pkg = & packet ;
packet . timestamp = sh_video - > timer * 90000.0 ;
packet . id = 0x20 ; /* Subpic */
while ( ( packet . size = ds_get_packet_sub ( d_dvdsub , & packet . data ) ) > 0 ) {
mp_msg ( MSGT_CPLAYER , MSGL_V , " \r DVD sub: len=%d v_pts=%5.3f s_pts=%5.3f \n " , packet . size , d_video - > pts , d_dvdsub - > pts ) ;
video_out - > draw_frame ( & pkg ) ;
}
} else if ( vo_spudec ) {
2001-11-20 19:36:50 +01:00
unsigned char * packet = NULL ;
2001-12-28 20:47:37 +01:00
int len ;
2001-11-20 19:36:50 +01:00
current_module = " spudec " ;
2001-12-28 20:47:37 +01:00
while ( ( len = ds_get_packet_sub ( d_dvdsub , & packet ) ) > 0 ) {
mp_msg ( MSGT_CPLAYER , MSGL_V , " \r DVD sub: len=%d v_pts=%5.3f s_pts=%5.3f \n " , len , d_video - > pts , d_dvdsub - > pts ) ;
2001-12-28 20:20:12 +01:00
spudec_assemble ( vo_spudec , packet , len , 100 * d_dvdsub - > pts ) ;
2001-04-21 01:00:11 +02:00
}
2001-12-28 20:20:12 +01:00
spudec_heartbeat ( vo_spudec , 100 * d_video - > pts ) ;
2002-02-22 16:25:11 +01:00
/* Don't know how to detect wether the sub has changed or not */
vo_osd_changed ( 1 ) ;
2001-11-20 19:36:50 +01:00
current_module = NULL ;
2001-04-21 01:00:11 +02:00
}
2001-11-28 13:44:39 +01:00
# endif
2001-04-21 01:00:11 +02:00
2001-02-24 21:28:24 +01:00
} // while(!eof)
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_GLOBAL , MSGL_V , " EOF code: %d \n " , eof ) ;
2001-07-29 23:07:34 +02:00
2001-03-15 20:38:34 +01:00
}
2001-08-22 23:35:44 +02:00
2001-12-19 17:55:32 +01:00
goto_next_file : // don't jump here after ao/vo/getch initialization!
2001-08-23 01:48:18 +02:00
2002-01-17 21:25:55 +01:00
if ( benchmark ) {
double tot = video_time_usage + vout_time_usage + audio_time_usage ;
double total_time_usage ;
total_time_usage_start = GetTimer ( ) - total_time_usage_start ;
total_time_usage = ( float ) total_time_usage_start * 0.000001 ;
2002-03-17 01:47:15 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " \n BENCHMARKs: VC:%8.3fs VO:%8.3fs A:%8.3fs Sys:%8.3fs = %8.3fs \n " ,
2002-01-17 21:25:55 +01:00
video_time_usage , vout_time_usage , audio_time_usage ,
total_time_usage - tot , total_time_usage ) ;
if ( total_time_usage > 0.0 )
2002-03-17 01:47:15 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " BENCHMARK%%: VC:%8.4f%% VO:%8.4f%% A:%8.4f%% Sys:%8.4f%% = %8.4f%% \n " ,
2002-01-17 21:25:55 +01:00
100.0 * video_time_usage / total_time_usage ,
100.0 * vout_time_usage / total_time_usage ,
100.0 * audio_time_usage / total_time_usage ,
100.0 * ( total_time_usage - tot ) / total_time_usage ,
100.0 ) ;
}
2002-03-07 12:57:33 +01:00
# ifdef HAVE_NEW_GUI
if ( use_gui )
{
# ifdef USE_DVDREAD
if ( ! guiIntfStruct . DVDChanged )
# endif
mplStop ( ) ;
# warning workaround for kiba playtree with gui ... if i dont play the prev / next file, then playtree sig6 (assert)
eof = 0 ;
}
# endif
2002-03-17 03:28:32 +01:00
uninit_player ( INITED_VO | INITED_AO ) ;
2002-01-15 00:38:49 +01:00
if ( eof = = PT_NEXT_ENTRY | | eof = = PT_PREV_ENTRY ) {
2002-01-17 21:25:55 +01:00
eof = eof = = PT_NEXT_ENTRY ? 1 : - 1 ;
2002-01-08 03:01:04 +01:00
if ( play_tree_iter_step ( playtree_iter , eof , 0 ) = = PLAY_TREE_ITER_ENTRY ) {
2002-03-17 03:28:32 +01:00
uninit_player ( INITED_ALL - ( INITED_GUI + INITED_LIRC + INITED_INPUT ) ) ;
2002-01-08 03:01:04 +01:00
eof = 1 ;
} else {
play_tree_iter_free ( playtree_iter ) ;
playtree_iter = NULL ;
}
2002-01-15 00:38:49 +01:00
} else if ( eof = = PT_UP_NEXT | | eof = = PT_UP_PREV ) {
eof = eof = = PT_UP_NEXT ? 1 : - 1 ;
if ( play_tree_iter_up_step ( playtree_iter , eof , 0 ) = = PLAY_TREE_ITER_ENTRY ) {
2002-03-17 03:28:32 +01:00
uninit_player ( INITED_ALL - ( INITED_GUI + INITED_LIRC + INITED_INPUT ) ) ;
2002-01-15 00:38:49 +01:00
eof = 1 ;
} else {
play_tree_iter_free ( playtree_iter ) ;
playtree_iter = NULL ;
}
2002-03-17 03:28:32 +01:00
} else { // NEXT PREV SRC
uninit_player ( INITED_ALL - ( INITED_GUI + INITED_LIRC + INITED_INPUT ) ) ;
2002-01-15 00:38:49 +01:00
eof = eof = = PT_PREV_SRC ? - 1 : 1 ;
2002-01-08 03:01:04 +01:00
}
2001-08-22 23:35:44 +02:00
2002-01-08 03:01:04 +01:00
if ( eof = = 0 ) eof = 1 ;
2001-08-23 01:48:18 +02:00
2002-01-08 03:01:04 +01:00
while ( playtree_iter ! = NULL ) {
filename = play_tree_iter_get_file ( playtree_iter , eof ) ;
if ( filename = = NULL ) {
if ( play_tree_iter_step ( playtree_iter , eof , 0 ) ! = PLAY_TREE_ITER_ENTRY ) {
play_tree_iter_free ( playtree_iter ) ;
playtree_iter = NULL ;
} ;
} else
break ;
}
if ( use_gui | | playtree_iter ! = NULL
2001-12-19 17:55:32 +01:00
# if defined( HAVE_NEW_GUI ) && defined( USE_DVDREAD )
2002-03-06 19:42:56 +01:00
| | ( guiIntfStruct . DVDChanged & & use_gui )
2001-12-19 17:55:32 +01:00
# endif
) {
2001-08-23 01:48:18 +02:00
2001-08-23 14:24:59 +02:00
current_module = " uninit_vcodec " ;
if ( sh_video ) uninit_video ( sh_video ) ;
2002-03-06 19:42:56 +01:00
2001-08-23 01:48:18 +02:00
current_module = " free_demuxer " ;
if ( demuxer ) free_demuxer ( demuxer ) ;
current_module = " free_stream " ;
if ( stream ) free_stream ( stream ) ;
2001-12-17 01:07:20 +01:00
current_module = " sub_free " ;
if ( subtitles )
{
sub_free ( subtitles ) ;
sub_name = NULL ;
vo_sub = NULL ;
2002-02-23 16:12:55 +01:00
subtitles = NULL ;
2001-12-17 01:07:20 +01:00
}
2002-02-23 16:12:55 +01:00
2002-01-08 03:01:04 +01:00
eof = 0 ;
2001-08-23 01:48:18 +02:00
goto play_next_file ;
2001-08-22 23:35:44 +02:00
}
exit_player ( MSGTR_Exit_eof ) ;
2001-03-15 20:38:34 +01:00
return 1 ;
}