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