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