xref: /aosp_15_r20/external/intel-media-driver/media_softlet/agnostic/common/vp/hal/features/vp_ste_filter.cpp (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2020-2021, 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_ste_filter.cpp
24 //! \brief    Defines the common interface for Skin Tone Enhancement
25 //!           this file is for the base interface which is shared by all STE in driver.
26 //!
27 #include "vp_ste_filter.h"
28 #include "vp_vebox_cmd_packet_base.h"
29 #include "hw_filter.h"
30 #include "sw_filter_pipe.h"
31 
32 namespace vp {
VpSteFilter(PVP_MHWINTERFACE vpMhwInterface)33 VpSteFilter::VpSteFilter(PVP_MHWINTERFACE vpMhwInterface) :
34     VpFilter(vpMhwInterface)
35 {
36 
37 }
38 
Init()39 MOS_STATUS VpSteFilter::Init()
40 {
41     VP_FUNC_CALL();
42 
43     return MOS_STATUS_SUCCESS;
44 }
45 
Prepare()46 MOS_STATUS VpSteFilter::Prepare()
47 {
48     VP_FUNC_CALL();
49 
50     return MOS_STATUS_SUCCESS;
51 }
52 
Destroy()53 MOS_STATUS VpSteFilter::Destroy()
54 {
55     VP_FUNC_CALL();
56 
57     if (m_pVeboxSteParams)
58     {
59         MOS_FreeMemAndSetNull(m_pVeboxSteParams);
60     }
61 
62     return MOS_STATUS_SUCCESS;
63 }
64 
SetExecuteEngineCaps(FeatureParamSte & steParams,VP_EXECUTE_CAPS vpExecuteCaps)65 MOS_STATUS VpSteFilter::SetExecuteEngineCaps(
66     FeatureParamSte &steParams,
67     VP_EXECUTE_CAPS vpExecuteCaps)
68 {
69     VP_FUNC_CALL();
70 
71     m_steParams = steParams;
72     m_executeCaps   = vpExecuteCaps;
73 
74     return MOS_STATUS_SUCCESS;
75 }
76 
CalculateEngineParams()77 MOS_STATUS VpSteFilter::CalculateEngineParams()
78 {
79     VP_FUNC_CALL();
80     if (m_executeCaps.bVebox)
81     {
82         // create a filter Param buffer
83         if (!m_pVeboxSteParams)
84         {
85             m_pVeboxSteParams = (PVEBOX_STE_PARAMS)MOS_AllocAndZeroMemory(sizeof(VEBOX_STE_PARAMS));
86 
87             if (m_pVeboxSteParams == nullptr)
88             {
89                 VP_PUBLIC_ASSERTMESSAGE("Vebox Ste Pamas buffer allocate failed, return nullpointer");
90                 return MOS_STATUS_NO_SPACE;
91             }
92         }
93         else
94         {
95             MOS_ZeroMemory(m_pVeboxSteParams, sizeof(VEBOX_STE_PARAMS));
96         }
97 
98         m_pVeboxSteParams->bEnableSTE  = m_steParams.bEnableSTE;
99         m_pVeboxSteParams->dwSTEFactor = m_steParams.dwSTEFactor;
100         m_pVeboxSteParams->bEnableSTD  = m_steParams.bEnableSTD;
101         m_pVeboxSteParams->STDParam    = m_steParams.STDParam;
102     }
103     else
104     {
105         VP_PUBLIC_ASSERTMESSAGE("Wrong engine caps! Vebox should be used for STE");
106         return MOS_STATUS_INVALID_PARAMETER;
107     }
108 
109     return MOS_STATUS_SUCCESS;
110 }
111 
112 
113 /****************************************************************************************************/
114 /*                                   HwFilter Ste Parameter                                         */
115 /****************************************************************************************************/
Create(HW_FILTER_STE_PARAM & param,FeatureType featureType)116 HwFilterParameter *HwFilterSteParameter::Create(HW_FILTER_STE_PARAM &param, FeatureType featureType)
117 {
118     VP_FUNC_CALL();
119 
120     HwFilterSteParameter *p = MOS_New(HwFilterSteParameter, featureType);
121     if (p)
122     {
123         if (MOS_FAILED(p->Initialize(param)))
124         {
125             MOS_Delete(p);
126             return nullptr;
127         }
128     }
129     return p;
130 }
131 
HwFilterSteParameter(FeatureType featureType)132 HwFilterSteParameter::HwFilterSteParameter(FeatureType featureType) : HwFilterParameter(featureType)
133 {
134 }
135 
~HwFilterSteParameter()136 HwFilterSteParameter::~HwFilterSteParameter()
137 {
138 }
139 
ConfigParams(HwFilter & hwFilter)140 MOS_STATUS HwFilterSteParameter::ConfigParams(HwFilter &hwFilter)
141 {
142     VP_FUNC_CALL();
143 
144     return hwFilter.ConfigParam(m_Params);
145 }
146 
Initialize(HW_FILTER_STE_PARAM & param)147 MOS_STATUS HwFilterSteParameter::Initialize(HW_FILTER_STE_PARAM &param)
148 {
149     VP_FUNC_CALL();
150 
151     m_Params = param;
152     return MOS_STATUS_SUCCESS;
153 }
154 
155 /****************************************************************************************************/
156 /*                                   Packet Vebox Ste Parameter                                       */
157 /****************************************************************************************************/
Create(HW_FILTER_STE_PARAM & param)158 VpPacketParameter *VpVeboxSteParameter::Create(HW_FILTER_STE_PARAM &param)
159 {
160     VP_FUNC_CALL();
161 
162     if (nullptr == param.pPacketParamFactory)
163     {
164         return nullptr;
165     }
166     VpVeboxSteParameter *p = dynamic_cast<VpVeboxSteParameter *>(param.pPacketParamFactory->GetPacketParameter(param.pHwInterface));
167     if (p)
168     {
169         if (MOS_FAILED(p->Initialize(param)))
170         {
171             VpPacketParameter *pParam = p;
172             param.pPacketParamFactory->ReturnPacketParameter(pParam);
173             return nullptr;
174         }
175     }
176     return p;
177 }
178 
VpVeboxSteParameter(PVP_MHWINTERFACE pHwInterface,PacketParamFactoryBase * packetParamFactory)179 VpVeboxSteParameter::VpVeboxSteParameter(PVP_MHWINTERFACE pHwInterface, PacketParamFactoryBase *packetParamFactory) :
180     VpPacketParameter(packetParamFactory), m_steFilter(pHwInterface)
181 {
182 }
~VpVeboxSteParameter()183 VpVeboxSteParameter::~VpVeboxSteParameter() {}
184 
SetPacketParam(VpCmdPacket * pPacket)185 bool VpVeboxSteParameter::SetPacketParam(VpCmdPacket *pPacket)
186 {
187     VP_FUNC_CALL();
188 
189     VEBOX_STE_PARAMS *params = m_steFilter.GetVeboxParams();
190     if (nullptr == params)
191     {
192         VP_PUBLIC_ASSERTMESSAGE("Failed to get vebox ste params");
193         return false;
194     }
195 
196     VpVeboxCmdPacketBase *packet = dynamic_cast<VpVeboxCmdPacketBase *>(pPacket);
197     if (packet)
198     {
199         return MOS_SUCCEEDED(packet->SetSteParams(params));
200     }
201 
202     VP_PUBLIC_ASSERTMESSAGE("Invalid packet for vebox ste");
203     return false;
204 }
205 
Initialize(HW_FILTER_STE_PARAM & params)206 MOS_STATUS VpVeboxSteParameter::Initialize(HW_FILTER_STE_PARAM &params)
207 {
208     VP_FUNC_CALL();
209 
210     VP_PUBLIC_CHK_STATUS_RETURN(m_steFilter.Init());
211     VP_PUBLIC_CHK_STATUS_RETURN(m_steFilter.SetExecuteEngineCaps(params.steParams, params.vpExecuteCaps));
212     VP_PUBLIC_CHK_STATUS_RETURN(m_steFilter.CalculateEngineParams());
213     return MOS_STATUS_SUCCESS;
214 }
215 
216 /****************************************************************************************************/
217 /*                                   Policy Vebox Ste Handler                                         */
218 /****************************************************************************************************/
PolicyVeboxSteHandler(VP_HW_CAPS & hwCaps)219 PolicyVeboxSteHandler::PolicyVeboxSteHandler(VP_HW_CAPS &hwCaps) : PolicyFeatureHandler(hwCaps)
220 {
221     m_Type = FeatureTypeSteOnVebox;
222 }
~PolicyVeboxSteHandler()223 PolicyVeboxSteHandler::~PolicyVeboxSteHandler()
224 {
225 }
226 
IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps)227 bool PolicyVeboxSteHandler::IsFeatureEnabled(VP_EXECUTE_CAPS vpExecuteCaps)
228 {
229     VP_FUNC_CALL();
230 
231     return vpExecuteCaps.bSTE;
232 }
233 
CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps,SwFilterPipe & swFilterPipe,PVP_MHWINTERFACE pHwInterface)234 HwFilterParameter* PolicyVeboxSteHandler::CreateHwFilterParam(VP_EXECUTE_CAPS vpExecuteCaps, SwFilterPipe& swFilterPipe, PVP_MHWINTERFACE pHwInterface)
235 {
236 
237     VP_FUNC_CALL();
238 
239     if (IsFeatureEnabled(vpExecuteCaps))
240     {
241         if (SwFilterPipeType1To1 != swFilterPipe.GetSwFilterPipeType())
242         {
243             VP_PUBLIC_ASSERTMESSAGE("Invalid parameter! Sfc only support 1To1 swFilterPipe!");
244             return nullptr;
245         }
246 
247         SwFilterSte *swFilter = dynamic_cast<SwFilterSte *>(swFilterPipe.GetSwFilter(true, 0, FeatureTypeSteOnVebox));
248 
249         if (nullptr == swFilter)
250         {
251             VP_PUBLIC_ASSERTMESSAGE("Invalid parameter! Feature enabled in vpExecuteCaps but no swFilter exists!");
252             return nullptr;
253         }
254 
255         FeatureParamSte &param = swFilter->GetSwFilterParams();
256 
257         HW_FILTER_STE_PARAM paramSte = {};
258         paramSte.type = m_Type;
259         paramSte.pHwInterface = pHwInterface;
260         paramSte.vpExecuteCaps = vpExecuteCaps;
261         paramSte.pPacketParamFactory = &m_PacketParamFactory;
262         paramSte.steParams = param;
263         paramSte.pfnCreatePacketParam = PolicyVeboxSteHandler::CreatePacketParam;
264 
265         HwFilterParameter *pHwFilterParam = GetHwFeatureParameterFromPool();
266 
267         if (pHwFilterParam)
268         {
269             if (MOS_FAILED(((HwFilterSteParameter*)pHwFilterParam)->Initialize(paramSte)))
270             {
271                 ReleaseHwFeatureParameter(pHwFilterParam);
272             }
273         }
274         else
275         {
276             pHwFilterParam = HwFilterSteParameter::Create(paramSte, m_Type);
277         }
278 
279         return pHwFilterParam;
280     }
281     else
282     {
283         return nullptr;
284     }
285 }
286 }
287