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