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