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