1 /* 2 * Copyright (c) 2022-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 decode_vvc_s2l_packet.cpp 24 //! \brief Defines the implementation of VVC decode S2L packet 25 //! 26 #include "decode_vvc_s2l_packet.h" 27 #include "decode_resource_auto_lock.h" 28 #include "mos_os_cp_interface_specific.h" 29 30 namespace decode 31 { AllocateResources()32 MOS_STATUS VvcDecodeS2LPkt::AllocateResources() 33 { 34 m_sliceBsParamNumber = m_vvcBasicFeature->m_numSlices; 35 m_sliceBsParamOffset = 0; 36 37 m_sliceBbParamNumber = m_vvcBasicFeature->m_numSlices; 38 m_sliceBbParamOffset = MOS_ALIGN_CEIL((m_sliceBsParamNumber * sizeof(VvcS2lSliceBsParam) + m_sliceBsParamOffset), 4); 39 40 if(m_vvcPicParams->m_ppsFlags.m_fields.m_ppsRectSliceFlag) 41 { 42 if (m_vvcPicParams->m_spsNumSubpicsMinus1 > 0 && m_vvcPicParams->m_spsFlags0.m_fields.m_spsSubpicInfoPresentFlag) 43 { 44 m_isMultiSubPicParam = true; //Rect scan mode and SubpicsMinus1 > 0 and SubpicInfoPresentFlag enabled, means subpic params valid. 45 } 46 } 47 if (!m_isMultiSubPicParam) 48 { 49 m_subPicParamNumber = 0; 50 } 51 else 52 { 53 m_subPicParamNumber = m_vvcBasicFeature->m_vvcPicParams->m_spsNumSubpicsMinus1 + 1; 54 } 55 m_subPicParamOffset = MOS_ALIGN_CEIL((m_sliceBbParamNumber * sizeof(VvcS2lSliceBbParam) + m_sliceBbParamOffset), 4); 56 57 if (m_vvcPicParams->m_ppsFlags.m_fields.m_ppsRectSliceFlag) //Rect scan mode 58 { 59 if (m_vvcPicParams->m_ppsFlags.m_fields.m_ppsSingleSlicePerSubpicFlag) 60 { 61 if (m_vvcPicParams->m_spsNumSubpicsMinus1 == 0 || !m_vvcPicParams->m_spsFlags0.m_fields.m_spsSubpicInfoPresentFlag) 62 { 63 m_slicePartitionParamNumber = 1; 64 } 65 else 66 { 67 m_slicePartitionParamNumber = m_vvcPicParams->m_spsNumSubpicsMinus1 + 1; //have subpic param. 68 } 69 } 70 else 71 { 72 m_slicePartitionParamNumber = m_vvcPicParams->m_ppsNumSlicesInPicMinus1 + 1; 73 } 74 } 75 else //Raster scan mode 76 { 77 m_slicePartitionParamNumber = m_vvcBasicFeature->m_numSlices; 78 } 79 80 m_sliceParamDynamicSize = m_subPicParamNumber * sizeof(VvcS2lSubpicParam) + m_sliceBsParamNumber * sizeof(VvcS2lSliceBsParam) + m_sliceBbParamNumber * sizeof(VvcS2lSliceBbParam); 81 DECODE_CHK_NULL(m_allocator); 82 m_dmemBufferSize = MOS_ALIGN_CEIL(sizeof(VvcS2lBss) + m_sliceParamDynamicSize, CODECHAL_CACHELINE_SIZE); 83 if (m_vvcS2lDmemBufferArray == nullptr) 84 { 85 m_vvcS2lDmemBufferArray = m_allocator->AllocateBufferArray(m_dmemBufferSize, 86 "VVCDmemBuffer", 87 CODECHAL_VVC_NUM_DMEM_BUFFERS, 88 resourceInternalReadWriteCache, 89 lockableVideoMem); 90 DECODE_CHK_NULL(m_vvcS2lDmemBufferArray); 91 PMOS_BUFFER &buf = m_vvcS2lDmemBufferArray->Fetch(); 92 DECODE_CHK_NULL(buf); 93 } 94 else 95 { 96 PMOS_BUFFER &buf = m_vvcS2lDmemBufferArray->Fetch(); 97 DECODE_CHK_NULL(buf); 98 DECODE_CHK_STATUS(m_allocator->Resize(buf, m_dmemBufferSize, lockableVideoMem)); 99 } 100 if (m_vvcS2lExtraBufferArray == nullptr) 101 { 102 m_vvcS2lExtraBufferArray = m_allocator->AllocateBufferArray(sizeof(VvcS2lExtraBss), 103 "VVCExtraDataBuffer", 104 CODECHAL_VVC_NUM_DMEM_BUFFERS, 105 resourceInternalReadWriteCache, 106 lockableVideoMem); 107 } 108 return MOS_STATUS_SUCCESS; 109 } 110 Destroy()111 MOS_STATUS VvcDecodeS2LPkt::Destroy() 112 { 113 if (m_allocator && m_vvcS2lDmemBufferArray) 114 { 115 DECODE_CHK_STATUS(m_allocator->Destroy(m_vvcS2lDmemBufferArray)); 116 } 117 if (m_allocator && m_vvcS2lExtraBufferArray) 118 { 119 DECODE_CHK_STATUS(m_allocator->Destroy(m_vvcS2lExtraBufferArray)); 120 } 121 122 return MOS_STATUS_SUCCESS; 123 } 124 Submit(MOS_COMMAND_BUFFER * cmdBuffer,uint8_t packetPhase)125 MOS_STATUS VvcDecodeS2LPkt::Submit( 126 MOS_COMMAND_BUFFER *cmdBuffer, 127 uint8_t packetPhase) 128 { 129 DECODE_FUNC_CALL(); 130 131 PERF_UTILITY_AUTO(__FUNCTION__, PERF_DECODE, PERF_LEVEL_HAL); 132 133 DECODE_CHK_NULL(cmdBuffer); 134 // Send prolog since S2L packet always be first packet 135 bool requestProlog = true; 136 DECODE_CHK_STATUS(Execute(*cmdBuffer, requestProlog)); 137 138 CODECHAL_DEBUG_TOOL( 139 DECODE_CHK_STATUS(DumpHucS2l());) 140 141 return MOS_STATUS_SUCCESS; 142 } 143 Init()144 MOS_STATUS VvcDecodeS2LPkt::Init() 145 { 146 DECODE_FUNC_CALL(); 147 DECODE_CHK_NULL(m_vvcPipeline); 148 DECODE_CHK_NULL(m_featureManager); 149 DECODE_CHK_NULL(m_osInterface); 150 DECODE_CHK_NULL(m_hucItf); 151 DECODE_CHK_NULL(m_miItf); 152 DECODE_CHK_NULL(m_vdencItf); 153 m_basicFeature = dynamic_cast<DecodeBasicFeature *>(m_featureManager->GetFeature(FeatureIDs::basicFeature)); 154 DECODE_CHK_NULL(m_basicFeature); 155 m_vvcBasicFeature = dynamic_cast<VvcBasicFeature *>(m_basicFeature); 156 DECODE_CHK_NULL(m_vvcBasicFeature); 157 158 MHW_VDBOX_STATE_CMDSIZE_PARAMS stateCmdSizeParams; 159 stateCmdSizeParams.bShortFormat = true; 160 DECODE_CHK_STATUS(m_hwInterface->GetHucStateCommandSize(m_vvcBasicFeature->m_mode, &m_pictureStatesSize, &m_picturePatchListSize, &stateCmdSizeParams)); 161 uint32_t cpCmdsize = 0; 162 uint32_t cpPatchListSize = 0; 163 m_hwInterface->GetCpInterface()->GetCpSliceLevelCmdSize(cpCmdsize, cpPatchListSize); 164 m_sliceStatesSize += cpCmdsize; 165 m_slicePatchListSize += cpPatchListSize; 166 167 CalculateVvcSliceLvlCmdSize(); 168 169 return MOS_STATUS_SUCCESS; 170 } 171 172 PackPictureLevelCmds(MOS_COMMAND_BUFFER & cmdBuffer)173 MOS_STATUS VvcDecodeS2LPkt::PackPictureLevelCmds(MOS_COMMAND_BUFFER &cmdBuffer) 174 { 175 DECODE_FUNC_CALL(); 176 PERF_UTILITY_AUTO(__FUNCTION__, PERF_DECODE, PERF_LEVEL_HAL); 177 178 DECODE_CHK_STATUS(AddCmd_HUC_IMEM_STATE(cmdBuffer)); 179 DECODE_CHK_STATUS(AddCmd_HUC_PIPE_MODE_SELECT(cmdBuffer)); 180 SETPAR_AND_ADDCMD(HUC_IND_OBJ_BASE_ADDR_STATE, m_hucItf, &cmdBuffer); 181 SETPAR_AND_ADDCMD(HUC_VIRTUAL_ADDR_STATE, m_hucItf, &cmdBuffer); 182 SETPAR_AND_ADDCMD(HUC_DMEM_STATE, m_hucItf, &cmdBuffer); 183 return MOS_STATUS_SUCCESS; 184 } 185 VdPipelineFlush(MOS_COMMAND_BUFFER & cmdBuffer)186 MOS_STATUS VvcDecodeS2LPkt::VdPipelineFlush(MOS_COMMAND_BUFFER &cmdBuffer) 187 { 188 DECODE_FUNC_CALL(); 189 190 auto &par = m_vdencItf->GETPAR_VD_PIPELINE_FLUSH(); 191 par = {}; 192 par.waitDoneHEVC = 1; 193 par.flushHEVC = 1; 194 par.waitDoneVDCmdMsgParser = 1; 195 m_vdencItf->ADDCMD_VD_PIPELINE_FLUSH(&cmdBuffer); 196 197 return MOS_STATUS_SUCCESS; 198 } 199 PackSliceLevelCmds(MOS_COMMAND_BUFFER & cmdBuffer)200 MOS_STATUS VvcDecodeS2LPkt::PackSliceLevelCmds(MOS_COMMAND_BUFFER &cmdBuffer) 201 { 202 DECODE_FUNC_CALL(); 203 PERF_UTILITY_AUTO(__FUNCTION__, PERF_DECODE, PERF_LEVEL_HAL); 204 205 for (uint32_t i = 0; i < m_vvcBasicFeature->m_numSlices; i++) 206 { 207 //add CP huc State 208 DECODE_CHK_STATUS(AddHucCpState(cmdBuffer, i, m_vvcSliceParams[i])); 209 int32_t deltaSize = m_vvcBasicFeature->m_dataOffset + m_vvcBasicFeature->m_dataSize - (m_vvcSliceParams[i].m_bSNALunitDataLocation + m_vvcSliceParams[i].m_sliceBytesInBuffer); 210 if (deltaSize <= 0) 211 { 212 m_tailingBsReadSize = 0; //Cannot read more bytes if last slice 213 } 214 else 215 { 216 m_tailingBsReadSize = deltaSize > 10 ? 10 : deltaSize; 217 } 218 DECODE_CHK_STATUS(AddCmd_HUC_STREAM_OBJECT(cmdBuffer, m_vvcSliceParams[i])); 219 if (i == (m_vvcBasicFeature->m_numSlices - 1)) 220 { 221 DECODE_CHK_STATUS(StoreHucStatus2Register(cmdBuffer)); 222 DECODE_CHK_STATUS(AddCmd_HUC_START(cmdBuffer, true)); 223 } 224 else 225 { 226 DECODE_CHK_STATUS(AddCmd_HUC_START(cmdBuffer, false)); 227 } 228 } 229 230 return MOS_STATUS_SUCCESS; 231 } 232 Prepare()233 MOS_STATUS VvcDecodeS2LPkt::Prepare() 234 { 235 DECODE_FUNC_CALL(); 236 237 m_vvcPicParams = m_vvcBasicFeature->m_vvcPicParams; 238 DECODE_CHK_NULL(m_vvcPicParams); 239 m_vvcSliceParams = m_vvcBasicFeature->m_vvcSliceParams; 240 DECODE_CHK_NULL(m_vvcSliceParams); 241 242 DECODE_CHK_STATUS(AllocateResources()); 243 244 DECODE_CHK_STATUS(SetDmemBuffer()); 245 DECODE_CHK_STATUS(SetExtraDataBuffer()); 246 247 SetHucStatusMask(GetHucStatusVvcS2lFailureMask(), 248 m_hucItf->GetHucStatus2ImemLoadedMask()); 249 250 return MOS_STATUS_SUCCESS; 251 } 252 CalculateCommandSize(uint32_t & commandBufferSize,uint32_t & requestedPatchListSize)253 MOS_STATUS VvcDecodeS2LPkt::CalculateCommandSize(uint32_t &commandBufferSize, uint32_t &requestedPatchListSize) 254 { 255 DECODE_FUNC_CALL(); 256 257 commandBufferSize = CalculateCommandBufferSize(); 258 requestedPatchListSize = CalculatePatchListSize(); 259 260 return MOS_STATUS_SUCCESS; 261 } 262 CalculateCommandBufferSize()263 uint32_t VvcDecodeS2LPkt::CalculateCommandBufferSize() 264 { 265 DECODE_FUNC_CALL(); 266 267 uint32_t commandBufferSize = m_pictureStatesSize + 268 m_sliceStatesSize * (m_vvcBasicFeature->m_numSlices + 1); 269 270 return (commandBufferSize + COMMAND_BUFFER_RESERVED_SPACE); 271 } 272 CalculatePatchListSize()273 uint32_t VvcDecodeS2LPkt::CalculatePatchListSize() 274 { 275 DECODE_FUNC_CALL(); 276 277 if (!m_osInterface->bUsesPatchList) 278 { 279 return 0; 280 } 281 282 uint32_t requestedPatchListSize = m_picturePatchListSize + 283 m_slicePatchListSize * (m_vvcBasicFeature->m_numSlices + 1); 284 285 return requestedPatchListSize; 286 } 287 SetHucDmemPictureBss(HucVvcS2lPicBss & hucVvcS2LPicBss)288 MOS_STATUS VvcDecodeS2LPkt::SetHucDmemPictureBss(HucVvcS2lPicBss &hucVvcS2LPicBss) 289 { 290 DECODE_FUNC_CALL(); 291 // SPS info 292 hucVvcS2LPicBss.m_spsPicWidthMaxInLumaSamples = m_vvcPicParams->m_spsPicWidthMaxInLumaSamples; // [8..16888] 293 hucVvcS2LPicBss.m_spsPicHeightMaxInLumaSamples = m_vvcPicParams->m_spsPicHeightMaxInLumaSamples; // [8..16888] 294 295 hucVvcS2LPicBss.m_spsNumSubpicsMinus1 = m_vvcPicParams->m_spsNumSubpicsMinus1; // [0..599] 296 hucVvcS2LPicBss.m_spsSubpicIdLenMinus1 = m_vvcPicParams->m_spsSubpicIdLenMinus1; // [0..15] 297 hucVvcS2LPicBss.m_spsChromaFormatIdc = m_vvcPicParams->m_spsChromaFormatIdc; // [1] 298 hucVvcS2LPicBss.m_spsBitdepthMinus8 = m_vvcPicParams->m_spsBitdepthMinus8; // [0..2] 299 hucVvcS2LPicBss.m_spsLog2CtuSizeMinus5 = m_vvcPicParams->m_spsLog2CtuSizeMinus5; // [0..2] 300 hucVvcS2LPicBss.m_spsLog2MaxPicOrderCntLsbMinus4 = m_vvcPicParams->m_spsLog2MaxPicOrderCntLsbMinus4; // [0..12] 301 hucVvcS2LPicBss.m_spsLog2MinLumaCodingBlockSizeMinus2 = m_vvcPicParams->m_spsLog2MinLumaCodingBlockSizeMinus2; // [0..4] 302 hucVvcS2LPicBss.m_spsPocMsbCycleLenMinus1 = m_vvcPicParams->m_spsPocMsbCycleLenMinus1; // [0..27] 303 hucVvcS2LPicBss.m_numExtraPhBits = m_vvcPicParams->m_numExtraPhBits; // [0..15] 304 hucVvcS2LPicBss.m_numExtraShBits = m_vvcPicParams->m_numExtraShBits; // [0..15] 305 hucVvcS2LPicBss.m_spsLog2TransformSkipMaxSizeMinus2 = m_vvcPicParams->m_spsLog2TransformSkipMaxSizeMinus2; // [0..3] 306 307 for (uint32_t i = 0; i < 3; i++) 308 { 309 for (uint32_t j = 0; j < 76; j++) 310 { 311 hucVvcS2LPicBss.m_chromaQpTable[i][j] = m_vvcPicParams->m_chromaQpTable[i][j]; // [-12..63] 312 } 313 } 314 315 hucVvcS2LPicBss.m_spsNumRefPicLists[0] = m_vvcPicParams->m_spsNumRefPicLists[0]; // [0..64] 316 hucVvcS2LPicBss.m_spsNumRefPicLists[1] = m_vvcPicParams->m_spsNumRefPicLists[1]; // [0..64] 317 hucVvcS2LPicBss.m_spsSixMinusMaxNumMergeCand = m_vvcPicParams->m_spsSixMinusMaxNumMergeCand; // [0..5] 318 hucVvcS2LPicBss.m_spsFiveMinusMaxNumSubblockMergeCand = m_vvcPicParams->m_spsFiveMinusMaxNumSubblockMergeCand; // [0..5] 319 hucVvcS2LPicBss.m_spsMaxNumMergeCandMinusMaxNumGpmCand = m_vvcPicParams->m_spsMaxNumMergeCandMinusMaxNumGpmCand; // [0..4] 320 hucVvcS2LPicBss.m_spsLog2ParallelMergeLevelMinus2 = m_vvcPicParams->m_spsLog2ParallelMergeLevelMinus2; // [0..5] 321 hucVvcS2LPicBss.m_spsMinQpPrimeTs = m_vvcPicParams->m_spsMinQpPrimeTs; // [0..8] 322 hucVvcS2LPicBss.m_spsSixMinusMaxNumIbcMergeCand = m_vvcPicParams->m_spsSixMinusMaxNumIbcMergeCand; // [0..5] 323 hucVvcS2LPicBss.m_spsNumLadfIntervalsMinus2 = m_vvcPicParams->m_spsNumLadfIntervalsMinus2; // [0..3] 324 hucVvcS2LPicBss.m_spsLadfLowestIntervalQpOffset = m_vvcPicParams->m_spsLadfLowestIntervalQpOffset; // [-63..63] 325 for (uint32_t i = 0; i < 4; i++) 326 { 327 hucVvcS2LPicBss.m_spsLadfQpOffset[i] = m_vvcPicParams->m_spsLadfQpOffset[i]; 328 hucVvcS2LPicBss.m_spsLadfDeltaThresholdMinus1[i] = m_vvcPicParams->m_spsLadfDeltaThresholdMinus1[i]; 329 } 330 hucVvcS2LPicBss.m_spsNumVerVirtualBoundaries = m_vvcPicParams->m_spsNumVerVirtualBoundaries; // [0..3] 331 hucVvcS2LPicBss.m_spsNumHorVirtualBoundaries = m_vvcPicParams->m_spsNumHorVirtualBoundaries; // [0..3] 332 hucVvcS2LPicBss.m_spsLog2DiffMinQtMinCbIntraSliceLuma = m_vvcPicParams->m_spsLog2DiffMinQtMinCbIntraSliceLuma; // [0..4] 333 hucVvcS2LPicBss.m_spsMaxMttHierarchyDepthIntraSliceLuma = m_vvcPicParams->m_spsMaxMttHierarchyDepthIntraSliceLuma; // [0..10] 334 for (uint32_t i = 0; i < 3; i++) 335 { 336 hucVvcS2LPicBss.m_spsVirtualBoundaryPosXMinus1[i] = m_vvcPicParams->m_spsVirtualBoundaryPosXMinus1[i]; 337 hucVvcS2LPicBss.m_spsVirtualBoundaryPosYMinus1[i] = m_vvcPicParams->m_spsVirtualBoundaryPosYMinus1[i]; 338 } 339 hucVvcS2LPicBss.m_spsLog2DiffMaxBtMinQtIntraSliceLuma = m_vvcPicParams->m_spsLog2DiffMaxBtMinQtIntraSliceLuma; // [0..5] 340 hucVvcS2LPicBss.m_spsLog2DiffMaxTtMinQtIntraSliceLuma = m_vvcPicParams->m_spsLog2DiffMaxTtMinQtIntraSliceLuma; // [0..4] 341 hucVvcS2LPicBss.m_spsLog2DiffMinQtMinCbIntraSliceChroma = m_vvcPicParams->m_spsLog2DiffMinQtMinCbIntraSliceChroma; // [0..4] 342 hucVvcS2LPicBss.m_spsMaxMttHierarchyDepthIntraSliceChroma = m_vvcPicParams->m_spsMaxMttHierarchyDepthIntraSliceChroma; // [0..10] 343 hucVvcS2LPicBss.m_spsLog2DiffMaxBtMinQtIntraSliceChroma = m_vvcPicParams->m_spsLog2DiffMaxBtMinQtIntraSliceChroma; // [0..4] 344 hucVvcS2LPicBss.m_spsLog2DiffMaxTtMinQtIntraSliceChroma = m_vvcPicParams->m_spsLog2DiffMaxTtMinQtIntraSliceChroma; // [0..4] 345 hucVvcS2LPicBss.m_spsLog2DiffMinQtMinCbInterSlice = m_vvcPicParams->m_spsLog2DiffMinQtMinCbInterSlice; // [0..4] 346 hucVvcS2LPicBss.m_spsMaxMttHierarchyDepthInterSlice = m_vvcPicParams->m_spsMaxMttHierarchyDepthInterSlice; // [0..10] 347 hucVvcS2LPicBss.m_spsLog2DiffMaxBtMinQtInterSlice = m_vvcPicParams->m_spsLog2DiffMaxBtMinQtInterSlice; // [0..5] 348 hucVvcS2LPicBss.m_spsLog2DiffMaxTtMinQtInterSlice = m_vvcPicParams->m_spsLog2DiffMaxTtMinQtInterSlice; // [0..4] 349 350 hucVvcS2LPicBss.m_picSpsFlags.m_spsSubpicInfoPresentFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsSubpicInfoPresentFlag; // [0..1] 351 hucVvcS2LPicBss.m_picSpsFlags.m_spsIndependentSubpicsFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsIndependentSubpicsFlag; // [0..1] 352 hucVvcS2LPicBss.m_picSpsFlags.m_spsSubpicSameSizeFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsSubpicSameSizeFlag; // [0..1] 353 hucVvcS2LPicBss.m_picSpsFlags.m_spsEntropyCodingSyncEnabledFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsEntropyCodingSyncEnabledFlag; // [0..1] 354 hucVvcS2LPicBss.m_picSpsFlags.m_spsEntryPointOffsetsPresentFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsEntryPointOffsetsPresentFlag; // [0..1] 355 hucVvcS2LPicBss.m_picSpsFlags.m_spsPocMsbCycleFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsPocMsbCycleFlag; // [0..1] 356 hucVvcS2LPicBss.m_picSpsFlags.m_spsPartitionConstraintsOverrideEnabledFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsPartitionConstraintsOverrideEnabledFlag; // [0..1] 357 hucVvcS2LPicBss.m_picSpsFlags.m_spsQtbttDualTreeIntraFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsQtbttDualTreeIntraFlag; // [0..1] 358 hucVvcS2LPicBss.m_picSpsFlags.m_spsMaxLumaTransformSize64Flag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsMaxLumaTransformSize64Flag; // [0..1] 359 hucVvcS2LPicBss.m_picSpsFlags.m_spsTransformSkipEnabledFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsTransformSkipEnabledFlag; // [0..1] 360 hucVvcS2LPicBss.m_picSpsFlags.m_spsBdpcmEnabledFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsBdpcmEnabledFlag; // [0..1] 361 hucVvcS2LPicBss.m_picSpsFlags.m_spsMtsEnabledFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsMtsEnabledFlag; // [0..1] 362 hucVvcS2LPicBss.m_picSpsFlags.m_spsExplicitMtsIntraEnabledFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsExplicitMtsIntraEnabledFlag; // [0..1] 363 hucVvcS2LPicBss.m_picSpsFlags.m_spsExplicitMtsInterEnabledFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsExplicitMtsInterEnabledFlag; // [0..1] 364 hucVvcS2LPicBss.m_picSpsFlags.m_spsLfnstEnabledFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsLfnstEnabledFlag; // [0..1] 365 hucVvcS2LPicBss.m_picSpsFlags.m_spsJointCbcrEnabledFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsJointCbcrEnabledFlag; // [0..1] 366 hucVvcS2LPicBss.m_picSpsFlags.m_spsSameQpTableForChromaFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsSameQpTableForChromaFlag; // [0..1] 367 hucVvcS2LPicBss.m_picSpsFlags.m_spsSaoEnabledFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsSaoEnabledFlag; // [0..1] 368 hucVvcS2LPicBss.m_picSpsFlags.m_spsAlfEnabledFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsAlfEnabledFlag; // [0..1] 369 hucVvcS2LPicBss.m_picSpsFlags.m_spsCcalfEnabledFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsCcalfEnabledFlag; // [0..1] 370 hucVvcS2LPicBss.m_picSpsFlags.m_spsLmcsEnabledFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsLmcsEnabledFlag; // [0..1] 371 hucVvcS2LPicBss.m_picSpsFlags.m_spsLongTermRefPicsFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsLongTermRefPicsFlag; // [0..1] 372 hucVvcS2LPicBss.m_picSpsFlags.m_spsInterLayerPredictionEnabledFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsInterLayerPredictionEnabledFlag; // [0..1] 373 hucVvcS2LPicBss.m_picSpsFlags.m_spsIdrRplPresentFlag = m_vvcPicParams->m_spsFlags0.m_fields.m_spsIdrRplPresentFlag; // [0..1] 374 375 hucVvcS2LPicBss.m_picSpsFlags.m_spsTemporalMvpEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsTemporalMvpEnabledFlag; // [0..1] 376 hucVvcS2LPicBss.m_picSpsFlags.m_spsSbtmvpEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsSbtmvpEnabledFlag; // [0..1] 377 hucVvcS2LPicBss.m_picSpsFlags.m_spsAmvrEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsAmvrEnabledFlag; // [0..1] 378 hucVvcS2LPicBss.m_picSpsFlags.m_spsBdofEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsBdofEnabledFlag; // [0..1] 379 hucVvcS2LPicBss.m_picSpsFlags.m_spsBdofControlPresentInPhFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsBdofControlPresentInPhFlag; // [0..1] 380 hucVvcS2LPicBss.m_picSpsFlags.m_spsSmvdEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsSmvdEnabledFlag; // [0..1] 381 hucVvcS2LPicBss.m_picSpsFlags.m_spsDmvrEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsDmvrEnabledFlag; // [0..1] 382 hucVvcS2LPicBss.m_picSpsFlags.m_spsDmvrControlPresentInPhFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsDmvrControlPresentInPhFlag; // [0..1] 383 hucVvcS2LPicBss.m_picSpsFlags.m_spsMmvdEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsMmvdEnabledFlag; // [0..1] 384 hucVvcS2LPicBss.m_picSpsFlags.m_spsMmvdFullpelOnlyEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsMmvdFullpelOnlyEnabledFlag; // [0..1] 385 hucVvcS2LPicBss.m_picSpsFlags.m_spsSbtEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsSbtEnabledFlag; // [0..1] 386 hucVvcS2LPicBss.m_picSpsFlags.m_spsAffineEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsAffineEnabledFlag; // [0..1] 387 hucVvcS2LPicBss.m_picSpsFlags.m_sps6paramAffineEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_sps6paramAffineEnabledFlag; // [0..1] 388 hucVvcS2LPicBss.m_picSpsFlags.m_spsAffineAmvrEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsAffineAmvrEnabledFlag; // [0..1] 389 hucVvcS2LPicBss.m_picSpsFlags.m_spsAffineProfEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsAffineProfEnabledFlag; // [0..1] 390 hucVvcS2LPicBss.m_picSpsFlags.m_spsProfControlPresentInPhFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsProfControlPresentInPhFlag; // [0..1] 391 hucVvcS2LPicBss.m_picSpsFlags.m_spsBcwEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsBcwEnabledFlag; // [0..1] 392 hucVvcS2LPicBss.m_picSpsFlags.m_spsCiipEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsCiipEnabledFlag; // [0..1] 393 hucVvcS2LPicBss.m_picSpsFlags.m_spsGpmEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsGpmEnabledFlag; // [0..1] 394 hucVvcS2LPicBss.m_picSpsFlags.m_spsIspEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsIspEnabledFlag; // [0..1] 395 hucVvcS2LPicBss.m_picSpsFlags.m_spsMrlEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsMrlEnabledFlag; // [0..1] 396 hucVvcS2LPicBss.m_picSpsFlags.m_spsMipEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsMipEnabledFlag; // [0..1] 397 hucVvcS2LPicBss.m_picSpsFlags.m_spsCclmEnabledFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsCclmEnabledFlag; // [0..1] 398 hucVvcS2LPicBss.m_picSpsFlags.m_spsChromaHorizontalCollocatedFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsChromaHorizontalCollocatedFlag; // [0..1] 399 hucVvcS2LPicBss.m_picSpsFlags.m_spsChromaVerticalCollocatedFlag = m_vvcPicParams->m_spsFlags1.m_fields.m_spsChromaVerticalCollocatedFlag; // [0..1] 400 401 hucVvcS2LPicBss.m_picSpsFlags.m_spsPaletteEnabledFlag = m_vvcPicParams->m_spsFlags2.m_fields.m_spsPaletteEnabledFlag; // [0..1] 402 hucVvcS2LPicBss.m_picSpsFlags.m_spsActEnabledFlag = m_vvcPicParams->m_spsFlags2.m_fields.m_spsActEnabledFlag; // [0..1] 403 hucVvcS2LPicBss.m_picSpsFlags.m_spsIbcEnabledFlag = m_vvcPicParams->m_spsFlags2.m_fields.m_spsIbcEnabledFlag; // [0..1] 404 hucVvcS2LPicBss.m_picSpsFlags.m_spsLadfEnabledFlag = m_vvcPicParams->m_spsFlags2.m_fields.m_spsLadfEnabledFlag; // [0..1] 405 hucVvcS2LPicBss.m_picSpsFlags.m_spsExplicitScalingListEnabledFlag = m_vvcPicParams->m_spsFlags2.m_fields.m_spsExplicitScalingListEnabledFlag; // [0..1] 406 hucVvcS2LPicBss.m_picSpsFlags.m_spsScalingMatrixForLfnstDisabledFlag = m_vvcPicParams->m_spsFlags2.m_fields.m_spsScalingMatrixForLfnstDisabledFlag; // [0..1] 407 hucVvcS2LPicBss.m_picSpsFlags.m_spsScalingMatrixForAlternativeColourSpaceDisabledFlag = m_vvcPicParams->m_spsFlags2.m_fields.m_spsScalingMatrixForAlternativeColourSpaceDisabledFlag; // [0..1] 408 hucVvcS2LPicBss.m_picSpsFlags.m_spsScalingMatrixDesignatedColourSpaceFlag = m_vvcPicParams->m_spsFlags2.m_fields.m_spsScalingMatrixDesignatedColourSpaceFlag; // [0..1] 409 hucVvcS2LPicBss.m_picSpsFlags.m_spsDepQuantEnabledFlag = m_vvcPicParams->m_spsFlags2.m_fields.m_spsDepQuantEnabledFlag; // [0..1] 410 hucVvcS2LPicBss.m_picSpsFlags.m_spsSignDataHidingEnabledFlag = m_vvcPicParams->m_spsFlags2.m_fields.m_spsSignDataHidingEnabledFlag; // [0..1] 411 hucVvcS2LPicBss.m_picSpsFlags.m_spsVirtualBoundariesEnabledFlag = m_vvcPicParams->m_spsFlags2.m_fields.m_spsVirtualBoundariesEnabledFlag; // [0..1] 412 hucVvcS2LPicBss.m_picSpsFlags.m_spsVirtualBoundariesPresentFlag = m_vvcPicParams->m_spsFlags2.m_fields.m_spsVirtualBoundariesPresentFlag; // [0..1] 413 hucVvcS2LPicBss.m_picSpsFlags.m_spsWeightedPredFlag = m_vvcPicParams->m_spsFlags2.m_fields.m_spsWeightedPredFlag; 414 hucVvcS2LPicBss.m_picSpsFlags.m_spsWeightedBipredFlag = m_vvcPicParams->m_spsFlags2.m_fields.m_spsWeightedBipredFlag; 415 // PPS info 416 hucVvcS2LPicBss.m_ppsPicWidthInLumaSamples = m_vvcPicParams->m_ppsPicWidthInLumaSamples; // [8..16888] 417 hucVvcS2LPicBss.m_ppsPicHeightInLumaSamples = m_vvcPicParams->m_ppsPicHeightInLumaSamples; // [8..16888] 418 hucVvcS2LPicBss.m_numVerVirtualBoundaries = m_vvcPicParams->m_numVerVirtualBoundaries; // [0..3] 419 hucVvcS2LPicBss.m_numHorVirtualBoundaries = m_vvcPicParams->m_numHorVirtualBoundaries; // [0..3] 420 for (uint32_t i = 0; i < 3; i++) 421 { 422 hucVvcS2LPicBss.m_virtualBoundaryPosX[i] = m_vvcPicParams->m_virtualBoundaryPosX[i]; // [0..16880] 423 hucVvcS2LPicBss.m_virtualBoundaryPosY[i] = m_vvcPicParams->m_virtualBoundaryPosY[i]; // [0..16880] 424 } 425 hucVvcS2LPicBss.m_ppsScalingWinLeftOffset = m_vvcPicParams->m_ppsScalingWinLeftOffset; 426 hucVvcS2LPicBss.m_ppsScalingWinRightOffset = m_vvcPicParams->m_ppsScalingWinRightOffset; 427 hucVvcS2LPicBss.m_ppsScalingWinTopOffset = m_vvcPicParams->m_ppsScalingWinTopOffset; 428 hucVvcS2LPicBss.m_ppsScalingWinBottomOffset = m_vvcPicParams->m_ppsScalingWinBottomOffset; 429 430 hucVvcS2LPicBss.m_ppsNumExpTileColumnsMinus1 = m_vvcPicParams->m_ppsNumExpTileColumnsMinus1; 431 hucVvcS2LPicBss.m_ppsNumExpTileRowsMinus1 = m_vvcPicParams->m_ppsNumExpTileRowsMinus1; 432 hucVvcS2LPicBss.m_ppsNumSlicesInPicMinus1 = m_vvcPicParams->m_ppsNumSlicesInPicMinus1; 433 for (uint32_t i = 0; i < 2; i++) 434 { 435 hucVvcS2LPicBss.m_ppsNumRefIdxDefaultActiveMinus1[i] = m_vvcPicParams->m_ppsNumRefIdxDefaultActiveMinus1[i]; // [0..16880] 436 } 437 hucVvcS2LPicBss.m_ppsPicWidthMinusWraparoundOffset = m_vvcPicParams->m_ppsPicWidthMinusWraparoundOffset; 438 hucVvcS2LPicBss.m_ppsInitQpMinus26 = m_vvcPicParams->m_ppsInitQpMinus26; 439 hucVvcS2LPicBss.m_ppsCbQpOffset = m_vvcPicParams->m_ppsCbQpOffset; 440 hucVvcS2LPicBss.m_ppsCrQpOffset = m_vvcPicParams->m_ppsCrQpOffset; 441 hucVvcS2LPicBss.m_ppsJointCbcrQpOffsetValue = m_vvcPicParams->m_ppsJointCbcrQpOffsetValue; 442 hucVvcS2LPicBss.m_ppsChromaQpOffsetListLenMinus1 = m_vvcPicParams->m_ppsChromaQpOffsetListLenMinus1; 443 for (uint32_t i = 0; i < 6; i++) 444 { 445 hucVvcS2LPicBss.m_ppsCbQpOffsetList[i] = m_vvcPicParams->m_ppsCbQpOffsetList[i]; 446 hucVvcS2LPicBss.m_ppsCrQpOffsetList[i] = m_vvcPicParams->m_ppsCrQpOffsetList[i]; 447 hucVvcS2LPicBss.m_ppsJointCbcrQpOffsetList[i] = m_vvcPicParams->m_ppsJointCbcrQpOffsetList[i]; 448 } 449 hucVvcS2LPicBss.m_ppsLumaBetaOffsetDiv2 = m_vvcPicParams->m_ppsLumaBetaOffsetDiv2; 450 hucVvcS2LPicBss.m_ppsLumaTcOffsetDiv2 = m_vvcPicParams->m_ppsLumaTcOffsetDiv2; 451 hucVvcS2LPicBss.m_ppsCbBetaOffsetDiv2 = m_vvcPicParams->m_ppsCbBetaOffsetDiv2; 452 hucVvcS2LPicBss.m_ppsCbTcOffsetDiv2 = m_vvcPicParams->m_ppsCbTcOffsetDiv2; 453 hucVvcS2LPicBss.m_ppsCrBetaOffsetDiv2 = m_vvcPicParams->m_ppsCrBetaOffsetDiv2; 454 hucVvcS2LPicBss.m_ppsCrTcOffsetDiv2 = m_vvcPicParams->m_ppsCrTcOffsetDiv2; 455 hucVvcS2LPicBss.m_numScalingMatrixBuffers = m_vvcPicParams->m_numScalingMatrixBuffers; 456 hucVvcS2LPicBss.m_numAlfBuffers = m_vvcPicParams->m_numAlfBuffers; 457 hucVvcS2LPicBss.m_numLmcsBuffers = m_vvcPicParams->m_numLmcsBuffers; 458 hucVvcS2LPicBss.m_numRefPicListStructs = m_vvcPicParams->m_numRefPicListStructs; 459 hucVvcS2LPicBss.m_numSliceStructsMinus1 = m_vvcPicParams->m_numSliceStructsMinus1; 460 hucVvcS2LPicBss.m_picPpsFlags.m_ppsOutputFlagPresentFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsOutputFlagPresentFlag; 461 hucVvcS2LPicBss.m_picPpsFlags.m_ppsLoopFilterAcrossTilesEnabledFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsLoopFilterAcrossTilesEnabledFlag; 462 hucVvcS2LPicBss.m_picPpsFlags.m_ppsRectSliceFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsRectSliceFlag; 463 hucVvcS2LPicBss.m_picPpsFlags.m_ppsSingleSlicePerSubpicFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsSingleSlicePerSubpicFlag; 464 hucVvcS2LPicBss.m_picPpsFlags.m_ppsLoopFilterAcrossSlicesEnabledFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsLoopFilterAcrossSlicesEnabledFlag; 465 hucVvcS2LPicBss.m_picPpsFlags.m_ppsCabacInitPresentFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsCabacInitPresentFlag; 466 hucVvcS2LPicBss.m_picPpsFlags.m_ppsRpl1IdxPresentFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsRpl1IdxPresentFlag; 467 hucVvcS2LPicBss.m_picPpsFlags.m_ppsWeightedPredFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsWeightedPredFlag; 468 hucVvcS2LPicBss.m_picPpsFlags.m_ppsWeightedBipredFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsWeightedBipredFlag; 469 hucVvcS2LPicBss.m_picPpsFlags.m_ppsRefWraparoundEnabledFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsRefWraparoundEnabledFlag; 470 hucVvcS2LPicBss.m_picPpsFlags.m_ppsCuQpDeltaEnabledFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsCuQpDeltaEnabledFlag; 471 hucVvcS2LPicBss.m_picPpsFlags.m_ppsChroma_toolOffsetsPresentFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsChroma_toolOffsetsPresentFlag; 472 hucVvcS2LPicBss.m_picPpsFlags.m_ppsSliceChromaQpOffsetsPresentFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsSliceChromaQpOffsetsPresentFlag; 473 hucVvcS2LPicBss.m_picPpsFlags.m_ppsCuChromaQpOffsetListEnabledFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsCuChromaQpOffsetListEnabledFlag; 474 hucVvcS2LPicBss.m_picPpsFlags.m_ppsDeblockingFilterOverrideEnabledFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsDeblockingFilterOverrideEnabledFlag; 475 hucVvcS2LPicBss.m_picPpsFlags.m_ppsDeblockingFilterDisabledFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsDeblockingFilterDisabledFlag; 476 hucVvcS2LPicBss.m_picPpsFlags.m_ppsDbfInfoInPhFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsDbfInfoInPhFlag; 477 hucVvcS2LPicBss.m_picPpsFlags.m_ppsRplInfoInPhFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsRplInfoInPhFlag; 478 hucVvcS2LPicBss.m_picPpsFlags.m_ppsSaoInfoInPhFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsSaoInfoInPhFlag; 479 hucVvcS2LPicBss.m_picPpsFlags.m_ppsAlfInfoInPhFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsAlfInfoInPhFlag; 480 hucVvcS2LPicBss.m_picPpsFlags.m_ppsWpInfoInPhFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsWpInfoInPhFlag; 481 hucVvcS2LPicBss.m_picPpsFlags.m_ppsQpDeltaInfoInPhFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsQpDeltaInfoInPhFlag; 482 hucVvcS2LPicBss.m_picPpsFlags.m_ppsPictureHeaderExtensionPresentFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsPictureHeaderExtensionPresentFlag; 483 hucVvcS2LPicBss.m_picPpsFlags.m_ppsSliceHeaderExtensionPresentFlag = m_vvcPicParams->m_ppsFlags.m_fields.m_ppsSliceHeaderExtensionPresentFlag; 484 485 // PH info 486 hucVvcS2LPicBss.m_phNumAlfApsIdsLuma = m_vvcPicParams->m_phNumAlfApsIdsLuma; // [0..7] 487 for (uint32_t i = 0; i < 7; i++) 488 { 489 hucVvcS2LPicBss.m_phAlfApsIdLuma[i] = m_vvcPicParams->m_phAlfApsIdLuma[i]; 490 } 491 hucVvcS2LPicBss.m_phAlfApsIdChroma = m_vvcPicParams->m_phAlfApsIdChroma; 492 hucVvcS2LPicBss.m_phAlfCcCbApsId = m_vvcPicParams->m_phAlfCcCbApsId; 493 hucVvcS2LPicBss.m_phAlfCcCrApsId = m_vvcPicParams->m_phAlfCcCrApsId; 494 hucVvcS2LPicBss.m_phLmcsApsId = m_vvcPicParams->m_phLmcsApsId; 495 hucVvcS2LPicBss.m_phScalingListApsId = m_vvcPicParams->m_phScalingListApsId; 496 hucVvcS2LPicBss.m_phLog2DiffMinQtMinCbIntraSliceLuma = m_vvcPicParams->m_phLog2DiffMinQtMinCbIntraSliceLuma; 497 hucVvcS2LPicBss.m_phLog2DiffMaxBtMinQtIntraSliceLuma = m_vvcPicParams->m_phLog2DiffMaxBtMinQtIntraSliceLuma; 498 hucVvcS2LPicBss.m_phLog2DiffMax_ttMinQtIntraSliceLuma = m_vvcPicParams->m_phLog2DiffMax_ttMinQtIntraSliceLuma; 499 hucVvcS2LPicBss.m_phCuChromaQpOffsetSubdivIntraSlice = m_vvcPicParams->m_phCuChromaQpOffsetSubdivIntraSlice; 500 hucVvcS2LPicBss.m_phLog2DiffMinQtMinCbInterSlice = m_vvcPicParams->m_phLog2DiffMinQtMinCbInterSlice; 501 hucVvcS2LPicBss.m_phMaxMtt_hierarchyDepthInterSlice = m_vvcPicParams->m_phMaxMtt_hierarchyDepthInterSlice; 502 hucVvcS2LPicBss.m_phLog2DiffMaxBtMinQtInterSlice = m_vvcPicParams->m_phLog2DiffMaxBtMinQtInterSlice; 503 hucVvcS2LPicBss.m_phLog2DiffMax_ttMinQtInterSlice = m_vvcPicParams->m_phLog2DiffMax_ttMinQtInterSlice; 504 hucVvcS2LPicBss.m_phCuQpDeltaSubdivInterSlice = m_vvcPicParams->m_phCuQpDeltaSubdivInterSlice; 505 hucVvcS2LPicBss.m_phCuChromaQpOffsetSubdivInterSlice = m_vvcPicParams->m_phCuChromaQpOffsetSubdivInterSlice; 506 hucVvcS2LPicBss.m_phCollocatedRefIdx = m_vvcPicParams->m_phCollocatedRefIdx; 507 hucVvcS2LPicBss.m_phQpDelta = m_vvcPicParams->m_phQpDelta; 508 hucVvcS2LPicBss.m_phLumaBetaOffsetDiv2 = m_vvcPicParams->m_phLumaBetaOffsetDiv2; 509 hucVvcS2LPicBss.m_phLumaTcOffsetDiv2 = m_vvcPicParams->m_phLumaTcOffsetDiv2; 510 hucVvcS2LPicBss.m_phCbBetaOffsetDiv2 = m_vvcPicParams->m_phCbBetaOffsetDiv2; 511 hucVvcS2LPicBss.m_phCbTcOffsetDiv2 = m_vvcPicParams->m_phCbTcOffsetDiv2; 512 hucVvcS2LPicBss.m_phCrBetaOffsetDiv2 = m_vvcPicParams->m_phCrBetaOffsetDiv2; 513 hucVvcS2LPicBss.m_phCrTcOffsetDiv2 = m_vvcPicParams->m_phCrTcOffsetDiv2; 514 515 hucVvcS2LPicBss.m_picPhFlags.m_phNonRefPicFlag = m_vvcPicParams->m_phFlags.m_fields.m_phNonRefPicFlag; // [0..1] 516 hucVvcS2LPicBss.m_picPhFlags.m_phInterSliceAllowedFlag = m_vvcPicParams->m_phFlags.m_fields.m_phInterSliceAllowedFlag; // [0..1] 517 hucVvcS2LPicBss.m_picPhFlags.m_phAlfEnabledFlag = m_vvcPicParams->m_phFlags.m_fields.m_phAlfEnabledFlag; // [0..1] 518 hucVvcS2LPicBss.m_picPhFlags.m_phAlfCbEnabledFlag = m_vvcPicParams->m_phFlags.m_fields.m_phAlfCbEnabledFlag; // [0..1] 519 hucVvcS2LPicBss.m_picPhFlags.m_phAlfCrEnabledFlag = m_vvcPicParams->m_phFlags.m_fields.m_phAlfCrEnabledFlag; // [0..1] 520 hucVvcS2LPicBss.m_picPhFlags.m_phAlfCcCbEnabledFlag = m_vvcPicParams->m_phFlags.m_fields.m_phAlfCcCbEnabledFlag; // [0..1] 521 hucVvcS2LPicBss.m_picPhFlags.m_phAlfCcCrEnabledFlag = m_vvcPicParams->m_phFlags.m_fields.m_phAlfCcCrEnabledFlag; // [0..1] 522 hucVvcS2LPicBss.m_picPhFlags.m_phLmcsEnabledFlag = m_vvcPicParams->m_phFlags.m_fields.m_phLmcsEnabledFlag; // [0..1] 523 hucVvcS2LPicBss.m_picPhFlags.m_phChromaResidualScaleFlag = m_vvcPicParams->m_phFlags.m_fields.m_phChromaResidualScaleFlag; // [0..1] 524 hucVvcS2LPicBss.m_picPhFlags.m_phExplicitScalingListEnabledFlag = m_vvcPicParams->m_phFlags.m_fields.m_phExplicitScalingListEnabledFlag; // [0..1] 525 hucVvcS2LPicBss.m_picPhFlags.m_phVirtualBoundariesPresentFlag = m_vvcPicParams->m_phFlags.m_fields.m_phVirtualBoundariesPresentFlag; // [0..1] 526 hucVvcS2LPicBss.m_picPhFlags.m_phTemporalMvpEnabledFlag = m_vvcPicParams->m_phFlags.m_fields.m_phTemporalMvpEnabledFlag; // [0..1] 527 hucVvcS2LPicBss.m_picPhFlags.m_numRefEntries0RplIdx0LargerThan0 = m_vvcPicParams->m_phFlags.m_fields.m_numRefEntries0RplIdx0LargerThan0; // [0..1] 528 hucVvcS2LPicBss.m_picPhFlags.m_numRefEntries1RplIdx1LargerThan0 = m_vvcPicParams->m_phFlags.m_fields.m_numRefEntries1RplIdx1LargerThan0; // [0..1] 529 hucVvcS2LPicBss.m_picPhFlags.m_phCollocatedFromL0Flag = m_vvcPicParams->m_phFlags.m_fields.m_phCollocatedFromL0Flag; // [0..1] 530 hucVvcS2LPicBss.m_picPhFlags.m_phMmvdFullpelOnlyFlag = m_vvcPicParams->m_phFlags.m_fields.m_phMmvdFullpelOnlyFlag; // [0..1] 531 hucVvcS2LPicBss.m_picPhFlags.m_phMvdL1ZeroFlag = m_vvcPicParams->m_phFlags.m_fields.m_phMvdL1ZeroFlag; // [0..1] 532 hucVvcS2LPicBss.m_picPhFlags.m_phBdofDisabledFlag = m_vvcPicParams->m_phFlags.m_fields.m_phBdofDisabledFlag; // [0..1] 533 hucVvcS2LPicBss.m_picPhFlags.m_phDmvrDisabledFlag = m_vvcPicParams->m_phFlags.m_fields.m_phDmvrDisabledFlag; // [0..1] 534 hucVvcS2LPicBss.m_picPhFlags.m_phProfDisabledFlag = m_vvcPicParams->m_phFlags.m_fields.m_phProfDisabledFlag; // [0..1] 535 hucVvcS2LPicBss.m_picPhFlags.m_phJointCbcrSignFlag = m_vvcPicParams->m_phFlags.m_fields.m_phJointCbcrSignFlag; // [0..1] 536 hucVvcS2LPicBss.m_picPhFlags.m_phSaoLumaEnabledFlag = m_vvcPicParams->m_phFlags.m_fields.m_phSaoLumaEnabledFlag; // [0..1] 537 hucVvcS2LPicBss.m_picPhFlags.m_phSaoChromaEnabledFlag = m_vvcPicParams->m_phFlags.m_fields.m_phSaoChromaEnabledFlag; // [0..1] 538 hucVvcS2LPicBss.m_picPhFlags.m_phDeblockingFilterDisabledFlag = m_vvcPicParams->m_phFlags.m_fields.m_phDeblockingFilterDisabledFlag; // [0..1] 539 540 // reference lists 541 hucVvcS2LPicBss.m_picOrderCntVal = m_vvcPicParams->m_picOrderCntVal; 542 for (uint8_t j = 0; j < 15; j++) 543 { 544 hucVvcS2LPicBss.m_refFramePocList[j] = m_vvcPicParams->m_refFramePocList[j]; //This order need aligned with pipe buf ref frame order. 545 } 546 for (uint8_t i = 0; i < 2; i++) 547 { 548 for (uint8_t j = 0; j < 15; j++) 549 { 550 bool rprConstraintFlag = 0; 551 uint8_t frameIdx = m_vvcPicParams->m_refFrameList[j].FrameIdx; 552 m_vvcBasicFeature->m_refFrames.CalcRprConstraintsActiveFlag(frameIdx, rprConstraintFlag); 553 hucVvcS2LPicBss.m_rprConstraintsActiveFlag[i][j] = rprConstraintFlag ? 1 : 0; 554 hucVvcS2LPicBss.unavailableRefPic[i][j] = (m_vvcPicParams->m_refFrameList[j].PicFlags == PICTURE_UNAVAILABLE_FRAME) ? true : false; 555 } 556 } 557 if (m_vvcPicParams->m_ppsFlags.m_fields.m_ppsRplInfoInPhFlag) 558 { 559 SetRefIdxStateCmd(hucVvcS2LPicBss.m_phRplInfoParam); 560 for (uint8_t i = 0; i < 2; i++) 561 { 562 for (uint8_t j = 0; j < 15; j++) 563 { 564 hucVvcS2LPicBss.m_phRplInfoParam.rprConstraintsActiveFlag[i][j] = (uint8_t)hucVvcS2LPicBss.m_rprConstraintsActiveFlag[i][j]; 565 hucVvcS2LPicBss.m_phRplInfoParam.unavailableRefPic[i][j] = (m_vvcPicParams->m_refFrameList[j].PicFlags == PICTURE_UNAVAILABLE_FRAME) ? true : false; 566 } 567 } 568 } 569 570 hucVvcS2LPicBss.m_numSlices = m_vvcBasicFeature->m_numSlices; 571 572 hucVvcS2LPicBss.m_picWidthInCtu = m_vvcBasicFeature->m_picWidthInCtu; 573 hucVvcS2LPicBss.m_picHeightInCtu = m_vvcBasicFeature->m_picHeightInCtu; 574 575 hucVvcS2LPicBss.tileCodingParam.m_tileCols = m_vvcBasicFeature->m_tileCols; 576 hucVvcS2LPicBss.tileCodingParam.m_tileRows = m_vvcBasicFeature->m_tileRows; 577 578 MOS_SecureMemcpy(hucVvcS2LPicBss.tileCodingParam.m_tileRow, sizeof(TileRowDesc) * vvcMaxTileRowNum, m_vvcBasicFeature->m_tileRow, sizeof(TileRowDesc) * vvcMaxTileRowNum); 579 MOS_SecureMemcpy(hucVvcS2LPicBss.tileCodingParam.m_tileCol, sizeof(TileColDesc) * vvcMaxTileColNum, m_vvcBasicFeature->m_tileCol, sizeof(TileColDesc) * vvcMaxTileColNum); 580 581 MOS_SecureMemcpy(&hucVvcS2LPicBss.m_vvcLmcsData, sizeof(CodecVvcLmcsData), &m_vvcBasicFeature->m_lmcsApsArray[m_vvcPicParams->m_phLmcsApsId], sizeof(CodecVvcLmcsData)); 582 MOS_SecureMemcpy(&hucVvcS2LPicBss.m_vvcLmcsShapeInfo, sizeof(ApsLmcsReshapeInfo), &m_vvcBasicFeature->m_lmcsReshaperInfo[m_vvcPicParams->m_phLmcsApsId], sizeof(ApsLmcsReshapeInfo)); 583 584 for (uint8_t i = 0; i < 8; i++) 585 { 586 hucVvcS2LPicBss.m_alfChromaNumAltFiltersMinus1[i] = m_vvcBasicFeature->m_alfApsArray[i].m_alfChromaNumAltFiltersMinus1; 587 hucVvcS2LPicBss.m_alfCcCbFiltersSignalledMinus1[i] = m_vvcBasicFeature->m_alfApsArray[i].m_alfCcCbFiltersSignalledMinus1; 588 hucVvcS2LPicBss.m_alfCcCrFiltersSignalledMinus1[i] = m_vvcBasicFeature->m_alfApsArray[i].m_alfCcCrFiltersSignalledMinus1; 589 } 590 hucVvcS2LPicBss.m_isMultiSubPicParam = m_isMultiSubPicParam; 591 592 if (m_decodecp) 593 { 594 DECODE_CHK_STATUS(m_decodecp->SetHucDmemS2LPicBss(&hucVvcS2LPicBss.reserve, &(m_vvcBasicFeature->m_resDataBuffer.OsResource))); 595 } 596 else 597 { 598 hucVvcS2LPicBss.reserve.reserve_0 = 0; 599 hucVvcS2LPicBss.reserve.reserve_1 = 0; 600 hucVvcS2LPicBss.reserve.reserve_2 = 0; 601 hucVvcS2LPicBss.reserve.reserve_3 = 0; 602 } 603 return MOS_STATUS_SUCCESS; 604 } 605 SetRefIdxStateCmd(PicHeaderRplParam & phRplInfo)606 MOS_STATUS VvcDecodeS2LPkt::SetRefIdxStateCmd(PicHeaderRplParam& phRplInfo) 607 { 608 DECODE_FUNC_CALL(); 609 MOS_ZeroMemory(&phRplInfo, sizeof(PicHeaderRplParam)); 610 CodecVvcRplStructure rpl = {}; 611 if (m_vvcPicParams->m_ppsFlags.m_fields.m_ppsRplInfoInPhFlag) //Parse RefIdx State Cmd in driver when RPL info is in PH flag. 612 { 613 uint8_t rpl0EnableFrameCnt = 0; 614 uint8_t rpl1EnableFrameCnt = 0; 615 for (auto i = 0; i < vvcMaxNumRefFrame; i++) 616 { 617 if (m_vvcPicParams->m_refPicList[0][i].PicFlags != PICTURE_INVALID) 618 { 619 rpl0EnableFrameCnt++; 620 } 621 if (m_vvcPicParams->m_refPicList[1][i].PicFlags != PICTURE_INVALID) 622 { 623 rpl1EnableFrameCnt++; 624 } 625 } 626 627 phRplInfo.numRefForList0 = m_vvcBasicFeature->m_numRefForList0; 628 phRplInfo.numRefForList1 = m_vvcBasicFeature->m_numRefForList1; 629 630 for (auto i = 0; i < 2; i++) 631 { 632 for (auto j = 0; j < vvcMaxNumRefFrame; j++) 633 { 634 phRplInfo.refPicListFrameIdx[i][j] = m_vvcPicParams->m_refPicList[i][j].FrameIdx; 635 phRplInfo.refPicListFrameFlag[i][j] = m_vvcPicParams->m_refPicList[i][j].PicFlags; 636 } 637 } 638 FillPhRplInfoArray(LIST_0, rpl0EnableFrameCnt, phRplInfo); 639 FillPhRplInfoArray(LIST_1, rpl1EnableFrameCnt, phRplInfo); 640 } 641 return MOS_STATUS_SUCCESS; 642 } 643 FillPhRplInfoArray(uint8_t listIdx,uint8_t entryCounts,PicHeaderRplParam & phRplInfo)644 MOS_STATUS VvcDecodeS2LPkt::FillPhRplInfoArray(uint8_t listIdx, uint8_t entryCounts, PicHeaderRplParam &phRplInfo) 645 { 646 DECODE_FUNC_CALL(); 647 for (auto j = 0; j < entryCounts; j++) 648 { 649 // Short term reference flag 650 phRplInfo.stRefPicFlag[listIdx][j] = (m_vvcPicParams->m_refPicList[listIdx][j].PicFlags == PICTURE_SHORT_TERM_REFERENCE) ? true : false; 651 // DiffPicOrderCnt 652 DECODE_ASSERT(m_vvcPicParams->m_refPicList[listIdx][j].FrameIdx < vvcMaxNumRefFrame); //TODO: unavailable? associated flag? 653 int32_t refPoc = m_vvcPicParams->m_refFramePocList[m_vvcPicParams->m_refPicList[listIdx][j].FrameIdx]; //TODO: For error check, compare the poc from ref list and the value here. 654 phRplInfo.diffPicOrderCnt[listIdx][j] = m_vvcPicParams->m_picOrderCntVal - refPoc; 655 } 656 return MOS_STATUS_SUCCESS; 657 } 658 SetDmemBuffer()659 MOS_STATUS VvcDecodeS2LPkt::SetDmemBuffer() 660 { 661 DECODE_FUNC_CALL(); 662 PMOS_BUFFER dmemBuf = m_vvcS2lDmemBufferArray->Peek(); 663 DECODE_CHK_NULL(dmemBuf); 664 ResourceAutoLock resLock(m_allocator, &dmemBuf->OsResource); 665 VvcS2lBss *dmemBase = (VvcS2lBss *)resLock.LockResourceForWrite(); 666 DECODE_CHK_NULL(dmemBase); 667 668 dmemBase->ProductFamily = m_hucItf->GetHucProductFamily(); 669 dmemBase->RevId = m_hwInterface->GetPlatform().usRevId; 670 dmemBase->isDmaCopyEnable = DMAReadWriteEnabled; 671 dmemBase->isCp = 0; 672 673 if (m_osInterface != nullptr && m_osInterface->osCpInterface != nullptr) 674 { 675 dmemBase->isCp = m_osInterface->osCpInterface->IsCpEnabled() && m_osInterface->osCpInterface->IsHMEnabled(); 676 } 677 else 678 { 679 dmemBase->isCp = 0; 680 } 681 682 DECODE_CHK_STATUS(ConstructLmcsReshaper()); 683 684 DECODE_CHK_STATUS(SetHucDmemPictureBss(dmemBase->VvcPictureBss)); 685 DECODE_CHK_STATUS(SetHucDmemSliceBss(dmemBase)); 686 687 auto offset1 = CODECHAL_OFFSETOF(HucVvcS2lPicBss, m_phCrTcOffsetDiv2); 688 auto offset2 = CODECHAL_OFFSETOF(HucVvcS2lPicBss, m_picOrderCntVal); 689 auto size = offset2 - offset1; 690 if (m_vvcBasicFeature->m_numSlices <= CODECHAL_VVC_MAX_NUM_SLICES_LVL_6) 691 { 692 m_dmemTransferSize = m_dmemBufferSize; 693 m_dmemTransferSize = MOS_ALIGN_CEIL(m_dmemTransferSize, CODECHAL_CACHELINE_SIZE); 694 } 695 else 696 { 697 return MOS_STATUS_INVALID_PARAMETER; 698 } 699 700 return MOS_STATUS_SUCCESS; 701 } 702 SetExtraDataBuffer()703 MOS_STATUS VvcDecodeS2LPkt::SetExtraDataBuffer() 704 { 705 DECODE_FUNC_CALL(); 706 m_vvcS2lExtraDataBuffer = m_vvcS2lExtraBufferArray->Fetch(); 707 DECODE_CHK_NULL(m_vvcS2lExtraDataBuffer); 708 ResourceAutoLock resLock(m_allocator, &m_vvcS2lExtraDataBuffer->OsResource); 709 VvcS2lExtraBss *extraData = (VvcS2lExtraBss *)resLock.LockResourceForWrite(); 710 DECODE_CHK_NULL(extraData); 711 //RPL INFO 712 for (auto i = 0; i < vvcMaxRplNum; i++) 713 { 714 extraData->m_rplInfo[i].rplInfo.m_listIdx = m_vvcBasicFeature->m_rplParams[i].m_listIdx; 715 extraData->m_rplInfo[i].rplInfo.m_rplsIdx = m_vvcBasicFeature->m_rplParams[i].m_rplsIdx; 716 extraData->m_rplInfo[i].rplInfo.m_numRefEntries = m_vvcBasicFeature->m_rplParams[i].m_numRefEntries; 717 extraData->m_rplInfo[i].rplInfo.m_ltrpInHeaderFlag = m_vvcBasicFeature->m_rplParams[i].m_ltrpInHeaderFlag; 718 for (auto j = 0; j < 29; j++) 719 { 720 if ((m_vvcBasicFeature->m_vvcPicParams->m_spsFlags2.m_fields.m_spsWeightedPredFlag || m_vvcBasicFeature->m_vvcPicParams->m_spsFlags2.m_fields.m_spsWeightedBipredFlag) && j != 0 ) 721 { 722 extraData->m_rplInfo[i].rplInfo.m_absDeltaPocSt[j] = MOS_ABS(m_vvcBasicFeature->m_rplParams[i].m_deltaPocSt[j]); 723 } 724 else 725 { 726 extraData->m_rplInfo[i].rplInfo.m_absDeltaPocSt[j] = MOS_ABS(m_vvcBasicFeature->m_rplParams[i].m_deltaPocSt[j]) - 1; 727 } 728 extraData->m_rplInfo[i].rplInfo.m_strpEntrySignFlag[j] = m_vvcBasicFeature->m_rplParams[i].m_deltaPocSt[j] >= 0 ? 0 : 1; 729 } 730 MOS_SecureMemcpy(extraData->m_rplInfo[i].rplInfo.m_stRefPicFlag, sizeof(m_vvcBasicFeature->m_rplParams[i].m_stRefPicFlag), & m_vvcBasicFeature->m_rplParams[i].m_stRefPicFlag, sizeof(m_vvcBasicFeature->m_rplParams[i].m_stRefPicFlag)); 731 MOS_SecureMemcpy(extraData->m_rplInfo[i].rplInfo.m_rplsPocLsbLt, sizeof(m_vvcBasicFeature->m_rplParams[i].m_rplsPocLsbLt), & m_vvcBasicFeature->m_rplParams[i].m_rplsPocLsbLt, sizeof(m_vvcBasicFeature->m_rplParams[i].m_rplsPocLsbLt)); 732 } 733 for (uint32_t i = 0; i < m_slicePartitionParamNumber; i++) 734 { 735 extraData->m_slicePartitionParam[i].partitionInfo.m_bottomSliceInTileFlag = m_vvcBasicFeature->m_sliceDesc[i].m_bottomSliceInTileFlag; 736 extraData->m_slicePartitionParam[i].partitionInfo.m_multiSlicesInTileFlag = m_vvcBasicFeature->m_sliceDesc[i].m_multiSlicesInTileFlag; 737 extraData->m_slicePartitionParam[i].partitionInfo.m_numCtusInCurrSlice = m_vvcBasicFeature->m_sliceDesc[i].m_numCtusInCurrSlice; 738 extraData->m_slicePartitionParam[i].partitionInfo.m_numSlicesInTile = m_vvcBasicFeature->m_sliceDesc[i].m_numSlicesInTile; 739 extraData->m_slicePartitionParam[i].partitionInfo.m_sliceEndCtbx = m_vvcBasicFeature->m_sliceDesc[i].m_sliceEndCtbx; 740 extraData->m_slicePartitionParam[i].partitionInfo.m_sliceEndCtby = m_vvcBasicFeature->m_sliceDesc[i].m_sliceEndCtby; 741 extraData->m_slicePartitionParam[i].partitionInfo.m_sliceHeightInCtu = m_vvcBasicFeature->m_sliceDesc[i].m_sliceHeightInCtu; 742 extraData->m_slicePartitionParam[i].partitionInfo.m_sliceHeightInTiles = m_vvcBasicFeature->m_sliceDesc[i].m_sliceHeightInTiles; 743 extraData->m_slicePartitionParam[i].partitionInfo.m_sliceIdxInSubPic = m_vvcBasicFeature->m_sliceDesc[i].m_sliceIdxInSubPic; 744 extraData->m_slicePartitionParam[i].partitionInfo.m_sliceStartCtbx = m_vvcBasicFeature->m_sliceDesc[i].m_sliceStartCtbx; 745 extraData->m_slicePartitionParam[i].partitionInfo.m_sliceStartCtby = m_vvcBasicFeature->m_sliceDesc[i].m_sliceStartCtby; 746 extraData->m_slicePartitionParam[i].partitionInfo.m_sliceWidthInTiles = m_vvcBasicFeature->m_sliceDesc[i].m_sliceWidthInTiles; 747 extraData->m_slicePartitionParam[i].partitionInfo.m_startTileX = m_vvcBasicFeature->m_sliceDesc[i].m_startTileX; 748 extraData->m_slicePartitionParam[i].partitionInfo.m_startTileY = m_vvcBasicFeature->m_sliceDesc[i].m_startTileY; 749 extraData->m_slicePartitionParam[i].partitionInfo.m_subPicIdx = m_vvcBasicFeature->m_sliceDesc[i].m_subPicIdx; 750 extraData->m_slicePartitionParam[i].partitionInfo.m_tileIdx = m_vvcBasicFeature->m_sliceDesc[i].m_tileIdx; 751 extraData->m_slicePartitionParam[i].partitionInfo.m_topSliceInTileFlag = m_vvcBasicFeature->m_sliceDesc[i].m_topSliceInTileFlag; 752 } 753 754 if (m_vvcPicParams->m_ppsFlags.m_fields.m_ppsWpInfoInPhFlag) 755 { 756 extraData->m_wpInfoinPH.paramField.m_lumaLog2WeightDenom = m_vvcPicParams->m_wpInfo.m_lumaLog2WeightDenom; 757 extraData->m_wpInfoinPH.paramField.m_deltaChromaLog2WeightDenom = m_vvcPicParams->m_wpInfo.m_deltaChromaLog2WeightDenom; 758 extraData->m_wpInfoinPH.paramField.m_numL0Weights = m_vvcPicParams->m_wpInfo.m_numL0Weights; 759 extraData->m_wpInfoinPH.paramField.m_numL1Weights = m_vvcPicParams->m_wpInfo.m_numL1Weights; 760 for (auto i = 0; i < 15; i++) 761 { 762 extraData->m_wpInfoinPH.paramField.m_lumaWeightL0Flag[i] = m_vvcPicParams->m_wpInfo.m_lumaWeightL0Flag[i]; 763 extraData->m_wpInfoinPH.paramField.m_chromaWeightL0Flag[i] = m_vvcPicParams->m_wpInfo.m_chromaWeightL0Flag[i]; 764 extraData->m_wpInfoinPH.paramField.m_deltaLumaWeightL0[i] = m_vvcPicParams->m_wpInfo.m_deltaLumaWeightL0[i]; 765 extraData->m_wpInfoinPH.paramField.m_lumaOffsetL0[i] = m_vvcPicParams->m_wpInfo.m_lumaOffsetL0[i]; 766 extraData->m_wpInfoinPH.paramField.m_lumaWeightL1Flag[i] = m_vvcPicParams->m_wpInfo.m_lumaWeightL1Flag[i]; 767 extraData->m_wpInfoinPH.paramField.m_chromaWeightL1Flag[i] = m_vvcPicParams->m_wpInfo.m_chromaWeightL1Flag[i]; 768 extraData->m_wpInfoinPH.paramField.m_deltaLumaWeightL1[i] = m_vvcPicParams->m_wpInfo.m_deltaLumaWeightL1[i]; 769 extraData->m_wpInfoinPH.paramField.m_lumaOffsetL1[i] = m_vvcPicParams->m_wpInfo.m_lumaOffsetL1[i]; 770 } 771 for (auto i = 0; i < 2; i++) 772 { 773 for (auto j = 0; j < 15; j++) 774 { 775 extraData->m_wpInfoinPH.paramField.m_deltaChromaWeightL0[j][i] = m_vvcPicParams->m_wpInfo.m_deltaChromaWeightL0[j][i]; 776 extraData->m_wpInfoinPH.paramField.m_deltaChromaOffsetL0[j][i] = m_vvcPicParams->m_wpInfo.m_deltaChromaOffsetL0[j][i]; 777 extraData->m_wpInfoinPH.paramField.m_deltaChromaWeightL1[j][i] = m_vvcPicParams->m_wpInfo.m_deltaChromaWeightL1[j][i]; 778 extraData->m_wpInfoinPH.paramField.m_deltaChromaOffsetL1[j][i] = m_vvcPicParams->m_wpInfo.m_deltaChromaOffsetL1[j][i]; 779 } 780 } 781 } 782 else 783 { 784 MOS_ZeroMemory(&extraData->m_wpInfoinPH, sizeof(extraData->m_wpInfoinPH)); 785 } 786 787 return MOS_STATUS_SUCCESS; 788 } 789 ConstructLmcsReshaper() const790 MOS_STATUS VvcDecodeS2LPkt::ConstructLmcsReshaper() const 791 { 792 DECODE_FUNC_CALL() 793 794 int32_t reshapeLUTSize = 1 << (m_vvcPicParams->m_spsBitdepthMinus8 + 8); 795 int32_t pwlFwdLUTsize = vvcPicCodeCwBins; 796 int32_t pwlFwdBinLen = reshapeLUTSize / vvcPicCodeCwBins; 797 uint16_t initCW = (uint16_t)pwlFwdBinLen; 798 799 CodecVvcLmcsData *lmcsData = &m_vvcBasicFeature->m_lmcsApsArray[m_vvcPicParams->m_phLmcsApsId]; 800 ApsLmcsReshapeInfo *sliceReshapeInfo = &m_vvcBasicFeature->m_lmcsReshaperInfo[m_vvcPicParams->m_phLmcsApsId]; 801 uint32_t reshaperModelMaxBinIdx = vvcPicCodeCwBins - 1 - lmcsData->m_lmcsDeltaMaxBinIdx; 802 memset(sliceReshapeInfo->m_lmcsPivot, 0, sizeof(sliceReshapeInfo->m_lmcsPivot)); 803 804 if (m_vvcBasicFeature->m_activeLmcsMask & (1 << lmcsData->m_apsAdaptationParameterSetId)) // Only Transfer the data to dmem when LMCS array is available 805 { 806 for (int32_t i = 0; i < lmcsData->m_lmcsMinBinIdx; i++) 807 { 808 sliceReshapeInfo->m_lmcsCW[i] = 0; 809 } 810 for (auto i = reshaperModelMaxBinIdx + 1; i < vvcPicCodeCwBins; i++) 811 { 812 sliceReshapeInfo->m_lmcsCW[i] = 0; 813 } 814 for (auto i = lmcsData->m_lmcsMinBinIdx; i <= reshaperModelMaxBinIdx; i++) 815 { 816 sliceReshapeInfo->m_lmcsCW[i] = (uint16_t)(lmcsData->m_lmcsDeltaCW[i] + (int32_t)initCW); 817 } 818 819 for (auto i = 0; i < pwlFwdLUTsize; i++) 820 { 821 sliceReshapeInfo->m_lmcsPivot[i + 1] = sliceReshapeInfo->m_lmcsPivot[i] + sliceReshapeInfo->m_lmcsCW[i]; 822 sliceReshapeInfo->m_scaleCoeff[i] = ((int32_t)sliceReshapeInfo->m_lmcsCW[i] * (1 << vvcFpPrec) + (1 << ((int32_t)log2(pwlFwdBinLen) - 1))) >> (int32_t)log2(pwlFwdBinLen); 823 if (sliceReshapeInfo->m_lmcsCW[i] == 0) 824 { 825 sliceReshapeInfo->m_invScaleCoeff[i] = 0; 826 sliceReshapeInfo->m_chromaScaleCoeff[i] = 1 << vvcCscaleFpPrec; 827 } 828 else 829 { 830 int32_t lmcsCwCrs = sliceReshapeInfo->m_lmcsCW[i] + lmcsData->m_lmcsDeltaCrs; 831 if (lmcsCwCrs < (initCW >> 3) || (lmcsCwCrs > (initCW << 3) - 1)) 832 { 833 DECODE_ASSERTMESSAGE("Error concealed: force sh_lmcs_used_flag = 0 when (lmcsCW[ i ] + lmcsDeltaCrs) out of the range (OrgCW >> 3) to ((OrgCW << 3) - 1) inclusive.\n"); 834 } 835 else 836 { 837 sliceReshapeInfo->m_invScaleCoeff[i] = (int32_t)(initCW * (1 << vvcFpPrec) / sliceReshapeInfo->m_lmcsCW[i]); 838 sliceReshapeInfo->m_chromaScaleCoeff[i] = (int32_t)(initCW * (1 << vvcFpPrec) / (sliceReshapeInfo->m_lmcsCW[i] + lmcsData->m_lmcsDeltaCrs)); 839 } 840 } 841 } 842 } 843 return MOS_STATUS_SUCCESS; 844 } 845 AddHucCpState(MOS_COMMAND_BUFFER & cmdBuffer,uint32_t index,CodecVvcSliceParams & sliceParams)846 MOS_STATUS VvcDecodeS2LPkt::AddHucCpState(MOS_COMMAND_BUFFER &cmdBuffer, uint32_t index, CodecVvcSliceParams &sliceParams) 847 { 848 if (m_decodecp) 849 { 850 DECODE_CHK_STATUS(m_decodecp->AddHucState(&cmdBuffer, 851 &(m_vvcBasicFeature->m_resDataBuffer.OsResource), 852 sliceParams.m_sliceBytesInBuffer, 853 sliceParams.m_byteOffsetToSliceData, 854 index)); 855 } 856 return MOS_STATUS_SUCCESS; 857 } 858 GetSliceBatchOffset(uint32_t sliceNum)859 uint32_t VvcDecodeS2LPkt::GetSliceBatchOffset(uint32_t sliceNum) 860 { 861 DECODE_FUNC_CALL(); 862 uint32_t sliceLvlBufSize = 0; 863 if (m_hwInterface != nullptr) 864 { 865 DECODE_CHK_STATUS(m_hwInterface->GetVvcpSliceLvlCmdSize(&sliceLvlBufSize)); 866 sliceLvlBufSize = MOS_ALIGN_CEIL(sliceLvlBufSize, 64); 867 } 868 return sliceLvlBufSize * sliceNum; 869 } 870 SetHucDmemSliceBss(VvcS2lBss * VvcS2lBss)871 MOS_STATUS VvcDecodeS2LPkt::SetHucDmemSliceBss( 872 VvcS2lBss* VvcS2lBss) 873 { 874 DECODE_FUNC_CALL(); 875 uint8_t* currentPointer = (uint8_t*)VvcS2lBss->sliceLvlParam; 876 877 VvcS2lBss->sliceBbParamNumber = m_sliceBbParamNumber; 878 VvcS2lBss->sliceBbParamOffset = m_sliceBbParamOffset; 879 VvcS2lBss->sliceBsParamNumber = m_sliceBsParamNumber; 880 VvcS2lBss->sliceBsParamOffset = m_sliceBsParamOffset; 881 VvcS2lBss->slicePartitionParamNumber = m_slicePartitionParamNumber; 882 VvcS2lBss->subPicParamNumber = m_subPicParamNumber; 883 VvcS2lBss->subPicParamOffset = m_subPicParamOffset; 884 885 currentPointer = (uint8_t*)(VvcS2lBss->sliceLvlParam) + m_sliceBsParamOffset; 886 for (uint32_t i = 0; i < m_sliceBsParamNumber; i++) 887 { 888 VvcS2lSliceBsParam bsParam = {}; 889 bsParam.BSNALunitDataLocation = m_vvcSliceParams[i].m_bSNALunitDataLocation; 890 bsParam.SliceBytesInBuffer = m_vvcSliceParams[i].m_sliceBytesInBuffer; 891 892 if (m_decodecp) 893 { 894 DECODE_CHK_STATUS(m_decodecp->SetHucDmemS2LSliceBss(&bsParam.reserve, i, m_vvcSliceParams[i].m_sliceBytesInBuffer, m_vvcSliceParams[i].m_byteOffsetToSliceData)); 895 } 896 MOS_SecureMemcpy(currentPointer, sizeof(VvcS2lSliceBsParam), &bsParam, sizeof(VvcS2lSliceBsParam)); 897 currentPointer += sizeof(VvcS2lSliceBsParam); 898 } 899 900 currentPointer = (uint8_t *)(VvcS2lBss->sliceLvlParam) + m_sliceBbParamOffset; 901 902 for (uint32_t i = 0; i < m_sliceBbParamNumber; i++) 903 { 904 VvcS2lSliceBbParam bbParam = {}; 905 uint32_t cpSize = 0; 906 uint32_t cpPatchSize = 0; 907 m_hwInterface->GetCpInterface()->GetCpSliceLevelCmdSize(cpSize, cpPatchSize); 908 bbParam.SliceCmdBatchOffset = GetSliceBatchOffset(i); 909 MOS_SecureMemcpy(currentPointer, sizeof(VvcS2lSliceBbParam), &bbParam, sizeof(VvcS2lSliceBbParam)); 910 currentPointer += sizeof(VvcS2lSliceBbParam); 911 } 912 913 if (m_isMultiSubPicParam) //SubPic param need be valid before copy. 914 { 915 currentPointer = (uint8_t *)(VvcS2lBss->sliceLvlParam) + m_subPicParamOffset; 916 for (uint32_t i = 0; i < m_subPicParamNumber; i++) 917 { 918 VvcS2lSubpicParam subPicParam = {}; 919 subPicParam.m_endCtbX = m_vvcBasicFeature->m_subPicParams[i].m_endCtbX; 920 subPicParam.m_endCtbY = m_vvcBasicFeature->m_subPicParams[i].m_endCtbY; 921 subPicParam.m_numSlices = m_vvcBasicFeature->m_subPicParams[i].m_numSlices; 922 subPicParam.m_spsSubpicCtuTopLeftX = m_vvcBasicFeature->m_subPicParams[i].m_spsSubpicCtuTopLeftX; 923 subPicParam.m_spsSubpicCtuTopLeftY = m_vvcBasicFeature->m_subPicParams[i].m_spsSubpicCtuTopLeftY; 924 subPicParam.m_spsSubpicHeightMinus1 = m_vvcBasicFeature->m_subPicParams[i].m_spsSubpicHeightMinus1; 925 subPicParam.m_spsSubpicWidthMinus1 = m_vvcBasicFeature->m_subPicParams[i].m_spsSubpicWidthMinus1; 926 subPicParam.m_subPicFlags.m_value = m_vvcBasicFeature->m_subPicParams[i].m_subPicFlags.m_value; 927 subPicParam.m_subpicIdVal = m_vvcBasicFeature->m_subPicParams[i].m_subpicIdVal; 928 MOS_SecureMemcpy(currentPointer, sizeof(VvcS2lSubpicParam), &subPicParam, sizeof(VvcS2lSubpicParam)); 929 currentPointer += sizeof(VvcS2lSubpicParam); 930 } 931 } 932 933 return MOS_STATUS_SUCCESS; 934 } 935 CalculateVvcSliceLvlCmdSize()936 void VvcDecodeS2LPkt::CalculateVvcSliceLvlCmdSize() 937 { 938 m_vvcpSliceCmdSize = m_vvcpItf->GETSIZE_VVCP_SLICE_STATE() + 939 m_vvcpItf->GETSIZE_VVCP_REF_IDX_STATE() * 2 + 940 m_vvcpItf->GETSIZE_VVCP_WEIGHTOFFSET_STATE() * 2 + 941 m_vvcpItf->GETSIZE_VVCP_BSD_OBJECT() + 942 m_miItf->GETSIZE_MI_BATCH_BUFFER_START(); 943 } 944 AddCmd_HUC_IMEM_STATE(MOS_COMMAND_BUFFER & cmdBuffer)945 MOS_STATUS VvcDecodeS2LPkt::AddCmd_HUC_IMEM_STATE(MOS_COMMAND_BUFFER &cmdBuffer) 946 { 947 DECODE_FUNC_CALL(); 948 auto &par = m_hucItf->MHW_GETPAR_F(HUC_IMEM_STATE)(); 949 par = {}; 950 par.kernelDescriptor = m_vdboxHucVvcS2lKernelDescriptor; 951 DECODE_CHK_STATUS(m_hucItf->MHW_ADDCMD_F(HUC_IMEM_STATE)(&cmdBuffer)); 952 953 auto &mfxWaitParams = m_miItf->MHW_GETPAR_F(MFX_WAIT)(); 954 mfxWaitParams = {}; 955 mfxWaitParams.iStallVdboxPipeline = true; 956 DECODE_CHK_STATUS((m_miItf->MHW_ADDCMD_F(MFX_WAIT)(&cmdBuffer))); 957 958 return MOS_STATUS_SUCCESS; 959 } 960 AddCmd_HUC_PIPE_MODE_SELECT(MOS_COMMAND_BUFFER & cmdBuffer)961 MOS_STATUS VvcDecodeS2LPkt::AddCmd_HUC_PIPE_MODE_SELECT(MOS_COMMAND_BUFFER &cmdBuffer) 962 { 963 DECODE_FUNC_CALL(); 964 //for gen 11+, we need to add MFX wait for both KIN and VRT before and after HUC Pipemode select... 965 auto &mfxWaitParams = m_miItf->MHW_GETPAR_F(MFX_WAIT)(); 966 mfxWaitParams = {}; 967 mfxWaitParams.iStallVdboxPipeline = true; 968 DECODE_CHK_STATUS((m_miItf->MHW_ADDCMD_F(MFX_WAIT)(&cmdBuffer))); 969 970 auto &par = m_hucItf->MHW_GETPAR_F(HUC_PIPE_MODE_SELECT)(); 971 par = {}; 972 par.streamOutEnabled = false; 973 DECODE_CHK_STATUS(m_hucItf->MHW_ADDCMD_F(HUC_PIPE_MODE_SELECT)(&cmdBuffer)); 974 975 mfxWaitParams = {}; 976 mfxWaitParams.iStallVdboxPipeline = true; 977 DECODE_CHK_STATUS((m_miItf->MHW_ADDCMD_F(MFX_WAIT)(&cmdBuffer))); 978 return MOS_STATUS_SUCCESS; 979 } 980 GetS2lDmemBuffer()981 PMOS_BUFFER VvcDecodeS2LPkt::GetS2lDmemBuffer() 982 { 983 if (m_vvcS2lDmemBufferArray == nullptr) 984 { 985 return nullptr; 986 } 987 return m_vvcS2lDmemBufferArray->Peek(); 988 } 989 MHW_SETPAR_DECL_SRC(HUC_IND_OBJ_BASE_ADDR_STATE,VvcDecodeS2LPkt)990 MHW_SETPAR_DECL_SRC(HUC_IND_OBJ_BASE_ADDR_STATE, VvcDecodeS2LPkt) 991 { 992 DECODE_FUNC_CALL(); 993 994 params.DataSize = m_vvcBasicFeature->m_dataSize; 995 params.DataOffset = m_vvcBasicFeature->m_dataOffset; 996 params.DataBuffer = &(m_vvcBasicFeature->m_resDataBuffer.OsResource); 997 return MOS_STATUS_SUCCESS; 998 } 999 MHW_SETPAR_DECL_SRC(HUC_VIRTUAL_ADDR_STATE,VvcDecodeS2LPkt)1000 MHW_SETPAR_DECL_SRC(HUC_VIRTUAL_ADDR_STATE, VvcDecodeS2LPkt) 1001 { 1002 DECODE_FUNC_CALL(); 1003 1004 PMHW_BATCH_BUFFER sliceBatchBuffer = m_vvcPipeline->GetSliceLvlCmdBuffer(); 1005 DECODE_ASSERT(sliceBatchBuffer != nullptr); 1006 params.regionParams[0].presRegion = &sliceBatchBuffer->OsResource; 1007 params.regionParams[0].isWritable = true; 1008 params.regionParams[0].dwOffset = 0; 1009 1010 PMHW_BATCH_BUFFER tileBatchBuffer = m_vvcPipeline->GetTileLvlCmdBuffer(); 1011 DECODE_ASSERT(tileBatchBuffer != nullptr); 1012 params.regionParams[1].presRegion = &tileBatchBuffer->OsResource; 1013 params.regionParams[1].isWritable = true; 1014 params.regionParams[1].dwOffset = 0; 1015 1016 DECODE_ASSERT(m_vvcS2lExtraDataBuffer != nullptr); 1017 params.regionParams[2].presRegion = &m_vvcS2lExtraDataBuffer->OsResource; 1018 params.regionParams[2].isWritable = false; 1019 params.regionParams[2].dwOffset = 0; 1020 1021 return MOS_STATUS_SUCCESS; 1022 } 1023 MHW_SETPAR_DECL_SRC(HUC_DMEM_STATE,VvcDecodeS2LPkt)1024 MHW_SETPAR_DECL_SRC(HUC_DMEM_STATE, VvcDecodeS2LPkt) 1025 { 1026 DECODE_FUNC_CALL(); 1027 DECODE_CHK_NULL(m_vvcS2lDmemBufferArray); 1028 auto dmemBuffer = m_vvcS2lDmemBufferArray->Peek(); 1029 DECODE_CHK_NULL(dmemBuffer); 1030 params.hucDataSource = &dmemBuffer->OsResource; 1031 params.dataLength = MOS_ALIGN_CEIL(m_dmemTransferSize, CODECHAL_CACHELINE_SIZE); 1032 params.dmemOffset = HUC_DMEM_OFFSET_RTOS_GEMS; 1033 return MOS_STATUS_SUCCESS; 1034 } 1035 AddCmd_HUC_STREAM_OBJECT(MOS_COMMAND_BUFFER & cmdBuffer,CodecVvcSliceParams sliceParams)1036 MOS_STATUS VvcDecodeS2LPkt::AddCmd_HUC_STREAM_OBJECT(MOS_COMMAND_BUFFER &cmdBuffer, CodecVvcSliceParams sliceParams) 1037 { 1038 DECODE_FUNC_CALL(); 1039 1040 auto &par = m_hucItf->MHW_GETPAR_F(HUC_STREAM_OBJECT)(); 1041 par = {}; 1042 par.IndirectStreamInDataLength = sliceParams.m_sliceBytesInBuffer + m_tailingBsReadSize; 1043 par.StreamOut = 0; 1044 par.IndirectStreamInStartAddress = sliceParams.m_bSNALunitDataLocation; 1045 par.HucProcessing = true; 1046 1047 par.HucBitstreamEnable = 1; 1048 par.EmulationPreventionByteRemoval = 1; 1049 par.StartCodeSearchEngine = 0; 1050 par.StartCodeByte0 = 0; 1051 par.StartCodeByte1 = 0; 1052 par.StartCodeByte2 = 1; 1053 1054 DECODE_CHK_STATUS(m_hucItf->MHW_ADDCMD_F(HUC_STREAM_OBJECT)(&cmdBuffer)); 1055 1056 return MOS_STATUS_SUCCESS; 1057 } 1058 AddCmd_HUC_START(MOS_COMMAND_BUFFER & cmdBuffer,bool laststreamobject)1059 MOS_STATUS VvcDecodeS2LPkt::AddCmd_HUC_START(MOS_COMMAND_BUFFER &cmdBuffer, bool laststreamobject) 1060 { 1061 DECODE_FUNC_CALL(); 1062 auto &par = m_hucItf->MHW_GETPAR_F(HUC_START)(); 1063 par = {}; 1064 par.lastStreamObject = laststreamobject; 1065 DECODE_CHK_STATUS(m_hucItf->MHW_ADDCMD_F(HUC_START)(&cmdBuffer)); 1066 1067 return MOS_STATUS_SUCCESS; 1068 } 1069 1070 #if USE_CODECHAL_DEBUG_TOOL DumpHucS2l()1071 MOS_STATUS VvcDecodeS2LPkt::DumpHucS2l() 1072 { 1073 DECODE_FUNC_CALL(); 1074 1075 int32_t currentPass = m_vvcPipeline->GetCurrentPass(); 1076 1077 CodechalDebugInterface *debugInterface = m_vvcPipeline->GetDebugInterface(); 1078 DECODE_CHK_NULL(debugInterface); 1079 auto dmemBuffer = GetS2lDmemBuffer(); 1080 DECODE_CHK_NULL(dmemBuffer); 1081 DECODE_CHK_STATUS(debugInterface->DumpHucDmem( 1082 &dmemBuffer->OsResource, 1083 m_dmemTransferSize, 1084 currentPass, 1085 hucRegionDumpDefault)); 1086 1087 return MOS_STATUS_SUCCESS; 1088 } 1089 #endif 1090 1091 }; 1092