xref: /aosp_15_r20/external/intel-media-driver/media_softlet/agnostic/common/vp/hal/features/vp_csc_filter.h (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
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 &param, 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 &param);
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 &param);
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 &params);
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*)(&param);
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*)(&param);
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