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