[Encode] Add hevc reference framework

1. Add hevc codecPicture frameIdx map;
2. Add basic framework support on hevc B frame;
diff --git a/media_driver/agnostic/common/codec/shared/codec_def_encode.h b/media_driver/agnostic/common/codec/shared/codec_def_encode.h
index 4ab3622..a4b337d 100644
--- a/media_driver/agnostic/common/codec/shared/codec_def_encode.h
+++ b/media_driver/agnostic/common/codec/shared/codec_def_encode.h
@@ -162,6 +162,7 @@
     bool                            fullHeaderInAppData;         //!< [JPEG]
     uint32_t                        uiOverallNALPayload;
     MetaDataOffset                  metaDataOffset;
+    void *                          pSliceHeaderParams;         //!< [HEVC]
 };
 
 #endif // !__CODEC_DEF_ENCODE_H__
diff --git a/media_driver/agnostic/common/codec/shared/codec_def_encode_hevc.h b/media_driver/agnostic/common/codec/shared/codec_def_encode_hevc.h
index 0c677ed..61177f3 100644
--- a/media_driver/agnostic/common/codec/shared/codec_def_encode_hevc.h
+++ b/media_driver/agnostic/common/codec/shared/codec_def_encode_hevc.h
@@ -1096,4 +1096,28 @@
     uint32_t                    dwNumPasses;    //number of QPs
     uint8_t                    *pDeltaQp;       //list of detla QPs
 };
+
+//!
+//! \struct    CodecEncodeHevcSSHParams
+//! \brief     Codec encode HEVC Slice Header params
+//!
+struct CodecEncodeHevcSliceHeaderParams
+{
+    uint8_t                     log2_max_pic_order_cnt_lsb_minus4; //Hevc slice header packer use
+    uint8_t                     num_long_term_pics;
+    struct LongTermRef
+    {
+        uint8_t                 used_by_curr_pic_lt_flag : 1;
+        uint8_t                 delta_poc_msb_present_flag : 1;
+        uint32_t                poc_lsb_lt;
+        uint32_t                delta_poc_msb_cycle_lt;
+    } lt[8];
+    uint8_t                     lists_modification_present_flag;
+    uint8_t                     ref_pic_list_modification_flag_lx[2];
+    uint8_t                     list_entry_lx[2][16];
+    uint8_t                     num_negative_pics;
+    uint8_t                     num_positive_pics;
+    uint16_t                    delta_poc_minus1[2][16];
+    bool                        used_by_curr_pic_flag[2][16];
+};
 #endif  // __CODEC_DEF_ENCODE_HEVC_H__
diff --git a/media_driver/media_driver_next/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_header_packer.cpp b/media_driver/media_driver_next/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_header_packer.cpp
index 7c9c78f..20b94bb 100644
--- a/media_driver/media_driver_next/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_header_packer.cpp
+++ b/media_driver/media_driver_next/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_header_packer.cpp
@@ -66,7 +66,7 @@
 {
     m_ppsParams.dependent_slice_segments_enabled_flag       = hevcPicParams->dependent_slice_segments_enabled_flag;
     m_ppsParams.num_extra_slice_header_bits                 = 0;
-    m_ppsParams.output_flag_present_flag                    = 1;
+    m_ppsParams.output_flag_present_flag                    = 0;
     m_ppsParams.lists_modification_present_flag             = 0;                                    //NA
     m_ppsParams.cabac_init_present_flag                     = 1;                                    //NA
     m_ppsParams.weighted_pred_flag                          = hevcPicParams->weighted_pred_flag;    //NA
@@ -102,7 +102,6 @@
     {
         m_sliceParams.lt[i] = {};
     }                                                    //NA
-    m_sliceParams.short_term_ref_pic_set_sps_flag = 1;   //NA
     m_sliceParams.short_term_ref_pic_set_idx      = 0;   //NA
     m_sliceParams.strps                           = {};  //NA
     m_sliceParams.num_long_term_sps               = 0;   //NA
@@ -115,7 +114,7 @@
     m_sliceParams.num_ref_idx_l1_active_minus1    = hevcSliceParams.num_ref_idx_l1_active_minus1;  //NA
     //m_sliceParams.ref_pic_list_modification_flag_lx={0};//NA
     //m_sliceParams.list_entry_lx=0;//NA
-    m_sliceParams.num_ref_idx_active_override_flag       = 0;                                    //NA
+    m_sliceParams.num_ref_idx_active_override_flag       = 1;                                    //NA
     m_sliceParams.mvd_l1_zero_flag                       = hevcSliceParams.mvd_l1_zero_flag;     //NA
     m_sliceParams.cabac_init_flag                        = hevcSliceParams.cabac_init_flag;      //NA
     m_sliceParams.five_minus_max_num_merge_cand          = 5 - hevcSliceParams.MaxNumMergeCand;  //NA
@@ -470,6 +469,53 @@
     return !!nSE;
 }
 
+MOS_STATUS HevcHeaderPacker::LoadSliceHeaderParams(CodecEncodeHevcSliceHeaderParams* pSH)
+{
+    CODECHAL_ENCODE_CHK_NULL_RETURN(pSH);
+
+    m_spsParams.log2_max_pic_order_cnt_lsb_minus4       = pSH->log2_max_pic_order_cnt_lsb_minus4;
+    m_sliceParams.num_long_term_pics                    = pSH->num_long_term_pics;
+    for (int i = 0; i < m_sliceParams.num_long_term_pics; i++)
+    {
+        m_sliceParams.lt[i].used_by_curr_pic_lt_flag   = pSH->lt[i].used_by_curr_pic_lt_flag;
+        m_sliceParams.lt[i].delta_poc_msb_present_flag = pSH->lt[i].delta_poc_msb_present_flag;
+        m_sliceParams.lt[i].poc_lsb_lt                 = pSH->lt[i].poc_lsb_lt;
+        m_sliceParams.lt[i].delta_poc_msb_cycle_lt     = pSH->lt[i].delta_poc_msb_cycle_lt;
+    }
+    m_ppsParams.lists_modification_present_flag         = pSH->lists_modification_present_flag;
+    for (int i = 0; i < 2; i++)
+    {
+        m_sliceParams.ref_pic_list_modification_flag_lx[i] = pSH->ref_pic_list_modification_flag_lx[i];
+        for (int j = 0; j < 16; j++)
+        {
+            m_sliceParams.list_entry_lx[i][j] = pSH->list_entry_lx[i][j];
+        }
+    }
+    m_sliceParams.strps.num_negative_pics                   = pSH->num_negative_pics;
+    m_sliceParams.strps.num_positive_pics                   = pSH->num_positive_pics;
+
+    if (pSH->num_negative_pics > 16 || pSH->num_positive_pics > 16 || pSH->num_negative_pics + pSH->num_positive_pics > 16)
+    {
+        return MOS_STATUS_INVALID_PARAMETER;
+    }
+
+    for (int i = 0; i < pSH->num_negative_pics + pSH->num_positive_pics; i++)
+    {
+        if (i < pSH->num_negative_pics)
+        {
+            m_sliceParams.strps.pic[i].delta_poc_s0_minus1      = pSH->delta_poc_minus1[0][i];
+            m_sliceParams.strps.pic[i].used_by_curr_pic_s0_flag = pSH->used_by_curr_pic_flag[0][i];
+        }
+        else
+        {
+            m_sliceParams.strps.pic[i].delta_poc_s1_minus1      = pSH->delta_poc_minus1[1][i - pSH->num_negative_pics];
+            m_sliceParams.strps.pic[i].used_by_curr_pic_s1_flag = pSH->used_by_curr_pic_flag[1][i - pSH->num_negative_pics];
+        }
+    }
+
+    return MOS_STATUS_SUCCESS;
+}
+
 MOS_STATUS HevcHeaderPacker::SliceHeaderPacker(EncoderParams *encodeParams)
 {
     MOS_OS_FUNCTION_ENTER;
@@ -482,20 +528,22 @@
     mfxU32          BitLenRecorded = 0;
 
     EncoderParams *pCodecHalEncodeParams = encodeParams;
-    MOS_OS_CHK_NULL_RETURN(pCodecHalEncodeParams);
-    BSBuffer *pBSBuffer;
-    pBSBuffer = pCodecHalEncodeParams->pBSBuffer;
-    MOS_OS_CHK_NULL_RETURN(pBSBuffer);
+    CODECHAL_ENCODE_CHK_NULL_RETURN(pCodecHalEncodeParams);
+    BSBuffer *pBSBuffer = pCodecHalEncodeParams->pBSBuffer;
+    CODECHAL_ENCODE_CHK_NULL_RETURN(pBSBuffer);
     PCODEC_ENCODER_SLCDATA pSlcData = (PCODEC_ENCODER_SLCDATA)pCodecHalEncodeParams->pSlcHeaderData;
-    eStatus = GetSPSParams(static_cast<PCODEC_HEVC_ENCODE_SEQUENCE_PARAMS>(encodeParams->pSeqParams));
-    eStatus = GetPPSParams(static_cast<PCODEC_HEVC_ENCODE_PICTURE_PARAMS>(encodeParams->pPicParams));
-    eStatus = GetNaluParams(nalType, 0, 0, pBSBuffer->pCurrent == pBSBuffer->pBase);
+    CODECHAL_ENCODE_CHK_STATUS_RETURN(GetSPSParams(static_cast<PCODEC_HEVC_ENCODE_SEQUENCE_PARAMS>(encodeParams->pSeqParams)));
+    CODECHAL_ENCODE_CHK_STATUS_RETURN(GetPPSParams(static_cast<PCODEC_HEVC_ENCODE_PICTURE_PARAMS>(encodeParams->pPicParams)));
+    CODECHAL_ENCODE_CHK_STATUS_RETURN(GetNaluParams(nalType, 0, 0, pBSBuffer->pCurrent == pBSBuffer->pBase));
+
     //uint8_t *pCurrent = pBSBuffer->pCurrent;
     //uint32_t
     for (uint32_t startLcu = 0, slcCount = 0; slcCount < encodeParams->dwNumSlices; slcCount++)
     {
         //startLcu += m_hevcSliceParams[slcCount].NumLCUsInSlice;
-        eStatus = GetSliceParams(static_cast<PCODEC_HEVC_ENCODE_SLICE_PARAMS>(encodeParams->pSliceParams)[slcCount]);
+        CODECHAL_ENCODE_CHK_STATUS_RETURN(GetSliceParams(static_cast<PCODEC_HEVC_ENCODE_SLICE_PARAMS>(encodeParams->pSliceParams)[slcCount]));
+        CODECHAL_ENCODE_CHK_STATUS_RETURN(LoadSliceHeaderParams((CodecEncodeHevcSliceHeaderParams*) pCodecHalEncodeParams->pSliceHeaderParams));
+        
         rbsp.Reset(pBegin, mfxU32(pEnd - pBegin));
         m_naluParams.long_start_code = 0/*pBSBuffer->pCurrent + (BitLenRecorded + 7) / 8 == pBSBuffer->pBase*/;
         PackSSH(rbsp, m_naluParams, m_spsParams, m_ppsParams, m_sliceParams, false);
diff --git a/media_driver/media_driver_next/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_header_packer.h b/media_driver/media_driver_next/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_header_packer.h
index 2bacae5..ff1a10a 100644
--- a/media_driver/media_driver_next/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_header_packer.h
+++ b/media_driver/media_driver_next/agnostic/common/codec/hal/enc/hevc/features/encode_hevc_header_packer.h
@@ -496,6 +496,7 @@
     MOS_STATUS GetPPSParams(PCODEC_HEVC_ENCODE_PICTURE_PARAMS hevcPicParams);
     MOS_STATUS GetSPSParams(PCODEC_HEVC_ENCODE_SEQUENCE_PARAMS hevcSeqParams);
     MOS_STATUS GetSliceParams(const CODEC_HEVC_ENCODE_SLICE_PARAMS hevcSliceParams);
+    MOS_STATUS LoadSliceHeaderParams(CodecEncodeHevcSliceHeaderParams* pSH);
     void       PackSSH(
               BitstreamWriter &bs,
               HevcNALU const & nalu,