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