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