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