summaryrefslogtreecommitdiffstats
path: root/va/va.h
diff options
context:
space:
mode:
Diffstat (limited to 'va/va.h')
-rwxr-xr-xva/va.h676
1 files changed, 461 insertions, 215 deletions
diff --git a/va/va.h b/va/va.h
index 0e10bd5..a4b184c 100755
--- a/va/va.h
+++ b/va/va.h
@@ -24,7 +24,7 @@
/*
* Video Acceleration (VA) API Specification
*
- * Rev. 0.30
+ * Rev. 0.32.2
* <jonathan.bian@intel.com>
*
* Revision History:
@@ -61,6 +61,9 @@
* 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
+ * rev 0.32.1 (05/04/2011) - Linux VA encoding API extension proposal
+ *
+ * rev 0.32.2 (07/05/2011 Jonathan Bian/Andrey Yakovenko) - Video Processing interface
*
* Acknowledgements:
* Some concepts borrowed from XvMC and XvImage.
@@ -68,6 +71,13 @@
* 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_
@@ -77,6 +87,30 @@
extern "C" {
#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
@@ -134,7 +168,20 @@ typedef int VAStatus; /* Return status type from functions */
#define VA_STATUS_ERROR_INVALID_IMAGE_FORMAT 0x00000016
#define VA_STATUS_ERROR_DECODING_ERROR 0x00000017
#define VA_STATUS_ERROR_ENCODING_ERROR 0x00000018
-#define VA_STATUS_ERROR_HW_BUSY 0x00000019
+/**
+ * \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
#define VA_STATUS_ERROR_UNKNOWN 0xFFFFFFFF
/* De-interlacing flags for vaPutSurface() */
@@ -239,8 +286,14 @@ typedef enum
VAProfileVC1Main = 9,
VAProfileVC1Advanced = 10,
VAProfileH263Baseline = 11,
- VAProfileJPEGBaseline = 12,
- VAProfileH264ConstrainedBaseline = 13
+ VAProfileJPEGBaseline = 12,
+ VAProfileH264ConstrainedBaseline = 13,
+ VAProfileH264MultiviewHigh = 14,
+ VAProfileH264StereoHigh = 15,
+ /** \brief Profile ID used for video processing. */
+ VAProfileNone = 16,
+ VAProfileVP8Version0_3 = 17,
+ VAProfileMax
} VAProfile;
/*
@@ -254,7 +307,9 @@ typedef enum
VAEntrypointMoComp = 4,
VAEntrypointDeblocking = 5,
VAEntrypointEncSlice = 6, /* slice level encode */
- VAEntrypointEncPicture = 7 /* pictuer encode, JPEG, etc */
+ VAEntrypointEncPicture = 7, /* pictuer encode, JPEG, etc */
+ VAEntrypointVideoProc = 10, /**< Video pre/post-processing. */
+ VAEntrypointMax
} VAEntrypoint;
/* Currently defined configuration attribute types */
@@ -265,7 +320,80 @@ typedef enum
VAConfigAttribSpatialClipping = 2,
VAConfigAttribIntraResidual = 3,
VAConfigAttribEncryption = 4,
- VAConfigAttribRateControl = 5
+ VAConfigAttribRateControl = 5,
+
+ /** @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,
+ /**@}*/
+
+ VAConfigAttribTypeMax
} VAConfigAttribType;
/*
@@ -279,82 +407,65 @@ typedef struct _VAConfigAttrib {
unsigned int value; /* OR'd flags (bits) for this attribute */
} VAConfigAttrib;
-typedef enum
-{
- VAGenericValueTypeInteger,
- VAGenericValueTypeFloat,
- VAGenericValueTypePointer,
-} VAGenericValueType;
-
-typedef struct _VAGenericValue {
- VAGenericValueType type;
- union
- {
- int i_val;
- float f_val;
- void *p_val;
- } value;
-} VAGenericValue;
-
-/*
- * Surface attributes are used for the client to query additional details
- * on the surface formats and types supported by the underlying implementation,
- * and convey its preferences to the implementation.
- */
-typedef enum
-{
- VASurfaceAttribPixelFormats, /* value is pointer to array of fourcc */
- VASurfaceAttribMinWidth, /* value is int */
- VASurfaceAttribMaxWidth, /* value is int */
- VASurfaceAttribMinHeight, /* value is int */
- VASurfaceAttribMaxHeight, /* value is int */
- VASurfaceAttribAlignment, /* value is int (bytes) */
- VASurfaceAttribNativeHandle /* value is void *p_val */
-} VASurfaceAttribType;
-
-/* value for "flags" in VASurfaceAttrib */
-#define VA_SURFACE_ATTRIB_NOT_SUPPORTED 0x00000000 /* not supported */
-#define VA_SURFACE_ATTRIB_GETTABLE 0x00000001 /* value is gettable */
-#define VA_SURFACE_ATTRIB_SETTABLE 0x00000002 /* value is settable */
-
-typedef struct _VASurfaceAttrib {
- VASurfaceAttribType type;
- unsigned int flags;
- VAGenericValue value;
-} VASurfaceAttrib;
-
-typedef enum {
- VAExternalMemoryAndroidGrallocBuffer, /* the memory is from Android Gralloc memory */
- VAExternalMemoryKernelDRMBufffer, /* the memory is from kernel DRM buffers */
- VAExternalMemoryUserPointer, /* the memory is malloc-ed and has a user pointer */
-} VAExternalMemoryType;
-
-typedef struct _VAExternalMemoryBuffers {
- VAExternalMemoryType type;
- unsigned int width;
- unsigned int height;
- unsigned int pixel_format; /* buffer format */
- unsigned int luma_stride; /* luma stride, could be width aligned with a special value */
- unsigned int chroma_u_stride; /* chroma stride */
- unsigned int chroma_v_stride;
- unsigned int luma_offset; /* could be 0 */
- unsigned int chroma_u_offset; /* UV offset from the beginning of the memory */
- unsigned int count; /* buffer count for surface creation */
- unsigned int *buffers; /* buffer handles or user pointers */
- void *native_window; /*native window pointer*/
-} VAExternalMemoryBuffers;
-
/* 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_PROTECTED 0x80000000
-/* attribute value for VAConfigAttribRateControl */
-#define VA_RC_NONE 0x00000001
-#define VA_RC_CBR 0x00000002
-#define VA_RC_VBR 0x00000004
-#define VA_RC_VCM 0x00000008 /* video conference mode */
+/** @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
+/**@}*/
+
+/** @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
+/**@}*/
+
+/** @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
+/**@}*/
/*
* if an attribute is not applicable for a given
@@ -462,21 +573,6 @@ VAStatus vaQueryConfigAttributes (
int *num_attribs /* out */
);
-/* Get maximum number of surface attributs supported by the implementation */
-int vaMaxNumSurfaceAttributes (
- VADisplay dpy
-);
-
-/*
- * Query the implementation on what surface attributes are supported
- * depending on the intended usage for the surfaces.
- */
-VAStatus vaQuerySurfaceAttributes (
- VADisplay dpy,
- VAConfigID config,
- VASurfaceAttrib *attrib_list, /* in/out */
- int num_attribs
-);
/*
* Contexts and Surfaces
@@ -501,26 +597,133 @@ typedef VAGenericID VASurfaceID;
#define VA_INVALID_ID 0xffffffff
#define VA_INVALID_SURFACE VA_INVALID_ID
-/*
- * vaCreateSurfaces - Create an array of surfaces used for decode and display
- * dpy: display
- * width: surface width
- * height: surface height
- * format: VA_RT_FORMAT_YUV420, VA_RT_FORMAT_YUV422 or VA_RT_FORMAT_YUV444
- * num_surfaces: number of surfaces to be created
- * surfaces: array of surfaces created upon return
- * attrib_list: attributes for the surfaces to be created
- * num_attribs: number of attributes in attrib_list
- */
-VAStatus vaCreateSurfaces (
- VADisplay dpy,
- int width,
- int height,
- int format,
- int num_surfaces,
- VASurfaceID *surfaces, /* out */
- VASurfaceAttrib *attrib_list,
- int num_attribs
+/** \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/write). */
+ 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 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;
+
+/**
+ * \brief Get surface attributes for the supplied config.
+ *
+ * This function retrieves the surface attributes matching the supplied
+ * config. The caller shall provide an \c attrib_list with all attributes
+ * to be retrieved. Upon successful return, the attributes in \c attrib_list
+ * are updated with the requested value. Unknown attributes or attributes
+ * that are not supported for the given config will have their \c flags
+ * field set to \c VA_SURFACE_ATTRIB_NOT_SUPPORTED.
+ *
+ * @param[in] dpy the VA display
+ * @param[in] config the config identifying a codec or a video
+ * processing pipeline
+ * @param[in,out] attrib_list the list of attributes on input, with at
+ * least \c type fields filled in, and possibly \c value fields whenever
+ * necessary. The updated list of attributes and flags on output
+ * @param[in] num_attribs the number of attributes supplied in the
+ * \c attrib_list array
+ */
+VAStatus
+vaGetSurfaceAttributes(
+ 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 verified through vaGetSurfaceAttributes().
+ *
+ * @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
);
/*
@@ -595,15 +798,39 @@ typedef enum
VAImageBufferType = 9,
VAProtectedSliceDataBufferType = 10,
VAQMatrixBufferType = 11,
+ VAHuffmanTableBufferType = 12,
+ VAProbabilityBufferType = 13,
/* Following are encode buffer types */
VAEncCodedBufferType = 21,
VAEncSequenceParameterBufferType = 22,
VAEncPictureParameterBufferType = 23,
VAEncSliceParameterBufferType = 24,
- VAEncH264VUIBufferType = 25,
- VAEncH264SEIBufferType = 26,
+ VAEncPackedHeaderParameterBufferType = 25,
+ VAEncPackedHeaderDataBufferType = 26,
VAEncMiscParameterBufferType = 27,
- VABufferTypeMax = 0xff
+ VAEncMacroblockParameterBufferType = 28,
+/* 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,
+ VABufferTypeMax
} VABufferType;
typedef enum
@@ -612,9 +839,34 @@ typedef enum
VAEncMiscParameterTypeRateControl = 1,
VAEncMiscParameterTypeMaxSliceSize = 2,
VAEncMiscParameterTypeAIR = 3,
- VAEncMiscParameterTypeHRD = 4
+ /** \brief Buffer type used to express a maximum frame size (in bits). */
+ VAEncMiscParameterTypeMaxFrameSize = 4,
+ /** \brief Buffer type used for HRD parameters. */
+ VAEncMiscParameterTypeHRD = 5,
} 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 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;
@@ -638,16 +890,25 @@ typedef struct _VAEncMiscParameterBuffer
unsigned int data[0];
} VAEncMiscParameterBuffer;
+
+/** \brief Rate control parameters */
typedef struct _VAEncMiscParameterRateControl
{
- unsigned int bits_per_second; /* this is the maximum bit-rate to be constrained by the rate control implementation */
- unsigned int target_percentage; /* 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 window_size; /* 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 initial_qp; /* initial QP at I frames */
+ /* 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 at I frames */
+ unsigned int initial_qp;
unsigned int min_qp;
+ unsigned int basic_unit_size;
union
{
struct
@@ -655,7 +916,6 @@ typedef struct _VAEncMiscParameterRateControl
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 : 29;
} bits;
unsigned int value;
} rc_flags;
@@ -685,10 +945,26 @@ typedef struct _VAEncMiscParameterAIR
typedef struct _VAEncMiscParameterHRD
{
- unsigned int buffer_size; /* in bits */
- unsigned int initial_buffer_fullness; /* in bits */
+ unsigned int initial_buffer_fullness; /* in bits */
+ 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;
+
/*
* 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
@@ -1225,9 +1501,20 @@ typedef struct _VAIQMatrixBufferH264
typedef struct _VASliceParameterBufferH264
{
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 NAL start code 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 */
- unsigned short slice_data_bit_offset; /* bit offset from NAL start code to the beginning of slice data */
+ /**
+ * \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;
@@ -1283,58 +1570,6 @@ typedef struct _VAEncSliceParameterBuffer
} VAEncSliceParameterBuffer;
/****************************
- * H.264 specific encode data structures
- ****************************/
-
-typedef struct _VAEncSequenceParameterBufferH264
-{
- unsigned char seq_parameter_set_id;
- unsigned char level_idc;
- unsigned int intra_period;
- unsigned int intra_idr_period;
- unsigned int max_num_ref_frames;
- unsigned int picture_width_in_mbs;
- unsigned int picture_height_in_mbs;
- unsigned int bits_per_second;
- unsigned int frame_rate;
- unsigned int initial_qp;
- unsigned int min_qp;
- unsigned int basic_unit_size;
-
- /** \brief Same as the H.264 bitstream syntax element. */
- unsigned char frame_cropping_flag;
- /** \brief Same as the H.264 bitstream syntax element. */
- unsigned int frame_crop_left_offset;
- /** \brief Same as the H.264 bitstream syntax element. */
- unsigned int frame_crop_right_offset;
- /** \brief Same as the H.264 bitstream syntax element. */
- unsigned int frame_crop_top_offset;
- /** \brief Same as the H.264 bitstream syntax element. */
- unsigned int frame_crop_bottom_offset;
- /** \brief Same as the H.264 bitstream syntax element. */
- unsigned char aspect_ratio_info_present_flag;
- /** \brief Same as the H.264 bitstream syntax element. */
- unsigned char vui_flag;
- unsigned char aspect_ratio_idc;
- /** \brief Same as the H.264 bitstream syntax element. */
- unsigned int sar_width;
- /** \brief Same as the H.264 bitstream syntax element. */
- unsigned int sar_height;
-} VAEncSequenceParameterBufferH264;
-
-#define H264_LAST_PICTURE_EOSEQ 0x01 /* the last picture in the sequence */
-#define H264_LAST_PICTURE_EOSTREAM 0x02 /* the last picture in the stream */
-typedef struct _VAEncPictureParameterBufferH264
-{
- VASurfaceID reference_picture;
- VASurfaceID reconstructed_picture;
- VABufferID coded_buf;
- unsigned short picture_width;
- unsigned short picture_height;
- unsigned char last_picture;
-} VAEncPictureParameterBufferH264;
-
-/****************************
* H.263 specific encode data structures
****************************/
@@ -1442,26 +1677,59 @@ VAStatus vaBufferSetNumElements (
* 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
- * AVC_SINGLE_NALU(bit31): indicate the segment only contains one AVC NALU
*/
#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
-#define VA_CODED_BUF_STATUS_AVC_SINGLE_NALU 0x80000000
-/*
- * device independent data structure for codedbuffer
+/**
+ * \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 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 {
- unsigned int size;/* size of the data buffer in the coded buffer segment, in bytes */
- unsigned int bit_offset; /* bit offset into the data buffer where valid bitstream data begins */
- unsigned int status; /* status set by the driver on the coded buffer*/
- unsigned int reserved; /* for future use */
- void *buf; /* pointer to the beginning of the data buffer in the coded buffer segment */
- void *next; /* pointer to the next 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;
/*
@@ -1627,6 +1895,8 @@ VAStatus vaQuerySurfaceError(
#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
/* byte order */
#define VA_LSB_FIRST 1
@@ -1954,15 +2224,6 @@ typedef struct _VARectangle
* attributes are supported by the driver, and then set the appropriate attributes
* before calling vaPutSurface()
*/
-/* PowerVR IEP Lite attributes */
-typedef enum
-{
- VADISPLAYATTRIB_BLE_OFF = 0x00,
- VADISPLAYATTRIB_BLE_LOW,
- VADISPLAYATTRIB_BLE_MEDIUM,
- VADISPLAYATTRIB_BLE_HIGH,
- VADISPLAYATTRIB_BLE_NONE,
-} VADisplayAttribBLEMode;
/* attribute value for VADisplayAttribRotation */
#define VA_ROTATION_NONE 0x00000000
@@ -1999,26 +2260,9 @@ typedef enum
* also it will blend with the decoded video color
*/
VADisplayAttribBackgroundColor = 4,
- /*
- * this is a gettable only attribute. For some implementations that use the
- * hardware overlay, after PutSurface is called, the surface can not be
- * re-used until after the subsequent PutSurface call. If this is the case
- * then the value for this attribute will be set to 1 so that the client
- * will not attempt to re-use the surface right after returning from a call
- * to PutSurface.
- *
- * Don't use it, use flag VASurfaceDisplaying of vaQuerySurfaceStatus since
- * driver may use overlay or GPU alternatively
- */
- VADisplayAttribDirectSurface = 5,
VADisplayAttribRotation = 6,
VADisplayAttribOutofLoopDeblock = 7,
- /* PowerVR IEP Lite specific attributes */
- VADisplayAttribBLEBlackMode = 8,
- VADisplayAttribBLEWhiteMode = 9,
- VADisplayAttribBlueStretch = 10,
- VADisplayAttribSkinColorCorrection = 11,
/*
* For type VADisplayAttribCSCMatrix, "value" field is a pointer to the color
* conversion matrix. Each element in the matrix is float-point
@@ -2116,6 +2360,8 @@ VAStatus vaSetDisplayAttributes (
int num_attributes
);
+/**@}*/
+
#ifdef __cplusplus
}
#endif