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