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