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