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