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