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