Mercurial > mplayer.hg
annotate libvo/vo_x11.c @ 13249:a6642a4330fa
ensure that avi files have a valid header as soon as possible.
without this, the header says 0x0 video size, which works with mplayer
when the video size is stored in the codec data, but it does NOT work
with other players or with codecs that don't store size (e.g. snow).
actually i don't like having seeks in the muxer module, but i don't
know any other way to implement this fix without major changes to
mencoder. if you have a better fix, please reverse this and commit
yours.
author | rfelker |
---|---|
date | Sun, 05 Sep 2004 16:51:15 +0000 |
parents | 1c2f6de431bf |
children | e047e70a9767 |
rev | line source |
---|---|
1 | 1 |
2 #include <stdio.h> | |
3 #include <stdlib.h> | |
4 #include <string.h> | |
5 #include <signal.h> | |
6 | |
7 #include "config.h" | |
8 #include "video_out.h" | |
9 #include "video_out_internal.h" | |
10 | |
11 | |
12 #include <X11/Xlib.h> | |
13 #include <X11/Xutil.h> | |
4036 | 14 |
206
82b5ae8ceaf4
adds XF86VidMode support to vo_x11.c to do "pseudo-scaling"
mgraffam
parents:
202
diff
changeset
|
15 #ifdef HAVE_XF86VM |
82b5ae8ceaf4
adds XF86VidMode support to vo_x11.c to do "pseudo-scaling"
mgraffam
parents:
202
diff
changeset
|
16 #include <X11/extensions/xf86vmode.h> |
82b5ae8ceaf4
adds XF86VidMode support to vo_x11.c to do "pseudo-scaling"
mgraffam
parents:
202
diff
changeset
|
17 #endif |
1 | 18 #include <errno.h> |
19 | |
31 | 20 #include "x11_common.h" |
21 | |
11690
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
22 #ifdef HAVE_SHM |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
23 #include <sys/ipc.h> |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
24 #include <sys/shm.h> |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
25 #include <X11/extensions/XShm.h> |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
26 |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
27 static int Shmem_Flag; |
12582 | 28 |
11690
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
29 //static int Quiet_Flag; Here also what is this for. It's used but isn't inited ? |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
30 static XShmSegmentInfo Shminfo[1]; |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
31 static int gXErrorFlag; |
12582 | 32 static int CompletionType = -1; |
11690
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
33 |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
34 /* since it doesn't seem to be defined on some platforms */ |
12582 | 35 int XShmGetEventBase(Display *); |
11690
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
36 #endif |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
37 |
354 | 38 #include "fastmemcpy.h" |
616 | 39 #include "sub.h" |
350 | 40 |
2218 | 41 #include "../postproc/swscale.h" |
12582 | 42 #include "../postproc/swscale_internal.h" //FIXME |
2556 | 43 #include "../postproc/rgb2rgb.h" |
10233
35f52ad860a0
vf_scale.h & related cleanup & some small warning fix by dominik
michael
parents:
10212
diff
changeset
|
44 #include "../libmpcodecs/vf_scale.h" |
2218 | 45 |
4734 | 46 #include "../mp_msg.h" |
47 | |
6013
7f6e02a16ac4
some bugfix, x[11|mga|v] ( fullscreen with more files )
pontscho
parents:
5999
diff
changeset
|
48 #ifdef HAVE_NEW_GUI |
7f6e02a16ac4
some bugfix, x[11|mga|v] ( fullscreen with more files )
pontscho
parents:
5999
diff
changeset
|
49 #include "../Gui/interface.h" |
7f6e02a16ac4
some bugfix, x[11|mga|v] ( fullscreen with more files )
pontscho
parents:
5999
diff
changeset
|
50 #include "../mplayer.h" |
7f6e02a16ac4
some bugfix, x[11|mga|v] ( fullscreen with more files )
pontscho
parents:
5999
diff
changeset
|
51 #endif |
7f6e02a16ac4
some bugfix, x[11|mga|v] ( fullscreen with more files )
pontscho
parents:
5999
diff
changeset
|
52 |
12582 | 53 static vo_info_t info = { |
54 "X11 ( XImage/Shm )", | |
55 "x11", | |
56 "Aaron Holtzman <aholtzma@ess.engr.uvic.ca>", | |
57 "" | |
1 | 58 }; |
59 | |
12582 | 60 LIBVO_EXTERN(x11) |
1 | 61 /* private prototypes */ |
12582 | 62 static void Display_Image(XImage * myximage, unsigned char *ImageData); |
63 static void (*draw_alpha_fnc) (int x0, int y0, int w, int h, | |
64 unsigned char *src, unsigned char *srca, | |
65 int stride); | |
1 | 66 |
67 /* local data */ | |
68 static unsigned char *ImageData; | |
69 | |
70 /* X11 related variables */ | |
7764 | 71 static XImage *myximage = NULL; |
12582 | 72 static int depth, bpp, mode; |
1 | 73 static XWindowAttributes attribs; |
74 | |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10728
diff
changeset
|
75 static int int_pause; |
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10728
diff
changeset
|
76 |
2969 | 77 static int Flip_Flag; |
4661
4df2400b0527
-fs and or -vm default is nozoom, -zoom does the expected thing
michael
parents:
4658
diff
changeset
|
78 static int zoomFlag; |
2969 | 79 |
1 | 80 |
81 static uint32_t image_width; | |
82 static uint32_t image_height; | |
4641 | 83 static uint32_t in_format; |
12582 | 84 static uint32_t out_format = 0; |
85 static int srcW = -1; | |
86 static int srcH = -1; | |
87 static int aspect; // 1<<16 based fixed point aspect, so that the aspect stays correct during resizing | |
1 | 88 |
12582 | 89 static int old_vo_dwidth = -1; |
90 static int old_vo_dheight = -1; | |
91 | |
92 static void check_events() | |
93 { | |
94 int ret = vo_x11_check_events(mDisplay); | |
6013
7f6e02a16ac4
some bugfix, x[11|mga|v] ( fullscreen with more files )
pontscho
parents:
5999
diff
changeset
|
95 |
12582 | 96 /* clear left over borders and redraw frame if we are paused */ |
97 if (ret & VO_EVENT_EXPOSE && int_pause) | |
98 { | |
99 vo_x11_clearwindow_part(mDisplay, vo_window, myximage->width, | |
100 myximage->height, 0); | |
101 flip_page(); | |
102 } else if ((ret & VO_EVENT_RESIZE) || (ret & VO_EVENT_EXPOSE)) | |
103 vo_x11_clearwindow_part(mDisplay, vo_window, myximage->width, | |
104 myximage->height, 0); | |
105 | |
106 } | |
107 | |
108 static void draw_alpha_32(int x0, int y0, int w, int h, unsigned char *src, | |
109 unsigned char *srca, int stride) | |
110 { | |
111 vo_draw_alpha_rgb32(w, h, src, srca, stride, | |
112 ImageData + 4 * (y0 * image_width + x0), | |
113 4 * image_width); | |
1 | 114 } |
115 | |
12582 | 116 static void draw_alpha_24(int x0, int y0, int w, int h, unsigned char *src, |
117 unsigned char *srca, int stride) | |
118 { | |
119 vo_draw_alpha_rgb24(w, h, src, srca, stride, | |
120 ImageData + 3 * (y0 * image_width + x0), | |
121 3 * image_width); | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
122 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
123 |
12582 | 124 static void draw_alpha_16(int x0, int y0, int w, int h, unsigned char *src, |
125 unsigned char *srca, int stride) | |
126 { | |
127 vo_draw_alpha_rgb16(w, h, src, srca, stride, | |
128 ImageData + 2 * (y0 * image_width + x0), | |
129 2 * image_width); | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
130 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
131 |
12582 | 132 static void draw_alpha_15(int x0, int y0, int w, int h, unsigned char *src, |
133 unsigned char *srca, int stride) | |
134 { | |
135 vo_draw_alpha_rgb15(w, h, src, srca, stride, | |
136 ImageData + 2 * (y0 * image_width + x0), | |
137 2 * image_width); | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
138 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
139 |
12582 | 140 static void draw_alpha_null(int x0, int y0, int w, int h, |
141 unsigned char *src, unsigned char *srca, | |
142 int stride) | |
143 { | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
144 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
145 |
12582 | 146 static SwsContext *swsContext = NULL; |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
147 extern int sws_flags; |
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
148 |
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
149 static XVisualInfo vinfo; |
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
150 |
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
151 static void getMyXImage() |
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
152 { |
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
153 #ifdef HAVE_SHM |
12582 | 154 if (mLocalDisplay && XShmQueryExtension(mDisplay)) |
155 Shmem_Flag = 1; | |
156 else | |
157 { | |
158 Shmem_Flag = 0; | |
159 mp_msg(MSGT_VO, MSGL_WARN, | |
160 "Shared memory not supported\nReverting to normal Xlib\n"); | |
161 } | |
162 if (Shmem_Flag) | |
163 CompletionType = XShmGetEventBase(mDisplay) + ShmCompletion; | |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
164 |
12582 | 165 if (Shmem_Flag) |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
166 { |
12582 | 167 myximage = |
168 XShmCreateImage(mDisplay, vinfo.visual, depth, ZPixmap, NULL, | |
169 &Shminfo[0], image_width, image_height); | |
170 if (myximage == NULL) | |
171 { | |
172 if (myximage != NULL) | |
173 XDestroyImage(myximage); | |
174 mp_msg(MSGT_VO, MSGL_WARN, | |
175 "Shared memory error,disabling ( Ximage error )\n"); | |
176 goto shmemerror; | |
177 } | |
178 Shminfo[0].shmid = shmget(IPC_PRIVATE, | |
179 myximage->bytes_per_line * | |
180 myximage->height, IPC_CREAT | 0777); | |
181 if (Shminfo[0].shmid < 0) | |
182 { | |
183 XDestroyImage(myximage); | |
184 mp_msg(MSGT_VO, MSGL_V, "%s\n", strerror(errno)); | |
185 //perror( strerror( errno ) ); | |
186 mp_msg(MSGT_VO, MSGL_WARN, | |
187 "Shared memory error,disabling ( seg id error )\n"); | |
188 goto shmemerror; | |
189 } | |
190 Shminfo[0].shmaddr = (char *) shmat(Shminfo[0].shmid, 0, 0); | |
3209 | 191 |
12582 | 192 if (Shminfo[0].shmaddr == ((char *) -1)) |
193 { | |
194 XDestroyImage(myximage); | |
195 if (Shminfo[0].shmaddr != ((char *) -1)) | |
196 shmdt(Shminfo[0].shmaddr); | |
197 mp_msg(MSGT_VO, MSGL_WARN, | |
198 "Shared memory error,disabling ( address error )\n"); | |
199 goto shmemerror; | |
200 } | |
201 myximage->data = Shminfo[0].shmaddr; | |
202 ImageData = (unsigned char *) myximage->data; | |
203 Shminfo[0].readOnly = False; | |
204 XShmAttach(mDisplay, &Shminfo[0]); | |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
205 |
12582 | 206 XSync(mDisplay, False); |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
207 |
12582 | 208 if (gXErrorFlag) |
209 { | |
210 XDestroyImage(myximage); | |
211 shmdt(Shminfo[0].shmaddr); | |
212 mp_msg(MSGT_VO, MSGL_WARN, "Shared memory error,disabling.\n"); | |
213 gXErrorFlag = 0; | |
214 goto shmemerror; | |
215 } else | |
216 shmctl(Shminfo[0].shmid, IPC_RMID, 0); | |
217 | |
218 { | |
219 static int firstTime = 1; | |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
220 |
12582 | 221 if (firstTime) |
222 { | |
223 mp_msg(MSGT_VO, MSGL_V, "Sharing memory.\n"); | |
224 firstTime = 0; | |
225 } | |
226 } | |
227 } else | |
228 { | |
229 shmemerror: | |
230 Shmem_Flag = 0; | |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
231 #endif |
12582 | 232 myximage = XGetImage(mDisplay, vo_window, 0, 0, |
233 image_width, image_height, AllPlanes, | |
234 ZPixmap); | |
235 ImageData = myximage->data; | |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
236 #ifdef HAVE_SHM |
12582 | 237 } |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
238 #endif |
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
239 } |
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
240 |
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
241 static void freeMyXImage() |
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
242 { |
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
243 #ifdef HAVE_SHM |
12582 | 244 if (Shmem_Flag) |
245 { | |
246 XShmDetach(mDisplay, &Shminfo[0]); | |
247 XDestroyImage(myximage); | |
248 shmdt(Shminfo[0].shmaddr); | |
249 } else | |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
250 #endif |
12582 | 251 { |
252 XDestroyImage(myximage); | |
253 } | |
254 myximage = NULL; | |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
255 } |
2218 | 256 |
12582 | 257 static uint32_t config(uint32_t width, uint32_t height, uint32_t d_width, |
258 uint32_t d_height, uint32_t flags, char *title, | |
259 uint32_t format) | |
1 | 260 { |
1110 | 261 // int screen; |
12582 | 262 int fullscreen = 0; |
263 int vm = 0; | |
264 | |
1110 | 265 // int interval, prefer_blank, allow_exp, nothing; |
12582 | 266 unsigned int fg, bg; |
267 XEvent xev; | |
268 XGCValues xgcv; | |
269 Colormap theCmap; | |
270 XSetWindowAttributes xswa; | |
271 unsigned long xswamask; | |
272 | |
4426
1ceadec3ea67
using the common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4420
diff
changeset
|
273 #ifdef HAVE_XF86VM |
12582 | 274 unsigned int modeline_width, modeline_height; |
275 static uint32_t vm_width; | |
276 static uint32_t vm_height; | |
4426
1ceadec3ea67
using the common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4420
diff
changeset
|
277 #endif |
1 | 278 |
12582 | 279 vo_mouse_autohide = 1; |
280 old_vo_dwidth = -1; | |
281 old_vo_dheight = -1; | |
6013
7f6e02a16ac4
some bugfix, x[11|mga|v] ( fullscreen with more files )
pontscho
parents:
5999
diff
changeset
|
282 |
12582 | 283 if (!title) |
284 title = strdup("MPlayer X11 (XImage/Shm) render"); | |
4813 | 285 |
12582 | 286 in_format = format; |
287 srcW = width; | |
288 srcH = height; | |
289 vo_dx = (vo_screenwidth - d_width) / 2; | |
290 vo_dy = (vo_screenheight - d_height) / 2; | |
291 geometry(&vo_dx, &vo_dy, &d_width, &d_height, vo_screenwidth, | |
292 vo_screenheight); | |
293 vo_dwidth = d_width; | |
294 vo_dheight = d_height; | |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10728
diff
changeset
|
295 |
12582 | 296 if (flags & 0x03) |
297 fullscreen = 1; | |
298 if (flags & 0x02) | |
299 vm = 1; | |
300 if (flags & 0x08) | |
301 Flip_Flag = 1; | |
302 zoomFlag = flags & 0x04; | |
303 | |
304 int_pause = 0; | |
4677
305a0c20bde4
default is allways nozoom again (specify -zoom if u want the sane behavior)
michael
parents:
4662
diff
changeset
|
305 // if(!fullscreen) zoomFlag=1; //it makes no sense to avoid zooming on windowd mode |
12582 | 306 |
2218 | 307 //printf( "w: %d h: %d\n\n",vo_dwidth,vo_dheight ); |
1746 | 308 |
12582 | 309 XGetWindowAttributes(mDisplay, mRootWin, &attribs); |
310 depth = attribs.depth; | |
311 | |
312 if (depth != 15 && depth != 16 && depth != 24 && depth != 32) | |
313 { | |
314 Visual *visual; | |
1746 | 315 |
12582 | 316 depth = vo_find_depth_from_visuals(mDisplay, mScreen, &visual); |
317 } | |
318 if (!XMatchVisualInfo(mDisplay, mScreen, depth, DirectColor, &vinfo) || | |
319 (WinID > 0 | |
320 && vinfo.visualid != XVisualIDFromVisual(attribs.visual))) | |
321 XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &vinfo); | |
1746 | 322 |
12582 | 323 /* set image size (which is indeed neither the input nor output size), |
324 if zoom is on it will be changed during draw_slice anyway so we don't duplicate the aspect code here | |
325 */ | |
326 image_width = (width + 7) & (~7); | |
327 image_height = height; | |
4661
4df2400b0527
-fs and or -vm default is nozoom, -zoom does the expected thing
michael
parents:
4658
diff
changeset
|
328 |
12582 | 329 aspect = ((1 << 16) * d_width + d_height / 2) / d_height; |
2218 | 330 |
1752 | 331 #ifdef HAVE_NEW_GUI |
12582 | 332 if (use_gui) |
333 guiGetEvent(guiSetShVideo, 0); // the GUI will set up / resize the window | |
334 else | |
335 #endif | |
336 { | |
2094
dc11de07b5e7
grabs mouse with -vm - patch by Uwe Reder <Uwe.Reder@3SOFT.de>
arpi
parents:
1924
diff
changeset
|
337 #ifdef HAVE_XF86VM |
12582 | 338 if (vm) |
339 { | |
340 if ((d_width == 0) && (d_height == 0)) | |
341 { | |
342 vm_width = image_width; | |
343 vm_height = image_height; | |
344 } else | |
345 { | |
346 vm_width = d_width; | |
347 vm_height = d_height; | |
348 } | |
349 vo_vm_switch(vm_width, vm_height, &modeline_width, | |
350 &modeline_height); | |
351 vo_dx = (vo_screenwidth - modeline_width) / 2; | |
352 vo_dy = (vo_screenheight - modeline_height) / 2; | |
353 vo_dwidth = modeline_width; | |
354 vo_dheight = modeline_height; | |
355 } | |
2094
dc11de07b5e7
grabs mouse with -vm - patch by Uwe Reder <Uwe.Reder@3SOFT.de>
arpi
parents:
1924
diff
changeset
|
356 #endif |
12582 | 357 bg = WhitePixel(mDisplay, mScreen); |
358 fg = BlackPixel(mDisplay, mScreen); | |
1 | 359 |
12582 | 360 theCmap = vo_x11_create_colormap(&vinfo); |
1 | 361 |
12582 | 362 xswa.background_pixel = 0; |
363 xswa.border_pixel = 0; | |
364 xswa.colormap = theCmap; | |
365 xswamask = CWBackPixel | CWBorderPixel | CWColormap; | |
1 | 366 |
2094
dc11de07b5e7
grabs mouse with -vm - patch by Uwe Reder <Uwe.Reder@3SOFT.de>
arpi
parents:
1924
diff
changeset
|
367 #ifdef HAVE_XF86VM |
12582 | 368 if (vm) |
369 { | |
370 xswa.override_redirect = True; | |
371 xswamask |= CWOverrideRedirect; | |
372 } | |
2094
dc11de07b5e7
grabs mouse with -vm - patch by Uwe Reder <Uwe.Reder@3SOFT.de>
arpi
parents:
1924
diff
changeset
|
373 #endif |
12582 | 374 |
375 if (WinID >= 0) | |
376 { | |
377 vo_window = WinID ? ((Window) WinID) : mRootWin; | |
378 if (WinID) | |
379 { | |
380 XUnmapWindow(mDisplay, vo_window); | |
381 XChangeWindowAttributes(mDisplay, vo_window, xswamask, | |
382 &xswa); | |
383 vo_x11_selectinput_witherr(mDisplay, vo_window, | |
384 StructureNotifyMask | | |
385 KeyPressMask | | |
386 PropertyChangeMask | | |
387 PointerMotionMask | | |
388 ButtonPressMask | | |
389 ButtonReleaseMask | | |
390 ExposureMask); | |
391 XMapWindow(mDisplay, vo_window); | |
392 } else | |
393 XSelectInput(mDisplay, vo_window, ExposureMask); | |
394 } else | |
395 { | |
396 if (vo_window == None) | |
397 { | |
398 vo_window = | |
399 vo_x11_create_smooth_window(mDisplay, mRootWin, | |
400 vinfo.visual, vo_dx, vo_dy, | |
401 vo_dwidth, vo_dheight, | |
402 depth, theCmap); | |
2094
dc11de07b5e7
grabs mouse with -vm - patch by Uwe Reder <Uwe.Reder@3SOFT.de>
arpi
parents:
1924
diff
changeset
|
403 |
12582 | 404 vo_x11_classhint(mDisplay, vo_window, "x11"); |
405 vo_hidecursor(mDisplay, vo_window); | |
406 vo_x11_sizehint(vo_dx, vo_dy, vo_dwidth, vo_dheight, 0); | |
407 XSelectInput(mDisplay, vo_window, StructureNotifyMask); | |
408 XStoreName(mDisplay, vo_window, title); | |
409 XMapWindow(mDisplay, vo_window); | |
7764 | 410 // if(WinID!=0) |
12582 | 411 do |
412 { | |
413 XNextEvent(mDisplay, &xev); | |
414 } | |
415 while (xev.type != MapNotify | |
416 || xev.xmap.event != vo_window); | |
417 | |
418 if (fullscreen) | |
419 vo_x11_fullscreen(); | |
6043 | 420 #ifdef HAVE_XINERAMA |
12582 | 421 vo_x11_xinerama_move(mDisplay, vo_window); |
6043 | 422 #endif |
12582 | 423 } else if (!fullscreen) |
424 XMoveResizeWindow(mDisplay, vo_window, vo_dx, vo_dy, | |
425 vo_dwidth, vo_dheight); | |
426 } | |
6043 | 427 |
12582 | 428 XSync(mDisplay, False); |
1 | 429 |
12582 | 430 // we cannot grab mouse events on root window :( |
431 vo_x11_selectinput_witherr(mDisplay, vo_window, | |
432 StructureNotifyMask | KeyPressMask | | |
433 PropertyChangeMask | ExposureMask | | |
434 ((WinID == | |
435 0) ? 0 : (ButtonPressMask | | |
436 ButtonReleaseMask | | |
437 PointerMotionMask))); | |
4805 | 438 |
2094
dc11de07b5e7
grabs mouse with -vm - patch by Uwe Reder <Uwe.Reder@3SOFT.de>
arpi
parents:
1924
diff
changeset
|
439 #ifdef HAVE_XF86VM |
12582 | 440 if (vm) |
441 { | |
442 /* Grab the mouse pointer in our window */ | |
443 if (vo_grabpointer) | |
444 XGrabPointer(mDisplay, vo_window, True, 0, | |
445 GrabModeAsync, GrabModeAsync, | |
446 vo_window, None, CurrentTime); | |
447 XSetInputFocus(mDisplay, vo_window, RevertToNone, CurrentTime); | |
448 } | |
2094
dc11de07b5e7
grabs mouse with -vm - patch by Uwe Reder <Uwe.Reder@3SOFT.de>
arpi
parents:
1924
diff
changeset
|
449 #endif |
12582 | 450 } |
1 | 451 |
12582 | 452 if (vo_gc != None) |
453 XFreeGC(mDisplay, vo_gc); | |
454 vo_gc = XCreateGC(mDisplay, vo_window, 0L, &xgcv); | |
455 | |
456 if (myximage) | |
457 { | |
458 freeMyXImage(); | |
459 sws_freeContext(swsContext); | |
460 } | |
461 getMyXImage(); | |
462 | |
463 if (!WinID) | |
464 { | |
465 vo_dwidth = vo_screenwidth; | |
466 vo_dheight = vo_screenheight; | |
467 } | |
1 | 468 |
12582 | 469 switch ((bpp = myximage->bits_per_pixel)) |
470 { | |
471 case 24: | |
472 draw_alpha_fnc = draw_alpha_24; | |
473 out_format = IMGFMT_BGR24; | |
474 break; | |
475 case 32: | |
476 draw_alpha_fnc = draw_alpha_32; | |
477 out_format = IMGFMT_BGR32; | |
478 break; | |
479 case 15: | |
480 case 16: | |
481 if (depth == 15) | |
482 { | |
483 draw_alpha_fnc = draw_alpha_15; | |
484 out_format = IMGFMT_BGR15; | |
485 } else | |
486 { | |
487 draw_alpha_fnc = draw_alpha_16; | |
488 out_format = IMGFMT_BGR16; | |
489 } | |
490 break; | |
491 case 8: | |
492 draw_alpha_fnc = draw_alpha_null; | |
493 out_format = IMGFMT_BGR8; | |
494 break; | |
495 default: | |
496 draw_alpha_fnc = draw_alpha_null; | |
497 } | |
1 | 498 |
12582 | 499 /* always allocate swsContext as size could change between frames */ |
500 swsContext = | |
501 sws_getContextFromCmdLine(width, height, in_format, width, height, | |
502 out_format); | |
503 if (!swsContext) | |
504 return -1; | |
1 | 505 |
12582 | 506 //printf( "X11 bpp: %d color mask: R:%lX G:%lX B:%lX\n",bpp,myximage->red_mask,myximage->green_mask,myximage->blue_mask ); |
1 | 507 |
12582 | 508 // If we have blue in the lowest bit then obviously RGB |
509 mode = ((myximage->blue_mask & 0x01) != 0) ? MODE_RGB : MODE_BGR; | |
1 | 510 #ifdef WORDS_BIGENDIAN |
12582 | 511 if (myximage->byte_order != MSBFirst) |
1 | 512 #else |
12582 | 513 if (myximage->byte_order != LSBFirst) |
1 | 514 #endif |
12582 | 515 { |
516 mode = ((myximage->blue_mask & 0x01) != 0) ? MODE_BGR : MODE_RGB; | |
4382 | 517 // printf( "No support for non-native XImage byte order!\n" ); |
1137
4c7b219e126c
patch: some X11 compliance fixed: set ClassHint and better fullscreen mode
arpi_esp
parents:
1110
diff
changeset
|
518 // return -1; |
12582 | 519 } |
5248
f23cea00d19c
print meaningfull error message instead of "hmm, arpi said that isnt used...
michael
parents:
5163
diff
changeset
|
520 #ifdef WORDS_BIGENDIAN |
12582 | 521 if (mode == MODE_BGR && bpp != 32) |
522 { | |
523 mp_msg(MSGT_VO, MSGL_ERR, | |
524 "BGR%d not supported, please contact the developers\n", | |
525 bpp); | |
526 return -1; | |
527 } | |
5248
f23cea00d19c
print meaningfull error message instead of "hmm, arpi said that isnt used...
michael
parents:
5163
diff
changeset
|
528 #else |
12582 | 529 if (mode == MODE_BGR) |
530 { | |
531 mp_msg(MSGT_VO, MSGL_ERR, | |
532 "BGR not supported, please contact the developers\n"); | |
533 return -1; | |
534 } | |
535 #endif | |
1 | 536 |
12582 | 537 if (vo_ontop) |
538 vo_x11_setlayer(mDisplay, vo_window, vo_ontop); | |
11542 | 539 |
12582 | 540 return 0; |
1 | 541 } |
542 | |
12582 | 543 static void Display_Image(XImage * myximage, uint8_t * ImageData) |
1 | 544 { |
3003 | 545 #ifdef HAVE_SHM |
12582 | 546 if (Shmem_Flag) |
547 { | |
548 XShmPutImage(mDisplay, vo_window, vo_gc, myximage, | |
549 0, 0, | |
550 (vo_dwidth - swsContext->dstW) / 2, | |
551 (vo_dheight - myximage->height) / 2, swsContext->dstW, | |
552 myximage->height, True); | |
553 } else | |
1 | 554 #endif |
12582 | 555 { |
556 XPutImage(mDisplay, vo_window, vo_gc, myximage, | |
557 0, 0, | |
558 (vo_dwidth - swsContext->dstW) / 2, | |
559 (vo_dheight - myximage->height) / 2, swsContext->dstW, | |
560 myximage->height); | |
561 } | |
1 | 562 } |
563 | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1137
diff
changeset
|
564 static void draw_osd(void) |
12582 | 565 { |
566 vo_draw_text(image_width, image_height, draw_alpha_fnc); | |
567 } | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1137
diff
changeset
|
568 |
12582 | 569 static void flip_page(void) |
570 { | |
571 Display_Image(myximage, ImageData); | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1137
diff
changeset
|
572 XSync(mDisplay, False); |
31 | 573 } |
1 | 574 |
12582 | 575 static uint32_t draw_slice(uint8_t * src[], int stride[], int w, int h, |
576 int x, int y) | |
1 | 577 { |
12582 | 578 uint8_t *dst[3]; |
579 int dstStride[3]; | |
6059 | 580 |
12582 | 581 if ((old_vo_dwidth != vo_dwidth |
582 || old_vo_dheight != vo_dheight) /*&& y==0 */ && zoomFlag) | |
583 { | |
584 int newW = vo_dwidth; | |
585 int newH = vo_dheight; | |
586 int newAspect = (newW * (1 << 16) + (newH >> 1)) / newH; | |
587 SwsContext *oldContext = swsContext; | |
4641 | 588 |
12582 | 589 if (newAspect > aspect) |
590 newW = (newH * aspect + (1 << 15)) >> 16; | |
591 else | |
592 newH = ((newW << 16) + (aspect >> 1)) / aspect; | |
4641 | 593 |
12582 | 594 old_vo_dwidth = vo_dwidth; |
595 old_vo_dheight = vo_dheight; | |
596 | |
597 if (sws_flags == 0) | |
598 newW &= (~31); // not needed but, if the user wants the FAST_BILINEAR SCALER, then its needed | |
4627 | 599 |
12582 | 600 swsContext = sws_getContextFromCmdLine(srcW, srcH, in_format, |
601 newW, newH, out_format); | |
602 if (swsContext) | |
603 { | |
604 image_width = (newW + 7) & (~7); | |
605 image_height = newH; | |
4420
a7bac05524a1
real window resizeing support (i know nearly nothing about x11 so feel free to fix / reverse it, if its broken)
michael
parents:
4382
diff
changeset
|
606 |
12582 | 607 freeMyXImage(); |
608 getMyXImage(); | |
609 sws_freeContext(oldContext); | |
610 } else | |
611 { | |
612 swsContext = oldContext; | |
613 } | |
614 } | |
615 dstStride[1] = dstStride[2] = 0; | |
616 dst[1] = dst[2] = NULL; | |
617 | |
618 if (Flip_Flag) | |
619 { | |
620 dstStride[0] = -image_width * ((bpp + 7) / 8); | |
621 dst[0] = ImageData - dstStride[0] * (image_height - 1); | |
622 sws_scale_ordered(swsContext, src, stride, y, h, dst, dstStride); | |
623 } else | |
624 { | |
625 dstStride[0] = image_width * ((bpp + 7) / 8); | |
626 dst[0] = ImageData; | |
627 sws_scale_ordered(swsContext, src, stride, y, h, dst, dstStride); | |
628 } | |
629 return 0; | |
1 | 630 } |
631 | |
12582 | 632 static uint32_t draw_frame(uint8_t * src[]) |
633 { | |
7683 | 634 #if 0 |
12582 | 635 int stride[3] = { 0, 0, 0 }; |
636 | |
637 if (in_format == IMGFMT_YUY2) | |
638 stride[0] = srcW * 2; | |
639 else if (in_format == IMGFMT_BGR8) | |
640 stride[0] = srcW; | |
641 else if (in_format == IMGFMT_BGR15) | |
642 stride[0] = srcW * 2; | |
643 else if (in_format == IMGFMT_BGR16) | |
644 stride[0] = srcW * 2; | |
645 else if (in_format == IMGFMT_BGR24) | |
646 stride[0] = srcW * 3; | |
647 else if (in_format == IMGFMT_BGR32) | |
648 stride[0] = srcW * 4; | |
649 | |
650 return draw_slice(src, stride, srcW, srcH, 0, 0); | |
7683 | 651 #else |
652 printf("draw_frame() called!!!!!!\n"); | |
653 return -1; | |
654 #endif | |
655 } | |
656 | |
12582 | 657 static uint32_t get_image(mp_image_t * mpi) |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
658 { |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
659 if (zoomFlag || |
12582 | 660 !IMGFMT_IS_BGR(mpi->imgfmt) || |
661 (IMGFMT_BGR_DEPTH(mpi->imgfmt) != vo_depthonscreen) || | |
662 ((mpi->type != MP_IMGTYPE_STATIC) | |
663 && (mpi->type != MP_IMGTYPE_TEMP)) | |
664 || (mpi->flags & MP_IMGFLAG_PLANAR) | |
665 || (mpi->flags & MP_IMGFLAG_YUV) || (mpi->width != image_width) | |
666 || (mpi->height != image_height)) | |
667 return (VO_FALSE); | |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
668 |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
669 if (Flip_Flag) |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
670 { |
12582 | 671 mpi->stride[0] = -image_width * ((bpp + 7) / 8); |
672 mpi->planes[0] = ImageData - mpi->stride[0] * (image_height - 1); | |
673 } else | |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
674 { |
12582 | 675 mpi->stride[0] = image_width * ((bpp + 7) / 8); |
676 mpi->planes[0] = ImageData; | |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
677 } |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
678 mpi->flags |= MP_IMGFLAG_DIRECT; |
12582 | 679 |
680 return (VO_TRUE); | |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
681 } |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
682 |
12582 | 683 static uint32_t query_format(uint32_t format) |
1 | 684 { |
12582 | 685 mp_msg(MSGT_VO, MSGL_DBG2, |
686 "vo_x11: query_format was called: %x (%s)\n", format, | |
687 vo_format_name(format)); | |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
688 if (IMGFMT_IS_BGR(format)) |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
689 { |
12582 | 690 if (IMGFMT_BGR_DEPTH(format) <= 8) |
691 return 0; // TODO 8bpp not yet fully implemented | |
692 if (IMGFMT_BGR_DEPTH(format) == vo_depthonscreen) | |
693 return 3 | VFCAP_OSD | VFCAP_SWSCALE | VFCAP_FLIP | | |
694 VFCAP_ACCEPT_STRIDE; | |
695 else | |
696 return 1 | VFCAP_OSD | VFCAP_SWSCALE | VFCAP_FLIP | | |
697 VFCAP_ACCEPT_STRIDE; | |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
698 } |
325 | 699 |
12582 | 700 switch (format) |
701 { | |
6692
ad521fb49a5e
-vm -fs -zoom fix, set correct vm screenres in aspect code (similar to xv fix).
atmos4
parents:
6180
diff
changeset
|
702 // case IMGFMT_BGR8: |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
703 // case IMGFMT_BGR15: |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
704 // case IMGFMT_BGR16: |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
705 // case IMGFMT_BGR24: |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
706 // case IMGFMT_BGR32: |
6694
9291268a3603
1000l, back out hack-n-slay 8bpp code from my local tree.
atmos4
parents:
6693
diff
changeset
|
707 // return 0x2; |
4905
eb1a28f1236a
yuy2 support disabled to workaround stupid colorspace selection
michael
parents:
4889
diff
changeset
|
708 // case IMGFMT_YUY2: |
12582 | 709 case IMGFMT_I420: |
710 case IMGFMT_IYUV: | |
711 case IMGFMT_YV12: | |
712 return 1 | VFCAP_OSD | VFCAP_SWSCALE | VFCAP_ACCEPT_STRIDE; | |
713 } | |
714 return 0; | |
1 | 715 } |
716 | |
717 | |
7683 | 718 static void uninit(void) |
1 | 719 { |
12582 | 720 if (!myximage) |
721 return; | |
722 | |
723 freeMyXImage(); | |
4426
1ceadec3ea67
using the common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4420
diff
changeset
|
724 |
206
82b5ae8ceaf4
adds XF86VidMode support to vo_x11.c to do "pseudo-scaling"
mgraffam
parents:
202
diff
changeset
|
725 #ifdef HAVE_XF86VM |
12582 | 726 vo_vm_close(mDisplay); |
206
82b5ae8ceaf4
adds XF86VidMode support to vo_x11.c to do "pseudo-scaling"
mgraffam
parents:
202
diff
changeset
|
727 #endif |
4426
1ceadec3ea67
using the common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4420
diff
changeset
|
728 |
12582 | 729 zoomFlag = 0; |
730 vo_x11_uninit(); | |
4677
305a0c20bde4
default is allways nozoom again (specify -zoom if u want the sane behavior)
michael
parents:
4662
diff
changeset
|
731 |
12582 | 732 sws_freeContext(swsContext); |
1 | 733 } |
734 | |
4352 | 735 static uint32_t preinit(const char *arg) |
736 { | |
12582 | 737 if (arg) |
4737
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4734
diff
changeset
|
738 { |
12582 | 739 mp_msg(MSGT_VO, MSGL_ERR, "vo_x11: Unknown subdevice: %s\n", arg); |
740 return ENOSYS; | |
4737
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4734
diff
changeset
|
741 } |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
742 |
12582 | 743 if (!vo_init()) |
744 return -1; // Can't open X11 | |
4737
32e1f5042f65
I don't like such reports: '-vo dga:vidix or -vo x11:vidix works fine for me'
nick
parents:
4734
diff
changeset
|
745 return 0; |
4352 | 746 } |
1 | 747 |
4596 | 748 static uint32_t control(uint32_t request, void *data, ...) |
4352 | 749 { |
12582 | 750 switch (request) |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7765
diff
changeset
|
751 { |
12582 | 752 case VOCTRL_PAUSE: |
753 return (int_pause = 1); | |
754 case VOCTRL_RESUME: | |
755 return (int_pause = 0); | |
756 case VOCTRL_QUERY_FORMAT: | |
757 return query_format(*((uint32_t *) data)); | |
758 case VOCTRL_GUISUPPORT: | |
759 return VO_TRUE; | |
760 case VOCTRL_GET_IMAGE: | |
761 return get_image(data); | |
762 case VOCTRL_SET_EQUALIZER: | |
763 { | |
764 va_list ap; | |
765 int value; | |
766 | |
767 va_start(ap, data); | |
768 value = va_arg(ap, int); | |
769 | |
770 va_end(ap); | |
771 return vo_x11_set_equalizer(data, value); | |
772 } | |
773 case VOCTRL_GET_EQUALIZER: | |
774 { | |
775 va_list ap; | |
776 int *value; | |
777 | |
778 va_start(ap, data); | |
779 value = va_arg(ap, int *); | |
780 | |
781 va_end(ap); | |
782 return vo_x11_get_equalizer(data, value); | |
783 } | |
784 case VOCTRL_ONTOP: | |
785 vo_x11_ontop(); | |
786 return VO_TRUE; | |
787 case VOCTRL_FULLSCREEN: | |
788 { | |
789 vo_x11_fullscreen(); | |
790 vo_x11_clearwindow(mDisplay, vo_window); | |
791 } | |
792 return VO_TRUE; | |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7765
diff
changeset
|
793 } |
12582 | 794 return VO_NOTIMPL; |
4352 | 795 } |