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