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