Home | History | Annotate | Download | only in va
      1 /*
      2  * Copyright (c) 2007-2009 Intel Corporation. All Rights Reserved.
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the
      6  * "Software"), to deal in the Software without restriction, including
      7  * without limitation the rights to use, copy, modify, merge, publish,
      8  * distribute, sub license, and/or sell copies of the Software, and to
      9  * permit persons to whom the Software is furnished to do so, subject to
     10  * the following conditions:
     11  *
     12  * The above copyright notice and this permission notice (including the
     13  * next paragraph) shall be included in all copies or substantial portions
     14  * of the Software.
     15  *
     16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
     17  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
     18  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
     19  * IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE LIABLE FOR
     20  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
     21  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
     22  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
     23  */
     24 /*
     25  * Video Acceleration (VA) API Specification
     26  *
     27  * Rev. 0.30
     28  * <jonathan.bian (at) intel.com>
     29  *
     30  * Revision History:
     31  * rev 0.10 (12/10/2006 Jonathan Bian) - Initial draft
     32  * rev 0.11 (12/15/2006 Jonathan Bian) - Fixed some errors
     33  * rev 0.12 (02/05/2007 Jonathan Bian) - Added VC-1 data structures for slice level decode
     34  * rev 0.13 (02/28/2007 Jonathan Bian) - Added GetDisplay()
     35  * rev 0.14 (04/13/2007 Jonathan Bian) - Fixed MPEG-2 PictureParameter structure, cleaned up a few funcs.
     36  * rev 0.15 (04/20/2007 Jonathan Bian) - Overhauled buffer management
     37  * rev 0.16 (05/02/2007 Jonathan Bian) - Added error codes and fixed some issues with configuration
     38  * rev 0.17 (05/07/2007 Jonathan Bian) - Added H.264/AVC data structures for slice level decode.
     39  * rev 0.18 (05/14/2007 Jonathan Bian) - Added data structures for MPEG-4 slice level decode
     40  *                                       and MPEG-2 motion compensation.
     41  * rev 0.19 (08/06/2007 Jonathan Bian) - Removed extra type for bitplane data.
     42  * rev 0.20 (08/08/2007 Jonathan Bian) - Added missing fields to VC-1 PictureParameter structure.
     43  * rev 0.21 (08/20/2007 Jonathan Bian) - Added image and subpicture support.
     44  * rev 0.22 (08/27/2007 Jonathan Bian) - Added support for chroma-keying and global alpha.
     45  * rev 0.23 (09/11/2007 Jonathan Bian) - Fixed some issues with images and subpictures.
     46  * rev 0.24 (09/18/2007 Jonathan Bian) - Added display attributes.
     47  * rev 0.25 (10/18/2007 Jonathan Bian) - Changed to use IDs only for some types.
     48  * rev 0.26 (11/07/2007 Waldo Bastian) - Change vaCreateBuffer semantics
     49  * rev 0.27 (11/19/2007 Matt Sottek)   - Added DeriveImage
     50  * rev 0.28 (12/06/2007 Jonathan Bian) - Added new versions of PutImage and AssociateSubpicture
     51  *                                       to enable scaling
     52  * rev 0.29 (02/07/2008 Jonathan Bian) - VC1 parameter fixes,
     53  *                                       added VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED
     54  * rev 0.30 (03/01/2009 Jonathan Bian) - Added encoding support for H.264 BP and MPEG-4 SP and fixes
     55  *                                       for ISO C conformance.
     56  * rev 0.31 (09/02/2009 Gwenole Beauchesne) - VC-1/H264 fields change for VDPAU and XvBA backend
     57  *                                       Application needs to relink with the new library.
     58  *
     59  * rev 0.31.1 (03/29/2009)              - Data structure for JPEG encode
     60  * rev 0.31.2 (01/13/2011 Anthony Pabon)- Added a flag to indicate Subpicture coordinates are screen
     61  *                                        screen relative rather than source video relative.
     62  * rev 0.32.0 (01/13/2011 Xiang Haihao) - Add profile into VAPictureParameterBufferVC1
     63  *                                        update VAAPI to 0.32.0
     64  *
     65  * Acknowledgements:
     66  *  Some concepts borrowed from XvMC and XvImage.
     67  *  Waldo Bastian (Intel), Matt Sottek (Intel),  Austin Yuan (Intel), and Gwenole Beauchesne (SDS)
     68  *  contributed to various aspects of the API.
     69  */
     70 
     71 #ifndef _VA_H_
     72 #define _VA_H_
     73 
     74 #include <va/va_version.h>
     75 
     76 #ifdef __cplusplus
     77 extern "C" {
     78 #endif
     79 
     80 /*
     81 Overview
     82 
     83 The VA API is intended to provide an interface between a video decode/encode/display
     84 application (client) and a hardware accelerator (server), to off-load
     85 video decode/encode/display operations from the host to the hardware accelerator at various
     86 entry-points.
     87 
     88 The basic operation steps are:
     89 
     90 - Negotiate a mutually acceptable configuration with the server to lock
     91   down profile, entrypoints, and other attributes that will not change on
     92   a frame-by-frame basis.
     93 - Create a decode context which represents a "virtualized" hardware decode
     94   device
     95 - Get and fill decode buffers with picture level, slice level and macroblock
     96   level data (depending on entrypoints)
     97 - Pass the decode buffers to the server to decode the current frame
     98 
     99 Initialization & Configuration Management
    100 
    101 - Find out supported profiles
    102 - Find out entrypoints for a given profile
    103 - Find out configuration attributes for a given profile/entrypoint pair
    104 - Create a configuration for use by the decoder
    105 
    106 */
    107 
    108 typedef void* VADisplay;	/* window system dependent */
    109 
    110 typedef int VAStatus;	/* Return status type from functions */
    111 /* Values for the return status */
    112 #define VA_STATUS_SUCCESS			0x00000000
    113 #define VA_STATUS_ERROR_OPERATION_FAILED	0x00000001
    114 #define VA_STATUS_ERROR_ALLOCATION_FAILED	0x00000002
    115 #define VA_STATUS_ERROR_INVALID_DISPLAY		0x00000003
    116 #define VA_STATUS_ERROR_INVALID_CONFIG		0x00000004
    117 #define VA_STATUS_ERROR_INVALID_CONTEXT		0x00000005
    118 #define VA_STATUS_ERROR_INVALID_SURFACE		0x00000006
    119 #define VA_STATUS_ERROR_INVALID_BUFFER		0x00000007
    120 #define VA_STATUS_ERROR_INVALID_IMAGE		0x00000008
    121 #define VA_STATUS_ERROR_INVALID_SUBPICTURE	0x00000009
    122 #define VA_STATUS_ERROR_ATTR_NOT_SUPPORTED	0x0000000a
    123 #define VA_STATUS_ERROR_MAX_NUM_EXCEEDED	0x0000000b
    124 #define VA_STATUS_ERROR_UNSUPPORTED_PROFILE	0x0000000c
    125 #define VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT	0x0000000d
    126 #define VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT	0x0000000e
    127 #define VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE	0x0000000f
    128 #define VA_STATUS_ERROR_SURFACE_BUSY		0x00000010
    129 #define VA_STATUS_ERROR_FLAG_NOT_SUPPORTED      0x00000011
    130 #define VA_STATUS_ERROR_INVALID_PARAMETER	0x00000012
    131 #define VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED 0x00000013
    132 #define VA_STATUS_ERROR_UNIMPLEMENTED           0x00000014
    133 #define VA_STATUS_ERROR_SURFACE_IN_DISPLAYING   0x00000015
    134 #define VA_STATUS_ERROR_INVALID_IMAGE_FORMAT    0x00000016
    135 #define VA_STATUS_ERROR_DECODING_ERROR          0x00000017
    136 #define VA_STATUS_ERROR_ENCODING_ERROR          0x00000018
    137 #define VA_STATUS_ERROR_UNKNOWN			0xFFFFFFFF
    138 
    139 /* De-interlacing flags for vaPutSurface() */
    140 #define VA_FRAME_PICTURE        0x00000000
    141 #define VA_TOP_FIELD            0x00000001
    142 #define VA_BOTTOM_FIELD         0x00000002
    143 
    144 /*
    145  * Enabled the positioning/cropping/blending feature:
    146  * 1, specify the video playback position in the isurface
    147  * 2, specify the cropping info for video playback
    148  * 3, encoded video will blend with background color
    149  */
    150 #define VA_ENABLE_BLEND         0x00000004 /* video area blend with the constant color */
    151 
    152 /*
    153  * Clears the drawable with background color.
    154  * for hardware overlay based implementation this flag
    155  * can be used to turn off the overlay
    156  */
    157 #define VA_CLEAR_DRAWABLE       0x00000008
    158 
    159 /* Color space conversion flags for vaPutSurface() */
    160 #define VA_SRC_BT601            0x00000010
    161 #define VA_SRC_BT709            0x00000020
    162 #define VA_SRC_SMPTE_240        0x00000040
    163 
    164 /* Scaling flags for vaPutSurface() */
    165 #define VA_FILTER_SCALING_DEFAULT       0x00000000
    166 #define VA_FILTER_SCALING_FAST          0x00000100
    167 #define VA_FILTER_SCALING_HQ            0x00000200
    168 #define VA_FILTER_SCALING_NL_ANAMORPHIC 0x00000300
    169 #define VA_FILTER_SCALING_MASK          0x00000f00
    170 
    171 /*
    172  * Returns a short english description of error_status
    173  */
    174 const char *vaErrorStr(VAStatus error_status);
    175 
    176 /*
    177  * Initialization:
    178  * A display must be obtained by calling vaGetDisplay() before calling
    179  * vaInitialize() and other functions. This connects the API to the
    180  * native window system.
    181  * For X Windows, native_dpy would be from XOpenDisplay()
    182  */
    183 typedef void* VANativeDisplay;	/* window system dependent */
    184 
    185 int vaDisplayIsValid(VADisplay dpy);
    186 
    187 /*
    188  * Initialize the library
    189  */
    190 VAStatus vaInitialize (
    191     VADisplay dpy,
    192     int *major_version,	 /* out */
    193     int *minor_version 	 /* out */
    194 );
    195 
    196 /*
    197  * After this call, all library internal resources will be cleaned up
    198  */
    199 VAStatus vaTerminate (
    200     VADisplay dpy
    201 );
    202 
    203 /*
    204  * vaQueryVendorString returns a pointer to a zero-terminated string
    205  * describing some aspects of the VA implemenation on a specific
    206  * hardware accelerator. The format of the returned string is vendor
    207  * specific and at the discretion of the implementer.
    208  * e.g. for the Intel GMA500 implementation, an example would be:
    209  * "Intel GMA500 - 2.0.0.32L.0005"
    210  */
    211 const char *vaQueryVendorString (
    212     VADisplay dpy
    213 );
    214 
    215 typedef int (*VAPrivFunc)();
    216 
    217 /*
    218  * Return a function pointer given a function name in the library.
    219  * This allows private interfaces into the library
    220  */
    221 VAPrivFunc vaGetLibFunc (
    222     VADisplay dpy,
    223     const char *func
    224 );
    225 
    226 /* Currently defined profiles */
    227 typedef enum
    228 {
    229     VAProfileMPEG2Simple		= 0,
    230     VAProfileMPEG2Main			= 1,
    231     VAProfileMPEG4Simple		= 2,
    232     VAProfileMPEG4AdvancedSimple	= 3,
    233     VAProfileMPEG4Main			= 4,
    234     VAProfileH264Baseline		= 5,
    235     VAProfileH264Main			= 6,
    236     VAProfileH264High			= 7,
    237     VAProfileVC1Simple			= 8,
    238     VAProfileVC1Main			= 9,
    239     VAProfileVC1Advanced		= 10,
    240     VAProfileH263Baseline		= 11,
    241     VAProfileJPEGBaseline               = 12,
    242     VAProfileH264ConstrainedBaseline = 13
    243 } VAProfile;
    244 
    245 /*
    246  *  Currently defined entrypoints
    247  */
    248 typedef enum
    249 {
    250     VAEntrypointVLD		= 1,
    251     VAEntrypointIZZ		= 2,
    252     VAEntrypointIDCT		= 3,
    253     VAEntrypointMoComp		= 4,
    254     VAEntrypointDeblocking	= 5,
    255     VAEntrypointEncSlice	= 6,	/* slice level encode */
    256     VAEntrypointEncPicture 	= 7	/* pictuer encode, JPEG, etc */
    257 } VAEntrypoint;
    258 
    259 /* Currently defined configuration attribute types */
    260 typedef enum
    261 {
    262     VAConfigAttribRTFormat		= 0,
    263     VAConfigAttribSpatialResidual	= 1,
    264     VAConfigAttribSpatialClipping	= 2,
    265     VAConfigAttribIntraResidual		= 3,
    266     VAConfigAttribEncryption		= 4,
    267     VAConfigAttribRateControl		= 5
    268 } VAConfigAttribType;
    269 
    270 /*
    271  * Configuration attributes
    272  * If there is more than one value for an attribute, a default
    273  * value will be assigned to the attribute if the client does not
    274  * specify the attribute when creating a configuration
    275  */
    276 typedef struct _VAConfigAttrib {
    277     VAConfigAttribType type;
    278     unsigned int value; /* OR'd flags (bits) for this attribute */
    279 } VAConfigAttrib;
    280 
    281 /* attribute value for VAConfigAttribRTFormat */
    282 #define VA_RT_FORMAT_YUV420	0x00000001
    283 #define VA_RT_FORMAT_YUV422	0x00000002
    284 #define VA_RT_FORMAT_YUV444	0x00000004
    285 #define VA_RT_FORMAT_PROTECTED	0x80000000
    286 
    287 /* attribute value for VAConfigAttribRateControl */
    288 #define VA_RC_NONE	0x00000001
    289 #define VA_RC_CBR	0x00000002
    290 #define VA_RC_VBR	0x00000004
    291 #define VA_RC_VCM	0x00000008 /* video conference mode */
    292 
    293 /*
    294  * if an attribute is not applicable for a given
    295  * profile/entrypoint pair, then set the value to the following
    296  */
    297 #define VA_ATTRIB_NOT_SUPPORTED 0x80000000
    298 
    299 /* Get maximum number of profiles supported by the implementation */
    300 int vaMaxNumProfiles (
    301     VADisplay dpy
    302 );
    303 
    304 /* Get maximum number of entrypoints supported by the implementation */
    305 int vaMaxNumEntrypoints (
    306     VADisplay dpy
    307 );
    308 
    309 /* Get maximum number of attributs supported by the implementation */
    310 int vaMaxNumConfigAttributes (
    311     VADisplay dpy
    312 );
    313 
    314 /*
    315  * Query supported profiles
    316  * The caller must provide a "profile_list" array that can hold at
    317  * least vaMaxNumProfile() entries. The actual number of profiles
    318  * returned in "profile_list" is returned in "num_profile".
    319  */
    320 VAStatus vaQueryConfigProfiles (
    321     VADisplay dpy,
    322     VAProfile *profile_list,	/* out */
    323     int *num_profiles		/* out */
    324 );
    325 
    326 /*
    327  * Query supported entrypoints for a given profile
    328  * The caller must provide an "entrypoint_list" array that can hold at
    329  * least vaMaxNumEntrypoints() entries. The actual number of entrypoints
    330  * returned in "entrypoint_list" is returned in "num_entrypoints".
    331  */
    332 VAStatus vaQueryConfigEntrypoints (
    333     VADisplay dpy,
    334     VAProfile profile,
    335     VAEntrypoint *entrypoint_list,	/* out */
    336     int *num_entrypoints		/* out */
    337 );
    338 
    339 /*
    340  * Get attributes for a given profile/entrypoint pair
    341  * The caller must provide an "attrib_list" with all attributes to be
    342  * retrieved.  Upon return, the attributes in "attrib_list" have been
    343  * updated with their value.  Unknown attributes or attributes that are
    344  * not supported for the given profile/entrypoint pair will have their
    345  * value set to VA_ATTRIB_NOT_SUPPORTED
    346  */
    347 VAStatus vaGetConfigAttributes (
    348     VADisplay dpy,
    349     VAProfile profile,
    350     VAEntrypoint entrypoint,
    351     VAConfigAttrib *attrib_list, /* in/out */
    352     int num_attribs
    353 );
    354 
    355 /* Generic ID type, can be re-typed for specific implementation */
    356 typedef unsigned int VAGenericID;
    357 
    358 typedef VAGenericID VAConfigID;
    359 
    360 /*
    361  * Create a configuration for the decode pipeline
    362  * it passes in the attribute list that specifies the attributes it cares
    363  * about, with the rest taking default values.
    364  */
    365 VAStatus vaCreateConfig (
    366     VADisplay dpy,
    367     VAProfile profile,
    368     VAEntrypoint entrypoint,
    369     VAConfigAttrib *attrib_list,
    370     int num_attribs,
    371     VAConfigID *config_id /* out */
    372 );
    373 
    374 /*
    375  * Free resources associdated with a given config
    376  */
    377 VAStatus vaDestroyConfig (
    378     VADisplay dpy,
    379     VAConfigID config_id
    380 );
    381 
    382 /*
    383  * Query all attributes for a given configuration
    384  * The profile of the configuration is returned in "profile"
    385  * The entrypoint of the configuration is returned in "entrypoint"
    386  * The caller must provide an "attrib_list" array that can hold at least
    387  * vaMaxNumConfigAttributes() entries. The actual number of attributes
    388  * returned in "attrib_list" is returned in "num_attribs"
    389  */
    390 VAStatus vaQueryConfigAttributes (
    391     VADisplay dpy,
    392     VAConfigID config_id,
    393     VAProfile *profile, 	/* out */
    394     VAEntrypoint *entrypoint, 	/* out */
    395     VAConfigAttrib *attrib_list,/* out */
    396     int *num_attribs 		/* out */
    397 );
    398 
    399 
    400 /*
    401  * Contexts and Surfaces
    402  *
    403  * Context represents a "virtual" video decode pipeline. Surfaces are render
    404  * targets for a given context. The data in the surfaces are not accessible
    405  * to the client and the internal data format of the surface is implementatin
    406  * specific.
    407  *
    408  * Surfaces will be bound to a context when the context is created. Once
    409  * a surface is bound to a given context, it can not be used to create
    410  * another context. The association is removed when the context is destroyed
    411  *
    412  * Both contexts and surfaces are identified by unique IDs and its
    413  * implementation specific internals are kept opaque to the clients
    414  */
    415 
    416 typedef VAGenericID VAContextID;
    417 
    418 typedef VAGenericID VASurfaceID;
    419 
    420 #define VA_INVALID_ID		0xffffffff
    421 #define VA_INVALID_SURFACE	VA_INVALID_ID
    422 
    423 /*
    424  * vaCreateSurfaces - Create an array of surfaces used for decode and display
    425  *  dpy: display
    426  *  width: surface width
    427  *  height: surface height
    428  *  format: VA_RT_FORMAT_YUV420, VA_RT_FORMAT_YUV422 or VA_RT_FORMAT_YUV444
    429  *  num_surfaces: number of surfaces to be created
    430  *  surfaces: array of surfaces created upon return
    431  */
    432 VAStatus vaCreateSurfaces (
    433     VADisplay dpy,
    434     int width,
    435     int height,
    436     int format,
    437     int num_surfaces,
    438     VASurfaceID *surfaces	/* out */
    439 );
    440 
    441 
    442 /*
    443  * vaDestroySurfaces - Destroy resources associated with surfaces.
    444  *  Surfaces can only be destroyed after the context associated has been
    445  *  destroyed.
    446  *  dpy: display
    447  *  surfaces: array of surfaces to destroy
    448  *  num_surfaces: number of surfaces in the array to be destroyed.
    449  */
    450 VAStatus vaDestroySurfaces (
    451     VADisplay dpy,
    452     VASurfaceID *surfaces,
    453     int num_surfaces
    454 );
    455 
    456 #define VA_PROGRESSIVE 0x1
    457 /*
    458  * vaCreateContext - Create a context
    459  *  dpy: display
    460  *  config_id: configuration for the context
    461  *  picture_width: coded picture width
    462  *  picture_height: coded picture height
    463  *  flag: any combination of the following:
    464  *    VA_PROGRESSIVE (only progressive frame pictures in the sequence when set)
    465  *  render_targets: render targets (surfaces) tied to the context
    466  *  num_render_targets: number of render targets in the above array
    467  *  context: created context id upon return
    468  */
    469 VAStatus vaCreateContext (
    470     VADisplay dpy,
    471     VAConfigID config_id,
    472     int picture_width,
    473     int picture_height,
    474     int flag,
    475     VASurfaceID *render_targets,
    476     int num_render_targets,
    477     VAContextID *context		/* out */
    478 );
    479 
    480 /*
    481  * vaDestroyContext - Destroy a context
    482  *  dpy: display
    483  *  context: context to be destroyed
    484  */
    485 VAStatus vaDestroyContext (
    486     VADisplay dpy,
    487     VAContextID context
    488 );
    489 
    490 /*
    491  * Buffers
    492  * Buffers are used to pass various types of data from the
    493  * client to the server. The server maintains a data store
    494  * for each buffer created, and the client idenfies a buffer
    495  * through a unique buffer id assigned by the server.
    496  */
    497 
    498 typedef VAGenericID VABufferID;
    499 
    500 typedef enum
    501 {
    502     VAPictureParameterBufferType	= 0,
    503     VAIQMatrixBufferType		= 1,
    504     VABitPlaneBufferType		= 2,
    505     VASliceGroupMapBufferType		= 3,
    506     VASliceParameterBufferType		= 4,
    507     VASliceDataBufferType		= 5,
    508     VAMacroblockParameterBufferType	= 6,
    509     VAResidualDataBufferType		= 7,
    510     VADeblockingParameterBufferType	= 8,
    511     VAImageBufferType			= 9,
    512     VAProtectedSliceDataBufferType	= 10,
    513     VAQMatrixBufferType                 = 11,
    514     VAHuffmanTableBufferType            = 12,
    515 
    516 /* Following are encode buffer types */
    517     VAEncCodedBufferType		= 21,
    518     VAEncSequenceParameterBufferType	= 22,
    519     VAEncPictureParameterBufferType	= 23,
    520     VAEncSliceParameterBufferType	= 24,
    521     VAEncH264VUIBufferType		= 25,
    522     VAEncH264SEIBufferType		= 26,
    523     VAEncMiscParameterBufferType	= 27,
    524     VABufferTypeMax                     = 0xff
    525 } VABufferType;
    526 
    527 typedef enum
    528 {
    529     VAEncMiscParameterTypeFrameRate 	= 0,
    530     VAEncMiscParameterTypeRateControl  	= 1,
    531     VAEncMiscParameterTypeMaxSliceSize	= 2,
    532     VAEncMiscParameterTypeAIR    	= 3,
    533 } VAEncMiscParameterType;
    534 
    535 /*
    536  *  For application, e.g. set a new bitrate
    537  *    VABufferID buf_id;
    538  *    VAEncMiscParameterBuffer *misc_param;
    539  *    VAEncMiscParameterRateControl *misc_rate_ctrl;
    540  *
    541  *    vaCreateBuffer(dpy, context, VAEncMiscParameterBufferType,
    542  *              sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterRateControl),
    543  *              1, NULL, &buf_id);
    544  *
    545  *    vaMapBuffer(dpy,buf_id,(void **)&misc_param);
    546  *    misc_param->type = VAEncMiscParameterTypeRateControl;
    547  *    misc_rate_ctrl= (VAEncMiscParameterRateControl *)misc_param->data;
    548  *    misc_rate_ctrl->bits_per_second = 6400000;
    549  *    vaUnmapBuffer(dpy, buf_id);
    550  *    vaRenderPicture(dpy, context, &buf_id, 1);
    551  */
    552 typedef struct _VAEncMiscParameterBuffer
    553 {
    554     VAEncMiscParameterType type;
    555     unsigned int data[0];
    556 } VAEncMiscParameterBuffer;
    557 
    558 typedef struct _VAEncMiscParameterRateControl
    559 {
    560     unsigned int bits_per_second; /* this is the maximum bit-rate to be constrained by the rate control implementation */
    561     unsigned int target_percentage; /* this is the bit-rate the rate control is targeting, as a percentage of the maximum bit-rate */
    562                                     /* for example if target_percentage is 95 then the rate control will target a bit-rate that is */
    563                                     /* 95% of the maximum bit-rate */
    564     unsigned int window_size; /* windows size in milliseconds. For example if this is set to 500, then the rate control will guarantee the */
    565                               /* target bit-rate over a 500 ms window */
    566     unsigned int initial_qp;  /* initial QP at I frames */
    567     unsigned int min_qp;
    568 } VAEncMiscParameterRateControl;
    569 
    570 typedef struct _VAEncMiscParameterFrameRate
    571 {
    572     unsigned int framerate;
    573 } VAEncMiscParameterFrameRate;
    574 
    575 /*
    576  * Allow a maximum slice size to be specified (in bits).
    577  * The encoder will attempt to make sure that individual slices do not exceed this size
    578  * Or to signal applicate if the slice size exceed this size, see "status" of VACodedBufferSegment
    579  */
    580 typedef struct _VAEncMiscParameterMaxSliceSize
    581 {
    582     unsigned int max_slice_size;
    583 } VAEncMiscParameterMaxSliceSize;
    584 
    585 typedef struct _VAEncMiscParameterAIR
    586 {
    587     unsigned int air_num_mbs;
    588     unsigned int air_threshold;
    589     unsigned int air_auto; /* if set to 1 then hardware auto-tune the AIR threshold */
    590 } VAEncMiscParameterAIR;
    591 
    592 
    593 /*
    594  * There will be cases where the bitstream buffer will not have enough room to hold
    595  * the data for the entire slice, and the following flags will be used in the slice
    596  * parameter to signal to the server for the possible cases.
    597  * If a slice parameter buffer and slice data buffer pair is sent to the server with
    598  * the slice data partially in the slice data buffer (BEGIN and MIDDLE cases below),
    599  * then a slice parameter and data buffer needs to be sent again to complete this slice.
    600  */
    601 #define VA_SLICE_DATA_FLAG_ALL		0x00	/* whole slice is in the buffer */
    602 #define VA_SLICE_DATA_FLAG_BEGIN	0x01	/* The beginning of the slice is in the buffer but the end if not */
    603 #define VA_SLICE_DATA_FLAG_MIDDLE	0x02	/* Neither beginning nor end of the slice is in the buffer */
    604 #define VA_SLICE_DATA_FLAG_END		0x04	/* end of the slice is in the buffer */
    605 
    606 /* Codec-independent Slice Parameter Buffer base */
    607 typedef struct _VASliceParameterBufferBase
    608 {
    609     unsigned int slice_data_size;	/* number of bytes in the slice data buffer for this slice */
    610     unsigned int slice_data_offset;	/* the offset to the first byte of slice data */
    611     unsigned int slice_data_flag;	/* see VA_SLICE_DATA_FLAG_XXX definitions */
    612 } VASliceParameterBufferBase;
    613 
    614 
    615 /****************************
    616  * JEPG data structure
    617  ***************************/
    618 typedef struct _VAQMatrixBufferJPEG
    619 {
    620     int load_lum_quantiser_matrix;
    621     int load_chroma_quantiser_matrix;
    622     unsigned char lum_quantiser_matrix[64];
    623     unsigned char chroma_quantiser_matrix[64];
    624 } VAQMatrixBufferJPEG;
    625 
    626 typedef struct _VAEncPictureParameterBufferJPEG
    627 {
    628     VASurfaceID reconstructed_picture;
    629     unsigned short picture_width;
    630     unsigned short picture_height;
    631     VABufferID coded_buf;
    632 } VAEncPictureParameterBufferJPEG;
    633 
    634 /* data struct for JPEG decoding */
    635 
    636 /* Quantization table */
    637 typedef struct _VAIQMatrixBufferJPEG
    638 {
    639     int precision[4];                           /* valid value: 0(8-bits) , 1(16-bits), precision[Tq](Tq=0,1,2,3)
    640                                                  * specifies precision for destination Tq
    641                                                  */
    642     unsigned char quantiser_matrix[4][128];     /* quantiser_matrix[Tq](Tq=0,1,2,3) specifies a
    643                                                  * quantization table for destination Tq in zig-zag
    644                                                  * scan order. Only the first 64 bytes are valid for each
    645                                                  * table if precision is 0(8-bits).
    646                                                  */
    647 } VAIQMatrixBufferJPEG;
    648 
    649 #define VA_JPEG_SOF0    0xC0
    650 #define VA_JPEG_SOF1    0xC1
    651 #define VA_JPEG_SOF2    0xC2
    652 #define VA_JPEG_SOF3    0xC3
    653 #define VA_JPEG_SOF5    0xC5
    654 #define VA_JPEG_SOF6    0xC6
    655 #define VA_JPEG_SOF7    0xC7
    656 #define VA_JPEG_SOF9    0xC9
    657 #define VA_JPEG_SOF10   0xCA
    658 #define VA_JPEG_SOF11   0xCB
    659 #define VA_JPEG_SOF13   0xCD
    660 #define VA_JPEG_SOF14   0xCE
    661 
    662 /* JPEG Picture Parameter Buffer */
    663 typedef struct _VAPictureParameterBufferJPEG
    664 {
    665     unsigned int type; /* SOFn */
    666     unsigned int sample_precision;
    667     unsigned int image_width;
    668     unsigned int image_height;
    669     unsigned int num_components;
    670     struct {
    671         unsigned char component_id;             /* Ci, the range is 0-255, see B.2.2 */
    672         unsigned char h_sampling_factor;
    673         unsigned char v_sampling_factor;
    674         unsigned char quantiser_table_selector; /* Tqi, quantization table destination selector */
    675     } components[4];
    676 
    677     /* ROI (region of interest), for JPEG2000 */
    678     struct {
    679         int enabled;
    680         int start_x;
    681         int start_y;
    682         int end_x;
    683         int end_y;
    684     } roi;
    685 
    686     int rotation;
    687 } VAPictureParameterBufferJPEG;
    688 
    689 typedef struct _VAHuffmanTableBufferJPEG
    690 {
    691     struct {
    692         unsigned char dc_bits[16];      /* Number of Huffman codes of length i for DC */
    693         unsigned char dc_huffval[20];   /* Value associated with each Huffman code for DC */
    694         unsigned char ac_bits[16];      /* Number of Huffman codes of length i for AC */
    695         unsigned char ac_huffval[256];  /* Value associated with each Huffman code for AC */
    696     } huffman_table[4];                 /* Up to 4 huffman tables, huffman_table[Th](Th=0,1,2,3)
    697                                          * specifies a buffman table for destination Th.
    698                                          */
    699 
    700 } VAHuffmanTableBufferJPEG;
    701 
    702 /* JPEG Scan Parameter Buffer, The Scan of is similar to
    703  * the Slice of other codecs */
    704 typedef struct _VASliceParameterBufferJPEG
    705 {
    706     unsigned int slice_data_size;	/* number of bytes in the slice data buffer for this slice */
    707     unsigned int slice_data_offset;	/* the offset to the first byte of slice data */
    708     unsigned int slice_data_flag;	/* see VA_SLICE_DATA_FLAG_XXX definitions */
    709     unsigned int slice_horizontal_position;
    710     unsigned int slice_vertical_position;
    711 
    712     unsigned int num_components;
    713     struct {
    714         int component_id;               /* Csj, it must match one of component_ids specified in VAPictureParameterBufferJPEG */
    715         int dc_selector;                /* Tdj(0,1,2,3) */
    716         int ac_selector;                /* Taj(0,1,2,3) */
    717     } components[4];
    718 
    719     int restart_interval; /* specifies the number of MCUs in restart interval, defined in DRI marker */
    720     int num_mcus;       /* indicates the number of MCUs in a scan */
    721 } VASliceParameterBufferJPEG;
    722 
    723 /****************************
    724  * MPEG-2 data structures
    725  ****************************/
    726 
    727 /* MPEG-2 Picture Parameter Buffer */
    728 /*
    729  * For each frame or field, and before any slice data, a single
    730  * picture parameter buffer must be send.
    731  */
    732 typedef struct _VAPictureParameterBufferMPEG2
    733 {
    734     unsigned short horizontal_size;
    735     unsigned short vertical_size;
    736     VASurfaceID forward_reference_picture;
    737     VASurfaceID backward_reference_picture;
    738     /* meanings of the following fields are the same as in the standard */
    739     int picture_coding_type;
    740     int f_code; /* pack all four fcode into this */
    741     union {
    742         struct {
    743             unsigned int intra_dc_precision		: 2;
    744             unsigned int picture_structure		: 2;
    745             unsigned int top_field_first		: 1;
    746             unsigned int frame_pred_frame_dct		: 1;
    747             unsigned int concealment_motion_vectors	: 1;
    748             unsigned int q_scale_type			: 1;
    749             unsigned int intra_vlc_format		: 1;
    750             unsigned int alternate_scan			: 1;
    751             unsigned int repeat_first_field		: 1;
    752             unsigned int progressive_frame		: 1;
    753             unsigned int is_first_field			: 1; /* indicate whether the current field
    754                                                               * is the first field for field picture
    755                                                               */
    756         } bits;
    757         unsigned int value;
    758     } picture_coding_extension;
    759 } VAPictureParameterBufferMPEG2;
    760 
    761 /* MPEG-2 Inverse Quantization Matrix Buffer */
    762 typedef struct _VAIQMatrixBufferMPEG2
    763 {
    764     int load_intra_quantiser_matrix;
    765     int load_non_intra_quantiser_matrix;
    766     int load_chroma_intra_quantiser_matrix;
    767     int load_chroma_non_intra_quantiser_matrix;
    768     unsigned char intra_quantiser_matrix[64];
    769     unsigned char non_intra_quantiser_matrix[64];
    770     unsigned char chroma_intra_quantiser_matrix[64];
    771     unsigned char chroma_non_intra_quantiser_matrix[64];
    772 } VAIQMatrixBufferMPEG2;
    773 
    774 /* MPEG-2 Slice Parameter Buffer */
    775 typedef struct _VASliceParameterBufferMPEG2
    776 {
    777     unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */
    778     unsigned int slice_data_offset;/* the offset to the first byte of slice data */
    779     unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
    780     unsigned int macroblock_offset;/* the offset to the first bit of MB from the first byte of slice data */
    781     unsigned int slice_horizontal_position;
    782     unsigned int slice_vertical_position;
    783     int quantiser_scale_code;
    784     int intra_slice_flag;
    785 } VASliceParameterBufferMPEG2;
    786 
    787 /* MPEG-2 Macroblock Parameter Buffer */
    788 typedef struct _VAMacroblockParameterBufferMPEG2
    789 {
    790     unsigned short macroblock_address;
    791     /*
    792      * macroblock_address (in raster scan order)
    793      * top-left: 0
    794      * bottom-right: picture-height-in-mb*picture-width-in-mb - 1
    795      */
    796     unsigned char macroblock_type;  /* see definition below */
    797     union {
    798         struct {
    799             unsigned int frame_motion_type		: 2;
    800             unsigned int field_motion_type		: 2;
    801             unsigned int dct_type			: 1;
    802         } bits;
    803         unsigned int value;
    804     } macroblock_modes;
    805     unsigned char motion_vertical_field_select;
    806     /*
    807      * motion_vertical_field_select:
    808      * see section 6.3.17.2 in the spec
    809      * only the lower 4 bits are used
    810      * bit 0: first vector forward
    811      * bit 1: first vector backward
    812      * bit 2: second vector forward
    813      * bit 3: second vector backward
    814      */
    815     short PMV[2][2][2]; /* see Table 7-7 in the spec */
    816     unsigned short coded_block_pattern;
    817     /*
    818      * The bitplanes for coded_block_pattern are described
    819      * in Figure 6.10-12 in the spec
    820      */
    821 
    822     /* Number of skipped macroblocks after this macroblock */
    823     unsigned short num_skipped_macroblocks;
    824 } VAMacroblockParameterBufferMPEG2;
    825 
    826 /*
    827  * OR'd flags for macroblock_type (section 6.3.17.1 in the spec)
    828  */
    829 #define VA_MB_TYPE_MOTION_FORWARD	0x02
    830 #define VA_MB_TYPE_MOTION_BACKWARD	0x04
    831 #define VA_MB_TYPE_MOTION_PATTERN	0x08
    832 #define VA_MB_TYPE_MOTION_INTRA		0x10
    833 
    834 /*
    835  * MPEG-2 Residual Data Buffer
    836  * For each macroblock, there wil be 64 shorts (16-bit) in the
    837  * residual data buffer
    838  */
    839 
    840 /****************************
    841  * MPEG-4 Part 2 data structures
    842  ****************************/
    843 
    844 /* MPEG-4 Picture Parameter Buffer */
    845 /*
    846  * For each frame or field, and before any slice data, a single
    847  * picture parameter buffer must be send.
    848  */
    849 typedef struct _VAPictureParameterBufferMPEG4
    850 {
    851     unsigned short vop_width;
    852     unsigned short vop_height;
    853     VASurfaceID forward_reference_picture;
    854     VASurfaceID backward_reference_picture;
    855     union {
    856         struct {
    857             unsigned int short_video_header		: 1;
    858             unsigned int chroma_format			: 2;
    859             unsigned int interlaced			: 1;
    860             unsigned int obmc_disable			: 1;
    861             unsigned int sprite_enable			: 2;
    862             unsigned int sprite_warping_accuracy	: 2;
    863             unsigned int quant_type			: 1;
    864             unsigned int quarter_sample			: 1;
    865             unsigned int data_partitioned		: 1;
    866             unsigned int reversible_vlc			: 1;
    867             unsigned int resync_marker_disable		: 1;
    868         } bits;
    869         unsigned int value;
    870     } vol_fields;
    871     unsigned char no_of_sprite_warping_points;
    872     short sprite_trajectory_du[3];
    873     short sprite_trajectory_dv[3];
    874     unsigned char quant_precision;
    875     union {
    876         struct {
    877             unsigned int vop_coding_type		: 2;
    878             unsigned int backward_reference_vop_coding_type	: 2;
    879             unsigned int vop_rounding_type		: 1;
    880             unsigned int intra_dc_vlc_thr		: 3;
    881             unsigned int top_field_first		: 1;
    882             unsigned int alternate_vertical_scan_flag	: 1;
    883         } bits;
    884         unsigned int value;
    885     } vop_fields;
    886     unsigned char vop_fcode_forward;
    887     unsigned char vop_fcode_backward;
    888     unsigned short vop_time_increment_resolution;
    889     /* short header related */
    890     unsigned char num_gobs_in_vop;
    891     unsigned char num_macroblocks_in_gob;
    892     /* for direct mode prediction */
    893     short TRB;
    894     short TRD;
    895 } VAPictureParameterBufferMPEG4;
    896 
    897 /* MPEG-4 Inverse Quantization Matrix Buffer */
    898 typedef struct _VAIQMatrixBufferMPEG4
    899 {
    900     int load_intra_quant_mat;
    901     int load_non_intra_quant_mat;
    902     unsigned char intra_quant_mat[64];
    903     unsigned char non_intra_quant_mat[64];
    904 } VAIQMatrixBufferMPEG4;
    905 
    906 /* MPEG-4 Slice Parameter Buffer */
    907 typedef struct _VASliceParameterBufferMPEG4
    908 {
    909     unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */
    910     unsigned int slice_data_offset;/* the offset to the first byte of slice data */
    911     unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
    912     unsigned int macroblock_offset;/* the offset to the first bit of MB from the first byte of slice data */
    913     unsigned int macroblock_number;
    914     int quant_scale;
    915 } VASliceParameterBufferMPEG4;
    916 
    917 /*
    918  VC-1 data structures
    919 */
    920 
    921 typedef enum   /* see 7.1.1.32 */
    922 {
    923     VAMvMode1Mv                        = 0,
    924     VAMvMode1MvHalfPel                 = 1,
    925     VAMvMode1MvHalfPelBilinear         = 2,
    926     VAMvModeMixedMv                    = 3,
    927     VAMvModeIntensityCompensation      = 4
    928 } VAMvModeVC1;
    929 
    930 /* VC-1 Picture Parameter Buffer */
    931 /*
    932  * For each picture, and before any slice data, a picture parameter
    933  * buffer must be send. Multiple picture parameter buffers may be
    934  * sent for a single picture. In that case picture parameters will
    935  * apply to all slice data that follow it until a new picture
    936  * parameter buffer is sent.
    937  *
    938  * Notes:
    939  *   pic_quantizer_type should be set to the applicable quantizer
    940  *   type as defined by QUANTIZER (J.1.19) and either
    941  *   PQUANTIZER (7.1.1.8) or PQINDEX (7.1.1.6)
    942  */
    943 typedef struct _VAPictureParameterBufferVC1
    944 {
    945     VASurfaceID forward_reference_picture;
    946     VASurfaceID backward_reference_picture;
    947     /* if out-of-loop post-processing is done on the render
    948        target, then we need to keep the in-loop decoded
    949        picture as a reference picture */
    950     VASurfaceID inloop_decoded_picture;
    951 
    952     /* sequence layer for AP or meta data for SP and MP */
    953     union {
    954         struct {
    955             unsigned int pulldown	: 1; /* SEQUENCE_LAYER::PULLDOWN */
    956             unsigned int interlace	: 1; /* SEQUENCE_LAYER::INTERLACE */
    957             unsigned int tfcntrflag	: 1; /* SEQUENCE_LAYER::TFCNTRFLAG */
    958             unsigned int finterpflag	: 1; /* SEQUENCE_LAYER::FINTERPFLAG */
    959             unsigned int psf		: 1; /* SEQUENCE_LAYER::PSF */
    960             unsigned int multires	: 1; /* METADATA::MULTIRES */
    961             unsigned int overlap	: 1; /* METADATA::OVERLAP */
    962             unsigned int syncmarker	: 1; /* METADATA::SYNCMARKER */
    963             unsigned int rangered	: 1; /* METADATA::RANGERED */
    964             unsigned int max_b_frames	: 3; /* METADATA::MAXBFRAMES */
    965             unsigned int profile	: 2; /* SEQUENCE_LAYER::PROFILE or The MSB of METADATA::PROFILE */
    966         } bits;
    967         unsigned int value;
    968     } sequence_fields;
    969 
    970     unsigned short coded_width;		/* ENTRY_POINT_LAYER::CODED_WIDTH */
    971     unsigned short coded_height;	/* ENTRY_POINT_LAYER::CODED_HEIGHT */
    972     union {
    973 	struct {
    974             unsigned int broken_link	: 1; /* ENTRY_POINT_LAYER::BROKEN_LINK */
    975             unsigned int closed_entry	: 1; /* ENTRY_POINT_LAYER::CLOSED_ENTRY */
    976             unsigned int panscan_flag	: 1; /* ENTRY_POINT_LAYER::PANSCAN_FLAG */
    977             unsigned int loopfilter	: 1; /* ENTRY_POINT_LAYER::LOOPFILTER */
    978 	} bits;
    979 	unsigned int value;
    980     } entrypoint_fields;
    981     unsigned char conditional_overlap_flag; /* ENTRY_POINT_LAYER::CONDOVER */
    982     unsigned char fast_uvmc_flag;	/* ENTRY_POINT_LAYER::FASTUVMC */
    983     union {
    984         struct {
    985             unsigned int luma_flag	: 1; /* ENTRY_POINT_LAYER::RANGE_MAPY_FLAG */
    986             unsigned int luma		: 3; /* ENTRY_POINT_LAYER::RANGE_MAPY */
    987             unsigned int chroma_flag	: 1; /* ENTRY_POINT_LAYER::RANGE_MAPUV_FLAG */
    988             unsigned int chroma		: 3; /* ENTRY_POINT_LAYER::RANGE_MAPUV */
    989         } bits;
    990         unsigned int value;
    991     } range_mapping_fields;
    992 
    993     unsigned char b_picture_fraction;	/* PICTURE_LAYER::BFRACTION */
    994     unsigned char cbp_table;		/* PICTURE_LAYER::CBPTAB/ICBPTAB */
    995     unsigned char mb_mode_table;	/* PICTURE_LAYER::MBMODETAB */
    996     unsigned char range_reduction_frame;/* PICTURE_LAYER::RANGEREDFRM */
    997     unsigned char rounding_control;	/* PICTURE_LAYER::RNDCTRL */
    998     unsigned char post_processing;	/* PICTURE_LAYER::POSTPROC */
    999     unsigned char picture_resolution_index;	/* PICTURE_LAYER::RESPIC */
   1000     unsigned char luma_scale;		/* PICTURE_LAYER::LUMSCALE */
   1001     unsigned char luma_shift;		/* PICTURE_LAYER::LUMSHIFT */
   1002     union {
   1003         struct {
   1004             unsigned int picture_type		: 3; /* PICTURE_LAYER::PTYPE */
   1005             unsigned int frame_coding_mode	: 3; /* PICTURE_LAYER::FCM */
   1006             unsigned int top_field_first	: 1; /* PICTURE_LAYER::TFF */
   1007             unsigned int is_first_field		: 1; /* set to 1 if it is the first field */
   1008             unsigned int intensity_compensation	: 1; /* PICTURE_LAYER::INTCOMP */
   1009         } bits;
   1010         unsigned int value;
   1011     } picture_fields;
   1012     union {
   1013         struct {
   1014             unsigned int mv_type_mb	: 1; 	/* PICTURE::MVTYPEMB */
   1015             unsigned int direct_mb	: 1; 	/* PICTURE::DIRECTMB */
   1016             unsigned int skip_mb	: 1; 	/* PICTURE::SKIPMB */
   1017             unsigned int field_tx	: 1; 	/* PICTURE::FIELDTX */
   1018             unsigned int forward_mb	: 1;	/* PICTURE::FORWARDMB */
   1019             unsigned int ac_pred	: 1;	/* PICTURE::ACPRED */
   1020             unsigned int overflags	: 1;	/* PICTURE::OVERFLAGS */
   1021         } flags;
   1022         unsigned int value;
   1023     } raw_coding;
   1024     union {
   1025         struct {
   1026             unsigned int bp_mv_type_mb   : 1;    /* PICTURE::MVTYPEMB */
   1027             unsigned int bp_direct_mb    : 1;    /* PICTURE::DIRECTMB */
   1028             unsigned int bp_skip_mb      : 1;    /* PICTURE::SKIPMB */
   1029             unsigned int bp_field_tx     : 1;    /* PICTURE::FIELDTX */
   1030             unsigned int bp_forward_mb   : 1;    /* PICTURE::FORWARDMB */
   1031             unsigned int bp_ac_pred      : 1;    /* PICTURE::ACPRED */
   1032             unsigned int bp_overflags    : 1;    /* PICTURE::OVERFLAGS */
   1033         } flags;
   1034         unsigned int value;
   1035     } bitplane_present; /* signal what bitplane is being passed via the bitplane buffer */
   1036     union {
   1037         struct {
   1038             unsigned int reference_distance_flag : 1;/* PICTURE_LAYER::REFDIST_FLAG */
   1039             unsigned int reference_distance	: 5;/* PICTURE_LAYER::REFDIST */
   1040             unsigned int num_reference_pictures: 1;/* PICTURE_LAYER::NUMREF */
   1041             unsigned int reference_field_pic_indicator	: 1;/* PICTURE_LAYER::REFFIELD */
   1042         } bits;
   1043         unsigned int value;
   1044     } reference_fields;
   1045     union {
   1046         struct {
   1047             unsigned int mv_mode		: 3; /* PICTURE_LAYER::MVMODE */
   1048             unsigned int mv_mode2		: 3; /* PICTURE_LAYER::MVMODE2 */
   1049             unsigned int mv_table		: 3; /* PICTURE_LAYER::MVTAB/IMVTAB */
   1050             unsigned int two_mv_block_pattern_table: 2; /* PICTURE_LAYER::2MVBPTAB */
   1051             unsigned int four_mv_switch		: 1; /* PICTURE_LAYER::4MVSWITCH */
   1052             unsigned int four_mv_block_pattern_table : 2; /* PICTURE_LAYER::4MVBPTAB */
   1053             unsigned int extended_mv_flag	: 1; /* ENTRY_POINT_LAYER::EXTENDED_MV */
   1054             unsigned int extended_mv_range	: 2; /* PICTURE_LAYER::MVRANGE */
   1055             unsigned int extended_dmv_flag	: 1; /* ENTRY_POINT_LAYER::EXTENDED_DMV */
   1056             unsigned int extended_dmv_range	: 2; /* PICTURE_LAYER::DMVRANGE */
   1057         } bits;
   1058         unsigned int value;
   1059     } mv_fields;
   1060     union {
   1061         struct {
   1062             unsigned int dquant	: 2; 	/* ENTRY_POINT_LAYER::DQUANT */
   1063             unsigned int quantizer     : 2; 	/* ENTRY_POINT_LAYER::QUANTIZER */
   1064             unsigned int half_qp	: 1; 	/* PICTURE_LAYER::HALFQP */
   1065             unsigned int pic_quantizer_scale : 5;/* PICTURE_LAYER::PQUANT */
   1066             unsigned int pic_quantizer_type : 1;/* PICTURE_LAYER::PQUANTIZER */
   1067             unsigned int dq_frame	: 1; 	/* VOPDQUANT::DQUANTFRM */
   1068             unsigned int dq_profile	: 2; 	/* VOPDQUANT::DQPROFILE */
   1069             unsigned int dq_sb_edge	: 2; 	/* VOPDQUANT::DQSBEDGE */
   1070             unsigned int dq_db_edge 	: 2; 	/* VOPDQUANT::DQDBEDGE */
   1071             unsigned int dq_binary_level : 1; 	/* VOPDQUANT::DQBILEVEL */
   1072             unsigned int alt_pic_quantizer : 5;/* VOPDQUANT::ALTPQUANT */
   1073         } bits;
   1074         unsigned int value;
   1075     } pic_quantizer_fields;
   1076     union {
   1077         struct {
   1078             unsigned int variable_sized_transform_flag	: 1;/* ENTRY_POINT_LAYER::VSTRANSFORM */
   1079             unsigned int mb_level_transform_type_flag	: 1;/* PICTURE_LAYER::TTMBF */
   1080             unsigned int frame_level_transform_type	: 2;/* PICTURE_LAYER::TTFRM */
   1081             unsigned int transform_ac_codingset_idx1	: 2;/* PICTURE_LAYER::TRANSACFRM */
   1082             unsigned int transform_ac_codingset_idx2	: 2;/* PICTURE_LAYER::TRANSACFRM2 */
   1083             unsigned int intra_transform_dc_table	: 1;/* PICTURE_LAYER::TRANSDCTAB */
   1084         } bits;
   1085         unsigned int value;
   1086     } transform_fields;
   1087 } VAPictureParameterBufferVC1;
   1088 
   1089 /* VC-1 Bitplane Buffer
   1090 There will be at most three bitplanes coded in any picture header. To send
   1091 the bitplane data more efficiently, each byte is divided in two nibbles, with
   1092 each nibble carrying three bitplanes for one macroblock.  The following table
   1093 shows the bitplane data arrangement within each nibble based on the picture
   1094 type.
   1095 
   1096 Picture Type	Bit3		Bit2		Bit1		Bit0
   1097 I or BI				OVERFLAGS	ACPRED		FIELDTX
   1098 P				MYTYPEMB	SKIPMB		DIRECTMB
   1099 B				FORWARDMB	SKIPMB		DIRECTMB
   1100 
   1101 Within each byte, the lower nibble is for the first MB and the upper nibble is
   1102 for the second MB.  E.g. the lower nibble of the first byte in the bitplane
   1103 buffer is for Macroblock #1 and the upper nibble of the first byte is for
   1104 Macroblock #2 in the first row.
   1105 */
   1106 
   1107 /* VC-1 Slice Parameter Buffer */
   1108 typedef struct _VASliceParameterBufferVC1
   1109 {
   1110     unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */
   1111     unsigned int slice_data_offset;/* the offset to the first byte of slice data */
   1112     unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
   1113     unsigned int macroblock_offset;/* the offset to the first bit of MB from the first byte of slice data */
   1114     unsigned int slice_vertical_position;
   1115 } VASliceParameterBufferVC1;
   1116 
   1117 /* VC-1 Slice Data Buffer */
   1118 /*
   1119 This is simplely a buffer containing raw bit-stream bytes
   1120 */
   1121 
   1122 /****************************
   1123  * H.264/AVC data structures
   1124  ****************************/
   1125 
   1126 typedef struct _VAPictureH264
   1127 {
   1128     VASurfaceID picture_id;
   1129     unsigned int frame_idx;
   1130     unsigned int flags;
   1131     signed int TopFieldOrderCnt;
   1132     signed int BottomFieldOrderCnt;
   1133 } VAPictureH264;
   1134 /* flags in VAPictureH264 could be OR of the following */
   1135 #define VA_PICTURE_H264_INVALID			0x00000001
   1136 #define VA_PICTURE_H264_TOP_FIELD		0x00000002
   1137 #define VA_PICTURE_H264_BOTTOM_FIELD		0x00000004
   1138 #define VA_PICTURE_H264_SHORT_TERM_REFERENCE	0x00000008
   1139 #define VA_PICTURE_H264_LONG_TERM_REFERENCE	0x00000010
   1140 
   1141 /* H.264 Picture Parameter Buffer */
   1142 /*
   1143  * For each picture, and before any slice data, a single
   1144  * picture parameter buffer must be send.
   1145  */
   1146 typedef struct _VAPictureParameterBufferH264
   1147 {
   1148     VAPictureH264 CurrPic;
   1149     VAPictureH264 ReferenceFrames[16];	/* in DPB */
   1150     unsigned short picture_width_in_mbs_minus1;
   1151     unsigned short picture_height_in_mbs_minus1;
   1152     unsigned char bit_depth_luma_minus8;
   1153     unsigned char bit_depth_chroma_minus8;
   1154     unsigned char num_ref_frames;
   1155     union {
   1156         struct {
   1157             unsigned int chroma_format_idc			: 2;
   1158             unsigned int residual_colour_transform_flag		: 1;
   1159             unsigned int gaps_in_frame_num_value_allowed_flag	: 1;
   1160             unsigned int frame_mbs_only_flag			: 1;
   1161             unsigned int mb_adaptive_frame_field_flag		: 1;
   1162             unsigned int direct_8x8_inference_flag		: 1;
   1163             unsigned int MinLumaBiPredSize8x8			: 1; /* see A.3.3.2 */
   1164             unsigned int log2_max_frame_num_minus4		: 4;
   1165             unsigned int pic_order_cnt_type			: 2;
   1166             unsigned int log2_max_pic_order_cnt_lsb_minus4	: 4;
   1167             unsigned int delta_pic_order_always_zero_flag	: 1;
   1168         } bits;
   1169         unsigned int value;
   1170     } seq_fields;
   1171     unsigned char num_slice_groups_minus1;
   1172     unsigned char slice_group_map_type;
   1173     unsigned short slice_group_change_rate_minus1;
   1174     signed char pic_init_qp_minus26;
   1175     signed char pic_init_qs_minus26;
   1176     signed char chroma_qp_index_offset;
   1177     signed char second_chroma_qp_index_offset;
   1178     union {
   1179         struct {
   1180             unsigned int entropy_coding_mode_flag	: 1;
   1181             unsigned int weighted_pred_flag		: 1;
   1182             unsigned int weighted_bipred_idc		: 2;
   1183             unsigned int transform_8x8_mode_flag	: 1;
   1184             unsigned int field_pic_flag			: 1;
   1185             unsigned int constrained_intra_pred_flag	: 1;
   1186             unsigned int pic_order_present_flag			: 1;
   1187             unsigned int deblocking_filter_control_present_flag : 1;
   1188             unsigned int redundant_pic_cnt_present_flag		: 1;
   1189             unsigned int reference_pic_flag			: 1; /* nal_ref_idc != 0 */
   1190         } bits;
   1191         unsigned int value;
   1192     } pic_fields;
   1193     unsigned short frame_num;
   1194 } VAPictureParameterBufferH264;
   1195 
   1196 /* H.264 Inverse Quantization Matrix Buffer */
   1197 typedef struct _VAIQMatrixBufferH264
   1198 {
   1199     unsigned char ScalingList4x4[6][16];
   1200     unsigned char ScalingList8x8[2][64];
   1201 } VAIQMatrixBufferH264;
   1202 
   1203 /*
   1204  * H.264 Slice Group Map Buffer
   1205  * When VAPictureParameterBufferH264::num_slice_group_minus1 is not equal to 0,
   1206  * A slice group map buffer should be sent for each picture if required. The buffer
   1207  * is sent only when there is a change in the mapping values.
   1208  * The slice group map buffer map "map units" to slice groups as specified in
   1209  * section 8.2.2 of the H.264 spec. The buffer will contain one byte for each macroblock
   1210  * in raster scan order
   1211  */
   1212 
   1213 /* H.264 Slice Parameter Buffer */
   1214 typedef struct _VASliceParameterBufferH264
   1215 {
   1216     unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */
   1217     /** \brief Byte offset to the NAL Header Unit for this slice. */
   1218     unsigned int slice_data_offset;
   1219     unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
   1220     /**
   1221      * \brief Bit offset from NAL Header Unit to the begining of slice_data().
   1222      *
   1223      * This bit offset is relative to and includes the NAL unit byte
   1224      * and represents the number of bits parsed in the slice_header()
   1225      * after the removal of any emulation prevention bytes in
   1226      * there. However, the slice data buffer passed to the hardware is
   1227      * the original bitstream, thus including any emulation prevention
   1228      * bytes.
   1229      */
   1230     unsigned short slice_data_bit_offset;
   1231     unsigned short first_mb_in_slice;
   1232     unsigned char slice_type;
   1233     unsigned char direct_spatial_mv_pred_flag;
   1234     unsigned char num_ref_idx_l0_active_minus1;
   1235     unsigned char num_ref_idx_l1_active_minus1;
   1236     unsigned char cabac_init_idc;
   1237     char slice_qp_delta;
   1238     unsigned char disable_deblocking_filter_idc;
   1239     char slice_alpha_c0_offset_div2;
   1240     char slice_beta_offset_div2;
   1241     VAPictureH264 RefPicList0[32];	/* See 8.2.4.2 */
   1242     VAPictureH264 RefPicList1[32];	/* See 8.2.4.2 */
   1243     unsigned char luma_log2_weight_denom;
   1244     unsigned char chroma_log2_weight_denom;
   1245     unsigned char luma_weight_l0_flag;
   1246     short luma_weight_l0[32];
   1247     short luma_offset_l0[32];
   1248     unsigned char chroma_weight_l0_flag;
   1249     short chroma_weight_l0[32][2];
   1250     short chroma_offset_l0[32][2];
   1251     unsigned char luma_weight_l1_flag;
   1252     short luma_weight_l1[32];
   1253     short luma_offset_l1[32];
   1254     unsigned char chroma_weight_l1_flag;
   1255     short chroma_weight_l1[32][2];
   1256     short chroma_offset_l1[32][2];
   1257 } VASliceParameterBufferH264;
   1258 
   1259 /****************************
   1260  * Common encode data structures
   1261  ****************************/
   1262 typedef enum
   1263 {
   1264     VAEncPictureTypeIntra		= 0,
   1265     VAEncPictureTypePredictive		= 1,
   1266     VAEncPictureTypeBidirectional	= 2,
   1267 } VAEncPictureType;
   1268 
   1269 /* Encode Slice Parameter Buffer */
   1270 typedef struct _VAEncSliceParameterBuffer
   1271 {
   1272     unsigned int start_row_number;	/* starting MB row number for this slice */
   1273     unsigned int slice_height;	/* slice height measured in MB */
   1274     union {
   1275         struct {
   1276             unsigned int is_intra	: 1;
   1277             unsigned int disable_deblocking_filter_idc : 2;
   1278             unsigned int uses_long_term_ref		:1;
   1279             unsigned int is_long_term_ref		:1;
   1280         } bits;
   1281         unsigned int value;
   1282     } slice_flags;
   1283 } VAEncSliceParameterBuffer;
   1284 
   1285 /****************************
   1286  * H.264 specific encode data structures
   1287  ****************************/
   1288 
   1289 typedef struct _VAEncSequenceParameterBufferH264
   1290 {
   1291     unsigned char seq_parameter_set_id;
   1292     unsigned char level_idc;
   1293     unsigned int intra_period;
   1294     unsigned int intra_idr_period;
   1295     unsigned int max_num_ref_frames;
   1296     unsigned int picture_width_in_mbs;
   1297     unsigned int picture_height_in_mbs;
   1298     unsigned int bits_per_second;
   1299     unsigned int frame_rate;
   1300     unsigned int initial_qp;
   1301     unsigned int min_qp;
   1302     unsigned int basic_unit_size;
   1303     unsigned char vui_flag;
   1304 } VAEncSequenceParameterBufferH264;
   1305 
   1306 #define H264_LAST_PICTURE_EOSEQ     0x01 /* the last picture in the sequence */
   1307 #define H264_LAST_PICTURE_EOSTREAM  0x02 /* the last picture in the stream */
   1308 typedef struct _VAEncPictureParameterBufferH264
   1309 {
   1310     VASurfaceID reference_picture;
   1311     VASurfaceID reconstructed_picture;
   1312     VABufferID coded_buf;
   1313     unsigned short picture_width;
   1314     unsigned short picture_height;
   1315     unsigned char last_picture;
   1316 } VAEncPictureParameterBufferH264;
   1317 
   1318 /****************************
   1319  * H.263 specific encode data structures
   1320  ****************************/
   1321 
   1322 typedef struct _VAEncSequenceParameterBufferH263
   1323 {
   1324     unsigned int intra_period;
   1325     unsigned int bits_per_second;
   1326     unsigned int frame_rate;
   1327     unsigned int initial_qp;
   1328     unsigned int min_qp;
   1329 } VAEncSequenceParameterBufferH263;
   1330 
   1331 typedef struct _VAEncPictureParameterBufferH263
   1332 {
   1333     VASurfaceID reference_picture;
   1334     VASurfaceID reconstructed_picture;
   1335     VABufferID coded_buf;
   1336     unsigned short picture_width;
   1337     unsigned short picture_height;
   1338     VAEncPictureType picture_type;
   1339 } VAEncPictureParameterBufferH263;
   1340 
   1341 /****************************
   1342  * MPEG-4 specific encode data structures
   1343  ****************************/
   1344 
   1345 typedef struct _VAEncSequenceParameterBufferMPEG4
   1346 {
   1347     unsigned char profile_and_level_indication;
   1348     unsigned int intra_period;
   1349     unsigned int video_object_layer_width;
   1350     unsigned int video_object_layer_height;
   1351     unsigned int vop_time_increment_resolution;
   1352     unsigned int fixed_vop_rate;
   1353     unsigned int fixed_vop_time_increment;
   1354     unsigned int bits_per_second;
   1355     unsigned int frame_rate;
   1356     unsigned int initial_qp;
   1357     unsigned int min_qp;
   1358 } VAEncSequenceParameterBufferMPEG4;
   1359 
   1360 typedef struct _VAEncPictureParameterBufferMPEG4
   1361 {
   1362     VASurfaceID reference_picture;
   1363     VASurfaceID reconstructed_picture;
   1364     VABufferID coded_buf;
   1365     unsigned short picture_width;
   1366     unsigned short picture_height;
   1367     unsigned int modulo_time_base; /* number of 1s */
   1368     unsigned int vop_time_increment;
   1369     VAEncPictureType picture_type;
   1370 } VAEncPictureParameterBufferMPEG4;
   1371 
   1372 
   1373 
   1374 /* Buffer functions */
   1375 
   1376 /*
   1377  * Creates a buffer for "num_elements" elements of "size" bytes and
   1378  * initalize with "data".
   1379  * if "data" is null, then the contents of the buffer data store
   1380  * are undefined.
   1381  * Basically there are two ways to get buffer data to the server side. One is
   1382  * to call vaCreateBuffer() with a non-null "data", which results the data being
   1383  * copied to the data store on the server side.  A different method that
   1384  * eliminates this copy is to pass null as "data" when calling vaCreateBuffer(),
   1385  * and then use vaMapBuffer() to map the data store from the server side to the
   1386  * client address space for access.
   1387  *  Note: image buffers are created by the library, not the client. Please see
   1388  *        vaCreateImage on how image buffers are managed.
   1389  */
   1390 VAStatus vaCreateBuffer (
   1391     VADisplay dpy,
   1392     VAContextID context,
   1393     VABufferType type,	/* in */
   1394     unsigned int size,	/* in */
   1395     unsigned int num_elements, /* in */
   1396     void *data,		/* in */
   1397     VABufferID *buf_id	/* out */
   1398 );
   1399 
   1400 /*
   1401  * Convey to the server how many valid elements are in the buffer.
   1402  * e.g. if multiple slice parameters are being held in a single buffer,
   1403  * this will communicate to the server the number of slice parameters
   1404  * that are valid in the buffer.
   1405  */
   1406 VAStatus vaBufferSetNumElements (
   1407     VADisplay dpy,
   1408     VABufferID buf_id,	/* in */
   1409     unsigned int num_elements /* in */
   1410 );
   1411 
   1412 
   1413 /*
   1414  * device independent data structure for codedbuffer
   1415  */
   1416 
   1417 /*
   1418  * FICTURE_AVE_QP(bit7-0): The average Qp value used during this frame
   1419  * LARGE_SLICE(bit8):At least one slice in the current frame was large
   1420  *              enough for the encoder to attempt to limit its size.
   1421  * SLICE_OVERFLOW(bit9): At least one slice in the current frame has
   1422  *              exceeded the maximum slice size specified.
   1423  * BITRATE_OVERFLOW(bit10): The peak bitrate was exceeded for this frame.
   1424  * BITRATE_HIGH(bit11): The frame size got within the safety margin of the maximum size (VCM only)
   1425  * AIR_MB_OVER_THRESHOLD: the number of MBs adapted to Intra MB
   1426  */
   1427 #define VA_CODED_BUF_STATUS_PICTURE_AVE_QP_MASK         0xff
   1428 #define VA_CODED_BUF_STATUS_LARGE_SLICE_MASK            0x100
   1429 #define VA_CODED_BUF_STATUS_SLICE_OVERFLOW_MASK         0x200
   1430 #define VA_CODED_BUF_STATUS_BITRATE_OVERFLOW		0x400
   1431 #define VA_CODED_BUF_STATUS_BITRATE_HIGH		0x800
   1432 #define VA_CODED_BUF_STATUS_AIR_MB_OVER_THRESHOLD	0xff0000
   1433 
   1434 /*
   1435  * device independent data structure for codedbuffer
   1436  */
   1437 typedef  struct _VACodedBufferSegment  {
   1438     unsigned int size;/* size of the data buffer in the coded buffer segment, in bytes */
   1439     unsigned int bit_offset; /* bit offset into the data buffer where valid bitstream data begins */
   1440     unsigned int status; /* status set by the driver on the coded buffer*/
   1441     unsigned int reserved; /* for future use */
   1442     void *buf; /* pointer to the beginning of the data buffer in the coded buffer segment */
   1443     void *next; /* pointer to the next VACodedBufferSegment */
   1444 } VACodedBufferSegment;
   1445 
   1446 /*
   1447  * Map data store of the buffer into the client's address space
   1448  * vaCreateBuffer() needs to be called with "data" set to NULL before
   1449  * calling vaMapBuffer()
   1450  *
   1451  * if buffer type is VAEncCodedBufferType, pbuf points to link-list of
   1452  * VACodedBufferSegment, and the list is terminated if "next" is NULL
   1453  */
   1454 VAStatus vaMapBuffer (
   1455     VADisplay dpy,
   1456     VABufferID buf_id,	/* in */
   1457     void **pbuf 	/* out */
   1458 );
   1459 
   1460 /*
   1461  * After client making changes to a mapped data store, it needs to
   1462  * "Unmap" it to let the server know that the data is ready to be
   1463  * consumed by the server
   1464  */
   1465 VAStatus vaUnmapBuffer (
   1466     VADisplay dpy,
   1467     VABufferID buf_id	/* in */
   1468 );
   1469 
   1470 /*
   1471  * After this call, the buffer is deleted and this buffer_id is no longer valid
   1472  * Only call this if the buffer is not going to be passed to vaRenderBuffer
   1473  */
   1474 VAStatus vaDestroyBuffer (
   1475     VADisplay dpy,
   1476     VABufferID buffer_id
   1477 );
   1478 
   1479 /*
   1480 Render (Decode) Pictures
   1481 
   1482 A picture represents either a frame or a field.
   1483 
   1484 The Begin/Render/End sequence sends the decode buffers to the server
   1485 */
   1486 
   1487 /*
   1488  * Get ready to decode a picture to a target surface
   1489  */
   1490 VAStatus vaBeginPicture (
   1491     VADisplay dpy,
   1492     VAContextID context,
   1493     VASurfaceID render_target
   1494 );
   1495 
   1496 /*
   1497  * Send decode buffers to the server.
   1498  * Buffers are automatically destroyed afterwards
   1499  */
   1500 VAStatus vaRenderPicture (
   1501     VADisplay dpy,
   1502     VAContextID context,
   1503     VABufferID *buffers,
   1504     int num_buffers
   1505 );
   1506 
   1507 /*
   1508  * Make the end of rendering for a picture.
   1509  * The server should start processing all pending operations for this
   1510  * surface. This call is non-blocking. The client can start another
   1511  * Begin/Render/End sequence on a different render target.
   1512  */
   1513 VAStatus vaEndPicture (
   1514     VADisplay dpy,
   1515     VAContextID context
   1516 );
   1517 
   1518 /*
   1519 
   1520 Synchronization
   1521 
   1522 */
   1523 
   1524 /*
   1525  * This function blocks until all pending operations on the render target
   1526  * have been completed.  Upon return it is safe to use the render target for a
   1527  * different picture.
   1528  */
   1529 VAStatus vaSyncSurface (
   1530     VADisplay dpy,
   1531     VASurfaceID render_target
   1532 );
   1533 
   1534 typedef enum
   1535 {
   1536     VASurfaceRendering	= 1, /* Rendering in progress */
   1537     VASurfaceDisplaying	= 2, /* Displaying in progress (not safe to render into it) */
   1538                              /* this status is useful if surface is used as the source */
   1539                              /* of an overlay */
   1540     VASurfaceReady	= 4, /* not being rendered or displayed */
   1541     VASurfaceSkipped	= 8  /* Indicate a skipped frame during encode */
   1542 } VASurfaceStatus;
   1543 
   1544 /*
   1545  * Find out any pending ops on the render target
   1546  */
   1547 VAStatus vaQuerySurfaceStatus (
   1548     VADisplay dpy,
   1549     VASurfaceID render_target,
   1550     VASurfaceStatus *status	/* out */
   1551 );
   1552 
   1553 typedef enum
   1554 {
   1555     VADecodeSliceMissing            = 0,
   1556     VADecodeMBError                 = 1,
   1557 } VADecodeErrorType;
   1558 
   1559 /*
   1560  * Client calls vaQuerySurfaceError with VA_STATUS_ERROR_DECODING_ERROR, server side returns
   1561  * an array of structure VASurfaceDecodeMBErrors, and the array is terminated by setting status=-1
   1562 */
   1563 typedef struct _VASurfaceDecodeMBErrors
   1564 {
   1565     int status; /* 1 if hardware has returned detailed info below, -1 means this record is invalid */
   1566     unsigned int start_mb; /* start mb address with errors */
   1567     unsigned int end_mb;  /* end mb address with errors */
   1568     VADecodeErrorType decode_error_type;
   1569 } VASurfaceDecodeMBErrors;
   1570 
   1571 /*
   1572  * After the application gets VA_STATUS_ERROR_DECODING_ERROR after calling vaSyncSurface(),
   1573  * it can call vaQuerySurfaceError to find out further details on the particular error.
   1574  * VA_STATUS_ERROR_DECODING_ERROR should be passed in as "error_status",
   1575  * upon the return, error_info will point to an array of _VASurfaceDecodeMBErrors structure,
   1576  * which is allocated and filled by libVA with detailed information on the missing or error macroblocks.
   1577  * The array is terminated if "status==-1" is detected.
   1578  */
   1579 VAStatus vaQuerySurfaceError(
   1580     VADisplay dpy,
   1581     VASurfaceID surface,
   1582     VAStatus error_status,
   1583     void **error_info
   1584 );
   1585 
   1586 /*
   1587  * Images and Subpictures
   1588  * VAImage is used to either get the surface data to client memory, or
   1589  * to copy image data in client memory to a surface.
   1590  * Both images, subpictures and surfaces follow the same 2D coordinate system where origin
   1591  * is at the upper left corner with positive X to the right and positive Y down
   1592  */
   1593 #define VA_FOURCC(ch0, ch1, ch2, ch3) \
   1594     ((unsigned long)(unsigned char) (ch0) | ((unsigned long)(unsigned char) (ch1) << 8) | \
   1595     ((unsigned long)(unsigned char) (ch2) << 16) | ((unsigned long)(unsigned char) (ch3) << 24 ))
   1596 
   1597 /* a few common FourCCs */
   1598 #define VA_FOURCC_NV12		0x3231564E
   1599 #define VA_FOURCC_AI44		0x34344149
   1600 #define VA_FOURCC_RGBA		0x41424752
   1601 #define VA_FOURCC_BGRA		0x41524742
   1602 #define VA_FOURCC_UYVY          0x59565955
   1603 #define VA_FOURCC_YUY2          0x32595559
   1604 #define VA_FOURCC_AYUV          0x56555941
   1605 #define VA_FOURCC_NV11          0x3131564e
   1606 #define VA_FOURCC_YV12          0x32315659
   1607 #define VA_FOURCC_P208          0x38303250
   1608 #define VA_FOURCC_IYUV          0x56555949
   1609 
   1610 /* byte order */
   1611 #define VA_LSB_FIRST		1
   1612 #define VA_MSB_FIRST		2
   1613 
   1614 typedef struct _VAImageFormat
   1615 {
   1616     unsigned int	fourcc;
   1617     unsigned int	byte_order; /* VA_LSB_FIRST, VA_MSB_FIRST */
   1618     unsigned int	bits_per_pixel;
   1619     /* for RGB formats */
   1620     unsigned int	depth; /* significant bits per pixel */
   1621     unsigned int	red_mask;
   1622     unsigned int	green_mask;
   1623     unsigned int	blue_mask;
   1624     unsigned int	alpha_mask;
   1625 } VAImageFormat;
   1626 
   1627 typedef VAGenericID VAImageID;
   1628 
   1629 typedef struct _VAImage
   1630 {
   1631     VAImageID		image_id; /* uniquely identify this image */
   1632     VAImageFormat	format;
   1633     VABufferID		buf;	/* image data buffer */
   1634     /*
   1635      * Image data will be stored in a buffer of type VAImageBufferType to facilitate
   1636      * data store on the server side for optimal performance. The buffer will be
   1637      * created by the CreateImage function, and proper storage allocated based on the image
   1638      * size and format. This buffer is managed by the library implementation, and
   1639      * accessed by the client through the buffer Map/Unmap functions.
   1640      */
   1641     unsigned short	width;
   1642     unsigned short	height;
   1643     unsigned int	data_size;
   1644     unsigned int	num_planes;	/* can not be greater than 3 */
   1645     /*
   1646      * An array indicating the scanline pitch in bytes for each plane.
   1647      * Each plane may have a different pitch. Maximum 3 planes for planar formats
   1648      */
   1649     unsigned int	pitches[3];
   1650     /*
   1651      * An array indicating the byte offset from the beginning of the image data
   1652      * to the start of each plane.
   1653      */
   1654     unsigned int	offsets[3];
   1655 
   1656     /* The following fields are only needed for paletted formats */
   1657     int num_palette_entries;   /* set to zero for non-palette images */
   1658     /*
   1659      * Each component is one byte and entry_bytes indicates the number of components in
   1660      * each entry (eg. 3 for YUV palette entries). set to zero for non-palette images
   1661      */
   1662     int entry_bytes;
   1663     /*
   1664      * An array of ascii characters describing the order of the components within the bytes.
   1665      * Only entry_bytes characters of the string are used.
   1666      */
   1667     char component_order[4];
   1668 } VAImage;
   1669 
   1670 /* Get maximum number of image formats supported by the implementation */
   1671 int vaMaxNumImageFormats (
   1672     VADisplay dpy
   1673 );
   1674 
   1675 /*
   1676  * Query supported image formats
   1677  * The caller must provide a "format_list" array that can hold at
   1678  * least vaMaxNumImageFormats() entries. The actual number of formats
   1679  * returned in "format_list" is returned in "num_formats".
   1680  */
   1681 VAStatus vaQueryImageFormats (
   1682     VADisplay dpy,
   1683     VAImageFormat *format_list,	/* out */
   1684     int *num_formats		/* out */
   1685 );
   1686 
   1687 /*
   1688  * Create a VAImage structure
   1689  * The width and height fields returned in the VAImage structure may get
   1690  * enlarged for some YUV formats. Upon return from this function,
   1691  * image->buf has been created and proper storage allocated by the library.
   1692  * The client can access the image through the Map/Unmap calls.
   1693  */
   1694 VAStatus vaCreateImage (
   1695     VADisplay dpy,
   1696     VAImageFormat *format,
   1697     int width,
   1698     int height,
   1699     VAImage *image	/* out */
   1700 );
   1701 
   1702 /*
   1703  * Should call DestroyImage before destroying the surface it is bound to
   1704  */
   1705 VAStatus vaDestroyImage (
   1706     VADisplay dpy,
   1707     VAImageID image
   1708 );
   1709 
   1710 VAStatus vaSetImagePalette (
   1711     VADisplay dpy,
   1712     VAImageID image,
   1713     /*
   1714      * pointer to an array holding the palette data.  The size of the array is
   1715      * num_palette_entries * entry_bytes in size.  The order of the components
   1716      * in the palette is described by the component_order in VAImage struct
   1717      */
   1718     unsigned char *palette
   1719 );
   1720 
   1721 /*
   1722  * Retrive surface data into a VAImage
   1723  * Image must be in a format supported by the implementation
   1724  */
   1725 VAStatus vaGetImage (
   1726     VADisplay dpy,
   1727     VASurfaceID surface,
   1728     int x,	/* coordinates of the upper left source pixel */
   1729     int y,
   1730     unsigned int width, /* width and height of the region */
   1731     unsigned int height,
   1732     VAImageID image
   1733 );
   1734 
   1735 /*
   1736  * Copy data from a VAImage to a surface
   1737  * Image must be in a format supported by the implementation
   1738  * Returns a VA_STATUS_ERROR_SURFACE_BUSY if the surface
   1739  * shouldn't be rendered into when this is called
   1740  */
   1741 VAStatus vaPutImage (
   1742     VADisplay dpy,
   1743     VASurfaceID surface,
   1744     VAImageID image,
   1745     int src_x,
   1746     int src_y,
   1747     unsigned int src_width,
   1748     unsigned int src_height,
   1749     int dest_x,
   1750     int dest_y,
   1751     unsigned int dest_width,
   1752     unsigned int dest_height
   1753 );
   1754 
   1755 /*
   1756  * Derive an VAImage from an existing surface.
   1757  * This interface will derive a VAImage and corresponding image buffer from
   1758  * an existing VA Surface. The image buffer can then be mapped/unmapped for
   1759  * direct CPU access. This operation is only possible on implementations with
   1760  * direct rendering capabilities and internal surface formats that can be
   1761  * represented with a VAImage. When the operation is not possible this interface
   1762  * will return VA_STATUS_ERROR_OPERATION_FAILED. Clients should then fall back
   1763  * to using vaCreateImage + vaPutImage to accomplish the same task in an
   1764  * indirect manner.
   1765  *
   1766  * Implementations should only return success when the resulting image buffer
   1767  * would be useable with vaMap/Unmap.
   1768  *
   1769  * When directly accessing a surface special care must be taken to insure
   1770  * proper synchronization with the graphics hardware. Clients should call
   1771  * vaQuerySurfaceStatus to insure that a surface is not the target of concurrent
   1772  * rendering or currently being displayed by an overlay.
   1773  *
   1774  * Additionally nothing about the contents of a surface should be assumed
   1775  * following a vaPutSurface. Implementations are free to modify the surface for
   1776  * scaling or subpicture blending within a call to vaPutImage.
   1777  *
   1778  * Calls to vaPutImage or vaGetImage using the same surface from which the image
   1779  * has been derived will return VA_STATUS_ERROR_SURFACE_BUSY. vaPutImage or
   1780  * vaGetImage with other surfaces is supported.
   1781  *
   1782  * An image created with vaDeriveImage should be freed with vaDestroyImage. The
   1783  * image and image buffer structures will be destroyed; however, the underlying
   1784  * surface will remain unchanged until freed with vaDestroySurfaces.
   1785  */
   1786 VAStatus vaDeriveImage (
   1787     VADisplay dpy,
   1788     VASurfaceID surface,
   1789     VAImage *image	/* out */
   1790 );
   1791 
   1792 /*
   1793  * Subpictures
   1794  * Subpicture is a special type of image that can be blended
   1795  * with a surface during vaPutSurface(). Subpicture can be used to render
   1796  * DVD sub-titles or closed captioning text etc.
   1797  */
   1798 
   1799 typedef VAGenericID VASubpictureID;
   1800 
   1801 /* Get maximum number of subpicture formats supported by the implementation */
   1802 int vaMaxNumSubpictureFormats (
   1803     VADisplay dpy
   1804 );
   1805 
   1806 /* flags for subpictures */
   1807 #define VA_SUBPICTURE_CHROMA_KEYING			0x0001
   1808 #define VA_SUBPICTURE_GLOBAL_ALPHA			0x0002
   1809 #define VA_SUBPICTURE_DESTINATION_IS_SCREEN_COORD	0x0004
   1810 /*
   1811  * Query supported subpicture formats
   1812  * The caller must provide a "format_list" array that can hold at
   1813  * least vaMaxNumSubpictureFormats() entries. The flags arrary holds the flag
   1814  * for each format to indicate additional capabilities for that format. The actual
   1815  * number of formats returned in "format_list" is returned in "num_formats".
   1816  *  flags: returned value to indicate addtional capabilities
   1817  *         VA_SUBPICTURE_CHROMA_KEYING - supports chroma-keying
   1818  *         VA_SUBPICTURE_GLOBAL_ALPHA - supports global alpha
   1819  * 	   VA_SUBPICTURE_DESTINATION_IS_SCREEN_COORD - supports unscaled screen relative subpictures for On Screen Display
   1820  */
   1821 
   1822 VAStatus vaQuerySubpictureFormats (
   1823     VADisplay dpy,
   1824     VAImageFormat *format_list,	/* out */
   1825     unsigned int *flags,	/* out */
   1826     unsigned int *num_formats	/* out */
   1827 );
   1828 
   1829 /*
   1830  * Subpictures are created with an image associated.
   1831  */
   1832 VAStatus vaCreateSubpicture (
   1833     VADisplay dpy,
   1834     VAImageID image,
   1835     VASubpictureID *subpicture	/* out */
   1836 );
   1837 
   1838 /*
   1839  * Destroy the subpicture before destroying the image it is assocated to
   1840  */
   1841 VAStatus vaDestroySubpicture (
   1842     VADisplay dpy,
   1843     VASubpictureID subpicture
   1844 );
   1845 
   1846 /*
   1847  * Bind an image to the subpicture. This image will now be associated with
   1848  * the subpicture instead of the one at creation.
   1849  */
   1850 VAStatus vaSetSubpictureImage (
   1851     VADisplay dpy,
   1852     VASubpictureID subpicture,
   1853     VAImageID image
   1854 );
   1855 
   1856 /*
   1857  * If chromakey is enabled, then the area where the source value falls within
   1858  * the chromakey [min, max] range is transparent
   1859  * The chromakey component format is the following:
   1860  *  For RGB: [0:7] Red [8:15] Blue [16:23] Green
   1861  *  For YUV: [0:7] V [8:15] U [16:23] Y
   1862  * The chromakey mask can be used to mask out certain components for chromakey
   1863  * comparision
   1864  */
   1865 VAStatus vaSetSubpictureChromakey (
   1866     VADisplay dpy,
   1867     VASubpictureID subpicture,
   1868     unsigned int chromakey_min,
   1869     unsigned int chromakey_max,
   1870     unsigned int chromakey_mask
   1871 );
   1872 
   1873 /*
   1874  * Global alpha value is between 0 and 1. A value of 1 means fully opaque and
   1875  * a value of 0 means fully transparent. If per-pixel alpha is also specified then
   1876  * the overall alpha is per-pixel alpha multiplied by the global alpha
   1877  */
   1878 VAStatus vaSetSubpictureGlobalAlpha (
   1879     VADisplay dpy,
   1880     VASubpictureID subpicture,
   1881     float global_alpha
   1882 );
   1883 
   1884 /*
   1885  * vaAssociateSubpicture associates the subpicture with target_surfaces.
   1886  * It defines the region mapping between the subpicture and the target
   1887  * surfaces through source and destination rectangles (with the same width and height).
   1888  * Both will be displayed at the next call to vaPutSurface.  Additional
   1889  * associations before the call to vaPutSurface simply overrides the association.
   1890  */
   1891 VAStatus vaAssociateSubpicture (
   1892     VADisplay dpy,
   1893     VASubpictureID subpicture,
   1894     VASurfaceID *target_surfaces,
   1895     int num_surfaces,
   1896     short src_x, /* upper left offset in subpicture */
   1897     short src_y,
   1898     unsigned short src_width,
   1899     unsigned short src_height,
   1900     short dest_x, /* upper left offset in surface */
   1901     short dest_y,
   1902     unsigned short dest_width,
   1903     unsigned short dest_height,
   1904     /*
   1905      * whether to enable chroma-keying, global-alpha, or screen relative mode
   1906      * see VA_SUBPICTURE_XXX values
   1907      */
   1908     unsigned int flags
   1909 );
   1910 
   1911 /*
   1912  * vaDeassociateSubpicture removes the association of the subpicture with target_surfaces.
   1913  */
   1914 VAStatus vaDeassociateSubpicture (
   1915     VADisplay dpy,
   1916     VASubpictureID subpicture,
   1917     VASurfaceID *target_surfaces,
   1918     int num_surfaces
   1919 );
   1920 
   1921 typedef struct _VARectangle
   1922 {
   1923     short x;
   1924     short y;
   1925     unsigned short width;
   1926     unsigned short height;
   1927 } VARectangle;
   1928 
   1929 /*
   1930  * Display attributes
   1931  * Display attributes are used to control things such as contrast, hue, saturation,
   1932  * brightness etc. in the rendering process.  The application can query what
   1933  * attributes are supported by the driver, and then set the appropriate attributes
   1934  * before calling vaPutSurface()
   1935  */
   1936 /* PowerVR IEP Lite attributes */
   1937 typedef enum
   1938 {
   1939     VADISPLAYATTRIB_BLE_OFF              = 0x00,
   1940     VADISPLAYATTRIB_BLE_LOW,
   1941     VADISPLAYATTRIB_BLE_MEDIUM,
   1942     VADISPLAYATTRIB_BLE_HIGH,
   1943     VADISPLAYATTRIB_BLE_NONE,
   1944 } VADisplayAttribBLEMode;
   1945 
   1946 /* attribute value for VADisplayAttribRotation   */
   1947 #define VA_ROTATION_NONE        0x00000000
   1948 #define VA_ROTATION_90          0x00000001
   1949 #define VA_ROTATION_180         0x00000002
   1950 #define VA_ROTATION_270         0x00000003
   1951 
   1952 /* attribute value for VADisplayAttribOutOfLoopDeblock */
   1953 #define VA_OOL_DEBLOCKING_FALSE 0x00000000
   1954 #define VA_OOL_DEBLOCKING_TRUE  0x00000001
   1955 
   1956 /* Render mode */
   1957 #define VA_RENDER_MODE_UNDEFINED           0
   1958 #define VA_RENDER_MODE_LOCAL_OVERLAY       1
   1959 #define VA_RENDER_MODE_LOCAL_GPU           2
   1960 #define VA_RENDER_MODE_EXTERNAL_OVERLAY    4
   1961 #define VA_RENDER_MODE_EXTERNAL_GPU        8
   1962 
   1963 /* Render device */
   1964 #define VA_RENDER_DEVICE_UNDEFINED  0
   1965 #define VA_RENDER_DEVICE_LOCAL      1
   1966 #define VA_RENDER_DEVICE_EXTERNAL   2
   1967 
   1968 /* Currently defined display attribute types */
   1969 typedef enum
   1970 {
   1971     VADisplayAttribBrightness		= 0,
   1972     VADisplayAttribContrast		= 1,
   1973     VADisplayAttribHue			= 2,
   1974     VADisplayAttribSaturation		= 3,
   1975     /* client can specifiy a background color for the target window
   1976      * the new feature of video conference,
   1977      * the uncovered area of the surface is filled by this color
   1978      * also it will blend with the decoded video color
   1979      */
   1980     VADisplayAttribBackgroundColor      = 4,
   1981     /*
   1982      * this is a gettable only attribute. For some implementations that use the
   1983      * hardware overlay, after PutSurface is called, the surface can not be
   1984      * re-used until after the subsequent PutSurface call. If this is the case
   1985      * then the value for this attribute will be set to 1 so that the client
   1986      * will not attempt to re-use the surface right after returning from a call
   1987      * to PutSurface.
   1988      *
   1989      * Don't use it, use flag VASurfaceDisplaying of vaQuerySurfaceStatus since
   1990      * driver may use overlay or GPU alternatively
   1991      */
   1992     VADisplayAttribDirectSurface       = 5,
   1993     VADisplayAttribRotation            = 6,
   1994     VADisplayAttribOutofLoopDeblock    = 7,
   1995 
   1996     /* PowerVR IEP Lite specific attributes */
   1997     VADisplayAttribBLEBlackMode        = 8,
   1998     VADisplayAttribBLEWhiteMode        = 9,
   1999     VADisplayAttribBlueStretch         = 10,
   2000     VADisplayAttribSkinColorCorrection = 11,
   2001     /*
   2002      * For type VADisplayAttribCSCMatrix, "value" field is a pointer to the color
   2003      * conversion matrix. Each element in the matrix is float-point
   2004      */
   2005     VADisplayAttribCSCMatrix           = 12,
   2006     /* specify the constant color used to blend with video surface
   2007      * Cd = Cv*Cc*Ac + Cb *(1 - Ac) C means the constant RGB
   2008      *      d: the final color to overwrite into the frame buffer
   2009      *      v: decoded video after color conversion,
   2010      *      c: video color specified by VADisplayAttribBlendColor
   2011      *      b: background color of the drawable
   2012      */
   2013     VADisplayAttribBlendColor          = 13,
   2014     /*
   2015      * Indicate driver to skip painting color key or not.
   2016      * only applicable if the render is overlay
   2017      */
   2018     VADisplayAttribOverlayAutoPaintColorKey   = 14,
   2019     /*
   2020      * customized overlay color key, the format is RGB888
   2021      * [23:16] = Red, [15:08] = Green, [07:00] = Blue.
   2022      */
   2023     VADisplayAttribOverlayColorKey	= 15,
   2024     /*
   2025      * The hint for the implementation of vaPutSurface
   2026      * normally, the driver could use an overlay or GPU to render the surface on the screen
   2027      * this flag provides APP the flexibity to switch the render dynamically
   2028      */
   2029     VADisplayAttribRenderMode           = 16,
   2030     /*
   2031      * specify if vaPutSurface needs to render into specified monitors
   2032      * one example is that one external monitor (e.g. HDMI) is enabled,
   2033      * but the window manager is not aware of it, and there is no associated drawable
   2034      */
   2035     VADisplayAttribRenderDevice        = 17,
   2036     /*
   2037      * specify vaPutSurface render area if there is no drawable on the monitor
   2038      */
   2039     VADisplayAttribRenderRect          = 18,
   2040 } VADisplayAttribType;
   2041 
   2042 /* flags for VADisplayAttribute */
   2043 #define VA_DISPLAY_ATTRIB_NOT_SUPPORTED	0x0000
   2044 #define VA_DISPLAY_ATTRIB_GETTABLE	0x0001
   2045 #define VA_DISPLAY_ATTRIB_SETTABLE	0x0002
   2046 
   2047 typedef struct _VADisplayAttribute
   2048 {
   2049     VADisplayAttribType type;
   2050     int min_value;
   2051     int max_value;
   2052     int value;	/* used by the set/get attribute functions */
   2053 /* flags can be VA_DISPLAY_ATTRIB_GETTABLE or VA_DISPLAY_ATTRIB_SETTABLE or OR'd together */
   2054     unsigned int flags;
   2055 } VADisplayAttribute;
   2056 
   2057 /* Get maximum number of display attributs supported by the implementation */
   2058 int vaMaxNumDisplayAttributes (
   2059     VADisplay dpy
   2060 );
   2061 
   2062 /*
   2063  * Query display attributes
   2064  * The caller must provide a "attr_list" array that can hold at
   2065  * least vaMaxNumDisplayAttributes() entries. The actual number of attributes
   2066  * returned in "attr_list" is returned in "num_attributes".
   2067  */
   2068 VAStatus vaQueryDisplayAttributes (
   2069     VADisplay dpy,
   2070     VADisplayAttribute *attr_list,	/* out */
   2071     int *num_attributes			/* out */
   2072 );
   2073 
   2074 /*
   2075  * Get display attributes
   2076  * This function returns the current attribute values in "attr_list".
   2077  * Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field
   2078  * from vaQueryDisplayAttributes() can have their values retrieved.
   2079  */
   2080 VAStatus vaGetDisplayAttributes (
   2081     VADisplay dpy,
   2082     VADisplayAttribute *attr_list,	/* in/out */
   2083     int num_attributes
   2084 );
   2085 
   2086 /*
   2087  * Set display attributes
   2088  * Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field
   2089  * from vaQueryDisplayAttributes() can be set.  If the attribute is not settable or
   2090  * the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED
   2091  */
   2092 VAStatus vaSetDisplayAttributes (
   2093     VADisplay dpy,
   2094     VADisplayAttribute *attr_list,
   2095     int num_attributes
   2096 );
   2097 
   2098 #ifdef __cplusplus
   2099 }
   2100 #endif
   2101 
   2102 #endif /* _VA_H_ */
   2103