text: /*
   * Copyright (c) 2007 Intel Corporation. All Rights Reserved.
   *
   * Permission is hereby granted, free of charge, to any person obtaining a
   * copy of this software and associated documentation files (the
   * "Software"), to deal in the Software without restriction, including
   * without limitation the rights to use, copy, modify, merge, publish,
   * distribute, sub license, and/or sell copies of the Software, and to
   * permit persons to whom the Software is furnished to do so, subject to
   * the following conditions:
   * 
   * The above copyright notice and this permission notice (including the
   * next paragraph) shall be included in all copies or substantial portions
   * of the Software.
   * 
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
   * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
   * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
   * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
   * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
   * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
   * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
   */
  
  /*
   * Video Decode Acceleration -Backend API
   */
  
  #ifndef _VA_BACKEND_H_
  #define _VA_BACKEND_H_
  
  #include <va/va.h>
  
  typedef struct VADriverContext *VADriverContextP;
  typedef struct VADisplayContext *VADisplayContextP;
  
  /** \brief VA display types. */
  enum {
      /** \brief Mask to major identifier for VA display type. */
      VA_DISPLAY_MAJOR_MASK = 0xf0,
  
      /** \brief VA/X11 API is used, through vaGetDisplay() entry-point. */
      VA_DISPLAY_X11      = 0x10,
      /** \brief VA/GLX API is used, through vaGetDisplayGLX() entry-point. */
      VA_DISPLAY_GLX      = (VA_DISPLAY_X11 | (1 << 0)),
      /** \brief VA/Android API is used, through vaGetDisplay() entry-point. */
      VA_DISPLAY_ANDROID  = 0x20,
      /** \brief VA/DRM API is used, through vaGetDisplayDRM() entry-point. */
      VA_DISPLAY_DRM      = 0x30,
      /** \brief VA/DRM API is used, with a render-node device path */
      VA_DISPLAY_DRM_RENDERNODES = (VA_DISPLAY_DRM | (1 << 0)),
      /** \brief VA/Wayland API is used, through vaGetDisplayWl() entry-point. */
      VA_DISPLAY_WAYLAND  = 0x40,
  };
  
  struct VADriverVTable
  {
  	VAStatus (*vaTerminate) ( VADriverContextP ctx );
  
  	VAStatus (*vaQueryConfigProfiles) (
  		VADriverContextP ctx,
  		VAProfile *profile_list,	/* out */
  		int *num_profiles			/* out */
  	);
  
  	VAStatus (*vaQueryConfigEntrypoints) (
  		VADriverContextP ctx,
  		VAProfile profile,
  		VAEntrypoint  *entrypoint_list,	/* out */
  		int *num_entrypoints			/* out */
  	);
  
  	VAStatus (*vaGetConfigAttributes) (
  		VADriverContextP ctx,
  		VAProfile profile,
  		VAEntrypoint entrypoint,
  		VAConfigAttrib *attrib_list,	/* in/out */
  		int num_attribs
  	);
  
  	VAStatus (*vaCreateConfig) (
  		VADriverContextP ctx,
  		VAProfile profile, 
  		VAEntrypoint entrypoint, 
  		VAConfigAttrib *attrib_list,
  		int num_attribs,
  		VAConfigID *config_id		/* out */
  	);
  
  	VAStatus (*vaDestroyConfig) (
  		VADriverContextP ctx,
  		VAConfigID config_id
  	);
  
  	VAStatus (*vaQueryConfigAttributes) (
  		VADriverContextP ctx,
  		VAConfigID config_id, 
  		VAProfile *profile,		/* out */
  		VAEntrypoint *entrypoint, 	/* out */
  		VAConfigAttrib *attrib_list,	/* out */
  		int *num_attribs		/* out */
  	);
  
  	VAStatus (*vaCreateSurfaces) (
  		VADriverContextP ctx,
  		int width,
  		int height,
  		int format,
  		int num_surfaces,
  		VASurfaceID *surfaces		/* out */
  	);
  
  	VAStatus (*vaDestroySurfaces) (
  		VADriverContextP ctx,
  		VASurfaceID *surface_list,
  		int num_surfaces
  	);
  
  	VAStatus (*vaCreateContext) (
  		VADriverContextP ctx,
  		VAConfigID config_id,
  		int picture_width,
  		int picture_height,
  		int flag,
  		VASurfaceID *render_targets,
  		int num_render_targets,
  		VAContextID *context		/* out */
  	);
  
  	VAStatus (*vaDestroyContext) (
  		VADriverContextP ctx,
  		VAContextID context
  	);
  
  	VAStatus (*vaCreateBuffer) (
  		VADriverContextP ctx,
  		VAContextID context,		/* in */
  		VABufferType type,		/* in */
  		unsigned int size,		/* in */
  		unsigned int num_elements,	/* in */
  		void *data,			/* in */
                  VABufferID *buf_id
  	);
  
  	VAStatus (*vaBufferSetNumElements) (
  		VADriverContextP ctx,
  		VABufferID buf_id,	/* in */
  		unsigned int num_elements	/* in */
  	);
  
  	VAStatus (*vaMapBuffer) (
  		VADriverContextP ctx,
  		VABufferID buf_id,	/* in */
  		void **pbuf         /* out */
  	);
  
  	VAStatus (*vaUnmapBuffer) (
  		VADriverContextP ctx,
  		VABufferID buf_id	/* in */
  	);
  
  	VAStatus (*vaDestroyBuffer) (
  		VADriverContextP ctx,
  		VABufferID buffer_id
  	);
  
  	VAStatus (*vaBeginPicture) (
  		VADriverContextP ctx,
  		VAContextID context,
  		VASurfaceID render_target
  	);
  
  	VAStatus (*vaRenderPicture) (
  		VADriverContextP ctx,
  		VAContextID context,
  		VABufferID *buffers,
  		int num_buffers
  	);
  
  	VAStatus (*vaEndPicture) (
  		VADriverContextP ctx,
  		VAContextID context
  	);
  
  	VAStatus (*vaSyncSurface) (
  		VADriverContextP ctx,
  		VASurfaceID render_target
  	);
  
  	VAStatus (*vaQuerySurfaceStatus) (
  		VADriverContextP ctx,
  		VASurfaceID render_target,
  		VASurfaceStatus *status	/* out */
  	);
  
  	VAStatus (*vaQuerySurfaceError) (
  		VADriverContextP ctx,
  		VASurfaceID render_target,
                  VAStatus error_status,
                  void **error_info /*out*/
  	);
  
  	VAStatus (*vaPutSurface) (
      		VADriverContextP ctx,
  		VASurfaceID surface,
  		void* draw, /* Drawable of window system */
  		short srcx,
  		short srcy,
  		unsigned short srcw,
  		unsigned short srch,
  		short destx,
  		short desty,
  		unsigned short destw,
  		unsigned short desth,
  		VARectangle *cliprects, /* client supplied clip list */
  		unsigned int number_cliprects, /* number of clip rects in the clip list */
  		unsigned int flags /* de-interlacing flags */
  	);
  
  	VAStatus (*vaQueryImageFormats) (
  		VADriverContextP ctx,
  		VAImageFormat *format_list,        /* out */
  		int *num_formats           /* out */
  	);
  
  	VAStatus (*vaCreateImage) (
  		VADriverContextP ctx,
  		VAImageFormat *format,
  		int width,
  		int height,
  		VAImage *image     /* out */
  	);
  
  	VAStatus (*vaDeriveImage) (
  		VADriverContextP ctx,
  		VASurfaceID surface,
  		VAImage *image     /* out */
  	);
  
  	VAStatus (*vaDestroyImage) (
  		VADriverContextP ctx,
  		VAImageID image
  	);
  	
  	VAStatus (*vaSetImagePalette) (
  	        VADriverContextP ctx,
  	        VAImageID image,
  	        /*
                   * pointer to an array holding the palette data.  The size of the array is
                   * num_palette_entries * entry_bytes in size.  The order of the components
                   * in the palette is described by the component_order in VAImage struct
                   */
                  unsigned char *palette
  	);
  	
  	VAStatus (*vaGetImage) (
  		VADriverContextP ctx,
  		VASurfaceID surface,
  		int x,     /* coordinates of the upper left source pixel */
  		int y,
  		unsigned int width, /* width and height of the region */
  		unsigned int height,
  		VAImageID image
  	);
  
  	VAStatus (*vaPutImage) (
  		VADriverContextP ctx,
  		VASurfaceID surface,
  		VAImageID image,
  		int src_x,
  		int src_y,
  		unsigned int src_width,
  		unsigned int src_height,
  		int dest_x,
  		int dest_y,
  		unsigned int dest_width,
  		unsigned int dest_height
  	);
  
  	VAStatus (*vaQuerySubpictureFormats) (
  		VADriverContextP ctx,
  		VAImageFormat *format_list,        /* out */
  		unsigned int *flags,       /* out */
  		unsigned int *num_formats  /* out */
  	);
  
  	VAStatus (*vaCreateSubpicture) (
  		VADriverContextP ctx,
  		VAImageID image,
  		VASubpictureID *subpicture   /* out */
  	);
  
  	VAStatus (*vaDestroySubpicture) (
  		VADriverContextP ctx,
  		VASubpictureID subpicture
  	);
  
          VAStatus (*vaSetSubpictureImage) (
                  VADriverContextP ctx,
                  VASubpictureID subpicture,
                  VAImageID image
          );
  
  	VAStatus (*vaSetSubpictureChromakey) (
  		VADriverContextP ctx,
  		VASubpictureID subpicture,
  		unsigned int chromakey_min,
  		unsigned int chromakey_max,
  		unsigned int chromakey_mask
  	);
  
  	VAStatus (*vaSetSubpictureGlobalAlpha) (
  		VADriverContextP ctx,
  		VASubpictureID subpicture,
  		float global_alpha 
  	);
  
  	VAStatus (*vaAssociateSubpicture) (
  		VADriverContextP ctx,
  		VASubpictureID subpicture,
  		VASurfaceID *target_surfaces,
  		int num_surfaces,
  		short src_x, /* upper left offset in subpicture */
  		short src_y,
  		unsigned short src_width,
  		unsigned short src_height,
  		short dest_x, /* upper left offset in surface */
  		short dest_y,
  		unsigned short dest_width,
  		unsigned short dest_height,
  		/*
  		 * whether to enable chroma-keying or global-alpha
  		 * see VA_SUBPICTURE_XXX values
  		 */
  		unsigned int flags
  	);
  
  	VAStatus (*vaDeassociateSubpicture) (
  		VADriverContextP ctx,
  		VASubpictureID subpicture,
  		VASurfaceID *target_surfaces,
  		int num_surfaces
  	);
  
  	VAStatus (*vaQueryDisplayAttributes) (
  		VADriverContextP ctx,
  		VADisplayAttribute *attr_list,	/* out */
  		int *num_attributes		/* out */
          );
  
  	VAStatus (*vaGetDisplayAttributes) (
  		VADriverContextP ctx,
  		VADisplayAttribute *attr_list,	/* in/out */
  		int num_attributes
          );
          
          VAStatus (*vaSetDisplayAttributes) (
  		VADriverContextP ctx,
                  VADisplayAttribute *attr_list,
                  int num_attributes
          );
  
          /* used by va trace */        
          VAStatus (*vaBufferInfo) (
                     VADriverContextP ctx,      /* in */
                     VABufferID buf_id,         /* in */
                     VABufferType *type,        /* out */
                     unsigned int *size,        /* out */
                     unsigned int *num_elements /* out */
          );
  
          /* lock/unlock surface for external access */    
          VAStatus (*vaLockSurface) (
  		VADriverContextP ctx,
                  VASurfaceID surface,
                  unsigned int *fourcc, /* out  for follow argument */
                  unsigned int *luma_stride,
                  unsigned int *chroma_u_stride,
                  unsigned int *chroma_v_stride,
                  unsigned int *luma_offset,
                  unsigned int *chroma_u_offset,
                  unsigned int *chroma_v_offset,
                  unsigned int *buffer_name, /* if it is not NULL, assign the low lever
                                              * surface buffer name
                                              */
                  void **buffer /* if it is not NULL, map the surface buffer for
                                  * CPU access
                                  */
          );
      
          VAStatus (*vaUnlockSurface) (
  		VADriverContextP ctx,
                  VASurfaceID surface
          );
  
          /* DEPRECATED */
          VAStatus
          (*vaGetSurfaceAttributes)(
              VADriverContextP    dpy,
              VAConfigID          config,
              VASurfaceAttrib    *attrib_list,
              unsigned int        num_attribs
          );
  
          VAStatus
          (*vaCreateSurfaces2)(
              VADriverContextP    ctx,
              unsigned int        format,
              unsigned int        width,
              unsigned int        height,
              VASurfaceID        *surfaces,
              unsigned int        num_surfaces,
              VASurfaceAttrib    *attrib_list,
              unsigned int        num_attribs
          );
  
          VAStatus
          (*vaQuerySurfaceAttributes)(
              VADriverContextP    dpy,
              VAConfigID          config,
              VASurfaceAttrib    *attrib_list,
              unsigned int       *num_attribs
          );
  
          VAStatus
          (*vaAcquireBufferHandle)(
              VADriverContextP    ctx,
              VABufferID          buf_id,         /* in */
              VABufferInfo *      buf_info        /* in/out */
          );
  
          VAStatus
          (*vaReleaseBufferHandle)(
              VADriverContextP    ctx,
              VABufferID          buf_id          /* in */
          );
  
          VAStatus (*vaCreateMFContext) (
              VADriverContextP ctx,
              VAMFContextID *mfe_context    /* out */
          );
  
          VAStatus (*vaMFAddContext) (
              VADriverContextP ctx,
              VAMFContextID mf_context,
              VAContextID context
          );
  
          VAStatus (*vaMFReleaseContext) (
              VADriverContextP ctx,
              VAMFContextID mf_context,
              VAContextID context
          );
  
          VAStatus (*vaMFSubmit) (
              VADriverContextP ctx,
              VAMFContextID mf_context,
              VAContextID *contexts,
              int num_contexts
          );
  	VAStatus (*vaCreateBuffer2) (
              VADriverContextP ctx,
              VAContextID context,                /* in */
              VABufferType type,                  /* in */
              unsigned int width,                 /* in */
              unsigned int height,                /* in */
              unsigned int *unit_size,            /* out */
              unsigned int *pitch,                /* out */
              VABufferID *buf_id                  /* out */
  	);
  
          VAStatus (*vaQueryProcessingRate) (
              VADriverContextP ctx,               /* in */
              VAConfigID config_id,               /* in */
              VAProcessingRateParameter *proc_buf,/* in */
              unsigned int *processing_rate	/* out */
          );
  
          VAStatus
          (*vaExportSurfaceHandle)(
              VADriverContextP    ctx,
              VASurfaceID         surface_id,     /* in */
              uint32_t            mem_type,       /* in */
              uint32_t            flags,          /* in */
              void               *descriptor      /* out */
          );
          VAStatus (*vaSyncSurface2) (
              VADriverContextP ctx,
              VASurfaceID surface,
              uint64_t timeout_ns
          );
  
          VAStatus (*vaSyncBuffer) (
              VADriverContextP ctx,
              VABufferID buf_id,
              uint64_t timeout_ns
          );
  
          VAStatus
          (*vaCopy)(
              VADriverContextP    ctx,            /* in */
              VACopyObject        *dst,           /* in */
              VACopyObject        *src,           /* in */
              VACopyOption        option          /* in */
          );
          /** \brief Reserved bytes for future use, must be zero */
          unsigned long reserved[54];
  };
  
  struct VADriverContext
  {
      void *pDriverData;
  
      /**
       * The core VA implementation hooks.
       *
       * This structure is allocated from libva with calloc().
       */
      struct VADriverVTable *vtable;
  
      /**
       * The VA/GLX implementation hooks.
       *
       * This structure is intended for drivers that implement the
       * VA/GLX API. The driver implementation is responsible for the
       * allocation and deallocation of this structure.
       */
      struct VADriverVTableGLX *vtable_glx;
  
      /**
       * The VA/EGL implementation hooks.
       *
       * This structure is intended for drivers that implement the
       * VA/EGL API. The driver implementation is responsible for the
       * allocation and deallocation of this structure.
       */
      struct VADriverVTableEGL *vtable_egl;
  
      /**
       * The third-party/private implementation hooks.
       *
       * This structure is intended for drivers that implement the
       * private API. The driver implementation is responsible for the
       * allocation and deallocation of this structure.
       */
      void *vtable_tpi;
  
      void *native_dpy;
      int x11_screen;
      int version_major;
      int version_minor;
      int max_profiles;
      int max_entrypoints;
      int max_attributes;
      int max_image_formats;
      int max_subpic_formats;
      int max_display_attributes;
      const char *str_vendor;
  
      void *handle;			/* dlopen handle */
  
      /**
       * \brief DRM state.
       *
       * This field holds driver specific data for DRM-based
       * drivers. This structure is allocated from libva with
       * calloc(). Do not deallocate from within VA driver
       * implementations.
       *
       * All structures shall be derived from struct drm_state. So, for
       * instance, this field holds a dri_state structure for VA/X11
       * drivers that use the DRM protocol.
       */
      void *drm_state;
  
      void *glx;				/* opaque for GLX code */
  
      /** \brief VA display type. */
      unsigned long display_type;
  
      /**
       * The VA/Wayland implementation hooks.
       *
       * This structure is intended for drivers that implement the
       * VA/Wayland API. libVA allocates this structure with calloc()
       * and owns the resulting memory.
       */
      struct VADriverVTableWayland *vtable_wayland;
  
      /**
       * \brief The VA/VPP implementation hooks.
       *
       * This structure is allocated from libva with calloc().
       */
      struct VADriverVTableVPP *vtable_vpp;
  
      char *override_driver_name;
  
      void *pDisplayContext;
  
      /**
       * Error callback.
       *
       * This is set by libva when the driver is opened, and will not be
       * changed thereafter.  The driver can call it with an error message,
       * which will be propagated to the API user through their error
       * callbacks, or sent to a default output if no callback is available.
       *
       * It is expected that end users will always be able to see these
       * messages, so it should be called only for serious errors.  For
       * example, hardware problems or fatal configuration errors.
       *
       * @param pDriverContext  Pointer to the driver context structure
       *                        being used by the current driver.
       * @param message  Message to send to the API user.  This must be a
       *                 null-terminated string.
       */
      void (*error_callback)(VADriverContextP pDriverContext,
                             const char *message);
      /**
       * Info callback.
       *
       * This has the same behaviour as the error callback, but has its
       * own set of callbacks to the API user.
       *
       * It should be used for informational messages which may be useful
       * for an application programmer or for debugging.  For example, minor
       * configuration errors, or information about the reason when another
       * API call generates an error return.  It is not expected that end
       * users will see these messages.
       *
       * @param pDriverContext  Pointer to the driver context structure
       *                        being used by the current driver.
       * @param message  Message to send to the API user.  This must be a
       *                 null-terminated string.
       */
      void (*info_callback)(VADriverContextP pDriverContext,
                            const char *message);
  
      /**
       * \brief The VA/Protected implementation hooks.
       *
       * This structure is allocated from libva with calloc().
       */
      struct VADriverVTableProt *vtable_prot;
  
      unsigned long reserved[37];         /* reserve for future add-ins, decrease the subscript accordingly */
  };
  
  #define VA_DISPLAY_MAGIC 0x56414430 /* VAD0 */
  struct VADisplayContext
  {
      int vadpy_magic;
      
      VADisplayContextP pNext;
      VADriverContextP pDriverContext;
  
      int (*vaIsValid) (
  	VADisplayContextP ctx
      );
  
      void (*vaDestroy) (
  	VADisplayContextP ctx
      );
  
      VAStatus (*vaGetDriverName) (
  	VADisplayContextP ctx,
  	char **driver_name
      );
  
      void *opaque; /* opaque for display extensions (e.g. GLX) */
      void *vatrace; /* opaque for VA trace context */
      void *vafool; /* opaque for VA fool context */
  
      VAMessageCallback error_callback;
      void *error_callback_user_context;
      VAMessageCallback info_callback;
      void *info_callback_user_context;
      VAStatus (*vaGetNumCandidates) (
          VADisplayContextP ctx,
          int * num_candidates
      );
  
      VAStatus (*vaGetDriverNameByIndex) (
          VADisplayContextP ctx,
          char **driver_name,
          int  candidate_index
      );
  
      /** \brief Reserved bytes for future use, must be zero */
      unsigned long reserved[30];
  };
  
  typedef VAStatus (*VADriverInit) (
      VADriverContextP driver_context
  );
  
  #endif /* _VA_BACKEND_H_ */
  