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