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