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