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