[Encode] Add resolution checks for VEBox params
VEBox has some limitations:
- Minimal W x H: 64x16
- Minimal VEB_DI_IECP.EndingX: 63
diff --git a/media_driver/agnostic/common/codec/hal/codechal_encode_sfc_base.cpp b/media_driver/agnostic/common/codec/hal/codechal_encode_sfc_base.cpp
index 66721ec..2b3b171 100644
--- a/media_driver/agnostic/common/codec/hal/codechal_encode_sfc_base.cpp
+++ b/media_driver/agnostic/common/codec/hal/codechal_encode_sfc_base.cpp
@@ -684,20 +684,24 @@
CODECHAL_ENCODE_CHK_NULL_RETURN(params);
// Initialize SurfInput
- params->SurfInput.bActive = true;
- params->SurfInput.Format = m_inputSurface->Format;
- params->SurfInput.dwWidth = m_inputSurface->dwWidth;
- params->SurfInput.dwHeight = m_inputSurface->dwHeight;
- params->SurfInput.dwPitch = m_inputSurface->dwPitch;
- params->SurfInput.TileType = m_inputSurface->TileType;
- params->SurfInput.TileModeGMM = m_inputSurface->TileModeGMM;
- params->SurfInput.bGMMTileEnabled = m_inputSurface->bGMMTileEnabled;
- params->SurfInput.dwYoffset = m_inputSurface->YPlaneOffset.iYOffset;
- params->SurfInput.pOsResource = &m_inputSurface->OsResource;
- params->SurfInput.rcMaxSrc.left = m_inputSurfaceRegion.X;
- params->SurfInput.rcMaxSrc.top = m_inputSurfaceRegion.Y;
- params->SurfInput.rcMaxSrc.right = m_inputSurfaceRegion.X + m_inputSurfaceRegion.Width;
- params->SurfInput.rcMaxSrc.bottom = m_inputSurfaceRegion.Y + m_inputSurfaceRegion.Height;
+ params->SurfInput.bActive = true;
+ params->SurfInput.Format = m_inputSurface->Format;
+ params->SurfInput.dwWidth = m_inputSurface->dwWidth;
+ params->SurfInput.dwHeight = m_inputSurface->dwHeight;
+ params->SurfInput.dwPitch = m_inputSurface->dwPitch;
+ params->SurfInput.TileType = m_inputSurface->TileType;
+ params->SurfInput.TileModeGMM = m_inputSurface->TileModeGMM;
+ params->SurfInput.bGMMTileEnabled = m_inputSurface->bGMMTileEnabled;
+ params->SurfInput.dwYoffset = m_inputSurface->YPlaneOffset.iYOffset;
+ params->SurfInput.pOsResource = &m_inputSurface->OsResource;
+
+ auto& rcMaxSrc = params->SurfInput.rcMaxSrc;
+ rcMaxSrc.left = m_inputSurfaceRegion.X;
+ rcMaxSrc.top = m_inputSurfaceRegion.Y;
+ rcMaxSrc.right = m_inputSurfaceRegion.X + m_inputSurfaceRegion.Width;
+ rcMaxSrc.bottom = m_inputSurfaceRegion.Y + m_inputSurfaceRegion.Height;
+ CODECHAL_ENCODE_CHK_COND_RETURN(rcMaxSrc.right < MHW_VEBOX_MIN_WIDTH || rcMaxSrc.bottom < MHW_VEBOX_MIN_HEIGHT,
+ "Invalid VEBOX input surface description. Minimal W x H: %d x %d; Requested W x H: %d x %d", MHW_VEBOX_MIN_WIDTH, MHW_VEBOX_MIN_HEIGHT, rcMaxSrc.right, rcMaxSrc.bottom);
// Initialize SurfSTMM
params->SurfSTMM.dwPitch = m_inputSurface->dwPitch;
@@ -724,6 +728,8 @@
params->dwCurrInputSurfOffset = m_inputSurface->dwOffset;
params->pOsResCurrInput = &m_inputSurface->OsResource;
params->CurrInputSurfCtrl.Value = 0; //Keep it here untill VPHAL moving to new CMD definition and remove this parameter definition.
+ CODECHAL_ENCODE_CHK_COND_RETURN(m_inputSurfaceRegion.Width < MHW_VEBOX_MIN_WIDTH,
+ "Invalid VEBOX_DI_IECP.EndingX value. It must be greater or equal to %d", MHW_VEBOX_MIN_WIDTH);
CodecHalGetResourceInfo(
m_osInterface,
@@ -902,7 +908,7 @@
if (m_inputSurface->dwWidth < m_inputSurfaceRegion.Width ||
m_inputSurface->dwHeight < m_inputSurfaceRegion.Height)
{
- CODECHAL_ENCODE_ASSERTMESSAGE("width and height must be less than surface size");
+ CODECHAL_ENCODE_ASSERTMESSAGE("width and height must be less than or equal to surface size");
return MOS_STATUS_INVALID_PARAMETER;
}
params->dwInputFrameWidth = MOS_ALIGN_CEIL(m_inputSurfaceRegion.Width, widthAlignUnit);