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