Added intra_idr_period for H264 encode
[platform/upstream/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  *                                      
61  * Acknowledgements:
62  *  Some concepts borrowed from XvMC and XvImage.
63  *  Waldo Bastian (Intel), Matt Sottek (Intel),  Austin Yuan (Intel), and Gwenole Beauchesne (SDS)
64  *  contributed to various aspects of the API.
65  */
66
67 #ifndef _VA_H_
68 #define _VA_H_
69
70 #include <va/va_version.h>
71
72 #ifdef __cplusplus
73 extern "C" {
74 #endif
75
76 /* 
77 Overview 
78
79 The VA API is intended to provide an interface between a video decode/encode/display
80 application (client) and a hardware accelerator (server), to off-load 
81 video decode/encode/display operations from the host to the hardware accelerator at various 
82 entry-points.
83
84 The basic operation steps are:
85
86 - Negotiate a mutually acceptable configuration with the server to lock
87   down profile, entrypoints, and other attributes that will not change on 
88   a frame-by-frame basis.
89 - Create a decode context which represents a "virtualized" hardware decode 
90   device
91 - Get and fill decode buffers with picture level, slice level and macroblock 
92   level data (depending on entrypoints)
93 - Pass the decode buffers to the server to decode the current frame
94
95 Initialization & Configuration Management 
96
97 - Find out supported profiles
98 - Find out entrypoints for a given profile
99 - Find out configuration attributes for a given profile/entrypoint pair
100 - Create a configuration for use by the decoder
101
102 */
103
104 typedef void* VADisplay;        /* window system dependent */
105
106 typedef int VAStatus;   /* Return status type from functions */
107 /* Values for the return status */
108 #define VA_STATUS_SUCCESS                       0x00000000
109 #define VA_STATUS_ERROR_OPERATION_FAILED        0x00000001
110 #define VA_STATUS_ERROR_ALLOCATION_FAILED       0x00000002
111 #define VA_STATUS_ERROR_INVALID_DISPLAY         0x00000003
112 #define VA_STATUS_ERROR_INVALID_CONFIG          0x00000004
113 #define VA_STATUS_ERROR_INVALID_CONTEXT         0x00000005
114 #define VA_STATUS_ERROR_INVALID_SURFACE         0x00000006
115 #define VA_STATUS_ERROR_INVALID_BUFFER          0x00000007
116 #define VA_STATUS_ERROR_INVALID_IMAGE           0x00000008
117 #define VA_STATUS_ERROR_INVALID_SUBPICTURE      0x00000009
118 #define VA_STATUS_ERROR_ATTR_NOT_SUPPORTED      0x0000000a
119 #define VA_STATUS_ERROR_MAX_NUM_EXCEEDED        0x0000000b
120 #define VA_STATUS_ERROR_UNSUPPORTED_PROFILE     0x0000000c
121 #define VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT  0x0000000d
122 #define VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT   0x0000000e
123 #define VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE  0x0000000f
124 #define VA_STATUS_ERROR_SURFACE_BUSY            0x00000010
125 #define VA_STATUS_ERROR_FLAG_NOT_SUPPORTED      0x00000011
126 #define VA_STATUS_ERROR_INVALID_PARAMETER       0x00000012
127 #define VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED 0x00000013
128 #define VA_STATUS_ERROR_UNIMPLEMENTED           0x00000014
129 #define VA_STATUS_ERROR_SURFACE_IN_DISPLAYING   0x00000015
130 #define VA_STATUS_ERROR_UNKNOWN                 0xFFFFFFFF
131
132 /* De-interlacing flags for vaPutSurface() */
133 #define VA_FRAME_PICTURE        0x00000000 
134 #define VA_TOP_FIELD            0x00000001
135 #define VA_BOTTOM_FIELD         0x00000002
136
137 /*
138  * Clears the drawable with background color.
139  * for hardware overlay based implementation this flag
140  * can be used to turn off the overlay
141  */
142 #define VA_CLEAR_DRAWABLE       0x00000008 
143
144 /* Color space conversion flags for vaPutSurface() */
145 #define VA_SRC_BT601            0x00000010
146 #define VA_SRC_BT709            0x00000020
147
148 /*
149  * Returns a short english description of error_status
150  */
151 const char *vaErrorStr(VAStatus error_status);
152
153 /*
154  * Initialization:
155  * A display must be obtained by calling vaGetDisplay() before calling
156  * vaInitialize() and other functions. This connects the API to the 
157  * native window system.
158  * For X Windows, native_dpy would be from XOpenDisplay()
159  */
160 typedef void* NativeDisplay;    /* window system dependent */
161
162 /*
163  * Initialize the library 
164  */
165 VAStatus vaInitialize (
166     VADisplay dpy,
167     int *major_version,  /* out */
168     int *minor_version   /* out */
169 );
170
171 /*
172  * After this call, all library internal resources will be cleaned up
173  */ 
174 VAStatus vaTerminate (
175     VADisplay dpy
176 );
177
178 /*
179  * vaQueryVendorString returns a pointer to a zero-terminated string
180  * describing some aspects of the VA implemenation on a specific    
181  * hardware accelerator. The format of the returned string is vendor
182  * specific and at the discretion of the implementer.
183  * e.g. for the Intel GMA500 implementation, an example would be:
184  * "Intel GMA500 - 2.0.0.32L.0005"
185  */
186 const char *vaQueryVendorString (
187     VADisplay dpy
188 );
189
190 typedef int (*VAPrivFunc)();
191
192 /*
193  * Return a function pointer given a function name in the library.
194  * This allows private interfaces into the library
195  */ 
196 VAPrivFunc vaGetLibFunc (
197     VADisplay dpy,
198     const char *func
199 );
200
201 /* Currently defined profiles */
202 typedef enum
203 {
204     VAProfileMPEG2Simple                = 0,
205     VAProfileMPEG2Main                  = 1,
206     VAProfileMPEG4Simple                = 2,
207     VAProfileMPEG4AdvancedSimple        = 3,
208     VAProfileMPEG4Main                  = 4,
209     VAProfileH264Baseline               = 5,
210     VAProfileH264Main                   = 6,
211     VAProfileH264High                   = 7,
212     VAProfileVC1Simple                  = 8,
213     VAProfileVC1Main                    = 9,
214     VAProfileVC1Advanced                = 10,
215     VAProfileH263Baseline               = 11,
216     VAProfileJPEGBaseline               = 12
217 } VAProfile;
218
219 /* 
220  *  Currently defined entrypoints 
221  */
222 typedef enum
223 {
224     VAEntrypointVLD             = 1,
225     VAEntrypointIZZ             = 2,
226     VAEntrypointIDCT            = 3,
227     VAEntrypointMoComp          = 4,
228     VAEntrypointDeblocking      = 5,
229     VAEntrypointEncSlice        = 6,    /* slice level encode */
230     VAEntrypointEncPicture      = 7     /* pictuer encode, JPEG, etc */
231 } VAEntrypoint;
232
233 /* Currently defined configuration attribute types */
234 typedef enum
235 {
236     VAConfigAttribRTFormat              = 0,
237     VAConfigAttribSpatialResidual       = 1,
238     VAConfigAttribSpatialClipping       = 2,
239     VAConfigAttribIntraResidual         = 3,
240     VAConfigAttribEncryption            = 4,
241     VAConfigAttribRateControl           = 5
242 } VAConfigAttribType;
243
244 /*
245  * Configuration attributes
246  * If there is more than one value for an attribute, a default
247  * value will be assigned to the attribute if the client does not
248  * specify the attribute when creating a configuration
249  */
250 typedef struct _VAConfigAttrib {
251     VAConfigAttribType type;
252     unsigned int value; /* OR'd flags (bits) for this attribute */
253 } VAConfigAttrib;
254
255 /* attribute value for VAConfigAttribRTFormat */
256 #define VA_RT_FORMAT_YUV420     0x00000001      
257 #define VA_RT_FORMAT_YUV422     0x00000002
258 #define VA_RT_FORMAT_YUV444     0x00000004
259 #define VA_RT_FORMAT_PROTECTED  0x80000000
260
261 /* attribute value for VAConfigAttribRateControl */
262 #define VA_RC_NONE      0x00000001      
263 #define VA_RC_CBR       0x00000002      
264 #define VA_RC_VBR       0x00000004      
265
266 /*
267  * if an attribute is not applicable for a given
268  * profile/entrypoint pair, then set the value to the following 
269  */
270 #define VA_ATTRIB_NOT_SUPPORTED 0x80000000
271
272 /* Get maximum number of profiles supported by the implementation */
273 int vaMaxNumProfiles (
274     VADisplay dpy
275 );
276
277 /* Get maximum number of entrypoints supported by the implementation */
278 int vaMaxNumEntrypoints (
279     VADisplay dpy
280 );
281
282 /* Get maximum number of attributs supported by the implementation */
283 int vaMaxNumConfigAttributes (
284     VADisplay dpy
285 );
286
287 /* 
288  * Query supported profiles 
289  * The caller must provide a "profile_list" array that can hold at
290  * least vaMaxNumProfile() entries. The actual number of profiles
291  * returned in "profile_list" is returned in "num_profile".
292  */
293 VAStatus vaQueryConfigProfiles (
294     VADisplay dpy,
295     VAProfile *profile_list,    /* out */
296     int *num_profiles           /* out */
297 );
298
299 /* 
300  * Query supported entrypoints for a given profile 
301  * The caller must provide an "entrypoint_list" array that can hold at
302  * least vaMaxNumEntrypoints() entries. The actual number of entrypoints 
303  * returned in "entrypoint_list" is returned in "num_entrypoints".
304  */
305 VAStatus vaQueryConfigEntrypoints (
306     VADisplay dpy,
307     VAProfile profile,
308     VAEntrypoint *entrypoint_list,      /* out */
309     int *num_entrypoints                /* out */
310 );
311
312 /* 
313  * Get attributes for a given profile/entrypoint pair 
314  * The caller must provide an "attrib_list" with all attributes to be 
315  * retrieved.  Upon return, the attributes in "attrib_list" have been 
316  * updated with their value.  Unknown attributes or attributes that are 
317  * not supported for the given profile/entrypoint pair will have their 
318  * value set to VA_ATTRIB_NOT_SUPPORTED
319  */
320 VAStatus vaGetConfigAttributes (
321     VADisplay dpy,
322     VAProfile profile,
323     VAEntrypoint entrypoint,
324     VAConfigAttrib *attrib_list, /* in/out */
325     int num_attribs
326 );
327
328 /* Generic ID type, can be re-typed for specific implementation */
329 typedef unsigned int VAGenericID;
330
331 typedef VAGenericID VAConfigID;
332
333 /* 
334  * Create a configuration for the decode pipeline 
335  * it passes in the attribute list that specifies the attributes it cares 
336  * about, with the rest taking default values.  
337  */
338 VAStatus vaCreateConfig (
339     VADisplay dpy,
340     VAProfile profile, 
341     VAEntrypoint entrypoint, 
342     VAConfigAttrib *attrib_list,
343     int num_attribs,
344     VAConfigID *config_id /* out */
345 );
346
347 /* 
348  * Free resources associdated with a given config 
349  */
350 VAStatus vaDestroyConfig (
351     VADisplay dpy,
352     VAConfigID config_id
353 );
354
355 /* 
356  * Query all attributes for a given configuration 
357  * The profile of the configuration is returned in "profile"
358  * The entrypoint of the configuration is returned in "entrypoint"
359  * The caller must provide an "attrib_list" array that can hold at least 
360  * vaMaxNumConfigAttributes() entries. The actual number of attributes 
361  * returned in "attrib_list" is returned in "num_attribs"
362  */
363 VAStatus vaQueryConfigAttributes (
364     VADisplay dpy,
365     VAConfigID config_id, 
366     VAProfile *profile,         /* out */
367     VAEntrypoint *entrypoint,   /* out */
368     VAConfigAttrib *attrib_list,/* out */
369     int *num_attribs            /* out */
370 );
371
372
373 /*
374  * Contexts and Surfaces
375  *
376  * Context represents a "virtual" video decode pipeline. Surfaces are render 
377  * targets for a given context. The data in the surfaces are not accessible  
378  * to the client and the internal data format of the surface is implementatin 
379  * specific. 
380  *
381  * Surfaces will be bound to a context when the context is created. Once
382  * a surface is bound to a given context, it can not be used to create  
383  * another context. The association is removed when the context is destroyed
384  * 
385  * Both contexts and surfaces are identified by unique IDs and its
386  * implementation specific internals are kept opaque to the clients
387  */
388
389 typedef VAGenericID VAContextID;
390
391 typedef VAGenericID VASurfaceID;
392
393 #define VA_INVALID_ID           0xffffffff
394 #define VA_INVALID_SURFACE      VA_INVALID_ID
395
396 /* 
397  * vaCreateSurfaces - Create an array of surfaces used for decode and display  
398  *  dpy: display
399  *  width: surface width
400  *  height: surface height
401  *  format: VA_RT_FORMAT_YUV420, VA_RT_FORMAT_YUV422 or VA_RT_FORMAT_YUV444
402  *  num_surfaces: number of surfaces to be created
403  *  surfaces: array of surfaces created upon return
404  */
405 VAStatus vaCreateSurfaces (
406     VADisplay dpy,
407     int width,
408     int height,
409     int format,
410     int num_surfaces,
411     VASurfaceID *surfaces       /* out */
412 );
413
414     
415 /*
416  * vaDestroySurfaces - Destroy resources associated with surfaces. 
417  *  Surfaces can only be destroyed after the context associated has been 
418  *  destroyed.  
419  *  dpy: display
420  *  surfaces: array of surfaces to destroy
421  *  num_surfaces: number of surfaces in the array to be destroyed.
422  */
423 VAStatus vaDestroySurfaces (
424     VADisplay dpy,
425     VASurfaceID *surfaces,
426     int num_surfaces
427 );
428
429 #define VA_PROGRESSIVE 0x1
430 /*
431  * vaCreateContext - Create a context
432  *  dpy: display
433  *  config_id: configuration for the context
434  *  picture_width: coded picture width
435  *  picture_height: coded picture height
436  *  flag: any combination of the following:
437  *    VA_PROGRESSIVE (only progressive frame pictures in the sequence when set)
438  *  render_targets: render targets (surfaces) tied to the context
439  *  num_render_targets: number of render targets in the above array
440  *  context: created context id upon return
441  */
442 VAStatus vaCreateContext (
443     VADisplay dpy,
444     VAConfigID config_id,
445     int picture_width,
446     int picture_height,
447     int flag,
448     VASurfaceID *render_targets,
449     int num_render_targets,
450     VAContextID *context                /* out */
451 );
452
453 /*
454  * vaDestroyContext - Destroy a context 
455  *  dpy: display
456  *  context: context to be destroyed
457  */
458 VAStatus vaDestroyContext (
459     VADisplay dpy,
460     VAContextID context
461 );
462
463 /*
464  * Buffers 
465  * Buffers are used to pass various types of data from the
466  * client to the server. The server maintains a data store
467  * for each buffer created, and the client idenfies a buffer
468  * through a unique buffer id assigned by the server.
469  */
470
471 typedef VAGenericID VABufferID;
472
473 typedef enum
474 {
475     VAPictureParameterBufferType        = 0,
476     VAIQMatrixBufferType                = 1,
477     VABitPlaneBufferType                = 2,
478     VASliceGroupMapBufferType           = 3,
479     VASliceParameterBufferType          = 4,
480     VASliceDataBufferType               = 5,
481     VAMacroblockParameterBufferType     = 6,
482     VAResidualDataBufferType            = 7,
483     VADeblockingParameterBufferType     = 8,
484     VAImageBufferType                   = 9,
485     VAProtectedSliceDataBufferType      = 10,
486     VAQMatrixBufferType                 = 11,
487 /* Following are encode buffer types */
488     VAEncCodedBufferType                = 21,
489     VAEncSequenceParameterBufferType    = 22,
490     VAEncPictureParameterBufferType     = 23,
491     VAEncSliceParameterBufferType       = 24,
492     VAEncH264VUIBufferType              = 25,
493     VAEncH264SEIBufferType              = 26,
494 } VABufferType;
495
496
497 /* 
498  * There will be cases where the bitstream buffer will not have enough room to hold
499  * the data for the entire slice, and the following flags will be used in the slice
500  * parameter to signal to the server for the possible cases.
501  * If a slice parameter buffer and slice data buffer pair is sent to the server with 
502  * the slice data partially in the slice data buffer (BEGIN and MIDDLE cases below), 
503  * then a slice parameter and data buffer needs to be sent again to complete this slice. 
504  */
505 #define VA_SLICE_DATA_FLAG_ALL          0x00    /* whole slice is in the buffer */
506 #define VA_SLICE_DATA_FLAG_BEGIN        0x01    /* The beginning of the slice is in the buffer but the end if not */
507 #define VA_SLICE_DATA_FLAG_MIDDLE       0x02    /* Neither beginning nor end of the slice is in the buffer */
508 #define VA_SLICE_DATA_FLAG_END          0x04    /* end of the slice is in the buffer */
509
510 /* Codec-independent Slice Parameter Buffer base */
511 typedef struct _VASliceParameterBufferBase
512 {
513     unsigned int slice_data_size;       /* number of bytes in the slice data buffer for this slice */
514     unsigned int slice_data_offset;     /* the offset to the first byte of slice data */
515     unsigned int slice_data_flag;       /* see VA_SLICE_DATA_FLAG_XXX definitions */
516 } VASliceParameterBufferBase;
517
518
519 /****************************
520  * JEPG data structure
521  ***************************/
522 typedef struct _VAQMatrixBufferJPEG
523 {
524     int load_lum_quantiser_matrix;
525     int load_chroma_quantiser_matrix;
526     unsigned char lum_quantiser_matrix[64];
527     unsigned char chroma_quantiser_matrix[64];
528 } VAQMatrixBufferJPEG;
529
530 typedef struct _VAEncPictureParameterBufferJPEG
531 {
532     VASurfaceID reconstructed_picture;
533     unsigned short picture_width;
534     unsigned short picture_height;
535     VABufferID coded_buf;
536 } VAEncPictureParameterBufferJPEG;
537
538
539 /****************************
540  * MPEG-2 data structures
541  ****************************/
542  
543 /* MPEG-2 Picture Parameter Buffer */
544 /* 
545  * For each frame or field, and before any slice data, a single
546  * picture parameter buffer must be send.
547  */
548 typedef struct _VAPictureParameterBufferMPEG2
549 {
550     unsigned short horizontal_size;
551     unsigned short vertical_size;
552     VASurfaceID forward_reference_picture;
553     VASurfaceID backward_reference_picture;
554     /* meanings of the following fields are the same as in the standard */
555     int picture_coding_type;
556     int f_code; /* pack all four fcode into this */
557     union {
558         struct {
559             unsigned int intra_dc_precision             : 2; 
560             unsigned int picture_structure              : 2; 
561             unsigned int top_field_first                : 1; 
562             unsigned int frame_pred_frame_dct           : 1; 
563             unsigned int concealment_motion_vectors     : 1;
564             unsigned int q_scale_type                   : 1;
565             unsigned int intra_vlc_format               : 1;
566             unsigned int alternate_scan                 : 1;
567             unsigned int repeat_first_field             : 1;
568             unsigned int progressive_frame              : 1;
569             unsigned int is_first_field                 : 1; /* indicate whether the current field
570                                                               * is the first field for field picture
571                                                               */
572         } bits;
573         unsigned int value;
574     } picture_coding_extension;
575 } VAPictureParameterBufferMPEG2;
576
577 /* MPEG-2 Inverse Quantization Matrix Buffer */
578 typedef struct _VAIQMatrixBufferMPEG2
579 {
580     int load_intra_quantiser_matrix;
581     int load_non_intra_quantiser_matrix;
582     int load_chroma_intra_quantiser_matrix;
583     int load_chroma_non_intra_quantiser_matrix;
584     unsigned char intra_quantiser_matrix[64];
585     unsigned char non_intra_quantiser_matrix[64];
586     unsigned char chroma_intra_quantiser_matrix[64];
587     unsigned char chroma_non_intra_quantiser_matrix[64];
588 } VAIQMatrixBufferMPEG2;
589
590 /* MPEG-2 Slice Parameter Buffer */
591 typedef struct _VASliceParameterBufferMPEG2
592 {
593     unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */
594     unsigned int slice_data_offset;/* the offset to the first byte of slice data */
595     unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
596     unsigned int macroblock_offset;/* the offset to the first bit of MB from the first byte of slice data */
597     unsigned int slice_horizontal_position;
598     unsigned int slice_vertical_position;
599     int quantiser_scale_code;
600     int intra_slice_flag;
601 } VASliceParameterBufferMPEG2;
602
603 /* MPEG-2 Macroblock Parameter Buffer */
604 typedef struct _VAMacroblockParameterBufferMPEG2
605 {
606     unsigned short macroblock_address;
607     /* 
608      * macroblock_address (in raster scan order)
609      * top-left: 0
610      * bottom-right: picture-height-in-mb*picture-width-in-mb - 1
611      */
612     unsigned char macroblock_type;  /* see definition below */
613     union {
614         struct {
615             unsigned int frame_motion_type              : 2; 
616             unsigned int field_motion_type              : 2; 
617             unsigned int dct_type                       : 1; 
618         } bits;
619         unsigned int value;
620     } macroblock_modes;
621     unsigned char motion_vertical_field_select; 
622     /* 
623      * motion_vertical_field_select:
624      * see section 6.3.17.2 in the spec
625      * only the lower 4 bits are used
626      * bit 0: first vector forward
627      * bit 1: first vector backward
628      * bit 2: second vector forward
629      * bit 3: second vector backward
630      */
631     short PMV[2][2][2]; /* see Table 7-7 in the spec */
632     unsigned short coded_block_pattern;
633     /* 
634      * The bitplanes for coded_block_pattern are described 
635      * in Figure 6.10-12 in the spec
636      */
637      
638     /* Number of skipped macroblocks after this macroblock */
639     unsigned short num_skipped_macroblocks;
640 } VAMacroblockParameterBufferMPEG2;
641
642 /* 
643  * OR'd flags for macroblock_type (section 6.3.17.1 in the spec)
644  */
645 #define VA_MB_TYPE_MOTION_FORWARD       0x02
646 #define VA_MB_TYPE_MOTION_BACKWARD      0x04
647 #define VA_MB_TYPE_MOTION_PATTERN       0x08
648 #define VA_MB_TYPE_MOTION_INTRA         0x10
649
650 /* 
651  * MPEG-2 Residual Data Buffer 
652  * For each macroblock, there wil be 64 shorts (16-bit) in the 
653  * residual data buffer
654  */
655
656 /****************************
657  * MPEG-4 Part 2 data structures
658  ****************************/
659  
660 /* MPEG-4 Picture Parameter Buffer */
661 /* 
662  * For each frame or field, and before any slice data, a single
663  * picture parameter buffer must be send.
664  */
665 typedef struct _VAPictureParameterBufferMPEG4
666 {
667     unsigned short vop_width;
668     unsigned short vop_height;
669     VASurfaceID forward_reference_picture;
670     VASurfaceID backward_reference_picture;
671     union {
672         struct {
673             unsigned int short_video_header             : 1; 
674             unsigned int chroma_format                  : 2; 
675             unsigned int interlaced                     : 1; 
676             unsigned int obmc_disable                   : 1; 
677             unsigned int sprite_enable                  : 2; 
678             unsigned int sprite_warping_accuracy        : 2; 
679             unsigned int quant_type                     : 1; 
680             unsigned int quarter_sample                 : 1; 
681             unsigned int data_partitioned               : 1; 
682             unsigned int reversible_vlc                 : 1; 
683             unsigned int resync_marker_disable          : 1; 
684         } bits;
685         unsigned int value;
686     } vol_fields;
687     unsigned char no_of_sprite_warping_points;
688     short sprite_trajectory_du[3];
689     short sprite_trajectory_dv[3];
690     unsigned char quant_precision;
691     union {
692         struct {
693             unsigned int vop_coding_type                : 2; 
694             unsigned int backward_reference_vop_coding_type     : 2; 
695             unsigned int vop_rounding_type              : 1; 
696             unsigned int intra_dc_vlc_thr               : 3; 
697             unsigned int top_field_first                : 1; 
698             unsigned int alternate_vertical_scan_flag   : 1; 
699         } bits;
700         unsigned int value;
701     } vop_fields;
702     unsigned char vop_fcode_forward;
703     unsigned char vop_fcode_backward;
704     unsigned short vop_time_increment_resolution;
705     /* short header related */
706     unsigned char num_gobs_in_vop;
707     unsigned char num_macroblocks_in_gob;
708     /* for direct mode prediction */
709     short TRB;
710     short TRD;
711 } VAPictureParameterBufferMPEG4;
712
713 /* MPEG-4 Inverse Quantization Matrix Buffer */
714 typedef struct _VAIQMatrixBufferMPEG4
715 {
716     int load_intra_quant_mat;
717     int load_non_intra_quant_mat;
718     unsigned char intra_quant_mat[64];
719     unsigned char non_intra_quant_mat[64];
720 } VAIQMatrixBufferMPEG4;
721
722 /* MPEG-4 Slice Parameter Buffer */
723 typedef struct _VASliceParameterBufferMPEG4
724 {
725     unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */
726     unsigned int slice_data_offset;/* the offset to the first byte of slice data */
727     unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
728     unsigned int macroblock_offset;/* the offset to the first bit of MB from the first byte of slice data */
729     unsigned int macroblock_number;
730     int quant_scale;
731 } VASliceParameterBufferMPEG4;
732
733 /*
734  VC-1 data structures
735 */
736
737 typedef enum   /* see 7.1.1.32 */
738 {
739     VAMvMode1Mv                        = 0,
740     VAMvMode1MvHalfPel                 = 1,
741     VAMvMode1MvHalfPelBilinear         = 2,
742     VAMvModeMixedMv                    = 3,
743     VAMvModeIntensityCompensation      = 4 
744 } VAMvModeVC1;
745
746 /* VC-1 Picture Parameter Buffer */
747 /* 
748  * For each picture, and before any slice data, a picture parameter
749  * buffer must be send. Multiple picture parameter buffers may be
750  * sent for a single picture. In that case picture parameters will
751  * apply to all slice data that follow it until a new picture
752  * parameter buffer is sent.
753  *
754  * Notes:
755  *   pic_quantizer_type should be set to the applicable quantizer
756  *   type as defined by QUANTIZER (J.1.19) and either
757  *   PQUANTIZER (7.1.1.8) or PQINDEX (7.1.1.6)
758  */
759 typedef struct _VAPictureParameterBufferVC1
760 {
761     VASurfaceID forward_reference_picture;
762     VASurfaceID backward_reference_picture;
763     /* if out-of-loop post-processing is done on the render
764        target, then we need to keep the in-loop decoded 
765        picture as a reference picture */
766     VASurfaceID inloop_decoded_picture;
767
768     /* sequence layer for AP or meta data for SP and MP */
769     union {
770         struct {
771             unsigned int pulldown       : 1; /* SEQUENCE_LAYER::PULLDOWN */
772             unsigned int interlace      : 1; /* SEQUENCE_LAYER::INTERLACE */
773             unsigned int tfcntrflag     : 1; /* SEQUENCE_LAYER::TFCNTRFLAG */
774             unsigned int finterpflag    : 1; /* SEQUENCE_LAYER::FINTERPFLAG */
775             unsigned int psf            : 1; /* SEQUENCE_LAYER::PSF */
776             unsigned int multires       : 1; /* METADATA::MULTIRES */
777             unsigned int overlap        : 1; /* METADATA::OVERLAP */
778             unsigned int syncmarker     : 1; /* METADATA::SYNCMARKER */
779             unsigned int rangered       : 1; /* METADATA::RANGERED */
780             unsigned int max_b_frames   : 3; /* METADATA::MAXBFRAMES */
781         } bits;
782         unsigned int value;
783     } sequence_fields;
784
785     unsigned short coded_width;         /* ENTRY_POINT_LAYER::CODED_WIDTH */
786     unsigned short coded_height;        /* ENTRY_POINT_LAYER::CODED_HEIGHT */
787     union {
788         struct {
789             unsigned int broken_link    : 1; /* ENTRY_POINT_LAYER::BROKEN_LINK */
790             unsigned int closed_entry   : 1; /* ENTRY_POINT_LAYER::CLOSED_ENTRY */
791             unsigned int panscan_flag   : 1; /* ENTRY_POINT_LAYER::PANSCAN_FLAG */
792             unsigned int loopfilter     : 1; /* ENTRY_POINT_LAYER::LOOPFILTER */
793         } bits;
794         unsigned int value;
795     } entrypoint_fields;
796     unsigned char conditional_overlap_flag; /* ENTRY_POINT_LAYER::CONDOVER */
797     unsigned char fast_uvmc_flag;       /* ENTRY_POINT_LAYER::FASTUVMC */
798     union {
799         struct {
800             unsigned int luma_flag      : 1; /* ENTRY_POINT_LAYER::RANGE_MAPY_FLAG */
801             unsigned int luma           : 3; /* ENTRY_POINT_LAYER::RANGE_MAPY */
802             unsigned int chroma_flag    : 1; /* ENTRY_POINT_LAYER::RANGE_MAPUV_FLAG */
803             unsigned int chroma         : 3; /* ENTRY_POINT_LAYER::RANGE_MAPUV */
804         } bits;
805         unsigned int value;
806     } range_mapping_fields;
807
808     unsigned char b_picture_fraction;   /* PICTURE_LAYER::BFRACTION */
809     unsigned char cbp_table;            /* PICTURE_LAYER::CBPTAB/ICBPTAB */
810     unsigned char mb_mode_table;        /* PICTURE_LAYER::MBMODETAB */
811     unsigned char range_reduction_frame;/* PICTURE_LAYER::RANGEREDFRM */
812     unsigned char rounding_control;     /* PICTURE_LAYER::RNDCTRL */
813     unsigned char post_processing;      /* PICTURE_LAYER::POSTPROC */
814     unsigned char picture_resolution_index;     /* PICTURE_LAYER::RESPIC */
815     unsigned char luma_scale;           /* PICTURE_LAYER::LUMSCALE */
816     unsigned char luma_shift;           /* PICTURE_LAYER::LUMSHIFT */
817     union {
818         struct {
819             unsigned int picture_type           : 3; /* PICTURE_LAYER::PTYPE */
820             unsigned int frame_coding_mode      : 3; /* PICTURE_LAYER::FCM */
821             unsigned int top_field_first        : 1; /* PICTURE_LAYER::TFF */
822             unsigned int is_first_field         : 1; /* set to 1 if it is the first field */
823             unsigned int intensity_compensation : 1; /* PICTURE_LAYER::INTCOMP */
824         } bits;
825         unsigned int value;
826     } picture_fields;
827     union {
828         struct {
829             unsigned int mv_type_mb     : 1;    /* PICTURE::MVTYPEMB */
830             unsigned int direct_mb      : 1;    /* PICTURE::DIRECTMB */
831             unsigned int skip_mb        : 1;    /* PICTURE::SKIPMB */
832             unsigned int field_tx       : 1;    /* PICTURE::FIELDTX */
833             unsigned int forward_mb     : 1;    /* PICTURE::FORWARDMB */
834             unsigned int ac_pred        : 1;    /* PICTURE::ACPRED */
835             unsigned int overflags      : 1;    /* PICTURE::OVERFLAGS */
836         } flags;
837         unsigned int value;
838     } raw_coding;
839     union {
840         struct {
841             unsigned int bp_mv_type_mb   : 1;    /* PICTURE::MVTYPEMB */
842             unsigned int bp_direct_mb    : 1;    /* PICTURE::DIRECTMB */
843             unsigned int bp_skip_mb      : 1;    /* PICTURE::SKIPMB */  
844             unsigned int bp_field_tx     : 1;    /* PICTURE::FIELDTX */ 
845             unsigned int bp_forward_mb   : 1;    /* PICTURE::FORWARDMB */
846             unsigned int bp_ac_pred      : 1;    /* PICTURE::ACPRED */   
847             unsigned int bp_overflags    : 1;    /* PICTURE::OVERFLAGS */
848         } flags;
849         unsigned int value;
850     } bitplane_present; /* signal what bitplane is being passed via the bitplane buffer */
851     union {
852         struct {
853             unsigned int reference_distance_flag : 1;/* PICTURE_LAYER::REFDIST_FLAG */
854             unsigned int reference_distance     : 5;/* PICTURE_LAYER::REFDIST */
855             unsigned int num_reference_pictures: 1;/* PICTURE_LAYER::NUMREF */
856             unsigned int reference_field_pic_indicator  : 1;/* PICTURE_LAYER::REFFIELD */
857         } bits;
858         unsigned int value;
859     } reference_fields;
860     union {
861         struct {
862             unsigned int mv_mode                : 3; /* PICTURE_LAYER::MVMODE */
863             unsigned int mv_mode2               : 3; /* PICTURE_LAYER::MVMODE2 */
864             unsigned int mv_table               : 3; /* PICTURE_LAYER::MVTAB/IMVTAB */
865             unsigned int two_mv_block_pattern_table: 2; /* PICTURE_LAYER::2MVBPTAB */
866             unsigned int four_mv_switch         : 1; /* PICTURE_LAYER::4MVSWITCH */
867             unsigned int four_mv_block_pattern_table : 2; /* PICTURE_LAYER::4MVBPTAB */
868             unsigned int extended_mv_flag       : 1; /* ENTRY_POINT_LAYER::EXTENDED_MV */
869             unsigned int extended_mv_range      : 2; /* PICTURE_LAYER::MVRANGE */
870             unsigned int extended_dmv_flag      : 1; /* ENTRY_POINT_LAYER::EXTENDED_DMV */
871             unsigned int extended_dmv_range     : 2; /* PICTURE_LAYER::DMVRANGE */
872         } bits;
873         unsigned int value;
874     } mv_fields;
875     union {
876         struct {
877             unsigned int dquant : 2;    /* ENTRY_POINT_LAYER::DQUANT */
878             unsigned int quantizer     : 2;     /* ENTRY_POINT_LAYER::QUANTIZER */
879             unsigned int half_qp        : 1;    /* PICTURE_LAYER::HALFQP */
880             unsigned int pic_quantizer_scale : 5;/* PICTURE_LAYER::PQUANT */
881             unsigned int pic_quantizer_type : 1;/* PICTURE_LAYER::PQUANTIZER */
882             unsigned int dq_frame       : 1;    /* VOPDQUANT::DQUANTFRM */
883             unsigned int dq_profile     : 2;    /* VOPDQUANT::DQPROFILE */
884             unsigned int dq_sb_edge     : 2;    /* VOPDQUANT::DQSBEDGE */
885             unsigned int dq_db_edge     : 2;    /* VOPDQUANT::DQDBEDGE */
886             unsigned int dq_binary_level : 1;   /* VOPDQUANT::DQBILEVEL */
887             unsigned int alt_pic_quantizer : 5;/* VOPDQUANT::ALTPQUANT */
888         } bits;
889         unsigned int value;
890     } pic_quantizer_fields;
891     union {
892         struct {
893             unsigned int variable_sized_transform_flag  : 1;/* ENTRY_POINT_LAYER::VSTRANSFORM */
894             unsigned int mb_level_transform_type_flag   : 1;/* PICTURE_LAYER::TTMBF */
895             unsigned int frame_level_transform_type     : 2;/* PICTURE_LAYER::TTFRM */
896             unsigned int transform_ac_codingset_idx1    : 2;/* PICTURE_LAYER::TRANSACFRM */
897             unsigned int transform_ac_codingset_idx2    : 2;/* PICTURE_LAYER::TRANSACFRM2 */
898             unsigned int intra_transform_dc_table       : 1;/* PICTURE_LAYER::TRANSDCTAB */
899         } bits;
900         unsigned int value;
901     } transform_fields;
902 } VAPictureParameterBufferVC1;
903
904 /* VC-1 Bitplane Buffer 
905 There will be at most three bitplanes coded in any picture header. To send 
906 the bitplane data more efficiently, each byte is divided in two nibbles, with
907 each nibble carrying three bitplanes for one macroblock.  The following table
908 shows the bitplane data arrangement within each nibble based on the picture
909 type.
910
911 Picture Type    Bit3            Bit2            Bit1            Bit0
912 I or BI                         OVERFLAGS       ACPRED          FIELDTX
913 P                               MYTYPEMB        SKIPMB          DIRECTMB
914 B                               FORWARDMB       SKIPMB          DIRECTMB
915
916 Within each byte, the lower nibble is for the first MB and the upper nibble is 
917 for the second MB.  E.g. the lower nibble of the first byte in the bitplane
918 buffer is for Macroblock #1 and the upper nibble of the first byte is for 
919 Macroblock #2 in the first row.
920 */
921
922 /* VC-1 Slice Parameter Buffer */
923 typedef struct _VASliceParameterBufferVC1
924 {
925     unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */
926     unsigned int slice_data_offset;/* the offset to the first byte of slice data */
927     unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
928     unsigned int macroblock_offset;/* the offset to the first bit of MB from the first byte of slice data */
929     unsigned int slice_vertical_position;
930 } VASliceParameterBufferVC1;
931
932 /* VC-1 Slice Data Buffer */
933 /* 
934 This is simplely a buffer containing raw bit-stream bytes 
935 */
936
937 /****************************
938  * H.264/AVC data structures
939  ****************************/
940
941 typedef struct _VAPictureH264
942 {
943     VASurfaceID picture_id;
944     unsigned int frame_idx;
945     unsigned int flags;
946     unsigned int TopFieldOrderCnt;
947     unsigned int BottomFieldOrderCnt;
948 } VAPictureH264;
949 /* flags in VAPictureH264 could be OR of the following */
950 #define VA_PICTURE_H264_INVALID                 0x00000001
951 #define VA_PICTURE_H264_TOP_FIELD               0x00000002
952 #define VA_PICTURE_H264_BOTTOM_FIELD            0x00000004
953 #define VA_PICTURE_H264_SHORT_TERM_REFERENCE    0x00000008
954 #define VA_PICTURE_H264_LONG_TERM_REFERENCE     0x00000010
955
956 /* H.264 Picture Parameter Buffer */
957 /* 
958  * For each picture, and before any slice data, a single
959  * picture parameter buffer must be send.
960  */
961 typedef struct _VAPictureParameterBufferH264
962 {
963     VAPictureH264 CurrPic;
964     VAPictureH264 ReferenceFrames[16];  /* in DPB */
965     unsigned short picture_width_in_mbs_minus1;
966     unsigned short picture_height_in_mbs_minus1;
967     unsigned char bit_depth_luma_minus8;
968     unsigned char bit_depth_chroma_minus8;
969     unsigned char num_ref_frames;
970     union {
971         struct {
972             unsigned int chroma_format_idc                      : 2; 
973             unsigned int residual_colour_transform_flag         : 1; 
974             unsigned int gaps_in_frame_num_value_allowed_flag   : 1; 
975             unsigned int frame_mbs_only_flag                    : 1; 
976             unsigned int mb_adaptive_frame_field_flag           : 1; 
977             unsigned int direct_8x8_inference_flag              : 1; 
978             unsigned int MinLumaBiPredSize8x8                   : 1; /* see A.3.3.2 */
979             unsigned int log2_max_frame_num_minus4              : 4;
980             unsigned int pic_order_cnt_type                     : 2;
981             unsigned int log2_max_pic_order_cnt_lsb_minus4      : 4;
982             unsigned int delta_pic_order_always_zero_flag       : 1;
983         } bits;
984         unsigned int value;
985     } seq_fields;
986     unsigned char num_slice_groups_minus1;
987     unsigned char slice_group_map_type;
988     unsigned short slice_group_change_rate_minus1;
989     signed char pic_init_qp_minus26;
990     signed char pic_init_qs_minus26;
991     signed char chroma_qp_index_offset;
992     signed char second_chroma_qp_index_offset;
993     union {
994         struct {
995             unsigned int entropy_coding_mode_flag       : 1;
996             unsigned int weighted_pred_flag             : 1;
997             unsigned int weighted_bipred_idc            : 2;
998             unsigned int transform_8x8_mode_flag        : 1;
999             unsigned int field_pic_flag                 : 1;
1000             unsigned int constrained_intra_pred_flag    : 1;
1001             unsigned int pic_order_present_flag                 : 1;
1002             unsigned int deblocking_filter_control_present_flag : 1;
1003             unsigned int redundant_pic_cnt_present_flag         : 1;
1004             unsigned int reference_pic_flag                     : 1; /* nal_ref_idc != 0 */
1005         } bits;
1006         unsigned int value;
1007     } pic_fields;
1008     unsigned short frame_num;
1009 } VAPictureParameterBufferH264;
1010
1011 /* H.264 Inverse Quantization Matrix Buffer */
1012 typedef struct _VAIQMatrixBufferH264
1013 {
1014     unsigned char ScalingList4x4[6][16];
1015     unsigned char ScalingList8x8[2][64];
1016 } VAIQMatrixBufferH264;
1017
1018 /* 
1019  * H.264 Slice Group Map Buffer 
1020  * When VAPictureParameterBufferH264::num_slice_group_minus1 is not equal to 0,
1021  * A slice group map buffer should be sent for each picture if required. The buffer
1022  * is sent only when there is a change in the mapping values.
1023  * The slice group map buffer map "map units" to slice groups as specified in 
1024  * section 8.2.2 of the H.264 spec. The buffer will contain one byte for each macroblock 
1025  * in raster scan order
1026  */ 
1027
1028 /* H.264 Slice Parameter Buffer */
1029 typedef struct _VASliceParameterBufferH264
1030 {
1031     unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */
1032     unsigned int slice_data_offset;/* the offset to the NAL start code for this slice */
1033     unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
1034     unsigned short slice_data_bit_offset; /* bit offset from NAL start code to the beginning of slice data */
1035     unsigned short first_mb_in_slice;
1036     unsigned char slice_type;
1037     unsigned char direct_spatial_mv_pred_flag;
1038     unsigned char num_ref_idx_l0_active_minus1;
1039     unsigned char num_ref_idx_l1_active_minus1;
1040     unsigned char cabac_init_idc;
1041     char slice_qp_delta;
1042     unsigned char disable_deblocking_filter_idc;
1043     char slice_alpha_c0_offset_div2;
1044     char slice_beta_offset_div2;
1045     VAPictureH264 RefPicList0[32];      /* See 8.2.4.2 */
1046     VAPictureH264 RefPicList1[32];      /* See 8.2.4.2 */
1047     unsigned char luma_log2_weight_denom;
1048     unsigned char chroma_log2_weight_denom;
1049     unsigned char luma_weight_l0_flag;
1050     short luma_weight_l0[32];
1051     short luma_offset_l0[32];
1052     unsigned char chroma_weight_l0_flag;
1053     short chroma_weight_l0[32][2];
1054     short chroma_offset_l0[32][2];
1055     unsigned char luma_weight_l1_flag;
1056     short luma_weight_l1[32];
1057     short luma_offset_l1[32];
1058     unsigned char chroma_weight_l1_flag;
1059     short chroma_weight_l1[32][2];
1060     short chroma_offset_l1[32][2];
1061 } VASliceParameterBufferH264;
1062
1063 /****************************
1064  * Common encode data structures 
1065  ****************************/
1066 typedef enum
1067 {
1068     VAEncPictureTypeIntra               = 0,
1069     VAEncPictureTypePredictive          = 1,
1070     VAEncPictureTypeBidirectional       = 2,
1071 } VAEncPictureType;
1072
1073 /* Encode Slice Parameter Buffer */
1074 typedef struct _VAEncSliceParameterBuffer
1075 {
1076     unsigned int start_row_number;      /* starting MB row number for this slice */
1077     unsigned int slice_height;  /* slice height measured in MB */
1078     union {
1079         struct {
1080             unsigned int is_intra       : 1;
1081             unsigned int disable_deblocking_filter_idc : 2;
1082         } bits;
1083         unsigned int value;
1084     } slice_flags;
1085 } VAEncSliceParameterBuffer;
1086
1087 /****************************
1088  * H.264 specific encode data structures
1089  ****************************/
1090
1091 typedef struct _VAEncSequenceParameterBufferH264
1092 {
1093     unsigned char seq_parameter_set_id;
1094     unsigned char level_idc;
1095     unsigned int intra_period;
1096     unsigned int intra_idr_period;
1097     unsigned int picture_width_in_mbs;
1098     unsigned int picture_height_in_mbs;
1099     unsigned int bits_per_second;
1100     unsigned int frame_rate;
1101     unsigned int initial_qp;
1102     unsigned int min_qp;
1103     unsigned int basic_unit_size;
1104     unsigned char vui_flag;
1105 } VAEncSequenceParameterBufferH264;
1106
1107 typedef struct _VAEncPictureParameterBufferH264
1108 {
1109     VASurfaceID reference_picture;
1110     VASurfaceID reconstructed_picture;
1111     VABufferID coded_buf;
1112     unsigned short picture_width;
1113     unsigned short picture_height;
1114     unsigned char last_picture; /* if set to 1 it indicates the last picture in the sequence */
1115 } VAEncPictureParameterBufferH264;
1116
1117 /****************************
1118  * H.263 specific encode data structures
1119  ****************************/
1120
1121 typedef struct _VAEncSequenceParameterBufferH263
1122 {
1123     unsigned int intra_period;
1124     unsigned int bits_per_second;
1125     unsigned int frame_rate;
1126     unsigned int initial_qp;
1127     unsigned int min_qp;
1128 } VAEncSequenceParameterBufferH263;
1129
1130 typedef struct _VAEncPictureParameterBufferH263
1131 {
1132     VASurfaceID reference_picture;
1133     VASurfaceID reconstructed_picture;
1134     VABufferID coded_buf;
1135     unsigned short picture_width;
1136     unsigned short picture_height;
1137     VAEncPictureType picture_type;
1138 } VAEncPictureParameterBufferH263;
1139
1140 /****************************
1141  * MPEG-4 specific encode data structures
1142  ****************************/
1143
1144 typedef struct _VAEncSequenceParameterBufferMPEG4
1145 {
1146     unsigned char profile_and_level_indication;
1147     unsigned int intra_period;
1148     unsigned int video_object_layer_width;
1149     unsigned int video_object_layer_height;
1150     unsigned int vop_time_increment_resolution;
1151     unsigned int fixed_vop_rate;
1152     unsigned int fixed_vop_time_increment;
1153     unsigned int bits_per_second;
1154     unsigned int frame_rate;
1155     unsigned int initial_qp;
1156     unsigned int min_qp;
1157 } VAEncSequenceParameterBufferMPEG4;
1158
1159 typedef struct _VAEncPictureParameterBufferMPEG4
1160 {
1161     VASurfaceID reference_picture;
1162     VASurfaceID reconstructed_picture;
1163     VABufferID coded_buf;
1164     unsigned short picture_width;
1165     unsigned short picture_height;
1166     unsigned int modulo_time_base; /* number of 1s */
1167     unsigned int vop_time_increment;
1168     VAEncPictureType picture_type;
1169 } VAEncPictureParameterBufferMPEG4;
1170
1171
1172
1173 /* Buffer functions */
1174
1175 /*
1176  * Creates a buffer for "num_elements" elements of "size" bytes and 
1177  * initalize with "data".
1178  * if "data" is null, then the contents of the buffer data store
1179  * are undefined.
1180  * Basically there are two ways to get buffer data to the server side. One is 
1181  * to call vaCreateBuffer() with a non-null "data", which results the data being
1182  * copied to the data store on the server side.  A different method that 
1183  * eliminates this copy is to pass null as "data" when calling vaCreateBuffer(),
1184  * and then use vaMapBuffer() to map the data store from the server side to the
1185  * client address space for access.
1186  *  Note: image buffers are created by the library, not the client. Please see 
1187  *        vaCreateImage on how image buffers are managed.
1188  */
1189 VAStatus vaCreateBuffer (
1190     VADisplay dpy,
1191     VAContextID context,
1192     VABufferType type,  /* in */
1193     unsigned int size,  /* in */
1194     unsigned int num_elements, /* in */
1195     void *data,         /* in */
1196     VABufferID *buf_id  /* out */
1197 );
1198
1199 /*
1200  * Convey to the server how many valid elements are in the buffer. 
1201  * e.g. if multiple slice parameters are being held in a single buffer,
1202  * this will communicate to the server the number of slice parameters
1203  * that are valid in the buffer.
1204  */
1205 VAStatus vaBufferSetNumElements (
1206     VADisplay dpy,
1207     VABufferID buf_id,  /* in */
1208     unsigned int num_elements /* in */
1209 );
1210
1211
1212 /*
1213  * device independent data structure for codedbuffer
1214  */
1215 typedef  struct _VACodedBufferSegment {
1216     unsigned int size; /* size of the data buffer in the coded buffer segment, in bytes */
1217     unsigned int bit_offset;/* bit offset into the data buffer where valid bitstream data begins */
1218     void *buf; /* pointer to the beginning of the data buffer in the coded buffer segment */
1219     void *next; /* pointer to the next VACodedBufferSegment */
1220 } VACodedBufferSegment;
1221      
1222 /*
1223  * Map data store of the buffer into the client's address space
1224  * vaCreateBuffer() needs to be called with "data" set to NULL before
1225  * calling vaMapBuffer()
1226  *
1227  * if buffer type is VAEncCodedBufferType, pbuf points to link-list of
1228  * VACodedBufferSegment, and the list is terminated if "next" is NULL
1229  */
1230 VAStatus vaMapBuffer (
1231     VADisplay dpy,
1232     VABufferID buf_id,  /* in */
1233     void **pbuf         /* out */
1234 );
1235
1236 /*
1237  * After client making changes to a mapped data store, it needs to
1238  * "Unmap" it to let the server know that the data is ready to be
1239  * consumed by the server
1240  */
1241 VAStatus vaUnmapBuffer (
1242     VADisplay dpy,
1243     VABufferID buf_id   /* in */
1244 );
1245
1246 /*
1247  * After this call, the buffer is deleted and this buffer_id is no longer valid
1248  * Only call this if the buffer is not going to be passed to vaRenderBuffer
1249  */
1250 VAStatus vaDestroyBuffer (
1251     VADisplay dpy,
1252     VABufferID buffer_id
1253 );
1254
1255 /*
1256 Render (Decode) Pictures
1257
1258 A picture represents either a frame or a field.
1259
1260 The Begin/Render/End sequence sends the decode buffers to the server
1261 */
1262
1263 /*
1264  * Get ready to decode a picture to a target surface
1265  */
1266 VAStatus vaBeginPicture (
1267     VADisplay dpy,
1268     VAContextID context,
1269     VASurfaceID render_target
1270 );
1271
1272 /* 
1273  * Send decode buffers to the server.
1274  * Buffers are automatically destroyed afterwards
1275  */
1276 VAStatus vaRenderPicture (
1277     VADisplay dpy,
1278     VAContextID context,
1279     VABufferID *buffers,
1280     int num_buffers
1281 );
1282
1283 /* 
1284  * Make the end of rendering for a picture. 
1285  * The server should start processing all pending operations for this 
1286  * surface. This call is non-blocking. The client can start another 
1287  * Begin/Render/End sequence on a different render target.
1288  */
1289 VAStatus vaEndPicture (
1290     VADisplay dpy,
1291     VAContextID context
1292 );
1293
1294 /*
1295
1296 Synchronization 
1297
1298 */
1299
1300 /* 
1301  * This function blocks until all pending operations on the render target
1302  * have been completed.  Upon return it is safe to use the render target for a 
1303  * different picture. 
1304  */
1305 VAStatus vaSyncSurface (
1306     VADisplay dpy,
1307     VASurfaceID render_target
1308 );
1309
1310 typedef enum
1311 {
1312     VASurfaceRendering  = 1, /* Rendering in progress */ 
1313     VASurfaceDisplaying = 2, /* Displaying in progress (not safe to render into it) */ 
1314                              /* this status is useful if surface is used as the source */
1315                              /* of an overlay */
1316     VASurfaceReady      = 4, /* not being rendered or displayed */
1317     VASurfaceSkipped    = 8  /* Indicate a skipped frame during encode */
1318 } VASurfaceStatus;
1319
1320 /*
1321  * Find out any pending ops on the render target 
1322  */
1323 VAStatus vaQuerySurfaceStatus (
1324     VADisplay dpy,
1325     VASurfaceID render_target,
1326     VASurfaceStatus *status     /* out */
1327 );
1328
1329 /*
1330  * Images and Subpictures
1331  * VAImage is used to either get the surface data to client memory, or 
1332  * to copy image data in client memory to a surface. 
1333  * Both images, subpictures and surfaces follow the same 2D coordinate system where origin 
1334  * is at the upper left corner with positive X to the right and positive Y down
1335  */
1336 #define VA_FOURCC(ch0, ch1, ch2, ch3) \
1337     ((unsigned long)(unsigned char) (ch0) | ((unsigned long)(unsigned char) (ch1) << 8) | \
1338     ((unsigned long)(unsigned char) (ch2) << 16) | ((unsigned long)(unsigned char) (ch3) << 24 ))
1339
1340 /* a few common FourCCs */
1341 #define VA_FOURCC_NV12          0x3231564E
1342 #define VA_FOURCC_AI44          0x34344149
1343 #define VA_FOURCC_RGBA          0x41424752
1344 #define VA_FOURCC_UYVY          0x59565955
1345 #define VA_FOURCC_YUY2          0x32595559
1346 #define VA_FOURCC_AYUV          0x56555941
1347 #define VA_FOURCC_NV11          0x3131564e
1348 #define VA_FOURCC_YV12          0x32315659
1349 #define VA_FOURCC_P208          0x38303250
1350 #define VA_FOURCC_IYUV          0x56555949
1351
1352 /* byte order */
1353 #define VA_LSB_FIRST            1
1354 #define VA_MSB_FIRST            2
1355
1356 typedef struct _VAImageFormat
1357 {
1358     unsigned int        fourcc;
1359     unsigned int        byte_order; /* VA_LSB_FIRST, VA_MSB_FIRST */
1360     unsigned int        bits_per_pixel;
1361     /* for RGB formats */
1362     unsigned int        depth; /* significant bits per pixel */
1363     unsigned int        red_mask;
1364     unsigned int        green_mask;
1365     unsigned int        blue_mask;
1366     unsigned int        alpha_mask;
1367 } VAImageFormat;
1368
1369 typedef VAGenericID VAImageID;
1370
1371 typedef struct _VAImage
1372 {
1373     VAImageID           image_id; /* uniquely identify this image */
1374     VAImageFormat       format;
1375     VABufferID          buf;    /* image data buffer */
1376     /*
1377      * Image data will be stored in a buffer of type VAImageBufferType to facilitate
1378      * data store on the server side for optimal performance. The buffer will be 
1379      * created by the CreateImage function, and proper storage allocated based on the image
1380      * size and format. This buffer is managed by the library implementation, and 
1381      * accessed by the client through the buffer Map/Unmap functions.
1382      */
1383     unsigned short      width; 
1384     unsigned short      height;
1385     unsigned int        data_size;
1386     unsigned int        num_planes;     /* can not be greater than 3 */
1387     /* 
1388      * An array indicating the scanline pitch in bytes for each plane.
1389      * Each plane may have a different pitch. Maximum 3 planes for planar formats
1390      */
1391     unsigned int        pitches[3];
1392     /* 
1393      * An array indicating the byte offset from the beginning of the image data 
1394      * to the start of each plane.
1395      */
1396     unsigned int        offsets[3];
1397
1398     /* The following fields are only needed for paletted formats */
1399     int num_palette_entries;   /* set to zero for non-palette images */
1400     /* 
1401      * Each component is one byte and entry_bytes indicates the number of components in 
1402      * each entry (eg. 3 for YUV palette entries). set to zero for non-palette images   
1403      */
1404     int entry_bytes; 
1405     /*
1406      * An array of ascii characters describing the order of the components within the bytes.
1407      * Only entry_bytes characters of the string are used.
1408      */
1409     char component_order[4];
1410 } VAImage;
1411
1412 /* Get maximum number of image formats supported by the implementation */
1413 int vaMaxNumImageFormats (
1414     VADisplay dpy
1415 );
1416
1417 /* 
1418  * Query supported image formats 
1419  * The caller must provide a "format_list" array that can hold at
1420  * least vaMaxNumImageFormats() entries. The actual number of formats
1421  * returned in "format_list" is returned in "num_formats".
1422  */
1423 VAStatus vaQueryImageFormats (
1424     VADisplay dpy,
1425     VAImageFormat *format_list, /* out */
1426     int *num_formats            /* out */
1427 );
1428
1429 /* 
1430  * Create a VAImage structure
1431  * The width and height fields returned in the VAImage structure may get 
1432  * enlarged for some YUV formats. Upon return from this function, 
1433  * image->buf has been created and proper storage allocated by the library. 
1434  * The client can access the image through the Map/Unmap calls.
1435  */
1436 VAStatus vaCreateImage (
1437     VADisplay dpy,
1438     VAImageFormat *format,
1439     int width,
1440     int height,
1441     VAImage *image      /* out */
1442 );
1443
1444 /*
1445  * Should call DestroyImage before destroying the surface it is bound to
1446  */
1447 VAStatus vaDestroyImage (
1448     VADisplay dpy,
1449     VAImageID image
1450 );
1451
1452 VAStatus vaSetImagePalette (
1453     VADisplay dpy,
1454     VAImageID image,
1455     /* 
1456      * pointer to an array holding the palette data.  The size of the array is 
1457      * num_palette_entries * entry_bytes in size.  The order of the components 
1458      * in the palette is described by the component_order in VAImage struct    
1459      */
1460     unsigned char *palette 
1461 );
1462
1463 /*
1464  * Retrive surface data into a VAImage
1465  * Image must be in a format supported by the implementation
1466  */
1467 VAStatus vaGetImage (
1468     VADisplay dpy,
1469     VASurfaceID surface,
1470     int x,      /* coordinates of the upper left source pixel */
1471     int y,
1472     unsigned int width, /* width and height of the region */
1473     unsigned int height,
1474     VAImageID image
1475 );
1476
1477 /*
1478  * Copy data from a VAImage to a surface
1479  * Image must be in a format supported by the implementation
1480  * Returns a VA_STATUS_ERROR_SURFACE_BUSY if the surface
1481  * shouldn't be rendered into when this is called
1482  */
1483 VAStatus vaPutImage (
1484     VADisplay dpy,
1485     VASurfaceID surface,
1486     VAImageID image,
1487     int src_x,
1488     int src_y,
1489     unsigned int src_width,
1490     unsigned int src_height,
1491     int dest_x,
1492     int dest_y,
1493     unsigned int dest_width,
1494     unsigned int dest_height
1495 );
1496
1497 /*
1498  * Derive an VAImage from an existing surface.
1499  * This interface will derive a VAImage and corresponding image buffer from
1500  * an existing VA Surface. The image buffer can then be mapped/unmapped for
1501  * direct CPU access. This operation is only possible on implementations with
1502  * direct rendering capabilities and internal surface formats that can be
1503  * represented with a VAImage. When the operation is not possible this interface
1504  * will return VA_STATUS_ERROR_OPERATION_FAILED. Clients should then fall back
1505  * to using vaCreateImage + vaPutImage to accomplish the same task in an
1506  * indirect manner.
1507  *
1508  * Implementations should only return success when the resulting image buffer
1509  * would be useable with vaMap/Unmap.
1510  *
1511  * When directly accessing a surface special care must be taken to insure
1512  * proper synchronization with the graphics hardware. Clients should call
1513  * vaQuerySurfaceStatus to insure that a surface is not the target of concurrent
1514  * rendering or currently being displayed by an overlay.
1515  *
1516  * Additionally nothing about the contents of a surface should be assumed
1517  * following a vaPutSurface. Implementations are free to modify the surface for
1518  * scaling or subpicture blending within a call to vaPutImage.
1519  *
1520  * Calls to vaPutImage or vaGetImage using the same surface from which the image
1521  * has been derived will return VA_STATUS_ERROR_SURFACE_BUSY. vaPutImage or
1522  * vaGetImage with other surfaces is supported.
1523  *
1524  * An image created with vaDeriveImage should be freed with vaDestroyImage. The
1525  * image and image buffer structures will be destroyed; however, the underlying
1526  * surface will remain unchanged until freed with vaDestroySurfaces.
1527  */
1528 VAStatus vaDeriveImage (
1529     VADisplay dpy,
1530     VASurfaceID surface,
1531     VAImage *image      /* out */
1532 );
1533
1534 /*
1535  * Subpictures 
1536  * Subpicture is a special type of image that can be blended 
1537  * with a surface during vaPutSurface(). Subpicture can be used to render
1538  * DVD sub-titles or closed captioning text etc.  
1539  */
1540
1541 typedef VAGenericID VASubpictureID;
1542
1543 /* Get maximum number of subpicture formats supported by the implementation */
1544 int vaMaxNumSubpictureFormats (
1545     VADisplay dpy
1546 );
1547
1548 /* flags for subpictures */
1549 #define VA_SUBPICTURE_CHROMA_KEYING     0x0001
1550 #define VA_SUBPICTURE_GLOBAL_ALPHA      0x0002
1551 /* 
1552  * Query supported subpicture formats 
1553  * The caller must provide a "format_list" array that can hold at
1554  * least vaMaxNumSubpictureFormats() entries. The flags arrary holds the flag 
1555  * for each format to indicate additional capabilities for that format. The actual 
1556  * number of formats returned in "format_list" is returned in "num_formats".
1557  *  flags: returned value to indicate addtional capabilities
1558  *         VA_SUBPICTURE_CHROMA_KEYING - supports chroma-keying
1559  *         VA_SUBPICTURE_GLOBAL_ALPHA - supports global alpha  
1560  */
1561 VAStatus vaQuerySubpictureFormats (
1562     VADisplay dpy,
1563     VAImageFormat *format_list, /* out */
1564     unsigned int *flags,        /* out */
1565     unsigned int *num_formats   /* out */
1566 );
1567
1568 /* 
1569  * Subpictures are created with an image associated. 
1570  */
1571 VAStatus vaCreateSubpicture (
1572     VADisplay dpy,
1573     VAImageID image,
1574     VASubpictureID *subpicture  /* out */
1575 );
1576
1577 /*
1578  * Destroy the subpicture before destroying the image it is assocated to
1579  */
1580 VAStatus vaDestroySubpicture (
1581     VADisplay dpy,
1582     VASubpictureID subpicture
1583 );
1584
1585 /* 
1586  * Bind an image to the subpicture. This image will now be associated with 
1587  * the subpicture instead of the one at creation.
1588  */
1589 VAStatus vaSetSubpictureImage (
1590     VADisplay dpy,
1591     VASubpictureID subpicture,
1592     VAImageID image
1593 );
1594
1595 /*
1596  * If chromakey is enabled, then the area where the source value falls within
1597  * the chromakey [min, max] range is transparent
1598  * The chromakey component format is the following:
1599  *  For RGB: [0:7] Red [8:15] Blue [16:23] Green   
1600  *  For YUV: [0:7] V [8:15] U [16:23] Y
1601  * The chromakey mask can be used to mask out certain components for chromakey
1602  * comparision
1603  */
1604 VAStatus vaSetSubpictureChromakey (
1605     VADisplay dpy,
1606     VASubpictureID subpicture,
1607     unsigned int chromakey_min,
1608     unsigned int chromakey_max,
1609     unsigned int chromakey_mask
1610 );
1611
1612 /*
1613  * Global alpha value is between 0 and 1. A value of 1 means fully opaque and 
1614  * a value of 0 means fully transparent. If per-pixel alpha is also specified then
1615  * the overall alpha is per-pixel alpha multiplied by the global alpha
1616  */
1617 VAStatus vaSetSubpictureGlobalAlpha (
1618     VADisplay dpy,
1619     VASubpictureID subpicture,
1620     float global_alpha 
1621 );
1622
1623 /*
1624  * vaAssociateSubpicture associates the subpicture with target_surfaces.
1625  * It defines the region mapping between the subpicture and the target  
1626  * surfaces through source and destination rectangles (with the same width and height).
1627  * Both will be displayed at the next call to vaPutSurface.  Additional
1628  * associations before the call to vaPutSurface simply overrides the association.
1629  */
1630 VAStatus vaAssociateSubpicture (
1631     VADisplay dpy,
1632     VASubpictureID subpicture,
1633     VASurfaceID *target_surfaces,
1634     int num_surfaces,
1635     short src_x, /* upper left offset in subpicture */
1636     short src_y,
1637     unsigned short src_width,
1638     unsigned short src_height,
1639     short dest_x, /* upper left offset in surface */
1640     short dest_y,
1641     unsigned short dest_width,
1642     unsigned short dest_height,
1643     /*
1644      * whether to enable chroma-keying or global-alpha
1645      * see VA_SUBPICTURE_XXX values
1646      */
1647     unsigned int flags
1648 );
1649
1650 /*
1651  * vaDeassociateSubpicture removes the association of the subpicture with target_surfaces.
1652  */
1653 VAStatus vaDeassociateSubpicture (
1654     VADisplay dpy,
1655     VASubpictureID subpicture,
1656     VASurfaceID *target_surfaces,
1657     int num_surfaces
1658 );
1659
1660 typedef struct _VARectangle
1661 {
1662     short x;
1663     short y;
1664     unsigned short width;
1665     unsigned short height;
1666 } VARectangle;
1667
1668 /*
1669  * Display attributes
1670  * Display attributes are used to control things such as contrast, hue, saturation,
1671  * brightness etc. in the rendering process.  The application can query what
1672  * attributes are supported by the driver, and then set the appropriate attributes
1673  * before calling vaPutSurface()
1674  */
1675 /* PowerVR IEP Lite attributes */
1676 typedef enum
1677 {
1678     VADISPLAYATTRIB_BLE_OFF              = 0x00,
1679     VADISPLAYATTRIB_BLE_LOW,
1680     VADISPLAYATTRIB_BLE_MEDIUM,
1681     VADISPLAYATTRIB_BLE_HIGH,
1682     VADISPLAYATTRIB_BLE_NONE,
1683 } VADisplayAttribBLEMode;
1684
1685 typedef enum
1686
1687     VADISPLAYATTRIB_CSC_FORMAT_YCC_BT601 = 0x00,
1688     VADISPLAYATTRIB_CSC_FORMAT_YCC_BT709,
1689     VADISPLAYATTRIB_CSC_FORMAT_YCC_SMPTE_240,
1690     VADISPLAYATTRIB_CSC_FORMAT_RGB,
1691     VADISPLAYATTRIB_CSC_FORMAT_NONE,
1692 } VADisplayAttribCSCFormat;
1693
1694 /* attribute value for VADisplayAttribRotation   */
1695 #define VA_ROTATION_NONE        0x00000000
1696 #define VA_ROTATION_90          0x00000001
1697 #define VA_ROTATION_180         0x00000002
1698 #define VA_ROTATION_270         0x00000004
1699
1700 /* attribute value for VADisplayAttribOutOfLoopDeblock */
1701 #define VA_OOL_DEBLOCKING_FALSE 0x00000000
1702 #define VA_OOL_DEBLOCKING_TRUE  0x00000001
1703
1704
1705 /* Currently defined display attribute types */
1706 typedef enum
1707 {
1708     VADisplayAttribBrightness           = 0,
1709     VADisplayAttribContrast             = 1,
1710     VADisplayAttribHue                  = 2,
1711     VADisplayAttribSaturation           = 3,
1712     /* client can specifiy a background color for the target window */
1713     VADisplayAttribBackgroundColor      = 4,
1714     /*
1715      * this is a gettable only attribute. For some implementations that use the
1716      * hardware overlay, after PutSurface is called, the surface can not be    
1717      * re-used until after the subsequent PutSurface call. If this is the case 
1718      * then the value for this attribute will be set to 1 so that the client   
1719      * will not attempt to re-use the surface right after returning from a call
1720      * to PutSurface.
1721      */
1722     VADisplayAttribDirectSurface       = 5,
1723     VADisplayAttribRotation            = 6,     
1724     VADisplayAttribOutofLoopDeblock    = 7,
1725
1726     /* PowerVR IEP Lite specific attributes */
1727     VADisplayAttribBLEBlackMode        = 8,
1728     VADisplayAttribBLEWhiteMode        = 9,
1729     VADisplayAttribBlueStretch         = 10,
1730     VADisplayAttribSkinColorCorrection = 11,
1731     VADisplayAttribCSCInputColorFormat = 12,
1732     VADisplayAttribCSCHue              = 13,
1733     VADisplayAttribCSCSaturation       = 14,
1734     VADisplayAttribCSCBrightness       = 15,
1735     VADisplayAttribCSCContrast         = 16,
1736 } VADisplayAttribType;
1737
1738 /* flags for VADisplayAttribute */
1739 #define VA_DISPLAY_ATTRIB_NOT_SUPPORTED 0x0000
1740 #define VA_DISPLAY_ATTRIB_GETTABLE      0x0001
1741 #define VA_DISPLAY_ATTRIB_SETTABLE      0x0002
1742
1743 typedef struct _VADisplayAttribute
1744 {
1745     VADisplayAttribType type;
1746     int min_value;
1747     int max_value;
1748     int value;  /* used by the set/get attribute functions */
1749 /* flags can be VA_DISPLAY_ATTRIB_GETTABLE or VA_DISPLAY_ATTRIB_SETTABLE or OR'd together */
1750     unsigned int flags;
1751 } VADisplayAttribute;
1752
1753 /* Get maximum number of display attributs supported by the implementation */
1754 int vaMaxNumDisplayAttributes (
1755     VADisplay dpy
1756 );
1757
1758 /* 
1759  * Query display attributes 
1760  * The caller must provide a "attr_list" array that can hold at
1761  * least vaMaxNumDisplayAttributes() entries. The actual number of attributes
1762  * returned in "attr_list" is returned in "num_attributes".
1763  */
1764 VAStatus vaQueryDisplayAttributes (
1765     VADisplay dpy,
1766     VADisplayAttribute *attr_list,      /* out */
1767     int *num_attributes                 /* out */
1768 );
1769
1770 /* 
1771  * Get display attributes 
1772  * This function returns the current attribute values in "attr_list".
1773  * Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field
1774  * from vaQueryDisplayAttributes() can have their values retrieved.  
1775  */
1776 VAStatus vaGetDisplayAttributes (
1777     VADisplay dpy,
1778     VADisplayAttribute *attr_list,      /* in/out */
1779     int num_attributes
1780 );
1781
1782 /* 
1783  * Set display attributes 
1784  * Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field
1785  * from vaQueryDisplayAttributes() can be set.  If the attribute is not settable or 
1786  * the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED
1787  */
1788 VAStatus vaSetDisplayAttributes (
1789     VADisplay dpy,
1790     VADisplayAttribute *attr_list,
1791     int num_attributes
1792 );
1793
1794 #ifdef __cplusplus
1795 }
1796 #endif
1797
1798 #endif /* _VA_H_ */