xref: /aosp_15_r20/external/intel-media-driver/media_softlet/agnostic/common/vp/hal/packet/vp_render_ief.cpp (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2020, 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_render_ief.cpp
24 //! \brief    VP IEF feature implementation
25 //! \details  VP IEF feature implementation
26 //!
27 
28 #include "vp_render_ief.h"
29 #include "vp_utils.h"
30 #include "mos_resource_defs.h"
31 #include "mhw_sfc_cmdpar.h"
32 
33 namespace vp{
34 
35 const uint32_t   VpIef::s_r5x[s_iefMaxItem] = {
36     0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,   2,
37     3,   3,   3,   3,   3,   3,   4,   4,   4,   4,   4,   4,   4,   5,   5,   5,
38     5,   5,   5,   6,   6,   6,   6,   6,   6,   7,   7,   7,   7,   8,  10,  11,
39     12,  13,  15,  16,  17,  18,  20,  21,  22,  23,  25,  26,  27,  28,  30,  31
40 };
41 
42 //!
43 //! \brief  Const IEF R5CX coefficient array
44 //!
45 const uint32_t   VpIef::s_r5cx[s_iefMaxItem] = {
46     0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,   2,
47     3,   3,   3,   3,   3,   3,   4,   4,   4,   4,   4,   4,   4,   5,   5,   5,
48     5,   5,   5,   6,   6,   6,   6,   6,   6,   7,   7,   7,   7,   8,  10,  11,
49     12,  13,  15,  16,  17,  18,  20,  21,  22,  23,  25,  26,  27,  28,  30,  31
50 };
51 
52 //!
53 //! \brief  Const IEF R5C coefficient array
54 //!
55 const uint32_t   VpIef::s_r5c[s_iefMaxItem] = {
56     0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   2,   2,   2,   2,   2,   2,
57     3,   3,   3,   3,   3,   3,   4,   4,   4,   4,   4,   4,   4,   5,   5,   5,
58     5,   5,   5,   6,   6,   6,   6,   6,   6,   7,   7,   7,   7,   8,  10,  11,
59     12,  13,  15,  16,  17,  18,  20,  21,  22,  23,  25,  26,  27,  28,  30,  31
60 };
61 
62 //!
63 //! \brief  Const IEF R3X coefficient array
64 //!
65 const uint32_t   VpIef::s_r3x[s_iefMaxItem] = {
66     0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   2,
67     2,   2,   2,   2,   2,   2,   3,   3,   3,   3,   3,   3,   3,   3,   3,   4,
68     4,   4,   4,   4,   4,   4,   4,   4,   5,   5,   5,   5,   5,   6,   6,   7,
69     7,   8,   8,   9,  10,  10,  11,  11,  12,  13,  13,  14,  14,  15,  15,  16
70 };
71 
72 //!
73 //! \brief  Const IEF R3C coefficient array
74 //!
75 const uint32_t   VpIef::s_r3c[s_iefMaxItem] = {
76     0,   0,   0,   0,   0,   1,   1,   1,   1,   1,   1,   1,   1,   1,   2,   2,
77     2,   2,   2,   2,   2,   2,   3,   3,   3,   3,   3,   3,   3,   3,   3,   4,
78     4,   4,   4,   4,   4,   4,   4,   4,   5,   5,   5,   5,   5,   6,   6,   7,
79     7,   8,   8,   9,  10,  10,  11,  11,  12,  13,  13,  14,  14,  15,  15,  16
80 };
81 
CalculateIefParams()82 MOS_STATUS VpIef::CalculateIefParams()
83 {
84     VP_FUNC_CALL();
85 
86     PVPHAL_IEF_PARAMS   pIEFParams;
87     MOS_STATUS          eStatus = MOS_STATUS_SUCCESS;
88 
89     VP_RENDER_CHK_NULL_RETURN(m_iefParams);
90 
91     pIEFParams = m_iefParams;
92     if (pIEFParams == nullptr)
93     {
94         return MOS_STATUS_INVALID_PARAMETER;
95     }
96 
97     m_iefFactor = (uint16_t)pIEFParams->fIEFFactor;
98 
99     // HW supports 0 - 63, but driver reports 0 - 64. so we clamp to 63 here.
100     if (m_iefFactor >= s_iefMaxItem)
101     {
102         m_iefFactor = s_iefMaxItem - 1;
103     }
104 
105     m_r5xCoefficient  = s_r5x[m_iefFactor];
106     m_r5cxCoefficient = s_r5cx[m_iefFactor];
107     m_r5cCoefficient  = s_r5c[m_iefFactor];
108     m_r3xCoefficient  = s_r3x[m_iefFactor];
109     m_r3cCoefficient  = s_r3c[m_iefFactor];
110 
111     return eStatus;
112 }
113 
SetHwState(PMHW_SAMPLER_STATE_PARAM pSamplerStateParams)114 MOS_STATUS VpIef::SetHwState(
115     PMHW_SAMPLER_STATE_PARAM        pSamplerStateParams)
116 {
117     VP_FUNC_CALL();
118 
119     // Init default parameters
120     // Set IEF params
121     PVPHAL_IEF_PARAMS   pIEFParams  = m_iefParams;
122     MOS_STATUS          eStatus     = MOS_STATUS_SUCCESS;
123 
124     VP_RENDER_CHK_NULL_RETURN(pIEFParams);
125 
126     // calculate IEF parameter
127     eStatus = CalculateIefParams();
128     if (eStatus != MOS_STATUS_SUCCESS)
129     {
130         VP_RENDER_ASSERTMESSAGE("CalculateIefParams failed.");
131     }
132 
133     if (IS_PL3_FORMAT(m_format))
134     {
135         // Disable Skin Tone Tuned IEF Params for PL3 formats - not supported in HW
136         pSamplerStateParams->Avs.bEnableSTDE        = false;
137     }
138     else
139     {
140         // Setup Skin Tone Tuned IEF Params (enable when IEF is enabled) [default]
141         pSamplerStateParams->Avs.bEnableSTDE        = pIEFParams->bSkintoneTuned;
142         pSamplerStateParams->Avs.bSkinDetailFactor  = pIEFParams->bEmphasizeSkinDetail;
143     }
144 
145     pSamplerStateParams->Avs.StrongEdgeWght = (uint8_t)pIEFParams->StrongEdgeWeight;
146     pSamplerStateParams->Avs.RegularWght    = (uint8_t)pIEFParams->RegularWeight;
147     pSamplerStateParams->Avs.StrongEdgeThr  = (uint8_t)pIEFParams->StrongEdgeThreshold;
148 
149     pSamplerStateParams->Avs.bEnableIEF = true;
150     pSamplerStateParams->Avs.wIEFFactor = m_iefFactor;
151     pSamplerStateParams->Avs.GainFactor = m_iefFactor;
152 
153     pSamplerStateParams->Avs.wR5xCoefficient        = (uint16_t)m_r5xCoefficient;
154     pSamplerStateParams->Avs.wR5cxCoefficient       = (uint16_t)m_r5cxCoefficient;
155     pSamplerStateParams->Avs.wR5cCoefficient        = (uint16_t)m_r5cCoefficient;
156     pSamplerStateParams->Avs.wR3xCoefficient        = (uint16_t)m_r3xCoefficient;
157     pSamplerStateParams->Avs.wR3cCoefficient        = (uint16_t)m_r3cCoefficient;
158 
159     return eStatus;
160 }
161 
SetHwState(PMHW_SFC_STATE_PARAMS pSfcStateParams,PMHW_SFC_IEF_STATE_PARAMS pSfcIefStateParams)162 MOS_STATUS VpIef::SetHwState(
163     PMHW_SFC_STATE_PARAMS           pSfcStateParams,
164     PMHW_SFC_IEF_STATE_PARAMS       pSfcIefStateParams)
165 {
166     VP_FUNC_CALL();
167 
168     PVPHAL_IEF_PARAMS   pIEFParams  = nullptr;
169     MOS_STATUS          eStatus     = MOS_STATUS_SUCCESS;
170 
171     VP_RENDER_CHK_NULL_RETURN(m_iefParams);
172 
173     pIEFParams = m_iefParams;
174     VP_RENDER_CHK_NULL_RETURN(pIEFParams);
175 
176     eStatus = CalculateIefParams();
177     if (eStatus != MOS_STATUS_SUCCESS)
178     {
179         VP_RENDER_ASSERTMESSAGE("CalculateIefParams failed.");
180     }
181 
182     // Init default parameters
183     // Set IEF params
184     pSfcStateParams->bIEFEnable               = true;
185     pSfcIefStateParams->bIEFEnable            = true;
186     pSfcIefStateParams->StrongEdgeWeight      = s_detailStrongEdgeWeight;
187     pSfcIefStateParams->RegularWeight         = s_detailRegularEdgeWeight;
188     pSfcIefStateParams->StrongEdgeThreshold   = IEF_STRONG_EDGE_THRESHOLD;
189 
190     // Set STE params
191     pSfcStateParams->bSkinToneTunedIEFEnable  = true;
192     pSfcIefStateParams->bSkinDetailFactor     = false;
193     pSfcIefStateParams->bVYSTDEnable          = true;
194 
195     // Settings from user
196     pSfcIefStateParams->StrongEdgeWeight      = (uint8_t)pIEFParams->StrongEdgeWeight;
197     pSfcIefStateParams->RegularWeight         = (uint8_t)pIEFParams->RegularWeight;
198     pSfcIefStateParams->StrongEdgeThreshold   = (uint8_t)pIEFParams->StrongEdgeThreshold;
199     pSfcStateParams->bSkinToneTunedIEFEnable  = pIEFParams->bSkintoneTuned;
200     pSfcIefStateParams->bSkinDetailFactor     = pIEFParams->bEmphasizeSkinDetail;
201 
202     // Set IEF params
203     if (m_iefFactor > 0)
204     {
205         pSfcIefStateParams->dwGainFactor        = m_iefFactor;
206         pSfcIefStateParams->dwR5xCoefficient    = m_r5xCoefficient;
207         pSfcIefStateParams->dwR5cxCoefficient   = m_r5cxCoefficient;
208         pSfcIefStateParams->dwR5cCoefficient    = m_r5cCoefficient;
209         pSfcIefStateParams->dwR3xCoefficient    = m_r3xCoefficient;
210         pSfcIefStateParams->dwR3cCoefficient    = m_r3cCoefficient;
211     }
212 
213     return eStatus;
214 }
215 
SetHwState(mhw::sfc::SFC_STATE_PAR * pSfcStateParams,mhw::sfc::SFC_IEF_STATE_PAR * pSfcIefStateParams)216 MOS_STATUS VpIef::SetHwState(
217     mhw::sfc::SFC_STATE_PAR           *pSfcStateParams,
218     mhw::sfc::SFC_IEF_STATE_PAR       *pSfcIefStateParams)
219 {
220     VP_FUNC_CALL();
221 
222     PVPHAL_IEF_PARAMS   pIEFParams = nullptr;
223     MOS_STATUS          eStatus = MOS_STATUS_SUCCESS;
224 
225     VP_RENDER_CHK_NULL_RETURN(m_iefParams);
226 
227     pIEFParams = m_iefParams;
228     VP_RENDER_CHK_NULL_RETURN(pIEFParams);
229 
230     eStatus = CalculateIefParams();
231     if (eStatus != MOS_STATUS_SUCCESS)
232     {
233         VP_RENDER_ASSERTMESSAGE("CalculateIefParams failed.");
234     }
235 
236     // Init default parameters
237     // Set IEF params
238     pSfcStateParams->bIEFEnable = true;
239     pSfcIefStateParams->bIEFEnable = true;
240     pSfcIefStateParams->StrongEdgeWeight = s_detailStrongEdgeWeight;
241     pSfcIefStateParams->RegularWeight = s_detailRegularEdgeWeight;
242     pSfcIefStateParams->StrongEdgeThreshold = IEF_STRONG_EDGE_THRESHOLD;
243 
244     // Set STE params
245     pSfcStateParams->bSkinToneTunedIEFEnable = true;
246     pSfcIefStateParams->bSkinDetailFactor = false;
247     pSfcIefStateParams->bVYSTDEnable = true;
248 
249     // Settings from user
250     pSfcIefStateParams->StrongEdgeWeight = (uint8_t)pIEFParams->StrongEdgeWeight;
251     pSfcIefStateParams->RegularWeight = (uint8_t)pIEFParams->RegularWeight;
252     pSfcIefStateParams->StrongEdgeThreshold = (uint8_t)pIEFParams->StrongEdgeThreshold;
253     pSfcStateParams->bSkinToneTunedIEFEnable = pIEFParams->bSkintoneTuned;
254     pSfcIefStateParams->bSkinDetailFactor = pIEFParams->bEmphasizeSkinDetail;
255 
256     // Set IEF params
257     if (m_iefFactor > 0)
258     {
259         pSfcIefStateParams->dwGainFactor = m_iefFactor;
260         pSfcIefStateParams->dwR5xCoefficient = m_r5xCoefficient;
261         pSfcIefStateParams->dwR5cxCoefficient = m_r5cxCoefficient;
262         pSfcIefStateParams->dwR5cCoefficient = m_r5cCoefficient;
263         pSfcIefStateParams->dwR3xCoefficient = m_r3xCoefficient;
264         pSfcIefStateParams->dwR3cCoefficient = m_r3cCoefficient;
265     }
266 
267     return eStatus;
268 }
269 
VpIef()270 VpIef::VpIef()
271 {
272 }
273 
Init(PVPHAL_IEF_PARAMS iefParams,MOS_FORMAT format,float scaleX,float scaleY)274 void VpIef::Init(
275     PVPHAL_IEF_PARAMS               iefParams,
276     MOS_FORMAT                      format,
277     float                           scaleX,
278     float                           scaleY)
279 {
280     VP_FUNC_CALL();
281 
282     m_iefParams             = iefParams;
283     m_format                = format;
284     m_scaleX                = scaleX;
285     m_scaleY                = scaleY;
286     m_iefFactor             = 0;
287     m_r5xCoefficient        = 0;
288     m_r5cxCoefficient       = 0;
289     m_r5cCoefficient        = 0;
290     m_r3xCoefficient        = 0;
291     m_r3cCoefficient        = 0;
292 }
293 
~VpIef()294 VpIef::~VpIef()
295 {
296 }
297 
298 }