Blame wrapper/XvMCWrapper.c

Packit Service d3952c
/*****************************************************************************
Packit Service d3952c
 * XvMC Wrapper including the Nonstandard VLD extension.
Packit Service d3952c
 *
Packit Service d3952c
 * Copyright (c) 2004 The Unichrome project. All rights reserved.
Packit Service d3952c
 *
Packit Service d3952c
 *
Packit Service d3952c
 * Permission is hereby granted, free of charge, to any person obtaining a
Packit Service d3952c
 * copy of this software and associated documentation files (the "Software"),
Packit Service d3952c
 * to deal in the Software without restriction, including without limitation
Packit Service d3952c
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
Packit Service d3952c
 * and/or sell copies of the Software, and to permit persons to whom the
Packit Service d3952c
 * Software is furnished to do so, subject to the following conditions:
Packit Service d3952c
 *
Packit Service d3952c
 * The above copyright notice and this permission notice shall be included in
Packit Service d3952c
 * all copies or substantial portions of the Software.
Packit Service d3952c
 *
Packit Service d3952c
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit Service d3952c
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit Service d3952c
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
Packit Service d3952c
 * AUTHOR(S) OR COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
Packit Service d3952c
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
Packit Service d3952c
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
Packit Service d3952c
 * DEALINGS IN THE SOFTWARE.
Packit Service d3952c
 *
Packit Service d3952c
 * Author: Thomas Hellström (2004)
Packit Service d3952c
 */
Packit Service d3952c
Packit Service d3952c
/*
Packit Service d3952c
 * BUGS: The wrapper really should maintain one symbol table per port. This
Packit Service d3952c
 * could possibly be impemented, To do that, the port-independent symbols need to be lifted out,
Packit Service d3952c
 * and one would have to create a number of mapping tables:
Packit Service d3952c
 *
Packit Service d3952c
 *                 port  -> symbol table
Packit Service d3952c
 *                 context -> port
Packit Service d3952c
 *                 surface -> port
Packit Service d3952c
 *                 subpicture -> port
Packit Service d3952c
 *
Packit Service d3952c
 * and reference the right table when needed.
Packit Service d3952c
 * This needs to be done only if there is a player that wants to access two displays with different
Packit Service d3952c
 * hardware simultaneously. Not likely as of today.
Packit Service d3952c
 */
Packit Service d3952c
Packit Service d3952c
#ifdef HAVE_CONFIG_H
Packit Service d3952c
  #include "config.h"
Packit Service d3952c
#endif
Packit Service d3952c
Packit Service d3952c
#include <X11/Xlib.h>
Packit Service d3952c
#include <X11/extensions/XvMC.h>
Packit Service d3952c
#include <X11/extensions/XvMClib.h>
Packit Service d3952c
#include "X11/extensions/vldXvMC.h"
Packit Service d3952c
#include <dlfcn.h>
Packit Service d3952c
#include <stdio.h>
Packit Service d3952c
#include <string.h>
Packit Service d3952c
#include <ctype.h>
Packit Service d3952c
#include <stdlib.h>
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
typedef Bool (*XvMCQueryExtensionP) (Display *, int *, int *);
Packit Service d3952c
typedef Status (*XvMCQueryVersionP) (Display *, int *,int *);
Packit Service d3952c
typedef XvMCSurfaceInfo * (*XvMCListSurfaceTypesP)(Display *, XvPortID, int *);
Packit Service d3952c
typedef Status (* XvMCCreateContextP) (Display *,XvPortID,int ,int ,int ,int ,XvMCContext * );
Packit Service d3952c
typedef Status (*XvMCDestroyContextP) (Display *, XvMCContext * );
Packit Service d3952c
typedef Status (*XvMCCreateSurfaceP)(Display *,XvMCContext *,XvMCSurface *);
Packit Service d3952c
typedef Status (*XvMCDestroySurfaceP)(Display *, XvMCSurface *);
Packit Service d3952c
typedef XvImageFormatValues * (*XvMCListSubpictureTypesP) (Display *,XvPortID ,int ,int *);
Packit Service d3952c
typedef Status (*XvMCPutSurfaceP)(Display *,XvMCSurface *,Drawable ,short , short , unsigned short ,
Packit Service d3952c
				  unsigned short ,short ,short ,unsigned short ,unsigned short ,int );
Packit Service d3952c
typedef Status (*XvMCHideSurfaceP)(Display *, XvMCSurface *);
Packit Service d3952c
typedef Status (*XvMCCreateSubpictureP) (Display *, XvMCContext *, XvMCSubpicture *,
Packit Service d3952c
					 unsigned short, unsigned short,int);
Packit Service d3952c
typedef Status (*XvMCClearSubpictureP) (Display *,XvMCSubpicture *,short,short,unsigned short,unsigned short,
Packit Service d3952c
					unsigned int);
Packit Service d3952c
typedef Status (*XvMCCompositeSubpictureP) (Display *, XvMCSubpicture *,XvImage *,short,short,
Packit Service d3952c
					    unsigned short, unsigned short,short,short);
Packit Service d3952c
typedef Status (*XvMCDestroySubpictureP) (Display *, XvMCSubpicture *);
Packit Service d3952c
typedef Status (*XvMCSetSubpicturePaletteP) (Display *, XvMCSubpicture *, unsigned char *);
Packit Service d3952c
typedef Status (*XvMCBlendSubpictureP) (Display *d,XvMCSurface *,XvMCSubpicture *,short,
Packit Service d3952c
					short,unsigned short,unsigned short,short,short,
Packit Service d3952c
					unsigned short,unsigned short);
Packit Service d3952c
typedef Status (*XvMCBlendSubpicture2P) (Display *,XvMCSurface *,XvMCSurface *,
Packit Service d3952c
					 XvMCSubpicture *,short,short,unsigned short,
Packit Service d3952c
					 unsigned short,short,short,unsigned short,
Packit Service d3952c
					 unsigned short);
Packit Service d3952c
typedef Status (*XvMCSyncSurfaceP) (Display *, XvMCSurface *);
Packit Service d3952c
typedef Status (*XvMCFlushSurfaceP) (Display *, XvMCSurface *);
Packit Service d3952c
typedef Status (*XvMCGetSurfaceStatusP) (Display *, XvMCSurface *, int *);
Packit Service d3952c
typedef Status (*XvMCRenderSurfaceP) (Display *,XvMCContext *,unsigned int,XvMCSurface *,
Packit Service d3952c
				      XvMCSurface *,XvMCSurface *,unsigned int,unsigned int,
Packit Service d3952c
				      unsigned int,XvMCMacroBlockArray *,XvMCBlockArray *);
Packit Service d3952c
typedef Status (*XvMCSyncSubpictureP) (Display *, XvMCSubpicture *);
Packit Service d3952c
typedef Status (*XvMCFlushSubpictureP) (Display *, XvMCSubpicture *);
Packit Service d3952c
typedef Status (*XvMCGetSubpictureStatusP) (Display *, XvMCSubpicture *, int *);
Packit Service d3952c
typedef Status (*XvMCCreateBlocksP) (Display *, XvMCContext *,unsigned int,XvMCBlockArray *);
Packit Service d3952c
typedef Status (*XvMCDestroyBlocksP) (Display *,XvMCBlockArray *);
Packit Service d3952c
typedef Status (*XvMCCreateMacroBlocksP) (Display *,XvMCContext *,unsigned int,
Packit Service d3952c
					  XvMCMacroBlockArray *);
Packit Service d3952c
typedef Status (*XvMCDestroyMacroBlocksP) (Display *,XvMCMacroBlockArray *);
Packit Service d3952c
typedef XvAttribute *(*XvMCQueryAttributesP) (Display *,XvMCContext *,int *);
Packit Service d3952c
typedef Status (*XvMCSetAttributeP) (Display *,XvMCContext *, Atom, int);
Packit Service d3952c
typedef Status (*XvMCGetAttributeP) (Display *,XvMCContext *, Atom, int *);
Packit Service d3952c
Packit Service d3952c
/*
Packit Service d3952c
 * Nonstandard VLD acceleration level:
Packit Service d3952c
 */
Packit Service d3952c
Packit Service d3952c
typedef Status (*XvMCBeginSurfaceP) (Display *,XvMCContext *,XvMCSurface *,
Packit Service d3952c
				     XvMCSurface *,XvMCSurface *f,const XvMCMpegControl *);
Packit Service d3952c
typedef Status (*XvMCLoadQMatrixP) (Display *, XvMCContext *,const XvMCQMatrix *);
Packit Service d3952c
typedef Status (*XvMCPutSliceP)(Display *,XvMCContext *, char *,int);
Packit Service d3952c
typedef Status (*XvMCPutSlice2P)(Display *,XvMCContext *, char *,int, unsigned);
Packit Service d3952c
typedef Status (*XvMCGetDRInfoP)(Display *, XvPortID, char **, char **, int *, int *,
Packit Service d3952c
				  int *, int *);
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
typedef struct {
Packit Service d3952c
    XvMCQueryExtensionP   XvMCQueryExtension;
Packit Service d3952c
    XvMCQueryVersionP   XvMCQueryVersion;
Packit Service d3952c
    XvMCListSurfaceTypesP  XvMCListSurfaceTypes;
Packit Service d3952c
    XvMCCreateContextP   XvMCCreateContext;
Packit Service d3952c
    XvMCDestroyContextP   XvMCDestroyContext;
Packit Service d3952c
    XvMCCreateSurfaceP  XvMCCreateSurface;
Packit Service d3952c
    XvMCDestroySurfaceP  XvMCDestroySurface;
Packit Service d3952c
    XvMCListSubpictureTypesP    XvMCListSubpictureTypes;
Packit Service d3952c
    XvMCPutSurfaceP   XvMCPutSurface;
Packit Service d3952c
    XvMCHideSurfaceP   XvMCHideSurface;
Packit Service d3952c
    XvMCCreateSubpictureP   XvMCCreateSubpicture;
Packit Service d3952c
    XvMCClearSubpictureP     XvMCClearSubpicture;
Packit Service d3952c
    XvMCCompositeSubpictureP    XvMCCompositeSubpicture;
Packit Service d3952c
    XvMCDestroySubpictureP    XvMCDestroySubpicture;
Packit Service d3952c
    XvMCSetSubpicturePaletteP    XvMCSetSubpicturePalette;
Packit Service d3952c
    XvMCBlendSubpictureP    XvMCBlendSubpicture;
Packit Service d3952c
    XvMCBlendSubpicture2P   XvMCBlendSubpicture2;
Packit Service d3952c
    XvMCSyncSurfaceP    XvMCSyncSurface;
Packit Service d3952c
    XvMCFlushSurfaceP    XvMCFlushSurface;
Packit Service d3952c
    XvMCGetSurfaceStatusP    XvMCGetSurfaceStatus;
Packit Service d3952c
    XvMCRenderSurfaceP    XvMCRenderSurface;
Packit Service d3952c
    XvMCSyncSubpictureP    XvMCSyncSubpicture;
Packit Service d3952c
    XvMCFlushSubpictureP    XvMCFlushSubpicture;
Packit Service d3952c
    XvMCGetSubpictureStatusP    XvMCGetSubpictureStatus;
Packit Service d3952c
    XvMCCreateBlocksP    XvMCCreateBlocks;
Packit Service d3952c
    XvMCDestroyBlocksP    XvMCDestroyBlocks;
Packit Service d3952c
    XvMCCreateMacroBlocksP   XvMCCreateMacroBlocks;
Packit Service d3952c
    XvMCDestroyMacroBlocksP    XvMCDestroyMacroBlocks;
Packit Service d3952c
    XvMCQueryAttributesP    XvMCQueryAttributes;
Packit Service d3952c
    XvMCSetAttributeP    XvMCSetAttribute;
Packit Service d3952c
    XvMCGetAttributeP    XvMCGetAttribute;
Packit Service d3952c
Packit Service d3952c
    /*
Packit Service d3952c
     * Nonstandard VLD acceleration level:
Packit Service d3952c
     */
Packit Service d3952c
Packit Service d3952c
    XvMCBeginSurfaceP    XvMCBeginSurface;
Packit Service d3952c
    XvMCLoadQMatrixP    XvMCLoadQMatrix;
Packit Service d3952c
    XvMCPutSliceP   XvMCPutSlice;
Packit Service d3952c
    XvMCPutSlice2P   XvMCPutSlice2;
Packit Service d3952c
Packit Service d3952c
    /*
Packit Service d3952c
     * Driver name function.
Packit Service d3952c
     */
Packit Service d3952c
Packit Service d3952c
    XvMCGetDRInfoP XvMCGetDRInfo;
Packit Service d3952c
Packit Service d3952c
    int preInitialised;
Packit Service d3952c
    int initialised;
Packit Service d3952c
    int vldextension;
Packit Service d3952c
} XvMCWrapper;
Packit Service d3952c
Packit Service d3952c
static XvMCWrapper xW;
Packit Service d3952c
static int wrapperInit = 0;
Packit Service d3952c
static int wrapperPreInit = 0;
Packit Service d3952c
static void *xvhandle;
Packit Service d3952c
static void *handle2;
Packit Service d3952c
Packit Service d3952c
#define BUFLEN 200
Packit Service d3952c
Packit Service d3952c
#define STRS(ARG) STR(ARG)
Packit Service d3952c
#define STR(ARG) #ARG
Packit Service d3952c
Packit Service d3952c
#define XW_RSYM(base,handle,handle2,pointer, retval)			\
Packit Service d3952c
    do {								\
Packit Service d3952c
	register char *symerr;						\
Packit Service d3952c
	base.pointer = (pointer##P) dlsym((handle),#pointer);		\
Packit Service d3952c
	if ((symerr = dlerror()) != NULL) {				\
Packit Service d3952c
	    if (!handle2) {						\
Packit Service d3952c
		fprintf(stderr,"%s\n",symerr); return retval;		\
Packit Service d3952c
	    }								\
Packit Service d3952c
	    base.pointer = (pointer##P) dlsym((handle2),#pointer);	\
Packit Service d3952c
	    if ((symerr = dlerror()) != NULL) {				\
Packit Service d3952c
		fprintf(stderr,"%s\n",symerr); return retval;		\
Packit Service d3952c
	    }								\
Packit Service d3952c
	}								\
Packit Service d3952c
    } while (0);
Packit Service d3952c
Packit Service d3952c
#define XW_RSYM2(base,handle,handle2,pointer)			\
Packit Service d3952c
    base.pointer = (pointer##P) dlsym((handle),#pointer);	\
Packit Service d3952c
    if (dlerror() != NULL) {					\
Packit Service d3952c
	base.pointer = (pointer##P) dlsym((handle2),#pointer);	\
Packit Service d3952c
	if (dlerror() != NULL) return;				\
Packit Service d3952c
    }
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
/*
Packit Service d3952c
 * Try to dlopen a shared library, versionless first.
Packit Service d3952c
 */
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
static void  *dlopenversion(const char *lib, const char *version, int flag)
Packit Service d3952c
{
Packit Service d3952c
  void *ret;
Packit Service d3952c
  int curLen,verLen;
Packit Service d3952c
  char *curName;
Packit Service d3952c
  const char *tail;
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
  curLen = strlen(lib) + (verLen = strlen(version)) + 1;
Packit Service d3952c
  curName = (char *) malloc(curLen * sizeof(char));
Packit Service d3952c
  strncpy( curName, lib, curLen);
Packit Service d3952c
  if (verLen > 1) {
Packit Service d3952c
    if (NULL != (tail = strstr(version+1,"."))) {
Packit Service d3952c
      strncat( curName, version, tail - version);
Packit Service d3952c
    } else {
Packit Service d3952c
      strncat( curName, version, verLen);
Packit Service d3952c
    }
Packit Service d3952c
  }
Packit Service d3952c
  ret = dlopen(curName, flag);
Packit Service d3952c
  free(curName);
Packit Service d3952c
  return ret;
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
static int preInitW(Display *dpy)
Packit Service d3952c
{
Packit Service d3952c
Packit Service d3952c
    /*
Packit Service d3952c
     * Resolve functions that are not hw driver specific.
Packit Service d3952c
     */
Packit Service d3952c
Packit Service d3952c
    void *handleZ = NULL;
Packit Service d3952c
Packit Service d3952c
    wrapperPreInit = 1;
Packit Service d3952c
    xW.preInitialised = 0;
Packit Service d3952c
    xW.initialised = 0;
Packit Service d3952c
    xvhandle = dlopenversion("libXv.so", XV_SOVERSION, RTLD_LAZY | RTLD_GLOBAL);
Packit Service d3952c
    if (!xvhandle) {
Packit Service d3952c
	fprintf(stderr,"XvMCWrapper: Warning! Could not open shared "
Packit Service d3952c
		"library \"libXv.so" XV_SOVERSION "\"\nThis may cause relocation "
Packit Service d3952c
		"errors later.\nError was: \"%s\".\n",dlerror());
Packit Service d3952c
    }
Packit Service d3952c
    handle2 = dlopenversion("libXvMC.so", XVMC_SOVERSION, RTLD_LAZY | RTLD_GLOBAL);
Packit Service d3952c
    if (!handle2) {
Packit Service d3952c
	fprintf(stderr,"XvMCWrapper: Could not load XvMC "
Packit Service d3952c
		"library \"libXvMC.so" XVMC_SOVERSION "\". Failing\n");
Packit Service d3952c
	fprintf(stderr,"%s\n",dlerror());
Packit Service d3952c
	return 1;
Packit Service d3952c
    }
Packit Service d3952c
    XW_RSYM(xW, handle2, handleZ, XvMCQueryExtension, 1);
Packit Service d3952c
    XW_RSYM(xW, handle2, handleZ, XvMCQueryVersion, 1);
Packit Service d3952c
    xW.preInitialised = 1;
Packit Service d3952c
    return 0;
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
static void initW(Display *dpy, XvPortID port)
Packit Service d3952c
{
Packit Service d3952c
    char nameBuffer[BUFLEN];
Packit Service d3952c
    void *handle;
Packit Service d3952c
    int tmp;
Packit Service d3952c
    char *clientName = NULL;
Packit Service d3952c
    char *err;
Packit Service d3952c
    FILE *configFile;
Packit Service d3952c
    int nameLen = 0;
Packit Service d3952c
    int major,minor,patchLevel,isLocal;
Packit Service d3952c
    char *busID = NULL;
Packit Service d3952c
Packit Service d3952c
    wrapperInit = 1;
Packit Service d3952c
    xW.initialised = 0;
Packit Service d3952c
Packit Service d3952c
    if (!wrapperPreInit)
Packit Service d3952c
	if (preInitW( dpy )) return;
Packit Service d3952c
Packit Service d3952c
    /*
Packit Service d3952c
     * Will the DDX tell us the client driver name?
Packit Service d3952c
     */
Packit Service d3952c
Packit Service d3952c
    xW.XvMCGetDRInfo = (XvMCGetDRInfoP)
Packit Service d3952c
	dlsym(handle2,"XvMCGetDRInfo");
Packit Service d3952c
Packit Service d3952c
    if ((err = dlerror()) == NULL) {
Packit Service d3952c
	if (0 == xW.XvMCGetDRInfo( dpy, port, &clientName, &busID, &major,
Packit Service d3952c
				    &minor,&patchLevel, &isLocal)) {
Packit Service d3952c
	    nameLen = strlen(clientName);
Packit Service d3952c
	    XFree(busID);
Packit Service d3952c
	    if (!isLocal) {
Packit Service d3952c
		fprintf(stderr,"XvMCWrapper: X server is not local. Cannot run XvMC.\n");
Packit Service d3952c
		XFree(clientName);
Packit Service d3952c
		return;
Packit Service d3952c
	    }
Packit Service d3952c
	} else {
Packit Service d3952c
	    clientName = NULL;
Packit Service d3952c
	}
Packit Service d3952c
    }
Packit Service d3952c
Packit Service d3952c
    if (clientName && (nameLen < BUFLEN-7) && (nameLen > 0)) {
Packit Service d3952c
	nameLen += 3;
Packit Service d3952c
	strncpy(nameBuffer,"lib",BUFLEN-1);
Packit Service d3952c
	strncpy(nameBuffer+3, clientName, BUFLEN-4);
Packit Service d3952c
	strncpy(nameBuffer + nameLen, ".so", BUFLEN-nameLen-1);
Packit Service d3952c
	nameBuffer[BUFLEN-1] = 0;
Packit Service d3952c
	XFree(clientName);
Packit Service d3952c
	handle = dlopenversion(nameBuffer, XVMC_SOVERSION,RTLD_LAZY);
Packit Service d3952c
    } else {
Packit Service d3952c
	/*
Packit Service d3952c
	 * No. Try to obtain it from the config file.
Packit Service d3952c
	 */
Packit Service d3952c
Packit Service d3952c
	if (clientName) XFree(clientName);
Packit Service d3952c
Packit Service d3952c
	configFile = fopen(STRS(XVMC_CONFIGDIR) "/XvMCConfig","r");
Packit Service d3952c
Packit Service d3952c
	xW.initialised = 0;
Packit Service d3952c
	xW.vldextension = 0;
Packit Service d3952c
Packit Service d3952c
	if (NULL == configFile) {
Packit Service d3952c
	    fprintf(stderr,"XvMCWrapper: Could not open config file \"%s\".\n",
Packit Service d3952c
		    STRS(XVMC_CONFIGDIR) "/XvMCConfig");
Packit Service d3952c
	    perror("XvMCWrapper");
Packit Service d3952c
	    return;
Packit Service d3952c
	}
Packit Service d3952c
Packit Service d3952c
	if (NULL == fgets(nameBuffer, BUFLEN, configFile)) {
Packit Service d3952c
	    fclose(configFile);
Packit Service d3952c
	    fprintf(stderr,"XvMCWrapper: Could not read XvMC library name.\n");
Packit Service d3952c
	    perror("XvMCWrapper");
Packit Service d3952c
	    return;
Packit Service d3952c
	}
Packit Service d3952c
Packit Service d3952c
	fclose(configFile);
Packit Service d3952c
	if ((tmp = strlen(nameBuffer)) == 0) {
Packit Service d3952c
	    fprintf(stderr,"XvMCWrapper: Zero length XvMC library name.\n");
Packit Service d3952c
	    fprintf(stderr,"%s\n",dlerror());
Packit Service d3952c
	    return;
Packit Service d3952c
	}
Packit Service d3952c
Packit Service d3952c
	/*
Packit Service d3952c
	 * Skip trailing newlines and garbage.
Packit Service d3952c
	 */
Packit Service d3952c
Packit Service d3952c
	while (iscntrl(nameBuffer[tmp-1])) {
Packit Service d3952c
	    nameBuffer[tmp-1] = 0;
Packit Service d3952c
	    if (--tmp == 0) {
Packit Service d3952c
		fprintf(stderr,"XvMCWrapper: Zero length XvMC library name.\n");
Packit Service d3952c
		return;
Packit Service d3952c
	    }
Packit Service d3952c
	}
Packit Service d3952c
	handle = dlopen(nameBuffer,RTLD_LAZY);
Packit Service d3952c
    }
Packit Service d3952c
    if (!handle) {
Packit Service d3952c
	fprintf(stderr,"XvMCWrapper: Could not load hardware specific XvMC "
Packit Service d3952c
		"library \"%s\".\n",nameBuffer);
Packit Service d3952c
	fprintf(stderr,"%s\n",dlerror());
Packit Service d3952c
	return;
Packit Service d3952c
    }
Packit Service d3952c
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCListSurfaceTypes,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCCreateContext,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCDestroyContext,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCCreateSurface,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCDestroySurface,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCListSubpictureTypes,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCHideSurface,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCCreateSubpicture,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCClearSubpicture,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCCompositeSubpicture,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCDestroySubpicture,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCSetSubpicturePalette,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCBlendSubpicture,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCBlendSubpicture2,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCPutSurface,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCSyncSurface,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCFlushSurface,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCGetSurfaceStatus,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCRenderSurface,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCSyncSubpicture,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCFlushSubpicture,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCGetSubpictureStatus,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCCreateBlocks,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCDestroyBlocks,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCCreateMacroBlocks,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCDestroyMacroBlocks,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCQueryAttributes,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCSetAttribute,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCGetAttribute,);
Packit Service d3952c
    xW.initialised = 1;
Packit Service d3952c
    XW_RSYM2(xW, handle, handle2, XvMCBeginSurface);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCLoadQMatrix,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCPutSlice,);
Packit Service d3952c
    XW_RSYM(xW, handle, handle2, XvMCPutSlice2,);
Packit Service d3952c
    xW.vldextension = 1;
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
Bool XvMCQueryExtension (Display *display, int *eventBase, int *errBase)
Packit Service d3952c
{
Packit Service d3952c
    if (!wrapperPreInit) preInitW( display );
Packit Service d3952c
    if (!xW.preInitialised) return 0;
Packit Service d3952c
    return (*xW.XvMCQueryExtension)(display, eventBase, errBase);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Status XvMCQueryVersion (Display *display, int *major_versionp,
Packit Service d3952c
			 int *minor_versionp)
Packit Service d3952c
{
Packit Service d3952c
    if (!wrapperPreInit) preInitW( display );
Packit Service d3952c
    if (!xW.preInitialised) return 0;
Packit Service d3952c
    return (*xW.XvMCQueryVersion)(display, major_versionp, minor_versionp);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
XvMCSurfaceInfo * XvMCListSurfaceTypes(Display *dpy, XvPortID port, int *num)
Packit Service d3952c
{
Packit Service d3952c
    if (!wrapperInit) initW( dpy, port);
Packit Service d3952c
    if (!xW.initialised) return NULL;
Packit Service d3952c
    return (*xW.XvMCListSurfaceTypes)(dpy, port, num);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Status XvMCCreateContext (
Packit Service d3952c
    Display *display,
Packit Service d3952c
    XvPortID port,
Packit Service d3952c
    int surface_type_id,
Packit Service d3952c
    int width,
Packit Service d3952c
    int height,
Packit Service d3952c
    int flags,
Packit Service d3952c
    XvMCContext * context
Packit Service d3952c
    )
Packit Service d3952c
{
Packit Service d3952c
    if (!wrapperInit) initW(display, port);
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCCreateContext)(display, port, surface_type_id,
Packit Service d3952c
				   width, height, flags, context);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Status XvMCDestroyContext (Display *display, XvMCContext * context)
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCDestroyContext)(display, context);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Status
Packit Service d3952c
XvMCCreateSurface(
Packit Service d3952c
    Display *display,
Packit Service d3952c
    XvMCContext * context,
Packit Service d3952c
    XvMCSurface * surface
Packit Service d3952c
    )
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCCreateSurface)(display, context, surface);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Status XvMCDestroySurface(Display *display, XvMCSurface *surface)
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCDestroySurface)(display, surface);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
XvImageFormatValues * XvMCListSubpictureTypes (
Packit Service d3952c
    Display * display,
Packit Service d3952c
    XvPortID port,
Packit Service d3952c
    int surface_type_id,
Packit Service d3952c
    int *count_return
Packit Service d3952c
    )
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return NULL;
Packit Service d3952c
    return (*xW.XvMCListSubpictureTypes)(display, port, surface_type_id,
Packit Service d3952c
					 count_return);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
Status
Packit Service d3952c
XvMCPutSurface(
Packit Service d3952c
    Display *display,
Packit Service d3952c
    XvMCSurface *surface,
Packit Service d3952c
    Drawable draw,
Packit Service d3952c
    short srcx,
Packit Service d3952c
    short srcy,
Packit Service d3952c
    unsigned short srcw,
Packit Service d3952c
    unsigned short srch,
Packit Service d3952c
    short destx,
Packit Service d3952c
    short desty,
Packit Service d3952c
    unsigned short destw,
Packit Service d3952c
    unsigned short desth,
Packit Service d3952c
    int flags
Packit Service d3952c
    )
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCPutSurface)(display, surface, draw, srcx, srcy, srcw, srch,
Packit Service d3952c
				destx, desty, destw, desth, flags);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Status XvMCHideSurface(Display *display, XvMCSurface *surface)
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCHideSurface)(display, surface);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
Status
Packit Service d3952c
XvMCCreateSubpicture (
Packit Service d3952c
    Display *display,
Packit Service d3952c
    XvMCContext *context,
Packit Service d3952c
    XvMCSubpicture *subpicture,
Packit Service d3952c
    unsigned short width,
Packit Service d3952c
    unsigned short height,
Packit Service d3952c
    int xvimage_id
Packit Service d3952c
    )
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCCreateSubpicture)(display, context, subpicture, width, height,
Packit Service d3952c
				      xvimage_id);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
Status
Packit Service d3952c
XvMCClearSubpicture (
Packit Service d3952c
    Display *display,
Packit Service d3952c
    XvMCSubpicture *subpicture,
Packit Service d3952c
    short x,
Packit Service d3952c
    short y,
Packit Service d3952c
    unsigned short width,
Packit Service d3952c
    unsigned short height,
Packit Service d3952c
    unsigned int color
Packit Service d3952c
    )
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCClearSubpicture)(display, subpicture, x, y, width, height, color);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
Status
Packit Service d3952c
XvMCCompositeSubpicture (
Packit Service d3952c
    Display *display,
Packit Service d3952c
    XvMCSubpicture *subpicture,
Packit Service d3952c
    XvImage *image,
Packit Service d3952c
    short srcx,
Packit Service d3952c
    short srcy,
Packit Service d3952c
    unsigned short width,
Packit Service d3952c
    unsigned short height,
Packit Service d3952c
    short dstx,
Packit Service d3952c
    short dsty
Packit Service d3952c
    )
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCCompositeSubpicture)(display, subpicture, image, srcx, srcy,
Packit Service d3952c
					 width, height, dstx, dsty);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Status
Packit Service d3952c
XvMCDestroySubpicture (Display *display, XvMCSubpicture *subpicture)
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCDestroySubpicture)(display, subpicture);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Status
Packit Service d3952c
XvMCSetSubpicturePalette (
Packit Service d3952c
    Display *display,
Packit Service d3952c
    XvMCSubpicture *subpicture,
Packit Service d3952c
    unsigned char *palette
Packit Service d3952c
    )
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCSetSubpicturePalette)(display, subpicture, palette);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
Status
Packit Service d3952c
XvMCBlendSubpicture (
Packit Service d3952c
    Display *display,
Packit Service d3952c
    XvMCSurface *target_surface,
Packit Service d3952c
    XvMCSubpicture *subpicture,
Packit Service d3952c
    short subx,
Packit Service d3952c
    short suby,
Packit Service d3952c
    unsigned short subw,
Packit Service d3952c
    unsigned short subh,
Packit Service d3952c
    short surfx,
Packit Service d3952c
    short surfy,
Packit Service d3952c
    unsigned short surfw,
Packit Service d3952c
    unsigned short surfh
Packit Service d3952c
    )
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCBlendSubpicture)(display, target_surface, subpicture,
Packit Service d3952c
				     subx, suby, subw, subh, surfx, surfy,
Packit Service d3952c
				     surfw, surfh);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Status
Packit Service d3952c
XvMCBlendSubpicture2 (
Packit Service d3952c
    Display *display,
Packit Service d3952c
    XvMCSurface *source_surface,
Packit Service d3952c
    XvMCSurface *target_surface,
Packit Service d3952c
    XvMCSubpicture *subpicture,
Packit Service d3952c
    short subx,
Packit Service d3952c
    short suby,
Packit Service d3952c
    unsigned short subw,
Packit Service d3952c
    unsigned short subh,
Packit Service d3952c
    short surfx,
Packit Service d3952c
    short surfy,
Packit Service d3952c
    unsigned short surfw,
Packit Service d3952c
    unsigned short surfh
Packit Service d3952c
    )
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCBlendSubpicture2)(display, source_surface, target_surface, subpicture,
Packit Service d3952c
				      subx, suby, subw, subh, surfx, surfy, surfw, surfh);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
Status XvMCSyncSurface (Display *display, XvMCSurface *surface)
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCSyncSurface)(display, surface);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Status XvMCFlushSurface (Display *display, XvMCSurface *surface)
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCFlushSurface)(display, surface);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Status XvMCGetSurfaceStatus (Display *display, XvMCSurface *surface, int *stat)
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCGetSurfaceStatus)(display, surface, stat);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Status XvMCRenderSurface (
Packit Service d3952c
    Display *display,
Packit Service d3952c
    XvMCContext *context,
Packit Service d3952c
    unsigned int picture_structure,
Packit Service d3952c
    XvMCSurface *target_surface,
Packit Service d3952c
    XvMCSurface *past_surface,
Packit Service d3952c
    XvMCSurface *future_surface,
Packit Service d3952c
    unsigned int flags,
Packit Service d3952c
    unsigned int num_macroblocks,
Packit Service d3952c
    unsigned int first_macroblock,
Packit Service d3952c
    XvMCMacroBlockArray *macroblock_array,
Packit Service d3952c
    XvMCBlockArray *blocks
Packit Service d3952c
    )
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCRenderSurface)(display, context, picture_structure, target_surface,
Packit Service d3952c
				   past_surface, future_surface, flags, num_macroblocks,
Packit Service d3952c
				   first_macroblock, macroblock_array, blocks);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Status XvMCSyncSubpicture (Display *display, XvMCSubpicture *subpicture)
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCSyncSubpicture)(display, subpicture);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Status XvMCFlushSubpicture (Display *display, XvMCSubpicture *subpicture)
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCFlushSubpicture)(display, subpicture);
Packit Service d3952c
}
Packit Service d3952c
Status
Packit Service d3952c
XvMCGetSubpictureStatus (Display *display, XvMCSubpicture *subpic, int *stat)
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCGetSubpictureStatus)(display, subpic, stat);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Status XvMCCreateBlocks (
Packit Service d3952c
    Display *display,
Packit Service d3952c
    XvMCContext *context,
Packit Service d3952c
    unsigned int num_blocks,
Packit Service d3952c
    XvMCBlockArray *block
Packit Service d3952c
    )
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCCreateBlocks)(display, context, num_blocks, block);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
Status XvMCDestroyBlocks (Display *display,XvMCBlockArray *block)
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCDestroyBlocks)(display, block);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Status XvMCCreateMacroBlocks (
Packit Service d3952c
    Display *display,
Packit Service d3952c
    XvMCContext *context,
Packit Service d3952c
    unsigned int num_blocks,
Packit Service d3952c
    XvMCMacroBlockArray *blocks
Packit Service d3952c
    )
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCCreateMacroBlocks)(display, context, num_blocks, blocks);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
Status XvMCDestroyMacroBlocks (
Packit Service d3952c
    Display *display,
Packit Service d3952c
    XvMCMacroBlockArray *block
Packit Service d3952c
    )
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCDestroyMacroBlocks)(display, block);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
XvAttribute *
Packit Service d3952c
XvMCQueryAttributes (
Packit Service d3952c
    Display *display,
Packit Service d3952c
    XvMCContext *context,
Packit Service d3952c
    int *number
Packit Service d3952c
    )
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return NULL;
Packit Service d3952c
    return (*xW.XvMCQueryAttributes)(display, context, number);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
Status
Packit Service d3952c
XvMCSetAttribute (
Packit Service d3952c
    Display *display,
Packit Service d3952c
    XvMCContext *context,
Packit Service d3952c
    Atom attribute,
Packit Service d3952c
    int value
Packit Service d3952c
    )
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCSetAttribute)(display, context, attribute, value);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
Status
Packit Service d3952c
XvMCGetAttribute (
Packit Service d3952c
    Display *display,
Packit Service d3952c
    XvMCContext *context,
Packit Service d3952c
    Atom attribute,
Packit Service d3952c
    int *value
Packit Service d3952c
    )
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.initialised) return BadValue;
Packit Service d3952c
    return (*xW.XvMCGetAttribute)(display, context, attribute, value);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Packit Service d3952c
Status XvMCBeginSurface(Display *display,
Packit Service d3952c
			XvMCContext *context,
Packit Service d3952c
			XvMCSurface *target_surface,
Packit Service d3952c
			XvMCSurface *past_surface,
Packit Service d3952c
			XvMCSurface *future_surface,
Packit Service d3952c
			const XvMCMpegControl *control)
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.vldextension) return BadValue;
Packit Service d3952c
    return (*xW.XvMCBeginSurface)(display, context, target_surface, past_surface, future_surface,
Packit Service d3952c
				  control);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Status XvMCLoadQMatrix(Display *display, XvMCContext *context,
Packit Service d3952c
		       const XvMCQMatrix *qmx)
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.vldextension) return BadValue;
Packit Service d3952c
    return (*xW.XvMCLoadQMatrix)(display, context, qmx);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Status XvMCPutSlice(Display *display,XvMCContext *context,
Packit Service d3952c
		    char *slice, int nBytes)
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.vldextension) return BadValue;
Packit Service d3952c
    return (*xW.XvMCPutSlice)(display, context, slice, nBytes);
Packit Service d3952c
}
Packit Service d3952c
Packit Service d3952c
Status XvMCPutSlice2(Display *display,XvMCContext *context,
Packit Service d3952c
		     char *slice, int nBytes, int sliceCode)
Packit Service d3952c
{
Packit Service d3952c
    if (!xW.vldextension) return BadValue;
Packit Service d3952c
    return (*xW.XvMCPutSlice2)(display, context, slice, nBytes, sliceCode);
Packit Service d3952c
}