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