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