1 /* 2 # Copyright (c) 2024, 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_vdbox_vvcp_impl_xe2_lpm.h 24 //! \brief MHW VDBOX VVCP interface common base for Xe2_LPM 25 //! \details 26 //! 27 28 #ifndef __MHW_VDBOX_VVCP_IMPL_XE2_LPM_H__ 29 #define __MHW_VDBOX_VVCP_IMPL_XE2_LPM_H__ 30 31 #include "mhw_vdbox_vvcp_impl_xe2_lpm_base.h" 32 #include "mhw_mi_hwcmd_xe2_lpm_base_next.h" 33 #include "mhw_vdbox_vvcp_hwcmd_xe2_lpm_X.h" 34 35 namespace mhw 36 { 37 namespace vdbox 38 { 39 namespace vvcp 40 { 41 namespace xe2_lpm_base 42 { 43 namespace xe2_lpm 44 { 45 46 class Impl : public BaseImpl<Cmd> 47 { 48 protected: 49 using cmd_t = Cmd; 50 using base_t = BaseImpl<cmd_t>; 51 52 public: Impl(PMOS_INTERFACE osItf,MhwCpInterface * cpItf)53 Impl(PMOS_INTERFACE osItf, MhwCpInterface *cpItf) : base_t(osItf, cpItf){}; 54 GetVvcpStateCmdSize(uint32_t * commandsSize,uint32_t * patchListSize,PMHW_VDBOX_STATE_CMDSIZE_PARAMS params)55 MOS_STATUS GetVvcpStateCmdSize(uint32_t *commandsSize, uint32_t *patchListSize, PMHW_VDBOX_STATE_CMDSIZE_PARAMS params) override 56 { 57 MHW_FUNCTION_ENTER; 58 59 MHW_MI_CHK_NULL(commandsSize); 60 MHW_MI_CHK_NULL(patchListSize); 61 62 uint32_t maxSize = 0; 63 uint32_t patchListMaxSize = 0; 64 65 maxSize = 66 mhw::mi::xe2_lpm_base_next::Cmd::MI_FLUSH_DW_CMD::byteSize + 67 cmd_t::VVCP_SURFACE_STATE_CMD::byteSize * 16 + 68 cmd_t::VVCP_PIPE_BUF_ADDR_STATE_CMD::byteSize + 69 cmd_t::VVCP_IND_OBJ_BASE_ADDR_STATE_CMD::byteSize + 70 cmd_t::VVCP_DPB_STATE_CMD::byteSize + 71 cmd_t::VVCP_PIC_STATE_CMD::byteSize; 72 73 patchListMaxSize = 74 PATCH_LIST_COMMAND(mhw::mi::Itf::MI_FLUSH_DW_CMD) + 75 PATCH_LIST_COMMAND(mhw::vdbox::vvcp::VVCP_SURFACE_STATE_CMD) * 16 + 76 PATCH_LIST_COMMAND(mhw::vdbox::vvcp::VVCP_PIPE_BUF_ADDR_STATE_CMD) + 77 PATCH_LIST_COMMAND(mhw::vdbox::vvcp::VVCP_IND_OBJ_BASE_ADDR_STATE_CMD) + 78 PATCH_LIST_COMMAND(mhw::vdbox::vvcp::VVCP_PIC_STATE_CMD); 79 80 *commandsSize = maxSize; 81 *patchListSize = patchListMaxSize; 82 83 return MOS_STATUS_SUCCESS; 84 } 85 GetVvcpSliceLvlCmdSize(uint32_t * sliceLvlCmdSize)86 MOS_STATUS GetVvcpSliceLvlCmdSize( 87 uint32_t *sliceLvlCmdSize) override 88 { 89 MHW_FUNCTION_ENTER; 90 91 MHW_MI_CHK_NULL(sliceLvlCmdSize); 92 if (m_decodeInUse) 93 { 94 *sliceLvlCmdSize = 95 cmd_t::VVCP_SLICE_STATE_CMD::byteSize + 96 cmd_t::VVCP_REF_IDX_STATE_CMD::byteSize * 2 + 97 cmd_t::VVCP_WEIGHTOFFSET_STATE_CMD::byteSize * 2 + 98 cmd_t::VVCP_BSD_OBJECT_CMD::byteSize + 99 cmd_t::VVCP_TILE_CODING_CMD::byteSize + 100 cmd_t::VVCP_VD_CONTROL_STATE_CMD::byteSize * 2 + 101 cmd_t::VVCP_PIPE_MODE_SELECT_CMD::byteSize + 102 mhw::mi::xe2_lpm_base_next::Cmd::MFX_WAIT_CMD::byteSize * 2 + 103 mhw::mi::xe2_lpm_base_next::Cmd::MI_BATCH_BUFFER_END_CMD::byteSize + 104 mhw::mi::xe2_lpm_base_next::Cmd::MI_BATCH_BUFFER_START_CMD::byteSize; 105 } 106 return MOS_STATUS_SUCCESS; 107 } 108 GetVvcpPrimitiveCmdSize(uint32_t * sliceCommandsSize,uint32_t * slicePatchListSize,uint32_t * tileCommandsSize,uint32_t * tilePatchListSize)109 MOS_STATUS GetVvcpPrimitiveCmdSize( 110 uint32_t *sliceCommandsSize, 111 uint32_t *slicePatchListSize, 112 uint32_t *tileCommandsSize, 113 uint32_t *tilePatchListSize) override 114 { 115 MHW_FUNCTION_ENTER; 116 117 MHW_MI_CHK_NULL(sliceCommandsSize); 118 MHW_MI_CHK_NULL(slicePatchListSize); 119 MHW_MI_CHK_NULL(tileCommandsSize); 120 MHW_MI_CHK_NULL(tilePatchListSize); 121 122 uint32_t maxSize = 0; 123 uint32_t patchListMaxSize = 0; 124 125 if (m_decodeInUse) 126 { 127 // MI_BATCH_BUFFER_START is added here because each slice needs to jump to pic-level cmd in 2nd level BB 128 maxSize = 129 cmd_t::VVCP_SLICE_STATE_CMD::byteSize + 130 cmd_t::VVCP_REF_IDX_STATE_CMD::byteSize * 2 + 131 cmd_t::VVCP_WEIGHTOFFSET_STATE_CMD::byteSize * 2 + 132 cmd_t::VVCP_BSD_OBJECT_CMD::byteSize + 133 cmd_t::VVCP_TILE_CODING_CMD::byteSize + 134 cmd_t::VVCP_VD_CONTROL_STATE_CMD::byteSize * 2 + 135 cmd_t::VVCP_PIPE_MODE_SELECT_CMD::byteSize + 136 mhw::mi::xe2_lpm_base_next::Cmd::MFX_WAIT_CMD::byteSize * 2 + 137 mhw::mi::xe2_lpm_base_next::Cmd::MI_BATCH_BUFFER_END_CMD::byteSize + 138 mhw::mi::xe2_lpm_base_next::Cmd::MI_BATCH_BUFFER_START_CMD::byteSize + 139 8;//VD_PIPELINE_FLUSH_CMD::byteSize is 8 140 141 patchListMaxSize = 142 PATCH_LIST_COMMAND(mhw::vdbox::vvcp::VVCP_SLICE_STATE_CMD) + 143 PATCH_LIST_COMMAND(mhw::vdbox::vvcp::VVCP_REF_IDX_STATE_CMD) * 2 + 144 PATCH_LIST_COMMAND(mhw::vdbox::vvcp::VVCP_WEIGHTOFFSET_STATE_CMD) * 2 + 145 PATCH_LIST_COMMAND(mhw::vdbox::vvcp::VVCP_BSD_OBJECT_CMD) + 146 PATCH_LIST_COMMAND(mhw::vdbox::vvcp::VVCP_TILE_CODING_CMD) + 147 PATCH_LIST_COMMAND(mhw::vdbox::vvcp::VVCP_VD_CONTROL_STATE_CMD) * 2 + 148 PATCH_LIST_COMMAND(mhw::vdbox::vvcp::VD_PIPELINE_FLUSH_CMD) + 149 PATCH_LIST_COMMAND(mhw::vdbox::vvcp::VVCP_PIPE_MODE_SELECT_CMD) + 150 PATCH_LIST_COMMAND(MI_BATCH_BUFFER_START_CMD); 151 152 *tileCommandsSize = cmd_t::VVCP_TILE_CODING_CMD::byteSize + 153 mhw::mi::xe2_lpm_base_next::Cmd::MI_BATCH_BUFFER_END_CMD::byteSize; 154 *tilePatchListSize = PATCH_LIST_COMMAND(VVCP_TILE_CODING_CMD); 155 } 156 157 *sliceCommandsSize = maxSize; 158 *slicePatchListSize = patchListMaxSize; 159 160 return MOS_STATUS_SUCCESS; 161 } 162 SetAlfApsDataBuffer(uint32_t * buffer,CodecVvcAlfData * alfApsArray,uint8_t activeAlfMask)163 MOS_STATUS SetAlfApsDataBuffer(uint32_t *buffer, CodecVvcAlfData *alfApsArray, uint8_t activeAlfMask) 164 { 165 MHW_FUNCTION_ENTER; 166 167 MHW_MI_CHK_NULL(buffer); 168 MHW_MI_CHK_NULL(alfApsArray); 169 170 cmd_t::VVCP_APS_ALF_PARAMSET *alfBuffer = (cmd_t::VVCP_APS_ALF_PARAMSET *)buffer; 171 172 for (auto i = 0; i < 8; i++) 173 { 174 if ((activeAlfMask >> i) & 0x1) 175 { 176 // Luma Coeff Delta Idx 177 alfBuffer[i].DW0.AlfLumaCoeffDeltaIdx0 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[0]; 178 alfBuffer[i].DW0.AlfLumaCoeffDeltaIdx1 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[1]; 179 alfBuffer[i].DW0.AlfLumaCoeffDeltaIdx2 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[2]; 180 alfBuffer[i].DW0.AlfLumaCoeffDeltaIdx3 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[3]; 181 alfBuffer[i].DW0.AlfLumaCoeffDeltaIdx4 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[4]; 182 alfBuffer[i].DW0.AlfLumaCoeffDeltaIdx5 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[5]; 183 184 alfBuffer[i].DW1.AlfLumaCoeffDeltaIdx6 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[6]; 185 alfBuffer[i].DW1.AlfLumaCoeffDeltaIdx7 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[7]; 186 alfBuffer[i].DW1.AlfLumaCoeffDeltaIdx8 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[8]; 187 alfBuffer[i].DW1.AlfLumaCoeffDeltaIdx9 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[9]; 188 alfBuffer[i].DW1.AlfLumaCoeffDeltaIdx10 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[10]; 189 alfBuffer[i].DW1.AlfLumaCoeffDeltaIdx11 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[11]; 190 191 alfBuffer[i].DW2.AlfLumaCoeffDeltaIdx12 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[12]; 192 alfBuffer[i].DW2.AlfLumaCoeffDeltaIdx13 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[13]; 193 alfBuffer[i].DW2.AlfLumaCoeffDeltaIdx14 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[14]; 194 alfBuffer[i].DW2.AlfLumaCoeffDeltaIdx15 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[15]; 195 alfBuffer[i].DW2.AlfLumaCoeffDeltaIdx16 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[16]; 196 alfBuffer[i].DW2.AlfLumaCoeffDeltaIdx17 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[17]; 197 198 alfBuffer[i].DW3.AlfLumaCoeffDeltaIdx18 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[18]; 199 alfBuffer[i].DW3.AlfLumaCoeffDeltaIdx19 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[19]; 200 alfBuffer[i].DW3.AlfLumaCoeffDeltaIdx20 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[20]; 201 alfBuffer[i].DW3.AlfLumaCoeffDeltaIdx21 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[21]; 202 alfBuffer[i].DW3.AlfLumaCoeffDeltaIdx22 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[22]; 203 alfBuffer[i].DW3.AlfLumaCoeffDeltaIdx23 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[23]; 204 205 alfBuffer[i].DW4.AlfLumaCoeffDeltaIdx24 = alfApsArray[i].m_alfLumaCoeffDeltaIdx[24]; 206 207 // Alf Luma Clip Idx 208 for (auto j = 0; j < 25; j++) 209 { 210 alfBuffer[i].AlfLumaClipIdx[j].alf_luma_clip_idx0 = alfApsArray[i].m_alfLumaClipIdx[j][0]; 211 alfBuffer[i].AlfLumaClipIdx[j].alf_luma_clip_idx1 = alfApsArray[i].m_alfLumaClipIdx[j][1]; 212 alfBuffer[i].AlfLumaClipIdx[j].alf_luma_clip_idx2 = alfApsArray[i].m_alfLumaClipIdx[j][2]; 213 alfBuffer[i].AlfLumaClipIdx[j].alf_luma_clip_idx3 = alfApsArray[i].m_alfLumaClipIdx[j][3]; 214 alfBuffer[i].AlfLumaClipIdx[j].alf_luma_clip_idx4 = alfApsArray[i].m_alfLumaClipIdx[j][4]; 215 alfBuffer[i].AlfLumaClipIdx[j].alf_luma_clip_idx5 = alfApsArray[i].m_alfLumaClipIdx[j][5]; 216 alfBuffer[i].AlfLumaClipIdx[j].alf_luma_clip_idx6 = alfApsArray[i].m_alfLumaClipIdx[j][6]; 217 alfBuffer[i].AlfLumaClipIdx[j].alf_luma_clip_idx7 = alfApsArray[i].m_alfLumaClipIdx[j][7]; 218 alfBuffer[i].AlfLumaClipIdx[j].alf_luma_clip_idx8 = alfApsArray[i].m_alfLumaClipIdx[j][8]; 219 alfBuffer[i].AlfLumaClipIdx[j].alf_luma_clip_idx9 = alfApsArray[i].m_alfLumaClipIdx[j][9]; 220 alfBuffer[i].AlfLumaClipIdx[j].alf_luma_clip_idx10 = alfApsArray[i].m_alfLumaClipIdx[j][10]; 221 alfBuffer[i].AlfLumaClipIdx[j].alf_luma_clip_idx11 = alfApsArray[i].m_alfLumaClipIdx[j][11]; 222 } 223 224 alfBuffer[i].DW30_Reserved = 0; 225 alfBuffer[i].DW31_Reserved = 0; 226 227 // CoeffL 228 for (auto k = 0; k < 25; k++) 229 { 230 int32_t clIdx = k / 5; 231 int32_t startDW = (clIdx << 4) + (k % 5) * 3; 232 233 // CoeffL[K] 234 alfBuffer[i].AlfCoeffL[startDW] = Pack4Bytes2DW(alfApsArray[i].m_alfCoeffL[k][0], 235 alfApsArray[i].m_alfCoeffL[k][1], 236 alfApsArray[i].m_alfCoeffL[k][2], 237 alfApsArray[i].m_alfCoeffL[k][3]); 238 alfBuffer[i].AlfCoeffL[startDW + 1] = Pack4Bytes2DW(alfApsArray[i].m_alfCoeffL[k][4], 239 alfApsArray[i].m_alfCoeffL[k][5], 240 alfApsArray[i].m_alfCoeffL[k][6], 241 alfApsArray[i].m_alfCoeffL[k][7]); 242 alfBuffer[i].AlfCoeffL[startDW + 2] = Pack4Bytes2DW(alfApsArray[i].m_alfCoeffL[k][8], 243 alfApsArray[i].m_alfCoeffL[k][9], 244 alfApsArray[i].m_alfCoeffL[k][10], 245 alfApsArray[i].m_alfCoeffL[k][11]); 246 } 247 248 // AlfCoeffC 249 for (auto j = 0; j < 8; j += 2) 250 { 251 int32_t startDW = (j >> 1) * 3; 252 alfBuffer[i].AlfCoeffC[startDW] = Pack4Bytes2DW(alfApsArray[i].m_alfCoeffC[j][0], 253 alfApsArray[i].m_alfCoeffC[j][1], 254 alfApsArray[i].m_alfCoeffC[j][2], 255 alfApsArray[i].m_alfCoeffC[j][3]); 256 alfBuffer[i].AlfCoeffC[startDW + 1] = Pack4Bytes2DW(alfApsArray[i].m_alfCoeffC[j][4], 257 alfApsArray[i].m_alfCoeffC[j][5], 258 alfApsArray[i].m_alfCoeffC[j + 1][0], 259 alfApsArray[i].m_alfCoeffC[j + 1][1]); 260 alfBuffer[i].AlfCoeffC[startDW + 2] = Pack4Bytes2DW(alfApsArray[i].m_alfCoeffC[j + 1][2], 261 alfApsArray[i].m_alfCoeffC[j + 1][3], 262 alfApsArray[i].m_alfCoeffC[j + 1][4], 263 alfApsArray[i].m_alfCoeffC[j + 1][5]); 264 } 265 266 // alf_chroma_clip_idx 267 alfBuffer[i].AlfChromaClipIdx[0] = alfApsArray[i].m_alfChromaClipIdx[0][0] | 268 (alfApsArray[i].m_alfChromaClipIdx[0][1] << 2) | 269 (alfApsArray[i].m_alfChromaClipIdx[0][2] << 4) | 270 (alfApsArray[i].m_alfChromaClipIdx[0][3] << 6) | 271 (alfApsArray[i].m_alfChromaClipIdx[0][4] << 8) | 272 (alfApsArray[i].m_alfChromaClipIdx[0][5] << 10) | 273 (alfApsArray[i].m_alfChromaClipIdx[1][0] << 12) | 274 (alfApsArray[i].m_alfChromaClipIdx[1][1] << 14) | 275 (alfApsArray[i].m_alfChromaClipIdx[1][2] << 16) | 276 (alfApsArray[i].m_alfChromaClipIdx[1][3] << 18) | 277 (alfApsArray[i].m_alfChromaClipIdx[1][4] << 20) | 278 (alfApsArray[i].m_alfChromaClipIdx[1][5] << 22) | 279 (alfApsArray[i].m_alfChromaClipIdx[2][0] << 24) | 280 (alfApsArray[i].m_alfChromaClipIdx[2][1] << 26) | 281 (alfApsArray[i].m_alfChromaClipIdx[2][2] << 28) | 282 (alfApsArray[i].m_alfChromaClipIdx[2][3] << 30); 283 284 alfBuffer[i].AlfChromaClipIdx[1] = alfApsArray[i].m_alfChromaClipIdx[2][4] | 285 (alfApsArray[i].m_alfChromaClipIdx[2][5] << 2) | 286 (alfApsArray[i].m_alfChromaClipIdx[3][0] << 4) | 287 (alfApsArray[i].m_alfChromaClipIdx[3][1] << 6) | 288 (alfApsArray[i].m_alfChromaClipIdx[3][2] << 8) | 289 (alfApsArray[i].m_alfChromaClipIdx[3][3] << 10) | 290 (alfApsArray[i].m_alfChromaClipIdx[3][4] << 12) | 291 (alfApsArray[i].m_alfChromaClipIdx[3][5] << 14) | 292 (alfApsArray[i].m_alfChromaClipIdx[4][0] << 16) | 293 (alfApsArray[i].m_alfChromaClipIdx[4][1] << 18) | 294 (alfApsArray[i].m_alfChromaClipIdx[4][2] << 20) | 295 (alfApsArray[i].m_alfChromaClipIdx[4][3] << 22) | 296 (alfApsArray[i].m_alfChromaClipIdx[4][4] << 24) | 297 (alfApsArray[i].m_alfChromaClipIdx[4][5] << 26) | 298 (alfApsArray[i].m_alfChromaClipIdx[5][0] << 28) | 299 (alfApsArray[i].m_alfChromaClipIdx[5][1] << 30); 300 301 alfBuffer[i].AlfChromaClipIdx[2] = alfApsArray[i].m_alfChromaClipIdx[5][2] | 302 (alfApsArray[i].m_alfChromaClipIdx[5][3] << 2) | 303 (alfApsArray[i].m_alfChromaClipIdx[5][4] << 4) | 304 (alfApsArray[i].m_alfChromaClipIdx[5][5] << 6) | 305 (alfApsArray[i].m_alfChromaClipIdx[6][0] << 8) | 306 (alfApsArray[i].m_alfChromaClipIdx[6][1] << 10) | 307 (alfApsArray[i].m_alfChromaClipIdx[6][2] << 12) | 308 (alfApsArray[i].m_alfChromaClipIdx[6][3] << 14) | 309 (alfApsArray[i].m_alfChromaClipIdx[6][4] << 16) | 310 (alfApsArray[i].m_alfChromaClipIdx[6][5] << 18) | 311 (alfApsArray[i].m_alfChromaClipIdx[7][0] << 20) | 312 (alfApsArray[i].m_alfChromaClipIdx[7][1] << 22) | 313 (alfApsArray[i].m_alfChromaClipIdx[7][2] << 24) | 314 (alfApsArray[i].m_alfChromaClipIdx[7][3] << 26) | 315 (alfApsArray[i].m_alfChromaClipIdx[7][4] << 28) | 316 (alfApsArray[i].m_alfChromaClipIdx[7][5] << 30); 317 318 alfBuffer[i].D127_Reserved = 0; 319 320 // CC Cb Coeff Sign 321 uint32_t ccCbCoeffSign = 0; 322 for (auto j = 0; j < 4; j++) 323 { 324 for (auto k = 0; k < 7; k++) 325 { 326 ccCbCoeffSign |= (alfApsArray[i].m_ccAlfApsCoeffCb[j][k] < 0 ? 0x1 : 0x0) << (j * 7 + k); 327 } 328 } 329 alfBuffer[i].DW128.AlfCcCbCoeffSign = ccCbCoeffSign; 330 alfBuffer[i].DW128.AlfCcCbFiltersSignalledMinus1 = alfApsArray[i].m_alfCcCbFiltersSignalledMinus1 & 0x3; 331 332 //CC Cb Coeff ABS 333 alfBuffer[i].AlfCcCbMappedCoeffAbs[0] = Pack4Bytes2DW( 334 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[0][0])) & 0x7, 335 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[0][1])) & 0x7, 336 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[0][2])) & 0x7, 337 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[0][3])) & 0x7); 338 339 alfBuffer[i].AlfCcCbMappedCoeffAbs[1] = Pack4Bytes2DW( 340 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[0][4])) & 0x7, 341 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[0][5])) & 0x7, 342 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[0][6])) & 0x7, 343 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[1][0])) & 0x7); 344 345 alfBuffer[i].AlfCcCbMappedCoeffAbs[2] = Pack4Bytes2DW( 346 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[1][1])) & 0x7, 347 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[1][2])) & 0x7, 348 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[1][3])) & 0x7, 349 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[1][4])) & 0x7); 350 351 alfBuffer[i].AlfCcCbMappedCoeffAbs[3] = Pack4Bytes2DW( 352 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[1][5])) & 0x7, 353 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[1][6])) & 0x7, 354 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[2][0])) & 0x7, 355 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[2][1])) & 0x7); 356 357 alfBuffer[i].AlfCcCbMappedCoeffAbs[4] = Pack4Bytes2DW( 358 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[2][2])) & 0x7, 359 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[2][3])) & 0x7, 360 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[2][4])) & 0x7, 361 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[2][5])) & 0x7); 362 363 alfBuffer[i].AlfCcCbMappedCoeffAbs[5] = Pack4Bytes2DW( 364 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[2][6])) & 0x7, 365 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[3][0])) & 0x7, 366 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[3][1])) & 0x7, 367 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[3][2])) & 0x7); 368 369 alfBuffer[i].AlfCcCbMappedCoeffAbs[6] = Pack4Bytes2DW( 370 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[3][3])) & 0x7, 371 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[3][4])) & 0x7, 372 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[3][5])) & 0x7, 373 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCb[3][6])) & 0x7); 374 375 // CC Cr Coeff Sign 376 uint32_t ccCrCoeffSign = 0; 377 for (auto j = 0; j < 4; j++) 378 { 379 for (auto k = 0; k < 7; k++) 380 { 381 ccCrCoeffSign |= (alfApsArray[i].m_ccAlfApsCoeffCr[j][k] < 0 ? 0x1 : 0x0) << (j * 7 + k); 382 } 383 } 384 alfBuffer[i].DW136.AlfCcCrCoeffSign = ccCrCoeffSign; 385 alfBuffer[i].DW136.AlfCcCrFiltersSignalledMinus1 = alfApsArray[i].m_alfCcCrFiltersSignalledMinus1 & 0x3; 386 387 // CC Cr Coeff ABS 388 alfBuffer[i].AlfCcCrMappedCoeffAbs[0] = Pack4Bytes2DW( 389 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[0][0])) & 0x7, 390 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[0][1])) & 0x7, 391 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[0][2])) & 0x7, 392 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[0][3])) & 0x7); 393 394 alfBuffer[i].AlfCcCrMappedCoeffAbs[1] = Pack4Bytes2DW( 395 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[0][4])) & 0x7, 396 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[0][5])) & 0x7, 397 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[0][6])) & 0x7, 398 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[1][0])) & 0x7); 399 400 alfBuffer[i].AlfCcCrMappedCoeffAbs[2] = Pack4Bytes2DW( 401 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[1][1])) & 0x7, 402 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[1][2])) & 0x7, 403 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[1][3])) & 0x7, 404 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[1][4])) & 0x7); 405 406 alfBuffer[i].AlfCcCrMappedCoeffAbs[3] = Pack4Bytes2DW( 407 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[1][5])) & 0x7, 408 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[1][6])) & 0x7, 409 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[2][0])) & 0x7, 410 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[2][1])) & 0x7); 411 412 alfBuffer[i].AlfCcCrMappedCoeffAbs[4] = Pack4Bytes2DW( 413 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[2][2])) & 0x7, 414 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[2][3])) & 0x7, 415 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[2][4])) & 0x7, 416 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[2][5])) & 0x7); 417 418 alfBuffer[i].AlfCcCrMappedCoeffAbs[5] = Pack4Bytes2DW( 419 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[2][6])) & 0x7, 420 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[3][0])) & 0x7, 421 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[3][1])) & 0x7, 422 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[3][2])) & 0x7); 423 424 alfBuffer[i].AlfCcCrMappedCoeffAbs[6] = Pack4Bytes2DW( 425 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[3][3])) & 0x7, 426 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[3][4])) & 0x7, 427 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[3][5])) & 0x7, 428 GetMappedCoeff(MOS_ABS(alfApsArray[i].m_ccAlfApsCoeffCr[3][6])) & 0x7); 429 } 430 } 431 432 return MOS_STATUS_SUCCESS; 433 } 434 MEDIA_CLASS_DEFINE_END(mhw__vdbox__vvcp__xe2_lpm_base__xe2_lpm__Impl) 435 }; 436 } // namespace xe2_lpm 437 } // namespace xe2_lpm_base 438 } // namespace vvcp 439 } // namespace vdbox 440 } // namespace mhw 441 442 #endif // __MHW_VDBOX_VVCP_IMPL_XE2_LPM_H__ 443