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