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