Mercurial > mplayer.hg
annotate mplayer.c @ 3063:004e3199fee0
mplayer integration
author | arpi |
---|---|
date | Thu, 22 Nov 2001 03:16:31 +0000 |
parents | 9507f90d8254 |
children | 81ea8a5488cc |
rev | line source |
---|---|
1237 | 1 // AVI & MPEG Player v0.18 (C) 2000-2001. by A'rpi/ESP-team |
1 | 2 |
1430 | 3 #include <stdio.h> |
4 #include <stdlib.h> | |
5 #include <string.h> | |
6 #include <unistd.h> | |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1422
diff
changeset
|
7 |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1422
diff
changeset
|
8 #include <sys/ioctl.h> |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1422
diff
changeset
|
9 #include <sys/mman.h> |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1422
diff
changeset
|
10 #include <sys/types.h> |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1422
diff
changeset
|
11 #include <sys/wait.h> |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1422
diff
changeset
|
12 #include <sys/time.h> |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1422
diff
changeset
|
13 #include <sys/stat.h> |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1422
diff
changeset
|
14 |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1422
diff
changeset
|
15 #include <signal.h> |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1422
diff
changeset
|
16 #include <time.h> |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1422
diff
changeset
|
17 #include <fcntl.h> |
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1422
diff
changeset
|
18 |
1430 | 19 #include "version.h" |
20 #include "config.h" | |
1584 | 21 |
1564 | 22 #include "mp_msg.h" |
1 | 23 |
1584 | 24 #define HELP_MP_DEFINE_STATIC |
25 #include "help_mp.h" | |
26 | |
147 | 27 #include "cfgparser.h" |
151 | 28 #include "cfg-mplayer-def.h" |
147 | 29 |
1422 | 30 #ifdef USE_SUB |
258 | 31 #include "subreader.h" |
2557 | 32 void find_sub(subtitle* subtitles,int key); |
1422 | 33 #endif |
258 | 34 |
1422 | 35 #ifdef USE_LIBVO2 |
36 #include "libvo2/libvo2.h" | |
37 #else | |
36 | 38 #include "libvo/video_out.h" |
2550 | 39 extern void* mDisplay; // Display* mDisplay; |
1422 | 40 #endif |
41 | |
2897 | 42 #ifdef USE_LIBVO2 |
43 #include "libvo2/sub.h" | |
44 #else | |
220 | 45 #include "libvo/sub.h" |
2897 | 46 #endif |
36 | 47 |
955 | 48 #include "libao2/audio_out.h" |
49 | |
1 | 50 #include "libmpeg2/mpeg2.h" |
51 #include "libmpeg2/mpeg2_internal.h" | |
52 | |
303 | 53 #include "codec-cfg.h" |
175 | 54 |
492 | 55 #include "dvdauth.h" |
560
28ae99036574
Separated dvdsub code to be able to work with it easier
lgb
parents:
557
diff
changeset
|
56 #include "spudec.h" |
492 | 57 |
1 | 58 #include "linux/getch2.h" |
59 #include "linux/keycodes.h" | |
60 #include "linux/timer.h" | |
61 #include "linux/shmem.h" | |
62 | |
2272 | 63 #include "cpudetect.h" |
64 | |
1 | 65 #ifdef HAVE_LIRC |
66 #include "lirc_mp.h" | |
67 #endif | |
68 | |
2036 | 69 #ifdef HAVE_NEW_GUI |
70 #include "Gui/mplayer/play.h" | |
71 #endif | |
72 | |
362 | 73 int verbose=0; |
1448 | 74 int quiet=0; |
1 | 75 |
398 | 76 #define ABS(x) (((x)>=0)?(x):(-(x))) |
77 | |
3015 | 78 #ifdef HAVE_RTC |
2889
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
79 #include <linux/rtc.h> |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
80 #endif |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
81 |
2941
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
82 #ifdef USE_TV |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
83 #include "libmpdemux/tv.h" |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
84 |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
85 extern int tv_param_on; |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
86 extern tvi_handle_t *tv_handler; |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
87 #endif |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
88 |
258 | 89 //**************************************************************************// |
90 // Config file | |
91 //**************************************************************************// | |
92 | |
2557 | 93 static int cfg_inc_verbose(struct config *conf){ ++verbose; return 0;} |
153 | 94 |
162 | 95 static int cfg_include(struct config *conf, char *filename){ |
458
49b0474b2e26
I really hope that you will learn how to use cvs, sooner or later...
arpi_esp
parents:
452
diff
changeset
|
96 return parse_config_file(conf, filename); |
162 | 97 } |
98 | |
2557 | 99 #include "get_path.c" |
178 | 100 |
1 | 101 //**************************************************************************// |
442 | 102 //**************************************************************************// |
103 // Input media streaming & demultiplexer: | |
104 //**************************************************************************// | |
105 | |
1289 | 106 static int max_framesize=0; |
107 | |
578 | 108 #include "stream.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
578
diff
changeset
|
109 #include "demuxer.h" |
442 | 110 #include "stheader.h" |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
111 #include "parse_es.h" |
1 | 112 |
2563 | 113 #include "dec_audio.h" |
114 #include "dec_video.h" | |
115 | |
2567 | 116 #if 0 |
1015 | 117 extern picture_t *picture; // exported from libmpeg2/decode.c |
442 | 118 |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
119 int frameratecode2framerate[16] = { |
780 | 120 0, |
121 // Official mpeg1/2 framerates: | |
122 24000*10000/1001, 24*10000,25*10000, 30000*10000/1001, 30*10000,50*10000,60000*10000/1001, 60*10000, | |
123 // libmpeg3's "Unofficial economy rates": | |
124 1*10000,5*10000,10*10000,12*10000,15*10000,0,0 | |
112 | 125 }; |
2567 | 126 #endif |
112 | 127 |
111 | 128 //**************************************************************************// |
1 | 129 //**************************************************************************// |
130 | |
112 | 131 // Common FIFO functions, and keyboard/event FIFO code |
132 #include "fifo.c" | |
133 | |
1 | 134 //**************************************************************************// |
135 | |
1422 | 136 #ifdef USE_LIBVO2 |
137 static vo2_handle_t *video_out=NULL; | |
138 #else | |
1 | 139 static vo_functions_t *video_out=NULL; |
1422 | 140 #endif |
1289 | 141 static ao_functions_t *audio_out=NULL; |
1 | 142 |
2557 | 143 // benchmark: |
1291 | 144 double video_time_usage=0; |
145 double vout_time_usage=0; | |
1289 | 146 static double audio_time_usage=0; |
147 static int total_time_usage_start=0; | |
148 static int benchmark=0; | |
1124
0e95f30ffd4c
-frames and -benchmark options to make chl & gabucino happy
arpi_esp
parents:
1059
diff
changeset
|
149 |
2557 | 150 // static int play_in_bg=0; |
606 | 151 |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
152 // options: |
1496 | 153 static int auto_quality=0; |
154 static int output_quality=0; | |
1439 | 155 |
1709 | 156 int use_gui=0; |
157 | |
1439 | 158 int osd_level=2; |
2557 | 159 |
160 // seek: | |
937 | 161 char *seek_to_sec=NULL; |
1428
a90d889eb649
largefile patch by Stephen Davies <steve@daviesfam.org>
arpi
parents:
1422
diff
changeset
|
162 off_t seek_to_byte=0; |
2436 | 163 off_t step_sec=0; |
2557 | 164 int loop_times=-1; |
165 float rel_seek_secs=0; | |
166 int abs_seek_pos=0; | |
167 | |
168 // codecs: | |
442 | 169 int has_audio=1; |
1286
543a94b241a2
Replaced LGBs video codec forcing change with mine for audio and video codecs, which is IMHO more convenient cause codecs are selected by name instead of number, one unclearity is left to me, that's why audio_format is used once before codecs selection for MPEG_PS files, that's why I left -afm in for that one.
atmos4
parents:
1285
diff
changeset
|
170 char *audio_codec=NULL; // override audio codec |
543a94b241a2
Replaced LGBs video codec forcing change with mine for audio and video codecs, which is IMHO more convenient cause codecs are selected by name instead of number, one unclearity is left to me, that's why audio_format is used once before codecs selection for MPEG_PS files, that's why I left -afm in for that one.
atmos4
parents:
1285
diff
changeset
|
171 char *video_codec=NULL; // override video codec |
1299
fa50e6bc6091
As promised, -afm and -vfm to prefer audio/video driver family, -ac and -vc have higher precedence, so they can override -afm/-vfm.
atmos4
parents:
1296
diff
changeset
|
172 int audio_family=-1; // override audio codec family |
fa50e6bc6091
As promised, -afm and -vfm to prefer audio/video driver family, -ac and -vc have higher precedence, so they can override -afm/-vfm.
atmos4
parents:
1296
diff
changeset
|
173 int video_family=-1; // override video codec family |
1285
202d9e2dc202
-vcodec option (maybe some other name would be better though) to select between driver types without editing codecs.conf. mplayer will default to normal codec search loop if it does not find codec for the specified driver type. config range checking for the parameter (an integer) should be cleaned, IMHO
lgb
parents:
1255
diff
changeset
|
174 |
1299
fa50e6bc6091
As promised, -afm and -vfm to prefer audio/video driver family, -ac and -vc have higher precedence, so they can override -afm/-vfm.
atmos4
parents:
1296
diff
changeset
|
175 // IMHO this stuff is no longer of use, or is there a special |
fa50e6bc6091
As promised, -afm and -vfm to prefer audio/video driver family, -ac and -vc have higher precedence, so they can override -afm/-vfm.
atmos4
parents:
1296
diff
changeset
|
176 // reason why dshow should be completely disabled? - atmos :: |
1327
b12e1817bcc2
some cleanup - fixed warnings, removed old stuff, moved audio resync to dec_audio
arpi
parents:
1302
diff
changeset
|
177 // yes, people without working c++ compiler can disable it - A'rpi |
626 | 178 #ifdef USE_DIRECTSHOW |
179 int allow_dshow=1; | |
180 #else | |
181 int allow_dshow=0; | |
182 #endif | |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
183 |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
184 // streaming: |
1496 | 185 static int audio_id=-1; |
186 static int video_id=-1; | |
187 static int dvdsub_id=-1; | |
188 static int vcd_track=0; | |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
189 |
2353 | 190 // cache2: |
2557 | 191 static int stream_cache_size=0; |
2353 | 192 #ifdef USE_STREAM_CACHE |
193 extern int cache_fill_status; | |
194 #else | |
195 #define cache_fill_status 0 | |
196 #endif | |
197 | |
2557 | 198 // dump: |
199 static char *stream_dump_name=NULL; | |
200 static int stream_dump_type=0; | |
201 | |
202 // A-V sync: | |
1498 | 203 static float default_max_pts_correction=-1;//0.01f; |
204 static float max_pts_correction=0;//default_max_pts_correction; | |
2557 | 205 static float c_total=0; |
206 static float audio_delay=0; | |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
207 |
2889
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
208 static int dapsync=0; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
209 static int softsleep=0; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
210 |
2557 | 211 static float force_fps=0; |
212 static int force_srate=0; | |
213 static int frame_dropping=0; // option 0=no drop 1= drop vo 2= drop decode | |
214 static int play_n_frames=-1; | |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
215 |
1 | 216 // screen info: |
217 char* video_driver=NULL; //"mga"; // default | |
956
a6cecd9a1bad
'-ao' switch (including '-ao help'), fixing Arpi's bug (short name 'null' for both of oss and null driver ;)
lgb
parents:
955
diff
changeset
|
218 char* audio_driver=NULL; |
1496 | 219 static int fullscreen=0; |
220 static int vidmode=0; | |
221 static int softzoom=0; | |
222 static int flip=-1; | |
223 static int screen_size_x=0;//SCREEN_SIZE_X; | |
224 static int screen_size_y=0;//SCREEN_SIZE_Y; | |
225 static int screen_size_xy=0; | |
2034
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
226 static float movie_aspect=0.0; |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
227 |
2647
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
228 char* playlist_file; |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
229 |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
230 // sub: |
212 | 231 char *font_name=NULL; |
215 | 232 float font_factor=0.75; |
258 | 233 char *sub_name=NULL; |
234 float sub_delay=0; | |
235 float sub_fps=0; | |
510 | 236 int sub_auto = 1; |
1255
94f2853ec6f4
-dsp option removed, displaying help text (-ao oss:dsp_path)
alex
parents:
1250
diff
changeset
|
237 /*DSP!!char *dsp=NULL;*/ |
723 | 238 |
1183 | 239 extern char *vo_subdevice; |
240 extern char *ao_subdevice; | |
1156 | 241 |
2321 | 242 static stream_t* stream=NULL; |
243 | |
1856 | 244 static char* current_module=NULL; // for debugging |
245 | |
246 static unsigned int inited_flags=0; | |
247 #define INITED_VO 1 | |
248 #define INITED_AO 2 | |
249 #define INITED_GUI 4 | |
250 #define INITED_GETCH2 8 | |
251 #define INITED_LIRC 16 | |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
252 #define INITED_SPUDEC 32 |
2321 | 253 #define INITED_STREAM 64 |
1856 | 254 #define INITED_ALL 0xFFFF |
255 | |
256 void uninit_player(unsigned int mask){ | |
257 mask=inited_flags&mask; | |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
258 if (mask&INITED_SPUDEC){ |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
259 inited_flags&=~INITED_SPUDEC; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
260 current_module="uninit_spudec"; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
261 spudec_free(vo_spudec); |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
262 } |
1856 | 263 if(mask&INITED_VO){ |
264 inited_flags&=~INITED_VO; | |
265 current_module="uninit_vo"; | |
266 #ifdef USE_LIBVO2 | |
267 vo2_close(video_out); | |
268 #else | |
269 video_out->uninit(); | |
270 #endif | |
271 } | |
272 | |
273 if(mask&INITED_AO){ | |
274 inited_flags&=~INITED_AO; | |
275 current_module="uninit_ao"; | |
276 audio_out->uninit(); | |
277 } | |
278 | |
279 if(mask&INITED_GETCH2){ | |
280 inited_flags&=~INITED_GETCH2; | |
281 current_module="uninit_getch2"; | |
282 // restore terminal: | |
283 getch2_disable(); | |
284 } | |
285 | |
286 #ifdef HAVE_NEW_GUI | |
287 if(mask&INITED_GUI){ | |
288 inited_flags&=~INITED_GUI; | |
289 current_module="uninit_gui"; | |
290 mplDone(); | |
291 } | |
292 #endif | |
293 | |
2321 | 294 if(mask&INITED_STREAM){ |
295 inited_flags&=~INITED_STREAM; | |
296 current_module="uninit_stream"; | |
297 if(stream) free_stream(stream); | |
298 stream=NULL; | |
299 } | |
300 | |
1856 | 301 #ifdef HAVE_LIRC |
302 if(mask&INITED_LIRC){ | |
303 inited_flags&=~INITED_LIRC; | |
304 current_module="uninit_lirc"; | |
305 lirc_mp_cleanup(); | |
306 } | |
307 #endif | |
308 | |
1863 | 309 current_module=NULL; |
310 | |
1856 | 311 } |
312 | |
1156 | 313 void exit_player(char* how){ |
314 total_time_usage_start=GetTimer()-total_time_usage_start; | |
315 | |
1856 | 316 uninit_player(INITED_ALL); |
1723
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1709
diff
changeset
|
317 |
1856 | 318 current_module="exit_player"; |
1156 | 319 |
1583 | 320 if(how) mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_Exiting,how); |
1567 | 321 mp_msg(MSGT_CPLAYER,MSGL_V,"max framesize was %d bytes\n",max_framesize); |
1156 | 322 if(benchmark){ |
323 double tot=video_time_usage+vout_time_usage+audio_time_usage; | |
324 double total_time_usage=(float)total_time_usage_start*0.000001; | |
1567 | 325 mp_msg(MSGT_CPLAYER,MSGL_INFO,"BENCHMARKs: V:%8.3fs VO:%8.3fs A:%8.3fs Sys:%8.3fs = %8.3fs\n", |
1156 | 326 video_time_usage,vout_time_usage,audio_time_usage, |
327 total_time_usage-tot,total_time_usage); | |
328 if(total_time_usage>0.0) | |
1567 | 329 mp_msg(MSGT_CPLAYER,MSGL_INFO,"BENCHMARK%%: V:%8.4f%% VO:%8.4f%% A:%8.4f%% Sys:%8.4f%% = %8.4f%%\n", |
1156 | 330 100.0*video_time_usage/total_time_usage, |
331 100.0*vout_time_usage/total_time_usage, | |
332 100.0*audio_time_usage/total_time_usage, | |
333 100.0*(total_time_usage-tot)/total_time_usage, | |
334 100.0); | |
335 } | |
1639 | 336 |
1156 | 337 exit(1); |
338 } | |
339 | |
340 void exit_sighandler(int x){ | |
341 static int sig_count=0; | |
342 ++sig_count; | |
343 if(sig_count==2) exit(1); | |
344 if(sig_count>2){ | |
345 // can't stop :( | |
346 kill(getpid(),SIGKILL); | |
347 } | |
1583 | 348 mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_IntBySignal,x, |
1156 | 349 current_module?current_module:"unknown" |
350 ); | |
351 exit_player(NULL); | |
352 } | |
353 | |
2557 | 354 //extern void write_avi_header_1(FILE *f,int fcc,float fps,int width,int height); |
1439 | 355 |
459 | 356 #include "mixer.h" |
147 | 357 #include "cfg-mplayer.h" |
1 | 358 |
723 | 359 void parse_cfgfiles( void ) |
360 { | |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
361 char *conffile; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
362 int conffile_fd; |
147 | 363 if (parse_config_file(conf, "/etc/mplayer.conf") < 0) |
364 exit(1); | |
178 | 365 if ((conffile = get_path("")) == NULL) { |
1583 | 366 mp_msg(MSGT_CPLAYER,MSGL_WARN,MSGTR_NoHomeDir); |
147 | 367 } else { |
178 | 368 mkdir(conffile, 0777); |
369 free(conffile); | |
370 if ((conffile = get_path("config")) == NULL) { | |
1583 | 371 mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_GetpathProblem); |
178 | 372 } else { |
373 if ((conffile_fd = open(conffile, O_CREAT | O_EXCL | O_WRONLY, 0666)) != -1) { | |
1582 | 374 mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_CreatingCfgFile, conffile); |
178 | 375 write(conffile_fd, default_config, strlen(default_config)); |
376 close(conffile_fd); | |
377 } | |
378 if (parse_config_file(conf, conffile) < 0) | |
379 exit(1); | |
380 free(conffile); | |
151 | 381 } |
1 | 382 } |
383 } | |
384 | |
1983 | 385 int main(int argc,char* argv[], char *envp[]){ |
723 | 386 |
1422 | 387 #ifdef USE_SUB |
1289 | 388 static subtitle* subtitles=NULL; |
1422 | 389 #endif |
1289 | 390 |
391 static demuxer_t *demuxer=NULL; | |
392 | |
393 static demux_stream_t *d_audio=NULL; | |
394 static demux_stream_t *d_video=NULL; | |
395 static demux_stream_t *d_dvdsub=NULL; | |
396 | |
397 static sh_audio_t *sh_audio=NULL; | |
398 static sh_video_t *sh_video=NULL; | |
399 | |
1629 | 400 // for multifile support: |
401 char **filenames=NULL; | |
402 int num_filenames=0; | |
403 int curr_filename=0; | |
404 | |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
405 char* filename=NULL; //"MI2-Trailer.avi"; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
406 int file_format=DEMUXER_TYPE_UNKNOWN; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
407 // |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
408 int delay_corrected=1; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
409 char* title="MPlayer"; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
410 |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
411 // movie info: |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
412 int out_fmt=0; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
413 |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
414 int osd_visible=100; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
415 int osd_function=OSD_PLAY; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
416 int osd_last_pts=-303; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
417 |
1429 | 418 int v_bright=50; |
419 int v_cont=50; | |
420 int v_hue=50; | |
421 int v_saturation=50; | |
422 | |
2705 | 423 int vo_flags=0; |
424 | |
2889
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
425 int rtc_fd=-1; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
426 |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
427 //float a_frame=0; // Audio |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
428 |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
429 int i; |
1467 | 430 int use_stdin=0; //int f; // filedes |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
431 |
1787
de6a0987a08d
stop fixed, fileselector supp. maybe not work, couldn't test
arpi
parents:
1772
diff
changeset
|
432 int gui_no_filename=0; |
de6a0987a08d
stop fixed, fileselector supp. maybe not work, couldn't test
arpi
parents:
1772
diff
changeset
|
433 |
1567 | 434 mp_msg_init(MSGL_STATUS); |
435 | |
436 mp_msg(MSGT_CPLAYER,MSGL_INFO,"%s",banner_text); | |
723 | 437 |
2272 | 438 /* Test for cpu capabilities (and corresponding OS support) for optimizing */ |
439 #ifdef ARCH_X86 | |
440 GetCpuCaps(&gCpuCaps); | |
441 mp_msg(MSGT_CPLAYER,MSGL_INFO,"CPUflags: Type: %d MMX: %d MMX2: %d 3DNow: %d 3DNow2: %d SSE: %d SSE2: %d\n", | |
442 gCpuCaps.cpuType,gCpuCaps.hasMMX,gCpuCaps.hasMMX2, | |
443 gCpuCaps.has3DNow, gCpuCaps.has3DNowExt, | |
444 gCpuCaps.hasSSE, gCpuCaps.hasSSE2); | |
445 #endif | |
446 | |
1709 | 447 if ( argv[0] ) |
448 if(!strcmp(argv[0],"gmplayer") || | |
449 (strrchr(argv[0],'/') && !strcmp(strrchr(argv[0],'/'),"/gmplayer") ) ) | |
450 use_gui=1; | |
1639 | 451 |
751 | 452 parse_cfgfiles(); |
1639 | 453 num_filenames=parse_command_line(conf, argc, argv, envp, &filenames); |
2647
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
454 |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
455 if(playlist_file!=NULL) |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
456 { |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
457 FILE *playlist_f; |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
458 char *playlist_linebuffer = (char*)malloc(256); |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
459 char *playlist_line; |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
460 if(!strcmp(playlist_file,"-")) |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
461 { |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
462 playlist_f = fopen("/dev/stdin","r"); |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
463 } |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
464 else |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
465 playlist_f = fopen(playlist_file,"r"); |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
466 if(playlist_f != NULL) |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
467 { |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
468 while(!feof(playlist_f)) |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
469 { |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
470 memset(playlist_linebuffer,0,255); |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
471 fgets(playlist_linebuffer,255,playlist_f); |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
472 if(strlen(playlist_linebuffer)==0) |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
473 break; |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
474 playlist_linebuffer[strlen(playlist_linebuffer)-1] = 0; |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
475 playlist_line = (char*)malloc(strlen(playlist_linebuffer)+1); |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
476 memset(playlist_line,0,strlen(playlist_linebuffer)+1); |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
477 strcpy(playlist_line,playlist_linebuffer); |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
478 if (!(filenames = (char **) realloc(filenames, sizeof(*filenames) * (num_filenames + 2)))) |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
479 exit(3); |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
480 filenames[num_filenames++] = playlist_line; |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
481 } |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
482 fclose(playlist_f); |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
483 } |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
484 } |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
485 |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
486 |
1639 | 487 if(num_filenames<0) exit(1); // error parsing cmdline |
723 | 488 |
1709 | 489 #ifndef HAVE_NEW_GUI |
490 if(use_gui){ | |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1962
diff
changeset
|
491 mp_msg(MSGT_CPLAYER,MSGL_WARN,MSGTR_NoGui); |
1709 | 492 use_gui=0; |
493 } | |
1723
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1709
diff
changeset
|
494 #else |
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1709
diff
changeset
|
495 if(use_gui && !vo_init()){ |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1962
diff
changeset
|
496 mp_msg(MSGT_CPLAYER,MSGL_WARN,MSGTR_GuiNeedsX); |
1723
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1709
diff
changeset
|
497 use_gui=0; |
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1709
diff
changeset
|
498 } |
1709 | 499 #endif |
500 | |
1422 | 501 #ifndef USE_LIBVO2 |
723 | 502 if(video_driver && strcmp(video_driver,"help")==0){ |
503 printf("Available video output drivers:\n"); | |
504 i=0; | |
505 while (video_out_drivers[i]) { | |
506 const vo_info_t *info = video_out_drivers[i++]->get_info (); | |
507 printf("\t%s\t%s\n", info->short_name, info->name); | |
508 } | |
509 printf("\n"); | |
510 exit(0); | |
956
a6cecd9a1bad
'-ao' switch (including '-ao help'), fixing Arpi's bug (short name 'null' for both of oss and null driver ;)
lgb
parents:
955
diff
changeset
|
511 } |
1422 | 512 #endif |
956
a6cecd9a1bad
'-ao' switch (including '-ao help'), fixing Arpi's bug (short name 'null' for both of oss and null driver ;)
lgb
parents:
955
diff
changeset
|
513 if(audio_driver && strcmp(audio_driver,"help")==0){ |
a6cecd9a1bad
'-ao' switch (including '-ao help'), fixing Arpi's bug (short name 'null' for both of oss and null driver ;)
lgb
parents:
955
diff
changeset
|
514 printf("Available audio output drivers:\n"); |
a6cecd9a1bad
'-ao' switch (including '-ao help'), fixing Arpi's bug (short name 'null' for both of oss and null driver ;)
lgb
parents:
955
diff
changeset
|
515 i=0; |
a6cecd9a1bad
'-ao' switch (including '-ao help'), fixing Arpi's bug (short name 'null' for both of oss and null driver ;)
lgb
parents:
955
diff
changeset
|
516 while (audio_out_drivers[i]) { |
a6cecd9a1bad
'-ao' switch (including '-ao help'), fixing Arpi's bug (short name 'null' for both of oss and null driver ;)
lgb
parents:
955
diff
changeset
|
517 const ao_info_t *info = audio_out_drivers[i++]->info; |
a6cecd9a1bad
'-ao' switch (including '-ao help'), fixing Arpi's bug (short name 'null' for both of oss and null driver ;)
lgb
parents:
955
diff
changeset
|
518 printf("\t%s\t%s\n", info->short_name, info->name); |
a6cecd9a1bad
'-ao' switch (including '-ao help'), fixing Arpi's bug (short name 'null' for both of oss and null driver ;)
lgb
parents:
955
diff
changeset
|
519 } |
a6cecd9a1bad
'-ao' switch (including '-ao help'), fixing Arpi's bug (short name 'null' for both of oss and null driver ;)
lgb
parents:
955
diff
changeset
|
520 printf("\n"); |
a6cecd9a1bad
'-ao' switch (including '-ao help'), fixing Arpi's bug (short name 'null' for both of oss and null driver ;)
lgb
parents:
955
diff
changeset
|
521 exit(0); |
a6cecd9a1bad
'-ao' switch (including '-ao help'), fixing Arpi's bug (short name 'null' for both of oss and null driver ;)
lgb
parents:
955
diff
changeset
|
522 } |
1639 | 523 |
1983 | 524 // check codec.conf |
525 if(!parse_codec_cfg(get_path("codecs.conf"))){ | |
526 if(!parse_codec_cfg(DATADIR"/codecs.conf")){ | |
527 mp_msg(MSGT_CPLAYER,MSGL_HINT,MSGTR_CopyCodecsConf); | |
2116 | 528 // printf("Exit.\n"); |
529 // exit(0); // From unknown reason a hangup occurs here :(((((( | |
530 kill(getpid(),SIGTERM); | |
531 usleep(20000); | |
532 kill(getpid(),SIGKILL); | |
1983 | 533 } |
534 } | |
535 | |
536 if(audio_codec && strcmp(audio_codec,"help")==0){ | |
537 printf("Available audio codecs:\n"); | |
538 list_codecs(1); | |
539 printf("\n"); | |
540 exit(0); | |
541 } | |
542 if(video_codec && strcmp(video_codec,"help")==0){ | |
543 printf("Available video codecs:\n"); | |
544 list_codecs(0); | |
545 printf("\n"); | |
546 exit(0); | |
547 } | |
548 | |
549 | |
2824 | 550 if(!num_filenames && !vcd_track && !dvd_title && !tv_param_on){ |
1787
de6a0987a08d
stop fixed, fileselector supp. maybe not work, couldn't test
arpi
parents:
1772
diff
changeset
|
551 if(!use_gui){ |
1690 | 552 // no file/vcd/dvd -> show HELP: |
553 printf("%s",help_text); | |
554 exit(0); | |
1787
de6a0987a08d
stop fixed, fileselector supp. maybe not work, couldn't test
arpi
parents:
1772
diff
changeset
|
555 } else gui_no_filename=1; |
1690 | 556 } |
557 | |
558 // Many users forget to include command line in bugreports... | |
559 if(verbose){ | |
560 printf("CommandLine:"); | |
561 for(i=1;i<argc;i++)printf(" '%s'",argv[i]); | |
562 printf("\n"); | |
563 printf("num_filenames: %d\n",num_filenames); | |
564 } | |
565 | |
1639 | 566 mp_msg_init(verbose+MSGL_STATUS); |
1183 | 567 |
1639 | 568 //------ load global data first ------ |
955 | 569 |
442 | 570 |
212 | 571 // check font |
1422 | 572 #ifdef USE_OSD |
212 | 573 if(font_name){ |
337 | 574 vo_font=read_font_desc(font_name,font_factor,verbose>1); |
1582 | 575 if(!vo_font) mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantLoadFont,font_name); |
220 | 576 } else { |
577 // try default: | |
337 | 578 vo_font=read_font_desc(get_path("font/font.desc"),font_factor,verbose>1); |
1353 | 579 if(!vo_font) |
580 vo_font=read_font_desc(DATADIR"/font/font.desc",font_factor,verbose>1); | |
212 | 581 } |
1422 | 582 #endif |
212 | 583 |
1651 | 584 #ifdef USE_SUB |
585 // check .sub | |
586 if(sub_name){ | |
587 int l=strlen(sub_name); | |
588 if ((l>4) && ((0==strcmp(&sub_name[l-4],".utf")) | |
589 ||(0==strcmp(&sub_name[l-4],".UTF")))) | |
590 sub_utf8=1; | |
591 subtitles=sub_read_file(sub_name); | |
2491 | 592 if(!subtitles || sub_num == 0) mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantLoadSub,sub_name); |
1651 | 593 } |
594 #endif | |
595 | |
1709 | 596 // It's time to init the GUI code: (and fork() the GTK process) |
597 #ifdef HAVE_NEW_GUI | |
598 if(use_gui){ | |
1723
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1709
diff
changeset
|
599 appInit( argc,argv,envp,(void*)mDisplay ); |
1856 | 600 inited_flags|=INITED_GUI; |
1803 | 601 mplShMem->Playing= (gui_no_filename) ? 0 : 1; |
1709 | 602 } |
603 #endif | |
1639 | 604 |
605 #ifdef HAVE_LIRC | |
606 lirc_mp_setup(); | |
1856 | 607 inited_flags|=INITED_LIRC; |
1639 | 608 #endif |
609 | |
3015 | 610 #ifdef HAVE_RTC |
2889
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
611 if ((rtc_fd = open("/dev/rtc", O_RDONLY)) < 0) |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
612 perror ("Linux RTC init: open"); |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
613 else { |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
614 unsigned long irqp; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
615 |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
616 /* if (ioctl(rtc_fd, RTC_IRQP_SET, _) < 0) { */ |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
617 if (ioctl(rtc_fd, RTC_IRQP_READ, &irqp) < 0) { |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
618 perror ("Linux RTC init: ioctl (rtc_irqp_read)"); |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
619 close (rtc_fd); |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
620 rtc_fd = -1; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
621 } else if (ioctl(rtc_fd, RTC_PIE_ON, 0) < 0) { |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
622 /* variable only by the root */ |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
623 perror ("Linux RTC init: ioctl (rtc_pie_on)"); |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
624 close (rtc_fd); |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
625 rtc_fd = -1; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
626 } else |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
627 printf("Using Linux's hardware RTC timing (%ldHz)\n", irqp); |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
628 } |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
629 if(rtc_fd<0) |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
630 #endif |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
631 printf("Using %s timing\n",softsleep?"software":"usleep()"); |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
632 |
1639 | 633 #ifdef USE_TERMCAP |
1729 | 634 if ( !use_gui ) load_termcap(NULL); // load key-codes |
1639 | 635 #endif |
636 | |
1816 | 637 // ========== Init keyboard FIFO (connection to libvo) ============ |
638 make_pipe(&keyb_fifo_get,&keyb_fifo_put); | |
1694 | 639 |
1639 | 640 //========= Catch terminate signals: ================ |
641 // terminate requests: | |
642 signal(SIGTERM,exit_sighandler); // kill | |
643 signal(SIGHUP,exit_sighandler); // kill -HUP / xterm closed | |
644 | |
1729 | 645 signal(SIGINT,exit_sighandler); // Interrupt from keyboard |
1639 | 646 |
647 signal(SIGQUIT,exit_sighandler); // Quit from keyboard | |
648 // fatal errors: | |
649 signal(SIGBUS,exit_sighandler); // bus error | |
650 signal(SIGSEGV,exit_sighandler); // segfault | |
651 signal(SIGILL,exit_sighandler); // illegal instruction | |
652 signal(SIGFPE,exit_sighandler); // floating point exc. | |
653 signal(SIGABRT,exit_sighandler); // abort() | |
654 | |
655 // ******************* Now, let's see the per-file stuff ******************** | |
656 | |
657 curr_filename=0; | |
658 play_next_file: | |
659 filename=(num_filenames>0)?filenames[curr_filename]:NULL; | |
1787
de6a0987a08d
stop fixed, fileselector supp. maybe not work, couldn't test
arpi
parents:
1772
diff
changeset
|
660 |
1745 | 661 #ifdef HAVE_NEW_GUI |
1787
de6a0987a08d
stop fixed, fileselector supp. maybe not work, couldn't test
arpi
parents:
1772
diff
changeset
|
662 if ( use_gui ) { |
1817
35d88a433502
fixed interaction between commandlien and fileselector
arpi
parents:
1816
diff
changeset
|
663 if(filename && !mplShMem->FilenameChanged) strcpy( mplShMem->Filename,filename ); |
1803 | 664 // mplShMem->Playing= (gui_no_filename) ? 0 : 1; |
1787
de6a0987a08d
stop fixed, fileselector supp. maybe not work, couldn't test
arpi
parents:
1772
diff
changeset
|
665 while(mplShMem->Playing!=1){ |
de6a0987a08d
stop fixed, fileselector supp. maybe not work, couldn't test
arpi
parents:
1772
diff
changeset
|
666 usleep(20000); |
1802 | 667 EventHandling(); |
1787
de6a0987a08d
stop fixed, fileselector supp. maybe not work, couldn't test
arpi
parents:
1772
diff
changeset
|
668 } |
1817
35d88a433502
fixed interaction between commandlien and fileselector
arpi
parents:
1816
diff
changeset
|
669 if(mplShMem->FilenameChanged){ |
1790 | 670 filename=mplShMem->Filename; |
671 } | |
1787
de6a0987a08d
stop fixed, fileselector supp. maybe not work, couldn't test
arpi
parents:
1772
diff
changeset
|
672 } |
de6a0987a08d
stop fixed, fileselector supp. maybe not work, couldn't test
arpi
parents:
1772
diff
changeset
|
673 #endif |
de6a0987a08d
stop fixed, fileselector supp. maybe not work, couldn't test
arpi
parents:
1772
diff
changeset
|
674 |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1962
diff
changeset
|
675 if(filename) mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_Playing, filename); |
1650
7502b16bce63
make automatic subfile detection working with many files
atlka
parents:
1641
diff
changeset
|
676 |
7502b16bce63
make automatic subfile detection working with many files
atlka
parents:
1641
diff
changeset
|
677 #ifdef USE_SUB |
7502b16bce63
make automatic subfile detection working with many files
atlka
parents:
1641
diff
changeset
|
678 // check .sub |
1651 | 679 if(!sub_name){ |
1650
7502b16bce63
make automatic subfile detection working with many files
atlka
parents:
1641
diff
changeset
|
680 if(sub_auto && filename) { // auto load sub file ... |
7502b16bce63
make automatic subfile detection working with many files
atlka
parents:
1641
diff
changeset
|
681 subtitles=sub_read_file( sub_filename( get_path("sub/"), filename ) ); |
7502b16bce63
make automatic subfile detection working with many files
atlka
parents:
1641
diff
changeset
|
682 } |
7502b16bce63
make automatic subfile detection working with many files
atlka
parents:
1641
diff
changeset
|
683 if(!subtitles) subtitles=sub_read_file(get_path("default.sub")); // try default |
7502b16bce63
make automatic subfile detection working with many files
atlka
parents:
1641
diff
changeset
|
684 } |
7502b16bce63
make automatic subfile detection working with many files
atlka
parents:
1641
diff
changeset
|
685 #endif |
7502b16bce63
make automatic subfile detection working with many files
atlka
parents:
1641
diff
changeset
|
686 |
1762 | 687 if(subtitles && stream_dump_type==3) list_sub_file(subtitles); |
2178 | 688 if(subtitles && stream_dump_type==4) dump_mpsub(subtitles); |
1762 | 689 |
1654 | 690 stream=NULL; |
691 demuxer=NULL; | |
692 d_audio=NULL; | |
693 d_video=NULL; | |
694 sh_audio=NULL; | |
695 sh_video=NULL; | |
1641
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
696 |
1639 | 697 #ifdef USE_LIBVO2 |
698 current_module="vo2_new"; | |
699 video_out=vo2_new(video_driver); | |
700 current_module=NULL; | |
701 #else | |
702 // check video_out driver name: | |
703 if (video_driver) | |
704 if ((i = strcspn(video_driver, ":")) > 0) | |
705 { | |
706 size_t i2 = strlen(video_driver); | |
707 | |
708 if (video_driver[i] == ':') | |
709 { | |
710 vo_subdevice = malloc(i2-i); | |
711 if (vo_subdevice != NULL) | |
712 strncpy(vo_subdevice, (char *)(video_driver+i+1), i2-i); | |
713 video_driver[i] = '\0'; | |
714 } | |
715 // printf("video_driver: %s, subdevice: %s\n", video_driver, vo_subdevice); | |
716 } | |
717 if(!video_driver) | |
718 video_out=video_out_drivers[0]; | |
719 else | |
720 for (i=0; video_out_drivers[i] != NULL; i++){ | |
721 const vo_info_t *info = video_out_drivers[i]->get_info (); | |
722 if(strcmp(info->short_name,video_driver) == 0){ | |
723 video_out = video_out_drivers[i];break; | |
724 } | |
725 } | |
726 #endif | |
727 if(!video_out){ | |
728 mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_InvalidVOdriver,video_driver?video_driver:"?"); | |
729 exit_player(MSGTR_Exit_error); | |
730 } | |
731 | |
732 // check audio_out driver name: | |
733 if (audio_driver) | |
734 if ((i = strcspn(audio_driver, ":")) > 0) | |
735 { | |
736 size_t i2 = strlen(audio_driver); | |
737 | |
738 if (audio_driver[i] == ':') | |
739 { | |
740 ao_subdevice = malloc(i2-i); | |
741 if (ao_subdevice != NULL) | |
742 strncpy(ao_subdevice, (char *)(audio_driver+i+1), i2-i); | |
743 audio_driver[i] = '\0'; | |
744 } | |
745 // printf("audio_driver: %s, subdevice: %s\n", audio_driver, ao_subdevice); | |
746 } | |
747 if(!audio_driver) | |
748 audio_out=audio_out_drivers[0]; | |
749 else | |
750 for (i=0; audio_out_drivers[i] != NULL; i++){ | |
751 const ao_info_t *info = audio_out_drivers[i]->info; | |
752 if(strcmp(info->short_name,audio_driver) == 0){ | |
753 audio_out = audio_out_drivers[i];break; | |
754 } | |
755 } | |
756 if (!audio_out){ | |
757 mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_InvalidAOdriver,audio_driver); | |
758 exit_player(MSGTR_Exit_error); | |
759 } | |
760 /*DSP!! if(dsp) audio_out->control(AOCONTROL_SET_DEVICE,(int)dsp);*/ | |
761 | |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
762 current_module="spudec"; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
763 vo_spudec=spudec_new(); |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
764 if (vo_spudec!=NULL) |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
765 inited_flags|=INITED_SPUDEC; |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
766 current_module=NULL; |
1639 | 767 |
768 current_module="open_stream"; | |
1467 | 769 stream=open_stream(filename,vcd_track,&file_format); |
1641
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
770 if(!stream) goto goto_next_file;// exit_player(MSGTR_Exit_error); // error... |
2321 | 771 inited_flags|=INITED_STREAM; |
1497
ad4d402b3d29
seek.c moved to demuxer.c, stream_reset in new_demuxer()
arpi
parents:
1496
diff
changeset
|
772 stream->start_pos+=seek_to_byte; |
598 | 773 |
2332 | 774 if(stream_cache_size) stream_enable_cache(stream,stream_cache_size*1024); |
2321 | 775 |
1639 | 776 use_stdin=filename && (!strcmp(filename,"-")); |
777 | |
492 | 778 #ifdef HAVE_LIBCSS |
1639 | 779 current_module="libcss"; |
546 | 780 if (dvdimportkey) { |
781 if (dvd_import_key(dvdimportkey)) { | |
1582 | 782 mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_ErrorDVDkey); |
1639 | 783 exit_player(MSGTR_Exit_error); |
546 | 784 } |
1582 | 785 mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_CmdlineDVDkey); |
546 | 786 } |
1018
e5fc7ec51fa3
-dvd is renamed to -dvdauth, variable dvd_device is renamed to dvd_auth_device. These changes are needed for future DVD playback developmenting
lgb
parents:
1015
diff
changeset
|
787 if (dvd_auth_device) { |
1042
b333271f4e7c
Solaris 8 DVD support and other fixes by Juergen Keil <jk@tools.de>
arpi_esp
parents:
1039
diff
changeset
|
788 // if (dvd_auth(dvd_auth_device,f)) { |
b333271f4e7c
Solaris 8 DVD support and other fixes by Juergen Keil <jk@tools.de>
arpi_esp
parents:
1039
diff
changeset
|
789 if (dvd_auth(dvd_auth_device,filename)) { |
1809 | 790 mp_msg(MSGT_CPLAYER,MSGL_FATAL,"Error in DVD auth...\n"); |
1639 | 791 exit_player(MSGTR_Exit_error); |
723 | 792 } |
1582 | 793 mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_DVDauthOk); |
492 | 794 } |
795 #endif | |
1 | 796 |
797 //============ Open & Sync stream and detect file format =============== | |
798 | |
442 | 799 if(!has_audio) audio_id=-2; // do NOT read audio packets... |
1 | 800 |
1639 | 801 current_module="demux_open"; |
802 | |
1496 | 803 demuxer=demux_open(stream,file_format,audio_id,video_id,dvdsub_id); |
1641
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
804 if(!demuxer) goto goto_next_file; // exit_player(MSGTR_Exit_error); // ERROR |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
805 |
1660 | 806 //file_format=demuxer->file_format; |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
807 |
1 | 808 d_audio=demuxer->audio; |
809 d_video=demuxer->video; | |
554 | 810 d_dvdsub=demuxer->sub; |
1 | 811 |
792 | 812 // DUMP STREAMS: |
813 if(stream_dump_type){ | |
814 FILE *f; | |
815 demux_stream_t *ds=NULL; | |
1639 | 816 current_module="dump"; |
792 | 817 // select stream to dump |
818 switch(stream_dump_type){ | |
819 case 1: ds=d_audio;break; | |
820 case 2: ds=d_video;break; | |
2178 | 821 case 3: |
822 case 4: ds=d_dvdsub;break; | |
792 | 823 } |
824 if(!ds){ | |
1582 | 825 mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_DumpSelectedSteramMissing); |
1639 | 826 exit_player(MSGTR_Exit_error); |
792 | 827 } |
828 // disable other streams: | |
829 if(d_audio && d_audio!=ds) {ds_free_packs(d_audio); d_audio->id=-2; } | |
830 if(d_video && d_video!=ds) {ds_free_packs(d_video); d_video->id=-2; } | |
831 if(d_dvdsub && d_dvdsub!=ds) {ds_free_packs(d_dvdsub); d_dvdsub->id=-2; } | |
832 // let's dump it! | |
833 f=fopen(stream_dump_name?stream_dump_name:"stream.dump","wb"); | |
1639 | 834 if(!f){ |
835 mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_CantOpenDumpfile); | |
836 exit_player(MSGTR_Exit_error); | |
837 } | |
792 | 838 while(!ds->eof){ |
839 unsigned char* start; | |
840 int in_size=ds_get_packet(ds,&start); | |
2102 | 841 if( (demuxer->file_format==DEMUXER_TYPE_AVI || demuxer->file_format==DEMUXER_TYPE_ASF || demuxer->file_format==DEMUXER_TYPE_MOV) |
1246
7f69c1dd1e91
-dumpvideo stores frame size for avi/asf video frames (for ffmpeg testing)
arpi
parents:
1237
diff
changeset
|
842 && stream_dump_type==2) fwrite(&in_size,1,4,f); |
792 | 843 if(in_size>0) fwrite(start,in_size,1,f); |
844 } | |
845 fclose(f); | |
1582 | 846 mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_CoreDumped); |
1639 | 847 exit_player(MSGTR_Exit_eof); |
792 | 848 } |
849 | |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
850 sh_audio=d_audio->sh; |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
851 sh_video=d_video->sh; |
792 | 852 |
3054 | 853 #ifdef HAVE_NEW_GUI |
854 #ifdef USE_DVDREAD | |
855 if ( use_gui && stream->type == STREAMTYPE_DVD ) | |
856 { | |
857 dvd_priv_t * dvdp = stream->priv; | |
858 mplShMem->DVD.titles=dvdp->vmg_file->tt_srpt->nr_of_srpts; | |
859 mplShMem->DVD.chapters=dvdp->vmg_file->tt_srpt->title[dvd_title].nr_of_ptts; | |
860 mplShMem->DVD.angles=dvdp->vmg_file->tt_srpt->title[dvd_title].nr_of_angles; | |
861 mplShMem->DVD.nr_of_audio_channels=dvdp->nr_of_channels; | |
862 memcpy( mplShMem->DVD.audio_streams,dvdp->audio_streams,sizeof( dvdp->audio_streams ) ); | |
863 mplShMem->DVD.nr_of_subtitles=dvdp->nr_of_subtitles; | |
864 memcpy( mplShMem->DVD.subtitles,dvdp->subtitles,sizeof( dvdp->subtitles ) ); | |
865 mplShMem->DVD.current_title=dvd_title + 1; | |
866 mplShMem->DVD.current_chapter=dvd_chapter + 1; | |
867 mplShMem->Track=dvd_title + 1; | |
868 } | |
869 #endif | |
870 #endif | |
871 | |
1639 | 872 current_module="video_read_properties"; |
873 | |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
874 if(sh_video){ |
1 | 875 |
1641
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
876 if(!video_read_properties(sh_video)) goto goto_next_file; // exit_player(MSGTR_Exit_error); // couldn't read header? |
1 | 877 |
1567 | 878 mp_msg(MSGT_CPLAYER,MSGL_INFO,"[V] filefmt:%d fourcc:0x%X size:%dx%d fps:%5.2f ftime:=%6.4f\n", |
1660 | 879 demuxer->file_format,sh_video->format, sh_video->disp_w,sh_video->disp_h, |
398 | 880 sh_video->fps,sh_video->frametime |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
881 ); |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
882 |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
883 if(!sh_video->fps && !force_fps){ |
1582 | 884 mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_FPSnotspecified); |
1641
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
885 goto goto_next_file; // exit_player(MSGTR_Exit_error); |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
886 } |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
887 |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
888 } |
398 | 889 |
1 | 890 fflush(stdout); |
891 | |
778
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
892 if(!sh_video){ |
1582 | 893 mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_NoVideoStream); |
1641
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
894 goto goto_next_file; // exit_player(MSGTR_Exit_error); |
778
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
895 } |
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
896 |
3050 | 897 /* display clip info */ |
898 demux_info_print(demuxer); | |
899 | |
303 | 900 //================== Init AUDIO (codec) ========================== |
1639 | 901 |
902 current_module="init_audio_codec"; | |
903 | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
904 if(sh_audio){ |
303 | 905 // Go through the codec.conf and find the best codec... |
626 | 906 sh_audio->codec=NULL; |
1582 | 907 if(audio_family!=-1) mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_TryForceAudioFmt,audio_family); |
626 | 908 while(1){ |
909 sh_audio->codec=find_codec(sh_audio->format,NULL,sh_audio->codec,1); | |
910 if(!sh_audio->codec){ | |
1299
fa50e6bc6091
As promised, -afm and -vfm to prefer audio/video driver family, -ac and -vc have higher precedence, so they can override -afm/-vfm.
atmos4
parents:
1296
diff
changeset
|
911 if(audio_family!=-1) { |
fa50e6bc6091
As promised, -afm and -vfm to prefer audio/video driver family, -ac and -vc have higher precedence, so they can override -afm/-vfm.
atmos4
parents:
1296
diff
changeset
|
912 sh_audio->codec=NULL; /* re-search */ |
1582 | 913 mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantFindAfmtFallback); |
1299
fa50e6bc6091
As promised, -afm and -vfm to prefer audio/video driver family, -ac and -vc have higher precedence, so they can override -afm/-vfm.
atmos4
parents:
1296
diff
changeset
|
914 audio_family=-1; |
fa50e6bc6091
As promised, -afm and -vfm to prefer audio/video driver family, -ac and -vc have higher precedence, so they can override -afm/-vfm.
atmos4
parents:
1296
diff
changeset
|
915 continue; |
fa50e6bc6091
As promised, -afm and -vfm to prefer audio/video driver family, -ac and -vc have higher precedence, so they can override -afm/-vfm.
atmos4
parents:
1296
diff
changeset
|
916 } |
1582 | 917 mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantFindAudioCodec,sh_audio->format); |
918 mp_msg(MSGT_CPLAYER,MSGL_HINT, MSGTR_TryUpgradeCodecsConfOrRTFM,get_path("codecs.conf")); | |
1792 | 919 sh_audio=d_audio->sh=NULL; |
626 | 920 break; |
921 } | |
1286
543a94b241a2
Replaced LGBs video codec forcing change with mine for audio and video codecs, which is IMHO more convenient cause codecs are selected by name instead of number, one unclearity is left to me, that's why audio_format is used once before codecs selection for MPEG_PS files, that's why I left -afm in for that one.
atmos4
parents:
1285
diff
changeset
|
922 if(audio_codec && strcmp(sh_audio->codec->name,audio_codec)) continue; |
1299
fa50e6bc6091
As promised, -afm and -vfm to prefer audio/video driver family, -ac and -vc have higher precedence, so they can override -afm/-vfm.
atmos4
parents:
1296
diff
changeset
|
923 else if(audio_family!=-1 && sh_audio->codec->driver!=audio_family) continue; |
1567 | 924 mp_msg(MSGT_CPLAYER,MSGL_INFO,"%s audio codec: [%s] drv:%d (%s)\n",audio_codec?"Forcing":"Detected",sh_audio->codec->name,sh_audio->codec->driver,sh_audio->codec->info); |
626 | 925 break; |
303 | 926 } |
1 | 927 } |
928 | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
929 if(sh_audio){ |
1567 | 930 mp_msg(MSGT_CPLAYER,MSGL_V,"Initializing audio codec...\n"); |
442 | 931 if(!init_audio(sh_audio)){ |
1582 | 932 mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CouldntInitAudioCodec); |
1792 | 933 sh_audio=d_audio->sh=NULL; |
1889 | 934 #ifdef HAVE_NEW_GUI |
935 if ( use_gui ) mplShMem->AudioType=0; | |
936 #endif | |
303 | 937 } else { |
1567 | 938 mp_msg(MSGT_CPLAYER,MSGL_INFO,"AUDIO: srate=%d chans=%d bps=%d sfmt=0x%X ratio: %d->%d\n",sh_audio->samplerate,sh_audio->channels,sh_audio->samplesize, |
758 | 939 sh_audio->sample_format,sh_audio->i_bps,sh_audio->o_bps); |
1889 | 940 #ifdef HAVE_NEW_GUI |
941 if ( use_gui ) mplShMem->AudioType=sh_audio->channels; | |
942 #endif | |
303 | 943 } |
175 | 944 } |
945 | |
303 | 946 //================== Init VIDEO (codec & libvo) ========================== |
947 | |
1639 | 948 current_module="init_video_codec"; |
949 | |
303 | 950 // Go through the codec.conf and find the best codec... |
626 | 951 sh_video->codec=NULL; |
1582 | 952 if(video_family!=-1) mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_TryForceVideoFmt,video_family); |
626 | 953 while(1){ |
954 sh_video->codec=find_codec(sh_video->format, | |
955 sh_video->bih?((unsigned int*) &sh_video->bih->biCompression):NULL,sh_video->codec,0); | |
956 if(!sh_video->codec){ | |
1299
fa50e6bc6091
As promised, -afm and -vfm to prefer audio/video driver family, -ac and -vc have higher precedence, so they can override -afm/-vfm.
atmos4
parents:
1296
diff
changeset
|
957 if(video_family!=-1) { |
fa50e6bc6091
As promised, -afm and -vfm to prefer audio/video driver family, -ac and -vc have higher precedence, so they can override -afm/-vfm.
atmos4
parents:
1296
diff
changeset
|
958 sh_video->codec=NULL; /* re-search */ |
1582 | 959 mp_msg(MSGT_CPLAYER,MSGL_WARN,MSGTR_CantFindVfmtFallback); |
1299
fa50e6bc6091
As promised, -afm and -vfm to prefer audio/video driver family, -ac and -vc have higher precedence, so they can override -afm/-vfm.
atmos4
parents:
1296
diff
changeset
|
960 video_family=-1; |
fa50e6bc6091
As promised, -afm and -vfm to prefer audio/video driver family, -ac and -vc have higher precedence, so they can override -afm/-vfm.
atmos4
parents:
1296
diff
changeset
|
961 continue; |
fa50e6bc6091
As promised, -afm and -vfm to prefer audio/video driver family, -ac and -vc have higher precedence, so they can override -afm/-vfm.
atmos4
parents:
1296
diff
changeset
|
962 } |
1582 | 963 mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CantFindVideoCodec,sh_video->format); |
964 mp_msg(MSGT_CPLAYER,MSGL_HINT, MSGTR_TryUpgradeCodecsConfOrRTFM,get_path("codecs.conf")); | |
1641
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
965 goto goto_next_file; // exit_player(MSGTR_Exit_error); |
626 | 966 } |
1286
543a94b241a2
Replaced LGBs video codec forcing change with mine for audio and video codecs, which is IMHO more convenient cause codecs are selected by name instead of number, one unclearity is left to me, that's why audio_format is used once before codecs selection for MPEG_PS files, that's why I left -afm in for that one.
atmos4
parents:
1285
diff
changeset
|
967 // is next line needed anymore? - atmos :: |
1410
eda16e490ae7
using AFM_/VFM_ macros instead of hardcoded constants (idea by al3x)
arpi
parents:
1406
diff
changeset
|
968 if(!allow_dshow && sh_video->codec->driver==VFM_DSHOW) continue; // skip DShow |
1286
543a94b241a2
Replaced LGBs video codec forcing change with mine for audio and video codecs, which is IMHO more convenient cause codecs are selected by name instead of number, one unclearity is left to me, that's why audio_format is used once before codecs selection for MPEG_PS files, that's why I left -afm in for that one.
atmos4
parents:
1285
diff
changeset
|
969 else if(video_codec && strcmp(sh_video->codec->name,video_codec)) continue; |
1299
fa50e6bc6091
As promised, -afm and -vfm to prefer audio/video driver family, -ac and -vc have higher precedence, so they can override -afm/-vfm.
atmos4
parents:
1296
diff
changeset
|
970 else if(video_family!=-1 && sh_video->codec->driver!=video_family) continue; |
626 | 971 break; |
303 | 972 } |
973 | |
1567 | 974 mp_msg(MSGT_CPLAYER,MSGL_INFO,"%s video codec: [%s] drv:%d (%s)\n",video_codec?"Forcing":"Detected",sh_video->codec->name,sh_video->codec->driver,sh_video->codec->info); |
303 | 975 |
976 for(i=0;i<CODECS_MAX_OUTFMT;i++){ | |
2705 | 977 // int ret; |
303 | 978 out_fmt=sh_video->codec->outfmt[i]; |
534
2a45d5adcc88
do not query vo drivers for format 0xFFFFFFFF (thanx to szabi)
arpi_esp
parents:
510
diff
changeset
|
979 if(out_fmt==0xFFFFFFFF) continue; |
1422 | 980 #ifdef USE_LIBVO2 |
2705 | 981 vo_flags=vo2_query_format(video_out); |
1422 | 982 #else |
2705 | 983 vo_flags=video_out->query_format(out_fmt); |
1422 | 984 #endif |
2705 | 985 mp_msg(MSGT_CPLAYER,MSGL_DBG2,"vo_debug: query(%s) returned 0x%X\n",vo_format_name(out_fmt),vo_flags); |
986 if(vo_flags) break; | |
303 | 987 } |
988 if(i>=CODECS_MAX_OUTFMT){ | |
1582 | 989 mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_VOincompCodec); |
1641
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
990 goto goto_next_file; // exit_player(MSGTR_Exit_error); |
303 | 991 } |
992 sh_video->outfmtidx=i; | |
993 | |
778
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
994 if(flip==-1){ |
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
995 // autodetect flipping |
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
996 flip=0; |
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
997 if(sh_video->codec->outflags[i]&CODECS_FLAG_FLIP) |
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
998 if(!(sh_video->codec->outflags[i]&CODECS_FLAG_NOFLIP)) |
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
999 flip=1; |
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
1000 } |
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
1001 |
1567 | 1002 mp_msg(MSGT_CPLAYER,MSGL_DBG2,"vo_debug1: out_fmt=%s\n",vo_format_name(out_fmt)); |
487 | 1003 |
1291 | 1004 if(!init_video(sh_video)){ |
1582 | 1005 mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_CouldntInitVideoCodec); |
1641
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
1006 goto goto_next_file; // exit_player(MSGTR_Exit_error); |
1 | 1007 } |
1008 | |
1439 | 1009 if(auto_quality>0){ |
1010 // Auto quality option enabled | |
1011 output_quality=get_video_quality_max(sh_video); | |
1012 if(auto_quality>output_quality) auto_quality=output_quality; | |
1013 else output_quality=auto_quality; | |
1567 | 1014 mp_msg(MSGT_CPLAYER,MSGL_V,"AutoQ: setting quality to %d\n",output_quality); |
1439 | 1015 set_video_quality(sh_video,output_quality); |
1016 } | |
1017 | |
398 | 1018 // ========== Init display (sh_video->disp_w*sh_video->disp_h/out_fmt) ============ |
1 | 1019 |
1639 | 1020 current_module="init_libvo"; |
1021 | |
2034
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
1022 #if 0 /* was X11_FULLSCREEN hack -> moved to libvo/vo_xv.c where it belongs ::atmos */ |
1 | 1023 if(fullscreen){ |
1024 if(vo_init()){ | |
1025 //if(verbose) printf("X11 running at %dx%d depth: %d\n",vo_screenwidth,vo_screenheight,vo_depthonscreen); | |
1026 } | |
1027 if(!screen_size_xy) screen_size_xy=vo_screenwidth; // scale with asp.ratio | |
1028 } | |
1029 #endif | |
2034
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
1030 // Set default VGA 1:1 aspect as fallback ::atmos |
2042 | 1031 if(movie_aspect) sh_video->aspect = movie_aspect; // cmdline overrides autodetect |
1032 // if(!sh_video->aspect) sh_video->aspect=1.0; | |
1 | 1033 |
2034
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
1034 if(screen_size_xy||screen_size_x||screen_size_y){ |
1 | 1035 if(screen_size_xy>0){ |
1036 if(screen_size_xy<=8){ | |
398 | 1037 screen_size_x=screen_size_xy*sh_video->disp_w; |
1038 screen_size_y=screen_size_xy*sh_video->disp_h; | |
1 | 1039 } else { |
1040 screen_size_x=screen_size_xy; | |
398 | 1041 screen_size_y=screen_size_xy*sh_video->disp_h/sh_video->disp_w; |
1 | 1042 } |
337 | 1043 } else if(!vidmode){ |
1044 if(!screen_size_x) screen_size_x=SCREEN_SIZE_X; | |
1045 if(!screen_size_y) screen_size_y=SCREEN_SIZE_Y; | |
398 | 1046 if(screen_size_x<=8) screen_size_x*=sh_video->disp_w; |
1047 if(screen_size_y<=8) screen_size_y*=sh_video->disp_h; | |
1 | 1048 } |
2034
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
1049 } else { |
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
1050 // check source format aspect, calculate prescale ::atmos |
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
1051 screen_size_x=sh_video->disp_w; |
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
1052 screen_size_y=sh_video->disp_h; |
2042 | 1053 if(sh_video->aspect>0.01){ |
2034
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
1054 mp_msg(MSGT_CPLAYER,MSGL_INFO,"Movie-Aspect is %.2f:1 - prescaling to correct movie aspect.\n", |
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
1055 sh_video->aspect); |
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
1056 screen_size_x=(int)((float)sh_video->disp_h*sh_video->aspect); |
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
1057 screen_size_x+=screen_size_x%2; // round |
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
1058 if(screen_size_x<sh_video->disp_w){ |
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
1059 screen_size_x=sh_video->disp_w; |
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
1060 screen_size_y=(int)((float)sh_video->disp_w*(1.0/sh_video->aspect)); |
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
1061 screen_size_y+=screen_size_y%2; // round |
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
1062 } |
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
1063 } else { |
2042 | 1064 mp_msg(MSGT_CPLAYER,MSGL_INFO,"Movie-Aspect is undefined - no prescaling applied.\n"); |
2034
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
1065 } |
2f1974590f88
New aspect prescale code, parses aspect value from mpeg sequence header or commandline.
atmos4
parents:
2020
diff
changeset
|
1066 } |
208
ae0f909ccc7c
Adds code to deal with vidmode selection. -- mgraffam
mgraffam
parents:
190
diff
changeset
|
1067 |
1422 | 1068 #ifndef USE_LIBVO2 |
340 | 1069 { const vo_info_t *info = video_out->get_info(); |
1567 | 1070 mp_msg(MSGT_CPLAYER,MSGL_INFO,"VO: [%s] %dx%d => %dx%d %s %s%s%s%s\n",info->short_name, |
398 | 1071 sh_video->disp_w,sh_video->disp_h, |
340 | 1072 screen_size_x,screen_size_y, |
1183 | 1073 vo_format_name(out_fmt), |
340 | 1074 fullscreen?"fs ":"", |
1075 vidmode?"vm ":"", | |
766 | 1076 softzoom?"zoom ":"", |
778
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
1077 (flip==1)?"flip ":"" |
766 | 1078 // fullscreen|(vidmode<<1)|(softzoom<<2)|(flip<<3) |
340 | 1079 ); |
1567 | 1080 mp_msg(MSGT_CPLAYER,MSGL_V,"VO: Description: %s\n",info->name); |
1081 mp_msg(MSGT_CPLAYER,MSGL_V,"VO: Author: %s\n", info->author); | |
1237 | 1082 if(strlen(info->comment) > 0) |
1567 | 1083 mp_msg(MSGT_CPLAYER,MSGL_V,"VO: Comment: %s\n", info->comment); |
340 | 1084 } |
1422 | 1085 #endif |
340 | 1086 |
1753 | 1087 #ifdef HAVE_NEW_GUI |
1088 if ( use_gui ) | |
1089 { | |
1952 | 1090 mplResizeToMovieSize( sh_video->disp_w,sh_video->disp_h ); |
1091 moviewidth=screen_size_x=sh_video->disp_w; | |
1092 movieheight=screen_size_y=sh_video->disp_h; | |
2447 | 1093 mplShMem->StreamType=stream->type; |
2854 | 1094 mplSetFileName( filename ); |
1753 | 1095 } |
1096 #endif | |
1097 | |
1567 | 1098 mp_msg(MSGT_CPLAYER,MSGL_V,"video_out->init(%dx%d->%dx%d,flags=%d,'%s',0x%X)\n", |
398 | 1099 sh_video->disp_w,sh_video->disp_h, |
1 | 1100 screen_size_x,screen_size_y, |
766 | 1101 fullscreen|(vidmode<<1)|(softzoom<<2)|(flip<<3), |
337 | 1102 title,out_fmt); |
1 | 1103 |
1422 | 1104 #ifdef USE_LIBVO2 |
1105 if(!vo2_start(video_out, | |
1106 sh_video->disp_w,sh_video->disp_h,out_fmt,0, | |
1107 fullscreen|(vidmode<<1)|(softzoom<<2)|(flip<<3) )){ | |
1108 #else | |
398 | 1109 if(video_out->init(sh_video->disp_w,sh_video->disp_h, |
1 | 1110 screen_size_x,screen_size_y, |
766 | 1111 fullscreen|(vidmode<<1)|(softzoom<<2)|(flip<<3), |
337 | 1112 title,out_fmt)){ |
1641
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
1113 #endif |
1582 | 1114 mp_msg(MSGT_CPLAYER,MSGL_FATAL,MSGTR_CannotInitVO); |
1641
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
1115 goto goto_next_file; // exit_player(MSGTR_Exit_error); |
1 | 1116 } |
1856 | 1117 inited_flags|=INITED_VO; |
1567 | 1118 mp_msg(MSGT_CPLAYER,MSGL_V,"INFO: Video OUT driver init OK!\n"); |
1 | 1119 |
1120 fflush(stdout); | |
458
49b0474b2e26
I really hope that you will learn how to use cvs, sooner or later...
arpi_esp
parents:
452
diff
changeset
|
1121 |
1 | 1122 //================== MAIN: ========================== |
1123 { | |
746 | 1124 |
1420 | 1125 //int frame_corr_num=0; // |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1126 //float v_frame=0; // Video |
1 | 1127 float time_frame=0; // Timer |
1128 int eof=0; | |
1129 int force_redraw=0; | |
1400 | 1130 //float num_frames=0; // number of frames played |
1382 | 1131 int grab_frames=0; |
212 | 1132 char osd_text_buffer[64]; |
715 | 1133 int drop_frame=0; |
1134 int drop_frame_cnt=0; | |
2889
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1135 int too_slow_frame_cnt=0; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1136 int too_fast_frame_cnt=0; |
1439 | 1137 // for auto-quality: |
1478
6f9167f0fcca
'too slow' message is fixed - better detection now based on both drop_cnt and A-V sync
arpi
parents:
1467
diff
changeset
|
1138 float AV_delay=0; // average of A-V timestamp differences |
1439 | 1139 double cvideo_base_vtime; |
1140 double cvideo_base_vframe; | |
1141 double vdecode_time; | |
2889
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1142 unsigned int lastframeout_ts; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1143 float time_frame_corr_avg=0; |
1 | 1144 |
1145 //================ SETUP AUDIO ========================== | |
1146 current_module="setup_audio"; | |
1147 | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1148 if(sh_audio){ |
1237 | 1149 |
1150 const ao_info_t *info=audio_out->info; | |
1567 | 1151 mp_msg(MSGT_CPLAYER,MSGL_INFO,"AO: [%s] %iHz %s %s\n", |
1237 | 1152 info->short_name, |
1153 force_srate?force_srate:sh_audio->samplerate, | |
1154 sh_audio->channels>1?"Stereo":"Mono", | |
1456
8c57a5a3c645
printfs cleanup - moved to higher -v level or moved to stderr
arpi
parents:
1449
diff
changeset
|
1155 audio_out_format_name(sh_audio->sample_format) |
8c57a5a3c645
printfs cleanup - moved to higher -v level or moved to stderr
arpi
parents:
1449
diff
changeset
|
1156 ); |
1567 | 1157 mp_msg(MSGT_CPLAYER,MSGL_V,"AO: Description: %s\nAO: Author: %s\n", |
1237 | 1158 info->name, |
1159 info->author | |
1160 ); | |
1456
8c57a5a3c645
printfs cleanup - moved to higher -v level or moved to stderr
arpi
parents:
1449
diff
changeset
|
1161 if(strlen(info->comment) > 0) |
1567 | 1162 mp_msg(MSGT_CPLAYER,MSGL_V,"AO: Comment: %s\n", info->comment); |
969 | 1163 if(!audio_out->init(force_srate?force_srate:sh_audio->samplerate, |
1164 sh_audio->channels,sh_audio->sample_format,0)){ | |
1582 | 1165 mp_msg(MSGT_CPLAYER,MSGL_ERR,MSGTR_CannotInitAO); |
1792 | 1166 sh_audio=d_audio->sh=NULL; |
1856 | 1167 } else { |
1168 inited_flags|=INITED_AO; | |
1 | 1169 } |
1170 | |
955 | 1171 // printf("Audio buffer size: %d bytes, delay: %5.3fs\n",audio_buffer_size,audio_buffer_delay); |
746 | 1172 |
758 | 1173 // fixup audio buffer size: |
782 | 1174 // if(outburst<MAX_OUTBURST){ |
1175 // sh_audio->a_buffer_size=sh_audio->audio_out_minsize+outburst; | |
1176 // printf("Audio out buffer size reduced to %d bytes\n",sh_audio->a_buffer_size); | |
1177 // } | |
758 | 1178 |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1179 // sh_audio->timer=-(audio_buffer_delay); |
1 | 1180 } |
1181 | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1182 sh_video->timer=0; |
2000 | 1183 if(sh_audio) sh_audio->timer=-audio_delay; |
1 | 1184 |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1185 if(!sh_audio){ |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1962
diff
changeset
|
1186 mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_NoSound); |
1567 | 1187 if(verbose) mp_msg(MSGT_CPLAYER,MSGL_V,"Freeing %d unused audio chunks\n",d_audio->packs); |
1 | 1188 ds_free_packs(d_audio); // free buffered chunks |
1189 d_audio->id=-2; // do not read audio chunks | |
1856 | 1190 if(audio_out) uninit_player(INITED_AO); // close device |
1 | 1191 } |
1192 | |
1193 current_module=NULL; | |
1194 | |
1660 | 1195 if(demuxer->file_format!=DEMUXER_TYPE_AVI) pts_from_bps=0; // it must be 0 for mpeg/asf! |
398 | 1196 if(force_fps){ |
1197 sh_video->fps=force_fps; | |
1198 sh_video->frametime=1.0f/sh_video->fps; | |
1973
5216f108cb4f
all error/warn/info messages moved to help_mp-en.h for translation
arpi
parents:
1962
diff
changeset
|
1199 mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_FPSforced,sh_video->fps,sh_video->frametime); |
398 | 1200 } |
1 | 1201 |
1639 | 1202 //==================== START PLAYING ======================= |
1203 | |
1582 | 1204 mp_msg(MSGT_CPLAYER,MSGL_INFO,MSGTR_StartPlaying);fflush(stdout); |
1 | 1205 |
1856 | 1206 if(!use_stdin){ |
1207 getch2_enable(); // prepare stdin for hotkeys... | |
1208 inited_flags|=INITED_GETCH2; | |
1209 } | |
1639 | 1210 |
1 | 1211 InitTimer(); |
1212 | |
1124
0e95f30ffd4c
-frames and -benchmark options to make chl & gabucino happy
arpi_esp
parents:
1059
diff
changeset
|
1213 total_time_usage_start=GetTimer(); |
0e95f30ffd4c
-frames and -benchmark options to make chl & gabucino happy
arpi_esp
parents:
1059
diff
changeset
|
1214 |
1 | 1215 while(!eof){ |
2567 | 1216 // unsigned int aq_total_time=GetTimer(); |
1439 | 1217 float aq_sleep_time=0; |
1 | 1218 |
1125 | 1219 if(play_n_frames>=0){ |
1220 --play_n_frames; | |
1582 | 1221 if(play_n_frames<0) exit_player(MSGTR_Exit_frames); |
1125 | 1222 } |
1223 | |
2705 | 1224 vo_pts=sh_video->timer*90000.0; |
1225 | |
1 | 1226 /*========================== PLAY AUDIO ============================*/ |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1227 while(sh_audio){ |
746 | 1228 unsigned int t; |
2705 | 1229 int playsize; |
1230 | |
1231 ao_pts=sh_audio->timer*90000.0; | |
1232 playsize=audio_out->get_space(); | |
746 | 1233 |
955 | 1234 if(!playsize) break; // buffer is full, do not block here!!! |
746 | 1235 |
1236 if(playsize>MAX_OUTBURST) playsize=MAX_OUTBURST; // we shouldn't exceed it! | |
1237 //if(playsize>outburst) playsize=outburst; | |
291 | 1238 |
1239 // Update buffer if needed | |
1639 | 1240 current_module="decode_audio"; // Enter AUDIO decoder module |
746 | 1241 t=GetTimer(); |
1242 while(sh_audio->a_buffer_len<playsize && !d_audio->eof){ | |
1243 int ret=decode_audio(sh_audio,&sh_audio->a_buffer[sh_audio->a_buffer_len], | |
1244 playsize-sh_audio->a_buffer_len,sh_audio->a_buffer_size-sh_audio->a_buffer_len); | |
296 | 1245 if(ret>0) sh_audio->a_buffer_len+=ret; else break; |
1 | 1246 } |
1247 current_module=NULL; // Leave AUDIO decoder module | |
291 | 1248 t=GetTimer()-t;audio_time_usage+=t*0.000001; |
746 | 1249 |
1250 if(playsize>sh_audio->a_buffer_len) playsize=sh_audio->a_buffer_len; | |
1251 | |
955 | 1252 playsize=audio_out->play(sh_audio->a_buffer,playsize,0); |
1 | 1253 |
955 | 1254 if(playsize>0){ |
746 | 1255 sh_audio->a_buffer_len-=playsize; |
1256 memcpy(sh_audio->a_buffer,&sh_audio->a_buffer[playsize],sh_audio->a_buffer_len); | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1257 sh_audio->timer+=playsize/(float)(sh_audio->o_bps); |
1 | 1258 } |
1259 | |
1260 break; | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1261 } // if(sh_audio) |
1 | 1262 |
1263 /*========================== UPDATE TIMERS ============================*/ | |
746 | 1264 #if 0 |
1 | 1265 if(alsa){ |
1266 // Use system timer for sync, not audio card/driver | |
1267 time_frame-=GetRelativeTime(); | |
1268 if(time_frame<-0.1 || time_frame>0.1){ | |
1269 time_frame=0; | |
1270 } else { | |
398 | 1271 while(time_frame>0.022){ |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1272 usec_sleep(time_frame-0.022); |
398 | 1273 time_frame-=GetRelativeTime(); |
1274 } | |
103 | 1275 while(time_frame>0.007){ |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1276 usec_sleep(1000); // sleeps 1 clock tick (10ms)! |
103 | 1277 time_frame-=GetRelativeTime(); |
1278 } | |
398 | 1279 } |
1 | 1280 } |
746 | 1281 #endif |
1 | 1282 |
1283 /*========================== PLAY VIDEO ============================*/ | |
1284 | |
1439 | 1285 cvideo_base_vframe=sh_video->timer; |
1286 cvideo_base_vtime=video_time_usage; | |
1287 | |
1 | 1288 if(1) |
746 | 1289 while(1){ |
458
49b0474b2e26
I really hope that you will learn how to use cvs, sooner or later...
arpi_esp
parents:
452
diff
changeset
|
1290 |
2567 | 1291 float frame_time=0; |
1291 | 1292 int blit_frame=0; |
715 | 1293 |
2567 | 1294 //-------------------- Decode a frame: ----------------------- |
1295 vdecode_time=video_time_usage; | |
1296 { unsigned char* start=NULL; | |
1297 int in_size; | |
1298 // get it! | |
1299 current_module="video_read_frame"; | |
1300 in_size=video_read_frame(sh_video,&frame_time,&start,force_fps); | |
1301 if(in_size<0){ eof=1; break; } | |
1302 if(in_size>max_framesize) max_framesize=in_size; // stats | |
1303 // decode: | |
1304 current_module="decode_video"; | |
1305 // printf("Decode! %p %d \n",start,in_size); | |
1306 blit_frame=decode_video(video_out,sh_video,start,in_size,drop_frame); | |
1291 | 1307 } |
2567 | 1308 vdecode_time=video_time_usage-vdecode_time; |
1309 //------------------------ frame decoded. -------------------- | |
1310 | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1498
diff
changeset
|
1311 //------------------------ add OSD to frame contents --------- |
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1498
diff
changeset
|
1312 #ifndef USE_LIBVO2 |
1768 | 1313 current_module="draw_osd"; |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1498
diff
changeset
|
1314 video_out->draw_osd(); |
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1498
diff
changeset
|
1315 #endif |
1 | 1316 |
1768 | 1317 current_module="av_sync"; |
1318 | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1319 sh_video->timer+=frame_time; |
746 | 1320 time_frame+=frame_time; // for nosound |
1321 | |
1567 | 1322 mp_dbg(MSGT_AVSYNC,MSGL_DBG2,"*** ftime=%5.3f ***\n",frame_time); |
780 | 1323 |
798 | 1324 if(drop_frame){ |
746 | 1325 |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1326 if(sh_audio && !d_audio->eof){ |
955 | 1327 int delay=audio_out->get_delay(); |
1567 | 1328 mp_dbg(MSGT_AVSYNC,MSGL_DBG2,"delay=%d\n",delay); |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1329 time_frame=sh_video->timer; |
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1330 time_frame-=sh_audio->timer-(float)delay/(float)sh_audio->o_bps; |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1331 if(time_frame>-2*frame_time) { |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1332 drop_frame=0; // stop dropping frames |
1567 | 1333 mp_msg(MSGT_AVSYNC,MSGL_DBG2,"\nstop frame drop %.2f\n", time_frame); |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1334 }else{ |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1335 ++drop_frame_cnt; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1336 if (verbose > 0 && drop_frame_cnt%10 == 0) |
1567 | 1337 mp_msg(MSGT_AVSYNC,MSGL_DBG2,"\nstill dropping, %.2f\n", time_frame); |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1338 } |
798 | 1339 } |
1709 | 1340 #ifdef HAVE_NEW_GUI |
2567 | 1341 if(use_gui) EventHandling(); |
1709 | 1342 #endif |
1729 | 1343 video_out->check_events(); // check events AST |
798 | 1344 } else { |
780 | 1345 // It's time to sleep... |
1346 current_module="sleep"; | |
1347 | |
1348 time_frame-=GetRelativeTime(); // reset timer | |
1349 | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1350 if(sh_audio && !d_audio->eof){ |
955 | 1351 int delay=audio_out->get_delay(); |
1567 | 1352 mp_dbg(MSGT_AVSYNC,MSGL_DBG2,"delay=%d\n",delay); |
2889
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1353 |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1354 if(!dapsync){ |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1355 |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1356 /* Arpi's AV-sync */ |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1357 |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1358 time_frame=sh_video->timer; |
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1359 time_frame-=sh_audio->timer-(float)delay/(float)sh_audio->o_bps; |
798 | 1360 // we are out of time... drop next frame! |
940 | 1361 if(time_frame<-2*frame_time){ |
1478
6f9167f0fcca
'too slow' message is fixed - better detection now based on both drop_cnt and A-V sync
arpi
parents:
1467
diff
changeset
|
1362 static int drop_message=0; |
798 | 1363 drop_frame=frame_dropping; // tricky! |
1364 ++drop_frame_cnt; | |
1478
6f9167f0fcca
'too slow' message is fixed - better detection now based on both drop_cnt and A-V sync
arpi
parents:
1467
diff
changeset
|
1365 if(drop_frame_cnt>50 && AV_delay>0.5 && !drop_message){ |
6f9167f0fcca
'too slow' message is fixed - better detection now based on both drop_cnt and A-V sync
arpi
parents:
1467
diff
changeset
|
1366 drop_message=1; |
1582 | 1367 mp_msg(MSGT_AVSYNC,MSGL_WARN,MSGTR_SystemTooSlow); |
1478
6f9167f0fcca
'too slow' message is fixed - better detection now based on both drop_cnt and A-V sync
arpi
parents:
1467
diff
changeset
|
1368 } |
1567 | 1369 mp_msg(MSGT_AVSYNC,MSGL_DBG2,"\nframe drop %d, %.2f\n", drop_frame, time_frame); |
798 | 1370 } |
2889
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1371 |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1372 } else { |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1373 |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1374 /* DaP's AV-sync */ |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1375 |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1376 float SH_AV_delay; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1377 /* SH_AV_delay = sh_video->timer - (sh_audio->timer - (float)((float)delay + sh_audio->a_buffer_len) / (float)sh_audio->o_bps); */ |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1378 SH_AV_delay = sh_video->timer - (sh_audio->timer - (float)((float)delay) / (float)sh_audio->o_bps); |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1379 // printf ("audio slp req: %.3f TF: %.3f delta: %.3f (v: %.3f a: %.3f) | ", i, time_frame, |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1380 // i - time_frame, sh_video->timer, sh_audio->timer - (float)((float)delay / (float)sh_audio->o_bps)); |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1381 if(SH_AV_delay<-2*frame_time){ |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1382 static int drop_message=0; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1383 drop_frame=frame_dropping; // tricky! |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1384 ++drop_frame_cnt; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1385 if(drop_frame_cnt>50 && AV_delay>0.5 && !drop_message){ |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1386 drop_message=1; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1387 mp_msg(MSGT_AVSYNC,MSGL_WARN,MSGTR_SystemTooSlow); |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1388 } |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1389 printf ("A-V SYNC: FRAMEDROP (SH_AV_delay=%.3f)!\n", SH_AV_delay); |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1390 mp_msg(MSGT_AVSYNC,MSGL_DBG2,"\nframe drop %d, %.2f\n", drop_frame, time_frame); |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1391 /* go into unlimited-TF cycle */ |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1392 time_frame = SH_AV_delay; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1393 } else { |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1394 #define SL_CORR_AVG_LEN 125 |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1395 /* don't adjust under framedropping */ |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1396 time_frame_corr_avg = (time_frame_corr_avg * (SL_CORR_AVG_LEN - 1) + |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1397 (SH_AV_delay - time_frame)) / SL_CORR_AVG_LEN; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1398 #define UNEXP_CORR_MAX 0.1 /* limit of unexpected correction between two frames (percentage) */ |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1399 #define UNEXP_CORR_WARN 1.0 /* warn limit of A-V lag (percentage) */ |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1400 time_frame += time_frame_corr_avg; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1401 // printf ("{%.3f - %.3f}\n", i - time_frame, frame_time + frame_time_corr_avg); |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1402 if (SH_AV_delay - time_frame < (frame_time + time_frame_corr_avg) * UNEXP_CORR_MAX && |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1403 SH_AV_delay - time_frame > (frame_time + time_frame_corr_avg) * -UNEXP_CORR_MAX) |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1404 time_frame = SH_AV_delay; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1405 else { |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1406 if (SH_AV_delay - time_frame > (frame_time + time_frame_corr_avg) * UNEXP_CORR_WARN || |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1407 SH_AV_delay - time_frame < (frame_time + time_frame_corr_avg) * -UNEXP_CORR_WARN) |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1408 printf ("WARNING: A-V SYNC LAG TOO LARGE: %.3f {%.3f - %.3f} (too little UNEXP_CORR_MAX?)\n", |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1409 SH_AV_delay - time_frame, SH_AV_delay, time_frame); |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1410 time_frame += (frame_time + time_frame_corr_avg) * ((SH_AV_delay > time_frame) ? |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1411 UNEXP_CORR_MAX : -UNEXP_CORR_MAX); |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1412 } |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1413 } /* /start dropframe */ |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1414 |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1415 } |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1416 |
780 | 1417 } else { |
2889
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1418 // NOSOUND: |
1124
0e95f30ffd4c
-frames and -benchmark options to make chl & gabucino happy
arpi_esp
parents:
1059
diff
changeset
|
1419 if( (time_frame<-3*frame_time || time_frame>3*frame_time) || benchmark) |
0e95f30ffd4c
-frames and -benchmark options to make chl & gabucino happy
arpi_esp
parents:
1059
diff
changeset
|
1420 time_frame=0; |
0e95f30ffd4c
-frames and -benchmark options to make chl & gabucino happy
arpi_esp
parents:
1059
diff
changeset
|
1421 |
780 | 1422 } |
798 | 1423 |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1424 // if(verbose>1)printf("sleep: %5.3f a:%6.3f v:%6.3f \n",time_frame,sh_audio->timer,sh_video->timer); |
1439 | 1425 |
1426 aq_sleep_time+=time_frame; | |
1709 | 1427 |
1428 #ifdef HAVE_NEW_GUI | |
1429 if(use_gui){ | |
1802 | 1430 EventHandling(); |
1709 | 1431 } |
1432 #endif | |
2705 | 1433 |
1434 if(!(vo_flags&256)){ // flag 256 means: libvo driver does its timing (dvb card) | |
2889
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1435 |
3015 | 1436 #ifdef HAVE_RTC |
2889
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1437 if(rtc_fd>=0){ |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1438 // -------- RTC ----------- |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1439 while (time_frame > 0.000) { |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1440 unsigned long long rtc_ts; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1441 if (read (rtc_fd, &rtc_ts, sizeof(rtc_ts)) <= 0) |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1442 perror ("read (rtc_fd)"); |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1443 time_frame-=GetRelativeTime(); |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1444 } |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1445 } else |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1446 #endif |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1447 { |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1448 // -------- USLEEP + SOFTSLEEP ----------- |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1449 float min=softsleep?0.021:0.005; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1450 while(time_frame>min){ |
746 | 1451 if(time_frame<=0.020) |
1439 | 1452 usec_sleep(0); // sleeps 1 clock tick (10ms)! |
746 | 1453 else |
2757 | 1454 usec_sleep(1000000*(time_frame-0.020)); |
746 | 1455 time_frame-=GetRelativeTime(); |
2889
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1456 } |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1457 if(softsleep){ |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1458 if(time_frame<0) printf("Warning! softsleep underflow!\n"); |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1459 while(time_frame>0) time_frame-=GetRelativeTime(); // burn the CPU |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1460 } |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1461 } |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1462 |
2705 | 1463 } |
117 | 1464 |
715 | 1465 current_module="flip_page"; |
1422 | 1466 #ifdef USE_LIBVO2 |
1467 if(blit_frame) vo2_flip(video_out,0); | |
1468 #else | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1498
diff
changeset
|
1469 video_out->check_events(); |
1962 | 1470 if(blit_frame){ |
1471 unsigned int t2=GetTimer(); | |
2889
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1472 |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1473 float j; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1474 #define FRAME_LAG_WARN 0.2 |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1475 j = ((float)t2 - lastframeout_ts) / 1000000; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1476 lastframeout_ts = GetTimer(); |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1477 if (j < frame_time + frame_time * -FRAME_LAG_WARN) |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1478 too_fast_frame_cnt++; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1479 /* printf ("PANIC: too fast frame (%.3f)!\n", j); */ |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1480 else if (j > frame_time + frame_time * FRAME_LAG_WARN) |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1481 too_slow_frame_cnt++; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1482 /* printf ("PANIC: too slow frame (%.3f)!\n", j); */ |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1483 |
1962 | 1484 video_out->flip_page(); |
1485 t2=GetTimer()-t2;vout_time_usage+=t2*0.000001f; | |
1486 } | |
1422 | 1487 #endif |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1488 // usec_sleep(50000); // test only! |
780 | 1489 |
715 | 1490 } |
780 | 1491 |
1492 current_module=NULL; | |
715 | 1493 |
1 | 1494 if(eof) break; |
220 | 1495 if(force_redraw){ |
1496 --force_redraw; | |
577 | 1497 if(!force_redraw) osd_function=OSD_PLAY; |
746 | 1498 continue; |
220 | 1499 } |
1 | 1500 |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1501 // printf("A:%6.1f V:%6.1f A-V:%7.3f frame=%5.2f \r",d_audio->pts,d_video->pts,d_audio->pts-d_video->pts,sh_audio->timer); |
1 | 1502 // fflush(stdout); |
1503 | |
1504 #if 1 | |
1505 /*================ A-V TIMESTAMP CORRECTION: =========================*/ | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1506 if(sh_audio){ |
780 | 1507 float a_pts=0; |
1508 float v_pts=0; | |
1509 | |
746 | 1510 // unplayed bytes in our and soundcard/dma buffer: |
955 | 1511 int delay_bytes=audio_out->get_delay()+sh_audio->a_buffer_len; |
746 | 1512 float delay=(float)delay_bytes/(float)sh_audio->o_bps; |
1513 | |
780 | 1514 if(pts_from_bps){ |
1498 | 1515 #if 1 |
1516 unsigned int samples=(sh_audio->audio.dwSampleSize)? | |
1517 ((ds_tell(d_audio)-sh_audio->a_in_buffer_len)/sh_audio->audio.dwSampleSize) : | |
1518 (d_audio->pack_no); // <- used for VBR audio | |
1519 a_pts=samples*(float)sh_audio->audio.dwScale/(float)sh_audio->audio.dwRate; | |
1520 #else | |
1481 | 1521 if(sh_audio->audio.dwSampleSize) |
1522 a_pts=(ds_tell(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->wf->nAvgBytesPerSec; | |
1523 else // VBR: | |
1524 a_pts=d_audio->pack_no*(float)sh_audio->audio.dwScale/(float)sh_audio->audio.dwRate; | |
1498 | 1525 #endif |
1526 // v_pts=d_video->pack_no*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; | |
1527 // printf("V_PTS: PTS: %8.3f BPS: %8.3f \n",d_video->pts,v_pts); | |
1528 delay_corrected=1; | |
780 | 1529 } else { |
1530 // PTS = (last timestamp) + (bytes after last timestamp)/(bytes per sec) | |
746 | 1531 a_pts=d_audio->pts; |
1498 | 1532 if(!delay_corrected) if(a_pts) delay_corrected=1; |
1478
6f9167f0fcca
'too slow' message is fixed - better detection now based on both drop_cnt and A-V sync
arpi
parents:
1467
diff
changeset
|
1533 //printf("*** %5.3f ***\n",a_pts); |
746 | 1534 a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; |
1456
8c57a5a3c645
printfs cleanup - moved to higher -v level or moved to stderr
arpi
parents:
1449
diff
changeset
|
1535 // v_pts=d_video->pts-frame_time; |
1498 | 1536 // v_pts=d_video->pts; |
780 | 1537 } |
1498 | 1538 v_pts=d_video->pts; |
746 | 1539 |
1567 | 1540 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); |
780 | 1541 |
398 | 1542 if(delay_corrected){ |
1478
6f9167f0fcca
'too slow' message is fixed - better detection now based on both drop_cnt and A-V sync
arpi
parents:
1467
diff
changeset
|
1543 float x; |
6f9167f0fcca
'too slow' message is fixed - better detection now based on both drop_cnt and A-V sync
arpi
parents:
1467
diff
changeset
|
1544 AV_delay=(a_pts-delay-audio_delay)-v_pts; |
6f9167f0fcca
'too slow' message is fixed - better detection now based on both drop_cnt and A-V sync
arpi
parents:
1467
diff
changeset
|
1545 x=AV_delay*0.1f; |
1 | 1546 if(x<-max_pts_correction) x=-max_pts_correction; else |
1547 if(x> max_pts_correction) x= max_pts_correction; | |
780 | 1548 if(default_max_pts_correction>=0) |
1549 max_pts_correction=default_max_pts_correction; | |
1550 else | |
1551 max_pts_correction=sh_video->frametime*0.10; // +-10% of time | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1552 sh_audio->timer+=x; c_total+=x; |
2353 | 1553 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", |
1498 | 1554 a_pts-audio_delay-delay,v_pts,AV_delay,c_total, |
1546 | 1555 (int)sh_video->num_frames,(int)sh_video->num_frames_decoded, |
1498 | 1556 (sh_video->timer>0.5)?(int)(100.0*video_time_usage/(double)sh_video->timer):0, |
1557 (sh_video->timer>0.5)?(int)(100.0*vout_time_usage/(double)sh_video->timer):0, | |
1558 (sh_video->timer>0.5)?(100.0*audio_time_usage/(double)sh_video->timer):0 | |
1559 ,drop_frame_cnt | |
1560 ,output_quality | |
2353 | 1561 ,cache_fill_status |
1 | 1562 ); |
1563 fflush(stdout); | |
1564 } | |
780 | 1565 |
1 | 1566 } else { |
1567 // No audio: | |
1420 | 1568 |
1448 | 1569 if(!quiet) |
2353 | 1570 mp_msg(MSGT_AVSYNC,MSGL_STATUS,"V:%6.1f %3d %2d%% %2d%% %4.1f%% %d %d %d%%\r",d_video->pts, |
1400 | 1571 (int)sh_video->num_frames, |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1572 (sh_video->timer>0.5)?(int)(100.0*video_time_usage/(double)sh_video->timer):0, |
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1573 (sh_video->timer>0.5)?(int)(100.0*vout_time_usage/(double)sh_video->timer):0, |
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1574 (sh_video->timer>0.5)?(100.0*audio_time_usage/(double)sh_video->timer):0 |
2353 | 1575 ,drop_frame_cnt |
1576 ,output_quality | |
1577 ,cache_fill_status | |
442 | 1578 ); |
1 | 1579 |
1580 fflush(stdout); | |
1420 | 1581 |
1 | 1582 } |
1583 #endif | |
1584 | |
1439 | 1585 /*Output quality adjustments:*/ |
1586 if(auto_quality>0){ | |
1587 #if 0 | |
1588 /*If we took a long time decoding this frame, downgrade the quality.*/ | |
1589 if(output_quality>0&& | |
1590 (video_time_usage-cvideo_base_vtime)*sh_video->timer>= | |
1591 (0.95*sh_video->timer-(vout_time_usage+audio_time_usage))* | |
1592 (sh_video->timer-cvideo_base_vframe-frame_correction)){ | |
1593 output_quality>>=1; | |
1567 | 1594 mp_msg(MSGT_AUTOQ,MSGL_DBG2,"Downgrading quality to %i.\n",output_quality); |
1439 | 1595 set_video_quality(sh_video,output_quality); |
1596 } else | |
1597 /*If we had plenty of extra time, upgrade the quality.*/ | |
1598 if(output_quality<auto_quality&& | |
1599 vdecode_time<0.5*frame_time&& | |
1600 (video_time_usage-cvideo_base_vtime)*sh_video->timer< | |
1601 (0.67*sh_video->timer-(vout_time_usage+audio_time_usage))* | |
1602 (sh_video->timer-cvideo_base_vframe-frame_correction)){ | |
1603 output_quality++; | |
1567 | 1604 mp_msg(MSGT_AUTOQ,MSGL_DBG2,"Upgrading quality to %i.\n",output_quality); |
1439 | 1605 set_video_quality(sh_video,output_quality); |
1606 } | |
1607 #else | |
1496 | 1608 // float total=0.000001f * (GetTimer()-aq_total_time); |
1439 | 1609 // if(output_quality<auto_quality && aq_sleep_time>0.05f*total) |
1610 if(output_quality<auto_quality && aq_sleep_time>0) | |
1611 ++output_quality; | |
1612 else | |
1613 // if(output_quality>0 && aq_sleep_time<-0.05f*total) | |
1614 if(output_quality>1 && aq_sleep_time<0) | |
1615 --output_quality; | |
1616 else | |
1617 if(output_quality>0 && aq_sleep_time<-0.050f) // 50ms | |
1618 output_quality=0; | |
1619 // printf("total: %8.6f sleep: %8.6f q: %d\n",(0.000001f*aq_total_time),aq_sleep_time,output_quality); | |
1620 set_video_quality(sh_video,output_quality); | |
1621 #endif | |
1622 } | |
1623 | |
1422 | 1624 #ifdef USE_OSD |
220 | 1625 if(osd_visible){ |
1504
f4f686aed404
modified mplayer.c to rewert to PLAY after rewinding after 1 sec
atlka
parents:
1501
diff
changeset
|
1626 if (!--osd_visible){ vo_osd_progbar_type=-1; // disable |
f4f686aed404
modified mplayer.c to rewert to PLAY after rewinding after 1 sec
atlka
parents:
1501
diff
changeset
|
1627 if (osd_function != OSD_PAUSE) |
f4f686aed404
modified mplayer.c to rewert to PLAY after rewinding after 1 sec
atlka
parents:
1501
diff
changeset
|
1628 osd_function = OSD_PLAY; |
f4f686aed404
modified mplayer.c to rewert to PLAY after rewinding after 1 sec
atlka
parents:
1501
diff
changeset
|
1629 } |
220 | 1630 } |
1422 | 1631 #endif |
371 | 1632 |
1633 if(osd_function==OSD_PAUSE){ | |
1817
35d88a433502
fixed interaction between commandlien and fileselector
arpi
parents:
1816
diff
changeset
|
1634 int gui_pause_flag=0; // gany! |
1567 | 1635 mp_msg(MSGT_CPLAYER,MSGL_STATUS,"\n------ PAUSED -------\r");fflush(stdout); |
1793
ba11d77c587a
gui status maintaining - now pause from console works, and gui display is in sync with osd
arpi
parents:
1792
diff
changeset
|
1636 #ifdef HAVE_NEW_GUI |
ba11d77c587a
gui status maintaining - now pause from console works, and gui display is in sync with osd
arpi
parents:
1792
diff
changeset
|
1637 if(use_gui) mplShMem->Playing=2; |
ba11d77c587a
gui status maintaining - now pause from console works, and gui display is in sync with osd
arpi
parents:
1792
diff
changeset
|
1638 #endif |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1639 if (audio_out && sh_audio) |
1156 | 1640 audio_out->pause(); // pause audio, keep data if possible |
723 | 1641 while( |
371 | 1642 #ifdef HAVE_LIRC |
723 | 1643 lirc_mp_getinput()<=0 && |
371 | 1644 #endif |
1467 | 1645 (use_stdin || getch2(20)<=0) && mplayer_get_key()<=0){ |
1422 | 1646 #ifndef USE_LIBVO2 |
723 | 1647 video_out->check_events(); |
1422 | 1648 #endif |
1709 | 1649 #ifdef HAVE_NEW_GUI |
1650 if(use_gui){ | |
1802 | 1651 EventHandling(); |
1817
35d88a433502
fixed interaction between commandlien and fileselector
arpi
parents:
1816
diff
changeset
|
1652 if(mplShMem->Playing!=2 || (rel_seek_secs || abs_seek_pos)) |
35d88a433502
fixed interaction between commandlien and fileselector
arpi
parents:
1816
diff
changeset
|
1653 { gui_pause_flag=1; break; } // end of pause or seek |
1709 | 1654 } |
1655 #endif | |
1467 | 1656 if(use_stdin) usec_sleep(1000); // do not eat the CPU |
723 | 1657 } |
1658 osd_function=OSD_PLAY; | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1659 if (audio_out && sh_audio) |
1156 | 1660 audio_out->resume(); // resume audio |
2889
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1661 (void)GetRelativeTime(); // keep TF around FT in next cycle |
1793
ba11d77c587a
gui status maintaining - now pause from console works, and gui display is in sync with osd
arpi
parents:
1792
diff
changeset
|
1662 #ifdef HAVE_NEW_GUI |
1817
35d88a433502
fixed interaction between commandlien and fileselector
arpi
parents:
1816
diff
changeset
|
1663 if(use_gui && !gui_pause_flag) mplShMem->Playing=1; // play from keyboard |
1793
ba11d77c587a
gui status maintaining - now pause from console works, and gui display is in sync with osd
arpi
parents:
1792
diff
changeset
|
1664 #endif |
371 | 1665 } |
1666 | |
746 | 1667 |
1668 if(!force_redraw) break; | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1669 } // while(sh_video->timer<sh_audio->timer || force_redraw) |
1 | 1670 |
2436 | 1671 // skip some seconds... added by fly |
1672 | |
1673 if(step_sec>0) { | |
1674 osd_function=OSD_FFW; | |
1675 rel_seek_secs+=step_sec; | |
1676 } | |
1 | 1677 |
1678 //================= Keyboard events, SEEKing ==================== | |
1679 | |
723 | 1680 { int c; |
1 | 1681 while( |
1682 #ifdef HAVE_LIRC | |
1683 (c=lirc_mp_getinput())>0 || | |
1684 #endif | |
1467 | 1685 (!use_stdin && (c=getch2(0))>0) || (c=mplayer_get_key())>0) switch(c){ |
1 | 1686 // seek 10 sec |
1687 case KEY_RIGHT: | |
220 | 1688 osd_function=OSD_FFW; |
1 | 1689 rel_seek_secs+=10;break; |
1690 case KEY_LEFT: | |
220 | 1691 osd_function=OSD_REW; |
1 | 1692 rel_seek_secs-=10;break; |
1693 // seek 1 min | |
1694 case KEY_UP: | |
220 | 1695 osd_function=OSD_FFW; |
1 | 1696 rel_seek_secs+=60;break; |
1697 case KEY_DOWN: | |
220 | 1698 osd_function=OSD_REW; |
1 | 1699 rel_seek_secs-=60;break; |
651 | 1700 // seek 10 min |
1701 case KEY_PAGE_UP: | |
1702 rel_seek_secs+=600;break; | |
1703 case KEY_PAGE_DOWN: | |
1704 rel_seek_secs-=600;break; | |
1 | 1705 // delay correction: |
1706 case '+': | |
746 | 1707 audio_delay+=0.1; // increase audio buffer delay |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1708 if(sh_audio) sh_audio->timer-=0.1; |
1 | 1709 break; |
1710 case '-': | |
746 | 1711 audio_delay-=0.1; // decrease audio buffer delay |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1712 if(sh_audio) sh_audio->timer+=0.1; |
1 | 1713 break; |
1714 // quit | |
1715 case KEY_ESC: // ESC | |
1639 | 1716 case 'q': exit_player(MSGTR_Exit_quit); |
2647
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
1717 case '>': |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
1718 if(curr_filename>=num_filenames-1) |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
1719 break; |
1 | 1720 case KEY_ENTER: // ESC |
1639 | 1721 eof=1; // jump to next file |
1722 break; | |
2647
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
1723 case '<': |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
1724 if(curr_filename < 1) |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
1725 break; |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
1726 curr_filename-=2; |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
1727 eof=1; |
679d3b21bedb
-playlist option patch by Panagiotis Issaris <takis@lumumba.luc.ac.be>
arpi
parents:
2567
diff
changeset
|
1728 break; |
36 | 1729 case 'g': grab_frames=2;break; |
1 | 1730 // pause |
1731 case 'p': | |
1732 case ' ': | |
220 | 1733 osd_function=OSD_PAUSE; |
371 | 1734 break; |
1735 case 'o': // toggle OSD | |
1736 osd_level=(osd_level+1)%3; | |
1 | 1737 break; |
939 | 1738 case 'z': |
1739 sub_delay -= 0.1; | |
1740 break; | |
1741 case 'x': | |
1742 sub_delay += 0.1; | |
1743 break; | |
1626 | 1744 case '9': |
1745 case '0': | |
459 | 1746 case '*': |
555 | 1747 case '/': { |
1626 | 1748 if(c=='*' || c=='0'){ |
1881
d75b24bda7ce
Applied fix for mixercontrol w/alsa ossemu by Christian Ohm.
atmos4
parents:
1863
diff
changeset
|
1749 mixer_incvolume(); |
555 | 1750 } else { |
1881
d75b24bda7ce
Applied fix for mixercontrol w/alsa ossemu by Christian Ohm.
atmos4
parents:
1863
diff
changeset
|
1751 mixer_decvolume(); |
555 | 1752 } |
1753 | |
1422 | 1754 #ifdef USE_OSD |
555 | 1755 if(osd_level){ |
1756 osd_visible=sh_video->fps; // 1 sec | |
1757 vo_osd_progbar_type=OSD_VOLUME; | |
1881
d75b24bda7ce
Applied fix for mixercontrol w/alsa ossemu by Christian Ohm.
atmos4
parents:
1863
diff
changeset
|
1758 vo_osd_progbar_value=(mixer_getbothvolume()*256.0)/100.0; |
1852 | 1759 //printf("volume: %d\n",vo_osd_progbar_value); |
555 | 1760 } |
1422 | 1761 #endif |
555 | 1762 } |
1763 break; | |
459 | 1764 case 'm': |
510 | 1765 mixer_usemaster=!mixer_usemaster; |
459 | 1766 break; |
1429 | 1767 |
1627
eeaee1632340
absolute seek debugging with 1-8 keys (disabled by default)
arpi
parents:
1626
diff
changeset
|
1768 #if 0 // change to 1 for absolute seeking tests |
eeaee1632340
absolute seek debugging with 1-8 keys (disabled by default)
arpi
parents:
1626
diff
changeset
|
1769 case '1': |
eeaee1632340
absolute seek debugging with 1-8 keys (disabled by default)
arpi
parents:
1626
diff
changeset
|
1770 case '2': |
eeaee1632340
absolute seek debugging with 1-8 keys (disabled by default)
arpi
parents:
1626
diff
changeset
|
1771 case '3': |
eeaee1632340
absolute seek debugging with 1-8 keys (disabled by default)
arpi
parents:
1626
diff
changeset
|
1772 case '4': |
eeaee1632340
absolute seek debugging with 1-8 keys (disabled by default)
arpi
parents:
1626
diff
changeset
|
1773 case '5': |
eeaee1632340
absolute seek debugging with 1-8 keys (disabled by default)
arpi
parents:
1626
diff
changeset
|
1774 case '6': |
eeaee1632340
absolute seek debugging with 1-8 keys (disabled by default)
arpi
parents:
1626
diff
changeset
|
1775 case '7': |
eeaee1632340
absolute seek debugging with 1-8 keys (disabled by default)
arpi
parents:
1626
diff
changeset
|
1776 case '8': |
eeaee1632340
absolute seek debugging with 1-8 keys (disabled by default)
arpi
parents:
1626
diff
changeset
|
1777 rel_seek_secs=0.99*(float)(c-'1')/7.0; |
eeaee1632340
absolute seek debugging with 1-8 keys (disabled by default)
arpi
parents:
1626
diff
changeset
|
1778 abs_seek_pos=3; |
eeaee1632340
absolute seek debugging with 1-8 keys (disabled by default)
arpi
parents:
1626
diff
changeset
|
1779 printf("ABS seek to %5.3f \n",rel_seek_secs); |
eeaee1632340
absolute seek debugging with 1-8 keys (disabled by default)
arpi
parents:
1626
diff
changeset
|
1780 break; |
eeaee1632340
absolute seek debugging with 1-8 keys (disabled by default)
arpi
parents:
1626
diff
changeset
|
1781 #else |
1429 | 1782 // Contrast: |
1783 case '1': | |
1784 case '2': | |
1785 if(c=='2'){ | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1498
diff
changeset
|
1786 if ( ++v_cont > 100 ) v_cont = 100; |
1429 | 1787 } else { |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1498
diff
changeset
|
1788 if ( --v_cont < 0 ) v_cont = 0; |
1429 | 1789 } |
1790 if(set_video_colors(sh_video,"Contrast",v_cont)){ | |
1791 #ifdef USE_OSD | |
1792 if(osd_level){ | |
1793 osd_visible=sh_video->fps; // 1 sec | |
1794 vo_osd_progbar_type=OSD_CONTRAST; | |
1726 | 1795 vo_osd_progbar_value=((v_cont)<<8)/100; |
1429 | 1796 } |
1797 #endif | |
1798 } | |
1799 break; | |
1800 | |
1801 // Brightness: | |
1802 case '3': | |
1803 case '4': | |
1804 if(c=='4'){ | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1498
diff
changeset
|
1805 if ( ++v_bright > 100 ) v_bright = 100; |
1429 | 1806 } else { |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1498
diff
changeset
|
1807 if ( --v_bright < 0 ) v_bright = 0; |
1429 | 1808 } |
1809 if(set_video_colors(sh_video,"Brightness",v_bright)){ | |
1810 #ifdef USE_OSD | |
1811 if(osd_level){ | |
1812 osd_visible=sh_video->fps; // 1 sec | |
1813 vo_osd_progbar_type=OSD_BRIGHTNESS; | |
1726 | 1814 vo_osd_progbar_value=((v_bright)<<8)/100; |
1429 | 1815 } |
1816 #endif | |
1817 } | |
1818 break; | |
1819 | |
1820 // Hue: | |
1821 case '5': | |
1822 case '6': | |
1823 if(c=='6'){ | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1498
diff
changeset
|
1824 if ( ++v_hue > 100 ) v_hue = 100; |
1429 | 1825 } else { |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1498
diff
changeset
|
1826 if ( --v_hue < 0 ) v_hue = 0; |
1429 | 1827 } |
1828 if(set_video_colors(sh_video,"Hue",v_hue)){ | |
1829 #ifdef USE_OSD | |
1830 if(osd_level){ | |
1831 osd_visible=sh_video->fps; // 1 sec | |
1832 vo_osd_progbar_type=OSD_HUE; | |
1726 | 1833 vo_osd_progbar_value=((v_hue)<<8)/100; |
1429 | 1834 } |
1835 #endif | |
1836 } | |
1837 break; | |
1838 | |
1839 // Saturation: | |
1840 case '7': | |
1841 case '8': | |
1842 if(c=='8'){ | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1498
diff
changeset
|
1843 if ( ++v_saturation > 100 ) v_saturation = 100; |
1429 | 1844 } else { |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1498
diff
changeset
|
1845 if ( --v_saturation < 0 ) v_saturation = 0; |
1429 | 1846 } |
1847 if(set_video_colors(sh_video,"Saturation",v_saturation)){ | |
1848 #ifdef USE_OSD | |
1849 if(osd_level){ | |
1850 osd_visible=sh_video->fps; // 1 sec | |
1851 vo_osd_progbar_type=OSD_SATURATION; | |
1726 | 1852 vo_osd_progbar_value=((v_saturation)<<8)/100; |
1429 | 1853 } |
1854 #endif | |
1855 } | |
1856 break; | |
1627
eeaee1632340
absolute seek debugging with 1-8 keys (disabled by default)
arpi
parents:
1626
diff
changeset
|
1857 #endif |
1429 | 1858 |
715 | 1859 case 'd': |
798 | 1860 frame_dropping=(frame_dropping+1)%3; |
1567 | 1861 mp_msg(MSGT_CPLAYER,MSGL_V,"== drop: %d == \n",frame_dropping); |
715 | 1862 break; |
2941
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
1863 |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
1864 #ifdef USE_TV |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
1865 case 'h': |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
1866 if (tv_param_on == 1) |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
1867 tv_step_channel(tv_handler, TV_CHANNEL_HIGHER); |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
1868 break; |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
1869 case 'l': |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
1870 if (tv_param_on == 1) |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
1871 tv_step_channel(tv_handler, TV_CHANNEL_LOWER); |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
1872 break; |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
1873 case 'n': |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
1874 if (tv_param_on == 1) |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
1875 tv_step_norm(tv_handler); |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
1876 break; |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
1877 case 'b': |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
1878 if (tv_param_on == 1) |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
1879 tv_step_chanlist(tv_handler); |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
1880 break; |
60c1b7c0ea21
added support for norm=,chanlist=,channel= and also on-the-fly channel chaning with keys
alex
parents:
2897
diff
changeset
|
1881 #endif |
1 | 1882 } |
1406 | 1883 } // keyboard event handler |
1884 | |
651 | 1885 if (seek_to_sec) { |
937 | 1886 int a,b; float d; |
1887 | |
1888 if (sscanf(seek_to_sec, "%d:%d:%f", &a,&b,&d)==3) | |
1889 rel_seek_secs += 3600*a +60*b +d ; | |
1890 else if (sscanf(seek_to_sec, "%d:%f", &a, &d)==2) | |
1891 rel_seek_secs += 60*a +d; | |
1892 else if (sscanf(seek_to_sec, "%f", &d)==1) | |
1893 rel_seek_secs += d; | |
1894 | |
1895 seek_to_sec = NULL; | |
651 | 1896 } |
937 | 1897 |
2365 | 1898 /* Looping. */ |
1899 if(eof==5 && loop_times>-1) { | |
1900 | |
1901 if(loop_times!=0) { | |
1902 | |
1903 loop_times--; | |
1904 | |
1905 if(loop_times==0) | |
1906 loop_times=-1; | |
1907 | |
1908 } | |
1909 | |
1910 eof=0; | |
1911 abs_seek_pos=1; | |
1912 | |
1913 mp_msg(MSGT_CPLAYER,MSGL_V,"loop_times = %d, eof = 0\n", loop_times); | |
1914 | |
1915 } | |
1916 | |
1627
eeaee1632340
absolute seek debugging with 1-8 keys (disabled by default)
arpi
parents:
1626
diff
changeset
|
1917 if(rel_seek_secs || abs_seek_pos){ |
1466 | 1918 current_module="seek"; |
1627
eeaee1632340
absolute seek debugging with 1-8 keys (disabled by default)
arpi
parents:
1626
diff
changeset
|
1919 if(demux_seek(demuxer,rel_seek_secs,abs_seek_pos)){ |
1405 | 1920 // success: |
889 | 1921 |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1922 if(sh_audio){ |
1459
622c504f36ef
printf stuff moved seek.c->mplayer.c, resetting drop_frame_cnt after seek
arpi
parents:
1457
diff
changeset
|
1923 if(verbose){ |
622c504f36ef
printf stuff moved seek.c->mplayer.c, resetting drop_frame_cnt after seek
arpi
parents:
1457
diff
changeset
|
1924 float a_pts=d_audio->pts; |
622c504f36ef
printf stuff moved seek.c->mplayer.c, resetting drop_frame_cnt after seek
arpi
parents:
1457
diff
changeset
|
1925 a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; |
1567 | 1926 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); |
1459
622c504f36ef
printf stuff moved seek.c->mplayer.c, resetting drop_frame_cnt after seek
arpi
parents:
1457
diff
changeset
|
1927 } |
1567 | 1928 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); |
1459
622c504f36ef
printf stuff moved seek.c->mplayer.c, resetting drop_frame_cnt after seek
arpi
parents:
1457
diff
changeset
|
1929 } else { |
1567 | 1930 mp_msg(MSGT_AVSYNC,MSGL_STATUS,"A: --- V:%6.1f \r",d_video->pts); |
1459
622c504f36ef
printf stuff moved seek.c->mplayer.c, resetting drop_frame_cnt after seek
arpi
parents:
1457
diff
changeset
|
1931 } |
622c504f36ef
printf stuff moved seek.c->mplayer.c, resetting drop_frame_cnt after seek
arpi
parents:
1457
diff
changeset
|
1932 fflush(stdout); |
622c504f36ef
printf stuff moved seek.c->mplayer.c, resetting drop_frame_cnt after seek
arpi
parents:
1457
diff
changeset
|
1933 |
622c504f36ef
printf stuff moved seek.c->mplayer.c, resetting drop_frame_cnt after seek
arpi
parents:
1457
diff
changeset
|
1934 if(sh_audio){ |
1466 | 1935 current_module="seek_audio_reset"; |
1334 | 1936 audio_out->reset(); // stop audio, throwing away buffered data |
1 | 1937 } |
1938 | |
1422 | 1939 #ifdef USE_OSD |
1334 | 1940 // Set OSD: |
1941 if(osd_level){ | |
1942 int len=((demuxer->movi_end-demuxer->movi_start)>>8); | |
1727 | 1943 if (len>0){ |
1944 osd_visible=sh_video->fps; // 1 sec | |
1945 vo_osd_progbar_type=0; | |
1946 vo_osd_progbar_value=(demuxer->filepos-demuxer->movi_start)/len; | |
1947 } | |
1334 | 1948 } |
1422 | 1949 #endif |
1405 | 1950 |
1420 | 1951 c_total=0; |
1 | 1952 max_pts_correction=0.1; |
1504
f4f686aed404
modified mplayer.c to rewert to PLAY after rewinding after 1 sec
atlka
parents:
1501
diff
changeset
|
1953 osd_visible=sh_video->fps; // to rewert to PLAY pointer after 1 sec |
1 | 1954 audio_time_usage=0; video_time_usage=0; vout_time_usage=0; |
1459
622c504f36ef
printf stuff moved seek.c->mplayer.c, resetting drop_frame_cnt after seek
arpi
parents:
1457
diff
changeset
|
1955 drop_frame_cnt=0; |
2889
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1956 too_slow_frame_cnt=0; |
0d8553a47d1a
RTC support, softsleep and optional new timing code by Dap
arpi
parents:
2880
diff
changeset
|
1957 too_fast_frame_cnt=0; |
1 | 1958 } |
1405 | 1959 rel_seek_secs=0; |
1627
eeaee1632340
absolute seek debugging with 1-8 keys (disabled by default)
arpi
parents:
1626
diff
changeset
|
1960 abs_seek_pos=0; |
1466 | 1961 current_module=NULL; |
1962 } | |
1963 | |
1723
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1709
diff
changeset
|
1964 #ifdef HAVE_NEW_GUI |
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1709
diff
changeset
|
1965 if(use_gui){ |
1735 | 1966 if(demuxer->file_format==DEMUXER_TYPE_AVI && sh_video->video.dwLength>2){ |
1967 // get pos from frame number / total frames | |
1968 mplShMem->Position=(float)d_video->pack_no*100.0f/sh_video->video.dwLength; | |
1969 } else { | |
1970 // get pos from file position / filesize | |
1971 int len=((demuxer->movi_end-demuxer->movi_start)); | |
1972 int pos=(demuxer->file_format==DEMUXER_TYPE_AVI)?demuxer->filepos:d_video->pos; | |
1973 mplShMem->Position=(len<=0)?0:((float)(pos-demuxer->movi_start) / len * 100.0f); | |
1974 } | |
1729 | 1975 mplShMem->TimeSec=d_video->pts; |
1772 | 1976 if(mplShMem->Playing==0) break; // STOP |
1977 if(mplShMem->Playing==2) osd_function=OSD_PAUSE; | |
1852 | 1978 if ( mplShMem->VolumeChanged ) |
1848 | 1979 { |
1852 | 1980 mixer_setvolume( mplShMem->Volume,mplShMem->Volume ); |
1981 mplShMem->VolumeChanged=0; | |
1982 #ifdef USE_OSD | |
1983 if ( osd_level ) | |
1984 { | |
1985 osd_visible=sh_video->fps; // 1 sec | |
1986 vo_osd_progbar_type=OSD_VOLUME; | |
1987 vo_osd_progbar_value=( ( mplShMem->Volume ) * 256.0 ) / 100.0; | |
1988 } | |
1848 | 1989 #endif |
1852 | 1990 } |
1991 mplShMem->Volume=(float)mixer_getbothvolume(); | |
3054 | 1992 #ifdef USE_DVDREAD |
1993 if ( stream->type == STREAMTYPE_DVD ) | |
1994 { | |
1995 dvd_priv_t * dvdp = stream->priv; | |
1996 mplShMem->DVD.current_chapter=dvdp->cur_cell + 1; | |
1997 } | |
1998 #endif | |
1723
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1709
diff
changeset
|
1999 } |
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1709
diff
changeset
|
2000 #endif |
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1709
diff
changeset
|
2001 |
5e4214a7540e
GUI stuff. now seeking works, and xmga renders to video window
arpi
parents:
1709
diff
changeset
|
2002 |
220 | 2003 //================= Update OSD ==================== |
1422 | 2004 #ifdef USE_OSD |
1421 | 2005 if(osd_level>=2){ |
780 | 2006 int pts=d_video->pts; |
595 | 2007 if(pts==osd_last_pts-1) ++pts; else osd_last_pts=pts; |
371 | 2008 vo_osd_text=osd_text_buffer; |
595 | 2009 sprintf(vo_osd_text,"%c %02d:%02d:%02d",osd_function,pts/3600,(pts/60)%60,pts%60); |
371 | 2010 } else { |
2011 vo_osd_text=NULL; | |
2012 } | |
220 | 2013 // for(i=1;i<=11;i++) osd_text_buffer[10+i]=i;osd_text_buffer[10+i]=0; |
371 | 2014 // vo_osd_text=osd_text_buffer; |
1422 | 2015 #endif |
458
49b0474b2e26
I really hope that you will learn how to use cvs, sooner or later...
arpi_esp
parents:
452
diff
changeset
|
2016 |
1422 | 2017 #ifdef USE_SUB |
258 | 2018 // find sub |
1204 | 2019 if(subtitles && d_video->pts>0){ |
1762 | 2020 float pts=d_video->pts; |
398 | 2021 if(sub_fps==0) sub_fps=sh_video->fps; |
482 | 2022 current_module="find_sub"; |
780 | 2023 find_sub(subtitles,sub_uses_time?(100*(pts+sub_delay)):((pts+sub_delay)*sub_fps)); // FIXME! frame counter... |
482 | 2024 current_module=NULL; |
258 | 2025 } |
1422 | 2026 #endif |
554 | 2027 |
2028 // DVD sub: | |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
2029 if(vo_spudec){ |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
2030 unsigned char* packet=NULL; |
557 | 2031 int len=ds_get_packet_sub(d_dvdsub,&packet); |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
2032 current_module="spudec"; |
557 | 2033 if(len>=2){ |
2034 int len2; | |
2035 len2=(packet[0]<<8)+packet[1]; | |
1567 | 2036 mp_msg(MSGT_CPLAYER,MSGL_V,"\rDVD sub: %d / %d \n",len,len2); |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
2037 spudec_assemble(vo_spudec,packet,len,100*d_video->pts); |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
2038 } else { |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
2039 spudec_heartbeat(vo_spudec,100*d_video->pts); |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
2040 if(len>=0) |
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
2041 mp_msg(MSGT_CPLAYER,MSGL_V,"invalid dvd sub\n"); |
554 | 2042 } |
3034
24d3dca4e813
DVD sub patch by Kim Minh Kaplan <kmkaplan@selfoffice.com>
arpi
parents:
3015
diff
changeset
|
2043 current_module=NULL; |
554 | 2044 } |
2045 | |
1421 | 2046 } // while(!eof) |
1 | 2047 |
1567 | 2048 mp_msg(MSGT_GLOBAL,MSGL_V,"EOF code: %d \n",eof); |
1 | 2049 |
1639 | 2050 } |
2051 | |
1641
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
2052 |
1790 | 2053 if(curr_filename+1<num_filenames || use_gui){ |
1639 | 2054 // partial uninit: |
2055 | |
1857 | 2056 uninit_player(INITED_ALL-(INITED_GUI+INITED_LIRC)); |
1641
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
2057 |
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
2058 } |
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
2059 |
1808 | 2060 goto_next_file: // don't jump here after ao/vo/getch initialization! |
2061 | |
1797 | 2062 #ifdef HAVE_NEW_GUI |
2063 if(use_gui) | |
2064 { | |
2065 mplStop(); | |
2066 } | |
2067 #endif | |
2068 | |
1790 | 2069 if(use_gui || ++curr_filename<num_filenames){ |
1641
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
2070 |
1654 | 2071 current_module="uninit_vcodec"; |
2072 if(sh_video) uninit_video(sh_video); | |
2073 | |
1641
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
2074 current_module="free_demuxer"; |
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
2075 if(demuxer) free_demuxer(demuxer); |
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
2076 |
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
2077 current_module="free_stream"; |
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
2078 if(stream) free_stream(stream); |
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
2079 |
1639 | 2080 video_out=NULL; |
2081 audio_out=NULL; | |
2854 | 2082 |
1641
b7dae998505c
free stream/demuxer. continue playback with next file if error found
arpi
parents:
1639
diff
changeset
|
2083 goto play_next_file; |
1639 | 2084 } |
2085 | |
1582 | 2086 exit_player(MSGTR_Exit_eof); |
1639 | 2087 |
109 | 2088 return 1; |
2089 } |