Mercurial > mplayer.hg
annotate mplayer.c @ 1407:2e23a033d6f8
acm convert message verbose1->2
author | arpi |
---|---|
date | Sun, 29 Jul 2001 00:38:56 +0000 |
parents | bf9fcd656ee9 |
children | eda16e490ae7 |
rev | line source |
---|---|
1237 | 1 // AVI & MPEG Player v0.18 (C) 2000-2001. by A'rpi/ESP-team |
1 | 2 |
3 #include <stdio.h> | |
4 #include <stdlib.h> | |
109 | 5 #include <string.h> |
1 | 6 |
7 #include <signal.h> | |
8 | |
9 #include <sys/ioctl.h> | |
10 #include <unistd.h> | |
748
717e4677d9ce
stime compile bug fixed. and GUI_MSG macro defined.
pontscho
parents:
746
diff
changeset
|
11 #include <time.h> |
1 | 12 #include <sys/mman.h> |
13 | |
14 #include <sys/types.h> | |
15 #include <sys/wait.h> | |
16 #include <sys/time.h> | |
17 #include <sys/stat.h> | |
18 #include <fcntl.h> | |
19 | |
20 #include "version.h" | |
21 #include "config.h" | |
22 | |
1289 | 23 #ifdef __FreeBSD__ |
1177
f2516027a346
FreeBSD patch by Vladimir Kushnir <vkushnir@Alfacom.net>
arpi_esp
parents:
1156
diff
changeset
|
24 #include <sys/cdrio.h> |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
25 #endif |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
26 |
1289 | 27 #ifdef sun |
28 #define DEFAULT_CDROM_DEVICE "/vol/dev/aliases/cdrom0" | |
29 #else | |
30 #define DEFAULT_CDROM_DEVICE "/dev/cdrom" | |
31 #endif | |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
32 |
147 | 33 #include "cfgparser.h" |
151 | 34 #include "cfg-mplayer-def.h" |
147 | 35 |
258 | 36 #include "subreader.h" |
37 | |
36 | 38 #include "libvo/video_out.h" |
220 | 39 #include "libvo/sub.h" |
36 | 40 |
955 | 41 #include "libao2/audio_out.h" |
42 | |
1 | 43 #include "libmpeg2/mpeg2.h" |
44 #include "libmpeg2/mpeg2_internal.h" | |
45 | |
46 #include "loader.h" | |
47 #include "wine/avifmt.h" | |
48 | |
303 | 49 #include "codec-cfg.h" |
175 | 50 |
492 | 51 #include "dvdauth.h" |
560
28ae99036574
Separated dvdsub code to be able to work with it easier
lgb
parents:
557
diff
changeset
|
52 #include "spudec.h" |
492 | 53 |
1 | 54 extern char* win32_codec_name; // must be set before calling DrvOpen() !!! |
55 | |
56 #include "linux/getch2.h" | |
57 #include "linux/keycodes.h" | |
58 #include "linux/timer.h" | |
59 #include "linux/shmem.h" | |
60 | |
61 #ifdef HAVE_LIRC | |
62 #include "lirc_mp.h" | |
63 #endif | |
64 | |
65 #include "help_mp.h" | |
66 | |
842
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
67 #ifdef STREAMING |
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
68 #include "url.h" |
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
69 #include "network.h" |
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
70 static URL_t* url; |
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
71 #endif |
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
72 |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
73 |
1 | 74 #define DEBUG if(0) |
723 | 75 #ifdef HAVE_GUI |
748
717e4677d9ce
stime compile bug fixed. and GUI_MSG macro defined.
pontscho
parents:
746
diff
changeset
|
76 int nogui=1; |
723 | 77 #endif |
362 | 78 int verbose=0; |
1 | 79 |
398 | 80 #define ABS(x) (((x)>=0)?(x):(-(x))) |
81 | |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
578
diff
changeset
|
82 void find_sub(subtitle* subtitles,int key); |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
578
diff
changeset
|
83 |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
84 static int |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
85 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
|
86 { |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
87 #if 1 |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
88 struct timespec ts; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
89 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
|
90 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
|
91 return nanosleep(&ts, NULL); |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
92 #else |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
93 return usleep(usec_delay); |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
94 #endif |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
95 } |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
96 |
258 | 97 //**************************************************************************// |
98 // Config file | |
99 //**************************************************************************// | |
100 | |
153 | 101 static int cfg_inc_verbose(struct config *conf){ |
102 ++verbose; | |
103 return 0; | |
104 } | |
105 | |
162 | 106 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
|
107 return parse_config_file(conf, filename); |
162 | 108 } |
109 | |
178 | 110 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
|
111 char *homedir; |
49b0474b2e26
I really hope that you will learn how to use cvs, sooner or later...
arpi_esp
parents:
452
diff
changeset
|
112 char *buff; |
49b0474b2e26
I really hope that you will learn how to use cvs, sooner or later...
arpi_esp
parents:
452
diff
changeset
|
113 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
|
114 int len; |
178 | 115 |
458
49b0474b2e26
I really hope that you will learn how to use cvs, sooner or later...
arpi_esp
parents:
452
diff
changeset
|
116 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
|
117 return NULL; |
49b0474b2e26
I really hope that you will learn how to use cvs, sooner or later...
arpi_esp
parents:
452
diff
changeset
|
118 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
|
119 if (filename == NULL) { |
49b0474b2e26
I really hope that you will learn how to use cvs, sooner or later...
arpi_esp
parents:
452
diff
changeset
|
120 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
|
121 return NULL; |
49b0474b2e26
I really hope that you will learn how to use cvs, sooner or later...
arpi_esp
parents:
452
diff
changeset
|
122 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
|
123 } else { |
49b0474b2e26
I really hope that you will learn how to use cvs, sooner or later...
arpi_esp
parents:
452
diff
changeset
|
124 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
|
125 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
|
126 return NULL; |
49b0474b2e26
I really hope that you will learn how to use cvs, sooner or later...
arpi_esp
parents:
452
diff
changeset
|
127 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
|
128 } |
49b0474b2e26
I really hope that you will learn how to use cvs, sooner or later...
arpi_esp
parents:
452
diff
changeset
|
129 return buff; |
178 | 130 } |
131 | |
1 | 132 //**************************************************************************// |
442 | 133 //**************************************************************************// |
134 // Input media streaming & demultiplexer: | |
135 //**************************************************************************// | |
136 | |
1289 | 137 static int max_framesize=0; |
138 | |
578 | 139 #include "stream.h" |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
578
diff
changeset
|
140 #include "demuxer.h" |
442 | 141 |
142 #include "stheader.h" | |
1 | 143 |
442 | 144 char* encode_name=NULL; |
145 char* encode_index_name=NULL; | |
146 int encode_bitrate=0; | |
291 | 147 |
1015 | 148 extern int asf_packetsize; // for seeking |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
578
diff
changeset
|
149 |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
578
diff
changeset
|
150 extern float avi_audio_pts; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
578
diff
changeset
|
151 extern float avi_video_pts; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
578
diff
changeset
|
152 extern float avi_video_ftime; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
578
diff
changeset
|
153 extern int skip_video_frames; |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
578
diff
changeset
|
154 |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
578
diff
changeset
|
155 void read_avi_header(demuxer_t *demuxer,int index_mode); |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
578
diff
changeset
|
156 demux_stream_t* demux_avi_select_stream(demuxer_t *demux,unsigned int id); |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
578
diff
changeset
|
157 |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
578
diff
changeset
|
158 int asf_check_header(demuxer_t *demuxer); |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
578
diff
changeset
|
159 int read_asf_header(demuxer_t *demuxer); |
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
578
diff
changeset
|
160 |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
161 demuxer_t* demux_open(stream_t *stream,int file_format); |
1405 | 162 int demux_seek(demuxer_t *demuxer,float rel_seek_secs,int flags); |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
163 |
1 | 164 // 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
|
165 #include "parse_es.h" |
1 | 166 |
1015 | 167 extern int num_elementary_packets100; // for MPEG-ES fileformat detection |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
578
diff
changeset
|
168 extern int num_elementary_packets101; |
1338
345585097137
mpeg PES steram support (only 1E0 & 1C0 packets, no 1BA/1BB headers)
arpi
parents:
1334
diff
changeset
|
169 extern int num_elementary_packetsPES; |
587
8511095c5283
stage#1 completed: c files no more included from mplayer.c
arpi_esp
parents:
578
diff
changeset
|
170 |
1015 | 171 extern picture_t *picture; // exported from libmpeg2/decode.c |
442 | 172 |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
173 int frameratecode2framerate[16] = { |
780 | 174 0, |
175 // Official mpeg1/2 framerates: | |
176 24000*10000/1001, 24*10000,25*10000, 30000*10000/1001, 30*10000,50*10000,60000*10000/1001, 60*10000, | |
177 // libmpeg3's "Unofficial economy rates": | |
178 1*10000,5*10000,10*10000,12*10000,15*10000,0,0 | |
112 | 179 }; |
180 | |
111 | 181 //**************************************************************************// |
1 | 182 //**************************************************************************// |
183 | |
112 | 184 // Common FIFO functions, and keyboard/event FIFO code |
185 #include "fifo.c" | |
186 | |
1 | 187 //**************************************************************************// |
188 | |
189 static vo_functions_t *video_out=NULL; | |
1289 | 190 static ao_functions_t *audio_out=NULL; |
1 | 191 |
1400 | 192 float c_total=0; |
193 | |
1291 | 194 double video_time_usage=0; |
195 double vout_time_usage=0; | |
1289 | 196 static double audio_time_usage=0; |
197 static int total_time_usage_start=0; | |
198 static int benchmark=0; | |
1124
0e95f30ffd4c
-frames and -benchmark options to make chl & gabucino happy
arpi_esp
parents:
1059
diff
changeset
|
199 |
1 | 200 static int play_in_bg=0; |
201 | |
606 | 202 extern void avi_fixate(); |
203 | |
723 | 204 #ifdef HAVE_GUI |
205 #include "../Gui/mplayer/psignal.h" | |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
206 #define GUI_MSG(x) if ( !nogui ) { mplSendMessage( x ); usec_sleep( 10000 ); } |
748
717e4677d9ce
stime compile bug fixed. and GUI_MSG macro defined.
pontscho
parents:
746
diff
changeset
|
207 #else |
717e4677d9ce
stime compile bug fixed. and GUI_MSG macro defined.
pontscho
parents:
746
diff
changeset
|
208 #define GUI_MSG(x) |
723 | 209 #endif |
210 | |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
211 // options: |
1015 | 212 int osd_level=2; |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
213 int divx_quality=0; |
937 | 214 char *seek_to_sec=NULL; |
1 | 215 int seek_to_byte=0; |
442 | 216 int has_audio=1; |
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
|
217 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
|
218 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
|
219 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
|
220 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
|
221 |
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
|
222 // 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
|
223 // 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
|
224 // yes, people without working c++ compiler can disable it - A'rpi |
626 | 225 #ifdef USE_DIRECTSHOW |
226 int allow_dshow=1; | |
227 #else | |
228 int allow_dshow=0; | |
229 #endif | |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
230 |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
231 //#ifdef ALSA_TIMER |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
232 //int alsa=1; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
233 //#else |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
234 //int alsa=0; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
235 //#endif |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
236 |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
237 // streaming: |
1 | 238 int audio_id=-1; |
239 int video_id=-1; | |
552 | 240 int dvdsub_id=-1; |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
241 int vcd_track=0; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
242 char *stream_dump_name=NULL; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
243 int stream_dump_type=0; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
244 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
|
245 int force_ni=0; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
246 |
780 | 247 float default_max_pts_correction=-1;//0.01f; |
1400 | 248 float max_pts_correction=0;//default_max_pts_correction; |
1 | 249 #ifdef AVI_SYNC_BPS |
250 int pts_from_bps=1; | |
251 #else | |
252 int pts_from_bps=0; | |
253 #endif | |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
254 |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
255 float force_fps=0; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
256 int force_srate=0; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
257 float audio_delay=0; |
798 | 258 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
|
259 int play_n_frames=-1; |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
260 |
1 | 261 // screen info: |
262 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
|
263 char* audio_driver=NULL; |
1 | 264 int fullscreen=0; |
208
ae0f909ccc7c
Adds code to deal with vidmode selection. -- mgraffam
mgraffam
parents:
190
diff
changeset
|
265 int vidmode=0; |
337 | 266 int softzoom=0; |
778
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
267 int flip=-1; |
337 | 268 int screen_size_x=0;//SCREEN_SIZE_X; |
269 int screen_size_y=0;//SCREEN_SIZE_Y; | |
1 | 270 int screen_size_xy=0; |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
271 |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
272 // sub: |
212 | 273 char *font_name=NULL; |
215 | 274 float font_factor=0.75; |
258 | 275 char *sub_name=NULL; |
276 float sub_delay=0; | |
277 float sub_fps=0; | |
510 | 278 int sub_auto = 1; |
1255
94f2853ec6f4
-dsp option removed, displaying help text (-ao oss:dsp_path)
alex
parents:
1250
diff
changeset
|
279 /*DSP!!char *dsp=NULL;*/ |
723 | 280 |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
281 float rel_seek_secs=0; |
1400 | 282 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
|
283 |
1183 | 284 extern char *vo_subdevice; |
285 extern char *ao_subdevice; | |
1156 | 286 |
287 void exit_player(char* how){ | |
288 total_time_usage_start=GetTimer()-total_time_usage_start; | |
289 | |
290 #ifdef HAVE_GUI | |
291 if ( !nogui ) | |
292 { | |
293 if ( how != NULL ) | |
294 { | |
295 if ( !strcmp( how,"Quit" ) ) mplSendMessage( mplEndOfFile ); | |
296 if ( !strcmp( how,"End of file" ) ) mplSendMessage( mplEndOfFile ); | |
297 if ( !strcmp( how,"audio_init" ) ) mplSendMessage( mplAudioError ); | |
298 } | |
299 else mplSendMessage( mplUnknowError ); | |
300 } | |
301 #endif | |
302 | |
303 if(how) printf("\nExiting... (%s)\n",how); | |
304 if(verbose) printf("max framesize was %d bytes\n",max_framesize); | |
305 if(benchmark){ | |
306 double tot=video_time_usage+vout_time_usage+audio_time_usage; | |
307 double total_time_usage=(float)total_time_usage_start*0.000001; | |
308 printf("BENCHMARKs: V:%8.3fs VO:%8.3fs A:%8.3fs Sys:%8.3fs = %8.3fs\n", | |
309 video_time_usage,vout_time_usage,audio_time_usage, | |
310 total_time_usage-tot,total_time_usage); | |
311 if(total_time_usage>0.0) | |
312 printf("BENCHMARK%%: V:%8.4f%% VO:%8.4f%% A:%8.4f%% Sys:%8.4f%% = %8.4f%%\n", | |
313 100.0*video_time_usage/total_time_usage, | |
314 100.0*vout_time_usage/total_time_usage, | |
315 100.0*audio_time_usage/total_time_usage, | |
316 100.0*(total_time_usage-tot)/total_time_usage, | |
317 100.0); | |
318 } | |
319 // restore terminal: | |
320 #ifdef HAVE_GUI | |
321 if ( nogui ) | |
322 #endif | |
323 getch2_disable(); | |
324 if(video_out) video_out->uninit(); | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
325 if(audio_out) audio_out->uninit(); |
1156 | 326 if(encode_name) avi_fixate(); |
327 #ifdef HAVE_LIRC | |
328 #ifdef HAVE_GUI | |
329 if ( nogui ) | |
330 #endif | |
331 lirc_mp_cleanup(); | |
332 #endif | |
333 exit(1); | |
334 } | |
335 | |
1400 | 336 char* current_module=NULL; // for debugging |
1156 | 337 |
338 void exit_sighandler(int x){ | |
339 static int sig_count=0; | |
340 ++sig_count; | |
341 if(sig_count==2) exit(1); | |
342 if(sig_count>2){ | |
343 // can't stop :( | |
344 kill(getpid(),SIGKILL); | |
345 } | |
1217 | 346 fprintf(stderr,"\nMPlayer interrupted by signal %d in module: %s \n",x, |
1156 | 347 current_module?current_module:"unknown" |
348 ); | |
349 #ifdef HAVE_GUI | |
350 if ( !nogui ) | |
351 { | |
352 mplShMem->items.error.signal=x; | |
353 strcpy( mplShMem->items.error.module,current_module?current_module:"unknown" ); | |
354 } | |
355 #endif | |
356 exit_player(NULL); | |
357 } | |
358 | |
359 extern int vcd_get_track_end(int fd,int track); | |
360 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
|
361 |
b12e1817bcc2
some cleanup - fixed warnings, removed old stuff, moved audio resync to dec_audio
arpi
parents:
1302
diff
changeset
|
362 // dec_audio.c: |
b12e1817bcc2
some cleanup - fixed warnings, removed old stuff, moved audio resync to dec_audio
arpi
parents:
1302
diff
changeset
|
363 extern int init_audio(sh_audio_t *sh_audio); |
1156 | 364 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
|
365 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
|
366 extern void skip_audio_frame(sh_audio_t *sh_audio); |
1156 | 367 |
1327
b12e1817bcc2
some cleanup - fixed warnings, removed old stuff, moved audio resync to dec_audio
arpi
parents:
1302
diff
changeset
|
368 // dec_video.c: |
b12e1817bcc2
some cleanup - fixed warnings, removed old stuff, moved audio resync to dec_audio
arpi
parents:
1302
diff
changeset
|
369 extern int init_video(sh_video_t *sh_video); |
b12e1817bcc2
some cleanup - fixed warnings, removed old stuff, moved audio resync to dec_audio
arpi
parents:
1302
diff
changeset
|
370 extern int decode_video(vo_functions_t *video_out,sh_video_t *sh_video,unsigned char *start,int in_size,int drop_frame); |
1156 | 371 |
459 | 372 #include "mixer.h" |
147 | 373 #include "cfg-mplayer.h" |
1 | 374 |
723 | 375 void parse_cfgfiles( void ) |
376 { | |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
377 char *conffile; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
378 int conffile_fd; |
147 | 379 if (parse_config_file(conf, "/etc/mplayer.conf") < 0) |
380 exit(1); | |
178 | 381 if ((conffile = get_path("")) == NULL) { |
147 | 382 printf("Can't find HOME dir\n"); |
383 } else { | |
178 | 384 mkdir(conffile, 0777); |
385 free(conffile); | |
386 if ((conffile = get_path("config")) == NULL) { | |
387 printf("get_path(\"config\") sziiiivas\n"); | |
388 } else { | |
389 if ((conffile_fd = open(conffile, O_CREAT | O_EXCL | O_WRONLY, 0666)) != -1) { | |
390 printf("Creating config file: %s\n", conffile); | |
391 write(conffile_fd, default_config, strlen(default_config)); | |
392 close(conffile_fd); | |
393 } | |
394 if (parse_config_file(conf, conffile) < 0) | |
395 exit(1); | |
396 free(conffile); | |
151 | 397 } |
1 | 398 } |
399 } | |
400 | |
723 | 401 #ifndef HAVE_GUI |
402 int main(int argc,char* argv[], char *envp[]){ | |
403 #else | |
404 int mplayer(int argc,char* argv[], char *envp[]){ | |
405 #endif | |
406 | |
1289 | 407 static subtitle* subtitles=NULL; |
408 | |
409 static demuxer_t *demuxer=NULL; | |
410 | |
411 static demux_stream_t *d_audio=NULL; | |
412 static demux_stream_t *d_video=NULL; | |
413 static demux_stream_t *d_dvdsub=NULL; | |
414 | |
415 static sh_audio_t *sh_audio=NULL; | |
416 static sh_video_t *sh_video=NULL; | |
417 | |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
418 char* filename=NULL; //"MI2-Trailer.avi"; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
419 stream_t* stream=NULL; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
420 int file_format=DEMUXER_TYPE_UNKNOWN; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
421 // |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
422 int delay_corrected=1; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
423 #ifdef VCD_CACHE |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
424 int vcd_cache_size=128; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
425 #endif |
1177
f2516027a346
FreeBSD patch by Vladimir Kushnir <vkushnir@Alfacom.net>
arpi_esp
parents:
1156
diff
changeset
|
426 #ifdef __FreeBSD__ |
f2516027a346
FreeBSD patch by Vladimir Kushnir <vkushnir@Alfacom.net>
arpi_esp
parents:
1156
diff
changeset
|
427 int bsize = VCD_SECTOR_SIZE; |
f2516027a346
FreeBSD patch by Vladimir Kushnir <vkushnir@Alfacom.net>
arpi_esp
parents:
1156
diff
changeset
|
428 #endif |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
429 char* title="MPlayer"; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
430 |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
431 // movie info: |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
432 int out_fmt=0; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
433 |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
434 int osd_visible=100; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
435 int osd_function=OSD_PLAY; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
436 int osd_last_pts=-303; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
437 |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
438 //float a_frame=0; // Audio |
1014
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
439 |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
440 float rel_seek_secs=0; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
441 |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
442 int i; |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
443 int f; // filedes |
e01dc1a88edf
fixed punkso's mess... local variables moved back to main()
arpi_esp
parents:
1009
diff
changeset
|
444 |
723 | 445 printf("%s",banner_text); |
446 | |
447 #ifdef HAVE_GUI | |
448 if ( nogui ) | |
449 { | |
450 #endif | |
751 | 451 parse_cfgfiles(); |
723 | 452 if (parse_command_line(conf, argc, argv, envp, &filename) < 0) exit(1); |
453 | |
454 // Many users forget to include command line in bugreports... | |
455 if(verbose){ | |
456 printf("CommandLine:"); | |
457 for(i=1;i<argc;i++)printf(" '%s'",argv[i]); | |
458 printf("\n"); | |
459 } | |
460 | |
461 if(video_driver && strcmp(video_driver,"help")==0){ | |
462 printf("Available video output drivers:\n"); | |
463 i=0; | |
464 while (video_out_drivers[i]) { | |
465 const vo_info_t *info = video_out_drivers[i++]->get_info (); | |
466 printf("\t%s\t%s\n", info->short_name, info->name); | |
467 } | |
468 printf("\n"); | |
469 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
|
470 } |
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
|
471 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
|
472 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
|
473 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
|
474 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
|
475 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
|
476 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
|
477 } |
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
|
478 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
|
479 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
|
480 } |
723 | 481 #ifdef HAVE_GUI |
482 } | |
483 #endif | |
1 | 484 |
442 | 485 if(!filename){ |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
486 if(vcd_track) filename=DEFAULT_CDROM_DEVICE; |
442 | 487 else { |
488 printf("%s",help_text); exit(0); | |
489 } | |
490 } | |
491 | |
492 // check video_out driver name: | |
1183 | 493 if (video_driver) |
494 if ((i = strcspn(video_driver, ":")) > 0) | |
495 { | |
496 size_t i2 = strlen(video_driver); | |
497 | |
1190
98f732a23cb4
egy hulye kis checking kimaradt az strcspn fv. jovoltabol
al3x
parents:
1183
diff
changeset
|
498 if (video_driver[i] == ':') |
98f732a23cb4
egy hulye kis checking kimaradt az strcspn fv. jovoltabol
al3x
parents:
1183
diff
changeset
|
499 { |
98f732a23cb4
egy hulye kis checking kimaradt az strcspn fv. jovoltabol
al3x
parents:
1183
diff
changeset
|
500 vo_subdevice = malloc(i2-i); |
98f732a23cb4
egy hulye kis checking kimaradt az strcspn fv. jovoltabol
al3x
parents:
1183
diff
changeset
|
501 if (vo_subdevice != NULL) |
98f732a23cb4
egy hulye kis checking kimaradt az strcspn fv. jovoltabol
al3x
parents:
1183
diff
changeset
|
502 strncpy(vo_subdevice, (char *)(video_driver+i+1), i2-i); |
98f732a23cb4
egy hulye kis checking kimaradt az strcspn fv. jovoltabol
al3x
parents:
1183
diff
changeset
|
503 video_driver[i] = '\0'; |
98f732a23cb4
egy hulye kis checking kimaradt az strcspn fv. jovoltabol
al3x
parents:
1183
diff
changeset
|
504 } |
1183 | 505 // printf("video_driver: %s, subdevice: %s\n", video_driver, vo_subdevice); |
506 } | |
442 | 507 if(!video_driver) |
508 video_out=video_out_drivers[0]; | |
509 else | |
510 for (i=0; video_out_drivers[i] != NULL; i++){ | |
511 const vo_info_t *info = video_out_drivers[i]->get_info (); | |
512 if(strcmp(info->short_name,video_driver) == 0){ | |
513 video_out = video_out_drivers[i];break; | |
514 } | |
515 } | |
516 if(!video_out){ | |
1217 | 517 fprintf(stderr,"Invalid video output driver name: %s\nUse '-vo help' to get a list of available video drivers.\n",video_driver); |
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
|
518 return 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
|
519 } |
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
|
520 |
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 // check audio_out driver name: |
1183 | 522 if (audio_driver) |
523 if ((i = strcspn(audio_driver, ":")) > 0) | |
524 { | |
525 size_t i2 = strlen(audio_driver); | |
526 | |
1190
98f732a23cb4
egy hulye kis checking kimaradt az strcspn fv. jovoltabol
al3x
parents:
1183
diff
changeset
|
527 if (audio_driver[i] == ':') |
98f732a23cb4
egy hulye kis checking kimaradt az strcspn fv. jovoltabol
al3x
parents:
1183
diff
changeset
|
528 { |
98f732a23cb4
egy hulye kis checking kimaradt az strcspn fv. jovoltabol
al3x
parents:
1183
diff
changeset
|
529 ao_subdevice = malloc(i2-i); |
98f732a23cb4
egy hulye kis checking kimaradt az strcspn fv. jovoltabol
al3x
parents:
1183
diff
changeset
|
530 if (ao_subdevice != NULL) |
98f732a23cb4
egy hulye kis checking kimaradt az strcspn fv. jovoltabol
al3x
parents:
1183
diff
changeset
|
531 strncpy(ao_subdevice, (char *)(audio_driver+i+1), i2-i); |
98f732a23cb4
egy hulye kis checking kimaradt az strcspn fv. jovoltabol
al3x
parents:
1183
diff
changeset
|
532 audio_driver[i] = '\0'; |
98f732a23cb4
egy hulye kis checking kimaradt az strcspn fv. jovoltabol
al3x
parents:
1183
diff
changeset
|
533 } |
1183 | 534 // printf("audio_driver: %s, subdevice: %s\n", audio_driver, ao_subdevice); |
535 } | |
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
|
536 if(!audio_driver) |
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
|
537 audio_out=audio_out_drivers[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
|
538 else |
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
|
539 for (i=0; audio_out_drivers[i] != NULL; 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
|
540 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
|
541 if(strcmp(info->short_name,audio_driver) == 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
|
542 audio_out = audio_out_drivers[i];break; |
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
|
543 } |
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
|
544 } |
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
|
545 if (!audio_out){ |
1217 | 546 fprintf(stderr,"Invalid audio output driver name: %s\nUse '-ao help' to get a list of available audio drivers.\n",audio_driver); |
442 | 547 return 0; |
548 } | |
1255
94f2853ec6f4
-dsp option removed, displaying help text (-ao oss:dsp_path)
alex
parents:
1250
diff
changeset
|
549 /*DSP!! if(dsp) audio_out->control(AOCONTROL_SET_DEVICE,(int)dsp);*/ |
955 | 550 |
442 | 551 // check codec.conf |
552 if(!parse_codec_cfg(get_path("codecs.conf"))){ | |
1353 | 553 if(!parse_codec_cfg(DATADIR"/codecs.conf")){ |
554 printf("(copy/link DOCS/codecs.conf to ~/.mplayer/codecs.conf)\n"); | |
748
717e4677d9ce
stime compile bug fixed. and GUI_MSG macro defined.
pontscho
parents:
746
diff
changeset
|
555 GUI_MSG( mplCodecConfNotFound ) |
442 | 556 exit(1); |
1353 | 557 } |
442 | 558 } |
559 | |
212 | 560 // check font |
561 if(font_name){ | |
337 | 562 vo_font=read_font_desc(font_name,font_factor,verbose>1); |
1217 | 563 if(!vo_font) fprintf(stderr,"Can't load font: %s\n",font_name); |
220 | 564 } else { |
565 // try default: | |
337 | 566 vo_font=read_font_desc(get_path("font/font.desc"),font_factor,verbose>1); |
1353 | 567 if(!vo_font) |
568 vo_font=read_font_desc(DATADIR"/font/font.desc",font_factor,verbose>1); | |
212 | 569 } |
570 | |
258 | 571 // check .sub |
572 if(sub_name){ | |
573 subtitles=sub_read_file(sub_name); | |
1217 | 574 if(!subtitles) fprintf(stderr,"Can't load subtitles: %s\n",sub_name); |
258 | 575 } else { |
510 | 576 if ( sub_auto ) |
577 { | |
578 // auto load sub file ... | |
892 | 579 subtitles=sub_read_file( sub_filename( get_path("sub/"), filename ) ); |
580 } | |
581 if ( subtitles == NULL ) subtitles=sub_read_file(get_path("default.sub")); // try default: | |
258 | 582 } |
583 | |
584 | |
1 | 585 if(vcd_track){ |
586 //============ Open VideoCD track ============== | |
598 | 587 int ret,ret2; |
1 | 588 f=open(filename,O_RDONLY); |
1217 | 589 if(f<0){ fprintf(stderr,"CD-ROM Device '%s' not found!\n",filename);return 1; } |
1 | 590 vcd_read_toc(f); |
598 | 591 ret2=vcd_get_track_end(f,vcd_track); |
1296 | 592 if(ret2<0){ fprintf(stderr,"Error selecting VCD track! (get)\n");return 1;} |
578 | 593 ret=vcd_seek_to_track(f,vcd_track); |
1296 | 594 if(ret<0){ fprintf(stderr,"Error selecting VCD track! (seek)\n");return 1;} |
578 | 595 seek_to_byte+=ret; |
598 | 596 if(verbose) printf("VCD start byte position: 0x%X end: 0x%X\n",seek_to_byte,ret2); |
1 | 597 #ifdef VCD_CACHE |
598 vcd_cache_init(vcd_cache_size); | |
599 #endif | |
1177
f2516027a346
FreeBSD patch by Vladimir Kushnir <vkushnir@Alfacom.net>
arpi_esp
parents:
1156
diff
changeset
|
600 #ifdef __FreeBSD__ |
f2516027a346
FreeBSD patch by Vladimir Kushnir <vkushnir@Alfacom.net>
arpi_esp
parents:
1156
diff
changeset
|
601 if (ioctl (f, CDRIOCSETBLOCKSIZE, &bsize) == -1) { |
f2516027a346
FreeBSD patch by Vladimir Kushnir <vkushnir@Alfacom.net>
arpi_esp
parents:
1156
diff
changeset
|
602 perror ( "Error in CDRIOCSETBLOCKSIZE"); |
f2516027a346
FreeBSD patch by Vladimir Kushnir <vkushnir@Alfacom.net>
arpi_esp
parents:
1156
diff
changeset
|
603 } |
f2516027a346
FreeBSD patch by Vladimir Kushnir <vkushnir@Alfacom.net>
arpi_esp
parents:
1156
diff
changeset
|
604 #endif |
598 | 605 stream=new_stream(f,STREAMTYPE_VCD); |
606 stream->start_pos=ret; | |
607 stream->end_pos=ret2; | |
1 | 608 } else { |
609 //============ Open plain FILE ============ | |
598 | 610 int len; |
692 | 611 if(!strcmp(filename,"-")){ |
612 // read from stdin | |
613 printf("Reading from stdin...\n"); | |
614 f=0; // 0=stdin | |
615 stream=new_stream(f,STREAMTYPE_STREAM); | |
616 } else { | |
842
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
617 #ifdef STREAMING |
906 | 618 url = url_new(filename); |
842
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
619 if(url==NULL) { |
906 | 620 // failed to create a new URL, so it's not an URL (or a malformed URL) |
842
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
621 #endif |
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
622 f=open(filename,O_RDONLY); |
1217 | 623 if(f<0){ fprintf(stderr,"File not found: '%s'\n",filename);return 1; } |
842
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
624 len=lseek(f,0,SEEK_END); lseek(f,0,SEEK_SET); |
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
625 stream=new_stream(f,STREAMTYPE_FILE); |
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
626 stream->end_pos=len; |
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
627 #ifdef STREAMING |
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
628 } else { |
1002
f035bd1f2749
Streaming function return the file_format and should be tested.
bertrand
parents:
984
diff
changeset
|
629 file_format=autodetectProtocol( url, &f ); |
f035bd1f2749
Streaming function return the file_format and should be tested.
bertrand
parents:
984
diff
changeset
|
630 if( file_format==DEMUXER_TYPE_UNKNOWN ) { |
1217 | 631 fprintf(stderr,"Unable to open URL: %s\n", filename); |
906 | 632 url_free(url); |
842
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
633 return 1; |
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
634 } else { |
1002
f035bd1f2749
Streaming function return the file_format and should be tested.
bertrand
parents:
984
diff
changeset
|
635 f=streaming_start( &url, f, file_format ); |
1217 | 636 if(f<0){ fprintf(stderr,"Unable to open URL: %s\n", url->url); return 1; } |
842
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
637 printf("Connected to server: %s\n", url->hostname ); |
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
638 } |
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
639 stream=new_stream(f,STREAMTYPE_STREAM); |
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
640 } |
80698f8030b9
Now Check if the 'filename' is an URL and connect to the server.
bertrand
parents:
815
diff
changeset
|
641 #endif |
692 | 642 } |
598 | 643 } |
644 | |
492 | 645 #ifdef HAVE_LIBCSS |
546 | 646 if (dvdimportkey) { |
647 if (dvd_import_key(dvdimportkey)) { | |
648 fprintf(stderr,"Error processing DVD KEY.\n"); | |
748
717e4677d9ce
stime compile bug fixed. and GUI_MSG macro defined.
pontscho
parents:
746
diff
changeset
|
649 GUI_MSG( mplErrorDVDKeyProcess ) |
546 | 650 exit(1); |
651 } | |
652 printf("DVD command line requested key is stored for descrambling.\n"); | |
653 } | |
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
|
654 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
|
655 // 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
|
656 if (dvd_auth(dvd_auth_device,filename)) { |
748
717e4677d9ce
stime compile bug fixed. and GUI_MSG macro defined.
pontscho
parents:
746
diff
changeset
|
657 GUI_MSG( mplErrorDVDAuth ) |
723 | 658 exit(0); |
659 } | |
492 | 660 printf("DVD auth sequence seems to be OK.\n"); |
661 } | |
662 #endif | |
1 | 663 |
664 //============ Open & Sync stream and detect file format =============== | |
665 | |
442 | 666 if(!has_audio) audio_id=-2; // do NOT read audio packets... |
1 | 667 |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
668 demuxer=demux_open(stream,file_format); |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
669 if(!demuxer) exit(1); // ERROR |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
670 |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
671 file_format=demuxer->file_format; |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
672 |
1 | 673 d_audio=demuxer->audio; |
674 d_video=demuxer->video; | |
554 | 675 d_dvdsub=demuxer->sub; |
1 | 676 |
792 | 677 // DUMP STREAMS: |
678 if(stream_dump_type){ | |
679 FILE *f; | |
680 demux_stream_t *ds=NULL; | |
681 // select stream to dump | |
682 switch(stream_dump_type){ | |
683 case 1: ds=d_audio;break; | |
684 case 2: ds=d_video;break; | |
685 case 3: ds=d_dvdsub;break; | |
686 } | |
687 if(!ds){ | |
1217 | 688 fprintf(stderr,"dump: FATAL: selected stream missing!\n"); |
792 | 689 exit(1); |
690 } | |
691 // disable other streams: | |
692 if(d_audio && d_audio!=ds) {ds_free_packs(d_audio); d_audio->id=-2; } | |
693 if(d_video && d_video!=ds) {ds_free_packs(d_video); d_video->id=-2; } | |
694 if(d_dvdsub && d_dvdsub!=ds) {ds_free_packs(d_dvdsub); d_dvdsub->id=-2; } | |
695 // let's dump it! | |
696 f=fopen(stream_dump_name?stream_dump_name:"stream.dump","wb"); | |
1217 | 697 if(!f){ fprintf(stderr,"Can't open dump file!!!\n");exit(1); } |
792 | 698 while(!ds->eof){ |
699 unsigned char* start; | |
700 int in_size=ds_get_packet(ds,&start); | |
1246
7f69c1dd1e91
-dumpvideo stores frame size for avi/asf video frames (for ffmpeg testing)
arpi
parents:
1237
diff
changeset
|
701 if( (file_format==DEMUXER_TYPE_AVI || file_format==DEMUXER_TYPE_ASF) |
7f69c1dd1e91
-dumpvideo stores frame size for avi/asf video frames (for ffmpeg testing)
arpi
parents:
1237
diff
changeset
|
702 && stream_dump_type==2) fwrite(&in_size,1,4,f); |
792 | 703 if(in_size>0) fwrite(start,in_size,1,f); |
704 } | |
705 fclose(f); | |
706 printf("core dumped :)\n"); | |
707 exit(1); | |
708 } | |
709 | |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
710 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
|
711 sh_video=d_video->sh; |
792 | 712 |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
713 if(sh_video){ |
1 | 714 |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
715 if(!video_read_properties(sh_video)) exit(1); // couldn't read header? |
1 | 716 |
1375
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
717 printf("[V] filefmt:%d fourcc:0x%X size:%dx%d fps:%5.2f ftime:=%6.4f\n", |
1183 | 718 file_format,sh_video->format, sh_video->disp_w,sh_video->disp_h, |
398 | 719 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
|
720 ); |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
721 |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
722 if(!sh_video->fps && !force_fps){ |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
723 fprintf(stderr,"FPS not specified (or invalid) in the header! Use the -fps option!\n"); |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
724 exit(1); |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
725 } |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
726 |
dbcb5b5e1fae
file-format detection stuff moved out from mplayer.c to demuxer.c and dec_video.c
arpi
parents:
1369
diff
changeset
|
727 } |
398 | 728 |
1 | 729 fflush(stdout); |
730 | |
778
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
731 if(!sh_video){ |
1217 | 732 fprintf(stderr,"Sorry, no video stream... it's unplayable yet\n"); |
778
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
733 exit(1); |
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
734 } |
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
735 |
303 | 736 //================== Init AUDIO (codec) ========================== |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
737 if(sh_audio){ |
303 | 738 // Go through the codec.conf and find the best codec... |
626 | 739 sh_audio->codec=NULL; |
1302 | 740 if(audio_family!=-1) printf("Trying to force audio codec driver family %d ...\n",audio_family); |
626 | 741 while(1){ |
742 sh_audio->codec=find_codec(sh_audio->format,NULL,sh_audio->codec,1); | |
743 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
|
744 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
|
745 sh_audio->codec=NULL; /* re-search */ |
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
|
746 printf("Can't find audio codec for forced driver family, fallback to other drivers.\n"); |
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
|
747 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
|
748 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
|
749 } |
626 | 750 printf("Can't find codec for audio format 0x%X !\n",sh_audio->format); |
919 | 751 printf("*** Try to upgrade %s from DOCS/codecs.conf\n",get_path("codecs.conf")); |
752 printf("*** If it's still not OK, then read DOCS/CODECS!\n"); | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
753 sh_audio=NULL; |
626 | 754 break; |
755 } | |
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
|
756 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
|
757 else if(audio_family!=-1 && sh_audio->codec->driver!=audio_family) continue; |
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
|
758 printf("%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 | 759 break; |
303 | 760 } |
1 | 761 } |
762 | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
763 if(sh_audio){ |
303 | 764 if(verbose) printf("Initializing audio codec...\n"); |
442 | 765 if(!init_audio(sh_audio)){ |
303 | 766 printf("Couldn't initialize audio codec! -> nosound\n"); |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
767 sh_audio=0; |
303 | 768 } else { |
758 | 769 printf("AUDIO: srate=%d chans=%d bps=%d sfmt=0x%X ratio: %d->%d\n",sh_audio->samplerate,sh_audio->channels,sh_audio->samplesize, |
770 sh_audio->sample_format,sh_audio->i_bps,sh_audio->o_bps); | |
303 | 771 } |
175 | 772 } |
773 | |
303 | 774 //================== Init VIDEO (codec & libvo) ========================== |
775 | |
776 // Go through the codec.conf and find the best codec... | |
626 | 777 sh_video->codec=NULL; |
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
|
778 if(video_family!=-1) printf("Trying to force video codec driver family %d ...\n",video_family); |
626 | 779 while(1){ |
780 sh_video->codec=find_codec(sh_video->format, | |
781 sh_video->bih?((unsigned int*) &sh_video->bih->biCompression):NULL,sh_video->codec,0); | |
782 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
|
783 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
|
784 sh_video->codec=NULL; /* re-search */ |
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
|
785 printf("Can't find video codec for forced driver family, fallback to other drivers.\n"); |
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
|
786 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
|
787 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
|
788 } |
303 | 789 printf("Can't find codec for video format 0x%X !\n",sh_video->format); |
919 | 790 printf("*** Try to upgrade %s from DOCS/codecs.conf\n",get_path("codecs.conf")); |
791 printf("*** If it's still not OK, then read DOCS/CODECS!\n"); | |
723 | 792 #ifdef HAVE_GUI |
793 if ( !nogui ) | |
794 { | |
795 mplShMem->items.videodata.format=sh_video->format; | |
796 mplSendMessage( mplCantFindCodecForVideoFormat ); | |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
797 usec_sleep( 10000 ); |
723 | 798 } |
799 #endif | |
303 | 800 exit(1); |
626 | 801 } |
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
|
802 // is next line needed anymore? - atmos :: |
626 | 803 if(!allow_dshow && sh_video->codec->driver==4) 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
|
804 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
|
805 else if(video_family!=-1 && sh_video->codec->driver!=video_family) continue; |
626 | 806 break; |
303 | 807 } |
808 | |
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
|
809 printf("%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 | 810 |
811 for(i=0;i<CODECS_MAX_OUTFMT;i++){ | |
487 | 812 int ret; |
303 | 813 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
|
814 if(out_fmt==0xFFFFFFFF) continue; |
487 | 815 ret=video_out->query_format(out_fmt); |
1183 | 816 if(verbose) printf("vo_debug: query(%s) returned 0x%X\n",vo_format_name(out_fmt),ret); |
487 | 817 if(ret) break; |
303 | 818 } |
819 if(i>=CODECS_MAX_OUTFMT){ | |
1217 | 820 fprintf(stderr,"Sorry, selected video_out device is incompatible with this codec.\n"); |
748
717e4677d9ce
stime compile bug fixed. and GUI_MSG macro defined.
pontscho
parents:
746
diff
changeset
|
821 GUI_MSG( mplIncompatibleVideoOutDevice ) |
303 | 822 exit(1); |
823 } | |
824 sh_video->outfmtidx=i; | |
825 | |
778
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
826 if(flip==-1){ |
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
827 // autodetect flipping |
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
828 flip=0; |
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
829 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
|
830 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
|
831 flip=1; |
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
832 } |
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
833 |
1183 | 834 if(verbose) printf("vo_debug1: out_fmt=%s\n",vo_format_name(out_fmt)); |
487 | 835 |
1291 | 836 if(!init_video(sh_video)){ |
837 fprintf(stderr,"FATAL: Couldn't initialize video codec :(\n"); | |
748
717e4677d9ce
stime compile bug fixed. and GUI_MSG macro defined.
pontscho
parents:
746
diff
changeset
|
838 GUI_MSG( mplUnknowError ) |
723 | 839 exit(1); |
1 | 840 } |
841 | |
842 // ================== Init output files for encoding =============== | |
843 if(encode_name){ | |
844 // encode file!!! | |
845 FILE *encode_file=fopen(encode_name,"rb"); | |
846 if(encode_file){ | |
847 fclose(encode_file); | |
1217 | 848 fprintf(stderr,"File already exists: %s (don't overwrite your favourite AVI!)\n",encode_name); |
1 | 849 return 0; |
850 } | |
851 encode_file=fopen(encode_name,"wb"); | |
852 if(!encode_file){ | |
1217 | 853 fprintf(stderr,"Cannot create file for encoding\n"); |
1 | 854 return 0; |
855 } | |
398 | 856 write_avi_header_1(encode_file,mmioFOURCC('d', 'i', 'v', 'x'),sh_video->fps,sh_video->disp_w,sh_video->disp_h); |
1 | 857 fclose(encode_file); |
858 encode_index_name=malloc(strlen(encode_name)+8); | |
859 strcpy(encode_index_name,encode_name); | |
860 strcat(encode_index_name,".index"); | |
861 if((encode_file=fopen(encode_index_name,"wb"))) | |
862 fclose(encode_file); | |
863 else encode_index_name=NULL; | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
864 sh_audio=0; // disable audio !!!!! |
1 | 865 } |
866 | |
867 // ========== Init keyboard FIFO (connection to libvo) ============ | |
868 | |
869 make_pipe(&keyb_fifo_get,&keyb_fifo_put); | |
870 | |
398 | 871 // ========== Init display (sh_video->disp_w*sh_video->disp_h/out_fmt) ============ |
1 | 872 |
873 #ifdef X11_FULLSCREEN | |
874 if(fullscreen){ | |
875 if(vo_init()){ | |
876 //if(verbose) printf("X11 running at %dx%d depth: %d\n",vo_screenwidth,vo_screenheight,vo_depthonscreen); | |
877 } | |
878 if(!screen_size_xy) screen_size_xy=vo_screenwidth; // scale with asp.ratio | |
879 } | |
880 #endif | |
881 | |
882 if(screen_size_xy>0){ | |
883 if(screen_size_xy<=8){ | |
398 | 884 screen_size_x=screen_size_xy*sh_video->disp_w; |
885 screen_size_y=screen_size_xy*sh_video->disp_h; | |
1 | 886 } else { |
887 screen_size_x=screen_size_xy; | |
398 | 888 screen_size_y=screen_size_xy*sh_video->disp_h/sh_video->disp_w; |
1 | 889 } |
337 | 890 } else if(!vidmode){ |
891 if(!screen_size_x) screen_size_x=SCREEN_SIZE_X; | |
892 if(!screen_size_y) screen_size_y=SCREEN_SIZE_Y; | |
398 | 893 if(screen_size_x<=8) screen_size_x*=sh_video->disp_w; |
894 if(screen_size_y<=8) screen_size_y*=sh_video->disp_h; | |
1 | 895 } |
208
ae0f909ccc7c
Adds code to deal with vidmode selection. -- mgraffam
mgraffam
parents:
190
diff
changeset
|
896 |
340 | 897 { const vo_info_t *info = video_out->get_info(); |
1183 | 898 printf("VO: [%s] %dx%d => %dx%d %s %s%s%s%s\n",info->short_name, |
398 | 899 sh_video->disp_w,sh_video->disp_h, |
340 | 900 screen_size_x,screen_size_y, |
1183 | 901 vo_format_name(out_fmt), |
340 | 902 fullscreen?"fs ":"", |
903 vidmode?"vm ":"", | |
766 | 904 softzoom?"zoom ":"", |
778
13c0dfde813b
removed dummy audio track for -nosound, vo: flip detection
arpi_esp
parents:
766
diff
changeset
|
905 (flip==1)?"flip ":"" |
766 | 906 // fullscreen|(vidmode<<1)|(softzoom<<2)|(flip<<3) |
340 | 907 ); |
1237 | 908 printf("VO: Description: %s\n" |
909 "VO: Author: %s\n", | |
910 info->name, | |
911 info->author | |
912 ); | |
913 if(strlen(info->comment) > 0) | |
914 printf("VO: Comment: %s\n", info->comment); | |
340 | 915 } |
916 | |
337 | 917 if(verbose) printf("video_out->init(%dx%d->%dx%d,flags=%d,'%s',0x%X)\n", |
398 | 918 sh_video->disp_w,sh_video->disp_h, |
1 | 919 screen_size_x,screen_size_y, |
766 | 920 fullscreen|(vidmode<<1)|(softzoom<<2)|(flip<<3), |
337 | 921 title,out_fmt); |
1 | 922 |
723 | 923 #ifdef HAVE_GUI |
924 if ( !nogui ) | |
925 { | |
926 mplShMem->items.videodata.width=sh_video->disp_w; | |
927 mplShMem->items.videodata.height=sh_video->disp_h; | |
928 mplSendMessage( mplSetVideoData ); | |
929 } | |
930 #endif | |
931 | |
398 | 932 if(video_out->init(sh_video->disp_w,sh_video->disp_h, |
1 | 933 screen_size_x,screen_size_y, |
766 | 934 fullscreen|(vidmode<<1)|(softzoom<<2)|(flip<<3), |
337 | 935 title,out_fmt)){ |
1217 | 936 fprintf(stderr,"FATAL: Cannot initialize video driver!\n"); |
748
717e4677d9ce
stime compile bug fixed. and GUI_MSG macro defined.
pontscho
parents:
746
diff
changeset
|
937 GUI_MSG( mplCantInitVideoDriver ) |
723 | 938 exit(1); |
1 | 939 } |
940 if(verbose) printf("INFO: Video OUT driver init OK!\n"); | |
941 | |
942 fflush(stdout); | |
458
49b0474b2e26
I really hope that you will learn how to use cvs, sooner or later...
arpi_esp
parents:
452
diff
changeset
|
943 |
1 | 944 //================== MAIN: ========================== |
945 { | |
746 | 946 |
1334 | 947 float frame_correction=0; // average of A-V timestamp differences |
1 | 948 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
|
949 //float v_frame=0; // Video |
1 | 950 float time_frame=0; // Timer |
951 int eof=0; | |
952 int force_redraw=0; | |
1400 | 953 //float num_frames=0; // number of frames played |
1382 | 954 int grab_frames=0; |
212 | 955 char osd_text_buffer[64]; |
715 | 956 int drop_frame=0; |
957 int drop_frame_cnt=0; | |
1 | 958 |
959 #ifdef HAVE_LIRC | |
723 | 960 #ifdef HAVE_GUI |
961 if ( nogui ) | |
962 #endif | |
1 | 963 lirc_mp_setup(); |
964 #endif | |
965 | |
1005 | 966 #ifdef HAVE_GUI |
967 if ( nogui ) | |
968 { | |
969 #endif | |
1 | 970 #ifdef USE_TERMCAP |
971 load_termcap(NULL); // load key-codes | |
972 #endif | |
692 | 973 if(f) getch2_enable(); |
1005 | 974 #ifdef HAVE_GUI |
975 } | |
976 #endif | |
1 | 977 |
978 //========= Catch terminate signals: ================ | |
979 // terminate requests: | |
980 signal(SIGTERM,exit_sighandler); // kill | |
981 signal(SIGHUP,exit_sighandler); // kill -HUP / xterm closed | |
723 | 982 |
983 #ifdef HAVE_GUI | |
984 if ( nogui ) | |
985 #endif | |
986 signal(SIGINT,exit_sighandler); // Interrupt from keyboard | |
987 | |
1 | 988 signal(SIGQUIT,exit_sighandler); // Quit from keyboard |
989 // fatal errors: | |
990 signal(SIGBUS,exit_sighandler); // bus error | |
991 signal(SIGSEGV,exit_sighandler); // segfault | |
992 signal(SIGILL,exit_sighandler); // illegal instruction | |
993 signal(SIGFPE,exit_sighandler); // floating point exc. | |
994 signal(SIGABRT,exit_sighandler); // abort() | |
995 | |
996 //================ SETUP AUDIO ========================== | |
997 current_module="setup_audio"; | |
998 | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
999 if(sh_audio){ |
1237 | 1000 |
1001 const ao_info_t *info=audio_out->info; | |
1002 printf("AO: [%s] %iHz %s %s\n" | |
1003 "AO: Description: %s\n" | |
1004 "AO: Author: %s\n", | |
1005 info->short_name, | |
1006 force_srate?force_srate:sh_audio->samplerate, | |
1007 sh_audio->channels>1?"Stereo":"Mono", | |
1008 audio_out_format_name(sh_audio->sample_format), | |
1009 info->name, | |
1010 info->author | |
1011 ); | |
1012 if(strlen(info->comment) > 0) | |
1013 printf("AO: Comment: %s\n", info->comment); | |
955 | 1014 |
969 | 1015 if(!audio_out->init(force_srate?force_srate:sh_audio->samplerate, |
1016 sh_audio->channels,sh_audio->sample_format,0)){ | |
955 | 1017 printf("couldn't open/init audio device -> NOSOUND\n"); |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1018 sh_audio=0; audio_out=NULL; |
1 | 1019 } |
1020 | |
955 | 1021 // printf("Audio buffer size: %d bytes, delay: %5.3fs\n",audio_buffer_size,audio_buffer_delay); |
746 | 1022 |
758 | 1023 // fixup audio buffer size: |
782 | 1024 // if(outburst<MAX_OUTBURST){ |
1025 // sh_audio->a_buffer_size=sh_audio->audio_out_minsize+outburst; | |
1026 // printf("Audio out buffer size reduced to %d bytes\n",sh_audio->a_buffer_size); | |
1027 // } | |
758 | 1028 |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1029 // sh_audio->timer=-(audio_buffer_delay); |
1 | 1030 } |
1031 | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1032 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
|
1033 if(sh_audio) sh_audio->timer=0; |
1 | 1034 |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1035 if(!sh_audio){ |
1 | 1036 printf("Audio: no sound\n"); |
1037 if(verbose) printf("Freeing %d unused audio chunks\n",d_audio->packs); | |
1038 ds_free_packs(d_audio); // free buffered chunks | |
1039 d_audio->id=-2; // do not read audio chunks | |
442 | 1040 if(sh_audio) if(sh_audio->a_buffer) free(sh_audio->a_buffer); |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1041 if(audio_out){ audio_out->uninit(); audio_out=NULL;} // close device |
1 | 1042 } |
1043 | |
1044 current_module=NULL; | |
1045 | |
1046 //==================== START PLAYING ======================= | |
1047 | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1048 if(file_format==DEMUXER_TYPE_AVI && sh_audio){ |
780 | 1049 //a_pts=d_audio->pts; |
1334 | 1050 if(verbose) printf("Initial frame delay A: %d V: %d\n",(int)sh_audio->audio.dwInitialFrames,(int)sh_video->video.dwInitialFrames); |
780 | 1051 if(!pts_from_bps){ |
1052 float x=(float)(sh_audio->audio.dwInitialFrames-sh_video->video.dwInitialFrames)*sh_video->frametime; | |
1053 audio_delay-=x; | |
1334 | 1054 if(verbose) printf("AVI Initial frame delay: %5.3f\n",x); |
780 | 1055 } |
340 | 1056 if(verbose){ |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1057 // printf("v: audio_delay=%5.3f buffer_delay=%5.3f a_pts=%5.3f sh_audio->timer=%5.3f\n", |
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1058 // audio_delay,audio_buffer_delay,a_pts,sh_audio->timer); |
340 | 1059 printf("START: a_pts=%5.3f v_pts=%5.3f \n",d_audio->pts,d_video->pts); |
1060 } | |
1 | 1061 delay_corrected=0; // has to correct PTS diffs |
1062 d_video->pts=0;d_audio->pts=0; // PTS is outdated now! | |
780 | 1063 } else { |
1064 pts_from_bps=0; // it must be 0 for mpeg/asf ! | |
1 | 1065 } |
398 | 1066 if(force_fps){ |
1067 sh_video->fps=force_fps; | |
1068 sh_video->frametime=1.0f/sh_video->fps; | |
955 | 1069 printf("FPS forced to be %5.3f (ftime: %5.3f)\n",sh_video->fps,sh_video->frametime); |
398 | 1070 } |
1 | 1071 |
1072 printf("Start playing...\n");fflush(stdout); | |
1073 | |
1074 InitTimer(); | |
1075 | |
1124
0e95f30ffd4c
-frames and -benchmark options to make chl & gabucino happy
arpi_esp
parents:
1059
diff
changeset
|
1076 total_time_usage_start=GetTimer(); |
0e95f30ffd4c
-frames and -benchmark options to make chl & gabucino happy
arpi_esp
parents:
1059
diff
changeset
|
1077 |
1 | 1078 while(!eof){ |
1079 | |
1125 | 1080 if(play_n_frames>=0){ |
1081 --play_n_frames; | |
1082 if(play_n_frames<0) exit_player("Requested number of frames played"); | |
1083 } | |
1084 | |
1 | 1085 /*========================== 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
|
1086 while(sh_audio){ |
746 | 1087 unsigned int t; |
955 | 1088 int playsize=audio_out->get_space(); |
746 | 1089 |
955 | 1090 if(!playsize) break; // buffer is full, do not block here!!! |
746 | 1091 |
1092 if(playsize>MAX_OUTBURST) playsize=MAX_OUTBURST; // we shouldn't exceed it! | |
1093 //if(playsize>outburst) playsize=outburst; | |
291 | 1094 |
1095 // Update buffer if needed | |
746 | 1096 t=GetTimer(); |
1 | 1097 current_module="decode_audio"; // Enter AUDIO decoder module |
746 | 1098 while(sh_audio->a_buffer_len<playsize && !d_audio->eof){ |
1099 int ret=decode_audio(sh_audio,&sh_audio->a_buffer[sh_audio->a_buffer_len], | |
1100 playsize-sh_audio->a_buffer_len,sh_audio->a_buffer_size-sh_audio->a_buffer_len); | |
296 | 1101 if(ret>0) sh_audio->a_buffer_len+=ret; else break; |
1 | 1102 } |
1103 current_module=NULL; // Leave AUDIO decoder module | |
291 | 1104 t=GetTimer()-t;audio_time_usage+=t*0.000001; |
746 | 1105 |
1106 if(playsize>sh_audio->a_buffer_len) playsize=sh_audio->a_buffer_len; | |
1107 | |
955 | 1108 playsize=audio_out->play(sh_audio->a_buffer,playsize,0); |
1 | 1109 |
955 | 1110 if(playsize>0){ |
746 | 1111 sh_audio->a_buffer_len-=playsize; |
1112 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
|
1113 sh_audio->timer+=playsize/(float)(sh_audio->o_bps); |
1 | 1114 } |
1115 | |
1116 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
|
1117 } // if(sh_audio) |
1 | 1118 |
1119 /*========================== UPDATE TIMERS ============================*/ | |
746 | 1120 #if 0 |
1 | 1121 if(alsa){ |
1122 // Use system timer for sync, not audio card/driver | |
1123 time_frame-=GetRelativeTime(); | |
1124 if(time_frame<-0.1 || time_frame>0.1){ | |
1125 time_frame=0; | |
1126 } else { | |
398 | 1127 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
|
1128 usec_sleep(time_frame-0.022); |
398 | 1129 time_frame-=GetRelativeTime(); |
1130 } | |
103 | 1131 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
|
1132 usec_sleep(1000); // sleeps 1 clock tick (10ms)! |
103 | 1133 time_frame-=GetRelativeTime(); |
1134 } | |
398 | 1135 } |
1 | 1136 } |
746 | 1137 #endif |
1 | 1138 |
1139 /*========================== PLAY VIDEO ============================*/ | |
1140 | |
1141 if(1) | |
746 | 1142 while(1){ |
458
49b0474b2e26
I really hope that you will learn how to use cvs, sooner or later...
arpi_esp
parents:
452
diff
changeset
|
1143 |
398 | 1144 float frame_time=1; |
1145 float pts1=d_video->pts; | |
1291 | 1146 int blit_frame=0; |
1 | 1147 |
1148 current_module="decode_video"; | |
715 | 1149 |
1 | 1150 //-------------------- Decode a frame: ----------------------- |
1151 | |
1291 | 1152 if(file_format==DEMUXER_TYPE_MPEG_ES || file_format==DEMUXER_TYPE_MPEG_PS){ |
111 | 1153 int in_frame=0; |
398 | 1154 float newfps; |
111 | 1155 videobuf_len=0; |
1156 while(videobuf_len<VIDEOBUFFER_SIZE-MAX_VIDEO_PACKET_SIZE){ | |
1157 int i=sync_video_packet(d_video); | |
1295 | 1158 void* buffer=&videobuffer[videobuf_len+4]; |
111 | 1159 if(in_frame){ |
1160 if(i<0x101 || i>=0x1B0){ // not slice code -> end of frame | |
398 | 1161 #if 1 |
111 | 1162 // send END OF FRAME code: |
1163 videobuffer[videobuf_len+0]=0; | |
1164 videobuffer[videobuf_len+1]=0; | |
1165 videobuffer[videobuf_len+2]=1; | |
1166 videobuffer[videobuf_len+3]=0xFF; | |
1167 videobuf_len+=4; | |
1168 #endif | |
1169 if(!i) eof=1; // EOF | |
1170 break; | |
1171 } | |
1172 } else { | |
1173 //if(i==0x100) in_frame=1; // picture startcode | |
1174 if(i>=0x101 && i<0x1B0) in_frame=1; // picture startcode | |
1175 else if(!i){ eof=1; break;} // EOF | |
1176 } | |
458
49b0474b2e26
I really hope that you will learn how to use cvs, sooner or later...
arpi_esp
parents:
452
diff
changeset
|
1177 if(grab_frames==2 && (i==0x1B3 || i==0x1B8)) grab_frames=1; |
111 | 1178 if(!read_video_packet(d_video)){ eof=1; break;} // EOF |
1179 //printf("read packet 0x%X, len=%d\n",i,videobuf_len); | |
1295 | 1180 if(sh_video->codec->driver!=1){ |
1296 | 1181 // if not libmpeg2: |
1295 | 1182 switch(i){ |
1183 case 0x1B3: header_process_sequence_header (picture, buffer);break; | |
1184 case 0x1B5: header_process_extension (picture, buffer);break; | |
1185 } | |
1186 } | |
111 | 1187 } |
458
49b0474b2e26
I really hope that you will learn how to use cvs, sooner or later...
arpi_esp
parents:
452
diff
changeset
|
1188 |
111 | 1189 if(videobuf_len>max_framesize) max_framesize=videobuf_len; // debug |
1190 //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
|
1191 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
|
1192 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
|
1193 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
|
1194 fclose(f); |
49b0474b2e26
I really hope that you will learn how to use cvs, sooner or later...
arpi_esp
parents:
452
diff
changeset
|
1195 } |
1291 | 1196 |
1197 blit_frame=decode_video(video_out,sh_video,videobuffer,videobuf_len,drop_frame); | |
111 | 1198 |
1291 | 1199 // get mpeg fps: |
1200 newfps=frameratecode2framerate[picture->frame_rate_code]*0.0001f; | |
1201 if(ABS(sh_video->fps-newfps)>0.01f) if(!force_fps){ | |
398 | 1202 printf("Warning! FPS changed %5.3f -> %5.3f (%f) [%d] \n",sh_video->fps,newfps,sh_video->fps-newfps,picture->frame_rate_code); |
1203 sh_video->fps=newfps; | |
1204 sh_video->frametime=10000.0f/(float)frameratecode2framerate[picture->frame_rate_code]; | |
1291 | 1205 } |
1206 | |
1207 // fix mpeg2 frametime: | |
1208 frame_time=(100+picture->repeat_count)*0.01f; | |
1209 picture->repeat_count=0; | |
398 | 1210 |
1291 | 1211 } else { |
1212 // frame-based file formats: (AVI,ASF,MOV) | |
1213 unsigned char* start=NULL; | |
1214 int in_size=ds_get_packet(d_video,&start); | |
1215 if(in_size<0){ eof=1;break;} | |
1216 if(in_size>max_framesize) max_framesize=in_size; | |
1217 blit_frame=decode_video(video_out,sh_video,start,in_size,drop_frame); | |
1 | 1218 } |
1291 | 1219 |
1 | 1220 //------------------------ frame decoded. -------------------- |
1221 | |
398 | 1222 // Increase video timers: |
1400 | 1223 sh_video->num_frames+=frame_time; |
398 | 1224 frame_time*=sh_video->frametime; |
442 | 1225 if(file_format==DEMUXER_TYPE_ASF && !force_fps){ |
398 | 1226 // .ASF files has no fixed FPS - just frame durations! |
1227 float d=d_video->pts-pts1; | |
1228 if(d>=0 && d<5) frame_time=d; | |
595 | 1229 if(d>0){ |
1230 if(verbose) | |
1231 if((int)sh_video->fps==1000) | |
1232 printf("\rASF framerate: %d fps \n",(int)(1.0f/d)); | |
1233 sh_video->frametime=d; // 1ms | |
1234 sh_video->fps=1.0f/d; | |
1235 } | |
398 | 1236 } |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1237 sh_video->timer+=frame_time; |
746 | 1238 time_frame+=frame_time; // for nosound |
1239 | |
780 | 1240 if(file_format==DEMUXER_TYPE_MPEG_PS) d_video->pts+=frame_time; |
940 | 1241 |
1242 if(verbose>1) printf("*** ftime=%5.3f ***\n",frame_time); | |
780 | 1243 |
798 | 1244 if(drop_frame){ |
746 | 1245 |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1246 if(sh_audio && !d_audio->eof){ |
955 | 1247 int delay=audio_out->get_delay(); |
798 | 1248 if(verbose>1)printf("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
|
1249 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
|
1250 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
|
1251 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
|
1252 drop_frame=0; // stop dropping frames |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1253 if (verbose>0) printf("\nstop frame drop %.2f\n", time_frame); |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1254 }else{ |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1255 ++drop_frame_cnt; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1256 if (verbose > 0 && drop_frame_cnt%10 == 0) |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1257 printf("\nstill dropping, %.2f\n", time_frame); |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1258 } |
798 | 1259 } |
1260 | |
1261 } else { | |
780 | 1262 // It's time to sleep... |
1263 current_module="sleep"; | |
1264 | |
1265 time_frame-=GetRelativeTime(); // reset timer | |
1266 | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1267 if(sh_audio && !d_audio->eof){ |
955 | 1268 int delay=audio_out->get_delay(); |
758 | 1269 if(verbose>1)printf("delay=%d\n",delay); |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1270 time_frame=sh_video->timer; |
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1271 time_frame-=sh_audio->timer-(float)delay/(float)sh_audio->o_bps; |
798 | 1272 // we are out of time... drop next frame! |
940 | 1273 if(time_frame<-2*frame_time){ |
798 | 1274 drop_frame=frame_dropping; // tricky! |
1275 ++drop_frame_cnt; | |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1276 if (verbose>0) printf("\nframe drop %d, %.2f\n", drop_frame, time_frame); |
798 | 1277 } |
780 | 1278 } else { |
1124
0e95f30ffd4c
-frames and -benchmark options to make chl & gabucino happy
arpi_esp
parents:
1059
diff
changeset
|
1279 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
|
1280 time_frame=0; |
0e95f30ffd4c
-frames and -benchmark options to make chl & gabucino happy
arpi_esp
parents:
1059
diff
changeset
|
1281 |
780 | 1282 } |
798 | 1283 |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1284 // if(verbose>1)printf("sleep: %5.3f a:%6.3f v:%6.3f \n",time_frame,sh_audio->timer,sh_video->timer); |
746 | 1285 |
1286 while(time_frame>0.005){ | |
1287 if(time_frame<=0.020) | |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1288 usec_sleep(10000); // sleeps 1 clock tick (10ms)! |
746 | 1289 else |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1290 usec_sleep(1000000*(time_frame-0.002)); |
746 | 1291 time_frame-=GetRelativeTime(); |
1292 } | |
117 | 1293 |
715 | 1294 current_module="flip_page"; |
1250 | 1295 if(blit_frame) video_out->flip_page(); |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1296 // usec_sleep(50000); // test only! |
780 | 1297 |
715 | 1298 } |
780 | 1299 |
1300 current_module=NULL; | |
715 | 1301 |
1 | 1302 if(eof) break; |
220 | 1303 if(force_redraw){ |
1304 --force_redraw; | |
577 | 1305 if(!force_redraw) osd_function=OSD_PLAY; |
746 | 1306 continue; |
220 | 1307 } |
1 | 1308 |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1309 // 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 | 1310 // fflush(stdout); |
1311 | |
1312 #if 1 | |
1313 /*================ 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
|
1314 if(sh_audio){ |
780 | 1315 float a_pts=0; |
1316 float v_pts=0; | |
1317 | |
746 | 1318 // unplayed bytes in our and soundcard/dma buffer: |
955 | 1319 int delay_bytes=audio_out->get_delay()+sh_audio->a_buffer_len; |
746 | 1320 float delay=(float)delay_bytes/(float)sh_audio->o_bps; |
1321 | |
780 | 1322 if(pts_from_bps){ |
1323 // PTS = (audio position)/(bytes per sec) | |
815 | 1324 // a_pts=(ds_tell(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; |
1325 a_pts=(ds_tell(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->wf->nAvgBytesPerSec; | |
1 | 1326 delay_corrected=1; // hack |
889 | 1327 v_pts=d_video->pack_no*(float)sh_video->video.dwScale/(float)sh_video->video.dwRate; |
1328 if(verbose)printf("%5.3f|",v_pts-d_video->pts); | |
780 | 1329 } else { |
1330 if(!delay_corrected && d_audio->pts){ | |
746 | 1331 float x=d_audio->pts-d_video->pts-(delay+audio_delay); |
1332 float y=-(delay+audio_delay); | |
1 | 1333 printf("Initial PTS delay: %5.3f sec (calculated: %5.3f)\n",x,y); |
933 | 1334 initial_pts_delay+=x; |
1 | 1335 audio_delay+=x; |
1336 delay_corrected=1; | |
340 | 1337 if(verbose) |
1 | 1338 printf("v: audio_delay=%5.3f buffer_delay=%5.3f a.pts=%5.3f v.pts=%5.3f\n", |
746 | 1339 audio_delay,delay,d_audio->pts,d_video->pts); |
1 | 1340 } |
780 | 1341 // PTS = (last timestamp) + (bytes after last timestamp)/(bytes per sec) |
746 | 1342 a_pts=d_audio->pts; |
1343 a_pts+=(ds_tell_pts(d_audio)-sh_audio->a_in_buffer_len)/(float)sh_audio->i_bps; | |
889 | 1344 v_pts=d_video->pts-frame_time; |
780 | 1345 } |
746 | 1346 |
933 | 1347 if(verbose>1)printf("### 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 | 1348 |
1349 if(frame_corr_num==1){ | |
1350 float x=frame_correction; | |
398 | 1351 if(delay_corrected){ |
746 | 1352 // printf("A:%6.1f V:%6.1f A-V:%7.3f",a_pts-audio_delay-delay,v_pts,x); |
1353 printf("A:%6.1f (%6.1f) V:%6.1f A-V:%7.3f",a_pts,a_pts-audio_delay-delay,v_pts,x); | |
780 | 1354 x*=0.1f; |
1 | 1355 if(x<-max_pts_correction) x=-max_pts_correction; else |
1356 if(x> max_pts_correction) x= max_pts_correction; | |
780 | 1357 if(default_max_pts_correction>=0) |
1358 max_pts_correction=default_max_pts_correction; | |
1359 else | |
1360 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
|
1361 sh_audio->timer+=x; c_total+=x; |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1362 printf(" ct:%7.3f %3d %2d%% %2d%% %4.1f%% %d\r",c_total, |
1400 | 1363 (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
|
1364 (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
|
1365 (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
|
1366 (sh_video->timer>0.5)?(100.0*audio_time_usage/(double)sh_video->timer):0 |
798 | 1367 ,drop_frame_cnt |
1 | 1368 ); |
1369 fflush(stdout); | |
1370 } | |
1371 frame_corr_num=0; frame_correction=0; | |
1372 } | |
780 | 1373 |
746 | 1374 if(frame_corr_num>=0) frame_correction+=(a_pts-delay-audio_delay)-v_pts; |
780 | 1375 |
1 | 1376 } else { |
1377 // No audio: | |
780 | 1378 //if(d_video->pts) |
955 | 1379 float v_pts=d_video->pts; |
1 | 1380 if(frame_corr_num==5){ |
1381 // printf("A: --- V:%6.1f \r",v_pts); | |
442 | 1382 printf("V:%6.1f %3d %2d%% %2d%% %3.1f%% \r",v_pts, |
1400 | 1383 (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
|
1384 (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
|
1385 (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
|
1386 (sh_video->timer>0.5)?(100.0*audio_time_usage/(double)sh_video->timer):0 |
442 | 1387 ); |
1 | 1388 |
1389 fflush(stdout); | |
1390 frame_corr_num=0; | |
1391 } | |
1392 } | |
1393 ++frame_corr_num; | |
1394 #endif | |
1395 | |
220 | 1396 if(osd_visible){ |
1397 --osd_visible; | |
1398 if(!osd_visible) vo_osd_progbar_type=-1; // disable | |
1399 } | |
371 | 1400 |
1401 if(osd_function==OSD_PAUSE){ | |
1402 printf("\n------ PAUSED -------\r");fflush(stdout); | |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1403 if (audio_out && sh_audio) |
1156 | 1404 audio_out->pause(); // pause audio, keep data if possible |
723 | 1405 #ifdef HAVE_GUI |
1406 if ( nogui ) | |
1407 { | |
1408 #endif | |
1409 while( | |
371 | 1410 #ifdef HAVE_LIRC |
723 | 1411 lirc_mp_getinput()<=0 && |
371 | 1412 #endif |
723 | 1413 (!f || getch2(20)<=0) && mplayer_get_key()<=0){ |
1414 video_out->check_events(); | |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1415 if(!f) usec_sleep(1000); // do not eat the CPU |
723 | 1416 } |
1417 osd_function=OSD_PLAY; | |
1418 #ifdef HAVE_GUI | |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1419 } else while( osd_function != OSD_PLAY ) usec_sleep( 1000 ); |
723 | 1420 #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
|
1421 if (audio_out && sh_audio) |
1156 | 1422 audio_out->resume(); // resume audio |
371 | 1423 } |
1424 | |
746 | 1425 |
1426 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
|
1427 } // while(sh_video->timer<sh_audio->timer || force_redraw) |
1 | 1428 |
1429 | |
1430 //================= Keyboard events, SEEKing ==================== | |
1431 | |
723 | 1432 { int c; |
1 | 1433 while( |
1434 #ifdef HAVE_LIRC | |
1435 (c=lirc_mp_getinput())>0 || | |
1436 #endif | |
701 | 1437 (f && (c=getch2(0))>0) || (c=mplayer_get_key())>0) switch(c){ |
1 | 1438 // seek 10 sec |
1439 case KEY_RIGHT: | |
220 | 1440 osd_function=OSD_FFW; |
1 | 1441 rel_seek_secs+=10;break; |
1442 case KEY_LEFT: | |
220 | 1443 osd_function=OSD_REW; |
1 | 1444 rel_seek_secs-=10;break; |
1445 // seek 1 min | |
1446 case KEY_UP: | |
220 | 1447 osd_function=OSD_FFW; |
1 | 1448 rel_seek_secs+=60;break; |
1449 case KEY_DOWN: | |
220 | 1450 osd_function=OSD_REW; |
1 | 1451 rel_seek_secs-=60;break; |
651 | 1452 // seek 10 min |
1453 case KEY_PAGE_UP: | |
1454 rel_seek_secs+=600;break; | |
1455 case KEY_PAGE_DOWN: | |
1456 rel_seek_secs-=600;break; | |
1 | 1457 // delay correction: |
1458 case '+': | |
746 | 1459 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
|
1460 if(sh_audio) sh_audio->timer-=0.1; |
1 | 1461 break; |
1462 case '-': | |
746 | 1463 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
|
1464 if(sh_audio) sh_audio->timer+=0.1; |
1 | 1465 break; |
1466 // quit | |
1467 case KEY_ESC: // ESC | |
1468 case KEY_ENTER: // ESC | |
1469 case 'q': exit_player("Quit"); | |
36 | 1470 case 'g': grab_frames=2;break; |
1 | 1471 // pause |
1472 case 'p': | |
1473 case ' ': | |
220 | 1474 osd_function=OSD_PAUSE; |
371 | 1475 break; |
1476 case 'o': // toggle OSD | |
1477 osd_level=(osd_level+1)%3; | |
1 | 1478 break; |
939 | 1479 case 'z': |
1480 sub_delay -= 0.1; | |
1481 break; | |
1482 case 'x': | |
1483 sub_delay += 0.1; | |
1484 break; | |
459 | 1485 case '*': |
555 | 1486 case '/': { |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1487 float mixer_l, mixer_r; |
555 | 1488 mixer_getvolume( &mixer_l,&mixer_r ); |
1489 if(c=='*'){ | |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1490 mixer_l++; if ( mixer_l > 100 ) mixer_l = 100; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1491 mixer_r++; if ( mixer_r > 100 ) mixer_r = 100; |
555 | 1492 } else { |
1038
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1493 mixer_l--; if ( mixer_l < 0 ) mixer_l = 0; |
b36fb1ae4b53
applied solaris8/netbsd/other fixes patch by J¸«ärgen Keil <jk@tools.de>
arpi_esp
parents:
1026
diff
changeset
|
1494 mixer_r--; if ( mixer_r < 0 ) mixer_r = 0; |
555 | 1495 } |
1496 mixer_setvolume( mixer_l,mixer_r ); | |
1497 | |
1498 if(osd_level){ | |
1499 osd_visible=sh_video->fps; // 1 sec | |
1500 vo_osd_progbar_type=OSD_VOLUME; | |
1501 vo_osd_progbar_value=(mixer_l+mixer_r)*5/4; | |
1502 //printf("volume: %d\n",vo_osd_progbar_value); | |
1503 } | |
1504 } | |
1505 break; | |
459 | 1506 case 'm': |
510 | 1507 mixer_usemaster=!mixer_usemaster; |
459 | 1508 break; |
715 | 1509 case 'd': |
798 | 1510 frame_dropping=(frame_dropping+1)%3; |
1511 printf("== drop: %d == \n",frame_dropping); | |
715 | 1512 break; |
1 | 1513 } |
1406 | 1514 } // keyboard event handler |
1515 | |
651 | 1516 if (seek_to_sec) { |
937 | 1517 int a,b; float d; |
1518 | |
1519 if (sscanf(seek_to_sec, "%d:%d:%f", &a,&b,&d)==3) | |
1520 rel_seek_secs += 3600*a +60*b +d ; | |
1521 else if (sscanf(seek_to_sec, "%d:%f", &a, &d)==2) | |
1522 rel_seek_secs += 60*a +d; | |
1523 else if (sscanf(seek_to_sec, "%f", &d)==1) | |
1524 rel_seek_secs += d; | |
1525 | |
1526 seek_to_sec = NULL; | |
651 | 1527 } |
937 | 1528 |
1 | 1529 if(rel_seek_secs) |
1405 | 1530 if(demux_seek(demuxer,rel_seek_secs,0)){ |
1531 // success: | |
889 | 1532 |
1369
7a2f1881b776
a_frame, v_frame killed, using sh_audio/video->timer. has_audio not more used after initialization.
arpi
parents:
1353
diff
changeset
|
1533 if(sh_audio){ |
1334 | 1534 current_module="audio_reset"; |
1535 audio_out->reset(); // stop audio, throwing away buffered data | |
889 | 1536 current_module=NULL; |
1 | 1537 } |
1538 | |
1334 | 1539 // Set OSD: |
1540 if(osd_level){ | |
1541 int len=((demuxer->movi_end-demuxer->movi_start)>>8); | |
1542 if(len>0){ | |
1543 osd_visible=sh_video->fps; // 1 sec | |
1544 vo_osd_progbar_type=0; | |
1545 vo_osd_progbar_value=(demuxer->filepos-demuxer->movi_start)/len; | |
1546 } | |
1547 } | |
1405 | 1548 |
1549 c_total=0; // kell ez? | |
1 | 1550 max_pts_correction=0.1; |
1405 | 1551 frame_corr_num=0; // -5 FIXME!!! |
889 | 1552 frame_correction=0; |
1 | 1553 force_redraw=5; |
1554 audio_time_usage=0; video_time_usage=0; vout_time_usage=0; | |
1405 | 1555 |
1 | 1556 } |
1405 | 1557 rel_seek_secs=0; |
1558 | |
220 | 1559 //================= Update OSD ==================== |
955 | 1560 { if(osd_level>=2){ |
780 | 1561 int pts=d_video->pts; |
595 | 1562 if(pts==osd_last_pts-1) ++pts; else osd_last_pts=pts; |
371 | 1563 vo_osd_text=osd_text_buffer; |
595 | 1564 sprintf(vo_osd_text,"%c %02d:%02d:%02d",osd_function,pts/3600,(pts/60)%60,pts%60); |
371 | 1565 } else { |
1566 vo_osd_text=NULL; | |
1567 } | |
220 | 1568 // for(i=1;i<=11;i++) osd_text_buffer[10+i]=i;osd_text_buffer[10+i]=0; |
371 | 1569 // vo_osd_text=osd_text_buffer; |
458
49b0474b2e26
I really hope that you will learn how to use cvs, sooner or later...
arpi_esp
parents:
452
diff
changeset
|
1570 |
258 | 1571 // find sub |
1204 | 1572 if(subtitles && d_video->pts>0){ |
780 | 1573 int pts=d_video->pts; |
398 | 1574 if(sub_fps==0) sub_fps=sh_video->fps; |
482 | 1575 current_module="find_sub"; |
780 | 1576 find_sub(subtitles,sub_uses_time?(100*(pts+sub_delay)):((pts+sub_delay)*sub_fps)); // FIXME! frame counter... |
482 | 1577 current_module=NULL; |
258 | 1578 } |
554 | 1579 |
1580 // DVD sub: | |
557 | 1581 { unsigned char* packet=NULL; |
1582 int len=ds_get_packet_sub(d_dvdsub,&packet); | |
1583 if(len>=2){ | |
1584 int len2; | |
1585 len2=(packet[0]<<8)+packet[1]; | |
561 | 1586 if(verbose) printf("\rDVD sub: %d / %d \n",len,len2); |
1587 if(len==len2) | |
1588 spudec_decode(packet,len); | |
1589 else | |
1590 printf("fragmented dvd-subs not yet supported!!!\n"); | |
557 | 1591 } else if(len>=0) { |
1592 printf("invalud dvd sub\n"); | |
554 | 1593 } |
1594 } | |
1595 | |
220 | 1596 } |
1 | 1597 |
1598 } // while(!eof) | |
1599 | |
1600 exit_player("End of file"); | |
109 | 1601 } |
1602 return 1; | |
1603 } |