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