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