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