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