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