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