xref: /aosp_15_r20/external/intel-media-driver/media_driver/agnostic/common/hw/mhw_vebox_generic.h (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2017-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     mhw_vebox_generic.h
24 //! \brief    MHW interface templates for render engine commands
25 //! \details  Impelements shared HW command construction functions across all platforms as templates
26 //!
27 
28 #ifndef __MHW_VEBOX_GENERIC_H__
29 #define __MHW_VEBOX_GENERIC_H__
30 
31 #include "mhw_vebox.h"
32 
33 template <class TVeboxCmds>
34 class MhwVeboxInterfaceGeneric : public MhwVeboxInterface
35 {
36 public:
37     //!
38     //! \brief    Initializes the Vebox interface
39     //! \details  Internal MHW function to initialize all function pointers and some parameters
40     //!           Assumes that the caller has checked pointer validity and whether or not an
41     //!           addressing method has been selected in the OS interface (bUsesGfxAddress or
42     //!           bUsesPatchList).
43     //! \param    [in] pOsInterface
44     //!           OS interface, must be valid
45     //!
MhwVeboxInterfaceGeneric(PMOS_INTERFACE pOsInterface)46     MhwVeboxInterfaceGeneric(
47         PMOS_INTERFACE pOsInterface) : MhwVeboxInterface(pOsInterface)
48     {
49         MHW_FUNCTION_ENTER;
50     }
51 
~MhwVeboxInterfaceGeneric()52     virtual ~MhwVeboxInterfaceGeneric() { MHW_FUNCTION_ENTER; }
53 
AddVeboxVertexTable(MHW_CSPACE ColorSpace)54     MOS_STATUS AddVeboxVertexTable(
55         MHW_CSPACE           ColorSpace)
56     {
57         MHW_FUNCTION_ENTER;
58         PMHW_VEBOX_HEAP         pVeboxHeap;
59         uint32_t                uiOffset;
60         uint32_t                uSize;
61         MOS_STATUS              eStatus = MOS_STATUS_SUCCESS;
62 
63         typename TVeboxCmds::VEBOX_VERTEX_TABLE_CMD *pVertexTable;
64         MHW_CHK_NULL(m_veboxHeap);
65 
66         pVeboxHeap   = m_veboxHeap;
67         uiOffset     = pVeboxHeap->uiCurState * pVeboxHeap->uiInstanceSize;
68         uSize        = sizeof(typename TVeboxCmds::VEBOX_VERTEX_TABLE_CMD);
69         pVertexTable = (typename TVeboxCmds::VEBOX_VERTEX_TABLE_CMD *)(pVeboxHeap->pLockedDriverResourceMem +
70                                                  pVeboxHeap->uiVertexTableOffset +
71                                                  uiOffset);
72         MOS_ZeroMemory(pVertexTable, uSize);
73         if (ColorSpace == MHW_CSpace_BT601 || ColorSpace == MHW_CSpace_xvYCC601)
74         {
75             MOS_SecureMemcpy(pVertexTable, uSize, g_VeboxVertexTableBT601, uSize);
76         }
77         else if (ColorSpace == MHW_CSpace_BT709 || ColorSpace == MHW_CSpace_xvYCC709)
78         {
79             MOS_SecureMemcpy(pVertexTable, uSize, g_VeboxVertexTableBT709, uSize);
80         }
81         else
82         {
83             MHW_NORMALMESSAGE("Unhandled ColorSpace");
84         }
85 
86     finish:
87         return eStatus;
88     }
89 
AddVeboxSurfaces(PMOS_COMMAND_BUFFER pCmdBuffer,PMHW_VEBOX_SURFACE_STATE_CMD_PARAMS pVeboxSurfaceStateCmdParams)90     virtual MOS_STATUS AddVeboxSurfaces(
91         PMOS_COMMAND_BUFFER                     pCmdBuffer,
92         PMHW_VEBOX_SURFACE_STATE_CMD_PARAMS     pVeboxSurfaceStateCmdParams)
93     {
94         MHW_FUNCTION_ENTER;
95         MOS_STATUS eStatus;
96         bool       bOutputValid;
97 
98         typename TVeboxCmds::VEBOX_SURFACE_STATE_CMD cmd1, cmd2;
99 
100         MEDIA_FEATURE_TABLE    *pSkuTable = nullptr;
101         MHW_CHK_NULL(m_osInterface);
102         pSkuTable = m_osInterface->pfnGetSkuTable(m_osInterface);
103         MHW_CHK_NULL(pSkuTable);
104         MHW_CHK_NULL(pCmdBuffer);
105         MHW_CHK_NULL(pVeboxSurfaceStateCmdParams);
106 
107         eStatus      = MOS_STATUS_SUCCESS;
108         bOutputValid = pVeboxSurfaceStateCmdParams->bOutputValid;
109 
110         // Setup Surface State for Input surface
111         SetVeboxSurfaces(
112             &pVeboxSurfaceStateCmdParams->SurfInput,
113             &pVeboxSurfaceStateCmdParams->SurfSTMM,
114             nullptr,
115             &cmd1,
116             false,
117             pVeboxSurfaceStateCmdParams->bDIEnable);
118 
119         if (pVeboxSurfaceStateCmdParams->b3DlutEnable && MEDIA_IS_SKU(pSkuTable, FtrHeight8AlignVE3DLUTDualPipe))
120         {
121             cmd1.DW2.Height = MOS_ALIGN_CEIL((cmd1.DW2.Height + 1), 8) - 1;
122             MHW_NORMALMESSAGE("Align Input Height as 8x due to 3DlutEnable");
123         }
124 
125         m_osInterface->pfnAddCommand(pCmdBuffer, &cmd1, cmd1.byteSize);
126         MHW_NORMALMESSAGE("Vebox input Height: %d, Width: %d;", cmd1.DW2.Height, cmd1.DW2.Width);
127 
128         // Setup Surface State for Output surface
129         if (bOutputValid)
130         {
131             SetVeboxSurfaces(
132                 &pVeboxSurfaceStateCmdParams->SurfOutput,
133                 &pVeboxSurfaceStateCmdParams->SurfDNOutput,
134                 &pVeboxSurfaceStateCmdParams->SurfSkinScoreOutput,
135                 &cmd2,
136                 true,
137                 pVeboxSurfaceStateCmdParams->bDIEnable);
138 
139             // Reset Output Format When Input/Output Format are the same
140             if (pVeboxSurfaceStateCmdParams->SurfInput.Format == pVeboxSurfaceStateCmdParams->SurfOutput.Format)
141             {
142                 cmd2.DW3.SurfaceFormat = cmd1.DW3.SurfaceFormat;
143             }
144 
145             if (pVeboxSurfaceStateCmdParams->b3DlutEnable && MEDIA_IS_SKU(pSkuTable, FtrHeight8AlignVE3DLUTDualPipe))
146             {
147                 cmd2.DW2.Height = MOS_ALIGN_CEIL((cmd2.DW2.Height + 1), 8) - 1;
148                 MHW_NORMALMESSAGE("Align Output Height as 8x due to 3DlutEnable");
149             }
150 
151             m_osInterface->pfnAddCommand(pCmdBuffer, &cmd2, cmd2.byteSize);
152             MHW_NORMALMESSAGE("Vebox output Height: %d, Width: %d;", cmd2.DW2.Height, cmd2.DW2.Width);
153         }
154 
155     finish:
156         return eStatus;
157     }
158 
159         //!
160     //! \brief    Add Vebox Tiling Convert Control Bits
161     //! \details  Add Vebox Tiling Convert Control Bits
162     //! \param    [in] cmdBuffer
163     //!           Pointers to the HW Cmd buffer
164     //! \param    [in] inSurParams
165     //!           Pointer to input vebox surface params
166     //! \param    [in] outSurParams
167     //!           Pointer to output vebox surface params
168     //! \return   MOS_STATUS
169     //!           MOS_STATUS_SUCCESS if success, else fail reason
AddVeboxTilingConvert(PMOS_COMMAND_BUFFER cmdBuffer,PMHW_VEBOX_SURFACE_PARAMS inSurParams,PMHW_VEBOX_SURFACE_PARAMS outSurParams)170     virtual MOS_STATUS AddVeboxTilingConvert(
171         PMOS_COMMAND_BUFFER cmdBuffer,
172         PMHW_VEBOX_SURFACE_PARAMS        inSurParams,
173         PMHW_VEBOX_SURFACE_PARAMS        outSurParams)
174     {
175         return MOS_STATUS_SUCCESS;
176     }
177 
setVeboxPrologCmd(PMHW_MI_INTERFACE mhwMiInterface,PMOS_COMMAND_BUFFER cmdBuffer)178     virtual MOS_STATUS setVeboxPrologCmd(
179         PMHW_MI_INTERFACE   mhwMiInterface,
180         PMOS_COMMAND_BUFFER cmdBuffer)
181     {
182         return MOS_STATUS_SUCCESS;
183     }
184 
185 protected:
186     //!
187     //! \brief      Set Vebox Iecp  STDSTE State
188     //! \details    Set STE part of the VEBOX IECP States
189     //! \param      [in] pVeboxStdSteState
190     //!             Pointer to VEBOX IECP STD/E States
191     //! \param      [in] pColorPipeParams
192     //!             Pointer to COLOR PIPE Params
193     //! \return     void
194     //!
SetVeboxIecpStateSTE(typename TVeboxCmds::VEBOX_STD_STE_STATE_CMD * pVeboxStdSteState,PMHW_COLORPIPE_PARAMS pColorPipeParams)195     virtual MOS_STATUS  SetVeboxIecpStateSTE(
196         typename TVeboxCmds::VEBOX_STD_STE_STATE_CMD     *pVeboxStdSteState,
197         PMHW_COLORPIPE_PARAMS                            pColorPipeParams)
198     {
199         MHW_FUNCTION_ENTER;
200         MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
201 
202         MHW_CHK_NULL(pVeboxStdSteState);
203         MHW_CHK_NULL(pColorPipeParams);
204 
205         // STD detects the skin like colors and passes a grade of skin tone
206         // color to STE (Skin Tone Enhancement). STD operates in the YUV color
207         // space.The level of skin tone detection is determined through skin
208         // tone factors in UV plane. If skin tone detection in VY plane is also
209         // enabled, the final skin tone factor is given by the minimum of STD
210         // in the (U, V) plane and (V, Y) plane.
211         //
212         // The skin tone factor will also be passed to ACE and TCC to indicate
213         // the strength of skin tone likelihood.
214         pVeboxStdSteState->DW0.StdEnable = true;
215 
216         // Enable skin tone detection in VY plane
217         pVeboxStdSteState->DW3.VyStdEnable = true;
218 
219         // Enable STE (Skin Tone Enhancement)
220         // STE modify the saturation and hue of the pixels which were detected
221         // as the skin-tone pixels by STD
222         if (pColorPipeParams->bEnableSTE &&
223             pColorPipeParams->SteParams.dwSTEFactor > 0)
224         {
225             pVeboxStdSteState->DW0.SteEnable = true;
226 
227             if (pColorPipeParams->SteParams.dwSTEFactor <= MHW_STE_OPTIMAL)
228             {
229                 pVeboxStdSteState->DW15.Satb1 = MOS_BITFIELD_VALUE((uint32_t)-8, 10);
230                 pVeboxStdSteState->DW15.Satp3 = 31;
231                 pVeboxStdSteState->DW15.Satp2 = 6;
232                 pVeboxStdSteState->DW15.Satp1 = pColorPipeParams->SteParams.satP1;
233 
234                 pVeboxStdSteState->DW16.Sats0 = pColorPipeParams->SteParams.satS0;
235                 pVeboxStdSteState->DW16.Satb3 = 124;
236                 pVeboxStdSteState->DW16.Satb2 = 8;
237 
238                 pVeboxStdSteState->DW17.Sats2 = 297;
239                 pVeboxStdSteState->DW17.Sats1 = pColorPipeParams->SteParams.satS1;
240 
241                 pVeboxStdSteState->DW18.Huep3 = 14;
242                 pVeboxStdSteState->DW18.Huep2 = 6;
243                 pVeboxStdSteState->DW18.Huep1 = MOS_BITFIELD_VALUE((uint32_t)-6, 7);
244                 pVeboxStdSteState->DW18.Sats3 = 256;
245 
246                 pVeboxStdSteState->DW19.Hueb3 = 56;
247                 pVeboxStdSteState->DW19.Hueb2 = 8;
248                 pVeboxStdSteState->DW19.Hueb1 = MOS_BITFIELD_VALUE((uint32_t)-8, 10);
249 
250                 pVeboxStdSteState->DW20.Hues1 = 85;
251                 pVeboxStdSteState->DW20.Hues0 = 384;
252 
253                 pVeboxStdSteState->DW21.Hues3 = 256;
254                 pVeboxStdSteState->DW21.Hues2 = 384;
255             }
256             else  // if (pColorPipeParams->SteParams.dwSTEFactor > MHW_STE_OPTIMAL)
257             {
258                 pVeboxStdSteState->DW15.Satb1 = 0;
259                 pVeboxStdSteState->DW15.Satp3 = 31;
260                 pVeboxStdSteState->DW15.Satp2 = 31;
261                 pVeboxStdSteState->DW15.Satp1 = pColorPipeParams->SteParams.satP1;
262 
263                 pVeboxStdSteState->DW16.Sats0 = pColorPipeParams->SteParams.satS0;
264                 pVeboxStdSteState->DW16.Satb3 = 124;
265                 pVeboxStdSteState->DW16.Satb2 = 124;
266 
267                 pVeboxStdSteState->DW17.Sats2 = 256;
268                 pVeboxStdSteState->DW17.Sats1 = pColorPipeParams->SteParams.satS1;
269 
270                 pVeboxStdSteState->DW18.Huep3 = 14;
271                 pVeboxStdSteState->DW18.Huep2 = 14;
272                 pVeboxStdSteState->DW18.Huep1 = 14;
273                 pVeboxStdSteState->DW18.Sats3 = 256;
274 
275                 pVeboxStdSteState->DW19.Hueb3 = 56;
276                 pVeboxStdSteState->DW19.Hueb2 = 56;
277                 pVeboxStdSteState->DW19.Hueb1 = 56;
278 
279                 pVeboxStdSteState->DW20.Hues1 = 256;
280                 pVeboxStdSteState->DW20.Hues0 = 256;
281 
282                 pVeboxStdSteState->DW21.Hues3 = 256;
283                 pVeboxStdSteState->DW21.Hues2 = 256;
284             }
285         }
286 
287         if (pColorPipeParams->bEnableSTD)
288         {
289             if (nullptr == pColorPipeParams->StdParams.param || pColorPipeParams->StdParams.paraSizeInBytes > pVeboxStdSteState->byteSize)
290             {
291                 MHW_CHK_STATUS_RETURN(MOS_STATUS_INVALID_PARAMETER);
292             }
293 
294             MOS_SecureMemcpy(pVeboxStdSteState, pColorPipeParams->StdParams.paraSizeInBytes, pColorPipeParams->StdParams.param, pColorPipeParams->StdParams.paraSizeInBytes);
295         }
296     finish:
297         return eStatus;
298     }
299 
300     //!
301     //! \brief      Set Vebox Iecp ACE/LACE State
302     //! \details    Set VEBOX IECP Ace and Lace States
303     //! \param      [in, out] pVeboxAceLaceState
304     //!             Pointer to VEBOX IECP ACE/LACE States
305     //! \param      [in, out] pVeboxAlphaAoiState
306     //!             Pointer to VEBOX IECP ALPHA/AOI States
307     //! \param      [in] bEnableLACE
308     //!             LACE enabled or not
309     //! \return     void
310     //!
SetVeboxIecpStateACELACE(typename TVeboxCmds::VEBOX_ACE_LACE_STATE_CMD * pVeboxAceLaceState,typename TVeboxCmds::VEBOX_ALPHA_AOI_STATE_CMD * pVeboxAlphaAoiState,bool bEnableLACE)311     void SetVeboxIecpStateACELACE(
312         typename TVeboxCmds::VEBOX_ACE_LACE_STATE_CMD    *pVeboxAceLaceState,
313         typename TVeboxCmds::VEBOX_ALPHA_AOI_STATE_CMD   *pVeboxAlphaAoiState,
314         bool                                             bEnableLACE)
315     {
316         MHW_FUNCTION_ENTER;
317         MHW_CHK_NULL_NO_STATUS_RETURN(pVeboxAceLaceState);
318         MHW_CHK_NULL_NO_STATUS_RETURN(pVeboxAlphaAoiState);
319 
320         // ACE improves the overall contrast of the image and emphasizing
321         // details when relevant (such as in dark areas)
322         pVeboxAceLaceState->DW0.AceEnable = true;
323 
324         // On SKL FullImageHistogram is set in Alpha/AOI state
325         pVeboxAlphaAoiState->DW0.FullImageHistogram = true;
326 
327         if (bEnableLACE)
328         {
329             // Enable Block level histogram generation
330             pVeboxAceLaceState->DW0.LaceHistogramEnable = true;
331         }
332         else
333         {
334             pVeboxAceLaceState->DW0.LaceHistogramEnable = false;
335         }
336     }
337 
338     //!
339     //! \brief      Set VEBOX IECP TCC State
340     //! \details    Set Vebox TCC state
341     //! \param      [in] pVeboxTccState
342     //!             Pointer to VEBOX IECP TCC States
343     //! \param      [in] pColorPipeParams
344     //!             Pointer to COLOR PIPE Params
345     //! \return     void
346     //!
SetVeboxIecpStateTCC(typename TVeboxCmds::VEBOX_TCC_STATE_CMD * pVeboxTccState,PMHW_COLORPIPE_PARAMS pColorPipeParams)347     void SetVeboxIecpStateTCC(
348         typename TVeboxCmds::VEBOX_TCC_STATE_CMD *pVeboxTccState,
349         PMHW_COLORPIPE_PARAMS                    pColorPipeParams)
350     {
351         MHW_FUNCTION_ENTER;
352         MHW_CHK_NULL_NO_STATUS_RETURN(pVeboxTccState);
353         MHW_CHK_NULL_NO_STATUS_RETURN(pColorPipeParams);
354 
355         // TCC allows users to custom the color scheme by choosing different
356         // grades of saturation for each of the six basic colors (red, green,
357         // blue, magenta, yellow, and cyan).
358         pVeboxTccState->DW0.TccEnable  = true;
359         pVeboxTccState->DW0.Satfactor1 = pColorPipeParams->TccParams.Magenta;
360         pVeboxTccState->DW0.Satfactor2 = pColorPipeParams->TccParams.Red;
361         pVeboxTccState->DW0.Satfactor3 = pColorPipeParams->TccParams.Yellow;
362         pVeboxTccState->DW1.Satfactor4 = pColorPipeParams->TccParams.Green;
363         pVeboxTccState->DW1.Satfactor5 = pColorPipeParams->TccParams.Cyan;
364         pVeboxTccState->DW1.Satfactor6 = pColorPipeParams->TccParams.Blue;
365     }
366 
367     //!
368     //! \brief      Set Vebox Iecp State FECSC
369     //! \details    Set Front-End CSC part of the VEBOX IECP States
370     //! \param      [in] pVeboxIecpState
371     //!             Pointer to VEBOX IECP States
372     //! \param      [in] pVeboxIecpParams
373     //!             Pointer to VEBOX IECP State Params
374     //! \return     void
375     //!
SetVeboxIecpStateFecsc(typename TVeboxCmds::VEBOX_FRONT_END_CSC_STATE_CMD * pVeboxFecscState,PMHW_VEBOX_IECP_PARAMS pVeboxIecpParams)376     void SetVeboxIecpStateFecsc(
377         typename TVeboxCmds::VEBOX_FRONT_END_CSC_STATE_CMD *pVeboxFecscState,
378         PMHW_VEBOX_IECP_PARAMS                pVeboxIecpParams)
379     {
380         MHW_FUNCTION_ENTER;
381         PMHW_CAPPIPE_PARAMS pCapPipeParams = nullptr;
382 
383         MHW_CHK_NULL_NO_STATUS_RETURN(pVeboxFecscState);
384         MHW_CHK_NULL_NO_STATUS_RETURN(pVeboxIecpParams);
385 
386         pCapPipeParams = &pVeboxIecpParams->CapPipeParams;
387         MHW_CHK_NULL_NO_STATUS_RETURN(pCapPipeParams);
388         MHW_ASSERT(pCapPipeParams->bActive);
389 
390 #define SET_COEFS(_c0, _c1, _c2, _c3, _c4, _c5, _c6, _c7, _c8)   \
391     {                                                            \
392         pVeboxFecscState->DW0.FecscC0TransformCoefficient = _c0; \
393         pVeboxFecscState->DW1.FecscC1TransformCoefficient = _c1; \
394         pVeboxFecscState->DW2.FecscC2TransformCoefficient = _c2; \
395         pVeboxFecscState->DW3.FecscC3TransformCoefficient = _c3; \
396         pVeboxFecscState->DW4.FecscC4TransformCoefficient = _c4; \
397         pVeboxFecscState->DW5.FecscC5TransformCoefficient = _c5; \
398         pVeboxFecscState->DW6.FecscC6TransformCoefficient = _c6; \
399         pVeboxFecscState->DW7.FecscC7TransformCoefficient = _c7; \
400         pVeboxFecscState->DW8.FecscC8TransformCoefficient = _c8; \
401     }
402 
403 #define SET_INPUT_OFFSETS(_in1, _in2, _in3)                         \
404     {                                                               \
405         pVeboxFecscState->DW9.FecScOffsetIn1OffsetInForYR   = _in1; \
406         pVeboxFecscState->DW10.FecScOffsetIn2OffsetOutForUG = _in2; \
407         pVeboxFecscState->DW11.FecScOffsetIn3OffsetOutForVB = _in3; \
408     }
409 
410 #define SET_OUTPUT_OFFSETS(_out1, _out2, _out3)                       \
411     {                                                                 \
412         pVeboxFecscState->DW9.FecScOffsetOut1OffsetOutForYR  = _out1; \
413         pVeboxFecscState->DW10.FecScOffsetOut2OffsetOutForUG = _out2; \
414         pVeboxFecscState->DW11.FecScOffsetOut3OffsetOutForVB = _out3; \
415     }
416 
417         pVeboxFecscState->DW0.FrontEndCscTransformEnable = true;
418 
419         if (pCapPipeParams->FECSCParams.bActive)
420         {
421             // Coeff is S2.16, so multiply the floating value by 65536
422             SET_COEFS(
423                 ((uint32_t)(pCapPipeParams->FECSCParams.Matrix[0][0] * 65536)),
424                 ((uint32_t)(pCapPipeParams->FECSCParams.Matrix[0][1] * 65536)),
425                 ((uint32_t)(pCapPipeParams->FECSCParams.Matrix[0][2] * 65536)),
426                 ((uint32_t)(pCapPipeParams->FECSCParams.Matrix[1][0] * 65536)),
427                 ((uint32_t)(pCapPipeParams->FECSCParams.Matrix[1][1] * 65536)),
428                 ((uint32_t)(pCapPipeParams->FECSCParams.Matrix[1][2] * 65536)),
429                 ((uint32_t)(pCapPipeParams->FECSCParams.Matrix[2][0] * 65536)),
430                 ((uint32_t)(pCapPipeParams->FECSCParams.Matrix[2][1] * 65536)),
431                 ((uint32_t)(pCapPipeParams->FECSCParams.Matrix[2][2] * 65536)));
432             SET_INPUT_OFFSETS(
433                 ((uint32_t)pCapPipeParams->FECSCParams.PreOffset[0]),
434                 ((uint32_t)pCapPipeParams->FECSCParams.PreOffset[1]),
435                 ((uint32_t)pCapPipeParams->FECSCParams.PreOffset[2]));
436             SET_OUTPUT_OFFSETS(
437                 ((uint32_t)pCapPipeParams->FECSCParams.PostOffset[0]),
438                 ((uint32_t)pCapPipeParams->FECSCParams.PostOffset[1]),
439                 ((uint32_t)pCapPipeParams->FECSCParams.PostOffset[2]));
440         }
441         else if (pVeboxIecpParams->bFeCSCEnable)
442         {
443             // Coeff is S2.16, so multiply the floating value by 65536
444             SET_COEFS(
445                 ((uint32_t)(pVeboxIecpParams->pfFeCscCoeff[0] * 65536)),
446                 ((uint32_t)(pVeboxIecpParams->pfFeCscCoeff[1] * 65536)),
447                 ((uint32_t)(pVeboxIecpParams->pfFeCscCoeff[2] * 65536)),
448                 ((uint32_t)(pVeboxIecpParams->pfFeCscCoeff[3] * 65536)),
449                 ((uint32_t)(pVeboxIecpParams->pfFeCscCoeff[4] * 65536)),
450                 ((uint32_t)(pVeboxIecpParams->pfFeCscCoeff[5] * 65536)),
451                 ((uint32_t)(pVeboxIecpParams->pfFeCscCoeff[6] * 65536)),
452                 ((uint32_t)(pVeboxIecpParams->pfFeCscCoeff[7] * 65536)),
453                 ((uint32_t)(pVeboxIecpParams->pfFeCscCoeff[8] * 65536)));
454             SET_INPUT_OFFSETS(
455                 ((uint32_t)(pVeboxIecpParams->pfFeCscInOffset[0] * 128.0F)),
456                 ((uint32_t)(pVeboxIecpParams->pfFeCscInOffset[1] * 128.0F)),
457                 ((uint32_t)(pVeboxIecpParams->pfFeCscInOffset[2] * 128.0F)));
458             SET_OUTPUT_OFFSETS(
459                 ((uint32_t)(pVeboxIecpParams->pfFeCscOutOffset[0] * 128.0F)),
460                 ((uint32_t)(pVeboxIecpParams->pfFeCscOutOffset[1] * 128.0F)),
461                 ((uint32_t)(pVeboxIecpParams->pfFeCscOutOffset[2] * 128.0F)));
462         }
463         else if (pVeboxIecpParams->ColorSpace == MHW_CSpace_BT601)
464         {
465             SET_COEFS(16843, 33030, 6423, MOS_BITFIELD_VALUE((uint32_t)-9698, 19), MOS_BITFIELD_VALUE((uint32_t)-19070, 19), 28770, 28770, MOS_BITFIELD_VALUE((uint32_t)-24116, 19), MOS_BITFIELD_VALUE((uint32_t)-4652, 19));
466             SET_INPUT_OFFSETS(0, 0, 0);
467             SET_OUTPUT_OFFSETS(2048, 16384, 16384);
468         }
469         else if (pVeboxIecpParams->ColorSpace == MHW_CSpace_BT709)
470         {
471             SET_COEFS(11993, 40239, 4063, MOS_BITFIELD_VALUE((uint32_t)-6618, 19), MOS_BITFIELD_VALUE((uint32_t)-22216, 19), 28770, 28770, MOS_BITFIELD_VALUE((uint32_t)-26148, 19), MOS_BITFIELD_VALUE((uint32_t)-2620, 19));
472             SET_INPUT_OFFSETS(0, 0, 0);
473             SET_OUTPUT_OFFSETS(2048, 16384, 16384);
474         }
475         else if (pVeboxIecpParams->ColorSpace == MHW_CSpace_sRGB)
476         {
477             SET_COEFS(13932, 46871, 4731, MOS_BITFIELD_VALUE((uint32_t)-7508, 19), MOS_BITFIELD_VALUE((uint32_t)-25260, 19), 32768, 32768, MOS_BITFIELD_VALUE((uint32_t)-29764, 19), MOS_BITFIELD_VALUE((uint32_t)-3005, 19));
478             SET_INPUT_OFFSETS(0, 0, 0);
479             SET_OUTPUT_OFFSETS(0, 16384, 16384);
480         }
481         else
482         {
483             MHW_ASSERT(0);
484         }
485 
486 #undef SET_COEFS
487 #undef SET_INPUT_OFFSETS
488 #undef SET_OUTPUT_OFFSETS
489     }
490 
491     //!
492     //! \brief      Set Vebox Iecp State Color Correction Matrix
493     //! \details    Set Color Correction Matrix of the VEBOX IECP States
494     //! \param      [in] pVeboxIecpState
495     //!             Pointer to VEBOX IECP States
496     //! \param      [in] pCapPipeParams
497     //!             Pointer to Capture Pipe Params
498     //! \param      [in] const unsigned int uCoeffValue
499     //!             the coeffs's miltiply floating value.
500     //!                  Coeff is S4.12, then multiply the floating value by 4096
501     //!                  Coeff is S4.16, then multiply the floating value by 65536
502     //! \return     void
503     //!
SetVeboxIecpStateCcm(typename TVeboxCmds::VEBOX_IECP_STATE_CMD * pVeboxIecpState,PMHW_CAPPIPE_PARAMS pCapPipeParams,const unsigned int uCoeffValue)504     void  SetVeboxIecpStateCcm(
505         typename TVeboxCmds::VEBOX_IECP_STATE_CMD* pVeboxIecpState,
506         PMHW_CAPPIPE_PARAMS                        pCapPipeParams,
507         const unsigned int                         uCoeffValue)
508     {
509         MHW_FUNCTION_ENTER;
510         typename TVeboxCmds::VEBOX_CCM_STATE_CMD *pCcm = nullptr;
511 
512         MHW_CHK_NULL_NO_STATUS_RETURN(pVeboxIecpState);
513         MHW_CHK_NULL_NO_STATUS_RETURN(pCapPipeParams);
514 
515         pCcm = &pVeboxIecpState->CcmState;
516 
517         if (pCapPipeParams->ColorCorrectionParams.bActive)
518         {
519             MHW_CHK_NULL_NO_STATUS_RETURN(pCcm);
520             pCcm->DW0.ColorCorrectionMatrixEnable = true;
521 
522             pCcm->DW0.C1 =
523                 (uint32_t)(pCapPipeParams->ColorCorrectionParams.CCM[0][1] * uCoeffValue);
524             pCcm->DW1.C0 =
525                 (uint32_t)(pCapPipeParams->ColorCorrectionParams.CCM[0][0] * uCoeffValue);
526             pCcm->DW2.C3 =
527                 (uint32_t)(pCapPipeParams->ColorCorrectionParams.CCM[1][0] * uCoeffValue);
528             pCcm->DW3.C2 =
529                 (uint32_t)(pCapPipeParams->ColorCorrectionParams.CCM[0][2] * uCoeffValue);
530             pCcm->DW4.C5 =
531                 (uint32_t)(pCapPipeParams->ColorCorrectionParams.CCM[1][2] * uCoeffValue);
532             pCcm->DW5.C4 =
533                 (uint32_t)(pCapPipeParams->ColorCorrectionParams.CCM[1][1] * uCoeffValue);
534             pCcm->DW6.C7 =
535                 (uint32_t)(pCapPipeParams->ColorCorrectionParams.CCM[2][1] * uCoeffValue);
536             pCcm->DW7.C6 =
537                 (uint32_t)(pCapPipeParams->ColorCorrectionParams.CCM[2][0] * uCoeffValue);
538             pCcm->DW8.C8 =
539                 (uint32_t)(pCapPipeParams->ColorCorrectionParams.CCM[2][2] * uCoeffValue);
540         }
541     }
542 
543     //!
544     //! \brief      Set Vebox Iecp State ProcAmp
545     //! \details    Set ProcAmp part of the VEBOX IECP States
546     //! \param      [in] pVeboxProcampState
547     //!             Pointer to VEBOX IECP Procamp States
548     //! \param      [in] pProcAmpParams
549     //!             Pointer to ProcAmp Params
550     //! \return     void
551     //!
SetVeboxIecpStateProcAmp(typename TVeboxCmds::VEBOX_PROCAMP_STATE_CMD * pVeboxProcampState,PMHW_PROCAMP_PARAMS pProcAmpParams)552     void SetVeboxIecpStateProcAmp(
553         typename TVeboxCmds::VEBOX_PROCAMP_STATE_CMD *pVeboxProcampState,
554         PMHW_PROCAMP_PARAMS                           pProcAmpParams)
555     {
556         MHW_FUNCTION_ENTER;
557         MHW_CHK_NULL_NO_STATUS_RETURN(pVeboxProcampState);
558         MHW_CHK_NULL_NO_STATUS_RETURN(pProcAmpParams);
559 
560         pVeboxProcampState->DW0.ProcampEnable = true;
561         pVeboxProcampState->DW0.Brightness    = pProcAmpParams->brightness;  // S7.4
562         pVeboxProcampState->DW0.Contrast      = pProcAmpParams->contrast;    // U4.7
563         pVeboxProcampState->DW1.SinCS         = pProcAmpParams->sinCS;       // S7.8
564         pVeboxProcampState->DW1.CosCS         = pProcAmpParams->cosCS;       // S7.8
565     }
566 
567     //!
568     //! \brief      Add VEBOX ACE/LACE States
569     //! \details    Add Vebox ACE, Lace states
570     //! \param      [in] pVeboxIecpParams
571     //!             Pointer to VEBOX IECP State Params
572     //! \return     voild
573     //!
SetVeboxAceLaceState(PMHW_VEBOX_IECP_PARAMS pVeboxIecpParams,typename TVeboxCmds::VEBOX_IECP_STATE_CMD * pVeboxIecpState)574     void SetVeboxAceLaceState(
575         PMHW_VEBOX_IECP_PARAMS                    pVeboxIecpParams,
576         typename TVeboxCmds::VEBOX_IECP_STATE_CMD *pVeboxIecpState)
577     {
578         MHW_FUNCTION_ENTER;
579         PMHW_ACE_PARAMS             pAceParams;
580         PMHW_VEBOX_HEAP             pVeboxHeap;
581         int32_t                     uiOffset;
582         MOS_STATUS                  eStatus = MOS_STATUS_SUCCESS;
583 
584         MHW_CHK_NULL_NO_STATUS_RETURN(pVeboxIecpParams);
585 
586         if (pVeboxIecpParams->ColorPipeParams.bActive &&
587             pVeboxIecpParams->ColorPipeParams.bEnableACE)
588         {
589             MHW_CHK_NULL_NO_STATUS_RETURN(pVeboxIecpState);
590             pAceParams = &pVeboxIecpParams->AceParams;
591             MHW_ASSERT(pAceParams->bActive);
592 
593             // Y is input, use wPWLF_X, Y4 as Max. Populate Y5-Ymax with max Y to
594             // avoid artifact
595             pVeboxIecpState->AceState.DW1.Ymin = pAceParams->wACEPWLF_X[0] >> 2;
596             pVeboxIecpState->AceState.DW1.Y1 = pAceParams->wACEPWLF_X[1] >> 2;
597             pVeboxIecpState->AceState.DW1.Y2 = pAceParams->wACEPWLF_X[2] >> 2;
598             pVeboxIecpState->AceState.DW1.Y3 = pAceParams->wACEPWLF_X[3] >> 2;
599             pVeboxIecpState->AceState.DW2.Y4 =
600                 pVeboxIecpState->AceState.DW2.Y5 =
601                 pVeboxIecpState->AceState.DW2.Y6 =
602                 pVeboxIecpState->AceState.DW2.Y7 =
603                 pVeboxIecpState->AceState.DW3.Y8 =
604                 pVeboxIecpState->AceState.DW3.Y9 =
605                 pVeboxIecpState->AceState.DW3.Y10 =
606                 pVeboxIecpState->AceState.DW3.Ymax = pAceParams->wACEPWLF_X[4] >> 2;
607 
608             // the bias is the output, therefore the Y in algorithm
609             pVeboxIecpState->AceState.DW4.B1 = pAceParams->wACEPWLF_Y[1] >> 2;
610             pVeboxIecpState->AceState.DW4.B2 = pAceParams->wACEPWLF_Y[2] >> 2;
611             pVeboxIecpState->AceState.DW4.B3 = pAceParams->wACEPWLF_Y[3] >> 2;
612 
613             // need to double check if slope is set incorrectly
614             pVeboxIecpState->AceState.DW7.S0 = pAceParams->wACEPWLF_S[0];
615             pVeboxIecpState->AceState.DW7.S1 = pAceParams->wACEPWLF_S[1];
616             pVeboxIecpState->AceState.DW8.S2 = pAceParams->wACEPWLF_S[2];
617             pVeboxIecpState->AceState.DW8.S3 = pAceParams->wACEPWLF_S[3];
618         }
619     }
620 
621     //!
622     //! \brief      Add VEBOX Capture pipe state
623     //! \details    Add VEBOX Capture pipe state
624     //! \param      [in] pCapPipeParams
625     //!             Pointer to capture pipe parameters
626     //! \return     void
627     //!
AddVeboxCapPipeState(PMHW_CAPPIPE_PARAMS pCapPipeParams)628     void AddVeboxCapPipeState(
629         PMHW_CAPPIPE_PARAMS pCapPipeParams)
630     {
631         MHW_FUNCTION_ENTER;
632         typename TVeboxCmds::VEBOX_CAPTURE_PIPE_STATE_CMD *pVeboxCapPipeState, CapPipCmd;
633 
634         PMHW_VEBOX_HEAP pVeboxHeap;
635         uint32_t        uiOffset;
636 
637         MHW_CHK_NULL_NO_STATUS_RETURN(pCapPipeParams);
638         MHW_CHK_NULL_NO_STATUS_RETURN(m_veboxHeap);
639 
640         pVeboxHeap = m_veboxHeap;
641         uiOffset   = pVeboxHeap->uiCurState * pVeboxHeap->uiInstanceSize;
642 
643         pVeboxCapPipeState =
644             (typename TVeboxCmds::VEBOX_CAPTURE_PIPE_STATE_CMD *)(pVeboxHeap->pLockedDriverResourceMem +
645                                                                   pVeboxHeap->uiCapturePipeStateOffset +
646                                                                   uiOffset);
647         MHW_CHK_NULL_NO_STATUS_RETURN(pVeboxCapPipeState);
648         *pVeboxCapPipeState = CapPipCmd;
649 
650         if (pCapPipeParams->BlackLevelParams.bActive)
651         {
652             pVeboxCapPipeState->DW2.BlackPointCorrectionEnable = true;
653             // Red
654             pVeboxCapPipeState->DW2.BlackPointOffsetRedMsb =
655                 (pCapPipeParams->BlackLevelParams.R & MOS_BITFIELD_BIT_N(16)) >> 16;
656             pVeboxCapPipeState->DW3.BlackPointOffsetRed =
657                 pCapPipeParams->BlackLevelParams.R & MOS_MASK(0, 15);
658             // Green Top
659             pVeboxCapPipeState->DW2.BlackPointOffsetGreenTopMsb =
660                 (pCapPipeParams->BlackLevelParams.G1 & MOS_BITFIELD_BIT_N(16)) >> 16;
661             pVeboxCapPipeState->DW3.BlackPointOffsetGreenTop =
662                 pCapPipeParams->BlackLevelParams.G1 & MOS_MASK(0, 15);
663             // Green Bottom
664             pVeboxCapPipeState->DW2.BlackPointOffsetGreenBottomMsb =
665                 (pCapPipeParams->BlackLevelParams.G0 & MOS_BITFIELD_BIT_N(16)) >> 16;
666             pVeboxCapPipeState->DW4.BlackPointOffsetGreenBottom =
667                 pCapPipeParams->BlackLevelParams.G0 & MOS_MASK(0, 15);
668             // Blue
669             pVeboxCapPipeState->DW2.BlackPointOffsetBlueMsb =
670                 (pCapPipeParams->BlackLevelParams.B & MOS_BITFIELD_BIT_N(16)) >> 16;
671             pVeboxCapPipeState->DW4.BlackPointOffsetBlue =
672                 pCapPipeParams->BlackLevelParams.B & MOS_MASK(0, 15);
673         }
674 
675         if (pCapPipeParams->WhiteBalanceParams.bActive &&
676             pCapPipeParams->WhiteBalanceParams.Mode == MHW_WB_MANUAL)
677         {
678             pVeboxCapPipeState->DW2.WhiteBalanceCorrectionEnable = true;
679 
680             // Is U4.12, so multiply the floating value by 4096
681             // Red
682             pVeboxCapPipeState->DW5.WhiteBalanceRedCorrection =
683                 (uint32_t)(pCapPipeParams->WhiteBalanceParams.RedCorrection * 4096);
684 
685             // Greep Top
686             pVeboxCapPipeState->DW5.WhiteBalanceGreenTopCorrection =
687                 (uint32_t)(pCapPipeParams->WhiteBalanceParams.GreenTopCorrection * 4096);
688 
689             // Green Bottom
690             pVeboxCapPipeState->DW6.WhiteBalanceGreenBottomCorrection =
691                 (uint32_t)(pCapPipeParams->WhiteBalanceParams.GreenBottomCorrection * 4096);
692 
693             // Blue
694             pVeboxCapPipeState->DW6.WhiteBalanceBlueCorrection =
695                 (uint32_t)(pCapPipeParams->WhiteBalanceParams.BlueCorrection * 4096);
696         }
697     }
698 
699     //!
700     //! \brief      Set Vebox Surface State
701     //! \details    Set Vebox surface state
702     //! \param      [in] pSurfaceParam
703     //!             Pointer to surface
704     //! \param      [in] pDerivedSurfaceParam
705     //!             Pointer to Derived surface
706     //! \param      [in] pSkinScoreSurfaceParam
707     //!             Pointer to Skin Score output surface
708     //! \param      [in] pVeboxSurfaceState
709     //!             Pointer to VEBOX surface state cmd
710     //! \param      [in] bIsOutputSurface
711     //!             Indicates whether surface is input or output
712     //! \param      [in] bDIEnable
713     //!             True if DI is enabled
714     //! \return     void
715     //!
716     virtual void SetVeboxSurfaces(
717         PMHW_VEBOX_SURFACE_PARAMS                     pSurfaceParam,
718         PMHW_VEBOX_SURFACE_PARAMS                     pDerivedSurfaceParam,
719         PMHW_VEBOX_SURFACE_PARAMS                     pSkinScoreSurfaceParam,
720         typename TVeboxCmds::VEBOX_SURFACE_STATE_CMD *pVeboxSurfaceState,
721         bool                                          bIsOutputSurface,
722         bool                                          bDIEnable) = 0;
723 
724 private:
725     //!
726     //! Vertext Table for BT601
727     //!
728     const unsigned short g_VeboxVertexTableBT601[512][2] =
729     {
730         //{  Cv,   Lv}
731         { 1936, 666 },{ 1932, 673 },{ 1928, 680 },{ 1924, 687 },
732         { 1920, 694 },{ 1917, 701 },{ 1913, 708 },{ 1910, 715 },
733         { 1906, 722 },{ 1903, 729 },{ 1900, 736 },{ 1897, 743 },
734         { 1894, 749 },{ 1891, 756 },{ 1888, 763 },{ 1885, 770 },
735         { 1882, 776 },{ 1880, 783 },{ 1877, 790 },{ 1875, 796 },
736         { 1872, 803 },{ 1870, 810 },{ 1868, 816 },{ 1866, 823 },
737         { 1864, 830 },{ 1862, 836 },{ 1860, 843 },{ 1858, 849 },
738         { 1856, 856 },{ 1854, 862 },{ 1853, 869 },{ 1851, 875 },
739         { 1849, 882 },{ 1848, 888 },{ 1847, 895 },{ 1845, 901 },
740         { 1844, 908 },{ 1843, 914 },{ 1842, 921 },{ 1841, 927 },
741         { 1840, 933 },{ 1839, 940 },{ 1838, 946 },{ 1838, 953 },
742         { 1837, 959 },{ 1836, 965 },{ 1836, 972 },{ 1835, 978 },
743         { 1835, 985 },{ 1835, 991 },{ 1834, 997 },{ 1834, 1004 },
744         { 1834, 1010 },{ 1834, 1017 },{ 1834, 1023 },{ 1834, 1029 },
745         { 1834, 1036 },{ 1835, 1042 },{ 1835, 1048 },{ 1835, 1055 },
746         { 1836, 1061 },{ 1836, 1068 },{ 1837, 1074 },{ 1837, 1080 },
747         { 1838, 1087 },{ 1839, 1093 },{ 1840, 1100 },{ 1841, 1106 },
748         { 1842, 1112 },{ 1843, 1119 },{ 1844, 1125 },{ 1845, 1132 },
749         { 1847, 1138 },{ 1848, 1145 },{ 1849, 1151 },{ 1851, 1158 },
750         { 1852, 1164 },{ 1854, 1171 },{ 1856, 1177 },{ 1858, 1184 },
751         { 1859, 1190 },{ 1861, 1197 },{ 1863, 1203 },{ 1866, 1210 },
752         { 1868, 1217 },{ 1870, 1223 },{ 1872, 1230 },{ 1875, 1236 },
753         { 1877, 1243 },{ 1880, 1250 },{ 1882, 1257 },{ 1885, 1263 },
754         { 1888, 1270 },{ 1891, 1277 },{ 1894, 1284 },{ 1897, 1290 },
755         { 1900, 1297 },{ 1903, 1304 },{ 1906, 1311 },{ 1910, 1318 },
756         { 1913, 1325 },{ 1916, 1332 },{ 1920, 1339 },{ 1924, 1346 },
757         { 1928, 1353 },{ 1931, 1360 },{ 1935, 1367 },{ 1939, 1374 },
758         { 1944, 1381 },{ 1948, 1388 },{ 1952, 1396 },{ 1957, 1403 },
759         { 1961, 1410 },{ 1966, 1417 },{ 1970, 1425 },{ 1975, 1432 },
760         { 1980, 1439 },{ 1985, 1447 },{ 1990, 1454 },{ 1995, 1462 },
761         { 2001, 1470 },{ 2006, 1477 },{ 2011, 1485 },{ 2017, 1492 },
762         { 2023, 1500 },{ 2029, 1508 },{ 2035, 1516 },{ 2041, 1524 },
763         { 2047, 1532 },{ 2053, 1540 },{ 2059, 1548 },{ 2066, 1556 },
764         { 2073, 1564 },{ 2079, 1572 },{ 2086, 1580 },{ 2093, 1588 },
765         { 2100, 1597 },{ 2108, 1605 },{ 2115, 1614 },{ 2123, 1622 },
766         { 2130, 1631 },{ 2138, 1639 },{ 2146, 1648 },{ 2154, 1657 },
767         { 2162, 1666 },{ 2171, 1674 },{ 2179, 1683 },{ 2186, 1691 },
768         { 2179, 1688 },{ 2172, 1684 },{ 2164, 1681 },{ 2157, 1678 },
769         { 2151, 1674 },{ 2144, 1671 },{ 2137, 1668 },{ 2131, 1664 },
770         { 2124, 1661 },{ 2118, 1658 },{ 2112, 1655 },{ 2106, 1651 },
771         { 2100, 1648 },{ 2094, 1645 },{ 2088, 1642 },{ 2083, 1639 },
772         { 2077, 1636 },{ 2072, 1633 },{ 2067, 1629 },{ 2061, 1626 },
773         { 2056, 1623 },{ 2051, 1620 },{ 2046, 1617 },{ 2042, 1614 },
774         { 2037, 1611 },{ 2032, 1608 },{ 2028, 1605 },{ 2024, 1602 },
775         { 2019, 1599 },{ 2015, 1596 },{ 2011, 1593 },{ 2007, 1590 },
776         { 2003, 1588 },{ 1999, 1585 },{ 1996, 1582 },{ 1992, 1579 },
777         { 1988, 1576 },{ 1985, 1573 },{ 1981, 1570 },{ 1978, 1568 },
778         { 1975, 1565 },{ 1972, 1562 },{ 1969, 1559 },{ 1966, 1556 },
779         { 1963, 1554 },{ 1960, 1551 },{ 1957, 1548 },{ 1955, 1545 },
780         { 1952, 1542 },{ 1950, 1540 },{ 1947, 1537 },{ 1945, 1534 },
781         { 1943, 1531 },{ 1941, 1529 },{ 1939, 1526 },{ 1937, 1523 },
782         { 1935, 1521 },{ 1933, 1518 },{ 1931, 1515 },{ 1929, 1513 },
783         { 1928, 1510 },{ 1926, 1507 },{ 1925, 1504 },{ 1923, 1502 },
784         { 1922, 1499 },{ 1921, 1496 },{ 1919, 1494 },{ 1918, 1491 },
785         { 1917, 1488 },{ 1916, 1486 },{ 1916, 1483 },{ 1915, 1481 },
786         { 1914, 1478 },{ 1913, 1475 },{ 1913, 1473 },{ 1912, 1470 },
787         { 1912, 1467 },{ 1911, 1465 },{ 1911, 1462 },{ 1911, 1459 },
788         { 1911, 1457 },{ 1911, 1454 },{ 1911, 1451 },{ 1911, 1449 },
789         { 1911, 1446 },{ 1911, 1444 },{ 1911, 1441 },{ 1912, 1438 },
790         { 1912, 1436 },{ 1912, 1433 },{ 1913, 1430 },{ 1914, 1428 },
791         { 1914, 1425 },{ 1915, 1422 },{ 1916, 1420 },{ 1917, 1417 },
792         { 1918, 1414 },{ 1919, 1412 },{ 1920, 1409 },{ 1921, 1406 },
793         { 1923, 1404 },{ 1924, 1401 },{ 1925, 1398 },{ 1927, 1396 },
794         { 1929, 1393 },{ 1930, 1390 },{ 1932, 1388 },{ 1934, 1385 },
795         { 1936, 1382 },{ 1938, 1380 },{ 1940, 1377 },{ 1942, 1374 },
796         { 1944, 1371 },{ 1946, 1369 },{ 1949, 1366 },{ 1951, 1363 },
797         { 1954, 1360 },{ 1956, 1358 },{ 1959, 1355 },{ 1962, 1352 },
798         { 1964, 1349 },{ 1967, 1347 },{ 1970, 1344 },{ 1973, 1341 },
799         { 1977, 1338 },{ 1980, 1335 },{ 1983, 1332 },{ 1987, 1330 },
800         { 1990, 1327 },{ 1994, 1324 },{ 1998, 1321 },{ 2001, 1318 },
801         { 2005, 1315 },{ 2009, 1312 },{ 2013, 1309 },{ 2017, 1306 },
802         { 2022, 1303 },{ 2026, 1300 },{ 2030, 1298 },{ 2035, 1295 },
803         { 2040, 1292 },{ 2044, 1289 },{ 2049, 1285 },{ 2054, 1282 },
804         { 2059, 1279 },{ 2064, 1276 },{ 2069, 1273 },{ 2075, 1270 },
805         { 2080, 1267 },{ 2086, 1264 },{ 2091, 1261 },{ 2097, 1258 },
806         { 2103, 1254 },{ 2109, 1251 },{ 2115, 1248 },{ 2121, 1245 },
807         { 2128, 1241 },{ 2134, 1238 },{ 2141, 1235 },{ 2147, 1232 },
808         { 2154, 1228 },{ 2161, 1225 },{ 2153, 1241 },{ 2145, 1259 },
809         { 2137, 1276 },{ 2128, 1293 },{ 2120, 1309 },{ 2113, 1326 },
810         { 2105, 1343 },{ 2097, 1359 },{ 2090, 1375 },{ 2083, 1392 },
811         { 2075, 1408 },{ 2068, 1424 },{ 2062, 1440 },{ 2055, 1455 },
812         { 2048, 1471 },{ 2042, 1486 },{ 2035, 1502 },{ 2029, 1517 },
813         { 2023, 1533 },{ 2016, 1548 },{ 2011, 1563 },{ 2005, 1578 },
814         { 1999, 1593 },{ 1993, 1608 },{ 1988, 1622 },{ 1982, 1637 },
815         { 1977, 1652 },{ 1972, 1666 },{ 1967, 1681 },{ 1962, 1695 },
816         { 1957, 1709 },{ 1952, 1723 },{ 1947, 1738 },{ 1942, 1752 },
817         { 1938, 1766 },{ 1933, 1780 },{ 1929, 1793 },{ 1925, 1807 },
818         { 1921, 1821 },{ 1917, 1835 },{ 1913, 1848 },{ 1909, 1862 },
819         { 1905, 1875 },{ 1901, 1889 },{ 1897, 1902 },{ 1894, 1916 },
820         { 1890, 1929 },{ 1887, 1942 },{ 1884, 1956 },{ 1881, 1969 },
821         { 1877, 1982 },{ 1874, 1995 },{ 1871, 2008 },{ 1868, 2021 },
822         { 1866, 2034 },{ 1863, 2047 },{ 1860, 2060 },{ 1858, 2073 },
823         { 1855, 2086 },{ 1853, 2098 },{ 1850, 2111 },{ 1848, 2124 },
824         { 1846, 2136 },{ 1844, 2149 },{ 1842, 2162 },{ 1840, 2174 },
825         { 1838, 2187 },{ 1836, 2200 },{ 1834, 2212 },{ 1832, 2225 },
826         { 1831, 2237 },{ 1829, 2250 },{ 1828, 2262 },{ 1826, 2274 },
827         { 1825, 2287 },{ 1824, 2299 },{ 1822, 2312 },{ 1821, 2324 },
828         { 1820, 2336 },{ 1819, 2349 },{ 1818, 2361 },{ 1818, 2373 },
829         { 1817, 2385 },{ 1816, 2398 },{ 1815, 2410 },{ 1815, 2422 },
830         { 1814, 2435 },{ 1814, 2447 },{ 1813, 2459 },{ 1813, 2471 },
831         { 1813, 2483 },{ 1813, 2496 },{ 1813, 2508 },{ 1813, 2520 },
832         { 1813, 2532 },{ 1813, 2545 },{ 1813, 2557 },{ 1813, 2569 },
833         { 1814, 2581 },{ 1814, 2594 },{ 1814, 2606 },{ 1815, 2618 },
834         { 1816, 2630 },{ 1816, 2643 },{ 1817, 2655 },{ 1818, 2667 },
835         { 1819, 2679 },{ 1819, 2692 },{ 1820, 2704 },{ 1822, 2716 },
836         { 1823, 2729 },{ 1824, 2741 },{ 1825, 2754 },{ 1827, 2766 },
837         { 1828, 2778 },{ 1829, 2791 },{ 1831, 2803 },{ 1833, 2816 },
838         { 1834, 2828 },{ 1836, 2841 },{ 1838, 2853 },{ 1840, 2866 },
839         { 1842, 2879 },{ 1844, 2891 },{ 1846, 2904 },{ 1848, 2917 },
840         { 1851, 2929 },{ 1853, 2942 },{ 1856, 2955 },{ 1858, 2968 },
841         { 1861, 2981 },{ 1863, 2994 },{ 1866, 3006 },{ 1869, 3019 },
842         { 1872, 3032 },{ 1875, 3046 },{ 1878, 3059 },{ 1881, 3072 },
843         { 1884, 3085 },{ 1888, 3098 },{ 1891, 3111 },{ 1895, 3125 },
844         { 1898, 3138 },{ 1902, 3152 },{ 1906, 3165 },{ 1909, 3179 },
845         { 1913, 3192 },{ 1917, 3206 },{ 1921, 3220 },{ 1926, 3233 },
846         { 1930, 3247 },{ 1934, 3261 },{ 1939, 3275 },{ 1943, 3289 },
847         { 1948, 3303 },{ 1953, 3317 },{ 1958, 3332 },{ 1962, 3346 },
848         { 1968, 3360 },{ 1973, 3375 },{ 1978, 3389 },{ 1983, 3404 },
849         { 1989, 3418 },{ 1994, 3433 },{ 2000, 3448 },{ 2006, 3463 },
850         { 2012, 3478 },{ 2018, 3493 },{ 2024, 3508 },{ 2030, 3524 },
851         { 2036, 3539 },{ 2043, 3554 },{ 2049, 3570 },{ 2056, 3586 },
852         { 2063, 3601 },{ 2070, 3617 },{ 2073, 3627 },{ 2066, 3619 },
853         { 2060, 3611 },{ 2054, 3603 },{ 2047, 3595 },{ 2041, 3587 },
854         { 2035, 3579 },{ 2029, 3571 },{ 2023, 3563 },{ 2017, 3556 },
855         { 2012, 3548 },{ 2006, 3540 },{ 2001, 3533 },{ 1996, 3525 },
856         { 1990, 3517 },{ 1985, 3510 },{ 1980, 3503 },{ 1975, 3495 },
857         { 1971, 3488 },{ 1966, 3480 },{ 1961, 3473 },{ 1957, 3466 },
858         { 1952, 3459 },{ 1948, 3451 },{ 1944, 3444 },{ 1940, 3437 }
859     };
860 
861     //!
862     //! Vertex Table
863     //!
864     const unsigned short g_VeboxVertexTableBT709[512][2] =
865     {
866         //{  Cv,   Lv}
867         { 2005, 375 },{ 2002, 381 },{ 2000, 386 },{ 1997, 391 },
868         { 1994, 396 },{ 1992, 401 },{ 1990, 407 },{ 1987, 412 },
869         { 1985, 417 },{ 1983, 422 },{ 1981, 427 },{ 1979, 432 },
870         { 1977, 437 },{ 1975, 442 },{ 1973, 447 },{ 1972, 453 },
871         { 1970, 458 },{ 1969, 463 },{ 1967, 468 },{ 1966, 473 },
872         { 1965, 478 },{ 1963, 483 },{ 1962, 488 },{ 1961, 493 },
873         { 1960, 498 },{ 1959, 503 },{ 1959, 508 },{ 1958, 513 },
874         { 1957, 518 },{ 1957, 523 },{ 1956, 528 },{ 1956, 533 },
875         { 1955, 538 },{ 1955, 543 },{ 1955, 548 },{ 1954, 553 },
876         { 1954, 558 },{ 1954, 563 },{ 1954, 568 },{ 1955, 572 },
877         { 1955, 577 },{ 1955, 582 },{ 1955, 587 },{ 1956, 592 },
878         { 1956, 597 },{ 1957, 602 },{ 1957, 607 },{ 1958, 612 },
879         { 1959, 617 },{ 1960, 622 },{ 1961, 627 },{ 1962, 632 },
880         { 1963, 637 },{ 1964, 642 },{ 1965, 647 },{ 1967, 652 },
881         { 1968, 657 },{ 1970, 662 },{ 1971, 668 },{ 1973, 673 },
882         { 1974, 678 },{ 1976, 683 },{ 1978, 688 },{ 1980, 693 },
883         { 1982, 698 },{ 1984, 703 },{ 1986, 708 },{ 1989, 713 },
884         { 1991, 719 },{ 1993, 724 },{ 1996, 729 },{ 1998, 734 },
885         { 2001, 739 },{ 2004, 744 },{ 2007, 750 },{ 2010, 755 },
886         { 2012, 760 },{ 2016, 766 },{ 2019, 771 },{ 2022, 776 },
887         { 2025, 781 },{ 2029, 787 },{ 2032, 792 },{ 2036, 798 },
888         { 2040, 803 },{ 2043, 808 },{ 2047, 814 },{ 2051, 819 },
889         { 2055, 825 },{ 2059, 830 },{ 2064, 836 },{ 2068, 841 },
890         { 2072, 847 },{ 2077, 853 },{ 2082, 858 },{ 2086, 864 },
891         { 2091, 869 },{ 2096, 875 },{ 2101, 881 },{ 2106, 887 },
892         { 2112, 892 },{ 2117, 898 },{ 2122, 904 },{ 2128, 910 },
893         { 2134, 916 },{ 2139, 922 },{ 2145, 928 },{ 2151, 934 },
894         { 2157, 940 },{ 2164, 946 },{ 2170, 952 },{ 2177, 958 },
895         { 2183, 964 },{ 2190, 971 },{ 2197, 977 },{ 2204, 983 },
896         { 2211, 989 },{ 2218, 996 },{ 2225, 1002 },{ 2233, 1009 },
897         { 2241, 1015 },{ 2248, 1022 },{ 2256, 1028 },{ 2264, 1035 },
898         { 2272, 1042 },{ 2281, 1049 },{ 2289, 1055 },{ 2298, 1062 },
899         { 2307, 1069 },{ 2316, 1076 },{ 2325, 1083 },{ 2334, 1090 },
900         { 2344, 1097 },{ 2353, 1104 },{ 2363, 1112 },{ 2373, 1119 },
901         { 2383, 1126 },{ 2393, 1134 },{ 2404, 1141 },{ 2414, 1149 },
902         { 2425, 1156 },{ 2436, 1164 },{ 2433, 1165 },{ 2423, 1162 },
903         { 2412, 1160 },{ 2402, 1157 },{ 2393, 1154 },{ 2383, 1152 },
904         { 2374, 1149 },{ 2364, 1147 },{ 2355, 1145 },{ 2346, 1142 },
905         { 2337, 1140 },{ 2329, 1137 },{ 2320, 1135 },{ 2312, 1132 },
906         { 2304, 1130 },{ 2296, 1128 },{ 2288, 1125 },{ 2280, 1123 },
907         { 2272, 1121 },{ 2265, 1119 },{ 2257, 1116 },{ 2250, 1114 },
908         { 2243, 1112 },{ 2236, 1110 },{ 2229, 1107 },{ 2223, 1105 },
909         { 2216, 1103 },{ 2209, 1101 },{ 2203, 1099 },{ 2197, 1097 },
910         { 2191, 1095 },{ 2185, 1092 },{ 2179, 1090 },{ 2173, 1088 },
911         { 2167, 1086 },{ 2162, 1084 },{ 2156, 1082 },{ 2151, 1080 },
912         { 2146, 1078 },{ 2141, 1076 },{ 2136, 1074 },{ 2131, 1072 },
913         { 2126, 1070 },{ 2121, 1068 },{ 2117, 1066 },{ 2112, 1064 },
914         { 2108, 1062 },{ 2103, 1060 },{ 2099, 1058 },{ 2095, 1056 },
915         { 2091, 1054 },{ 2087, 1052 },{ 2083, 1050 },{ 2079, 1048 },
916         { 2076, 1046 },{ 2072, 1045 },{ 2069, 1043 },{ 2065, 1041 },
917         { 2062, 1039 },{ 2059, 1037 },{ 2056, 1035 },{ 2053, 1033 },
918         { 2050, 1031 },{ 2047, 1030 },{ 2044, 1028 },{ 2041, 1026 },
919         { 2039, 1024 },{ 2036, 1022 },{ 2034, 1020 },{ 2031, 1019 },
920         { 2029, 1017 },{ 2027, 1015 },{ 2025, 1013 },{ 2023, 1011 },
921         { 2021, 1009 },{ 2019, 1008 },{ 2017, 1006 },{ 2015, 1004 },
922         { 2014, 1002 },{ 2012, 1001 },{ 2010, 999 },{ 2009, 997 },
923         { 2008, 995 },{ 2006, 993 },{ 2005, 992 }, { 2004, 990  },
924         { 2003, 988 },{ 2002, 986 },{ 2001, 984 }, { 2000, 983  },
925         { 2000, 981 },{ 1999, 979 },{ 1999, 977 },{ 1998, 976  },
926         { 1998, 974 },{ 1997, 972 },{ 1997, 970 },{ 1997, 969  },
927         { 1997, 967 },{ 1997, 965 },{ 1997, 963 },{ 1997, 962  },
928         { 1997, 960 },{ 1997, 958 },{ 1998, 956 },{ 1998, 955  },
929         { 1998, 953 },{ 1999, 951 },{ 2000, 949 },{ 2000, 947  },
930         { 2001, 946 },{ 2002, 944 },{ 2003, 942 },{ 2004, 940  },
931         { 2005, 939 },{ 2006, 937 },{ 2007, 935 },{ 2009, 933  },
932         { 2010, 931 },{ 2012, 930 },{ 2013, 928 },{ 2015, 926  },
933         { 2016, 924 },{ 2018, 923 },{ 2020, 921 },{ 2022, 919  },
934         { 2024, 917 },{ 2026, 915 },{ 2028, 913 },{ 2031, 912  },
935         { 2033, 910 },{ 2035, 908 },{ 2038, 906 },{ 2041, 904  },
936         { 2043, 902 },{ 2046, 901 },{ 2049, 899 },{ 2052, 897  },
937         { 2055, 895 },{ 2058, 893 },{ 2061, 891 },{ 2064, 889  },
938         { 2068, 888 },{ 2071, 886 },{ 2075, 884 },{ 2078, 882  },
939         { 2082, 880 },{ 2086, 878 },{ 2090, 876 },{ 2094, 874  },
940         { 2098, 872 },{ 2098, 876 },{ 2089, 895 },{ 2080, 914  },
941         { 2070, 933 },{ 2061, 952 },{ 2052, 970 },{ 2044, 989  },
942         { 2035, 1007 },{ 2027, 1025 },{ 2019, 1043 },{ 2010, 1061 },
943         { 2002, 1078 },{ 1995, 1096 },{ 1987, 1113 },{ 1979, 1130 },
944         { 1972, 1148 },{ 1964, 1164 },{ 1957, 1181 },{ 1950, 1198 },
945         { 1943, 1215 },{ 1936, 1231 },{ 1930, 1247 },{ 1923, 1264 },
946         { 1917, 1280 },{ 1910, 1296 },{ 1904, 1312 },{ 1898, 1328 },
947         { 1892, 1343 },{ 1886, 1359 },{ 1880, 1374 },{ 1875, 1390 },
948         { 1869, 1405 },{ 1863, 1420 },{ 1858, 1436 },{ 1853, 1451 },
949         { 1848, 1466 },{ 1843, 1481 },{ 1838, 1495 },{ 1833, 1510 },
950         { 1828, 1525 },{ 1823, 1539 },{ 1819, 1554 },{ 1814, 1568 },
951         { 1810, 1583 },{ 1805, 1597 },{ 1801, 1611 },{ 1797, 1625 },
952         { 1793, 1640 },{ 1789, 1654 },{ 1785, 1668 },{ 1781, 1681 },
953         { 1777, 1695 },{ 1774, 1709 },{ 1770, 1723 },{ 1767, 1737 },
954         { 1763, 1750 },{ 1760, 1764 },{ 1756, 1777 },{ 1753, 1791 },
955         { 1750, 1804 },{ 1747, 1818 },{ 1744, 1831 },{ 1741, 1844 },
956         { 1739, 1857 },{ 1736, 1871 },{ 1733, 1884 },{ 1731, 1897 },
957         { 1728, 1910 },{ 1726, 1923 },{ 1723, 1936 },{ 1721, 1949 },
958         { 1719, 1962 },{ 1717, 1975 },{ 1715, 1988 },{ 1713, 2001 },
959         { 1711, 2014 },{ 1709, 2026 },{ 1707, 2039 },{ 1705, 2052 },
960         { 1703, 2065 },{ 1702, 2077 },{ 1700, 2090 },{ 1699, 2103 },
961         { 1697, 2115 },{ 1696, 2128 },{ 1695, 2140 },{ 1694, 2153 },
962         { 1693, 2165 },{ 1691, 2178 },{ 1690, 2191 },{ 1689, 2203 },
963         { 1689, 2216 },{ 1688, 2228 },{ 1687, 2240 },{ 1686, 2253 },
964         { 1686, 2265 },{ 1685, 2278 },{ 1685, 2290 },{ 1684, 2303 },
965         { 1684, 2315 },{ 1684, 2327 },{ 1683, 2340 },{ 1683, 2352 },
966         { 1683, 2365 },{ 1683, 2377 },{ 1683, 2389 },{ 1683, 2402 },
967         { 1683, 2414 },{ 1683, 2427 },{ 1684, 2439 },{ 1684, 2451 },
968         { 1684, 2464 },{ 1685, 2476 },{ 1685, 2489 },{ 1686, 2501 },
969         { 1687, 2514 },{ 1687, 2526 },{ 1688, 2539 },{ 1689, 2551 },
970         { 1690, 2564 },{ 1691, 2576 },{ 1692, 2589 },{ 1693, 2601 },
971         { 1694, 2614 },{ 1695, 2626 },{ 1697, 2639 },{ 1698, 2651 },
972         { 1699, 2664 },{ 1701, 2677 },{ 1702, 2689 },{ 1704, 2702 },
973         { 1706, 2715 },{ 1708, 2728 },{ 1709, 2740 },{ 1711, 2753 },
974         { 1713, 2766 },{ 1715, 2779 },{ 1717, 2792 },{ 1720, 2805 },
975         { 1722, 2818 },{ 1724, 2831 },{ 1726, 2844 },{ 1729, 2857 },
976         { 1731, 2870 },{ 1734, 2883 },{ 1737, 2896 },{ 1740, 2909 },
977         { 1742, 2923 },{ 1745, 2936 },{ 1748, 2949 },{ 1751, 2963 },
978         { 1754, 2976 },{ 1758, 2990 },{ 1761, 3003 },{ 1764, 3017 },
979         { 1768, 3030 },{ 1771, 3044 },{ 1775, 3058 },{ 1779, 3072 },
980         { 1782, 3086 },{ 1786, 3100 },{ 1790, 3114 },{ 1794, 3128 },
981         { 1798, 3142 },{ 1802, 3156 },{ 1807, 3170 },{ 1811, 3184 },
982         { 1816, 3199 },{ 1820, 3213 },{ 1825, 3228 },{ 1830, 3243 },
983         { 1834, 3257 },{ 1839, 3272 },{ 1844, 3287 },{ 1849, 3302 },
984         { 1855, 3317 },{ 1860, 3332 },{ 1865, 3347 },{ 1871, 3362 },
985         { 1877, 3378 },{ 1882, 3393 },{ 1888, 3409 },{ 1894, 3424 },
986         { 1900, 3440 },{ 1906, 3456 },{ 1913, 3472 },{ 1919, 3488 },
987         { 1925, 3504 },{ 1932, 3520 },{ 1939, 3537 },{ 1946, 3553 },
988         { 1953, 3570 },{ 1960, 3587 },{ 1967, 3604 },{ 1974, 3621 },
989         { 1982, 3638 },{ 1990, 3655 },{ 1997, 3672 },{ 2005, 3690 },
990         { 2013, 3708 },{ 2021, 3725 },{ 2030, 3743 },{ 2038, 3761 },
991         { 2047, 3780 },{ 2056, 3798 },{ 2053, 3795 },{ 2049, 3790 },
992         { 2045, 3784 },{ 2041, 3779 },{ 2037, 3774 },{ 2034, 3768 },
993         { 2030, 3763 },{ 2027, 3758 },{ 2023, 3752 },{ 2020, 3747 },
994         { 2017, 3742 },{ 2014, 3736 },{ 2011, 3731 },{ 2008, 3726 }
995     };
996 };
997 #endif  // __MHW_VEBOX_GENERIC_H__
998