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