OSDN Git Service

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