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