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