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