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