diff options
author | Jesse Hall <jessehall@google.com> | 2012-07-23 19:59:26 -0700 |
---|---|---|
committer | android code review <noreply-gerritcodereview@google.com> | 2012-07-23 19:59:27 -0700 |
commit | e4f78166b531cad2bb474bae8031b66024c7df4b (patch) | |
tree | b6b2aa300fc08f7fa20d545a7255d4a9a748d282 /distrib/sdl-1.2.12/src/video/x11/SDL_x11yuv.c | |
parent | 4b0ca3716e04e4b445fd987e877f07bba6ce06cd (diff) | |
parent | d8239786b306ffda6d5d73753d01f0ad3358e1a0 (diff) | |
download | external_qemu-e4f78166b531cad2bb474bae8031b66024c7df4b.zip external_qemu-e4f78166b531cad2bb474bae8031b66024c7df4b.tar.gz external_qemu-e4f78166b531cad2bb474bae8031b66024c7df4b.tar.bz2 |
Merge "Delete sdl-1.2.12"
Diffstat (limited to 'distrib/sdl-1.2.12/src/video/x11/SDL_x11yuv.c')
-rw-r--r-- | distrib/sdl-1.2.12/src/video/x11/SDL_x11yuv.c | 413 |
1 files changed, 0 insertions, 413 deletions
diff --git a/distrib/sdl-1.2.12/src/video/x11/SDL_x11yuv.c b/distrib/sdl-1.2.12/src/video/x11/SDL_x11yuv.c deleted file mode 100644 index 63cf10b..0000000 --- a/distrib/sdl-1.2.12/src/video/x11/SDL_x11yuv.c +++ /dev/null @@ -1,413 +0,0 @@ -/* - SDL - Simple DirectMedia Layer - Copyright (C) 1997-2006 Sam Lantinga - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2.1 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to the Free Software - Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA - - Sam Lantinga - slouken@libsdl.org -*/ -#include "SDL_config.h" - -/* This is the XFree86 Xv extension implementation of YUV video overlays */ - -#if SDL_VIDEO_DRIVER_X11_XV - -#include <X11/Xlib.h> -#ifndef NO_SHARED_MEMORY -#include <sys/ipc.h> -#include <sys/shm.h> -#include <X11/extensions/XShm.h> -#endif -#include "../Xext/extensions/Xvlib.h" - -#include "SDL_x11yuv_c.h" -#include "../SDL_yuvfuncs.h" - -#define XFREE86_REFRESH_HACK -#ifdef XFREE86_REFRESH_HACK -#include "SDL_x11image_c.h" -#endif - -/* Workaround when pitch != width */ -#define PITCH_WORKAROUND - -/* Fix for the NVidia GeForce 2 - use the last available adaptor */ -/*#define USE_LAST_ADAPTOR*/ /* Apparently the NVidia drivers are fixed */ - -/* The functions used to manipulate software video overlays */ -static struct private_yuvhwfuncs x11_yuvfuncs = { - X11_LockYUVOverlay, - X11_UnlockYUVOverlay, - X11_DisplayYUVOverlay, - X11_FreeYUVOverlay -}; - -struct private_yuvhwdata { - int port; -#ifndef NO_SHARED_MEMORY - int yuv_use_mitshm; - XShmSegmentInfo yuvshm; -#endif - SDL_NAME(XvImage) *image; -}; - - -static int (*X_handler)(Display *, XErrorEvent *) = NULL; - -#ifndef NO_SHARED_MEMORY -/* Shared memory error handler routine */ -static int shm_error; -static int shm_errhandler(Display *d, XErrorEvent *e) -{ - if ( e->error_code == BadAccess ) { - shm_error = True; - return(0); - } else - return(X_handler(d,e)); -} -#endif /* !NO_SHARED_MEMORY */ - -static int xv_error; -static int xv_errhandler(Display *d, XErrorEvent *e) -{ - if ( e->error_code == BadMatch ) { - xv_error = True; - return(0); - } else - return(X_handler(d,e)); -} - -SDL_Overlay *X11_CreateYUVOverlay(_THIS, int width, int height, Uint32 format, SDL_Surface *display) -{ - SDL_Overlay *overlay; - struct private_yuvhwdata *hwdata; - int xv_port; - unsigned int i, j, k; - unsigned int adaptors; - SDL_NAME(XvAdaptorInfo) *ainfo; - int bpp; -#ifndef NO_SHARED_MEMORY - XShmSegmentInfo *yuvshm; -#endif - - /* Look for the XVideo extension with a valid port for this format */ - xv_port = -1; - if ( (Success == SDL_NAME(XvQueryExtension)(GFX_Display, &j, &j, &j, &j, &j)) && - (Success == SDL_NAME(XvQueryAdaptors)(GFX_Display, - RootWindow(GFX_Display, SDL_Screen), - &adaptors, &ainfo)) ) { -#ifdef USE_LAST_ADAPTOR - for ( i=0; i < adaptors; ++i ) -#else - for ( i=0; (i < adaptors) && (xv_port == -1); ++i ) -#endif /* USE_LAST_ADAPTOR */ - { - /* Check to see if the visual can be used */ - if ( BUGGY_XFREE86(<=, 4001) ) { - int visual_ok = 0; - for ( j=0; j<ainfo[i].num_formats; ++j ) { - if ( ainfo[i].formats[j].visual_id == - SDL_Visual->visualid ) { - visual_ok = 1; - break; - } - } - if ( ! visual_ok ) { - continue; - } - } - if ( (ainfo[i].type & XvInputMask) && - (ainfo[i].type & XvImageMask) ) { - int num_formats; - SDL_NAME(XvImageFormatValues) *formats; - formats = SDL_NAME(XvListImageFormats)(GFX_Display, - ainfo[i].base_id, &num_formats); -#ifdef USE_LAST_ADAPTOR - for ( j=0; j < num_formats; ++j ) -#else - for ( j=0; (j < num_formats) && (xv_port == -1); ++j ) -#endif /* USE_LAST_ADAPTOR */ - { - if ( (Uint32)formats[j].id == format ) { - for ( k=0; k < ainfo[i].num_ports; ++k ) { - if ( Success == SDL_NAME(XvGrabPort)(GFX_Display, ainfo[i].base_id+k, CurrentTime) ) { - xv_port = ainfo[i].base_id+k; - break; - } - } - } - } - if ( formats ) { - XFree(formats); - } - } - } - SDL_NAME(XvFreeAdaptorInfo)(ainfo); - } - - /* Precalculate the bpp for the pitch workaround below */ - switch (format) { - /* Add any other cases we need to support... */ - case SDL_YUY2_OVERLAY: - case SDL_UYVY_OVERLAY: - case SDL_YVYU_OVERLAY: - bpp = 2; - break; - default: - bpp = 1; - break; - } - -#if 0 - /* - * !!! FIXME: - * "Here are some diffs for X11 and yuv. Note that the last part 2nd - * diff should probably be a new call to XvQueryAdaptorFree with ainfo - * and the number of adaptors, instead of the loop through like I did." - * - * ACHTUNG: This is broken! It looks like XvFreeAdaptorInfo does this - * for you, so we end up with a double-free. I need to look at this - * more closely... --ryan. - */ - for ( i=0; i < adaptors; ++i ) { - if (ainfo[i].name != NULL) Xfree(ainfo[i].name); - if (ainfo[i].formats != NULL) Xfree(ainfo[i].formats); - } - Xfree(ainfo); -#endif - - if ( xv_port == -1 ) { - SDL_SetError("No available video ports for requested format"); - return(NULL); - } - - /* Enable auto-painting of the overlay colorkey */ - { - static const char *attr[] = { "XV_AUTOPAINT_COLORKEY", "XV_AUTOPAINT_COLOURKEY" }; - unsigned int i; - - SDL_NAME(XvSelectPortNotify)(GFX_Display, xv_port, True); - X_handler = XSetErrorHandler(xv_errhandler); - for ( i=0; i < sizeof(attr)/(sizeof attr[0]); ++i ) { - Atom a; - - xv_error = False; - a = XInternAtom(GFX_Display, attr[i], True); - if ( a != None ) { - SDL_NAME(XvSetPortAttribute)(GFX_Display, xv_port, a, 1); - XSync(GFX_Display, True); - if ( ! xv_error ) { - break; - } - } - } - XSetErrorHandler(X_handler); - SDL_NAME(XvSelectPortNotify)(GFX_Display, xv_port, False); - } - - /* Create the overlay structure */ - overlay = (SDL_Overlay *)SDL_malloc(sizeof *overlay); - if ( overlay == NULL ) { - SDL_NAME(XvUngrabPort)(GFX_Display, xv_port, CurrentTime); - SDL_OutOfMemory(); - return(NULL); - } - SDL_memset(overlay, 0, (sizeof *overlay)); - - /* Fill in the basic members */ - overlay->format = format; - overlay->w = width; - overlay->h = height; - - /* Set up the YUV surface function structure */ - overlay->hwfuncs = &x11_yuvfuncs; - overlay->hw_overlay = 1; - - /* Create the pixel data and lookup tables */ - hwdata = (struct private_yuvhwdata *)SDL_malloc(sizeof *hwdata); - overlay->hwdata = hwdata; - if ( hwdata == NULL ) { - SDL_NAME(XvUngrabPort)(GFX_Display, xv_port, CurrentTime); - SDL_OutOfMemory(); - SDL_FreeYUVOverlay(overlay); - return(NULL); - } - hwdata->port = xv_port; -#ifndef NO_SHARED_MEMORY - yuvshm = &hwdata->yuvshm; - SDL_memset(yuvshm, 0, sizeof(*yuvshm)); - hwdata->image = SDL_NAME(XvShmCreateImage)(GFX_Display, xv_port, format, - 0, width, height, yuvshm); -#ifdef PITCH_WORKAROUND - if ( hwdata->image != NULL && hwdata->image->pitches[0] != (width*bpp) ) { - /* Ajust overlay width according to pitch */ - XFree(hwdata->image); - width = hwdata->image->pitches[0] / bpp; - hwdata->image = SDL_NAME(XvShmCreateImage)(GFX_Display, xv_port, format, - 0, width, height, yuvshm); - } -#endif /* PITCH_WORKAROUND */ - hwdata->yuv_use_mitshm = (hwdata->image != NULL); - if ( hwdata->yuv_use_mitshm ) { - yuvshm->shmid = shmget(IPC_PRIVATE, hwdata->image->data_size, - IPC_CREAT | 0777); - if ( yuvshm->shmid >= 0 ) { - yuvshm->shmaddr = (char *)shmat(yuvshm->shmid, 0, 0); - yuvshm->readOnly = False; - if ( yuvshm->shmaddr != (char *)-1 ) { - shm_error = False; - X_handler = XSetErrorHandler(shm_errhandler); - XShmAttach(GFX_Display, yuvshm); - XSync(GFX_Display, True); - XSetErrorHandler(X_handler); - if ( shm_error ) - shmdt(yuvshm->shmaddr); - } else { - shm_error = True; - } - shmctl(yuvshm->shmid, IPC_RMID, NULL); - } else { - shm_error = True; - } - if ( shm_error ) { - XFree(hwdata->image); - hwdata->yuv_use_mitshm = 0; - } else { - hwdata->image->data = yuvshm->shmaddr; - } - } - if ( !hwdata->yuv_use_mitshm ) -#endif /* NO_SHARED_MEMORY */ - { - hwdata->image = SDL_NAME(XvCreateImage)(GFX_Display, xv_port, format, - 0, width, height); - -#ifdef PITCH_WORKAROUND - if ( hwdata->image != NULL && hwdata->image->pitches[0] != (width*bpp) ) { - /* Ajust overlay width according to pitch */ - XFree(hwdata->image); - width = hwdata->image->pitches[0] / bpp; - hwdata->image = SDL_NAME(XvCreateImage)(GFX_Display, xv_port, format, - 0, width, height); - } -#endif /* PITCH_WORKAROUND */ - if ( hwdata->image == NULL ) { - SDL_SetError("Couldn't create XVideo image"); - SDL_FreeYUVOverlay(overlay); - return(NULL); - } - hwdata->image->data = SDL_malloc(hwdata->image->data_size); - if ( hwdata->image->data == NULL ) { - SDL_OutOfMemory(); - SDL_FreeYUVOverlay(overlay); - return(NULL); - } - } - - /* Find the pitch and offset values for the overlay */ - overlay->planes = hwdata->image->num_planes; - overlay->pitches = (Uint16 *)SDL_malloc(overlay->planes * sizeof(Uint16)); - overlay->pixels = (Uint8 **)SDL_malloc(overlay->planes * sizeof(Uint8 *)); - if ( !overlay->pitches || !overlay->pixels ) { - SDL_OutOfMemory(); - SDL_FreeYUVOverlay(overlay); - return(NULL); - } - for ( i=0; i<overlay->planes; ++i ) { - overlay->pitches[i] = hwdata->image->pitches[i]; - overlay->pixels[i] = (Uint8 *)hwdata->image->data + - hwdata->image->offsets[i]; - } - -#ifdef XFREE86_REFRESH_HACK - /* Work around an XFree86 X server bug (?) - We can't perform normal updates in windows that have video - being output to them. See SDL_x11image.c for more details. - */ - X11_DisableAutoRefresh(this); -#endif - - /* We're all done.. */ - return(overlay); -} - -int X11_LockYUVOverlay(_THIS, SDL_Overlay *overlay) -{ - return(0); -} - -void X11_UnlockYUVOverlay(_THIS, SDL_Overlay *overlay) -{ - return; -} - -int X11_DisplayYUVOverlay(_THIS, SDL_Overlay *overlay, SDL_Rect *src, SDL_Rect *dst) -{ - struct private_yuvhwdata *hwdata; - - hwdata = overlay->hwdata; - -#ifndef NO_SHARED_MEMORY - if ( hwdata->yuv_use_mitshm ) { - SDL_NAME(XvShmPutImage)(GFX_Display, hwdata->port, SDL_Window, SDL_GC, - hwdata->image, - src->x, src->y, src->w, src->h, - dst->x, dst->y, dst->w, dst->h, False); - } - else -#endif - { - SDL_NAME(XvPutImage)(GFX_Display, hwdata->port, SDL_Window, SDL_GC, - hwdata->image, - src->x, src->y, src->w, src->h, - dst->x, dst->y, dst->w, dst->h); - } - XSync(GFX_Display, False); - return(0); -} - -void X11_FreeYUVOverlay(_THIS, SDL_Overlay *overlay) -{ - struct private_yuvhwdata *hwdata; - - hwdata = overlay->hwdata; - if ( hwdata ) { - SDL_NAME(XvUngrabPort)(GFX_Display, hwdata->port, CurrentTime); -#ifndef NO_SHARED_MEMORY - if ( hwdata->yuv_use_mitshm ) { - XShmDetach(GFX_Display, &hwdata->yuvshm); - shmdt(hwdata->yuvshm.shmaddr); - } -#endif - if ( hwdata->image ) { - XFree(hwdata->image); - } - SDL_free(hwdata); - } - if ( overlay->pitches ) { - SDL_free(overlay->pitches); - overlay->pitches = NULL; - } - if ( overlay->pixels ) { - SDL_free(overlay->pixels); - overlay->pixels = NULL; - } -#ifdef XFREE86_REFRESH_HACK - X11_EnableAutoRefresh(this); -#endif -} - -#endif /* SDL_VIDEO_DRIVER_X11_XV */ |