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