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