2001-08-01 11:14:02 +02:00
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# include <unistd.h>
2001-02-24 21:28:24 +01:00
2002-03-23 22:12:38 +01:00
// #include <sys/mman.h>
2001-02-24 21:28:24 +01:00
# include <sys/types.h>
2003-04-04 22:02:53 +02:00
# ifndef __MINGW32__
# include <sys/ioctl.h>
2001-02-24 21:28:24 +01:00
# include <sys/wait.h>
2003-04-04 22:02:53 +02:00
# else
# define SIGHUP 1 /* hangup */
# define SIGQUIT 3 /* quit */
# define SIGKILL 9 /* kill (cannot be caught or ignored) */
# define SIGBUS 10 /* bus error */
2003-09-22 13:31:51 +02:00
extern int mp_input_win32_slave_cmd_func ( int fd , char * dest , int size ) ;
2003-04-04 22:02:53 +02:00
# endif
2001-02-24 21:28:24 +01:00
# include <sys/time.h>
# include <sys/stat.h>
2001-08-01 01:18:16 +02:00
# include <signal.h>
# include <time.h>
2001-02-24 21:28:24 +01:00
# include <fcntl.h>
2003-02-07 20:44:12 +01:00
# include <limits.h>
2001-02-24 21:28:24 +01:00
2002-03-15 23:25:57 +01:00
# include <errno.h>
2001-08-01 11:14:02 +02:00
# include "version.h"
# include "config.h"
2001-08-18 22:32:09 +02:00
2001-08-17 00:40:06 +02:00
# include "mp_msg.h"
2001-02-24 21:28:24 +01:00
2001-08-18 22:32:09 +02:00
# define HELP_MP_DEFINE_STATIC
# include "help_mp.h"
2002-11-12 02:56:42 +01:00
# include "m_option.h"
# include "m_config.h"
2003-03-30 19:13:04 +02:00
2001-03-19 03:29:37 +01:00
# include "cfg-mplayer-def.h"
2001-03-19 00:32:31 +01:00
2001-07-30 04:00:54 +02:00
# ifdef USE_SUB
2001-03-30 05:07:45 +02:00
# include "subreader.h"
2001-07-30 04:00:54 +02:00
# endif
2001-03-30 05:07:45 +02:00
2001-03-04 22:01:54 +01:00
# include "libvo/video_out.h"
2001-07-30 04:00:54 +02:00
2002-03-23 23:50:25 +01:00
# include "libvo/font_load.h"
2001-03-27 02:39:24 +02:00
# include "libvo/sub.h"
2001-03-04 22:01:54 +01:00
2003-05-30 19:57:41 +02:00
# ifdef HAVE_X11
# include "libvo/x11_common.h"
# endif
2001-06-03 01:30:26 +02:00
# include "libao2/audio_out.h"
2001-11-29 13:44:06 +01:00
# include "libao2/audio_plugin.h"
2001-06-03 01:30:26 +02:00
2001-04-07 23:27:57 +02:00
# include "codec-cfg.h"
2001-03-20 23:11:38 +01:00
2002-09-29 21:26:40 +02:00
# ifdef HAVE_LIBCSS
# include "libmpdemux/dvdauth.h"
# endif
2002-03-28 21:40:21 +01:00
# ifdef USE_DVDNAV
# include <dvdnav.h>
# endif
2002-04-04 16:24:11 +02:00
2002-12-23 01:33:22 +01:00
# ifdef USE_EDL
# include "edl.h"
# endif
2001-04-21 17:38:01 +02:00
# include "spudec.h"
2002-01-10 18:18:30 +01:00
# include "vobsub.h"
2001-04-18 00:04:44 +02:00
2003-02-09 21:18:23 +01:00
# include "osdep/getch2.h"
# include "osdep/timer.h"
2001-02-24 21:28:24 +01:00
2001-10-19 04:00:45 +02:00
# include "cpudetect.h"
2001-10-01 19:25:07 +02:00
# ifdef HAVE_NEW_GUI
2002-02-21 23:48:47 +01:00
# include "Gui/interface.h"
2001-10-01 19:25:07 +02:00
# endif
2002-01-30 13:46:03 +01:00
# include "input/input.h"
2001-12-04 22:04:28 +01:00
int slave_mode = 0 ;
2001-04-11 22:58:15 +02:00
int verbose = 0 ;
2002-10-23 17:48:56 +02:00
int identify = 0 ;
2002-09-30 00:57:54 +02:00
static int quiet = 0 ;
2001-02-24 21:28:24 +01:00
2001-04-14 05:12:06 +02:00
# define ABS(x) (((x)>=0)?(x):(-(x)))
2002-12-28 14:53:31 +01:00
# define ROUND(x) ((int)((x)<0 ? (x)-0.5 : (x)+0.5))
2001-04-14 05:12:06 +02:00
2001-11-20 08:53:20 +01:00
# ifdef HAVE_RTC
2001-11-14 01:26:28 +01:00
# include <linux/rtc.h>
# endif
2001-11-17 01:23:48 +01:00
# ifdef USE_TV
# include "libmpdemux/tv.h"
# endif
2003-03-16 21:13:28 +01:00
# ifdef HAS_DVBIN_SUPPORT
# include "libmpdemux/dvbin.h"
2003-08-27 19:08:58 +02:00
static int last_dvb_step = 1 ;
2003-03-16 21:13:28 +01:00
# endif
2003-10-16 23:06:43 +02:00
# ifdef HAVE_MATROSKA
# include "libmpdemux/matroska.h"
# endif
2003-03-16 21:13:28 +01:00
2002-01-08 03:01:04 +01:00
//**************************************************************************//
// Playtree
//**************************************************************************//
# include "playtree.h"
2003-05-30 19:57:41 +02:00
# include "playtreeparser.h"
# ifdef HAVE_NEW_GUI
extern int import_playtree_playlist_into_gui ( play_tree_t * my_playtree , m_config_t * config ) ;
extern int import_initial_playtree_into_gui ( play_tree_t * my_playtree , m_config_t * config , int enqueue ) ;
# endif
2002-01-08 03:01:04 +01:00
play_tree_t * playtree ;
2002-11-15 00:49:05 +01:00
play_tree_iter_t * playtree_iter = NULL ;
2002-01-08 03:01:04 +01:00
2002-01-15 00:38:49 +01:00
# define PT_NEXT_ENTRY 1
# define PT_PREV_ENTRY -1
# define PT_NEXT_SRC 2
# define PT_PREV_SRC -2
# define PT_UP_NEXT 3
# define PT_UP_PREV -3
//**************************************************************************//
// Config
//**************************************************************************//
m_config_t * mconfig ;
2002-11-12 02:56:42 +01:00
extern play_tree_t *
m_config_parse_mp_command_line ( m_config_t * config , int argc , char * * argv ) ;
extern int
m_config_parse_config_file ( m_config_t * config , char * conffile ) ;
2001-03-30 05:07:45 +02:00
//**************************************************************************//
// Config file
//**************************************************************************//
2003-08-13 18:29:32 +02:00
static int cfg_inc_verbose ( m_option_t * conf ) { + + verbose ; return 0 ; }
2001-03-19 04:45:49 +01:00
2003-08-13 18:29:32 +02:00
static int cfg_include ( m_option_t * conf , char * filename ) {
2002-01-15 00:38:49 +01:00
return m_config_parse_config_file ( mconfig , filename ) ;
2001-03-19 19:14:21 +01:00
}
2001-10-30 18:04:59 +01:00
# include "get_path.c"
2001-03-21 01:14:42 +01:00
2003-03-26 18:02:28 +01:00
//**************************************************************************//
// XScreensaver
//**************************************************************************//
2003-08-18 16:05:30 +02:00
# ifdef HAVE_X11
2003-03-26 18:02:28 +01:00
void xscreensaver_heartbeat ( float time ) ;
2003-08-18 16:05:30 +02:00
# endif
2003-03-26 18:02:28 +01:00
2001-04-15 05:40:37 +02:00
//**************************************************************************//
2001-04-15 21:13:38 +02:00
//**************************************************************************//
// Input media streaming & demultiplexer:
//**************************************************************************//
2001-07-07 20:46:15 +02:00
static int max_framesize = 0 ;
2002-09-29 21:26:40 +02:00
# include "libmpdemux/stream.h"
# include "libmpdemux/demuxer.h"
# include "libmpdemux/stheader.h"
//#include "parse_es.h"
2001-02-24 21:28:24 +01:00
2002-04-13 21:14:34 +02:00
# include "libmpcodecs/dec_audio.h"
# include "libmpcodecs/dec_video.h"
2002-11-15 00:49:05 +01:00
# include "libmpcodecs/mp_image.h"
# include "libmpcodecs/vf.h"
2001-10-30 18:38:09 +01:00
2002-11-07 00:54:29 +01:00
extern void vf_list_plugins ( ) ;
2001-02-24 21:28:24 +01:00
//**************************************************************************//
//**************************************************************************//
2001-03-16 01:05:52 +01:00
// Common FIFO functions, and keyboard/event FIFO code
# include "fifo.c"
2002-02-28 14:49:04 +01:00
int use_stdin = 0 ;
2001-02-24 21:28:24 +01:00
//**************************************************************************//
2002-07-19 22:51:48 +02:00
vo_functions_t * video_out = NULL ;
2002-02-21 17:02:26 +01:00
ao_functions_t * audio_out = NULL ;
2001-02-24 21:28:24 +01:00
2002-10-09 03:13:40 +02:00
int fixed_vo = 0 ;
2001-10-30 18:04:59 +01:00
// benchmark:
2001-07-08 02:21:20 +02:00
double video_time_usage = 0 ;
double vout_time_usage = 0 ;
2001-07-07 20:46:15 +02:00
static double audio_time_usage = 0 ;
static int total_time_usage_start = 0 ;
2002-04-14 21:43:23 +02:00
static int total_frame_cnt = 0 ;
static int drop_frame_cnt = 0 ; // total number of dropped frames
2002-02-24 18:10:06 +01:00
int benchmark = 0 ;
2001-06-13 23:55:24 +02:00
2001-06-18 16:19:13 +02:00
// options:
2002-07-25 22:34:33 +02:00
int auto_quality = 0 ;
2001-08-12 17:46:09 +02:00
static int output_quality = 0 ;
2001-08-04 15:52:41 +02:00
2002-10-06 01:00:18 +02:00
float playback_speed = 1.0 ;
2001-08-27 02:55:25 +02:00
int use_gui = 0 ;
2003-02-06 00:02:35 +01:00
# ifdef HAVE_NEW_GUI
int enqueue = 0 ;
# endif
2002-12-28 15:17:38 +01:00
# define MAX_OSD_LEVEL 3
2001-08-27 02:55:25 +02:00
2002-08-05 14:57:54 +02:00
int osd_level = 1 ;
2002-09-27 22:57:00 +02:00
int osd_level_saved = - 1 ;
2002-07-02 15:35:04 +02:00
int osd_visible = 100 ;
2001-10-30 18:04:59 +01:00
// seek:
2002-09-29 21:26:40 +02: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 ;
2003-01-04 22:05:55 +01:00
static int loop_seek = 0 ;
2002-09-29 21:26:40 +02:00
2002-10-02 00:29:04 +02:00
// A/V sync:
2002-11-29 00:17:14 +01:00
int autosync = 0 ; // 30 might be a good default value.
2002-10-02 00:29:04 +02:00
2002-09-29 21:26:40 +02:00
// may be changed by GUI: (FIXME!)
2001-10-30 18:04:59 +01:00
float rel_seek_secs = 0 ;
int abs_seek_pos = 0 ;
2001-08-12 17:46:09 +02:00
2001-10-30 18:04:59 +01:00
// codecs:
2002-09-28 20:45:47 +02:00
char * * audio_codec_list = NULL ; // override audio codec
2002-09-26 03:31:18 +02:00
char * * video_codec_list = NULL ; // override video codec
2002-09-28 20:45:47 +02:00
char * * audio_fm_list = NULL ; // override audio codec family
2002-09-26 03:31:18 +02:00
char * * video_fm_list = NULL ; // override video codec family
2001-07-06 23:17:22 +02:00
2001-06-18 16:19:13 +02:00
// streaming:
2001-12-16 22:16:59 +01:00
int audio_id = - 1 ;
int video_id = - 1 ;
2001-12-19 17:55:32 +01:00
int dvdsub_id = - 1 ;
2002-01-10 18:18:30 +01:00
int vobsub_id = - 1 ;
2003-05-23 17:01:25 +02:00
char * audio_lang = NULL ;
2003-04-07 18:04:02 +02:00
char * dvdsub_lang = NULL ;
2002-03-29 04:17:57 +01:00
static char * spudec_ifo = NULL ;
2002-07-03 20:57:52 +02:00
char * filename = NULL ; //"MI2-Trailer.avi";
2003-09-21 16:21:43 +02:00
int forced_subs_only = 0 ;
2001-06-18 16:19:13 +02:00
2001-10-22 01:05:05 +02:00
// cache2:
2002-10-24 00:07:29 +02:00
int stream_cache_size = - 1 ;
2001-10-22 01:05:05 +02:00
# ifdef USE_STREAM_CACHE
extern int cache_fill_status ;
# else
# define cache_fill_status 0
# endif
2001-10-30 18:04:59 +01:00
// dump:
2001-12-01 23:54:17 +01:00
static char * stream_dump_name = " stream.dump " ;
2002-07-25 22:34:33 +02:00
int stream_dump_type = 0 ;
2001-10-30 18:04:59 +01:00
// A-V sync:
2001-08-12 22:52:35 +02:00
static float default_max_pts_correction = - 1 ; //0.01f;
static float max_pts_correction = 0 ; //default_max_pts_correction;
2001-10-30 18:04:59 +01:00
static float c_total = 0 ;
2002-07-25 22:34:33 +02:00
float audio_delay = 0 ;
2001-06-18 16:19:13 +02:00
2001-11-14 01:26:28 +01:00
static int softsleep = 0 ;
2003-01-21 14:33:40 +01:00
float force_fps = 0 ;
2001-10-30 18:04:59 +01:00
static int force_srate = 0 ;
2002-10-06 13:23:02 +02:00
static int audio_output_format = 0 ;
2002-07-25 22:34:33 +02:00
int frame_dropping = 0 ; // option 0=no drop 1= drop vo 2= drop decode
2001-10-30 18:04:59 +01:00
static int play_n_frames = - 1 ;
2002-06-28 19:13:18 +02:00
static int play_n_frames_mf = - 1 ;
2001-06-18 16:19:13 +02:00
// screen info:
2002-09-29 23:53:05 +02:00
char * * video_driver_list = NULL ;
char * * audio_driver_list = NULL ;
2002-03-15 00:28:51 +01:00
2002-09-29 21:26:40 +02:00
extern char * vo_subdevice ;
extern char * ao_subdevice ;
2002-09-20 20:54:22 +02:00
// codec outfmt flags (defined in libmpcodecs/vd.c)
2002-03-15 00:28:51 +01:00
extern int vo_flags ;
2001-06-18 16:19:13 +02:00
// sub:
char * font_name = NULL ;
float font_factor = 0.75 ;
2003-04-07 18:04:02 +02:00
char * * sub_name = NULL ;
2001-06-18 16:19:13 +02:00
float sub_delay = 0 ;
float sub_fps = 0 ;
int sub_auto = 1 ;
2002-01-10 18:18:30 +01:00
char * vobsub_name = NULL ;
2001-07-02 21:25:34 +02:00
/*DSP!!char *dsp=NULL;*/
2002-07-25 05:37:28 +02:00
int subcc_enabled = 0 ;
2002-12-05 01:03:35 +01:00
int suboverlap_enabled = 1 ;
2002-08-30 00:24:49 +02:00
# ifdef USE_SUB
2003-04-07 18:04:02 +02:00
sub_data * set_of_subtitles [ MAX_SUBTITLE_FILES ] ;
int set_of_sub_size = 0 ;
int set_of_sub_pos = - 1 ;
2002-08-30 00:24:49 +02:00
float sub_last_pts = - 303 ;
# endif
2001-06-18 16:19:13 +02:00
2001-10-21 01:48:56 +02:00
static stream_t * stream = NULL ;
2002-08-21 23:31:20 +02:00
static demuxer_t * demuxer = NULL ;
2002-10-06 18:16:53 +02:00
static sh_audio_t * sh_audio = NULL ;
static sh_video_t * sh_video = NULL ;
2002-08-21 23:31:20 +02:00
2002-02-23 16:12:55 +01:00
char * current_module = NULL ; // for debugging
2001-08-22 23:35:44 +02:00
2002-09-29 21:26:40 +02:00
// also modified by Gui/mplayer/gtk/eq.c:
2002-09-27 23:08:36 +02:00
int vo_gamma_gamma = 1000 ;
2002-07-25 15:12:23 +02:00
int vo_gamma_brightness = 1000 ;
int vo_gamma_contrast = 1000 ;
int vo_gamma_saturation = 1000 ;
int vo_gamma_hue = 1000 ;
2002-07-19 22:51:48 +02:00
// ---
2002-11-15 00:49:05 +01:00
# ifdef HAVE_MENU
# include "m_struct.h"
# include "libmenu/menu.h"
extern void vf_menu_pause_update ( struct vf_instance_s * vf ) ;
extern vf_info_t vf_info_menu ;
static vf_info_t * libmenu_vfs [ ] = {
& vf_info_menu ,
NULL
} ;
static vf_instance_t * vf_menu = NULL ;
static int use_menu = 0 ;
static char * menu_cfg = NULL ;
static char * menu_root = " main " ;
# endif
2002-03-12 19:02:02 +01:00
# ifdef HAVE_RTC
2002-09-29 21:26:40 +02:00
static int nortc ;
2002-03-12 19:02:02 +01:00
# endif
2002-12-23 01:33:22 +01:00
# ifdef USE_EDL
struct edl_record edl_records [ MAX_EDL_ENTRIES ] ;
int num_edl_records = 0 ;
FILE * edl_fd = NULL ;
edl_record_ptr next_edl_record = NULL ;
static char * edl_filename = NULL ;
static char * edl_output_filename = NULL ;
short edl_decision = 0 ;
# endif
2001-09-05 12:49:04 +02:00
static unsigned int inited_flags = 0 ;
# define INITED_VO 1
# define INITED_AO 2
# define INITED_GUI 4
# define INITED_GETCH2 8
2001-11-20 19:36:50 +01:00
# define INITED_SPUDEC 32
2001-10-21 01:48:56 +02:00
# define INITED_STREAM 64
2002-01-31 10:37:12 +01:00
# define INITED_INPUT 128
2002-05-18 01:47:27 +02:00
# define INITED_VOBSUB 256
2002-10-06 18:16:53 +02:00
# define INITED_DEMUXER 512
# define INITED_ACODEC 1024
# define INITED_VCODEC 2048
2001-09-05 12:49:04 +02:00
# define INITED_ALL 0xFFFF
2002-09-29 21:26:40 +02:00
static void uninit_player ( unsigned int mask ) {
2001-09-05 12:49:04 +02:00
mask = inited_flags & mask ;
2002-03-17 03:28:32 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_DBG2 , " \n *** uninit(0x%X) \n " , mask ) ;
2002-10-06 18:16:53 +02:00
if ( mask & INITED_ACODEC ) {
inited_flags & = ~ INITED_ACODEC ;
current_module = " uninit_acodec " ;
if ( sh_audio ) uninit_audio ( sh_audio ) ;
sh_audio = NULL ;
}
if ( mask & INITED_VCODEC ) {
inited_flags & = ~ INITED_VCODEC ;
current_module = " uninit_vcodec " ;
if ( sh_video ) uninit_video ( sh_video ) ;
sh_video = NULL ;
2002-11-15 00:49:05 +01:00
# ifdef HAVE_MENU
vf_menu = NULL ;
# endif
2002-10-06 18:16:53 +02:00
}
if ( mask & INITED_DEMUXER ) {
inited_flags & = ~ INITED_DEMUXER ;
current_module = " free_demuxer " ;
2002-11-01 17:10:15 +01:00
if ( demuxer ) {
stream = demuxer - > stream ;
free_demuxer ( demuxer ) ;
}
2002-10-06 18:16:53 +02:00
demuxer = NULL ;
}
2002-04-25 15:27:15 +02:00
// kill the cache process:
2002-03-17 03:28:32 +01:00
if ( mask & INITED_STREAM ) {
inited_flags & = ~ INITED_STREAM ;
current_module = " uninit_stream " ;
if ( stream ) free_stream ( stream ) ;
stream = NULL ;
}
2002-04-25 15:27:15 +02: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 03:28:32 +01: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-18 01:47:27 +02:00
if ( mask & INITED_VOBSUB ) {
inited_flags & = ~ INITED_VOBSUB ;
current_module = " uninit_vobsub " ;
2002-10-06 18:16:53 +02:00
if ( vo_vobsub ) vobsub_close ( vo_vobsub ) ;
2002-05-18 01:47:27 +02:00
vo_vobsub = NULL ;
}
2001-11-20 19:36:50 +01:00
if ( mask & INITED_SPUDEC ) {
inited_flags & = ~ INITED_SPUDEC ;
current_module = " uninit_spudec " ;
spudec_free ( vo_spudec ) ;
2002-03-31 04:22:40 +02:00
vo_spudec = NULL ;
2001-11-20 19:36:50 +01:00
}
2002-04-04 16:24:11 +02:00
2001-09-05 12:49:04 +02:00
if ( mask & INITED_AO ) {
inited_flags & = ~ INITED_AO ;
current_module = " uninit_ao " ;
2002-03-17 03:28:32 +01:00
audio_out - > uninit ( ) ; audio_out = NULL ;
2001-09-05 12:49:04 +02:00
}
2001-08-28 01:56:44 +02:00
# ifdef HAVE_NEW_GUI
2001-09-05 12:49:04 +02:00
if ( mask & INITED_GUI ) {
inited_flags & = ~ INITED_GUI ;
current_module = " uninit_gui " ;
2002-02-23 16:12:55 +01:00
guiDone ( ) ;
2001-09-05 12:49:04 +02:00
}
2001-08-28 01:56:44 +02:00
# endif
2002-01-31 10:37:12 +01:00
if ( mask & INITED_INPUT ) {
2002-06-14 19:40:36 +02:00
inited_flags & = ~ INITED_INPUT ;
2002-01-31 10:37:12 +01:00
current_module = " uninit_input " ;
mp_input_uninit ( ) ;
}
2001-09-06 22:44:42 +02:00
current_module = NULL ;
2001-09-05 12:49:04 +02:00
}
2002-12-29 22:06:20 +01:00
static void exit_player_with_rc ( char * how , int rc ) {
2001-09-05 12:49:04 +02:00
uninit_player ( INITED_ALL ) ;
2003-08-18 16:05:30 +02:00
# ifdef HAVE_X11
2002-05-08 22:24:35 +02:00
# ifdef HAVE_NEW_GUI
if ( ! use_gui )
# endif
2002-05-08 21:21:36 +02:00
vo_uninit ( ) ; // close the X11 connection (if any opened)
# endif
2001-09-05 12:49:04 +02:00
current_module = " exit_player " ;
2002-03-15 22:37:10 +01:00
if ( how ) mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_Exiting , mp_gettext ( how ) ) ;
2002-02-17 02:07:45 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_DBG2 , " max framesize was %d bytes \n " , max_framesize ) ;
2001-08-28 01:56:44 +02:00
2002-12-29 22:06:20 +01:00
exit ( rc ) ;
}
void exit_player ( char * how ) {
exit_player_with_rc ( how , 1 ) ;
2001-02-24 21:28:24 +01:00
}
2002-09-29 21:26:40 +02:00
static void exit_sighandler ( int x ) {
2001-02-24 21:28:24 +01:00
static int sig_count = 0 ;
+ + sig_count ;
2002-04-25 15:27:15 +02:00
if ( sig_count = = 5 | | ( inited_flags = = 0 & & sig_count > 1 ) ) exit ( 1 ) ;
if ( sig_count > 5 ) {
2001-02-24 21:28:24 +01:00
// can't stop :(
2003-04-04 22:02:53 +02:00
# ifndef __MINGW32__
2001-02-24 21:28:24 +01:00
kill ( getpid ( ) , SIGKILL ) ;
2003-04-04 22:02:53 +02:00
# endif
2001-02-24 21:28:24 +01:00
}
2002-03-16 02:56:19 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , " \n " MSGTR_IntBySignal , x ,
2002-03-15 22:37:10 +01:00
current_module ? current_module : mp_gettext ( " unknown " )
2001-02-24 21:28:24 +01:00
) ;
2002-04-25 15:27:15 +02:00
if ( sig_count = = 1 )
2002-03-16 02:56:19 +01:00
switch ( x ) {
case SIGINT :
case SIGQUIT :
case SIGTERM :
case SIGKILL :
break ; // killed from keyboard (^C) or killed [-9]
case SIGILL :
2002-03-16 03:15:10 +01:00
# ifdef RUNTIME_CPUDETECT
2003-01-12 16:32:54 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_Exit_SIGILL_RTCpuSel ) ;
2002-03-16 03:15:10 +01:00
# else
2003-01-12 16:32:54 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_Exit_SIGILL ) ;
2002-03-16 03:15:10 +01:00
# endif
2002-03-16 02:56:19 +01:00
case SIGFPE :
case SIGSEGV :
2003-01-12 16:32:54 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_Exit_SIGSEGV_SIGFPE ) ;
2002-03-16 02:56:19 +01:00
default :
2003-01-12 16:32:54 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_Exit_SIGCRASH ) ;
2002-03-16 02:56:19 +01:00
}
2001-02-24 21:28:24 +01:00
exit_player ( NULL ) ;
}
2001-10-30 18:04:59 +01:00
//extern void write_avi_header_1(FILE *f,int fcc,float fps,int width,int height);
2001-08-04 15:52:41 +02:00
2002-10-23 19:21:01 +02:00
extern void mp_input_register_options ( m_config_t * cfg ) ;
2002-02-11 12:46:27 +01:00
2001-04-16 02:09:53 +02:00
# include "mixer.h"
2001-03-19 00:32:31 +01:00
# include "cfg-mplayer.h"
2001-02-24 21:28:24 +01:00
2002-01-15 00:38:49 +01:00
void parse_cfgfiles ( m_config_t * conf )
2001-05-08 14:17:03 +02:00
{
2001-06-05 02:58:51 +02:00
char * conffile ;
int conffile_fd ;
2003-06-09 14:15:48 +02:00
if ( m_config_parse_config_file ( conf , MPLAYER_CONFDIR " /mplayer.conf " ) < 0 )
2001-03-19 00:32:31 +01:00
exit ( 1 ) ;
2001-03-21 01:14:42 +01:00
if ( ( conffile = get_path ( " " ) ) = = NULL ) {
2001-08-18 21:52:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_WARN , MSGTR_NoHomeDir ) ;
2001-03-19 00:32:31 +01:00
} else {
2003-04-04 22:02:53 +02:00
# ifdef __MINGW32__
mkdir ( conffile ) ;
# else
2001-03-21 01:14:42 +01:00
mkdir ( conffile , 0777 ) ;
2003-04-04 22:02:53 +02:00
# endif
2001-03-21 01:14:42 +01:00
free ( conffile ) ;
if ( ( conffile = get_path ( " config " ) ) = = NULL ) {
2001-08-18 21:52:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_GetpathProblem ) ;
2001-03-21 01:14:42 +01:00
} else {
if ( ( conffile_fd = open ( conffile , O_CREAT | O_EXCL | O_WRONLY , 0666 ) ) ! = - 1 ) {
2001-08-18 21:51:21 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_CreatingCfgFile , conffile ) ;
2001-03-21 01:14:42 +01:00
write ( conffile_fd , default_config , strlen ( default_config ) ) ;
close ( conffile_fd ) ;
}
2002-01-15 00:38:49 +01:00
if ( m_config_parse_config_file ( conf , conffile ) < 0 )
2001-03-21 01:14:42 +01:00
exit ( 1 ) ;
free ( conffile ) ;
2001-03-19 03:29:37 +01:00
}
2001-02-24 21:28:24 +01:00
}
}
2002-12-28 15:29:41 +01:00
void load_per_file_config ( m_config_t * conf , const char * const file )
{
char * confpath ;
2002-12-29 15:36:56 +01:00
char cfg [ strlen ( file ) + 10 ] ;
2002-12-28 15:29:41 +01:00
struct stat st ;
char * name ;
sprintf ( cfg , " %s.conf " , file ) ;
if ( ! stat ( cfg , & st ) )
{
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " Loading config '%s' \n " , cfg ) ;
m_config_parse_config_file ( conf , cfg ) ;
return ;
}
if ( ( name = strrchr ( cfg , ' / ' ) ) = = NULL )
name = cfg ;
else
name + + ;
if ( ( confpath = get_path ( name ) ) ! = NULL )
{
if ( ! stat ( confpath , & st ) )
{
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " Loading config '%s' \n " , confpath ) ;
m_config_parse_config_file ( conf , confpath ) ;
}
free ( confpath ) ;
}
}
2002-02-23 22:22:55 +01:00
// When libmpdemux perform a blocking operation (network connection or cache filling)
// if the operation fail we use this function to check if it was interrupted by the user.
// The function return a new value for eof.
static int libmpdemux_was_interrupted ( int eof ) {
mp_cmd_t * cmd ;
if ( ( cmd = mp_input_get_cmd ( 0 , 0 ) ) ! = NULL ) {
switch ( cmd - > id ) {
case MP_CMD_QUIT :
2002-12-29 22:06:20 +01:00
exit_player_with_rc ( MSGTR_Exit_quit , 0 ) ;
2002-02-23 22:22:55 +01:00
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 ;
}
2003-01-13 03:42:06 +01:00
# define mp_basename(s) (strrchr(s,' / ')==NULL?(char*)s:(strrchr(s,' / ')+1))
2003-01-12 20:41:38 +01:00
int playtree_add_playlist ( play_tree_t * entry )
{
2003-02-06 21:57:25 +01:00
play_tree_add_bpf ( entry , filename ) ;
2003-02-06 00:02:35 +01:00
# ifdef HAVE_NEW_GUI
if ( use_gui ) {
if ( entry ) {
import_playtree_playlist_into_gui ( entry , mconfig ) ;
play_tree_free_list ( entry , 1 ) ;
}
} else
# endif
{
2003-01-12 20:41:38 +01:00
if ( ! entry ) {
entry = playtree_iter - > tree ;
if ( play_tree_iter_step ( playtree_iter , 1 , 0 ) ! = PLAY_TREE_ITER_ENTRY ) {
return PT_NEXT_ENTRY ;
}
if ( playtree_iter - > tree = = entry ) { // Loop with a single file
if ( play_tree_iter_up_step ( playtree_iter , 1 , 0 ) ! = PLAY_TREE_ITER_ENTRY ) {
return PT_NEXT_ENTRY ;
}
}
play_tree_remove ( entry , 1 , 1 ) ;
return PT_NEXT_SRC ;
}
play_tree_insert_entry ( playtree_iter - > tree , entry ) ;
play_tree_set_params_from ( entry , playtree_iter - > tree ) ;
entry = playtree_iter - > tree ;
if ( play_tree_iter_step ( playtree_iter , 1 , 0 ) ! = PLAY_TREE_ITER_ENTRY ) {
return PT_NEXT_ENTRY ;
}
play_tree_remove ( entry , 1 , 1 ) ;
2003-02-06 00:02:35 +01:00
}
2003-01-12 20:41:38 +01:00
return PT_NEXT_SRC ;
}
2002-11-15 00:49:05 +01:00
static int play_tree_step = 1 ;
2003-04-07 18:04:02 +02:00
# ifdef USE_SUB
sub_data * subdata = NULL ;
void add_subtitles ( char * filename , float fps , int silent )
{
sub_data * subd ;
if ( filename = = NULL ) {
subd = ( sub_data * ) malloc ( sizeof ( sub_data ) ) ;
subd - > filename = strdup ( " none " ) ;
subd - > subtitles = NULL ;
subd - > sub_uses_time = 1 ;
subd - > sub_num = 0 ;
subd - > sub_errs = 0 ;
set_of_subtitles [ set_of_sub_size ] = subd ;
+ + set_of_sub_size ;
return ;
}
subd = sub_read_file ( filename , fps ) ;
if ( ! subd & & ! silent )
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_CantLoadSub , filename ) ;
if ( subd = = NULL | | set_of_sub_size > = MAX_SUBTITLE_FILES ) return ;
set_of_subtitles [ set_of_sub_size ] = subd ;
+ + set_of_sub_size ;
printf ( " SUB: added subtitle file (%d): %s \n " , set_of_sub_size , filename ) ;
}
void update_set_of_subtitles ( )
// subdata was changed, set_of_sub... have to be updated.
{
int i ;
if ( set_of_sub_size > 0 & & subdata = = NULL ) { // *subdata was deleted
for ( i = set_of_sub_pos + 1 ; i < set_of_sub_size ; + + i )
set_of_subtitles [ i - 1 ] = set_of_subtitles [ i ] ;
set_of_subtitles [ set_of_sub_size - 1 ] = NULL ;
- - set_of_sub_size ;
if ( set_of_sub_size > 0 ) subdata = set_of_subtitles [ set_of_sub_pos = 0 ] ;
}
else if ( set_of_sub_size > 0 & & subdata ! = NULL ) { // *subdata was changed
set_of_subtitles [ set_of_sub_pos ] = subdata ;
}
else if ( set_of_sub_size < = 0 & & subdata ! = NULL ) { // *subdata was added
set_of_subtitles [ set_of_sub_pos = set_of_sub_size ] = subdata ;
+ + set_of_sub_size ;
}
}
# endif
2002-08-31 17:04:18 +02: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
2003-01-05 16:39:16 +01:00
2002-08-31 17:04:18 +02:00
int main ( int argc , char * argv [ ] ) {
2001-05-08 14:17:03 +02:00
2001-07-07 20:46:15 +02:00
static demux_stream_t * d_audio = NULL ;
static demux_stream_t * d_video = NULL ;
static demux_stream_t * d_dvdsub = NULL ;
2001-06-05 02:58:51 +02:00
int file_format = DEMUXER_TYPE_UNKNOWN ;
2002-01-15 00:38:49 +01:00
2001-06-05 02:58:51 +02:00
int delay_corrected = 1 ;
// movie info:
2002-01-08 03:01:04 +01:00
int eof = 0 ;
2001-06-05 02:58:51 +02:00
int osd_function = OSD_PLAY ;
int osd_last_pts = - 303 ;
2001-12-27 01:59:40 +01:00
int osd_show_av_delay = 0 ;
2003-05-17 11:21:21 +02:00
int osd_show_text = 0 ;
2001-12-01 00:44:04 +01:00
int osd_show_sub_delay = 0 ;
2002-12-05 01:18:56 +01:00
int osd_show_sub_pos = 0 ;
2002-10-06 19:40:51 +02:00
int osd_show_sub_visibility = 0 ;
2002-12-23 02:37:43 +01:00
int osd_show_sub_alignment = 0 ;
2002-10-17 17:44:41 +02:00
int osd_show_vobsub_changed = 0 ;
2003-04-07 18:04:02 +02:00
int osd_show_sub_changed = 0 ;
2002-12-28 15:17:38 +01:00
int osd_show_percentage = 0 ;
2002-12-28 23:57:39 +01:00
int osd_show_tv_channel = 25 ;
2001-06-05 02:58:51 +02:00
2001-11-14 01:26:28 +01:00
int rtc_fd = - 1 ;
2001-07-21 03:17:00 +02:00
//float a_frame=0; // Audio
2001-06-05 02:58:51 +02:00
int i ;
2003-04-07 18:04:02 +02:00
char * tmp ;
2001-06-05 02:58:51 +02:00
2001-08-30 23:14:34 +02:00
int gui_no_filename = 0 ;
2003-03-16 21:13:28 +01:00
2003-01-12 23:40:51 +01:00
srand ( ( int ) time ( NULL ) ) ;
2002-03-20 16:22:48 +01:00
mp_msg_init ( ) ;
mp_msg_set_level ( MSGL_STATUS ) ;
2001-08-17 02:40:25 +02:00
2003-07-22 12:46:22 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " MPlayer " VERSION " (C) 2000-2003 MPlayer Team \n \n " ) ;
2001-10-19 04:00:45 +02:00
/* Test for cpu capabilities (and corresponding OS support) for optimizing */
GetCpuCaps ( & gCpuCaps ) ;
2003-01-18 20:29:46 +01:00
# ifdef ARCH_X86
2002-05-20 03:00:51 +02: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 04:00:45 +02:00
gCpuCaps . has3DNow , gCpuCaps . has3DNowExt ,
gCpuCaps . hasSSE , gCpuCaps . hasSSE2 ) ;
2001-12-25 18:53:31 +01:00
# ifdef RUNTIME_CPUDETECT
2002-08-05 20:37:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_CompiledWithRuntimeDetection ) ;
2001-12-25 18:53:31 +01:00
# else
2002-08-05 20:37:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_CompiledWithCPUExtensions ) ;
2001-12-25 18:53:31 +01: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 03:00:51 +02:00
# ifdef HAVE_SSE2
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " SSE2 " ) ;
# endif
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " \n \n " ) ;
2001-12-25 18:53:31 +01:00
# endif
2002-04-12 12:40:38 +02:00
# endif
2003-08-17 21:18:29 +02:00
# if defined(WIN32) && defined(USE_WIN32DLL)
{ /*make our codec dirs available for LoadLibraryA()*/
char tmppath [ MAX_PATH * 2 + 1 ] ;
char win32path [ MAX_PATH ] ;
char realpath [ MAX_PATH ] ;
int WINAPI SetEnvironmentVariableA ( char * , char * ) ;
int WINAPI GetModuleFileNameA ( void * , char * , int ) ;
# ifdef __CYGWIN__
cygwin_conv_to_full_win32_path ( WIN32_PATH , win32path ) ;
strcpy ( tmppath , win32path ) ;
# ifdef USE_REALCODECS
cygwin_conv_to_full_win32_path ( REALCODEC_PATH , realpath ) ;
sprintf ( tmppath , " %s;%s " , win32path , realpath ) ;
# endif /*USE_REALCODECS*/
# else
if ( ! strstr ( WIN32_PATH , " : " ) ) {
GetModuleFileNameA ( NULL , win32path , MAX_PATH ) ;
strcpy ( win32path + strlen ( win32path ) - strlen ( " mplayer.exe " ) , WIN32_PATH ) ;
}
else strcpy ( win32path , WIN32_PATH ) ;
strcpy ( tmppath , win32path ) ;
# ifdef USE_REALCODECS
if ( ! strstr ( REALCODEC_PATH , " : " ) ) {
GetModuleFileNameA ( NULL , realpath , MAX_PATH ) ;
strcpy ( realpath + strlen ( realpath ) - strlen ( " mplayer.exe " ) , REALCODEC_PATH ) ;
}
else strcpy ( realpath , REALCODEC_PATH ) ;
sprintf ( tmppath , " %s;%s " , win32path , realpath ) ;
# endif /*USE_REALCODECS*/
# endif /*__CYGWIN__*/
SetEnvironmentVariableA ( " PATH " , tmppath ) ;
}
# endif /*WIN32 && USE_WIN32DLL*/
2002-08-22 23:30:31 +02:00
# ifdef USE_TV
2002-04-12 12:40:38 +02:00
tv_param_immediate = 1 ;
2002-08-22 23:30:31 +02:00
# endif
2001-10-19 04:00:45 +02:00
2001-08-27 02:55:25 +02:00
if ( argv [ 0 ] )
if ( ! strcmp ( argv [ 0 ] , " gmplayer " ) | |
( strrchr ( argv [ 0 ] , ' / ' ) & & ! strcmp ( strrchr ( argv [ 0 ] , ' / ' ) , " /gmplayer " ) ) )
use_gui = 1 ;
2001-08-22 23:35:44 +02:00
2002-11-12 02:56:42 +01:00
mconfig = m_config_new ( ) ;
2002-01-15 00:38:49 +01:00
m_config_register_options ( mconfig , mplayer_opts ) ;
// TODO : add something to let modules register their options
2002-10-23 19:21:01 +02:00
mp_input_register_options ( mconfig ) ;
2002-01-15 00:38:49 +01:00
parse_cfgfiles ( mconfig ) ;
2002-08-16 00:52:52 +02:00
# ifdef HAVE_NEW_GUI
if ( use_gui ) cfg_read ( ) ;
# endif
2002-01-15 00:38:49 +01:00
2002-11-12 02:56:42 +01:00
playtree = m_config_parse_mp_command_line ( mconfig , argc , argv ) ;
if ( playtree = = NULL )
exit ( 1 ) ;
2002-01-15 00:38:49 +01:00
2002-01-08 03:01:04 +01:00
playtree = play_tree_cleanup ( playtree ) ;
if ( playtree ) {
2002-01-15 00:38:49 +01:00
playtree_iter = play_tree_iter_new ( playtree , mconfig ) ;
2002-01-08 03:01:04 +01:00
if ( playtree_iter ) {
if ( play_tree_iter_step ( playtree_iter , 0 , 0 ) ! = PLAY_TREE_ITER_ENTRY ) {
play_tree_iter_free ( playtree_iter ) ;
playtree_iter = NULL ;
}
filename = play_tree_iter_get_file ( playtree_iter , 1 ) ;
2001-11-03 03:55:03 +01:00
}
}
2002-01-08 03:01:04 +01:00
2001-08-27 02:55:25 +02:00
# ifndef HAVE_NEW_GUI
if ( use_gui ) {
2001-09-26 23:35:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_WARN , MSGTR_NoGui ) ;
2001-08-27 02:55:25 +02:00
use_gui = 0 ;
}
2001-08-28 01:56:44 +02:00
# else
if ( use_gui & & ! vo_init ( ) ) {
2001-09-26 23:35:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_WARN , MSGTR_GuiNeedsX ) ;
2001-08-28 01:56:44 +02:00
use_gui = 0 ;
}
2003-02-06 00:02:35 +01:00
if ( use_gui & & playtree_iter ) {
2003-02-07 21:01:19 +01:00
char cwd [ PATH_MAX + 2 ] ;
2003-02-06 00:02:35 +01:00
// Remove Playtree and Playtree-Iter from memory as its not used by gui
play_tree_iter_free ( playtree_iter ) ;
playtree_iter = NULL ;
2003-02-06 21:57:25 +01:00
2003-02-07 20:44:12 +01:00
if ( getcwd ( cwd , PATH_MAX ) ! = ( char * ) NULL )
2003-02-06 21:57:25 +01:00
{
strcat ( cwd , " / " ) ;
// Prefix relative paths with current working directory
play_tree_add_bpf ( playtree , cwd ) ;
}
2003-02-06 00:02:35 +01:00
// Import initital playtree into gui
import_initial_playtree_into_gui ( playtree , mconfig , enqueue ) ;
}
2001-08-27 02:55:25 +02:00
# endif
2002-09-29 23:53:05 +02:00
if ( video_driver_list & & strcmp ( video_driver_list [ 0 ] , " help " ) = = 0 ) {
list_video_out ( ) ;
2001-05-08 14:17:03 +02:00
exit ( 0 ) ;
2001-06-03 02:24:49 +02:00
}
2002-03-14 22:31:25 +01:00
2002-09-30 00:57:54 +02:00
if ( audio_driver_list & & strcmp ( audio_driver_list [ 0 ] , " help " ) = = 0 ) {
list_audio_out ( ) ;
2001-06-03 02:24:49 +02:00
exit ( 0 ) ;
}
2001-08-25 21:11:24 +02:00
2001-09-27 14:59:35 +02:00
// check codec.conf
if ( ! parse_codec_cfg ( get_path ( " codecs.conf " ) ) ) {
2003-06-09 14:15:48 +02:00
if ( ! parse_codec_cfg ( MPLAYER_CONFDIR " /codecs.conf " ) ) {
2002-12-16 00:45:19 +01:00
if ( ! parse_codec_cfg ( NULL ) ) {
mp_msg ( MSGT_CPLAYER , MSGL_HINT , MSGTR_CopyCodecsConf ) ;
exit ( 0 ) ;
}
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_BuiltinCodecsConf ) ;
2001-09-27 14:59:35 +02:00
}
}
2002-09-26 03:31:18 +02: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 04:23:20 +02:00
if ( audio_codec_list & & strcmp ( audio_codec_list [ 0 ] , " help " ) = = 0 ) {
2002-08-05 20:37:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_AvailableAudioCodecs ) ;
2001-09-27 14:59:35 +02:00
list_codecs ( 1 ) ;
printf ( " \n " ) ;
exit ( 0 ) ;
}
2002-09-26 03:31:18 +02:00
if ( video_codec_list & & strcmp ( video_codec_list [ 0 ] , " help " ) = = 0 ) {
2002-08-05 20:37:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_AvailableVideoCodecs ) ;
2001-09-27 14:59:35 +02:00
list_codecs ( 0 ) ;
printf ( " \n " ) ;
exit ( 0 ) ;
}
2002-09-26 03:31:18 +02:00
if ( video_fm_list & & strcmp ( video_fm_list [ 0 ] , " help " ) = = 0 ) {
2002-08-31 15:09:23 +02:00
vfm_help ( ) ;
printf ( " \n " ) ;
exit ( 0 ) ;
}
2002-09-28 04:23:20 +02:00
if ( audio_fm_list & & strcmp ( audio_fm_list [ 0 ] , " help " ) = = 0 ) {
2002-08-31 15:09:23 +02:00
afm_help ( ) ;
printf ( " \n " ) ;
exit ( 0 ) ;
}
2003-02-08 10:08:11 +01:00
# ifdef HAVE_X11
2003-02-07 20:38:39 +01:00
if ( vo_fstype_list & & strcmp ( vo_fstype_list [ 0 ] , " help " ) = = 0 ) {
fstype_help ( ) ;
printf ( " \n " ) ;
exit ( 0 ) ;
}
2003-02-08 10:08:11 +01:00
# endif
2001-09-27 14:59:35 +02:00
2002-12-23 01:33:22 +01:00
# ifdef USE_EDL
{
FILE * fd ;
char line [ 100 ] ;
float start , stop , duration ;
int action ;
int next_edl_array_index = 0 ;
int lineCount = 0 ;
next_edl_record = edl_records ;
if ( edl_filename ) {
if ( ( fd = fopen ( edl_filename , " r " ) ) = = NULL ) {
printf ( " Error opening EDL file [%s]! \n " , edl_filename ) ;
next_edl_record - > next = NULL ;
} else {
while ( fgets ( line , 99 , fd ) ! = NULL ) {
lineCount + + ;
if ( ( sscanf ( line , " %f %f %d " , & start , & stop , & action ) ) = = 0 ) {
printf ( " Invalid EDL line: [%s] \n " , line ) ;
} else {
if ( next_edl_array_index > 0 ) {
edl_records [ next_edl_array_index - 1 ] . next = & edl_records [ next_edl_array_index ] ;
if ( start < = edl_records [ next_edl_array_index - 1 ] . stop_sec ) {
printf ( " Invalid EDL line [%d]: [%s] \n " , lineCount , line ) ;
printf ( " Last stop position was [%f]; next start is [%f]. Entries must be in chronological order and cannot overlap. Discarding EDL entry. \n " , edl_records [ next_edl_array_index - 1 ] . stop_sec , start ) ;
continue ;
}
}
if ( stop < = start ) {
printf ( " Invalid EDL line [%d]: [%s] \n " , lineCount , line ) ;
printf ( " Stop time must follow start time. Discarding EDL entry. \n " ) ;
continue ;
}
edl_records [ next_edl_array_index ] . action = action ;
if ( action = = EDL_MUTE ) {
edl_records [ next_edl_array_index ] . length_sec = 0 ;
edl_records [ next_edl_array_index ] . start_sec = start ;
edl_records [ next_edl_array_index ] . stop_sec = start ;
next_edl_array_index + + ;
if ( next_edl_array_index > = MAX_EDL_ENTRIES - 1 ) {
break ;
}
edl_records [ next_edl_array_index - 1 ] . next = & edl_records [ next_edl_array_index ] ;
edl_records [ next_edl_array_index ] . action = EDL_MUTE ;
edl_records [ next_edl_array_index ] . length_sec = 0 ;
edl_records [ next_edl_array_index ] . start_sec = stop ;
edl_records [ next_edl_array_index ] . stop_sec = stop ;
} else {
edl_records [ next_edl_array_index ] . length_sec = stop - start ;
edl_records [ next_edl_array_index ] . start_sec = start ;
edl_records [ next_edl_array_index ] . stop_sec = stop ;
}
next_edl_array_index + + ;
if ( next_edl_array_index > = MAX_EDL_ENTRIES - 1 ) {
break ;
}
}
}
if ( next_edl_array_index > 0 ) {
edl_records [ next_edl_array_index - 1 ] . next = & edl_records [ next_edl_array_index ] ;
}
edl_records [ next_edl_array_index ] . start_sec = - 1 ;
edl_records [ next_edl_array_index ] . next = NULL ;
num_edl_records = ( next_edl_array_index ) ;
}
fclose ( fd ) ;
} else {
next_edl_record - > next = NULL ;
}
if ( edl_output_filename ) {
if ( edl_filename ) {
printf ( " Sorry; EDL mode and EDL output mode are mutually exclusive! Disabling all EDL functions. \n " ) ;
edl_output_filename = NULL ;
edl_filename = NULL ;
next_edl_record - > next = NULL ;
} else {
if ( ( edl_fd = fopen ( edl_output_filename , " w " ) ) = = NULL ) {
2003-01-03 13:26:17 +01:00
printf ( " Error opening file [%s] for writing! \n " , edl_output_filename ) ;
2002-12-23 01:33:22 +01:00
edl_output_filename = NULL ;
next_edl_record - > next = NULL ;
}
}
}
# ifdef DEBUG_EDL
{
printf ( " EDL Records: \n " ) ;
if ( next_edl_record - > next ! = NULL ) {
while ( next_edl_record - > next ! = NULL ) {
printf ( " EDL: start [%f], stop [%f], action [%d] \n " , next_edl_record - > start_sec , next_edl_record - > stop_sec , next_edl_record - > action ) ;
next_edl_record = next_edl_record - > next ;
}
next_edl_record = edl_records ;
}
}
# endif
}
# endif
2001-09-27 14:59:35 +02:00
2003-03-30 19:13:04 +02:00
if ( ! filename ) {
2001-08-30 23:14:34 +02:00
if ( ! use_gui ) {
2001-08-25 21:11:24 +02:00
// no file/vcd/dvd -> show HELP:
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , help_text ) ;
2001-08-25 21:11:24 +02:00
exit ( 0 ) ;
2001-08-30 23:14:34 +02:00
} else gui_no_filename = 1 ;
2001-08-25 21:11:24 +02:00
}
// Many users forget to include command line in bugreports...
2002-11-01 18:46:45 +01:00
if ( verbose > 0 ) {
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " CommandLine: " ) ;
2001-08-25 21:11:24 +02:00
for ( i = 1 ; i < argc ; i + + ) printf ( " '%s' " , argv [ i ] ) ;
printf ( " \n " ) ;
}
2001-08-22 23:35:44 +02:00
2002-03-20 16:22:48 +01:00
mp_msg_set_level ( verbose + MSGL_STATUS ) ;
2001-08-22 23:35:44 +02:00
//------ load global data first ------
# ifdef USE_OSD
2002-08-28 22:52:02 +02:00
// check font
2001-08-22 23:35:44 +02: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 )
2003-06-09 14:15:48 +02:00
vo_font = read_font_desc ( MPLAYER_DATADIR " /font/font.desc " , font_factor , verbose > 1 ) ;
2001-08-22 23:35:44 +02:00
}
2002-12-29 15:59:23 +01:00
# ifdef HAVE_FREETYPE
if ( ! vo_font )
init_freetype ( ) ;
2002-08-28 22:52:02 +02:00
# endif
2001-08-22 23:35:44 +02:00
# endif
2002-04-15 21:17:12 +02:00
vo_init_osd ( ) ;
2001-11-20 08:53:20 +01:00
# ifdef HAVE_RTC
2002-03-12 19:02:02 +01:00
if ( ! nortc )
{
2002-09-24 00:05:09 +02:00
// seteuid(0); /* Can't hurt to try to get root here */
2001-11-14 01:26:28 +01:00
if ( ( rtc_fd = open ( " /dev/rtc " , O_RDONLY ) ) < 0 )
2002-09-24 00:05:09 +02: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 01:26:28 +01:00
rtc_fd = - 1 ;
} else if ( ioctl ( rtc_fd , RTC_PIE_ON , 0 ) < 0 ) {
/* variable only by the root */
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , " Linux RTC init error in ioctl (rtc_pie_on): %s \n " , strerror ( errno ) ) ;
2001-11-14 01:26:28 +01:00
close ( rtc_fd ) ;
rtc_fd = - 1 ;
} else
2002-08-05 20:37:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_UsingRTCTiming , irqp ) ;
2001-11-14 01:26:28 +01:00
}
2002-03-12 19:02:02 +01:00
}
2002-01-15 18:03:19 +01:00
# ifdef HAVE_NEW_GUI
2001-12-28 03:04:06 +01:00
// breaks DGA and SVGAlib and VESA drivers: --A'rpi
2002-01-15 18:03:19 +01:00
// and now ? -- Pontscho
if ( use_gui ) setuid ( getuid ( ) ) ; // strongly test, please check this.
# endif
2001-11-14 01:26:28 +01:00
if ( rtc_fd < 0 )
# endif
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " Using %s timing \n " , softsleep ? " software " : " usleep() " ) ;
2001-11-14 01:26:28 +01:00
2001-08-22 23:35:44 +02:00
# ifdef USE_TERMCAP
2001-12-19 17:55:32 +01:00
if ( ! use_gui ) load_termcap ( NULL ) ; // load key-codes
2001-08-22 23:35:44 +02:00
# endif
2001-09-01 00:35:04 +02:00
// ========== Init keyboard FIFO (connection to libvo) ============
2001-08-25 23:05:23 +02:00
2002-01-30 13:46:03 +01:00
// Init input system
current_module = " init_input " ;
mp_input_init ( ) ;
2003-04-04 22:02:53 +02:00
# ifndef HAVE_NO_POSIX_SELECT
make_pipe ( & keyb_fifo_get , & keyb_fifo_put ) ;
2002-01-30 13:46:03 +01:00
if ( keyb_fifo_get > 0 )
mp_input_add_key_fd ( keyb_fifo_get , 1 , NULL , NULL ) ;
2003-04-04 22:02:53 +02:00
# else
mp_input_add_key_fd ( - 1 , 0 , mplayer_get_key , NULL ) ;
# endif
2002-01-30 13:46:03 +01:00
if ( slave_mode )
2003-09-22 13:31:51 +02:00
# ifndef __MINGW32__
2002-01-30 13:46:03 +01:00
mp_input_add_cmd_fd ( 0 , 1 , NULL , NULL ) ;
2003-09-22 13:31:51 +02:00
# else
mp_input_add_cmd_fd ( 0 , 0 , mp_input_win32_slave_cmd_func , NULL ) ;
# endif
2002-02-28 14:49:04 +01:00
else if ( ! use_stdin )
2003-04-04 22:02:53 +02:00
# ifndef HAVE_NO_POSIX_SELECT
2002-01-30 13:46:03 +01:00
mp_input_add_key_fd ( 0 , 1 , NULL , NULL ) ;
2003-04-04 22:02:53 +02:00
# else
mp_input_add_key_fd ( 0 , 0 , NULL , NULL ) ;
# endif
2002-01-31 10:37:12 +01:00
inited_flags | = INITED_INPUT ;
2002-01-30 13:46:03 +01:00
current_module = NULL ;
2002-11-15 00:49:05 +01:00
# ifdef HAVE_MENU
if ( use_menu ) {
2003-01-02 22:22:50 +01:00
if ( menu_cfg & & menu_init ( menu_cfg ) )
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " Menu inited: %s \n " , menu_cfg ) ;
2002-11-15 00:49:05 +01:00
else {
2003-01-02 22:22:50 +01:00
menu_cfg = get_path ( " menu.conf " ) ;
if ( menu_init ( menu_cfg ) )
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " Menu inited: %s \n " , menu_cfg ) ;
else {
2003-06-09 14:15:48 +02:00
if ( menu_init ( MPLAYER_CONFDIR " /menu.conf " ) )
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " Menu inited: %s \n " , MPLAYER_CONFDIR " /menu.conf " ) ;
2003-01-02 22:22:50 +01:00
else {
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " Menu init failed \n " ) ;
use_menu = 0 ;
}
}
2002-11-15 00:49:05 +01:00
}
}
# endif
2002-01-30 13:46:03 +01:00
2001-08-22 23:35:44 +02:00
//========= Catch terminate signals: ================
// terminate requests:
signal ( SIGTERM , exit_sighandler ) ; // kill
signal ( SIGHUP , exit_sighandler ) ; // kill -HUP / xterm closed
2001-08-28 17:55:02 +02:00
signal ( SIGINT , exit_sighandler ) ; // Interrupt from keyboard
2001-08-22 23:35:44 +02:00
signal ( SIGQUIT , exit_sighandler ) ; // Quit from keyboard
2002-03-27 04:45:55 +01:00
# ifdef ENABLE_SIGHANDLER
2001-08-22 23:35:44 +02: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 04:45:55 +01:00
# endif
2001-08-22 23:35:44 +02:00
2002-03-07 00:54:20 +01:00
# ifdef HAVE_NEW_GUI
if ( use_gui ) {
2002-05-28 13:55:17 +02:00
guiInit ( ) ;
2002-03-07 00:54:20 +01:00
inited_flags | = INITED_GUI ;
2002-03-07 12:57:33 +01:00
guiGetEvent ( guiCEvent , ( char * ) ( ( gui_no_filename ) ? 0 : 1 ) ) ;
2002-03-07 00:54:20 +01:00
}
# endif
2002-05-05 19:22:38 +02:00
// ******************* Now, let's see the per-file stuff ********************
2001-08-22 23:35:44 +02:00
play_next_file :
2001-08-30 23:14:34 +02:00
2002-12-28 15:29:41 +01:00
if ( filename ) load_per_file_config ( mconfig , filename ) ;
2002-02-24 13:05:12 +01:00
// We must enable getch2 here to be able to interrupt network connection
// or cache filling
if ( ! use_stdin & & ! slave_mode ) {
2002-05-05 19:22:38 +02: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 13:05:12 +01:00
inited_flags | = INITED_GETCH2 ;
2002-03-17 03:28:32 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_DBG2 , " \n [[[init getch2]]] \n " ) ;
2002-02-24 13:05:12 +01:00
}
2002-02-23 22:22:55 +01:00
2002-05-05 19:22:38 +02:00
// =================== GUI idle loop (STOP state) ===========================
2001-08-29 17:08:43 +02:00
# ifdef HAVE_NEW_GUI
2001-08-30 23:14:34 +02:00
if ( use_gui ) {
2002-12-11 02:21:12 +01:00
file_format = DEMUXER_TYPE_UNKNOWN ;
guiGetEvent ( guiSetDefaults , 0 ) ;
2002-04-17 23:12:12 +02:00
while ( guiIntfStruct . Playing ! = 1 )
{
2002-02-25 14:14:27 +01:00
mp_cmd_t * cmd ;
2003-02-19 18:14:57 +01:00
usec_sleep ( 20000 ) ;
2002-02-21 23:48:47 +01:00
guiEventHandling ( ) ;
2002-07-02 15:35:04 +02:00
guiGetEvent ( guiReDraw , NULL ) ;
2002-02-25 14:14:27 +01:00
if ( ( cmd = mp_input_get_cmd ( 0 , 0 ) ) ! = NULL ) guiGetEvent ( guiIEvent , ( char * ) cmd - > id ) ;
2002-04-17 23:12:12 +02:00
}
2002-12-11 02:21:12 +01:00
guiGetEvent ( guiSetParameters , NULL ) ;
if ( guiIntfStruct . StreamType = = STREAMTYPE_STREAM )
2001-12-17 01:07:20 +01:00
{
2002-03-06 19:42:56 +01:00
play_tree_t * entry = play_tree_new ( ) ;
play_tree_add_file ( entry , guiIntfStruct . Filename ) ;
2002-03-07 12:57:33 +01:00
if ( playtree ) play_tree_free_list ( playtree - > child , 1 ) ;
else playtree = play_tree_new ( ) ;
play_tree_set_child ( playtree , entry ) ;
if ( playtree )
2002-03-06 19:42:56 +01:00
{
2002-03-07 12:57:33 +01:00
playtree_iter = play_tree_iter_new ( playtree , mconfig ) ;
2002-03-06 19:42:56 +01:00
if ( playtree_iter )
{
if ( play_tree_iter_step ( playtree_iter , 0 , 0 ) ! = PLAY_TREE_ITER_ENTRY )
{
play_tree_iter_free ( playtree_iter ) ;
playtree_iter = NULL ;
}
filename = play_tree_iter_get_file ( playtree_iter , 1 ) ;
}
}
2002-03-07 12:57:33 +01:00
}
2001-08-30 23:14:34 +02:00
}
# endif
2002-05-05 19:22:38 +02:00
//---------------------------------------------------------------------------
2001-08-30 23:14:34 +02:00
2002-05-20 05:25:26 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " \n " ) ;
2001-09-26 23:35:14 +02:00
if ( filename ) mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_Playing , filename ) ;
2001-08-23 13:33:58 +02:00
2002-05-05 19:22:38 +02:00
//==================== Open VOB-Sub ============================
2002-02-20 23:41:06 +01:00
current_module = " vobsub " ;
if ( vobsub_name ) {
2002-05-18 01:47:27 +02:00
vo_vobsub = vobsub_open ( vobsub_name , spudec_ifo , 1 , & vo_spudec ) ;
2002-02-20 23:41:06 +01:00
if ( vo_vobsub = = NULL )
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_CantLoadSub , vobsub_name ) ;
} else if ( sub_auto & & filename & & ( strlen ( filename ) > = 5 ) ) {
/* try to autodetect vobsub from movie filename ::atmos */
char * buf = malloc ( ( strlen ( filename ) - 3 ) * sizeof ( char ) ) ;
memset ( buf , 0 , strlen ( filename ) - 3 ) ; // make sure string is terminated
strncpy ( buf , filename , strlen ( filename ) - 4 ) ;
2002-05-18 01:47:27 +02:00
vo_vobsub = vobsub_open ( buf , spudec_ifo , 0 , & vo_spudec ) ;
2002-02-20 23:41:06 +01:00
free ( buf ) ;
}
2002-10-06 18:16:53 +02:00
if ( vo_vobsub ) {
2002-02-20 23:41:06 +01:00
sub_auto = 0 ; // don't do autosub for textsubs if vobsub found
2002-10-06 18:16:53 +02:00
inited_flags | = INITED_VOBSUB ;
2002-12-23 02:54:58 +01:00
vobsub_set_from_lang ( vo_vobsub , dvdsub_lang ) ;
2003-09-21 16:21:43 +02:00
// check if vobsub requested only to display forced subtitles
forced_subs_only = vobsub_get_forced_subs_flag ( vo_vobsub ) ;
2002-10-06 18:16:53 +02:00
}
2002-02-20 23:41:06 +01:00
2002-03-17 01:47:15 +01:00
//============ Open & Sync STREAM --- fork cache2 ====================
2002-05-05 19:22:38 +02:00
stream = NULL ;
demuxer = NULL ;
2003-09-29 11:53:27 +02:00
if ( d_audio ) {
2003-10-04 03:24:50 +02:00
//free_demuxer_stream(d_audio);
2003-09-29 11:53:27 +02:00
d_audio = NULL ;
}
if ( d_video ) {
2003-10-04 03:24:50 +02:00
//free_demuxer_stream(d_video);
2003-09-29 11:53:27 +02:00
d_video = NULL ;
}
2002-05-05 19:22:38 +02:00
sh_audio = NULL ;
sh_video = NULL ;
2001-08-22 23:35:44 +02:00
current_module = " open_stream " ;
2003-03-30 19:13:04 +02:00
stream = open_stream ( filename , 0 , & file_format ) ;
2002-01-08 03:01:04 +01:00
if ( ! stream ) { // error...
2002-02-23 22:22:55 +01:00
eof = libmpdemux_was_interrupted ( PT_NEXT_ENTRY ) ;
goto goto_next_file ;
2002-01-08 03:01:04 +01:00
}
2001-10-21 01:48:56 +02:00
inited_flags | = INITED_STREAM ;
2002-03-17 01:47:15 +01:00
2002-12-11 02:21:12 +01:00
# ifdef HAVE_NEW_GUI
if ( use_gui ) guiGetEvent ( guiSetStream , ( char * ) stream ) ;
# endif
2003-03-30 19:13:04 +02:00
if ( file_format = = DEMUXER_TYPE_PLAYLIST ) {
2002-01-08 03:01:04 +01:00
play_tree_t * entry ;
// Handle playlist
2002-03-17 01:47:15 +01:00
current_module = " handle_playlist " ;
2002-01-08 03:01:04 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_V , " Parsing playlist %s... \n " , filename ) ;
2003-01-12 20:41:38 +01:00
entry = parse_playtree ( stream , 0 ) ;
eof = playtree_add_playlist ( entry ) ;
2002-02-23 22:22:55 +01:00
goto goto_next_file ;
2002-01-08 03:01:04 +01:00
}
2001-08-12 19:28:16 +02:00
stream - > start_pos + = seek_to_byte ;
2001-04-23 23:25:09 +02:00
2002-03-17 01:47:15 +01:00
# ifdef HAVE_LIBCSS
current_module = " libcss " ;
if ( dvdimportkey ) {
if ( dvd_import_key ( dvdimportkey ) ) {
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_ErrorDVDkey ) ;
exit_player ( MSGTR_Exit_error ) ;
}
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_CmdlineDVDkey ) ;
}
if ( dvd_auth_device ) {
if ( dvd_auth ( dvd_auth_device , filename ) ) {
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , " Error in DVD auth... \n " ) ;
exit_player ( MSGTR_Exit_error ) ;
}
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_DVDauthOk ) ;
}
# endif
2001-12-01 23:54:17 +01:00
if ( stream_dump_type = = 5 ) {
unsigned char buf [ 4096 ] ;
int len ;
FILE * f ;
2002-03-17 01:47:15 +01:00
current_module = " dumpstream " ;
2002-08-31 17:59:10 +02: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 23:54:17 +01:00
stream_reset ( stream ) ;
stream_seek ( stream , stream - > start_pos ) ;
f = fopen ( stream_dump_name , " wb " ) ;
if ( ! f ) {
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_CantOpenDumpfile ) ;
exit_player ( MSGTR_Exit_error ) ;
}
while ( ! stream - > eof ) {
len = stream_read ( stream , buf , 4096 ) ;
2003-05-31 23:50:21 +02:00
if ( len > 0 ) {
if ( fwrite ( buf , len , 1 , f ) ! = 1 ) {
mp_msg ( MSGT_MENCODER , MSGL_FATAL , MSGTR_ErrorWritingFile , stream_dump_name ) ;
exit_player ( MSGTR_Exit_error ) ;
}
}
}
if ( fclose ( f ) ) {
mp_msg ( MSGT_MENCODER , MSGL_FATAL , MSGTR_ErrorWritingFile , stream_dump_name ) ;
exit_player ( MSGTR_Exit_error ) ;
2001-12-01 23:54:17 +01:00
}
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_CoreDumped ) ;
2002-12-29 22:06:20 +01:00
exit_player_with_rc ( MSGTR_Exit_eof , 0 ) ;
2001-12-01 23:54:17 +01:00
}
2002-01-20 01:39:54 +01:00
# ifdef USE_DVDREAD
2002-03-31 21:20:01 +02:00
if ( stream - > type = = STREAMTYPE_DVD ) {
current_module = " dvd lang->id " ;
2003-08-09 16:23:16 +02:00
if ( audio_id = = - 1 ) audio_id = dvd_aid_from_lang ( stream , audio_lang ) ;
2002-03-31 21:20:01 +02:00
if ( dvdsub_lang & & dvdsub_id = = - 1 ) dvdsub_id = dvd_sid_from_lang ( stream , dvdsub_lang ) ;
current_module = NULL ;
}
2002-01-20 01:39:54 +01:00
# endif
2002-04-04 16:44:47 +02:00
# ifdef USE_DVDNAV
2003-03-30 19:13:04 +02:00
if ( stream - > type = = STREAMTYPE_DVDNAV ) stream_cache_size = 0 ; // must disable caching...
2002-04-04 16:44:47 +02:00
# endif
2002-03-17 01:47:15 +01:00
// CACHE2: initial prefill: 20% later: 5% (should be set by -cacheopts)
2002-10-24 00:07:29 +02:00
if ( stream_cache_size > 0 ) {
2002-03-17 01:47:15 +01:00
current_module = " enable_cache " ;
if ( ! stream_enable_cache ( stream , stream_cache_size * 1024 , stream_cache_size * 1024 / 5 , stream_cache_size * 1024 / 20 ) )
if ( ( eof = libmpdemux_was_interrupted ( PT_NEXT_ENTRY ) ) ) goto goto_next_file ;
}
2001-02-24 21:28:24 +01:00
2002-03-17 01:47:15 +01:00
//============ Open DEMUXERS --- DETECT file type =======================
2003-08-14 02:36:25 +02:00
# ifdef HAS_DVBIN_SUPPORT
2003-08-11 02:02:46 +02:00
goto_open_demuxer :
2003-08-14 02:36:25 +02:00
# endif
2001-08-22 23:35:44 +02:00
current_module = " demux_open " ;
2003-01-19 01:21:54 +01:00
demuxer = demux_open ( stream , file_format , audio_id , video_id , dvdsub_id , filename ) ;
2003-01-13 03:42:06 +01:00
// HACK to get MOV Reference Files working
if ( demuxer & & demuxer - > type = = DEMUXER_TYPE_PLAYLIST )
{
unsigned char * playlist_entry ;
play_tree_t * list = NULL , * entry = NULL ;
current_module = " handle_demux_playlist " ;
while ( ds_get_packet ( demuxer - > video , & playlist_entry ) > 0 )
{
char * temp , * bname ;
mp_msg ( MSGT_CPLAYER , MSGL_V , " Adding file %s to element entry \n " , playlist_entry ) ;
bname = mp_basename ( playlist_entry ) ;
if ( ( strlen ( bname ) > 10 ) & & ! strncmp ( bname , " qt " , 2 ) & & ! strncmp ( bname + 3 , " gateQT " , 6 ) )
continue ;
2003-01-27 23:27:54 +01:00
if ( ! strncmp ( bname , mp_basename ( filename ) , strlen ( bname ) ) ) // ignoring self-reference
continue ;
2003-01-13 03:42:06 +01:00
entry = play_tree_new ( ) ;
if ( filename & & ! strcmp ( mp_basename ( playlist_entry ) , playlist_entry ) ) // add reference path of current file
{
temp = malloc ( ( strlen ( filename ) - strlen ( mp_basename ( filename ) ) + strlen ( playlist_entry ) + 1 ) * sizeof ( char ) ) ;
if ( temp )
{
strncpy ( temp , filename , strlen ( filename ) - strlen ( mp_basename ( filename ) ) ) ;
temp [ strlen ( filename ) - strlen ( mp_basename ( filename ) ) ] = ' \0 ' ;
strcat ( temp , playlist_entry ) ;
play_tree_add_file ( entry , temp ) ;
mp_msg ( MSGT_CPLAYER , MSGL_V , " Resolving reference to %s \n " , temp ) ;
free ( temp ) ;
}
}
else
play_tree_add_file ( entry , playlist_entry ) ;
if ( ! list )
list = entry ;
else
play_tree_append_entry ( list , entry ) ;
}
free_demuxer ( demuxer ) ;
demuxer = NULL ;
if ( list )
{
entry = play_tree_new ( ) ;
play_tree_set_child ( entry , list ) ;
eof = playtree_add_playlist ( entry ) ;
goto goto_next_file ;
}
}
2003-01-12 20:41:38 +01:00
if ( ! demuxer )
{
2003-09-27 22:01:46 +02:00
#if 0
2003-01-12 20:41:38 +01:00
play_tree_t * entry ;
// Handle playlist
current_module = " handle_playlist " ;
2003-01-25 12:36:42 +01:00
switch ( stream - > type ) {
case STREAMTYPE_VCD :
case STREAMTYPE_DVD :
case STREAMTYPE_DVDNAV :
case STREAMTYPE_CDDA :
case STREAMTYPE_VCDBINCUE :
// don't try to parse raw media as playlist, it's unlikely
goto goto_next_file ;
}
2003-01-12 20:41:38 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " Falling back on trying to parse playlist %s... \n " , filename ) ;
stream_reset ( stream ) ;
stream_seek ( stream , stream - > start_pos ) ;
entry = parse_playtree ( stream , 0 ) ;
if ( ! entry )
mp_msg ( MSGT_DEMUXER , MSGL_ERR , MSGTR_FormatNotRecognized ) ;
else
eof = playtree_add_playlist ( entry ) ;
2003-09-27 22:01:46 +02:00
# endif
2003-01-12 20:41:38 +01:00
goto goto_next_file ;
}
2002-08-21 23:31:20 +02:00
inited_flags | = INITED_DEMUXER ;
2002-03-18 02:49:42 +01:00
current_module = " demux_open2 " ;
2001-08-23 15:21:21 +02:00
//file_format=demuxer->file_format;
2001-07-22 00:37:55 +02:00
2001-02-24 21:28:24 +01:00
d_audio = demuxer - > audio ;
d_video = demuxer - > video ;
2001-04-21 01:00:11 +02:00
d_dvdsub = demuxer - > sub ;
2001-02-24 21:28:24 +01:00
2001-05-14 00:45:21 +02:00
// DUMP STREAMS:
2002-05-27 19:30:46 +02:00
if ( ( stream_dump_type ) & & ( stream_dump_type < 4 ) ) {
2001-05-14 00:45:21 +02:00
FILE * f ;
demux_stream_t * ds = NULL ;
2001-08-22 23:35:44 +02:00
current_module = " dump " ;
2001-05-14 00:45:21 +02:00
// select stream to dump
switch ( stream_dump_type ) {
case 1 : ds = d_audio ; break ;
case 2 : ds = d_video ; break ;
2002-01-24 16:17:12 +01:00
case 3 : ds = d_dvdsub ; break ;
2001-05-14 00:45:21 +02:00
}
if ( ! ds ) {
2002-10-19 22:26:04 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_DumpSelectedStreamMissing ) ;
2001-08-22 23:35:44 +02:00
exit_player ( MSGTR_Exit_error ) ;
2001-05-14 00:45:21 +02:00
}
// disable other streams:
if ( d_audio & & d_audio ! = ds ) { ds_free_packs ( d_audio ) ; d_audio - > id = - 2 ; }
if ( d_video & & d_video ! = ds ) { ds_free_packs ( d_video ) ; d_video - > id = - 2 ; }
if ( d_dvdsub & & d_dvdsub ! = ds ) { ds_free_packs ( d_dvdsub ) ; d_dvdsub - > id = - 2 ; }
// let's dump it!
2001-12-01 23:54:17 +01:00
f = fopen ( stream_dump_name , " wb " ) ;
2001-08-22 23:35:44 +02:00
if ( ! f ) {
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_CantOpenDumpfile ) ;
exit_player ( MSGTR_Exit_error ) ;
}
2001-05-14 00:45:21 +02:00
while ( ! ds - > eof ) {
unsigned char * start ;
int in_size = ds_get_packet ( ds , & start ) ;
2001-10-06 02:59:45 +02:00
if ( ( demuxer - > file_format = = DEMUXER_TYPE_AVI | | demuxer - > file_format = = DEMUXER_TYPE_ASF | | demuxer - > file_format = = DEMUXER_TYPE_MOV )
2001-06-29 23:35:30 +02:00
& & stream_dump_type = = 2 ) fwrite ( & in_size , 1 , 4 , f ) ;
2001-05-14 00:45:21 +02:00
if ( in_size > 0 ) fwrite ( start , in_size , 1 , f ) ;
}
fclose ( f ) ;
2001-08-18 21:51:21 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_CoreDumped ) ;
2002-12-29 22:06:20 +01:00
exit_player_with_rc ( MSGTR_Exit_eof , 0 ) ;
2001-05-14 00:45:21 +02:00
}
2001-07-22 00:37:55 +02:00
sh_audio = d_audio - > sh ;
sh_video = d_video - > sh ;
2001-05-14 00:45:21 +02:00
2001-07-22 00:37:55 +02:00
if ( sh_video ) {
2001-02-24 21:28:24 +01:00
2002-03-17 01:47:15 +01:00
current_module = " video_read_properties " ;
2002-02-08 17:00:14 +01:00
if ( ! video_read_properties ( sh_video ) ) {
2002-10-19 22:26:04 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_CannotReadVideoProperties ) ;
2002-02-08 17:00:14 +01:00
sh_video = d_video - > sh = NULL ;
} else {
2002-05-20 05:25:26 +02: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 17:00:14 +01:00
demuxer - > file_format , sh_video - > format , sh_video - > disp_w , sh_video - > disp_h ,
sh_video - > fps , sh_video - > frametime
) ;
2002-02-09 02:29:11 +01:00
/* 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 23:53:05 +02:00
vo_fps = sh_video - > fps ;
2003-08-18 16:05:30 +02:00
# ifdef HAVE_X11
2002-09-29 23:53:05 +02:00
vo_mouse_timer_const = ( int ) sh_video - > fps ;
# endif
2002-02-09 02:29:11 +01:00
2002-02-08 17:00:14 +01:00
if ( ! sh_video - > fps & & ! force_fps ) {
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_FPSnotspecified ) ;
sh_video = d_video - > sh = NULL ;
}
2001-07-22 00:37:55 +02:00
}
}
2001-04-14 05:12:06 +02:00
2001-02-24 21:28:24 +01:00
fflush ( stdout ) ;
2002-02-08 17:00:14 +01:00
if ( ! sh_video & & ! sh_audio ) {
2002-08-05 20:37:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_NoStreamFound ) ;
2003-08-27 19:08:58 +02:00
# ifdef HAS_DVBIN_SUPPORT
if ( ( stream - > type = = STREAMTYPE_DVB ) & & stream - > priv )
{
dvb_priv_t * priv = ( dvb_priv_t * ) stream - > priv ;
if ( priv - > is_on )
{
int dir ;
int v = last_dvb_step ;
if ( v > 0 )
dir = DVB_CHANNEL_HIGHER ;
else
dir = DVB_CHANNEL_LOWER ;
if ( dvb_step_channel ( priv , dir ) )
{
uninit_player ( INITED_ALL - ( INITED_STREAM | INITED_INPUT ) ) ;
goto goto_open_demuxer ;
}
}
}
# endif
2001-08-23 01:48:18 +02:00
goto goto_next_file ; // exit_player(MSGTR_Exit_error);
2001-05-12 03:57:18 +02:00
}
2002-03-17 01:47:15 +01:00
/* display clip info */
demux_info_print ( demuxer ) ;
//================== Read SUBTITLES (DVD & TEXT) ==========================
2002-05-18 01:47:27 +02:00
if ( d_dvdsub - > id > = 0 & & vo_spudec = = NULL & & sh_video ) {
2002-02-08 17:00:14 +01:00
2002-03-29 04:17:57 +01:00
if ( spudec_ifo ) {
unsigned int palette [ 16 ] , width , height ;
2002-04-04 16:44:47 +02:00
current_module = " spudec_init_vobsub " ;
2002-07-08 23:44:51 +02:00
if ( vobsub_parse_ifo ( NULL , spudec_ifo , palette , & width , & height , 1 , - 1 , NULL ) > = 0 )
2002-10-19 03:58:34 +02:00
vo_spudec = spudec_new_scaled ( palette , width , height ) ;
2002-03-29 04:17:57 +01:00
}
2002-04-04 16:44:47 +02: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 13:14:29 +01:00
# ifdef USE_DVDREAD
2002-04-04 16:44:47 +02: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 13:14:29 +01:00
sh_video - > disp_w , sh_video - > disp_h ) ;
2002-03-31 00:18:40 +01:00
}
2002-01-20 01:39:54 +01:00
# endif
2002-04-04 16:44:47 +02:00
2003-10-16 23:06:43 +02:00
# ifdef HAVE_MATROSKA
if ( ( vo_spudec = = NULL ) & & ( demuxer - > type = = DEMUXER_TYPE_MATROSKA ) & &
( d_dvdsub - > sh ! = NULL ) & & ( ( ( mkv_sh_sub_t * ) d_dvdsub - > sh ) - > type = = ' v ' ) ) {
current_module = " spudec_init_matroska " ;
vo_spudec = spudec_new_scaled ( ( ( mkv_sh_sub_t * ) d_dvdsub - > sh ) - > palette ,
( ( mkv_sh_sub_t * ) d_dvdsub - > sh ) - > width ,
( ( mkv_sh_sub_t * ) d_dvdsub - > sh ) - > height ) ;
}
# endif
2002-04-04 16:44:47 +02: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-18 01:47:27 +02:00
spudec_set_font_factor ( vo_spudec , font_factor ) ;
2002-04-04 16:44:47 +02:00
}
2002-03-31 04:22:40 +02:00
if ( vo_spudec ! = NULL )
inited_flags | = INITED_SPUDEC ;
2002-01-20 01:39:54 +01:00
2002-05-18 01:47:27 +02:00
}
2003-09-21 16:21:43 +02:00
// Apply current settings for forced subs
if ( vo_spudec ! = NULL )
spudec_set_forced_subs_only ( vo_spudec , forced_subs_only ) ;
2002-01-08 15:10:22 +01:00
# ifdef USE_SUB
2002-05-18 01:47:27 +02:00
if ( sh_video ) {
2002-01-09 17:35:24 +01:00
// after reading video params we should load subtitles because
2002-01-08 15:10:22 +01:00
// we know fps so now we can adjust subtitles time to ~6 seconds AST
2002-01-09 17:35:24 +01:00
// check .sub
2002-03-17 01:47:15 +01:00
current_module = " read_subtitles_file " ;
if ( sub_name ) {
2003-04-07 18:04:02 +02:00
for ( i = 0 ; sub_name [ i ] ! = NULL ; + + i )
add_subtitles ( sub_name [ i ] , sh_video - > fps , 0 ) ;
}
2002-03-17 01:47:15 +01:00
if ( sub_auto ) { // auto load sub file ...
2003-04-07 18:04:02 +02:00
char * * tmp = sub_filenames ( get_path ( " sub/ " ) , filename ) ;
char * * tmp2 = tmp ;
while ( * tmp2 )
add_subtitles ( * tmp2 + + , sh_video - > fps , 0 ) ;
free ( tmp ) ;
if ( set_of_sub_size = = 0 )
add_subtitles ( get_path ( " default.sub " ) , sh_video - > fps , 1 ) ;
if ( set_of_sub_size > 0 )
add_subtitles ( NULL , sh_video - > fps , 1 ) ;
}
if ( set_of_sub_size > 0 ) {
2003-04-19 20:46:15 +02:00
//osd_show_sub_changed = sh_video->fps;
2003-04-07 18:04:02 +02:00
subdata = set_of_subtitles [ set_of_sub_pos = 0 ] ;
if ( stream_dump_type = = 3 ) list_sub_file ( subdata ) ;
if ( stream_dump_type = = 4 ) dump_mpsub ( subdata , sh_video - > fps ) ;
if ( stream_dump_type = = 6 ) dump_srt ( subdata , sh_video - > fps ) ;
if ( stream_dump_type = = 7 ) dump_microdvd ( subdata , sh_video - > fps ) ;
if ( stream_dump_type = = 8 ) dump_jacosub ( subdata , sh_video - > fps ) ;
if ( stream_dump_type = = 9 ) dump_sami ( subdata , sh_video - > fps ) ;
2002-01-09 17:35:24 +01:00
}
2002-03-17 01:47:15 +01:00
}
2002-05-18 01:47:27 +02:00
# endif
2001-04-07 23:27:57 +02:00
//================== Init AUDIO (codec) ==========================
2001-07-21 03:17:00 +02:00
if ( sh_audio ) {
2001-04-07 23:27:57 +02:00
// Go through the codec.conf and find the best codec...
2002-09-26 01:45:34 +02:00
current_module = " init_audio_codec " ;
2002-08-31 17:44:41 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " ========================================================================== \n " ) ;
2002-09-28 04:23:20 +02:00
if ( ! init_best_audio_codec ( sh_audio , audio_codec_list , audio_fm_list ) ) {
2002-09-26 01:45:34 +02:00
sh_audio = d_audio - > sh = NULL ; // failed to init :(
2002-10-06 18:16:53 +02:00
} else
inited_flags | = INITED_ACODEC ;
2002-09-26 01:45:34 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " ========================================================================== \n " ) ;
2001-04-07 23:27:57 +02:00
}
2002-10-23 17:48:56 +02:00
if ( identify ) {
mp_msg ( MSGT_GLOBAL , MSGL_INFO , " ID_FILENAME=%s \n " , filename ) ;
if ( sh_video ) {
/* Assume FOURCC if all bytes >= 0x20 (' ') */
if ( sh_video - > format > = 0x20202020 )
2002-12-31 03:26:32 +01:00
mp_msg ( MSGT_GLOBAL , MSGL_INFO , " ID_VIDEO_FORMAT=%.4s \n " , & sh_video - > format ) ;
2002-10-23 17:48:56 +02:00
else
2002-12-31 03:26:32 +01:00
mp_msg ( MSGT_GLOBAL , MSGL_INFO , " ID_VIDEO_FORMAT=0x%08X \n " , sh_video - > format ) ;
2002-10-23 17:48:56 +02:00
mp_msg ( MSGT_GLOBAL , MSGL_INFO , " ID_VIDEO_BITRATE=%d \n " , sh_video - > i_bps * 8 ) ;
mp_msg ( MSGT_GLOBAL , MSGL_INFO , " ID_VIDEO_WIDTH=%d \n " , sh_video - > disp_w ) ;
mp_msg ( MSGT_GLOBAL , MSGL_INFO , " ID_VIDEO_HEIGHT=%d \n " , sh_video - > disp_h ) ;
mp_msg ( MSGT_GLOBAL , MSGL_INFO , " ID_VIDEO_FPS=%5.3f \n " , sh_video - > fps ) ;
2003-01-30 22:42:35 +01:00
mp_msg ( MSGT_GLOBAL , MSGL_INFO , " ID_VIDEO_ASPECT=%1.4f \n " , sh_video - > aspect ) ;
2002-10-23 17:48:56 +02:00
}
if ( sh_audio ) {
if ( sh_audio - > codec )
mp_msg ( MSGT_GLOBAL , MSGL_INFO , " ID_AUDIO_CODEC=%s \n " , sh_audio - > codec - > name ) ;
/* Assume FOURCC if all bytes >= 0x20 (' ') */
if ( sh_audio - > format > = 0x20202020 )
mp_msg ( MSGT_GLOBAL , MSGL_INFO , " ID_AUDIO_FORMAT=%.4s \n " , & sh_audio - > format ) ;
else
mp_msg ( MSGT_GLOBAL , MSGL_INFO , " ID_AUDIO_FORMAT=%d \n " , sh_audio - > format ) ;
mp_msg ( MSGT_GLOBAL , MSGL_INFO , " ID_AUDIO_BITRATE=%d \n " , sh_audio - > i_bps * 8 ) ;
mp_msg ( MSGT_GLOBAL , MSGL_INFO , " ID_AUDIO_RATE=%d \n " , sh_audio - > samplerate ) ;
mp_msg ( MSGT_GLOBAL , MSGL_INFO , " ID_AUDIO_NCH=%d \n " , sh_audio - > channels ) ;
}
2002-11-16 04:42:14 +01:00
mp_msg ( MSGT_GLOBAL , MSGL_INFO , " ID_LENGTH=%ld \n " , demuxer_get_time_length ( demuxer ) ) ;
2002-10-23 17:48:56 +02:00
}
2002-09-26 01:45:34 +02:00
if ( ! sh_video ) goto main ; // audio-only
2001-04-07 23:27:57 +02:00
2001-02-24 21:28:24 +01:00
//================== Init VIDEO (codec & libvo) ==========================
2002-10-09 03:13:40 +02:00
if ( ! fixed_vo | | ! ( inited_flags & INITED_VO ) ) {
2002-03-17 03:28:32 +01:00
current_module = " preinit_libvo " ;
2002-04-07 04:12:15 +02:00
vo_config_count = 0 ;
2002-09-29 23:53:05 +02:00
//if((video_out->preinit(vo_subdevice))!=0){
if ( ! ( video_out = init_best_video_out ( video_driver_list ) ) ) {
2002-08-05 20:37:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_ErrorInitializingVODevice ) ;
2002-03-17 03:28:32 +01:00
goto goto_next_file ; // exit_player(MSGTR_Exit_error);
}
2002-03-15 00:28:51 +01:00
sh_video - > video_out = video_out ;
2002-03-17 03:28:32 +01:00
inited_flags | = INITED_VO ;
2002-10-09 03:13:40 +02:00
}
2002-03-17 03:28:32 +01:00
2002-04-07 00:05:01 +02:00
current_module = " init_video_filters " ;
2003-03-15 19:01:02 +01:00
{
char * vf_arg [ ] = { " _oldargs_ " , ( char * ) video_out , NULL } ;
sh_video - > vfilter = ( void * ) vf_open_filter ( NULL , " vo " , vf_arg ) ;
}
2002-11-15 00:49:05 +01:00
# ifdef HAVE_MENU
if ( use_menu ) {
2003-03-15 19:01:02 +01:00
char * vf_arg [ ] = { " _oldargs_ " , menu_root , NULL } ;
vf_menu = vf_open_plugin ( libmenu_vfs , sh_video - > vfilter , " menu " , vf_arg ) ;
2002-11-15 00:49:05 +01:00
if ( ! vf_menu ) {
mp_msg ( MSGT_CPLAYER , MSGL_ERR , " Can't open libmenu video filter with root menu %s \n " , menu_root ) ;
use_menu = 0 ;
}
}
if ( vf_menu )
sh_video - > vfilter = ( void * ) append_filters ( vf_menu ) ;
else
# endif
2002-09-29 21:26:40 +02:00
sh_video - > vfilter = ( void * ) append_filters ( sh_video - > vfilter ) ;
2002-04-07 00:05:01 +02:00
2002-03-17 03:28:32 +01:00
current_module = " init_video_codec " ;
2001-04-17 20:37:15 +02:00
2002-09-26 01:45:34 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " ========================================================================== \n " ) ;
2002-09-26 03:31:18 +02:00
init_best_video_codec ( sh_video , video_codec_list , video_fm_list ) ;
2002-03-18 02:49:42 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " ========================================================================== \n " ) ;
if ( ! sh_video - > inited ) {
2002-10-09 03:13:40 +02:00
if ( ! fixed_vo ) uninit_player ( INITED_VO ) ;
2002-03-18 02:49:42 +01:00
if ( ! sh_audio ) goto goto_next_file ;
sh_video = d_video - > sh = NULL ;
goto main ; // exit_player(MSGTR_Exit_error);
2001-02-24 21:28:24 +01:00
}
2002-10-06 18:16:53 +02:00
inited_flags | = INITED_VCODEC ;
2001-08-04 15:52:41 +02:00
if ( auto_quality > 0 ) {
// Auto quality option enabled
output_quality = get_video_quality_max ( sh_video ) ;
if ( auto_quality > output_quality ) auto_quality = output_quality ;
else output_quality = auto_quality ;
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_V , " AutoQ: setting quality to %d \n " , output_quality ) ;
2001-08-04 15:52:41 +02:00
set_video_quality ( sh_video , output_quality ) ;
}
2001-04-14 05:12:06 +02:00
// ========== Init display (sh_video->disp_w*sh_video->disp_h/out_fmt) ============
2001-02-24 21:28:24 +01:00
2002-07-24 20:19:39 +02:00
current_module = " init_vo " ;
2002-07-25 15:12:23 +02:00
if ( sh_video )
{
2002-09-27 23:08:36 +02:00
if ( vo_gamma_gamma ! = 1000 )
set_video_colors ( sh_video , " gamma " , vo_gamma_gamma ) ;
2002-07-25 15:12:23 +02: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 22:51:48 +02:00
2002-05-18 01:47:27 +02:00
if ( vo_flags & 0x08 & & vo_spudec )
spudec_set_hw_spu ( vo_spudec , video_out ) ;
2002-08-28 22:52:02 +02:00
# ifdef HAVE_FREETYPE
force_load_font = 1 ;
# endif
2001-02-24 21:28:24 +01:00
//================== MAIN: ==========================
2002-09-26 01:45:34 +02:00
main :
current_module = " main " ;
2002-09-27 22:57:00 +02: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.
2003-02-06 23:39:13 +01:00
if ( ! sh_video & & osd_level > = 0 ) { // save OSD level only once
2002-09-27 22:57:00 +02:00
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 05:39:54 +02:00
2002-03-17 03:28:32 +01:00
fflush ( stdout ) ;
2002-03-17 01:47:15 +01:00
2002-04-22 23:36:12 +02:00
# ifdef HAVE_NEW_GUI
if ( use_gui )
{
if ( sh_audio ) guiIntfStruct . AudioType = sh_audio - > channels ; else guiIntfStruct . AudioType = 0 ;
2002-07-25 22:34:33 +02:00
if ( ! sh_video & & sh_audio ) guiGetEvent ( guiSetAudioOnly , ( char * ) 1 ) ; else guiGetEvent ( guiSetAudioOnly , ( char * ) 0 ) ;
2002-08-15 01:02:45 +02:00
guiGetEvent ( guiSetFileFormat , ( char * ) demuxer - > file_format ) ;
if ( guiGetEvent ( guiSetValues , ( char * ) sh_video ) ) goto goto_next_file ;
2002-11-29 01:58:25 +01:00
guiGetEvent ( guiSetDemuxer , ( char * ) demuxer ) ;
2002-04-22 23:36:12 +02:00
}
# endif
2002-03-17 01:47:15 +01:00
{
2001-07-29 19:42:06 +02:00
//int frame_corr_num=0; //
2001-07-21 03:17:00 +02:00
//float v_frame=0; // Video
2001-02-24 21:28:24 +01:00
float time_frame = 0 ; // Timer
2001-07-28 22:33:51 +02:00
//float num_frames=0; // number of frames played
2001-07-23 22:02:58 +02:00
int grab_frames = 0 ;
2001-03-25 06:27:39 +02:00
char osd_text_buffer [ 64 ] ;
2003-05-17 11:21:21 +02:00
char osd_show_text_buffer [ 64 ] ;
2002-04-14 03:20:26 +02:00
int drop_frame = 0 ; // current dropping status
int dropped_frames = 0 ; // how many frames dropped since last non-dropped frame
2001-11-14 01:26:28 +01:00
int too_slow_frame_cnt = 0 ;
int too_fast_frame_cnt = 0 ;
2001-08-04 15:52:41 +02:00
// for auto-quality:
2001-08-10 03:27:02 +02:00
float AV_delay = 0 ; // average of A-V timestamp differences
2001-08-04 15:52:41 +02:00
double vdecode_time ;
2002-05-09 10:59:07 +02:00
unsigned int lastframeout_ts = 0 ;
2002-11-23 11:58:14 +01:00
/*float time_frame_corr_avg=0;*/ /* unused */
2001-02-24 21:28:24 +01:00
2002-05-02 04:03:59 +02:00
float next_frame_time = 0 ;
int frame_time_remaining = 0 ; // flag
int blit_frame = 0 ;
2002-05-09 10:59:07 +02:00
osd_text_buffer [ 0 ] = 0 ;
2001-02-24 21:28:24 +01:00
//================ SETUP AUDIO ==========================
2001-07-21 03:17:00 +02:00
if ( sh_audio ) {
2002-09-30 00:57:54 +02:00
//const ao_info_t *info=audio_out->info;
2003-01-18 18:34:02 +01:00
current_module = " af_preinit " ;
ao_data . samplerate = force_srate ? force_srate : sh_audio - > samplerate * playback_speed ;
ao_data . channels = audio_output_channels ? audio_output_channels : sh_audio - > channels ;
ao_data . format = audio_output_format ? audio_output_format : sh_audio - > sample_format ;
# if 1
if ( ! preinit_audio_filters ( sh_audio ,
// input:
( int ) ( sh_audio - > samplerate * playback_speed ) ,
sh_audio - > channels , sh_audio - > sample_format , sh_audio - > samplesize ,
// output:
& ao_data . samplerate , & ao_data . channels , & ao_data . format ,
audio_out_format_bits ( ao_data . format ) / 8 ) ) {
mp_msg ( MSGT_CPLAYER , MSGL_ERR , " Error at audio filter chain pre-init! \n " ) ;
} else {
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " AF_pre: %dHz %dch %s \n " ,
ao_data . samplerate , ao_data . channels ,
audio_out_format_name ( ao_data . format ) ) ;
}
# endif
2002-09-30 00:57:54 +02:00
current_module = " ao2_init " ;
if ( ! ( audio_out = init_best_audio_out ( audio_driver_list ,
2002-10-13 23:58:55 +02:00
( ao_plugin_cfg . plugin_list ! = NULL ) , // plugin flag
2003-01-18 20:08:42 +01:00
force_srate ? force_srate : ao_data . samplerate ,
audio_output_channels ? audio_output_channels : ao_data . channels ,
audio_output_format ? audio_output_format : ao_data . format , 0 ) ) ) {
2002-09-30 00:57:54 +02:00
// FAILED:
2001-08-18 21:51:21 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_CannotInitAO ) ;
2002-10-06 18:16:53 +02:00
uninit_player ( INITED_ACODEC ) ; // close codec
2002-09-30 00:57:54 +02:00
sh_audio = d_audio - > sh = NULL ; // -> nosound
2001-09-05 12:49:04 +02:00
} else {
2002-09-30 00:57:54 +02:00
// SUCCESS:
2001-09-05 12:49:04 +02:00
inited_flags | = INITED_AO ;
2003-01-18 18:34:02 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " AO: [%s] %dHz %dch %s (%d bps) \n " ,
2002-09-30 00:57:54 +02:00
audio_out - > info - > short_name ,
2003-01-18 18:34:02 +01:00
ao_data . samplerate , ao_data . channels ,
audio_out_format_name ( ao_data . format ) ,
audio_out_format_bits ( ao_data . format ) / 8 ) ;
2002-09-30 00:57:54 +02:00
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 ) ;
2002-10-06 00:55:45 +02:00
// init audio filters:
# if 1
current_module = " af_init " ;
if ( ! init_audio_filters ( sh_audio ,
2002-10-06 01:00:18 +02:00
( int ) ( sh_audio - > samplerate * playback_speed ) ,
2002-10-06 00:55:45 +02:00
sh_audio - > channels , sh_audio - > sample_format , sh_audio - > samplesize ,
ao_data . samplerate , ao_data . channels , ao_data . format ,
audio_out_format_bits ( ao_data . format ) / 8 , /* ao_data.bps, */
ao_data . outburst * 4 , ao_data . buffersize ) ) {
2003-01-28 01:08:30 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , " Couldn't find matching filter / ao format! \n " ) ;
// mp_msg(MSGT_CPLAYER,MSGL_ERR,"Couldn't find matching filter / ao format! -> NOSOUND\n");
2003-01-20 22:28:05 +01:00
// uninit_player(INITED_ACODEC|INITED_AO); // close codec & ao
// sh_audio=d_audio->sh=NULL; // -> nosound
2002-10-06 00:55:45 +02:00
}
# endif
2001-05-10 05:39:54 +02:00
}
2001-02-24 21:28:24 +01:00
}
2002-03-17 01:47:15 +01:00
current_module = " av_init " ;
if ( sh_video ) sh_video - > timer = 0 ;
2002-11-02 20:52:59 +01:00
if ( sh_audio ) sh_audio - > delay = - audio_delay ;
2001-02-24 21:28:24 +01:00
2001-07-21 03:17:00 +02:00
if ( ! sh_audio ) {
2001-09-26 23:35:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_NoSound ) ;
2002-11-01 18:46:45 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_V , " Freeing %d unused audio chunks \n " , d_audio - > packs ) ;
2001-02-24 21:28:24 +01:00
ds_free_packs ( d_audio ) ; // free buffered chunks
d_audio - > id = - 2 ; // do not read audio chunks
2002-10-06 18:16:53 +02:00
//uninit_player(INITED_AO); // close device
2001-02-24 21:28:24 +01:00
}
2002-03-17 01:47:15 +01:00
if ( ! sh_video ) {
2002-08-05 20:37:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_Video_NoVideo ) ;
2002-11-01 18:46:45 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_V , " Freeing %d unused video chunks \n " , d_video - > packs ) ;
2002-02-08 17:00:14 +01:00
ds_free_packs ( d_video ) ;
d_video - > id = - 2 ;
2002-10-09 03:13:40 +02:00
//if(!fixed_vo) uninit_player(INITED_VO);
2002-03-17 01:47:15 +01:00
}
2001-02-24 21:28:24 +01:00
2002-05-25 13:40:29 +02:00
if ( ! sh_video & & ! sh_audio )
goto goto_next_file ;
2002-11-02 01:45:12 +01:00
//if(demuxer->file_format!=DEMUXER_TYPE_AVI) pts_from_bps=0; // it must be 0 for mpeg/asf!
2002-10-26 02:28:48 +02:00
if ( force_fps & & sh_video ) {
2002-02-09 02:29:11 +01:00
vo_fps = sh_video - > fps = force_fps ;
2001-04-14 05:12:06 +02:00
sh_video - > frametime = 1.0f / sh_video - > fps ;
2001-09-26 23:35:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_FPSforced , sh_video - > fps , sh_video - > frametime ) ;
2001-04-14 05:12:06 +02:00
}
2001-02-24 21:28:24 +01:00
2001-08-22 23:35:44 +02:00
//==================== START PLAYING =======================
2003-01-26 17:11:08 +01:00
if ( loop_times > 1 ) loop_times - - ; else
if ( loop_times = = 1 ) loop_times = - 1 ;
2001-08-18 21:51:21 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , MSGTR_StartPlaying ) ; fflush ( stdout ) ;
2001-02-24 21:28:24 +01:00
InitTimer ( ) ;
2002-04-04 16:44:47 +02:00
# ifdef USE_DVDNAV
2003-03-30 19:13:04 +02:00
if ( stream - > type = = STREAMTYPE_DVDNAV ) {
2002-04-04 16:44:47 +02:00
dvdnav_stream_fullstart ( ( dvdnav_priv_t * ) stream - > priv ) ;
}
# endif
2001-06-13 23:55:24 +02:00
total_time_usage_start = GetTimer ( ) ;
2002-01-01 23:46:07 +01:00
audio_time_usage = 0 ; video_time_usage = 0 ; vout_time_usage = 0 ;
2002-06-28 18:33:46 +02:00
total_frame_cnt = 0 ; drop_frame_cnt = 0 ; // fix for multifile fps benchmark
2002-06-28 19:13:18 +02:00
play_n_frames = play_n_frames_mf ;
if ( play_n_frames = = 0 ) {
eof = PT_NEXT_ENTRY ; goto goto_next_file ;
}
2001-02-24 21:28:24 +01:00
while ( ! eof ) {
2001-08-04 15:52:41 +02:00
float aq_sleep_time = 0 ;
2001-02-24 21:28:24 +01:00
2001-06-13 23:57:36 +02:00
if ( play_n_frames > = 0 ) {
- - play_n_frames ;
2002-08-09 19:47:54 +02:00
if ( play_n_frames < 0 ) eof = PT_NEXT_ENTRY ;
2001-06-13 23:57:36 +02:00
}
2001-02-24 21:28:24 +01:00
/*========================== PLAY AUDIO ============================*/
2002-04-14 00:16:15 +02:00
2001-07-21 03:17:00 +02:00
while ( sh_audio ) {
2001-05-10 05:39:54 +02:00
unsigned int t ;
2002-02-24 12:23:48 +01:00
double tt ;
2001-11-05 03:53:53 +01:00
int playsize ;
2002-04-14 00:16:15 +02:00
current_module = " play_audio " ;
2001-11-05 03:53:53 +01:00
2002-11-02 20:52:59 +01:00
ao_data . pts = ( ( sh_video ? sh_video - > timer : 0 ) + sh_audio - > delay ) * 90000.0 ;
2001-11-05 03:53:53 +01:00
playsize = audio_out - > get_space ( ) ;
2001-05-10 05:39:54 +02:00
2002-04-14 00:16:15 +02:00
// handle audio-only case:
if ( ! playsize & & ! sh_video ) { // buffer is full, do not block here!!!
2002-02-23 22:22:55 +01:00
usec_sleep ( 10000 ) ; // Wait a tick before retry
continue ;
}
2001-05-10 05:39:54 +02:00
if ( playsize > MAX_OUTBURST ) playsize = MAX_OUTBURST ; // we shouldn't exceed it!
2001-04-06 03:18:59 +02:00
2002-04-14 00:16:15 +02:00
// Fill buffer if needed:
2001-02-24 21:28:24 +01:00
current_module = " decode_audio " ; // Enter AUDIO decoder module
2001-08-22 23:35:44 +02:00
t = GetTimer ( ) ;
2002-10-06 00:55:45 +02:00
while ( sh_audio - > a_out_buffer_len < playsize & & ! d_audio - > eof ) {
int ret = decode_audio ( sh_audio , & sh_audio - > a_out_buffer [ sh_audio - > a_out_buffer_len ] ,
playsize - sh_audio - > a_out_buffer_len , sh_audio - > a_out_buffer_size - sh_audio - > a_out_buffer_len ) ;
2002-04-14 00:16:15 +02:00
if ( ret < = 0 ) break ; // EOF?
2002-10-06 00:55:45 +02:00
sh_audio - > a_out_buffer_len + = ret ;
2001-02-24 21:28:24 +01:00
}
2002-02-24 12:23:48 +01:00
t = GetTimer ( ) - t ;
2002-04-14 00:16:15 +02:00
tt = t * 0.000001f ; audio_time_usage + = tt ;
2002-10-06 00:55:45 +02:00
if ( playsize > sh_audio - > a_out_buffer_len ) playsize = sh_audio - > a_out_buffer_len ;
2002-04-14 00:16:15 +02:00
// play audio:
current_module = " play_audio " ;
2002-10-06 00:55:45 +02:00
playsize = audio_out - > play ( sh_audio - > a_out_buffer , playsize , 0 ) ;
2001-02-24 21:28:24 +01:00
2001-06-03 01:30:26 +02:00
if ( playsize > 0 ) {
2002-10-06 00:55:45 +02:00
sh_audio - > a_out_buffer_len - = playsize ;
memmove ( sh_audio - > a_out_buffer , & sh_audio - > a_out_buffer [ playsize ] , sh_audio - > a_out_buffer_len ) ;
2002-11-02 20:52:59 +01:00
sh_audio - > delay + = playback_speed * playsize / ( ( float ) ( ( ao_data . bps & & sh_audio - > afilter ) ?
2002-10-06 00:55:45 +02:00
ao_data . bps : sh_audio - > o_bps ) ) ;
2001-02-24 21:28:24 +01:00
}
break ;
2002-04-14 00:16:15 +02:00
} // while(sh_audio)
2001-02-24 21:28:24 +01:00
2002-02-08 17:00:14 +01:00
if ( ! sh_video ) {
2002-04-14 00:16:15 +02:00
// handle audio-only case:
2003-05-31 22:52:16 +02:00
if ( ! quiet ) {
//
// convert time to HH:MM:SS.F format
//
long tenths = 10 * sh_audio - > delay - audio_out - > get_delay ( ) ;
int hh = ( tenths / 36000 ) % 100 ;
int mm = ( tenths / 600 ) % 60 ;
int ss = ( tenths / 10 ) % 60 ;
int f1 = tenths % 10 ;
char hhmmssf [ 16 ] ; // only really need 11, but just in case...
sprintf ( hhmmssf , " %2d:%2d:%2d.%1d " , hh , mm , ss , f1 ) ;
if ( 0 = = hh ) {
hhmmssf [ 1 ] = ' ' ;
hhmmssf [ 2 ] = ' ' ;
}
// uncomment the next three lines to show leading zero ten-hours
// else if (' ' == hhmmssf[0]) {
// hhmmssf[0] = '0';
// }
if ( ( 0 = = hh ) & & ( 0 = = mm ) ) {
hhmmssf [ 4 ] = ' ' ;
hhmmssf [ 5 ] = ' ' ;
}
else if ( ( ' ' = = hhmmssf [ 3 ] ) & & ( ' ' ! = hhmmssf [ 2 ] ) ) {
hhmmssf [ 3 ] = ' 0 ' ;
}
if ( ( ' ' = = hhmmssf [ 6 ] ) & & ( ' ' ! = hhmmssf [ 5 ] ) ) {
hhmmssf [ 6 ] = ' 0 ' ;
}
mp_msg ( MSGT_AVSYNC , MSGL_STATUS , " A: %s %4.1f%% %d%% \r "
, hhmmssf
2002-11-02 20:52:59 +01:00
, ( sh_audio - > delay > 0.5 ) ? 100.0 * audio_time_usage / ( double ) sh_audio - > delay : 0
2002-02-08 17:00:14 +01:00
, cache_fill_status
) ;
2003-05-31 22:52:16 +02:00
}
2002-04-14 00:16:15 +02:00
if ( d_audio - > eof ) eof = PT_NEXT_ENTRY ;
} else {
2002-02-08 17:00:14 +01:00
2001-02-24 21:28:24 +01:00
/*========================== PLAY VIDEO ============================*/
2002-05-02 04:03:59 +02:00
float frame_time = next_frame_time ;
2002-04-14 00:16:15 +02:00
2002-05-02 04:03:59 +02:00
vo_pts = sh_video - > timer * 90000.0 ;
vo_fps = sh_video - > fps ;
2001-08-04 15:52:41 +02:00
2002-05-02 04:03:59 +02:00
if ( ! frame_time_remaining ) {
2001-10-30 21:36:20 +01:00
//-------------------- Decode a frame: -----------------------
vdecode_time = video_time_usage ;
2002-04-19 08:21:41 +02:00
while ( 1 )
2001-10-30 21:36:20 +01:00
{ unsigned char * start = NULL ;
int in_size ;
// get it!
current_module = " video_read_frame " ;
2002-05-02 04:03:59 +02:00
in_size = video_read_frame ( sh_video , & next_frame_time , & start , force_fps ) ;
2001-10-30 21:36:20 +01:00
if ( in_size < 0 ) { eof = 1 ; break ; }
if ( in_size > max_framesize ) max_framesize = in_size ; // stats
2002-04-14 03:20:26 +02:00
sh_video - > timer + = frame_time ;
2002-11-02 20:52:59 +01:00
if ( sh_audio ) sh_audio - > delay - = frame_time ;
2002-04-14 03:20:26 +02:00
time_frame + = frame_time ; // for nosound
// check for frame-drop:
2002-04-16 00:41:28 +02:00
current_module = " check_framedrop " ;
2002-04-14 03:20:26 +02:00
if ( sh_audio & & ! d_audio - > eof ) {
2002-10-06 01:00:18 +02:00
float delay = playback_speed * audio_out - > get_delay ( ) ;
2002-11-02 20:52:59 +01:00
float d = delay - sh_audio - > delay ;
2002-04-14 03:20:26 +02:00
// 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 21:43:23 +02:00
+ + total_frame_cnt ;
2002-04-14 03:20:26 +02:00
}
2001-10-30 21:36:20 +01:00
// decode:
current_module = " decode_video " ;
// printf("Decode! %p %d \n",start,in_size);
2002-04-07 00:05:01 +02:00
blit_frame = decode_video ( sh_video , start , in_size , drop_frame ) ;
2002-04-19 08:21:41 +02:00
break ;
2001-07-08 02:21:20 +02:00
}
2001-10-30 21:36:20 +01:00
vdecode_time = video_time_usage - vdecode_time ;
//------------------------ frame decoded. --------------------
2002-04-14 00:16:15 +02:00
mp_dbg ( MSGT_AVSYNC , MSGL_DBG2 , " *** ftime=%5.3f *** \n " , frame_time ) ;
2002-05-02 00:37:59 +02:00
if ( sh_video - > vf_inited < 0 ) {
2002-08-05 20:37:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_FATAL , MSGTR_NotInitializeVOPorVO ) ;
2002-05-02 00:37:59 +02:00
eof = 1 ; goto goto_next_file ;
}
2002-05-02 04:03:59 +02:00
}
2002-04-14 00:16:15 +02:00
// ==========================================================================
2001-10-30 21:36:20 +01:00
2002-04-16 00:41:28 +02:00
// current_module="draw_osd";
// if(vo_config_count) video_out->draw_osd();
2001-02-24 21:28:24 +01:00
2002-04-14 00:16:15 +02:00
# ifdef HAVE_NEW_GUI
if ( use_gui ) guiEventHandling ( ) ;
# endif
2001-05-10 05:39:54 +02:00
2002-04-14 00:16:15 +02:00
current_module = " calc_sleep_time " ;
2001-05-13 05:00:57 +02:00
2002-04-14 03:20:26 +02:00
#if 0
{ // debug frame dropping code
2001-11-24 06:29:56 +01:00
float delay = audio_out - > get_delay ( ) ;
2002-04-14 03:20:26 +02: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-02 00:29:04 +02: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-14 00:16:15 +02:00
time_frame = 0 ; // don't sleep!
blit_frame = 0 ; // don't display!
2001-05-14 11:35:51 +02:00
} else {
2001-05-13 05:00:57 +02:00
2002-04-14 03:20:26 +02:00
// It's time to sleep...
2002-05-02 04:03:59 +02:00
frame_time_remaining = 0 ;
2001-05-13 05:00:57 +02:00
time_frame - = GetRelativeTime ( ) ; // reset timer
2001-05-10 05:39:54 +02:00
2001-07-21 03:17:00 +02:00
if ( sh_audio & & ! d_audio - > eof ) {
2002-10-06 01:00:18 +02:00
float delay = playback_speed * audio_out - > get_delay ( ) ;
2001-11-24 06:29:56 +01:00
mp_dbg ( MSGT_AVSYNC , MSGL_DBG2 , " delay=%f \n " , delay ) ;
2001-11-14 01:26:28 +01:00
2002-10-02 00:29:04 +02: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.
*/
2002-11-02 20:52:59 +01:00
float predicted = sh_audio - > delay + time_frame ;
2002-10-02 00:29:04 +02:00
float difference = delay - predicted ;
delay = predicted + difference / ( float ) autosync ;
}
2002-11-02 20:52:59 +01:00
time_frame = delay - sh_audio - > delay ;
2001-11-24 06:29:56 +01:00
2002-09-24 00:12:29 +02:00
// delay = amount of audio buffered in soundcard/driver
2002-05-02 04:03:59 +02: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 05:00:57 +02:00
} else {
2002-04-14 00:16:15 +02:00
2001-11-14 01:26:28 +01:00
// NOSOUND:
2001-06-13 23:55:24 +02:00
if ( ( time_frame < - 3 * frame_time | | time_frame > 3 * frame_time ) | | benchmark )
time_frame = 0 ;
2001-05-13 05:00:57 +02:00
}
2001-05-14 11:35:51 +02:00
2001-07-21 03:17:00 +02:00
// if(verbose>1)printf("sleep: %5.3f a:%6.3f v:%6.3f \n",time_frame,sh_audio->timer,sh_video->timer);
2001-08-04 15:52:41 +02:00
aq_sleep_time + = time_frame ;
2001-08-27 02:55:25 +02:00
2002-04-14 00:16:15 +02:00
} // !drop_frame
//============================== SLEEP: ===================================
2001-11-05 03:53:53 +01:00
2002-11-03 03:02:08 +01:00
time_frame / = playback_speed ;
2002-04-14 00:16:15 +02:00
// flag 256 means: libvo driver does its timing (dvb card)
if ( time_frame > 0.001 & & ! ( vo_flags & 256 ) ) {
2001-11-14 01:26:28 +01:00
2001-11-20 08:53:20 +01:00
# ifdef HAVE_RTC
2001-11-14 01:26:28 +01:00
if ( rtc_fd > = 0 ) {
// -------- RTC -----------
2002-04-14 00:16:15 +02:00
current_module = " sleep_rtc " ;
2001-11-14 01:26:28 +01:00
while ( time_frame > 0.000 ) {
2002-09-24 00:05:09 +02:00
unsigned long rtc_ts ;
2001-11-14 01:26:28 +01:00
if ( read ( rtc_fd , & rtc_ts , sizeof ( rtc_ts ) ) < = 0 )
2002-03-15 23:25:57 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , " Linux RTC read error: %s \n " , strerror ( errno ) ) ;
2001-11-14 01:26:28 +01:00
time_frame - = GetRelativeTime ( ) ;
}
} else
# endif
{
// -------- USLEEP + SOFTSLEEP -----------
float min = softsleep ? 0.021 : 0.005 ;
2002-04-14 00:16:15 +02:00
current_module = " sleep_usleep " ;
2001-11-14 01:26:28 +01:00
while ( time_frame > min ) {
2001-05-10 05:39:54 +02:00
if ( time_frame < = 0.020 )
2001-08-04 15:52:41 +02:00
usec_sleep ( 0 ) ; // sleeps 1 clock tick (10ms)!
2001-05-10 05:39:54 +02:00
else
2001-11-07 03:15:04 +01:00
usec_sleep ( 1000000 * ( time_frame - 0.020 ) ) ;
2001-05-10 05:39:54 +02:00
time_frame - = GetRelativeTime ( ) ;
2001-11-14 01:26:28 +01:00
}
if ( softsleep ) {
2002-04-14 00:16:15 +02:00
current_module = " sleep_soft " ;
2002-03-15 23:25:57 +01:00
if ( time_frame < 0 ) mp_msg ( MSGT_AVSYNC , MSGL_WARN , " Warning! Softsleep underflow! \n " ) ;
2001-11-14 01:26:28 +01:00
while ( time_frame > 0 ) time_frame - = GetRelativeTime ( ) ; // burn the CPU
}
}
2001-11-05 03:53:53 +01:00
}
2001-03-16 19:08:58 +01:00
2002-05-02 04:03:59 +02:00
//if(!frame_time_remaining){ // should we display the frame now?
2002-04-14 00:16:15 +02:00
//====================== FLIP PAGE (VIDEO BLT): =========================
2002-05-20 01:22:11 +02:00
current_module = " vo_check_events " ;
2002-04-07 04:12:15 +02:00
if ( vo_config_count ) video_out - > check_events ( ) ;
2002-05-20 01:22:11 +02:00
current_module = " flip_page " ;
2002-12-14 18:12:40 +01:00
if ( ! frame_time_remaining ) {
if ( blit_frame ) {
2001-09-25 22:28:40 +02:00
unsigned int t2 = GetTimer ( ) ;
2002-02-24 16:54:13 +01:00
double tt ;
2001-11-14 01:26:28 +01:00
float j ;
# define FRAME_LAG_WARN 0.2
j = ( ( float ) t2 - lastframeout_ts ) / 1000000 ;
lastframeout_ts = GetTimer ( ) ;
if ( j < frame_time + frame_time * - FRAME_LAG_WARN )
too_fast_frame_cnt + + ;
/* printf ("PANIC: too fast frame (%.3f)!\n", j); */
else if ( j > frame_time + frame_time * FRAME_LAG_WARN )
too_slow_frame_cnt + + ;
/* printf ("PANIC: too slow frame (%.3f)!\n", j); */
2002-04-07 04:12:15 +02:00
if ( vo_config_count ) video_out - > flip_page ( ) ;
2002-04-14 00:16:15 +02:00
// usec_sleep(50000); // test only!
2002-02-24 16:54:13 +01:00
t2 = GetTimer ( ) - t2 ;
tt = t2 * 0.000001f ;
vout_time_usage + = tt ;
2002-12-14 18:12:40 +01:00
} else {
/*
Well , no blitting is needed , but some devices ( such as yuv4mpeg ) must output frame
otherwise A / V desync will occur . - - Alvieboy
*/
if ( vo_config_count )
video_out - > control ( VOCTRL_DUPLICATE_FRAME , NULL ) ;
}
}
2002-04-14 00:16:15 +02:00
//====================== A-V TIMESTAMP CORRECTION: =========================
2001-02-24 21:28:24 +01:00
2002-04-14 00:16:15 +02:00
current_module = " av_sync " ;
2001-02-24 21:28:24 +01:00
2001-07-21 03:17:00 +02:00
if ( sh_audio ) {
2001-05-13 05:00:57 +02:00
float a_pts = 0 ;
float v_pts = 0 ;
2001-05-10 05:39:54 +02:00
// unplayed bytes in our and soundcard/dma buffer:
2002-10-06 01:00:18 +02:00
float delay = playback_speed * audio_out - > get_delay ( ) + ( float ) sh_audio - > a_buffer_len / ( float ) sh_audio - > o_bps ;
2001-05-10 05:39:54 +02:00
2002-10-02 00:29:04 +02: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 . )
*/
2002-11-02 20:52:59 +01:00
delay = sh_audio - > delay ;
2002-10-02 00:29:04 +02:00
delay + = ( float ) sh_audio - > a_buffer_len / ( float ) sh_audio - > o_bps ;
}
2002-11-02 01:45:12 +01:00
#if 0
2001-05-13 05:00:57 +02:00
if ( pts_from_bps ) {
2002-04-14 00:16:15 +02:00
// PTS = sample_no / samplerate
2002-10-14 03:39:17 +02:00
unsigned int samples =
// (sh_audio->audio.dwSampleSize)?
// ((ds_tell(d_audio)-sh_audio->a_in_buffer_len)/sh_audio->audio.dwSampleSize) :
2002-10-16 16:51:15 +02:00
ds_tell_block ( d_audio ) ; // <- used for VBR audio
2001-12-04 01:26:45 +01:00
samples + = sh_audio - > audio . dwStart ; // offset
2001-08-12 22:52:35 +02:00
a_pts = samples * ( float ) sh_audio - > audio . dwScale / ( float ) sh_audio - > audio . dwRate ;
2002-04-14 00:16:15 +02:00
delay_corrected = 1 ;
2002-10-16 16:51:15 +02:00
a_pts - = ( sh_audio - > a_in_buffer_len ) / ( float ) sh_audio - > i_bps ;
2002-11-02 01:45:12 +01:00
} else
# endif
{
2001-05-13 05:00:57 +02:00
// PTS = (last timestamp) + (bytes after last timestamp)/(bytes per sec)
2001-05-10 05:39:54 +02:00
a_pts = d_audio - > pts ;
2001-08-12 22:52:35 +02:00
if ( ! delay_corrected ) if ( a_pts ) delay_corrected = 1 ;
2002-06-14 19:40:36 +02: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 05:39:54 +02:00
a_pts + = ( ds_tell_pts ( d_audio ) - sh_audio - > a_in_buffer_len ) / ( float ) sh_audio - > i_bps ;
2001-02-24 21:28:24 +01:00
}
2003-01-16 23:34:46 +01:00
v_pts = sh_video ? sh_video - > pts : d_video - > pts ;
2001-05-13 05:00:57 +02:00
2001-08-17 02:40:25 +02:00
mp_dbg ( MSGT_AVSYNC , MSGL_DBG2 , " ### A:%8.3f (%8.3f) V:%8.3f A-V:%7.4f \n " , a_pts , a_pts - audio_delay - delay , v_pts , ( a_pts - delay - audio_delay ) - v_pts ) ;
2001-05-13 05:00:57 +02:00
2001-04-14 05:12:06 +02:00
if ( delay_corrected ) {
2002-05-23 23:58:29 +02:00
static int drop_message = 0 ;
2001-08-10 03:27:02 +02:00
float x ;
AV_delay = ( a_pts - delay - audio_delay ) - v_pts ;
2003-10-24 00:44:25 +02:00
if ( AV_delay > 0.5 & & drop_frame_cnt > 50 & & drop_message = = 0 ) {
2002-05-23 23:58:29 +02:00
+ + drop_message ;
2003-06-27 12:16:14 +02:00
mp_msg ( MSGT_AVSYNC , MSGL_WARN , MSGTR_SystemTooSlow ) ;
2002-05-23 23:58:29 +02:00
}
2001-08-10 03:27:02 +02:00
x = AV_delay * 0.1f ;
2001-02-24 21:28:24 +01:00
if ( x < - max_pts_correction ) x = - max_pts_correction ; else
if ( x > max_pts_correction ) x = max_pts_correction ;
2001-05-13 05:00:57 +02:00
if ( default_max_pts_correction > = 0 )
max_pts_correction = default_max_pts_correction ;
else
max_pts_correction = sh_video - > frametime * 0.10 ; // +-10% of time
2002-11-02 20:52:59 +01:00
if ( ! frame_time_remaining ) { sh_audio - > delay + = x ; c_total + = x ; } // correction
2001-10-22 01:05:05 +02:00
if ( ! quiet ) mp_msg ( MSGT_AVSYNC , MSGL_STATUS , " A:%6.1f V:%6.1f A-V:%7.3f ct:%7.3f %3d/%3d %2d%% %2d%% %4.1f%% %d %d %d%% \r " ,
2001-08-12 22:52:35 +02:00
a_pts - audio_delay - delay , v_pts , AV_delay , c_total ,
2001-08-16 03:03:51 +02:00
( int ) sh_video - > num_frames , ( int ) sh_video - > num_frames_decoded ,
2002-10-06 01:00:18 +02:00
( sh_video - > timer > 0.5 ) ? ( int ) ( 100.0 * video_time_usage * playback_speed / ( double ) sh_video - > timer ) : 0 ,
( sh_video - > timer > 0.5 ) ? ( int ) ( 100.0 * vout_time_usage * playback_speed / ( double ) sh_video - > timer ) : 0 ,
( sh_video - > timer > 0.5 ) ? ( 100.0 * audio_time_usage * playback_speed / ( double ) sh_video - > timer ) : 0
2001-08-12 22:52:35 +02:00
, drop_frame_cnt
, output_quality
2001-10-22 01:05:05 +02:00
, cache_fill_status
2001-02-24 21:28:24 +01:00
) ;
fflush ( stdout ) ;
}
2001-05-13 05:00:57 +02:00
2001-02-24 21:28:24 +01:00
} else {
// No audio:
2001-07-29 19:42:06 +02:00
2001-08-06 02:30:29 +02:00
if ( ! quiet )
2003-01-17 00:03:06 +01:00
mp_msg ( MSGT_AVSYNC , MSGL_STATUS , " V:%6.1f %3d %2d%% %2d%% %4.1f%% %d %d %d%% \r " , sh_video - > pts ,
2001-07-28 22:33:51 +02:00
( int ) sh_video - > num_frames ,
2001-07-21 03:17:00 +02:00
( sh_video - > timer > 0.5 ) ? ( int ) ( 100.0 * video_time_usage / ( double ) sh_video - > timer ) : 0 ,
( sh_video - > timer > 0.5 ) ? ( int ) ( 100.0 * vout_time_usage / ( double ) sh_video - > timer ) : 0 ,
( sh_video - > timer > 0.5 ) ? ( 100.0 * audio_time_usage / ( double ) sh_video - > timer ) : 0
2001-10-22 01:05:05 +02:00
, drop_frame_cnt
, output_quality
, cache_fill_status
2001-04-15 21:13:38 +02:00
) ;
2001-02-24 21:28:24 +01:00
fflush ( stdout ) ;
2001-07-29 19:42:06 +02:00
2001-02-24 21:28:24 +01:00
}
2002-04-14 00:16:15 +02:00
//============================ Auto QUALITY ============================
2001-02-24 21:28:24 +01:00
2001-08-04 15:52:41 +02:00
/*Output quality adjustments:*/
if ( auto_quality > 0 ) {
2002-04-14 00:16:15 +02:00
current_module = " autoq " ;
2001-08-12 17:46:09 +02:00
// float total=0.000001f * (GetTimer()-aq_total_time);
2001-08-04 15:52:41 +02:00
// if(output_quality<auto_quality && aq_sleep_time>0.05f*total)
if ( output_quality < auto_quality & & aq_sleep_time > 0 )
+ + output_quality ;
else
// if(output_quality>0 && aq_sleep_time<-0.05f*total)
if ( output_quality > 1 & & aq_sleep_time < 0 )
- - output_quality ;
else
if ( output_quality > 0 & & aq_sleep_time < - 0.050f ) // 50ms
output_quality = 0 ;
// printf("total: %8.6f sleep: %8.6f q: %d\n",(0.000001f*aq_total_time),aq_sleep_time,output_quality);
set_video_quality ( sh_video , output_quality ) ;
}
2002-04-14 00:16:15 +02:00
} // end if(sh_video)
//============================ Handle PAUSE ===============================
current_module = " pause " ;
2002-02-08 17:00:14 +01:00
2001-07-30 04:00:54 +02:00
# ifdef USE_OSD
2001-03-27 02:39:24 +02:00
if ( osd_visible ) {
2002-04-15 21:17:12 +02:00
if ( ! - - osd_visible ) {
vo_osd_progbar_type = - 1 ; // disable
vo_osd_changed ( OSDTYPE_PROGBAR ) ;
2001-08-13 15:12:49 +02:00
if ( osd_function ! = OSD_PAUSE )
osd_function = OSD_PLAY ;
}
2001-03-27 02:39:24 +02:00
}
2001-07-30 04:00:54 +02:00
# endif
2001-04-12 02:40:42 +02:00
if ( osd_function = = OSD_PAUSE ) {
2002-01-30 13:46:03 +01:00
mp_cmd_t * cmd ;
2002-02-08 17:00:14 +01:00
if ( ! quiet ) {
2002-08-05 20:37:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_STATUS , MSGTR_Paused ) ;
2002-02-08 17:00:14 +01:00
fflush ( stdout ) ;
}
2001-08-31 01:11:06 +02:00
# ifdef HAVE_NEW_GUI
2002-03-07 12:57:33 +01:00
if ( use_gui ) guiGetEvent ( guiCEvent , ( char * ) guiSetPause ) ;
2001-08-31 01:11:06 +02:00
# endif
2002-04-07 04:12:15 +02:00
if ( video_out & & sh_video & & vo_config_count )
2002-02-18 18:34:20 +01:00
video_out - > control ( VOCTRL_PAUSE , NULL ) ;
2001-07-21 03:17:00 +02:00
if ( audio_out & & sh_audio )
2001-06-18 16:19:13 +02:00
audio_out - > pause ( ) ; // pause audio, keep data if possible
2001-12-04 22:04:28 +01:00
2002-01-30 13:46:03 +01:00
while ( ( cmd = mp_input_get_cmd ( 20 , 1 ) ) = = NULL ) {
2002-04-07 04:12:15 +02:00
if ( sh_video & & video_out & & vo_config_count ) video_out - > check_events ( ) ;
2001-08-27 02:55:25 +02:00
# ifdef HAVE_NEW_GUI
if ( use_gui ) {
2002-02-21 23:48:47 +01:00
guiEventHandling ( ) ;
2002-07-02 15:35:04 +02:00
guiGetEvent ( guiReDraw , NULL ) ;
2002-03-07 00:54:20 +01:00
if ( guiIntfStruct . Playing ! = 2 | | ( rel_seek_secs | | abs_seek_pos ) ) break ;
2001-08-27 02:55:25 +02:00
}
2002-11-15 00:49:05 +01:00
# endif
# ifdef HAVE_MENU
if ( vf_menu )
vf_menu_pause_update ( vf_menu ) ;
2001-07-30 04:00:54 +02:00
# endif
2003-02-19 18:14:57 +01:00
usec_sleep ( 20000 ) ;
2002-01-30 13:46:03 +01:00
}
2002-03-11 10:19:15 +01:00
mp_cmd_free ( cmd ) ;
2001-05-08 14:17:03 +02:00
osd_function = OSD_PLAY ;
2001-07-21 03:17:00 +02:00
if ( audio_out & & sh_audio )
2001-06-18 16:19:13 +02:00
audio_out - > resume ( ) ; // resume audio
2002-04-07 04:12:15 +02:00
if ( video_out & & sh_video & & vo_config_count )
2002-02-18 18:34:20 +01:00
video_out - > control ( VOCTRL_RESUME , NULL ) ; // resume video
2001-11-14 01:26:28 +01:00
( void ) GetRelativeTime ( ) ; // keep TF around FT in next cycle
2001-08-31 01:11:06 +02:00
# ifdef HAVE_NEW_GUI
2002-05-25 11:46:37 +02:00
if ( use_gui )
{
if ( guiIntfStruct . Playing = = guiSetStop ) goto goto_next_file ;
guiGetEvent ( guiCEvent , ( char * ) guiSetPlay ) ;
}
2001-08-31 01:11:06 +02:00
# endif
2001-04-12 02:40:42 +02:00
}
2002-04-14 00:16:15 +02:00
// handle -sstep
2001-10-23 22:15:00 +02:00
if ( step_sec > 0 ) {
osd_function = OSD_FFW ;
rel_seek_secs + = step_sec ;
}
2001-03-25 06:27:39 +02:00
2002-04-04 16:44:47 +02:00
# ifdef USE_DVDNAV
if ( stream - > type = = STREAMTYPE_DVDNAV & & dvd_nav_still )
dvdnav_stream_sleeping ( ( dvdnav_priv_t * ) stream - > priv ) ;
# endif
2002-12-23 01:33:22 +01:00
//================= EDL =========================================
# ifdef USE_EDL
if ( next_edl_record - > next ) { // Are we (still?) doing EDL?
2003-01-17 00:03:06 +01:00
if ( sh_video - > pts > = next_edl_record - > start_sec ) {
2002-12-23 01:33:22 +01:00
if ( next_edl_record - > action = = EDL_SKIP ) {
osd_function = OSD_FFW ;
abs_seek_pos = 0 ;
rel_seek_secs = next_edl_record - > length_sec ;
# ifdef DEBUG_EDL
printf ( " \n EDL_SKIP: start [%f], stop [%f], length [%f] \n " , next_edl_record - > start_sec , next_edl_record - > stop_sec , next_edl_record - > length_sec ) ;
# endif
edl_decision = 1 ;
next_edl_record = next_edl_record - > next ;
} else if ( next_edl_record - > action = = EDL_MUTE ) {
mixer_mute ( ) ;
# ifdef DEBUG_EDL
printf ( " \n EDL_MUTE: [%f] \n " , next_edl_record - > start_sec ) ;
# endif
edl_decision = 1 ;
next_edl_record = next_edl_record - > next ;
}
}
}
# endif
2001-02-24 21:28:24 +01:00
//================= Keyboard events, SEEKing ====================
2002-04-14 00:16:15 +02:00
current_module = " key_events " ;
2002-01-30 13:46:03 +01:00
{
mp_cmd_t * cmd ;
2003-07-11 09:54:52 +02:00
int brk_cmd = 0 ;
while ( ! brk_cmd & & ( cmd = mp_input_get_cmd ( 0 , 0 ) ) ! = NULL ) {
2002-01-30 13:46:03 +01:00
switch ( cmd - > id ) {
case MP_CMD_SEEK : {
int v , abs ;
2002-12-28 15:17:38 +01:00
osd_show_percentage = 25 ;
2002-01-30 13:46:03 +01:00
v = cmd - > args [ 0 ] . v . i ;
abs = ( cmd - > nargs > 1 ) ? cmd - > args [ 1 ] . v . i : 0 ;
2002-09-20 20:39:09 +02: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 13:46:03 +01:00
abs_seek_pos = 3 ;
2002-04-23 16:27:27 +02:00
if ( sh_video )
osd_function = ( v > sh_video - > timer ) ? OSD_FFW : OSD_REW ;
rel_seek_secs = v / 100.0 ;
2002-01-30 13:46:03 +01:00
}
else {
rel_seek_secs + = v ;
osd_function = ( v > 0 ) ? OSD_FFW : OSD_REW ;
}
2003-07-11 09:54:52 +02:00
brk_cmd = 1 ;
2002-01-30 13:46:03 +01:00
} break ;
2002-12-23 01:33:22 +01:00
# ifdef USE_EDL
case MP_CMD_EDL_MARK :
if ( edl_fd ) {
2003-01-17 00:03:06 +01:00
float v = sh_video - > pts ;
2002-12-23 01:33:22 +01:00
fprintf ( edl_fd , " %f %f %d \n " , v - 2 , v , 0 ) ;
}
break ;
# endif
2002-01-30 13:46:03 +01:00
case MP_CMD_AUDIO_DELAY : {
float v = cmd - > args [ 0 ] . v . f ;
audio_delay + = v ;
osd_show_av_delay = 9 ;
2002-11-02 20:52:59 +01:00
if ( sh_audio ) sh_audio - > delay + = v ;
2002-01-30 13:46:03 +01:00
} break ;
case MP_CMD_PAUSE : {
osd_function = OSD_PAUSE ;
2003-07-11 09:54:52 +02:00
brk_cmd = 1 ;
2002-01-30 13:46:03 +01:00
} break ;
case MP_CMD_QUIT : {
2002-12-29 22:06:20 +01:00
exit_player_with_rc ( MSGTR_Exit_quit , 0 ) ;
2002-01-30 13:46:03 +01:00
}
case MP_CMD_GRAB_FRAMES : {
grab_frames = 2 ;
} break ;
case MP_CMD_PLAY_TREE_STEP : {
2002-11-15 00:49:05 +01:00
int n = cmd - > args [ 0 ] . v . i = = 0 ? 1 : cmd - > args [ 0 ] . v . i ;
2002-03-16 17:36:32 +01:00
int force = cmd - > args [ 1 ] . v . i ;
2003-02-06 00:02:35 +01:00
# ifdef HAVE_NEW_GUI
if ( use_gui ) {
int i = 0 ;
if ( n > 0 )
for ( i = 0 ; i < n ; i + + )
mplNext ( ) ;
else
for ( i = 0 ; i < - 1 * n ; i + + )
mplPrev ( ) ;
} else
# endif
{
if ( ! force & & playtree_iter ) {
2002-03-16 17:36:32 +01:00
play_tree_iter_t * i = play_tree_iter_new_copy ( playtree_iter ) ;
if ( play_tree_iter_step ( i , n , 0 ) = = PLAY_TREE_ITER_ENTRY )
eof = ( n > 0 ) ? PT_NEXT_ENTRY : PT_PREV_ENTRY ;
play_tree_iter_free ( i ) ;
} else
2002-01-30 13:46:03 +01:00
eof = ( n > 0 ) ? PT_NEXT_ENTRY : PT_PREV_ENTRY ;
2002-11-15 00:49:05 +01:00
if ( eof )
play_tree_step = n ;
2003-07-11 09:54:52 +02:00
brk_cmd = 1 ;
2003-02-06 00:02:35 +01:00
}
2002-01-30 13:46:03 +01:00
} break ;
case MP_CMD_PLAY_TREE_UP_STEP : {
int n = cmd - > args [ 0 ] . v . i > 0 ? 1 : - 1 ;
2002-03-16 17:36:32 +01:00
int force = cmd - > args [ 1 ] . v . i ;
2003-02-06 00:02:35 +01:00
if ( ! force & & playtree_iter ) {
2002-03-16 17:36:32 +01:00
play_tree_iter_t * i = play_tree_iter_new_copy ( playtree_iter ) ;
if ( play_tree_iter_up_step ( i , n , 0 ) = = PLAY_TREE_ITER_ENTRY )
eof = ( n > 0 ) ? PT_UP_NEXT : PT_UP_PREV ;
play_tree_iter_free ( i ) ;
} else
2002-01-30 13:46:03 +01:00
eof = ( n > 0 ) ? PT_UP_NEXT : PT_UP_PREV ;
2003-07-11 09:54:52 +02:00
brk_cmd = 1 ;
2002-01-30 13:46:03 +01:00
} break ;
case MP_CMD_PLAY_ALT_SRC_STEP : {
2003-02-08 22:56:52 +01:00
if ( playtree_iter & & playtree_iter - > num_files > 1 ) {
2002-01-30 13:46:03 +01:00
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 ;
}
2003-07-11 09:54:52 +02:00
brk_cmd = 1 ;
2002-01-30 13:46:03 +01:00
} break ;
case MP_CMD_SUB_DELAY : {
2003-08-14 23:29:39 +02:00
# ifdef USE_SUB
if ( sh_video ) {
2002-01-30 13:46:03 +01:00
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
2003-08-14 23:29:39 +02:00
}
# endif
2002-01-30 13:46:03 +01:00
} break ;
2002-12-05 01:15:56 +01:00
case MP_CMD_SUB_STEP : {
2003-08-14 23:29:39 +02:00
# ifdef USE_SUB
if ( sh_video ) {
2002-12-05 01:15:56 +01:00
int movement = cmd - > args [ 0 ] . v . i ;
2003-04-07 18:04:02 +02:00
step_sub ( subdata , sh_video - > pts , movement ) ;
2002-12-05 01:15:56 +01:00
osd_show_sub_delay = 9 ; // show the subdelay in OSD
2003-08-14 23:29:39 +02:00
}
# endif
2002-12-05 01:15:56 +01:00
} break ;
2003-08-14 23:29:39 +02:00
case MP_CMD_OSD : {
# ifdef USE_OSD
2002-02-08 17:00:14 +01:00
if ( sh_video ) {
int v = cmd - > args [ 0 ] . v . i ;
if ( v < 0 )
2002-12-28 15:17:38 +01:00
osd_level = ( osd_level + 1 ) % ( MAX_OSD_LEVEL + 1 ) ;
2002-02-08 17:00:14 +01:00
else
2002-12-28 15:17:38 +01:00
osd_level = v > MAX_OSD_LEVEL ? MAX_OSD_LEVEL : v ;
2003-08-14 23:29:39 +02:00
}
# endif
} break ;
2003-05-17 11:21:21 +02:00
case MP_CMD_OSD_SHOW_TEXT : {
# ifdef USE_OSD
if ( osd_level & & sh_video ) {
osd_show_text = sh_video - > fps ; // 1 sec
strncpy ( osd_show_text_buffer , cmd - > args [ 0 ] . v . s , 64 ) ;
}
# endif
} break ;
2002-01-30 13:46:03 +01:00
case MP_CMD_VOLUME : {
int v = cmd - > args [ 0 ] . v . i ;
2002-08-21 22:44:29 +02: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 13:46:03 +01:00
if ( v > 0 )
mixer_incvolume ( ) ;
else
mixer_decvolume ( ) ;
2002-08-21 22:44:29 +02:00
}
2002-01-30 13:46:03 +01:00
# ifdef USE_OSD
2002-10-26 02:28:48 +02:00
if ( osd_level & & sh_video ) {
2002-01-30 13:46:03 +01:00
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 21:17:12 +02:00
vo_osd_changed ( OSDTYPE_PROGBAR ) ;
2002-01-30 13:46:03 +01:00
}
# endif
} break ;
2002-08-06 21:45:59 +02:00
case MP_CMD_MUTE :
mixer_mute ( ) ;
break ;
2002-07-26 23:26:39 +02: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 ;
2003-07-11 09:54:52 +02:00
brk_cmd = 1 ;
2002-07-26 23:26:39 +02:00
} break ;
case MP_CMD_LOADLIST : {
play_tree_t * e = parse_playlist_file ( cmd - > args [ 0 ] . v . s ) ;
if ( ! e )
2002-08-05 20:37:14 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_ERR , MSGTR_PlaylistLoadUnable , cmd - > args [ 0 ] . v . s ) ;
2002-07-26 23:26:39 +02: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 ;
}
2003-07-11 09:54:52 +02:00
brk_cmd = 1 ;
2002-01-30 13:46:03 +01:00
} break ;
2002-09-27 23:08:36 +02: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 13:46:03 +01:00
case MP_CMD_BRIGHTNESS : {
int v = cmd - > args [ 0 ] . v . i , abs = cmd - > args [ 1 ] . v . i ;
2002-07-25 15:12:23 +02: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 20:19:39 +02: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 13:46:03 +01:00
# ifdef USE_OSD
2002-07-19 22:51:48 +02: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 13:46:03 +01:00
} break ;
2002-07-24 20:19:39 +02:00
case MP_CMD_CONTRAST : {
2002-01-30 13:46:03 +01:00
int v = cmd - > args [ 0 ] . v . i , abs = cmd - > args [ 1 ] . v . i ;
2002-07-25 15:12:23 +02: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 20:19:39 +02: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 13:46:03 +01:00
# ifdef USE_OSD
2002-07-24 20:19:39 +02: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 13:46:03 +01:00
} break ;
case MP_CMD_SATURATION : {
int v = cmd - > args [ 0 ] . v . i , abs = cmd - > args [ 1 ] . v . i ;
2002-07-25 15:12:23 +02: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 20:19:39 +02: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 13:46:03 +01:00
}
2002-07-24 20:19:39 +02:00
} break ;
case MP_CMD_HUE : {
int v = cmd - > args [ 0 ] . v . i , abs = cmd - > args [ 1 ] . v . i ;
2002-07-25 15:12:23 +02: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 20:19:39 +02: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 13:46:03 +01:00
# ifdef USE_OSD
2002-07-24 20:19:39 +02: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 13:46:03 +01: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
2003-08-04 11:13:10 +02:00
case MP_CMD_TV_SET_FREQ : {
if ( file_format = = DEMUXER_TYPE_TV )
tv_set_freq ( ( tvi_handle_t * ) ( demuxer - > priv ) , cmd - > args [ 0 ] . v . f * 16.0 ) ;
} break ;
case MP_CMD_TV_SET_NORM : {
if ( file_format = = DEMUXER_TYPE_TV )
tv_set_norm ( ( tvi_handle_t * ) ( demuxer - > priv ) , cmd - > args [ 0 ] . v . s ) ;
} break ;
2003-08-12 09:38:49 +02:00
case MP_CMD_TV_SET_BRIGHTNESS : {
if ( file_format = = DEMUXER_TYPE_TV )
tv_set_color_options ( ( tvi_handle_t * ) ( demuxer - > priv ) , TV_COLOR_BRIGHTNESS , cmd - > args [ 0 ] . v . i ) ;
} break ;
case MP_CMD_TV_SET_HUE : {
if ( file_format = = DEMUXER_TYPE_TV )
tv_set_color_options ( ( tvi_handle_t * ) ( demuxer - > priv ) , TV_COLOR_HUE , cmd - > args [ 0 ] . v . i ) ;
} break ;
case MP_CMD_TV_SET_SATURATION : {
if ( file_format = = DEMUXER_TYPE_TV )
tv_set_color_options ( ( tvi_handle_t * ) ( demuxer - > priv ) , TV_COLOR_SATURATION , cmd - > args [ 0 ] . v . i ) ;
} break ;
case MP_CMD_TV_SET_CONTRAST : {
if ( file_format = = DEMUXER_TYPE_TV )
tv_set_color_options ( ( tvi_handle_t * ) ( demuxer - > priv ) , TV_COLOR_CONTRAST , cmd - > args [ 0 ] . v . i ) ;
} break ;
2002-01-30 13:46:03 +01:00
case MP_CMD_TV_STEP_CHANNEL : {
2003-03-30 19:13:04 +02:00
if ( file_format = = DEMUXER_TYPE_TV ) {
2002-01-30 13:46:03 +01:00
int v = cmd - > args [ 0 ] . v . i ;
2002-12-28 23:57:39 +01:00
if ( v > 0 ) {
2002-09-16 18:53:25 +02:00
tv_step_channel ( ( tvi_handle_t * ) ( demuxer - > priv ) , TV_CHANNEL_HIGHER ) ;
2002-12-28 23:57:39 +01:00
# ifdef USE_OSD
if ( tv_channel_list ) {
osd_show_tv_channel = sh_video - > fps ;
vo_osd_changed ( OSDTYPE_SUBTITLE ) ;
}
# endif
} else {
2002-09-16 18:53:25 +02:00
tv_step_channel ( ( tvi_handle_t * ) ( demuxer - > priv ) , TV_CHANNEL_LOWER ) ;
2002-12-28 23:57:39 +01:00
# ifdef USE_OSD
if ( tv_channel_list ) {
osd_show_tv_channel = sh_video - > fps ;
vo_osd_changed ( OSDTYPE_SUBTITLE ) ;
}
# endif
}
2002-01-30 13:46:03 +01:00
}
2003-03-16 21:13:28 +01:00
}
# ifdef HAS_DVBIN_SUPPORT
2003-08-11 02:02:46 +02:00
if ( ( stream - > type = = STREAMTYPE_DVB ) & & stream - > priv )
2003-03-16 21:13:28 +01:00
{
2003-08-11 02:02:46 +02:00
dvb_priv_t * priv = ( dvb_priv_t * ) stream - > priv ;
if ( priv - > is_on )
{
int dir ;
2003-03-16 21:13:28 +01:00
int v = cmd - > args [ 0 ] . v . i ;
2003-08-27 19:08:58 +02:00
last_dvb_step = v ;
2003-03-16 21:13:28 +01:00
if ( v > 0 )
2003-08-11 02:02:46 +02:00
dir = DVB_CHANNEL_HIGHER ;
2003-03-16 21:13:28 +01:00
else
2003-08-11 02:02:46 +02:00
dir = DVB_CHANNEL_LOWER ;
if ( dvb_step_channel ( priv , dir ) )
{
2003-08-27 18:44:09 +02:00
uninit_player ( INITED_ALL - ( INITED_STREAM | INITED_INPUT ) ) ;
2003-08-11 02:02:46 +02:00
printf ( " UNINIT COMPLETE \n " ) ;
goto goto_open_demuxer ;
}
}
2003-03-16 21:13:28 +01:00
}
2003-08-11 02:02:46 +02:00
# endif
2003-03-16 21:13:28 +01:00
break ;
2002-12-19 11:09:43 +01:00
case MP_CMD_TV_SET_CHANNEL : {
2003-03-30 19:13:04 +02:00
if ( file_format = = DEMUXER_TYPE_TV ) {
2002-12-19 11:09:43 +01:00
tv_set_channel ( ( tvi_handle_t * ) ( demuxer - > priv ) , cmd - > args [ 0 ] . v . s ) ;
2002-12-28 23:57:39 +01:00
# ifdef USE_OSD
if ( tv_channel_list ) {
osd_show_tv_channel = sh_video - > fps ;
vo_osd_changed ( OSDTYPE_SUBTITLE ) ;
}
# endif
}
} break ;
2003-08-11 02:02:46 +02:00
# ifdef HAS_DVBIN_SUPPORT
case MP_CMD_DVB_SET_CHANNEL :
{
if ( ( stream - > type = = STREAMTYPE_DVB ) & & stream - > priv )
{
dvb_priv_t * priv = ( dvb_priv_t * ) stream - > priv ;
if ( priv - > is_on )
{
2003-08-27 19:08:58 +02:00
if ( priv - > list - > current < = cmd - > args [ 0 ] . v . i )
last_dvb_step = 1 ;
else
last_dvb_step = - 1 ;
2003-08-11 02:02:46 +02:00
if ( dvb_set_channel ( priv , cmd - > args [ 0 ] . v . i ) )
{
2003-08-27 18:44:09 +02:00
uninit_player ( INITED_ALL - ( INITED_STREAM | INITED_INPUT ) ) ;
2003-08-11 02:02:46 +02:00
goto goto_open_demuxer ;
}
}
}
}
# endif
2002-12-28 23:57:39 +01:00
case MP_CMD_TV_LAST_CHANNEL : {
2003-03-30 19:13:04 +02:00
if ( file_format = = DEMUXER_TYPE_TV ) {
2002-12-28 23:57:39 +01:00
tv_last_channel ( ( tvi_handle_t * ) ( demuxer - > priv ) ) ;
# ifdef USE_OSD
if ( tv_channel_list ) {
osd_show_tv_channel = sh_video - > fps ;
vo_osd_changed ( OSDTYPE_SUBTITLE ) ;
}
# endif
}
2002-12-19 11:09:43 +01:00
} break ;
2002-01-30 13:46:03 +01:00
case MP_CMD_TV_STEP_NORM : {
2003-03-30 19:13:04 +02:00
if ( file_format = = DEMUXER_TYPE_TV )
2002-09-16 18:53:25 +02:00
tv_step_norm ( ( tvi_handle_t * ) ( demuxer - > priv ) ) ;
2002-01-30 13:46:03 +01:00
} break ;
case MP_CMD_TV_STEP_CHANNEL_LIST : {
2003-03-30 19:13:04 +02:00
if ( file_format = = DEMUXER_TYPE_TV )
2002-09-16 18:53:25 +02:00
tv_step_chanlist ( ( tvi_handle_t * ) ( demuxer - > priv ) ) ;
2002-01-30 13:46:03 +01:00
} break ;
2002-02-24 22:20:20 +01:00
# endif
2002-02-17 02:07:45 +01:00
case MP_CMD_VO_FULLSCREEN :
{
2002-02-25 14:14:27 +01:00
# ifdef HAVE_NEW_GUI
if ( use_gui ) guiGetEvent ( guiIEvent , ( char * ) MP_CMD_GUI_FULLSCREEN ) ;
else
# endif
2002-04-07 04:12:15 +02:00
if ( video_out & & vo_config_count ) video_out - > control ( VOCTRL_FULLSCREEN , 0 ) ;
2002-02-17 02:07:45 +01:00
} break ;
2002-06-04 22:17:07 +02:00
case MP_CMD_PANSCAN : {
2002-06-06 09:13:57 +02:00
if ( ! video_out ) break ;
2002-06-05 21:35:54 +02: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 22:17:07 +02:00
# ifdef USE_OSD
2002-10-26 02:28:48 +02:00
if ( osd_level & & sh_video ) {
2002-06-05 21:35:54 +02:00
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 ) ;
2003-01-06 13:27:39 +01:00
# ifdef HAVE_FREETYPE
2003-02-08 19:45:32 +01:00
if ( subtitle_autoscale = = 2 | | subtitle_autoscale = = 3 )
// force scaling font to movie width or diagonal
2003-01-06 13:27:39 +01:00
force_load_font = 1 ;
# endif
2002-06-05 21:35:54 +02:00
}
2002-06-04 22:17:07 +02:00
# endif
2002-06-05 21:35:54 +02:00
}
2002-06-04 22:17:07 +02:00
} break ;
2002-03-10 04:47:53 +01:00
case MP_CMD_SUB_POS :
{
2003-08-14 23:29:39 +02:00
# ifdef USE_SUB
if ( sh_video ) {
2002-03-10 04:47:53 +01:00
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 22:51:34 +02:00
vo_osd_changed ( OSDTYPE_SUBTITLE ) ;
2002-12-05 01:18:56 +01:00
osd_show_sub_pos = 9 ;
2003-08-14 23:29:39 +02:00
}
# endif
} break ;
2002-12-23 02:37:43 +01:00
case MP_CMD_SUB_ALIGNMENT :
{
2003-08-14 23:29:39 +02:00
# ifdef USE_SUB
if ( sh_video ) {
2002-12-23 02:37:43 +01:00
if ( cmd - > nargs > = 1 )
sub_alignment = cmd - > args [ 0 ] . v . i ;
else
sub_alignment = ( sub_alignment + 1 ) % 3 ;
osd_show_sub_alignment = 9 ;
vo_osd_changed ( OSDTYPE_SUBTITLE ) ;
2003-08-14 23:29:39 +02:00
}
# endif
} break ;
2002-10-06 19:40:51 +02:00
case MP_CMD_SUB_VISIBILITY :
{
2003-08-14 23:29:39 +02:00
# ifdef USE_SUB
if ( sh_video ) {
2002-10-06 19:40:51 +02:00
sub_visibility = 1 - sub_visibility ;
osd_show_sub_visibility = 9 ; // show state of subtitle visibility in OSD
vo_osd_changed ( OSDTYPE_SUBTITLE ) ;
2003-08-14 23:29:39 +02:00
}
# endif
} break ;
2003-09-19 22:44:30 +02:00
case MP_CMD_GET_SUB_VISIBILITY :
{
# ifdef USE_SUB
if ( sh_video ) {
mp_msg ( MSGT_GLOBAL , MSGL_INFO , " ANS_SUB_VISIBILITY=%ld \n " , sub_visibility ) ;
}
# endif
} break ;
2002-10-17 17:44:41 +02:00
case MP_CMD_VOBSUB_LANG :
2002-10-19 03:58:34 +02:00
if ( vo_vobsub )
2002-10-17 17:44:41 +02:00
{
int new_id = vobsub_id + 1 ;
if ( vobsub_id < 0 )
new_id = 0 ;
if ( ( unsigned int ) new_id > = vobsub_get_indexes_count ( vo_vobsub ) )
new_id = - 1 ;
if ( new_id ! = vobsub_id )
osd_show_vobsub_changed = 9 ;
vobsub_id = new_id ;
}
2003-04-07 18:04:02 +02:00
# ifdef USE_SUB
else if ( set_of_sub_size > 0 ) { //change subtitle file
set_of_sub_pos = ( set_of_sub_pos + 1 ) % set_of_sub_size ;
subdata = set_of_subtitles [ set_of_sub_pos ] ;
osd_show_sub_changed = sh_video - > fps ;
vo_sub = NULL ;
vo_osd_changed ( OSDTYPE_SUBTITLE ) ;
}
# endif
break ;
2003-09-21 16:21:43 +02:00
case MP_CMD_SUB_FORCED_ONLY :
if ( vo_spudec ) {
forced_subs_only = forced_subs_only ? 0 : ~ 0 ; // toggle state
spudec_set_forced_subs_only ( vo_spudec , forced_subs_only ) ;
}
break ;
2002-05-18 02:11:43 +02:00
case MP_CMD_SCREENSHOT :
if ( vo_config_count ) video_out - > control ( VOCTRL_SCREENSHOT , NULL ) ;
break ;
2002-08-04 04:22:27 +02:00
case MP_CMD_VF_CHANGE_RECTANGLE :
set_rectangle ( sh_video , cmd - > args [ 0 ] . v . i , cmd - > args [ 1 ] . v . i ) ;
break ;
2002-12-05 01:11:12 +01:00
case MP_CMD_GET_TIME_LENGTH : {
mp_msg ( MSGT_GLOBAL , MSGL_INFO , " ANS_LENGTH=%ld \n " , demuxer_get_time_length ( demuxer ) ) ;
} break ;
2003-09-19 22:44:30 +02:00
case MP_CMD_GET_VO_FULLSCREEN : {
if ( video_out & & vo_config_count )
mp_msg ( MSGT_GLOBAL , MSGL_INFO , " ANS_VO_FULLSCREEN=%ld \n " , vo_fs ) ;
} break ;
2002-12-05 01:11:12 +01:00
case MP_CMD_GET_PERCENT_POS : {
mp_msg ( MSGT_GLOBAL , MSGL_INFO , " ANS_PERCENT_POSITION=%ld \n " , demuxer_get_percent_pos ( demuxer ) ) ;
} break ;
2002-03-28 21:40:21 +01:00
# ifdef USE_DVDNAV
2002-04-04 16:44:47 +02: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 03:50:00 +02:00
/* ignore these events if we're not in dvd_nav mode */
2003-03-30 19:13:04 +02:00
if ( stream - > type ! = STREAMTYPE_DVDNAV ) break ;
2002-04-15 03:50:00 +02:00
2002-04-04 16:44:47 +02:00
if ( ! dvdnav_event ) {
printf ( " DVDNAV Event NULL?! \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 ) ) {
2003-02-19 18:14:57 +01:00
usec_sleep ( 1000 ) ; /* 1ms */
2002-04-04 16:44:47 +02:00
}
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 19:14:41 +02: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 16:44:47 +02: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 19:14:41 +02:00
# endif
2002-04-04 16:44:47 +02:00
break ;
}
case DVDNAV_AUDIO_STREAM_CHANGE : {
int aid_temp ;
2002-08-11 19:14:41 +02: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 16:44:47 +02:00
dvdnav_stream_change_event_t * stream_change = ( dvdnav_stream_change_event_t * ) ( dvdnav_event - > details ) ;
2002-08-11 19:14:41 +02:00
# endif
2002-04-04 16:44:47 +02: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 ;
2002-12-28 12:39:31 +01:00
if ( sh_audio ) resync_audio_stream ( sh_audio ) ;
2002-04-04 16:44:47 +02:00
}
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 21:40:21 +01:00
case MP_CMD_DVDNAV : {
2002-04-04 16:44:47 +02:00
dvdnav_priv_t * dvdnav_priv = ( dvdnav_priv_t * ) stream - > priv ;
2002-04-15 03:50:00 +02:00
/* ignore these events if we're not in dvd_nav mode */
2003-03-30 19:13:04 +02:00
if ( stream - > type ! = STREAMTYPE_DVDNAV ) break ;
2002-04-15 03:50:00 +02:00
2002-03-28 21:40:21 +01:00
switch ( cmd - > args [ 0 ] . v . i ) {
case MP_CMD_DVDNAV_UP :
2002-04-04 16:44:47 +02:00
dvdnav_upper_button_select ( dvdnav_priv - > dvdnav ) ;
2002-03-28 21:40:21 +01:00
break ;
case MP_CMD_DVDNAV_DOWN :
2002-04-04 16:44:47 +02:00
dvdnav_lower_button_select ( dvdnav_priv - > dvdnav ) ;
2002-03-28 21:40:21 +01:00
break ;
case MP_CMD_DVDNAV_LEFT :
2002-04-04 16:44:47 +02:00
dvdnav_left_button_select ( dvdnav_priv - > dvdnav ) ;
2002-03-28 21:40:21 +01:00
break ;
case MP_CMD_DVDNAV_RIGHT :
2002-04-04 16:44:47 +02:00
dvdnav_right_button_select ( dvdnav_priv - > dvdnav ) ;
2002-03-28 21:40:21 +01:00
break ;
case MP_CMD_DVDNAV_MENU :
2002-04-04 16:44:47 +02:00
printf ( " Menu call \n " ) ;
dvdnav_menu_call ( dvdnav_priv - > dvdnav , DVD_MENU_Root ) ;
2002-03-28 21:40:21 +01:00
break ;
case MP_CMD_DVDNAV_SELECT :
2002-04-04 16:44:47 +02:00
dvdnav_button_activate ( dvdnav_priv - > dvdnav ) ;
2002-03-28 21:40:21 +01: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 14:14:27 +01:00
default : {
# ifdef HAVE_NEW_GUI
if ( ( use_gui ) & & ( cmd - > id > MP_CMD_GUI_EVENTS ) ) guiGetEvent ( guiIEvent , ( char * ) cmd - > id ) ;
else
# endif
2003-07-09 03:30:24 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_V , " Received unknown cmd %s \n " , cmd - > name ) ;
2002-01-30 13:46:03 +01:00
}
2002-02-25 14:14:27 +01:00
}
2002-01-30 13:46:03 +01:00
mp_cmd_free ( cmd ) ;
}
}
2002-08-28 17:55:58 +02:00
2001-04-27 00:10:25 +02:00
if ( seek_to_sec ) {
2001-06-02 00:48:50 +02:00
int a , b ; float d ;
if ( sscanf ( seek_to_sec , " %d:%d:%f " , & a , & b , & d ) = = 3 )
rel_seek_secs + = 3600 * a + 60 * b + d ;
else if ( sscanf ( seek_to_sec , " %d:%f " , & a , & d ) = = 2 )
rel_seek_secs + = 60 * a + d ;
else if ( sscanf ( seek_to_sec , " %f " , & d ) = = 1 )
rel_seek_secs + = d ;
seek_to_sec = NULL ;
2001-04-27 00:10:25 +02:00
}
2001-06-02 00:48:50 +02:00
2001-10-22 16:42:47 +02:00
/* Looping. */
2001-12-17 00:59:13 +01:00
if ( eof = = 1 & & loop_times > = 0 ) {
2002-04-17 14:23:52 +02:00
int l = loop_times ;
play_tree_iter_step ( playtree_iter , 0 , 0 ) ;
loop_times = l ;
2001-12-17 00:59:13 +01: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 ;
2002-11-15 00:49:05 +01:00
play_n_frames = play_n_frames_mf ;
2001-10-22 16:42:47 +02:00
eof = 0 ;
2001-12-17 00:59:13 +01:00
abs_seek_pos = 3 ; rel_seek_secs = 0 ; // seek to start of movie (0%)
2003-01-04 22:05:55 +01:00
loop_seek = 1 ;
2001-10-22 16:42:47 +02:00
}
2001-08-22 21:02:28 +02:00
if ( rel_seek_secs | | abs_seek_pos ) {
2001-08-08 21:37:45 +02:00
current_module = " seek " ;
2001-08-22 21:02:28 +02:00
if ( demux_seek ( demuxer , rel_seek_secs , abs_seek_pos ) ) {
2001-07-28 23:57:21 +02:00
// success:
2002-01-10 18:18:30 +01:00
/* FIXME there should be real seeking for vobsub */
2003-01-17 00:03:06 +01:00
if ( sh_video ) sh_video - > pts = d_video - > pts ;
2002-01-10 18:18:30 +01:00
if ( vo_vobsub )
vobsub_reset ( vo_vobsub ) ;
2002-05-03 01:40:31 +02:00
#if 0
2002-04-26 14:52:06 +02:00
if ( sh_video & & d_video - > packs = = 0 )
ds_fill_buffer ( d_video ) ;
2001-08-07 18:03:30 +02:00
if ( sh_audio ) {
2002-04-26 14:52:06 +02:00
if ( d_audio - > packs = = 0 )
ds_fill_buffer ( d_audio ) ;
2002-11-01 18:46:45 +01:00
if ( verbose > 0 ) {
2001-08-07 18:03:30 +02:00
float a_pts = d_audio - > pts ;
a_pts + = ( ds_tell_pts ( d_audio ) - sh_audio - > a_in_buffer_len ) / ( float ) sh_audio - > i_bps ;
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_AVSYNC , MSGL_V , " SEEK: A: %5.3f V: %5.3f A-V: %5.3f \n " , a_pts , d_video - > pts , a_pts - d_video - > pts ) ;
2001-08-07 18:03:30 +02:00
}
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_AVSYNC , MSGL_STATUS , " A:%6.1f V:%6.1f A-V:%7.3f ct: ? \r " , d_audio - > pts , d_video - > pts , 0.0f ) ;
2001-08-07 18:03:30 +02:00
} else {
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_AVSYNC , MSGL_STATUS , " A: --- V:%6.1f \r " , d_video - > pts ) ;
2001-08-07 18:03:30 +02:00
}
2002-05-03 01:40:31 +02:00
# endif
2001-08-07 18:03:30 +02:00
fflush ( stdout ) ;
2002-02-09 01:47:55 +01:00
if ( sh_video ) {
current_module = " seek_video_reset " ;
2002-04-07 04:12:15 +02:00
if ( vo_config_count ) video_out - > control ( VOCTRL_RESET , NULL ) ;
2002-02-09 01:47:55 +01:00
}
2001-07-21 03:17:00 +02:00
if ( sh_audio ) {
2001-08-08 21:37:45 +02:00
current_module = " seek_audio_reset " ;
2001-06-05 20:40:44 +02:00
audio_out - > reset ( ) ; // stop audio, throwing away buffered data
2001-02-24 21:28:24 +01:00
}
2001-07-30 04:00:54 +02:00
# ifdef USE_OSD
2001-07-16 19:07:13 +02:00
// Set OSD:
2003-01-04 22:05:55 +01:00
if ( osd_level & & ! loop_seek ) {
2002-12-23 01:33:22 +01:00
# ifdef USE_EDL
if ( ! edl_decision ) {
# else
if ( 1 ) { // Let the compiler optimize this out
# endif
int len = ( ( demuxer - > movi_end - demuxer - > movi_start ) > > 8 ) ;
if ( len > 0 & & sh_video ) {
osd_visible = sh_video - > fps ; // 1 sec
vo_osd_progbar_type = 0 ;
vo_osd_progbar_value = ( demuxer - > filepos - demuxer - > movi_start ) / len ;
vo_osd_changed ( OSDTYPE_PROGBAR ) ;
}
2001-08-28 16:22:37 +02:00
}
2001-07-16 19:07:13 +02:00
}
2001-07-30 04:00:54 +02:00
# endif
2002-02-08 17:00:14 +01:00
if ( sh_video ) {
c_total = 0 ;
max_pts_correction = 0.1 ;
osd_visible = sh_video - > fps ; // to rewert to PLAY pointer after 1 sec
audio_time_usage = 0 ; video_time_usage = 0 ; vout_time_usage = 0 ;
drop_frame_cnt = 0 ;
too_slow_frame_cnt = 0 ;
too_fast_frame_cnt = 0 ;
2001-12-25 21:32:02 +01:00
2002-04-04 16:24:11 +02:00
if ( vo_spudec ) spudec_reset ( vo_spudec ) ;
2002-02-08 17:00:14 +01:00
}
2001-02-24 21:28:24 +01:00
}
2002-12-23 01:33:22 +01:00
# ifdef USE_EDL
{
int x ;
if ( ! edl_decision ) {
for ( x = 0 ; x < num_edl_records ; x + + ) { // FIXME: do binary search
// Find first EDL entry where start follows current time
2003-01-17 00:03:06 +01:00
if ( edl_records [ x ] . start_sec > = sh_video - > pts & & edl_records [ x ] . action ! = EDL_MUTE ) {
2002-12-23 01:33:22 +01:00
next_edl_record = & edl_records [ x ] ;
break ;
}
}
} else {
edl_decision = 0 ;
}
}
# endif
2001-07-28 23:57:21 +02:00
rel_seek_secs = 0 ;
2001-08-22 21:02:28 +02:00
abs_seek_pos = 0 ;
2002-05-02 04:03:59 +02:00
frame_time_remaining = 0 ;
2001-08-08 21:37:45 +02:00
current_module = NULL ;
2003-01-04 22:05:55 +01:00
loop_seek = 0 ;
2001-08-08 21:37:45 +02:00
}
2001-08-28 01:56:44 +02:00
# ifdef HAVE_NEW_GUI
if ( use_gui ) {
2002-04-22 23:36:12 +02:00
guiEventHandling ( ) ;
2002-10-16 17:35:28 +02:00
if ( demuxer - > file_format = = DEMUXER_TYPE_AVI & & sh_video & & sh_video - > video . dwLength > 2 ) {
2001-08-28 23:35:04 +02:00
// get pos from frame number / total frames
2002-02-23 16:12:55 +01:00
guiIntfStruct . Position = ( float ) d_video - > pack_no * 100.0f / sh_video - > video . dwLength ;
2001-08-28 23:35:04 +02:00
} else {
2002-08-05 03:32:11 +02: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 23:35:04 +02:00
}
2003-01-17 00:03:06 +01:00
if ( sh_video ) guiIntfStruct . TimeSec = sh_video - > pts ;
2002-11-02 20:52:59 +01:00
else if ( sh_audio ) guiIntfStruct . TimeSec = sh_audio - > delay ;
2002-11-28 20:01:50 +01:00
guiIntfStruct . LengthInSec = demuxer_get_time_length ( demuxer ) ;
2002-07-02 15:35:04 +02:00
guiGetEvent ( guiReDraw , NULL ) ;
2002-08-04 21:23:58 +02:00
guiGetEvent ( guiSetVolume , NULL ) ;
2002-02-23 16:12:55 +01:00
if ( guiIntfStruct . Playing = = 0 ) break ; // STOP
if ( guiIntfStruct . Playing = = 2 ) osd_function = OSD_PAUSE ;
2002-12-11 02:21:12 +01:00
if ( guiIntfStruct . DiskChanged | | guiIntfStruct . NewPlay ) goto goto_next_file ;
2001-11-21 18:43:57 +01:00
# ifdef USE_DVDREAD
if ( stream - > type = = STREAMTYPE_DVD )
{
dvd_priv_t * dvdp = stream - > priv ;
2002-10-23 00:45:30 +02:00
guiIntfStruct . DVD . current_chapter = dvd_chapter_from_cell ( dvdp , guiIntfStruct . DVD . current_title - 1 , dvdp - > cur_cell ) + 1 ;
2001-11-21 18:43:57 +01:00
}
# endif
2001-08-28 01:56:44 +02:00
}
# endif
2001-03-27 02:39:24 +02:00
//================= Update OSD ====================
2001-07-30 04:00:54 +02:00
# ifdef USE_OSD
2003-08-13 19:03:36 +02:00
if ( osd_level > = 1 & & sh_video ) {
2003-01-17 00:03:06 +01:00
int pts = sh_video - > pts ;
2003-01-05 16:39:16 +01:00
char osd_text_tmp [ 64 ] ;
2001-04-23 21:20:44 +02:00
if ( pts = = osd_last_pts - 1 ) + + pts ; else osd_last_pts = pts ;
2001-04-12 02:40:42 +02:00
vo_osd_text = osd_text_buffer ;
2002-04-04 16:44:47 +02:00
# ifdef USE_DVDNAV
if ( osd_show_dvd_nav_delay ) {
2003-01-05 16:39:16 +01:00
snprintf ( osd_text_tmp , 63 , " DVDNAV: %s " , dvd_nav_text ) ;
2002-04-04 16:44:47 +02:00
osd_show_dvd_nav_delay - - ;
} else
2002-12-28 23:57:39 +01:00
# endif
# ifdef USE_TV
if ( osd_show_tv_channel & & tv_channel_list ) {
2003-01-05 16:39:16 +01:00
snprintf ( osd_text_tmp , 63 , " Channel: %s " , tv_channel_current - > name ) ;
2002-12-28 23:57:39 +01:00
osd_show_tv_channel - - ;
} else
2002-04-04 16:44:47 +02:00
# endif
2003-05-17 11:21:21 +02:00
if ( osd_show_text ) {
snprintf ( osd_text_tmp , 63 , " %s " , osd_show_text_buffer ) ;
osd_show_text - - ;
} else
2002-10-06 19:40:51 +02:00
if ( osd_show_sub_visibility ) {
2003-01-05 16:39:16 +01:00
snprintf ( osd_text_tmp , 63 , " Subtitles: %sabled " , sub_visibility ? " en " : " dis " ) ;
2002-10-06 19:40:51 +02:00
osd_show_sub_visibility - - ;
} else
2002-10-17 17:44:41 +02:00
if ( osd_show_vobsub_changed ) {
const char * language = " none " ;
2002-10-19 03:58:34 +02:00
if ( vo_vobsub & & vobsub_id > = 0 )
2002-10-17 17:44:41 +02:00
language = vobsub_get_id ( vo_vobsub , ( unsigned int ) vobsub_id ) ;
2003-01-05 16:39:16 +01:00
snprintf ( osd_text_tmp , 63 , " Subtitles: (%d) %s " , vobsub_id , language ? language : " unknown " ) ;
2002-10-17 17:44:41 +02:00
osd_show_vobsub_changed - - ;
} else
2003-04-07 18:04:02 +02:00
# ifdef USE_SUB
if ( osd_show_sub_changed ) {
char * tmp2 ;
2003-04-07 22:55:32 +02:00
tmp = subdata - > filename ;
2003-05-30 19:57:41 +02:00
if ( ( tmp2 = strrchr ( tmp , ' / ' ) ) ) {
2003-04-07 18:04:02 +02:00
tmp = tmp2 + 1 ;
}
snprintf ( osd_text_tmp , 63 , " Sub: (%d) %s%s " ,
set_of_sub_pos + 1 ,
strlen ( tmp ) < 20 ? " " : " ... " ,
strlen ( tmp ) < 20 ? tmp : tmp + strlen ( tmp ) - 19 ) ;
osd_show_sub_changed - - ;
} else
# endif
2001-12-01 00:44:04 +01:00
if ( osd_show_sub_delay ) {
2003-01-05 16:39:16 +01:00
snprintf ( osd_text_tmp , 63 , " Sub delay: %d ms " , ROUND ( sub_delay * 1000 ) ) ;
2001-12-01 00:44:04 +01:00
osd_show_sub_delay - - ;
2001-12-27 01:59:40 +01:00
} else
2002-12-05 01:18:56 +01:00
if ( osd_show_sub_pos ) {
2003-01-05 16:39:16 +01:00
snprintf ( osd_text_tmp , 63 , " Sub position: %d/100 " , sub_pos ) ;
2002-12-05 01:18:56 +01:00
osd_show_sub_pos - - ;
} else
2002-12-23 02:37:43 +01:00
if ( osd_show_sub_alignment ) {
2003-01-05 16:39:16 +01:00
snprintf ( osd_text_tmp , 63 , " Sub alignment: %s " ,
2002-12-23 02:37:43 +01:00
( sub_alignment = = 2 ? " bottom " :
( sub_alignment = = 1 ? " center " : " top " ) ) ) ;
osd_show_sub_alignment - - ;
} else
2001-12-27 01:59:40 +01:00
if ( osd_show_av_delay ) {
2003-01-05 16:39:16 +01:00
snprintf ( osd_text_tmp , 63 , " A-V delay: %d ms " , ROUND ( audio_delay * 1000 ) ) ;
2001-12-27 01:59:40 +01:00
osd_show_av_delay - - ;
2002-12-28 15:17:38 +01:00
} else if ( osd_level > = 2 ) {
int len = demuxer_get_time_length ( demuxer ) ;
int percentage = - 1 ;
2003-01-05 16:39:16 +01:00
char percentage_text [ 10 ] ;
2002-12-28 15:17:38 +01:00
if ( osd_show_percentage ) {
percentage = demuxer_get_percent_pos ( demuxer ) ;
osd_show_percentage - - ;
}
if ( percentage > = 0 )
2003-01-05 16:39:16 +01:00
snprintf ( percentage_text , 9 , " (%d%%) " , percentage ) ;
2002-12-28 16:33:14 +01:00
else
percentage_text [ 0 ] = 0 ;
2002-12-28 15:17:38 +01:00
if ( osd_level = = 3 )
2003-01-05 16:39:16 +01:00
snprintf ( osd_text_tmp , 63 , " %c %02d:%02d:%02d / %02d:%02d:%02d%s " , osd_function , pts / 3600 , ( pts / 60 ) % 60 , pts % 60 , len / 3600 , ( len / 60 ) % 60 , len % 60 , percentage_text ) ;
2002-12-28 15:17:38 +01:00
else
2003-01-05 16:39:16 +01:00
snprintf ( osd_text_tmp , 63 , " %c %02d:%02d:%02d%s " , osd_function , pts / 3600 , ( pts / 60 ) % 60 , pts % 60 , percentage_text ) ;
2002-12-28 15:17:38 +01:00
} else osd_text_tmp [ 0 ] = 0 ;
2002-02-22 16:25:11 +01:00
if ( strcmp ( vo_osd_text , osd_text_tmp ) ) {
2003-01-05 16:39:16 +01:00
strncpy ( vo_osd_text , osd_text_tmp , 63 ) ;
2002-04-15 21:17:12 +02:00
vo_osd_changed ( OSDTYPE_OSD ) ;
2002-02-22 16:25:11 +01:00
}
2001-04-12 02:40:42 +02:00
} else {
2002-02-22 16:25:11 +01:00
if ( vo_osd_text ) {
2001-04-12 02:40:42 +02:00
vo_osd_text = NULL ;
2002-04-15 21:17:12 +02:00
vo_osd_changed ( OSDTYPE_OSD ) ;
2002-02-22 16:25:11 +01:00
}
2001-04-12 02:40:42 +02:00
}
2001-03-27 02:39:24 +02:00
// for(i=1;i<=11;i++) osd_text_buffer[10+i]=i;osd_text_buffer[10+i]=0;
2001-04-12 02:40:42 +02:00
// vo_osd_text=osd_text_buffer;
2001-07-30 04:00:54 +02:00
# endif
2001-04-16 01:22:01 +02:00
2001-07-30 04:00:54 +02:00
# ifdef USE_SUB
2001-03-30 05:07:45 +02:00
// find sub
2003-04-07 18:04:02 +02:00
if ( subdata & & sh_video - > pts > 0 ) {
2003-01-17 00:03:06 +01:00
float pts = sh_video - > pts ;
2001-04-14 05:12:06 +02:00
if ( sub_fps = = 0 ) sub_fps = sh_video - > fps ;
2001-04-17 02:08:56 +02:00
current_module = " find_sub " ;
2001-12-03 02:03:17 +01:00
if ( pts > sub_last_pts | | pts < sub_last_pts - 1.0 ) {
2003-04-07 18:04:02 +02:00
find_sub ( subdata , ( pts + sub_delay ) *
( subdata - > sub_uses_time ? 100. : sub_fps ) ) ;
// FIXME! frame counter...
2001-12-03 02:03:17 +01:00
sub_last_pts = pts ;
}
2001-04-17 02:08:56 +02:00
current_module = NULL ;
2001-03-30 05:07:45 +02:00
}
2001-07-30 04:00:54 +02:00
# endif
2003-03-26 18:02:28 +01:00
2003-04-04 22:02:53 +02:00
# ifdef HAVE_X11
2003-03-26 18:02:28 +01:00
if ( stop_xscreensaver & & sh_video ) {
current_module = " stop_xscreensaver " ;
xscreensaver_heartbeat ( sh_video - > pts ) ;
current_module = NULL ;
}
2003-04-04 22:02:53 +02:00
# endif
2001-04-21 01:00:11 +02:00
// DVD sub:
2002-05-18 01:47:27 +02:00
if ( vo_config_count & & vo_spudec ) {
unsigned char * packet = NULL ;
2003-06-02 20:19:21 +02:00
int len , timestamp ;
2003-05-30 20:30:24 +02:00
current_module = " spudec " ;
spudec_heartbeat ( vo_spudec , 90000 * sh_video - > timer ) ;
2002-05-18 01:47:27 +02:00
// Get a sub packet from the dvd or a vobsub and make a timestamp relative to sh_video->timer
2003-06-02 20:19:21 +02:00
while ( 1 ) {
2002-05-18 01:47:27 +02:00
// Vobsub
len = 0 ;
if ( vo_vobsub ) {
2003-01-17 00:03:06 +01:00
if ( sh_video - > pts + sub_delay > = 0 ) {
2002-05-18 01:47:27 +02:00
// The + next_frame_time is there because we'll display the sub at the next frame
2003-01-17 00:03:06 +01:00
len = vobsub_get_packet ( vo_vobsub , sh_video - > pts + sub_delay + next_frame_time , ( void * * ) & packet , & timestamp ) ;
2002-05-18 01:47:27 +02:00
if ( len > 0 ) {
2003-01-17 00:03:06 +01:00
timestamp - = ( sh_video - > pts + sub_delay - sh_video - > timer ) * 90000 ;
2003-08-29 23:42:51 +02:00
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 , sh_video - > pts , sh_video - > timer , timestamp / 90000.0 , timestamp ) ;
2002-05-18 01:47:27 +02:00
}
}
} else {
// DVD sub
len = ds_get_packet_sub ( d_dvdsub , ( unsigned char * * ) & packet ) ;
if ( len > 0 ) {
2003-08-25 11:08:06 +02:00
float x = d_dvdsub - > pts - sh_video - > pts ;
if ( x < - 10 | | x > 10 ) // prevent missing subs on pts reset
2003-08-10 19:58:22 +02:00
timestamp = 90000 * ( sh_video - > timer + d_dvdsub - > pts + sub_delay - sh_video - > pts ) ;
else timestamp = 90000 * ( sh_video - > timer + sub_delay ) ;
2003-01-17 00:03:06 +01:00
mp_dbg ( MSGT_CPLAYER , MSGL_V , " \r DVD sub: len=%d v_pts=%5.3f s_pts=%5.3f ts=%d \n " , len , sh_video - > pts , d_dvdsub - > pts , timestamp ) ;
2002-05-18 01:47:27 +02:00
}
2001-04-21 01:00:11 +02:00
}
2003-06-02 20:19:21 +02:00
if ( len < = 0 | | ! packet ) break ;
2002-05-27 18:40:10 +02:00
if ( timestamp < 0 ) timestamp = 0 ;
2002-05-18 01:47:27 +02:00
spudec_assemble ( vo_spudec , packet , len , timestamp ) ;
2001-04-21 01:00:11 +02:00
}
2002-05-25 19:40:40 +02:00
/* detect wether the sub has changed or not */
if ( spudec_changed ( vo_spudec ) )
vo_osd_changed ( OSDTYPE_SPU ) ;
2002-05-18 01:47:27 +02:00
current_module = NULL ;
}
2001-02-24 21:28:24 +01:00
} // while(!eof)
2001-08-17 02:40:25 +02:00
mp_msg ( MSGT_GLOBAL , MSGL_V , " EOF code: %d \n " , eof ) ;
2001-07-29 23:07:34 +02:00
2001-03-15 20:38:34 +01:00
}
2001-08-22 23:35:44 +02:00
2001-12-19 17:55:32 +01:00
goto_next_file : // don't jump here after ao/vo/getch initialization!
2001-08-23 01:48:18 +02:00
2002-05-20 05:25:26 +02:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " \n " ) ;
2002-01-17 21:25:55 +01:00
if ( benchmark ) {
double tot = video_time_usage + vout_time_usage + audio_time_usage ;
double total_time_usage ;
total_time_usage_start = GetTimer ( ) - total_time_usage_start ;
total_time_usage = ( float ) total_time_usage_start * 0.000001 ;
2002-03-17 01:47:15 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " \n BENCHMARKs: VC:%8.3fs VO:%8.3fs A:%8.3fs Sys:%8.3fs = %8.3fs \n " ,
2002-01-17 21:25:55 +01:00
video_time_usage , vout_time_usage , audio_time_usage ,
total_time_usage - tot , total_time_usage ) ;
if ( total_time_usage > 0.0 )
2002-03-17 01:47:15 +01:00
mp_msg ( MSGT_CPLAYER , MSGL_INFO , " BENCHMARK%%: VC:%8.4f%% VO:%8.4f%% A:%8.4f%% Sys:%8.4f%% = %8.4f%% \n " ,
2002-01-17 21:25:55 +01:00
100.0 * video_time_usage / total_time_usage ,
100.0 * vout_time_usage / total_time_usage ,
100.0 * audio_time_usage / total_time_usage ,
100.0 * ( total_time_usage - tot ) / total_time_usage ,
100.0 ) ;
2002-05-05 19:22:38 +02:00
if ( total_frame_cnt & & frame_dropping )
2002-04-14 21:43:23 +02: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 21:25:55 +01:00
}
2002-05-05 19:22:38 +02:00
// time to uninit all, except global stuff:
2002-10-09 03:13:40 +02:00
uninit_player ( INITED_ALL - ( INITED_GUI + INITED_INPUT + ( fixed_vo ? INITED_VO : 0 ) ) ) ;
2002-03-17 03:28:32 +01:00
2003-01-20 23:49:50 +01:00
# ifdef USE_SUB
2003-04-07 18:04:02 +02:00
if ( set_of_sub_size > 0 )
2003-01-20 23:49:50 +01:00
{
current_module = " sub_free " ;
2003-04-07 18:04:02 +02:00
for ( i = 0 ; i < set_of_sub_size ; + + i )
sub_free ( set_of_subtitles [ i ] ) ;
set_of_sub_size = 0 ;
2003-01-20 23:49:50 +01:00
vo_sub = NULL ;
2003-04-07 18:04:02 +02:00
subdata = NULL ;
2003-01-20 23:49:50 +01:00
}
# endif
2002-01-15 00:38:49 +01:00
if ( eof = = PT_NEXT_ENTRY | | eof = = PT_PREV_ENTRY ) {
2002-01-17 21:25:55 +01:00
eof = eof = = PT_NEXT_ENTRY ? 1 : - 1 ;
2002-11-15 00:49:05 +01:00
if ( play_tree_iter_step ( playtree_iter , play_tree_step , 0 ) = = PLAY_TREE_ITER_ENTRY ) {
2002-01-08 03:01:04 +01:00
eof = 1 ;
} else {
play_tree_iter_free ( playtree_iter ) ;
playtree_iter = NULL ;
}
2002-11-15 00:49:05 +01:00
play_tree_step = 1 ;
2002-01-15 00:38:49 +01:00
} else if ( eof = = PT_UP_NEXT | | eof = = PT_UP_PREV ) {
eof = eof = = PT_UP_NEXT ? 1 : - 1 ;
2003-02-09 14:17:12 +01:00
if ( playtree_iter ) {
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 03:28:32 +01:00
} else { // NEXT PREV SRC
2002-01-15 00:38:49 +01:00
eof = eof = = PT_PREV_SRC ? - 1 : 1 ;
2002-01-08 03:01:04 +01:00
}
2001-08-22 23:35:44 +02:00
2002-01-08 03:01:04 +01:00
if ( eof = = 0 ) eof = 1 ;
2001-08-23 01:48:18 +02:00
2002-01-08 03:01:04 +01:00
while ( playtree_iter ! = NULL ) {
filename = play_tree_iter_get_file ( playtree_iter , eof ) ;
if ( filename = = NULL ) {
if ( play_tree_iter_step ( playtree_iter , eof , 0 ) ! = PLAY_TREE_ITER_ENTRY ) {
play_tree_iter_free ( playtree_iter ) ;
playtree_iter = NULL ;
} ;
} else
break ;
}
2002-04-30 00:00:50 +02:00
# ifdef HAVE_NEW_GUI
if ( use_gui & & ! playtree_iter )
{
# ifdef USE_DVDREAD
2002-06-03 17:06:32 +02:00
if ( ! guiIntfStruct . DiskChanged )
2002-04-30 00:00:50 +02:00
# endif
2002-07-12 02:53:26 +02:00
mplEnd ( ) ;
2002-04-30 00:00:50 +02:00
}
# endif
2003-08-11 02:02:46 +02:00
if ( use_gui | | playtree_iter ! = NULL ) {
2001-08-23 01:48:18 +02:00
2002-01-08 03:01:04 +01:00
eof = 0 ;
2001-08-23 01:48:18 +02:00
goto play_next_file ;
2001-08-22 23:35:44 +02:00
}
2003-05-31 19:30:47 +02:00
# ifdef HAVE_FREETYPE
2002-10-06 18:16:53 +02:00
current_module = " uninit_font " ;
if ( vo_font ) free_font_desc ( vo_font ) ;
vo_font = NULL ;
2002-08-28 22:52:02 +02:00
done_freetype ( ) ;
# endif
2002-12-29 22:06:20 +01:00
exit_player_with_rc ( MSGTR_Exit_eof , 0 ) ;
2001-08-22 23:35:44 +02:00
2001-03-15 20:38:34 +01:00
return 1 ;
}