Mercurial > mplayer.hg
annotate libvo/vo_x11.c @ 25317:7f3cb5408f28
Fixed VIDIX color bug that was introduced when Radeon VIDIX driver
was synchronized with vidix.sf.net.
The red color was saturating.
Corrected value fixes the issue and restore the color to the level
it used to have before synchronization.
Meaning of the value remains unknow but was retrieved from
register's value of a Radeon 9000 card, so it may need further testing.
Patch by Guillaume Lecerf (foxcore at gmail dot com)
author | ben |
---|---|
date | Mon, 10 Dec 2007 19:27:46 +0000 |
parents | c1b3a06a3c6e |
children | f689811209b1 |
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 |
616 | 38 #include "sub.h" |
350 | 39 |
18861 | 40 #include "libswscale/swscale.h" |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
13056
diff
changeset
|
41 #include "libmpcodecs/vf_scale.h" |
18746 | 42 #define MODE_RGB 0x1 |
43 #define MODE_BGR 0x2 | |
2218 | 44 |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
13056
diff
changeset
|
45 #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
|
46 #include "help_mp.h" |
4734 | 47 |
6013
7f6e02a16ac4
some bugfix, x[11|mga|v] ( fullscreen with more files )
pontscho
parents:
5999
diff
changeset
|
48 #ifdef HAVE_NEW_GUI |
23077 | 49 #include "gui/interface.h" |
13787
e047e70a9767
Handle "xxx.h" vs "../xxx.h" include paths in a consistent way.
diego
parents:
13056
diff
changeset
|
50 #include "mplayer.h" |
6013
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 |
25216 | 53 static const vo_info_t info = { |
12582 | 54 "X11 ( XImage/Shm )", |
55 "x11", | |
56 "Aaron Holtzman <aholtzma@ess.engr.uvic.ca>", | |
57 "" | |
1 | 58 }; |
59 | |
25220
c9e9ac2008c2
Mark the vo_functions_t definitions as const where possible.
reimar
parents:
25216
diff
changeset
|
60 const 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; | |
21585
e54f539c9b5d
Align image data pointer, this is also in preparation of an upcoming patch
reimar
parents:
21584
diff
changeset
|
69 //! original unaligned pointer for free |
e54f539c9b5d
Align image data pointer, this is also in preparation of an upcoming patch
reimar
parents:
21584
diff
changeset
|
70 static unsigned char *ImageDataOrig; |
1 | 71 |
72 /* X11 related variables */ | |
7764 | 73 static XImage *myximage = NULL; |
23381
300e9b7c499f
Remove some unused variables, patch by timwoj ieee org.
diego
parents:
23376
diff
changeset
|
74 static int depth, bpp; |
1 | 75 static XWindowAttributes attribs; |
76 | |
10757
3aea64e0d6d9
Avoid flickering during resizes. Keep video contents even when paused. Fix by Tomas Simonaitis <haden@homelan.lt>
mosu
parents:
10728
diff
changeset
|
77 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
|
78 |
2969 | 79 static int Flip_Flag; |
4661
4df2400b0527
-fs and or -vm default is nozoom, -zoom does the expected thing
michael
parents:
4658
diff
changeset
|
80 static int zoomFlag; |
2969 | 81 |
1 | 82 |
83 static uint32_t image_width; | |
84 static uint32_t image_height; | |
4641 | 85 static uint32_t in_format; |
12582 | 86 static uint32_t out_format = 0; |
21586
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
87 static int out_offset; |
12582 | 88 static int srcW = -1; |
89 static int srcH = -1; | |
90 static int aspect; // 1<<16 based fixed point aspect, so that the aspect stays correct during resizing | |
1 | 91 |
12582 | 92 static int old_vo_dwidth = -1; |
93 static int old_vo_dheight = -1; | |
94 | |
22886 | 95 static void check_events(void) |
12582 | 96 { |
97 int ret = vo_x11_check_events(mDisplay); | |
6013
7f6e02a16ac4
some bugfix, x[11|mga|v] ( fullscreen with more files )
pontscho
parents:
5999
diff
changeset
|
98 |
12582 | 99 /* clear left over borders and redraw frame if we are paused */ |
100 if (ret & VO_EVENT_EXPOSE && int_pause) | |
101 { | |
102 vo_x11_clearwindow_part(mDisplay, vo_window, myximage->width, | |
103 myximage->height, 0); | |
104 flip_page(); | |
105 } else if ((ret & VO_EVENT_RESIZE) || (ret & VO_EVENT_EXPOSE)) | |
106 vo_x11_clearwindow_part(mDisplay, vo_window, myximage->width, | |
107 myximage->height, 0); | |
108 | |
109 } | |
110 | |
111 static void draw_alpha_32(int x0, int y0, int w, int h, unsigned char *src, | |
112 unsigned char *srca, int stride) | |
113 { | |
114 vo_draw_alpha_rgb32(w, h, src, srca, stride, | |
115 ImageData + 4 * (y0 * image_width + x0), | |
116 4 * image_width); | |
1 | 117 } |
118 | |
12582 | 119 static void draw_alpha_24(int x0, int y0, int w, int h, unsigned char *src, |
120 unsigned char *srca, int stride) | |
121 { | |
122 vo_draw_alpha_rgb24(w, h, src, srca, stride, | |
123 ImageData + 3 * (y0 * image_width + x0), | |
124 3 * image_width); | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
125 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
126 |
12582 | 127 static void draw_alpha_16(int x0, int y0, int w, int h, unsigned char *src, |
128 unsigned char *srca, int stride) | |
129 { | |
130 vo_draw_alpha_rgb16(w, h, src, srca, stride, | |
131 ImageData + 2 * (y0 * image_width + x0), | |
132 2 * image_width); | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
133 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
134 |
12582 | 135 static void draw_alpha_15(int x0, int y0, int w, int h, unsigned char *src, |
136 unsigned char *srca, int stride) | |
137 { | |
138 vo_draw_alpha_rgb15(w, h, src, srca, stride, | |
139 ImageData + 2 * (y0 * image_width + x0), | |
140 2 * image_width); | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
141 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
142 |
12582 | 143 static void draw_alpha_null(int x0, int y0, int w, int h, |
144 unsigned char *src, unsigned char *srca, | |
145 int stride) | |
146 { | |
1647
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
147 } |
22480104ddfd
added draw_alpha_XXXX functions, draw_alpha_func<=correct one in init
atlka
parents:
1501
diff
changeset
|
148 |
18746 | 149 static struct SwsContext *swsContext = NULL; |
150 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
|
151 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
|
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 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
|
154 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
16171
diff
changeset
|
155 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
|
156 { |
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
|
157 #ifdef HAVE_SHM |
12582 | 158 if (mLocalDisplay && XShmQueryExtension(mDisplay)) |
159 Shmem_Flag = 1; | |
160 else | |
161 { | |
162 Shmem_Flag = 0; | |
163 mp_msg(MSGT_VO, MSGL_WARN, | |
164 "Shared memory not supported\nReverting to normal Xlib\n"); | |
165 } | |
166 if (Shmem_Flag) | |
167 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
|
168 |
12582 | 169 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
|
170 { |
12582 | 171 myximage = |
172 XShmCreateImage(mDisplay, vinfo.visual, depth, ZPixmap, NULL, | |
173 &Shminfo[0], image_width, image_height); | |
174 if (myximage == NULL) | |
175 { | |
176 mp_msg(MSGT_VO, MSGL_WARN, | |
177 "Shared memory error,disabling ( Ximage error )\n"); | |
178 goto shmemerror; | |
179 } | |
180 Shminfo[0].shmid = shmget(IPC_PRIVATE, | |
181 myximage->bytes_per_line * | |
182 myximage->height, IPC_CREAT | 0777); | |
183 if (Shminfo[0].shmid < 0) | |
184 { | |
185 XDestroyImage(myximage); | |
186 mp_msg(MSGT_VO, MSGL_V, "%s\n", strerror(errno)); | |
187 //perror( strerror( errno ) ); | |
188 mp_msg(MSGT_VO, MSGL_WARN, | |
189 "Shared memory error,disabling ( seg id error )\n"); | |
190 goto shmemerror; | |
191 } | |
192 Shminfo[0].shmaddr = (char *) shmat(Shminfo[0].shmid, 0, 0); | |
3209 | 193 |
12582 | 194 if (Shminfo[0].shmaddr == ((char *) -1)) |
195 { | |
196 XDestroyImage(myximage); | |
197 if (Shminfo[0].shmaddr != ((char *) -1)) | |
198 shmdt(Shminfo[0].shmaddr); | |
199 mp_msg(MSGT_VO, MSGL_WARN, | |
200 "Shared memory error,disabling ( address error )\n"); | |
201 goto shmemerror; | |
202 } | |
203 myximage->data = Shminfo[0].shmaddr; | |
204 ImageData = (unsigned char *) myximage->data; | |
205 Shminfo[0].readOnly = False; | |
206 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
|
207 |
12582 | 208 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
|
209 |
12582 | 210 if (gXErrorFlag) |
211 { | |
212 XDestroyImage(myximage); | |
213 shmdt(Shminfo[0].shmaddr); | |
214 mp_msg(MSGT_VO, MSGL_WARN, "Shared memory error,disabling.\n"); | |
215 gXErrorFlag = 0; | |
216 goto shmemerror; | |
217 } else | |
218 shmctl(Shminfo[0].shmid, IPC_RMID, 0); | |
219 | |
220 { | |
221 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
|
222 |
12582 | 223 if (firstTime) |
224 { | |
225 mp_msg(MSGT_VO, MSGL_V, "Sharing memory.\n"); | |
226 firstTime = 0; | |
227 } | |
228 } | |
229 } else | |
230 { | |
231 shmemerror: | |
232 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
|
233 #endif |
21584
3ddf91e141a3
Use XCreateImage instead of XGetImage, this is not only more correct and
reimar
parents:
20399
diff
changeset
|
234 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
|
235 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
|
236 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
|
237 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
|
238 memset(myximage->data, 0, myximage->bytes_per_line * image_height); |
12582 | 239 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
|
240 #ifdef HAVE_SHM |
12582 | 241 } |
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
|
242 #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
|
243 } |
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 |
17566
f580a7755ac5
Patch by Stefan Huehner / stefan % huehner ! org \
rathann
parents:
16171
diff
changeset
|
245 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
|
246 { |
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
|
247 #ifdef HAVE_SHM |
12582 | 248 if (Shmem_Flag) |
249 { | |
250 XShmDetach(mDisplay, &Shminfo[0]); | |
251 XDestroyImage(myximage); | |
252 shmdt(Shminfo[0].shmaddr); | |
253 } 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
|
254 #endif |
12582 | 255 { |
21585
e54f539c9b5d
Align image data pointer, this is also in preparation of an upcoming patch
reimar
parents:
21584
diff
changeset
|
256 myximage->data = ImageDataOrig; |
12582 | 257 XDestroyImage(myximage); |
21585
e54f539c9b5d
Align image data pointer, this is also in preparation of an upcoming patch
reimar
parents:
21584
diff
changeset
|
258 ImageDataOrig = NULL; |
12582 | 259 } |
260 myximage = NULL; | |
21584
3ddf91e141a3
Use XCreateImage instead of XGetImage, this is not only more correct and
reimar
parents:
20399
diff
changeset
|
261 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
|
262 } |
2218 | 263 |
20399
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
264 #ifdef WORDS_BIGENDIAN |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
265 #define BO_NATIVE MSBFirst |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
266 #define BO_NONNATIVE LSBFirst |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
267 #else |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
268 #define BO_NATIVE LSBFirst |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
269 #define BO_NONNATIVE MSBFirst |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
270 #endif |
25239 | 271 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
|
272 uint32_t mpfmt; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
273 int byte_order; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
274 unsigned red_mask; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
275 unsigned green_mask; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
276 unsigned blue_mask; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
277 } fmt2Xfmt[] = { |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
278 {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
|
279 {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
|
280 {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
|
281 {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
|
282 {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
|
283 {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
|
284 {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
|
285 {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
|
286 {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
|
287 {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
|
288 {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
|
289 {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
|
290 {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
|
291 {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
|
292 {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
|
293 {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
|
294 {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
|
295 {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
|
296 {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
|
297 {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
|
298 {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
|
299 {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
|
300 {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
|
301 {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
|
302 {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
|
303 }; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
304 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15540
diff
changeset
|
305 static int config(uint32_t width, uint32_t height, uint32_t d_width, |
12582 | 306 uint32_t d_height, uint32_t flags, char *title, |
307 uint32_t format) | |
1 | 308 { |
1110 | 309 // int screen; |
12582 | 310 int fullscreen = 0; |
311 int vm = 0; | |
312 | |
1110 | 313 // int interval, prefer_blank, allow_exp, nothing; |
12582 | 314 unsigned int fg, bg; |
315 XGCValues xgcv; | |
316 Colormap theCmap; | |
317 XSetWindowAttributes xswa; | |
318 unsigned long xswamask; | |
25239 | 319 const struct fmt2Xfmtentry_s *fmte = fmt2Xfmt; |
12582 | 320 |
4426
1ceadec3ea67
using the common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4420
diff
changeset
|
321 #ifdef HAVE_XF86VM |
12582 | 322 unsigned int modeline_width, modeline_height; |
323 static uint32_t vm_width; | |
324 static uint32_t vm_height; | |
4426
1ceadec3ea67
using the common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4420
diff
changeset
|
325 #endif |
1 | 326 |
12582 | 327 vo_mouse_autohide = 1; |
328 old_vo_dwidth = -1; | |
329 old_vo_dheight = -1; | |
6013
7f6e02a16ac4
some bugfix, x[11|mga|v] ( fullscreen with more files )
pontscho
parents:
5999
diff
changeset
|
330 |
12582 | 331 if (!title) |
17787 | 332 title = "MPlayer X11 (XImage/Shm) render"; |
4813 | 333 |
12582 | 334 in_format = format; |
335 srcW = width; | |
336 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
|
337 |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13787
diff
changeset
|
338 if (flags & (VOFLAG_FULLSCREEN|VOFLAG_MODESWITCHING)) |
12582 | 339 fullscreen = 1; |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13787
diff
changeset
|
340 if (flags & VOFLAG_MODESWITCHING) |
12582 | 341 vm = 1; |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13787
diff
changeset
|
342 if (flags & VOFLAG_FLIPPING) |
12582 | 343 Flip_Flag = 1; |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13787
diff
changeset
|
344 zoomFlag = flags & VOFLAG_SWSCALE; |
12582 | 345 |
346 int_pause = 0; | |
4677
305a0c20bde4
default is allways nozoom again (specify -zoom if u want the sane behavior)
michael
parents:
4662
diff
changeset
|
347 // if(!fullscreen) zoomFlag=1; //it makes no sense to avoid zooming on windowd mode |
12582 | 348 |
2218 | 349 //printf( "w: %d h: %d\n\n",vo_dwidth,vo_dheight ); |
1746 | 350 |
12582 | 351 XGetWindowAttributes(mDisplay, mRootWin, &attribs); |
352 depth = attribs.depth; | |
353 | |
354 if (depth != 15 && depth != 16 && depth != 24 && depth != 32) | |
355 { | |
356 Visual *visual; | |
1746 | 357 |
12582 | 358 depth = vo_find_depth_from_visuals(mDisplay, mScreen, &visual); |
359 } | |
360 if (!XMatchVisualInfo(mDisplay, mScreen, depth, DirectColor, &vinfo) || | |
361 (WinID > 0 | |
362 && vinfo.visualid != XVisualIDFromVisual(attribs.visual))) | |
363 XMatchVisualInfo(mDisplay, mScreen, depth, TrueColor, &vinfo); | |
1746 | 364 |
12582 | 365 /* set image size (which is indeed neither the input nor output size), |
366 if zoom is on it will be changed during draw_slice anyway so we don't duplicate the aspect code here | |
367 */ | |
368 image_width = (width + 7) & (~7); | |
369 image_height = height; | |
4661
4df2400b0527
-fs and or -vm default is nozoom, -zoom does the expected thing
michael
parents:
4658
diff
changeset
|
370 |
12582 | 371 aspect = ((1 << 16) * d_width + d_height / 2) / d_height; |
2218 | 372 |
1752 | 373 #ifdef HAVE_NEW_GUI |
12582 | 374 if (use_gui) |
375 guiGetEvent(guiSetShVideo, 0); // the GUI will set up / resize the window | |
376 else | |
377 #endif | |
378 { | |
2094
dc11de07b5e7
grabs mouse with -vm - patch by Uwe Reder <Uwe.Reder@3SOFT.de>
arpi
parents:
1924
diff
changeset
|
379 #ifdef HAVE_XF86VM |
12582 | 380 if (vm) |
381 { | |
382 if ((d_width == 0) && (d_height == 0)) | |
383 { | |
384 vm_width = image_width; | |
385 vm_height = image_height; | |
386 } else | |
387 { | |
388 vm_width = d_width; | |
389 vm_height = d_height; | |
390 } | |
391 vo_vm_switch(vm_width, vm_height, &modeline_width, | |
392 &modeline_height); | |
393 vo_dx = (vo_screenwidth - modeline_width) / 2; | |
394 vo_dy = (vo_screenheight - modeline_height) / 2; | |
395 vo_dwidth = modeline_width; | |
396 vo_dheight = modeline_height; | |
397 } | |
2094
dc11de07b5e7
grabs mouse with -vm - patch by Uwe Reder <Uwe.Reder@3SOFT.de>
arpi
parents:
1924
diff
changeset
|
398 #endif |
12582 | 399 bg = WhitePixel(mDisplay, mScreen); |
400 fg = BlackPixel(mDisplay, mScreen); | |
1 | 401 |
12582 | 402 theCmap = vo_x11_create_colormap(&vinfo); |
1 | 403 |
12582 | 404 xswa.background_pixel = 0; |
405 xswa.border_pixel = 0; | |
406 xswa.colormap = theCmap; | |
407 xswamask = CWBackPixel | CWBorderPixel | CWColormap; | |
1 | 408 |
2094
dc11de07b5e7
grabs mouse with -vm - patch by Uwe Reder <Uwe.Reder@3SOFT.de>
arpi
parents:
1924
diff
changeset
|
409 #ifdef HAVE_XF86VM |
12582 | 410 if (vm) |
411 { | |
412 xswa.override_redirect = True; | |
413 xswamask |= CWOverrideRedirect; | |
414 } | |
2094
dc11de07b5e7
grabs mouse with -vm - patch by Uwe Reder <Uwe.Reder@3SOFT.de>
arpi
parents:
1924
diff
changeset
|
415 #endif |
12582 | 416 |
417 if (WinID >= 0) | |
418 { | |
419 vo_window = WinID ? ((Window) WinID) : mRootWin; | |
420 if (WinID) | |
421 { | |
15540 | 422 int border; |
12582 | 423 XUnmapWindow(mDisplay, vo_window); |
424 XChangeWindowAttributes(mDisplay, vo_window, xswamask, | |
425 &xswa); | |
426 vo_x11_selectinput_witherr(mDisplay, vo_window, | |
427 StructureNotifyMask | | |
428 KeyPressMask | | |
429 PropertyChangeMask | | |
430 PointerMotionMask | | |
431 ButtonPressMask | | |
432 ButtonReleaseMask | | |
433 ExposureMask); | |
434 XMapWindow(mDisplay, vo_window); | |
15540 | 435 XGetGeometry(mDisplay, vo_window, &mRootWin, |
436 &vo_dx, &vo_dy, &vo_dwidth, &vo_dheight, | |
437 &border, &depth); | |
12582 | 438 } else |
439 XSelectInput(mDisplay, vo_window, ExposureMask); | |
440 } else | |
441 { | |
23655
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23381
diff
changeset
|
442 vo_x11_create_vo_window(&vinfo, vo_dx, vo_dy, d_width, d_height, |
00aa61cde84a
Make X11 window creation and (with -fixed-vo) management simpler and more
reimar
parents:
23381
diff
changeset
|
443 flags, theCmap, "x11", title); |
12582 | 444 } |
6043 | 445 |
12582 | 446 XSync(mDisplay, False); |
1 | 447 |
12582 | 448 vo_x11_selectinput_witherr(mDisplay, vo_window, |
449 StructureNotifyMask | KeyPressMask | | |
450 PropertyChangeMask | ExposureMask | | |
451 ((WinID == | |
452 0) ? 0 : (ButtonPressMask | | |
453 ButtonReleaseMask | | |
454 PointerMotionMask))); | |
4805 | 455 |
2094
dc11de07b5e7
grabs mouse with -vm - patch by Uwe Reder <Uwe.Reder@3SOFT.de>
arpi
parents:
1924
diff
changeset
|
456 #ifdef HAVE_XF86VM |
12582 | 457 if (vm) |
458 { | |
459 /* Grab the mouse pointer in our window */ | |
460 if (vo_grabpointer) | |
461 XGrabPointer(mDisplay, vo_window, True, 0, | |
462 GrabModeAsync, GrabModeAsync, | |
463 vo_window, None, CurrentTime); | |
464 XSetInputFocus(mDisplay, vo_window, RevertToNone, CurrentTime); | |
465 } | |
2094
dc11de07b5e7
grabs mouse with -vm - patch by Uwe Reder <Uwe.Reder@3SOFT.de>
arpi
parents:
1924
diff
changeset
|
466 #endif |
12582 | 467 } |
1 | 468 |
12582 | 469 if (vo_gc != None) |
470 XFreeGC(mDisplay, vo_gc); | |
471 vo_gc = XCreateGC(mDisplay, vo_window, 0L, &xgcv); | |
472 | |
473 if (myximage) | |
474 { | |
475 freeMyXImage(); | |
476 sws_freeContext(swsContext); | |
477 } | |
478 getMyXImage(); | |
479 | |
480 if (!WinID) | |
481 { | |
482 vo_dwidth = vo_screenwidth; | |
483 vo_dheight = vo_screenheight; | |
484 } | |
1 | 485 |
20399
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
486 while (fmte->mpfmt) { |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
487 if (IMGFMT_RGB_DEPTH(fmte->mpfmt) == myximage->bits_per_pixel && |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
488 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
|
489 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
|
490 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
|
491 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
|
492 break; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
493 fmte++; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
494 } |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
495 if (!fmte->mpfmt) { |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
496 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
|
497 "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
|
498 return -1; |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
499 } |
27aa9329d4f7
Proper detection of corresponding MPlayer image format for X server format for vo_x11.
reimar
parents:
20196
diff
changeset
|
500 out_format = fmte->mpfmt; |
12582 | 501 switch ((bpp = myximage->bits_per_pixel)) |
502 { | |
503 case 24: | |
504 draw_alpha_fnc = draw_alpha_24; | |
505 break; | |
506 case 32: | |
507 draw_alpha_fnc = draw_alpha_32; | |
508 break; | |
509 case 15: | |
510 case 16: | |
511 if (depth == 15) | |
512 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
|
513 else |
12582 | 514 draw_alpha_fnc = draw_alpha_16; |
515 break; | |
516 default: | |
517 draw_alpha_fnc = draw_alpha_null; | |
518 } | |
21586
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
519 out_offset = 0; |
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
520 // 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
|
521 // we can easily "emulate" them. |
21599
fe48c337a269
10l, missing () in check for 32bit endian-conversion hack
reimar
parents:
21586
diff
changeset
|
522 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
|
523 out_format &= ~64; |
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
524 #ifdef WORDS_BIGENDIAN |
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
525 out_offset = 1; |
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
526 #else |
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
527 out_offset = -1; |
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
528 #endif |
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
529 } |
1 | 530 |
12582 | 531 /* always allocate swsContext as size could change between frames */ |
532 swsContext = | |
533 sws_getContextFromCmdLine(width, height, in_format, width, height, | |
534 out_format); | |
535 if (!swsContext) | |
536 return -1; | |
1 | 537 |
18746 | 538 dst_width = width; |
12582 | 539 //printf( "X11 bpp: %d color mask: R:%lX G:%lX B:%lX\n",bpp,myximage->red_mask,myximage->green_mask,myximage->blue_mask ); |
1 | 540 |
12582 | 541 if (vo_ontop) |
542 vo_x11_setlayer(mDisplay, vo_window, vo_ontop); | |
11542 | 543 |
12582 | 544 return 0; |
1 | 545 } |
546 | |
12582 | 547 static void Display_Image(XImage * myximage, uint8_t * ImageData) |
1 | 548 { |
21586
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
549 myximage->data += out_offset; |
3003 | 550 #ifdef HAVE_SHM |
12582 | 551 if (Shmem_Flag) |
552 { | |
553 XShmPutImage(mDisplay, vo_window, vo_gc, myximage, | |
554 0, 0, | |
18746 | 555 (vo_dwidth - dst_width) / 2, |
556 (vo_dheight - myximage->height) / 2, dst_width, | |
12582 | 557 myximage->height, True); |
558 } else | |
1 | 559 #endif |
12582 | 560 { |
561 XPutImage(mDisplay, vo_window, vo_gc, myximage, | |
562 0, 0, | |
18746 | 563 (vo_dwidth - dst_width) / 2, |
564 (vo_dheight - myximage->height) / 2, dst_width, | |
12582 | 565 myximage->height); |
566 } | |
21586
5a1e078720e7
Support for different endianness on client and server with -vo x11
reimar
parents:
21585
diff
changeset
|
567 myximage->data -= out_offset; |
1 | 568 } |
569 | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1137
diff
changeset
|
570 static void draw_osd(void) |
12582 | 571 { |
572 vo_draw_text(image_width, image_height, draw_alpha_fnc); | |
573 } | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1137
diff
changeset
|
574 |
12582 | 575 static void flip_page(void) |
576 { | |
577 Display_Image(myximage, ImageData); | |
1501
d40f2b686846
changes according to -utf8 option, draw_osd() function added
atlka
parents:
1137
diff
changeset
|
578 XSync(mDisplay, False); |
31 | 579 } |
1 | 580 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15540
diff
changeset
|
581 static int draw_slice(uint8_t * src[], int stride[], int w, int h, |
12582 | 582 int x, int y) |
1 | 583 { |
12582 | 584 uint8_t *dst[3]; |
585 int dstStride[3]; | |
6059 | 586 |
12582 | 587 if ((old_vo_dwidth != vo_dwidth |
588 || old_vo_dheight != vo_dheight) /*&& y==0 */ && zoomFlag) | |
589 { | |
590 int newW = vo_dwidth; | |
591 int newH = vo_dheight; | |
592 int newAspect = (newW * (1 << 16) + (newH >> 1)) / newH; | |
18746 | 593 struct SwsContext *oldContext = swsContext; |
4641 | 594 |
12582 | 595 if (newAspect > aspect) |
596 newW = (newH * aspect + (1 << 15)) >> 16; | |
597 else | |
598 newH = ((newW << 16) + (aspect >> 1)) / aspect; | |
4641 | 599 |
12582 | 600 old_vo_dwidth = vo_dwidth; |
601 old_vo_dheight = vo_dheight; | |
602 | |
603 if (sws_flags == 0) | |
604 newW &= (~31); // not needed but, if the user wants the FAST_BILINEAR SCALER, then its needed | |
4627 | 605 |
12582 | 606 swsContext = sws_getContextFromCmdLine(srcW, srcH, in_format, |
607 newW, newH, out_format); | |
608 if (swsContext) | |
609 { | |
610 image_width = (newW + 7) & (~7); | |
611 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
|
612 |
12582 | 613 freeMyXImage(); |
614 getMyXImage(); | |
615 sws_freeContext(oldContext); | |
616 } else | |
617 { | |
618 swsContext = oldContext; | |
619 } | |
18746 | 620 dst_width = newW; |
12582 | 621 } |
622 dstStride[1] = dstStride[2] = 0; | |
623 dst[1] = dst[2] = NULL; | |
624 | |
23284 | 625 dstStride[0] = image_width * ((bpp + 7) / 8); |
626 dst[0] = ImageData; | |
12582 | 627 if (Flip_Flag) |
628 { | |
23284 | 629 dst[0] += dstStride[0] * (image_height - 1); |
630 dstStride[0] = -dstStride[0]; | |
12582 | 631 } |
23282 | 632 sws_scale_ordered(swsContext, src, stride, y, h, dst, dstStride); |
12582 | 633 return 0; |
1 | 634 } |
635 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15540
diff
changeset
|
636 static int draw_frame(uint8_t * src[]) |
12582 | 637 { |
7683 | 638 #if 0 |
12582 | 639 int stride[3] = { 0, 0, 0 }; |
640 | |
641 if (in_format == IMGFMT_YUY2) | |
642 stride[0] = srcW * 2; | |
643 else if (in_format == IMGFMT_BGR8) | |
644 stride[0] = srcW; | |
645 else if (in_format == IMGFMT_BGR15) | |
646 stride[0] = srcW * 2; | |
647 else if (in_format == IMGFMT_BGR16) | |
648 stride[0] = srcW * 2; | |
649 else if (in_format == IMGFMT_BGR24) | |
650 stride[0] = srcW * 3; | |
651 else if (in_format == IMGFMT_BGR32) | |
652 stride[0] = srcW * 4; | |
653 | |
654 return draw_slice(src, stride, srcW, srcH, 0, 0); | |
7683 | 655 #else |
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
|
656 mp_msg(MSGT_VO,MSGL_INFO, MSGTR_LIBVO_X11_DrawFrameCalled); |
7683 | 657 return -1; |
658 #endif | |
659 } | |
660 | |
12582 | 661 static uint32_t get_image(mp_image_t * mpi) |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
662 { |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
663 if (zoomFlag || |
12582 | 664 !IMGFMT_IS_BGR(mpi->imgfmt) || |
665 (IMGFMT_BGR_DEPTH(mpi->imgfmt) != vo_depthonscreen) || | |
666 ((mpi->type != MP_IMGTYPE_STATIC) | |
667 && (mpi->type != MP_IMGTYPE_TEMP)) | |
668 || (mpi->flags & MP_IMGFLAG_PLANAR) | |
669 || (mpi->flags & MP_IMGFLAG_YUV) || (mpi->width != image_width) | |
670 || (mpi->height != image_height)) | |
671 return (VO_FALSE); | |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
672 |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
673 if (Flip_Flag) |
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 - mpi->stride[0] * (image_height - 1); | |
677 } else | |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
678 { |
12582 | 679 mpi->stride[0] = image_width * ((bpp + 7) / 8); |
680 mpi->planes[0] = ImageData; | |
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 mpi->flags |= MP_IMGFLAG_DIRECT; |
12582 | 683 |
684 return (VO_TRUE); | |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
685 } |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
686 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15540
diff
changeset
|
687 static int query_format(uint32_t format) |
1 | 688 { |
12582 | 689 mp_msg(MSGT_VO, MSGL_DBG2, |
690 "vo_x11: query_format was called: %x (%s)\n", format, | |
691 vo_format_name(format)); | |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
692 if (IMGFMT_IS_BGR(format)) |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
693 { |
12582 | 694 if (IMGFMT_BGR_DEPTH(format) <= 8) |
695 return 0; // TODO 8bpp not yet fully implemented | |
696 if (IMGFMT_BGR_DEPTH(format) == vo_depthonscreen) | |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13787
diff
changeset
|
697 return VFCAP_CSP_SUPPORTED | VFCAP_CSP_SUPPORTED_BY_HW | VFCAP_OSD | VFCAP_SWSCALE | VFCAP_FLIP | |
12582 | 698 VFCAP_ACCEPT_STRIDE; |
699 else | |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13787
diff
changeset
|
700 return VFCAP_CSP_SUPPORTED | VFCAP_OSD | VFCAP_SWSCALE | VFCAP_FLIP | |
12582 | 701 VFCAP_ACCEPT_STRIDE; |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
702 } |
325 | 703 |
12582 | 704 switch (format) |
705 { | |
6692
ad521fb49a5e
-vm -fs -zoom fix, set correct vm screenres in aspect code (similar to xv fix).
atmos4
parents:
6180
diff
changeset
|
706 // case IMGFMT_BGR8: |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
707 // case IMGFMT_BGR15: |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
708 // case IMGFMT_BGR16: |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
709 // case IMGFMT_BGR24: |
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
710 // case IMGFMT_BGR32: |
6694
9291268a3603
1000l, back out hack-n-slay 8bpp code from my local tree.
atmos4
parents:
6693
diff
changeset
|
711 // return 0x2; |
4905
eb1a28f1236a
yuy2 support disabled to workaround stupid colorspace selection
michael
parents:
4889
diff
changeset
|
712 // case IMGFMT_YUY2: |
12582 | 713 case IMGFMT_I420: |
714 case IMGFMT_IYUV: | |
715 case IMGFMT_YV12: | |
15212
05aa13cdf92f
replace VO and VF numeric flags with #defined identifiers
henry
parents:
13787
diff
changeset
|
716 return VFCAP_CSP_SUPPORTED | VFCAP_OSD | VFCAP_SWSCALE | VFCAP_ACCEPT_STRIDE; |
12582 | 717 } |
718 return 0; | |
1 | 719 } |
720 | |
721 | |
7683 | 722 static void uninit(void) |
1 | 723 { |
12582 | 724 if (!myximage) |
725 return; | |
726 | |
727 freeMyXImage(); | |
4426
1ceadec3ea67
using the common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4420
diff
changeset
|
728 |
206
82b5ae8ceaf4
adds XF86VidMode support to vo_x11.c to do "pseudo-scaling"
mgraffam
parents:
202
diff
changeset
|
729 #ifdef HAVE_XF86VM |
12582 | 730 vo_vm_close(mDisplay); |
206
82b5ae8ceaf4
adds XF86VidMode support to vo_x11.c to do "pseudo-scaling"
mgraffam
parents:
202
diff
changeset
|
731 #endif |
4426
1ceadec3ea67
using the common -vm code, patch by Santi Bjar <tiarda@yahoo.es>
arpi
parents:
4420
diff
changeset
|
732 |
12582 | 733 zoomFlag = 0; |
734 vo_x11_uninit(); | |
4677
305a0c20bde4
default is allways nozoom again (specify -zoom if u want the sane behavior)
michael
parents:
4662
diff
changeset
|
735 |
12582 | 736 sws_freeContext(swsContext); |
1 | 737 } |
738 | |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15540
diff
changeset
|
739 static int preinit(const char *arg) |
4352 | 740 { |
12582 | 741 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
|
742 { |
12582 | 743 mp_msg(MSGT_VO, MSGL_ERR, "vo_x11: Unknown subdevice: %s\n", arg); |
744 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
|
745 } |
5130
305b1fbde890
added directrendering support and better query_format
alex
parents:
4993
diff
changeset
|
746 |
12582 | 747 if (!vo_init()) |
748 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
|
749 return 0; |
4352 | 750 } |
1 | 751 |
16171
fd51fd1ff231
Fix the return types of all (six) libvo API functions. Used to be uint32_t, but
ivo
parents:
15540
diff
changeset
|
752 static int control(uint32_t request, void *data, ...) |
4352 | 753 { |
12582 | 754 switch (request) |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7765
diff
changeset
|
755 { |
12582 | 756 case VOCTRL_PAUSE: |
757 return (int_pause = 1); | |
758 case VOCTRL_RESUME: | |
759 return (int_pause = 0); | |
760 case VOCTRL_QUERY_FORMAT: | |
761 return query_format(*((uint32_t *) data)); | |
762 case VOCTRL_GUISUPPORT: | |
763 return VO_TRUE; | |
764 case VOCTRL_GET_IMAGE: | |
765 return get_image(data); | |
766 case VOCTRL_SET_EQUALIZER: | |
767 { | |
768 va_list ap; | |
769 int value; | |
770 | |
771 va_start(ap, data); | |
772 value = va_arg(ap, int); | |
773 | |
774 va_end(ap); | |
775 return vo_x11_set_equalizer(data, value); | |
776 } | |
777 case VOCTRL_GET_EQUALIZER: | |
778 { | |
779 va_list ap; | |
780 int *value; | |
781 | |
782 va_start(ap, data); | |
783 value = va_arg(ap, int *); | |
784 | |
785 va_end(ap); | |
786 return vo_x11_get_equalizer(data, value); | |
787 } | |
788 case VOCTRL_ONTOP: | |
789 vo_x11_ontop(); | |
790 return VO_TRUE; | |
791 case VOCTRL_FULLSCREEN: | |
792 { | |
793 vo_x11_fullscreen(); | |
794 vo_x11_clearwindow(mDisplay, vo_window); | |
795 } | |
796 return VO_TRUE; | |
22232 | 797 case VOCTRL_UPDATE_SCREENINFO: |
798 update_xinerama_info(); | |
799 return VO_TRUE; | |
7964
143d730908ae
here is a somewhat generic equalizer implementation for the X11 vo drivers
arpi
parents:
7765
diff
changeset
|
800 } |
12582 | 801 return VO_NOTIMPL; |
4352 | 802 } |