[Encode] Enable ARB for TCBRC on ICL
Enable adaptive region boost for TCBRC on ICL.
diff --git a/media_driver/agnostic/common/codec/hal/codechal_huc_cmd_initializer.cpp b/media_driver/agnostic/common/codec/hal/codechal_huc_cmd_initializer.cpp
index d277a9c..4441f22 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_huc_cmd_initializer.cpp
+++ b/media_driver/agnostic/common/codec/hal/codechal_huc_cmd_initializer.cpp
@@ -341,6 +341,7 @@
bool brcEnabled,
bool streaminEnabled,
bool roiStreamInEnabled,
+ bool brcAdaptiveRegionBoostEnable,
bool roundingEnabled,
bool panicEnabled,
int32_t currentPass
@@ -378,6 +379,7 @@
m_panicEnabled = panicEnabled;
m_roiStreamInEnabled = roiStreamInEnabled;
m_currentPass = currentPass;
+ m_brcAdaptiveRegionBoostEnabled = brcAdaptiveRegionBoostEnable;
MOS_ZeroMemory(&lockFlagsWriteOnly, sizeof(MOS_LOCK_PARAMS));
lockFlagsWriteOnly.WriteOnly = 1;
diff --git a/media_driver/agnostic/common/codec/hal/codechal_huc_cmd_initializer.h b/media_driver/agnostic/common/codec/hal/codechal_huc_cmd_initializer.h
index 8c8d46b..1c5533f 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_huc_cmd_initializer.h
+++ b/media_driver/agnostic/common/codec/hal/codechal_huc_cmd_initializer.h
@@ -216,6 +216,7 @@
bool m_roundingEnabled = false;
bool m_panicEnabled = false;
bool m_roiStreamInEnabled = false;
+ bool m_brcAdaptiveRegionBoostEnabled = false;
int32_t m_currentPass = 0;
int32_t m_cmdCount = 0 ;
@@ -291,6 +292,7 @@
bool brcEnabled,
bool streaminEnabled,
bool roiStreamInEnabled,
+ bool brcAdaptiveRegionBoostEnable,
bool roundingEnabled,
bool panicEnabled,
int32_t currentPass
diff --git a/media_driver/agnostic/common/codec/hal/codechal_vdenc_hevc.cpp b/media_driver/agnostic/common/codec/hal/codechal_vdenc_hevc.cpp
index e5de91a..5077c3f 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_vdenc_hevc.cpp
+++ b/media_driver/agnostic/common/codec/hal/codechal_vdenc_hevc.cpp
@@ -2045,6 +2045,7 @@
m_brcEnabled,
m_vdencStreamInEnabled,
m_vdencNativeROIEnabled,
+ m_brcAdaptiveRegionBoostEnable,
m_hevcVdencRoundingEnabled,
panicEnabled,
currentPass));
@@ -2844,6 +2845,80 @@
return eStatus;
}
+MOS_STATUS CodechalVdencHevcState::SetupRegionBoosting(PMOS_RESOURCE vdencStreamIn, uint16_t boostIndex)
+{
+ MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
+
+ CODECHAL_ENCODE_FUNCTION_ENTER;
+ CODECHAL_ENCODE_CHK_NULL_RETURN(vdencStreamIn);
+
+ MOS_LOCK_PARAMS lockFlags;
+ MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS));
+ lockFlags.WriteOnly = 1;
+
+ uint8_t* data = (uint8_t*)m_osInterface->pfnLockResource(
+ m_osInterface,
+ vdencStreamIn,
+ &lockFlags);
+ CODECHAL_ENCODE_CHK_NULL_RETURN(data);
+
+ uint32_t streamInWidth = (MOS_ALIGN_CEIL(m_frameWidth, 64) / 32);
+ uint32_t streamInHeight = (MOS_ALIGN_CEIL(m_frameHeight, 64) / 32);
+ int32_t streamInNumCUs = streamInWidth * streamInHeight;
+
+ MOS_ZeroMemory(data, streamInNumCUs * 64);
+
+ MHW_VDBOX_VDENC_STREAMIN_STATE_PARAMS streaminDataParams;
+
+ MOS_ZeroMemory(&streaminDataParams, sizeof(streaminDataParams));
+ streaminDataParams.setQpRoiCtrl = true;
+ uint32_t roiCtrl = 85; // All four 16x16 blocks within the 32x32 blocks share the same region ID 1 (01010101).
+ for (uint16_t y = 0; y < streamInHeight; y++)
+ {
+ if ((y & 7) == boostIndex)
+ {
+ for (uint16_t x = 0; x < streamInWidth; x++)
+ {
+ streaminDataParams.roiCtrl = 85;
+ SetStreaminDataPerRegion(streamInWidth, y, y+1, x, x+1, &streaminDataParams, data);
+ }
+ }
+ }
+
+ MOS_ZeroMemory(&streaminDataParams, sizeof(streaminDataParams));
+ streaminDataParams.maxTuSize = 3; //Maximum TU Size allowed, restriction to be set to 3
+ streaminDataParams.maxCuSize = 2; //For ARB, currently support 32x32 block
+ switch (m_hevcSeqParams->TargetUsage)
+ {
+ case 1:
+ case 4:
+ streaminDataParams.numMergeCandidateCu64x64 = 4;
+ streaminDataParams.numMergeCandidateCu32x32 = 3;
+ streaminDataParams.numMergeCandidateCu16x16 = 2;
+ streaminDataParams.numMergeCandidateCu8x8 = 1;
+ streaminDataParams.numImePredictors = m_imgStateImePredictors;
+ break;
+ case 7:
+ streaminDataParams.numMergeCandidateCu64x64 = 2;
+ streaminDataParams.numMergeCandidateCu32x32 = 2;
+ streaminDataParams.numMergeCandidateCu16x16 = 2;
+ streaminDataParams.numMergeCandidateCu8x8 = 0;
+ streaminDataParams.numImePredictors = 4;
+ break;
+ }
+
+ for (auto i = 0; i < streamInNumCUs; i++)
+ {
+ SetStreaminDataPerLcu(&streaminDataParams, data + (i * 64));
+ }
+
+ m_osInterface->pfnUnlockResource(
+ m_osInterface,
+ vdencStreamIn);
+
+ return eStatus;
+}
+
MOS_STATUS CodechalVdencHevcState::PrepareVDEncStreamInData()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
@@ -2853,7 +2928,18 @@
if (m_vdencStreamInEnabled && m_encodeParams.bMbQpDataEnabled)
CODECHAL_ENCODE_CHK_STATUS_RETURN(SetupMbQpStreamIn(&m_resVdencStreamInBuffer[m_currRecycledBufIdx]));
- if (m_vdencStreamInEnabled && m_hevcPicParams->NumROI)
+ if (m_brcAdaptiveRegionBoostSupported && m_hevcPicParams->TargetFrameSize && !m_lookaheadDepth)
+ {
+ // Adaptive region boost is enabled for TCBRC only
+ m_brcAdaptiveRegionBoostEnable = true;
+ m_vdencStreamInEnabled = true;
+ }
+ else
+ {
+ m_brcAdaptiveRegionBoostEnable = false;
+ }
+
+ if (!m_brcAdaptiveRegionBoostEnable && m_vdencStreamInEnabled && m_hevcPicParams->NumROI)
{
ProcessRoiDeltaQp();
@@ -2868,10 +2954,18 @@
CODECHAL_ENCODE_CHK_STATUS_RETURN(SetupROIStreamIn(&(m_resVdencStreamInBuffer[m_currRecycledBufIdx])));
}
}
- else if (m_vdencStreamInEnabled && (m_hevcPicParams->NumDirtyRects > 0 && (B_TYPE == m_hevcPicParams->CodingType)))
+ else if (!m_brcAdaptiveRegionBoostEnable && m_vdencStreamInEnabled && (m_hevcPicParams->NumDirtyRects > 0 && (B_TYPE == m_hevcPicParams->CodingType)))
{
CODECHAL_ENCODE_CHK_STATUS_RETURN(SetupDirtyRectStreamIn(&(m_resVdencStreamInBuffer[m_currRecycledBufIdx])));
}
+
+ if (m_brcAdaptiveRegionBoostEnable)
+ {
+ uint16_t rowOffset[8] = {0, 3, 5, 2, 7, 4, 1, 6};
+ uint16_t circularFrameIdx = (m_storeData - 1) & 7;
+ CODECHAL_ENCODE_CHK_STATUS_RETURN(SetupRegionBoosting(&(m_resVdencStreamInBuffer[m_currRecycledBufIdx]), rowOffset[circularFrameIdx]));
+ }
+
return eStatus;
}
diff --git a/media_driver/agnostic/common/codec/hal/codechal_vdenc_hevc.h b/media_driver/agnostic/common/codec/hal/codechal_vdenc_hevc.h
index 559c3a6..51a66de 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_vdenc_hevc.h
+++ b/media_driver/agnostic/common/codec/hal/codechal_vdenc_hevc.h
@@ -202,6 +202,8 @@
bool m_pakOnlyPass = false; //!< flag to signal VDEnc+PAK vs. PAK only
bool m_hevcVisualQualityImprovement = false; //!< VQI enable flag
bool m_enableMotionAdaptive = false; //!< Motion adaptive enable flag
+ bool m_brcAdaptiveRegionBoostSupported = false; //!< ARB in BRC mode supported flag.
+ bool m_brcAdaptiveRegionBoostEnable = false; //!< ARB in BRC mode enable flag.
//Resources for VDEnc
MOS_RESOURCE m_sliceCountBuffer; //!< Slice count buffer
@@ -788,11 +790,21 @@
//!
//! \param [in] streamIn
//! Pointer to streamin buffer
+ MOS_STATUS SetupForceIntraStreamIn(PMOS_RESOURCE streamIn);
+
+ //! \brief Set VDENC StreamIn Surface for BRC Adaptive Region Boost
+ //!
+ //! \param [in] vdencStreamIn
+ //! StreamIn Surface Resource.
+ //! \param [in] boostIndex
+ //! Region index for boosting.
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
- MOS_STATUS SetupForceIntraStreamIn(PMOS_RESOURCE streamIn);
+ virtual MOS_STATUS SetupRegionBoosting(
+ PMOS_RESOURCE vdencStreamIn,
+ uint16_t boostIndex);
// Inherited virtual function
MOS_STATUS Initialize(CodechalSetting * settings) override;
diff --git a/media_driver/agnostic/gen11/codec/hal/codechal_huc_cmd_initializer_g11.cpp b/media_driver/agnostic/gen11/codec/hal/codechal_huc_cmd_initializer_g11.cpp
index 7f83f95..f358410 100644
--- a/media_driver/agnostic/gen11/codec/hal/codechal_huc_cmd_initializer_g11.cpp
+++ b/media_driver/agnostic/gen11/codec/hal/codechal_huc_cmd_initializer_g11.cpp
@@ -112,6 +112,12 @@
}
}
+ // For TCBRC adaptive region boost
+ if(m_brcAdaptiveRegionBoostEnabled)
+ {
+ cmd1.ROIStreamInEnabled = 1;
+ }
+
// default
cmd1.FwdPocNumForRefId0inL0 = 0x01;
cmd1.FwdPocNumForRefId0inL1 = 0xff;
diff --git a/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_hevc_g11.cpp b/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_hevc_g11.cpp
index 612790b..4806830 100644
--- a/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_hevc_g11.cpp
+++ b/media_driver/agnostic/gen11/codec/hal/codechal_vdenc_hevc_g11.cpp
@@ -561,7 +561,7 @@
PCODECHAL_VDENC_HEVC_STREAMIN_STATE_G10 data = (PCODECHAL_VDENC_HEVC_STREAMIN_STATE_G10)streaminData;
if (streaminParams->setQpRoiCtrl)
{
- if (m_vdencNativeROIEnabled)
+ if (m_vdencNativeROIEnabled || m_brcAdaptiveRegionBoostEnable)
{
data->DW0.RoiCtrl = streaminParams->roiCtrl;
}
@@ -1995,6 +1995,7 @@
m_brcEnabled,
m_vdencStreamInEnabled,
m_vdencNativeROIEnabled,
+ m_brcAdaptiveRegionBoostEnable,
m_hevcVdencRoundingEnabled,
panicEnabled,
GetCurrentPass()));
@@ -3480,7 +3481,6 @@
hucVdencBrcInitDmem->StreamInROIEnable_U8 = 1;
hucVdencBrcInitDmem->StreamInSurfaceEnable_U8 = 1;
}
-
// RDOQ adaptation hardened to HW starting Gen11
hucVdencBrcInitDmem->RDOQ_AdaptationEnable_U8 = 0;
@@ -4764,6 +4764,7 @@
m_kuidCommon = IDR_CODEC_HME_DS_SCOREBOARD_KERNEL;
m_hucPakStitchEnabled = true;
m_scalabilityState = nullptr;
+ m_brcAdaptiveRegionBoostSupported = true;
MOS_ZeroMemory(&m_resPakcuLevelStreamoutData, sizeof(m_resPakcuLevelStreamoutData));
MOS_ZeroMemory(&m_resPakSliceLevelStreamoutData, sizeof(m_resPakSliceLevelStreamoutData));