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