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 #ifdef __GNUC__
89 # define __maybe_unused __attribute__((__unused__))
90 #else
91 # define __maybe_unused
92 #endif
93 
94 /**
95  * \mainpage Video Acceleration (VA) API
96  *
97  * \section intro Introduction
98  *
99  * The main motivation for VA-API (Video Acceleration API) is to
100  * enable hardware accelerated video decode and encode at various
101  * entry-points (VLD, IDCT, Motion Compensation etc.) for the
102  * prevailing coding standards today (MPEG-2, MPEG-4 ASP/H.263, MPEG-4
103  * AVC/H.264, VC-1/VMW3, and JPEG).
104  *
105  * VA-API is split into several modules:
106  * - \ref api_core
107  * - \ref api_enc_core
108  * - \ref api_enc_h264
109  * - \ref api_vpp
110  */
111 
112 /**
113  * \defgroup api_core Core API
114  *
115  * @{
116  */
117 
118 /*
119 Overview
120 
121 The VA API is intended to provide an interface between a video decode/encode/display
122 application (client) and a hardware accelerator (server), to off-load
123 video decode/encode/display operations from the host to the hardware accelerator at various
124 entry-points.
125 
126 The basic operation steps are:
127 
128 - Negotiate a mutually acceptable configuration with the server to lock
129   down profile, entrypoints, and other attributes that will not change on
130   a frame-by-frame basis.
131 - Create a decode context which represents a "virtualized" hardware decode
132   device
133 - Get and fill decode buffers with picture level, slice level and macroblock
134   level data (depending on entrypoints)
135 - Pass the decode buffers to the server to decode the current frame
136 
137 Initialization & Configuration Management
138 
139 - Find out supported profiles
140 - Find out entrypoints for a given profile
141 - Find out configuration attributes for a given profile/entrypoint pair
142 - Create a configuration for use by the decoder
143 
144 */
145 
146 typedef void* VADisplay;	/* window system dependent */
147 
148 typedef int VAStatus;	/* Return status type from functions */
149 /* Values for the return status */
150 #define VA_STATUS_SUCCESS			0x00000000
151 #define VA_STATUS_ERROR_OPERATION_FAILED	0x00000001
152 #define VA_STATUS_ERROR_ALLOCATION_FAILED	0x00000002
153 #define VA_STATUS_ERROR_INVALID_DISPLAY		0x00000003
154 #define VA_STATUS_ERROR_INVALID_CONFIG		0x00000004
155 #define VA_STATUS_ERROR_INVALID_CONTEXT		0x00000005
156 #define VA_STATUS_ERROR_INVALID_SURFACE		0x00000006
157 #define VA_STATUS_ERROR_INVALID_BUFFER		0x00000007
158 #define VA_STATUS_ERROR_INVALID_IMAGE		0x00000008
159 #define VA_STATUS_ERROR_INVALID_SUBPICTURE	0x00000009
160 #define VA_STATUS_ERROR_ATTR_NOT_SUPPORTED	0x0000000a
161 #define VA_STATUS_ERROR_MAX_NUM_EXCEEDED	0x0000000b
162 #define VA_STATUS_ERROR_UNSUPPORTED_PROFILE	0x0000000c
163 #define VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT	0x0000000d
164 #define VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT	0x0000000e
165 #define VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE	0x0000000f
166 #define VA_STATUS_ERROR_SURFACE_BUSY		0x00000010
167 #define VA_STATUS_ERROR_FLAG_NOT_SUPPORTED      0x00000011
168 #define VA_STATUS_ERROR_INVALID_PARAMETER	0x00000012
169 #define VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED 0x00000013
170 #define VA_STATUS_ERROR_UNIMPLEMENTED           0x00000014
171 #define VA_STATUS_ERROR_SURFACE_IN_DISPLAYING   0x00000015
172 #define VA_STATUS_ERROR_INVALID_IMAGE_FORMAT    0x00000016
173 #define VA_STATUS_ERROR_DECODING_ERROR          0x00000017
174 #define VA_STATUS_ERROR_ENCODING_ERROR          0x00000018
175 /**
176  * \brief An invalid/unsupported value was supplied.
177  *
178  * This is a catch-all error code for invalid or unsupported values.
179  * e.g. value exceeding the valid range, invalid type in the context
180  * of generic attribute values.
181  */
182 #define VA_STATUS_ERROR_INVALID_VALUE           0x00000019
183 /** \brief An unsupported filter was supplied. */
184 #define VA_STATUS_ERROR_UNSUPPORTED_FILTER      0x00000020
185 /** \brief An invalid filter chain was supplied. */
186 #define VA_STATUS_ERROR_INVALID_FILTER_CHAIN    0x00000021
187 /** \brief Indicate HW busy (e.g. run multiple encoding simultaneously). */
188 #define VA_STATUS_ERROR_HW_BUSY	                0x00000022
189 /** \brief An invalid blend state was supplied. */
190 #define VA_STATUS_ERROR_INVALID_BLEND_STATE     0x00000023
191 #define VA_STATUS_ERROR_UNKNOWN			0xFFFFFFFF
192 
193 /* De-interlacing flags for vaPutSurface() */
194 #define VA_FRAME_PICTURE        0x00000000
195 #define VA_TOP_FIELD            0x00000001
196 #define VA_BOTTOM_FIELD         0x00000002
197 
198 /*
199  * Enabled the positioning/cropping/blending feature:
200  * 1, specify the video playback position in the isurface
201  * 2, specify the cropping info for video playback
202  * 3, encoded video will blend with background color
203  */
204 #define VA_ENABLE_BLEND         0x00000004 /* video area blend with the constant color */
205 
206 /*
207  * Clears the drawable with background color.
208  * for hardware overlay based implementation this flag
209  * can be used to turn off the overlay
210  */
211 #define VA_CLEAR_DRAWABLE       0x00000008
212 
213 /* Color space conversion flags for vaPutSurface() */
214 #define VA_SRC_COLOR_MASK       0x000000f0
215 #define VA_SRC_BT601            0x00000010
216 #define VA_SRC_BT709            0x00000020
217 #define VA_SRC_SMPTE_240        0x00000040
218 #define VA_SRC_BT2020           0x00000080
219 
220 /* Scaling flags for vaPutSurface() */
221 #define VA_FILTER_SCALING_DEFAULT       0x00000000
222 #define VA_FILTER_SCALING_FAST          0x00000100
223 #define VA_FILTER_SCALING_HQ            0x00000200
224 #define VA_FILTER_SCALING_NL_ANAMORPHIC 0x00000300
225 #define VA_FILTER_SCALING_MASK          0x00000f00
226 
227 /*
228  * The upper 16 bits are reserved for VPP filter fast path usage.
229  * Flag to enable auto noise reduction.
230  */
231 #define VA_FILTER_NOISEREDUCTION_AUTO   0x00010000
232 
233 /*
234  * This is to indicate that the color-space conversion uses full range or reduced range.
235  * VA_SOURCE_RANGE_FULL(Full range): Y/Cb/Cr is in [0, 255]. It is mainly used
236  *      for JPEG/JFIF formats. The combination with the BT601 flag means that
237  *      JPEG/JFIF color-space conversion matrix is used.
238  * VA_SOURCE_RANGE_REDUCED(Reduced range): Y is in [16, 235] and Cb/Cr is in [16, 240].
239  *      It is mainly used for the YUV->RGB color-space conversion in SDTV/HDTV/UHDTV.
240  */
241 #define VA_SOURCE_RANGE_MASK            0x00020000
242 #define VA_SOURCE_RANGE_FULL            0x00020000
243 #define VA_SOURCE_RANGE_REDUCED         0x00000000
244 /*
245  * Returns a short english description of error_status
246  */
247 const char *vaErrorStr(VAStatus error_status);
248 
249 typedef struct _VARectangle
250 {
251     short x;
252     short y;
253     unsigned short width;
254     unsigned short height;
255 } VARectangle;
256 
257 /** \brief Generic motion vector data structure. */
258 typedef struct _VAMotionVector {
259     /** \mv0[0]: horizontal motion vector for past reference */
260     /** \mv0[1]: vertical motion vector for past reference */
261     /** \mv1[0]: horizontal motion vector for future reference */
262     /** \mv1[1]: vertical motion vector for future reference */
263     unsigned short  mv0[2];  /* past reference */
264     unsigned short  mv1[2];  /* future reference */
265 } VAMotionVector;
266 
267 /*
268  * Initialization:
269  * A display must be obtained by calling vaGetDisplay() before calling
270  * vaInitialize() and other functions. This connects the API to the
271  * native window system.
272  * For X Windows, native_dpy would be from XOpenDisplay()
273  */
274 typedef void* VANativeDisplay;	/* window system dependent */
275 
276 int vaDisplayIsValid(VADisplay dpy);
277 
278 /*
279  * Initialize the library
280  */
281 VAStatus vaInitialize (
282     VADisplay dpy,
283     int *major_version,	 /* out */
284     int *minor_version 	 /* out */
285 );
286 
287 /*
288  * After this call, all library internal resources will be cleaned up
289  */
290 VAStatus vaTerminate (
291     VADisplay dpy
292 );
293 
294 /*
295  * vaQueryVendorString returns a pointer to a zero-terminated string
296  * describing some aspects of the VA implemenation on a specific
297  * hardware accelerator. The format of the returned string is vendor
298  * specific and at the discretion of the implementer.
299  * e.g. for the Intel GMA500 implementation, an example would be:
300  * "Intel GMA500 - 2.0.0.32L.0005"
301  */
302 const char *vaQueryVendorString (
303     VADisplay dpy
304 );
305 
306 typedef int (*VAPrivFunc)();
307 
308 /*
309  * Return a function pointer given a function name in the library.
310  * This allows private interfaces into the library
311  */
312 VAPrivFunc vaGetLibFunc (
313     VADisplay dpy,
314     const char *func
315 );
316 
317 /* Currently defined profiles */
318 typedef enum
319 {
320     /** \brief Profile ID used for video processing. */
321     VAProfileNone                       = -1,
322     VAProfileMPEG2Simple		= 0,
323     VAProfileMPEG2Main			= 1,
324     VAProfileMPEG4Simple		= 2,
325     VAProfileMPEG4AdvancedSimple	= 3,
326     VAProfileMPEG4Main			= 4,
327     VAProfileH264Baseline		= 5,
328     VAProfileH264Main			= 6,
329     VAProfileH264High			= 7,
330     VAProfileVC1Simple			= 8,
331     VAProfileVC1Main			= 9,
332     VAProfileVC1Advanced		= 10,
333     VAProfileH263Baseline		= 11,
334     VAProfileJPEGBaseline               = 12,
335     VAProfileH264ConstrainedBaseline    = 13,
336     VAProfileVP8Version0_3              = 14,
337     VAProfileH264MultiviewHigh          = 15,
338     VAProfileH264StereoHigh             = 16,
339     VAProfileHEVCMain                   = 17,
340     VAProfileHEVCMain10                 = 18,
341     VAProfileVP9Version0                = 19,
342     VAProfileAVS                        = 20,
343     VAProfileMax
344 } VAProfile;
345 
346 /*
347  *  Currently defined entrypoints
348  */
349 typedef enum
350 {
351     VAEntrypointVLD		= 1,
352     VAEntrypointIZZ		= 2,
353     VAEntrypointIDCT		= 3,
354     VAEntrypointMoComp		= 4,
355     VAEntrypointDeblocking	= 5,
356     VAEntrypointEncSlice	= 6,	/* slice level encode */
357     VAEntrypointEncPicture 	= 7,	/* pictuer encode, JPEG, etc */
358     /*
359      * For an implementation that supports a low power/high performance variant
360      * for slice level encode, it can choose to expose the
361      * VAEntrypointEncSliceLP entrypoint. Certain encoding tools may not be
362      * available with this entrypoint (e.g. interlace, MBAFF) and the
363      * application can query the encoding configuration attributes to find
364      * out more details if this entrypoint is supported.
365      */
366     VAEntrypointEncSliceLP 	= 8,
367     VAEntrypointVideoProc       = 10,   /**< Video pre/post-processing. */
368 
369     /**
370      * \brief Intel specific entrypoints start at 1001
371      */
372     /**
373      * \brief VAEntrypointEncFEIIntel
374      *
375      * The purpose of FEI (Flexible Encoding Infrastructure) is to allow applications to
376      * have more controls and trade off quality for speed with their own IPs. A pre-processing
377      * function for getting some statistics and motion vectors is added
378      * and some extra controls for Encode pipeline are provided.
379      * The application can optionally call the statistics function
380      * to get motion vectors and statistics before calling encode function.
381      * The application can also optionally provide input to VME for extra
382      * encode control and get the output from VME. Application can chose to
383      * modify the VME output/PAK input during encoding, but the performance
384      * impact is significant.
385      *
386      * On top of the existing buffers for normal encode, there will be
387      * one extra input buffer (VAEncMiscParameterIntelFEIFrameControl) and
388      * three extra output buffers (VAIntelEncFEIMVBufferType, VAIntelEncFEIModeBufferType
389      * and VAIntelEncFEIDistortionBufferType) for VAEntrypointIntelEncFEI entry function.
390      * If separate PAK is set, two extra input buffers
391      * (VAIntelEncFEIMVBufferType, VAIntelEncFEIModeBufferType) are needed for PAK input.
392      *
393      **/
394     VAEntrypointEncFEIIntel     = 1001,
395     /**
396      * \brief VAEntrypointStatisticsIntel
397      *
398      * Statistics, like variances, distortions, motion vectors can be obtained
399      * via this entry point. Checking whether Statistics is supported can be
400      * performed with vaQueryConfigEntrypoints() and the profile argument
401      * set to #VAProfileNone. If Statistics entry point is supported,
402      * then the list of returned entry-points will include #VAEntrypointIntelStatistics.
403      * Supported pixel format, maximum resolution and statistics specific attributes
404      * can be obtained via normal attribute query.
405      * One input buffer (VAIntelStatsStatisticsParameterBufferType) and one or two
406      * output buffers (VAIntelStatsStatisticsBufferType and VAIntelStatsMotionVectorBufferType)
407      * are needed for this entry point.
408      *
409      **/
410     VAEntrypointStatisticsIntel,
411     VAEntrypointMax
412 } VAEntrypoint;
413 
414 /* Currently defined configuration attribute types */
415 typedef enum
416 {
417     VAConfigAttribRTFormat		= 0,
418     VAConfigAttribSpatialResidual	= 1,
419     VAConfigAttribSpatialClipping	= 2,
420     VAConfigAttribIntraResidual		= 3,
421     VAConfigAttribEncryption		= 4,
422     VAConfigAttribRateControl		= 5,
423 
424     /** @name Attributes for decoding */
425     /**@{*/
426     /**
427      * \brief Slice Decoding mode. Read/write.
428      *
429      * This attribute determines what mode the driver supports for slice
430      * decoding, through vaGetConfigAttributes(); and what mode the user
431      * will be providing to the driver, through vaCreateConfig(), if the
432      * driver supports those. If this attribute is not set by the user then
433      * it is assumed that VA_DEC_SLICE_MODE_NORMAL mode is used.
434      *
435      * See \c VA_DEC_SLICE_MODE_xxx for the list of slice decoding modes.
436      */
437     VAConfigAttribDecSliceMode		= 6,
438    /**
439      * \brief JPEG decoding attribute. Read-only.
440      *
441      * This attribute exposes a number of capabilities of the underlying
442      * JPEG implementation. The attribute value is partitioned into fields as defined in the
443      * VAConfigAttribValDecJPEG union.
444      */
445     VAConfigAttribDecJPEG             = 7,
446 
447     /** @name Attributes for encoding */
448     /**@{*/
449     /**
450      * \brief Packed headers mode. Read/write.
451      *
452      * This attribute determines what packed headers the driver supports,
453      * through vaGetConfigAttributes(); and what packed headers the user
454      * will be providing to the driver, through vaCreateConfig(), if the
455      * driver supports those.
456      *
457      * See \c VA_ENC_PACKED_HEADER_xxx for the list of packed headers.
458      */
459     VAConfigAttribEncPackedHeaders      = 10,
460     /**
461      * \brief Interlaced mode. Read/write.
462      *
463      * This attribute determines what kind of interlaced encoding mode
464      * the driver supports.
465      *
466      * See \c VA_ENC_INTERLACED_xxx for the list of interlaced modes.
467      */
468     VAConfigAttribEncInterlaced         = 11,
469     /**
470      * \brief Maximum number of reference frames. Read-only.
471      *
472      * This attribute determines the maximum number of reference
473      * frames supported for encoding.
474      *
475      * Note: for H.264 encoding, the value represents the maximum number
476      * of reference frames for both the reference picture list 0 (bottom
477      * 16 bits) and the reference picture list 1 (top 16 bits).
478      */
479     VAConfigAttribEncMaxRefFrames       = 13,
480     /**
481      * \brief Maximum number of slices per frame. Read-only.
482      *
483      * This attribute determines the maximum number of slices the
484      * driver can support to encode a single frame.
485      */
486     VAConfigAttribEncMaxSlices          = 14,
487     /**
488      * \brief Slice structure. Read-only.
489      *
490      * This attribute determines slice structures supported by the
491      * driver for encoding. This attribute is a hint to the user so
492      * that he can choose a suitable surface size and how to arrange
493      * the encoding process of multiple slices per frame.
494      *
495      * More specifically, for H.264 encoding, this attribute
496      * determines the range of accepted values to
497      * VAEncSliceParameterBufferH264::macroblock_address and
498      * VAEncSliceParameterBufferH264::num_macroblocks.
499      *
500      * See \c VA_ENC_SLICE_STRUCTURE_xxx for the supported slice
501      * structure types.
502      */
503     VAConfigAttribEncSliceStructure     = 15,
504     /**
505      * \brief Macroblock information. Read-only.
506      *
507      * This attribute determines whether the driver supports extra
508      * encoding information per-macroblock. e.g. QP.
509      *
510      * More specifically, for H.264 encoding, if the driver returns a non-zero
511      * value for this attribute, this means the application can create
512      * additional #VAEncMacroblockParameterBufferH264 buffers referenced
513      * through VAEncSliceParameterBufferH264::macroblock_info.
514      */
515     VAConfigAttribEncMacroblockInfo     = 16,
516     /**
517      * \brief Auto reference frame management. Read-only
518      *
519      * This attribute determines whether the driver supports auto reference management
520      *
521      * If driver supports, application only needs to set scratch reference surfaces
522      * via VAPictureParameterBufferH264:ReferenceFrames. The scratch surfaces number is
523      * determined by the maximum number of RefPicList0 and RefPicList0 which can be queried from
524      * VAConfigAttribEncMaxRefFrames. Application doesn't need to set VAPictureParameterBufferH264:CurrPic
525      * and VAEncSliceParameterBufferH264:RefPicList. Driver will manage the reference frames internally
526      * and choose the best reference frames. Which scratch surface is used for reconstructed frame and which
527      * surfaces are used for reference frames will be fedback via VACodedBufferSegment
528      */
529     VAConfigAttribEncAutoReference     = 17,
530     /**
531      * \brief Maximum picture width. Read-only.
532      *
533      * This attribute determines the maximum picture width the driver supports
534      * for a given configuration.
535      */
536     VAConfigAttribMaxPictureWidth     = 18,
537     /**
538      * \brief Maximum picture height. Read-only.
539      *
540      * This attribute determines the maximum picture height the driver supports
541      * for a given configuration.
542      */
543     VAConfigAttribMaxPictureHeight    = 19,
544     /**
545      * \brief JPEG encoding attribute. Read-only.
546      *
547      * This attribute exposes a number of capabilities of the underlying
548      * JPEG implementation. The attribute value is partitioned into fields as defined in the
549      * VAConfigAttribValEncJPEG union.
550      */
551     VAConfigAttribEncJPEG             = 20,
552     /**
553      * \brief Encoding quality range attribute. Read-only.
554      *
555      * This attribute conveys whether the driver supports different quality level settings
556      * for encoding. A value less than or equal to 1 means that the encoder only has a single
557      * quality setting, and a value greater than 1 represents the number of quality levels
558      * that can be configured. e.g. a value of 2 means there are two distinct quality levels.
559      */
560     VAConfigAttribEncQualityRange     = 21,
561     /**
562      * \brief Encoding quantization attribute. Read-only.
563      *
564      * This attribute conveys whether the driver supports certain types of quantization methods
565      * for encoding (e.g. trellis).
566      */
567     VAConfigAttribEncQuantization     = 22,
568     /**
569      * \brief Encoding intra refresh attribute. Read-only.
570      *
571      * This attribute conveys whether the driver supports certain types of intra refresh methods
572      * for encoding (e.g. adaptive intra refresh or rolling intra refresh).
573      */
574     VAConfigAttribEncIntraRefresh     = 23,
575     /**
576      * \brief Encoding skip frame attribute. Read-only.
577      *
578      * This attribute conveys whether the driver supports sending skip frame parameters
579      * (VAEncMiscParameterTypeSkipFrame) to the encoder's rate control, when the user has
580      * externally skipped frames.  It is a boolean value 0 - unsupported, 1 - supported.
581      */
582     VAConfigAttribEncSkipFrame        = 24,
583     /**
584      * \brief Encoding region-of-interest (ROI) attribute. Read-only.
585      *
586      * This attribute conveys whether the driver supports region-of-interest (ROI) encoding,
587      * based on user provided ROI rectangles.  The attribute value returned indicates the number
588      * of regions that are supported.  e.g. A value of 0 means ROI encoding is not supported.
589      * If ROI encoding is supported, the ROI information is passed to the driver using
590      * VAEncMiscParameterTypeRoi.
591      */
592     VAConfigAttribEncRoi              = 25,
593     /**
594      * \brief Encoding extended rate control attribute. Read-only.
595      *
596      * This attribute conveys whether the driver supports any extended rate control features
597      * The attribute value is partitioned into fields as defined in the
598      * VAConfigAttribValEncRateControlExt union.
599      */
600     VAConfigAttribEncRateControlExt   = 26,
601     /**
602      * \brief Intel specific attributes start at 1001
603      */
604     /**
605      * \brief Encode function type.
606      *
607      * This attribute conveys whether the driver supports different function types for encode.
608      * It can be ENC, PAK, or ENC + PAK. Currently it is for FEI entry point only.
609      * Default is ENC + PAK.
610      */
611     VAConfigAttribEncFunctionTypeIntel = 1001,
612     /**
613      * \brief Maximum number of MV predictors. Read-only.
614      *
615      * This attribute determines the maximum number of MV predictors the driver
616      * can support to encode a single frame. 0 means no MV predictor is supported.
617      */
618     VAConfigAttribEncMVPredictorsIntel,
619     /**
620      * \brief Statistics attribute. Read-only.
621      *
622      * This attribute exposes a number of capabilities of the VAEntrypointStatistics entry
623      * point. The attribute value is partitioned into fields as defined in the
624      * VAConfigAttribValStatistics union.
625      */
626     VAConfigAttribStatisticsIntel,
627     /**@}*/
628     VAConfigAttribTypeMax
629 } VAConfigAttribType;
630 
631 /*
632  * Configuration attributes
633  * If there is more than one value for an attribute, a default
634  * value will be assigned to the attribute if the client does not
635  * specify the attribute when creating a configuration
636  */
637 typedef struct _VAConfigAttrib {
638     VAConfigAttribType type;
639     unsigned int value; /* OR'd flags (bits) for this attribute */
640 } VAConfigAttrib;
641 
642 /* attribute value for VAConfigAttribRTFormat */
643 #define VA_RT_FORMAT_YUV420	0x00000001
644 #define VA_RT_FORMAT_YUV422	0x00000002
645 #define VA_RT_FORMAT_YUV444	0x00000004
646 #define VA_RT_FORMAT_YUV411	0x00000008
647 #define VA_RT_FORMAT_YUV400	0x00000010
648 #define VA_RT_FORMAT_RGB16	0x00010000
649 #define VA_RT_FORMAT_RGB32	0x00020000
650 /* RGBP covers RGBP and BGRP fourcc */
651 #define VA_RT_FORMAT_RGBP	0x00100000
652 #define VA_RT_FORMAT_PROTECTED	0x80000000
653 
654 /** @name Attribute values for VAConfigAttribRateControl */
655 /**@{*/
656 /** \brief Driver does not support any form of rate control. */
657 #define VA_RC_NONE                      0x00000001
658 /** \brief Constant bitrate. */
659 #define VA_RC_CBR                       0x00000002
660 /** \brief Variable bitrate. */
661 #define VA_RC_VBR                       0x00000004
662 /** \brief Video conference mode. */
663 #define VA_RC_VCM                       0x00000008
664 /** \brief Constant QP. */
665 #define VA_RC_CQP                       0x00000010
666 /** \brief Variable bitrate with peak rate higher than average bitrate. */
667 #define VA_RC_VBR_CONSTRAINED           0x00000020
668 /** \brief Intelligent Constant Quality. Provided an initial ICQ_quality_factor,
669  *  adjusts QP at a frame and MB level based on motion to improve subjective quality. */
670 #define VA_RC_ICQ			0x00000040
671 /** \brief Macroblock based rate control.  Per MB control is decided
672  *  internally in the encoder. It may be combined with other RC modes, except CQP. */
673 #define VA_RC_MB                        0x00000080
674 
675 /**@}*/
676 
677 /** @name Attribute values for VAConfigAttribDecSliceMode */
678 /**@{*/
679 /** \brief Driver supports normal mode for slice decoding */
680 #define VA_DEC_SLICE_MODE_NORMAL       0x00000001
681 /** \brief Driver supports base mode for slice decoding */
682 #define VA_DEC_SLICE_MODE_BASE         0x00000002
683 
684 /** @name Attribute values for VAConfigAttribDecJPEG */
685 /**@{*/
686 typedef union _VAConfigAttribValDecJPEG {
687     /** \brief Set to (1 << VA_ROTATION_xxx) for supported rotation angles. */
688     unsigned int rotation;
689     /** \brief Reserved for future use. */
690     unsigned int reserved[3];
691 } VAConfigAttribValDecJPEG;
692 /** \brief Driver supports subsample mode for slice decoding */
693 #define VA_DEC_SLICE_MODE_SUBSAMPLE    0x00000004
694 
695 /**@}*/
696 
697 /** @name Attribute values for VAConfigAttribEncPackedHeaders */
698 /**@{*/
699 /** \brief Driver does not support any packed headers mode. */
700 #define VA_ENC_PACKED_HEADER_NONE       0x00000000
701 /** \brief Driver supports packed sequence headers. e.g. SPS for H.264. */
702 #define VA_ENC_PACKED_HEADER_SEQUENCE   0x00000001
703 /** \brief Driver supports packed picture headers. e.g. PPS for H.264. */
704 #define VA_ENC_PACKED_HEADER_PICTURE    0x00000002
705 /** \brief Driver supports packed slice headers. e.g. \c slice_header() for H.264. */
706 #define VA_ENC_PACKED_HEADER_SLICE      0x00000004
707 /** \brief Driver supports misc packed headers. e.g. SEI for H.264. */
708 #define VA_ENC_PACKED_HEADER_MISC       0x00000008
709 /** \brief Driver supports raw packed header, see VAEncPackedHeaderRawData */
710 #define VA_ENC_PACKED_HEADER_RAW_DATA   0x0000000C
711 /**@}*/
712 
713 /** @name Attribute values for VAConfigAttribEncInterlaced */
714 /**@{*/
715 /** \brief Driver does not support interlaced coding. */
716 #define VA_ENC_INTERLACED_NONE          0x00000000
717 /** \brief Driver supports interlaced frame coding. */
718 #define VA_ENC_INTERLACED_FRAME         0x00000001
719 /** \brief Driver supports interlaced field coding. */
720 #define VA_ENC_INTERLACED_FIELD         0x00000002
721 /** \brief Driver supports macroblock adaptive frame field coding. */
722 #define VA_ENC_INTERLACED_MBAFF         0x00000004
723 /** \brief Driver supports picture adaptive frame field coding. */
724 #define VA_ENC_INTERLACED_PAFF          0x00000008
725 /**@}*/
726 
727 /** @name Attribute values for VAConfigAttribEncSliceStructure */
728 /**@{*/
729 /** \brief Driver supports an arbitrary number of rows per slice. */
730 #define VA_ENC_SLICE_STRUCTURE_ARBITRARY_ROWS           0x00000000
731 /** \brief Driver supports a power-of-two number of rows per slice. */
732 #define VA_ENC_SLICE_STRUCTURE_POWER_OF_TWO_ROWS        0x00000001
733 /** \brief Driver supports an arbitrary number of rows per slice. */
734 #define VA_ENC_SLICE_STRUCTURE_ARBITRARY_MACROBLOCKS    0x00000002
735 /** \brief Driver supports any number of rows per slice but they must be the same
736 	for all slices except for the last one, which must be equal or smaller
737 	to the previous slices. */
738 #define VA_ENC_SLICE_STRUCTURE_EQUAL_ROWS    		0x00000004
739 /** \brief Driver supports a maximum slice size requested by the app.
740 	The size is sent in VAEncMiscParameterMaxSliceSize. */
741 #define VA_ENC_SLICE_STRUCTURE_MAX_SLICE_SIZE           0x00000008
742 /**@}*/
743 
744 /** \brief Attribute value for VAConfigAttribEncJPEG */
745 typedef union _VAConfigAttribValEncJPEG {
746     struct {
747         /** \brief set to 1 for arithmatic coding. */
748         unsigned int arithmatic_coding_mode : 1;
749         /** \brief set to 1 for progressive dct. */
750         unsigned int progressive_dct_mode : 1;
751         /** \brief set to 1 for non-interleaved. */
752         unsigned int non_interleaved_mode : 1;
753         /** \brief set to 1 for differential. */
754         unsigned int differential_mode : 1;
755         unsigned int max_num_components : 3;
756         unsigned int max_num_scans : 4;
757         unsigned int max_num_huffman_tables : 3;
758         unsigned int max_num_quantization_tables : 3;
759     } bits;
760     unsigned int value;
761 } VAConfigAttribValEncJPEG;
762 
763 /** @name Attribute values for VAConfigAttribEncQuantization */
764 /**@{*/
765 /** \brief Driver does not support special types of quantization */
766 #define VA_ENC_QUANTIZATION_NONE                        0x00000000
767 /** \brief Driver supports trellis quantization */
768 #define VA_ENC_QUANTIZATION_TRELLIS_SUPPORTED           0x00000001
769 /**@}*/
770 
771 /** @name Attribute values for VAConfigAttribEncIntraRefresh */
772 /**@{*/
773 /** \brief Driver does not support intra refresh */
774 #define VA_ENC_INTRA_REFRESH_NONE                       0x00000000
775 /** \brief Driver supports column based rolling intra refresh */
776 #define VA_ENC_INTRA_REFRESH_ROLLING_COLUMN             0x00000001
777 /** \brief Driver supports row based rolling intra refresh */
778 #define VA_ENC_INTRA_REFRESH_ROLLING_ROW                0x00000002
779 /** \brief Driver supports adaptive intra refresh */
780 #define VA_ENC_INTRA_REFRESH_ADAPTIVE                   0x00000010
781 /** \brief Driver supports cyclic intra refresh */
782 #define VA_ENC_INTRA_REFRESH_CYCLIC                     0x00000020
783 
784 /**@}*/
785 
786 /** \brief Attribute value for VAConfigAttribEncRateControlExt */
787 typedef union _VAConfigAttribValEncRateControlExt {
788     struct {
789         /** \brief The number of temporal layers with layer specific bit-rate targets
790          * that are supported. The application will send multiple
791          * VAEncMiscParameterRateControl and VAEncMiscParameterFrameRate structures
792          * for each layer, using the temporal_id field as the layer identifier.
793          * If per temporal layer rate control is not supported,
794          * num_temporal_layers_minus1 will be 0 and the temporal_id field in
795          * VAEncMiscParameterRateControl and VAEncMiscParameterFrameRate will be ignored.
796          */
797      unsigned int num_temporal_layers_minus1 : 8;
798      unsigned int reserved                   : 24;
799      } bits;
800      unsigned int value;
801 } VAConfigAttribValEncRateControlExt;
802 
803 /**
804  * \brief Intel specific attribute definitions
805  */
806 /** @name Attribute values for VAConfigAttribEncFunctionTypeIntel
807  *
808  * The desired type should be passed to driver when creating the configuration.
809  * If VA_ENC_FUNCTION_ENC_PAK is set, VA_ENC_FUNCTION_ENC and VA_ENC_FUNCTION_PAK
810  * will be ignored if set also.  VA_ENC_FUNCTION_ENC and VA_ENC_FUNCTION_PAK operations
811  * shall be called separately if ENC and PAK (VA_ENC_FUNCTION_ENC | VA_ENC_FUNCTION_PAK)
812  * is set for configuration. VA_ENC_FUNCTION_ENC_PAK is recommended for best performance.
813  * If only VA_ENC_FUNCTION_ENC is set, there will be no bitstream output.
814  * If VA_ENC_FUNCTION_ENC_PAK is not set and VA_ENC_FUNCTION_PAK is set, then two extra
815  * input buffers for PAK are needed: VAEncFEIMVBufferType and VAEncFEIModeBufferType.
816  **/
817 /**@{*/
818 /** \brief Only default is supported */
819 #define VA_ENC_FUNCTION_DEFAULT_INTEL                         0x00000000
820 /** \brief ENC only is supported */
821 #define VA_ENC_FUNCTION_ENC_INTEL                             0x00000001
822 /** \brief PAK only is supported */
823 #define VA_ENC_FUNCTION_PAK_INTEL                             0x00000002
824 /** \brief ENC_PAK is supported */
825 #define VA_ENC_FUNCTION_ENC_PAK_INTEL                         0x00000004
826 
827 /**@}*/
828 
829 /** \brief Attribute value for VAConfigAttribStatisticsIntel */
830 typedef union _VAConfigAttribValStatisticsIntel {
831     struct {
832         /** \brief Max number of past reference frames that are supported. */
833         unsigned int	max_num_past_references   : 4;
834         /** \brief Max number of future reference frames that are supported. */
835         unsigned int	max_num_future_references : 4;
836         /** \brief Number of output surfaces that are supported */
837         unsigned int	num_outputs               : 3;
838         /** \brief Interlaced content is supported */
839         unsigned int    interlaced                : 1;
840         unsigned int	reserved                  : 20;
841     } bits;
842     unsigned int value;
843 } VAConfigAttribValStatisticsIntel;
844 
845 /*
846  * if an attribute is not applicable for a given
847  * profile/entrypoint pair, then set the value to the following
848  */
849 #define VA_ATTRIB_NOT_SUPPORTED 0x80000000
850 
851 /* Get maximum number of profiles supported by the implementation */
852 int vaMaxNumProfiles (
853     VADisplay dpy
854 );
855 
856 /* Get maximum number of entrypoints supported by the implementation */
857 int vaMaxNumEntrypoints (
858     VADisplay dpy
859 );
860 
861 /* Get maximum number of attributs supported by the implementation */
862 int vaMaxNumConfigAttributes (
863     VADisplay dpy
864 );
865 
866 /*
867  * Query supported profiles
868  * The caller must provide a "profile_list" array that can hold at
869  * least vaMaxNumProfile() entries. The actual number of profiles
870  * returned in "profile_list" is returned in "num_profile".
871  */
872 VAStatus vaQueryConfigProfiles (
873     VADisplay dpy,
874     VAProfile *profile_list,	/* out */
875     int *num_profiles		/* out */
876 );
877 
878 /*
879  * Query supported entrypoints for a given profile
880  * The caller must provide an "entrypoint_list" array that can hold at
881  * least vaMaxNumEntrypoints() entries. The actual number of entrypoints
882  * returned in "entrypoint_list" is returned in "num_entrypoints".
883  */
884 VAStatus vaQueryConfigEntrypoints (
885     VADisplay dpy,
886     VAProfile profile,
887     VAEntrypoint *entrypoint_list,	/* out */
888     int *num_entrypoints		/* out */
889 );
890 
891 /*
892  * Get attributes for a given profile/entrypoint pair
893  * The caller must provide an "attrib_list" with all attributes to be
894  * retrieved.  Upon return, the attributes in "attrib_list" have been
895  * updated with their value.  Unknown attributes or attributes that are
896  * not supported for the given profile/entrypoint pair will have their
897  * value set to VA_ATTRIB_NOT_SUPPORTED
898  */
899 VAStatus vaGetConfigAttributes (
900     VADisplay dpy,
901     VAProfile profile,
902     VAEntrypoint entrypoint,
903     VAConfigAttrib *attrib_list, /* in/out */
904     int num_attribs
905 );
906 
907 /* Generic ID type, can be re-typed for specific implementation */
908 typedef unsigned int VAGenericID;
909 
910 typedef VAGenericID VAConfigID;
911 
912 /*
913  * Create a configuration for the decode pipeline
914  * it passes in the attribute list that specifies the attributes it cares
915  * about, with the rest taking default values.
916  */
917 VAStatus vaCreateConfig (
918     VADisplay dpy,
919     VAProfile profile,
920     VAEntrypoint entrypoint,
921     VAConfigAttrib *attrib_list,
922     int num_attribs,
923     VAConfigID *config_id /* out */
924 );
925 
926 /*
927  * Free resources associdated with a given config
928  */
929 VAStatus vaDestroyConfig (
930     VADisplay dpy,
931     VAConfigID config_id
932 );
933 
934 /*
935  * Query all attributes for a given configuration
936  * The profile of the configuration is returned in "profile"
937  * The entrypoint of the configuration is returned in "entrypoint"
938  * The caller must provide an "attrib_list" array that can hold at least
939  * vaMaxNumConfigAttributes() entries. The actual number of attributes
940  * returned in "attrib_list" is returned in "num_attribs"
941  */
942 VAStatus vaQueryConfigAttributes (
943     VADisplay dpy,
944     VAConfigID config_id,
945     VAProfile *profile, 	/* out */
946     VAEntrypoint *entrypoint, 	/* out */
947     VAConfigAttrib *attrib_list,/* out */
948     int *num_attribs 		/* out */
949 );
950 
951 
952 /*
953  * Contexts and Surfaces
954  *
955  * Context represents a "virtual" video decode pipeline. Surfaces are render
956  * targets for a given context. The data in the surfaces are not accessible
957  * to the client and the internal data format of the surface is implementatin
958  * specific.
959  *
960  * Surfaces will be bound to a context when the context is created. Once
961  * a surface is bound to a given context, it can not be used to create
962  * another context. The association is removed when the context is destroyed
963  *
964  * Both contexts and surfaces are identified by unique IDs and its
965  * implementation specific internals are kept opaque to the clients
966  */
967 
968 typedef VAGenericID VAContextID;
969 
970 typedef VAGenericID VASurfaceID;
971 
972 #define VA_INVALID_ID		0xffffffff
973 #define VA_INVALID_SURFACE	VA_INVALID_ID
974 
975 /** \brief Generic value types. */
976 typedef enum  {
977     VAGenericValueTypeInteger = 1,      /**< 32-bit signed integer. */
978     VAGenericValueTypeFloat,            /**< 32-bit floating-point value. */
979     VAGenericValueTypePointer,          /**< Generic pointer type */
980     VAGenericValueTypeFunc              /**< Pointer to function */
981 } VAGenericValueType;
982 
983 /** \brief Generic function type. */
984 typedef void (*VAGenericFunc)(void);
985 
986 /** \brief Generic value. */
987 typedef struct _VAGenericValue {
988     /** \brief Value type. See #VAGenericValueType. */
989     VAGenericValueType  type;
990     /** \brief Value holder. */
991     union {
992         /** \brief 32-bit signed integer. */
993         int             i;
994         /** \brief 32-bit float. */
995         float           f;
996         /** \brief Generic pointer. */
997         void           *p;
998         /** \brief Pointer to function. */
999         VAGenericFunc   fn;
1000     }                   value;
1001 } VAGenericValue;
1002 
1003 /** @name Surface attribute flags */
1004 /**@{*/
1005 /** \brief Surface attribute is not supported. */
1006 #define VA_SURFACE_ATTRIB_NOT_SUPPORTED 0x00000000
1007 /** \brief Surface attribute can be got through vaQuerySurfaceAttributes(). */
1008 #define VA_SURFACE_ATTRIB_GETTABLE      0x00000001
1009 /** \brief Surface attribute can be set through vaCreateSurfaces(). */
1010 #define VA_SURFACE_ATTRIB_SETTABLE      0x00000002
1011 /**@}*/
1012 
1013 /** \brief Surface attribute types. */
1014 typedef enum {
1015     VASurfaceAttribNone = 0,
1016     /**
1017      * \brief Pixel format (fourcc).
1018      *
1019      * The value is meaningful as input to vaQuerySurfaceAttributes().
1020      * If zero, the driver returns the optimal pixel format for the
1021      * specified config. Otherwise, if non-zero, the value represents
1022      * a pixel format (FOURCC) that is kept as is on output, if the
1023      * driver supports it. Otherwise, the driver sets the value to
1024      * zero and drops the \c VA_SURFACE_ATTRIB_SETTABLE flag.
1025      */
1026     VASurfaceAttribPixelFormat,
1027     /** \brief Minimal width in pixels (int, read-only). */
1028     VASurfaceAttribMinWidth,
1029     /** \brief Maximal width in pixels (int, read-only). */
1030     VASurfaceAttribMaxWidth,
1031     /** \brief Minimal height in pixels (int, read-only). */
1032     VASurfaceAttribMinHeight,
1033     /** \brief Maximal height in pixels (int, read-only). */
1034     VASurfaceAttribMaxHeight,
1035     /** \brief Surface memory type expressed in bit fields (int, read/write). */
1036     VASurfaceAttribMemoryType,
1037     /** \brief External buffer descriptor (pointer, write). */
1038     VASurfaceAttribExternalBufferDescriptor,
1039     /** \brief Surface usage hint, gives the driver a hint of intended usage
1040      *  to optimize allocation (e.g. tiling) (int, read/write). */
1041     VASurfaceAttribUsageHint,
1042     /** \brief Number of surface attributes. */
1043     VASurfaceAttribCount
1044 } VASurfaceAttribType;
1045 
1046 /** \brief Surface attribute. */
1047 typedef struct _VASurfaceAttrib {
1048     /** \brief Type. */
1049     VASurfaceAttribType type;
1050     /** \brief Flags. See "Surface attribute flags". */
1051     unsigned int        flags;
1052     /** \brief Value. See "Surface attribute types" for the expected types. */
1053     VAGenericValue      value;
1054 } VASurfaceAttrib;
1055 
1056 /**
1057  * @name VASurfaceAttribMemoryType values in bit fields.
1058  * Bit 0:7 are reserved for generic types, Bit 31:28 are reserved for
1059  * Linux DRM, Bit 23:20 are reserved for Android. DRM and Android specific
1060  * types are defined in DRM and Android header files.
1061  */
1062 /**@{*/
1063 /** \brief VA memory type (default) is supported. */
1064 #define VA_SURFACE_ATTRIB_MEM_TYPE_VA			0x00000001
1065 /** \brief V4L2 buffer memory type is supported. */
1066 #define VA_SURFACE_ATTRIB_MEM_TYPE_V4L2			0x00000002
1067 /** \brief User pointer memory type is supported. */
1068 #define VA_SURFACE_ATTRIB_MEM_TYPE_USER_PTR		0x00000004
1069 /**@}*/
1070 
1071 /**
1072  * \brief VASurfaceAttribExternalBuffers structure for
1073  * the VASurfaceAttribExternalBufferDescriptor attribute.
1074  */
1075 typedef struct _VASurfaceAttribExternalBuffers {
1076     /** \brief pixel format in fourcc. */
1077     unsigned int pixel_format;
1078     /** \brief width in pixels. */
1079     unsigned int width;
1080     /** \brief height in pixels. */
1081     unsigned int height;
1082     /** \brief total size of the buffer in bytes. */
1083     unsigned int data_size;
1084     /** \brief number of planes for planar layout */
1085     unsigned int num_planes;
1086     /** \brief pitch for each plane in bytes */
1087     unsigned int pitches[4];
1088     /** \brief offset for each plane in bytes */
1089     unsigned int offsets[4];
1090     /** \brief buffer handles or user pointers */
1091     unsigned long *buffers;
1092     /** \brief number of elements in the "buffers" array */
1093     unsigned int num_buffers;
1094     /** \brief flags. See "Surface external buffer descriptor flags". */
1095     unsigned int flags;
1096     /** \brief reserved for passing private data */
1097     void *private_data;
1098 } VASurfaceAttribExternalBuffers;
1099 
1100 /** @name VASurfaceAttribExternalBuffers flags */
1101 /**@{*/
1102 /** \brief Enable memory tiling */
1103 #define VA_SURFACE_EXTBUF_DESC_ENABLE_TILING	0x00000001
1104 /** \brief Memory is cacheable */
1105 #define VA_SURFACE_EXTBUF_DESC_CACHED		0x00000002
1106 /** \brief Memory is non-cacheable */
1107 #define VA_SURFACE_EXTBUF_DESC_UNCACHED		0x00000004
1108 /** \brief Memory is write-combined */
1109 #define VA_SURFACE_EXTBUF_DESC_WC		0x00000008
1110 /** \brief Memory is protected */
1111 #define VA_SURFACE_EXTBUF_DESC_PROTECTED        0x80000000
1112 
1113 /** @name VASurfaceAttribUsageHint attribute usage hint flags */
1114 /**@{*/
1115 /** \brief Surface usage not indicated. */
1116 #define VA_SURFACE_ATTRIB_USAGE_HINT_GENERIC 	0x00000000
1117 /** \brief Surface used by video decoder. */
1118 #define VA_SURFACE_ATTRIB_USAGE_HINT_DECODER 	0x00000001
1119 /** \brief Surface used by video encoder. */
1120 #define VA_SURFACE_ATTRIB_USAGE_HINT_ENCODER 	0x00000002
1121 /** \brief Surface read by video post-processing. */
1122 #define VA_SURFACE_ATTRIB_USAGE_HINT_VPP_READ 	0x00000004
1123 /** \brief Surface written by video post-processing. */
1124 #define VA_SURFACE_ATTRIB_USAGE_HINT_VPP_WRITE 	0x00000008
1125 /** \brief Surface used for display. */
1126 #define VA_SURFACE_ATTRIB_USAGE_HINT_DISPLAY 	0x00000010
1127 
1128 /**@}*/
1129 
1130 /**
1131  * \brief Queries surface attributes for the supplied config.
1132  *
1133  * Unlike vaGetSurfaceAttributes(), this function queries for all
1134  * supported attributes for the supplied VA @config. In particular, if
1135  * the underlying hardware supports the creation of VA surfaces in
1136  * various formats, then this function will enumerate all pixel
1137  * formats that are supported.
1138  *
1139  * The \c attrib_list array is allocated by the user and \c
1140  * num_attribs shall be initialized to the number of allocated
1141  * elements in that array. Upon successful return, the actual number
1142  * of attributes will be overwritten into \c num_attribs. Otherwise,
1143  * \c VA_STATUS_ERROR_MAX_NUM_EXCEEDED is returned and \c num_attribs
1144  * is adjusted to the number of elements that would be returned if
1145  * enough space was available.
1146  *
1147  * Note: it is perfectly valid to pass NULL to the \c attrib_list
1148  * argument when vaQuerySurfaceAttributes() is used to determine the
1149  * actual number of elements that need to be allocated.
1150  *
1151  * @param[in] dpy               the VA display
1152  * @param[in] config            the config identifying a codec or a video
1153  *     processing pipeline
1154  * @param[out] attrib_list      the output array of #VASurfaceAttrib elements
1155  * @param[in,out] num_attribs   the number of elements allocated on
1156  *      input, the number of elements actually filled in output
1157  */
1158 VAStatus
1159 vaQuerySurfaceAttributes(
1160     VADisplay           dpy,
1161     VAConfigID          config,
1162     VASurfaceAttrib    *attrib_list,
1163     unsigned int       *num_attribs
1164 );
1165 
1166 /**
1167  * \brief Creates an array of surfaces
1168  *
1169  * Creates an array of surfaces. The optional list of attributes shall
1170  * be constructed and validated through vaGetSurfaceAttributes() or
1171  * constructed based based on what the underlying hardware could
1172  * expose through vaQuerySurfaceAttributes().
1173  *
1174  * @param[in] dpy               the VA display
1175  * @param[in] format            the desired surface format. See \c VA_RT_FORMAT_*
1176  * @param[in] width             the surface width
1177  * @param[in] height            the surface height
1178  * @param[out] surfaces         the array of newly created surfaces
1179  * @param[in] num_surfaces      the number of surfaces to create
1180  * @param[in] attrib_list       the list of (optional) attributes, or \c NULL
1181  * @param[in] num_attribs       the number of attributes supplied in
1182  *     \c attrib_list, or zero
1183  */
1184 VAStatus
1185 vaCreateSurfaces(
1186     VADisplay           dpy,
1187     unsigned int        format,
1188     unsigned int        width,
1189     unsigned int        height,
1190     VASurfaceID        *surfaces,
1191     unsigned int        num_surfaces,
1192     VASurfaceAttrib    *attrib_list,
1193     unsigned int        num_attribs
1194 );
1195 
1196 /*
1197  * vaDestroySurfaces - Destroy resources associated with surfaces.
1198  *  Surfaces can only be destroyed after the context associated has been
1199  *  destroyed.
1200  *  dpy: display
1201  *  surfaces: array of surfaces to destroy
1202  *  num_surfaces: number of surfaces in the array to be destroyed.
1203  */
1204 VAStatus vaDestroySurfaces (
1205     VADisplay dpy,
1206     VASurfaceID *surfaces,
1207     int num_surfaces
1208 );
1209 
1210 #define VA_PROGRESSIVE 0x1
1211 /*
1212  * vaCreateContext - Create a context
1213  *  dpy: display
1214  *  config_id: configuration for the context
1215  *  picture_width: coded picture width
1216  *  picture_height: coded picture height
1217  *  flag: any combination of the following:
1218  *    VA_PROGRESSIVE (only progressive frame pictures in the sequence when set)
1219  *  render_targets: render targets (surfaces) tied to the context
1220  *  num_render_targets: number of render targets in the above array
1221  *  context: created context id upon return
1222  */
1223 VAStatus vaCreateContext (
1224     VADisplay dpy,
1225     VAConfigID config_id,
1226     int picture_width,
1227     int picture_height,
1228     int flag,
1229     VASurfaceID *render_targets,
1230     int num_render_targets,
1231     VAContextID *context		/* out */
1232 );
1233 
1234 /*
1235  * vaDestroyContext - Destroy a context
1236  *  dpy: display
1237  *  context: context to be destroyed
1238  */
1239 VAStatus vaDestroyContext (
1240     VADisplay dpy,
1241     VAContextID context
1242 );
1243 
1244 /*
1245  * Buffers
1246  * Buffers are used to pass various types of data from the
1247  * client to the server. The server maintains a data store
1248  * for each buffer created, and the client idenfies a buffer
1249  * through a unique buffer id assigned by the server.
1250  */
1251 
1252 typedef VAGenericID VABufferID;
1253 
1254 typedef enum
1255 {
1256     VAPictureParameterBufferType	= 0,
1257     VAIQMatrixBufferType		= 1,
1258     VABitPlaneBufferType		= 2,
1259     VASliceGroupMapBufferType		= 3,
1260     VASliceParameterBufferType		= 4,
1261     VASliceDataBufferType		= 5,
1262     VAMacroblockParameterBufferType	= 6,
1263     VAResidualDataBufferType		= 7,
1264     VADeblockingParameterBufferType	= 8,
1265     VAImageBufferType			= 9,
1266     VAProtectedSliceDataBufferType	= 10,
1267     VAQMatrixBufferType                 = 11,
1268     VAHuffmanTableBufferType            = 12,
1269     VAProbabilityBufferType             = 13,
1270 /* Following are encode buffer types */
1271     VAEncCodedBufferType		= 21,
1272     VAEncSequenceParameterBufferType	= 22,
1273     VAEncPictureParameterBufferType	= 23,
1274     VAEncSliceParameterBufferType	= 24,
1275     VAEncPackedHeaderParameterBufferType = 25,
1276     VAEncPackedHeaderDataBufferType     = 26,
1277     VAEncMiscParameterBufferType	= 27,
1278     VAEncMacroblockParameterBufferType	= 28,
1279     VAEncMacroblockMapBufferType        = 29,
1280     VAEncQpBufferType                   = 30,
1281 /* Following are video processing buffer types */
1282     /**
1283      * \brief Video processing pipeline parameter buffer.
1284      *
1285      * This buffer describes the video processing pipeline. See
1286      * #VAProcPipelineParameterBuffer for details.
1287      */
1288     VAProcPipelineParameterBufferType   = 41,
1289     /**
1290      * \brief Video filter parameter buffer.
1291      *
1292      * This buffer describes the video filter parameters. All buffers
1293      * inherit from #VAProcFilterParameterBufferBase, thus including
1294      * a unique filter buffer type.
1295      *
1296      * The default buffer used by most filters is #VAProcFilterParameterBuffer.
1297      * Filters requiring advanced parameters include, but are not limited to,
1298      * deinterlacing (#VAProcFilterParameterBufferDeinterlacing),
1299      * color balance (#VAProcFilterParameterBufferColorBalance), etc.
1300      */
1301     VAProcFilterParameterBufferType     = 42,
1302     VAParsePictureParameterBufferType   = 43,
1303     VAParseSliceHeaderGroupBufferType   = 44,
1304 
1305     /**
1306      * \brief Intel specific buffer types start at 1001
1307      */
1308     VAEncFEIMVBufferTypeIntel                 = 1001,
1309     VAEncFEIModeBufferTypeIntel,
1310     VAEncFEIDistortionBufferTypeIntel,
1311     VAStatsStatisticsParameterBufferTypeIntel,
1312     VAStatsStatisticsBufferTypeIntel,
1313     VAStatsMotionVectorBufferTypeIntel,
1314 
1315     VABufferTypeMax
1316 } VABufferType;
1317 
1318 typedef enum
1319 {
1320     VAEncMiscParameterTypeFrameRate 	= 0,
1321     VAEncMiscParameterTypeRateControl  	= 1,
1322     VAEncMiscParameterTypeMaxSliceSize	= 2,
1323     /** \brief Buffer type used for Adaptive intra refresh */
1324     VAEncMiscParameterTypeAIR    	= 3,
1325     /** \brief Buffer type used to express a maximum frame size (in bits). */
1326     VAEncMiscParameterTypeMaxFrameSize  = 4,
1327     /** \brief Buffer type used for HRD parameters. */
1328     VAEncMiscParameterTypeHRD           = 5,
1329     VAEncMiscParameterTypeQualityLevel  = 6,
1330     /** \brief Buffer type used for Rolling intra refresh */
1331     VAEncMiscParameterTypeRIR           = 7,
1332     VAEncMiscParameterTypeQuantization  = 8,
1333     /** \brief Buffer type used for sending skip frame parameters to the encoder's
1334       * rate control, when the user has externally skipped frames. */
1335     VAEncMiscParameterTypeSkipFrame     = 9,
1336     /** \brief Buffer type used for region-of-interest (ROI) parameters. */
1337     VAEncMiscParameterTypeROI           = 10,
1338     /** \brief Buffer type used for Cyclic intra refresh */
1339     VAEncMiscParameterTypeCIR           = 11,
1340     /** \brief Buffer type used for temporal layer structure */
1341     VAEncMiscParameterTypeTemporalLayerStructure   = 12,
1342 
1343     /* Intel specific types start at 1001 */
1344     /* VAEntrypointEncFEIIntel */
1345     VAEncMiscParameterTypeFEIFrameControlIntel = 1001
1346 } VAEncMiscParameterType;
1347 
1348 /** \brief Packed header type. */
1349 typedef enum {
1350     /** \brief Packed sequence header. */
1351     VAEncPackedHeaderSequence   = 1,
1352     /** \brief Packed picture header. */
1353     VAEncPackedHeaderPicture    = 2,
1354     /** \brief Packed slice header. */
1355     VAEncPackedHeaderSlice      = 3,
1356     /**
1357      * \brief Packed raw header.
1358      *
1359      * Packed raw data header can be used by the client to insert a header
1360      * into the bitstream data buffer at the point it is passed, the driver
1361      * will handle the raw packed header based on "has_emulation_bytes" field
1362      * in the packed header parameter structure.
1363      */
1364     VAEncPackedHeaderRawData    = 4,
1365     /** \brief Misc packed header. See codec-specific definitions. */
1366     VAEncPackedHeaderMiscMask   = 0x80000000,
1367 } VAEncPackedHeaderType;
1368 
1369 /** \brief Packed header parameter. */
1370 typedef struct _VAEncPackedHeaderParameterBuffer {
1371     /** Type of the packed header buffer. See #VAEncPackedHeaderType. */
1372     unsigned int                type;
1373     /** \brief Size of the #VAEncPackedHeaderDataBuffer in bits. */
1374     unsigned int                bit_length;
1375     /** \brief Flag: buffer contains start code emulation prevention bytes? */
1376     unsigned char               has_emulation_bytes;
1377 } VAEncPackedHeaderParameterBuffer;
1378 
1379 /*
1380  *  For application, e.g. set a new bitrate
1381  *    VABufferID buf_id;
1382  *    VAEncMiscParameterBuffer *misc_param;
1383  *    VAEncMiscParameterRateControl *misc_rate_ctrl;
1384  *
1385  *    vaCreateBuffer(dpy, context, VAEncMiscParameterBufferType,
1386  *              sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterRateControl),
1387  *              1, NULL, &buf_id);
1388  *
1389  *    vaMapBuffer(dpy,buf_id,(void **)&misc_param);
1390  *    misc_param->type = VAEncMiscParameterTypeRateControl;
1391  *    misc_rate_ctrl= (VAEncMiscParameterRateControl *)misc_param->data;
1392  *    misc_rate_ctrl->bits_per_second = 6400000;
1393  *    vaUnmapBuffer(dpy, buf_id);
1394  *    vaRenderPicture(dpy, context, &buf_id, 1);
1395  */
1396 typedef struct _VAEncMiscParameterBuffer
1397 {
1398     VAEncMiscParameterType type;
1399     unsigned int data[0];
1400 } VAEncMiscParameterBuffer;
1401 
1402 /** \brief Temporal Structure*/
1403 typedef struct _VAEncMiscParameterTemporalLayerStructure
1404 {
1405     /* The number of temporal layers */
1406     uint32_t number_of_layers;
1407     /* this is Length of the sequence defining frame layer membership. Should be 1-32 */
1408     uint32_t periodicity;
1409     /*This is Array indicating the layer id for each frame in a sequence of length ts_periodicity.*/
1410     uint32_t layer_id[32];
1411 } VAEncMiscParameterTemporalLayerStructure;
1412 
1413 
1414 /** \brief Rate control parameters */
1415 typedef struct _VAEncMiscParameterRateControl
1416 {
1417     /* this is the maximum bit-rate to be constrained by the rate control implementation */
1418     unsigned int bits_per_second;
1419     /* this is the bit-rate the rate control is targeting, as a percentage of the maximum
1420      * bit-rate for example if target_percentage is 95 then the rate control will target
1421      * a bit-rate that is 95% of the maximum bit-rate
1422      */
1423     unsigned int target_percentage;
1424     /* windows size in milliseconds. For example if this is set to 500,
1425      * then the rate control will guarantee the target bit-rate over a 500 ms window
1426      */
1427     unsigned int window_size;
1428     /* initial_qp: initial QP for the first I frames
1429      * min_qp/max_qp: minimal and maximum QP frames
1430      * If set them to 0, encoder chooses the best QP according to rate control
1431      */
1432     unsigned int initial_qp;
1433     unsigned int min_qp;
1434     unsigned int max_qp;
1435     unsigned int basic_unit_size;
1436     union
1437     {
1438         struct
1439         {
1440             unsigned int reset : 1;
1441             unsigned int disable_frame_skip : 1; /* Disable frame skip in rate control mode */
1442             unsigned int disable_bit_stuffing : 1; /* Disable bit stuffing in rate control mode */
1443             unsigned int mb_rate_control : 4; /* Control VA_RC_MB 0: default, 1: enable, 2: disable, other: reserved*/
1444             /*
1445              * The temporal layer that the rate control parameters are specified for.
1446              */
1447             unsigned int temporal_id : 8;
1448             unsigned int reserved : 17;
1449         } bits;
1450         unsigned int value;
1451     } rc_flags;
1452     unsigned int ICQ_quality_factor; /* Initial ICQ quality factor: 1-51. */
1453 } VAEncMiscParameterRateControl;
1454 
1455 typedef struct _VAEncMiscParameterFrameRate
1456 {
1457     unsigned int framerate;
1458     union
1459     {
1460         struct
1461         {
1462             /*
1463              * The temporal id the framerate parameters are specified for.
1464              */
1465             unsigned int temporal_id : 8;
1466             unsigned int reserved : 24;
1467          } bits;
1468          unsigned int value;
1469      } framerate_flags;
1470 } VAEncMiscParameterFrameRate;
1471 
1472 /*
1473  * Allow a maximum slice size to be specified (in bits).
1474  * The encoder will attempt to make sure that individual slices do not exceed this size
1475  * Or to signal applicate if the slice size exceed this size, see "status" of VACodedBufferSegment
1476  */
1477 typedef struct _VAEncMiscParameterMaxSliceSize
1478 {
1479     unsigned int max_slice_size;
1480 } VAEncMiscParameterMaxSliceSize;
1481 
1482 /*
1483  * \brief Cyclic intra refresh data structure for encoding.
1484  */
1485 typedef struct _VAEncMiscParameterCIR
1486 {
1487     /** \brief  the number of consecutive macroblocks to be coded as intra */
1488     unsigned int cir_num_mbs;
1489 } VAEncMiscParameterCIR;
1490 
1491 /*
1492  * \brief Adaptive intra refresh data structure for encoding.
1493  */
1494 typedef struct _VAEncMiscParameterAIR
1495 {
1496     /** \brief the minimum number of macroblocks to refresh in a frame */
1497     unsigned int air_num_mbs;
1498     /**
1499      * \brief threshhold of blockmatching criterion (typically SAD)
1500      *
1501      * Macroblocks above that threshold are marked as candidates and
1502      * on subsequent frames a number of these candidates are coded as Intra
1503      * Generally the threshhold need to be set and tuned to an appropriate level
1504      * according to the feedback of coded frame.
1505      */
1506     unsigned int air_threshold;
1507     /** \brief if set to 1 then hardware auto-tune the AIR threshold */
1508     unsigned int air_auto;
1509 } VAEncMiscParameterAIR;
1510 
1511 /*
1512  * \brief Rolling intra refresh data structure for encoding.
1513  */
1514 typedef struct _VAEncMiscParameterRIR
1515 {
1516     union
1517     {
1518         struct
1519 	/**
1520 	 * \brief Indicate if intra refresh is enabled in column/row.
1521 	 *
1522 	 * App should query VAConfigAttribEncIntraRefresh to confirm RIR support
1523 	 * by the driver before sending this structure. The following RIR restrictions
1524 	 * apply:
1525 	 *  - No field encoding.
1526 	 *  - No B frames.
1527 	 *  - No multiple references.
1528 	 */
1529         {
1530 	    /* \brief enable RIR in column */
1531             unsigned int enable_rir_column : 1;
1532 	    /* \brief enable RIR in row */
1533             unsigned int enable_rir_row : 1;
1534 	    unsigned int reserved : 30;
1535         } bits;
1536         unsigned int value;
1537     } rir_flags;
1538     /**
1539      * \brief Indicates the column or row location in MB. It is ignored if
1540      * rir_flags is 0.
1541      */
1542     unsigned short intra_insertion_location;
1543     /**
1544      * \brief Indicates the number of columns or rows in MB. It is ignored if
1545      * rir_flags is 0.
1546      */
1547     unsigned short intra_insert_size;
1548     /**
1549      * \brief indicates the Qp difference for inserted intra columns or rows.
1550      * App can use this to adjust intra Qp based on bitrate & max frame size.
1551      */
1552     char qp_delta_for_inserted_intra;
1553 
1554 } VAEncMiscParameterRIR;
1555 
1556 typedef struct _VAEncMiscParameterHRD
1557 {
1558    /**
1559     * \brief This value indicates the amount of data that will
1560     * be buffered by the decoding application prior to beginning playback
1561     */
1562     unsigned int initial_buffer_fullness;       /* in bits */
1563    /**
1564     * \brief This value indicates the amount of data that the
1565     * encoder should try to maintain in the decoder's buffer
1566     */
1567     unsigned int optimal_buffer_fullness;       /* in bits */
1568     /**
1569      * \brief This value indicates the amount of data that
1570      * may be buffered by the decoding application
1571      */
1572     unsigned int buffer_size;                   /* in bits */
1573 } VAEncMiscParameterHRD;
1574 
1575 /**
1576  * \brief Defines a maximum frame size (in bits).
1577  *
1578  * This misc parameter buffer defines the maximum size of a frame (in
1579  * bits). The encoder will try to make sure that each frame does not
1580  * exceed this size. Otherwise, if the frame size exceeds this size,
1581  * the \c status flag of #VACodedBufferSegment will contain
1582  * #VA_CODED_BUF_STATUS_FRAME_SIZE_OVERFLOW.
1583  */
1584 typedef struct _VAEncMiscParameterBufferMaxFrameSize {
1585     /** \brief Type. Shall be set to #VAEncMiscParameterTypeMaxFrameSize. */
1586     VAEncMiscParameterType      type;
1587     /** \brief Maximum size of a frame (in bits). */
1588     unsigned int                max_frame_size;
1589 } VAEncMiscParameterBufferMaxFrameSize;
1590 
1591 /**
1592  * \brief Encoding quality level.
1593  *
1594  * The encoding quality could be set through this structure, if the implementation
1595  * supports multiple quality levels. The quality level set through this structure is
1596  * persistent over the entire coded sequence, or until a new structure is being sent.
1597  * The quality level range can be queried through the VAConfigAttribEncQualityRange
1598  * attribute. A lower value means higher quality, and a value of 1 represents the highest
1599  * quality. The quality level setting is used as a trade-off between quality and speed/power
1600  * consumption, with higher quality corresponds to lower speed and higher power consumption.
1601  */
1602 typedef struct _VAEncMiscParameterBufferQualityLevel {
1603     /** \brief Encoding quality level setting. */
1604     unsigned int                quality_level;
1605 } VAEncMiscParameterBufferQualityLevel;
1606 
1607 /**
1608  * \brief Quantization settings for encoding.
1609  *
1610  * Some encoders support special types of quantization such as trellis, and this structure
1611  * can be used by the app to control these special types of quantization by the encoder.
1612  */
1613 typedef struct _VAEncMiscParameterQuantization
1614 {
1615     union
1616     {
1617     /* if no flags is set then quantization is determined by the driver */
1618         struct
1619         {
1620 	    /* \brief disable trellis for all frames/fields */
1621             unsigned int disable_trellis : 1;
1622 	    /* \brief enable trellis for I frames/fields */
1623             unsigned int enable_trellis_I : 1;
1624 	    /* \brief enable trellis for P frames/fields */
1625             unsigned int enable_trellis_P : 1;
1626 	    /* \brief enable trellis for B frames/fields */
1627             unsigned int enable_trellis_B : 1;
1628             unsigned int reserved : 28;
1629         } bits;
1630         unsigned int value;
1631     } quantization_flags;
1632 } VAEncMiscParameterQuantization;
1633 
1634 /**
1635  * \brief Encoding skip frame.
1636  *
1637  * The application may choose to skip frames externally to the encoder (e.g. drop completely or
1638  * code as all skip's). For rate control purposes the encoder will need to know the size and number
1639  * of skipped frames.  Skip frame(s) indicated through this structure is applicable only to the
1640  * current frame.  It is allowed for the application to still send in packed headers for the driver to
1641  * pack, although no frame will be encoded (e.g. for HW to encrypt the frame).
1642  */
1643 typedef struct _VAEncMiscParameterSkipFrame {
1644     /** \brief Indicates skip frames as below.
1645       * 0: Encode as normal, no skip.
1646       * 1: One or more frames were skipped prior to the current frame, encode the current frame as normal.
1647       * 2: The current frame is to be skipped, do not encode it but pack/encrypt the packed header contents
1648       *    (all except VAEncPackedHeaderSlice) which could contain actual frame contents (e.g. pack the frame
1649       *    in VAEncPackedHeaderPicture).  */
1650     unsigned char               skip_frame_flag;
1651     /** \brief The number of frames skipped prior to the current frame.  Valid when skip_frame_flag = 1. */
1652     unsigned char               num_skip_frames;
1653     /** \brief When skip_frame_flag = 1, the size of the skipped frames in bits.   When skip_frame_flag = 2,
1654       * the size of the current skipped frame that is to be packed/encrypted in bits. */
1655     unsigned int                size_skip_frames;
1656 } VAEncMiscParameterSkipFrame;
1657 
1658 /**
1659  * \brief Encoding region-of-interest (ROI).
1660  *
1661  * The encoding ROI can be set through this structure, if the implementation
1662  * supports ROI input. The ROI set through this structure is applicable only to the
1663  * current frame.  The number of supported ROIs can be queried through the
1664  * VAConfigAttribEncRoi.  The encoder will use the ROI information to adjust the QP
1665  * values of the MB's that fall within the ROIs.
1666  */
1667 typedef struct _VAEncMiscParameterBufferRoi {
1668     /** \brief Number of ROIs being sent.*/
1669     unsigned int                num_roi;
1670     /** \brief Valid when VAConfigAttribRateControl != VA_RC_CQP, then the encoder's
1671      *  rate control will determine actual delta QPs.  Specifies the max/min allowed delta QPs.*/
1672     char                        max_delta_qp;
1673     char                        min_delta_qp;
1674 
1675     /** \brief Pointer to a VAEncROI array with num_ROI elements.*/
1676     struct VAEncROI
1677     {
1678         /** \brief Defines the ROI boundary in pixels, the driver will map it to appropriate
1679          *  codec coding units.  It is relative to the frame coordinates for both frame and field cases. */
1680         VARectangle             roi_rectangle;
1681         /** \brief When VAConfigAttribRateControl == VA_RC_CQP then roi_value specifes the delta QP that
1682          *  will be added on top of the frame level QP.  For other rate control modes, roi_value specifies the
1683          *  priority of the ROI region relative to the non-ROI region.  It can positive (more important) or
1684          *  negative (less important) values and is compared with non-ROI region (taken as value 0).
1685          *  E.g. ROI region with roi_value -3 is less important than the non-ROI region (roi_value implied to be 0)
1686          *  which is less important than ROI region with roi_value +2.  For overlapping regions, the roi_value
1687          *  that is first in the ROI array will have priority.   */
1688         char                    roi_value;
1689     } *ROI;
1690 } VAEncMiscParameterBufferROI;
1691 
1692 /*
1693  * There will be cases where the bitstream buffer will not have enough room to hold
1694  * the data for the entire slice, and the following flags will be used in the slice
1695  * parameter to signal to the server for the possible cases.
1696  * If a slice parameter buffer and slice data buffer pair is sent to the server with
1697  * the slice data partially in the slice data buffer (BEGIN and MIDDLE cases below),
1698  * then a slice parameter and data buffer needs to be sent again to complete this slice.
1699  */
1700 #define VA_SLICE_DATA_FLAG_ALL		0x00	/* whole slice is in the buffer */
1701 #define VA_SLICE_DATA_FLAG_BEGIN	0x01	/* The beginning of the slice is in the buffer but the end if not */
1702 #define VA_SLICE_DATA_FLAG_MIDDLE	0x02	/* Neither beginning nor end of the slice is in the buffer */
1703 #define VA_SLICE_DATA_FLAG_END		0x04	/* end of the slice is in the buffer */
1704 
1705 /* Codec-independent Slice Parameter Buffer base */
1706 typedef struct _VASliceParameterBufferBase
1707 {
1708     unsigned int slice_data_size;	/* number of bytes in the slice data buffer for this slice */
1709     unsigned int slice_data_offset;	/* the offset to the first byte of slice data */
1710     unsigned int slice_data_flag;	/* see VA_SLICE_DATA_FLAG_XXX definitions */
1711 } VASliceParameterBufferBase;
1712 
1713 #include <va/va_dec_jpeg.h>
1714 
1715 /****************************
1716  * MPEG-2 data structures
1717  ****************************/
1718 
1719 /* MPEG-2 Picture Parameter Buffer */
1720 /*
1721  * For each frame or field, and before any slice data, a single
1722  * picture parameter buffer must be send.
1723  */
1724 typedef struct _VAPictureParameterBufferMPEG2
1725 {
1726     unsigned short horizontal_size;
1727     unsigned short vertical_size;
1728     VASurfaceID forward_reference_picture;
1729     VASurfaceID backward_reference_picture;
1730     /* meanings of the following fields are the same as in the standard */
1731     int picture_coding_type;
1732     int f_code; /* pack all four fcode into this */
1733     union {
1734         struct {
1735             unsigned int intra_dc_precision		: 2;
1736             unsigned int picture_structure		: 2;
1737             unsigned int top_field_first		: 1;
1738             unsigned int frame_pred_frame_dct		: 1;
1739             unsigned int concealment_motion_vectors	: 1;
1740             unsigned int q_scale_type			: 1;
1741             unsigned int intra_vlc_format		: 1;
1742             unsigned int alternate_scan			: 1;
1743             unsigned int repeat_first_field		: 1;
1744             unsigned int progressive_frame		: 1;
1745             unsigned int is_first_field			: 1; /* indicate whether the current field
1746                                                               * is the first field for field picture
1747                                                               */
1748         } bits;
1749         unsigned int value;
1750     } picture_coding_extension;
1751 } VAPictureParameterBufferMPEG2;
1752 
1753 /* MPEG-2 Inverse Quantization Matrix Buffer */
1754 typedef struct _VAIQMatrixBufferMPEG2
1755 {
1756     int load_intra_quantiser_matrix;
1757     int load_non_intra_quantiser_matrix;
1758     int load_chroma_intra_quantiser_matrix;
1759     int load_chroma_non_intra_quantiser_matrix;
1760     unsigned char intra_quantiser_matrix[64];
1761     unsigned char non_intra_quantiser_matrix[64];
1762     unsigned char chroma_intra_quantiser_matrix[64];
1763     unsigned char chroma_non_intra_quantiser_matrix[64];
1764 } VAIQMatrixBufferMPEG2;
1765 
1766 /* MPEG-2 Slice Parameter Buffer */
1767 typedef struct _VASliceParameterBufferMPEG2
1768 {
1769     unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */
1770     unsigned int slice_data_offset;/* the offset to the first byte of slice data */
1771     unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
1772     unsigned int macroblock_offset;/* the offset to the first bit of MB from the first byte of slice data */
1773     unsigned int slice_horizontal_position;
1774     unsigned int slice_vertical_position;
1775     int quantiser_scale_code;
1776     int intra_slice_flag;
1777 } VASliceParameterBufferMPEG2;
1778 
1779 /* MPEG-2 Macroblock Parameter Buffer */
1780 typedef struct _VAMacroblockParameterBufferMPEG2
1781 {
1782     unsigned short macroblock_address;
1783     /*
1784      * macroblock_address (in raster scan order)
1785      * top-left: 0
1786      * bottom-right: picture-height-in-mb*picture-width-in-mb - 1
1787      */
1788     unsigned char macroblock_type;  /* see definition below */
1789     union {
1790         struct {
1791             unsigned int frame_motion_type		: 2;
1792             unsigned int field_motion_type		: 2;
1793             unsigned int dct_type			: 1;
1794         } bits;
1795         unsigned int value;
1796     } macroblock_modes;
1797     unsigned char motion_vertical_field_select;
1798     /*
1799      * motion_vertical_field_select:
1800      * see section 6.3.17.2 in the spec
1801      * only the lower 4 bits are used
1802      * bit 0: first vector forward
1803      * bit 1: first vector backward
1804      * bit 2: second vector forward
1805      * bit 3: second vector backward
1806      */
1807     short PMV[2][2][2]; /* see Table 7-7 in the spec */
1808     unsigned short coded_block_pattern;
1809     /*
1810      * The bitplanes for coded_block_pattern are described
1811      * in Figure 6.10-12 in the spec
1812      */
1813 
1814     /* Number of skipped macroblocks after this macroblock */
1815     unsigned short num_skipped_macroblocks;
1816 } VAMacroblockParameterBufferMPEG2;
1817 
1818 /*
1819  * OR'd flags for macroblock_type (section 6.3.17.1 in the spec)
1820  */
1821 #define VA_MB_TYPE_MOTION_FORWARD	0x02
1822 #define VA_MB_TYPE_MOTION_BACKWARD	0x04
1823 #define VA_MB_TYPE_MOTION_PATTERN	0x08
1824 #define VA_MB_TYPE_MOTION_INTRA		0x10
1825 
1826 /*
1827  * MPEG-2 Residual Data Buffer
1828  * For each macroblock, there wil be 64 shorts (16-bit) in the
1829  * residual data buffer
1830  */
1831 
1832 /****************************
1833  * MPEG-4 Part 2 data structures
1834  ****************************/
1835 
1836 /* MPEG-4 Picture Parameter Buffer */
1837 /*
1838  * For each frame or field, and before any slice data, a single
1839  * picture parameter buffer must be send.
1840  */
1841 typedef struct _VAPictureParameterBufferMPEG4
1842 {
1843     unsigned short vop_width;
1844     unsigned short vop_height;
1845     VASurfaceID forward_reference_picture;
1846     VASurfaceID backward_reference_picture;
1847     union {
1848         struct {
1849             unsigned int short_video_header		: 1;
1850             unsigned int chroma_format			: 2;
1851             unsigned int interlaced			: 1;
1852             unsigned int obmc_disable			: 1;
1853             unsigned int sprite_enable			: 2;
1854             unsigned int sprite_warping_accuracy	: 2;
1855             unsigned int quant_type			: 1;
1856             unsigned int quarter_sample			: 1;
1857             unsigned int data_partitioned		: 1;
1858             unsigned int reversible_vlc			: 1;
1859             unsigned int resync_marker_disable		: 1;
1860         } bits;
1861         unsigned int value;
1862     } vol_fields;
1863     unsigned char no_of_sprite_warping_points;
1864     short sprite_trajectory_du[3];
1865     short sprite_trajectory_dv[3];
1866     unsigned char quant_precision;
1867     union {
1868         struct {
1869             unsigned int vop_coding_type		: 2;
1870             unsigned int backward_reference_vop_coding_type	: 2;
1871             unsigned int vop_rounding_type		: 1;
1872             unsigned int intra_dc_vlc_thr		: 3;
1873             unsigned int top_field_first		: 1;
1874             unsigned int alternate_vertical_scan_flag	: 1;
1875         } bits;
1876         unsigned int value;
1877     } vop_fields;
1878     unsigned char vop_fcode_forward;
1879     unsigned char vop_fcode_backward;
1880     unsigned short vop_time_increment_resolution;
1881     /* short header related */
1882     unsigned char num_gobs_in_vop;
1883     unsigned char num_macroblocks_in_gob;
1884     /* for direct mode prediction */
1885     short TRB;
1886     short TRD;
1887     unsigned int Tframe;
1888     unsigned char vop_quant;
1889 } VAPictureParameterBufferMPEG4;
1890 
1891 /* MPEG-4 Inverse Quantization Matrix Buffer */
1892 typedef struct _VAIQMatrixBufferMPEG4
1893 {
1894     int load_intra_quant_mat;
1895     int load_non_intra_quant_mat;
1896     unsigned char intra_quant_mat[64];
1897     unsigned char non_intra_quant_mat[64];
1898 } VAIQMatrixBufferMPEG4;
1899 
1900 /* MPEG-4 Slice Parameter Buffer */
1901 typedef struct _VASliceParameterBufferMPEG4
1902 {
1903     unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */
1904     unsigned int slice_data_offset;/* the offset to the first byte of slice data */
1905     unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
1906     unsigned int macroblock_offset;/* the offset to the first bit of MB from the first byte of slice data */
1907     unsigned int macroblock_number;
1908     int quant_scale;
1909 } VASliceParameterBufferMPEG4;
1910 
1911 /*
1912  VC-1 data structures
1913 */
1914 
1915 typedef enum   /* see 7.1.1.32 */
1916 {
1917     VAMvMode1Mv                        = 0,
1918     VAMvMode1MvHalfPel                 = 1,
1919     VAMvMode1MvHalfPelBilinear         = 2,
1920     VAMvModeMixedMv                    = 3,
1921     VAMvModeIntensityCompensation      = 4
1922 } VAMvModeVC1;
1923 
1924 /* VC-1 Picture Parameter Buffer */
1925 /*
1926  * For each picture, and before any slice data, a picture parameter
1927  * buffer must be send. Multiple picture parameter buffers may be
1928  * sent for a single picture. In that case picture parameters will
1929  * apply to all slice data that follow it until a new picture
1930  * parameter buffer is sent.
1931  *
1932  * Notes:
1933  *   pic_quantizer_type should be set to the applicable quantizer
1934  *   type as defined by QUANTIZER (J.1.19) and either
1935  *   PQUANTIZER (7.1.1.8) or PQINDEX (7.1.1.6)
1936  */
1937 typedef struct _VAPictureParameterBufferVC1
1938 {
1939     VASurfaceID forward_reference_picture;
1940     VASurfaceID backward_reference_picture;
1941     /* if out-of-loop post-processing is done on the render
1942        target, then we need to keep the in-loop decoded
1943        picture as a reference picture */
1944     VASurfaceID inloop_decoded_picture;
1945 
1946     /* sequence layer for AP or meta data for SP and MP */
1947     union {
1948         struct {
1949             unsigned int pulldown	: 1; /* SEQUENCE_LAYER::PULLDOWN */
1950             unsigned int interlace	: 1; /* SEQUENCE_LAYER::INTERLACE */
1951             unsigned int tfcntrflag	: 1; /* SEQUENCE_LAYER::TFCNTRFLAG */
1952             unsigned int finterpflag	: 1; /* SEQUENCE_LAYER::FINTERPFLAG */
1953             unsigned int psf		: 1; /* SEQUENCE_LAYER::PSF */
1954             unsigned int multires	: 1; /* METADATA::MULTIRES */
1955             unsigned int overlap	: 1; /* METADATA::OVERLAP */
1956             unsigned int syncmarker	: 1; /* METADATA::SYNCMARKER */
1957             unsigned int rangered	: 1; /* METADATA::RANGERED */
1958             unsigned int max_b_frames	: 3; /* METADATA::MAXBFRAMES */
1959             unsigned int profile	: 2; /* SEQUENCE_LAYER::PROFILE or The MSB of METADATA::PROFILE */
1960         } bits;
1961         unsigned int value;
1962     } sequence_fields;
1963 
1964     unsigned short coded_width;		/* ENTRY_POINT_LAYER::CODED_WIDTH */
1965     unsigned short coded_height;	/* ENTRY_POINT_LAYER::CODED_HEIGHT */
1966     union {
1967 	struct {
1968             unsigned int broken_link	: 1; /* ENTRY_POINT_LAYER::BROKEN_LINK */
1969             unsigned int closed_entry	: 1; /* ENTRY_POINT_LAYER::CLOSED_ENTRY */
1970             unsigned int panscan_flag	: 1; /* ENTRY_POINT_LAYER::PANSCAN_FLAG */
1971             unsigned int loopfilter	: 1; /* ENTRY_POINT_LAYER::LOOPFILTER */
1972 	} bits;
1973 	unsigned int value;
1974     } entrypoint_fields;
1975     unsigned char conditional_overlap_flag; /* ENTRY_POINT_LAYER::CONDOVER */
1976     unsigned char fast_uvmc_flag;	/* ENTRY_POINT_LAYER::FASTUVMC */
1977     union {
1978         struct {
1979             unsigned int luma_flag	: 1; /* ENTRY_POINT_LAYER::RANGE_MAPY_FLAG */
1980             unsigned int luma		: 3; /* ENTRY_POINT_LAYER::RANGE_MAPY */
1981             unsigned int chroma_flag	: 1; /* ENTRY_POINT_LAYER::RANGE_MAPUV_FLAG */
1982             unsigned int chroma		: 3; /* ENTRY_POINT_LAYER::RANGE_MAPUV */
1983         } bits;
1984         unsigned int value;
1985     } range_mapping_fields;
1986 
1987     unsigned char b_picture_fraction;	/* PICTURE_LAYER::BFRACTION */
1988     unsigned char cbp_table;		/* PICTURE_LAYER::CBPTAB/ICBPTAB */
1989     unsigned char mb_mode_table;	/* PICTURE_LAYER::MBMODETAB */
1990     unsigned char range_reduction_frame;/* PICTURE_LAYER::RANGEREDFRM */
1991     unsigned char rounding_control;	/* PICTURE_LAYER::RNDCTRL */
1992     unsigned char post_processing;	/* PICTURE_LAYER::POSTPROC */
1993     unsigned char picture_resolution_index;	/* PICTURE_LAYER::RESPIC */
1994     unsigned char luma_scale;		/* PICTURE_LAYER::LUMSCALE */
1995     unsigned char luma_shift;		/* PICTURE_LAYER::LUMSHIFT */
1996     union {
1997         struct {
1998             unsigned int picture_type		: 3; /* PICTURE_LAYER::PTYPE */
1999             unsigned int frame_coding_mode	: 3; /* PICTURE_LAYER::FCM */
2000             unsigned int top_field_first	: 1; /* PICTURE_LAYER::TFF */
2001             unsigned int is_first_field		: 1; /* set to 1 if it is the first field */
2002             unsigned int intensity_compensation	: 1; /* PICTURE_LAYER::INTCOMP */
2003         } bits;
2004         unsigned int value;
2005     } picture_fields;
2006     union {
2007         struct {
2008             unsigned int mv_type_mb	: 1; 	/* PICTURE::MVTYPEMB */
2009             unsigned int direct_mb	: 1; 	/* PICTURE::DIRECTMB */
2010             unsigned int skip_mb	: 1; 	/* PICTURE::SKIPMB */
2011             unsigned int field_tx	: 1; 	/* PICTURE::FIELDTX */
2012             unsigned int forward_mb	: 1;	/* PICTURE::FORWARDMB */
2013             unsigned int ac_pred	: 1;	/* PICTURE::ACPRED */
2014             unsigned int overflags	: 1;	/* PICTURE::OVERFLAGS */
2015         } flags;
2016         unsigned int value;
2017     } raw_coding;
2018     union {
2019         struct {
2020             unsigned int bp_mv_type_mb   : 1;    /* PICTURE::MVTYPEMB */
2021             unsigned int bp_direct_mb    : 1;    /* PICTURE::DIRECTMB */
2022             unsigned int bp_skip_mb      : 1;    /* PICTURE::SKIPMB */
2023             unsigned int bp_field_tx     : 1;    /* PICTURE::FIELDTX */
2024             unsigned int bp_forward_mb   : 1;    /* PICTURE::FORWARDMB */
2025             unsigned int bp_ac_pred      : 1;    /* PICTURE::ACPRED */
2026             unsigned int bp_overflags    : 1;    /* PICTURE::OVERFLAGS */
2027         } flags;
2028         unsigned int value;
2029     } bitplane_present; /* signal what bitplane is being passed via the bitplane buffer */
2030     union {
2031         struct {
2032             unsigned int reference_distance_flag : 1;/* PICTURE_LAYER::REFDIST_FLAG */
2033             unsigned int reference_distance	: 5;/* PICTURE_LAYER::REFDIST */
2034             unsigned int num_reference_pictures: 1;/* PICTURE_LAYER::NUMREF */
2035             unsigned int reference_field_pic_indicator	: 1;/* PICTURE_LAYER::REFFIELD */
2036         } bits;
2037         unsigned int value;
2038     } reference_fields;
2039     union {
2040         struct {
2041             unsigned int mv_mode		: 3; /* PICTURE_LAYER::MVMODE */
2042             unsigned int mv_mode2		: 3; /* PICTURE_LAYER::MVMODE2 */
2043             unsigned int mv_table		: 3; /* PICTURE_LAYER::MVTAB/IMVTAB */
2044             unsigned int two_mv_block_pattern_table: 2; /* PICTURE_LAYER::2MVBPTAB */
2045             unsigned int four_mv_switch		: 1; /* PICTURE_LAYER::4MVSWITCH */
2046             unsigned int four_mv_block_pattern_table : 2; /* PICTURE_LAYER::4MVBPTAB */
2047             unsigned int extended_mv_flag	: 1; /* ENTRY_POINT_LAYER::EXTENDED_MV */
2048             unsigned int extended_mv_range	: 2; /* PICTURE_LAYER::MVRANGE */
2049             unsigned int extended_dmv_flag	: 1; /* ENTRY_POINT_LAYER::EXTENDED_DMV */
2050             unsigned int extended_dmv_range	: 2; /* PICTURE_LAYER::DMVRANGE */
2051         } bits;
2052         unsigned int value;
2053     } mv_fields;
2054     union {
2055         struct {
2056             unsigned int dquant	: 2; 	/* ENTRY_POINT_LAYER::DQUANT */
2057             unsigned int quantizer     : 2; 	/* ENTRY_POINT_LAYER::QUANTIZER */
2058             unsigned int half_qp	: 1; 	/* PICTURE_LAYER::HALFQP */
2059             unsigned int pic_quantizer_scale : 5;/* PICTURE_LAYER::PQUANT */
2060             unsigned int pic_quantizer_type : 1;/* PICTURE_LAYER::PQUANTIZER */
2061             unsigned int dq_frame	: 1; 	/* VOPDQUANT::DQUANTFRM */
2062             unsigned int dq_profile	: 2; 	/* VOPDQUANT::DQPROFILE */
2063             unsigned int dq_sb_edge	: 2; 	/* VOPDQUANT::DQSBEDGE */
2064             unsigned int dq_db_edge 	: 2; 	/* VOPDQUANT::DQDBEDGE */
2065             unsigned int dq_binary_level : 1; 	/* VOPDQUANT::DQBILEVEL */
2066             unsigned int alt_pic_quantizer : 5;/* VOPDQUANT::ALTPQUANT */
2067         } bits;
2068         unsigned int value;
2069     } pic_quantizer_fields;
2070     union {
2071         struct {
2072             unsigned int variable_sized_transform_flag	: 1;/* ENTRY_POINT_LAYER::VSTRANSFORM */
2073             unsigned int mb_level_transform_type_flag	: 1;/* PICTURE_LAYER::TTMBF */
2074             unsigned int frame_level_transform_type	: 2;/* PICTURE_LAYER::TTFRM */
2075             unsigned int transform_ac_codingset_idx1	: 2;/* PICTURE_LAYER::TRANSACFRM */
2076             unsigned int transform_ac_codingset_idx2	: 2;/* PICTURE_LAYER::TRANSACFRM2 */
2077             unsigned int intra_transform_dc_table	: 1;/* PICTURE_LAYER::TRANSDCTAB */
2078         } bits;
2079         unsigned int value;
2080     } transform_fields;
2081     unsigned char luma_scale2;		/* PICTURE_LAYER::LUMSCALE2 */
2082     unsigned char luma_shift2;		/* PICTURE_LAYER::LUMSHIFT2 */
2083 } VAPictureParameterBufferVC1;
2084 
2085 /* VC-1 Bitplane Buffer
2086 There will be at most three bitplanes coded in any picture header. To send
2087 the bitplane data more efficiently, each byte is divided in two nibbles, with
2088 each nibble carrying three bitplanes for one macroblock.  The following table
2089 shows the bitplane data arrangement within each nibble based on the picture
2090 type.
2091 
2092 Picture Type	Bit3		Bit2		Bit1		Bit0
2093 I or BI				OVERFLAGS	ACPRED		FIELDTX
2094 P				MYTYPEMB	SKIPMB		DIRECTMB
2095 B				FORWARDMB	SKIPMB		DIRECTMB
2096 
2097 Within each byte, the lower nibble is for the first MB and the upper nibble is
2098 for the second MB.  E.g. the lower nibble of the first byte in the bitplane
2099 buffer is for Macroblock #1 and the upper nibble of the first byte is for
2100 Macroblock #2 in the first row.
2101 */
2102 
2103 /* VC-1 Slice Parameter Buffer */
2104 typedef struct _VASliceParameterBufferVC1
2105 {
2106     unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */
2107     unsigned int slice_data_offset;/* the offset to the first byte of slice data */
2108     unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
2109     unsigned int macroblock_offset;/* the offset to the first bit of MB from the first byte of slice data */
2110     unsigned int slice_vertical_position;
2111 } VASliceParameterBufferVC1;
2112 
2113 /* VC-1 Slice Data Buffer */
2114 /*
2115 This is simplely a buffer containing raw bit-stream bytes
2116 */
2117 
2118 /****************************
2119  * H.264/AVC data structures
2120  ****************************/
2121 
2122 typedef struct _VAPictureH264
2123 {
2124     VASurfaceID picture_id;
2125     /*
2126      * frame_idx is long_term_frame_idx for long term reference picture,
2127      * and frame_num for short term reference picture.
2128      */
2129     unsigned int frame_idx;
2130     /*
2131      * see flags below.
2132      */
2133     unsigned int flags;
2134     signed int TopFieldOrderCnt;
2135     signed int BottomFieldOrderCnt;
2136 } VAPictureH264;
2137 /* flags in VAPictureH264 could be OR of the following */
2138 #define VA_PICTURE_H264_INVALID			0x00000001
2139 #define VA_PICTURE_H264_TOP_FIELD		0x00000002
2140 #define VA_PICTURE_H264_BOTTOM_FIELD		0x00000004
2141 #define VA_PICTURE_H264_SHORT_TERM_REFERENCE	0x00000008
2142 #define VA_PICTURE_H264_LONG_TERM_REFERENCE	0x00000010
2143 #define VA_PICTURE_H264_NON_EXISTING		0x00000020
2144 
2145 /* H.264 Picture Parameter Buffer */
2146 /*
2147  * For each picture, and before any slice data, a single
2148  * picture parameter buffer must be send.
2149  */
2150 typedef struct _VAPictureParameterBufferH264
2151 {
2152     VAPictureH264 CurrPic;
2153     VAPictureH264 ReferenceFrames[16];	/* in DPB */
2154     unsigned short picture_width_in_mbs_minus1;
2155     unsigned short picture_height_in_mbs_minus1;
2156     unsigned char bit_depth_luma_minus8;
2157     unsigned char bit_depth_chroma_minus8;
2158     unsigned char num_ref_frames;
2159     union {
2160         struct {
2161             unsigned int chroma_format_idc			: 2;
2162             unsigned int residual_colour_transform_flag		: 1;
2163             unsigned int gaps_in_frame_num_value_allowed_flag	: 1;
2164             unsigned int frame_mbs_only_flag			: 1;
2165             unsigned int mb_adaptive_frame_field_flag		: 1;
2166             unsigned int direct_8x8_inference_flag		: 1;
2167             unsigned int MinLumaBiPredSize8x8			: 1; /* see A.3.3.2 */
2168             unsigned int log2_max_frame_num_minus4		: 4;
2169             unsigned int pic_order_cnt_type			: 2;
2170             unsigned int log2_max_pic_order_cnt_lsb_minus4	: 4;
2171             unsigned int delta_pic_order_always_zero_flag	: 1;
2172         } bits;
2173         unsigned int value;
2174     } seq_fields;
2175     unsigned char num_slice_groups_minus1;
2176     unsigned char slice_group_map_type;
2177     unsigned short slice_group_change_rate_minus1;
2178     signed char pic_init_qp_minus26;
2179     signed char pic_init_qs_minus26;
2180     signed char chroma_qp_index_offset;
2181     signed char second_chroma_qp_index_offset;
2182     union {
2183         struct {
2184             unsigned int entropy_coding_mode_flag	: 1;
2185             unsigned int weighted_pred_flag		: 1;
2186             unsigned int weighted_bipred_idc		: 2;
2187             unsigned int transform_8x8_mode_flag	: 1;
2188             unsigned int field_pic_flag			: 1;
2189             unsigned int constrained_intra_pred_flag	: 1;
2190             unsigned int pic_order_present_flag			: 1;
2191             unsigned int deblocking_filter_control_present_flag : 1;
2192             unsigned int redundant_pic_cnt_present_flag		: 1;
2193             unsigned int reference_pic_flag			: 1; /* nal_ref_idc != 0 */
2194         } bits;
2195         unsigned int value;
2196     } pic_fields;
2197     unsigned short frame_num;
2198     unsigned char num_ref_idx_l0_default_active_minus1;
2199     unsigned char num_ref_idx_l1_default_active_minus1;
2200 } VAPictureParameterBufferH264;
2201 
2202 /* H.264 Inverse Quantization Matrix Buffer */
2203 typedef struct _VAIQMatrixBufferH264
2204 {
2205     unsigned char ScalingList4x4[6][16];
2206     unsigned char ScalingList8x8[2][64];
2207 } VAIQMatrixBufferH264;
2208 
2209 /*
2210  * H.264 Slice Group Map Buffer
2211  * When VAPictureParameterBufferH264::num_slice_group_minus1 is not equal to 0,
2212  * A slice group map buffer should be sent for each picture if required. The buffer
2213  * is sent only when there is a change in the mapping values.
2214  * The slice group map buffer map "map units" to slice groups as specified in
2215  * section 8.2.2 of the H.264 spec. The buffer will contain one byte for each macroblock
2216  * in raster scan order
2217  */
2218 
2219 /*
2220  * H.264 Slice Parameter Buffer for base mode decoding
2221  */
2222 typedef struct _VASliceParameterBufferBaseH264
2223 {
2224     unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */
2225     /** \brief Byte offset to the NAL Header Unit for this slice. */
2226     unsigned int slice_data_offset;
2227     unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
2228 } VASliceParameterBufferH264Base;
2229 
2230 /*
2231  * H.264 Slice Parameter Buffer for normal mode decoding
2232  */
2233 typedef struct _VASliceParameterBufferH264
2234 {
2235     unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */
2236     /** \brief Byte offset to the NAL Header Unit for this slice. */
2237     unsigned int slice_data_offset;
2238     unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */
2239     /**
2240      * \brief Bit offset from NAL Header Unit to the begining of slice_data().
2241      *
2242      * This bit offset is relative to and includes the NAL unit byte
2243      * and represents the number of bits parsed in the slice_header()
2244      * after the removal of any emulation prevention bytes in
2245      * there. However, the slice data buffer passed to the hardware is
2246      * the original bitstream, thus including any emulation prevention
2247      * bytes.
2248      */
2249     unsigned short slice_data_bit_offset;
2250     unsigned short first_mb_in_slice;
2251     unsigned char slice_type;
2252     unsigned char direct_spatial_mv_pred_flag;
2253     unsigned char num_ref_idx_l0_active_minus1;
2254     unsigned char num_ref_idx_l1_active_minus1;
2255     unsigned char cabac_init_idc;
2256     char slice_qp_delta;
2257     unsigned char disable_deblocking_filter_idc;
2258     char slice_alpha_c0_offset_div2;
2259     char slice_beta_offset_div2;
2260     VAPictureH264 RefPicList0[32];	/* See 8.2.4.2 */
2261     VAPictureH264 RefPicList1[32];	/* See 8.2.4.2 */
2262     unsigned char luma_log2_weight_denom;
2263     unsigned char chroma_log2_weight_denom;
2264     unsigned char luma_weight_l0_flag;
2265     short luma_weight_l0[32];
2266     short luma_offset_l0[32];
2267     unsigned char chroma_weight_l0_flag;
2268     short chroma_weight_l0[32][2];
2269     short chroma_offset_l0[32][2];
2270     unsigned char luma_weight_l1_flag;
2271     short luma_weight_l1[32];
2272     short luma_offset_l1[32];
2273     unsigned char chroma_weight_l1_flag;
2274     short chroma_weight_l1[32][2];
2275     short chroma_offset_l1[32][2];
2276 } VASliceParameterBufferH264;
2277 
2278 /****************************
2279  * Common encode data structures
2280  ****************************/
2281 typedef enum
2282 {
2283     VAEncPictureTypeIntra		= 0,
2284     VAEncPictureTypePredictive		= 1,
2285     VAEncPictureTypeBidirectional	= 2,
2286 } VAEncPictureType;
2287 
2288 /* Encode Slice Parameter Buffer */
2289 typedef struct _VAEncSliceParameterBuffer
2290 {
2291     unsigned int start_row_number;	/* starting MB row number for this slice */
2292     unsigned int slice_height;	/* slice height measured in MB */
2293     union {
2294         struct {
2295             unsigned int is_intra	: 1;
2296             unsigned int disable_deblocking_filter_idc : 2;
2297             unsigned int uses_long_term_ref		:1;
2298             unsigned int is_long_term_ref		:1;
2299         } bits;
2300         unsigned int value;
2301     } slice_flags;
2302 } VAEncSliceParameterBuffer;
2303 
2304 
2305 /****************************
2306  * H.263 specific encode data structures
2307  ****************************/
2308 
2309 typedef struct _VAEncSequenceParameterBufferH263
2310 {
2311     unsigned int intra_period;
2312     unsigned int bits_per_second;
2313     unsigned int frame_rate;
2314     unsigned int initial_qp;
2315     unsigned int min_qp;
2316 } VAEncSequenceParameterBufferH263;
2317 
2318 typedef struct _VAEncPictureParameterBufferH263
2319 {
2320     VASurfaceID reference_picture;
2321     VASurfaceID reconstructed_picture;
2322     VABufferID coded_buf;
2323     unsigned short picture_width;
2324     unsigned short picture_height;
2325     VAEncPictureType picture_type;
2326 } VAEncPictureParameterBufferH263;
2327 
2328 /****************************
2329  * MPEG-4 specific encode data structures
2330  ****************************/
2331 
2332 typedef struct _VAEncSequenceParameterBufferMPEG4
2333 {
2334     unsigned char profile_and_level_indication;
2335     unsigned int intra_period;
2336     unsigned int video_object_layer_width;
2337     unsigned int video_object_layer_height;
2338     unsigned int vop_time_increment_resolution;
2339     unsigned int fixed_vop_rate;
2340     unsigned int fixed_vop_time_increment;
2341     unsigned int bits_per_second;
2342     unsigned int frame_rate;
2343     unsigned int initial_qp;
2344     unsigned int min_qp;
2345 } VAEncSequenceParameterBufferMPEG4;
2346 
2347 typedef struct _VAEncPictureParameterBufferMPEG4
2348 {
2349     VASurfaceID reference_picture;
2350     VASurfaceID reconstructed_picture;
2351     VABufferID coded_buf;
2352     unsigned short picture_width;
2353     unsigned short picture_height;
2354     unsigned int modulo_time_base; /* number of 1s */
2355     unsigned int vop_time_increment;
2356     VAEncPictureType picture_type;
2357 } VAEncPictureParameterBufferMPEG4;
2358 
2359 
2360 
2361 /* Buffer functions */
2362 
2363 /*
2364  * Creates a buffer for "num_elements" elements of "size" bytes and
2365  * initalize with "data".
2366  * if "data" is null, then the contents of the buffer data store
2367  * are undefined.
2368  * Basically there are two ways to get buffer data to the server side. One is
2369  * to call vaCreateBuffer() with a non-null "data", which results the data being
2370  * copied to the data store on the server side.  A different method that
2371  * eliminates this copy is to pass null as "data" when calling vaCreateBuffer(),
2372  * and then use vaMapBuffer() to map the data store from the server side to the
2373  * client address space for access.
2374  *  Note: image buffers are created by the library, not the client. Please see
2375  *        vaCreateImage on how image buffers are managed.
2376  */
2377 VAStatus vaCreateBuffer (
2378     VADisplay dpy,
2379     VAContextID context,
2380     VABufferType type,	/* in */
2381     unsigned int size,	/* in */
2382     unsigned int num_elements, /* in */
2383     void *data,		/* in */
2384     VABufferID *buf_id	/* out */
2385 );
2386 
2387 /*
2388  * Convey to the server how many valid elements are in the buffer.
2389  * e.g. if multiple slice parameters are being held in a single buffer,
2390  * this will communicate to the server the number of slice parameters
2391  * that are valid in the buffer.
2392  */
2393 VAStatus vaBufferSetNumElements (
2394     VADisplay dpy,
2395     VABufferID buf_id,	/* in */
2396     unsigned int num_elements /* in */
2397 );
2398 
2399 
2400 /*
2401  * device independent data structure for codedbuffer
2402  */
2403 
2404 /*
2405  * FICTURE_AVE_QP(bit7-0): The average Qp value used during this frame
2406  * LARGE_SLICE(bit8):At least one slice in the current frame was large
2407  *              enough for the encoder to attempt to limit its size.
2408  * SLICE_OVERFLOW(bit9): At least one slice in the current frame has
2409  *              exceeded the maximum slice size specified.
2410  * BITRATE_OVERFLOW(bit10): The peak bitrate was exceeded for this frame.
2411  * BITRATE_HIGH(bit11): The frame size got within the safety margin of the maximum size (VCM only)
2412  * AIR_MB_OVER_THRESHOLD: the number of MBs adapted to Intra MB
2413  */
2414 #define VA_CODED_BUF_STATUS_PICTURE_AVE_QP_MASK         0xff
2415 #define VA_CODED_BUF_STATUS_LARGE_SLICE_MASK            0x100
2416 #define VA_CODED_BUF_STATUS_SLICE_OVERFLOW_MASK         0x200
2417 #define VA_CODED_BUF_STATUS_BITRATE_OVERFLOW		0x400
2418 #define VA_CODED_BUF_STATUS_BITRATE_HIGH		0x800
2419 /**
2420  * \brief The frame has exceeded the maximum requested size.
2421  *
2422  * This flag indicates that the encoded frame size exceeds the value
2423  * specified through a misc parameter buffer of type
2424  * #VAEncMiscParameterTypeMaxFrameSize.
2425  */
2426 #define VA_CODED_BUF_STATUS_FRAME_SIZE_OVERFLOW         0x1000
2427 #define VA_CODED_BUF_STATUS_AIR_MB_OVER_THRESHOLD	0xff0000
2428 
2429 /**
2430  * \brief The coded buffer segment contains a single NAL unit.
2431  *
2432  * This flag indicates that the coded buffer segment contains a
2433  * single NAL unit. This flag might be useful to the user for
2434  * processing the coded buffer.
2435  */
2436 #define VA_CODED_BUF_STATUS_SINGLE_NALU                 0x10000000
2437 
2438 /**
2439  * \brief The coded buffer segment contains a private data.
2440  *
2441  * This flag indicates that the coded buffer segment contains
2442  * private data. This flag can be used to exchange private data
2443  * between the client and the driver. Private data should follow
2444  * regular coded data in the coded buffer segement list.
2445  */
2446 #define VA_CODED_BUF_STATUS_PRIVATE_DATA                 0x80000000
2447 
2448 /**
2449  * \brief Coded buffer segment.
2450  *
2451  * #VACodedBufferSegment is an element of a linked list describing
2452  * some information on the coded buffer. The coded buffer segment
2453  * could contain either a single NAL unit, or more than one NAL unit.
2454  * It is recommended (but not required) to return a single NAL unit
2455  * in a coded buffer segment, and the implementation should set the
2456  * VA_CODED_BUF_STATUS_SINGLE_NALU status flag if that is the case.
2457  */
2458 typedef  struct _VACodedBufferSegment  {
2459     /**
2460      * \brief Size of the data buffer in this segment (in bytes).
2461      */
2462     unsigned int        size;
2463     /** \brief Bit offset into the data buffer where the video data starts. */
2464     unsigned int        bit_offset;
2465     /** \brief Status set by the driver. See \c VA_CODED_BUF_STATUS_*. */
2466     unsigned int        status;
2467     /** \brief Reserved for future use. */
2468     unsigned int        reserved;
2469     /** \brief Pointer to the start of the data buffer. */
2470     void               *buf;
2471     /**
2472      * \brief Pointer to the next #VACodedBufferSegment element,
2473      * or \c NULL if there is none.
2474      */
2475     void               *next;
2476 } VACodedBufferSegment;
2477 
2478 
2479 /*
2480  * H.264 Parsed Slice Header Group Info
2481  * After slice header is parsed by decode hardware,
2482  * group slice header buffer will be returned to client.
2483  * client will retrieve multiple parsed slice header infos from that buffer
2484  */
2485 
2486 /* H.264 Parsed Slice Header Info */
2487 typedef struct _VAParseSliceHeaderGroupBuffer
2488 {
2489 	unsigned int size;
2490 
2491 	unsigned char nal_ref_idc;
2492 	unsigned char nal_unit_type;
2493 	unsigned char slice_type;
2494 	unsigned char redundant_pic_cnt;
2495 
2496 	unsigned short first_mb_in_slice;
2497 	char slice_qp_delta;
2498 	char slice_qs_delta;
2499 
2500 	unsigned char luma_log2_weight_denom;
2501 	unsigned char chroma_log2_weight_denom;
2502 	unsigned char cabac_init_idc;
2503         unsigned char reserved8bit;
2504 
2505         unsigned short pic_order_cnt_lsb;
2506         unsigned short reserved16bit;
2507 
2508         unsigned short idr_pic_id;
2509         unsigned char pic_parameter_set_id;
2510 	unsigned char colour_plane_id;
2511 
2512 	char slice_alpha_c0_offset_div2;
2513 	char slice_beta_offset_div2;
2514 	unsigned char slice_group_change_cycle;
2515 	unsigned char disable_deblocking_filter_idc;
2516 
2517 	unsigned int frame_num;
2518 	int delta_pic_order_cnt_bottom;
2519 	int delta_pic_order_cnt[2];
2520 
2521 	unsigned char num_reorder_cmds[2];
2522 	unsigned char num_ref_active_minus1[2];
2523 
2524 	unsigned int weights_present[2][2];
2525 
2526 	unsigned short num_mem_man_ops;
2527 
2528 	union {
2529 		struct {
2530 			unsigned field_pic_flag                     : 1;
2531 			unsigned bottom_field_flag                  : 1;
2532 			unsigned num_ref_idx_active_override_flag   : 1;
2533 			unsigned direct_spatial_mv_pred_flag        : 1;
2534 			unsigned no_output_of_prior_pics_flag       : 1;
2535 			unsigned long_term_reference_flag           : 1;
2536 			unsigned idr_flag                           : 1;
2537 			unsigned anchor_pic_flag                    : 1;
2538 			unsigned inter_view_flag                    : 1;
2539 		} bits;
2540 
2541 		unsigned short value;
2542 	} flags;
2543 
2544 //MVC
2545 	unsigned short view_id;
2546 	unsigned char priority_id;
2547 	unsigned char temporal_id;
2548 } VAParseSliceHeaderGroupBuffer;
2549 
2550 typedef struct _VAParsePictureParameterBuffer {
2551     VABufferID frame_buf_id;
2552     VABufferID slice_headers_buf_id;
2553     unsigned int frame_size;
2554     unsigned int slice_headers_size;
2555     union {
2556         struct {
2557             unsigned frame_mbs_only_flag : 1;
2558             unsigned pic_order_present_flag : 1;
2559             unsigned delta_pic_order_always_zero_flag : 1;
2560             unsigned redundant_pic_cnt_present_flag : 1;
2561             unsigned weighted_pred_flag : 1;
2562             unsigned entropy_coding_mode_flag : 1;
2563             unsigned deblocking_filter_control_present_flag : 1;
2564             unsigned weighted_bipred_idc : 1;
2565         } bits;
2566         unsigned int value;
2567     } flags;
2568 
2569     union {
2570         struct {
2571             unsigned char nalu_header_unit_type : 5;
2572             unsigned char nalu_header_ref_idc : 2;
2573         } bits;
2574         unsigned char value;
2575     } nalu_header;
2576 
2577     unsigned short expected_pic_parameter_set_id;
2578     unsigned char num_slice_groups_minus1;
2579     unsigned char slice_group_map_type;
2580     unsigned char log2_slice_group_change_cycle;
2581     unsigned char chroma_format_idc;
2582 
2583     unsigned char log2_max_pic_order_cnt_lsb_minus4;
2584     unsigned char pic_order_cnt_type;
2585     unsigned char log2_max_frame_num_minus4;
2586     unsigned char idr_flag;
2587     unsigned char slice_offset;
2588 
2589     /* additionally */
2590     unsigned char residual_colour_transform_flag;
2591     unsigned char num_ref_idc_l0_active_minus1;
2592     unsigned char num_ref_idc_l1_active_minus1;
2593 } VAParsePictureParameterBuffer;
2594 
2595 /*
2596  * Map data store of the buffer into the client's address space
2597  * vaCreateBuffer() needs to be called with "data" set to NULL before
2598  * calling vaMapBuffer()
2599  *
2600  * if buffer type is VAEncCodedBufferType, pbuf points to link-list of
2601  * VACodedBufferSegment, and the list is terminated if "next" is NULL
2602  */
2603 VAStatus vaMapBuffer (
2604     VADisplay dpy,
2605     VABufferID buf_id,	/* in */
2606     void **pbuf 	/* out */
2607 );
2608 
2609 /*
2610  * After client making changes to a mapped data store, it needs to
2611  * "Unmap" it to let the server know that the data is ready to be
2612  * consumed by the server
2613  */
2614 VAStatus vaUnmapBuffer (
2615     VADisplay dpy,
2616     VABufferID buf_id	/* in */
2617 );
2618 
2619 /*
2620  * After this call, the buffer is deleted and this buffer_id is no longer valid
2621  * Only call this if the buffer is not going to be passed to vaRenderBuffer
2622  */
2623 VAStatus vaDestroyBuffer (
2624     VADisplay dpy,
2625     VABufferID buffer_id
2626 );
2627 
2628 /*
2629 Render (Decode) Pictures
2630 
2631 A picture represents either a frame or a field.
2632 
2633 The Begin/Render/End sequence sends the decode buffers to the server
2634 */
2635 
2636 /*
2637  * Get ready to decode a picture to a target surface
2638  */
2639 VAStatus vaBeginPicture (
2640     VADisplay dpy,
2641     VAContextID context,
2642     VASurfaceID render_target
2643 );
2644 
2645 /*
2646  * Send decode buffers to the server.
2647  * Buffers are automatically destroyed afterwards
2648  */
2649 VAStatus vaRenderPicture (
2650     VADisplay dpy,
2651     VAContextID context,
2652     VABufferID *buffers,
2653     int num_buffers
2654 );
2655 
2656 /*
2657  * Make the end of rendering for a picture.
2658  * The server should start processing all pending operations for this
2659  * surface. This call is non-blocking. The client can start another
2660  * Begin/Render/End sequence on a different render target.
2661  */
2662 VAStatus vaEndPicture (
2663     VADisplay dpy,
2664     VAContextID context
2665 );
2666 
2667 /*
2668 
2669 Synchronization
2670 
2671 */
2672 
2673 /*
2674  * This function blocks until all pending operations on the render target
2675  * have been completed.  Upon return it is safe to use the render target for a
2676  * different picture.
2677  */
2678 VAStatus vaSyncSurface (
2679     VADisplay dpy,
2680     VASurfaceID render_target
2681 );
2682 
2683 typedef enum
2684 {
2685     VASurfaceRendering	= 1, /* Rendering in progress */
2686     VASurfaceDisplaying	= 2, /* Displaying in progress (not safe to render into it) */
2687                              /* this status is useful if surface is used as the source */
2688                              /* of an overlay */
2689     VASurfaceReady	= 4, /* not being rendered or displayed */
2690     VASurfaceSkipped	= 8  /* Indicate a skipped frame during encode */
2691 } VASurfaceStatus;
2692 
2693 /*
2694  * Find out any pending ops on the render target
2695  */
2696 VAStatus vaQuerySurfaceStatus (
2697     VADisplay dpy,
2698     VASurfaceID render_target,
2699     VASurfaceStatus *status	/* out */
2700 );
2701 
2702 typedef enum
2703 {
2704     VADecodeSliceMissing            = 0,
2705     VADecodeMBError                 = 1,
2706 } VADecodeErrorType;
2707 
2708 /*
2709  * Client calls vaQuerySurfaceError with VA_STATUS_ERROR_DECODING_ERROR, server side returns
2710  * an array of structure VASurfaceDecodeMBErrors, and the array is terminated by setting status=-1
2711 */
2712 typedef struct _VASurfaceDecodeMBErrors
2713 {
2714     int status; /* 1 if start_mb/end_mb with errors is returned, 2 if num_mb with errors is returned, -1 means this record is invalid */
2715     unsigned int start_mb; /* start mb address with errors */
2716     unsigned int end_mb;   /* end mb address with errors */
2717     VADecodeErrorType decode_error_type;
2718     unsigned int num_mb;   /* number of mbs with errors */
2719 } VASurfaceDecodeMBErrors;
2720 
2721 /*
2722  * After the application gets VA_STATUS_ERROR_DECODING_ERROR after calling vaSyncSurface(),
2723  * it can call vaQuerySurfaceError to find out further details on the particular error.
2724  * VA_STATUS_ERROR_DECODING_ERROR should be passed in as "error_status",
2725  * upon the return, error_info will point to an array of _VASurfaceDecodeMBErrors structure,
2726  * which is allocated and filled by libVA with detailed information on the missing or error macroblocks.
2727  * The array is terminated if "status==-1" is detected.
2728  */
2729 VAStatus vaQuerySurfaceError(
2730     VADisplay dpy,
2731     VASurfaceID surface,
2732     VAStatus error_status,
2733     void **error_info
2734 );
2735 
2736 /*
2737  * Images and Subpictures
2738  * VAImage is used to either get the surface data to client memory, or
2739  * to copy image data in client memory to a surface.
2740  * Both images, subpictures and surfaces follow the same 2D coordinate system where origin
2741  * is at the upper left corner with positive X to the right and positive Y down
2742  */
2743 #define VA_FOURCC(ch0, ch1, ch2, ch3) \
2744     ((unsigned long)(unsigned char) (ch0) | ((unsigned long)(unsigned char) (ch1) << 8) | \
2745     ((unsigned long)(unsigned char) (ch2) << 16) | ((unsigned long)(unsigned char) (ch3) << 24 ))
2746 
2747 /*
2748  * Pre-defined fourcc codes
2749  */
2750 #define VA_FOURCC_NV12		0x3231564E
2751 #define VA_FOURCC_NV21		0x3132564E
2752 #define VA_FOURCC_AI44		0x34344149
2753 #define VA_FOURCC_RGBA		0x41424752
2754 #define VA_FOURCC_RGBX		0x58424752
2755 #define VA_FOURCC_BGRA		0x41524742
2756 #define VA_FOURCC_BGRX		0x58524742
2757 #define VA_FOURCC_ARGB		0x42475241
2758 #define VA_FOURCC_XRGB		0x42475258
2759 #define VA_FOURCC_ABGR          0x52474241
2760 #define VA_FOURCC_XBGR          0x52474258
2761 #define VA_FOURCC_UYVY          0x59565955
2762 #define VA_FOURCC_YUY2          0x32595559
2763 #define VA_FOURCC_AYUV          0x56555941
2764 #define VA_FOURCC_NV11          0x3131564e
2765 #define VA_FOURCC_YV12          0x32315659
2766 #define VA_FOURCC_P208          0x38303250
2767 #define VA_FOURCC_IYUV          0x56555949
2768 #define VA_FOURCC_YV24          0x34325659
2769 #define VA_FOURCC_YV32          0x32335659
2770 #define VA_FOURCC_Y800          0x30303859
2771 #define VA_FOURCC_IMC3          0x33434D49
2772 #define VA_FOURCC_411P          0x50313134
2773 #define VA_FOURCC_422H          0x48323234
2774 #define VA_FOURCC_422V          0x56323234
2775 #define VA_FOURCC_444P          0x50343434
2776 #define VA_FOURCC_RGBP          0x50424752
2777 #define VA_FOURCC_BGRP          0x50524742
2778 #define VA_FOURCC_411R          0x52313134 /* rotated 411P */
2779 
2780 /* byte order */
2781 #define VA_LSB_FIRST		1
2782 #define VA_MSB_FIRST		2
2783 
2784 typedef struct _VAImageFormat
2785 {
2786     unsigned int	fourcc;
2787     unsigned int	byte_order; /* VA_LSB_FIRST, VA_MSB_FIRST */
2788     unsigned int	bits_per_pixel;
2789     /* for RGB formats */
2790     unsigned int	depth; /* significant bits per pixel */
2791     unsigned int	red_mask;
2792     unsigned int	green_mask;
2793     unsigned int	blue_mask;
2794     unsigned int	alpha_mask;
2795 } VAImageFormat;
2796 
2797 typedef VAGenericID VAImageID;
2798 
2799 typedef struct _VAImage
2800 {
2801     VAImageID		image_id; /* uniquely identify this image */
2802     VAImageFormat	format;
2803     VABufferID		buf;	/* image data buffer */
2804     /*
2805      * Image data will be stored in a buffer of type VAImageBufferType to facilitate
2806      * data store on the server side for optimal performance. The buffer will be
2807      * created by the CreateImage function, and proper storage allocated based on the image
2808      * size and format. This buffer is managed by the library implementation, and
2809      * accessed by the client through the buffer Map/Unmap functions.
2810      */
2811     unsigned short	width;
2812     unsigned short	height;
2813     unsigned int	data_size;
2814     unsigned int	num_planes;	/* can not be greater than 4 */
2815     /*
2816      * An array indicating the scanline pitch in bytes for each plane.
2817      * Each plane may have a different pitch. Maximum 3 planes for planar formats
2818      */
2819     unsigned int	pitches[3];
2820     /*
2821      * An array indicating the byte offset from the beginning of the image data
2822      * to the start of each plane.
2823      */
2824     unsigned int	offsets[3];
2825 
2826     /* The following fields are only needed for paletted formats */
2827     int num_palette_entries;   /* set to zero for non-palette images */
2828     /*
2829      * Each component is one byte and entry_bytes indicates the number of components in
2830      * each entry (eg. 3 for YUV palette entries). set to zero for non-palette images
2831      */
2832     int entry_bytes;
2833     /*
2834      * An array of ascii characters describing the order of the components within the bytes.
2835      * Only entry_bytes characters of the string are used.
2836      */
2837     char component_order[4];
2838     /*
2839      * Pitch and byte offset for the fourth plane if the image format requires 4 planes
2840      * Particular use case is JPEG with CMYK profile
2841      */
2842     unsigned int extra_pitch;
2843     unsigned int extra_offset;
2844 } VAImage;
2845 
2846 /* Get maximum number of image formats supported by the implementation */
2847 int vaMaxNumImageFormats (
2848     VADisplay dpy
2849 );
2850 
2851 /*
2852  * Query supported image formats
2853  * The caller must provide a "format_list" array that can hold at
2854  * least vaMaxNumImageFormats() entries. The actual number of formats
2855  * returned in "format_list" is returned in "num_formats".
2856  */
2857 VAStatus vaQueryImageFormats (
2858     VADisplay dpy,
2859     VAImageFormat *format_list,	/* out */
2860     int *num_formats		/* out */
2861 );
2862 
2863 /*
2864  * Create a VAImage structure
2865  * The width and height fields returned in the VAImage structure may get
2866  * enlarged for some YUV formats. Upon return from this function,
2867  * image->buf has been created and proper storage allocated by the library.
2868  * The client can access the image through the Map/Unmap calls.
2869  */
2870 VAStatus vaCreateImage (
2871     VADisplay dpy,
2872     VAImageFormat *format,
2873     int width,
2874     int height,
2875     VAImage *image	/* out */
2876 );
2877 
2878 /*
2879  * Should call DestroyImage before destroying the surface it is bound to
2880  */
2881 VAStatus vaDestroyImage (
2882     VADisplay dpy,
2883     VAImageID image
2884 );
2885 
2886 VAStatus vaSetImagePalette (
2887     VADisplay dpy,
2888     VAImageID image,
2889     /*
2890      * pointer to an array holding the palette data.  The size of the array is
2891      * num_palette_entries * entry_bytes in size.  The order of the components
2892      * in the palette is described by the component_order in VAImage struct
2893      */
2894     unsigned char *palette
2895 );
2896 
2897 /*
2898  * Retrive surface data into a VAImage
2899  * Image must be in a format supported by the implementation
2900  */
2901 VAStatus vaGetImage (
2902     VADisplay dpy,
2903     VASurfaceID surface,
2904     int x,	/* coordinates of the upper left source pixel */
2905     int y,
2906     unsigned int width, /* width and height of the region */
2907     unsigned int height,
2908     VAImageID image
2909 );
2910 
2911 /*
2912  * Copy data from a VAImage to a surface
2913  * Image must be in a format supported by the implementation
2914  * Returns a VA_STATUS_ERROR_SURFACE_BUSY if the surface
2915  * shouldn't be rendered into when this is called
2916  */
2917 VAStatus vaPutImage (
2918     VADisplay dpy,
2919     VASurfaceID surface,
2920     VAImageID image,
2921     int src_x,
2922     int src_y,
2923     unsigned int src_width,
2924     unsigned int src_height,
2925     int dest_x,
2926     int dest_y,
2927     unsigned int dest_width,
2928     unsigned int dest_height
2929 );
2930 
2931 /*
2932  * Derive an VAImage from an existing surface.
2933  * This interface will derive a VAImage and corresponding image buffer from
2934  * an existing VA Surface. The image buffer can then be mapped/unmapped for
2935  * direct CPU access. This operation is only possible on implementations with
2936  * direct rendering capabilities and internal surface formats that can be
2937  * represented with a VAImage. When the operation is not possible this interface
2938  * will return VA_STATUS_ERROR_OPERATION_FAILED. Clients should then fall back
2939  * to using vaCreateImage + vaPutImage to accomplish the same task in an
2940  * indirect manner.
2941  *
2942  * Implementations should only return success when the resulting image buffer
2943  * would be useable with vaMap/Unmap.
2944  *
2945  * When directly accessing a surface special care must be taken to insure
2946  * proper synchronization with the graphics hardware. Clients should call
2947  * vaQuerySurfaceStatus to insure that a surface is not the target of concurrent
2948  * rendering or currently being displayed by an overlay.
2949  *
2950  * Additionally nothing about the contents of a surface should be assumed
2951  * following a vaPutSurface. Implementations are free to modify the surface for
2952  * scaling or subpicture blending within a call to vaPutImage.
2953  *
2954  * Calls to vaPutImage or vaGetImage using the same surface from which the image
2955  * has been derived will return VA_STATUS_ERROR_SURFACE_BUSY. vaPutImage or
2956  * vaGetImage with other surfaces is supported.
2957  *
2958  * An image created with vaDeriveImage should be freed with vaDestroyImage. The
2959  * image and image buffer structures will be destroyed; however, the underlying
2960  * surface will remain unchanged until freed with vaDestroySurfaces.
2961  */
2962 VAStatus vaDeriveImage (
2963     VADisplay dpy,
2964     VASurfaceID surface,
2965     VAImage *image	/* out */
2966 );
2967 
2968 /*
2969  * Subpictures
2970  * Subpicture is a special type of image that can be blended
2971  * with a surface during vaPutSurface(). Subpicture can be used to render
2972  * DVD sub-titles or closed captioning text etc.
2973  */
2974 
2975 typedef VAGenericID VASubpictureID;
2976 
2977 /* Get maximum number of subpicture formats supported by the implementation */
2978 int vaMaxNumSubpictureFormats (
2979     VADisplay dpy
2980 );
2981 
2982 /* flags for subpictures */
2983 #define VA_SUBPICTURE_CHROMA_KEYING			0x0001
2984 #define VA_SUBPICTURE_GLOBAL_ALPHA			0x0002
2985 #define VA_SUBPICTURE_DESTINATION_IS_SCREEN_COORD	0x0004
2986 /*
2987  * Query supported subpicture formats
2988  * The caller must provide a "format_list" array that can hold at
2989  * least vaMaxNumSubpictureFormats() entries. The flags arrary holds the flag
2990  * for each format to indicate additional capabilities for that format. The actual
2991  * number of formats returned in "format_list" is returned in "num_formats".
2992  *  flags: returned value to indicate addtional capabilities
2993  *         VA_SUBPICTURE_CHROMA_KEYING - supports chroma-keying
2994  *         VA_SUBPICTURE_GLOBAL_ALPHA - supports global alpha
2995  * 	   VA_SUBPICTURE_DESTINATION_IS_SCREEN_COORD - supports unscaled screen relative subpictures for On Screen Display
2996  */
2997 
2998 VAStatus vaQuerySubpictureFormats (
2999     VADisplay dpy,
3000     VAImageFormat *format_list,	/* out */
3001     unsigned int *flags,	/* out */
3002     unsigned int *num_formats	/* out */
3003 );
3004 
3005 /*
3006  * Subpictures are created with an image associated.
3007  */
3008 VAStatus vaCreateSubpicture (
3009     VADisplay dpy,
3010     VAImageID image,
3011     VASubpictureID *subpicture	/* out */
3012 );
3013 
3014 /*
3015  * Destroy the subpicture before destroying the image it is assocated to
3016  */
3017 VAStatus vaDestroySubpicture (
3018     VADisplay dpy,
3019     VASubpictureID subpicture
3020 );
3021 
3022 /*
3023  * Bind an image to the subpicture. This image will now be associated with
3024  * the subpicture instead of the one at creation.
3025  */
3026 VAStatus vaSetSubpictureImage (
3027     VADisplay dpy,
3028     VASubpictureID subpicture,
3029     VAImageID image
3030 );
3031 
3032 /*
3033  * If chromakey is enabled, then the area where the source value falls within
3034  * the chromakey [min, max] range is transparent
3035  * The chromakey component format is the following:
3036  *  For RGB: [0:7] Red [8:15] Blue [16:23] Green
3037  *  For YUV: [0:7] V [8:15] U [16:23] Y
3038  * The chromakey mask can be used to mask out certain components for chromakey
3039  * comparision
3040  */
3041 VAStatus vaSetSubpictureChromakey (
3042     VADisplay dpy,
3043     VASubpictureID subpicture,
3044     unsigned int chromakey_min,
3045     unsigned int chromakey_max,
3046     unsigned int chromakey_mask
3047 );
3048 
3049 /*
3050  * Global alpha value is between 0 and 1. A value of 1 means fully opaque and
3051  * a value of 0 means fully transparent. If per-pixel alpha is also specified then
3052  * the overall alpha is per-pixel alpha multiplied by the global alpha
3053  */
3054 VAStatus vaSetSubpictureGlobalAlpha (
3055     VADisplay dpy,
3056     VASubpictureID subpicture,
3057     float global_alpha
3058 );
3059 
3060 /*
3061  * vaAssociateSubpicture associates the subpicture with target_surfaces.
3062  * It defines the region mapping between the subpicture and the target
3063  * surfaces through source and destination rectangles (with the same width and height).
3064  * Both will be displayed at the next call to vaPutSurface.  Additional
3065  * associations before the call to vaPutSurface simply overrides the association.
3066  */
3067 VAStatus vaAssociateSubpicture (
3068     VADisplay dpy,
3069     VASubpictureID subpicture,
3070     VASurfaceID *target_surfaces,
3071     int num_surfaces,
3072     short src_x, /* upper left offset in subpicture */
3073     short src_y,
3074     unsigned short src_width,
3075     unsigned short src_height,
3076     short dest_x, /* upper left offset in surface */
3077     short dest_y,
3078     unsigned short dest_width,
3079     unsigned short dest_height,
3080     /*
3081      * whether to enable chroma-keying, global-alpha, or screen relative mode
3082      * see VA_SUBPICTURE_XXX values
3083      */
3084     unsigned int flags
3085 );
3086 
3087 /*
3088  * vaDeassociateSubpicture removes the association of the subpicture with target_surfaces.
3089  */
3090 VAStatus vaDeassociateSubpicture (
3091     VADisplay dpy,
3092     VASubpictureID subpicture,
3093     VASurfaceID *target_surfaces,
3094     int num_surfaces
3095 );
3096 
3097 /*
3098  * Display attributes
3099  * Display attributes are used to control things such as contrast, hue, saturation,
3100  * brightness etc. in the rendering process.  The application can query what
3101  * attributes are supported by the driver, and then set the appropriate attributes
3102  * before calling vaPutSurface()
3103  */
3104 
3105 /**
3106  * @name Rotation angles
3107  *
3108  * Those values could be used for VADisplayAttribRotation attribute or
3109  * VAProcPipelineParameterBuffer::rotation_state or in VAConfigAttribValDecJPEG.
3110  * The rotation operation is clockwise.
3111  */
3112 /**@{*/
3113 /** \brief No rotation. */
3114 #define VA_ROTATION_NONE        0x00000000
3115 /** \brief Rotation by 90° clockwise. */
3116 #define VA_ROTATION_90          0x00000001
3117 /** \brief Rotation by 180° clockwise. */
3118 #define VA_ROTATION_180         0x00000002
3119 /** \brief Rotation by 270° clockwise. */
3120 #define VA_ROTATION_270         0x00000003
3121 /**@}*/
3122 
3123 /**
3124  * @name Mirroring directions
3125  *
3126  * Those values could be used for VADisplayAttribMirror attribute or
3127  * VAProcPipelineParameterBuffer::mirror_state.
3128 
3129  */
3130 /**@{*/
3131 /** \brief No Mirroring. */
3132 #define VA_MIRROR_NONE              0x00000000
3133 /** \brief Horizontal Mirroring. */
3134 #define VA_MIRROR_HORIZONTAL        0x00000001
3135 /** \brief Vertical Mirroring. */
3136 #define VA_MIRROR_VERTICAL          0x00000002
3137 /**@}*/
3138 
3139 /* attribute value for VADisplayAttribOutOfLoopDeblock */
3140 #define VA_OOL_DEBLOCKING_FALSE 0x00000000
3141 #define VA_OOL_DEBLOCKING_TRUE  0x00000001
3142 
3143 /* Render mode */
3144 #define VA_RENDER_MODE_UNDEFINED           0
3145 #define VA_RENDER_MODE_LOCAL_OVERLAY       1
3146 #define VA_RENDER_MODE_LOCAL_GPU           2
3147 #define VA_RENDER_MODE_EXTERNAL_OVERLAY    4
3148 #define VA_RENDER_MODE_EXTERNAL_GPU        8
3149 
3150 /* Render device */
3151 #define VA_RENDER_DEVICE_UNDEFINED  0
3152 #define VA_RENDER_DEVICE_LOCAL      1
3153 #define VA_RENDER_DEVICE_EXTERNAL   2
3154 
3155 /* Currently defined display attribute types */
3156 typedef enum
3157 {
3158     VADisplayAttribBrightness		= 0,
3159     VADisplayAttribContrast		= 1,
3160     VADisplayAttribHue			= 2,
3161     VADisplayAttribSaturation		= 3,
3162     /* client can specifiy a background color for the target window
3163      * the new feature of video conference,
3164      * the uncovered area of the surface is filled by this color
3165      * also it will blend with the decoded video color
3166      */
3167     VADisplayAttribBackgroundColor      = 4,
3168     VADisplayAttribRotation            = 6,
3169     VADisplayAttribOutofLoopDeblock    = 7,
3170 
3171     /*
3172      * For type VADisplayAttribCSCMatrix, "value" field is a pointer to the color
3173      * conversion matrix. Each element in the matrix is float-point
3174      */
3175     VADisplayAttribCSCMatrix           = 12,
3176     /* specify the constant color used to blend with video surface
3177      * Cd = Cv*Cc*Ac + Cb *(1 - Ac) C means the constant RGB
3178      *      d: the final color to overwrite into the frame buffer
3179      *      v: decoded video after color conversion,
3180      *      c: video color specified by VADisplayAttribBlendColor
3181      *      b: background color of the drawable
3182      */
3183     VADisplayAttribBlendColor          = 13,
3184     /*
3185      * Indicate driver to skip painting color key or not.
3186      * only applicable if the render is overlay
3187      */
3188     VADisplayAttribOverlayAutoPaintColorKey   = 14,
3189     /*
3190      * customized overlay color key, the format is RGB888
3191      * [23:16] = Red, [15:08] = Green, [07:00] = Blue.
3192      */
3193     VADisplayAttribOverlayColorKey	= 15,
3194     /*
3195      * The hint for the implementation of vaPutSurface
3196      * normally, the driver could use an overlay or GPU to render the surface on the screen
3197      * this flag provides APP the flexibity to switch the render dynamically
3198      */
3199     VADisplayAttribRenderMode           = 16,
3200     /*
3201      * specify if vaPutSurface needs to render into specified monitors
3202      * one example is that one external monitor (e.g. HDMI) is enabled,
3203      * but the window manager is not aware of it, and there is no associated drawable
3204      */
3205     VADisplayAttribRenderDevice        = 17,
3206     /*
3207      * specify vaPutSurface render area if there is no drawable on the monitor
3208      */
3209     VADisplayAttribRenderRect          = 18,
3210     /*
3211      * The flag is used to indicate that the range flag of color-space conversion.
3212      * "value" field should be assigned as VA_SOURCE_RANGE_FULL or VA_SOURCE_RANGE_REDUCED
3213      * to indicate full range or reduced range
3214      */
3215     VADisplayAttribColorRange          = 19,
3216 
3217 } VADisplayAttribType;
3218 
3219 /* flags for VADisplayAttribute */
3220 #define VA_DISPLAY_ATTRIB_NOT_SUPPORTED	0x0000
3221 #define VA_DISPLAY_ATTRIB_GETTABLE	0x0001
3222 #define VA_DISPLAY_ATTRIB_SETTABLE	0x0002
3223 
3224 typedef struct _VADisplayAttribute
3225 {
3226     VADisplayAttribType type;
3227     int min_value;
3228     int max_value;
3229     int value;	/* used by the set/get attribute functions */
3230 /* flags can be VA_DISPLAY_ATTRIB_GETTABLE or VA_DISPLAY_ATTRIB_SETTABLE or OR'd together */
3231     unsigned int flags;
3232     void *attrib_ptr; /* if flags contains VA_DISPLAY_ATTRIB_POINTER, then "attrib_ptr" points to a structure for this display attribute */
3233 } VADisplayAttribute;
3234 
3235 /* Get maximum number of display attributs supported by the implementation */
3236 int vaMaxNumDisplayAttributes (
3237     VADisplay dpy
3238 );
3239 
3240 /*
3241  * Query display attributes
3242  * The caller must provide a "attr_list" array that can hold at
3243  * least vaMaxNumDisplayAttributes() entries. The actual number of attributes
3244  * returned in "attr_list" is returned in "num_attributes".
3245  */
3246 VAStatus vaQueryDisplayAttributes (
3247     VADisplay dpy,
3248     VADisplayAttribute *attr_list,	/* out */
3249     int *num_attributes			/* out */
3250 );
3251 
3252 /*
3253  * Get display attributes
3254  * This function returns the current attribute values in "attr_list".
3255  * Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field
3256  * from vaQueryDisplayAttributes() can have their values retrieved.
3257  */
3258 VAStatus vaGetDisplayAttributes (
3259     VADisplay dpy,
3260     VADisplayAttribute *attr_list,	/* in/out */
3261     int num_attributes
3262 );
3263 
3264 /*
3265  * Set display attributes
3266  * Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field
3267  * from vaQueryDisplayAttributes() can be set.  If the attribute is not settable or
3268  * the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED
3269  */
3270 VAStatus vaSetDisplayAttributes (
3271     VADisplay dpy,
3272     VADisplayAttribute *attr_list,
3273     int num_attributes
3274 );
3275 
3276 /**@}*/
3277 
3278 #ifdef __cplusplus
3279 }
3280 #endif
3281 
3282 #endif /* _VA_H_ */
3283