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 ¶m, 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 ¶m)
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 ¶m)
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 ¶ms)
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 ¶m = 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