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