2002-09-29 19:26:40 +00:00
// Movie Player v0.90 (C) 2000-2002. by A'rpi/ESP-team & `cat AUTHORS`
2001-02-24 20:28:24 +00:00
2001-08-01 09:14:02 +00:00
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <unistd.h>
2001-02-24 20:28:24 +00:00
# include <sys/ioctl.h>
2002-03-23 21:12:38 +00:00
// #include <sys/mman.h>
2001-02-24 20:28:24 +00:00
# include <sys/types.h>
# include <sys/wait.h>
# include <sys/time.h>
# include <sys/stat.h>
2001-07-31 23:18:16 +00:00
# include <signal.h>
# include <time.h>
2001-02-24 20:28:24 +00:00
# include <fcntl.h>
2002-03-15 22:25:57 +00:00
# include <errno.h>
2001-08-01 09:14:02 +00:00
# include "version.h"
# include "config.h"
2001-08-18 20:32:09 +00:00
2001-08-16 22:40:06 +00:00
# include "mp_msg.h"
2001-02-24 20:28:24 +00:00
2001-08-18 20:32:09 +00:00
# define HELP_MP_DEFINE_STATIC
# include "help_mp.h"
2001-03-18 23:32:31 +00:00
# include "cfgparser.h"
2001-03-19 02:29:37 +00:00
# include "cfg-mplayer-def.h"
2001-03-18 23:32:31 +00:00
2001-07-30 02:00:54 +00:00
# ifdef USE_SUB
2001-03-30 03:07:45 +00:00
# include "subreader.h"
2001-07-30 02:00:54 +00:00
# endif
2001-03-30 03:07:45 +00:00
2001-03-04 21:01:54 +00:00
# include "libvo/video_out.h"
2001-07-30 02:00:54 +00:00
2002-03-23 22:50:25 +00:00
# include "libvo/font_load.h"
2001-03-27 00:39:24 +00:00
# include "libvo/sub.h"
2001-03-04 21:01:54 +00:00
2001-06-02 23:30:26 +00:00
# include "libao2/audio_out.h"
2001-11-29 12:44:06 +00:00
# include "libao2/audio_plugin.h"
2001-06-02 23:30:26 +00:00
2001-04-07 21:27:57 +00:00
# include "codec-cfg.h"
2001-03-20 22:11:38 +00:00
2002-09-29 19:26:40 +00:00
# ifdef HAVE_LIBCSS
# include "libmpdemux/dvdauth.h"
# endif
2002-03-28 20:40:21 +00:00
# ifdef USE_DVDNAV
# include <dvdnav.h>
# endif
2002-04-04 14:24:11 +00:00
2001-04-21 15:38:01 +00:00
# include "spudec.h"
2002-01-10 17:18:30 +00:00
# include "vobsub.h"
2001-04-17 22:04:44 +00:00
2001-02-24 20:28:24 +00:00
# include "linux/getch2.h"
# include "linux/timer.h"
2001-10-19 02:00:45 +00:00
# include "cpudetect.h"
2001-10-01 17:25:07 +00:00
# ifdef HAVE_NEW_GUI
2002-02-21 22:48:47 +00:00
# include "Gui/interface.h"
2001-10-01 17:25:07 +00:00
# endif
2002-01-30 12:46:03 +00:00
# include "input/input.h"
2001-12-04 21:04:28 +00:00
int slave_mode = 0 ;
2001-04-11 20:58:15 +00:00
int verbose = 0 ;
2002-09-29 22:57:54 +00:00
static int quiet = 0 ;
2001-02-24 20:28:24 +00:00
2001-04-14 03:12:06 +00:00
# define ABS(x) (((x)>=0)?(x):(-(x)))
2001-11-20 07:53:20 +00:00
# ifdef HAVE_RTC
2001-11-14 00:26:28 +00:00
# include <linux/rtc.h>
# endif
2001-11-17 00:23:48 +00:00
# ifdef USE_TV
# include "libmpdemux/tv.h"
extern int tv_param_on ;
# endif
2002-01-08 02:01:04 +00:00
//**************************************************************************//
// Playtree
//**************************************************************************//
# include "playtree.h"
play_tree_t * playtree ;
2002-01-14 23:38:49 +00: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 ;
2001-03-30 03:07:45 +00:00
//**************************************************************************//
// Config file
//**************************************************************************//
2001-10-30 17:04:59 +00:00
static int cfg_inc_verbose ( struct config * conf ) { + + verbose ; return 0 ; }
2001-03-19 03:45:49 +00:00
2001-03-19 18:14:21 +00:00
static int cfg_include ( struct config * conf , char * filename ) {
2002-01-14 23:38:49 +00:00
return m_config_parse_config_file ( mconfig , filename ) ;
2001-03-19 18:14:21 +00:00
}
2001-10-30 17:04:59 +00:00
# include "get_path.c"
2001-03-21 00:14:42 +00:00
2001-04-15 03:40:37 +00:00
//**************************************************************************//
2001-04-15 19:13:38 +00:00
//**************************************************************************//
// Input media streaming & demultiplexer:
//**************************************************************************//
2001-07-07 18:46:15 +00:00
static int max_framesize = 0 ;
2002-09-29 19:26:40 +00:00
# include "libmpdemux/stream.h"
# include "libmpdemux/demuxer.h"
# include "libmpdemux/stheader.h"
//#include "parse_es.h"
2001-02-24 20:28:24 +00:00
2002-04-13 19:14:34 +00:00
# include "libmpcodecs/dec_audio.h"
# include "libmpcodecs/dec_video.h"
2002-09-22 02:33:28 +00:00
//#include "libmpcodecs/vf.h"
2001-10-30 17:38:09 +00:00
2001-02-24 20:28:24 +00:00
//**************************************************************************//
//**************************************************************************//
2001-03-16 00:05:52 +00:00
// Common FIFO functions, and keyboard/event FIFO code
# include "fifo.c"
2002-02-28 13:49:04 +00:00
int use_stdin = 0 ;
2001-02-24 20:28:24 +00:00
//**************************************************************************//
2002-07-19 20:51:48 +00:00
vo_functions_t * video_out = NULL ;
2002-02-21 16:02:26 +00:00
ao_functions_t * audio_out = NULL ;
2001-02-24 20:28:24 +00:00
2001-10-30 17:04:59 +00:00
// benchmark:
2001-07-08 00:21:20 +00:00
double video_time_usage = 0 ;
double vout_time_usage = 0 ;
2001-07-07 18:46:15 +00:00
static double audio_time_usage = 0 ;
static int total_time_usage_start = 0 ;
2002-04-14 19:43:23 +00:00
static int total_frame_cnt = 0 ;
static int drop_frame_cnt = 0 ; // total number of dropped frames
2002-02-24 17:10:06 +00:00
int benchmark = 0 ;
2001-06-13 21:55:24 +00:00
2001-06-18 14:19:13 +00:00
// options:
2002-07-25 20:34:33 +00:00
int auto_quality = 0 ;
2001-08-12 15:46:09 +00:00
static int output_quality = 0 ;
2001-08-04 13:52:41 +00:00
2001-08-27 00:55:25 +00:00
int use_gui = 0 ;
2002-08-05 12:57:54 +00:00
int osd_level = 1 ;
2002-09-27 20:57:00 +00:00
int osd_level_saved = - 1 ;
2002-07-02 13:35:04 +00:00
int osd_visible = 100 ;
2001-10-30 17:04:59 +00:00
// seek:
2002-09-29 19:26:40 +00:00
static char * seek_to_sec = NULL ;
static off_t seek_to_byte = 0 ;
static off_t step_sec = 0 ;
static int loop_times = - 1 ;
2002-10-01 22:29:04 +00:00
// A/V sync:
static int autosync = 0 ; // 30 might be a good default value.
2002-09-29 19:26:40 +00:00
// may be changed by GUI: (FIXME!)
2001-10-30 17:04:59 +00:00
float rel_seek_secs = 0 ;
int abs_seek_pos = 0 ;
2001-08-12 15:46:09 +00:00
2001-10-30 17:04:59 +00:00
// codecs:
2002-09-28 18:45:47 +00:00
char * * audio_codec_list = NULL ; // override audio codec
2002-09-26 01:31:18 +00:00
char * * video_codec_list = NULL ; // override video codec
2002-09-28 18:45:47 +00:00
char * * audio_fm_list = NULL ; // override audio codec family
2002-09-26 01:31:18 +00:00
char * * video_fm_list = NULL ; // override video codec family
2001-07-06 21:17:22 +00:00
2001-06-18 14:19:13 +00:00
// streaming:
2001-12-16 21:16:59 +00:00
int audio_id = - 1 ;
int video_id = - 1 ;
2001-12-19 16:55:32 +00:00
int dvdsub_id = - 1 ;
2002-01-10 17:18:30 +00:00
int vobsub_id = - 1 ;
2002-09-29 19:26:40 +00:00
static char * audio_lang = NULL ;
static char * dvdsub_lang = NULL ;
2002-03-29 03:17:57 +00:00
static char * spudec_ifo = NULL ;
2002-06-03 15:06:32 +00:00
int vcd_track = 0 ;
2002-07-03 18:57:52 +00:00
char * filename = NULL ; //"MI2-Trailer.avi";
2001-06-18 14:19:13 +00:00
2001-10-21 23:05:05 +00:00
// cache2:
2002-09-28 18:03:34 +00:00
int stream_cache_size = 0 ;
2001-10-21 23:05:05 +00:00
# ifdef USE_STREAM_CACHE
extern int cache_fill_status ;
# else
# define cache_fill_status 0
# endif
2001-10-30 17:04:59 +00:00
// dump:
2001-12-01 22:54:17 +00:00
static char * stream_dump_name = " stream.dump " ;
2002-07-25 20:34:33 +00:00
int stream_dump_type = 0 ;
2001-10-30 17:04:59 +00:00
// A-V sync:
2001-08-12 20:52:35 +00:00
static float default_max_pts_correction = - 1 ; //0.01f;
static float max_pts_correction = 0 ; //default_max_pts_correction;
2001-10-30 17:04:59 +00:00
static float c_total = 0 ;
2002-07-25 20:34:33 +00:00
float audio_delay = 0 ;
2001-06-18 14:19:13 +00:00
2001-11-14 00:26:28 +00:00
static int softsleep = 0 ;
2001-10-30 17:04:59 +00:00
static float force_fps = 0 ;
static int force_srate = 0 ;
2002-07-25 20:34:33 +00:00
int frame_dropping = 0 ; // option 0=no drop 1= drop vo 2= drop decode
2001-10-30 17:04:59 +00:00
static int play_n_frames = - 1 ;
2002-06-28 17:13:18 +00:00
static int play_n_frames_mf = - 1 ;
2001-06-18 14:19:13 +00:00
// screen info:
2002-09-29 21:53:05 +00:00
char * * video_driver_list = NULL ;
char * * audio_driver_list = NULL ;
2002-03-14 23:28:51 +00:00
2002-09-29 19:26:40 +00:00
extern char * vo_subdevice ;
extern char * ao_subdevice ;
2002-09-20 18:54:22 +00:00
// codec outfmt flags (defined in libmpcodecs/vd.c)
2002-03-14 23:28:51 +00:00
extern int vo_flags ;
2001-06-18 14:19:13 +00: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 17:18:30 +00:00
char * vobsub_name = NULL ;
2001-07-02 19:25:34 +00:00
/*DSP!!char *dsp=NULL;*/
2002-07-25 03:37:28 +00:00
int subcc_enabled = 0 ;
2002-08-29 22:24:49 +00:00
# ifdef USE_SUB
subtitle * subtitles = NULL ;
float sub_last_pts = - 303 ;
# endif
2001-06-18 14:19:13 +00:00
2001-10-20 23:48:56 +00:00
static stream_t * stream = NULL ;
2002-08-21 21:31:20 +00:00
static demuxer_t * demuxer = NULL ;
2002-02-23 15:12:55 +00:00
char * current_module = NULL ; // for debugging
2001-08-22 21:35:44 +00:00
2002-09-29 19:26:40 +00:00
// also modified by Gui/mplayer/gtk/eq.c:
2002-09-27 21:08:36 +00:00
int vo_gamma_gamma = 1000 ;
2002-07-25 13:12:23 +00:00
int vo_gamma_brightness = 1000 ;
int vo_gamma_contrast = 1000 ;
int vo_gamma_saturation = 1000 ;
int vo_gamma_hue = 1000 ;
2002-07-19 20:51:48 +00:00
// ---
2002-03-12 18:02:02 +00:00
# ifdef HAVE_RTC
2002-09-29 19:26:40 +00:00
static int nortc ;
2002-03-12 18:02:02 +00:00
# endif
2001-09-05 10:49:04 +00: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 18:36:50 +00:00
# define INITED_SPUDEC 32
2001-10-20 23:48:56 +00:00
# define INITED_STREAM 64
2002-01-31 09:37:12 +00:00
# define INITED_INPUT 128
2002-05-17 23:47:27 +00:00
# define INITED_VOBSUB 256
2002-08-21 21:31:20 +00:00
# define INITED_DEMUXER 512
2001-09-05 10:49:04 +00:00
# define INITED_ALL 0xFFFF
2002-09-29 19:26:40 +00:00
static void uninit_player ( unsigned int mask ) {
2001-09-05 10:49:04 +00:00
mask = inited_flags & mask ;
2002-03-17 02:28:32 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_DBG2 , " \n *** uninit(0x%X) \n " , mask ) ;
2002-04-25 13:27:15 +00:00
// kill the cache process:
2002-03-17 02:28:32 +00:00
if ( mask & INITED_STREAM ) {
inited_flags & = ~ INITED_STREAM ;
current_module = " uninit_stream " ;
if ( stream ) free_stream ( stream ) ;
stream = NULL ;
}
2002-08-21 21:31:20 +00:00
if ( mask & INITED_DEMUXER ) {
current_module = " uninit_demuxer " ;
if ( demuxer ) free_demuxer ( demuxer ) ;
demuxer = NULL ;
}
2002-04-25 13:27:15 +00:00
if ( mask & INITED_VO ) {
inited_flags & = ~ INITED_VO ;
current_module = " uninit_vo " ;
video_out - > uninit ( ) ;
video_out = NULL ;
}
// must be after libvo uninit, as few vo drivers (svgalib) has tty code
2002-03-17 02:28:32 +00:00
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 ( ) ;
}
2002-05-17 23:47:27 +00:00
if ( mask & INITED_VOBSUB ) {
inited_flags & = ~ INITED_VOBSUB ;
current_module = " uninit_vobsub " ;
vobsub_close ( vo_vobsub ) ;
vo_vobsub = NULL ;
}
2001-11-20 18:36:50 +00:00
if ( mask & INITED_SPUDEC ) {
inited_flags & = ~ INITED_SPUDEC ;
current_module = " uninit_spudec " ;
spudec_free ( vo_spudec ) ;
2002-03-31 02:22:40 +00:00
vo_spudec = NULL ;
2001-11-20 18:36:50 +00:00
}
2002-04-04 14:24:11 +00:00
2001-09-05 10:49:04 +00:00
if ( mask & INITED_AO ) {
inited_flags & = ~ INITED_AO ;
current_module = " uninit_ao " ;
2002-03-17 02:28:32 +00:00
audio_out - > uninit ( ) ; audio_out = NULL ;
2001-09-05 10:49:04 +00:00
}
2001-08-27 23:56:44 +00:00
# ifdef HAVE_NEW_GUI
2001-09-05 10:49:04 +00:00
if ( mask & INITED_GUI ) {
inited_flags & = ~ INITED_GUI ;
current_module = " uninit_gui " ;
2002-02-23 15:12:55 +00:00
guiDone ( ) ;
2001-09-05 10:49:04 +00:00
}
2001-08-27 23:56:44 +00:00
# endif
2002-01-31 09:37:12 +00:00
if ( mask & INITED_INPUT ) {
2002-06-14 17:40:36 +00:00
inited_flags & = ~ INITED_INPUT ;
2002-01-31 09:37:12 +00:00
current_module = " uninit_input " ;
mp_input_uninit ( ) ;
}
2001-09-06 20:44:42 +00:00
current_module = NULL ;
2001-09-05 10:49:04 +00:00
}
void exit_player ( char * how ) {
uninit_player ( INITED_ALL ) ;
2002-05-08 19:21:36 +00:00
# ifdef X11_FULLSCREEN
2002-05-08 20:24:35 +00:00
# ifdef HAVE_NEW_GUI
if ( ! use_gui )
# endif
2002-05-08 19:21:36 +00:00
vo_uninit ( ) ; // close the X11 connection (if any opened)
# endif
2001-09-05 10:49:04 +00:00
current_module = " exit_player " ;
2002-03-15 21:37:10 +00:00
if ( how ) mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_Exiting , mp_gettext ( how ) ) ;
2002-02-17 01:07:45 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_DBG2 , " max framesize was %d bytes \n " , max_framesize ) ;
2001-08-27 23:56:44 +00:00
2001-02-24 20:28:24 +00:00
exit ( 1 ) ;
}
2002-09-29 19:26:40 +00:00
static void exit_sighandler ( int x ) {
2001-02-24 20:28:24 +00:00
static int sig_count = 0 ;
+ + sig_count ;
2002-04-25 13:27:15 +00:00
if ( sig_count = = 5 | | ( inited_flags = = 0 & & sig_count > 1 ) ) exit ( 1 ) ;
if ( sig_count > 5 ) {
2001-02-24 20:28:24 +00:00
// can't stop :(
kill ( getpid ( ) , SIGKILL ) ;
}
2002-03-16 01:56:19 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , " \n " MSGTR_IntBySignal , x ,
2002-03-15 21:37:10 +00:00
current_module ? current_module : mp_gettext ( " unknown " )
2001-02-24 20:28:24 +00:00
) ;
2002-04-25 13:27:15 +00:00
if ( sig_count = = 1 )
2002-03-16 01:56:19 +00:00
switch ( x ) {
case SIGINT :
case SIGQUIT :
case SIGTERM :
case SIGKILL :
break ; // killed from keyboard (^C) or killed [-9]
case SIGILL :
2002-03-16 02:15:10 +00: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-04-25 13:27:15 +00: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/optimized for. Verify this! \n " ) ;
2002-03-16 02:15:10 +00:00
# endif
2002-03-16 01:56:19 +00: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 02:15:10 +00: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 01:56:19 +00:00
}
2001-02-24 20:28:24 +00:00
exit_player ( NULL ) ;
}
2001-10-30 17:04:59 +00:00
//extern void write_avi_header_1(FILE *f,int fcc,float fps,int width,int height);
2001-08-04 13:52:41 +00:00
2002-02-11 11:46:27 +00:00
extern void mp_register_options ( m_config_t * cfg ) ;
2001-04-16 00:09:53 +00:00
# include "mixer.h"
2001-03-18 23:32:31 +00:00
# include "cfg-mplayer.h"
2001-02-24 20:28:24 +00:00
2002-01-14 23:38:49 +00:00
void parse_cfgfiles ( m_config_t * conf )
2001-05-08 12:17:03 +00:00
{
2001-06-05 00:58:51 +00:00
char * conffile ;
int conffile_fd ;
2002-06-24 08:23:48 +00:00
if ( m_config_parse_config_file ( conf , CONFDIR " /mplayer.conf " ) < 0 )
2001-03-18 23:32:31 +00:00
exit ( 1 ) ;
2001-03-21 00:14:42 +00:00
if ( ( conffile = get_path ( " " ) ) = = NULL ) {
2001-08-18 19:52:14 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_WARN , MSGTR_NoHomeDir ) ;
2001-03-18 23:32:31 +00:00
} else {
2001-03-21 00:14:42 +00:00
mkdir ( conffile , 0777 ) ;
free ( conffile ) ;
if ( ( conffile = get_path ( " config " ) ) = = NULL ) {
2001-08-18 19:52:14 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_GetpathProblem ) ;
2001-03-21 00:14:42 +00:00
} else {
if ( ( conffile_fd = open ( conffile , O_CREAT | O_EXCL | O_WRONLY , 0666 ) ) ! = - 1 ) {
2001-08-18 19:51:21 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_CreatingCfgFile , conffile ) ;
2001-03-21 00:14:42 +00:00
write ( conffile_fd , default_config , strlen ( default_config ) ) ;
close ( conffile_fd ) ;
}
2002-01-14 23:38:49 +00:00
if ( m_config_parse_config_file ( conf , conffile ) < 0 )
2001-03-21 00:14:42 +00:00
exit ( 1 ) ;
free ( conffile ) ;
2001-03-19 02:29:37 +00:00
}
2001-02-24 20:28:24 +00:00
}
}
2002-02-23 21:22:55 +00: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 ) {
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 ;
}
2002-08-31 15:04:18 +00:00
/*
* In Mac OS X the SDL - lib is built upon Cocoa . The easiest way to
* make it all work is to use the builtin SDL - bootstrap code , which
* will be done automatically by replacing our main ( ) if we include SDL . h .
*/
# if defined(SYS_DARWIN) && defined(HAVE_SDL)
# include <SDL.h>
# endif
int main ( int argc , char * argv [ ] ) {
2001-05-08 12:17:03 +00:00
2001-07-07 18:46:15 +00:00
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 ;
2002-07-19 20:51:48 +00:00
2001-08-22 19:29:47 +00:00
// for multifile support:
2002-01-08 02:01:04 +00:00
play_tree_iter_t * playtree_iter = NULL ;
2001-08-22 19:29:47 +00:00
2001-06-05 00:58:51 +00:00
int file_format = DEMUXER_TYPE_UNKNOWN ;
2002-01-14 23:38:49 +00:00
2001-06-05 00:58:51 +00:00
int delay_corrected = 1 ;
// movie info:
2002-01-08 02:01:04 +00:00
int eof = 0 ;
2001-06-05 00:58:51 +00:00
int osd_function = OSD_PLAY ;
int osd_last_pts = - 303 ;
2001-12-27 00:59:40 +00:00
int osd_show_av_delay = 0 ;
2001-11-30 23:44:04 +00:00
int osd_show_sub_delay = 0 ;
2001-06-05 00:58:51 +00:00
2001-11-14 00:26:28 +00:00
int rtc_fd = - 1 ;
2001-07-21 01:17:00 +00:00
//float a_frame=0; // Audio
2001-06-05 00:58:51 +00:00
int i ;
2001-08-30 21:14:34 +00:00
int gui_no_filename = 0 ;
2002-03-20 15:22:48 +00:00
mp_msg_init ( ) ;
mp_msg_set_level ( MSGL_STATUS ) ;
2001-08-17 00:40:25 +00:00
2002-03-15 21:37:10 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , banner_text ) ;
2001-10-19 02:00:45 +00:00
/* Test for cpu capabilities (and corresponding OS support) for optimizing */
# ifdef ARCH_X86
GetCpuCaps ( & gCpuCaps ) ;
2002-05-20 01:00:51 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " CPUflags: MMX: %d MMX2: %d 3DNow: %d 3DNow2: %d SSE: %d SSE2: %d \n " ,
gCpuCaps . hasMMX , gCpuCaps . hasMMX2 ,
2001-10-19 02:00:45 +00:00
gCpuCaps . has3DNow , gCpuCaps . has3DNowExt ,
gCpuCaps . hasSSE , gCpuCaps . hasSSE2 ) ;
2001-12-25 17:53:31 +00:00
# ifdef RUNTIME_CPUDETECT
2002-08-05 18:37:14 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_CompiledWithRuntimeDetection ) ;
2001-12-25 17:53:31 +00:00
# else
2002-08-05 18:37:14 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_CompiledWithCPUExtensions ) ;
2001-12-25 17:53:31 +00:00
# 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
2002-05-20 01:00:51 +00:00
# ifdef HAVE_SSE2
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " SSE2 " ) ;
# endif
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " \n \n " ) ;
2001-12-25 17:53:31 +00:00
# endif
2002-04-12 10:40:38 +00:00
# endif
2002-08-22 21:30:31 +00:00
# ifdef USE_TV
2002-04-12 10:40:38 +00:00
tv_param_immediate = 1 ;
2002-08-22 21:30:31 +00:00
# endif
2001-10-19 02:00:45 +00:00
2001-08-27 00:55:25 +00:00
if ( argv [ 0 ] )
if ( ! strcmp ( argv [ 0 ] , " gmplayer " ) | |
( strrchr ( argv [ 0 ] , ' / ' ) & & ! strcmp ( strrchr ( argv [ 0 ] , ' / ' ) , " /gmplayer " ) ) )
use_gui = 1 ;
2001-08-22 21:35:44 +00:00
2002-01-08 02:01:04 +00:00
playtree = play_tree_new ( ) ;
2002-01-14 23:38:49 +00: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 11:46:27 +00:00
mp_register_options ( mconfig ) ;
2002-01-14 23:38:49 +00:00
parse_cfgfiles ( mconfig ) ;
2002-08-15 22:52:52 +00:00
# ifdef HAVE_NEW_GUI
if ( use_gui ) cfg_read ( ) ;
# endif
2002-01-14 23:38:49 +00:00
2002-08-31 15:04:18 +00:00
if ( m_config_parse_command_line ( mconfig , argc , argv ) < 0 ) exit ( 1 ) ; // error parsing cmdline
2002-01-14 23:38:49 +00:00
2002-01-08 02:01:04 +00:00
playtree = play_tree_cleanup ( playtree ) ;
if ( playtree ) {
2002-01-14 23:38:49 +00:00
playtree_iter = play_tree_iter_new ( playtree , mconfig ) ;
2002-01-08 02:01:04 +00: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 02:55:03 +00:00
}
}
2002-01-08 02:01:04 +00:00
2001-08-27 00:55:25 +00:00
# ifndef HAVE_NEW_GUI
if ( use_gui ) {
2001-09-26 21:35:14 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_WARN , MSGTR_NoGui ) ;
2001-08-27 00:55:25 +00:00
use_gui = 0 ;
}
2001-08-27 23:56:44 +00:00
# else
if ( use_gui & & ! vo_init ( ) ) {
2001-09-26 21:35:14 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_WARN , MSGTR_GuiNeedsX ) ;
2001-08-27 23:56:44 +00:00
use_gui = 0 ;
}
2001-08-27 00:55:25 +00:00
# endif
2002-05-13 21:05:03 +00:00
if ( vo_plugin_args & & vo_plugin_args [ 0 ] & & strcmp ( vo_plugin_args [ 0 ] , " help " ) = = 0 ) {
2002-08-05 18:37:14 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_AvailableVideoOutputPlugins ) ;
2002-05-13 21:05:03 +00:00
vf_list_plugins ( ) ;
printf ( " \n " ) ;
exit ( 0 ) ;
}
2002-09-29 21:53:05 +00:00
if ( video_driver_list & & strcmp ( video_driver_list [ 0 ] , " help " ) = = 0 ) {
list_video_out ( ) ;
2001-05-08 12:17:03 +00:00
exit ( 0 ) ;
2001-06-03 00:24:49 +00:00
}
2002-03-14 21:31:25 +00:00
2002-09-29 22:57:54 +00:00
if ( audio_driver_list & & strcmp ( audio_driver_list [ 0 ] , " help " ) = = 0 ) {
list_audio_out ( ) ;
2001-06-03 00:24:49 +00:00
exit ( 0 ) ;
}
2001-08-25 19:11:24 +00:00
2001-09-27 12:59:35 +00:00
// check codec.conf
if ( ! parse_codec_cfg ( get_path ( " codecs.conf " ) ) ) {
2001-12-25 21:59:07 +00:00
if ( ! parse_codec_cfg ( CONFDIR " /codecs.conf " ) ) {
2001-09-27 12:59:35 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_HINT , MSGTR_CopyCodecsConf ) ;
2002-01-01 22:46:07 +00:00
exit ( 0 ) ; // From unknown reason a hangup occurs here :((((((
2001-09-27 12:59:35 +00:00
}
}
2002-09-26 01:31:18 +00:00
#if 0
if ( video_codec_list ) {
int i ;
video_codec = video_codec_list [ 0 ] ;
for ( i = 0 ; video_codec_list [ i ] ; i + + )
printf ( " vc#%d: '%s' \n " , i , video_codec_list [ i ] ) ;
}
# endif
2002-09-28 02:23:20 +00:00
if ( audio_codec_list & & strcmp ( audio_codec_list [ 0 ] , " help " ) = = 0 ) {
2002-08-05 18:37:14 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_AvailableAudioCodecs ) ;
2001-09-27 12:59:35 +00:00
list_codecs ( 1 ) ;
printf ( " \n " ) ;
exit ( 0 ) ;
}
2002-09-26 01:31:18 +00:00
if ( video_codec_list & & strcmp ( video_codec_list [ 0 ] , " help " ) = = 0 ) {
2002-08-05 18:37:14 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_AvailableVideoCodecs ) ;
2001-09-27 12:59:35 +00:00
list_codecs ( 0 ) ;
printf ( " \n " ) ;
exit ( 0 ) ;
}
2002-09-26 01:31:18 +00:00
if ( video_fm_list & & strcmp ( video_fm_list [ 0 ] , " help " ) = = 0 ) {
2002-08-31 13:09:23 +00:00
vfm_help ( ) ;
printf ( " \n " ) ;
exit ( 0 ) ;
}
2002-09-28 02:23:20 +00:00
if ( audio_fm_list & & strcmp ( audio_fm_list [ 0 ] , " help " ) = = 0 ) {
2002-08-31 13:09:23 +00:00
afm_help ( ) ;
printf ( " \n " ) ;
exit ( 0 ) ;
}
2001-09-27 12:59:35 +00:00
2002-03-28 20:40:21 +00:00
if ( ! filename & & ! vcd_track & & ! dvd_title & & ! dvd_nav & & ! tv_param_on ) {
2001-08-30 21:14:34 +00:00
if ( ! use_gui ) {
2001-08-25 19:11:24 +00:00
// no file/vcd/dvd -> show HELP:
2002-03-15 22:25:57 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , help_text ) ;
2001-08-25 19:11:24 +00:00
exit ( 0 ) ;
2001-08-30 21:14:34 +00:00
} else gui_no_filename = 1 ;
2001-08-25 19:11:24 +00:00
}
// Many users forget to include command line in bugreports...
if ( verbose ) {
2002-03-15 22:25:57 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " CommandLine: " ) ;
2001-08-25 19:11:24 +00:00
for ( i = 1 ; i < argc ; i + + ) printf ( " '%s' " , argv [ i ] ) ;
printf ( " \n " ) ;
}
2001-08-22 21:35:44 +00:00
2002-03-20 15:22:48 +00:00
mp_msg_set_level ( verbose + MSGL_STATUS ) ;
2001-08-22 21:35:44 +00:00
//------ load global data first ------
# ifdef USE_OSD
2002-08-28 20:52:02 +00:00
# ifndef HAVE_FREETYPE
// check font
2001-08-22 21:35:44 +00:00
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 ) ;
}
2002-08-28 20:52:02 +00:00
# else
init_freetype ( ) ;
# endif
2001-08-22 21:35:44 +00:00
# endif
2002-04-15 19:17:12 +00:00
vo_init_osd ( ) ;
2001-11-20 07:53:20 +00:00
# ifdef HAVE_RTC
2002-03-12 18:02:02 +00:00
if ( ! nortc )
{
2002-09-23 22:05:09 +00:00
// seteuid(0); /* Can't hurt to try to get root here */
2001-11-14 00:26:28 +00:00
if ( ( rtc_fd = open ( " /dev/rtc " , O_RDONLY ) ) < 0 )
2002-09-23 22:05:09 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_WARN , " Failed to open /dev/rtc: %s (mplayer should be setuid root or /dev/rtc should be readable by the user.) \n " , strerror ( errno ) ) ;
else {
unsigned long irqp = 1024 ; /* 512 seemed OK. 128 is jerky. */
if ( ioctl ( rtc_fd , RTC_IRQP_SET , irqp ) < 0 ) {
mp_msg ( MSGT_CPLAYER , MSGL_WARN , " Linux RTC init error in ioctl (rtc_irqp_set %lu): %s \n " , irqp , strerror ( errno ) ) ;
mp_msg ( MSGT_CPLAYER , MSGL_HINT , " Try adding \" echo %lu > /proc/sys/dev/rtc/max-user-freq \" to your system startup scripts. \n " , irqp ) ;
close ( rtc_fd ) ;
2001-11-14 00:26:28 +00:00
rtc_fd = - 1 ;
} else if ( ioctl ( rtc_fd , RTC_PIE_ON , 0 ) < 0 ) {
/* variable only by the root */
2002-03-15 22:25:57 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , " Linux RTC init error in ioctl (rtc_pie_on): %s \n " , strerror ( errno ) ) ;
2001-11-14 00:26:28 +00:00
close ( rtc_fd ) ;
rtc_fd = - 1 ;
} else
2002-08-05 18:37:14 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_UsingRTCTiming , irqp ) ;
2001-11-14 00:26:28 +00:00
}
2002-03-12 18:02:02 +00:00
}
2002-01-15 17:03:19 +00:00
# ifdef HAVE_NEW_GUI
2001-12-28 02:04:06 +00:00
// breaks DGA and SVGAlib and VESA drivers: --A'rpi
2002-01-15 17:03:19 +00:00
// and now ? -- Pontscho
if ( use_gui ) setuid ( getuid ( ) ) ; // strongly test, please check this.
# endif
2001-11-14 00:26:28 +00:00
if ( rtc_fd < 0 )
# endif
2002-03-15 22:25:57 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " Using %s timing \n " , softsleep ? " software " : " usleep() " ) ;
2001-11-14 00:26:28 +00:00
2001-08-22 21:35:44 +00:00
# ifdef USE_TERMCAP
2001-12-19 16:55:32 +00:00
if ( ! use_gui ) load_termcap ( NULL ) ; // load key-codes
2001-08-22 21:35:44 +00:00
# endif
2001-08-31 22:35:04 +00:00
// ========== Init keyboard FIFO (connection to libvo) ============
make_pipe ( & keyb_fifo_get , & keyb_fifo_put ) ;
2001-08-25 21:05:23 +00:00
2002-01-30 12:46:03 +00:00
// Init input system
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 13:49:04 +00:00
else if ( ! use_stdin )
2002-01-30 12:46:03 +00:00
mp_input_add_key_fd ( 0 , 1 , NULL , NULL ) ;
2002-01-31 09:37:12 +00:00
inited_flags | = INITED_INPUT ;
2002-01-30 12:46:03 +00:00
current_module = NULL ;
2001-08-22 21:35:44 +00:00
//========= Catch terminate signals: ================
// terminate requests:
signal ( SIGTERM , exit_sighandler ) ; // kill
signal ( SIGHUP , exit_sighandler ) ; // kill -HUP / xterm closed
2001-08-28 15:55:02 +00:00
signal ( SIGINT , exit_sighandler ) ; // Interrupt from keyboard
2001-08-22 21:35:44 +00:00
signal ( SIGQUIT , exit_sighandler ) ; // Quit from keyboard
2002-03-27 03:45:55 +00:00
# ifdef ENABLE_SIGHANDLER
2001-08-22 21:35:44 +00:00
// 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()
2002-03-27 03:45:55 +00:00
# endif
2001-08-22 21:35:44 +00:00
2002-03-06 23:54:20 +00:00
# ifdef HAVE_NEW_GUI
if ( use_gui ) {
2002-05-28 11:55:17 +00:00
guiInit ( ) ;
2002-03-06 23:54:20 +00:00
inited_flags | = INITED_GUI ;
2002-03-07 11:57:33 +00:00
guiGetEvent ( guiCEvent , ( char * ) ( ( gui_no_filename ) ? 0 : 1 ) ) ;
2002-03-06 23:54:20 +00:00
}
# endif
2002-05-05 17:22:38 +00:00
// ******************* Now, let's see the per-file stuff ********************
2001-08-22 21:35:44 +00:00
play_next_file :
2001-08-30 21:14:34 +00:00
2002-02-24 12:05:12 +00:00
// We must enable getch2 here to be able to interrupt network connection
// or cache filling
if ( ! use_stdin & & ! slave_mode ) {
2002-05-05 17:22:38 +00:00
if ( inited_flags & INITED_GETCH2 )
mp_msg ( MSGT_CPLAYER , MSGL_WARN , " WARNING: getch2_init called twice! \n " ) ;
else
getch2_enable ( ) ; // prepare stdin for hotkeys...
2002-02-24 12:05:12 +00:00
inited_flags | = INITED_GETCH2 ;
2002-03-17 02:28:32 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_DBG2 , " \n [[[init getch2]]] \n " ) ;
2002-02-24 12:05:12 +00:00
}
2002-02-23 21:22:55 +00:00
2002-05-05 17:22:38 +00:00
// =================== GUI idle loop (STOP state) ===========================
2001-08-29 15:08:43 +00:00
# ifdef HAVE_NEW_GUI
2001-08-30 21:14:34 +00:00
if ( use_gui ) {
2001-12-19 16:55:32 +00:00
2002-04-22 21:36:12 +00:00
guiGetEvent ( guiReDrawSubWindow , 0 ) ;
2002-04-17 21:12:12 +00:00
while ( guiIntfStruct . Playing ! = 1 )
{
2002-02-25 13:14:27 +00:00
mp_cmd_t * cmd ;
2002-07-02 13:35:04 +00:00
usleep ( 20000 ) ;
2002-02-21 22:48:47 +00:00
guiEventHandling ( ) ;
2002-07-02 13:35:04 +00:00
guiGetEvent ( guiReDraw , NULL ) ;
2002-02-25 13:14:27 +00:00
if ( ( cmd = mp_input_get_cmd ( 0 , 0 ) ) ! = NULL ) guiGetEvent ( guiIEvent , ( char * ) cmd - > id ) ;
2002-04-17 21:12:12 +00:00
}
2001-12-17 16:05:36 +00:00
2002-07-03 18:57:52 +00:00
guiGetEvent ( guiSetDefaults , NULL ) ;
2001-12-19 16:55:32 +00:00
2002-04-17 21:12:12 +00:00
if ( ( guiIntfStruct . FilenameChanged | | ! filename )
2002-08-14 23:02:45 +00:00
//#ifdef USE_DVDREAD
// && ( guiIntfStruct.StreamType != STREAMTYPE_DVD )
//#endif
2002-04-17 21:12:12 +00:00
)
2001-12-17 00:07:20 +00:00
{
2002-03-06 18:42:56 +00:00
play_tree_t * entry = play_tree_new ( ) ;
play_tree_add_file ( entry , guiIntfStruct . Filename ) ;
2002-03-07 11:57:33 +00: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 18:42:56 +00:00
{
2002-03-07 11:57:33 +00:00
playtree_iter = play_tree_iter_new ( playtree , mconfig ) ;
2002-03-06 18:42:56 +00: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 ) ;
}
}
guiIntfStruct . FilenameChanged = 0 ;
2002-03-07 11:57:33 +00:00
}
2001-08-30 21:14:34 +00:00
}
# endif
2002-05-05 17:22:38 +00:00
//---------------------------------------------------------------------------
2001-08-30 21:14:34 +00:00
2002-05-20 03:25:26 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " \n " ) ;
2001-09-26 21:35:14 +00:00
if ( filename ) mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_Playing , filename ) ;
2001-08-23 11:33:58 +00:00
2002-05-05 17:22:38 +00:00
//==================== Open VOB-Sub ============================
2002-02-20 22:41:06 +00:00
current_module = " vobsub " ;
if ( vobsub_name ) {
2002-05-17 23:47:27 +00:00
vo_vobsub = vobsub_open ( vobsub_name , spudec_ifo , 1 , & vo_spudec ) ;
2002-02-20 22:41:06 +00: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-05-17 23:47:27 +00:00
vo_vobsub = vobsub_open ( buf , spudec_ifo , 0 , & vo_spudec ) ;
2002-02-20 22:41:06 +00:00
free ( buf ) ;
}
if ( vo_vobsub )
sub_auto = 0 ; // don't do autosub for textsubs if vobsub found
2002-03-17 00:47:15 +00:00
//============ Open & Sync STREAM --- fork cache2 ====================
2002-05-05 17:22:38 +00:00
stream = NULL ;
demuxer = NULL ;
d_audio = NULL ;
d_video = NULL ;
sh_audio = NULL ;
sh_video = NULL ;
2001-08-22 21:35:44 +00:00
current_module = " open_stream " ;
2001-08-09 01:17:24 +00:00
stream = open_stream ( filename , vcd_track , & file_format ) ;
2002-01-08 02:01:04 +00:00
if ( ! stream ) { // error...
2002-02-23 21:22:55 +00:00
eof = libmpdemux_was_interrupted ( PT_NEXT_ENTRY ) ;
goto goto_next_file ;
2002-01-08 02:01:04 +00:00
}
2001-10-20 23:48:56 +00:00
inited_flags | = INITED_STREAM ;
2002-03-17 00:47:15 +00:00
2002-01-08 02:01:04 +00:00
if ( stream - > type = = STREAMTYPE_PLAYLIST ) {
play_tree_t * entry ;
// Handle playlist
2002-03-17 00:47:15 +00:00
current_module = " handle_playlist " ;
2002-01-08 02:01:04 +00: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 21:22:55 +00:00
if ( play_tree_iter_step ( playtree_iter , 1 , 0 ) ! = PLAY_TREE_ITER_ENTRY ) {
eof = PT_NEXT_ENTRY ;
2002-01-08 02:01:04 +00:00
goto goto_next_file ;
2002-02-23 21:22:55 +00: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 02:01:04 +00:00
goto goto_next_file ;
2002-02-23 21:22:55 +00:00
}
2002-01-08 02:01:04 +00:00
}
play_tree_remove ( entry , 1 , 1 ) ;
2002-02-23 21:22:55 +00:00
eof = PT_NEXT_SRC ;
goto goto_next_file ;
2002-01-08 02:01:04 +00:00
}
play_tree_insert_entry ( playtree_iter - > tree , entry ) ;
2002-03-20 10:27:27 +00:00
play_tree_set_params_from ( entry , playtree_iter - > tree ) ;
2002-01-08 02:01:04 +00:00
entry = playtree_iter - > tree ;
2002-02-23 21:22:55 +00:00
if ( play_tree_iter_step ( playtree_iter , 1 , 0 ) ! = PLAY_TREE_ITER_ENTRY ) {
eof = PT_NEXT_ENTRY ;
2002-01-08 02:01:04 +00:00
goto goto_next_file ;
2002-02-23 21:22:55 +00:00
}
2002-01-08 02:01:04 +00:00
play_tree_remove ( entry , 1 , 1 ) ;
2002-02-23 21:22:55 +00:00
eof = PT_NEXT_SRC ;
goto goto_next_file ;
2002-01-08 02:01:04 +00:00
}
2001-08-12 17:28:16 +00:00
stream - > start_pos + = seek_to_byte ;
2001-04-23 21:25:09 +00:00
2002-03-17 00:47:15 +00: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 22:54:17 +00:00
if ( stream_dump_type = = 5 ) {
unsigned char buf [ 4096 ] ;
int len ;
FILE * f ;
2002-03-17 00:47:15 +00:00
current_module = " dumpstream " ;
2002-08-31 15:59:10 +00:00
if ( stream - > type = = STREAMTYPE_STREAM & & stream - > fd < 0 ) {
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , " Cannot dump this stream - no 'fd' available \n " ) ;
exit_player ( MSGTR_Exit_error ) ;
}
2001-12-01 22:54:17 +00: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 00:39:54 +00:00
# ifdef USE_DVDREAD
2002-03-31 19:20:01 +00:00
if ( stream - > type = = STREAMTYPE_DVD ) {
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 ;
}
2002-01-20 00:39:54 +00:00
# endif
2002-04-04 14:44:47 +00:00
# ifdef USE_DVDNAV
if ( dvd_nav ) stream_cache_size = 0 ; // must disable caching...
# endif
2002-03-17 00:47:15 +00: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 20:28:24 +00:00
2002-03-17 00:47:15 +00:00
//============ Open DEMUXERS --- DETECT file type =======================
2001-12-01 22:54:17 +00:00
2001-08-22 21:35:44 +00:00
current_module = " demux_open " ;
2001-08-12 15:46:09 +00:00
demuxer = demux_open ( stream , file_format , audio_id , video_id , dvdsub_id ) ;
2001-08-22 23:48:18 +00:00
if ( ! demuxer ) goto goto_next_file ; // exit_player(MSGTR_Exit_error); // ERROR
2001-07-21 22:37:55 +00:00
2002-08-21 21:31:20 +00:00
inited_flags | = INITED_DEMUXER ;
2002-03-18 01:49:42 +00:00
current_module = " demux_open2 " ;
2001-08-23 13:21:21 +00:00
//file_format=demuxer->file_format;
2001-07-21 22:37:55 +00:00
2001-02-24 20:28:24 +00:00
d_audio = demuxer - > audio ;
d_video = demuxer - > video ;
2001-04-20 23:00:11 +00:00
d_dvdsub = demuxer - > sub ;
2001-02-24 20:28:24 +00:00
2001-05-13 22:45:21 +00:00
// DUMP STREAMS:
2002-05-27 17:30:46 +00:00
if ( ( stream_dump_type ) & & ( stream_dump_type < 4 ) ) {
2001-05-13 22:45:21 +00:00
FILE * f ;
demux_stream_t * ds = NULL ;
2001-08-22 21:35:44 +00:00
current_module = " dump " ;
2001-05-13 22:45:21 +00:00
// select stream to dump
switch ( stream_dump_type ) {
case 1 : ds = d_audio ; break ;
case 2 : ds = d_video ; break ;
2002-01-24 15:17:12 +00:00
case 3 : ds = d_dvdsub ; break ;
2001-05-13 22:45:21 +00:00
}
if ( ! ds ) {
2001-08-18 19:51:21 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_DumpSelectedSteramMissing ) ;
2001-08-22 21:35:44 +00:00
exit_player ( MSGTR_Exit_error ) ;
2001-05-13 22:45:21 +00: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 22:54:17 +00:00
f = fopen ( stream_dump_name , " wb " ) ;
2001-08-22 21:35:44 +00:00
if ( ! f ) {
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_CantOpenDumpfile ) ;
exit_player ( MSGTR_Exit_error ) ;
}
2001-05-13 22:45:21 +00:00
while ( ! ds - > eof ) {
unsigned char * start ;
int in_size = ds_get_packet ( ds , & start ) ;
2001-10-06 00:59:45 +00:00
if ( ( demuxer - > file_format = = DEMUXER_TYPE_AVI | | demuxer - > file_format = = DEMUXER_TYPE_ASF | | demuxer - > file_format = = DEMUXER_TYPE_MOV )
2001-06-29 21:35:30 +00:00
& & stream_dump_type = = 2 ) fwrite ( & in_size , 1 , 4 , f ) ;
2001-05-13 22:45:21 +00:00
if ( in_size > 0 ) fwrite ( start , in_size , 1 , f ) ;
}
fclose ( f ) ;
2001-08-18 19:51:21 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_CoreDumped ) ;
2001-08-22 21:35:44 +00:00
exit_player ( MSGTR_Exit_eof ) ;
2001-05-13 22:45:21 +00:00
}
2001-07-21 22:37:55 +00:00
sh_audio = d_audio - > sh ;
sh_video = d_video - > sh ;
2001-05-13 22:45:21 +00:00
2001-07-21 22:37:55 +00:00
if ( sh_video ) {
2001-02-24 20:28:24 +00:00
2002-03-17 00:47:15 +00:00
current_module = " video_read_properties " ;
2002-02-08 16:00:14 +00:00
if ( ! video_read_properties ( sh_video ) ) {
2002-08-05 18:37:14 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_CannotReadVideoPropertiers ) ;
2002-02-08 16:00:14 +00:00
sh_video = d_video - > sh = NULL ;
} else {
2002-05-20 03:25:26 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_V , " [V] filefmt:%d fourcc:0x%X size:%dx%d fps:%5.2f ftime:=%6.4f \n " ,
2002-02-08 16:00:14 +00:00
demuxer - > file_format , sh_video - > format , sh_video - > disp_w , sh_video - > disp_h ,
sh_video - > fps , sh_video - > frametime
) ;
2002-02-09 01:29:11 +00:00
/* 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 ;
}
2002-09-29 21:53:05 +00:00
vo_fps = sh_video - > fps ;
# ifdef X11_FULLSCREEN
vo_mouse_timer_const = ( int ) sh_video - > fps ;
# endif
2002-02-09 01:29:11 +00:00
2002-02-08 16:00:14 +00:00
if ( ! sh_video - > fps & & ! force_fps ) {
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_FPSnotspecified ) ;
sh_video = d_video - > sh = NULL ;
}
2001-07-21 22:37:55 +00:00
}
}
2001-04-14 03:12:06 +00:00
2001-02-24 20:28:24 +00:00
fflush ( stdout ) ;
2002-02-08 16:00:14 +00:00
if ( ! sh_video & & ! sh_audio ) {
2002-08-05 18:37:14 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_NoStreamFound ) ;
2001-08-22 23:48:18 +00:00
goto goto_next_file ; // exit_player(MSGTR_Exit_error);
2001-05-12 01:57:18 +00:00
}
2002-03-17 00:47:15 +00:00
/* display clip info */
demux_info_print ( demuxer ) ;
//================== Read SUBTITLES (DVD & TEXT) ==========================
2002-05-17 23:47:27 +00:00
if ( d_dvdsub - > id > = 0 & & vo_spudec = = NULL & & sh_video ) {
2002-02-08 16:00:14 +00:00
2002-03-29 03:17:57 +00:00
if ( spudec_ifo ) {
unsigned int palette [ 16 ] , width , height ;
2002-04-04 14:44:47 +00:00
current_module = " spudec_init_vobsub " ;
2002-07-08 21:44:51 +00:00
if ( vobsub_parse_ifo ( NULL , spudec_ifo , palette , & width , & height , 1 , - 1 , NULL ) > = 0 )
2002-03-29 03:17:57 +00:00
vo_spudec = spudec_new_scaled ( palette , sh_video - > disp_w , sh_video - > disp_h ) ;
}
2002-04-04 14:44:47 +00:00
# ifdef USE_DVDNAV
if ( vo_spudec = = NULL & & stream - > type = = STREAMTYPE_DVDNAV ) {
current_module = " spudec_init_dvdnav " ;
vo_spudec = spudec_new_scaled ( dvdnav_stream_get_palette ( ( dvdnav_priv_t * ) ( stream - > priv ) ) ,
sh_video - > disp_w , sh_video - > disp_h ) ;
}
# endif
2002-01-11 12:14:29 +00:00
# ifdef USE_DVDREAD
2002-04-04 14:44:47 +00:00
if ( vo_spudec = = NULL & & stream - > type = = STREAMTYPE_DVD ) {
current_module = " spudec_init_dvdread " ;
vo_spudec = spudec_new_scaled ( ( ( dvd_priv_t * ) ( stream - > priv ) ) - > cur_pgc - > palette ,
2002-01-11 12:14:29 +00:00
sh_video - > disp_w , sh_video - > disp_h ) ;
2002-03-30 23:18:40 +00:00
}
2002-01-20 00:39:54 +00:00
# endif
2002-04-04 14:44:47 +00:00
if ( vo_spudec = = NULL ) {
current_module = " spudec_init_normal " ;
vo_spudec = spudec_new_scaled ( NULL , sh_video - > disp_w , sh_video - > disp_h ) ;
2002-05-17 23:47:27 +00:00
spudec_set_font_factor ( vo_spudec , font_factor ) ;
2002-04-04 14:44:47 +00:00
}
2002-03-31 02:22:40 +00:00
if ( vo_spudec ! = NULL )
inited_flags | = INITED_SPUDEC ;
2002-01-20 00:39:54 +00:00
2002-05-17 23:47:27 +00:00
}
2002-01-08 14:10:22 +00:00
# ifdef USE_SUB
2002-05-17 23:47:27 +00:00
if ( sh_video ) {
2002-01-09 16:35:24 +00:00
// after reading video params we should load subtitles because
2002-01-08 14:10:22 +00:00
// we know fps so now we can adjust subtitles time to ~6 seconds AST
2002-01-09 16:35:24 +00:00
// check .sub
2002-03-17 00:47:15 +00: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 )
2002-07-25 20:34:33 +00:00
: " default.sub " , sh_video - > fps ) ;
2002-01-09 16:35:24 +00:00
}
if ( subtitles & & stream_dump_type = = 3 ) list_sub_file ( subtitles ) ;
if ( subtitles & & stream_dump_type = = 4 ) dump_mpsub ( subtitles , sh_video - > fps ) ;
2002-07-25 18:05:08 +00:00
if ( subtitles & & stream_dump_type = = 6 ) dump_srt ( subtitles , sh_video - > fps ) ;
2002-09-21 17:23:46 +00:00
if ( subtitles & & stream_dump_type = = 7 ) dump_microdvd ( subtitles , sh_video - > fps ) ;
2002-03-17 00:47:15 +00:00
}
2002-05-17 23:47:27 +00:00
# endif
2001-04-07 21:27:57 +00:00
//================== Init AUDIO (codec) ==========================
2001-07-21 01:17:00 +00:00
if ( sh_audio ) {
2001-04-07 21:27:57 +00:00
// Go through the codec.conf and find the best codec...
2002-09-25 23:45:34 +00:00
current_module = " init_audio_codec " ;
2002-08-31 15:44:41 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " ========================================================================== \n " ) ;
2002-09-28 02:23:20 +00:00
if ( ! init_best_audio_codec ( sh_audio , audio_codec_list , audio_fm_list ) ) {
2002-09-25 23:45:34 +00:00
sh_audio = d_audio - > sh = NULL ; // failed to init :(
2001-04-07 21:27:57 +00:00
}
2002-09-25 23:45:34 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " ========================================================================== \n " ) ;
2001-04-07 21:27:57 +00:00
}
2002-09-25 23:45:34 +00:00
if ( ! sh_video ) goto main ; // audio-only
2001-04-07 21:27:57 +00:00
2001-02-24 20:28:24 +00:00
//================== Init VIDEO (codec & libvo) ==========================
2002-03-17 02:28:32 +00:00
current_module = " preinit_libvo " ;
2002-04-07 02:12:15 +00:00
vo_config_count = 0 ;
2002-09-29 21:53:05 +00:00
//if((video_out->preinit(vo_subdevice))!=0){
if ( ! ( video_out = init_best_video_out ( video_driver_list ) ) ) {
2002-08-05 18:37:14 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_ErrorInitializingVODevice ) ;
2002-03-17 02:28:32 +00:00
goto goto_next_file ; // exit_player(MSGTR_Exit_error);
}
2002-03-14 23:28:51 +00:00
sh_video - > video_out = video_out ;
2002-03-17 02:28:32 +00:00
inited_flags | = INITED_VO ;
2002-04-06 22:05:01 +00:00
current_module = " init_video_filters " ;
2002-09-29 19:26:40 +00:00
sh_video - > vfilter = ( void * ) vf_open_filter ( NULL , " vo " , video_out ) ;
sh_video - > vfilter = ( void * ) append_filters ( sh_video - > vfilter ) ;
2002-04-06 22:05:01 +00:00
2002-03-17 02:28:32 +00:00
current_module = " init_video_codec " ;
2001-04-17 18:37:15 +00:00
2002-09-25 23:45:34 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " ========================================================================== \n " ) ;
2002-09-26 01:31:18 +00:00
init_best_video_codec ( sh_video , video_codec_list , video_fm_list ) ;
2002-03-18 01:49:42 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " ========================================================================== \n " ) ;
if ( ! sh_video - > inited ) {
if ( ! sh_audio ) goto goto_next_file ;
sh_video = d_video - > sh = NULL ;
goto main ; // exit_player(MSGTR_Exit_error);
2001-02-24 20:28:24 +00:00
}
2001-08-04 13:52:41 +00: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 00:40:25 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_V , " AutoQ: setting quality to %d \n " , output_quality ) ;
2001-08-04 13:52:41 +00:00
set_video_quality ( sh_video , output_quality ) ;
}
2001-04-14 03:12:06 +00:00
// ========== Init display (sh_video->disp_w*sh_video->disp_h/out_fmt) ============
2001-02-24 20:28:24 +00:00
2002-07-24 18:19:39 +00:00
current_module = " init_vo " ;
2002-07-25 13:12:23 +00:00
if ( sh_video )
{
2002-09-27 21:08:36 +00:00
if ( vo_gamma_gamma ! = 1000 )
set_video_colors ( sh_video , " gamma " , vo_gamma_gamma ) ;
2002-07-25 13:12:23 +00:00
if ( vo_gamma_brightness ! = 1000 )
set_video_colors ( sh_video , " brightness " , vo_gamma_brightness ) ;
if ( vo_gamma_contrast ! = 1000 )
set_video_colors ( sh_video , " contrast " , vo_gamma_contrast ) ;
if ( vo_gamma_saturation ! = 1000 )
set_video_colors ( sh_video , " saturation " , vo_gamma_saturation ) ;
if ( vo_gamma_hue ! = 1000 )
set_video_colors ( sh_video , " hue " , vo_gamma_hue ) ;
}
2002-07-19 20:51:48 +00:00
2002-05-17 23:47:27 +00:00
if ( vo_flags & 0x08 & & vo_spudec )
spudec_set_hw_spu ( vo_spudec , video_out ) ;
2002-08-28 20:52:02 +00:00
# ifdef HAVE_FREETYPE
force_load_font = 1 ;
# endif
2001-02-24 20:28:24 +00:00
//================== MAIN: ==========================
2002-09-25 23:45:34 +00:00
main :
current_module = " main " ;
2002-09-27 20:57:00 +00:00
// If there is no video OSD has to be disabled.
// In case of playing a playtree we have to restore the
// old OSD level after playing one or more audio-only files.
if ( ! sh_video & & osd_level > 0 ) { // save OSD level only once
osd_level_saved = osd_level ;
osd_level = 0 ;
} else if ( osd_level_saved > - 1 ) { // if there is a saved OSD level, restore it
osd_level = osd_level_saved ;
osd_level_saved = - 1 ;
}
2001-05-10 03:39:54 +00:00
2002-03-17 02:28:32 +00:00
fflush ( stdout ) ;
2002-03-17 00:47:15 +00:00
2002-04-22 21:36:12 +00:00
# ifdef HAVE_NEW_GUI
if ( use_gui )
{
2002-06-03 15:06:32 +00:00
guiGetEvent ( guiSetStream , ( char * ) stream ) ;
2002-07-25 20:34:33 +00:00
guiGetEvent ( guiSetFileName , filename ) ;
2002-04-22 21:36:12 +00:00
if ( sh_audio ) guiIntfStruct . AudioType = sh_audio - > channels ; else guiIntfStruct . AudioType = 0 ;
2002-07-25 20:34:33 +00:00
if ( ! sh_video & & sh_audio ) guiGetEvent ( guiSetAudioOnly , ( char * ) 1 ) ; else guiGetEvent ( guiSetAudioOnly , ( char * ) 0 ) ;
2002-08-14 23:02:45 +00:00
guiGetEvent ( guiSetFileFormat , ( char * ) demuxer - > file_format ) ;
if ( guiGetEvent ( guiSetValues , ( char * ) sh_video ) ) goto goto_next_file ;
2002-04-22 21:36:12 +00:00
}
# endif
2002-03-17 00:47:15 +00:00
{
2001-07-29 17:42:06 +00:00
//int frame_corr_num=0; //
2001-07-21 01:17:00 +00:00
//float v_frame=0; // Video
2001-02-24 20:28:24 +00:00
float time_frame = 0 ; // Timer
2001-07-28 20:33:51 +00:00
//float num_frames=0; // number of frames played
2001-07-23 20:02:58 +00:00
int grab_frames = 0 ;
2001-03-25 04:27:39 +00:00
char osd_text_buffer [ 64 ] ;
2002-04-14 01:20:26 +00:00
int drop_frame = 0 ; // current dropping status
int dropped_frames = 0 ; // how many frames dropped since last non-dropped frame
2001-11-14 00:26:28 +00:00
int too_slow_frame_cnt = 0 ;
int too_fast_frame_cnt = 0 ;
2001-08-04 13:52:41 +00:00
// for auto-quality:
2001-08-10 01:27:02 +00:00
float AV_delay = 0 ; // average of A-V timestamp differences
2001-08-04 13:52:41 +00:00
double vdecode_time ;
2002-05-09 08:59:07 +00:00
unsigned int lastframeout_ts = 0 ;
2001-11-14 00:26:28 +00:00
float time_frame_corr_avg = 0 ;
2001-02-24 20:28:24 +00:00
2002-05-02 02:03:59 +00:00
float next_frame_time = 0 ;
int frame_time_remaining = 0 ; // flag
int blit_frame = 0 ;
2002-05-09 08:59:07 +00:00
osd_text_buffer [ 0 ] = 0 ;
2001-02-24 20:28:24 +00:00
//================ SETUP AUDIO ==========================
2001-07-21 01:17:00 +00:00
if ( sh_audio ) {
2002-09-29 22:57:54 +00:00
//const ao_info_t *info=audio_out->info;
current_module = " ao2_init " ;
if ( ! ( audio_out = init_best_audio_out ( audio_driver_list ,
( ao_plugin_cfg . plugin_list ) , // plugin flag
2001-06-27 11:39:17 +00:00
force_srate ? force_srate : sh_audio - > samplerate ,
2002-09-29 22:57:54 +00:00
sh_audio - > channels , sh_audio - > sample_format , 0 ) ) ) {
// FAILED:
2001-08-18 19:51:21 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_CannotInitAO ) ;
2002-09-29 22:57:54 +00:00
sh_audio = d_audio - > sh = NULL ; // -> nosound
2001-09-05 10:49:04 +00:00
} else {
2002-09-29 22:57:54 +00:00
// SUCCESS:
2001-09-05 10:49:04 +00:00
inited_flags | = INITED_AO ;
2002-09-29 22:57:54 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " AO: [%s] %iHz %dch %s \n " ,
audio_out - > info - > short_name ,
force_srate ? force_srate : sh_audio - > samplerate ,
sh_audio - > channels ,
audio_out_format_name ( sh_audio - > sample_format ) ) ;
mp_msg ( MSGT_CPLAYER , MSGL_V , MSGTR_AODescription_AOAuthor ,
audio_out - > info - > name , audio_out - > info - > author ) ;
if ( strlen ( audio_out - > info - > comment ) > 0 )
mp_msg ( MSGT_CPLAYER , MSGL_V , MSGTR_AOComment , audio_out - > info - > comment ) ;
2001-05-10 03:39:54 +00:00
}
2001-02-24 20:28:24 +00:00
}
2002-03-17 00:47:15 +00:00
current_module = " av_init " ;
if ( sh_video ) sh_video - > timer = 0 ;
if ( sh_audio ) sh_audio - > timer = - audio_delay ;
2001-02-24 20:28:24 +00:00
2001-07-21 01:17:00 +00:00
if ( ! sh_audio ) {
2001-09-26 21:35:14 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_NoSound ) ;
2001-08-17 00:40:25 +00:00
if ( verbose ) mp_msg ( MSGT_CPLAYER , MSGL_V , " Freeing %d unused audio chunks \n " , d_audio - > packs ) ;
2001-02-24 20:28:24 +00:00
ds_free_packs ( d_audio ) ; // free buffered chunks
d_audio - > id = - 2 ; // do not read audio chunks
2002-03-17 02:28:32 +00:00
uninit_player ( INITED_AO ) ; // close device
2001-02-24 20:28:24 +00:00
}
2002-03-17 00:47:15 +00:00
if ( ! sh_video ) {
2002-08-05 18:37:14 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_Video_NoVideo ) ;
2002-02-08 16:00:14 +00:00
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 02:28:32 +00:00
uninit_player ( INITED_VO ) ;
2002-03-17 00:47:15 +00:00
}
2001-02-24 20:28:24 +00:00
2002-05-25 11:40:29 +00:00
if ( ! sh_video & & ! sh_audio )
goto goto_next_file ;
2001-08-23 13:21:21 +00:00
if ( demuxer - > file_format ! = DEMUXER_TYPE_AVI ) pts_from_bps = 0 ; // it must be 0 for mpeg/asf!
2001-04-14 03:12:06 +00:00
if ( force_fps ) {
2002-02-09 01:29:11 +00:00
vo_fps = sh_video - > fps = force_fps ;
2001-04-14 03:12:06 +00:00
sh_video - > frametime = 1.0f / sh_video - > fps ;
2001-09-26 21:35:14 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_FPSforced , sh_video - > fps , sh_video - > frametime ) ;
2001-04-14 03:12:06 +00:00
}
2001-02-24 20:28:24 +00:00
2001-08-22 21:35:44 +00:00
//==================== START PLAYING =======================
2001-08-18 19:51:21 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_StartPlaying ) ; fflush ( stdout ) ;
2001-02-24 20:28:24 +00:00
InitTimer ( ) ;
2002-04-04 14:44:47 +00:00
# ifdef USE_DVDNAV
if ( dvd_nav & & stream - > type = = STREAMTYPE_DVDNAV ) {
dvdnav_stream_fullstart ( ( dvdnav_priv_t * ) stream - > priv ) ;
}
# endif
2001-06-13 21:55:24 +00:00
total_time_usage_start = GetTimer ( ) ;
2002-01-01 22:46:07 +00:00
audio_time_usage = 0 ; video_time_usage = 0 ; vout_time_usage = 0 ;
2002-06-28 16:33:46 +00:00
total_frame_cnt = 0 ; drop_frame_cnt = 0 ; // fix for multifile fps benchmark
2002-06-28 17:13:18 +00:00
play_n_frames = play_n_frames_mf ;
if ( play_n_frames = = 0 ) {
eof = PT_NEXT_ENTRY ; goto goto_next_file ;
}
2001-02-24 20:28:24 +00:00
while ( ! eof ) {
2001-08-04 13:52:41 +00:00
float aq_sleep_time = 0 ;
2001-02-24 20:28:24 +00:00
2001-06-13 21:57:36 +00:00
if ( play_n_frames > = 0 ) {
- - play_n_frames ;
2002-08-09 17:47:54 +00:00
if ( play_n_frames < 0 ) eof = PT_NEXT_ENTRY ;
2001-06-13 21:57:36 +00:00
}
2001-02-24 20:28:24 +00:00
/*========================== PLAY AUDIO ============================*/
2002-04-13 22:16:15 +00:00
2001-07-21 01:17:00 +00:00
while ( sh_audio ) {
2001-05-10 03:39:54 +00:00
unsigned int t ;
2002-02-24 11:23:48 +00:00
double tt ;
2001-11-05 02:53:53 +00:00
int playsize ;
2002-04-13 22:16:15 +00:00
current_module = " play_audio " ;
2001-11-05 02:53:53 +00:00
2001-11-24 05:29:56 +00:00
ao_data . pts = sh_audio - > timer * 90000.0 ;
2001-11-05 02:53:53 +00:00
playsize = audio_out - > get_space ( ) ;
2001-05-10 03:39:54 +00:00
2002-04-13 22:16:15 +00:00
// handle audio-only case:
if ( ! playsize & & ! sh_video ) { // buffer is full, do not block here!!!
2002-02-23 21:22:55 +00:00
usec_sleep ( 10000 ) ; // Wait a tick before retry
continue ;
}
2001-05-10 03:39:54 +00:00
if ( playsize > MAX_OUTBURST ) playsize = MAX_OUTBURST ; // we shouldn't exceed it!
2001-04-06 01:18:59 +00:00
2002-04-13 22:16:15 +00:00
// Fill buffer if needed:
2001-02-24 20:28:24 +00:00
current_module = " decode_audio " ; // Enter AUDIO decoder module
2001-08-22 21:35:44 +00:00
t = GetTimer ( ) ;
2001-05-10 03:39:54 +00: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-04-13 22:16:15 +00:00
if ( ret < = 0 ) break ; // EOF?
sh_audio - > a_buffer_len + = ret ;
2001-02-24 20:28:24 +00:00
}
2002-02-24 11:23:48 +00:00
t = GetTimer ( ) - t ;
2002-04-13 22:16:15 +00:00
tt = t * 0.000001f ; audio_time_usage + = tt ;
2001-05-10 03:39:54 +00:00
if ( playsize > sh_audio - > a_buffer_len ) playsize = sh_audio - > a_buffer_len ;
2002-04-13 22:16:15 +00:00
// play audio:
current_module = " play_audio " ;
2001-06-02 23:30:26 +00:00
playsize = audio_out - > play ( sh_audio - > a_buffer , playsize , 0 ) ;
2001-02-24 20:28:24 +00:00
2001-06-02 23:30:26 +00:00
if ( playsize > 0 ) {
2001-05-10 03:39:54 +00:00
sh_audio - > a_buffer_len - = playsize ;
2002-09-22 17:17:29 +00:00
memmove ( sh_audio - > a_buffer , & sh_audio - > a_buffer [ playsize ] , sh_audio - > a_buffer_len ) ;
2001-07-21 01:17:00 +00:00
sh_audio - > timer + = playsize / ( float ) ( sh_audio - > o_bps ) ;
2001-02-24 20:28:24 +00:00
}
break ;
2002-04-13 22:16:15 +00:00
} // while(sh_audio)
2001-02-24 20:28:24 +00:00
2002-02-08 16:00:14 +00:00
if ( ! sh_video ) {
2002-04-13 22:16:15 +00:00
// handle audio-only case:
2002-02-08 16:00:14 +00:00
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
) ;
2002-04-13 22:16:15 +00:00
if ( d_audio - > eof ) eof = PT_NEXT_ENTRY ;
} else {
2002-02-08 16:00:14 +00:00
2001-02-24 20:28:24 +00:00
/*========================== PLAY VIDEO ============================*/
2002-05-02 02:03:59 +00:00
float frame_time = next_frame_time ;
2002-04-13 22:16:15 +00:00
2002-05-02 02:03:59 +00:00
vo_pts = sh_video - > timer * 90000.0 ;
vo_fps = sh_video - > fps ;
2001-08-04 13:52:41 +00:00
2002-05-02 02:03:59 +00:00
if ( ! frame_time_remaining ) {
2001-10-30 20:36:20 +00:00
//-------------------- Decode a frame: -----------------------
vdecode_time = video_time_usage ;
2002-04-19 06:21:41 +00:00
while ( 1 )
2001-10-30 20:36:20 +00:00
{ unsigned char * start = NULL ;
int in_size ;
// get it!
current_module = " video_read_frame " ;
2002-05-02 02:03:59 +00:00
in_size = video_read_frame ( sh_video , & next_frame_time , & start , force_fps ) ;
2001-10-30 20:36:20 +00:00
if ( in_size < 0 ) { eof = 1 ; break ; }
if ( in_size > max_framesize ) max_framesize = in_size ; // stats
2002-04-14 01:20:26 +00:00
sh_video - > timer + = frame_time ;
time_frame + = frame_time ; // for nosound
// check for frame-drop:
2002-04-15 22:41:28 +00:00
current_module = " check_framedrop " ;
2002-04-14 01:20:26 +00:00
if ( sh_audio & & ! d_audio - > eof ) {
float delay = audio_out - > get_delay ( ) ;
float d = ( sh_video - > timer ) - ( sh_audio - > timer - delay ) ;
// we should avoid dropping to many frames in sequence unless we
// are too late. and we allow 100ms A-V delay here:
if ( d < - dropped_frames * frame_time - 0.100 ) {
drop_frame = frame_dropping ;
+ + drop_frame_cnt ;
+ + dropped_frames ;
} else {
drop_frame = dropped_frames = 0 ;
}
2002-04-14 19:43:23 +00:00
+ + total_frame_cnt ;
2002-04-14 01:20:26 +00:00
}
2001-10-30 20:36:20 +00:00
// decode:
current_module = " decode_video " ;
// printf("Decode! %p %d \n",start,in_size);
2002-04-06 22:05:01 +00:00
blit_frame = decode_video ( sh_video , start , in_size , drop_frame ) ;
2002-04-19 06:21:41 +00:00
break ;
2001-07-08 00:21:20 +00:00
}
2001-10-30 20:36:20 +00:00
vdecode_time = video_time_usage - vdecode_time ;
//------------------------ frame decoded. --------------------
2002-04-13 22:16:15 +00:00
mp_dbg ( MSGT_AVSYNC , MSGL_DBG2 , " *** ftime=%5.3f *** \n " , frame_time ) ;
2002-05-01 22:37:59 +00:00
if ( sh_video - > vf_inited < 0 ) {
2002-08-05 18:37:14 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_NotInitializeVOPorVO ) ;
2002-05-01 22:37:59 +00:00
eof = 1 ; goto goto_next_file ;
}
2002-05-02 02:03:59 +00:00
}
2002-04-13 22:16:15 +00:00
// ==========================================================================
2001-10-30 20:36:20 +00:00
2002-04-15 22:41:28 +00:00
// current_module="draw_osd";
// if(vo_config_count) video_out->draw_osd();
2001-02-24 20:28:24 +00:00
2002-04-13 22:16:15 +00:00
# ifdef HAVE_NEW_GUI
if ( use_gui ) guiEventHandling ( ) ;
# endif
2001-05-10 03:39:54 +00:00
2002-04-13 22:16:15 +00:00
current_module = " calc_sleep_time " ;
2001-05-13 03:00:57 +00:00
2002-04-14 01:20:26 +00:00
#if 0
{ // debug frame dropping code
2001-11-24 05:29:56 +00:00
float delay = audio_out - > get_delay ( ) ;
2002-04-14 01:20:26 +00:00
mp_msg ( MSGT_AVSYNC , MSGL_V , " \r [V] %5.3f [A] %5.3f => {%5.3f} (%5.3f) [%d] \n " ,
sh_video - > timer , sh_audio - > timer - delay ,
sh_video - > timer - ( sh_audio - > timer - delay ) ,
delay , drop_frame ) ;
}
# endif
2002-10-01 22:29:04 +00:00
if ( drop_frame & & ! frame_time_remaining & & ! autosync ) {
/*
* Note : time_frame should not be forced to 0 in autosync mode .
* It is used as a cumulative counter to predict and correct the
* delay measurements from the audio driver . time_frame is already
* < 0 , so the " time to sleep " code does not actually sleep . Also ,
* blit_frame is already 0 because drop_frame was true when
* decode_video was called ( which causes it to set blit_frame to 0. )
* When autosync = = 0 , the default behavior is still completely unchanged .
*/
2002-04-13 22:16:15 +00:00
time_frame = 0 ; // don't sleep!
blit_frame = 0 ; // don't display!
2001-05-14 09:35:51 +00:00
} else {
2001-05-13 03:00:57 +00:00
2002-04-14 01:20:26 +00:00
// It's time to sleep...
2002-05-02 02:03:59 +00:00
frame_time_remaining = 0 ;
2001-05-13 03:00:57 +00:00
time_frame - = GetRelativeTime ( ) ; // reset timer
2001-05-10 03:39:54 +00:00
2001-07-21 01:17:00 +00:00
if ( sh_audio & & ! d_audio - > eof ) {
2001-11-24 05:29:56 +00:00
float delay = audio_out - > get_delay ( ) ;
mp_dbg ( MSGT_AVSYNC , MSGL_DBG2 , " delay=%f \n " , delay ) ;
2001-11-14 00:26:28 +00:00
2002-10-01 22:29:04 +00:00
if ( autosync ) {
/*
* Adjust this raw delay value by calculating the expected
* delay for this frame and generating a new value which is
* weighted between the two . The higher autosync is , the
* closer to the delay value gets to that which " -nosound "
* would have used , and the longer it will take for A / V
* sync to settle at the right value ( but it eventually will . )
* This settling time is very short for values below 100.
*/
float predicted = sh_audio - > timer - sh_video - > timer + time_frame ;
float difference = delay - predicted ;
delay = predicted + difference / ( float ) autosync ;
}
2001-07-21 01:17:00 +00:00
time_frame = sh_video - > timer ;
2001-11-24 05:29:56 +00:00
time_frame - = sh_audio - > timer - delay ;
2002-09-23 22:12:29 +00:00
// delay = amount of audio buffered in soundcard/driver
2002-05-02 02:03:59 +00:00
if ( delay > 0.25 ) delay = 0.25 ; else
if ( delay < 0.10 ) delay = 0.10 ;
if ( time_frame > delay * 0.6 ) {
// sleep time too big - may cause audio drops (buffer underrun)
frame_time_remaining = 1 ;
time_frame = delay * 0.5 ;
}
2001-05-13 03:00:57 +00:00
} else {
2002-04-13 22:16:15 +00:00
2001-11-14 00:26:28 +00:00
// NOSOUND:
2001-06-13 21:55:24 +00:00
if ( ( time_frame < - 3 * frame_time | | time_frame > 3 * frame_time ) | | benchmark )
time_frame = 0 ;
2001-05-13 03:00:57 +00:00
}
2001-05-14 09:35:51 +00:00
2001-07-21 01:17:00 +00: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 13:52:41 +00:00
aq_sleep_time + = time_frame ;
2001-08-27 00:55:25 +00:00
2002-04-13 22:16:15 +00:00
} // !drop_frame
//============================== SLEEP: ===================================
2001-11-05 02:53:53 +00:00
2002-04-13 22:16:15 +00:00
// flag 256 means: libvo driver does its timing (dvb card)
if ( time_frame > 0.001 & & ! ( vo_flags & 256 ) ) {
2001-11-14 00:26:28 +00:00
2001-11-20 07:53:20 +00:00
# ifdef HAVE_RTC
2001-11-14 00:26:28 +00:00
if ( rtc_fd > = 0 ) {
// -------- RTC -----------
2002-04-13 22:16:15 +00:00
current_module = " sleep_rtc " ;
2001-11-14 00:26:28 +00:00
while ( time_frame > 0.000 ) {
2002-09-23 22:05:09 +00:00
unsigned long rtc_ts ;
2001-11-14 00:26:28 +00:00
if ( read ( rtc_fd , & rtc_ts , sizeof ( rtc_ts ) ) < = 0 )
2002-03-15 22:25:57 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , " Linux RTC read error: %s \n " , strerror ( errno ) ) ;
2001-11-14 00:26:28 +00:00
time_frame - = GetRelativeTime ( ) ;
}
} else
# endif
{
// -------- USLEEP + SOFTSLEEP -----------
float min = softsleep ? 0.021 : 0.005 ;
2002-04-13 22:16:15 +00:00
current_module = " sleep_usleep " ;
2001-11-14 00:26:28 +00:00
while ( time_frame > min ) {
2001-05-10 03:39:54 +00:00
if ( time_frame < = 0.020 )
2001-08-04 13:52:41 +00:00
usec_sleep ( 0 ) ; // sleeps 1 clock tick (10ms)!
2001-05-10 03:39:54 +00:00
else
2001-11-07 02:15:04 +00:00
usec_sleep ( 1000000 * ( time_frame - 0.020 ) ) ;
2001-05-10 03:39:54 +00:00
time_frame - = GetRelativeTime ( ) ;
2001-11-14 00:26:28 +00:00
}
if ( softsleep ) {
2002-04-13 22:16:15 +00:00
current_module = " sleep_soft " ;
2002-03-15 22:25:57 +00:00
if ( time_frame < 0 ) mp_msg ( MSGT_AVSYNC , MSGL_WARN , " Warning! Softsleep underflow! \n " ) ;
2001-11-14 00:26:28 +00:00
while ( time_frame > 0 ) time_frame - = GetRelativeTime ( ) ; // burn the CPU
}
}
2001-11-05 02:53:53 +00:00
}
2001-03-16 18:08:58 +00:00
2002-05-02 02:03:59 +00:00
//if(!frame_time_remaining){ // should we display the frame now?
2002-04-13 22:16:15 +00:00
//====================== FLIP PAGE (VIDEO BLT): =========================
2002-05-19 23:22:11 +00:00
current_module = " vo_check_events " ;
2002-04-07 02:12:15 +00:00
if ( vo_config_count ) video_out - > check_events ( ) ;
2002-05-19 23:22:11 +00:00
current_module = " flip_page " ;
2002-05-02 02:03:59 +00:00
if ( blit_frame & & ! frame_time_remaining ) {
2001-09-25 20:28:40 +00:00
unsigned int t2 = GetTimer ( ) ;
2002-02-24 15:54:13 +00:00
double tt ;
2001-11-14 00:26:28 +00: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); */
2002-04-07 02:12:15 +00:00
if ( vo_config_count ) video_out - > flip_page ( ) ;
2002-04-13 22:16:15 +00:00
// usec_sleep(50000); // test only!
2002-02-24 15:54:13 +00:00
t2 = GetTimer ( ) - t2 ;
tt = t2 * 0.000001f ;
vout_time_usage + = tt ;
2001-09-25 20:28:40 +00:00
}
2001-05-13 03:00:57 +00:00
2002-04-13 22:16:15 +00:00
//====================== A-V TIMESTAMP CORRECTION: =========================
2001-02-24 20:28:24 +00:00
2002-04-13 22:16:15 +00:00
current_module = " av_sync " ;
2001-02-24 20:28:24 +00:00
2001-07-21 01:17:00 +00:00
if ( sh_audio ) {
2001-05-13 03:00:57 +00:00
float a_pts = 0 ;
float v_pts = 0 ;
2001-05-10 03:39:54 +00:00
// unplayed bytes in our and soundcard/dma buffer:
2001-11-24 05:29:56 +00:00
float delay = audio_out - > get_delay ( ) + ( float ) sh_audio - > a_buffer_len / ( float ) sh_audio - > o_bps ;
2001-05-10 03:39:54 +00:00
2002-10-01 22:29:04 +00:00
if ( autosync ) {
/*
* If autosync is enabled , the value for delay must be calculated
* a bit differently . It is set only to the difference between
* the audio and video timers . Any attempt to include the real
* or corrected delay causes the pts_correction code below to
* try to correct for the changes in delay which autosync is
* trying to measure . This keeps the two from competing , but still
* allows the code to correct for PTS drift * only * . ( Using a delay
* value here , even a " corrected " one , would be incompatible with
* autosync mode . )
*/
delay = sh_audio - > timer - sh_video - > timer ;
delay + = ( float ) sh_audio - > a_buffer_len / ( float ) sh_audio - > o_bps ;
}
2001-05-13 03:00:57 +00:00
if ( pts_from_bps ) {
2002-04-13 22:16:15 +00:00
// PTS = sample_no / samplerate
2001-08-12 20:52:35 +00:00
unsigned int samples = ( sh_audio - > audio . dwSampleSize ) ?
( ( ds_tell ( d_audio ) - sh_audio - > a_in_buffer_len ) / sh_audio - > audio . dwSampleSize ) :
2002-08-02 17:44:16 +00:00
( d_audio - > block_no ) ; // <- used for VBR audio
2001-12-04 00:26:45 +00:00
samples + = sh_audio - > audio . dwStart ; // offset
2001-08-12 20:52:35 +00:00
a_pts = samples * ( float ) sh_audio - > audio . dwScale / ( float ) sh_audio - > audio . dwRate ;
2002-04-13 22:16:15 +00:00
delay_corrected = 1 ;
2001-05-13 03:00:57 +00:00
} else {
// PTS = (last timestamp) + (bytes after last timestamp)/(bytes per sec)
2001-05-10 03:39:54 +00:00
a_pts = d_audio - > pts ;
2001-08-12 20:52:35 +00:00
if ( ! delay_corrected ) if ( a_pts ) delay_corrected = 1 ;
2002-06-14 17:40:36 +00:00
#if 0
printf ( " \n #X# pts=%5.3f ds_pts=%5.3f buff=%5.3f total=%5.3f \n " ,
a_pts ,
ds_tell_pts ( d_audio ) / ( float ) sh_audio - > i_bps ,
- sh_audio - > a_in_buffer_len / ( float ) sh_audio - > i_bps ,
a_pts + ( ds_tell_pts ( d_audio ) - sh_audio - > a_in_buffer_len ) / ( float ) sh_audio - > i_bps ) ;
# endif
2001-05-10 03:39:54 +00:00
a_pts + = ( ds_tell_pts ( d_audio ) - sh_audio - > a_in_buffer_len ) / ( float ) sh_audio - > i_bps ;
2001-02-24 20:28:24 +00:00
}
2001-08-12 20:52:35 +00:00
v_pts = d_video - > pts ;
2001-05-13 03:00:57 +00:00
2001-08-17 00:40:25 +00: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 03:00:57 +00:00
2001-04-14 03:12:06 +00:00
if ( delay_corrected ) {
2002-05-23 21:58:29 +00:00
static int drop_message = 0 ;
2001-08-10 01:27:02 +00:00
float x ;
AV_delay = ( a_pts - delay - audio_delay ) - v_pts ;
2002-05-23 21:58:29 +00:00
if ( drop_frame_cnt > 50 + drop_message * 250 & & AV_delay > 0.5 ) {
+ + drop_message ;
2002-08-31 16:20:07 +00:00
mp_msg ( MSGT_AVSYNC , MSGL_ERR , MSGTR_SystemTooSlow ) ;
2002-05-23 21:58:29 +00:00
}
2001-08-10 01:27:02 +00:00
x = AV_delay * 0.1f ;
2001-02-24 20:28:24 +00:00
if ( x < - max_pts_correction ) x = - max_pts_correction ; else
if ( x > max_pts_correction ) x = max_pts_correction ;
2001-05-13 03:00:57 +00: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
2002-05-02 02:03:59 +00:00
if ( ! frame_time_remaining ) { sh_audio - > timer + = x ; c_total + = x ; } // correction
2001-10-21 23:05:05 +00: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 20:52:35 +00:00
a_pts - audio_delay - delay , v_pts , AV_delay , c_total ,
2001-08-16 01:03:51 +00:00
( int ) sh_video - > num_frames , ( int ) sh_video - > num_frames_decoded ,
2001-08-12 20:52:35 +00: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-21 23:05:05 +00:00
, cache_fill_status
2001-02-24 20:28:24 +00:00
) ;
fflush ( stdout ) ;
}
2001-05-13 03:00:57 +00:00
2001-02-24 20:28:24 +00:00
} else {
// No audio:
2001-07-29 17:42:06 +00:00
2001-08-06 00:30:29 +00:00
if ( ! quiet )
2001-10-21 23:05:05 +00: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 20:33:51 +00:00
( int ) sh_video - > num_frames ,
2001-07-21 01:17:00 +00: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-21 23:05:05 +00:00
, drop_frame_cnt
, output_quality
, cache_fill_status
2001-04-15 19:13:38 +00:00
) ;
2001-02-24 20:28:24 +00:00
fflush ( stdout ) ;
2001-07-29 17:42:06 +00:00
2001-02-24 20:28:24 +00:00
}
2002-04-13 22:16:15 +00:00
//============================ Auto QUALITY ============================
2001-02-24 20:28:24 +00:00
2001-08-04 13:52:41 +00:00
/*Output quality adjustments:*/
if ( auto_quality > 0 ) {
2002-04-13 22:16:15 +00:00
current_module = " autoq " ;
2001-08-12 15:46:09 +00:00
// float total=0.000001f * (GetTimer()-aq_total_time);
2001-08-04 13:52:41 +00: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 ) ;
}
2002-04-13 22:16:15 +00:00
} // end if(sh_video)
//============================ Handle PAUSE ===============================
current_module = " pause " ;
2002-02-08 16:00:14 +00:00
2001-07-30 02:00:54 +00:00
# ifdef USE_OSD
2001-03-27 00:39:24 +00:00
if ( osd_visible ) {
2002-04-15 19:17:12 +00:00
if ( ! - - osd_visible ) {
vo_osd_progbar_type = - 1 ; // disable
vo_osd_changed ( OSDTYPE_PROGBAR ) ;
2001-08-13 13:12:49 +00:00
if ( osd_function ! = OSD_PAUSE )
osd_function = OSD_PLAY ;
}
2001-03-27 00:39:24 +00:00
}
2001-07-30 02:00:54 +00:00
# endif
2001-04-12 00:40:42 +00:00
if ( osd_function = = OSD_PAUSE ) {
2002-01-30 12:46:03 +00:00
mp_cmd_t * cmd ;
2002-02-08 16:00:14 +00:00
if ( ! quiet ) {
2002-08-05 18:37:14 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_STATUS , MSGTR_Paused ) ;
2002-02-08 16:00:14 +00:00
fflush ( stdout ) ;
}
2001-08-30 23:11:06 +00:00
# ifdef HAVE_NEW_GUI
2002-03-07 11:57:33 +00:00
if ( use_gui ) guiGetEvent ( guiCEvent , ( char * ) guiSetPause ) ;
2001-08-30 23:11:06 +00:00
# endif
2002-04-07 02:12:15 +00:00
if ( video_out & & sh_video & & vo_config_count )
2002-02-18 17:34:20 +00:00
video_out - > control ( VOCTRL_PAUSE , NULL ) ;
2001-07-21 01:17:00 +00:00
if ( audio_out & & sh_audio )
2001-06-18 14:19:13 +00:00
audio_out - > pause ( ) ; // pause audio, keep data if possible
2001-12-04 21:04:28 +00:00
2002-01-30 12:46:03 +00:00
while ( ( cmd = mp_input_get_cmd ( 20 , 1 ) ) = = NULL ) {
2002-04-07 02:12:15 +00:00
if ( sh_video & & video_out & & vo_config_count ) video_out - > check_events ( ) ;
2001-08-27 00:55:25 +00:00
# ifdef HAVE_NEW_GUI
if ( use_gui ) {
2002-02-21 22:48:47 +00:00
guiEventHandling ( ) ;
2002-07-02 13:35:04 +00:00
guiGetEvent ( guiReDraw , NULL ) ;
2002-03-06 23:54:20 +00:00
if ( guiIntfStruct . Playing ! = 2 | | ( rel_seek_secs | | abs_seek_pos ) ) break ;
2001-08-27 00:55:25 +00:00
}
2001-07-30 02:00:54 +00:00
# endif
2002-03-06 23:54:20 +00:00
usleep ( 20000 ) ;
2002-01-30 12:46:03 +00:00
}
2002-03-11 09:19:15 +00:00
mp_cmd_free ( cmd ) ;
2001-05-08 12:17:03 +00:00
osd_function = OSD_PLAY ;
2001-07-21 01:17:00 +00:00
if ( audio_out & & sh_audio )
2001-06-18 14:19:13 +00:00
audio_out - > resume ( ) ; // resume audio
2002-04-07 02:12:15 +00:00
if ( video_out & & sh_video & & vo_config_count )
2002-02-18 17:34:20 +00:00
video_out - > control ( VOCTRL_RESUME , NULL ) ; // resume video
2001-11-14 00:26:28 +00:00
( void ) GetRelativeTime ( ) ; // keep TF around FT in next cycle
2001-08-30 23:11:06 +00:00
# ifdef HAVE_NEW_GUI
2002-05-25 09:46:37 +00:00
if ( use_gui )
{
if ( guiIntfStruct . Playing = = guiSetStop ) goto goto_next_file ;
guiGetEvent ( guiCEvent , ( char * ) guiSetPlay ) ;
}
2001-08-30 23:11:06 +00:00
# endif
2001-04-12 00:40:42 +00:00
}
2002-04-13 22:16:15 +00:00
// handle -sstep
2001-10-23 20:15:00 +00:00
if ( step_sec > 0 ) {
osd_function = OSD_FFW ;
rel_seek_secs + = step_sec ;
}
2001-03-25 04:27:39 +00:00
2002-04-04 14:44:47 +00:00
# ifdef USE_DVDNAV
if ( stream - > type = = STREAMTYPE_DVDNAV & & dvd_nav_still )
dvdnav_stream_sleeping ( ( dvdnav_priv_t * ) stream - > priv ) ;
# endif
2001-02-24 20:28:24 +00:00
//================= Keyboard events, SEEKing ====================
2002-04-13 22:16:15 +00:00
current_module = " key_events " ;
2002-01-30 12:46:03 +00:00
{
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 ;
2002-09-20 18:39:09 +00:00
if ( abs = = 2 ) { /* Absolute seek to a specific timestamp in seconds */
abs_seek_pos = 1 ;
if ( sh_video )
osd_function = ( v > sh_video - > timer ) ? OSD_FFW : OSD_REW ;
rel_seek_secs = v ;
}
else if ( abs ) { /* Absolute seek by percentage */
2002-01-30 12:46:03 +00:00
abs_seek_pos = 3 ;
2002-04-23 14:27:27 +00:00
if ( sh_video )
osd_function = ( v > sh_video - > timer ) ? OSD_FFW : OSD_REW ;
rel_seek_secs = v / 100.0 ;
2002-01-30 12:46:03 +00:00
}
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 16:36:32 +00: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 12:46:03 +00: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 16:36:32 +00: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 12:46:03 +00: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 16:00:14 +00: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 12:46:03 +00:00
case MP_CMD_VOLUME : {
int v = cmd - > args [ 0 ] . v . i ;
2002-08-21 20:44:29 +00:00
// start change for absolute volume value
int abs = ( cmd - > nargs > 1 ) ? cmd - > args [ 1 ] . v . i : 0 ;
if ( abs )
{
mixer_setvolume ( ( float ) v , ( float ) v ) ;
} else {
2002-01-30 12:46:03 +00:00
if ( v > 0 )
mixer_incvolume ( ) ;
else
mixer_decvolume ( ) ;
2002-08-21 20:44:29 +00:00
}
2002-01-30 12:46:03 +00:00
# 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 ;
2002-04-15 19:17:12 +00:00
vo_osd_changed ( OSDTYPE_PROGBAR ) ;
2002-01-30 12:46:03 +00:00
}
# endif
} break ;
2002-08-06 19:45:59 +00:00
case MP_CMD_MUTE :
mixer_mute ( ) ;
break ;
2002-07-26 21:26:39 +00:00
case MP_CMD_LOADFILE : {
play_tree_t * e = play_tree_new ( ) ;
play_tree_add_file ( e , cmd - > args [ 0 ] . v . s ) ;
// Go back to the start point
while ( play_tree_iter_up_step ( playtree_iter , 0 , 1 ) ! = PLAY_TREE_ITER_END )
/* NOP */ ;
play_tree_free_list ( playtree - > child , 1 ) ;
play_tree_set_child ( playtree , e ) ;
play_tree_iter_step ( playtree_iter , 0 , 0 ) ;
eof = PT_NEXT_SRC ;
} break ;
case MP_CMD_LOADLIST : {
play_tree_t * e = parse_playlist_file ( cmd - > args [ 0 ] . v . s ) ;
if ( ! e )
2002-08-05 18:37:14 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_PlaylistLoadUnable , cmd - > args [ 0 ] . v . s ) ;
2002-07-26 21:26:39 +00:00
else {
// Go back to the start point
while ( play_tree_iter_up_step ( playtree_iter , 0 , 1 ) ! = PLAY_TREE_ITER_END )
/* NOP */ ;
play_tree_free_list ( playtree - > child , 1 ) ;
play_tree_set_child ( playtree , e ) ;
play_tree_iter_step ( playtree_iter , 0 , 0 ) ;
eof = PT_NEXT_SRC ;
}
2002-01-30 12:46:03 +00:00
} break ;
2002-09-27 21:08:36 +00:00
case MP_CMD_GAMMA : {
int v = cmd - > args [ 0 ] . v . i , abs = cmd - > args [ 1 ] . v . i ;
if ( ! sh_video )
break ;
if ( vo_gamma_gamma = = 1000 )
{
vo_gamma_gamma = 0 ;
get_video_colors ( sh_video , " gamma " , & vo_gamma_gamma ) ;
}
if ( abs )
vo_gamma_gamma = v ;
else
vo_gamma_gamma + = v ;
if ( vo_gamma_gamma > 100 )
vo_gamma_gamma = 100 ;
else if ( vo_gamma_gamma < - 100 )
vo_gamma_gamma = - 100 ;
set_video_colors ( sh_video , " gamma " , vo_gamma_gamma ) ;
# ifdef USE_OSD
if ( osd_level ) {
osd_visible = sh_video - > fps ; // 1 sec
vo_osd_progbar_type = OSD_BRIGHTNESS ;
vo_osd_progbar_value = ( vo_gamma_gamma < < 7 ) / 100 + 128 ;
vo_osd_changed ( OSDTYPE_PROGBAR ) ;
}
# endif // USE_OSD
} break ;
2002-01-30 12:46:03 +00:00
case MP_CMD_BRIGHTNESS : {
int v = cmd - > args [ 0 ] . v . i , abs = cmd - > args [ 1 ] . v . i ;
2002-07-25 13:12:23 +00:00
if ( ! sh_video )
break ;
if ( vo_gamma_brightness = = 1000 )
{
vo_gamma_brightness = 0 ;
get_video_colors ( sh_video , " brightness " , & vo_gamma_brightness ) ;
}
2002-07-24 18:19:39 +00:00
if ( abs )
vo_gamma_brightness = v ;
else
vo_gamma_brightness + = v ;
if ( vo_gamma_brightness > 100 )
vo_gamma_brightness = 100 ;
else if ( vo_gamma_brightness < - 100 )
vo_gamma_brightness = - 100 ;
if ( set_video_colors ( sh_video , " brightness " , vo_gamma_brightness ) ) {
2002-01-30 12:46:03 +00:00
# ifdef USE_OSD
2002-07-19 20:51:48 +00:00
if ( osd_level ) {
osd_visible = sh_video - > fps ; // 1 sec
vo_osd_progbar_type = OSD_BRIGHTNESS ;
vo_osd_progbar_value = ( vo_gamma_brightness < < 7 ) / 100 + 128 ;
vo_osd_changed ( OSDTYPE_PROGBAR ) ;
}
# endif // USE_OSD
}
2002-01-30 12:46:03 +00:00
} break ;
2002-07-24 18:19:39 +00:00
case MP_CMD_CONTRAST : {
2002-01-30 12:46:03 +00:00
int v = cmd - > args [ 0 ] . v . i , abs = cmd - > args [ 1 ] . v . i ;
2002-07-25 13:12:23 +00:00
if ( ! sh_video )
break ;
if ( vo_gamma_contrast = = 1000 )
{
vo_gamma_contrast = 0 ;
get_video_colors ( sh_video , " contrast " , & vo_gamma_contrast ) ;
}
2002-07-24 18:19:39 +00:00
if ( abs )
vo_gamma_contrast = v ;
else
vo_gamma_contrast + = v ;
if ( vo_gamma_contrast > 100 )
vo_gamma_contrast = 100 ;
else if ( vo_gamma_contrast < - 100 )
vo_gamma_contrast = - 100 ;
if ( set_video_colors ( sh_video , " contrast " , vo_gamma_contrast ) ) {
2002-01-30 12:46:03 +00:00
# ifdef USE_OSD
2002-07-24 18:19:39 +00:00
if ( osd_level ) {
osd_visible = sh_video - > fps ; // 1 sec
vo_osd_progbar_type = OSD_CONTRAST ;
vo_osd_progbar_value = ( vo_gamma_contrast < < 7 ) / 100 + 128 ;
vo_osd_changed ( OSDTYPE_PROGBAR ) ;
}
# endif // USE_OSD
}
2002-01-30 12:46:03 +00:00
} break ;
case MP_CMD_SATURATION : {
int v = cmd - > args [ 0 ] . v . i , abs = cmd - > args [ 1 ] . v . i ;
2002-07-25 13:12:23 +00:00
if ( ! sh_video )
break ;
if ( vo_gamma_saturation = = 1000 )
{
vo_gamma_saturation = 0 ;
get_video_colors ( sh_video , " saturation " , & vo_gamma_saturation ) ;
}
2002-07-24 18:19:39 +00:00
if ( abs )
vo_gamma_saturation = v ;
else
vo_gamma_saturation + = v ;
if ( vo_gamma_saturation > 100 )
vo_gamma_saturation = 100 ;
else if ( vo_gamma_saturation < - 100 )
vo_gamma_saturation = - 100 ;
if ( set_video_colors ( sh_video , " saturation " , vo_gamma_saturation ) ) {
# ifdef USE_OSD
if ( osd_level ) {
osd_visible = sh_video - > fps ; // 1 sec
vo_osd_progbar_type = OSD_SATURATION ;
vo_osd_progbar_value = ( vo_gamma_saturation < < 7 ) / 100 + 128 ;
vo_osd_changed ( OSDTYPE_PROGBAR ) ;
}
# endif // USE_OSD
2002-01-30 12:46:03 +00:00
}
2002-07-24 18:19:39 +00:00
} break ;
case MP_CMD_HUE : {
int v = cmd - > args [ 0 ] . v . i , abs = cmd - > args [ 1 ] . v . i ;
2002-07-25 13:12:23 +00:00
if ( ! sh_video )
break ;
if ( vo_gamma_hue = = 1000 )
{
vo_gamma_hue = 0 ;
get_video_colors ( sh_video , " hue " , & vo_gamma_hue ) ;
}
2002-07-24 18:19:39 +00:00
if ( abs )
vo_gamma_hue = v ;
else
vo_gamma_hue + = v ;
if ( vo_gamma_hue > 100 )
vo_gamma_hue = 100 ;
else if ( vo_gamma_hue < - 100 )
vo_gamma_hue = - 100 ;
if ( set_video_colors ( sh_video , " hue " , vo_gamma_hue ) ) {
2002-01-30 12:46:03 +00:00
# ifdef USE_OSD
2002-07-24 18:19:39 +00:00
if ( osd_level ) {
osd_visible = sh_video - > fps ; // 1 sec
vo_osd_progbar_type = OSD_HUE ;
vo_osd_progbar_value = ( vo_gamma_hue < < 7 ) / 100 + 128 ;
vo_osd_changed ( OSDTYPE_PROGBAR ) ;
}
# endif // USE_OSD
2002-01-30 12:46:03 +00:00
}
} 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 )
2002-09-16 16:53:25 +00:00
tv_step_channel ( ( tvi_handle_t * ) ( demuxer - > priv ) , TV_CHANNEL_HIGHER ) ;
2002-01-30 12:46:03 +00:00
else
2002-09-16 16:53:25 +00:00
tv_step_channel ( ( tvi_handle_t * ) ( demuxer - > priv ) , TV_CHANNEL_LOWER ) ;
2002-01-30 12:46:03 +00:00
}
} break ;
case MP_CMD_TV_STEP_NORM : {
if ( tv_param_on = = 1 )
2002-09-16 16:53:25 +00:00
tv_step_norm ( ( tvi_handle_t * ) ( demuxer - > priv ) ) ;
2002-01-30 12:46:03 +00:00
} break ;
case MP_CMD_TV_STEP_CHANNEL_LIST : {
if ( tv_param_on = = 1 )
2002-09-16 16:53:25 +00:00
tv_step_chanlist ( ( tvi_handle_t * ) ( demuxer - > priv ) ) ;
2002-01-30 12:46:03 +00:00
} break ;
2002-02-24 21:20:20 +00:00
# endif
2002-02-17 01:07:45 +00:00
case MP_CMD_VO_FULLSCREEN :
{
2002-02-25 13:14:27 +00:00
# ifdef HAVE_NEW_GUI
if ( use_gui ) guiGetEvent ( guiIEvent , ( char * ) MP_CMD_GUI_FULLSCREEN ) ;
else
# endif
2002-04-07 02:12:15 +00:00
if ( video_out & & vo_config_count ) video_out - > control ( VOCTRL_FULLSCREEN , 0 ) ;
2002-02-17 01:07:45 +00:00
} break ;
2002-06-04 20:17:07 +00:00
case MP_CMD_PANSCAN : {
2002-06-06 07:13:57 +00:00
if ( ! video_out ) break ;
2002-06-05 19:35:54 +00:00
if ( video_out - > control ( VOCTRL_GET_PANSCAN , NULL ) = = VO_TRUE )
{
int abs = cmd - > args [ 1 ] . v . i ;
float v = cmd - > args [ 0 ] . v . f ;
float res ;
if ( abs ) res = v ;
else res = vo_panscan + v ;
vo_panscan = res > 1 ? 1 : res < 0 ? 0 : res ;
video_out - > control ( VOCTRL_SET_PANSCAN , NULL ) ;
2002-06-04 20:17:07 +00:00
# ifdef USE_OSD
2002-06-05 19:35:54 +00:00
if ( osd_level ) {
osd_visible = sh_video - > fps ; // 1 sec
vo_osd_progbar_type = OSD_PANSCAN ;
vo_osd_progbar_value = vo_panscan * 256 ;
vo_osd_changed ( OSDTYPE_PROGBAR ) ;
}
2002-06-04 20:17:07 +00:00
# endif
2002-06-05 19:35:54 +00:00
}
2002-06-04 20:17:07 +00:00
} break ;
2002-03-10 03:47:53 +00: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 ;
2002-04-15 20:51:34 +00:00
vo_osd_changed ( OSDTYPE_SUBTITLE ) ;
2002-03-10 03:47:53 +00:00
} break ;
2002-05-18 00:11:43 +00:00
case MP_CMD_SCREENSHOT :
if ( vo_config_count ) video_out - > control ( VOCTRL_SCREENSHOT , NULL ) ;
break ;
2002-08-04 02:22:27 +00:00
case MP_CMD_VF_CHANGE_RECTANGLE :
set_rectangle ( sh_video , cmd - > args [ 0 ] . v . i , cmd - > args [ 1 ] . v . i ) ;
break ;
2002-03-28 20:40:21 +00:00
# ifdef USE_DVDNAV
2002-04-04 14:44:47 +00:00
case MP_CMD_DVDNAV_EVENT : {
dvdnav_priv_t * dvdnav_priv = ( dvdnav_priv_t * ) ( stream - > priv ) ;
dvdnav_event_t * dvdnav_event = ( dvdnav_event_t * ) ( cmd - > args [ 0 ] . v . v ) ;
2002-04-15 01:50:00 +00:00
/* ignore these events if we're not in dvd_nav mode */
if ( ! dvd_nav ) break ;
2002-04-04 14:44:47 +00:00
if ( ! dvdnav_event ) {
printf ( " DVDNAV Event NULL?! \n " ) ;
break ;
}
if ( stream - > type ! = STREAMTYPE_DVDNAV ) {
printf ( " Got DVDNAV event when not running a DVDNAV stream!? \n " ) ;
break ;
}
//printf("mplayer: got event: %d\n",dvdnav_event->event);
switch ( dvdnav_event - > event ) {
case DVDNAV_BLOCK_OK : {
/* be silent about this one */
break ;
}
case DVDNAV_HIGHLIGHT : {
dvdnav_highlight_event_t * hevent = ( dvdnav_highlight_event_t * ) ( dvdnav_event - > details ) ;
if ( ! hevent ) {
printf ( " DVDNAV Event: Highlight event broken \n " ) ;
break ;
}
if ( hevent - > display & & hevent - > buttonN > 0 )
{
//dvdnav_priv->seen_root_menu=1; /* if we got a highlight, we're on a menu */
sprintf ( dvd_nav_text , " Highlight button %d (%u,%u)-(%u,%u) PTS %d (now is %5.2f) " ,
hevent - > buttonN ,
hevent - > sx , hevent - > sy ,
hevent - > ex , hevent - > ey ,
hevent - > pts , d_video - > pts ) ;
printf ( " DVDNAV Event: %s \n " , dvd_nav_text ) ;
//osd_show_dvd_nav_delay = 60;
osd_show_dvd_nav_highlight = 1 ;
osd_show_dvd_nav_sx = hevent - > sx ;
osd_show_dvd_nav_ex = hevent - > ex ;
osd_show_dvd_nav_sy = hevent - > sy ;
osd_show_dvd_nav_ey = hevent - > ey ;
}
else {
osd_show_dvd_nav_highlight = 0 ;
printf ( " DVDNAV Event: Highlight Hide \n " ) ;
}
break ;
}
case DVDNAV_STILL_FRAME : {
dvdnav_still_event_t * still_event = ( dvdnav_still_event_t * ) ( dvdnav_event - > details ) ;
printf ( " ######################################## DVDNAV Event: Still Frame: %d sec(s) \n " , still_event - > length ) ;
while ( dvdnav_stream_sleeping ( dvdnav_priv ) ) {
usleep ( 1000 ) ; /* 1ms */
}
dvdnav_stream_sleep ( dvdnav_priv , still_event - > length ) ;
break ;
}
case DVDNAV_STOP : {
printf ( " DVDNAV Event: Nav Stop \n " ) ;
break ;
}
case DVDNAV_NOP : {
printf ( " DVDNAV Event: Nav NOP \n " ) ;
break ;
}
case DVDNAV_SPU_STREAM_CHANGE : {
2002-08-11 17:14:41 +00:00
# if DVDNAVVERSION > 012
dvdnav_spu_stream_change_event_t * stream_change = ( dvdnav_spu_stream_change_event_t * ) ( dvdnav_event - > details ) ;
printf ( " DVDNAV Event: Nav SPU Stream Change: phys: %d/%d/%d logical: %d \n " ,
stream_change - > physical_wide ,
stream_change - > physical_letterbox ,
stream_change - > physical_pan_scan ,
stream_change - > logical ) ;
if ( vo_spudec & & dvdsub_id ! = stream_change - > physical_wide ) {
mp_msg ( MSGT_INPUT , MSGL_DBG2 , " d_dvdsub->id change: was %d is now %d \n " ,
d_dvdsub - > id , stream_change - > physical_wide ) ;
// FIXME: need a better way to change SPU id
d_dvdsub - > id = dvdsub_id = stream_change - > physical_wide ;
if ( vo_spudec ) spudec_reset ( vo_spudec ) ;
}
# else
dvdnav_stream_change_event_t * stream_change = ( dvdnav_stream_change_event_t * ) ( dvdnav_event - > details ) ;
2002-04-04 14:44:47 +00:00
printf ( " DVDNAV Event: Nav SPU Stream Change: phys: %d logical: %d \n " ,
stream_change - > physical ,
stream_change - > logical ) ;
if ( vo_spudec & & dvdsub_id ! = stream_change - > physical ) {
mp_msg ( MSGT_INPUT , MSGL_DBG2 , " d_dvdsub->id change: was %d is now %d \n " ,
d_dvdsub - > id , stream_change - > physical ) ;
// FIXME: need a better way to change SPU id
d_dvdsub - > id = dvdsub_id = stream_change - > physical ;
if ( vo_spudec ) spudec_reset ( vo_spudec ) ;
}
2002-08-11 17:14:41 +00:00
# endif
2002-04-04 14:44:47 +00:00
break ;
}
case DVDNAV_AUDIO_STREAM_CHANGE : {
int aid_temp ;
2002-08-11 17:14:41 +00:00
# if DVDNAVVERSION > 012
dvdnav_audio_stream_change_event_t * stream_change = ( dvdnav_audio_stream_change_event_t * ) ( dvdnav_event - > details ) ;
# else
2002-04-04 14:44:47 +00:00
dvdnav_stream_change_event_t * stream_change = ( dvdnav_stream_change_event_t * ) ( dvdnav_event - > details ) ;
2002-08-11 17:14:41 +00:00
# endif
2002-04-04 14:44:47 +00:00
printf ( " DVDNAV Event: Nav Audio Stream Change: phys: %d logical: %d \n " ,
stream_change - > physical ,
stream_change - > logical ) ;
aid_temp = stream_change - > physical ;
if ( aid_temp > = 0 ) aid_temp + = 128 ; // FIXME: is this sane?
if ( d_audio & & audio_id ! = aid_temp ) {
mp_msg ( MSGT_INPUT , MSGL_DBG2 , " d_audio->id change: was %d is now %d \n " ,
d_audio - > id , aid_temp ) ;
// FIXME: need a bettery way to change audio stream id
d_audio - > id = dvdsub_id = aid_temp ;
resync_audio_stream ( sh_audio ) ;
}
break ;
}
case DVDNAV_VTS_CHANGE : {
printf ( " DVDNAV Event: Nav VTS Change \n " ) ;
break ;
}
case DVDNAV_CELL_CHANGE : {
dvdnav_cell_change_event_t * cell_change = ( dvdnav_cell_change_event_t * ) ( dvdnav_event - > details ) ;
cell_playback_t * cell_playback = cell_change - > new_cell ;
printf ( " DVDNAV Event: Nav Cell Change \n " ) ;
osd_show_dvd_nav_highlight = 0 ; /* screen changed, disable menu */
/*
printf ( " new still time: %d \n " , cell_playback - > still_time ) ;
printf ( " new cell_cmd_nr: %d \n " , cell_playback - > cell_cmd_nr ) ;
printf ( " new playback_time: %02d:%02d:%02d.%02d \n " ,
cell_playback - > playback_time . hour ,
cell_playback - > playback_time . minute ,
cell_playback - > playback_time . second ,
cell_playback - > playback_time . frame_u ) ;
*/
//rel_seek_secs=1; // not really: we can't seek, but it'll reset the muxer
//abs_seek_pos=0;
break ;
}
case DVDNAV_NAV_PACKET : {
// printf("DVDNAV Event: Nav Packet\n");
break ;
}
case DVDNAV_SPU_CLUT_CHANGE : {
uint32_t * new_clut = ( uint32_t * ) ( dvdnav_event - > details ) ;
printf ( " DVDNAV Event: Nav SPU CLUT Change \n " ) ;
// send new palette to SPU decoder
if ( vo_spudec ) spudec_update_palette ( vo_spudec , new_clut ) ;
break ;
}
case DVDNAV_SEEK_DONE : {
printf ( " DVDNAV Event: Nav Seek Done \n " ) ;
break ;
}
}
// free the dvdnav event
free ( dvdnav_event - > details ) ;
free ( dvdnav_event ) ;
cmd - > args [ 0 ] . v . v = NULL ;
}
2002-03-28 20:40:21 +00:00
case MP_CMD_DVDNAV : {
2002-04-04 14:44:47 +00:00
dvdnav_priv_t * dvdnav_priv = ( dvdnav_priv_t * ) stream - > priv ;
2002-04-15 01:50:00 +00:00
/* ignore these events if we're not in dvd_nav mode */
if ( ! dvd_nav ) break ;
2002-03-28 20:40:21 +00:00
switch ( cmd - > args [ 0 ] . v . i ) {
case MP_CMD_DVDNAV_UP :
2002-04-04 14:44:47 +00:00
dvdnav_upper_button_select ( dvdnav_priv - > dvdnav ) ;
2002-03-28 20:40:21 +00:00
break ;
case MP_CMD_DVDNAV_DOWN :
2002-04-04 14:44:47 +00:00
dvdnav_lower_button_select ( dvdnav_priv - > dvdnav ) ;
2002-03-28 20:40:21 +00:00
break ;
case MP_CMD_DVDNAV_LEFT :
2002-04-04 14:44:47 +00:00
dvdnav_left_button_select ( dvdnav_priv - > dvdnav ) ;
2002-03-28 20:40:21 +00:00
break ;
case MP_CMD_DVDNAV_RIGHT :
2002-04-04 14:44:47 +00:00
dvdnav_right_button_select ( dvdnav_priv - > dvdnav ) ;
2002-03-28 20:40:21 +00:00
break ;
case MP_CMD_DVDNAV_MENU :
2002-04-04 14:44:47 +00:00
printf ( " Menu call \n " ) ;
dvdnav_menu_call ( dvdnav_priv - > dvdnav , DVD_MENU_Root ) ;
2002-03-28 20:40:21 +00:00
break ;
case MP_CMD_DVDNAV_SELECT :
2002-04-04 14:44:47 +00:00
dvdnav_button_activate ( dvdnav_priv - > dvdnav ) ;
2002-03-28 20:40:21 +00:00
break ;
default :
mp_msg ( MSGT_CPLAYER , MSGL_V , " Weird DVD Nav cmd %d \n " , cmd - > args [ 0 ] . v . i ) ;
break ;
}
break ;
}
# endif
2002-02-25 13:14:27 +00: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 22:25:57 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_V , " Received unknow cmd %s \n " , cmd - > name ) ;
2002-01-30 12:46:03 +00:00
}
2002-02-25 13:14:27 +00:00
}
2002-01-30 12:46:03 +00:00
mp_cmd_free ( cmd ) ;
}
}
2002-08-28 15:55:58 +00:00
2001-04-26 22:10:25 +00:00
if ( seek_to_sec ) {
2001-06-01 22:48:50 +00: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-26 22:10:25 +00:00
}
2001-06-01 22:48:50 +00:00
2001-10-22 14:42:47 +00:00
/* Looping. */
2001-12-16 23:59:13 +00:00
if ( eof = = 1 & & loop_times > = 0 ) {
2002-04-17 12:23:52 +00:00
int l = loop_times ;
play_tree_iter_step ( playtree_iter , 0 , 0 ) ;
loop_times = l ;
2001-12-16 23:59:13 +00:00
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 14:42:47 +00:00
eof = 0 ;
2001-12-16 23:59:13 +00:00
abs_seek_pos = 3 ; rel_seek_secs = 0 ; // seek to start of movie (0%)
2001-10-22 14:42:47 +00:00
}
2001-08-22 19:02:28 +00:00
if ( rel_seek_secs | | abs_seek_pos ) {
2001-08-08 19:37:45 +00:00
current_module = " seek " ;
2001-08-22 19:02:28 +00:00
if ( demux_seek ( demuxer , rel_seek_secs , abs_seek_pos ) ) {
2001-07-28 21:57:21 +00:00
// success:
2002-01-10 17:18:30 +00:00
/* FIXME there should be real seeking for vobsub */
if ( vo_vobsub )
vobsub_reset ( vo_vobsub ) ;
2002-05-02 23:40:31 +00:00
#if 0
2002-04-26 12:52:06 +00:00
if ( sh_video & & d_video - > packs = = 0 )
ds_fill_buffer ( d_video ) ;
2001-08-07 16:03:30 +00:00
if ( sh_audio ) {
2002-04-26 12:52:06 +00:00
if ( d_audio - > packs = = 0 )
ds_fill_buffer ( d_audio ) ;
2001-08-07 16:03:30 +00:00
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 00:40:25 +00: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 16:03:30 +00:00
}
2001-08-17 00:40:25 +00: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 16:03:30 +00:00
} else {
2001-08-17 00:40:25 +00:00
mp_msg ( MSGT_AVSYNC , MSGL_STATUS , " A: --- V:%6.1f \r " , d_video - > pts ) ;
2001-08-07 16:03:30 +00:00
}
2002-05-02 23:40:31 +00:00
# endif
2001-08-07 16:03:30 +00:00
fflush ( stdout ) ;
2002-02-09 00:47:55 +00:00
if ( sh_video ) {
current_module = " seek_video_reset " ;
2002-04-07 02:12:15 +00:00
if ( vo_config_count ) video_out - > control ( VOCTRL_RESET , NULL ) ;
2002-02-09 00:47:55 +00:00
}
2001-07-21 01:17:00 +00:00
if ( sh_audio ) {
2001-08-08 19:37:45 +00:00
current_module = " seek_audio_reset " ;
2001-06-05 18:40:44 +00:00
audio_out - > reset ( ) ; // stop audio, throwing away buffered data
2001-02-24 20:28:24 +00:00
}
2001-07-30 02:00:54 +00:00
# ifdef USE_OSD
2001-07-16 17:07:13 +00:00
// Set OSD:
if ( osd_level ) {
int len = ( ( demuxer - > movi_end - demuxer - > movi_start ) > > 8 ) ;
2001-08-28 14:22:37 +00: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 ;
2002-04-15 19:17:12 +00:00
vo_osd_changed ( OSDTYPE_PROGBAR ) ;
2001-08-28 14:22:37 +00:00
}
2001-07-16 17:07:13 +00:00
}
2001-07-30 02:00:54 +00:00
# endif
2002-02-08 16:00:14 +00: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 20:32:02 +00:00
2002-04-04 14:24:11 +00:00
if ( vo_spudec ) spudec_reset ( vo_spudec ) ;
2002-02-08 16:00:14 +00:00
}
2001-02-24 20:28:24 +00:00
}
2001-07-28 21:57:21 +00:00
rel_seek_secs = 0 ;
2001-08-22 19:02:28 +00:00
abs_seek_pos = 0 ;
2002-05-02 02:03:59 +00:00
frame_time_remaining = 0 ;
2001-08-08 19:37:45 +00:00
current_module = NULL ;
}
2001-08-27 23:56:44 +00:00
# ifdef HAVE_NEW_GUI
if ( use_gui ) {
2002-04-22 21:36:12 +00:00
guiEventHandling ( ) ;
2001-08-28 21:35:04 +00:00
if ( demuxer - > file_format = = DEMUXER_TYPE_AVI & & sh_video - > video . dwLength > 2 ) {
// get pos from frame number / total frames
2002-02-23 15:12:55 +00:00
guiIntfStruct . Position = ( float ) d_video - > pack_no * 100.0f / sh_video - > video . dwLength ;
2001-08-28 21:35:04 +00:00
} else {
2002-08-05 01:32:11 +00:00
off_t len = ( demuxer - > movi_end - demuxer - > movi_start ) ;
off_t pos = ( demuxer - > file_format = = DEMUXER_TYPE_AUDIO ? stream - > pos : demuxer - > filepos ) ;
guiIntfStruct . Position = ( len < = 0 ? 0.0f : ( pos - demuxer - > movi_start ) * 100.0f / len ) ;
2001-08-28 21:35:04 +00:00
}
2002-04-23 13:57:41 +00:00
if ( sh_video ) guiIntfStruct . TimeSec = d_video - > pts ;
else if ( sh_audio ) guiIntfStruct . TimeSec = sh_audio - > timer ;
2002-07-02 13:35:04 +00:00
guiGetEvent ( guiReDraw , NULL ) ;
2002-08-04 19:23:58 +00:00
guiGetEvent ( guiSetVolume , NULL ) ;
2002-02-23 15:12:55 +00:00
if ( guiIntfStruct . Playing = = 0 ) break ; // STOP
if ( guiIntfStruct . Playing = = 2 ) osd_function = OSD_PAUSE ;
2002-07-12 00:53:26 +00:00
if ( guiIntfStruct . DiskChanged | | guiIntfStruct . FilenameChanged ) goto goto_next_file ;
2001-11-21 17:43:57 +00:00
# ifdef USE_DVDREAD
if ( stream - > type = = STREAMTYPE_DVD )
{
dvd_priv_t * dvdp = stream - > priv ;
2002-02-23 15:12:55 +00:00
guiIntfStruct . DVD . current_chapter = dvdp - > cur_cell + 1 ;
2001-11-21 17:43:57 +00:00
}
# endif
2001-08-27 23:56:44 +00:00
}
# endif
2001-03-27 00:39:24 +00:00
//================= Update OSD ====================
2001-07-30 02:00:54 +00:00
# ifdef USE_OSD
2002-03-19 19:22:00 +00:00
if ( osd_level > = 1 ) {
2001-05-13 03:00:57 +00:00
int pts = d_video - > pts ;
2002-02-22 15:25:11 +00:00
char osd_text_tmp [ 50 ] ;
2001-04-23 19:20:44 +00:00
if ( pts = = osd_last_pts - 1 ) + + pts ; else osd_last_pts = pts ;
2001-04-12 00:40:42 +00:00
vo_osd_text = osd_text_buffer ;
2002-04-04 14:44:47 +00:00
# ifdef USE_DVDNAV
if ( osd_show_dvd_nav_delay ) {
sprintf ( osd_text_tmp , " DVDNAV: %s " , dvd_nav_text ) ;
osd_show_dvd_nav_delay - - ;
} else
# endif
2001-11-30 23:44:04 +00:00
if ( osd_show_sub_delay ) {
2002-02-22 15:25:11 +00:00
sprintf ( osd_text_tmp , " Sub delay: %d ms " , ( int ) ( sub_delay * 1000 ) ) ;
2001-11-30 23:44:04 +00:00
osd_show_sub_delay - - ;
2001-12-27 00:59:40 +00:00
} else
if ( osd_show_av_delay ) {
2002-02-22 15:25:11 +00:00
sprintf ( osd_text_tmp , " A-V delay: %d ms " , ( int ) ( audio_delay * 1000 ) ) ;
2001-12-27 00:59:40 +00:00
osd_show_av_delay - - ;
2002-03-19 19:22:00 +00:00
} else if ( osd_level > = 2 )
2002-02-22 15:25:11 +00:00
sprintf ( osd_text_tmp , " %c %02d:%02d:%02d " , osd_function , pts / 3600 , ( pts / 60 ) % 60 , pts % 60 ) ;
2002-03-19 19:22:00 +00:00
else osd_text_tmp [ 0 ] = 0 ;
2002-02-22 15:25:11 +00:00
if ( strcmp ( vo_osd_text , osd_text_tmp ) ) {
strcpy ( vo_osd_text , osd_text_tmp ) ;
2002-04-15 19:17:12 +00:00
vo_osd_changed ( OSDTYPE_OSD ) ;
2002-02-22 15:25:11 +00:00
}
2001-04-12 00:40:42 +00:00
} else {
2002-02-22 15:25:11 +00:00
if ( vo_osd_text ) {
2001-04-12 00:40:42 +00:00
vo_osd_text = NULL ;
2002-04-15 19:17:12 +00:00
vo_osd_changed ( OSDTYPE_OSD ) ;
2002-02-22 15:25:11 +00:00
}
2001-04-12 00:40:42 +00:00
}
2001-03-27 00:39:24 +00:00
// for(i=1;i<=11;i++) osd_text_buffer[10+i]=i;osd_text_buffer[10+i]=0;
2001-04-12 00:40:42 +00:00
// vo_osd_text=osd_text_buffer;
2001-07-30 02:00:54 +00:00
# endif
2001-04-15 23:22:01 +00:00
2001-07-30 02:00:54 +00:00
# ifdef USE_SUB
2001-03-30 03:07:45 +00:00
// find sub
2001-06-23 17:10:52 +00:00
if ( subtitles & & d_video - > pts > 0 ) {
2001-08-29 20:22:23 +00:00
float pts = d_video - > pts ;
2001-04-14 03:12:06 +00:00
if ( sub_fps = = 0 ) sub_fps = sh_video - > fps ;
2001-04-17 00:08:56 +00:00
current_module = " find_sub " ;
2001-12-03 01:03:17 +00: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 00:08:56 +00:00
current_module = NULL ;
2001-03-30 03:07:45 +00:00
}
2001-07-30 02:00:54 +00:00
# endif
2001-04-20 23:00:11 +00:00
// DVD sub:
2002-05-17 23:47:27 +00:00
if ( vo_config_count & & vo_spudec ) {
unsigned char * packet = NULL ;
int len , timestamp ;
// Get a sub packet from the dvd or a vobsub and make a timestamp relative to sh_video->timer
int get_sub_packet ( void ) {
// Vobsub
len = 0 ;
if ( vo_vobsub ) {
if ( d_video - > pts + sub_delay > = 0 ) {
// The + next_frame_time is there because we'll display the sub at the next frame
len = vobsub_get_packet ( vo_vobsub , d_video - > pts + sub_delay + next_frame_time , ( void * * ) & packet , & timestamp ) ;
if ( len > 0 ) {
timestamp - = ( d_video - > pts + sub_delay - sh_video - > timer ) * 90000 ;
mp_dbg ( MSGT_CPLAYER , MSGL_V , " \r VOB sub: len=%d v_pts=%5.3f v_timer=%5.3f sub=%5.3f ts=%d \n " , len , d_video - > pts , sh_video - > timer , timestamp / 90000.0 ) ;
}
}
} else {
// DVD sub
len = ds_get_packet_sub ( d_dvdsub , ( unsigned char * * ) & packet ) ;
if ( len > 0 ) {
timestamp = 90000 * ( sh_video - > timer + d_dvdsub - > pts + sub_delay - d_video - > pts ) ;
mp_dbg ( MSGT_CPLAYER , MSGL_V , " \r DVD sub: len=%d v_pts=%5.3f s_pts=%5.3f ts=%d \n " , len , d_video - > pts , d_dvdsub - > pts , timestamp ) ;
}
2001-04-20 23:00:11 +00:00
}
2002-05-17 23:47:27 +00:00
return len ;
}
current_module = " spudec " ;
spudec_heartbeat ( vo_spudec , 90000 * sh_video - > timer ) ;
while ( get_sub_packet ( ) > 0 & & packet ) {
2002-05-27 16:40:10 +00:00
if ( timestamp < 0 ) timestamp = 0 ;
2002-05-17 23:47:27 +00:00
spudec_assemble ( vo_spudec , packet , len , timestamp ) ;
2001-04-20 23:00:11 +00:00
}
2002-05-25 17:40:40 +00:00
/* detect wether the sub has changed or not */
if ( spudec_changed ( vo_spudec ) )
vo_osd_changed ( OSDTYPE_SPU ) ;
2002-05-17 23:47:27 +00:00
current_module = NULL ;
}
2001-02-24 20:28:24 +00:00
} // while(!eof)
2001-08-17 00:40:25 +00:00
mp_msg ( MSGT_GLOBAL , MSGL_V , " EOF code: %d \n " , eof ) ;
2001-07-29 21:07:34 +00:00
2001-03-15 19:38:34 +00:00
}
2001-08-22 21:35:44 +00:00
2001-12-19 16:55:32 +00:00
goto_next_file : // don't jump here after ao/vo/getch initialization!
2001-08-22 23:48:18 +00:00
2002-05-20 03:25:26 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " \n " ) ;
2002-01-17 20:25:55 +00: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 00:47:15 +00: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 20:25:55 +00: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 00:47:15 +00: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 20:25:55 +00: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-05-05 17:22:38 +00:00
if ( total_frame_cnt & & frame_dropping )
2002-04-14 19:43:23 +00:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " BENCHMARKn: disp: %d (%3.2f fps) drop: %d (%d%%) total: %d (%3.2f fps) \n " ,
total_frame_cnt - drop_frame_cnt ,
( total_time_usage > 0.5 ) ? ( ( total_frame_cnt - drop_frame_cnt ) / total_time_usage ) : 0 ,
drop_frame_cnt ,
100 * drop_frame_cnt / total_frame_cnt ,
total_frame_cnt ,
( total_time_usage > 0.5 ) ? ( total_frame_cnt / total_time_usage ) : 0 ) ;
2002-01-17 20:25:55 +00:00
}
2002-05-05 17:22:38 +00:00
// time to uninit all, except global stuff:
uninit_player ( INITED_ALL - ( INITED_GUI + INITED_LIRC + INITED_INPUT ) ) ;
2002-03-17 02:28:32 +00:00
2002-01-14 23:38:49 +00:00
if ( eof = = PT_NEXT_ENTRY | | eof = = PT_PREV_ENTRY ) {
2002-01-17 20:25:55 +00:00
eof = eof = = PT_NEXT_ENTRY ? 1 : - 1 ;
2002-01-08 02:01:04 +00:00
if ( play_tree_iter_step ( playtree_iter , eof , 0 ) = = PLAY_TREE_ITER_ENTRY ) {
eof = 1 ;
} else {
play_tree_iter_free ( playtree_iter ) ;
playtree_iter = NULL ;
}
2002-01-14 23:38:49 +00: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 ) {
eof = 1 ;
} else {
play_tree_iter_free ( playtree_iter ) ;
playtree_iter = NULL ;
}
2002-03-17 02:28:32 +00:00
} else { // NEXT PREV SRC
2002-01-14 23:38:49 +00:00
eof = eof = = PT_PREV_SRC ? - 1 : 1 ;
2002-01-08 02:01:04 +00:00
}
2001-08-22 21:35:44 +00:00
2002-01-08 02:01:04 +00:00
if ( eof = = 0 ) eof = 1 ;
2001-08-22 23:48:18 +00:00
2002-01-08 02:01:04 +00: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 ;
}
2002-04-29 22:00:50 +00:00
# ifdef HAVE_NEW_GUI
if ( use_gui & & ! playtree_iter )
{
# ifdef USE_DVDREAD
2002-06-03 15:06:32 +00:00
if ( ! guiIntfStruct . DiskChanged )
2002-04-29 22:00:50 +00:00
# endif
2002-07-12 00:53:26 +00:00
mplEnd ( ) ;
2002-04-29 22:00:50 +00:00
}
# endif
2002-07-02 13:35:04 +00:00
if ( use_gui | | playtree_iter ! = NULL ) {
2001-08-22 23:48:18 +00:00
2002-08-28 20:52:02 +00:00
# ifdef HAVE_FREETYPE
current_module = " uninit_font " ;
if ( vo_font ) free_font_desc ( vo_font ) ;
vo_font = NULL ;
# endif
2002-04-01 17:59:16 +00:00
current_module = " uninit_acodec " ;
2002-04-01 18:29:31 +00:00
if ( sh_audio ) uninit_audio ( sh_audio ) ;
2002-04-01 17:59:16 +00:00
sh_audio = NULL ;
2001-08-23 12:24:59 +00:00
current_module = " uninit_vcodec " ;
if ( sh_video ) uninit_video ( sh_video ) ;
2002-03-31 02:22:40 +00:00
sh_video = NULL ;
2002-04-01 17:59:16 +00:00
2001-08-22 23:48:18 +00:00
current_module = " free_demuxer " ;
if ( demuxer ) free_demuxer ( demuxer ) ;
2002-03-31 02:22:40 +00:00
demuxer = NULL ;
2001-08-22 23:48:18 +00:00
current_module = " free_stream " ;
if ( stream ) free_stream ( stream ) ;
2002-03-31 02:22:40 +00:00
stream = NULL ;
2002-07-25 20:34:33 +00:00
# ifdef USE_SUB
2001-12-17 00:07:20 +00:00
current_module = " sub_free " ;
if ( subtitles )
{
sub_free ( subtitles ) ;
2002-08-29 22:24:49 +00:00
if ( sub_name ) free ( sub_name ) ;
2001-12-17 00:07:20 +00:00
sub_name = NULL ;
vo_sub = NULL ;
2002-02-23 15:12:55 +00:00
subtitles = NULL ;
2001-12-17 00:07:20 +00:00
}
2002-07-25 20:34:33 +00:00
# endif
2002-02-23 15:12:55 +00:00
2002-01-08 02:01:04 +00:00
eof = 0 ;
2001-08-22 23:48:18 +00:00
goto play_next_file ;
2001-08-22 21:35:44 +00:00
}
2002-08-28 20:52:02 +00:00
# ifdef HAVE_FREETYPE
done_freetype ( ) ;
# endif
2001-08-22 21:35:44 +00:00
exit_player ( MSGTR_Exit_eof ) ;
2001-03-15 19:38:34 +00:00
return 1 ;
}