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