1 /*
2 * Copyright (c) 2019-2021, Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
13 *
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
20 * OTHER DEALINGS IN THE SOFTWARE.
21 */
22 //!
23 //! \file     decode_av1_tile_packet_g12_base.cpp
24 //! \brief    Defines the interface for g12 av1 decode tile packet
25 //!
26 #include "codechal_utilities.h"
27 #include "decode_av1_tile_packet_g12_base.h"
28 
29 namespace decode
30 {
Init()31     MOS_STATUS Av1DecodeTilePkt_G12_Base::Init()
32     {
33         DECODE_FUNC_CALL();
34 
35         DECODE_CHK_NULL(m_featureManager);
36         DECODE_CHK_NULL(m_hwInterface);
37         DECODE_CHK_NULL(m_osInterface);
38         DECODE_CHK_NULL(m_miInterface);
39         DECODE_CHK_NULL(m_av1Pipeline);
40         DECODE_CHK_NULL(m_avpInterface);
41 
42         m_av1BasicFeature = dynamic_cast<Av1BasicFeatureG12*>(m_featureManager->GetFeature(FeatureIDs::basicFeature));
43         DECODE_CHK_NULL(m_av1BasicFeature);
44 
45         m_allocator = m_pipeline ->GetDecodeAllocator();
46         DECODE_CHK_NULL(m_allocator);
47 
48         DECODE_CHK_STATUS(CalculateTileStateCommandSize());
49 
50         return MOS_STATUS_SUCCESS;
51     }
52 
Prepare()53     MOS_STATUS Av1DecodeTilePkt_G12_Base::Prepare()
54     {
55         DECODE_FUNC_CALL();
56 
57         DECODE_CHK_NULL(m_av1BasicFeature->m_av1PicParams);
58         DECODE_CHK_NULL(m_av1BasicFeature->m_av1TileParams);
59 
60         m_av1PicParams = m_av1BasicFeature->m_av1PicParams;
61         m_av1TileParams = m_av1BasicFeature->m_av1TileParams;
62 
63         return MOS_STATUS_SUCCESS;
64     }
65 
SetAvpTileCodingParams(MhwVdboxAvpTileCodingParams & tileCodingParams,int16_t tileIdx)66     MOS_STATUS Av1DecodeTilePkt_G12_Base::SetAvpTileCodingParams(
67         MhwVdboxAvpTileCodingParams &tileCodingParams,
68         int16_t  tileIdx)
69     {
70         DECODE_FUNC_CALL();
71 
72         MOS_ZeroMemory(&tileCodingParams, sizeof(tileCodingParams));
73         Av1DecodeTileG12::TileDesc *m_tileDesc = m_av1BasicFeature->m_tileCoding.m_tileDesc;
74         uint16_t curCol = m_tileDesc[tileIdx].m_tileColumn;
75         uint16_t curRow = m_tileDesc[tileIdx].m_tileRow;
76         uint16_t srcTileId = curCol + curRow * m_av1PicParams->m_tileCols;
77 
78         if (m_av1PicParams->m_picInfoFlags.m_fields.m_largeScaleTile)
79         {
80             DECODE_ASSERT(tileIdx == m_tileDesc[tileIdx].m_tileIndex);
81         }
82 
83         if (m_av1PicParams->m_picInfoFlags.m_fields.m_largeScaleTile)
84         {
85             tileCodingParams.m_tileId                 = srcTileId;
86             tileCodingParams.m_tgTileNum                = srcTileId;
87             tileCodingParams.m_tileGroupId            = 0;
88             tileCodingParams.m_tileColPositionInSb    = m_av1BasicFeature->m_tileCoding.m_tileColStartSb[curCol];
89             tileCodingParams.m_tileRowPositionInSb    = m_av1BasicFeature->m_tileCoding.m_tileRowStartSb[curRow];
90             tileCodingParams.m_tileWidthInSbMinus1    = m_av1PicParams->m_widthInSbsMinus1[curCol];
91             tileCodingParams.m_tileHeightInSbMinus1   = m_av1PicParams->m_heightInSbsMinus1[curRow];
92             tileCodingParams.m_tileRowIndependentFlag = true;
93             tileCodingParams.m_isLastTileOfColumn     = (curRow == m_av1PicParams->m_tileRows - 1) ? true : false;
94             tileCodingParams.m_isLastTileOfRow        = (curCol == m_av1PicParams->m_tileCols - 1) ? true : false;
95             tileCodingParams.m_isFirstTileOfTileGroup = (srcTileId == 0) ? true : false;
96             tileCodingParams.m_isLastTileOfTileGroup  = (curCol == m_av1PicParams->m_tileCols - 1) && (curRow == m_av1PicParams->m_tileRows - 1);
97             tileCodingParams.m_isLastTileOfFrame      = (curCol == m_av1PicParams->m_tileCols - 1) && (curRow == m_av1PicParams->m_tileRows - 1);
98         }
99         else
100         {
101             tileCodingParams.m_tileId                           = tileIdx;
102             tileCodingParams.m_tgTileNum                          = m_tileDesc[tileIdx].m_tileNum;
103             tileCodingParams.m_tileGroupId                      = m_tileDesc[tileIdx].m_tileGroupId;
104             tileCodingParams.m_tileColPositionInSb              = m_av1BasicFeature->m_tileCoding.m_tileColStartSb[curCol];
105             tileCodingParams.m_tileRowPositionInSb              = m_av1BasicFeature->m_tileCoding.m_tileRowStartSb[curRow];
106             tileCodingParams.m_tileWidthInSbMinus1              = m_av1PicParams->m_widthInSbsMinus1[curCol];
107             tileCodingParams.m_tileHeightInSbMinus1             = m_av1PicParams->m_heightInSbsMinus1[curRow];
108             tileCodingParams.m_tileRowIndependentFlag           = true;
109             tileCodingParams.m_isLastTileOfColumn               = (curRow == m_av1PicParams->m_tileRows - 1) ? true : false;
110             tileCodingParams.m_isLastTileOfRow                  = (curCol == m_av1PicParams->m_tileCols - 1) ? true : false;
111             tileCodingParams.m_isFirstTileOfTileGroup           = (m_tileDesc[tileIdx].m_tileNum == 0) ? true : false;
112             tileCodingParams.m_isLastTileOfTileGroup            = m_tileDesc[tileIdx].m_lastInGroup;
113             tileCodingParams.m_isLastTileOfFrame                = (curCol == m_av1PicParams->m_tileCols - 1) && (curRow == m_av1PicParams->m_tileRows - 1);
114         }
115 
116         tileCodingParams.m_disableCdfUpdateFlag             = m_av1PicParams->m_picInfoFlags.m_fields.m_disableCdfUpdate;
117         tileCodingParams.m_disableFrameContextUpdateFlag    = m_av1PicParams->m_picInfoFlags.m_fields.m_disableFrameEndUpdateCdf || (tileIdx != m_av1PicParams->m_contextUpdateTileId);
118         tileCodingParams.m_numOfActiveBePipes               = 1;
119 
120         if (m_av1PicParams->m_picInfoFlags.m_fields.m_largeScaleTile)
121         {
122             tileCodingParams.m_numOfTileColumnsInFrame = m_av1PicParams->m_outputFrameWidthInTilesMinus1 + 1;
123             tileCodingParams.m_numOfTileRowsInFrame    = m_av1PicParams->m_outputFrameHeightInTilesMinus1 + 1;
124 
125             tileCodingParams.m_outputDecodedTileColumnPositionInSBUnit = (m_tileDesc[tileIdx].m_tileIndex % (m_av1PicParams->m_outputFrameWidthInTilesMinus1 + 1)) * (m_av1PicParams->m_widthInSbsMinus1[0] + 1);  //AV1 Conformance: tile width is identical for all tiles
126             tileCodingParams.m_outputDecodedTileRowPositionInSBUnit    = (m_tileDesc[tileIdx].m_tileIndex / (m_av1PicParams->m_outputFrameWidthInTilesMinus1 + 1));                                                //tile height is exactly one SB
127         }
128         else
129         {
130             tileCodingParams.m_numOfTileColumnsInFrame = m_av1PicParams->m_tileCols;
131             tileCodingParams.m_numOfTileRowsInFrame = m_av1PicParams->m_tileRows;
132         }
133 
134         m_av1BasicFeature->m_frameCompletedFlag = tileCodingParams.m_isLastTileOfFrame;
135 
136         return MOS_STATUS_SUCCESS;
137     }
138 
SetBsdObjParams(MhwVdboxAvpBsdParams & bsdObjParams,int16_t tileIdx)139     MOS_STATUS Av1DecodeTilePkt_G12_Base::SetBsdObjParams(
140         MhwVdboxAvpBsdParams &bsdObjParams,
141         int16_t                  tileIdx)
142     {
143         DECODE_FUNC_CALL();
144 
145         MOS_ZeroMemory(&bsdObjParams ,sizeof(bsdObjParams));
146         Av1DecodeTileG12::TileDesc *m_tileDesc = m_av1BasicFeature->m_tileCoding.m_tileDesc;
147         bsdObjParams.m_bsdDataLength = m_tileDesc[tileIdx].m_size;
148         bsdObjParams.m_bsdDataStartOffset = m_tileDesc[tileIdx].m_offset;
149 
150         return MOS_STATUS_SUCCESS;
151     }
152 
AddBsdObj(MOS_COMMAND_BUFFER & cmdBuffer,int16_t tileIdx)153     MOS_STATUS Av1DecodeTilePkt_G12_Base::AddBsdObj(
154         MOS_COMMAND_BUFFER &cmdBuffer,
155         int16_t            tileIdx)
156     {
157         DECODE_FUNC_CALL();
158 
159         MhwVdboxAvpBsdParams bsdObjParams;
160         DECODE_CHK_STATUS(SetBsdObjParams(bsdObjParams, tileIdx));
161         DECODE_CHK_STATUS(m_avpInterface->AddAvpBsdObjectCmd(&cmdBuffer, nullptr, &bsdObjParams));
162 
163         return MOS_STATUS_SUCCESS;
164     }
165 
AddAvpInloopFilterStateCmd(MOS_COMMAND_BUFFER & cmdBuffer)166     MOS_STATUS Av1DecodeTilePkt_G12_Base::AddAvpInloopFilterStateCmd(MOS_COMMAND_BUFFER &cmdBuffer)
167     {
168         DECODE_FUNC_CALL();
169 
170         MhwVdboxAvpPicStateParams picStateParams;
171         DECODE_CHK_STATUS(SetInloopFilterStateParams(picStateParams));
172         DECODE_CHK_STATUS(m_avpInterface->AddAvpInloopFilterStateCmd(&cmdBuffer, &picStateParams));
173 
174         return MOS_STATUS_SUCCESS;
175     }
176 
SetInloopFilterStateParams(MhwVdboxAvpPicStateParams & picStateParams)177     MOS_STATUS Av1DecodeTilePkt_G12_Base::SetInloopFilterStateParams(MhwVdboxAvpPicStateParams& picStateParams)
178     {
179         DECODE_FUNC_CALL();
180 
181         MOS_ZeroMemory(&picStateParams, sizeof(picStateParams));
182         picStateParams.m_picParams = m_av1PicParams;
183 
184         if (m_av1PicParams->m_picInfoFlags.m_fields.m_useSuperres)
185         {
186             //setup super-res step/offset for luma/chroma, per av1_upscale_normative_rows()
187             if (m_av1BasicFeature->m_tileCoding.m_curTile == 0)
188             {
189                 m_av1BasicFeature->m_tileCoding.GetUpscaleConvolveStepX0(*m_av1PicParams, false); // Luma
190                 m_av1BasicFeature->m_tileCoding.GetUpscaleConvolveStepX0(*m_av1PicParams, true);  // Chroma
191             }
192 
193             uint16_t col = m_av1BasicFeature->m_tileCoding.m_tileDesc[m_av1BasicFeature->m_tileCoding.m_curTile].m_tileColumn;
194             picStateParams.m_lumaPlaneXStepQn     = m_av1BasicFeature->m_tileCoding.m_lumaXStepQn;
195             picStateParams.m_lumaPlaneX0Qn        = m_av1BasicFeature->m_tileCoding.m_lumaX0Qn[col];
196             picStateParams.m_chromaPlaneXStepQn   = m_av1BasicFeature->m_tileCoding.m_chromaXStepQn;
197             picStateParams.m_chromaPlaneX0Qn      = m_av1BasicFeature->m_tileCoding.m_chromaX0Qn[col];
198         }
199 
200         return MOS_STATUS_SUCCESS;
201     }
202 
CalculateCommandSize(uint32_t & commandBufferSize,uint32_t & requestedPatchListSize)203     MOS_STATUS Av1DecodeTilePkt_G12_Base::CalculateCommandSize(uint32_t &commandBufferSize,
204                                                       uint32_t &requestedPatchListSize)
205     {
206         DECODE_FUNC_CALL();
207 
208         commandBufferSize      = m_tileStatesSize;
209         requestedPatchListSize = m_tilePatchListSize;
210 
211         return MOS_STATUS_SUCCESS;
212     }
213 
CalculateTileStateCommandSize()214     MOS_STATUS Av1DecodeTilePkt_G12_Base::CalculateTileStateCommandSize()
215     {
216         DECODE_FUNC_CALL();
217 
218         // Tile Level Commands
219         DECODE_CHK_STATUS(m_hwInterface->GetAvpPrimitiveCommandSize(
220                             m_av1BasicFeature->m_mode,
221                             &m_tileStatesSize,
222                             &m_tilePatchListSize));
223 
224         return MOS_STATUS_SUCCESS;
225     }
226 
AddAvpTileState(MOS_COMMAND_BUFFER & cmdBuffer,int16_t tileIdx)227     MOS_STATUS Av1DecodeTilePkt_G12_Base::AddAvpTileState(
228         MOS_COMMAND_BUFFER &cmdBuffer,
229         int16_t           tileIdx)
230     {
231         DECODE_FUNC_CALL();
232 
233         MhwVdboxAvpTileCodingParams tileCodingParams;
234         DECODE_CHK_STATUS(SetAvpTileCodingParams(tileCodingParams, tileIdx));
235         DECODE_CHK_STATUS(m_avpInterface->AddAvpTileCodingCmd(&cmdBuffer, nullptr, &tileCodingParams));
236 
237         return MOS_STATUS_SUCCESS;
238     }
239 }
240