Mercurial > mplayer.hg
annotate libvo/vo_x11.c @ 28063:a318969a4f45
Set the base size window manager hint, otherwise some subtract the minimum
size of 4x4 from the numbers displayed to the user which might be confusing.
Based on patch by Bert Wesarg [bert wesarg googlemail com].
author | reimar |
---|---|
date | Fri, 05 Dec 2008 19:01:49 +0000 |
parents | 452231ce45b9 |
children | 04adf13a4341 |
rev | line source |
---|---|
1 | 1 |
2 #include <stdio.h> | |
3 #include <stdlib.h> | |
4 #include <string.h> | |
5 | |
6 #include "config.h" | |
7 #include "video_out.h" | |
8 #include "video_out_internal.h" | |
27972
f7b92cea7436
Use aspect.c code in vo_x11.c. Removes some inconsistencies in -wid handling.
reimar
parents:
27943
diff
changeset
|
9 #include "aspect.h" |
1 | 10 |
11 | |
12 #include <X11/Xlib.h> | |
13 #include <X11/Xutil.h> | |
4036 | 14 |
1 | 15 #include <errno.h> |
16 | |
31 | 17 #include "x11_common.h" |
18 | |
11690
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
19 #ifdef HAVE_SHM |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
20 #include <sys/ipc.h> |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
21 #include <sys/shm.h> |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
22 #include <X11/extensions/XShm.h> |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
23 |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
24 static int Shmem_Flag; |
12582 | 25 |
25962 | 26 //static int Quiet_Flag; Here also what is this for. It's used but isn't initialized? |
11690
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
27 static XShmSegmentInfo Shminfo[1]; |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
28 static int gXErrorFlag; |
12582 | 29 static int CompletionType = -1; |
11690
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
30 #endif |
860bc06f32ca
just the same include reordering as in vo_xv (codemetics :)
alex
parents:
11542
diff
changeset
|
31 |
616 | 32 #include "sub.h" |
350 | 33 |
18861 | 34 #include "libswscale/swscale.h" |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
13056
diff
changeset
|
35 #include "libmpcodecs/vf_scale.h" |
18746 | 36 #define MODE_RGB 0x1 |
37 #define MODE_BGR 0x2 | |
2218 | 38 |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
13056
diff
changeset
|
39 #include "mp_msg.h" |
18234
a107276371a8
Part 5 and final of otvos attila's oattila AT chello-hu mp_msg changes, with lots of corrections
reynaldo
parents:
18116
diff
changeset
|
40 #include "help_mp.h" |
4734 | 41 |
27343 | 42 #ifdef CONFIG_GUI |
23077 | 43 #include "gui/interface.h" |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
13056
diff
changeset
|
44 #include "mplayer.h" |
6013
7f6e02a16ac4
some bugfix, x[11|mga|v] ( fullscreen with more files )
pontscho
parents:
5999
diff
changeset
|
45 #endif |
7f6e02a16ac4
some bugfix, x[11|mga|v] ( fullscreen with more files )
pontscho
parents:
5999
diff
changeset
|
46 |
25216 | 47 static const vo_info_t info = { |
12582 | 48 "X11 ( XImage/Shm )", |
49 "x11", | |
50 "Aaron Holtzman <aholtzma@ess.engr.uvic.ca>", | |
51 "" | |
1 | 52 }; |
53 | |
25220
c9e9ac2008c2
Mark the vo_functions_t definitions as const where possible.
reimar
parents:
25216
diff
changeset
|
54 const LIBVO_EXTERN(x11) |
1 | 55 /* private prototypes */ |
12582 | 56 static void Display_Image(XImage * myximage, unsigned char *ImageData); |
57 static void (*draw_alpha_fnc) (int x0, int y0, int w, int h, | |
58 unsigned char *src, unsigned char *srca, | |
59 int stride); | |
1 | 60 |
61 /* local data */ | |
62 static unsigned char *ImageData; | |
21585
e54f539c9b5d
Align image data pointer, this is also in preparation of an upcoming patch
reimar
parents:
21584
diff
changeset
|
63 //! original unaligned pointer for free |
e54f539c9b5d
Align image data pointer, this is also in preparation of an upcoming patch
reimar
parents:
21584
diff
changeset
|
64 static unsigned char *ImageDataOrig; |
1 | 65 |
66 /* X11 related variables */ | |
7764 | 67 static XImage *myximage = NULL; |
23381
300e9b7c499f
Remove some unused variables, patch by timwoj ieee org.
diego
parents:
23376
diff
changeset
|
68 static int depth, bpp; |
1 | 69 static XWindowAttributes attribs; |
70 | |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10728
diff
changeset
|
71 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
|
72 |
2969 | 73 static int Flip_Flag; |
4661
4df2400b0527
-fs and or -vm default is nozoom, -zoom does the expected thing
michael
parents:
4658
diff
changeset
|
74 static int zoomFlag; |
2969 | 75 |
1 | 76 |
77 static uint32_t image_width; | |
78 static uint32_t image_height; | |
4641 | 79 static uint32_t in_format; |
12582 | 80 static uint32_t out_format = 0; |
21586
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
81 static int out_offset; |
12582 | 82 static int srcW = -1; |
83 static int srcH = -1; | |
1 | 84 |
12582 | 85 static int old_vo_dwidth = -1; |
86 static int old_vo_dheight = -1; | |
87 | |
22886 | 88 static void check_events(void) |
12582 | 89 { |
90 int ret = vo_x11_check_events(mDisplay); | |
6013
7f6e02a16ac4
some bugfix, x[11|mga|v] ( fullscreen with more files )
pontscho
parents:
5999
diff
changeset
|
91 |
27977
452231ce45b9
Clear the whole window on resize in vo_x11 since we do not
reimar
parents:
27976
diff
changeset
|
92 if (ret & VO_EVENT_RESIZE) |
452231ce45b9
Clear the whole window on resize in vo_x11 since we do not
reimar
parents:
27976
diff
changeset
|
93 vo_x11_clearwindow(mDisplay, vo_window); |
452231ce45b9
Clear the whole window on resize in vo_x11 since we do not
reimar
parents:
27976
diff
changeset
|
94 else if (ret & VO_EVENT_EXPOSE) |
12582 | 95 vo_x11_clearwindow_part(mDisplay, vo_window, myximage->width, |
96 myximage->height, 0); | |
27976 | 97 if (ret & VO_EVENT_EXPOSE && int_pause) |
12582 | 98 flip_page(); |
99 } | |
100 | |
101 static void draw_alpha_32(int x0, int y0, int w, int h, unsigned char *src, | |
102 unsigned char *srca, int stride) | |
103 { | |
104 vo_draw_alpha_rgb32(w, h, src, srca, stride, | |
105 ImageData + 4 * (y0 * image_width + x0), | |
106 4 * image_width); | |
1 | 107 } |
108 | |
12582 | 109 static void draw_alpha_24(int x0, int y0, int w, int h, unsigned char *src, |
110 unsigned char *srca, int stride) | |
111 { | |
112 vo_draw_alpha_rgb24(w, h, src, srca, stride, | |
113 ImageData + 3 * (y0 * image_width + x0), | |
114 3 * image_width); | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
115 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
116 |
12582 | 117 static void draw_alpha_16(int x0, int y0, int w, int h, unsigned char *src, |
118 unsigned char *srca, int stride) | |
119 { | |
120 vo_draw_alpha_rgb16(w, h, src, srca, stride, | |
121 ImageData + 2 * (y0 * image_width + x0), | |
122 2 * image_width); | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
123 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
124 |
12582 | 125 static void draw_alpha_15(int x0, int y0, int w, int h, unsigned char *src, |
126 unsigned char *srca, int stride) | |
127 { | |
128 vo_draw_alpha_rgb15(w, h, src, srca, stride, | |
129 ImageData + 2 * (y0 * image_width + x0), | |
130 2 * image_width); | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
131 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
132 |
12582 | 133 static void draw_alpha_null(int x0, int y0, int w, int h, |
134 unsigned char *src, unsigned char *srca, | |
135 int stride) | |
136 { | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
137 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
138 |
18746 | 139 static struct SwsContext *swsContext = NULL; |
140 static int dst_width; | |
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
|
141 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
|
142 |
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
|
143 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
|
144 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
16171
diff
changeset
|
145 static void getMyXImage(void) |
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
|
146 { |
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 #ifdef HAVE_SHM |
12582 | 148 if (mLocalDisplay && XShmQueryExtension(mDisplay)) |
149 Shmem_Flag = 1; | |
150 else | |
151 { | |
152 Shmem_Flag = 0; | |
153 mp_msg(MSGT_VO, MSGL_WARN, | |
154 "Shared memory not supported\nReverting to normal Xlib\n"); | |
155 } | |
156 if (Shmem_Flag) | |
157 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
|
158 |
12582 | 159 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
|
160 { |
12582 | 161 myximage = |
162 XShmCreateImage(mDisplay, vinfo.visual, depth, ZPixmap, NULL, | |
163 &Shminfo[0], image_width, image_height); | |
164 if (myximage == NULL) | |
165 { | |
166 mp_msg(MSGT_VO, MSGL_WARN, | |
167 "Shared memory error,disabling ( Ximage error )\n"); | |
168 goto shmemerror; | |
169 } | |
170 Shminfo[0].shmid = shmget(IPC_PRIVATE, | |
171 myximage->bytes_per_line * | |
172 myximage->height, IPC_CREAT | 0777); | |
173 if (Shminfo[0].shmid < 0) | |
174 { | |
175 XDestroyImage(myximage); | |
176 mp_msg(MSGT_VO, MSGL_V, "%s\n", strerror(errno)); | |
177 //perror( strerror( errno ) ); | |
178 mp_msg(MSGT_VO, MSGL_WARN, | |
179 "Shared memory error,disabling ( seg id error )\n"); | |
180 goto shmemerror; | |
181 } | |
182 Shminfo[0].shmaddr = (char *) shmat(Shminfo[0].shmid, 0, 0); | |
3209 | 183 |
12582 | 184 if (Shminfo[0].shmaddr == ((char *) -1)) |
185 { | |
186 XDestroyImage(myximage); | |
187 if (Shminfo[0].shmaddr != ((char *) -1)) | |
188 shmdt(Shminfo[0].shmaddr); | |
189 mp_msg(MSGT_VO, MSGL_WARN, | |
190 "Shared memory error,disabling ( address error )\n"); | |
191 goto shmemerror; | |
192 } | |
193 myximage->data = Shminfo[0].shmaddr; | |
194 ImageData = (unsigned char *) myximage->data; | |
195 Shminfo[0].readOnly = False; | |
196 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
|
197 |
12582 | 198 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
|
199 |
12582 | 200 if (gXErrorFlag) |
201 { | |
202 XDestroyImage(myximage); | |
203 shmdt(Shminfo[0].shmaddr); | |
204 mp_msg(MSGT_VO, MSGL_WARN, "Shared memory error,disabling.\n"); | |
205 gXErrorFlag = 0; | |
206 goto shmemerror; | |
207 } else | |
208 shmctl(Shminfo[0].shmid, IPC_RMID, 0); | |
209 | |
210 { | |
211 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
|
212 |
12582 | 213 if (firstTime) |
214 { | |
215 mp_msg(MSGT_VO, MSGL_V, "Sharing memory.\n"); | |
216 firstTime = 0; | |
217 } | |
218 } | |
219 } else | |
220 { | |
221 shmemerror: | |
222 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
|
223 #endif |
21584
3ddf91e141a3
Use XCreateImage instead of XGetImage, this is not only more correct and
reimar
parents:
20399
diff
changeset
|
224 myximage = XCreateImage(mDisplay, vinfo.visual, depth, ZPixmap, |
3ddf91e141a3
Use XCreateImage instead of XGetImage, this is not only more correct and
reimar
parents:
20399
diff
changeset
|
225 0, NULL, image_width, image_height, 8, 0); |
21585
e54f539c9b5d
Align image data pointer, this is also in preparation of an upcoming patch
reimar
parents:
21584
diff
changeset
|
226 ImageDataOrig = malloc(myximage->bytes_per_line * image_height + 32); |
e54f539c9b5d
Align image data pointer, this is also in preparation of an upcoming patch
reimar
parents:
21584
diff
changeset
|
227 myximage->data = ImageDataOrig + 16 - ((long)ImageDataOrig & 15); |
21584
3ddf91e141a3
Use XCreateImage instead of XGetImage, this is not only more correct and
reimar
parents:
20399
diff
changeset
|
228 memset(myximage->data, 0, myximage->bytes_per_line * image_height); |
12582 | 229 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
|
230 #ifdef HAVE_SHM |
12582 | 231 } |
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
|
232 #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
|
233 } |
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
|
234 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
16171
diff
changeset
|
235 static void freeMyXImage(void) |
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 { |
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
|
237 #ifdef HAVE_SHM |
12582 | 238 if (Shmem_Flag) |
239 { | |
240 XShmDetach(mDisplay, &Shminfo[0]); | |
241 XDestroyImage(myximage); | |
242 shmdt(Shminfo[0].shmaddr); | |
243 } 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
|
244 #endif |
12582 | 245 { |
21585
e54f539c9b5d
Align image data pointer, this is also in preparation of an upcoming patch
reimar
parents:
21584
diff
changeset
|
246 myximage->data = ImageDataOrig; |
12582 | 247 XDestroyImage(myximage); |
21585
e54f539c9b5d
Align image data pointer, this is also in preparation of an upcoming patch
reimar
parents:
21584
diff
changeset
|
248 ImageDataOrig = NULL; |
12582 | 249 } |
250 myximage = NULL; | |
21584
3ddf91e141a3
Use XCreateImage instead of XGetImage, this is not only more correct and
reimar
parents:
20399
diff
changeset
|
251 ImageData = 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
|
252 } |
2218 | 253 |
20399
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
254 #ifdef WORDS_BIGENDIAN |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
255 #define BO_NATIVE MSBFirst |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
256 #define BO_NONNATIVE LSBFirst |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
257 #else |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
258 #define BO_NATIVE LSBFirst |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
259 #define BO_NONNATIVE MSBFirst |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
260 #endif |
25239 | 261 const struct fmt2Xfmtentry_s { |
20399
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
262 uint32_t mpfmt; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
263 int byte_order; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
264 unsigned red_mask; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
265 unsigned green_mask; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
266 unsigned blue_mask; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
267 } fmt2Xfmt[] = { |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
268 {IMGFMT_RGB8, BO_NATIVE, 0x00000007, 0x00000038, 0x000000C0}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
269 {IMGFMT_RGB8, BO_NONNATIVE, 0x00000007, 0x00000038, 0x000000C0}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
270 {IMGFMT_BGR8, BO_NATIVE, 0x000000E0, 0x0000001C, 0x00000003}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
271 {IMGFMT_BGR8, BO_NONNATIVE, 0x000000E0, 0x0000001C, 0x00000003}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
272 {IMGFMT_RGB15, BO_NATIVE, 0x0000001F, 0x000003E0, 0x00007C00}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
273 {IMGFMT_BGR15, BO_NATIVE, 0x00007C00, 0x000003E0, 0x0000001F}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
274 {IMGFMT_RGB16, BO_NATIVE, 0x0000001F, 0x000007E0, 0x0000F800}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
275 {IMGFMT_BGR16, BO_NATIVE, 0x0000F800, 0x000007E0, 0x0000001F}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
276 {IMGFMT_RGB24, MSBFirst, 0x00FF0000, 0x0000FF00, 0x000000FF}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
277 {IMGFMT_RGB24, LSBFirst, 0x000000FF, 0x0000FF00, 0x00FF0000}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
278 {IMGFMT_BGR24, MSBFirst, 0x000000FF, 0x0000FF00, 0x00FF0000}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
279 {IMGFMT_BGR24, LSBFirst, 0x00FF0000, 0x0000FF00, 0x000000FF}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
280 {IMGFMT_RGB32, BO_NATIVE, 0x000000FF, 0x0000FF00, 0x00FF0000}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
281 {IMGFMT_RGB32, BO_NONNATIVE, 0xFF000000, 0x00FF0000, 0x0000FF00}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
282 {IMGFMT_BGR32, BO_NATIVE, 0x00FF0000, 0x0000FF00, 0x000000FF}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
283 {IMGFMT_BGR32, BO_NONNATIVE, 0x0000FF00, 0x00FF0000, 0xFF000000}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
284 {IMGFMT_ARGB, MSBFirst, 0x00FF0000, 0x0000FF00, 0x000000FF}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
285 {IMGFMT_ARGB, LSBFirst, 0x0000FF00, 0x00FF0000, 0xFF000000}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
286 {IMGFMT_ABGR, MSBFirst, 0x000000FF, 0x0000FF00, 0x00FF0000}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
287 {IMGFMT_ABGR, LSBFirst, 0xFF000000, 0x00FF0000, 0x0000FF00}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
288 {IMGFMT_RGBA, MSBFirst, 0xFF000000, 0x00FF0000, 0x0000FF00}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
289 {IMGFMT_RGBA, LSBFirst, 0x000000FF, 0x0000FF00, 0x00FF0000}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
290 {IMGFMT_BGRA, MSBFirst, 0x0000FF00, 0x00FF0000, 0xFF000000}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
291 {IMGFMT_BGRA, LSBFirst, 0x00FF0000, 0x0000FF00, 0x000000FF}, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
292 {0, 0, 0, 0, 0} |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
293 }; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
294 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15540
diff
changeset
|
295 static int config(uint32_t width, uint32_t height, uint32_t d_width, |
12582 | 296 uint32_t d_height, uint32_t flags, char *title, |
297 uint32_t format) | |
1 | 298 { |
1110 | 299 // int screen; |
12582 | 300 |
1110 | 301 // int interval, prefer_blank, allow_exp, nothing; |
12582 | 302 unsigned int fg, bg; |
303 Colormap theCmap; | |
304 XSetWindowAttributes xswa; | |
305 unsigned long xswamask; | |
25239 | 306 const struct fmt2Xfmtentry_s *fmte = fmt2Xfmt; |
12582 | 307 |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
308 #ifdef CONFIG_XF86VM |
27943 | 309 int vm = flags & VOFLAG_MODESWITCHING; |
4426
1ceadec3ea67
using the common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4420
diff
changeset
|
310 #endif |
27943 | 311 Flip_Flag = flags & VOFLAG_FLIPPING; |
312 zoomFlag = flags & VOFLAG_SWSCALE; | |
1 | 313 |
12582 | 314 old_vo_dwidth = -1; |
315 old_vo_dheight = -1; | |
6013
7f6e02a16ac4
some bugfix, x[11|mga|v] ( fullscreen with more files )
pontscho
parents:
5999
diff
changeset
|
316 |
27880
a28ca0971d9a
Cosmetic changes to vo_x11 to reduce diff to vo_xv for future refactoring.
reimar
parents:
27879
diff
changeset
|
317 int_pause = 0; |
12582 | 318 if (!title) |
17787 | 319 title = "MPlayer X11 (XImage/Shm) render"; |
4813 | 320 |
12582 | 321 in_format = format; |
322 srcW = width; | |
323 srcH = 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
|
324 |
12582 | 325 XGetWindowAttributes(mDisplay, mRootWin, &attribs); |
326 depth = attribs.depth; | |
327 | |
328 if (depth != 15 && depth != 16 && depth != 24 && depth != 32) | |
329 { | |
330 Visual *visual; | |
1746 | 331 |
12582 | 332 depth = vo_find_depth_from_visuals(mDisplay, mScreen, &visual); |
333 } | |
334 if (!XMatchVisualInfo(mDisplay, mScreen, depth, DirectColor, &vinfo) || | |
335 (WinID > 0 | |
336 && vinfo.visualid != XVisualIDFromVisual(attribs.visual))) | |
337 XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &vinfo); | |
1746 | 338 |
12582 | 339 /* set image size (which is indeed neither the input nor output size), |
340 if zoom is on it will be changed during draw_slice anyway so we don't duplicate the aspect code here | |
341 */ | |
342 image_width = (width + 7) & (~7); | |
343 image_height = height; | |
4661
4df2400b0527
-fs and or -vm default is nozoom, -zoom does the expected thing
michael
parents:
4658
diff
changeset
|
344 |
27343 | 345 #ifdef CONFIG_GUI |
12582 | 346 if (use_gui) |
347 guiGetEvent(guiSetShVideo, 0); // the GUI will set up / resize the window | |
348 else | |
349 #endif | |
350 { | |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
351 #ifdef CONFIG_XF86VM |
12582 | 352 if (vm) |
353 { | |
27890
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
354 vo_vm_switch(); |
12582 | 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 |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
367 #ifdef CONFIG_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 |
27891
8742bcad99b5
Use vo_dwidth/vo_dheight for creating the windows instead of d_width/d_height.
reimar
parents:
27890
diff
changeset
|
375 vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy, vo_dwidth, vo_dheight, |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23381
diff
changeset
|
376 flags, theCmap, "x11", title); |
27927
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27903
diff
changeset
|
377 if (WinID > 0) |
6f199f065e15
Factor common code like -wid handling, vo_gc creation etc. out into
reimar
parents:
27903
diff
changeset
|
378 depth = vo_x11_update_geometry(); |
1 | 379 |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
380 #ifdef CONFIG_XF86VM |
12582 | 381 if (vm) |
382 { | |
383 /* Grab the mouse pointer in our window */ | |
384 if (vo_grabpointer) | |
385 XGrabPointer(mDisplay, vo_window, True, 0, | |
386 GrabModeAsync, GrabModeAsync, | |
387 vo_window, None, CurrentTime); | |
388 XSetInputFocus(mDisplay, vo_window, RevertToNone, CurrentTime); | |
389 } | |
2094
dc11de07b5e7
grabs mouse with -vm - patch by Uwe Reder <Uwe.Reder@3SOFT.de>
arpi
parents:
1924
diff
changeset
|
390 #endif |
12582 | 391 } |
1 | 392 |
12582 | 393 if (myximage) |
394 { | |
395 freeMyXImage(); | |
396 sws_freeContext(swsContext); | |
397 } | |
398 getMyXImage(); | |
399 | |
20399
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
400 while (fmte->mpfmt) { |
27762
7efce8fe3a04
fixed image format detection for 15 bit color depths
faust3
parents:
27412
diff
changeset
|
401 int depth = IMGFMT_RGB_DEPTH(fmte->mpfmt); |
7efce8fe3a04
fixed image format detection for 15 bit color depths
faust3
parents:
27412
diff
changeset
|
402 /* bits_per_pixel in X seems to be set to 16 for 15 bit formats |
7efce8fe3a04
fixed image format detection for 15 bit color depths
faust3
parents:
27412
diff
changeset
|
403 => force depth to 16 so that only the color masks are used for the format check */ |
7efce8fe3a04
fixed image format detection for 15 bit color depths
faust3
parents:
27412
diff
changeset
|
404 if (depth == 15) |
7efce8fe3a04
fixed image format detection for 15 bit color depths
faust3
parents:
27412
diff
changeset
|
405 depth = 16; |
7efce8fe3a04
fixed image format detection for 15 bit color depths
faust3
parents:
27412
diff
changeset
|
406 |
7efce8fe3a04
fixed image format detection for 15 bit color depths
faust3
parents:
27412
diff
changeset
|
407 if (depth == myximage->bits_per_pixel && |
20399
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
408 fmte->byte_order == myximage->byte_order && |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
409 fmte->red_mask == myximage->red_mask && |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
410 fmte->green_mask == myximage->green_mask && |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
411 fmte->blue_mask == myximage->blue_mask) |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
412 break; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
413 fmte++; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
414 } |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
415 if (!fmte->mpfmt) { |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
416 mp_msg(MSGT_VO, MSGL_ERR, |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
417 "X server image format not supported, please contact the developers\n"); |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
418 return -1; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
419 } |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
420 out_format = fmte->mpfmt; |
12582 | 421 switch ((bpp = myximage->bits_per_pixel)) |
422 { | |
423 case 24: | |
424 draw_alpha_fnc = draw_alpha_24; | |
425 break; | |
426 case 32: | |
427 draw_alpha_fnc = draw_alpha_32; | |
428 break; | |
429 case 15: | |
430 case 16: | |
431 if (depth == 15) | |
432 draw_alpha_fnc = draw_alpha_15; | |
20399
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
433 else |
12582 | 434 draw_alpha_fnc = draw_alpha_16; |
435 break; | |
436 default: | |
437 draw_alpha_fnc = draw_alpha_null; | |
438 } | |
21586
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
439 out_offset = 0; |
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
440 // for these formats conversion is currently not support and |
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
441 // we can easily "emulate" them. |
21599
fe48c337a269
10l, missing () in check for 32bit endian-conversion hack
reimar
parents:
21586
diff
changeset
|
442 if (out_format & 64 && (IMGFMT_IS_RGB(out_format) || IMGFMT_IS_BGR(out_format))) { |
21586
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
443 out_format &= ~64; |
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
444 #ifdef WORDS_BIGENDIAN |
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
445 out_offset = 1; |
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
446 #else |
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
447 out_offset = -1; |
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
448 #endif |
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
449 } |
1 | 450 |
12582 | 451 /* always allocate swsContext as size could change between frames */ |
452 swsContext = | |
453 sws_getContextFromCmdLine(width, height, in_format, width, height, | |
454 out_format); | |
455 if (!swsContext) | |
456 return -1; | |
1 | 457 |
18746 | 458 dst_width = width; |
12582 | 459 //printf( "X11 bpp: %d color mask: R:%lX G:%lX B:%lX\n",bpp,myximage->red_mask,myximage->green_mask,myximage->blue_mask ); |
1 | 460 |
12582 | 461 return 0; |
1 | 462 } |
463 | |
12582 | 464 static void Display_Image(XImage * myximage, uint8_t * ImageData) |
1 | 465 { |
27901
88fad4f51a94
respect -vf dsize etc. also for -rootwin, just like vo_xv does.
reimar
parents:
27892
diff
changeset
|
466 int x = (vo_dwidth - dst_width) / 2; |
88fad4f51a94
respect -vf dsize etc. also for -rootwin, just like vo_xv does.
reimar
parents:
27892
diff
changeset
|
467 int y = (vo_dheight - myximage->height) / 2; |
27975
806c541d03dd
Do not draw in window if our image has not yet been adjusted to the new window size.
reimar
parents:
27974
diff
changeset
|
468 |
806c541d03dd
Do not draw in window if our image has not yet been adjusted to the new window size.
reimar
parents:
27974
diff
changeset
|
469 // do not draw if the image needs rescaling |
806c541d03dd
Do not draw in window if our image has not yet been adjusted to the new window size.
reimar
parents:
27974
diff
changeset
|
470 if ((old_vo_dwidth != vo_dwidth || old_vo_dheight != vo_dheight) && zoomFlag) |
806c541d03dd
Do not draw in window if our image has not yet been adjusted to the new window size.
reimar
parents:
27974
diff
changeset
|
471 return; |
806c541d03dd
Do not draw in window if our image has not yet been adjusted to the new window size.
reimar
parents:
27974
diff
changeset
|
472 |
27901
88fad4f51a94
respect -vf dsize etc. also for -rootwin, just like vo_xv does.
reimar
parents:
27892
diff
changeset
|
473 if (WinID == 0) { |
88fad4f51a94
respect -vf dsize etc. also for -rootwin, just like vo_xv does.
reimar
parents:
27892
diff
changeset
|
474 x = vo_dx; |
88fad4f51a94
respect -vf dsize etc. also for -rootwin, just like vo_xv does.
reimar
parents:
27892
diff
changeset
|
475 y = vo_dy; |
88fad4f51a94
respect -vf dsize etc. also for -rootwin, just like vo_xv does.
reimar
parents:
27892
diff
changeset
|
476 } |
21586
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
477 myximage->data += out_offset; |
3003 | 478 #ifdef HAVE_SHM |
12582 | 479 if (Shmem_Flag) |
480 { | |
481 XShmPutImage(mDisplay, vo_window, vo_gc, myximage, | |
482 0, 0, | |
27901
88fad4f51a94
respect -vf dsize etc. also for -rootwin, just like vo_xv does.
reimar
parents:
27892
diff
changeset
|
483 x, y, dst_width, |
12582 | 484 myximage->height, True); |
485 } else | |
1 | 486 #endif |
12582 | 487 { |
488 XPutImage(mDisplay, vo_window, vo_gc, myximage, | |
489 0, 0, | |
27901
88fad4f51a94
respect -vf dsize etc. also for -rootwin, just like vo_xv does.
reimar
parents:
27892
diff
changeset
|
490 x, y, dst_width, |
12582 | 491 myximage->height); |
492 } | |
21586
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
493 myximage->data -= out_offset; |
1 | 494 } |
495 | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1137
diff
changeset
|
496 static void draw_osd(void) |
12582 | 497 { |
498 vo_draw_text(image_width, image_height, draw_alpha_fnc); | |
499 } | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1137
diff
changeset
|
500 |
12582 | 501 static void flip_page(void) |
502 { | |
503 Display_Image(myximage, ImageData); | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1137
diff
changeset
|
504 XSync(mDisplay, False); |
31 | 505 } |
1 | 506 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15540
diff
changeset
|
507 static int draw_slice(uint8_t * src[], int stride[], int w, int h, |
12582 | 508 int x, int y) |
1 | 509 { |
12582 | 510 uint8_t *dst[3]; |
511 int dstStride[3]; | |
6059 | 512 |
12582 | 513 if ((old_vo_dwidth != vo_dwidth |
514 || old_vo_dheight != vo_dheight) /*&& y==0 */ && zoomFlag) | |
515 { | |
516 int newW = vo_dwidth; | |
517 int newH = vo_dheight; | |
18746 | 518 struct SwsContext *oldContext = swsContext; |
4641 | 519 |
12582 | 520 old_vo_dwidth = vo_dwidth; |
521 old_vo_dheight = vo_dheight; | |
522 | |
27972
f7b92cea7436
Use aspect.c code in vo_x11.c. Removes some inconsistencies in -wid handling.
reimar
parents:
27943
diff
changeset
|
523 if (vo_fs) |
f7b92cea7436
Use aspect.c code in vo_x11.c. Removes some inconsistencies in -wid handling.
reimar
parents:
27943
diff
changeset
|
524 aspect(&newW, &newH, A_ZOOM); |
12582 | 525 if (sws_flags == 0) |
526 newW &= (~31); // not needed but, if the user wants the FAST_BILINEAR SCALER, then its needed | |
4627 | 527 |
12582 | 528 swsContext = sws_getContextFromCmdLine(srcW, srcH, in_format, |
529 newW, newH, out_format); | |
530 if (swsContext) | |
531 { | |
532 image_width = (newW + 7) & (~7); | |
533 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
|
534 |
12582 | 535 freeMyXImage(); |
536 getMyXImage(); | |
537 sws_freeContext(oldContext); | |
538 } else | |
539 { | |
540 swsContext = oldContext; | |
541 } | |
18746 | 542 dst_width = newW; |
12582 | 543 } |
544 dstStride[1] = dstStride[2] = 0; | |
545 dst[1] = dst[2] = NULL; | |
546 | |
23284 | 547 dstStride[0] = image_width * ((bpp + 7) / 8); |
548 dst[0] = ImageData; | |
12582 | 549 if (Flip_Flag) |
550 { | |
23284 | 551 dst[0] += dstStride[0] * (image_height - 1); |
552 dstStride[0] = -dstStride[0]; | |
12582 | 553 } |
23282 | 554 sws_scale_ordered(swsContext, src, stride, y, h, dst, dstStride); |
12582 | 555 return 0; |
1 | 556 } |
557 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15540
diff
changeset
|
558 static int draw_frame(uint8_t * src[]) |
12582 | 559 { |
27883
96831cf06109
Remove code from unused and since ages deprecated draw_frame function.
reimar
parents:
27881
diff
changeset
|
560 return VO_ERROR; |
7683 | 561 } |
562 | |
12582 | 563 static uint32_t get_image(mp_image_t * mpi) |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
564 { |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
565 if (zoomFlag || |
12582 | 566 !IMGFMT_IS_BGR(mpi->imgfmt) || |
567 (IMGFMT_BGR_DEPTH(mpi->imgfmt) != vo_depthonscreen) || | |
568 ((mpi->type != MP_IMGTYPE_STATIC) | |
569 && (mpi->type != MP_IMGTYPE_TEMP)) | |
570 || (mpi->flags & MP_IMGFLAG_PLANAR) | |
571 || (mpi->flags & MP_IMGFLAG_YUV) || (mpi->width != image_width) | |
572 || (mpi->height != image_height)) | |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
25962
diff
changeset
|
573 return VO_FALSE; |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
574 |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
575 if (Flip_Flag) |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
576 { |
12582 | 577 mpi->stride[0] = -image_width * ((bpp + 7) / 8); |
578 mpi->planes[0] = ImageData - mpi->stride[0] * (image_height - 1); | |
579 } else | |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
580 { |
12582 | 581 mpi->stride[0] = image_width * ((bpp + 7) / 8); |
582 mpi->planes[0] = ImageData; | |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
583 } |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
584 mpi->flags |= MP_IMGFLAG_DIRECT; |
12582 | 585 |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
25962
diff
changeset
|
586 return VO_TRUE; |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
587 } |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
588 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15540
diff
changeset
|
589 static int query_format(uint32_t format) |
1 | 590 { |
12582 | 591 mp_msg(MSGT_VO, MSGL_DBG2, |
592 "vo_x11: query_format was called: %x (%s)\n", format, | |
593 vo_format_name(format)); | |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
594 if (IMGFMT_IS_BGR(format)) |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
595 { |
12582 | 596 if (IMGFMT_BGR_DEPTH(format) <= 8) |
597 return 0; // TODO 8bpp not yet fully implemented | |
598 if (IMGFMT_BGR_DEPTH(format) == vo_depthonscreen) | |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13787
diff
changeset
|
599 return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_OSD | VFCAP_SWSCALE | VFCAP_FLIP | |
12582 | 600 VFCAP_ACCEPT_STRIDE; |
601 else | |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13787
diff
changeset
|
602 return VFCAP_CSP_SUPPORTED | VFCAP_OSD | VFCAP_SWSCALE | VFCAP_FLIP | |
12582 | 603 VFCAP_ACCEPT_STRIDE; |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
604 } |
325 | 605 |
12582 | 606 switch (format) |
607 { | |
6692
ad521fb49a5e
-vm -fs -zoom fix, set correct vm screenres in aspect code (similar to xv fix).
atmos4
parents:
6180
diff
changeset
|
608 // case IMGFMT_BGR8: |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
609 // case IMGFMT_BGR15: |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
610 // case IMGFMT_BGR16: |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
611 // case IMGFMT_BGR24: |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
612 // case IMGFMT_BGR32: |
6694
9291268a3603
1000l, back out hack-n-slay 8bpp code from my local tree.
atmos4
parents:
6693
diff
changeset
|
613 // return 0x2; |
4905
eb1a28f1236a
yuy2 support disabled to workaround stupid colorspace selection
michael
parents:
4889
diff
changeset
|
614 // case IMGFMT_YUY2: |
12582 | 615 case IMGFMT_I420: |
616 case IMGFMT_IYUV: | |
617 case IMGFMT_YV12: | |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13787
diff
changeset
|
618 return VFCAP_CSP_SUPPORTED | VFCAP_OSD | VFCAP_SWSCALE | VFCAP_ACCEPT_STRIDE; |
12582 | 619 } |
620 return 0; | |
1 | 621 } |
622 | |
623 | |
7683 | 624 static void uninit(void) |
1 | 625 { |
12582 | 626 if (!myximage) |
627 return; | |
628 | |
629 freeMyXImage(); | |
4426
1ceadec3ea67
using the common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4420
diff
changeset
|
630 |
27377
d58d06eafe83
Change a bunch of X11-specific preprocessor directives.
diego
parents:
27343
diff
changeset
|
631 #ifdef CONFIG_XF86VM |
27890
a4e2700e9381
Simplify vo_vm_switch and vo_vm_close, everyone was using the (almost) same
reimar
parents:
27889
diff
changeset
|
632 vo_vm_close(); |
206
82b5ae8ceaf4
adds XF86VidMode support to vo_x11.c to do "pseudo-scaling"
mgraffam
parents:
202
diff
changeset
|
633 #endif |
4426
1ceadec3ea67
using the common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4420
diff
changeset
|
634 |
12582 | 635 zoomFlag = 0; |
636 vo_x11_uninit(); | |
4677
305a0c20bde4
default is allways nozoom again (specify -zoom if u want the sane behavior)
michael
parents:
4662
diff
changeset
|
637 |
12582 | 638 sws_freeContext(swsContext); |
1 | 639 } |
640 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15540
diff
changeset
|
641 static int preinit(const char *arg) |
4352 | 642 { |
12582 | 643 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
|
644 { |
12582 | 645 mp_msg(MSGT_VO, MSGL_ERR, "vo_x11: Unknown subdevice: %s\n", arg); |
646 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
|
647 } |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
648 |
12582 | 649 if (!vo_init()) |
650 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
|
651 return 0; |
4352 | 652 } |
1 | 653 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15540
diff
changeset
|
654 static int control(uint32_t request, void *data, ...) |
4352 | 655 { |
12582 | 656 switch (request) |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7765
diff
changeset
|
657 { |
12582 | 658 case VOCTRL_PAUSE: |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
25962
diff
changeset
|
659 return int_pause = 1; |
12582 | 660 case VOCTRL_RESUME: |
26755
46f0b4d34fa1
cosmetics: Remove useless parentheses from from return statements.
diego
parents:
25962
diff
changeset
|
661 return int_pause = 0; |
12582 | 662 case VOCTRL_QUERY_FORMAT: |
663 return query_format(*((uint32_t *) data)); | |
27879
514afc9b920e
Cosmetics for vo_x11 control() to make it more similar to vo_xv.c
reimar
parents:
27762
diff
changeset
|
664 case VOCTRL_GET_IMAGE: |
514afc9b920e
Cosmetics for vo_x11 control() to make it more similar to vo_xv.c
reimar
parents:
27762
diff
changeset
|
665 return get_image(data); |
12582 | 666 case VOCTRL_GUISUPPORT: |
667 return VO_TRUE; | |
27879
514afc9b920e
Cosmetics for vo_x11 control() to make it more similar to vo_xv.c
reimar
parents:
27762
diff
changeset
|
668 case VOCTRL_FULLSCREEN: |
514afc9b920e
Cosmetics for vo_x11 control() to make it more similar to vo_xv.c
reimar
parents:
27762
diff
changeset
|
669 vo_x11_fullscreen(); |
514afc9b920e
Cosmetics for vo_x11 control() to make it more similar to vo_xv.c
reimar
parents:
27762
diff
changeset
|
670 vo_x11_clearwindow(mDisplay, vo_window); |
514afc9b920e
Cosmetics for vo_x11 control() to make it more similar to vo_xv.c
reimar
parents:
27762
diff
changeset
|
671 return VO_TRUE; |
12582 | 672 case VOCTRL_SET_EQUALIZER: |
673 { | |
674 va_list ap; | |
675 int value; | |
676 | |
677 va_start(ap, data); | |
678 value = va_arg(ap, int); | |
679 | |
680 va_end(ap); | |
681 return vo_x11_set_equalizer(data, value); | |
682 } | |
683 case VOCTRL_GET_EQUALIZER: | |
684 { | |
685 va_list ap; | |
686 int *value; | |
687 | |
688 va_start(ap, data); | |
689 value = va_arg(ap, int *); | |
690 | |
691 va_end(ap); | |
692 return vo_x11_get_equalizer(data, value); | |
693 } | |
694 case VOCTRL_ONTOP: | |
695 vo_x11_ontop(); | |
696 return VO_TRUE; | |
22232 | 697 case VOCTRL_UPDATE_SCREENINFO: |
698 update_xinerama_info(); | |
699 return VO_TRUE; | |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7765
diff
changeset
|
700 } |
12582 | 701 return VO_NOTIMPL; |
4352 | 702 } |