summaryrefslogtreecommitdiff
path: root/va
diff options
context:
space:
mode:
authorWang, Ce <ce.wang@intel.com>2014-12-23 09:21:13 +0800
committerXiang, Haihao <haihao.xiang@intel.com>2015-03-20 12:59:49 +0800
commit7e9b6ef9a21436d5cc9b3736cba633eede18182b (patch)
tree94aedc622ac009781b08f7431ab9b3999034031c /va
parent5af8f975c5dbe68f0039a61eb669eb2cf94e6c16 (diff)
HEVC encode APIskl-betav1.5-branch
Signed-off-by: Wang, Ce <ce.wang@intel.com> Signed-off-by: Xiang, Haihao <haihao.xiang@intel.com> (cherry picked from commit 9d128cf241830f7ead49fa5b104248b44c680873) Conflicts: va/Android.mk va/Makefile.am va/va.h
Diffstat (limited to 'va')
-rwxr-xr-xva/Android.mk1
-rw-r--r--va/Makefile.am1
-rw-r--r--va/va.h1
-rw-r--r--va/va_enc_hevc.h701
4 files changed, 704 insertions, 0 deletions
diff --git a/va/Android.mk b/va/Android.mk
index 5c5f763..c30d982 100755
--- a/va/Android.mk
+++ b/va/Android.mk
@@ -71,6 +71,7 @@ LOCAL_COPY_HEADERS := \
va_dec_hevc.h \
va_dec_jpeg.h \
va_drmcommon.h \
+ va_enc_hevc.h \
va_enc_jpeg.h \
va_enc_vp8.h \
va_version.h
diff --git a/va/Makefile.am b/va/Makefile.am
index 39e5a06..4c12f34 100644
--- a/va/Makefile.am
+++ b/va/Makefile.am
@@ -46,6 +46,7 @@ libva_source_h = \
va_dec_jpeg.h \
va_dec_vp8.h \
va_drmcommon.h \
+ va_enc_hevc.h \
va_enc_h264.h \
va_enc_jpeg.h \
va_enc_vp8.h \
diff --git a/va/va.h b/va/va.h
index b04f28a..cf89f88 100644
--- a/va/va.h
+++ b/va/va.h
@@ -2772,6 +2772,7 @@ typedef struct _VAPictureHEVC
#include <va/va_dec_hevc.h>
#include <va/va_dec_jpeg.h>
#include <va/va_dec_vp8.h>
+#include <va/va_enc_hevc.h>
#include <va/va_enc_h264.h>
#include <va/va_enc_jpeg.h>
#include <va/va_enc_mpeg2.h>
diff --git a/va/va_enc_hevc.h b/va/va_enc_hevc.h
new file mode 100644
index 0000000..c5ec795
--- /dev/null
+++ b/va/va_enc_hevc.h
@@ -0,0 +1,701 @@
+/*
+ * Copyright (c) 2007-2014 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_hevc.h
+ * \brief The HEVC encoding API
+ *
+ * This file contains the \ref api_enc_hevc "HEVC encoding API".
+ *
+ */
+
+#ifndef VA_ENC_HEVC_H
+#define VA_ENC_HEVC_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <stdint.h>
+
+/**
+ * \defgroup api_enc_hevc HEVC 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 HEVC_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 HEVC_LAST_PICTURE_EOSTREAM 0x02
+/**@}*/
+
+/**
+ * \brief Packed header types specific to HEVC encoding.
+ *
+ * Types of packed headers generally used for HEVC 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 Video Parameter Set (VPS).
+ *
+ * The corresponding packed header data buffer shall contain the
+ * complete video_parameter_set_rbsp() syntax element.
+ *
+ * Note: packed \c nal_unit_type shall be equal to 32.
+ */
+ VAEncPackedHeaderHEVC_VPS = VAEncPackedHeaderSequence,
+ /**
+ * \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 33.
+ */
+ VAEncPackedHeaderHEVC_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 34.
+ */
+ VAEncPackedHeaderHEVC_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 0 to 9 (non-IRAP
+ * picture), or 16 to 21 (IRAP picture).
+ */
+ VAEncPackedHeaderHEVC_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 39 or 40.
+ */
+ VAEncPackedHeaderHEVC_SEI = (VAEncPackedHeaderMiscMask | 1),
+} VAEncPackedHeaderTypeHEVC;
+
+/**
+ * \brief Sequence parameter for HEVC encoding in main & main 10
+ * profiles.
+ *
+ * This structure holds information for \c seq_parameter_set_data() as
+ * defined by the HEVC 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
+ * #VAQMatrixBufferHEVC buffer shall also be provided within the same
+ * \c vaRenderPicture() call as this sequence parameter buffer.
+ */
+typedef struct _VAEncSequenceParameterBufferHEVC {
+ /** \brief Same as the HEVC bitstream syntax element.
+ * value range [1..2].
+ */
+ uint8_t general_profile_idc;
+ /** \brief Same as the HEVC bitstream syntax element.
+ * general_level_idc shall be set equal to a value of 30 times the level
+ * numbers allowed [1, 2, 2.1, 3, 3.1, 4, 4.1, 5, 5.1, 5.2, 6, 6.1, 6.2]
+ */
+ uint8_t general_level_idc;
+ /** \brief Same as the HEVC bitstream syntax element.
+ * Only value 0 is allowed for level value below 4, exclusive.
+ */
+ uint8_t general_tier_flag;
+ /** \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 Picture width in pixel samples.
+ * Its value must be multiple of min CU size.
+ */
+ uint16_t pic_width_in_luma_samples;
+ /** \brief Picture height in pixel samples.
+ * Its value must be multiple of min CU size.
+ */
+ uint16_t pic_height_in_luma_samples;
+
+ union {
+ struct {
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t chroma_format_idc : 2;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t separate_colour_plane_flag : 1;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t bit_depth_luma_minus8 : 3;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t bit_depth_chroma_minus8 : 3;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t scaling_list_enabled_flag : 1;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t strong_intra_smoothing_enabled_flag : 1;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t amp_enabled_flag : 1;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t sample_adaptive_offset_enabled_flag : 1;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t pcm_enabled_flag : 1;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t pcm_loop_filter_disabled_flag : 1;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t sps_temporal_mvp_enabled_flag : 1;
+
+ uint32_t reserved_bits : 16;
+ } bits;
+ uint32_t value;
+ } seq_fields;
+
+ /** \brief Same as the HEVC bitstream syntax element.
+ * value range [0..3]
+ */
+ uint8_t log2_min_luma_coding_block_size_minus3;
+
+ /** \brief Same as the HEVC bitstream syntax element.
+ */
+ uint8_t log2_diff_max_min_luma_coding_block_size;
+
+ /** \brief Same as the HEVC bitstream syntax element.
+ * value range [0..3]
+ */
+ uint8_t log2_min_transform_block_size_minus2;
+
+ /** \brief Same as the HEVC bitstream syntax element.
+ */
+ uint8_t log2_diff_max_min_transform_block_size;
+
+ /** \brief Same as the HEVC bitstream syntax element.
+ * value range [2]
+ */
+ uint8_t max_transform_hierarchy_depth_inter;
+
+ /** \brief Same as the HEVC bitstream syntax element.
+ * value range [2]
+ */
+ uint8_t max_transform_hierarchy_depth_intra;
+
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t pcm_sample_bit_depth_luma_minus1;
+
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t pcm_sample_bit_depth_chroma_minus1;
+
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t log2_min_pcm_luma_coding_block_size_minus3;
+
+ /** \brief Derived from the HEVC bitstream syntax element.
+ * log2_min_pcm_luma_coding_block_size_minus3 +
+ * log2_diff_max_min_pcm_luma_coding_block_size
+ */
+ uint32_t log2_max_pcm_luma_coding_block_size_minus3;
+
+ /** @name VUI parameters (optional) */
+ /**@{*/
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint8_t vui_parameters_present_flag;
+ union {
+ struct {
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t aspect_ratio_info_present_flag : 1;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t neutral_chroma_indication_flag : 1;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t field_seq_flag : 1;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t vui_timing_info_present_flag : 1;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t bitstream_restriction_flag : 1;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t tiles_fixed_structure_flag : 1;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t motion_vectors_over_pic_boundaries_flag : 1;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t restricted_ref_pic_lists_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;
+ } bits;
+ uint32_t value;
+ } vui_fields;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint8_t aspect_ratio_idc;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t sar_width;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t sar_height;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t vui_num_units_in_tick;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint32_t vui_time_scale;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint16_t min_spatial_segmentation_idc;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint8_t max_bytes_per_pic_denom;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint8_t max_bits_per_min_cu_denom;
+ /**@}*/
+} VAEncSequenceParameterBufferHEVC;
+
+/****************************
+ * HEVC data structures
+ ****************************/
+/**
+ * \brief Picture parameter for HEVC encoding in main & main 10
+ * profiles.
+ *
+ * This structure holds information for \c pic_parameter_set_rbsp() as
+ * defined by the HEVC 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
+ * #VAQMatrixBufferHEVC buffer shall also be provided within the same
+ * \c vaRenderPicture() call as this picture parameter buffer.
+ */
+typedef struct _VAEncPictureParameterBufferHEVC {
+ /**
+ * \brief Information about the picture to be encoded.
+ *
+ * See #VAPictureHEVC for further description of each field.
+ * Note that decoded_curr_pic.picture_id represents the reconstructed
+ * (decoded) picture. User provides a scratch VA surface ID here.
+ * Long term reference and RPS related fields should be set to 0
+ * and ignored.
+ */
+ VAPictureHEVC decoded_curr_pic;
+ /**
+ * \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.
+ */
+ VAPictureHEVC reference_frames[15];
+ /**
+ * \brief Output encoded bitstream.
+ *
+ * \ref coded_buf has type #VAEncCodedBufferType. It should be
+ * large enough to hold the compressed NAL slice and possibly VPS, SPS
+ * and PPS NAL units, and other NAL units such as SEI.
+ */
+ VABufferID coded_buf;
+
+ /** \brief collocated reference picture buffer index of ReferenceFrames[].
+ * Please note it is different from HEVC syntac element collocated_ref_idx.
+ * When the HEVC syntax element slice_temporal_mvp_enable_flag takes value 0,
+ * collocated_ref_pic_index should take value 0xFF. .
+ * Range: [0..14, 0xFF]
+ */
+ uint8_t collocated_ref_pic_index;
+
+ /**
+ * \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 HEVC_LAST_PICTURE_EOSEQ or \ref HEVC_LAST_PICTURE_EOSTREAM.
+ */
+ uint8_t last_picture;
+
+ /** \brief \c init_qp_minus26 + 26. */
+ uint8_t pic_init_qp;
+
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint8_t diff_cu_qp_delta_depth;
+
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ int8_t pps_cb_qp_offset;
+
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ int8_t pps_cr_qp_offset;
+
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint8_t num_tile_columns_minus1;
+
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint8_t num_tile_rows_minus1;
+
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint8_t column_width_minus1[19];
+
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint8_t row_height_minus1[21];
+
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint8_t log2_parallel_merge_level_minus2;
+
+ /** \brief Application may set the CTU bit size limit based on
+ * spec requirement (A.3.2), or other value for special purpose.
+ * If the value is set 0, no bit size limit is checked.
+ */
+ uint8_t ctu_max_bitsize_allowed;
+
+ /** \brief Maximum reference index for reference picture list 0.
+ * value range: [0..14].
+ */
+ uint8_t num_ref_idx_l0_default_active_minus1;
+
+ /** \brief Maximum reference index for reference picture list 1.
+ * value range: [0..14].
+ */
+ uint8_t num_ref_idx_l1_default_active_minus1;
+
+ /** \brief PPS header
+ * Used by GPU to generate new slice headers in slice size control.
+ * value range: [0..63].
+ */
+ uint8_t slice_pic_parameter_set_id;
+
+ /** \brief NAL unit type
+ * Used by GPU to generate new slice headers in slice size control.
+ * value range: [0..63].
+ */
+ uint8_t nal_unit_type;
+
+ union {
+ struct {
+ /** \brief Is picture an IDR picture? */
+ uint32_t idr_pic_flag : 1;
+ /** \brief Picture type.
+ * I - 1;
+ * P - 2;
+ * B - 3;
+ * B1 - 4;
+ * B2 - 5;
+ * B1 and B2 are frame types for hierachical B, explanation
+ * can refer to num_b_in_gop[].
+ */
+ uint32_t coding_type : 3;
+ /** \brief Is picture a reference picture? */
+ uint32_t reference_pic_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t dependent_slice_segments_enabled_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t sign_data_hiding_enabled_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t constrained_intra_pred_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t transform_skip_enabled_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t cu_qp_delta_enabled_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t weighted_pred_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t weighted_bipred_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t transquant_bypass_enabled_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t tiles_enabled_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t entropy_coding_sync_enabled_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t loop_filter_across_tiles_enabled_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t pps_loop_filter_across_slices_enabled_flag : 1;
+ /** \brief A combination of HEVC syntax element of
+ * sps_scaling_list_data_present_flag and
+ * pps_scaling_list_data_present_flag
+ * when scaling_list_enable_flag is 0, it must be 0.
+ */
+ uint32_t scaling_list_data_present_flag : 1;
+ /** \brief indicate the current picture contains significant
+ * screen contents (text, characters, etc.) or animated image.
+ * GPU may want to treat them differently from normal video.
+ * For example, encoder may choose a small transform unit size
+ * and may use transform skip mode.
+ */
+ uint32_t screen_content_flag : 1;
+ /**
+ * When either weighted_pred_flag or weighted_bipred_flag is
+ * turned on, the flag enable_gpu_weighted_prediction requests
+ * GPU to determine weighted prediction factors. In this case,
+ * the following parameters in slice control data structure
+ * shall be ignored:
+ * luma_log2_weight_denom, delta_chroma_log2_weight_denom,
+ * luma_offset_l0[15], luma_offset_l1[15],
+ * delta_luma_weight_l0[15], delta_luma_weight_l1[15],
+ * chroma_offset_l0[15][2], chroma_offset_l1[15][2],
+ * and delta_chroma_weight_l0[15][2], delta_chroma_weight_l1[15][2].
+ */
+ uint32_t enable_gpu_weighted_prediction : 1;
+ /** \brief HEVC syntax element in slice segment header
+ * GPU uses it to generate new slice headers in slice size control.
+ */
+ uint32_t no_output_of_prior_pics_flag : 1;
+ uint32_t reserved : 11;
+ } bits;
+ uint32_t value;
+ } pic_fields;
+} VAEncPictureParameterBufferHEVC;
+
+/**
+ * \brief Slice parameter for HEVC encoding in main & main 10 profiles.
+ *
+ * This structure holds information for \c
+ * slice_segment_layer_rbsp() as defined by the HEVC
+ * 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.
+ *
+ */
+typedef struct _VAEncSliceParameterBufferHEVC {
+ /** \brief Starting MB address for this slice. */
+ uint32_t slice_segment_address;
+ /** \brief Number of CTUs in this slice. */
+ uint32_t num_ctu_in_slice;
+
+ /** \brief Slice type.
+ * Corresponds to HEVC syntax element of the same name.
+ */
+ uint8_t slice_type;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint8_t slice_pic_parameter_set_id;
+
+ /** \brief Maximum reference index for reference picture list 0.
+ * Range: 0 to 14, inclusive.
+ */
+ uint8_t num_ref_idx_l0_active_minus1;
+ /** \brief Maximum reference index for reference picture list 1.
+ * Range: 0 to 14, inclusive.
+ */
+ uint8_t num_ref_idx_l1_active_minus1;
+ /** \brief Reference picture list 0 (for P slices). */
+ VAPictureHEVC ref_pic_list0[15];
+ /** \brief Reference picture list 1 (for B slices). */
+ VAPictureHEVC ref_pic_list1[15];
+ /**@}*/
+
+ /** @name pred_weight_table() */
+ /**@{*/
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint8_t luma_log2_weight_denom;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ uint8_t delta_chroma_log2_weight_denom;
+ /** \brief Same as the HEVC bitstream syntax element. */
+ int8_t delta_luma_weight_l0[15];
+ /** \brief Same as the HEVC bitstream syntax element. */
+ int8_t luma_offset_l0[15];
+ /** \brief Same as the HEVC bitstream syntax element. */
+ int8_t delta_chroma_weight_l0[15][2];
+ /** \brief Same as the HEVC spec variable ChromaOffsetL0[]. */
+ int8_t chroma_offset_l0[15][2];
+ /** \brief Same as the HEVC bitstream syntax element. */
+ int8_t delta_luma_weight_l1[15];
+ /** \brief Same as the HEVC bitstream syntax element. */
+ int8_t luma_offset_l1[15];
+ /** \brief Same as the HEVC bitstream syntax element. */
+ int8_t delta_chroma_weight_l1[15][2];
+ /** \brief Same as the HEVC spec variable ChromaOffsetL1[]. */
+ int8_t chroma_offset_l1[15][2];
+ /**@}*/
+
+ /** \brief Corresponds to HEVC spec variable MaxNumMergeCand.
+ * Range: [1..5].
+ */
+ uint8_t max_num_merge_cand;
+
+ /** \brief Same as the HEVC bitstream syntax element. */
+ int8_t slice_qp_delta;
+
+ /** \brief Same as the HEVC bitstream syntax element. */
+ int8_t slice_cb_qp_offset;
+
+ /** \brief Same as the HEVC bitstream syntax element. */
+ int8_t slice_cr_qp_offset;
+
+ /** \brief Same as the HEVC bitstream syntax element. */
+ int8_t slice_beta_offset_div2;
+
+ /** \brief Same as the HEVC bitstream syntax element. */
+ int8_t slice_tc_offset_div2;
+
+ union {
+ struct {
+ /** \brief Indicates if current slice is the last one in picture */
+ uint32_t last_slice_of_pic_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name */
+ uint32_t dependent_slice_segment_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name */
+ uint32_t colour_plane_id : 2;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t slice_temporal_mvp_enabled_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t slice_sao_luma_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t slice_sao_chroma_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name.
+ * if this flag is set to 0, num_ref_idx_l0_active_minus1 should be
+ * equal to num_ref_idx_l0_default_active_minus1
+ * as well as for that for l1.
+ */
+ uint32_t num_ref_idx_active_override_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t mvd_l1_zero_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t cabac_init_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t slice_deblocking_filter_disabled_flag : 2;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t slice_loop_filter_across_slices_enabled_flag : 1;
+ /** \brief Corresponds to HEVC syntax element of the same name. */
+ uint32_t collocated_from_l0_flag : 1;
+ } bits;
+ uint32_t value;
+ } slice_fields;
+ /**@}*/
+} VAEncSliceParameterBufferHEVC;
+
+/**
+ * \brief HEVC Quantization Matrix Buffer Structure
+ *
+ * This structure is sent once per frame,
+ * and only when scaling_list_enabled_flag = 1 and scaling_list_data_present_flag = 1.
+ * Only when scaling_list_data_present_flag = 1, app still
+ * needs to send in this structure. When scaling_list_enabled_flag = 1 and
+ * scaling_list_data_present_flag = 0, driver is responsible to generate
+ * the default scaling list values.
+ *
+ * Matrix entries are in raster scan order which follows HEVC spec.
+ */
+typedef struct _VAQMatrixBufferHEVC
+{
+ /**
+ * \brief scaling lists,
+ * corresponds to same HEVC spec syntax element
+ * ScalingList[ i ][ MatrixID ][ j ].
+ *
+ * \brief 4x4 scaling,
+ */
+ uint8_t scaling_lists_4x4[3][2][16];
+ /**
+ * \brief 8x8 scaling,
+ */
+ uint8_t scaling_lists_8x8[3][2][64];
+ /**
+ * \brief 16x16 scaling,
+ * correspongs i = 2, MatrixID is in the range of 0 to 5,
+ * inclusive. And j is in the range of 0 to 63, inclusive.
+ */
+ uint8_t scaling_lists_16x16[3][2][64];
+ /**
+ * \brief 32x32 scaling,
+ * correspongs i = 3, MatrixID is in the range of 0 to 1,
+ * inclusive. And j is in the range of 0 to 63, inclusive.
+ */
+ uint8_t scaling_lists_32x32[2][64];
+ /**
+ * \brief DC values of the 16x16 scaling lists,
+ * corresponds to HEVC spec syntax
+ * scaling_list_dc_coef_minus8[ sizeID - 2 ][ matrixID ] + 8
+ * with sizeID = 2 and matrixID in the range of 0 to 5, inclusive.
+ */
+ uint8_t scaling_list_dc_16x16[3][2];
+ /**
+ * \brief DC values of the 32x32 scaling lists,
+ * corresponds to HEVC spec syntax
+ * scaling_list_dc_coef_minus8[ sizeID - 2 ][ matrixID ] + 8
+ * with sizeID = 3 and matrixID in the range of 0 to 1, inclusive.
+ */
+ uint8_t scaling_list_dc_32x32[2];
+} VAQMatrixBufferHEVC;
+
+/**@}*/
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* VA_ENC_HEVC_H */