[Decode] Fix several issues for decode APO.
1. Use output surface width/height as output surface region width/height when app is not passing them.
2. Refine status report for AVC APO.
3. Fix decode prediction/marker feature update issue.
diff --git a/media_driver/media_driver_next/agnostic/common/codec/hal/dec/av1/packet/decode_av1_packet.cpp b/media_driver/media_driver_next/agnostic/common/codec/hal/dec/av1/packet/decode_av1_packet.cpp
index 61241a2..f55dbb6 100644
--- a/media_driver/media_driver_next/agnostic/common/codec/hal/dec/av1/packet/decode_av1_packet.cpp
+++ b/media_driver/media_driver_next/agnostic/common/codec/hal/dec/av1/packet/decode_av1_packet.cpp
@@ -126,18 +126,22 @@
DECODE_CHK_STATUS(makerPacket->Execute(cmdBuffer));
#ifdef _MMC_SUPPORTED
- m_mmcState = m_av1Pipeline->GetMmcState();
- if (m_mmcState && m_mmcState->IsMmcEnabled())
- {
- DECODE_CHK_STATUS(m_mmcState->SendPrologCmd(&cmdBuffer, false));
- }
+ m_mmcState = m_av1Pipeline->GetMmcState();
+ bool isMmcEnabled = (m_mmcState != nullptr && m_mmcState->IsMmcEnabled());
+ if (isMmcEnabled)
+ {
+ DECODE_CHK_STATUS(m_mmcState->SendPrologCmd(&cmdBuffer, false));
+ }
#endif
MHW_GENERIC_PROLOG_PARAMS genericPrologParams;
MOS_ZeroMemory(&genericPrologParams, sizeof(genericPrologParams));
genericPrologParams.pOsInterface = m_osInterface;
genericPrologParams.pvMiInterface = m_miInterface;
- genericPrologParams.bMmcEnabled = false;
+
+#ifdef _MMC_SUPPORTED
+ genericPrologParams.bMmcEnabled = isMmcEnabled;
+#endif
DECODE_CHK_STATUS(Mhw_SendGenericPrologCmd(&cmdBuffer, &genericPrologParams));
diff --git a/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_downsampling_feature.cpp b/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_downsampling_feature.cpp
index f065180..98b945a 100644
--- a/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_downsampling_feature.cpp
+++ b/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_downsampling_feature.cpp
@@ -127,8 +127,10 @@
m_outputSurfaceRegion.m_x = procParams->m_outputSurfaceRegion.m_x;
m_outputSurfaceRegion.m_y = procParams->m_outputSurfaceRegion.m_y;
- m_outputSurfaceRegion.m_width = procParams->m_outputSurfaceRegion.m_width;
- m_outputSurfaceRegion.m_height = procParams->m_outputSurfaceRegion.m_height;
+ m_outputSurfaceRegion.m_width = (procParams->m_outputSurfaceRegion.m_width == 0) ?
+ m_outputSurface.dwWidth : procParams->m_outputSurfaceRegion.m_width;
+ m_outputSurfaceRegion.m_height = (procParams->m_outputSurfaceRegion.m_height == 0) ?
+ m_outputSurface.dwHeight : procParams->m_outputSurfaceRegion.m_height;
if (procParams->m_inputSurface != nullptr)
{
diff --git a/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_marker.cpp b/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_marker.cpp
index 4a655c3..916b8ff 100644
--- a/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_marker.cpp
+++ b/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_marker.cpp
@@ -40,22 +40,29 @@
MOS_Delete(m_markerBuffer);
}
-MOS_STATUS DecodeMarker::Init(CodechalDecodeParams& params)
+MOS_STATUS DecodeMarker::Update(void *params)
{
DECODE_FUNC_CALL();
- m_setMarkerEnabled = params.m_setMarkerEnabled;
- m_setMarkerNumTs = params.setMarkerNumTs;
+ DECODE_CHK_NULL(params);
+
+ CodechalDecodeParams* decodeParams = (CodechalDecodeParams*)params;
+ m_setMarkerEnabled = decodeParams->m_setMarkerEnabled;
+ m_setMarkerNumTs = decodeParams->setMarkerNumTs;
if (m_setMarkerEnabled)
{
- DECODE_CHK_NULL(params.m_presSetMarker);
+ DECODE_CHK_NULL(decodeParams->m_presSetMarker);
}
- m_markerBuffer = MOS_New(MOS_BUFFER);
- if (params.m_presSetMarker != nullptr)
+ if (m_markerBuffer == nullptr)
{
- m_markerBuffer->OsResource = *params.m_presSetMarker;
+ m_markerBuffer = MOS_New(MOS_BUFFER);
+ }
+
+ if (decodeParams->m_presSetMarker != nullptr)
+ {
+ m_markerBuffer->OsResource = *decodeParams->m_presSetMarker;
}
else
{
diff --git a/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_marker.h b/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_marker.h
index cb3abe8..d63bfea 100644
--- a/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_marker.h
+++ b/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_marker.h
@@ -50,13 +50,13 @@
virtual ~DecodeMarker();
//!
- //! \brief Initialize decode predication
+ //! \brief Update decode predication
//! \param [in] params
//! Reference to CodechalDecodeParams
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
- virtual MOS_STATUS Init(CodechalDecodeParams& params);
+ virtual MOS_STATUS Update(void *params) override;
bool m_setMarkerEnabled = false; //!< Indicates whether or not SetMarker is enabled
PMOS_BUFFER m_markerBuffer = nullptr; //!< Resource for SetMarker
diff --git a/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_predication.cpp b/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_predication.cpp
index 6141bdf..0d291f3 100644
--- a/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_predication.cpp
+++ b/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_predication.cpp
@@ -42,24 +42,31 @@
MOS_Delete(m_resPredication);
}
-MOS_STATUS DecodePredication::Init(CodechalDecodeParams& params)
+MOS_STATUS DecodePredication::Update(void *params)
{
DECODE_FUNC_CALL();
- m_predicationEnabled = params.m_predicationEnabled;
+ DECODE_CHK_NULL(params);
+
+ CodechalDecodeParams* decodeParams = (CodechalDecodeParams*)params;
+ m_predicationEnabled = decodeParams->m_predicationEnabled;
if (!m_predicationEnabled)
{
return MOS_STATUS_SUCCESS;
}
- m_predicationNotEqualZero = params.m_predicationNotEqualZero;
- m_predicationResOffset = params.m_predicationResOffset;
+ m_predicationNotEqualZero = decodeParams->m_predicationNotEqualZero;
+ m_predicationResOffset = decodeParams->m_predicationResOffset;
- m_resPredication = MOS_New(MOS_BUFFER);
- DECODE_CHK_NULL(m_resPredication);
- if (params.m_presPredication != nullptr)
+ if (m_resPredication == nullptr)
{
- m_resPredication->OsResource = *params.m_presPredication;
+ m_resPredication = MOS_New(MOS_BUFFER);
+ }
+
+ DECODE_CHK_NULL(m_resPredication);
+ if (decodeParams->m_presPredication != nullptr)
+ {
+ m_resPredication->OsResource = *decodeParams->m_presPredication;
}
else
{
@@ -72,7 +79,7 @@
DECODE_CHK_NULL(m_predicationBuffer);
}
- *(params.m_tempPredicationBuffer) = &m_predicationBuffer->OsResource;
+ *(decodeParams->m_tempPredicationBuffer) = &m_predicationBuffer->OsResource;
return MOS_STATUS_SUCCESS;
}
diff --git a/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_predication.h b/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_predication.h
index d2baae8..32b6703 100644
--- a/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_predication.h
+++ b/media_driver/media_driver_next/agnostic/common/codec/hal/dec/shared/features/decode_predication.h
@@ -48,13 +48,13 @@
//!
virtual ~DecodePredication();
//!
- //! \brief Initialize decode predication
+ //! \brief Update decode predication
//! \param [in] params
//! Reference to CodechalDecodeParams
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
- virtual MOS_STATUS Init(CodechalDecodeParams& params);
+ virtual MOS_STATUS Update(void *params) override;
PMOS_BUFFER m_predicationBuffer = nullptr; //!< Internal resource for Predication
PMOS_BUFFER m_resPredication = nullptr; //!< External resource for predication