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