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