
#ifndef _XVMC_H
#define _XVMC_H
#include <X11/extensions/Xv.h>
#include "xvdix.h"

typedef struct {
  int num_xvimages;
  int *xvimage_ids;
} XvMCImageIDList;

typedef struct {
  int surface_type_id;
  int chroma_format;
  int color_description;
  unsigned short max_width;
  unsigned short max_height;
  unsigned short subpicture_max_width;
  unsigned short subpicture_max_height;
  int mc_type;
  int flags;
  XvMCImageIDList *compatible_subpictures;
} XvMCSurfaceInfoRec, *XvMCSurfaceInfoPtr;

typedef struct {
  XID context_id;
  ScreenPtr pScreen;
  int adapt_num;
  int surface_type_id;
  unsigned short width;
  unsigned short height;
  CARD32 flags;
  int refcnt;
  pointer port_priv;
  pointer driver_priv;
} XvMCContextRec, *XvMCContextPtr;

typedef struct {
  XID surface_id;
  int surface_type_id;
  XvMCContextPtr context;
  pointer driver_priv;
} XvMCSurfaceRec, *XvMCSurfacePtr;


typedef struct {
  XID subpicture_id;
  int xvimage_id;
  unsigned short width;
  unsigned short height;
  int num_palette_entries;
  int entry_bytes;
  char component_order[4];
  XvMCContextPtr context;
  pointer driver_priv;
} XvMCSubpictureRec, *XvMCSubpicturePtr;

typedef int (*XvMCCreateContextProcPtr) (
  XvPortPtr port,
  XvMCContextPtr context,
  int *num_priv,
  CARD32 **priv 
);

typedef void (*XvMCDestroyContextProcPtr) (
  XvMCContextPtr context
);

typedef int (*XvMCCreateSurfaceProcPtr) (
  XvMCSurfacePtr surface,
  int *num_priv,
  CARD32 **priv
);

typedef void (*XvMCDestroySurfaceProcPtr) (
  XvMCSurfacePtr surface
);

typedef int (*XvMCCreateSubpictureProcPtr) (
  XvMCSubpicturePtr subpicture,
  int *num_priv,
  CARD32 **priv
);

typedef void (*XvMCDestroySubpictureProcPtr) (
  XvMCSubpicturePtr subpicture
);


typedef struct {
  XvAdaptorPtr			    xv_adaptor;
  int				    num_surfaces;
  XvMCSurfaceInfoPtr		    *surfaces;
  int				    num_subpictures;
  XvImagePtr			    *subpictures;
  XvMCCreateContextProcPtr          CreateContext; 
  XvMCDestroyContextProcPtr         DestroyContext; 
  XvMCCreateSurfaceProcPtr          CreateSurface;  
  XvMCDestroySurfaceProcPtr         DestroySurface; 
  XvMCCreateSubpictureProcPtr       CreateSubpicture; 
  XvMCDestroySubpictureProcPtr      DestroySubpicture;
} XvMCAdaptorRec, *XvMCAdaptorPtr;

#ifndef XorgLoader
extern _X_EXPORT void XvMCExtensionInit(void);

extern _X_EXPORT int XvMCScreenInit(ScreenPtr pScreen,
				    int num,
				    XvMCAdaptorPtr adapt);

extern _X_EXPORT XvImagePtr XvMCFindXvImage(XvPortPtr pPort, CARD32 id);

extern _X_EXPORT int xf86XvMCRegisterDRInfo(ScreenPtr pScreen, char *name,
			   char *busID, int major, int minor, 
			   int patchLevel);
#endif

#endif /* _XVMC_H */
