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