Mercurial > sdl-ios-xcode
annotate src/video/x11/SDL_x11yuv.c @ 753:b14fdadd8311
Date: Thu, 4 Dec 2003 07:48:40 +0200
From: "Mike Gorchak"
Subject: SDL/QNX6 new patch
Here in attachment my patch for the SDL/QNX6 again :) It contain non-crtitical/cosmetic fixes:
1. Fixed window centering at other than the first consoles.
2. Fixed window centering algorithm in case when window height or width are greater than the desktop resolution.
3. Fixed window positioning on other than the first consoles.
4. Fixed occasional input focus lost when switching to fullscreen.
5. Removed the Photon's default chroma color for the overlays, added RGB(12, 6, 12) color instead (very dark pink).
6. Added more checks to the YUV overlay code (fixed crashes during resolution mode switches).
7. Added support for Enter/Backspace keys in unicode mode (used by Maelstrom and by other games).
8. Fixed window restore/maximize function. It works, finally.
author | Sam Lantinga <slouken@libsdl.org> |
---|---|
date | Wed, 10 Dec 2003 12:35:56 +0000 |
parents | e3d0517bf67e |
children | b8d311d90021 |
rev | line source |
---|---|
0 | 1 /* |
2 SDL - Simple DirectMedia Layer | |
297
f6ffac90895c
Updated copyright information for 2002
Sam Lantinga <slouken@libsdl.org>
parents:
292
diff
changeset
|
3 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga |
0 | 4 |
5 This library is free software; you can redistribute it and/or | |
6 modify it under the terms of the GNU Library General Public | |
7 License as published by the Free Software Foundation; either | |
8 version 2 of the License, or (at your option) any later version. | |
9 | |
10 This library is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 Library General Public License for more details. | |
14 | |
15 You should have received a copy of the GNU Library General Public | |
16 License along with this library; if not, write to the Free | |
17 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |
18 | |
19 Sam Lantinga | |
252
e8157fcb3114
Updated the source with the correct e-mail address
Sam Lantinga <slouken@libsdl.org>
parents:
182
diff
changeset
|
20 slouken@libsdl.org |
0 | 21 */ |
22 | |
23 #ifdef SAVE_RCSID | |
24 static char rcsid = | |
25 "@(#) $Id$"; | |
26 #endif | |
27 | |
28 /* This is the XFree86 Xv extension implementation of YUV video overlays */ | |
29 | |
30 #ifdef XFREE86_XV | |
31 | |
32 #include <stdlib.h> | |
33 #include <string.h> | |
34 #include <X11/Xlib.h> | |
35 #include <sys/ipc.h> | |
36 #include <sys/shm.h> | |
37 #include <X11/extensions/XShm.h> | |
292
eadc0746dfaf
Added SDL_LockRect() and SDL_UnlockRect()
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
38 #include <XFree86/extensions/Xvlib.h> |
0 | 39 |
40 #include "SDL_error.h" | |
41 #include "SDL_video.h" | |
42 #include "SDL_x11yuv_c.h" | |
43 #include "SDL_yuvfuncs.h" | |
44 | |
45 #define XFREE86_REFRESH_HACK | |
46 #ifdef XFREE86_REFRESH_HACK | |
47 #include "SDL_x11image_c.h" | |
48 #endif | |
49 | |
50 /* Workaround when pitch != width */ | |
51 #define PITCH_WORKAROUND | |
52 | |
182
d4ebd1bbea9a
Fix XVideo on GeForce by using last available adaptor
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
53 /* Fix for the NVidia GeForce 2 - use the last available adaptor */ |
341
6ca967a46bf1
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
297
diff
changeset
|
54 /*#define USE_LAST_ADAPTOR*/ /* Apparently the NVidia drivers are fixed */ |
182
d4ebd1bbea9a
Fix XVideo on GeForce by using last available adaptor
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
55 |
0 | 56 /* The functions used to manipulate software video overlays */ |
57 static struct private_yuvhwfuncs x11_yuvfuncs = { | |
58 X11_LockYUVOverlay, | |
59 X11_UnlockYUVOverlay, | |
60 X11_DisplayYUVOverlay, | |
61 X11_FreeYUVOverlay | |
62 }; | |
63 | |
64 struct private_yuvhwdata { | |
65 int port; | |
66 XShmSegmentInfo yuvshm; | |
292
eadc0746dfaf
Added SDL_LockRect() and SDL_UnlockRect()
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
67 SDL_NAME(XvImage) *image; |
0 | 68 }; |
69 | |
70 | |
71 SDL_Overlay *X11_CreateYUVOverlay(_THIS, int width, int height, Uint32 format, SDL_Surface *display) | |
72 { | |
73 SDL_Overlay *overlay; | |
74 struct private_yuvhwdata *hwdata; | |
75 int xv_port; | |
76 int i, j, k; | |
77 int adaptors; | |
292
eadc0746dfaf
Added SDL_LockRect() and SDL_UnlockRect()
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
78 SDL_NAME(XvAdaptorInfo) *ainfo; |
0 | 79 XShmSegmentInfo *yuvshm; |
80 | |
81 /* Look for the XVideo extension with a valid port for this format */ | |
82 xv_port = -1; | |
292
eadc0746dfaf
Added SDL_LockRect() and SDL_UnlockRect()
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
83 if ( (Success == SDL_NAME(XvQueryExtension)(GFX_Display, &j, &j, &j, &j, &j)) && |
eadc0746dfaf
Added SDL_LockRect() and SDL_UnlockRect()
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
84 (Success == SDL_NAME(XvQueryAdaptors)(GFX_Display, |
0 | 85 RootWindow(GFX_Display, SDL_Screen), |
86 &adaptors, &ainfo)) ) { | |
182
d4ebd1bbea9a
Fix XVideo on GeForce by using last available adaptor
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
87 #ifdef USE_LAST_ADAPTOR |
659
e3d0517bf67e
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
494
diff
changeset
|
88 for ( i=0; i < adaptors; ++i ) |
182
d4ebd1bbea9a
Fix XVideo on GeForce by using last available adaptor
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
89 #else |
659
e3d0517bf67e
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
494
diff
changeset
|
90 for ( i=0; (i < adaptors) && (xv_port == -1); ++i ) |
182
d4ebd1bbea9a
Fix XVideo on GeForce by using last available adaptor
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
91 #endif /* USE_LAST_ADAPTOR */ |
659
e3d0517bf67e
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
494
diff
changeset
|
92 { |
0 | 93 /* Check to see if the visual can be used */ |
94 if ( BUGGY_XFREE86(<=, 4001) ) { | |
95 int visual_ok = 0; | |
96 for ( j=0; j<ainfo[i].num_formats; ++j ) { | |
97 if ( ainfo[i].formats[j].visual_id == | |
98 SDL_Visual->visualid ) { | |
99 visual_ok = 1; | |
100 break; | |
101 } | |
102 } | |
103 if ( ! visual_ok ) { | |
104 continue; | |
105 } | |
106 } | |
107 if ( (ainfo[i].type & XvInputMask) && | |
108 (ainfo[i].type & XvImageMask) ) { | |
109 int num_formats; | |
292
eadc0746dfaf
Added SDL_LockRect() and SDL_UnlockRect()
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
110 SDL_NAME(XvImageFormatValues) *formats; |
eadc0746dfaf
Added SDL_LockRect() and SDL_UnlockRect()
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
111 formats = SDL_NAME(XvListImageFormats)(GFX_Display, |
0 | 112 ainfo[i].base_id, &num_formats); |
182
d4ebd1bbea9a
Fix XVideo on GeForce by using last available adaptor
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
113 #ifdef USE_LAST_ADAPTOR |
659
e3d0517bf67e
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
494
diff
changeset
|
114 for ( j=0; j < num_formats; ++j ) |
182
d4ebd1bbea9a
Fix XVideo on GeForce by using last available adaptor
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
115 #else |
659
e3d0517bf67e
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
494
diff
changeset
|
116 for ( j=0; (j < num_formats) && (xv_port == -1); ++j ) |
182
d4ebd1bbea9a
Fix XVideo on GeForce by using last available adaptor
Sam Lantinga <slouken@libsdl.org>
parents:
0
diff
changeset
|
117 #endif /* USE_LAST_ADAPTOR */ |
659
e3d0517bf67e
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
494
diff
changeset
|
118 { |
0 | 119 if ( (Uint32)formats[j].id == format ) { |
120 for ( k=0; k < ainfo[i].num_ports; ++k ) { | |
292
eadc0746dfaf
Added SDL_LockRect() and SDL_UnlockRect()
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
121 if ( Success == SDL_NAME(XvGrabPort)(GFX_Display, ainfo[i].base_id+k, CurrentTime) ) { |
0 | 122 xv_port = ainfo[i].base_id+k; |
123 break; | |
124 } | |
125 } | |
126 } | |
127 } | |
410
365f57b7c4ac
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
409
diff
changeset
|
128 if ( formats ) { |
365f57b7c4ac
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
409
diff
changeset
|
129 XFree(formats); |
365f57b7c4ac
*** empty log message ***
Sam Lantinga <slouken@libsdl.org>
parents:
409
diff
changeset
|
130 } |
0 | 131 } |
132 } | |
409
1c3cf7231cd4
Fixed memory leaks in YUV code
Sam Lantinga <slouken@libsdl.org>
parents:
341
diff
changeset
|
133 SDL_NAME(XvFreeAdaptorInfo)(ainfo); |
0 | 134 } |
429
c1666427297c
Memory leak fixes by Bill May.
Ryan C. Gordon <icculus@icculus.org>
parents:
410
diff
changeset
|
135 |
434
ed58b98c0d9d
Commented double-free buggy code. Will examine more closely later.
Ryan C. Gordon <icculus@icculus.org>
parents:
429
diff
changeset
|
136 #if 0 |
429
c1666427297c
Memory leak fixes by Bill May.
Ryan C. Gordon <icculus@icculus.org>
parents:
410
diff
changeset
|
137 /* |
c1666427297c
Memory leak fixes by Bill May.
Ryan C. Gordon <icculus@icculus.org>
parents:
410
diff
changeset
|
138 * !!! FIXME: |
c1666427297c
Memory leak fixes by Bill May.
Ryan C. Gordon <icculus@icculus.org>
parents:
410
diff
changeset
|
139 * "Here are some diffs for X11 and yuv. Note that the last part 2nd |
c1666427297c
Memory leak fixes by Bill May.
Ryan C. Gordon <icculus@icculus.org>
parents:
410
diff
changeset
|
140 * diff should probably be a new call to XvQueryAdaptorFree with ainfo |
c1666427297c
Memory leak fixes by Bill May.
Ryan C. Gordon <icculus@icculus.org>
parents:
410
diff
changeset
|
141 * and the number of adaptors, instead of the loop through like I did." |
434
ed58b98c0d9d
Commented double-free buggy code. Will examine more closely later.
Ryan C. Gordon <icculus@icculus.org>
parents:
429
diff
changeset
|
142 * |
ed58b98c0d9d
Commented double-free buggy code. Will examine more closely later.
Ryan C. Gordon <icculus@icculus.org>
parents:
429
diff
changeset
|
143 * ACHTUNG: This is broken! It looks like XvFreeAdaptorInfo does this |
ed58b98c0d9d
Commented double-free buggy code. Will examine more closely later.
Ryan C. Gordon <icculus@icculus.org>
parents:
429
diff
changeset
|
144 * for you, so we end up with a double-free. I need to look at this |
ed58b98c0d9d
Commented double-free buggy code. Will examine more closely later.
Ryan C. Gordon <icculus@icculus.org>
parents:
429
diff
changeset
|
145 * more closely... --ryan. |
429
c1666427297c
Memory leak fixes by Bill May.
Ryan C. Gordon <icculus@icculus.org>
parents:
410
diff
changeset
|
146 */ |
c1666427297c
Memory leak fixes by Bill May.
Ryan C. Gordon <icculus@icculus.org>
parents:
410
diff
changeset
|
147 for ( i=0; i < adaptors; ++i ) { |
c1666427297c
Memory leak fixes by Bill May.
Ryan C. Gordon <icculus@icculus.org>
parents:
410
diff
changeset
|
148 if (ainfo[i].name != NULL) Xfree(ainfo[i].name); |
c1666427297c
Memory leak fixes by Bill May.
Ryan C. Gordon <icculus@icculus.org>
parents:
410
diff
changeset
|
149 if (ainfo[i].formats != NULL) Xfree(ainfo[i].formats); |
c1666427297c
Memory leak fixes by Bill May.
Ryan C. Gordon <icculus@icculus.org>
parents:
410
diff
changeset
|
150 } |
c1666427297c
Memory leak fixes by Bill May.
Ryan C. Gordon <icculus@icculus.org>
parents:
410
diff
changeset
|
151 Xfree(ainfo); |
434
ed58b98c0d9d
Commented double-free buggy code. Will examine more closely later.
Ryan C. Gordon <icculus@icculus.org>
parents:
429
diff
changeset
|
152 #endif |
429
c1666427297c
Memory leak fixes by Bill May.
Ryan C. Gordon <icculus@icculus.org>
parents:
410
diff
changeset
|
153 |
0 | 154 if ( xv_port == -1 ) { |
155 SDL_SetError("No available video ports for requested format"); | |
156 return(NULL); | |
157 } | |
158 | |
159 /* Create the overlay structure */ | |
160 overlay = (SDL_Overlay *)malloc(sizeof *overlay); | |
161 if ( overlay == NULL ) { | |
292
eadc0746dfaf
Added SDL_LockRect() and SDL_UnlockRect()
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
162 SDL_NAME(XvUngrabPort)(GFX_Display, xv_port, CurrentTime); |
0 | 163 SDL_OutOfMemory(); |
164 return(NULL); | |
165 } | |
166 memset(overlay, 0, (sizeof *overlay)); | |
167 | |
168 /* Fill in the basic members */ | |
169 overlay->format = format; | |
170 overlay->w = width; | |
171 overlay->h = height; | |
172 | |
173 /* Set up the YUV surface function structure */ | |
174 overlay->hwfuncs = &x11_yuvfuncs; | |
175 overlay->hw_overlay = 1; | |
176 | |
177 /* Create the pixel data and lookup tables */ | |
178 hwdata = (struct private_yuvhwdata *)malloc(sizeof *hwdata); | |
179 overlay->hwdata = hwdata; | |
180 if ( hwdata == NULL ) { | |
292
eadc0746dfaf
Added SDL_LockRect() and SDL_UnlockRect()
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
181 SDL_NAME(XvUngrabPort)(GFX_Display, xv_port, CurrentTime); |
0 | 182 SDL_OutOfMemory(); |
183 SDL_FreeYUVOverlay(overlay); | |
184 return(NULL); | |
185 } | |
186 yuvshm = &hwdata->yuvshm; | |
187 memset(yuvshm, 0, sizeof(*yuvshm)); | |
188 hwdata->port = xv_port; | |
292
eadc0746dfaf
Added SDL_LockRect() and SDL_UnlockRect()
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
189 hwdata->image = SDL_NAME(XvShmCreateImage)(GFX_Display, xv_port, format, |
0 | 190 0, width, height, yuvshm); |
191 | |
192 #ifdef PITCH_WORKAROUND | |
193 if ( hwdata->image != NULL && hwdata->image->pitches[0] != width ) | |
194 { | |
195 /* Ajust overlay width according to pitch */ | |
196 switch (format) { | |
197 case SDL_YV12_OVERLAY: | |
198 case SDL_IYUV_OVERLAY: | |
199 width = hwdata->image->pitches[0]; | |
200 break; | |
201 case SDL_YUY2_OVERLAY: | |
202 case SDL_UYVY_OVERLAY: | |
203 case SDL_YVYU_OVERLAY: | |
204 width = hwdata->image->pitches[0] / 2; | |
205 break; | |
206 default: | |
207 /* We should never get here (caught above) */ | |
208 return(NULL); | |
209 } | |
210 | |
211 XFree(hwdata->image); | |
292
eadc0746dfaf
Added SDL_LockRect() and SDL_UnlockRect()
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
212 hwdata->image = SDL_NAME(XvShmCreateImage)(GFX_Display, xv_port, format, |
0 | 213 0, width, height, yuvshm); |
214 } | |
215 #endif | |
216 | |
217 if ( hwdata->image == NULL ) { | |
218 SDL_OutOfMemory(); | |
219 SDL_FreeYUVOverlay(overlay); | |
220 return(NULL); | |
221 } | |
222 yuvshm->shmid = shmget(IPC_PRIVATE, hwdata->image->data_size, | |
223 IPC_CREAT | 0777); | |
224 if ( yuvshm->shmid < 0 ) { | |
225 SDL_SetError("Unable to get %d bytes shared memory", | |
226 hwdata->image->data_size); | |
227 SDL_FreeYUVOverlay(overlay); | |
228 return(NULL); | |
229 } | |
230 yuvshm->shmaddr = (char *) shmat(yuvshm->shmid, 0, 0); | |
231 yuvshm->readOnly = False; | |
232 hwdata->image->data = yuvshm->shmaddr; | |
233 | |
234 XShmAttach(GFX_Display, yuvshm); | |
235 XSync(GFX_Display, False); | |
236 shmctl(yuvshm->shmid, IPC_RMID, 0); | |
237 | |
238 /* Find the pitch and offset values for the overlay */ | |
239 overlay->planes = hwdata->image->num_planes; | |
240 overlay->pitches = (Uint16 *)malloc(overlay->planes * sizeof(Uint16)); | |
241 overlay->pixels = (Uint8 **)malloc(overlay->planes * sizeof(Uint8 *)); | |
242 if ( !overlay->pitches || !overlay->pixels ) { | |
243 SDL_OutOfMemory(); | |
244 SDL_FreeYUVOverlay(overlay); | |
245 return(NULL); | |
246 } | |
247 for ( i=0; i<overlay->planes; ++i ) { | |
248 overlay->pitches[i] = hwdata->image->pitches[i]; | |
249 overlay->pixels[i] = (Uint8 *)hwdata->image->data + | |
250 hwdata->image->offsets[i]; | |
251 } | |
252 | |
253 #ifdef XFREE86_REFRESH_HACK | |
254 /* Work around an XFree86 X server bug (?) | |
255 We can't perform normal updates in windows that have video | |
256 being output to them. See SDL_x11image.c for more details. | |
257 */ | |
258 X11_DisableAutoRefresh(this); | |
259 #endif | |
260 | |
261 /* We're all done.. */ | |
262 return(overlay); | |
263 } | |
264 | |
265 int X11_LockYUVOverlay(_THIS, SDL_Overlay *overlay) | |
266 { | |
267 return(0); | |
268 } | |
269 | |
270 void X11_UnlockYUVOverlay(_THIS, SDL_Overlay *overlay) | |
271 { | |
272 return; | |
273 } | |
274 | |
275 int X11_DisplayYUVOverlay(_THIS, SDL_Overlay *overlay, SDL_Rect *dstrect) | |
276 { | |
277 struct private_yuvhwdata *hwdata; | |
278 | |
279 hwdata = overlay->hwdata; | |
292
eadc0746dfaf
Added SDL_LockRect() and SDL_UnlockRect()
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
280 SDL_NAME(XvShmPutImage)(GFX_Display, hwdata->port, SDL_Window, SDL_GC, |
0 | 281 hwdata->image, 0, 0, overlay->w, overlay->h, |
282 dstrect->x, dstrect->y, dstrect->w, dstrect->h, False); | |
283 XSync(GFX_Display, False); | |
284 return(0); | |
285 } | |
286 | |
287 void X11_FreeYUVOverlay(_THIS, SDL_Overlay *overlay) | |
288 { | |
289 struct private_yuvhwdata *hwdata; | |
290 | |
291 hwdata = overlay->hwdata; | |
292 if ( hwdata ) { | |
292
eadc0746dfaf
Added SDL_LockRect() and SDL_UnlockRect()
Sam Lantinga <slouken@libsdl.org>
parents:
252
diff
changeset
|
293 SDL_NAME(XvUngrabPort)(GFX_Display, hwdata->port, CurrentTime); |
0 | 294 if ( hwdata->yuvshm.shmaddr ) { |
295 XShmDetach(GFX_Display, &hwdata->yuvshm); | |
296 shmdt(hwdata->yuvshm.shmaddr); | |
297 } | |
298 if ( hwdata->image ) { | |
299 XFree(hwdata->image); | |
300 } | |
301 free(hwdata); | |
302 } | |
303 if ( overlay->pitches ) { | |
304 free(overlay->pitches); | |
305 overlay->pitches = NULL; | |
306 } | |
307 if ( overlay->pixels ) { | |
308 free(overlay->pixels); | |
309 overlay->pixels = NULL; | |
310 } | |
311 #ifdef XFREE86_REFRESH_HACK | |
312 X11_EnableAutoRefresh(this); | |
313 #endif | |
314 } | |
315 | |
316 #endif /* XFREE86_XV */ |