[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,