You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
3282 lines
122 KiB
3282 lines
122 KiB
/* |
|
* Copyright (c) 2007-2009 Intel Corporation. All Rights Reserved. |
|
* |
|
* Permission is hereby granted, free of charge, to any person obtaining a |
|
* copy of this software and associated documentation files (the |
|
* "Software"), to deal in the Software without restriction, including |
|
* without limitation the rights to use, copy, modify, merge, publish, |
|
* distribute, sub license, and/or sell copies of the Software, and to |
|
* permit persons to whom the Software is furnished to do so, subject to |
|
* the following conditions: |
|
* |
|
* The above copyright notice and this permission notice (including the |
|
* next paragraph) shall be included in all copies or substantial portions |
|
* of the Software. |
|
* |
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
|
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF |
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. |
|
* IN NO EVENT SHALL INTEL AND/OR ITS SUPPLIERS BE LIABLE FOR |
|
* ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, |
|
* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE |
|
* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |
|
*/ |
|
/* |
|
* Video Acceleration (VA) API Specification |
|
* |
|
* Rev. 0.30 |
|
* <jonathan.bian@intel.com> |
|
* |
|
* Revision History: |
|
* rev 0.10 (12/10/2006 Jonathan Bian) - Initial draft |
|
* rev 0.11 (12/15/2006 Jonathan Bian) - Fixed some errors |
|
* rev 0.12 (02/05/2007 Jonathan Bian) - Added VC-1 data structures for slice level decode |
|
* rev 0.13 (02/28/2007 Jonathan Bian) - Added GetDisplay() |
|
* rev 0.14 (04/13/2007 Jonathan Bian) - Fixed MPEG-2 PictureParameter structure, cleaned up a few funcs. |
|
* rev 0.15 (04/20/2007 Jonathan Bian) - Overhauled buffer management |
|
* rev 0.16 (05/02/2007 Jonathan Bian) - Added error codes and fixed some issues with configuration |
|
* rev 0.17 (05/07/2007 Jonathan Bian) - Added H.264/AVC data structures for slice level decode. |
|
* rev 0.18 (05/14/2007 Jonathan Bian) - Added data structures for MPEG-4 slice level decode |
|
* and MPEG-2 motion compensation. |
|
* rev 0.19 (08/06/2007 Jonathan Bian) - Removed extra type for bitplane data. |
|
* rev 0.20 (08/08/2007 Jonathan Bian) - Added missing fields to VC-1 PictureParameter structure. |
|
* rev 0.21 (08/20/2007 Jonathan Bian) - Added image and subpicture support. |
|
* rev 0.22 (08/27/2007 Jonathan Bian) - Added support for chroma-keying and global alpha. |
|
* rev 0.23 (09/11/2007 Jonathan Bian) - Fixed some issues with images and subpictures. |
|
* rev 0.24 (09/18/2007 Jonathan Bian) - Added display attributes. |
|
* rev 0.25 (10/18/2007 Jonathan Bian) - Changed to use IDs only for some types. |
|
* rev 0.26 (11/07/2007 Waldo Bastian) - Change vaCreateBuffer semantics |
|
* rev 0.27 (11/19/2007 Matt Sottek) - Added DeriveImage |
|
* rev 0.28 (12/06/2007 Jonathan Bian) - Added new versions of PutImage and AssociateSubpicture |
|
* to enable scaling |
|
* rev 0.29 (02/07/2008 Jonathan Bian) - VC1 parameter fixes, |
|
* added VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED |
|
* rev 0.30 (03/01/2009 Jonathan Bian) - Added encoding support for H.264 BP and MPEG-4 SP and fixes |
|
* for ISO C conformance. |
|
* rev 0.31 (09/02/2009 Gwenole Beauchesne) - VC-1/H264 fields change for VDPAU and XvBA backend |
|
* Application needs to relink with the new library. |
|
* |
|
* rev 0.31.1 (03/29/2009) - Data structure for JPEG encode |
|
* rev 0.31.2 (01/13/2011 Anthony Pabon)- Added a flag to indicate Subpicture coordinates are screen |
|
* screen relative rather than source video relative. |
|
* rev 0.32.0 (01/13/2011 Xiang Haihao) - Add profile into VAPictureParameterBufferVC1 |
|
* update VAAPI to 0.32.0 |
|
* |
|
* Acknowledgements: |
|
* Some concepts borrowed from XvMC and XvImage. |
|
* Waldo Bastian (Intel), Matt Sottek (Intel), Austin Yuan (Intel), and Gwenole Beauchesne (SDS) |
|
* contributed to various aspects of the API. |
|
*/ |
|
|
|
/** |
|
* \file va.h |
|
* \brief The Core API |
|
* |
|
* This file contains the \ref api_core "Core API". |
|
*/ |
|
|
|
#ifndef _VA_H_ |
|
#define _VA_H_ |
|
|
|
#include <stdint.h> |
|
#include <va/va_version.h> |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
#ifdef __GNUC__ |
|
# define __maybe_unused __attribute__((__unused__)) |
|
#else |
|
# define __maybe_unused |
|
#endif |
|
|
|
/** |
|
* \mainpage Video Acceleration (VA) API |
|
* |
|
* \section intro Introduction |
|
* |
|
* The main motivation for VA-API (Video Acceleration API) is to |
|
* enable hardware accelerated video decode and encode at various |
|
* entry-points (VLD, IDCT, Motion Compensation etc.) for the |
|
* prevailing coding standards today (MPEG-2, MPEG-4 ASP/H.263, MPEG-4 |
|
* AVC/H.264, VC-1/VMW3, and JPEG). |
|
* |
|
* VA-API is split into several modules: |
|
* - \ref api_core |
|
* - \ref api_enc_core |
|
* - \ref api_enc_h264 |
|
* - \ref api_vpp |
|
*/ |
|
|
|
/** |
|
* \defgroup api_core Core API |
|
* |
|
* @{ |
|
*/ |
|
|
|
/* |
|
Overview |
|
|
|
The VA API is intended to provide an interface between a video decode/encode/display |
|
application (client) and a hardware accelerator (server), to off-load |
|
video decode/encode/display operations from the host to the hardware accelerator at various |
|
entry-points. |
|
|
|
The basic operation steps are: |
|
|
|
- Negotiate a mutually acceptable configuration with the server to lock |
|
down profile, entrypoints, and other attributes that will not change on |
|
a frame-by-frame basis. |
|
- Create a decode context which represents a "virtualized" hardware decode |
|
device |
|
- Get and fill decode buffers with picture level, slice level and macroblock |
|
level data (depending on entrypoints) |
|
- Pass the decode buffers to the server to decode the current frame |
|
|
|
Initialization & Configuration Management |
|
|
|
- Find out supported profiles |
|
- Find out entrypoints for a given profile |
|
- Find out configuration attributes for a given profile/entrypoint pair |
|
- Create a configuration for use by the decoder |
|
|
|
*/ |
|
|
|
typedef void* VADisplay; /* window system dependent */ |
|
|
|
typedef int VAStatus; /* Return status type from functions */ |
|
/* Values for the return status */ |
|
#define VA_STATUS_SUCCESS 0x00000000 |
|
#define VA_STATUS_ERROR_OPERATION_FAILED 0x00000001 |
|
#define VA_STATUS_ERROR_ALLOCATION_FAILED 0x00000002 |
|
#define VA_STATUS_ERROR_INVALID_DISPLAY 0x00000003 |
|
#define VA_STATUS_ERROR_INVALID_CONFIG 0x00000004 |
|
#define VA_STATUS_ERROR_INVALID_CONTEXT 0x00000005 |
|
#define VA_STATUS_ERROR_INVALID_SURFACE 0x00000006 |
|
#define VA_STATUS_ERROR_INVALID_BUFFER 0x00000007 |
|
#define VA_STATUS_ERROR_INVALID_IMAGE 0x00000008 |
|
#define VA_STATUS_ERROR_INVALID_SUBPICTURE 0x00000009 |
|
#define VA_STATUS_ERROR_ATTR_NOT_SUPPORTED 0x0000000a |
|
#define VA_STATUS_ERROR_MAX_NUM_EXCEEDED 0x0000000b |
|
#define VA_STATUS_ERROR_UNSUPPORTED_PROFILE 0x0000000c |
|
#define VA_STATUS_ERROR_UNSUPPORTED_ENTRYPOINT 0x0000000d |
|
#define VA_STATUS_ERROR_UNSUPPORTED_RT_FORMAT 0x0000000e |
|
#define VA_STATUS_ERROR_UNSUPPORTED_BUFFERTYPE 0x0000000f |
|
#define VA_STATUS_ERROR_SURFACE_BUSY 0x00000010 |
|
#define VA_STATUS_ERROR_FLAG_NOT_SUPPORTED 0x00000011 |
|
#define VA_STATUS_ERROR_INVALID_PARAMETER 0x00000012 |
|
#define VA_STATUS_ERROR_RESOLUTION_NOT_SUPPORTED 0x00000013 |
|
#define VA_STATUS_ERROR_UNIMPLEMENTED 0x00000014 |
|
#define VA_STATUS_ERROR_SURFACE_IN_DISPLAYING 0x00000015 |
|
#define VA_STATUS_ERROR_INVALID_IMAGE_FORMAT 0x00000016 |
|
#define VA_STATUS_ERROR_DECODING_ERROR 0x00000017 |
|
#define VA_STATUS_ERROR_ENCODING_ERROR 0x00000018 |
|
/** |
|
* \brief An invalid/unsupported value was supplied. |
|
* |
|
* This is a catch-all error code for invalid or unsupported values. |
|
* e.g. value exceeding the valid range, invalid type in the context |
|
* of generic attribute values. |
|
*/ |
|
#define VA_STATUS_ERROR_INVALID_VALUE 0x00000019 |
|
/** \brief An unsupported filter was supplied. */ |
|
#define VA_STATUS_ERROR_UNSUPPORTED_FILTER 0x00000020 |
|
/** \brief An invalid filter chain was supplied. */ |
|
#define VA_STATUS_ERROR_INVALID_FILTER_CHAIN 0x00000021 |
|
/** \brief Indicate HW busy (e.g. run multiple encoding simultaneously). */ |
|
#define VA_STATUS_ERROR_HW_BUSY 0x00000022 |
|
/** \brief An invalid blend state was supplied. */ |
|
#define VA_STATUS_ERROR_INVALID_BLEND_STATE 0x00000023 |
|
#define VA_STATUS_ERROR_UNKNOWN 0xFFFFFFFF |
|
|
|
/* De-interlacing flags for vaPutSurface() */ |
|
#define VA_FRAME_PICTURE 0x00000000 |
|
#define VA_TOP_FIELD 0x00000001 |
|
#define VA_BOTTOM_FIELD 0x00000002 |
|
|
|
/* |
|
* Enabled the positioning/cropping/blending feature: |
|
* 1, specify the video playback position in the isurface |
|
* 2, specify the cropping info for video playback |
|
* 3, encoded video will blend with background color |
|
*/ |
|
#define VA_ENABLE_BLEND 0x00000004 /* video area blend with the constant color */ |
|
|
|
/* |
|
* Clears the drawable with background color. |
|
* for hardware overlay based implementation this flag |
|
* can be used to turn off the overlay |
|
*/ |
|
#define VA_CLEAR_DRAWABLE 0x00000008 |
|
|
|
/* Color space conversion flags for vaPutSurface() */ |
|
#define VA_SRC_COLOR_MASK 0x000000f0 |
|
#define VA_SRC_BT601 0x00000010 |
|
#define VA_SRC_BT709 0x00000020 |
|
#define VA_SRC_SMPTE_240 0x00000040 |
|
#define VA_SRC_BT2020 0x00000080 |
|
|
|
/* Scaling flags for vaPutSurface() */ |
|
#define VA_FILTER_SCALING_DEFAULT 0x00000000 |
|
#define VA_FILTER_SCALING_FAST 0x00000100 |
|
#define VA_FILTER_SCALING_HQ 0x00000200 |
|
#define VA_FILTER_SCALING_NL_ANAMORPHIC 0x00000300 |
|
#define VA_FILTER_SCALING_MASK 0x00000f00 |
|
|
|
/* |
|
* The upper 16 bits are reserved for VPP filter fast path usage. |
|
* Flag to enable auto noise reduction. |
|
*/ |
|
#define VA_FILTER_NOISEREDUCTION_AUTO 0x00010000 |
|
|
|
/* |
|
* This is to indicate that the color-space conversion uses full range or reduced range. |
|
* VA_SOURCE_RANGE_FULL(Full range): Y/Cb/Cr is in [0, 255]. It is mainly used |
|
* for JPEG/JFIF formats. The combination with the BT601 flag means that |
|
* JPEG/JFIF color-space conversion matrix is used. |
|
* VA_SOURCE_RANGE_REDUCED(Reduced range): Y is in [16, 235] and Cb/Cr is in [16, 240]. |
|
* It is mainly used for the YUV->RGB color-space conversion in SDTV/HDTV/UHDTV. |
|
*/ |
|
#define VA_SOURCE_RANGE_MASK 0x00020000 |
|
#define VA_SOURCE_RANGE_FULL 0x00020000 |
|
#define VA_SOURCE_RANGE_REDUCED 0x00000000 |
|
/* |
|
* Returns a short english description of error_status |
|
*/ |
|
const char *vaErrorStr(VAStatus error_status); |
|
|
|
typedef struct _VARectangle |
|
{ |
|
short x; |
|
short y; |
|
unsigned short width; |
|
unsigned short height; |
|
} VARectangle; |
|
|
|
/** \brief Generic motion vector data structure. */ |
|
typedef struct _VAMotionVector { |
|
/** \mv0[0]: horizontal motion vector for past reference */ |
|
/** \mv0[1]: vertical motion vector for past reference */ |
|
/** \mv1[0]: horizontal motion vector for future reference */ |
|
/** \mv1[1]: vertical motion vector for future reference */ |
|
unsigned short mv0[2]; /* past reference */ |
|
unsigned short mv1[2]; /* future reference */ |
|
} VAMotionVector; |
|
|
|
/* |
|
* Initialization: |
|
* A display must be obtained by calling vaGetDisplay() before calling |
|
* vaInitialize() and other functions. This connects the API to the |
|
* native window system. |
|
* For X Windows, native_dpy would be from XOpenDisplay() |
|
*/ |
|
typedef void* VANativeDisplay; /* window system dependent */ |
|
|
|
int vaDisplayIsValid(VADisplay dpy); |
|
|
|
/* |
|
* Initialize the library |
|
*/ |
|
VAStatus vaInitialize ( |
|
VADisplay dpy, |
|
int *major_version, /* out */ |
|
int *minor_version /* out */ |
|
); |
|
|
|
/* |
|
* After this call, all library internal resources will be cleaned up |
|
*/ |
|
VAStatus vaTerminate ( |
|
VADisplay dpy |
|
); |
|
|
|
/* |
|
* vaQueryVendorString returns a pointer to a zero-terminated string |
|
* describing some aspects of the VA implemenation on a specific |
|
* hardware accelerator. The format of the returned string is vendor |
|
* specific and at the discretion of the implementer. |
|
* e.g. for the Intel GMA500 implementation, an example would be: |
|
* "Intel GMA500 - 2.0.0.32L.0005" |
|
*/ |
|
const char *vaQueryVendorString ( |
|
VADisplay dpy |
|
); |
|
|
|
typedef int (*VAPrivFunc)(); |
|
|
|
/* |
|
* Return a function pointer given a function name in the library. |
|
* This allows private interfaces into the library |
|
*/ |
|
VAPrivFunc vaGetLibFunc ( |
|
VADisplay dpy, |
|
const char *func |
|
); |
|
|
|
/* Currently defined profiles */ |
|
typedef enum |
|
{ |
|
/** \brief Profile ID used for video processing. */ |
|
VAProfileNone = -1, |
|
VAProfileMPEG2Simple = 0, |
|
VAProfileMPEG2Main = 1, |
|
VAProfileMPEG4Simple = 2, |
|
VAProfileMPEG4AdvancedSimple = 3, |
|
VAProfileMPEG4Main = 4, |
|
VAProfileH264Baseline = 5, |
|
VAProfileH264Main = 6, |
|
VAProfileH264High = 7, |
|
VAProfileVC1Simple = 8, |
|
VAProfileVC1Main = 9, |
|
VAProfileVC1Advanced = 10, |
|
VAProfileH263Baseline = 11, |
|
VAProfileJPEGBaseline = 12, |
|
VAProfileH264ConstrainedBaseline = 13, |
|
VAProfileVP8Version0_3 = 14, |
|
VAProfileH264MultiviewHigh = 15, |
|
VAProfileH264StereoHigh = 16, |
|
VAProfileHEVCMain = 17, |
|
VAProfileHEVCMain10 = 18, |
|
VAProfileVP9Version0 = 19, |
|
VAProfileAVS = 20, |
|
VAProfileMax |
|
} VAProfile; |
|
|
|
/* |
|
* Currently defined entrypoints |
|
*/ |
|
typedef enum |
|
{ |
|
VAEntrypointVLD = 1, |
|
VAEntrypointIZZ = 2, |
|
VAEntrypointIDCT = 3, |
|
VAEntrypointMoComp = 4, |
|
VAEntrypointDeblocking = 5, |
|
VAEntrypointEncSlice = 6, /* slice level encode */ |
|
VAEntrypointEncPicture = 7, /* pictuer encode, JPEG, etc */ |
|
/* |
|
* For an implementation that supports a low power/high performance variant |
|
* for slice level encode, it can choose to expose the |
|
* VAEntrypointEncSliceLP entrypoint. Certain encoding tools may not be |
|
* available with this entrypoint (e.g. interlace, MBAFF) and the |
|
* application can query the encoding configuration attributes to find |
|
* out more details if this entrypoint is supported. |
|
*/ |
|
VAEntrypointEncSliceLP = 8, |
|
VAEntrypointVideoProc = 10, /**< Video pre/post-processing. */ |
|
|
|
/** |
|
* \brief Intel specific entrypoints start at 1001 |
|
*/ |
|
/** |
|
* \brief VAEntrypointEncFEIIntel |
|
* |
|
* The purpose of FEI (Flexible Encoding Infrastructure) is to allow applications to |
|
* have more controls and trade off quality for speed with their own IPs. A pre-processing |
|
* function for getting some statistics and motion vectors is added |
|
* and some extra controls for Encode pipeline are provided. |
|
* The application can optionally call the statistics function |
|
* to get motion vectors and statistics before calling encode function. |
|
* The application can also optionally provide input to VME for extra |
|
* encode control and get the output from VME. Application can chose to |
|
* modify the VME output/PAK input during encoding, but the performance |
|
* impact is significant. |
|
* |
|
* On top of the existing buffers for normal encode, there will be |
|
* one extra input buffer (VAEncMiscParameterIntelFEIFrameControl) and |
|
* three extra output buffers (VAIntelEncFEIMVBufferType, VAIntelEncFEIModeBufferType |
|
* and VAIntelEncFEIDistortionBufferType) for VAEntrypointIntelEncFEI entry function. |
|
* If separate PAK is set, two extra input buffers |
|
* (VAIntelEncFEIMVBufferType, VAIntelEncFEIModeBufferType) are needed for PAK input. |
|
* |
|
**/ |
|
VAEntrypointEncFEIIntel = 1001, |
|
/** |
|
* \brief VAEntrypointStatisticsIntel |
|
* |
|
* Statistics, like variances, distortions, motion vectors can be obtained |
|
* via this entry point. Checking whether Statistics is supported can be |
|
* performed with vaQueryConfigEntrypoints() and the profile argument |
|
* set to #VAProfileNone. If Statistics entry point is supported, |
|
* then the list of returned entry-points will include #VAEntrypointIntelStatistics. |
|
* Supported pixel format, maximum resolution and statistics specific attributes |
|
* can be obtained via normal attribute query. |
|
* One input buffer (VAIntelStatsStatisticsParameterBufferType) and one or two |
|
* output buffers (VAIntelStatsStatisticsBufferType and VAIntelStatsMotionVectorBufferType) |
|
* are needed for this entry point. |
|
* |
|
**/ |
|
VAEntrypointStatisticsIntel, |
|
VAEntrypointMax |
|
} VAEntrypoint; |
|
|
|
/* Currently defined configuration attribute types */ |
|
typedef enum |
|
{ |
|
VAConfigAttribRTFormat = 0, |
|
VAConfigAttribSpatialResidual = 1, |
|
VAConfigAttribSpatialClipping = 2, |
|
VAConfigAttribIntraResidual = 3, |
|
VAConfigAttribEncryption = 4, |
|
VAConfigAttribRateControl = 5, |
|
|
|
/** @name Attributes for decoding */ |
|
/**@{*/ |
|
/** |
|
* \brief Slice Decoding mode. Read/write. |
|
* |
|
* This attribute determines what mode the driver supports for slice |
|
* decoding, through vaGetConfigAttributes(); and what mode the user |
|
* will be providing to the driver, through vaCreateConfig(), if the |
|
* driver supports those. If this attribute is not set by the user then |
|
* it is assumed that VA_DEC_SLICE_MODE_NORMAL mode is used. |
|
* |
|
* See \c VA_DEC_SLICE_MODE_xxx for the list of slice decoding modes. |
|
*/ |
|
VAConfigAttribDecSliceMode = 6, |
|
/** |
|
* \brief JPEG decoding attribute. Read-only. |
|
* |
|
* This attribute exposes a number of capabilities of the underlying |
|
* JPEG implementation. The attribute value is partitioned into fields as defined in the |
|
* VAConfigAttribValDecJPEG union. |
|
*/ |
|
VAConfigAttribDecJPEG = 7, |
|
|
|
/** @name Attributes for encoding */ |
|
/**@{*/ |
|
/** |
|
* \brief Packed headers mode. Read/write. |
|
* |
|
* This attribute determines what packed headers the driver supports, |
|
* through vaGetConfigAttributes(); and what packed headers the user |
|
* will be providing to the driver, through vaCreateConfig(), if the |
|
* driver supports those. |
|
* |
|
* See \c VA_ENC_PACKED_HEADER_xxx for the list of packed headers. |
|
*/ |
|
VAConfigAttribEncPackedHeaders = 10, |
|
/** |
|
* \brief Interlaced mode. Read/write. |
|
* |
|
* This attribute determines what kind of interlaced encoding mode |
|
* the driver supports. |
|
* |
|
* See \c VA_ENC_INTERLACED_xxx for the list of interlaced modes. |
|
*/ |
|
VAConfigAttribEncInterlaced = 11, |
|
/** |
|
* \brief Maximum number of reference frames. Read-only. |
|
* |
|
* This attribute determines the maximum number of reference |
|
* frames supported for encoding. |
|
* |
|
* Note: for H.264 encoding, the value represents the maximum number |
|
* of reference frames for both the reference picture list 0 (bottom |
|
* 16 bits) and the reference picture list 1 (top 16 bits). |
|
*/ |
|
VAConfigAttribEncMaxRefFrames = 13, |
|
/** |
|
* \brief Maximum number of slices per frame. Read-only. |
|
* |
|
* This attribute determines the maximum number of slices the |
|
* driver can support to encode a single frame. |
|
*/ |
|
VAConfigAttribEncMaxSlices = 14, |
|
/** |
|
* \brief Slice structure. Read-only. |
|
* |
|
* This attribute determines slice structures supported by the |
|
* driver for encoding. This attribute is a hint to the user so |
|
* that he can choose a suitable surface size and how to arrange |
|
* the encoding process of multiple slices per frame. |
|
* |
|
* More specifically, for H.264 encoding, this attribute |
|
* determines the range of accepted values to |
|
* VAEncSliceParameterBufferH264::macroblock_address and |
|
* VAEncSliceParameterBufferH264::num_macroblocks. |
|
* |
|
* See \c VA_ENC_SLICE_STRUCTURE_xxx for the supported slice |
|
* structure types. |
|
*/ |
|
VAConfigAttribEncSliceStructure = 15, |
|
/** |
|
* \brief Macroblock information. Read-only. |
|
* |
|
* This attribute determines whether the driver supports extra |
|
* encoding information per-macroblock. e.g. QP. |
|
* |
|
* More specifically, for H.264 encoding, if the driver returns a non-zero |
|
* value for this attribute, this means the application can create |
|
* additional #VAEncMacroblockParameterBufferH264 buffers referenced |
|
* through VAEncSliceParameterBufferH264::macroblock_info. |
|
*/ |
|
VAConfigAttribEncMacroblockInfo = 16, |
|
/** |
|
* \brief Auto reference frame management. Read-only |
|
* |
|
* This attribute determines whether the driver supports auto reference management |
|
* |
|
* If driver supports, application only needs to set scratch reference surfaces |
|
* via VAPictureParameterBufferH264:ReferenceFrames. The scratch surfaces number is |
|
* determined by the maximum number of RefPicList0 and RefPicList0 which can be queried from |
|
* VAConfigAttribEncMaxRefFrames. Application doesn't need to set VAPictureParameterBufferH264:CurrPic |
|
* and VAEncSliceParameterBufferH264:RefPicList. Driver will manage the reference frames internally |
|
* and choose the best reference frames. Which scratch surface is used for reconstructed frame and which |
|
* surfaces are used for reference frames will be fedback via VACodedBufferSegment |
|
*/ |
|
VAConfigAttribEncAutoReference = 17, |
|
/** |
|
* \brief Maximum picture width. Read-only. |
|
* |
|
* This attribute determines the maximum picture width the driver supports |
|
* for a given configuration. |
|
*/ |
|
VAConfigAttribMaxPictureWidth = 18, |
|
/** |
|
* \brief Maximum picture height. Read-only. |
|
* |
|
* This attribute determines the maximum picture height the driver supports |
|
* for a given configuration. |
|
*/ |
|
VAConfigAttribMaxPictureHeight = 19, |
|
/** |
|
* \brief JPEG encoding attribute. Read-only. |
|
* |
|
* This attribute exposes a number of capabilities of the underlying |
|
* JPEG implementation. The attribute value is partitioned into fields as defined in the |
|
* VAConfigAttribValEncJPEG union. |
|
*/ |
|
VAConfigAttribEncJPEG = 20, |
|
/** |
|
* \brief Encoding quality range attribute. Read-only. |
|
* |
|
* This attribute conveys whether the driver supports different quality level settings |
|
* for encoding. A value less than or equal to 1 means that the encoder only has a single |
|
* quality setting, and a value greater than 1 represents the number of quality levels |
|
* that can be configured. e.g. a value of 2 means there are two distinct quality levels. |
|
*/ |
|
VAConfigAttribEncQualityRange = 21, |
|
/** |
|
* \brief Encoding quantization attribute. Read-only. |
|
* |
|
* This attribute conveys whether the driver supports certain types of quantization methods |
|
* for encoding (e.g. trellis). |
|
*/ |
|
VAConfigAttribEncQuantization = 22, |
|
/** |
|
* \brief Encoding intra refresh attribute. Read-only. |
|
* |
|
* This attribute conveys whether the driver supports certain types of intra refresh methods |
|
* for encoding (e.g. adaptive intra refresh or rolling intra refresh). |
|
*/ |
|
VAConfigAttribEncIntraRefresh = 23, |
|
/** |
|
* \brief Encoding skip frame attribute. Read-only. |
|
* |
|
* This attribute conveys whether the driver supports sending skip frame parameters |
|
* (VAEncMiscParameterTypeSkipFrame) to the encoder's rate control, when the user has |
|
* externally skipped frames. It is a boolean value 0 - unsupported, 1 - supported. |
|
*/ |
|
VAConfigAttribEncSkipFrame = 24, |
|
/** |
|
* \brief Encoding region-of-interest (ROI) attribute. Read-only. |
|
* |
|
* This attribute conveys whether the driver supports region-of-interest (ROI) encoding, |
|
* based on user provided ROI rectangles. The attribute value returned indicates the number |
|
* of regions that are supported. e.g. A value of 0 means ROI encoding is not supported. |
|
* If ROI encoding is supported, the ROI information is passed to the driver using |
|
* VAEncMiscParameterTypeRoi. |
|
*/ |
|
VAConfigAttribEncRoi = 25, |
|
/** |
|
* \brief Encoding extended rate control attribute. Read-only. |
|
* |
|
* This attribute conveys whether the driver supports any extended rate control features |
|
* The attribute value is partitioned into fields as defined in the |
|
* VAConfigAttribValEncRateControlExt union. |
|
*/ |
|
VAConfigAttribEncRateControlExt = 26, |
|
/** |
|
* \brief Intel specific attributes start at 1001 |
|
*/ |
|
/** |
|
* \brief Encode function type. |
|
* |
|
* This attribute conveys whether the driver supports different function types for encode. |
|
* It can be ENC, PAK, or ENC + PAK. Currently it is for FEI entry point only. |
|
* Default is ENC + PAK. |
|
*/ |
|
VAConfigAttribEncFunctionTypeIntel = 1001, |
|
/** |
|
* \brief Maximum number of MV predictors. Read-only. |
|
* |
|
* This attribute determines the maximum number of MV predictors the driver |
|
* can support to encode a single frame. 0 means no MV predictor is supported. |
|
*/ |
|
VAConfigAttribEncMVPredictorsIntel, |
|
/** |
|
* \brief Statistics attribute. Read-only. |
|
* |
|
* This attribute exposes a number of capabilities of the VAEntrypointStatistics entry |
|
* point. The attribute value is partitioned into fields as defined in the |
|
* VAConfigAttribValStatistics union. |
|
*/ |
|
VAConfigAttribStatisticsIntel, |
|
/**@}*/ |
|
VAConfigAttribTypeMax |
|
} VAConfigAttribType; |
|
|
|
/* |
|
* Configuration attributes |
|
* If there is more than one value for an attribute, a default |
|
* value will be assigned to the attribute if the client does not |
|
* specify the attribute when creating a configuration |
|
*/ |
|
typedef struct _VAConfigAttrib { |
|
VAConfigAttribType type; |
|
unsigned int value; /* OR'd flags (bits) for this attribute */ |
|
} VAConfigAttrib; |
|
|
|
/* attribute value for VAConfigAttribRTFormat */ |
|
#define VA_RT_FORMAT_YUV420 0x00000001 |
|
#define VA_RT_FORMAT_YUV422 0x00000002 |
|
#define VA_RT_FORMAT_YUV444 0x00000004 |
|
#define VA_RT_FORMAT_YUV411 0x00000008 |
|
#define VA_RT_FORMAT_YUV400 0x00000010 |
|
#define VA_RT_FORMAT_RGB16 0x00010000 |
|
#define VA_RT_FORMAT_RGB32 0x00020000 |
|
/* RGBP covers RGBP and BGRP fourcc */ |
|
#define VA_RT_FORMAT_RGBP 0x00100000 |
|
#define VA_RT_FORMAT_PROTECTED 0x80000000 |
|
|
|
/** @name Attribute values for VAConfigAttribRateControl */ |
|
/**@{*/ |
|
/** \brief Driver does not support any form of rate control. */ |
|
#define VA_RC_NONE 0x00000001 |
|
/** \brief Constant bitrate. */ |
|
#define VA_RC_CBR 0x00000002 |
|
/** \brief Variable bitrate. */ |
|
#define VA_RC_VBR 0x00000004 |
|
/** \brief Video conference mode. */ |
|
#define VA_RC_VCM 0x00000008 |
|
/** \brief Constant QP. */ |
|
#define VA_RC_CQP 0x00000010 |
|
/** \brief Variable bitrate with peak rate higher than average bitrate. */ |
|
#define VA_RC_VBR_CONSTRAINED 0x00000020 |
|
/** \brief Intelligent Constant Quality. Provided an initial ICQ_quality_factor, |
|
* adjusts QP at a frame and MB level based on motion to improve subjective quality. */ |
|
#define VA_RC_ICQ 0x00000040 |
|
/** \brief Macroblock based rate control. Per MB control is decided |
|
* internally in the encoder. It may be combined with other RC modes, except CQP. */ |
|
#define VA_RC_MB 0x00000080 |
|
|
|
/**@}*/ |
|
|
|
/** @name Attribute values for VAConfigAttribDecSliceMode */ |
|
/**@{*/ |
|
/** \brief Driver supports normal mode for slice decoding */ |
|
#define VA_DEC_SLICE_MODE_NORMAL 0x00000001 |
|
/** \brief Driver supports base mode for slice decoding */ |
|
#define VA_DEC_SLICE_MODE_BASE 0x00000002 |
|
|
|
/** @name Attribute values for VAConfigAttribDecJPEG */ |
|
/**@{*/ |
|
typedef union _VAConfigAttribValDecJPEG { |
|
/** \brief Set to (1 << VA_ROTATION_xxx) for supported rotation angles. */ |
|
unsigned int rotation; |
|
/** \brief Reserved for future use. */ |
|
unsigned int reserved[3]; |
|
} VAConfigAttribValDecJPEG; |
|
/** \brief Driver supports subsample mode for slice decoding */ |
|
#define VA_DEC_SLICE_MODE_SUBSAMPLE 0x00000004 |
|
|
|
/**@}*/ |
|
|
|
/** @name Attribute values for VAConfigAttribEncPackedHeaders */ |
|
/**@{*/ |
|
/** \brief Driver does not support any packed headers mode. */ |
|
#define VA_ENC_PACKED_HEADER_NONE 0x00000000 |
|
/** \brief Driver supports packed sequence headers. e.g. SPS for H.264. */ |
|
#define VA_ENC_PACKED_HEADER_SEQUENCE 0x00000001 |
|
/** \brief Driver supports packed picture headers. e.g. PPS for H.264. */ |
|
#define VA_ENC_PACKED_HEADER_PICTURE 0x00000002 |
|
/** \brief Driver supports packed slice headers. e.g. \c slice_header() for H.264. */ |
|
#define VA_ENC_PACKED_HEADER_SLICE 0x00000004 |
|
/** \brief Driver supports misc packed headers. e.g. SEI for H.264. */ |
|
#define VA_ENC_PACKED_HEADER_MISC 0x00000008 |
|
/** \brief Driver supports raw packed header, see VAEncPackedHeaderRawData */ |
|
#define VA_ENC_PACKED_HEADER_RAW_DATA 0x0000000C |
|
/**@}*/ |
|
|
|
/** @name Attribute values for VAConfigAttribEncInterlaced */ |
|
/**@{*/ |
|
/** \brief Driver does not support interlaced coding. */ |
|
#define VA_ENC_INTERLACED_NONE 0x00000000 |
|
/** \brief Driver supports interlaced frame coding. */ |
|
#define VA_ENC_INTERLACED_FRAME 0x00000001 |
|
/** \brief Driver supports interlaced field coding. */ |
|
#define VA_ENC_INTERLACED_FIELD 0x00000002 |
|
/** \brief Driver supports macroblock adaptive frame field coding. */ |
|
#define VA_ENC_INTERLACED_MBAFF 0x00000004 |
|
/** \brief Driver supports picture adaptive frame field coding. */ |
|
#define VA_ENC_INTERLACED_PAFF 0x00000008 |
|
/**@}*/ |
|
|
|
/** @name Attribute values for VAConfigAttribEncSliceStructure */ |
|
/**@{*/ |
|
/** \brief Driver supports an arbitrary number of rows per slice. */ |
|
#define VA_ENC_SLICE_STRUCTURE_ARBITRARY_ROWS 0x00000000 |
|
/** \brief Driver supports a power-of-two number of rows per slice. */ |
|
#define VA_ENC_SLICE_STRUCTURE_POWER_OF_TWO_ROWS 0x00000001 |
|
/** \brief Driver supports an arbitrary number of rows per slice. */ |
|
#define VA_ENC_SLICE_STRUCTURE_ARBITRARY_MACROBLOCKS 0x00000002 |
|
/** \brief Driver supports any number of rows per slice but they must be the same |
|
for all slices except for the last one, which must be equal or smaller |
|
to the previous slices. */ |
|
#define VA_ENC_SLICE_STRUCTURE_EQUAL_ROWS 0x00000004 |
|
/** \brief Driver supports a maximum slice size requested by the app. |
|
The size is sent in VAEncMiscParameterMaxSliceSize. */ |
|
#define VA_ENC_SLICE_STRUCTURE_MAX_SLICE_SIZE 0x00000008 |
|
/**@}*/ |
|
|
|
/** \brief Attribute value for VAConfigAttribEncJPEG */ |
|
typedef union _VAConfigAttribValEncJPEG { |
|
struct { |
|
/** \brief set to 1 for arithmatic coding. */ |
|
unsigned int arithmatic_coding_mode : 1; |
|
/** \brief set to 1 for progressive dct. */ |
|
unsigned int progressive_dct_mode : 1; |
|
/** \brief set to 1 for non-interleaved. */ |
|
unsigned int non_interleaved_mode : 1; |
|
/** \brief set to 1 for differential. */ |
|
unsigned int differential_mode : 1; |
|
unsigned int max_num_components : 3; |
|
unsigned int max_num_scans : 4; |
|
unsigned int max_num_huffman_tables : 3; |
|
unsigned int max_num_quantization_tables : 3; |
|
} bits; |
|
unsigned int value; |
|
} VAConfigAttribValEncJPEG; |
|
|
|
/** @name Attribute values for VAConfigAttribEncQuantization */ |
|
/**@{*/ |
|
/** \brief Driver does not support special types of quantization */ |
|
#define VA_ENC_QUANTIZATION_NONE 0x00000000 |
|
/** \brief Driver supports trellis quantization */ |
|
#define VA_ENC_QUANTIZATION_TRELLIS_SUPPORTED 0x00000001 |
|
/**@}*/ |
|
|
|
/** @name Attribute values for VAConfigAttribEncIntraRefresh */ |
|
/**@{*/ |
|
/** \brief Driver does not support intra refresh */ |
|
#define VA_ENC_INTRA_REFRESH_NONE 0x00000000 |
|
/** \brief Driver supports column based rolling intra refresh */ |
|
#define VA_ENC_INTRA_REFRESH_ROLLING_COLUMN 0x00000001 |
|
/** \brief Driver supports row based rolling intra refresh */ |
|
#define VA_ENC_INTRA_REFRESH_ROLLING_ROW 0x00000002 |
|
/** \brief Driver supports adaptive intra refresh */ |
|
#define VA_ENC_INTRA_REFRESH_ADAPTIVE 0x00000010 |
|
/** \brief Driver supports cyclic intra refresh */ |
|
#define VA_ENC_INTRA_REFRESH_CYCLIC 0x00000020 |
|
|
|
/**@}*/ |
|
|
|
/** \brief Attribute value for VAConfigAttribEncRateControlExt */ |
|
typedef union _VAConfigAttribValEncRateControlExt { |
|
struct { |
|
/** \brief The number of temporal layers with layer specific bit-rate targets |
|
* that are supported. The application will send multiple |
|
* VAEncMiscParameterRateControl and VAEncMiscParameterFrameRate structures |
|
* for each layer, using the temporal_id field as the layer identifier. |
|
* If per temporal layer rate control is not supported, |
|
* num_temporal_layers_minus1 will be 0 and the temporal_id field in |
|
* VAEncMiscParameterRateControl and VAEncMiscParameterFrameRate will be ignored. |
|
*/ |
|
unsigned int num_temporal_layers_minus1 : 8; |
|
unsigned int reserved : 24; |
|
} bits; |
|
unsigned int value; |
|
} VAConfigAttribValEncRateControlExt; |
|
|
|
/** |
|
* \brief Intel specific attribute definitions |
|
*/ |
|
/** @name Attribute values for VAConfigAttribEncFunctionTypeIntel |
|
* |
|
* The desired type should be passed to driver when creating the configuration. |
|
* If VA_ENC_FUNCTION_ENC_PAK is set, VA_ENC_FUNCTION_ENC and VA_ENC_FUNCTION_PAK |
|
* will be ignored if set also. VA_ENC_FUNCTION_ENC and VA_ENC_FUNCTION_PAK operations |
|
* shall be called separately if ENC and PAK (VA_ENC_FUNCTION_ENC | VA_ENC_FUNCTION_PAK) |
|
* is set for configuration. VA_ENC_FUNCTION_ENC_PAK is recommended for best performance. |
|
* If only VA_ENC_FUNCTION_ENC is set, there will be no bitstream output. |
|
* If VA_ENC_FUNCTION_ENC_PAK is not set and VA_ENC_FUNCTION_PAK is set, then two extra |
|
* input buffers for PAK are needed: VAEncFEIMVBufferType and VAEncFEIModeBufferType. |
|
**/ |
|
/**@{*/ |
|
/** \brief Only default is supported */ |
|
#define VA_ENC_FUNCTION_DEFAULT_INTEL 0x00000000 |
|
/** \brief ENC only is supported */ |
|
#define VA_ENC_FUNCTION_ENC_INTEL 0x00000001 |
|
/** \brief PAK only is supported */ |
|
#define VA_ENC_FUNCTION_PAK_INTEL 0x00000002 |
|
/** \brief ENC_PAK is supported */ |
|
#define VA_ENC_FUNCTION_ENC_PAK_INTEL 0x00000004 |
|
|
|
/**@}*/ |
|
|
|
/** \brief Attribute value for VAConfigAttribStatisticsIntel */ |
|
typedef union _VAConfigAttribValStatisticsIntel { |
|
struct { |
|
/** \brief Max number of past reference frames that are supported. */ |
|
unsigned int max_num_past_references : 4; |
|
/** \brief Max number of future reference frames that are supported. */ |
|
unsigned int max_num_future_references : 4; |
|
/** \brief Number of output surfaces that are supported */ |
|
unsigned int num_outputs : 3; |
|
/** \brief Interlaced content is supported */ |
|
unsigned int interlaced : 1; |
|
unsigned int reserved : 20; |
|
} bits; |
|
unsigned int value; |
|
} VAConfigAttribValStatisticsIntel; |
|
|
|
/* |
|
* if an attribute is not applicable for a given |
|
* profile/entrypoint pair, then set the value to the following |
|
*/ |
|
#define VA_ATTRIB_NOT_SUPPORTED 0x80000000 |
|
|
|
/* Get maximum number of profiles supported by the implementation */ |
|
int vaMaxNumProfiles ( |
|
VADisplay dpy |
|
); |
|
|
|
/* Get maximum number of entrypoints supported by the implementation */ |
|
int vaMaxNumEntrypoints ( |
|
VADisplay dpy |
|
); |
|
|
|
/* Get maximum number of attributs supported by the implementation */ |
|
int vaMaxNumConfigAttributes ( |
|
VADisplay dpy |
|
); |
|
|
|
/* |
|
* Query supported profiles |
|
* The caller must provide a "profile_list" array that can hold at |
|
* least vaMaxNumProfile() entries. The actual number of profiles |
|
* returned in "profile_list" is returned in "num_profile". |
|
*/ |
|
VAStatus vaQueryConfigProfiles ( |
|
VADisplay dpy, |
|
VAProfile *profile_list, /* out */ |
|
int *num_profiles /* out */ |
|
); |
|
|
|
/* |
|
* Query supported entrypoints for a given profile |
|
* The caller must provide an "entrypoint_list" array that can hold at |
|
* least vaMaxNumEntrypoints() entries. The actual number of entrypoints |
|
* returned in "entrypoint_list" is returned in "num_entrypoints". |
|
*/ |
|
VAStatus vaQueryConfigEntrypoints ( |
|
VADisplay dpy, |
|
VAProfile profile, |
|
VAEntrypoint *entrypoint_list, /* out */ |
|
int *num_entrypoints /* out */ |
|
); |
|
|
|
/* |
|
* Get attributes for a given profile/entrypoint pair |
|
* The caller must provide an "attrib_list" with all attributes to be |
|
* retrieved. Upon return, the attributes in "attrib_list" have been |
|
* updated with their value. Unknown attributes or attributes that are |
|
* not supported for the given profile/entrypoint pair will have their |
|
* value set to VA_ATTRIB_NOT_SUPPORTED |
|
*/ |
|
VAStatus vaGetConfigAttributes ( |
|
VADisplay dpy, |
|
VAProfile profile, |
|
VAEntrypoint entrypoint, |
|
VAConfigAttrib *attrib_list, /* in/out */ |
|
int num_attribs |
|
); |
|
|
|
/* Generic ID type, can be re-typed for specific implementation */ |
|
typedef unsigned int VAGenericID; |
|
|
|
typedef VAGenericID VAConfigID; |
|
|
|
/* |
|
* Create a configuration for the decode pipeline |
|
* it passes in the attribute list that specifies the attributes it cares |
|
* about, with the rest taking default values. |
|
*/ |
|
VAStatus vaCreateConfig ( |
|
VADisplay dpy, |
|
VAProfile profile, |
|
VAEntrypoint entrypoint, |
|
VAConfigAttrib *attrib_list, |
|
int num_attribs, |
|
VAConfigID *config_id /* out */ |
|
); |
|
|
|
/* |
|
* Free resources associdated with a given config |
|
*/ |
|
VAStatus vaDestroyConfig ( |
|
VADisplay dpy, |
|
VAConfigID config_id |
|
); |
|
|
|
/* |
|
* Query all attributes for a given configuration |
|
* The profile of the configuration is returned in "profile" |
|
* The entrypoint of the configuration is returned in "entrypoint" |
|
* The caller must provide an "attrib_list" array that can hold at least |
|
* vaMaxNumConfigAttributes() entries. The actual number of attributes |
|
* returned in "attrib_list" is returned in "num_attribs" |
|
*/ |
|
VAStatus vaQueryConfigAttributes ( |
|
VADisplay dpy, |
|
VAConfigID config_id, |
|
VAProfile *profile, /* out */ |
|
VAEntrypoint *entrypoint, /* out */ |
|
VAConfigAttrib *attrib_list,/* out */ |
|
int *num_attribs /* out */ |
|
); |
|
|
|
|
|
/* |
|
* Contexts and Surfaces |
|
* |
|
* Context represents a "virtual" video decode pipeline. Surfaces are render |
|
* targets for a given context. The data in the surfaces are not accessible |
|
* to the client and the internal data format of the surface is implementatin |
|
* specific. |
|
* |
|
* Surfaces will be bound to a context when the context is created. Once |
|
* a surface is bound to a given context, it can not be used to create |
|
* another context. The association is removed when the context is destroyed |
|
* |
|
* Both contexts and surfaces are identified by unique IDs and its |
|
* implementation specific internals are kept opaque to the clients |
|
*/ |
|
|
|
typedef VAGenericID VAContextID; |
|
|
|
typedef VAGenericID VASurfaceID; |
|
|
|
#define VA_INVALID_ID 0xffffffff |
|
#define VA_INVALID_SURFACE VA_INVALID_ID |
|
|
|
/** \brief Generic value types. */ |
|
typedef enum { |
|
VAGenericValueTypeInteger = 1, /**< 32-bit signed integer. */ |
|
VAGenericValueTypeFloat, /**< 32-bit floating-point value. */ |
|
VAGenericValueTypePointer, /**< Generic pointer type */ |
|
VAGenericValueTypeFunc /**< Pointer to function */ |
|
} VAGenericValueType; |
|
|
|
/** \brief Generic function type. */ |
|
typedef void (*VAGenericFunc)(void); |
|
|
|
/** \brief Generic value. */ |
|
typedef struct _VAGenericValue { |
|
/** \brief Value type. See #VAGenericValueType. */ |
|
VAGenericValueType type; |
|
/** \brief Value holder. */ |
|
union { |
|
/** \brief 32-bit signed integer. */ |
|
int i; |
|
/** \brief 32-bit float. */ |
|
float f; |
|
/** \brief Generic pointer. */ |
|
void *p; |
|
/** \brief Pointer to function. */ |
|
VAGenericFunc fn; |
|
} value; |
|
} VAGenericValue; |
|
|
|
/** @name Surface attribute flags */ |
|
/**@{*/ |
|
/** \brief Surface attribute is not supported. */ |
|
#define VA_SURFACE_ATTRIB_NOT_SUPPORTED 0x00000000 |
|
/** \brief Surface attribute can be got through vaQuerySurfaceAttributes(). */ |
|
#define VA_SURFACE_ATTRIB_GETTABLE 0x00000001 |
|
/** \brief Surface attribute can be set through vaCreateSurfaces(). */ |
|
#define VA_SURFACE_ATTRIB_SETTABLE 0x00000002 |
|
/**@}*/ |
|
|
|
/** \brief Surface attribute types. */ |
|
typedef enum { |
|
VASurfaceAttribNone = 0, |
|
/** |
|
* \brief Pixel format (fourcc). |
|
* |
|
* The value is meaningful as input to vaQuerySurfaceAttributes(). |
|
* If zero, the driver returns the optimal pixel format for the |
|
* specified config. Otherwise, if non-zero, the value represents |
|
* a pixel format (FOURCC) that is kept as is on output, if the |
|
* driver supports it. Otherwise, the driver sets the value to |
|
* zero and drops the \c VA_SURFACE_ATTRIB_SETTABLE flag. |
|
*/ |
|
VASurfaceAttribPixelFormat, |
|
/** \brief Minimal width in pixels (int, read-only). */ |
|
VASurfaceAttribMinWidth, |
|
/** \brief Maximal width in pixels (int, read-only). */ |
|
VASurfaceAttribMaxWidth, |
|
/** \brief Minimal height in pixels (int, read-only). */ |
|
VASurfaceAttribMinHeight, |
|
/** \brief Maximal height in pixels (int, read-only). */ |
|
VASurfaceAttribMaxHeight, |
|
/** \brief Surface memory type expressed in bit fields (int, read/write). */ |
|
VASurfaceAttribMemoryType, |
|
/** \brief External buffer descriptor (pointer, write). */ |
|
VASurfaceAttribExternalBufferDescriptor, |
|
/** \brief Surface usage hint, gives the driver a hint of intended usage |
|
* to optimize allocation (e.g. tiling) (int, read/write). */ |
|
VASurfaceAttribUsageHint, |
|
/** \brief Number of surface attributes. */ |
|
VASurfaceAttribCount |
|
} VASurfaceAttribType; |
|
|
|
/** \brief Surface attribute. */ |
|
typedef struct _VASurfaceAttrib { |
|
/** \brief Type. */ |
|
VASurfaceAttribType type; |
|
/** \brief Flags. See "Surface attribute flags". */ |
|
unsigned int flags; |
|
/** \brief Value. See "Surface attribute types" for the expected types. */ |
|
VAGenericValue value; |
|
} VASurfaceAttrib; |
|
|
|
/** |
|
* @name VASurfaceAttribMemoryType values in bit fields. |
|
* Bit 0:7 are reserved for generic types, Bit 31:28 are reserved for |
|
* Linux DRM, Bit 23:20 are reserved for Android. DRM and Android specific |
|
* types are defined in DRM and Android header files. |
|
*/ |
|
/**@{*/ |
|
/** \brief VA memory type (default) is supported. */ |
|
#define VA_SURFACE_ATTRIB_MEM_TYPE_VA 0x00000001 |
|
/** \brief V4L2 buffer memory type is supported. */ |
|
#define VA_SURFACE_ATTRIB_MEM_TYPE_V4L2 0x00000002 |
|
/** \brief User pointer memory type is supported. */ |
|
#define VA_SURFACE_ATTRIB_MEM_TYPE_USER_PTR 0x00000004 |
|
/**@}*/ |
|
|
|
/** |
|
* \brief VASurfaceAttribExternalBuffers structure for |
|
* the VASurfaceAttribExternalBufferDescriptor attribute. |
|
*/ |
|
typedef struct _VASurfaceAttribExternalBuffers { |
|
/** \brief pixel format in fourcc. */ |
|
unsigned int pixel_format; |
|
/** \brief width in pixels. */ |
|
unsigned int width; |
|
/** \brief height in pixels. */ |
|
unsigned int height; |
|
/** \brief total size of the buffer in bytes. */ |
|
unsigned int data_size; |
|
/** \brief number of planes for planar layout */ |
|
unsigned int num_planes; |
|
/** \brief pitch for each plane in bytes */ |
|
unsigned int pitches[4]; |
|
/** \brief offset for each plane in bytes */ |
|
unsigned int offsets[4]; |
|
/** \brief buffer handles or user pointers */ |
|
unsigned long *buffers; |
|
/** \brief number of elements in the "buffers" array */ |
|
unsigned int num_buffers; |
|
/** \brief flags. See "Surface external buffer descriptor flags". */ |
|
unsigned int flags; |
|
/** \brief reserved for passing private data */ |
|
void *private_data; |
|
} VASurfaceAttribExternalBuffers; |
|
|
|
/** @name VASurfaceAttribExternalBuffers flags */ |
|
/**@{*/ |
|
/** \brief Enable memory tiling */ |
|
#define VA_SURFACE_EXTBUF_DESC_ENABLE_TILING 0x00000001 |
|
/** \brief Memory is cacheable */ |
|
#define VA_SURFACE_EXTBUF_DESC_CACHED 0x00000002 |
|
/** \brief Memory is non-cacheable */ |
|
#define VA_SURFACE_EXTBUF_DESC_UNCACHED 0x00000004 |
|
/** \brief Memory is write-combined */ |
|
#define VA_SURFACE_EXTBUF_DESC_WC 0x00000008 |
|
/** \brief Memory is protected */ |
|
#define VA_SURFACE_EXTBUF_DESC_PROTECTED 0x80000000 |
|
|
|
/** @name VASurfaceAttribUsageHint attribute usage hint flags */ |
|
/**@{*/ |
|
/** \brief Surface usage not indicated. */ |
|
#define VA_SURFACE_ATTRIB_USAGE_HINT_GENERIC 0x00000000 |
|
/** \brief Surface used by video decoder. */ |
|
#define VA_SURFACE_ATTRIB_USAGE_HINT_DECODER 0x00000001 |
|
/** \brief Surface used by video encoder. */ |
|
#define VA_SURFACE_ATTRIB_USAGE_HINT_ENCODER 0x00000002 |
|
/** \brief Surface read by video post-processing. */ |
|
#define VA_SURFACE_ATTRIB_USAGE_HINT_VPP_READ 0x00000004 |
|
/** \brief Surface written by video post-processing. */ |
|
#define VA_SURFACE_ATTRIB_USAGE_HINT_VPP_WRITE 0x00000008 |
|
/** \brief Surface used for display. */ |
|
#define VA_SURFACE_ATTRIB_USAGE_HINT_DISPLAY 0x00000010 |
|
|
|
/**@}*/ |
|
|
|
/** |
|
* \brief Queries surface attributes for the supplied config. |
|
* |
|
* Unlike vaGetSurfaceAttributes(), this function queries for all |
|
* supported attributes for the supplied VA @config. In particular, if |
|
* the underlying hardware supports the creation of VA surfaces in |
|
* various formats, then this function will enumerate all pixel |
|
* formats that are supported. |
|
* |
|
* The \c attrib_list array is allocated by the user and \c |
|
* num_attribs shall be initialized to the number of allocated |
|
* elements in that array. Upon successful return, the actual number |
|
* of attributes will be overwritten into \c num_attribs. Otherwise, |
|
* \c VA_STATUS_ERROR_MAX_NUM_EXCEEDED is returned and \c num_attribs |
|
* is adjusted to the number of elements that would be returned if |
|
* enough space was available. |
|
* |
|
* Note: it is perfectly valid to pass NULL to the \c attrib_list |
|
* argument when vaQuerySurfaceAttributes() is used to determine the |
|
* actual number of elements that need to be allocated. |
|
* |
|
* @param[in] dpy the VA display |
|
* @param[in] config the config identifying a codec or a video |
|
* processing pipeline |
|
* @param[out] attrib_list the output array of #VASurfaceAttrib elements |
|
* @param[in,out] num_attribs the number of elements allocated on |
|
* input, the number of elements actually filled in output |
|
*/ |
|
VAStatus |
|
vaQuerySurfaceAttributes( |
|
VADisplay dpy, |
|
VAConfigID config, |
|
VASurfaceAttrib *attrib_list, |
|
unsigned int *num_attribs |
|
); |
|
|
|
/** |
|
* \brief Creates an array of surfaces |
|
* |
|
* Creates an array of surfaces. The optional list of attributes shall |
|
* be constructed and validated through vaGetSurfaceAttributes() or |
|
* constructed based based on what the underlying hardware could |
|
* expose through vaQuerySurfaceAttributes(). |
|
* |
|
* @param[in] dpy the VA display |
|
* @param[in] format the desired surface format. See \c VA_RT_FORMAT_* |
|
* @param[in] width the surface width |
|
* @param[in] height the surface height |
|
* @param[out] surfaces the array of newly created surfaces |
|
* @param[in] num_surfaces the number of surfaces to create |
|
* @param[in] attrib_list the list of (optional) attributes, or \c NULL |
|
* @param[in] num_attribs the number of attributes supplied in |
|
* \c attrib_list, or zero |
|
*/ |
|
VAStatus |
|
vaCreateSurfaces( |
|
VADisplay dpy, |
|
unsigned int format, |
|
unsigned int width, |
|
unsigned int height, |
|
VASurfaceID *surfaces, |
|
unsigned int num_surfaces, |
|
VASurfaceAttrib *attrib_list, |
|
unsigned int num_attribs |
|
); |
|
|
|
/* |
|
* vaDestroySurfaces - Destroy resources associated with surfaces. |
|
* Surfaces can only be destroyed after the context associated has been |
|
* destroyed. |
|
* dpy: display |
|
* surfaces: array of surfaces to destroy |
|
* num_surfaces: number of surfaces in the array to be destroyed. |
|
*/ |
|
VAStatus vaDestroySurfaces ( |
|
VADisplay dpy, |
|
VASurfaceID *surfaces, |
|
int num_surfaces |
|
); |
|
|
|
#define VA_PROGRESSIVE 0x1 |
|
/* |
|
* vaCreateContext - Create a context |
|
* dpy: display |
|
* config_id: configuration for the context |
|
* picture_width: coded picture width |
|
* picture_height: coded picture height |
|
* flag: any combination of the following: |
|
* VA_PROGRESSIVE (only progressive frame pictures in the sequence when set) |
|
* render_targets: render targets (surfaces) tied to the context |
|
* num_render_targets: number of render targets in the above array |
|
* context: created context id upon return |
|
*/ |
|
VAStatus vaCreateContext ( |
|
VADisplay dpy, |
|
VAConfigID config_id, |
|
int picture_width, |
|
int picture_height, |
|
int flag, |
|
VASurfaceID *render_targets, |
|
int num_render_targets, |
|
VAContextID *context /* out */ |
|
); |
|
|
|
/* |
|
* vaDestroyContext - Destroy a context |
|
* dpy: display |
|
* context: context to be destroyed |
|
*/ |
|
VAStatus vaDestroyContext ( |
|
VADisplay dpy, |
|
VAContextID context |
|
); |
|
|
|
/* |
|
* Buffers |
|
* Buffers are used to pass various types of data from the |
|
* client to the server. The server maintains a data store |
|
* for each buffer created, and the client idenfies a buffer |
|
* through a unique buffer id assigned by the server. |
|
*/ |
|
|
|
typedef VAGenericID VABufferID; |
|
|
|
typedef enum |
|
{ |
|
VAPictureParameterBufferType = 0, |
|
VAIQMatrixBufferType = 1, |
|
VABitPlaneBufferType = 2, |
|
VASliceGroupMapBufferType = 3, |
|
VASliceParameterBufferType = 4, |
|
VASliceDataBufferType = 5, |
|
VAMacroblockParameterBufferType = 6, |
|
VAResidualDataBufferType = 7, |
|
VADeblockingParameterBufferType = 8, |
|
VAImageBufferType = 9, |
|
VAProtectedSliceDataBufferType = 10, |
|
VAQMatrixBufferType = 11, |
|
VAHuffmanTableBufferType = 12, |
|
VAProbabilityBufferType = 13, |
|
/* Following are encode buffer types */ |
|
VAEncCodedBufferType = 21, |
|
VAEncSequenceParameterBufferType = 22, |
|
VAEncPictureParameterBufferType = 23, |
|
VAEncSliceParameterBufferType = 24, |
|
VAEncPackedHeaderParameterBufferType = 25, |
|
VAEncPackedHeaderDataBufferType = 26, |
|
VAEncMiscParameterBufferType = 27, |
|
VAEncMacroblockParameterBufferType = 28, |
|
VAEncMacroblockMapBufferType = 29, |
|
VAEncQpBufferType = 30, |
|
/* Following are video processing buffer types */ |
|
/** |
|
* \brief Video processing pipeline parameter buffer. |
|
* |
|
* This buffer describes the video processing pipeline. See |
|
* #VAProcPipelineParameterBuffer for details. |
|
*/ |
|
VAProcPipelineParameterBufferType = 41, |
|
/** |
|
* \brief Video filter parameter buffer. |
|
* |
|
* This buffer describes the video filter parameters. All buffers |
|
* inherit from #VAProcFilterParameterBufferBase, thus including |
|
* a unique filter buffer type. |
|
* |
|
* The default buffer used by most filters is #VAProcFilterParameterBuffer. |
|
* Filters requiring advanced parameters include, but are not limited to, |
|
* deinterlacing (#VAProcFilterParameterBufferDeinterlacing), |
|
* color balance (#VAProcFilterParameterBufferColorBalance), etc. |
|
*/ |
|
VAProcFilterParameterBufferType = 42, |
|
VAParsePictureParameterBufferType = 43, |
|
VAParseSliceHeaderGroupBufferType = 44, |
|
|
|
/** |
|
* \brief Intel specific buffer types start at 1001 |
|
*/ |
|
VAEncFEIMVBufferTypeIntel = 1001, |
|
VAEncFEIModeBufferTypeIntel, |
|
VAEncFEIDistortionBufferTypeIntel, |
|
VAStatsStatisticsParameterBufferTypeIntel, |
|
VAStatsStatisticsBufferTypeIntel, |
|
VAStatsMotionVectorBufferTypeIntel, |
|
|
|
VABufferTypeMax |
|
} VABufferType; |
|
|
|
typedef enum |
|
{ |
|
VAEncMiscParameterTypeFrameRate = 0, |
|
VAEncMiscParameterTypeRateControl = 1, |
|
VAEncMiscParameterTypeMaxSliceSize = 2, |
|
/** \brief Buffer type used for Adaptive intra refresh */ |
|
VAEncMiscParameterTypeAIR = 3, |
|
/** \brief Buffer type used to express a maximum frame size (in bits). */ |
|
VAEncMiscParameterTypeMaxFrameSize = 4, |
|
/** \brief Buffer type used for HRD parameters. */ |
|
VAEncMiscParameterTypeHRD = 5, |
|
VAEncMiscParameterTypeQualityLevel = 6, |
|
/** \brief Buffer type used for Rolling intra refresh */ |
|
VAEncMiscParameterTypeRIR = 7, |
|
VAEncMiscParameterTypeQuantization = 8, |
|
/** \brief Buffer type used for sending skip frame parameters to the encoder's |
|
* rate control, when the user has externally skipped frames. */ |
|
VAEncMiscParameterTypeSkipFrame = 9, |
|
/** \brief Buffer type used for region-of-interest (ROI) parameters. */ |
|
VAEncMiscParameterTypeROI = 10, |
|
/** \brief Buffer type used for Cyclic intra refresh */ |
|
VAEncMiscParameterTypeCIR = 11, |
|
/** \brief Buffer type used for temporal layer structure */ |
|
VAEncMiscParameterTypeTemporalLayerStructure = 12, |
|
|
|
/* Intel specific types start at 1001 */ |
|
/* VAEntrypointEncFEIIntel */ |
|
VAEncMiscParameterTypeFEIFrameControlIntel = 1001 |
|
} VAEncMiscParameterType; |
|
|
|
/** \brief Packed header type. */ |
|
typedef enum { |
|
/** \brief Packed sequence header. */ |
|
VAEncPackedHeaderSequence = 1, |
|
/** \brief Packed picture header. */ |
|
VAEncPackedHeaderPicture = 2, |
|
/** \brief Packed slice header. */ |
|
VAEncPackedHeaderSlice = 3, |
|
/** |
|
* \brief Packed raw header. |
|
* |
|
* Packed raw data header can be used by the client to insert a header |
|
* into the bitstream data buffer at the point it is passed, the driver |
|
* will handle the raw packed header based on "has_emulation_bytes" field |
|
* in the packed header parameter structure. |
|
*/ |
|
VAEncPackedHeaderRawData = 4, |
|
/** \brief Misc packed header. See codec-specific definitions. */ |
|
VAEncPackedHeaderMiscMask = 0x80000000, |
|
} VAEncPackedHeaderType; |
|
|
|
/** \brief Packed header parameter. */ |
|
typedef struct _VAEncPackedHeaderParameterBuffer { |
|
/** Type of the packed header buffer. See #VAEncPackedHeaderType. */ |
|
unsigned int type; |
|
/** \brief Size of the #VAEncPackedHeaderDataBuffer in bits. */ |
|
unsigned int bit_length; |
|
/** \brief Flag: buffer contains start code emulation prevention bytes? */ |
|
unsigned char has_emulation_bytes; |
|
} VAEncPackedHeaderParameterBuffer; |
|
|
|
/* |
|
* For application, e.g. set a new bitrate |
|
* VABufferID buf_id; |
|
* VAEncMiscParameterBuffer *misc_param; |
|
* VAEncMiscParameterRateControl *misc_rate_ctrl; |
|
* |
|
* vaCreateBuffer(dpy, context, VAEncMiscParameterBufferType, |
|
* sizeof(VAEncMiscParameterBuffer) + sizeof(VAEncMiscParameterRateControl), |
|
* 1, NULL, &buf_id); |
|
* |
|
* vaMapBuffer(dpy,buf_id,(void **)&misc_param); |
|
* misc_param->type = VAEncMiscParameterTypeRateControl; |
|
* misc_rate_ctrl= (VAEncMiscParameterRateControl *)misc_param->data; |
|
* misc_rate_ctrl->bits_per_second = 6400000; |
|
* vaUnmapBuffer(dpy, buf_id); |
|
* vaRenderPicture(dpy, context, &buf_id, 1); |
|
*/ |
|
typedef struct _VAEncMiscParameterBuffer |
|
{ |
|
VAEncMiscParameterType type; |
|
unsigned int data[0]; |
|
} VAEncMiscParameterBuffer; |
|
|
|
/** \brief Temporal Structure*/ |
|
typedef struct _VAEncMiscParameterTemporalLayerStructure |
|
{ |
|
/* The number of temporal layers */ |
|
uint32_t number_of_layers; |
|
/* this is Length of the sequence defining frame layer membership. Should be 1-32 */ |
|
uint32_t periodicity; |
|
/*This is Array indicating the layer id for each frame in a sequence of length ts_periodicity.*/ |
|
uint32_t layer_id[32]; |
|
} VAEncMiscParameterTemporalLayerStructure; |
|
|
|
|
|
/** \brief Rate control parameters */ |
|
typedef struct _VAEncMiscParameterRateControl |
|
{ |
|
/* this is the maximum bit-rate to be constrained by the rate control implementation */ |
|
unsigned int bits_per_second; |
|
/* this is the bit-rate the rate control is targeting, as a percentage of the maximum |
|
* bit-rate for example if target_percentage is 95 then the rate control will target |
|
* a bit-rate that is 95% of the maximum bit-rate |
|
*/ |
|
unsigned int target_percentage; |
|
/* windows size in milliseconds. For example if this is set to 500, |
|
* then the rate control will guarantee the target bit-rate over a 500 ms window |
|
*/ |
|
unsigned int window_size; |
|
/* initial_qp: initial QP for the first I frames |
|
* min_qp/max_qp: minimal and maximum QP frames |
|
* If set them to 0, encoder chooses the best QP according to rate control |
|
*/ |
|
unsigned int initial_qp; |
|
unsigned int min_qp; |
|
unsigned int max_qp; |
|
unsigned int basic_unit_size; |
|
union |
|
{ |
|
struct |
|
{ |
|
unsigned int reset : 1; |
|
unsigned int disable_frame_skip : 1; /* Disable frame skip in rate control mode */ |
|
unsigned int disable_bit_stuffing : 1; /* Disable bit stuffing in rate control mode */ |
|
unsigned int mb_rate_control : 4; /* Control VA_RC_MB 0: default, 1: enable, 2: disable, other: reserved*/ |
|
/* |
|
* The temporal layer that the rate control parameters are specified for. |
|
*/ |
|
unsigned int temporal_id : 8; |
|
unsigned int reserved : 17; |
|
} bits; |
|
unsigned int value; |
|
} rc_flags; |
|
unsigned int ICQ_quality_factor; /* Initial ICQ quality factor: 1-51. */ |
|
} VAEncMiscParameterRateControl; |
|
|
|
typedef struct _VAEncMiscParameterFrameRate |
|
{ |
|
unsigned int framerate; |
|
union |
|
{ |
|
struct |
|
{ |
|
/* |
|
* The temporal id the framerate parameters are specified for. |
|
*/ |
|
unsigned int temporal_id : 8; |
|
unsigned int reserved : 24; |
|
} bits; |
|
unsigned int value; |
|
} framerate_flags; |
|
} VAEncMiscParameterFrameRate; |
|
|
|
/* |
|
* Allow a maximum slice size to be specified (in bits). |
|
* The encoder will attempt to make sure that individual slices do not exceed this size |
|
* Or to signal applicate if the slice size exceed this size, see "status" of VACodedBufferSegment |
|
*/ |
|
typedef struct _VAEncMiscParameterMaxSliceSize |
|
{ |
|
unsigned int max_slice_size; |
|
} VAEncMiscParameterMaxSliceSize; |
|
|
|
/* |
|
* \brief Cyclic intra refresh data structure for encoding. |
|
*/ |
|
typedef struct _VAEncMiscParameterCIR |
|
{ |
|
/** \brief the number of consecutive macroblocks to be coded as intra */ |
|
unsigned int cir_num_mbs; |
|
} VAEncMiscParameterCIR; |
|
|
|
/* |
|
* \brief Adaptive intra refresh data structure for encoding. |
|
*/ |
|
typedef struct _VAEncMiscParameterAIR |
|
{ |
|
/** \brief the minimum number of macroblocks to refresh in a frame */ |
|
unsigned int air_num_mbs; |
|
/** |
|
* \brief threshhold of blockmatching criterion (typically SAD) |
|
* |
|
* Macroblocks above that threshold are marked as candidates and |
|
* on subsequent frames a number of these candidates are coded as Intra |
|
* Generally the threshhold need to be set and tuned to an appropriate level |
|
* according to the feedback of coded frame. |
|
*/ |
|
unsigned int air_threshold; |
|
/** \brief if set to 1 then hardware auto-tune the AIR threshold */ |
|
unsigned int air_auto; |
|
} VAEncMiscParameterAIR; |
|
|
|
/* |
|
* \brief Rolling intra refresh data structure for encoding. |
|
*/ |
|
typedef struct _VAEncMiscParameterRIR |
|
{ |
|
union |
|
{ |
|
struct |
|
/** |
|
* \brief Indicate if intra refresh is enabled in column/row. |
|
* |
|
* App should query VAConfigAttribEncIntraRefresh to confirm RIR support |
|
* by the driver before sending this structure. The following RIR restrictions |
|
* apply: |
|
* - No field encoding. |
|
* - No B frames. |
|
* - No multiple references. |
|
*/ |
|
{ |
|
/* \brief enable RIR in column */ |
|
unsigned int enable_rir_column : 1; |
|
/* \brief enable RIR in row */ |
|
unsigned int enable_rir_row : 1; |
|
unsigned int reserved : 30; |
|
} bits; |
|
unsigned int value; |
|
} rir_flags; |
|
/** |
|
* \brief Indicates the column or row location in MB. It is ignored if |
|
* rir_flags is 0. |
|
*/ |
|
unsigned short intra_insertion_location; |
|
/** |
|
* \brief Indicates the number of columns or rows in MB. It is ignored if |
|
* rir_flags is 0. |
|
*/ |
|
unsigned short intra_insert_size; |
|
/** |
|
* \brief indicates the Qp difference for inserted intra columns or rows. |
|
* App can use this to adjust intra Qp based on bitrate & max frame size. |
|
*/ |
|
char qp_delta_for_inserted_intra; |
|
|
|
} VAEncMiscParameterRIR; |
|
|
|
typedef struct _VAEncMiscParameterHRD |
|
{ |
|
/** |
|
* \brief This value indicates the amount of data that will |
|
* be buffered by the decoding application prior to beginning playback |
|
*/ |
|
unsigned int initial_buffer_fullness; /* in bits */ |
|
/** |
|
* \brief This value indicates the amount of data that the |
|
* encoder should try to maintain in the decoder's buffer |
|
*/ |
|
unsigned int optimal_buffer_fullness; /* in bits */ |
|
/** |
|
* \brief This value indicates the amount of data that |
|
* may be buffered by the decoding application |
|
*/ |
|
unsigned int buffer_size; /* in bits */ |
|
} VAEncMiscParameterHRD; |
|
|
|
/** |
|
* \brief Defines a maximum frame size (in bits). |
|
* |
|
* This misc parameter buffer defines the maximum size of a frame (in |
|
* bits). The encoder will try to make sure that each frame does not |
|
* exceed this size. Otherwise, if the frame size exceeds this size, |
|
* the \c status flag of #VACodedBufferSegment will contain |
|
* #VA_CODED_BUF_STATUS_FRAME_SIZE_OVERFLOW. |
|
*/ |
|
typedef struct _VAEncMiscParameterBufferMaxFrameSize { |
|
/** \brief Type. Shall be set to #VAEncMiscParameterTypeMaxFrameSize. */ |
|
VAEncMiscParameterType type; |
|
/** \brief Maximum size of a frame (in bits). */ |
|
unsigned int max_frame_size; |
|
} VAEncMiscParameterBufferMaxFrameSize; |
|
|
|
/** |
|
* \brief Encoding quality level. |
|
* |
|
* The encoding quality could be set through this structure, if the implementation |
|
* supports multiple quality levels. The quality level set through this structure is |
|
* persistent over the entire coded sequence, or until a new structure is being sent. |
|
* The quality level range can be queried through the VAConfigAttribEncQualityRange |
|
* attribute. A lower value means higher quality, and a value of 1 represents the highest |
|
* quality. The quality level setting is used as a trade-off between quality and speed/power |
|
* consumption, with higher quality corresponds to lower speed and higher power consumption. |
|
*/ |
|
typedef struct _VAEncMiscParameterBufferQualityLevel { |
|
/** \brief Encoding quality level setting. */ |
|
unsigned int quality_level; |
|
} VAEncMiscParameterBufferQualityLevel; |
|
|
|
/** |
|
* \brief Quantization settings for encoding. |
|
* |
|
* Some encoders support special types of quantization such as trellis, and this structure |
|
* can be used by the app to control these special types of quantization by the encoder. |
|
*/ |
|
typedef struct _VAEncMiscParameterQuantization |
|
{ |
|
union |
|
{ |
|
/* if no flags is set then quantization is determined by the driver */ |
|
struct |
|
{ |
|
/* \brief disable trellis for all frames/fields */ |
|
unsigned int disable_trellis : 1; |
|
/* \brief enable trellis for I frames/fields */ |
|
unsigned int enable_trellis_I : 1; |
|
/* \brief enable trellis for P frames/fields */ |
|
unsigned int enable_trellis_P : 1; |
|
/* \brief enable trellis for B frames/fields */ |
|
unsigned int enable_trellis_B : 1; |
|
unsigned int reserved : 28; |
|
} bits; |
|
unsigned int value; |
|
} quantization_flags; |
|
} VAEncMiscParameterQuantization; |
|
|
|
/** |
|
* \brief Encoding skip frame. |
|
* |
|
* The application may choose to skip frames externally to the encoder (e.g. drop completely or |
|
* code as all skip's). For rate control purposes the encoder will need to know the size and number |
|
* of skipped frames. Skip frame(s) indicated through this structure is applicable only to the |
|
* current frame. It is allowed for the application to still send in packed headers for the driver to |
|
* pack, although no frame will be encoded (e.g. for HW to encrypt the frame). |
|
*/ |
|
typedef struct _VAEncMiscParameterSkipFrame { |
|
/** \brief Indicates skip frames as below. |
|
* 0: Encode as normal, no skip. |
|
* 1: One or more frames were skipped prior to the current frame, encode the current frame as normal. |
|
* 2: The current frame is to be skipped, do not encode it but pack/encrypt the packed header contents |
|
* (all except VAEncPackedHeaderSlice) which could contain actual frame contents (e.g. pack the frame |
|
* in VAEncPackedHeaderPicture). */ |
|
unsigned char skip_frame_flag; |
|
/** \brief The number of frames skipped prior to the current frame. Valid when skip_frame_flag = 1. */ |
|
unsigned char num_skip_frames; |
|
/** \brief When skip_frame_flag = 1, the size of the skipped frames in bits. When skip_frame_flag = 2, |
|
* the size of the current skipped frame that is to be packed/encrypted in bits. */ |
|
unsigned int size_skip_frames; |
|
} VAEncMiscParameterSkipFrame; |
|
|
|
/** |
|
* \brief Encoding region-of-interest (ROI). |
|
* |
|
* The encoding ROI can be set through this structure, if the implementation |
|
* supports ROI input. The ROI set through this structure is applicable only to the |
|
* current frame. The number of supported ROIs can be queried through the |
|
* VAConfigAttribEncRoi. The encoder will use the ROI information to adjust the QP |
|
* values of the MB's that fall within the ROIs. |
|
*/ |
|
typedef struct _VAEncMiscParameterBufferRoi { |
|
/** \brief Number of ROIs being sent.*/ |
|
unsigned int num_roi; |
|
/** \brief Valid when VAConfigAttribRateControl != VA_RC_CQP, then the encoder's |
|
* rate control will determine actual delta QPs. Specifies the max/min allowed delta QPs.*/ |
|
char max_delta_qp; |
|
char min_delta_qp; |
|
|
|
/** \brief Pointer to a VAEncROI array with num_ROI elements.*/ |
|
struct VAEncROI |
|
{ |
|
/** \brief Defines the ROI boundary in pixels, the driver will map it to appropriate |
|
* codec coding units. It is relative to the frame coordinates for both frame and field cases. */ |
|
VARectangle roi_rectangle; |
|
/** \brief When VAConfigAttribRateControl == VA_RC_CQP then roi_value specifes the delta QP that |
|
* will be added on top of the frame level QP. For other rate control modes, roi_value specifies the |
|
* priority of the ROI region relative to the non-ROI region. It can positive (more important) or |
|
* negative (less important) values and is compared with non-ROI region (taken as value 0). |
|
* E.g. ROI region with roi_value -3 is less important than the non-ROI region (roi_value implied to be 0) |
|
* which is less important than ROI region with roi_value +2. For overlapping regions, the roi_value |
|
* that is first in the ROI array will have priority. */ |
|
char roi_value; |
|
} *ROI; |
|
} VAEncMiscParameterBufferROI; |
|
|
|
/* |
|
* There will be cases where the bitstream buffer will not have enough room to hold |
|
* the data for the entire slice, and the following flags will be used in the slice |
|
* parameter to signal to the server for the possible cases. |
|
* If a slice parameter buffer and slice data buffer pair is sent to the server with |
|
* the slice data partially in the slice data buffer (BEGIN and MIDDLE cases below), |
|
* then a slice parameter and data buffer needs to be sent again to complete this slice. |
|
*/ |
|
#define VA_SLICE_DATA_FLAG_ALL 0x00 /* whole slice is in the buffer */ |
|
#define VA_SLICE_DATA_FLAG_BEGIN 0x01 /* The beginning of the slice is in the buffer but the end if not */ |
|
#define VA_SLICE_DATA_FLAG_MIDDLE 0x02 /* Neither beginning nor end of the slice is in the buffer */ |
|
#define VA_SLICE_DATA_FLAG_END 0x04 /* end of the slice is in the buffer */ |
|
|
|
/* Codec-independent Slice Parameter Buffer base */ |
|
typedef struct _VASliceParameterBufferBase |
|
{ |
|
unsigned int slice_data_size; /* number of bytes in the slice data buffer for this slice */ |
|
unsigned int slice_data_offset; /* the offset to the first byte of slice data */ |
|
unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX definitions */ |
|
} VASliceParameterBufferBase; |
|
|
|
#include <va/va_dec_jpeg.h> |
|
|
|
/**************************** |
|
* MPEG-2 data structures |
|
****************************/ |
|
|
|
/* MPEG-2 Picture Parameter Buffer */ |
|
/* |
|
* For each frame or field, and before any slice data, a single |
|
* picture parameter buffer must be send. |
|
*/ |
|
typedef struct _VAPictureParameterBufferMPEG2 |
|
{ |
|
unsigned short horizontal_size; |
|
unsigned short vertical_size; |
|
VASurfaceID forward_reference_picture; |
|
VASurfaceID backward_reference_picture; |
|
/* meanings of the following fields are the same as in the standard */ |
|
int picture_coding_type; |
|
int f_code; /* pack all four fcode into this */ |
|
union { |
|
struct { |
|
unsigned int intra_dc_precision : 2; |
|
unsigned int picture_structure : 2; |
|
unsigned int top_field_first : 1; |
|
unsigned int frame_pred_frame_dct : 1; |
|
unsigned int concealment_motion_vectors : 1; |
|
unsigned int q_scale_type : 1; |
|
unsigned int intra_vlc_format : 1; |
|
unsigned int alternate_scan : 1; |
|
unsigned int repeat_first_field : 1; |
|
unsigned int progressive_frame : 1; |
|
unsigned int is_first_field : 1; /* indicate whether the current field |
|
* is the first field for field picture |
|
*/ |
|
} bits; |
|
unsigned int value; |
|
} picture_coding_extension; |
|
} VAPictureParameterBufferMPEG2; |
|
|
|
/* MPEG-2 Inverse Quantization Matrix Buffer */ |
|
typedef struct _VAIQMatrixBufferMPEG2 |
|
{ |
|
int load_intra_quantiser_matrix; |
|
int load_non_intra_quantiser_matrix; |
|
int load_chroma_intra_quantiser_matrix; |
|
int load_chroma_non_intra_quantiser_matrix; |
|
unsigned char intra_quantiser_matrix[64]; |
|
unsigned char non_intra_quantiser_matrix[64]; |
|
unsigned char chroma_intra_quantiser_matrix[64]; |
|
unsigned char chroma_non_intra_quantiser_matrix[64]; |
|
} VAIQMatrixBufferMPEG2; |
|
|
|
/* MPEG-2 Slice Parameter Buffer */ |
|
typedef struct _VASliceParameterBufferMPEG2 |
|
{ |
|
unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */ |
|
unsigned int slice_data_offset;/* the offset to the first byte of slice data */ |
|
unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */ |
|
unsigned int macroblock_offset;/* the offset to the first bit of MB from the first byte of slice data */ |
|
unsigned int slice_horizontal_position; |
|
unsigned int slice_vertical_position; |
|
int quantiser_scale_code; |
|
int intra_slice_flag; |
|
} VASliceParameterBufferMPEG2; |
|
|
|
/* MPEG-2 Macroblock Parameter Buffer */ |
|
typedef struct _VAMacroblockParameterBufferMPEG2 |
|
{ |
|
unsigned short macroblock_address; |
|
/* |
|
* macroblock_address (in raster scan order) |
|
* top-left: 0 |
|
* bottom-right: picture-height-in-mb*picture-width-in-mb - 1 |
|
*/ |
|
unsigned char macroblock_type; /* see definition below */ |
|
union { |
|
struct { |
|
unsigned int frame_motion_type : 2; |
|
unsigned int field_motion_type : 2; |
|
unsigned int dct_type : 1; |
|
} bits; |
|
unsigned int value; |
|
} macroblock_modes; |
|
unsigned char motion_vertical_field_select; |
|
/* |
|
* motion_vertical_field_select: |
|
* see section 6.3.17.2 in the spec |
|
* only the lower 4 bits are used |
|
* bit 0: first vector forward |
|
* bit 1: first vector backward |
|
* bit 2: second vector forward |
|
* bit 3: second vector backward |
|
*/ |
|
short PMV[2][2][2]; /* see Table 7-7 in the spec */ |
|
unsigned short coded_block_pattern; |
|
/* |
|
* The bitplanes for coded_block_pattern are described |
|
* in Figure 6.10-12 in the spec |
|
*/ |
|
|
|
/* Number of skipped macroblocks after this macroblock */ |
|
unsigned short num_skipped_macroblocks; |
|
} VAMacroblockParameterBufferMPEG2; |
|
|
|
/* |
|
* OR'd flags for macroblock_type (section 6.3.17.1 in the spec) |
|
*/ |
|
#define VA_MB_TYPE_MOTION_FORWARD 0x02 |
|
#define VA_MB_TYPE_MOTION_BACKWARD 0x04 |
|
#define VA_MB_TYPE_MOTION_PATTERN 0x08 |
|
#define VA_MB_TYPE_MOTION_INTRA 0x10 |
|
|
|
/* |
|
* MPEG-2 Residual Data Buffer |
|
* For each macroblock, there wil be 64 shorts (16-bit) in the |
|
* residual data buffer |
|
*/ |
|
|
|
/**************************** |
|
* MPEG-4 Part 2 data structures |
|
****************************/ |
|
|
|
/* MPEG-4 Picture Parameter Buffer */ |
|
/* |
|
* For each frame or field, and before any slice data, a single |
|
* picture parameter buffer must be send. |
|
*/ |
|
typedef struct _VAPictureParameterBufferMPEG4 |
|
{ |
|
unsigned short vop_width; |
|
unsigned short vop_height; |
|
VASurfaceID forward_reference_picture; |
|
VASurfaceID backward_reference_picture; |
|
union { |
|
struct { |
|
unsigned int short_video_header : 1; |
|
unsigned int chroma_format : 2; |
|
unsigned int interlaced : 1; |
|
unsigned int obmc_disable : 1; |
|
unsigned int sprite_enable : 2; |
|
unsigned int sprite_warping_accuracy : 2; |
|
unsigned int quant_type : 1; |
|
unsigned int quarter_sample : 1; |
|
unsigned int data_partitioned : 1; |
|
unsigned int reversible_vlc : 1; |
|
unsigned int resync_marker_disable : 1; |
|
} bits; |
|
unsigned int value; |
|
} vol_fields; |
|
unsigned char no_of_sprite_warping_points; |
|
short sprite_trajectory_du[3]; |
|
short sprite_trajectory_dv[3]; |
|
unsigned char quant_precision; |
|
union { |
|
struct { |
|
unsigned int vop_coding_type : 2; |
|
unsigned int backward_reference_vop_coding_type : 2; |
|
unsigned int vop_rounding_type : 1; |
|
unsigned int intra_dc_vlc_thr : 3; |
|
unsigned int top_field_first : 1; |
|
unsigned int alternate_vertical_scan_flag : 1; |
|
} bits; |
|
unsigned int value; |
|
} vop_fields; |
|
unsigned char vop_fcode_forward; |
|
unsigned char vop_fcode_backward; |
|
unsigned short vop_time_increment_resolution; |
|
/* short header related */ |
|
unsigned char num_gobs_in_vop; |
|
unsigned char num_macroblocks_in_gob; |
|
/* for direct mode prediction */ |
|
short TRB; |
|
short TRD; |
|
unsigned int Tframe; |
|
unsigned char vop_quant; |
|
} VAPictureParameterBufferMPEG4; |
|
|
|
/* MPEG-4 Inverse Quantization Matrix Buffer */ |
|
typedef struct _VAIQMatrixBufferMPEG4 |
|
{ |
|
int load_intra_quant_mat; |
|
int load_non_intra_quant_mat; |
|
unsigned char intra_quant_mat[64]; |
|
unsigned char non_intra_quant_mat[64]; |
|
} VAIQMatrixBufferMPEG4; |
|
|
|
/* MPEG-4 Slice Parameter Buffer */ |
|
typedef struct _VASliceParameterBufferMPEG4 |
|
{ |
|
unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */ |
|
unsigned int slice_data_offset;/* the offset to the first byte of slice data */ |
|
unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */ |
|
unsigned int macroblock_offset;/* the offset to the first bit of MB from the first byte of slice data */ |
|
unsigned int macroblock_number; |
|
int quant_scale; |
|
} VASliceParameterBufferMPEG4; |
|
|
|
/* |
|
VC-1 data structures |
|
*/ |
|
|
|
typedef enum /* see 7.1.1.32 */ |
|
{ |
|
VAMvMode1Mv = 0, |
|
VAMvMode1MvHalfPel = 1, |
|
VAMvMode1MvHalfPelBilinear = 2, |
|
VAMvModeMixedMv = 3, |
|
VAMvModeIntensityCompensation = 4 |
|
} VAMvModeVC1; |
|
|
|
/* VC-1 Picture Parameter Buffer */ |
|
/* |
|
* For each picture, and before any slice data, a picture parameter |
|
* buffer must be send. Multiple picture parameter buffers may be |
|
* sent for a single picture. In that case picture parameters will |
|
* apply to all slice data that follow it until a new picture |
|
* parameter buffer is sent. |
|
* |
|
* Notes: |
|
* pic_quantizer_type should be set to the applicable quantizer |
|
* type as defined by QUANTIZER (J.1.19) and either |
|
* PQUANTIZER (7.1.1.8) or PQINDEX (7.1.1.6) |
|
*/ |
|
typedef struct _VAPictureParameterBufferVC1 |
|
{ |
|
VASurfaceID forward_reference_picture; |
|
VASurfaceID backward_reference_picture; |
|
/* if out-of-loop post-processing is done on the render |
|
target, then we need to keep the in-loop decoded |
|
picture as a reference picture */ |
|
VASurfaceID inloop_decoded_picture; |
|
|
|
/* sequence layer for AP or meta data for SP and MP */ |
|
union { |
|
struct { |
|
unsigned int pulldown : 1; /* SEQUENCE_LAYER::PULLDOWN */ |
|
unsigned int interlace : 1; /* SEQUENCE_LAYER::INTERLACE */ |
|
unsigned int tfcntrflag : 1; /* SEQUENCE_LAYER::TFCNTRFLAG */ |
|
unsigned int finterpflag : 1; /* SEQUENCE_LAYER::FINTERPFLAG */ |
|
unsigned int psf : 1; /* SEQUENCE_LAYER::PSF */ |
|
unsigned int multires : 1; /* METADATA::MULTIRES */ |
|
unsigned int overlap : 1; /* METADATA::OVERLAP */ |
|
unsigned int syncmarker : 1; /* METADATA::SYNCMARKER */ |
|
unsigned int rangered : 1; /* METADATA::RANGERED */ |
|
unsigned int max_b_frames : 3; /* METADATA::MAXBFRAMES */ |
|
unsigned int profile : 2; /* SEQUENCE_LAYER::PROFILE or The MSB of METADATA::PROFILE */ |
|
} bits; |
|
unsigned int value; |
|
} sequence_fields; |
|
|
|
unsigned short coded_width; /* ENTRY_POINT_LAYER::CODED_WIDTH */ |
|
unsigned short coded_height; /* ENTRY_POINT_LAYER::CODED_HEIGHT */ |
|
union { |
|
struct { |
|
unsigned int broken_link : 1; /* ENTRY_POINT_LAYER::BROKEN_LINK */ |
|
unsigned int closed_entry : 1; /* ENTRY_POINT_LAYER::CLOSED_ENTRY */ |
|
unsigned int panscan_flag : 1; /* ENTRY_POINT_LAYER::PANSCAN_FLAG */ |
|
unsigned int loopfilter : 1; /* ENTRY_POINT_LAYER::LOOPFILTER */ |
|
} bits; |
|
unsigned int value; |
|
} entrypoint_fields; |
|
unsigned char conditional_overlap_flag; /* ENTRY_POINT_LAYER::CONDOVER */ |
|
unsigned char fast_uvmc_flag; /* ENTRY_POINT_LAYER::FASTUVMC */ |
|
union { |
|
struct { |
|
unsigned int luma_flag : 1; /* ENTRY_POINT_LAYER::RANGE_MAPY_FLAG */ |
|
unsigned int luma : 3; /* ENTRY_POINT_LAYER::RANGE_MAPY */ |
|
unsigned int chroma_flag : 1; /* ENTRY_POINT_LAYER::RANGE_MAPUV_FLAG */ |
|
unsigned int chroma : 3; /* ENTRY_POINT_LAYER::RANGE_MAPUV */ |
|
} bits; |
|
unsigned int value; |
|
} range_mapping_fields; |
|
|
|
unsigned char b_picture_fraction; /* PICTURE_LAYER::BFRACTION */ |
|
unsigned char cbp_table; /* PICTURE_LAYER::CBPTAB/ICBPTAB */ |
|
unsigned char mb_mode_table; /* PICTURE_LAYER::MBMODETAB */ |
|
unsigned char range_reduction_frame;/* PICTURE_LAYER::RANGEREDFRM */ |
|
unsigned char rounding_control; /* PICTURE_LAYER::RNDCTRL */ |
|
unsigned char post_processing; /* PICTURE_LAYER::POSTPROC */ |
|
unsigned char picture_resolution_index; /* PICTURE_LAYER::RESPIC */ |
|
unsigned char luma_scale; /* PICTURE_LAYER::LUMSCALE */ |
|
unsigned char luma_shift; /* PICTURE_LAYER::LUMSHIFT */ |
|
union { |
|
struct { |
|
unsigned int picture_type : 3; /* PICTURE_LAYER::PTYPE */ |
|
unsigned int frame_coding_mode : 3; /* PICTURE_LAYER::FCM */ |
|
unsigned int top_field_first : 1; /* PICTURE_LAYER::TFF */ |
|
unsigned int is_first_field : 1; /* set to 1 if it is the first field */ |
|
unsigned int intensity_compensation : 1; /* PICTURE_LAYER::INTCOMP */ |
|
} bits; |
|
unsigned int value; |
|
} picture_fields; |
|
union { |
|
struct { |
|
unsigned int mv_type_mb : 1; /* PICTURE::MVTYPEMB */ |
|
unsigned int direct_mb : 1; /* PICTURE::DIRECTMB */ |
|
unsigned int skip_mb : 1; /* PICTURE::SKIPMB */ |
|
unsigned int field_tx : 1; /* PICTURE::FIELDTX */ |
|
unsigned int forward_mb : 1; /* PICTURE::FORWARDMB */ |
|
unsigned int ac_pred : 1; /* PICTURE::ACPRED */ |
|
unsigned int overflags : 1; /* PICTURE::OVERFLAGS */ |
|
} flags; |
|
unsigned int value; |
|
} raw_coding; |
|
union { |
|
struct { |
|
unsigned int bp_mv_type_mb : 1; /* PICTURE::MVTYPEMB */ |
|
unsigned int bp_direct_mb : 1; /* PICTURE::DIRECTMB */ |
|
unsigned int bp_skip_mb : 1; /* PICTURE::SKIPMB */ |
|
unsigned int bp_field_tx : 1; /* PICTURE::FIELDTX */ |
|
unsigned int bp_forward_mb : 1; /* PICTURE::FORWARDMB */ |
|
unsigned int bp_ac_pred : 1; /* PICTURE::ACPRED */ |
|
unsigned int bp_overflags : 1; /* PICTURE::OVERFLAGS */ |
|
} flags; |
|
unsigned int value; |
|
} bitplane_present; /* signal what bitplane is being passed via the bitplane buffer */ |
|
union { |
|
struct { |
|
unsigned int reference_distance_flag : 1;/* PICTURE_LAYER::REFDIST_FLAG */ |
|
unsigned int reference_distance : 5;/* PICTURE_LAYER::REFDIST */ |
|
unsigned int num_reference_pictures: 1;/* PICTURE_LAYER::NUMREF */ |
|
unsigned int reference_field_pic_indicator : 1;/* PICTURE_LAYER::REFFIELD */ |
|
} bits; |
|
unsigned int value; |
|
} reference_fields; |
|
union { |
|
struct { |
|
unsigned int mv_mode : 3; /* PICTURE_LAYER::MVMODE */ |
|
unsigned int mv_mode2 : 3; /* PICTURE_LAYER::MVMODE2 */ |
|
unsigned int mv_table : 3; /* PICTURE_LAYER::MVTAB/IMVTAB */ |
|
unsigned int two_mv_block_pattern_table: 2; /* PICTURE_LAYER::2MVBPTAB */ |
|
unsigned int four_mv_switch : 1; /* PICTURE_LAYER::4MVSWITCH */ |
|
unsigned int four_mv_block_pattern_table : 2; /* PICTURE_LAYER::4MVBPTAB */ |
|
unsigned int extended_mv_flag : 1; /* ENTRY_POINT_LAYER::EXTENDED_MV */ |
|
unsigned int extended_mv_range : 2; /* PICTURE_LAYER::MVRANGE */ |
|
unsigned int extended_dmv_flag : 1; /* ENTRY_POINT_LAYER::EXTENDED_DMV */ |
|
unsigned int extended_dmv_range : 2; /* PICTURE_LAYER::DMVRANGE */ |
|
} bits; |
|
unsigned int value; |
|
} mv_fields; |
|
union { |
|
struct { |
|
unsigned int dquant : 2; /* ENTRY_POINT_LAYER::DQUANT */ |
|
unsigned int quantizer : 2; /* ENTRY_POINT_LAYER::QUANTIZER */ |
|
unsigned int half_qp : 1; /* PICTURE_LAYER::HALFQP */ |
|
unsigned int pic_quantizer_scale : 5;/* PICTURE_LAYER::PQUANT */ |
|
unsigned int pic_quantizer_type : 1;/* PICTURE_LAYER::PQUANTIZER */ |
|
unsigned int dq_frame : 1; /* VOPDQUANT::DQUANTFRM */ |
|
unsigned int dq_profile : 2; /* VOPDQUANT::DQPROFILE */ |
|
unsigned int dq_sb_edge : 2; /* VOPDQUANT::DQSBEDGE */ |
|
unsigned int dq_db_edge : 2; /* VOPDQUANT::DQDBEDGE */ |
|
unsigned int dq_binary_level : 1; /* VOPDQUANT::DQBILEVEL */ |
|
unsigned int alt_pic_quantizer : 5;/* VOPDQUANT::ALTPQUANT */ |
|
} bits; |
|
unsigned int value; |
|
} pic_quantizer_fields; |
|
union { |
|
struct { |
|
unsigned int variable_sized_transform_flag : 1;/* ENTRY_POINT_LAYER::VSTRANSFORM */ |
|
unsigned int mb_level_transform_type_flag : 1;/* PICTURE_LAYER::TTMBF */ |
|
unsigned int frame_level_transform_type : 2;/* PICTURE_LAYER::TTFRM */ |
|
unsigned int transform_ac_codingset_idx1 : 2;/* PICTURE_LAYER::TRANSACFRM */ |
|
unsigned int transform_ac_codingset_idx2 : 2;/* PICTURE_LAYER::TRANSACFRM2 */ |
|
unsigned int intra_transform_dc_table : 1;/* PICTURE_LAYER::TRANSDCTAB */ |
|
} bits; |
|
unsigned int value; |
|
} transform_fields; |
|
unsigned char luma_scale2; /* PICTURE_LAYER::LUMSCALE2 */ |
|
unsigned char luma_shift2; /* PICTURE_LAYER::LUMSHIFT2 */ |
|
} VAPictureParameterBufferVC1; |
|
|
|
/* VC-1 Bitplane Buffer |
|
There will be at most three bitplanes coded in any picture header. To send |
|
the bitplane data more efficiently, each byte is divided in two nibbles, with |
|
each nibble carrying three bitplanes for one macroblock. The following table |
|
shows the bitplane data arrangement within each nibble based on the picture |
|
type. |
|
|
|
Picture Type Bit3 Bit2 Bit1 Bit0 |
|
I or BI OVERFLAGS ACPRED FIELDTX |
|
P MYTYPEMB SKIPMB DIRECTMB |
|
B FORWARDMB SKIPMB DIRECTMB |
|
|
|
Within each byte, the lower nibble is for the first MB and the upper nibble is |
|
for the second MB. E.g. the lower nibble of the first byte in the bitplane |
|
buffer is for Macroblock #1 and the upper nibble of the first byte is for |
|
Macroblock #2 in the first row. |
|
*/ |
|
|
|
/* VC-1 Slice Parameter Buffer */ |
|
typedef struct _VASliceParameterBufferVC1 |
|
{ |
|
unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */ |
|
unsigned int slice_data_offset;/* the offset to the first byte of slice data */ |
|
unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */ |
|
unsigned int macroblock_offset;/* the offset to the first bit of MB from the first byte of slice data */ |
|
unsigned int slice_vertical_position; |
|
} VASliceParameterBufferVC1; |
|
|
|
/* VC-1 Slice Data Buffer */ |
|
/* |
|
This is simplely a buffer containing raw bit-stream bytes |
|
*/ |
|
|
|
/**************************** |
|
* H.264/AVC data structures |
|
****************************/ |
|
|
|
typedef struct _VAPictureH264 |
|
{ |
|
VASurfaceID picture_id; |
|
/* |
|
* frame_idx is long_term_frame_idx for long term reference picture, |
|
* and frame_num for short term reference picture. |
|
*/ |
|
unsigned int frame_idx; |
|
/* |
|
* see flags below. |
|
*/ |
|
unsigned int flags; |
|
signed int TopFieldOrderCnt; |
|
signed int BottomFieldOrderCnt; |
|
} VAPictureH264; |
|
/* flags in VAPictureH264 could be OR of the following */ |
|
#define VA_PICTURE_H264_INVALID 0x00000001 |
|
#define VA_PICTURE_H264_TOP_FIELD 0x00000002 |
|
#define VA_PICTURE_H264_BOTTOM_FIELD 0x00000004 |
|
#define VA_PICTURE_H264_SHORT_TERM_REFERENCE 0x00000008 |
|
#define VA_PICTURE_H264_LONG_TERM_REFERENCE 0x00000010 |
|
#define VA_PICTURE_H264_NON_EXISTING 0x00000020 |
|
|
|
/* H.264 Picture Parameter Buffer */ |
|
/* |
|
* For each picture, and before any slice data, a single |
|
* picture parameter buffer must be send. |
|
*/ |
|
typedef struct _VAPictureParameterBufferH264 |
|
{ |
|
VAPictureH264 CurrPic; |
|
VAPictureH264 ReferenceFrames[16]; /* in DPB */ |
|
unsigned short picture_width_in_mbs_minus1; |
|
unsigned short picture_height_in_mbs_minus1; |
|
unsigned char bit_depth_luma_minus8; |
|
unsigned char bit_depth_chroma_minus8; |
|
unsigned char num_ref_frames; |
|
union { |
|
struct { |
|
unsigned int chroma_format_idc : 2; |
|
unsigned int residual_colour_transform_flag : 1; |
|
unsigned int gaps_in_frame_num_value_allowed_flag : 1; |
|
unsigned int frame_mbs_only_flag : 1; |
|
unsigned int mb_adaptive_frame_field_flag : 1; |
|
unsigned int direct_8x8_inference_flag : 1; |
|
unsigned int MinLumaBiPredSize8x8 : 1; /* see A.3.3.2 */ |
|
unsigned int log2_max_frame_num_minus4 : 4; |
|
unsigned int pic_order_cnt_type : 2; |
|
unsigned int log2_max_pic_order_cnt_lsb_minus4 : 4; |
|
unsigned int delta_pic_order_always_zero_flag : 1; |
|
} bits; |
|
unsigned int value; |
|
} seq_fields; |
|
unsigned char num_slice_groups_minus1; |
|
unsigned char slice_group_map_type; |
|
unsigned short slice_group_change_rate_minus1; |
|
signed char pic_init_qp_minus26; |
|
signed char pic_init_qs_minus26; |
|
signed char chroma_qp_index_offset; |
|
signed char second_chroma_qp_index_offset; |
|
union { |
|
struct { |
|
unsigned int entropy_coding_mode_flag : 1; |
|
unsigned int weighted_pred_flag : 1; |
|
unsigned int weighted_bipred_idc : 2; |
|
unsigned int transform_8x8_mode_flag : 1; |
|
unsigned int field_pic_flag : 1; |
|
unsigned int constrained_intra_pred_flag : 1; |
|
unsigned int pic_order_present_flag : 1; |
|
unsigned int deblocking_filter_control_present_flag : 1; |
|
unsigned int redundant_pic_cnt_present_flag : 1; |
|
unsigned int reference_pic_flag : 1; /* nal_ref_idc != 0 */ |
|
} bits; |
|
unsigned int value; |
|
} pic_fields; |
|
unsigned short frame_num; |
|
unsigned char num_ref_idx_l0_default_active_minus1; |
|
unsigned char num_ref_idx_l1_default_active_minus1; |
|
} VAPictureParameterBufferH264; |
|
|
|
/* H.264 Inverse Quantization Matrix Buffer */ |
|
typedef struct _VAIQMatrixBufferH264 |
|
{ |
|
unsigned char ScalingList4x4[6][16]; |
|
unsigned char ScalingList8x8[2][64]; |
|
} VAIQMatrixBufferH264; |
|
|
|
/* |
|
* H.264 Slice Group Map Buffer |
|
* When VAPictureParameterBufferH264::num_slice_group_minus1 is not equal to 0, |
|
* A slice group map buffer should be sent for each picture if required. The buffer |
|
* is sent only when there is a change in the mapping values. |
|
* The slice group map buffer map "map units" to slice groups as specified in |
|
* section 8.2.2 of the H.264 spec. The buffer will contain one byte for each macroblock |
|
* in raster scan order |
|
*/ |
|
|
|
/* |
|
* H.264 Slice Parameter Buffer for base mode decoding |
|
*/ |
|
typedef struct _VASliceParameterBufferBaseH264 |
|
{ |
|
unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */ |
|
/** \brief Byte offset to the NAL Header Unit for this slice. */ |
|
unsigned int slice_data_offset; |
|
unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */ |
|
} VASliceParameterBufferH264Base; |
|
|
|
/* |
|
* H.264 Slice Parameter Buffer for normal mode decoding |
|
*/ |
|
typedef struct _VASliceParameterBufferH264 |
|
{ |
|
unsigned int slice_data_size;/* number of bytes in the slice data buffer for this slice */ |
|
/** \brief Byte offset to the NAL Header Unit for this slice. */ |
|
unsigned int slice_data_offset; |
|
unsigned int slice_data_flag; /* see VA_SLICE_DATA_FLAG_XXX defintions */ |
|
/** |
|
* \brief Bit offset from NAL Header Unit to the begining of slice_data(). |
|
* |
|
* This bit offset is relative to and includes the NAL unit byte |
|
* and represents the number of bits parsed in the slice_header() |
|
* after the removal of any emulation prevention bytes in |
|
* there. However, the slice data buffer passed to the hardware is |
|
* the original bitstream, thus including any emulation prevention |
|
* bytes. |
|
*/ |
|
unsigned short slice_data_bit_offset; |
|
unsigned short first_mb_in_slice; |
|
unsigned char slice_type; |
|
unsigned char direct_spatial_mv_pred_flag; |
|
unsigned char num_ref_idx_l0_active_minus1; |
|
unsigned char num_ref_idx_l1_active_minus1; |
|
unsigned char cabac_init_idc; |
|
char slice_qp_delta; |
|
unsigned char disable_deblocking_filter_idc; |
|
char slice_alpha_c0_offset_div2; |
|
char slice_beta_offset_div2; |
|
VAPictureH264 RefPicList0[32]; /* See 8.2.4.2 */ |
|
VAPictureH264 RefPicList1[32]; /* See 8.2.4.2 */ |
|
unsigned char luma_log2_weight_denom; |
|
unsigned char chroma_log2_weight_denom; |
|
unsigned char luma_weight_l0_flag; |
|
short luma_weight_l0[32]; |
|
short luma_offset_l0[32]; |
|
unsigned char chroma_weight_l0_flag; |
|
short chroma_weight_l0[32][2]; |
|
short chroma_offset_l0[32][2]; |
|
unsigned char luma_weight_l1_flag; |
|
short luma_weight_l1[32]; |
|
short luma_offset_l1[32]; |
|
unsigned char chroma_weight_l1_flag; |
|
short chroma_weight_l1[32][2]; |
|
short chroma_offset_l1[32][2]; |
|
} VASliceParameterBufferH264; |
|
|
|
/**************************** |
|
* Common encode data structures |
|
****************************/ |
|
typedef enum |
|
{ |
|
VAEncPictureTypeIntra = 0, |
|
VAEncPictureTypePredictive = 1, |
|
VAEncPictureTypeBidirectional = 2, |
|
} VAEncPictureType; |
|
|
|
/* Encode Slice Parameter Buffer */ |
|
typedef struct _VAEncSliceParameterBuffer |
|
{ |
|
unsigned int start_row_number; /* starting MB row number for this slice */ |
|
unsigned int slice_height; /* slice height measured in MB */ |
|
union { |
|
struct { |
|
unsigned int is_intra : 1; |
|
unsigned int disable_deblocking_filter_idc : 2; |
|
unsigned int uses_long_term_ref :1; |
|
unsigned int is_long_term_ref :1; |
|
} bits; |
|
unsigned int value; |
|
} slice_flags; |
|
} VAEncSliceParameterBuffer; |
|
|
|
|
|
/**************************** |
|
* H.263 specific encode data structures |
|
****************************/ |
|
|
|
typedef struct _VAEncSequenceParameterBufferH263 |
|
{ |
|
unsigned int intra_period; |
|
unsigned int bits_per_second; |
|
unsigned int frame_rate; |
|
unsigned int initial_qp; |
|
unsigned int min_qp; |
|
} VAEncSequenceParameterBufferH263; |
|
|
|
typedef struct _VAEncPictureParameterBufferH263 |
|
{ |
|
VASurfaceID reference_picture; |
|
VASurfaceID reconstructed_picture; |
|
VABufferID coded_buf; |
|
unsigned short picture_width; |
|
unsigned short picture_height; |
|
VAEncPictureType picture_type; |
|
} VAEncPictureParameterBufferH263; |
|
|
|
/**************************** |
|
* MPEG-4 specific encode data structures |
|
****************************/ |
|
|
|
typedef struct _VAEncSequenceParameterBufferMPEG4 |
|
{ |
|
unsigned char profile_and_level_indication; |
|
unsigned int intra_period; |
|
unsigned int video_object_layer_width; |
|
unsigned int video_object_layer_height; |
|
unsigned int vop_time_increment_resolution; |
|
unsigned int fixed_vop_rate; |
|
unsigned int fixed_vop_time_increment; |
|
unsigned int bits_per_second; |
|
unsigned int frame_rate; |
|
unsigned int initial_qp; |
|
unsigned int min_qp; |
|
} VAEncSequenceParameterBufferMPEG4; |
|
|
|
typedef struct _VAEncPictureParameterBufferMPEG4 |
|
{ |
|
VASurfaceID reference_picture; |
|
VASurfaceID reconstructed_picture; |
|
VABufferID coded_buf; |
|
unsigned short picture_width; |
|
unsigned short picture_height; |
|
unsigned int modulo_time_base; /* number of 1s */ |
|
unsigned int vop_time_increment; |
|
VAEncPictureType picture_type; |
|
} VAEncPictureParameterBufferMPEG4; |
|
|
|
|
|
|
|
/* Buffer functions */ |
|
|
|
/* |
|
* Creates a buffer for "num_elements" elements of "size" bytes and |
|
* initalize with "data". |
|
* if "data" is null, then the contents of the buffer data store |
|
* are undefined. |
|
* Basically there are two ways to get buffer data to the server side. One is |
|
* to call vaCreateBuffer() with a non-null "data", which results the data being |
|
* copied to the data store on the server side. A different method that |
|
* eliminates this copy is to pass null as "data" when calling vaCreateBuffer(), |
|
* and then use vaMapBuffer() to map the data store from the server side to the |
|
* client address space for access. |
|
* Note: image buffers are created by the library, not the client. Please see |
|
* vaCreateImage on how image buffers are managed. |
|
*/ |
|
VAStatus vaCreateBuffer ( |
|
VADisplay dpy, |
|
VAContextID context, |
|
VABufferType type, /* in */ |
|
unsigned int size, /* in */ |
|
unsigned int num_elements, /* in */ |
|
void *data, /* in */ |
|
VABufferID *buf_id /* out */ |
|
); |
|
|
|
/* |
|
* Convey to the server how many valid elements are in the buffer. |
|
* e.g. if multiple slice parameters are being held in a single buffer, |
|
* this will communicate to the server the number of slice parameters |
|
* that are valid in the buffer. |
|
*/ |
|
VAStatus vaBufferSetNumElements ( |
|
VADisplay dpy, |
|
VABufferID buf_id, /* in */ |
|
unsigned int num_elements /* in */ |
|
); |
|
|
|
|
|
/* |
|
* device independent data structure for codedbuffer |
|
*/ |
|
|
|
/* |
|
* FICTURE_AVE_QP(bit7-0): The average Qp value used during this frame |
|
* LARGE_SLICE(bit8):At least one slice in the current frame was large |
|
* enough for the encoder to attempt to limit its size. |
|
* SLICE_OVERFLOW(bit9): At least one slice in the current frame has |
|
* exceeded the maximum slice size specified. |
|
* BITRATE_OVERFLOW(bit10): The peak bitrate was exceeded for this frame. |
|
* BITRATE_HIGH(bit11): The frame size got within the safety margin of the maximum size (VCM only) |
|
* AIR_MB_OVER_THRESHOLD: the number of MBs adapted to Intra MB |
|
*/ |
|
#define VA_CODED_BUF_STATUS_PICTURE_AVE_QP_MASK 0xff |
|
#define VA_CODED_BUF_STATUS_LARGE_SLICE_MASK 0x100 |
|
#define VA_CODED_BUF_STATUS_SLICE_OVERFLOW_MASK 0x200 |
|
#define VA_CODED_BUF_STATUS_BITRATE_OVERFLOW 0x400 |
|
#define VA_CODED_BUF_STATUS_BITRATE_HIGH 0x800 |
|
/** |
|
* \brief The frame has exceeded the maximum requested size. |
|
* |
|
* This flag indicates that the encoded frame size exceeds the value |
|
* specified through a misc parameter buffer of type |
|
* #VAEncMiscParameterTypeMaxFrameSize. |
|
*/ |
|
#define VA_CODED_BUF_STATUS_FRAME_SIZE_OVERFLOW 0x1000 |
|
#define VA_CODED_BUF_STATUS_AIR_MB_OVER_THRESHOLD 0xff0000 |
|
|
|
/** |
|
* \brief The coded buffer segment contains a single NAL unit. |
|
* |
|
* This flag indicates that the coded buffer segment contains a |
|
* single NAL unit. This flag might be useful to the user for |
|
* processing the coded buffer. |
|
*/ |
|
#define VA_CODED_BUF_STATUS_SINGLE_NALU 0x10000000 |
|
|
|
/** |
|
* \brief The coded buffer segment contains a private data. |
|
* |
|
* This flag indicates that the coded buffer segment contains |
|
* private data. This flag can be used to exchange private data |
|
* between the client and the driver. Private data should follow |
|
* regular coded data in the coded buffer segement list. |
|
*/ |
|
#define VA_CODED_BUF_STATUS_PRIVATE_DATA 0x80000000 |
|
|
|
/** |
|
* \brief Coded buffer segment. |
|
* |
|
* #VACodedBufferSegment is an element of a linked list describing |
|
* some information on the coded buffer. The coded buffer segment |
|
* could contain either a single NAL unit, or more than one NAL unit. |
|
* It is recommended (but not required) to return a single NAL unit |
|
* in a coded buffer segment, and the implementation should set the |
|
* VA_CODED_BUF_STATUS_SINGLE_NALU status flag if that is the case. |
|
*/ |
|
typedef struct _VACodedBufferSegment { |
|
/** |
|
* \brief Size of the data buffer in this segment (in bytes). |
|
*/ |
|
unsigned int size; |
|
/** \brief Bit offset into the data buffer where the video data starts. */ |
|
unsigned int bit_offset; |
|
/** \brief Status set by the driver. See \c VA_CODED_BUF_STATUS_*. */ |
|
unsigned int status; |
|
/** \brief Reserved for future use. */ |
|
unsigned int reserved; |
|
/** \brief Pointer to the start of the data buffer. */ |
|
void *buf; |
|
/** |
|
* \brief Pointer to the next #VACodedBufferSegment element, |
|
* or \c NULL if there is none. |
|
*/ |
|
void *next; |
|
} VACodedBufferSegment; |
|
|
|
|
|
/* |
|
* H.264 Parsed Slice Header Group Info |
|
* After slice header is parsed by decode hardware, |
|
* group slice header buffer will be returned to client. |
|
* client will retrieve multiple parsed slice header infos from that buffer |
|
*/ |
|
|
|
/* H.264 Parsed Slice Header Info */ |
|
typedef struct _VAParseSliceHeaderGroupBuffer |
|
{ |
|
unsigned int size; |
|
|
|
unsigned char nal_ref_idc; |
|
unsigned char nal_unit_type; |
|
unsigned char slice_type; |
|
unsigned char redundant_pic_cnt; |
|
|
|
unsigned short first_mb_in_slice; |
|
char slice_qp_delta; |
|
char slice_qs_delta; |
|
|
|
unsigned char luma_log2_weight_denom; |
|
unsigned char chroma_log2_weight_denom; |
|
unsigned char cabac_init_idc; |
|
unsigned char reserved8bit; |
|
|
|
unsigned short pic_order_cnt_lsb; |
|
unsigned short reserved16bit; |
|
|
|
unsigned short idr_pic_id; |
|
unsigned char pic_parameter_set_id; |
|
unsigned char colour_plane_id; |
|
|
|
char slice_alpha_c0_offset_div2; |
|
char slice_beta_offset_div2; |
|
unsigned char slice_group_change_cycle; |
|
unsigned char disable_deblocking_filter_idc; |
|
|
|
unsigned int frame_num; |
|
int delta_pic_order_cnt_bottom; |
|
int delta_pic_order_cnt[2]; |
|
|
|
unsigned char num_reorder_cmds[2]; |
|
unsigned char num_ref_active_minus1[2]; |
|
|
|
unsigned int weights_present[2][2]; |
|
|
|
unsigned short num_mem_man_ops; |
|
|
|
union { |
|
struct { |
|
unsigned field_pic_flag : 1; |
|
unsigned bottom_field_flag : 1; |
|
unsigned num_ref_idx_active_override_flag : 1; |
|
unsigned direct_spatial_mv_pred_flag : 1; |
|
unsigned no_output_of_prior_pics_flag : 1; |
|
unsigned long_term_reference_flag : 1; |
|
unsigned idr_flag : 1; |
|
unsigned anchor_pic_flag : 1; |
|
unsigned inter_view_flag : 1; |
|
} bits; |
|
|
|
unsigned short value; |
|
} flags; |
|
|
|
//MVC |
|
unsigned short view_id; |
|
unsigned char priority_id; |
|
unsigned char temporal_id; |
|
} VAParseSliceHeaderGroupBuffer; |
|
|
|
typedef struct _VAParsePictureParameterBuffer { |
|
VABufferID frame_buf_id; |
|
VABufferID slice_headers_buf_id; |
|
unsigned int frame_size; |
|
unsigned int slice_headers_size; |
|
union { |
|
struct { |
|
unsigned frame_mbs_only_flag : 1; |
|
unsigned pic_order_present_flag : 1; |
|
unsigned delta_pic_order_always_zero_flag : 1; |
|
unsigned redundant_pic_cnt_present_flag : 1; |
|
unsigned weighted_pred_flag : 1; |
|
unsigned entropy_coding_mode_flag : 1; |
|
unsigned deblocking_filter_control_present_flag : 1; |
|
unsigned weighted_bipred_idc : 1; |
|
} bits; |
|
unsigned int value; |
|
} flags; |
|
|
|
union { |
|
struct { |
|
unsigned char nalu_header_unit_type : 5; |
|
unsigned char nalu_header_ref_idc : 2; |
|
} bits; |
|
unsigned char value; |
|
} nalu_header; |
|
|
|
unsigned short expected_pic_parameter_set_id; |
|
unsigned char num_slice_groups_minus1; |
|
unsigned char slice_group_map_type; |
|
unsigned char log2_slice_group_change_cycle; |
|
unsigned char chroma_format_idc; |
|
|
|
unsigned char log2_max_pic_order_cnt_lsb_minus4; |
|
unsigned char pic_order_cnt_type; |
|
unsigned char log2_max_frame_num_minus4; |
|
unsigned char idr_flag; |
|
unsigned char slice_offset; |
|
|
|
/* additionally */ |
|
unsigned char residual_colour_transform_flag; |
|
unsigned char num_ref_idc_l0_active_minus1; |
|
unsigned char num_ref_idc_l1_active_minus1; |
|
} VAParsePictureParameterBuffer; |
|
|
|
/* |
|
* Map data store of the buffer into the client's address space |
|
* vaCreateBuffer() needs to be called with "data" set to NULL before |
|
* calling vaMapBuffer() |
|
* |
|
* if buffer type is VAEncCodedBufferType, pbuf points to link-list of |
|
* VACodedBufferSegment, and the list is terminated if "next" is NULL |
|
*/ |
|
VAStatus vaMapBuffer ( |
|
VADisplay dpy, |
|
VABufferID buf_id, /* in */ |
|
void **pbuf /* out */ |
|
); |
|
|
|
/* |
|
* After client making changes to a mapped data store, it needs to |
|
* "Unmap" it to let the server know that the data is ready to be |
|
* consumed by the server |
|
*/ |
|
VAStatus vaUnmapBuffer ( |
|
VADisplay dpy, |
|
VABufferID buf_id /* in */ |
|
); |
|
|
|
/* |
|
* After this call, the buffer is deleted and this buffer_id is no longer valid |
|
* Only call this if the buffer is not going to be passed to vaRenderBuffer |
|
*/ |
|
VAStatus vaDestroyBuffer ( |
|
VADisplay dpy, |
|
VABufferID buffer_id |
|
); |
|
|
|
/* |
|
Render (Decode) Pictures |
|
|
|
A picture represents either a frame or a field. |
|
|
|
The Begin/Render/End sequence sends the decode buffers to the server |
|
*/ |
|
|
|
/* |
|
* Get ready to decode a picture to a target surface |
|
*/ |
|
VAStatus vaBeginPicture ( |
|
VADisplay dpy, |
|
VAContextID context, |
|
VASurfaceID render_target |
|
); |
|
|
|
/* |
|
* Send decode buffers to the server. |
|
* Buffers are automatically destroyed afterwards |
|
*/ |
|
VAStatus vaRenderPicture ( |
|
VADisplay dpy, |
|
VAContextID context, |
|
VABufferID *buffers, |
|
int num_buffers |
|
); |
|
|
|
/* |
|
* Make the end of rendering for a picture. |
|
* The server should start processing all pending operations for this |
|
* surface. This call is non-blocking. The client can start another |
|
* Begin/Render/End sequence on a different render target. |
|
*/ |
|
VAStatus vaEndPicture ( |
|
VADisplay dpy, |
|
VAContextID context |
|
); |
|
|
|
/* |
|
|
|
Synchronization |
|
|
|
*/ |
|
|
|
/* |
|
* This function blocks until all pending operations on the render target |
|
* have been completed. Upon return it is safe to use the render target for a |
|
* different picture. |
|
*/ |
|
VAStatus vaSyncSurface ( |
|
VADisplay dpy, |
|
VASurfaceID render_target |
|
); |
|
|
|
typedef enum |
|
{ |
|
VASurfaceRendering = 1, /* Rendering in progress */ |
|
VASurfaceDisplaying = 2, /* Displaying in progress (not safe to render into it) */ |
|
/* this status is useful if surface is used as the source */ |
|
/* of an overlay */ |
|
VASurfaceReady = 4, /* not being rendered or displayed */ |
|
VASurfaceSkipped = 8 /* Indicate a skipped frame during encode */ |
|
} VASurfaceStatus; |
|
|
|
/* |
|
* Find out any pending ops on the render target |
|
*/ |
|
VAStatus vaQuerySurfaceStatus ( |
|
VADisplay dpy, |
|
VASurfaceID render_target, |
|
VASurfaceStatus *status /* out */ |
|
); |
|
|
|
typedef enum |
|
{ |
|
VADecodeSliceMissing = 0, |
|
VADecodeMBError = 1, |
|
} VADecodeErrorType; |
|
|
|
/* |
|
* Client calls vaQuerySurfaceError with VA_STATUS_ERROR_DECODING_ERROR, server side returns |
|
* an array of structure VASurfaceDecodeMBErrors, and the array is terminated by setting status=-1 |
|
*/ |
|
typedef struct _VASurfaceDecodeMBErrors |
|
{ |
|
int status; /* 1 if start_mb/end_mb with errors is returned, 2 if num_mb with errors is returned, -1 means this record is invalid */ |
|
unsigned int start_mb; /* start mb address with errors */ |
|
unsigned int end_mb; /* end mb address with errors */ |
|
VADecodeErrorType decode_error_type; |
|
unsigned int num_mb; /* number of mbs with errors */ |
|
} VASurfaceDecodeMBErrors; |
|
|
|
/* |
|
* After the application gets VA_STATUS_ERROR_DECODING_ERROR after calling vaSyncSurface(), |
|
* it can call vaQuerySurfaceError to find out further details on the particular error. |
|
* VA_STATUS_ERROR_DECODING_ERROR should be passed in as "error_status", |
|
* upon the return, error_info will point to an array of _VASurfaceDecodeMBErrors structure, |
|
* which is allocated and filled by libVA with detailed information on the missing or error macroblocks. |
|
* The array is terminated if "status==-1" is detected. |
|
*/ |
|
VAStatus vaQuerySurfaceError( |
|
VADisplay dpy, |
|
VASurfaceID surface, |
|
VAStatus error_status, |
|
void **error_info |
|
); |
|
|
|
/* |
|
* Images and Subpictures |
|
* VAImage is used to either get the surface data to client memory, or |
|
* to copy image data in client memory to a surface. |
|
* Both images, subpictures and surfaces follow the same 2D coordinate system where origin |
|
* is at the upper left corner with positive X to the right and positive Y down |
|
*/ |
|
#define VA_FOURCC(ch0, ch1, ch2, ch3) \ |
|
((unsigned long)(unsigned char) (ch0) | ((unsigned long)(unsigned char) (ch1) << 8) | \ |
|
((unsigned long)(unsigned char) (ch2) << 16) | ((unsigned long)(unsigned char) (ch3) << 24 )) |
|
|
|
/* |
|
* Pre-defined fourcc codes |
|
*/ |
|
#define VA_FOURCC_NV12 0x3231564E |
|
#define VA_FOURCC_NV21 0x3132564E |
|
#define VA_FOURCC_AI44 0x34344149 |
|
#define VA_FOURCC_RGBA 0x41424752 |
|
#define VA_FOURCC_RGBX 0x58424752 |
|
#define VA_FOURCC_BGRA 0x41524742 |
|
#define VA_FOURCC_BGRX 0x58524742 |
|
#define VA_FOURCC_ARGB 0x42475241 |
|
#define VA_FOURCC_XRGB 0x42475258 |
|
#define VA_FOURCC_ABGR 0x52474241 |
|
#define VA_FOURCC_XBGR 0x52474258 |
|
#define VA_FOURCC_UYVY 0x59565955 |
|
#define VA_FOURCC_YUY2 0x32595559 |
|
#define VA_FOURCC_AYUV 0x56555941 |
|
#define VA_FOURCC_NV11 0x3131564e |
|
#define VA_FOURCC_YV12 0x32315659 |
|
#define VA_FOURCC_P208 0x38303250 |
|
#define VA_FOURCC_IYUV 0x56555949 |
|
#define VA_FOURCC_YV24 0x34325659 |
|
#define VA_FOURCC_YV32 0x32335659 |
|
#define VA_FOURCC_Y800 0x30303859 |
|
#define VA_FOURCC_IMC3 0x33434D49 |
|
#define VA_FOURCC_411P 0x50313134 |
|
#define VA_FOURCC_422H 0x48323234 |
|
#define VA_FOURCC_422V 0x56323234 |
|
#define VA_FOURCC_444P 0x50343434 |
|
#define VA_FOURCC_RGBP 0x50424752 |
|
#define VA_FOURCC_BGRP 0x50524742 |
|
#define VA_FOURCC_411R 0x52313134 /* rotated 411P */ |
|
|
|
/* byte order */ |
|
#define VA_LSB_FIRST 1 |
|
#define VA_MSB_FIRST 2 |
|
|
|
typedef struct _VAImageFormat |
|
{ |
|
unsigned int fourcc; |
|
unsigned int byte_order; /* VA_LSB_FIRST, VA_MSB_FIRST */ |
|
unsigned int bits_per_pixel; |
|
/* for RGB formats */ |
|
unsigned int depth; /* significant bits per pixel */ |
|
unsigned int red_mask; |
|
unsigned int green_mask; |
|
unsigned int blue_mask; |
|
unsigned int alpha_mask; |
|
} VAImageFormat; |
|
|
|
typedef VAGenericID VAImageID; |
|
|
|
typedef struct _VAImage |
|
{ |
|
VAImageID image_id; /* uniquely identify this image */ |
|
VAImageFormat format; |
|
VABufferID buf; /* image data buffer */ |
|
/* |
|
* Image data will be stored in a buffer of type VAImageBufferType to facilitate |
|
* data store on the server side for optimal performance. The buffer will be |
|
* created by the CreateImage function, and proper storage allocated based on the image |
|
* size and format. This buffer is managed by the library implementation, and |
|
* accessed by the client through the buffer Map/Unmap functions. |
|
*/ |
|
unsigned short width; |
|
unsigned short height; |
|
unsigned int data_size; |
|
unsigned int num_planes; /* can not be greater than 4 */ |
|
/* |
|
* An array indicating the scanline pitch in bytes for each plane. |
|
* Each plane may have a different pitch. Maximum 3 planes for planar formats |
|
*/ |
|
unsigned int pitches[3]; |
|
/* |
|
* An array indicating the byte offset from the beginning of the image data |
|
* to the start of each plane. |
|
*/ |
|
unsigned int offsets[3]; |
|
|
|
/* The following fields are only needed for paletted formats */ |
|
int num_palette_entries; /* set to zero for non-palette images */ |
|
/* |
|
* Each component is one byte and entry_bytes indicates the number of components in |
|
* each entry (eg. 3 for YUV palette entries). set to zero for non-palette images |
|
*/ |
|
int entry_bytes; |
|
/* |
|
* An array of ascii characters describing the order of the components within the bytes. |
|
* Only entry_bytes characters of the string are used. |
|
*/ |
|
char component_order[4]; |
|
/* |
|
* Pitch and byte offset for the fourth plane if the image format requires 4 planes |
|
* Particular use case is JPEG with CMYK profile |
|
*/ |
|
unsigned int extra_pitch; |
|
unsigned int extra_offset; |
|
} VAImage; |
|
|
|
/* Get maximum number of image formats supported by the implementation */ |
|
int vaMaxNumImageFormats ( |
|
VADisplay dpy |
|
); |
|
|
|
/* |
|
* Query supported image formats |
|
* The caller must provide a "format_list" array that can hold at |
|
* least vaMaxNumImageFormats() entries. The actual number of formats |
|
* returned in "format_list" is returned in "num_formats". |
|
*/ |
|
VAStatus vaQueryImageFormats ( |
|
VADisplay dpy, |
|
VAImageFormat *format_list, /* out */ |
|
int *num_formats /* out */ |
|
); |
|
|
|
/* |
|
* Create a VAImage structure |
|
* The width and height fields returned in the VAImage structure may get |
|
* enlarged for some YUV formats. Upon return from this function, |
|
* image->buf has been created and proper storage allocated by the library. |
|
* The client can access the image through the Map/Unmap calls. |
|
*/ |
|
VAStatus vaCreateImage ( |
|
VADisplay dpy, |
|
VAImageFormat *format, |
|
int width, |
|
int height, |
|
VAImage *image /* out */ |
|
); |
|
|
|
/* |
|
* Should call DestroyImage before destroying the surface it is bound to |
|
*/ |
|
VAStatus vaDestroyImage ( |
|
VADisplay dpy, |
|
VAImageID image |
|
); |
|
|
|
VAStatus vaSetImagePalette ( |
|
VADisplay dpy, |
|
VAImageID image, |
|
/* |
|
* pointer to an array holding the palette data. The size of the array is |
|
* num_palette_entries * entry_bytes in size. The order of the components |
|
* in the palette is described by the component_order in VAImage struct |
|
*/ |
|
unsigned char *palette |
|
); |
|
|
|
/* |
|
* Retrive surface data into a VAImage |
|
* Image must be in a format supported by the implementation |
|
*/ |
|
VAStatus vaGetImage ( |
|
VADisplay dpy, |
|
VASurfaceID surface, |
|
int x, /* coordinates of the upper left source pixel */ |
|
int y, |
|
unsigned int width, /* width and height of the region */ |
|
unsigned int height, |
|
VAImageID image |
|
); |
|
|
|
/* |
|
* Copy data from a VAImage to a surface |
|
* Image must be in a format supported by the implementation |
|
* Returns a VA_STATUS_ERROR_SURFACE_BUSY if the surface |
|
* shouldn't be rendered into when this is called |
|
*/ |
|
VAStatus vaPutImage ( |
|
VADisplay dpy, |
|
VASurfaceID surface, |
|
VAImageID image, |
|
int src_x, |
|
int src_y, |
|
unsigned int src_width, |
|
unsigned int src_height, |
|
int dest_x, |
|
int dest_y, |
|
unsigned int dest_width, |
|
unsigned int dest_height |
|
); |
|
|
|
/* |
|
* Derive an VAImage from an existing surface. |
|
* This interface will derive a VAImage and corresponding image buffer from |
|
* an existing VA Surface. The image buffer can then be mapped/unmapped for |
|
* direct CPU access. This operation is only possible on implementations with |
|
* direct rendering capabilities and internal surface formats that can be |
|
* represented with a VAImage. When the operation is not possible this interface |
|
* will return VA_STATUS_ERROR_OPERATION_FAILED. Clients should then fall back |
|
* to using vaCreateImage + vaPutImage to accomplish the same task in an |
|
* indirect manner. |
|
* |
|
* Implementations should only return success when the resulting image buffer |
|
* would be useable with vaMap/Unmap. |
|
* |
|
* When directly accessing a surface special care must be taken to insure |
|
* proper synchronization with the graphics hardware. Clients should call |
|
* vaQuerySurfaceStatus to insure that a surface is not the target of concurrent |
|
* rendering or currently being displayed by an overlay. |
|
* |
|
* Additionally nothing about the contents of a surface should be assumed |
|
* following a vaPutSurface. Implementations are free to modify the surface for |
|
* scaling or subpicture blending within a call to vaPutImage. |
|
* |
|
* Calls to vaPutImage or vaGetImage using the same surface from which the image |
|
* has been derived will return VA_STATUS_ERROR_SURFACE_BUSY. vaPutImage or |
|
* vaGetImage with other surfaces is supported. |
|
* |
|
* An image created with vaDeriveImage should be freed with vaDestroyImage. The |
|
* image and image buffer structures will be destroyed; however, the underlying |
|
* surface will remain unchanged until freed with vaDestroySurfaces. |
|
*/ |
|
VAStatus vaDeriveImage ( |
|
VADisplay dpy, |
|
VASurfaceID surface, |
|
VAImage *image /* out */ |
|
); |
|
|
|
/* |
|
* Subpictures |
|
* Subpicture is a special type of image that can be blended |
|
* with a surface during vaPutSurface(). Subpicture can be used to render |
|
* DVD sub-titles or closed captioning text etc. |
|
*/ |
|
|
|
typedef VAGenericID VASubpictureID; |
|
|
|
/* Get maximum number of subpicture formats supported by the implementation */ |
|
int vaMaxNumSubpictureFormats ( |
|
VADisplay dpy |
|
); |
|
|
|
/* flags for subpictures */ |
|
#define VA_SUBPICTURE_CHROMA_KEYING 0x0001 |
|
#define VA_SUBPICTURE_GLOBAL_ALPHA 0x0002 |
|
#define VA_SUBPICTURE_DESTINATION_IS_SCREEN_COORD 0x0004 |
|
/* |
|
* Query supported subpicture formats |
|
* The caller must provide a "format_list" array that can hold at |
|
* least vaMaxNumSubpictureFormats() entries. The flags arrary holds the flag |
|
* for each format to indicate additional capabilities for that format. The actual |
|
* number of formats returned in "format_list" is returned in "num_formats". |
|
* flags: returned value to indicate addtional capabilities |
|
* VA_SUBPICTURE_CHROMA_KEYING - supports chroma-keying |
|
* VA_SUBPICTURE_GLOBAL_ALPHA - supports global alpha |
|
* VA_SUBPICTURE_DESTINATION_IS_SCREEN_COORD - supports unscaled screen relative subpictures for On Screen Display |
|
*/ |
|
|
|
VAStatus vaQuerySubpictureFormats ( |
|
VADisplay dpy, |
|
VAImageFormat *format_list, /* out */ |
|
unsigned int *flags, /* out */ |
|
unsigned int *num_formats /* out */ |
|
); |
|
|
|
/* |
|
* Subpictures are created with an image associated. |
|
*/ |
|
VAStatus vaCreateSubpicture ( |
|
VADisplay dpy, |
|
VAImageID image, |
|
VASubpictureID *subpicture /* out */ |
|
); |
|
|
|
/* |
|
* Destroy the subpicture before destroying the image it is assocated to |
|
*/ |
|
VAStatus vaDestroySubpicture ( |
|
VADisplay dpy, |
|
VASubpictureID subpicture |
|
); |
|
|
|
/* |
|
* Bind an image to the subpicture. This image will now be associated with |
|
* the subpicture instead of the one at creation. |
|
*/ |
|
VAStatus vaSetSubpictureImage ( |
|
VADisplay dpy, |
|
VASubpictureID subpicture, |
|
VAImageID image |
|
); |
|
|
|
/* |
|
* If chromakey is enabled, then the area where the source value falls within |
|
* the chromakey [min, max] range is transparent |
|
* The chromakey component format is the following: |
|
* For RGB: [0:7] Red [8:15] Blue [16:23] Green |
|
* For YUV: [0:7] V [8:15] U [16:23] Y |
|
* The chromakey mask can be used to mask out certain components for chromakey |
|
* comparision |
|
*/ |
|
VAStatus vaSetSubpictureChromakey ( |
|
VADisplay dpy, |
|
VASubpictureID subpicture, |
|
unsigned int chromakey_min, |
|
unsigned int chromakey_max, |
|
unsigned int chromakey_mask |
|
); |
|
|
|
/* |
|
* Global alpha value is between 0 and 1. A value of 1 means fully opaque and |
|
* a value of 0 means fully transparent. If per-pixel alpha is also specified then |
|
* the overall alpha is per-pixel alpha multiplied by the global alpha |
|
*/ |
|
VAStatus vaSetSubpictureGlobalAlpha ( |
|
VADisplay dpy, |
|
VASubpictureID subpicture, |
|
float global_alpha |
|
); |
|
|
|
/* |
|
* vaAssociateSubpicture associates the subpicture with target_surfaces. |
|
* It defines the region mapping between the subpicture and the target |
|
* surfaces through source and destination rectangles (with the same width and height). |
|
* Both will be displayed at the next call to vaPutSurface. Additional |
|
* associations before the call to vaPutSurface simply overrides the association. |
|
*/ |
|
VAStatus vaAssociateSubpicture ( |
|
VADisplay dpy, |
|
VASubpictureID subpicture, |
|
VASurfaceID *target_surfaces, |
|
int num_surfaces, |
|
short src_x, /* upper left offset in subpicture */ |
|
short src_y, |
|
unsigned short src_width, |
|
unsigned short src_height, |
|
short dest_x, /* upper left offset in surface */ |
|
short dest_y, |
|
unsigned short dest_width, |
|
unsigned short dest_height, |
|
/* |
|
* whether to enable chroma-keying, global-alpha, or screen relative mode |
|
* see VA_SUBPICTURE_XXX values |
|
*/ |
|
unsigned int flags |
|
); |
|
|
|
/* |
|
* vaDeassociateSubpicture removes the association of the subpicture with target_surfaces. |
|
*/ |
|
VAStatus vaDeassociateSubpicture ( |
|
VADisplay dpy, |
|
VASubpictureID subpicture, |
|
VASurfaceID *target_surfaces, |
|
int num_surfaces |
|
); |
|
|
|
/* |
|
* Display attributes |
|
* Display attributes are used to control things such as contrast, hue, saturation, |
|
* brightness etc. in the rendering process. The application can query what |
|
* attributes are supported by the driver, and then set the appropriate attributes |
|
* before calling vaPutSurface() |
|
*/ |
|
|
|
/** |
|
* @name Rotation angles |
|
* |
|
* Those values could be used for VADisplayAttribRotation attribute or |
|
* VAProcPipelineParameterBuffer::rotation_state or in VAConfigAttribValDecJPEG. |
|
* The rotation operation is clockwise. |
|
*/ |
|
/**@{*/ |
|
/** \brief No rotation. */ |
|
#define VA_ROTATION_NONE 0x00000000 |
|
/** \brief Rotation by 90° clockwise. */ |
|
#define VA_ROTATION_90 0x00000001 |
|
/** \brief Rotation by 180° clockwise. */ |
|
#define VA_ROTATION_180 0x00000002 |
|
/** \brief Rotation by 270° clockwise. */ |
|
#define VA_ROTATION_270 0x00000003 |
|
/**@}*/ |
|
|
|
/** |
|
* @name Mirroring directions |
|
* |
|
* Those values could be used for VADisplayAttribMirror attribute or |
|
* VAProcPipelineParameterBuffer::mirror_state. |
|
|
|
*/ |
|
/**@{*/ |
|
/** \brief No Mirroring. */ |
|
#define VA_MIRROR_NONE 0x00000000 |
|
/** \brief Horizontal Mirroring. */ |
|
#define VA_MIRROR_HORIZONTAL 0x00000001 |
|
/** \brief Vertical Mirroring. */ |
|
#define VA_MIRROR_VERTICAL 0x00000002 |
|
/**@}*/ |
|
|
|
/* attribute value for VADisplayAttribOutOfLoopDeblock */ |
|
#define VA_OOL_DEBLOCKING_FALSE 0x00000000 |
|
#define VA_OOL_DEBLOCKING_TRUE 0x00000001 |
|
|
|
/* Render mode */ |
|
#define VA_RENDER_MODE_UNDEFINED 0 |
|
#define VA_RENDER_MODE_LOCAL_OVERLAY 1 |
|
#define VA_RENDER_MODE_LOCAL_GPU 2 |
|
#define VA_RENDER_MODE_EXTERNAL_OVERLAY 4 |
|
#define VA_RENDER_MODE_EXTERNAL_GPU 8 |
|
|
|
/* Render device */ |
|
#define VA_RENDER_DEVICE_UNDEFINED 0 |
|
#define VA_RENDER_DEVICE_LOCAL 1 |
|
#define VA_RENDER_DEVICE_EXTERNAL 2 |
|
|
|
/* Currently defined display attribute types */ |
|
typedef enum |
|
{ |
|
VADisplayAttribBrightness = 0, |
|
VADisplayAttribContrast = 1, |
|
VADisplayAttribHue = 2, |
|
VADisplayAttribSaturation = 3, |
|
/* client can specifiy a background color for the target window |
|
* the new feature of video conference, |
|
* the uncovered area of the surface is filled by this color |
|
* also it will blend with the decoded video color |
|
*/ |
|
VADisplayAttribBackgroundColor = 4, |
|
VADisplayAttribRotation = 6, |
|
VADisplayAttribOutofLoopDeblock = 7, |
|
|
|
/* |
|
* For type VADisplayAttribCSCMatrix, "value" field is a pointer to the color |
|
* conversion matrix. Each element in the matrix is float-point |
|
*/ |
|
VADisplayAttribCSCMatrix = 12, |
|
/* specify the constant color used to blend with video surface |
|
* Cd = Cv*Cc*Ac + Cb *(1 - Ac) C means the constant RGB |
|
* d: the final color to overwrite into the frame buffer |
|
* v: decoded video after color conversion, |
|
* c: video color specified by VADisplayAttribBlendColor |
|
* b: background color of the drawable |
|
*/ |
|
VADisplayAttribBlendColor = 13, |
|
/* |
|
* Indicate driver to skip painting color key or not. |
|
* only applicable if the render is overlay |
|
*/ |
|
VADisplayAttribOverlayAutoPaintColorKey = 14, |
|
/* |
|
* customized overlay color key, the format is RGB888 |
|
* [23:16] = Red, [15:08] = Green, [07:00] = Blue. |
|
*/ |
|
VADisplayAttribOverlayColorKey = 15, |
|
/* |
|
* The hint for the implementation of vaPutSurface |
|
* normally, the driver could use an overlay or GPU to render the surface on the screen |
|
* this flag provides APP the flexibity to switch the render dynamically |
|
*/ |
|
VADisplayAttribRenderMode = 16, |
|
/* |
|
* specify if vaPutSurface needs to render into specified monitors |
|
* one example is that one external monitor (e.g. HDMI) is enabled, |
|
* but the window manager is not aware of it, and there is no associated drawable |
|
*/ |
|
VADisplayAttribRenderDevice = 17, |
|
/* |
|
* specify vaPutSurface render area if there is no drawable on the monitor |
|
*/ |
|
VADisplayAttribRenderRect = 18, |
|
/* |
|
* The flag is used to indicate that the range flag of color-space conversion. |
|
* "value" field should be assigned as VA_SOURCE_RANGE_FULL or VA_SOURCE_RANGE_REDUCED |
|
* to indicate full range or reduced range |
|
*/ |
|
VADisplayAttribColorRange = 19, |
|
|
|
} VADisplayAttribType; |
|
|
|
/* flags for VADisplayAttribute */ |
|
#define VA_DISPLAY_ATTRIB_NOT_SUPPORTED 0x0000 |
|
#define VA_DISPLAY_ATTRIB_GETTABLE 0x0001 |
|
#define VA_DISPLAY_ATTRIB_SETTABLE 0x0002 |
|
|
|
typedef struct _VADisplayAttribute |
|
{ |
|
VADisplayAttribType type; |
|
int min_value; |
|
int max_value; |
|
int value; /* used by the set/get attribute functions */ |
|
/* flags can be VA_DISPLAY_ATTRIB_GETTABLE or VA_DISPLAY_ATTRIB_SETTABLE or OR'd together */ |
|
unsigned int flags; |
|
void *attrib_ptr; /* if flags contains VA_DISPLAY_ATTRIB_POINTER, then "attrib_ptr" points to a structure for this display attribute */ |
|
} VADisplayAttribute; |
|
|
|
/* Get maximum number of display attributs supported by the implementation */ |
|
int vaMaxNumDisplayAttributes ( |
|
VADisplay dpy |
|
); |
|
|
|
/* |
|
* Query display attributes |
|
* The caller must provide a "attr_list" array that can hold at |
|
* least vaMaxNumDisplayAttributes() entries. The actual number of attributes |
|
* returned in "attr_list" is returned in "num_attributes". |
|
*/ |
|
VAStatus vaQueryDisplayAttributes ( |
|
VADisplay dpy, |
|
VADisplayAttribute *attr_list, /* out */ |
|
int *num_attributes /* out */ |
|
); |
|
|
|
/* |
|
* Get display attributes |
|
* This function returns the current attribute values in "attr_list". |
|
* Only attributes returned with VA_DISPLAY_ATTRIB_GETTABLE set in the "flags" field |
|
* from vaQueryDisplayAttributes() can have their values retrieved. |
|
*/ |
|
VAStatus vaGetDisplayAttributes ( |
|
VADisplay dpy, |
|
VADisplayAttribute *attr_list, /* in/out */ |
|
int num_attributes |
|
); |
|
|
|
/* |
|
* Set display attributes |
|
* Only attributes returned with VA_DISPLAY_ATTRIB_SETTABLE set in the "flags" field |
|
* from vaQueryDisplayAttributes() can be set. If the attribute is not settable or |
|
* the value is out of range, the function returns VA_STATUS_ERROR_ATTR_NOT_SUPPORTED |
|
*/ |
|
VAStatus vaSetDisplayAttributes ( |
|
VADisplay dpy, |
|
VADisplayAttribute *attr_list, |
|
int num_attributes |
|
); |
|
|
|
/**@}*/ |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|
|
#endif /* _VA_H_ */
|
|
|