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