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