[VP] Refine VP HW Filter

Refine VP HW Filter for VPP structure unification

Change-Id: I17705e1dee7c7f87d19fcbeb6c3e1f226a89dd60
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/hw_filter.cpp b/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/hw_filter.cpp
index e17bfaf..fef041a 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/hw_filter.cpp
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/hw_filter.cpp
@@ -67,6 +67,20 @@
     return MOS_STATUS_SUCCESS;
 }
 
+MOS_STATUS HwFilter::ConfigParam(HW_FILTER_PARAM& param)
+{
+    if (!param.pfnCreatePacketParam)
+    {
+        VP_PUBLIC_ASSERTMESSAGE("Create packet params function is Null, return invalid params");
+        return MOS_STATUS_INVALID_PARAMETER;
+    }
+
+    VpPacketParameter* p = param.pfnCreatePacketParam(param);
+    VP_PUBLIC_CHK_NULL_RETURN(p);
+    m_Params.Params.push_back(p);
+    return MOS_STATUS_SUCCESS;
+}
+
 MOS_STATUS HwFilter::Clean()
 {
     std::vector<VpPacketParameter *>::iterator it = m_Params.Params.begin();
@@ -127,28 +141,6 @@
     return bRet ? MOS_STATUS_SUCCESS : MOS_STATUS_UNKNOWN;
 }
 
-MOS_STATUS HwFilterVebox::ConfigDnParam(HW_FILTER_DN_PARAM &param)
-{
-    if (FeatureTypeDnOnVebox == param.type)
-    {
-        VpPacketParameter *p = VpVeboxDnParameter::Create(param);
-        VP_PUBLIC_CHK_NULL_RETURN(p);
-        m_Params.Params.push_back(p);
-    }
-    return MOS_STATUS_SUCCESS;
-}
-
-MOS_STATUS HwFilterVebox::ConfigAceParam(HW_FILTER_ACE_PARAM &param)
-{
-    if (FeatureTypeAceOnVebox == param.type)
-    {
-        VpPacketParameter *p = VpVeboxAceParameter::Create(param);
-        VP_PUBLIC_CHK_NULL_RETURN(p);
-        m_Params.Params.push_back(p);
-    }
-    return MOS_STATUS_SUCCESS;
-}
-
 /****************************************************************************************************/
 /*                                      HwFilterVeboxSfc                                                 */
 /****************************************************************************************************/
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/hw_filter.h b/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/hw_filter.h
index 30571ee..a26998b 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/hw_filter.h
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/feature_manager/hw_filter.h
@@ -83,26 +83,7 @@
     virtual MOS_STATUS Initialize(HW_FILTER_PARAMS &param);
     virtual MOS_STATUS SetPacketParams(VpCmdPacket &package) = 0;
 
-    virtual MOS_STATUS ConfigCscParam(HW_FILTER_CSC_PARAM &)
-    {
-        return MOS_STATUS_SUCCESS;
-    }
-    virtual MOS_STATUS ConfigRotMirParam(HW_FILTER_ROT_MIR_PARAM &)
-    {
-        return MOS_STATUS_SUCCESS;
-    }
-    virtual MOS_STATUS ConfigScalingParam(HW_FILTER_SCALING_PARAM &)
-    {
-        return MOS_STATUS_SUCCESS;
-    }
-    virtual MOS_STATUS ConfigDnParam(HW_FILTER_DN_PARAM &)
-    {
-        return MOS_STATUS_SUCCESS;
-    }
-    virtual MOS_STATUS ConfigAceParam(HW_FILTER_ACE_PARAM&)
-    {
-        return MOS_STATUS_SUCCESS;
-    }
+    virtual MOS_STATUS ConfigParam(HW_FILTER_PARAM& param);
 
     EngineType GetEngineType()
     {
@@ -132,23 +113,6 @@
         return MOS_STATUS_SUCCESS;
     }
     virtual MOS_STATUS SetPacketParams(VpCmdPacket &package);
-    virtual MOS_STATUS ConfigCscParam(HW_FILTER_CSC_PARAM & param)
-    {
-        VpPacketParameter* p = VpVeboxCscParameter::Create(param);
-        VP_PUBLIC_CHK_NULL_RETURN(p);
-        m_Params.Params.push_back(p);
-        return MOS_STATUS_SUCCESS;
-    }
-    virtual MOS_STATUS ConfigRotMirParam(HW_FILTER_ROT_MIR_PARAM &)
-    {
-        return MOS_STATUS_SUCCESS;
-    }
-    virtual MOS_STATUS ConfigScalingParam(HW_FILTER_SCALING_PARAM &)
-    {
-        return MOS_STATUS_SUCCESS;
-    }
-    virtual MOS_STATUS ConfigDnParam(HW_FILTER_DN_PARAM &param);
-    virtual MOS_STATUS ConfigAceParam(HW_FILTER_ACE_PARAM &param);
 
 protected:
     HwFilterVebox(VpInterface &vpInterface, EngineType type);
@@ -165,48 +129,6 @@
         return MOS_STATUS_SUCCESS;
     }
     virtual MOS_STATUS SetPacketParams(VpCmdPacket &package);
-    virtual MOS_STATUS ConfigCscParam(HW_FILTER_CSC_PARAM &param)
-    {
-        if (FeatureTypeCscOnSfc == param.type)
-        {
-            VpPacketParameter *p = VpSfcCscParameter::Create(param);
-            VP_PUBLIC_CHK_NULL_RETURN(p);
-            m_Params.Params.push_back(p);
-            return MOS_STATUS_SUCCESS;
-        }
-        else
-        {
-            return HwFilterVebox::ConfigCscParam(param);
-        }
-    }
-    virtual MOS_STATUS ConfigRotMirParam(HW_FILTER_ROT_MIR_PARAM &param)
-    {
-        if (FeatureTypeRotMirOnSfc == param.type)
-        {
-            VpPacketParameter *p = VpSfcRotMirParameter::Create(param);
-            VP_PUBLIC_CHK_NULL_RETURN(p);
-            m_Params.Params.push_back(p);
-            return MOS_STATUS_SUCCESS;
-        }
-        else
-        {
-            return HwFilterVebox::ConfigRotMirParam(param);
-        }
-    }
-    virtual MOS_STATUS ConfigScalingParam(HW_FILTER_SCALING_PARAM &param)
-    {
-        if (FeatureTypeScalingOnSfc == param.type)
-        {
-            VpPacketParameter *p = VpSfcScalingParameter::Create(param);
-            VP_PUBLIC_CHK_NULL_RETURN(p);
-            m_Params.Params.push_back(p);
-            return MOS_STATUS_SUCCESS;
-        }
-        else
-        {
-            return HwFilterVebox::ConfigScalingParam(param);
-        }
-    }
 };
 
 class HwFilterRender: public HwFilter
@@ -222,18 +144,6 @@
     }
 
     virtual MOS_STATUS SetPacketParams(VpCmdPacket &package);
-    virtual MOS_STATUS ConfigCscParam(HW_FILTER_CSC_PARAM &)
-    {
-        return MOS_STATUS_SUCCESS;
-    }
-    virtual MOS_STATUS ConfigRotMirParam(HW_FILTER_ROT_MIR_PARAM &)
-    {
-        return MOS_STATUS_SUCCESS;
-    }
-    virtual MOS_STATUS ConfigScalingParam(HW_FILTER_SCALING_PARAM &)
-    {
-        return MOS_STATUS_SUCCESS;
-    }
 };
 
 }
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_ace_filter.cpp b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_ace_filter.cpp
index d64cb27..4fda41c 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_ace_filter.cpp
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_ace_filter.cpp
@@ -137,7 +137,7 @@
 
 MOS_STATUS HwFilterAceParameter::ConfigParams(HwFilter &hwFilter)
 {
-    return hwFilter.ConfigAceParam(m_Params);
+    return hwFilter.ConfigParam(m_Params);
 }
 
 MOS_STATUS HwFilterAceParameter::Initialize(HW_FILTER_ACE_PARAM &param)
@@ -240,6 +240,7 @@
         paramAce.vpExecuteCaps = vpExecuteCaps;
         paramAce.pPacketParamFactory = &m_PacketParamFactory;
         paramAce.aceParams = param;
+        paramAce.pfnCreatePacketParam = PolicyVeboxAceHandler::CreatePacketParam;
 
         HwFilterParameter *pHwFilterParam = GetHwFeatureParameterFromPool();
 
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_ace_filter.h b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_ace_filter.h
index c1cbbef..cd73f4c 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_ace_filter.h
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_ace_filter.h
@@ -63,13 +63,8 @@
     PVEBOX_ACE_PARAMS       m_pVeboxAceParams = nullptr;
 };
 
-
-struct HW_FILTER_ACE_PARAM
+struct HW_FILTER_ACE_PARAM : public HW_FILTER_PARAM
 {
-    FeatureType             type;
-    PVP_MHWINTERFACE        pHwInterface;
-    VP_EXECUTE_CAPS         vpExecuteCaps;
-    PacketParamFactoryBase *pPacketParamFactory;
     FeatureParamAce         aceParams;
 };
 
@@ -110,6 +105,18 @@
     virtual bool IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps);
     virtual HwFilterParameter *CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps, SwFilterPipe &swFilterPipe, PVP_MHWINTERFACE pHwInterface);
 
+    static VpPacketParameter* CreatePacketParam(HW_FILTER_PARAM& param)
+    {
+        if (param.type != FeatureTypeAceOnVebox)
+        {
+            VP_PUBLIC_ASSERTMESSAGE("Invalid parameter for Vebox ACE!");
+            return nullptr;
+        }
+
+        HW_FILTER_ACE_PARAM* aceParam = (HW_FILTER_ACE_PARAM*)(&param);
+        return VpVeboxAceParameter::Create(*aceParam);
+    }
+
 private:
     PacketParamFactory<VpVeboxAceParameter> m_PacketParamFactory;
 };
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_csc_filter.cpp b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_csc_filter.cpp
index e4fe4ef..0ed10c5 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_csc_filter.cpp
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_csc_filter.cpp
@@ -280,7 +280,7 @@
     {
         VP_RENDER_CHK_STATUS_RETURN(SetSubSampling());
     }
-    
+
     m_sfcCSCParams->chromaDownSamplingVerticalCoef = (m_cscParams.chromaSitingOutput & MHW_CHROMA_SITING_VERT_CENTER) ?
         MEDIASTATE_SFC_CHROMA_DOWNSAMPLING_COEF_4_OVER_8 : MEDIASTATE_SFC_CHROMA_DOWNSAMPLING_COEF_0_OVER_8;
     m_sfcCSCParams->chromaDownSamplingHorizontalCoef = (m_cscParams.chromaSitingOutput & MHW_CHROMA_SITING_HORZ_CENTER) ?
@@ -653,7 +653,7 @@
 
 MOS_STATUS HwFilterCscParameter::ConfigParams(HwFilter &hwFilter)
 {
-    return hwFilter.ConfigCscParam(m_Params);
+    return hwFilter.ConfigParam(m_Params);
 }
 
 MOS_STATUS HwFilterCscParameter::Initialize(HW_FILTER_CSC_PARAM &param)
@@ -756,6 +756,7 @@
         paramCsc.vpExecuteCaps = vpExecuteCaps;
         paramCsc.pPacketParamFactory = &m_PacketParamFactory;
         paramCsc.cscParams = param;
+        paramCsc.pfnCreatePacketParam = PolicySfcCscHandler::CreatePacketParam;
 
         HwFilterParameter *pHwFilterParam = GetHwFeatureParameterFromPool();
 
@@ -862,6 +863,7 @@
         paramCsc.vpExecuteCaps = vpExecuteCaps;
         paramCsc.pPacketParamFactory = &m_PacketParamFactory;
         paramCsc.cscParams = param;
+        paramCsc.pfnCreatePacketParam = PolicyVeboxCscHandler::CreatePacketParam;
 
         HwFilterParameter *pHwFilterParam = GetHwFeatureParameterFromPool();
 
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_csc_filter.h b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_csc_filter.h
index f828d5a..91f45b0 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_csc_filter.h
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_csc_filter.h
@@ -122,12 +122,8 @@
 };
 
 
-struct HW_FILTER_CSC_PARAM
+struct HW_FILTER_CSC_PARAM : public HW_FILTER_PARAM
 {
-    FeatureType             type;
-    PVP_MHWINTERFACE        pHwInterface;
-    VP_EXECUTE_CAPS         vpExecuteCaps;
-    PacketParamFactoryBase *pPacketParamFactory;
     FeatureParamCsc         cscParams;
 };
 
@@ -168,6 +164,18 @@
     virtual bool IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps);
     virtual HwFilterParameter *CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps, SwFilterPipe &swFilterPipe, PVP_MHWINTERFACE pHwInterface);
 
+    static VpPacketParameter* CreatePacketParam(HW_FILTER_PARAM& param)
+    {
+        if (param.type != FeatureTypeCscOnSfc)
+        {
+            VP_PUBLIC_ASSERTMESSAGE("Invalid Parameter for SFC CSC!");
+            return nullptr;
+        }
+
+        HW_FILTER_CSC_PARAM* cscParam = (HW_FILTER_CSC_PARAM*)(&param);
+        return VpSfcCscParameter::Create(*cscParam);
+    }
+
 private:
     PacketParamFactory<VpSfcCscParameter> m_PacketParamFactory;
 };
@@ -195,6 +203,18 @@
     virtual bool IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps);
     virtual HwFilterParameter* CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps, SwFilterPipe& swFilterPipe, PVP_MHWINTERFACE pHwInterface);
 
+    static VpPacketParameter* CreatePacketParam(HW_FILTER_PARAM& param)
+    {
+        if (param.type != FeatureTypeCscOnVebox)
+        {
+            VP_PUBLIC_ASSERTMESSAGE("Invalid Parameter for Vebox CSC!");
+            return nullptr;
+        }
+
+        HW_FILTER_CSC_PARAM* cscParam = (HW_FILTER_CSC_PARAM*)(&param);
+        return VpVeboxCscParameter::Create(*cscParam);
+    }
+
 private:
     PacketParamFactory<VpVeboxCscParameter> m_PacketParamFactory;
 };
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_dn_filter.cpp b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_dn_filter.cpp
index c7c079d..acabd53 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_dn_filter.cpp
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_dn_filter.cpp
@@ -140,7 +140,7 @@
 
 MOS_STATUS HwFilterDnParameter::ConfigParams(HwFilter &hwFilter)
 {
-    return hwFilter.ConfigDnParam(m_Params);
+    return hwFilter.ConfigParam(m_Params);
 }
 
 MOS_STATUS HwFilterDnParameter::Initialize(HW_FILTER_DN_PARAM &param)
@@ -243,6 +243,7 @@
         paramDn.vpExecuteCaps = vpExecuteCaps;
         paramDn.pPacketParamFactory = &m_PacketParamFactory;
         paramDn.dnParams = param;
+        paramDn.pfnCreatePacketParam = PolicyVeboxDnHandler::CreatePacketParam;
 
         HwFilterParameter *pHwFilterParam = GetHwFeatureParameterFromPool();
 
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_dn_filter.h b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_dn_filter.h
index df5a2f9..0dfcb9b 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_dn_filter.h
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_dn_filter.h
@@ -63,14 +63,9 @@
     PVEBOX_DN_PARAMS        m_veboxDnParams = nullptr;
 };
 
-
-struct HW_FILTER_DN_PARAM
+struct HW_FILTER_DN_PARAM : public HW_FILTER_PARAM
 {
-    FeatureType             type;
-    PVP_MHWINTERFACE        pHwInterface;
-    VP_EXECUTE_CAPS         vpExecuteCaps;
-    PacketParamFactoryBase *pPacketParamFactory;
-    FeatureParamDenoise     dnParams;
+    FeatureParamDenoise         dnParams;
 };
 
 class HwFilterDnParameter : public HwFilterParameter
@@ -110,6 +105,18 @@
     virtual bool IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps);
     virtual HwFilterParameter *CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps, SwFilterPipe &swFilterPipe, PVP_MHWINTERFACE pHwInterface);
 
+    static VpPacketParameter* CreatePacketParam(HW_FILTER_PARAM& param)
+    {
+        if (param.type != FeatureTypeDnOnVebox)
+        {
+            VP_PUBLIC_ASSERTMESSAGE("Invalid parameter for Vebox De-Noise!");
+            return nullptr;
+        }
+
+        HW_FILTER_DN_PARAM* dnParam = (HW_FILTER_DN_PARAM*)(&param);
+        return VpVeboxDnParameter::Create(*dnParam);
+    }
+
 private:
     PacketParamFactory<VpVeboxDnParameter> m_PacketParamFactory;
 };
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_filter.h b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_filter.h
index fd88a09..14b2b97 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_filter.h
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_filter.h
@@ -311,6 +311,15 @@
         }
     }
 };
+
+struct HW_FILTER_PARAM
+{
+    FeatureType             type;
+    PVP_MHWINTERFACE        pHwInterface;
+    VP_EXECUTE_CAPS         vpExecuteCaps;
+    PacketParamFactoryBase *pPacketParamFactory                     = nullptr;
+    VpPacketParameter*    (*pfnCreatePacketParam)(HW_FILTER_PARAM&) = nullptr;
+};
 }
 
 
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_rot_mir_filter.cpp b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_rot_mir_filter.cpp
index 4a0d31d..36c5308 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_rot_mir_filter.cpp
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_rot_mir_filter.cpp
@@ -197,7 +197,7 @@
 
 MOS_STATUS HwFilterRotMirParameter::ConfigParams(HwFilter &hwFilter)
 {
-    return hwFilter.ConfigRotMirParam(m_Params);
+    return hwFilter.ConfigParam(m_Params);
 }
 
 MOS_STATUS HwFilterRotMirParameter::Initialize(HW_FILTER_ROT_MIR_PARAM &param)
@@ -300,6 +300,7 @@
         paramRotMir.vpExecuteCaps = vpExecuteCaps;
         paramRotMir.pPacketParamFactory = &m_PacketParamFactory;
         paramRotMir.rotMirParams = param;
+        paramRotMir.pfnCreatePacketParam = PolicySfcRotMirHandler::CreatePacketParam;
 
         HwFilterParameter *pHwFilterParam = GetHwFeatureParameterFromPool();
 
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_rot_mir_filter.h b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_rot_mir_filter.h
index 9c67c77..3900935 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_rot_mir_filter.h
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_rot_mir_filter.h
@@ -87,12 +87,8 @@
     PSFC_ROT_MIR_PARAMS     m_sfcRotMirParams = nullptr;
 };
 
-struct HW_FILTER_ROT_MIR_PARAM
+struct HW_FILTER_ROT_MIR_PARAM : public HW_FILTER_PARAM
 {
-    FeatureType             type;
-    PVP_MHWINTERFACE        pHwInterface;
-    VP_EXECUTE_CAPS         vpExecuteCaps;
-    PacketParamFactoryBase *pPacketParamFactory;
     FeatureParamRotMir      rotMirParams;
 };
 
@@ -131,6 +127,18 @@
     virtual ~PolicySfcRotMirHandler();
     virtual bool IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps);
     virtual HwFilterParameter *CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps, SwFilterPipe &swFilterPipe, PVP_MHWINTERFACE pHwInterface);
+
+    static VpPacketParameter* CreatePacketParam(HW_FILTER_PARAM& param)
+    {
+        if (param.type != FeatureTypeRotMirOnSfc)
+        {
+            VP_PUBLIC_ASSERTMESSAGE("Invalid parameter for SFC Rotation-Mirror!");
+            return nullptr;
+        }
+
+        HW_FILTER_ROT_MIR_PARAM* rotationParam = (HW_FILTER_ROT_MIR_PARAM*)(&param);
+        return VpSfcRotMirParameter::Create(*rotationParam);
+    }
 private:
     PacketParamFactory<VpSfcRotMirParameter> m_PacketParamFactory;
 };
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.cpp b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.cpp
index f6ccc68..3a9fcea 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.cpp
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.cpp
@@ -460,7 +460,7 @@
 
 MOS_STATUS HwFilterScalingParameter::ConfigParams(HwFilter &hwFilter)
 {
-    return hwFilter.ConfigScalingParam(m_Params);
+    return hwFilter.ConfigParam(m_Params);
 }
 
 MOS_STATUS HwFilterScalingParameter::Initialize(HW_FILTER_SCALING_PARAM &param)
@@ -565,6 +565,7 @@
         paramScaling.vpExecuteCaps = vpExecuteCaps;
         paramScaling.pPacketParamFactory = &m_PacketParamFactory;
         paramScaling.scalingParams = param;
+        paramScaling.pfnCreatePacketParam = PolicySfcScalingHandler::CreatePacketParam;
 
         HwFilterParameter *pHwFilterParam = GetHwFeatureParameterFromPool();
 
diff --git a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.h b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.h
index b1d8570..47f5332 100644
--- a/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.h
+++ b/media_driver/media_driver_next/agnostic/common/vp/hal/features/vp_scaling_filter.h
@@ -139,12 +139,8 @@
 
 };
 
-struct HW_FILTER_SCALING_PARAM
+struct HW_FILTER_SCALING_PARAM : public HW_FILTER_PARAM
 {
-    FeatureType             type;
-    PVP_MHWINTERFACE        pHwInterface;
-    VP_EXECUTE_CAPS         vpExecuteCaps;
-    PacketParamFactoryBase *pPacketParamFactory;
     FeatureParamScaling     scalingParams;
 };
 
@@ -184,6 +180,17 @@
     virtual bool IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps);
     virtual HwFilterParameter *CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps, SwFilterPipe &swFilterPipe, PVP_MHWINTERFACE pHwInterface);
 
+    static VpPacketParameter* CreatePacketParam(HW_FILTER_PARAM& param)
+    {
+        if (param.type != FeatureTypeScalingOnSfc)
+        {
+            VP_PUBLIC_ASSERTMESSAGE("Invalid parameter for SFC Scaling!");
+            return nullptr;
+        }
+
+        HW_FILTER_SCALING_PARAM* scalingParam = (HW_FILTER_SCALING_PARAM*)(&param);
+        return VpSfcScalingParameter::Create(*scalingParam);
+    }
 private:
     PacketParamFactory<VpSfcScalingParameter> m_PacketParamFactory;
 };