/* * 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 /** * \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 0x01 /** * \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 0x02 /**@}*/ /** * \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. * * @deprecated * This is a deprecated packed header flag, All applications can use * \c VA_ENC_PACKED_HEADER_RAW_DATA to pass the corresponding packed * SEI header data buffer to the driver */ VAEncPackedHeaderH264_SEI va_deprecated_enum = (0x80000000 | 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. */ uint8_t seq_parameter_set_id; /** \brief Same as the H.264 bitstream syntax element. */ uint8_t level_idc; /** \brief Period between I frames. */ uint32_t intra_period; /** \brief Period between IDR frames. */ uint32_t intra_idr_period; /** \brief Period between I/P frames. */ uint32_t 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. */ uint32_t bits_per_second; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t max_num_ref_frames; /** \brief Picture width in macroblocks. */ uint16_t picture_width_in_mbs; /** \brief Picture height in macroblocks. */ uint16_t picture_height_in_mbs; union { struct { /** \brief Same as the H.264 bitstream syntax element. */ uint32_t chroma_format_idc : 2; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t frame_mbs_only_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t mb_adaptive_frame_field_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t seq_scaling_matrix_present_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t direct_8x8_inference_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t log2_max_frame_num_minus4 : 4; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t pic_order_cnt_type : 2; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t log2_max_pic_order_cnt_lsb_minus4 : 4; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t delta_pic_order_always_zero_flag : 1; } bits; uint32_t value; } seq_fields; /** \brief Same as the H.264 bitstream syntax element. */ uint8_t bit_depth_luma_minus8; /** \brief Same as the H.264 bitstream syntax element. */ uint8_t bit_depth_chroma_minus8; /** if pic_order_cnt_type == 1 */ /**@{*/ /** \brief Same as the H.264 bitstream syntax element. */ uint8_t num_ref_frames_in_pic_order_cnt_cycle; /** \brief Same as the H.264 bitstream syntax element. */ int32_t offset_for_non_ref_pic; /** \brief Same as the H.264 bitstream syntax element. */ int32_t offset_for_top_to_bottom_field; /** \brief Same as the H.264 bitstream syntax element. */ int32_t offset_for_ref_frame[256]; /**@}*/ /** @name Cropping (optional) */ /**@{*/ /** \brief Same as the H.264 bitstream syntax element. */ uint8_t frame_cropping_flag; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t frame_crop_left_offset; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t frame_crop_right_offset; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t frame_crop_top_offset; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t frame_crop_bottom_offset; /**@}*/ /** @name VUI parameters (optional) */ /**@{*/ /** \brief Same as the H.264 bitstream syntax element. */ uint8_t vui_parameters_present_flag; union { struct { /** \brief Same as the H.264 bitstream syntax element. */ uint32_t aspect_ratio_info_present_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t timing_info_present_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t bitstream_restriction_flag : 1; /** \brief Range: 0 to 16, inclusive. */ uint32_t log2_max_mv_length_horizontal : 5; /** \brief Range: 0 to 16, inclusive. */ uint32_t log2_max_mv_length_vertical : 5; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t fixed_frame_rate_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t low_delay_hrd_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t motion_vectors_over_pic_boundaries_flag: 1; /** \brief Reserved for future use, must be zero */ uint32_t reserved : 16; } bits; uint32_t value; } vui_fields; /** \brief Same as the H.264 bitstream syntax element. */ uint8_t aspect_ratio_idc; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t sar_width; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t sar_height; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t num_units_in_tick; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t time_scale; /** \brief Reserved bytes for future use, must be zero */ uint32_t va_reserved[VA_PADDING_LOW]; /**@}*/ } 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. */ uint8_t pic_parameter_set_id; /** \brief The active sequence parameter set. Range: 0 to 31, inclusive. */ uint8_t 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. */ uint8_t last_picture; /** \brief The picture identifier. * Range: 0 to \f$2^{log2\_max\_frame\_num\_minus4 + 4} - 1\f$, inclusive. */ uint16_t frame_num; /** \brief \c pic_init_qp_minus26 + 26. */ uint8_t pic_init_qp; /** \brief Maximum reference index for reference picture list 0. * Range: 0 to 31, inclusive. */ uint8_t num_ref_idx_l0_active_minus1; /** \brief Maximum reference index for reference picture list 1. * Range: 0 to 31, inclusive. */ uint8_t num_ref_idx_l1_active_minus1; /** \brief Range: -12 to 12, inclusive. */ int8_t chroma_qp_index_offset; /** \brief Range: -12 to 12, inclusive. */ int8_t second_chroma_qp_index_offset; union { struct { /** \brief Is picture an IDR picture? */ uint32_t idr_pic_flag : 1; /** \brief Is picture a reference picture? */ uint32_t reference_pic_flag : 2; /** \brief Selects CAVLC (0) or CABAC (1) entropy coding mode. */ uint32_t entropy_coding_mode_flag : 1; /** \brief Is weighted prediction applied to P slices? */ uint32_t weighted_pred_flag : 1; /** \brief Range: 0 to 2, inclusive. */ uint32_t weighted_bipred_idc : 2; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t constrained_intra_pred_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t transform_8x8_mode_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t deblocking_filter_control_present_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t redundant_pic_cnt_present_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t pic_order_present_flag : 1; /** \brief Same as the H.264 bitstream syntax element. */ uint32_t pic_scaling_matrix_present_flag : 1; } bits; uint32_t value; } pic_fields; /** \brief Reserved bytes for future use, must be zero */ uint32_t va_reserved[VA_PADDING_LOW]; } VAEncPictureParameterBufferH264; typedef struct _VAEncQPBufferH264 { /* * \brief This structure holds 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. */ uint8_t qp; } VAEncQPBufferH264; /** * \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() and it can be re-used * without re-allocating the whole buffer. */ typedef struct _VAEncSliceParameterBufferH264 { /** \brief Starting MB address for this slice. */ uint32_t macroblock_address; /** \brief Number of macroblocks in this slice. */ uint32_t 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. */ uint8_t slice_type; /** \brief Same as the H.264 bitstream syntax element. */ uint8_t pic_parameter_set_id; /** \brief Same as the H.264 bitstream syntax element. */ uint16_t idr_pic_id; /** @name If pic_order_cnt_type == 0 */ /**@{*/ /** \brief The picture order count modulo MaxPicOrderCntLsb. */ uint16_t pic_order_cnt_lsb; /** \brief Valid if \c pic_order_present_flag and this is a bottom field. */ int32_t delta_pic_order_cnt_bottom; /**@}*/ /** @name If pic_order_cnt_type == 1 && !delta_pic_order_always_zero_flag */ /**@{*/ /** \brief [0]: top, [1]: bottom. */ int32_t delta_pic_order_cnt[2]; /**@}*/ /** @name If slice_type == B */ /**@{*/ uint8_t 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. */ uint8_t num_ref_idx_active_override_flag; /** \brief Maximum reference index for reference picture list 0. * Range: 0 to 31, inclusive. */ uint8_t num_ref_idx_l0_active_minus1; /** \brief Maximum reference index for reference picture list 1. * Range: 0 to 31, inclusive. */ uint8_t 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. */ uint8_t luma_log2_weight_denom; /** \brief Same as the H.264 bitstream syntax element. */ uint8_t chroma_log2_weight_denom; /** \brief Same as the H.264 bitstream syntax element. */ uint8_t 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. */ uint8_t 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. */ uint8_t 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. */ uint8_t 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. */ uint8_t cabac_init_idc; /** \brief Same as the H.264 bitstream syntax element. */ int8_t slice_qp_delta; /** @name If deblocking_filter_control_present_flag */ /**@{*/ /** \brief Range: 0 to 2, inclusive. */ uint8_t disable_deblocking_filter_idc; /** \brief Same as the H.264 bitstream syntax element. */ int8_t slice_alpha_c0_offset_div2; /** \brief Same as the H.264 bitstream syntax element. */ int8_t slice_beta_offset_div2; /** \brief Reserved bytes for future use, must be zero */ uint32_t va_reserved[VA_PADDING_LOW]; /**@}*/ } 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. */ uint8_t qp; union { /** @name Data for intra macroblock */ /**@{*/ union { struct { /** * \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. */ uint32_t 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. */ uint32_t pred_avail_flags : 8; } bits; uint32_t value; } intra_fields; /**@}*/ /** @name Data for inter macroblock */ /**@{*/ union { struct { uint32_t reserved; } bits; uint32_t value; } inter_fields; /**@}*/ } info; /** \brief Reserved bytes for future use, must be zero */ uint32_t va_reserved[VA_PADDING_LOW]; } VAEncMacroblockParameterBufferH264; /** * \brief MB partition modes and 1/2 1/4 motion search configuration * * Specifies MB partition modes that are disabled. Specifies Half-pel * mode and Quarter-pel mode searching */ typedef struct _VAEncMiscParameterSubMbPartPelH264 { uint32_t disable_inter_sub_mb_partition; union { struct { uint32_t disable_16x16_inter_mb_partition : 1; uint32_t disable_16x8_inter_mb_partition : 1; uint32_t disable_8x16_inter_mb_partition : 1; uint32_t disable_8x8_inter_mb_partition : 1; uint32_t disable_8x4_inter_mb_partition : 1; uint32_t disable_4x8_inter_mb_partition : 1; uint32_t disable_4x4_inter_mb_partition : 1; uint32_t reserved : 1; } bits; uint8_t value; } inter_sub_mb_partition_mask; /** * \brief Precison of motion search * 0:Integer mode searching * 1:Half-pel mode searching * 2:Reserved * 3:Quarter-pel mode searching */ uint32_t enable_sub_pel_mode; uint8_t sub_pel_mode; uint8_t reserved[3]; } VAEncMiscParameterSubMbPartPelH264; /**@}*/ #ifdef __cplusplus } #endif #endif /* VA_ENC_H264_H */