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