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