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