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.
790 lines
30 KiB
790 lines
30 KiB
/* |
|
* Copyright (c) 2007-2011 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. |
|
*/ |
|
|
|
/** |
|
* \file va_enc_h264.h |
|
* \brief The H.264 encoding API |
|
* |
|
* This file contains the \ref api_enc_h264 "H.264 encoding API". |
|
*/ |
|
|
|
#ifndef VA_ENC_H264_H |
|
#define VA_ENC_H264_H |
|
|
|
#ifdef __cplusplus |
|
extern "C" { |
|
#endif |
|
|
|
#include <stdint.h> |
|
#include <va/va_enc.h> |
|
|
|
/** |
|
* \defgroup api_enc_h264 H.264 encoding API |
|
* |
|
* @{ |
|
*/ |
|
|
|
/** |
|
* @name Picture flags |
|
* |
|
* Those flags flags are meant to signal when a picture marks the end |
|
* of a sequence, a stream, or even both at once. |
|
* |
|
* @{ |
|
*/ |
|
/** |
|
* \brief Marks the last picture in the sequence. |
|
* |
|
* i.e. the driver appends \c end_of_seq() NAL unit to the encoded frame. |
|
*/ |
|
#define H264_LAST_PICTURE_EOSEQ VA_ENC_LAST_PICTURE_EOSEQ |
|
/** |
|
* \brief Marks the last picture in the stream. |
|
* |
|
* i.e. the driver appends \c end_of_stream() NAL unit to the encoded frame. |
|
*/ |
|
#define H264_LAST_PICTURE_EOSTREAM VA_ENC_LAST_PICTURE_EOSTREAM |
|
/**@}*/ |
|
|
|
/** |
|
* \brief Packed header types specific to H.264 encoding. |
|
* |
|
* Types of packed headers generally used for H.264 encoding. Each |
|
* associated packed header data buffer shall contain the start code |
|
* prefix 0x000001 followed by the complete NAL unit, thus also |
|
* including the \c nal_unit_type. |
|
* |
|
* Note: the start code prefix can contain an arbitrary number of leading |
|
* zeros. The driver will skip them for emulation prevention bytes insertion, |
|
* if necessary. |
|
*/ |
|
typedef enum { |
|
/** |
|
* \brief Packed Sequence Parameter Set (SPS). |
|
* |
|
* The corresponding packed header data buffer shall contain the |
|
* complete seq_parameter_set_rbsp() syntax element. |
|
* |
|
* Note: packed \c nal_unit_type shall be equal to 7. |
|
*/ |
|
VAEncPackedHeaderH264_SPS = VAEncPackedHeaderSequence, |
|
/** |
|
* \brief Packed Picture Parameter Set (PPS). |
|
* |
|
* The corresponding packed header data buffer shall contain the |
|
* complete pic_parameter_set_rbsp() syntax element. |
|
* |
|
* Note: packed \c nal_unit_type shall be equal to 8. |
|
*/ |
|
VAEncPackedHeaderH264_PPS = VAEncPackedHeaderPicture, |
|
/** |
|
* \brief Packed slice header. |
|
* |
|
* The corresponding packed header data buffer shall contain the |
|
* \c slice_header() syntax element only, along with any start |
|
* code prefix and NAL unit type preceeding it. i.e. this means |
|
* that the buffer does not contain any of the \c slice_data() or |
|
* the \c rbsp_slice_trailing_bits(). |
|
* |
|
* Note: packed \c nal_unit_type shall be equal to 1 (non-IDR |
|
* picture), or 5 (IDR picture). |
|
*/ |
|
VAEncPackedHeaderH264_Slice = VAEncPackedHeaderSlice, |
|
/** |
|
* \brief Packed Supplemental Enhancement Information (SEI). |
|
* |
|
* The corresponding packed header data buffer shall contain the |
|
* complete sei_rbsp() syntax element, thus including several |
|
* sei_message() elements if necessary. |
|
* |
|
* Note: packed \c nal_unit_type shall be equal to 6. |
|
*/ |
|
VAEncPackedHeaderH264_SEI = (VAEncPackedHeaderMiscMask | 1), |
|
} VAEncPackedHeaderTypeH264; |
|
|
|
/** |
|
* \brief Sequence parameter for H.264 encoding in baseline, main & high |
|
* profiles. |
|
* |
|
* This structure holds information for \c seq_parameter_set_data() as |
|
* defined by the H.264 specification. |
|
* |
|
* If packed sequence headers mode is used, i.e. if the encoding |
|
* pipeline was configured with the #VA_ENC_PACKED_HEADER_SEQUENCE |
|
* flag, then the driver expects two more buffers to be provided to |
|
* the same \c vaRenderPicture() as this buffer: |
|
* - a #VAEncPackedHeaderParameterBuffer with type set to |
|
* VAEncPackedHeaderType::VAEncPackedHeaderSequence ; |
|
* - a #VAEncPackedHeaderDataBuffer which holds the actual packed |
|
* header data. |
|
* |
|
* If \c seq_scaling_matrix_present_flag is set to \c 1, then a |
|
* #VAIQMatrixBufferH264 buffer shall also be provided within the same |
|
* \c vaRenderPicture() call as this sequence parameter buffer. |
|
*/ |
|
typedef struct _VAEncSequenceParameterBufferH264 { |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned char seq_parameter_set_id; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned char level_idc; |
|
/** \brief Period between I frames. */ |
|
unsigned int intra_period; |
|
/** \brief Period between IDR frames. */ |
|
unsigned int intra_idr_period; |
|
/** \brief Period between I/P frames. */ |
|
unsigned int ip_period; |
|
/** |
|
* \brief Initial bitrate set for this sequence in CBR or VBR modes. |
|
* |
|
* This field represents the initial bitrate value for this |
|
* sequence if CBR or VBR mode is used, i.e. if the encoder |
|
* pipeline was created with a #VAConfigAttribRateControl |
|
* attribute set to either \ref VA_RC_CBR or \ref VA_RC_VBR. |
|
* |
|
* The bitrate can be modified later on through |
|
* #VAEncMiscParameterRateControl buffers. |
|
*/ |
|
unsigned int bits_per_second; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int max_num_ref_frames; |
|
/** \brief Picture width in macroblocks. */ |
|
unsigned short picture_width_in_mbs; |
|
/** \brief Picture height in macroblocks. */ |
|
unsigned short picture_height_in_mbs; |
|
|
|
union { |
|
struct { |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int chroma_format_idc : 2; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int frame_mbs_only_flag : 1; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int mb_adaptive_frame_field_flag : 1; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int seq_scaling_matrix_present_flag : 1; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int direct_8x8_inference_flag : 1; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int log2_max_frame_num_minus4 : 4; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int pic_order_cnt_type : 2; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int log2_max_pic_order_cnt_lsb_minus4 : 4; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int delta_pic_order_always_zero_flag : 1; |
|
} bits; |
|
unsigned int value; |
|
} seq_fields; |
|
|
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned char bit_depth_luma_minus8; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned char bit_depth_chroma_minus8; |
|
|
|
/** if pic_order_cnt_type == 1 */ |
|
/**@{*/ |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned char num_ref_frames_in_pic_order_cnt_cycle; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
int offset_for_non_ref_pic; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
int offset_for_top_to_bottom_field; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
int offset_for_ref_frame[256]; |
|
/**@}*/ |
|
|
|
/** @name Cropping (optional) */ |
|
/**@{*/ |
|
/** \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; |
|
/**@}*/ |
|
|
|
/** @name VUI parameters (optional) */ |
|
/**@{*/ |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned char vui_parameters_present_flag; |
|
union { |
|
struct { |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int aspect_ratio_info_present_flag : 1; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int timing_info_present_flag : 1; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int bitstream_restriction_flag : 1; |
|
/** \brief Range: 0 to 16, inclusive. */ |
|
unsigned int log2_max_mv_length_horizontal : 5; |
|
/** \brief Range: 0 to 16, inclusive. */ |
|
unsigned int log2_max_mv_length_vertical : 5; |
|
} bits; |
|
unsigned int value; |
|
} vui_fields; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
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; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int num_units_in_tick; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int time_scale; |
|
/**@}*/ |
|
} VAEncSequenceParameterBufferH264; |
|
|
|
/** |
|
* \brief Picture parameter for H.264 encoding in baseline, main & high |
|
* profiles. |
|
* |
|
* This structure holds information for \c pic_parameter_set_rbsp() as |
|
* defined by the H.264 specification. |
|
* |
|
* If packed picture headers mode is used, i.e. if the encoding |
|
* pipeline was configured with the #VA_ENC_PACKED_HEADER_PICTURE |
|
* flag, then the driver expects two more buffers to be provided to |
|
* the same \c vaRenderPicture() as this buffer: |
|
* - a #VAEncPackedHeaderParameterBuffer with type set to |
|
* VAEncPackedHeaderType::VAEncPackedHeaderPicture ; |
|
* - a #VAEncPackedHeaderDataBuffer which holds the actual packed |
|
* header data. |
|
* |
|
* If \c pic_scaling_matrix_present_flag is set to \c 1, then a |
|
* #VAIQMatrixBufferH264 buffer shall also be provided within the same |
|
* \c vaRenderPicture() call as this picture parameter buffer. |
|
*/ |
|
typedef struct _VAEncPictureParameterBufferH264 { |
|
/** |
|
* \brief Information about the picture to be encoded. |
|
* |
|
* See #VAPictureH264 for further description of each field. |
|
* Note that CurrPic.picture_id represents the reconstructed |
|
* (decoded) picture. User provides a scratch VA surface ID here. |
|
*/ |
|
VAPictureH264 CurrPic; |
|
/** |
|
* \brief Decoded Picture Buffer (DPB). |
|
* |
|
* This array represents the list of reconstructed (decoded) |
|
* frames used as reference. It is important to keep track of |
|
* reconstructed frames so that they can be used later on as |
|
* reference for P or B-frames encoding. |
|
*/ |
|
VAPictureH264 ReferenceFrames[16]; |
|
/** |
|
* \brief Output encoded bitstream. |
|
* |
|
* \ref coded_buf has type #VAEncCodedBufferType. It should be |
|
* large enough to hold the compressed NAL slice and possibly SPS |
|
* and PPS NAL units. |
|
*/ |
|
VABufferID coded_buf; |
|
|
|
/** \brief The picture parameter set referred to in the slice header. */ |
|
unsigned char pic_parameter_set_id; |
|
/** \brief The active sequence parameter set. Range: 0 to 31, inclusive. */ |
|
unsigned char seq_parameter_set_id; |
|
|
|
/** |
|
* \brief OR'd flags describing whether the picture is the last one or not. |
|
* |
|
* This fields holds 0 if the picture to be encoded is not the last |
|
* one in the stream or sequence. Otherwise, it is a combination of |
|
* \ref H264_LAST_PICTURE_EOSEQ or \ref H264_LAST_PICTURE_EOSTREAM. |
|
*/ |
|
unsigned char last_picture; |
|
|
|
/** \brief The picture identifier. |
|
* Range: 0 to \f$2^{log2\_max\_frame\_num\_minus4 + 4} - 1\f$, inclusive. |
|
*/ |
|
unsigned short frame_num; |
|
|
|
/** \brief \c pic_init_qp_minus26 + 26. */ |
|
unsigned char pic_init_qp; |
|
/** \brief Maximum reference index for reference picture list 0. |
|
* Range: 0 to 31, inclusive. |
|
*/ |
|
unsigned char num_ref_idx_l0_active_minus1; |
|
/** \brief Maximum reference index for reference picture list 1. |
|
* Range: 0 to 31, inclusive. |
|
*/ |
|
unsigned char num_ref_idx_l1_active_minus1; |
|
|
|
/** \brief Range: -12 to 12, inclusive. */ |
|
signed char chroma_qp_index_offset; |
|
/** \brief Range: -12 to 12, inclusive. */ |
|
signed char second_chroma_qp_index_offset; |
|
|
|
union { |
|
struct { |
|
/** \brief Is picture an IDR picture? */ |
|
unsigned int idr_pic_flag : 1; |
|
/** \brief Is picture a reference picture? */ |
|
unsigned int reference_pic_flag : 2; |
|
/** \brief Selects CAVLC (0) or CABAC (1) entropy coding mode. */ |
|
unsigned int entropy_coding_mode_flag : 1; |
|
/** \brief Is weighted prediction applied to P slices? */ |
|
unsigned int weighted_pred_flag : 1; |
|
/** \brief Range: 0 to 2, inclusive. */ |
|
unsigned int weighted_bipred_idc : 2; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int constrained_intra_pred_flag : 1; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int transform_8x8_mode_flag : 1; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int deblocking_filter_control_present_flag : 1; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int redundant_pic_cnt_present_flag : 1; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int pic_order_present_flag : 1; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned int pic_scaling_matrix_present_flag : 1; |
|
} bits; |
|
unsigned int value; |
|
} pic_fields; |
|
} VAEncPictureParameterBufferH264; |
|
|
|
/** |
|
* \brief Slice parameter for H.264 encoding in baseline, main & high profiles. |
|
* |
|
* This structure holds information for \c |
|
* slice_layer_without_partitioning_rbsp() as defined by the H.264 |
|
* specification. |
|
* |
|
* If packed slice headers mode is used, i.e. if the encoding |
|
* pipeline was configured with the #VA_ENC_PACKED_HEADER_SLICE |
|
* flag, then the driver expects two more buffers to be provided to |
|
* the same \c vaRenderPicture() as this buffer: |
|
* - a #VAEncPackedHeaderParameterBuffer with type set to |
|
* VAEncPackedHeaderType::VAEncPackedHeaderSlice ; |
|
* - a #VAEncPackedHeaderDataBuffer which holds the actual packed |
|
* header data. |
|
* |
|
* If per-macroblock encoder configuration is needed, \c macroblock_info |
|
* references a buffer of type #VAEncMacroblockParameterBufferH264. This |
|
* buffer is not passed to vaRenderPicture(). i.e. it is not destroyed |
|
* by subsequent calls to vaRenderPicture() and then can be re-used |
|
* without re-allocating the whole buffer. |
|
*/ |
|
typedef struct _VAEncSliceParameterBufferH264 { |
|
/** \brief Starting MB address for this slice. */ |
|
unsigned int macroblock_address; |
|
/** \brief Number of macroblocks in this slice. */ |
|
unsigned int num_macroblocks; |
|
/** |
|
* \brief Per-MB encoder configuration buffer, or \c VA_INVALID_ID. |
|
* |
|
* If per-MB encoder configuration is needed, then \ref macroblock_info |
|
* references a buffer of type #VAEncMacroblockParameterBufferH264 |
|
* (\c VAEncMacroblockParameterBufferType). Otherwise, buffer id |
|
* is set to \c VA_INVALID_ID and per-MB configuration is derived |
|
* from this slice parameter. |
|
* |
|
* The \c macroblock_info buffer must hold \ref num_macroblocks |
|
* elements. |
|
*/ |
|
VABufferID macroblock_info; |
|
/** \brief Slice type. |
|
* Range: 0..2, 5..7, i.e. no switching slices. |
|
*/ |
|
unsigned char slice_type; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned char pic_parameter_set_id; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned short idr_pic_id; |
|
|
|
/** @name If pic_order_cnt_type == 0 */ |
|
/**@{*/ |
|
/** \brief The picture order count modulo MaxPicOrderCntLsb. */ |
|
unsigned short pic_order_cnt_lsb; |
|
/** \brief Valid if \c pic_order_present_flag and this is a bottom field. */ |
|
int delta_pic_order_cnt_bottom; |
|
/**@}*/ |
|
/** @name If pic_order_cnt_type == 1 && !delta_pic_order_always_zero_flag */ |
|
/**@{*/ |
|
/** \brief [0]: top, [1]: bottom. */ |
|
int delta_pic_order_cnt[2]; |
|
/**@}*/ |
|
|
|
/** @name If slice_type == B */ |
|
/**@{*/ |
|
unsigned char direct_spatial_mv_pred_flag; |
|
/**@}*/ |
|
|
|
/** @name If slice_type == P */ |
|
/**@{*/ |
|
/** \brief Specifies if |
|
* \ref _VAEncPictureParameterBufferH264::num_ref_idx_l0_active_minus1 or |
|
* \ref _VAEncPictureParameterBufferH264::num_ref_idx_l1_active_minus1 are |
|
* overriden by the values for this slice. |
|
*/ |
|
unsigned char num_ref_idx_active_override_flag; |
|
/** \brief Maximum reference index for reference picture list 0. |
|
* Range: 0 to 31, inclusive. |
|
*/ |
|
unsigned char num_ref_idx_l0_active_minus1; |
|
/** \brief Maximum reference index for reference picture list 1. |
|
* Range: 0 to 31, inclusive. |
|
*/ |
|
unsigned char num_ref_idx_l1_active_minus1; |
|
/** \brief Reference picture list 0 (for P slices). */ |
|
VAPictureH264 RefPicList0[32]; |
|
/** \brief Reference picture list 1 (for B slices). */ |
|
VAPictureH264 RefPicList1[32]; |
|
/**@}*/ |
|
|
|
/** @name pred_weight_table() */ |
|
/**@{*/ |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned char luma_log2_weight_denom; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned char chroma_log2_weight_denom; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned char luma_weight_l0_flag; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
signed short luma_weight_l0[32]; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
signed short luma_offset_l0[32]; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned char chroma_weight_l0_flag; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
signed short chroma_weight_l0[32][2]; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
signed short chroma_offset_l0[32][2]; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned char luma_weight_l1_flag; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
signed short luma_weight_l1[32]; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
signed short luma_offset_l1[32]; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
unsigned char chroma_weight_l1_flag; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
signed short chroma_weight_l1[32][2]; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
signed short chroma_offset_l1[32][2]; |
|
/**@}*/ |
|
|
|
/** \brief Range: 0 to 2, inclusive. */ |
|
unsigned char cabac_init_idc; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
signed char slice_qp_delta; |
|
/** @name If deblocking_filter_control_present_flag */ |
|
/**@{*/ |
|
/** \brief Range: 0 to 2, inclusive. */ |
|
unsigned char disable_deblocking_filter_idc; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
signed char slice_alpha_c0_offset_div2; |
|
/** \brief Same as the H.264 bitstream syntax element. */ |
|
signed char slice_beta_offset_div2; |
|
/**@}*/ |
|
} VAEncSliceParameterBufferH264; |
|
|
|
/** |
|
* @name Macroblock neighbour availability bits |
|
* |
|
* \anchor api_enc_h264_mb_pred_avail_bits |
|
* Definitions for macroblock neighbour availability bits used in |
|
* intra prediction mode (non MBAFF only). |
|
* |
|
* @{ |
|
*/ |
|
/** \brief References macroblock in the top-left corner. */ |
|
#define VA_MB_PRED_AVAIL_TOP_LEFT (1 << 2) |
|
/** \brief References macroblock above the current macroblock. */ |
|
#define VA_MB_PRED_AVAIL_TOP (1 << 4) |
|
/** \brief References macroblock in the top-right corner. */ |
|
#define VA_MB_PRED_AVAIL_TOP_RIGHT (1 << 3) |
|
/** \brief References macroblock on the left of the current macroblock. */ |
|
#define VA_MB_PRED_AVAIL_LEFT (1 << 6) |
|
/**@}*/ |
|
|
|
/** |
|
* \brief Macroblock parameter for H.264 encoding in baseline, main & high |
|
* profiles. |
|
* |
|
* This structure holds per-macroblock information. The buffer must be |
|
* allocated with as many elements (macroblocks) as necessary to fit |
|
* the slice to be encoded. Besides, the per-macroblock records must |
|
* be written in a strict raster order and with no gap. i.e. every |
|
* macroblock, regardless of its type, shall have an entry. |
|
*/ |
|
typedef struct _VAEncMacroblockParameterBufferH264 { |
|
/** |
|
* \brief Quantization parameter. |
|
* |
|
* Requested quantization parameter. Range: 0 to 51, inclusive. |
|
* If \ref qp is set to 0xff, then the actual value is derived |
|
* from the slice-level value: \c pic_init_qp + \c slice_qp_delta. |
|
*/ |
|
unsigned char qp; |
|
|
|
union { |
|
/** @name Data for intra macroblock */ |
|
/**@{*/ |
|
struct { |
|
union { |
|
/** |
|
* \brief Flag specified to override MB neighbour |
|
* availability bits from VME stage. |
|
* |
|
* This flag specifies that macroblock neighbour |
|
* availability bits from the VME stage are overriden |
|
* by the \ref pred_avail_flags hereunder. |
|
*/ |
|
unsigned int pred_avail_override_flag : 1; |
|
/** |
|
* \brief Bitwise representation of which macroblocks |
|
* are available for intra prediction. |
|
* |
|
* If the slice is intra-coded, this field represents |
|
* the macroblocks available for intra prediction. |
|
* See \ref api_enc_h264_mb_pred_avail_bits |
|
* "macroblock neighbour availability" bit definitions. |
|
*/ |
|
unsigned int pred_avail_flags : 8; |
|
} bits; |
|
unsigned int value; |
|
} intra_fields; |
|
/**@}*/ |
|
|
|
/** @name Data for inter macroblock */ |
|
/**@{*/ |
|
struct { |
|
union { |
|
} bits; |
|
unsigned int value; |
|
} inter_fields; |
|
/**@}*/ |
|
} info; |
|
} VAEncMacroblockParameterBufferH264; |
|
|
|
/** |
|
* \brief H.264 Mutiview Coding(MVC) Sequence Parameter Buffer |
|
* |
|
*/ |
|
typedef struct _VAEncSequenceParameterBufferH264_MVC { |
|
/** brief Basic common sequence parameter */ |
|
VAEncSequenceParameterBufferH264 base; |
|
|
|
/** brief Plus 1 specify the max number of views |
|
* coded in the video sequence |
|
*/ |
|
uint16_t num_views_minus1; |
|
|
|
/** brief Specify the view information in all layers */ |
|
struct H264SPSExtMVCViewInfo{ |
|
/** \brief The current view identifier. */ |
|
uint16_t view_id; |
|
/** \brief Specifies the number of view components for inter-view |
|
* prediction in the initialized RefPicList0 in decoding |
|
* anchor views. |
|
*/ |
|
uint8_t num_anchor_refs_l0; |
|
/** \brief Specifies the view_id for inter-view prediction in |
|
* the initialized RefPicList0 in decoding anchor views. |
|
*/ |
|
uint16_t anchor_ref_l0[15]; |
|
/** \brief Specifies the number of view components for inter-view |
|
* prediction in the initialized RefPicList1 in decoding |
|
* anchor views |
|
*/ |
|
uint8_t num_anchor_refs_l1; |
|
/** \brief Specifies the view_id for inter-view prediction in |
|
* the initialized RefPicList1 in decoding anchor views. |
|
*/ |
|
uint16_t anchor_ref_l1[15]; |
|
/** \brief Specifies the number of view components for inter-view |
|
* prediction in the initialized RefPicList0 in decoding |
|
* non-anchor views. |
|
*/ |
|
uint8_t num_non_anchor_refs_l0; |
|
/** \brief Specifies the view_id for inter-view prediction in |
|
* the initialized RefPicList0 in decoding non-anchor views. |
|
*/ |
|
uint16_t non_anchor_ref_l0[15]; |
|
/** \brief Specifies the number of view components for inter-view |
|
* prediction in the initialized RefPicList1 in decoding |
|
* non-anchor view. |
|
*/ |
|
uint8_t num_non_anchor_refs_l1; |
|
/** \brief Specifies the view_id for inter-view prediction in |
|
* the initialized RefPicList1 in decoding non-anchor views. |
|
*/ |
|
uint16_t non_anchor_ref_l1[15]; |
|
}* view_list; |
|
|
|
/** brief Plus 1 specifies the number of level values |
|
* signalled for the coded video sequence |
|
*/ |
|
uint8_t num_level_values_signalled_minus1; |
|
|
|
/** brief Level values operation for a set of the operation |
|
* points in the current sequence |
|
*/ |
|
struct H264SPSExtMVCLevelValue { |
|
/** \brief Specifies the level value signalled for the coded video sequence */ |
|
uint8_t level_idc; |
|
|
|
/** \brief Plus 1 specifies the number of operation points to |
|
* which the level indicated by level_idc applies |
|
*/ |
|
uint16_t num_applicable_ops_minus1; |
|
|
|
/** \brief Represent the specific operation to the view in the video sequence */ |
|
struct H264SPSExtMVCLevelValueOps { |
|
/** \brief Specify a temporal identifier for the NAL unit */ |
|
uint8_t temporal_id; |
|
/** \brief Specify the number of the views whose level value will be modified */ |
|
uint16_t num_target_views_minus1; |
|
/** \brief Specify the views whose level value will be modified */ |
|
uint16_t* target_view_id_list; |
|
/** \brief Specify the number of views whose level value can be modified */ |
|
uint16_t num_views_minus1; |
|
}* level_value_ops_list; |
|
|
|
}* level_value_list; |
|
|
|
} VAEncSequenceParameterBufferH264_MVC; |
|
|
|
/** |
|
* \brief H.264 Multiview Coding(MVC) Picture Parameter Buffer |
|
* |
|
*/ |
|
typedef struct _VAEncPictureParameterBufferH264_MVC |
|
{ |
|
/** brief Basic common picture parameter */ |
|
VAEncPictureParameterBufferH264 base; |
|
|
|
/** brief Specifes the view id for current picture */ |
|
uint16_t view_id; |
|
|
|
/** brief Specifes whether the picture is one anchor picture */ |
|
uint8_t anchor_pic_flag; |
|
|
|
/** brief Specifes whether inter view reference frame |
|
* is used to encode current picture. |
|
*/ |
|
uint8_t inter_view_flag; |
|
} VAEncPictureParameterBufferH264_MVC; |
|
|
|
typedef struct _VAEncQpBufferH264 { |
|
/* |
|
* \brief This structure holds luma Qp per 16x16 macroblock. Buffer size shall be |
|
* sufficient to fit the slice or frame to be encoded depending on if it is a slice level |
|
* or frame level encoding. |
|
*/ |
|
unsigned char qp_y; |
|
} VAEncQpBufferH264; |
|
|
|
/** \brief Bitstream writer attribute types specific to H.264 encoding. */ |
|
typedef enum { |
|
/** |
|
* \brief Flag: specifies whether to insert emulation prevention |
|
* bytes (integer). |
|
*/ |
|
VAEncBitstreamAttribEmulationPreventionH264 = ( |
|
VAEncBitstreamAttribMiscMask | 1), |
|
} VAEncBitstreamAttribTypeH264; |
|
|
|
|
|
/** |
|
* \brief Allocates a new H.264 bitstream writer. |
|
* |
|
* Allocates a new bitstream writer. By default, libva allocates and |
|
* maintains its own buffer. However, the user can pass down his own |
|
* buffer with the \c VAEncBitstreamAttribBuffer attribute, along with |
|
* the size of that buffer with the \c VAEncBitstreamAttribBufferSize |
|
* attribute. |
|
* |
|
* By default, emulation prevention bytes are not inserted. However, |
|
* the user can still request emulation prevention by setting the |
|
* \c VAEncBitstreamAttribEmulationPreventionH264 attribute to 1. |
|
* |
|
* @param[in] attribs the optional attributes, or NULL |
|
* @param[in] num_attribs the number of attributes available in \c attribs |
|
* @return a new #VAEncBitstream, or NULL if an error occurred |
|
*/ |
|
VAEncBitstream * |
|
va_enc_bitstream_h264_new( |
|
VAEncBitstreamAttrib *attribs, |
|
unsigned int num_attribs |
|
); |
|
|
|
/** |
|
* \brief Destroys an H.264 bitstream writer. |
|
* |
|
* @param[in] bs the bitstream writer to destroy |
|
*/ |
|
void |
|
va_enc_bitstream_h264_destroy(VAEncBitstream *bs); |
|
|
|
/** |
|
* \brief Writes an unsigned integer as \c ue(v). |
|
* |
|
* Writes a 32-bit unsigned int value by following \c ue(v) from the |
|
* H.264 specification. |
|
* |
|
* @param[in] bs the bitstream writer |
|
* @param[in] value the unsigned int value |
|
* @return the number of bits written, or a negative value to indicate an error |
|
*/ |
|
int |
|
va_enc_bitstream_h264_write_ue(VAEncBitstream *bs, unsigned int value); |
|
|
|
/** |
|
* \brief Writes a signed integer as \c se(v). |
|
* |
|
* Writes a 32-bit signed int value by following \c se(v) from the |
|
* H.264 specification. |
|
* |
|
* @param[in] bs the bitstream writer |
|
* @param[in] value the signed int value |
|
* @return the number of bits written, or a negative value to indicate an error |
|
*/ |
|
int |
|
va_enc_bitstream_h264_write_se(VAEncBitstream *bs, int value); |
|
|
|
/** |
|
* \brief Helper function to write trailing bits into the bitstream. |
|
* |
|
* @param[in] bs the bitstream writer |
|
* @return the number of bits written, or a negative value to indicate an error |
|
*/ |
|
int |
|
va_enc_bitstream_h264_write_trailing_bits(VAEncBitstream *bs); |
|
|
|
/**@}*/ |
|
|
|
#ifdef __cplusplus |
|
} |
|
#endif |
|
|
|
#endif /* VA_ENC_H264_H */
|
|
|