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