1 /* 2 * Copyright (c) 2018-2022, Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included 12 * in all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 */ 22 //! 23 //! \file vp_csc_filter.h 24 //! \brief Defines the common interface for CSC 25 //! this file is for the base interface which is shared by all CSC in driver. 26 //! 27 #ifndef __VP_CSC_FILTER_H__ 28 #define __VP_CSC_FILTER_H__ 29 30 #include "vp_filter.h" 31 #include "sw_filter.h" 32 33 namespace vp { 34 class VpCscFilter : public VpFilter 35 { 36 public: 37 38 VpCscFilter( 39 PVP_MHWINTERFACE vpMhwInterface); 40 ~VpCscFilter()41 virtual ~VpCscFilter() 42 { 43 Destroy(); 44 }; 45 46 virtual MOS_STATUS Init() override; 47 48 virtual MOS_STATUS Prepare() override; 49 50 virtual MOS_STATUS Destroy() override; 51 52 virtual MOS_STATUS SetExecuteEngineCaps( 53 FeatureParamCsc &cscParams, 54 VP_EXECUTE_CAPS vpExecuteCaps); 55 56 MOS_STATUS CalculateEngineParams(); 57 58 MOS_STATUS CalculateSfcEngineParams(); 59 60 MOS_STATUS CalculateVeboxEngineParams(); 61 GetSfcParams()62 SFC_CSC_PARAMS *GetSfcParams() 63 { 64 return m_sfcCSCParams; 65 } 66 GetVeboxParams()67 VEBOX_CSC_PARAMS* GetVeboxParams() 68 { 69 return m_veboxCSCParams; 70 } 71 72 protected: 73 74 //! 75 //! \brief Setup Chroma sitting parameters 76 //! \details Setup Chroma sitting parameters 77 //! \param [in] vpExecuteCaps 78 //! Pointer to Vebox Render Execution Caps 79 //! \return MOS_STATUS 80 //! 81 MOS_STATUS SetSfcChromaParams( 82 VP_EXECUTE_CAPS vpExecuteCaps); 83 84 //! 85 //! \brief Setup Vebox Chroma up sampling parameters 86 //! \details Setup Chroma sitting parameters 87 //! \param [in] vpExecuteCaps 88 //! Pointer to Vebox Render Execution Caps 89 //! \return MOS_STATUS 90 //! 91 MOS_STATUS SetVeboxCUSChromaParams( 92 VP_EXECUTE_CAPS vpExecuteCaps); 93 94 //! 95 //! \brief Setup Vebox Chroma down sampling parameters 96 //! \details Setup Chroma sitting parameters 97 //! \param [in] vpExecuteCaps 98 //! Pointer to Vebox Render Execution Caps 99 //! \return MOS_STATUS 100 //! 101 MOS_STATUS SetVeboxCDSChromaParams( 102 VP_EXECUTE_CAPS vpExecuteCaps); 103 104 //! 105 //! \brief Setup Chroma sitting parameters 106 //! \details Setup Chroma sitting parameters 107 //! \param [in] vpExecuteCaps 108 //! Pointer to Vebox Render Execution Caps 109 //! \return MOS_STATUS 110 //! 111 MOS_STATUS UpdateChromaSiting( 112 VP_EXECUTE_CAPS vpExecuteCaps); 113 114 //! 115 //! \brief Check whether Chroma Up Sampling Needed 116 //! \details Check whether Chroma Up Sampling Needed 117 //! \return bool 118 //! 119 bool IsChromaUpSamplingNeeded(); 120 121 //! 122 //! \brief Check whether dithering Needed 123 //! \details Check whether dithering Needed 124 //! \param [in] formatInput 125 //! The input format 126 //! [in] formatOutput 127 //! The output format 128 //! \return bool 129 //! 130 bool IsDitheringNeeded(MOS_FORMAT formatInput, MOS_FORMAT formatOutput); 131 132 protected: 133 FeatureParamCsc m_cscParams = {}; 134 PSFC_CSC_PARAMS m_sfcCSCParams = nullptr; 135 PVEBOX_CSC_PARAMS m_veboxCSCParams = nullptr; 136 137 MEDIA_CLASS_DEFINE_END(vp__VpCscFilter) 138 }; 139 140 141 struct HW_FILTER_CSC_PARAM : public HW_FILTER_PARAM 142 { 143 FeatureParamCsc cscParams; 144 }; 145 146 class HwFilterCscParameter : public HwFilterParameter 147 { 148 public: 149 static HwFilterParameter *Create(HW_FILTER_CSC_PARAM ¶m, FeatureType featureType); 150 HwFilterCscParameter(FeatureType featureType); 151 virtual ~HwFilterCscParameter(); 152 virtual MOS_STATUS ConfigParams(HwFilter &hwFilter); 153 154 MOS_STATUS Initialize(HW_FILTER_CSC_PARAM ¶m); 155 156 private: 157 HW_FILTER_CSC_PARAM m_Params = {}; 158 159 MEDIA_CLASS_DEFINE_END(vp__HwFilterCscParameter) 160 }; 161 162 class VpSfcCscParameter : public VpPacketParameter 163 { 164 public: 165 static VpPacketParameter *Create(HW_FILTER_CSC_PARAM ¶m); 166 VpSfcCscParameter(PVP_MHWINTERFACE pHwInterface, PacketParamFactoryBase *packetParamFactory); 167 virtual ~VpSfcCscParameter(); 168 169 virtual bool SetPacketParam(VpCmdPacket *pPacket); 170 171 private: 172 MOS_STATUS Initialize(HW_FILTER_CSC_PARAM ¶ms); 173 174 VpCscFilter m_CscFilter; 175 176 MEDIA_CLASS_DEFINE_END(vp__VpSfcCscParameter) 177 }; 178 179 class PolicySfcCscHandler : public PolicyFeatureHandler 180 { 181 public: 182 PolicySfcCscHandler(VP_HW_CAPS &hwCaps); 183 virtual ~PolicySfcCscHandler(); 184 virtual bool IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps); 185 virtual HwFilterParameter *CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps, SwFilterPipe &swFilterPipe, PVP_MHWINTERFACE pHwInterface); 186 virtual MOS_STATUS UpdateFeaturePipe(VP_EXECUTE_CAPS caps, SwFilter &feature, SwFilterPipe &featurePipe, SwFilterPipe &executePipe, bool isInputPipe, int index); CreatePacketParam(HW_FILTER_PARAM & param)187 static VpPacketParameter* CreatePacketParam(HW_FILTER_PARAM& param) 188 { 189 if (param.type != FeatureTypeCscOnSfc) 190 { 191 VP_PUBLIC_ASSERTMESSAGE("Invalid Parameter for SFC CSC!"); 192 return nullptr; 193 } 194 195 HW_FILTER_CSC_PARAM* cscParam = (HW_FILTER_CSC_PARAM*)(¶m); 196 return VpSfcCscParameter::Create(*cscParam); 197 } 198 199 private: 200 PacketParamFactory<VpSfcCscParameter> m_PacketParamFactory; 201 202 MEDIA_CLASS_DEFINE_END(vp__PolicySfcCscHandler) 203 }; 204 205 class VpVeboxCscParameter : public VpPacketParameter 206 { 207 public: 208 static VpPacketParameter* Create(HW_FILTER_CSC_PARAM& param); 209 VpVeboxCscParameter(PVP_MHWINTERFACE pHwInterface, PacketParamFactoryBase* packetParamFactory); 210 virtual ~VpVeboxCscParameter(); 211 212 virtual bool SetPacketParam(VpCmdPacket* pPacket); 213 214 private: 215 MOS_STATUS Initialize(HW_FILTER_CSC_PARAM& params); 216 217 VpCscFilter m_CscFilter; 218 219 MEDIA_CLASS_DEFINE_END(vp__VpVeboxCscParameter) 220 }; 221 222 class PolicyVeboxCscHandler : public PolicyFeatureHandler 223 { 224 public: 225 PolicyVeboxCscHandler(VP_HW_CAPS &hwCaps); 226 virtual ~PolicyVeboxCscHandler(); 227 virtual bool IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps); 228 virtual HwFilterParameter* CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps, SwFilterPipe& swFilterPipe, PVP_MHWINTERFACE pHwInterface); 229 virtual MOS_STATUS UpdateFeaturePipe(VP_EXECUTE_CAPS caps, SwFilter &feature, SwFilterPipe &featurePipe, SwFilterPipe &executePipe, bool isInputPipe, int index); CreatePacketParam(HW_FILTER_PARAM & param)230 static VpPacketParameter* CreatePacketParam(HW_FILTER_PARAM& param) 231 { 232 if (param.type != FeatureTypeCscOnVebox) 233 { 234 VP_PUBLIC_ASSERTMESSAGE("Invalid Parameter for Vebox CSC!"); 235 return nullptr; 236 } 237 238 HW_FILTER_CSC_PARAM* cscParam = (HW_FILTER_CSC_PARAM*)(¶m); 239 return VpVeboxCscParameter::Create(*cscParam); 240 } 241 242 private: 243 PacketParamFactory<VpVeboxCscParameter> m_PacketParamFactory; 244 245 MEDIA_CLASS_DEFINE_END(vp__PolicyVeboxCscHandler) 246 }; 247 } 248 #endif // !__VP_CSC_FILTER_H__ 249