| /* |
| * Copyright (c) 2019-2021, Intel Corporation |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included |
| * in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
| * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
| * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
| * OTHER DEALINGS IN THE SOFTWARE. |
| */ |
| //! |
| //! \file decode_av1_picture_packet.cpp |
| //! \brief Defines the interface for av1 decode picture packet |
| //! |
| #include "codechal_utilities.h" |
| #include "decode_av1_picture_packet.h" |
| #include "codechal_debug.h" |
| |
| namespace decode{ |
| Av1DecodePicPkt::~Av1DecodePicPkt() |
| { |
| FreeResources(); |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::FreeResources() |
| { |
| DECODE_FUNC_CALL(); |
| |
| if (m_allocator != nullptr) |
| { |
| m_allocator->Destroy(m_intrabcDecodedOutputFrameBuffer); |
| if (!m_avpInterface->IsBtdlRowstoreCacheEnabled()) |
| { |
| m_allocator->Destroy(m_bitstreamDecoderEncoderLineRowstoreReadWriteBuffer); |
| } |
| m_allocator->Destroy(m_bitstreamDecoderEncoderTileLineRowstoreReadWriteBuffer); |
| if (!m_avpInterface->IsIpdlRowstoreCacheEnabled()) |
| { |
| m_allocator->Destroy(m_intraPredictionLineRowstoreReadWriteBuffer); |
| } |
| m_allocator->Destroy(m_intraPredictionTileLineRowstoreReadWriteBuffer); |
| if (!m_avpInterface->IsSmvlRowstoreCacheEnabled()) |
| { |
| m_allocator->Destroy(m_spatialMotionVectorLineReadWriteBuffer); |
| } |
| m_allocator->Destroy(m_spatialMotionVectorCodingTileLineReadWriteBuffer); |
| m_allocator->Destroy(m_loopRestorationMetaTileColumnReadWriteBuffer); |
| m_allocator->Destroy(m_loopRestorationFilterTileReadWriteLineYBuffer); |
| m_allocator->Destroy(m_loopRestorationFilterTileReadWriteLineUBuffer); |
| m_allocator->Destroy(m_loopRestorationFilterTileReadWriteLineVBuffer); |
| if (!m_avpInterface->IsDflyRowstoreCacheEnabled()) |
| { |
| m_allocator->Destroy(m_deblockerFilterLineReadWriteYBuffer); |
| } |
| if (!m_avpInterface->IsDfluRowstoreCacheEnabled()) |
| { |
| m_allocator->Destroy(m_deblockerFilterLineReadWriteUBuffer); |
| } |
| if (!m_avpInterface->IsDflvRowstoreCacheEnabled()) |
| { |
| m_allocator->Destroy(m_deblockerFilterLineReadWriteVBuffer); |
| } |
| m_allocator->Destroy(m_deblockerFilterTileLineReadWriteYBuffer); |
| m_allocator->Destroy(m_deblockerFilterTileLineReadWriteVBuffer); |
| m_allocator->Destroy(m_deblockerFilterTileLineReadWriteUBuffer); |
| m_allocator->Destroy(m_deblockerFilterTileColumnReadWriteYBuffer); |
| m_allocator->Destroy(m_deblockerFilterTileColumnReadWriteUBuffer); |
| m_allocator->Destroy(m_deblockerFilterTileColumnReadWriteVBuffer); |
| if (!m_avpInterface->IsCdefRowstoreCacheEnabled()) |
| { |
| m_allocator->Destroy(m_cdefFilterLineReadWriteBuffer); |
| } |
| m_allocator->Destroy(m_cdefFilterTileLineReadWriteBuffer); |
| m_allocator->Destroy(m_cdefFilterTileColumnReadWriteBuffer); |
| m_allocator->Destroy(m_cdefFilterMetaTileLineReadWriteBuffer); |
| m_allocator->Destroy(m_cdefFilterMetaTileColumnReadWriteBuffer); |
| m_allocator->Destroy(m_cdefFilterTopLeftCornerReadWriteBuffer); |
| m_allocator->Destroy(m_superResTileColumnReadWriteYBuffer); |
| m_allocator->Destroy(m_superResTileColumnReadWriteUBuffer); |
| m_allocator->Destroy(m_superResTileColumnReadWriteVBuffer); |
| m_allocator->Destroy(m_loopRestorationFilterTileColumnReadWriteYBuffer); |
| m_allocator->Destroy(m_loopRestorationFilterTileColumnReadWriteUBuffer); |
| m_allocator->Destroy(m_loopRestorationFilterTileColumnReadWriteVBuffer); |
| m_allocator->Destroy(m_decodedFrameStatusErrorBuffer); |
| m_allocator->Destroy(m_decodedBlockDataStreamoutBuffer); |
| m_allocator->Destroy(m_curMvBufferForDummyWL); |
| m_allocator->Destroy(m_bwdAdaptCdfBufForDummyWL); |
| } |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::Init() |
| { |
| DECODE_FUNC_CALL(); |
| |
| DECODE_CHK_NULL(m_featureManager); |
| DECODE_CHK_NULL(m_hwInterface); |
| DECODE_CHK_NULL(m_osInterface); |
| DECODE_CHK_NULL(m_miInterface); |
| DECODE_CHK_NULL(m_av1Pipeline); |
| DECODE_CHK_NULL(m_avpInterface); |
| |
| m_av1BasicFeature = dynamic_cast<Av1BasicFeature*>(m_featureManager->GetFeature(FeatureIDs::basicFeature)); |
| DECODE_CHK_NULL(m_av1BasicFeature); |
| |
| m_allocator = m_pipeline ->GetDecodeAllocator(); |
| DECODE_CHK_NULL(m_allocator); |
| |
| DECODE_CHK_STATUS(AllocateFixedResources()); |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::Prepare() |
| { |
| DECODE_FUNC_CALL(); |
| |
| m_av1PicParams = m_av1BasicFeature->m_av1PicParams; |
| |
| if (m_av1PicParams->m_seqInfoFlags.m_fields.m_subsamplingX == 1 && m_av1PicParams->m_seqInfoFlags.m_fields.m_subsamplingY == 1) |
| { |
| chromaSamplingFormat = HCP_CHROMA_FORMAT_YUV420;//Use HCP definitions here, since AVP and HCP will merge together in the future |
| } |
| else if (m_av1PicParams->m_seqInfoFlags.m_fields.m_subsamplingX == 0 && m_av1PicParams->m_seqInfoFlags.m_fields.m_subsamplingY == 0) |
| { |
| chromaSamplingFormat = HCP_CHROMA_FORMAT_YUV444; |
| } |
| else |
| { |
| DECODE_ASSERTMESSAGE("Invalid Chroma sampling format!"); |
| return MOS_STATUS_INVALID_PARAMETER; |
| } |
| |
| #ifdef _MMC_SUPPORTED |
| m_mmcState = m_av1Pipeline->GetMmcState(); |
| DECODE_CHK_NULL(m_mmcState); |
| #endif |
| |
| DECODE_CHK_STATUS(SetRowstoreCachingOffsets()); |
| |
| DECODE_CHK_STATUS(AllocateVariableResources()); |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::SetRowstoreCachingOffsets() |
| { |
| if (m_avpInterface->IsRowStoreCachingSupported() && |
| (m_av1BasicFeature->m_frameWidthAlignedMinBlk != MOS_ALIGN_CEIL(m_prevFrmWidth, av1MinBlockWidth))) |
| { |
| MHW_VDBOX_ROWSTORE_PARAMS rowstoreParams; |
| MOS_ZeroMemory(&rowstoreParams, sizeof(rowstoreParams)); |
| rowstoreParams.dwPicWidth = m_av1BasicFeature->m_frameWidthAlignedMinBlk; |
| rowstoreParams.bMbaff = false; |
| rowstoreParams.Mode = CODECHAL_DECODE_MODE_AV1VLD; |
| rowstoreParams.ucBitDepthMinus8 = m_av1PicParams->m_bitDepthIdx << 1; |
| rowstoreParams.ucChromaFormat = m_av1BasicFeature->m_chromaFormat; |
| DECODE_CHK_STATUS(static_cast<CodechalHwInterfaceG12*>(m_hwInterface)->SetRowstoreCachingOffsets(&rowstoreParams)); |
| } |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::AllocateFixedResources() |
| { |
| DECODE_FUNC_CALL(); |
| |
| if (m_av1BasicFeature->m_usingDummyWl == true) |
| { |
| MhwVdboxAvpBufferSizeParams avpBufSizeParam; |
| MOS_ZeroMemory(&avpBufSizeParam, sizeof(avpBufSizeParam)); |
| |
| avpBufSizeParam.m_bitDepthIdc = 0; |
| avpBufSizeParam.m_picWidth = 1; |
| avpBufSizeParam.m_picHeight = 1; |
| avpBufSizeParam.m_tileWidth = 16; |
| avpBufSizeParam.m_isSb128x128 = false; |
| avpBufSizeParam.m_curFrameTileNum = 1; |
| avpBufSizeParam.m_numTileCol = 1; |
| |
| if (m_avpInterface->GetAv1BufferSize(mvTemporalBuf, |
| &avpBufSizeParam) != MOS_STATUS_SUCCESS) |
| { |
| DECODE_ASSERTMESSAGE( "Failed to get MvTemporalBuffer size."); |
| } |
| m_curMvBufferForDummyWL = |
| m_allocator->AllocateBuffer(avpBufSizeParam.m_bufferSize, "MvBuffer"); |
| DECODE_CHK_NULL(m_curMvBufferForDummyWL); |
| |
| m_bwdAdaptCdfBufForDummyWL = m_allocator->AllocateBuffer(MOS_ALIGN_CEIL(m_av1BasicFeature->m_cdfMaxNumBytes, |
| CODECHAL_PAGE_SIZE), "CdfTableBuffer"); |
| DECODE_CHK_NULL(m_bwdAdaptCdfBufForDummyWL); |
| } |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::AllocateVariableResources() |
| { |
| DECODE_FUNC_CALL(); |
| |
| int32_t mibSizeLog2 = m_av1PicParams->m_seqInfoFlags.m_fields.m_use128x128Superblock ? av1MaxMibSizeLog2 : av1MinMibSizeLog2; |
| int32_t miCols = MOS_ALIGN_CEIL(m_av1PicParams->m_superResUpscaledWidthMinus1 + 1, 8) >> av1MiSizeLog2; |
| int32_t miRows = MOS_ALIGN_CEIL(m_av1PicParams->m_superResUpscaledHeightMinus1 + 1, 8) >> av1MiSizeLog2; |
| miCols = MOS_ALIGN_CEIL(miCols, 1 << mibSizeLog2); |
| miRows = MOS_ALIGN_CEIL(miRows, 1 << mibSizeLog2); |
| |
| m_widthInSb = miCols >> mibSizeLog2; |
| m_heightInSb = miRows >> mibSizeLog2; |
| uint32_t maxTileWidthInSb = MOS_ROUNDUP_DIVIDE(4096, 1 << (mibSizeLog2 + av1MiSizeLog2)); |
| MhwVdboxAvpBufferSizeParams avpBufSizeParam; |
| MOS_ZeroMemory(&avpBufSizeParam, sizeof(avpBufSizeParam)); |
| |
| avpBufSizeParam.m_bitDepthIdc = m_av1BasicFeature->m_av1DepthIndicator; |
| avpBufSizeParam.m_picWidth = m_widthInSb; |
| avpBufSizeParam.m_picHeight = m_heightInSb; |
| avpBufSizeParam.m_tileWidth = maxTileWidthInSb; |
| avpBufSizeParam.m_isSb128x128 = m_av1PicParams->m_seqInfoFlags.m_fields.m_use128x128Superblock ? true : false; |
| avpBufSizeParam.m_curFrameTileNum = m_av1PicParams->m_tileCols * m_av1PicParams->m_tileRows; |
| avpBufSizeParam.m_numTileCol = m_av1PicParams->m_tileCols; |
| |
| // Intrabc Decoded Output Frame Buffer |
| if (m_av1PicParams->m_picInfoFlags.m_fields.m_allowIntrabc) |
| { |
| MOS_SURFACE m_destSurface = m_av1BasicFeature->m_destSurface; |
| if (m_intrabcDecodedOutputFrameBuffer == nullptr) |
| { |
| PMOS_SURFACE surface = nullptr; |
| surface = m_allocator->AllocateSurface( |
| m_destSurface.dwWidth, |
| MOS_ALIGN_CEIL(m_destSurface.dwHeight, 8), |
| "Intrabc Decoded Output Frame Buffer", |
| m_destSurface.Format, |
| m_destSurface.bCompressible, |
| resourceInternalReadWriteNoCache); |
| |
| m_intrabcDecodedOutputFrameBuffer = surface; |
| DECODE_CHK_NULL(m_intrabcDecodedOutputFrameBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_intrabcDecodedOutputFrameBuffer, |
| m_destSurface.dwWidth, |
| MOS_ALIGN_CEIL(m_destSurface.dwHeight, 8))); |
| } |
| } |
| |
| // Bitstream decode line rowstore buffer |
| if (!m_avpInterface->IsBtdlRowstoreCacheEnabled()) |
| { |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| bsdLineBuf, |
| &avpBufSizeParam)); |
| if (m_bitstreamDecoderEncoderLineRowstoreReadWriteBuffer == nullptr) |
| { |
| m_bitstreamDecoderEncoderLineRowstoreReadWriteBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "BitstreamDecodeLineBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_bitstreamDecoderEncoderLineRowstoreReadWriteBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_bitstreamDecoderEncoderLineRowstoreReadWriteBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| } |
| |
| // Bitstream decode tile line buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| bsdTileLineBuf, |
| &avpBufSizeParam)); |
| if (m_bitstreamDecoderEncoderTileLineRowstoreReadWriteBuffer == nullptr) |
| { |
| m_bitstreamDecoderEncoderTileLineRowstoreReadWriteBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "BitstreamDecodeTileLineBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_bitstreamDecoderEncoderTileLineRowstoreReadWriteBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_bitstreamDecoderEncoderTileLineRowstoreReadWriteBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // Intra Prediction Line Rowstore Read/Write Buffer |
| if (!m_avpInterface->IsIpdlRowstoreCacheEnabled()) |
| { |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| intraPredLine, |
| &avpBufSizeParam)); |
| if (m_intraPredictionLineRowstoreReadWriteBuffer == nullptr) |
| { |
| m_intraPredictionLineRowstoreReadWriteBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "intraPredictionLineRowstoreBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_intraPredictionLineRowstoreReadWriteBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_intraPredictionLineRowstoreReadWriteBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| } |
| |
| // Intra Prediction Tile Line Rowstore Read/Write Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| intraPredTileLine, |
| &avpBufSizeParam)); |
| if (m_intraPredictionTileLineRowstoreReadWriteBuffer == nullptr) |
| { |
| m_intraPredictionTileLineRowstoreReadWriteBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "intraPredictionTileLineRowstoreBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_intraPredictionTileLineRowstoreReadWriteBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_intraPredictionTileLineRowstoreReadWriteBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // Spatial motion vector Line rowstore buffer |
| if (!m_avpInterface->IsSmvlRowstoreCacheEnabled()) |
| { |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| spatialMvLineBuf, |
| &avpBufSizeParam)); |
| if (m_spatialMotionVectorLineReadWriteBuffer == nullptr) |
| { |
| m_spatialMotionVectorLineReadWriteBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "SpatialMotionVectorLineRowstoreBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_spatialMotionVectorLineReadWriteBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_spatialMotionVectorLineReadWriteBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| } |
| |
| // Spatial motion vector Tile Line Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| spatialMvTileLineBuf, |
| &avpBufSizeParam)); |
| |
| if (m_spatialMotionVectorCodingTileLineReadWriteBuffer == nullptr) |
| { |
| m_spatialMotionVectorCodingTileLineReadWriteBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "SpatialMotionVectorTileLineBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_spatialMotionVectorCodingTileLineReadWriteBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_spatialMotionVectorCodingTileLineReadWriteBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // Loop Restoration Meta Tile Column Read/Write Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| lrMetaTileCol, |
| &avpBufSizeParam)); |
| if (m_loopRestorationMetaTileColumnReadWriteBuffer == nullptr) |
| { |
| m_loopRestorationMetaTileColumnReadWriteBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "LoopRestorationMetaTileColumnReadWriteBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_loopRestorationMetaTileColumnReadWriteBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_loopRestorationMetaTileColumnReadWriteBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // Loop Restoration Filter Tile Read/Write Line Y Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| lrTileLineY, |
| &avpBufSizeParam)); |
| if (m_loopRestorationFilterTileReadWriteLineYBuffer == nullptr) |
| { |
| m_loopRestorationFilterTileReadWriteLineYBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "LoopRestorationFilterTileReadWriteLineYBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_loopRestorationFilterTileReadWriteLineYBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_loopRestorationFilterTileReadWriteLineYBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| //Loop Restoration Filter Tile Read/Write Line U Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| lrTileLineU, |
| &avpBufSizeParam)); |
| if (m_loopRestorationFilterTileReadWriteLineUBuffer == nullptr) |
| { |
| m_loopRestorationFilterTileReadWriteLineUBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "LoopRestorationFilterTileReadWriteLineUBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_loopRestorationFilterTileReadWriteLineUBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_loopRestorationFilterTileReadWriteLineUBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // Loop Restoration Filter Tile Read/Write Line V Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| lrTileLineV, |
| &avpBufSizeParam)); |
| if (m_loopRestorationFilterTileReadWriteLineVBuffer == nullptr) |
| { |
| m_loopRestorationFilterTileReadWriteLineVBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "LoopRestorationFilterTileReadWriteLineVBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_loopRestorationFilterTileReadWriteLineVBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_loopRestorationFilterTileReadWriteLineVBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| if (!m_avpInterface->IsDflyRowstoreCacheEnabled()) |
| { |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| deblockLineYBuf, |
| &avpBufSizeParam)); |
| |
| if (m_deblockerFilterLineReadWriteYBuffer == nullptr) |
| { |
| m_deblockerFilterLineReadWriteYBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "DeblockerFilterLineReadWriteYBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_deblockerFilterLineReadWriteYBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_deblockerFilterLineReadWriteYBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| } |
| |
| if (!m_avpInterface->IsDfluRowstoreCacheEnabled()) |
| { |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| deblockLineUBuf, |
| &avpBufSizeParam)); |
| if (m_deblockerFilterLineReadWriteUBuffer == nullptr) |
| { |
| m_deblockerFilterLineReadWriteUBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "DeblockerFilterLineReadWriteUBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_deblockerFilterLineReadWriteUBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_deblockerFilterLineReadWriteUBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| } |
| |
| if (!m_avpInterface->IsDflvRowstoreCacheEnabled()) |
| { |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| deblockLineVBuf, |
| &avpBufSizeParam)); |
| if (m_deblockerFilterLineReadWriteVBuffer == nullptr) |
| { |
| m_deblockerFilterLineReadWriteVBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "DeblockerFilterLineReadWriteVBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_deblockerFilterLineReadWriteVBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_deblockerFilterLineReadWriteVBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| } |
| |
| // Deblocking Filter Tile Line Y Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| deblockTileLineYBuf, |
| &avpBufSizeParam)); |
| |
| if (m_deblockerFilterTileLineReadWriteYBuffer == nullptr) |
| { |
| m_deblockerFilterTileLineReadWriteYBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "DeblockerFilterTileLineReadWriteYBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_deblockerFilterTileLineReadWriteYBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_deblockerFilterTileLineReadWriteYBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // Deblocking Filter Tile Line V Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| deblockTileLineVBuf, |
| &avpBufSizeParam)); |
| |
| if (m_deblockerFilterTileLineReadWriteVBuffer == nullptr) |
| { |
| m_deblockerFilterTileLineReadWriteVBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "DeblockerFilterTileLineReadWriteVBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_deblockerFilterTileLineReadWriteVBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_deblockerFilterTileLineReadWriteVBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // Deblocking Filter Tile Line U Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| deblockTileLineUBuf, |
| &avpBufSizeParam)); |
| |
| if (m_deblockerFilterTileLineReadWriteUBuffer == nullptr) |
| { |
| m_deblockerFilterTileLineReadWriteUBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "DeblockerFilterTileLineReadWriteUBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_deblockerFilterTileLineReadWriteUBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_deblockerFilterTileLineReadWriteUBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // Deblocking Filter Tile Column Y Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| deblockTileColYBuf, |
| &avpBufSizeParam)); |
| |
| if (m_deblockerFilterTileColumnReadWriteYBuffer == nullptr) |
| { |
| m_deblockerFilterTileColumnReadWriteYBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "DeblockerFilterTileColumnReadWriteYBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_deblockerFilterTileColumnReadWriteYBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_deblockerFilterTileColumnReadWriteYBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // Deblocking Filter Tile Column U Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| deblockTileColUBuf, |
| &avpBufSizeParam)); |
| |
| if (m_deblockerFilterTileColumnReadWriteUBuffer == nullptr) |
| { |
| m_deblockerFilterTileColumnReadWriteUBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "DeblockerFilterTileColumnReadWriteUBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_deblockerFilterTileColumnReadWriteUBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_deblockerFilterTileColumnReadWriteUBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // Deblocking Filter Tile Column V Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| deblockTileColVBuf, |
| &avpBufSizeParam)); |
| |
| if (m_deblockerFilterTileColumnReadWriteVBuffer == nullptr) |
| { |
| m_deblockerFilterTileColumnReadWriteVBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "DeblockerFilterTileColumnReadWriteVBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_deblockerFilterTileColumnReadWriteVBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_deblockerFilterTileColumnReadWriteVBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // CDEF Filter Line Read/Write Buffer |
| if (!m_avpInterface->IsCdefRowstoreCacheEnabled()) |
| { |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| cdefLineBuf, |
| &avpBufSizeParam)); |
| if (m_cdefFilterLineReadWriteBuffer == nullptr) |
| { |
| m_cdefFilterLineReadWriteBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "CdefFilterLineReadWriteBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_cdefFilterLineReadWriteBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_cdefFilterLineReadWriteBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| } |
| |
| // CDEF Filter Tile Line Read/Write Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| cdefTileLineBuf, |
| &avpBufSizeParam)); |
| if (m_cdefFilterTileLineReadWriteBuffer == nullptr) |
| { |
| m_cdefFilterTileLineReadWriteBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "CdefFilterTileLineReadWriteBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_cdefFilterTileLineReadWriteBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_cdefFilterTileLineReadWriteBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // CDEF Filter Tile Column Read/Write Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| cdefTileColBuf, |
| &avpBufSizeParam)); |
| if (m_cdefFilterTileColumnReadWriteBuffer == nullptr) |
| { |
| m_cdefFilterTileColumnReadWriteBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "CdefFilterTileColumnReadWriteBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_cdefFilterTileColumnReadWriteBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_cdefFilterTileColumnReadWriteBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // CDEF Filter Meta Tile Line Read Write Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| cdefMetaTileLine, |
| &avpBufSizeParam)); |
| if (m_cdefFilterMetaTileLineReadWriteBuffer == nullptr) |
| { |
| m_cdefFilterMetaTileLineReadWriteBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "CdefFilterMetaTileLineReadWriteBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_cdefFilterMetaTileLineReadWriteBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_cdefFilterMetaTileLineReadWriteBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // CDEF Filter Meta Tile Column Read Write Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| cdefMetaTileCol, |
| &avpBufSizeParam)); |
| if (m_cdefFilterMetaTileColumnReadWriteBuffer == nullptr) |
| { |
| m_cdefFilterMetaTileColumnReadWriteBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "CdefFilterMetaTileColumnReadWriteBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_cdefFilterMetaTileColumnReadWriteBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_cdefFilterMetaTileColumnReadWriteBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // Cdef Filter Top Left Corner Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| cdefTopLeftCornerBuf, |
| &avpBufSizeParam)); |
| |
| if (m_cdefFilterTopLeftCornerReadWriteBuffer == nullptr) |
| { |
| m_cdefFilterTopLeftCornerReadWriteBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "CdefFilterTopLeftCornerReadWriteBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_cdefFilterTopLeftCornerReadWriteBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_cdefFilterTopLeftCornerReadWriteBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // Super-Res Tile Column Y Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| superResTileColYBuf, |
| &avpBufSizeParam)); |
| if (m_superResTileColumnReadWriteYBuffer == nullptr) |
| { |
| m_superResTileColumnReadWriteYBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "SuperResTileColumnReadWriteYBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_superResTileColumnReadWriteYBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_superResTileColumnReadWriteYBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // Super-Res Tile Column U Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| superResTileColUBuf, |
| &avpBufSizeParam)); |
| |
| if (m_superResTileColumnReadWriteUBuffer == nullptr) |
| { |
| m_superResTileColumnReadWriteUBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "SuperResTileColumnReadWriteUBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_superResTileColumnReadWriteUBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_superResTileColumnReadWriteUBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // Super-Res Tile Column V Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| superResTileColVBuf, |
| &avpBufSizeParam)); |
| |
| if (m_superResTileColumnReadWriteVBuffer == nullptr) |
| { |
| m_superResTileColumnReadWriteVBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "SuperResTileColumnReadWriteVBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_superResTileColumnReadWriteVBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_superResTileColumnReadWriteVBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // Loop Restoration Filter Tile Column Y Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| lrTileColYBuf, |
| &avpBufSizeParam)); |
| |
| if (m_loopRestorationFilterTileColumnReadWriteYBuffer == nullptr) |
| { |
| m_loopRestorationFilterTileColumnReadWriteYBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "LoopRestorationFilterTileColumnReadWriteYBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_loopRestorationFilterTileColumnReadWriteYBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_loopRestorationFilterTileColumnReadWriteYBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // Loop Restoration Filter Tile Column U Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| lrTileColUBuf, |
| &avpBufSizeParam)); |
| |
| if (m_loopRestorationFilterTileColumnReadWriteUBuffer == nullptr) |
| { |
| m_loopRestorationFilterTileColumnReadWriteUBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "LoopRestorationFilterTileColumnReadWriteUBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_loopRestorationFilterTileColumnReadWriteUBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_loopRestorationFilterTileColumnReadWriteUBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // Loop Restoration Filter Tile Column V Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| lrTileColVBuf, |
| &avpBufSizeParam)); |
| |
| if (m_loopRestorationFilterTileColumnReadWriteVBuffer == nullptr) |
| { |
| m_loopRestorationFilterTileColumnReadWriteVBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "LoopRestorationFilterTileColumnReadWriteVBuffer", |
| resourceInternalReadWriteCache); |
| DECODE_CHK_NULL(m_loopRestorationFilterTileColumnReadWriteVBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_loopRestorationFilterTileColumnReadWriteVBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // Decoded Frame Status Error Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| frameStatusErrBuf, |
| &avpBufSizeParam)); |
| |
| if (m_decodedFrameStatusErrorBuffer == nullptr) |
| { |
| m_decodedFrameStatusErrorBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "DecodedFrameStatusErrorBuffer", |
| resourceInternalWrite); |
| DECODE_CHK_NULL(m_decodedFrameStatusErrorBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_decodedFrameStatusErrorBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| // Decoded Block Data Streamout Buffer |
| DECODE_CHK_STATUS(m_avpInterface->GetAv1BufferSize( |
| dbdStreamoutBuf, |
| &avpBufSizeParam)); |
| |
| if (m_decodedBlockDataStreamoutBuffer == nullptr) |
| { |
| m_decodedBlockDataStreamoutBuffer = m_allocator->AllocateBuffer( |
| avpBufSizeParam.m_bufferSize, |
| "DecodedBlockDataStreamoutBuffer", |
| resourceInternalReadWriteNoCache); |
| DECODE_CHK_NULL(m_decodedBlockDataStreamoutBuffer); |
| } |
| else |
| { |
| DECODE_CHK_STATUS(m_allocator->Resize( |
| m_decodedBlockDataStreamoutBuffer, |
| avpBufSizeParam.m_bufferSize)); |
| } |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| void Av1DecodePicPkt::SetAvpPipeModeSelectParams(MHW_VDBOX_PIPE_MODE_SELECT_PARAMS_G12& pipeModeSelectParams) |
| { |
| DECODE_FUNC_CALL(); |
| pipeModeSelectParams.bDeblockerStreamOutEnable = false; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::SetAvpDstSurfaceParams(MHW_VDBOX_SURFACE_PARAMS& dstSurfaceParams) |
| { |
| DECODE_FUNC_CALL(); |
| |
| MOS_ZeroMemory(&dstSurfaceParams, sizeof(dstSurfaceParams)); |
| dstSurfaceParams.Mode = CODECHAL_DECODE_MODE_AV1VLD; |
| dstSurfaceParams.psSurface = &m_av1BasicFeature->m_destSurface; |
| dstSurfaceParams.ucSurfaceStateId = reconPic; |
| dstSurfaceParams.ChromaType = (uint8_t)chromaSamplingFormat; |
| dstSurfaceParams.ucBitDepthLumaMinus8 = m_av1PicParams->m_bitDepthIdx << 1; |
| dstSurfaceParams.ucBitDepthChromaMinus8 = m_av1PicParams->m_bitDepthIdx << 1; |
| dstSurfaceParams.dwUVPlaneAlignment = 8; |
| |
| #ifdef _MMC_SUPPORTED |
| DECODE_CHK_STATUS(m_mmcState->SetSurfaceMmcState(&(m_av1BasicFeature->m_destSurface))); |
| DECODE_CHK_STATUS(m_mmcState->GetSurfaceMmcState(dstSurfaceParams.psSurface, &dstSurfaceParams.mmcState)); |
| DECODE_CHK_STATUS(m_mmcState->GetSurfaceMmcFormat(dstSurfaceParams.psSurface, &dstSurfaceParams.dwCompressionFormat)); |
| #endif |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::SetAvpRefSurfaceParams(MHW_VDBOX_SURFACE_PARAMS *refSurfaceParams) |
| { |
| DECODE_FUNC_CALL(); |
| |
| if (m_av1PicParams->m_picInfoFlags.m_fields.m_frameType != keyFrame && m_av1PicParams->m_picInfoFlags.m_fields.m_frameType != intraOnlyFrame) |
| { |
| Av1SurfaceId surfaceId[av1TotalRefsPerFrame] = { |
| av1IntraFrame, |
| av1LastRef, |
| av1Last2Ref, |
| av1Last3Ref, |
| av1GoldRef, |
| av1BwdRef, |
| av1AltRef2, |
| av1AltRef }; |
| |
| //set for intra frame |
| refSurface[0] = m_av1BasicFeature->m_destSurface; |
| |
| Av1ReferenceFrames &refFrames = m_av1BasicFeature->m_refFrames; |
| const std::vector<uint8_t> &activeRefList = refFrames.GetActiveReferenceList(*m_av1PicParams, m_av1BasicFeature->m_av1TileParams[m_av1BasicFeature->m_tileCoding.m_curTile]); |
| for (uint8_t i = 0; i < activeRefList.size(); i++) |
| { |
| PMOS_RESOURCE refResource[av1NumInterRefFrames]; |
| uint8_t frameIdx = activeRefList[i]; |
| refSurface[i + 1].OsResource = *refFrames.GetReferenceByFrameIndex(frameIdx); |
| } |
| |
| for (auto i = 0; i < av1TotalRefsPerFrame; i++) |
| { |
| DECODE_CHK_STATUS(m_allocator->GetSurfaceInfo(&refSurface[i])); |
| refSurfaceParams[i].Mode = CODECHAL_DECODE_MODE_AV1VLD; |
| refSurfaceParams[i].ChromaType = (uint8_t)chromaSamplingFormat; |
| refSurfaceParams[i].ucBitDepthLumaMinus8 = m_av1PicParams->m_bitDepthIdx << 1; |
| refSurfaceParams[i].ucBitDepthChromaMinus8 = m_av1PicParams->m_bitDepthIdx << 1; |
| refSurfaceParams[i].dwUVPlaneAlignment = 8; |
| refSurfaceParams[i].psSurface = &refSurface[i]; |
| refSurfaceParams[i].ucSurfaceStateId = surfaceId[i]; |
| #ifdef _MMC_SUPPORTED |
| DECODE_CHK_STATUS(m_mmcState->GetSurfaceMmcState(refSurfaceParams[i].psSurface, &refSurfaceParams[i].mmcState)); |
| DECODE_CHK_STATUS(m_mmcState->GetSurfaceMmcFormat(refSurfaceParams[i].psSurface, &refSurfaceParams[i].dwCompressionFormat)); |
| #endif |
| } |
| } |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::SetAvpIntraBCSurfaceParams(MHW_VDBOX_SURFACE_PARAMS &intraBCSurfaceParams) |
| { |
| DECODE_FUNC_CALL(); |
| |
| MOS_ZeroMemory(&intraBCSurfaceParams, sizeof(intraBCSurfaceParams)); |
| DECODE_CHK_STATUS(m_allocator->GetSurfaceInfo(m_intrabcDecodedOutputFrameBuffer)); |
| intraBCSurfaceParams.Mode = CODECHAL_DECODE_MODE_AV1VLD; |
| intraBCSurfaceParams.psSurface = m_intrabcDecodedOutputFrameBuffer; |
| intraBCSurfaceParams.ucSurfaceStateId = intrabcDecodedFrame; |
| intraBCSurfaceParams.ChromaType = (uint8_t)chromaSamplingFormat; |
| intraBCSurfaceParams.ucBitDepthLumaMinus8 = m_av1PicParams->m_bitDepthIdx << 1; |
| intraBCSurfaceParams.ucBitDepthChromaMinus8 = m_av1PicParams->m_bitDepthIdx << 1; |
| intraBCSurfaceParams.dwUVPlaneAlignment = 8; |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::AddAvpSurfacesCmd(MOS_COMMAND_BUFFER &cmdBuffer) |
| { |
| DECODE_FUNC_CALL(); |
| |
| MHW_VDBOX_SURFACE_PARAMS dstSurfaceParams; |
| DECODE_CHK_STATUS(SetAvpDstSurfaceParams(dstSurfaceParams)); |
| DECODE_CHK_STATUS(m_avpInterface->AddAvpSurfaceCmd(&cmdBuffer, &dstSurfaceParams)); |
| |
| if (!AV1_KEY_OR_INRA_FRAME(m_av1PicParams->m_picInfoFlags.m_fields.m_frameType)) |
| { |
| MHW_VDBOX_SURFACE_PARAMS refSurfaceParams[av1TotalRefsPerFrame]; |
| for (uint16_t i = 0; i < av1TotalRefsPerFrame; i++) |
| { |
| MOS_ZeroMemory(&refSurfaceParams[i], sizeof(MHW_VDBOX_SURFACE_PARAMS)); |
| } |
| DECODE_CHK_STATUS(SetAvpRefSurfaceParams(refSurfaceParams)); |
| for (uint8_t i = 0; i < av1TotalRefsPerFrame; i++) |
| { |
| DECODE_CHK_STATUS(m_avpInterface->AddAvpSurfaceCmd(&cmdBuffer, &refSurfaceParams[i])); |
| } |
| } |
| |
| if (m_av1PicParams->m_picInfoFlags.m_fields.m_allowIntrabc) |
| { |
| MHW_VDBOX_SURFACE_PARAMS intraBCSurfaceParams; |
| DECODE_CHK_STATUS(SetAvpIntraBCSurfaceParams(intraBCSurfaceParams)); |
| DECODE_CHK_STATUS(m_avpInterface->AddAvpSurfaceCmd(&cmdBuffer, &intraBCSurfaceParams)); |
| } |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::AddAvpSegmentStateCmd(MOS_COMMAND_BUFFER &cmdBuffer) |
| { |
| DECODE_FUNC_CALL(); |
| |
| MhwVdboxAvpSegmentStateParams segStateParams; |
| MOS_ZeroMemory(&segStateParams, sizeof(segStateParams)); |
| DECODE_CHK_STATUS(SetAvpSegmentStateParams(segStateParams)); |
| |
| for (uint8_t i = 0; i < av1MaxSegments; i++) |
| { |
| segStateParams.m_currentSegmentId = i; |
| DECODE_CHK_STATUS(m_avpInterface->AddAvpSegmentStateCmd( |
| &cmdBuffer, |
| &segStateParams)); |
| |
| if (m_av1PicParams->m_av1SegData.m_enabled == 0) |
| { |
| break; |
| } |
| } |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::SetAvpSegmentStateParams(MhwVdboxAvpSegmentStateParams& segStateParams) |
| { |
| DECODE_FUNC_CALL(); |
| |
| segStateParams.m_av1SegmentParams = m_av1BasicFeature->m_segmentParams; |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::SetAvpPipeBufAddrParams(MhwVdboxAvpPipeBufAddrParams& pipeBufAddrParams) |
| { |
| DECODE_FUNC_CALL(); |
| |
| pipeBufAddrParams.m_mode = CODECHAL_DECODE_MODE_AV1VLD; |
| |
| if (m_av1PicParams->m_picInfoFlags.m_fields.m_allowIntrabc) |
| { |
| pipeBufAddrParams.m_intrabcDecodedOutputFrameBuffer = &m_intrabcDecodedOutputFrameBuffer->OsResource; |
| } |
| |
| pipeBufAddrParams.m_decodedPic = &(m_av1BasicFeature->m_destSurface); |
| pipeBufAddrParams.m_bitstreamDecoderEncoderLineRowstoreReadWriteBuffer = &m_bitstreamDecoderEncoderLineRowstoreReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_bitstreamDecoderEncoderTileLineRowstoreReadWriteBuffer = &m_bitstreamDecoderEncoderTileLineRowstoreReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_intraPredictionLineRowstoreReadWriteBuffer = &m_intraPredictionLineRowstoreReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_intraPredictionTileLineRowstoreReadWriteBuffer = &m_intraPredictionTileLineRowstoreReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_spatialMotionVectorLineReadWriteBuffer = &m_spatialMotionVectorLineReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_spatialMotionVectorCodingTileLineReadWriteBuffer = &m_spatialMotionVectorCodingTileLineReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_loopRestorationMetaTileColumnReadWriteBuffer = &m_loopRestorationMetaTileColumnReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_loopRestorationFilterTileReadWriteLineYBuffer = &m_loopRestorationFilterTileReadWriteLineYBuffer->OsResource; |
| pipeBufAddrParams.m_loopRestorationFilterTileReadWriteLineUBuffer = &m_loopRestorationFilterTileReadWriteLineUBuffer->OsResource; |
| pipeBufAddrParams.m_loopRestorationFilterTileReadWriteLineVBuffer = &m_loopRestorationFilterTileReadWriteLineVBuffer->OsResource; |
| pipeBufAddrParams.m_deblockerFilterLineReadWriteYBuffer = &m_deblockerFilterLineReadWriteYBuffer->OsResource; |
| pipeBufAddrParams.m_deblockerFilterLineReadWriteUBuffer = &m_deblockerFilterLineReadWriteUBuffer->OsResource; |
| pipeBufAddrParams.m_deblockerFilterLineReadWriteVBuffer = &m_deblockerFilterLineReadWriteVBuffer->OsResource; |
| pipeBufAddrParams.m_deblockerFilterTileLineReadWriteYBuffer = &m_deblockerFilterTileLineReadWriteYBuffer->OsResource; |
| pipeBufAddrParams.m_deblockerFilterTileLineReadWriteVBuffer = &m_deblockerFilterTileLineReadWriteVBuffer->OsResource; |
| pipeBufAddrParams.m_deblockerFilterTileLineReadWriteUBuffer = &m_deblockerFilterTileLineReadWriteUBuffer->OsResource; |
| pipeBufAddrParams.m_deblockerFilterTileColumnReadWriteYBuffer = &m_deblockerFilterTileColumnReadWriteYBuffer->OsResource; |
| pipeBufAddrParams.m_deblockerFilterTileColumnReadWriteUBuffer = &m_deblockerFilterTileColumnReadWriteUBuffer->OsResource; |
| pipeBufAddrParams.m_deblockerFilterTileColumnReadWriteVBuffer = &m_deblockerFilterTileColumnReadWriteVBuffer->OsResource; |
| pipeBufAddrParams.m_cdefFilterLineReadWriteBuffer = &m_cdefFilterLineReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_cdefFilterTileLineReadWriteBuffer = &m_cdefFilterTileLineReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_cdefFilterTileColumnReadWriteBuffer = &m_cdefFilterTileColumnReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_cdefFilterMetaTileLineReadWriteBuffer = &m_cdefFilterMetaTileLineReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_cdefFilterMetaTileColumnReadWriteBuffer = &m_cdefFilterMetaTileColumnReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_cdefFilterTopLeftCornerReadWriteBuffer = &m_cdefFilterTopLeftCornerReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_superResTileColumnReadWriteYBuffer = &m_superResTileColumnReadWriteYBuffer->OsResource; |
| pipeBufAddrParams.m_superResTileColumnReadWriteUBuffer = &m_superResTileColumnReadWriteUBuffer->OsResource; |
| pipeBufAddrParams.m_superResTileColumnReadWriteVBuffer = &m_superResTileColumnReadWriteVBuffer->OsResource; |
| pipeBufAddrParams.m_loopRestorationFilterTileColumnReadWriteYBuffer = &m_loopRestorationFilterTileColumnReadWriteYBuffer->OsResource; |
| pipeBufAddrParams.m_loopRestorationFilterTileColumnReadWriteUBuffer = &m_loopRestorationFilterTileColumnReadWriteUBuffer->OsResource; |
| pipeBufAddrParams.m_loopRestorationFilterTileColumnReadWriteVBuffer = &m_loopRestorationFilterTileColumnReadWriteVBuffer->OsResource; |
| pipeBufAddrParams.m_decodedFrameStatusErrorBuffer = &m_decodedFrameStatusErrorBuffer->OsResource; |
| pipeBufAddrParams.m_decodedBlockDataStreamoutBuffer = &m_decodedBlockDataStreamoutBuffer->OsResource; |
| |
| auto tempBuffers = &(m_av1BasicFeature->m_tempBuffers); |
| PMOS_BUFFER curMvBuffer = tempBuffers->GetCurBuffer()->mvBuf; |
| DECODE_CHK_NULL(curMvBuffer); |
| pipeBufAddrParams.m_curMvTemporalBuffer = &(curMvBuffer->OsResource); |
| |
| Av1ReferenceFrames &refFrames = m_av1BasicFeature->m_refFrames; |
| uint8_t prevFrameIdx = refFrames.GetPrimaryRefIdx(); |
| |
| if (m_av1PicParams->m_picInfoFlags.m_fields.m_frameType != keyFrame) |
| { |
| const std::vector<uint8_t> &activeRefList = refFrames.GetActiveReferenceList(*m_av1PicParams, m_av1BasicFeature->m_av1TileParams[m_av1BasicFeature->m_tileCoding.m_curTile]); |
| |
| //set for INTRA_FRAME |
| pipeBufAddrParams.m_references[0] = &m_av1BasicFeature->m_destSurface.OsResource; |
| pipeBufAddrParams.m_colMvTemporalBuffer[0] = &(curMvBuffer->OsResource); |
| |
| for (uint8_t i = 0; i < activeRefList.size(); i++) |
| { |
| uint8_t frameIdx = activeRefList[i]; |
| pipeBufAddrParams.m_references[i + lastFrame] = refFrames.GetReferenceByFrameIndex(frameIdx); |
| auto tempBuf = tempBuffers->GetBufferByFrameIndex(frameIdx); |
| pipeBufAddrParams.m_colMvTemporalBuffer[i + lastFrame] = tempBuf ? &(tempBuf->mvBuf->OsResource) : nullptr; |
| } |
| } |
| |
| DECODE_CHK_STATUS(FixAvpPipeBufAddrParams(pipeBufAddrParams)); |
| |
| DECODE_CHK_NULL(tempBuffers->GetCurBuffer()->initCdfBuf); |
| PMOS_BUFFER curInitCdfBuffer = tempBuffers->GetCurBuffer()->initCdfBuf->buffer; |
| DECODE_CHK_NULL(curInitCdfBuffer); |
| pipeBufAddrParams.m_cdfTableInitializationBuffer = &(curInitCdfBuffer->OsResource); |
| |
| if (!m_av1PicParams->m_picInfoFlags.m_fields.m_disableFrameEndUpdateCdf) |
| { |
| PMOS_BUFFER curBwdCdfBuffer = tempBuffers->GetCurBuffer()->bwdAdaptCdfBuf.buffer; |
| DECODE_CHK_NULL(curBwdCdfBuffer); |
| pipeBufAddrParams.m_cdfTableBwdAdaptationBuffer = &(curBwdCdfBuffer->OsResource); |
| } |
| |
| if (m_av1PicParams->m_av1SegData.m_enabled && m_av1PicParams->m_av1SegData.m_updateMap) |
| { |
| PMOS_BUFFER curSegIDWriteBuffer = tempBuffers->GetCurBuffer()->segIdWriteBuf.buffer; |
| DECODE_CHK_NULL(curSegIDWriteBuffer); |
| pipeBufAddrParams.m_segmentIdWriteBuffer = &(curSegIDWriteBuffer->OsResource); |
| } |
| |
| if (m_av1PicParams->m_av1SegData.m_enabled) |
| { |
| bool useSegMapFromPrevFrame = m_av1PicParams->m_av1SegData.m_temporalUpdate || |
| !m_av1PicParams->m_av1SegData.m_updateMap; |
| if (useSegMapFromPrevFrame && refFrames.CheckSegForPrimFrame(*m_av1PicParams)) |
| { |
| auto tempBuf = tempBuffers->GetBufferByFrameIndex(prevFrameIdx); |
| auto segIdBuf = tempBuf ? tempBuf->segIdBuf : nullptr; |
| auto buf = segIdBuf ? segIdBuf->buffer : nullptr; |
| pipeBufAddrParams.m_segmentIdReadBuffer = buf ? &(buf->OsResource) : nullptr; |
| } |
| } |
| |
| CODECHAL_DEBUG_TOOL(DumpResources(pipeBufAddrParams)); |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::FixAvpPipeBufAddrParams(MhwVdboxAvpPipeBufAddrParams& pipeBufAddrParams) |
| { |
| DECODE_FUNC_CALL(); |
| |
| if (m_av1PicParams->m_picInfoFlags.m_fields.m_frameType == keyFrame) |
| { |
| for (auto i = 0; i < av1TotalRefsPerFrame; i++) |
| { |
| pipeBufAddrParams.m_references[i] = nullptr; |
| } |
| } |
| else |
| { |
| PMOS_RESOURCE validRefPic = m_av1BasicFeature->m_refFrames.GetValidReference(); |
| if (validRefPic == nullptr) |
| { |
| validRefPic = &m_av1BasicFeature->m_destSurface.OsResource; |
| } |
| for (uint8_t i = 0; i < av1TotalRefsPerFrame; i++) |
| { |
| // error concealment for the unset reference addresses and unset mv buffers |
| if (pipeBufAddrParams.m_references[i] == nullptr) |
| { |
| pipeBufAddrParams.m_references[i] = validRefPic; |
| } |
| } |
| |
| PMOS_BUFFER validMvBuf = m_av1BasicFeature->m_tempBuffers.GetValidBufferForReference( |
| m_av1BasicFeature->m_refFrameIndexList)->mvBuf; |
| for (uint32_t i = 0; i < CODEC_NUM_AV1_TEMP_BUFFERS; i++) |
| { |
| if (pipeBufAddrParams.m_colMvTemporalBuffer[i] == nullptr) |
| { |
| pipeBufAddrParams.m_colMvTemporalBuffer[i] = &validMvBuf->OsResource; |
| } |
| } |
| } |
| |
| PMOS_RESOURCE dummyRef = &(m_av1BasicFeature->m_dummyReference.OsResource); |
| if (m_av1BasicFeature->m_useDummyReference && |
| !m_allocator->ResourceIsNull(dummyRef)) |
| { |
| // set all ref pic addresses to valid addresses for error concealment purpose |
| for (uint32_t i = 0; i < av1TotalRefsPerFrame; i++) |
| { |
| if (pipeBufAddrParams.m_references[i] == nullptr) |
| { |
| pipeBufAddrParams.m_references[i] = dummyRef; |
| } |
| } |
| } |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| void Av1DecodePicPkt::SetAvpIndObjBaseAddrParams(MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS& indObjBaseAddrParams) |
| { |
| DECODE_FUNC_CALL(); |
| |
| MOS_ZeroMemory(&indObjBaseAddrParams, sizeof(indObjBaseAddrParams)); |
| indObjBaseAddrParams.Mode = CODECHAL_DECODE_MODE_AV1VLD; |
| indObjBaseAddrParams.dwDataSize = m_av1BasicFeature->m_dataSize; |
| indObjBaseAddrParams.dwDataOffset = m_av1BasicFeature->m_dataOffset; |
| indObjBaseAddrParams.presDataBuffer = &(m_av1BasicFeature->m_resDataBuffer.OsResource); |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::AddAvpIndObjBaseAddrCmd(MOS_COMMAND_BUFFER &cmdBuffer) |
| { |
| DECODE_FUNC_CALL(); |
| |
| MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS indObjBaseAddrParams; |
| SetAvpIndObjBaseAddrParams(indObjBaseAddrParams); |
| DECODE_CHK_STATUS(m_avpInterface->AddAvpIndObjBaseAddrCmd(&cmdBuffer, &indObjBaseAddrParams)); |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::SetAvpPipeBufAddrParamsForDummyWL(MhwVdboxAvpPipeBufAddrParams& pipeBufAddrParams) |
| { |
| DECODE_FUNC_CALL(); |
| |
| pipeBufAddrParams.m_mode = CODECHAL_DECODE_MODE_AV1VLD; |
| |
| pipeBufAddrParams.m_decodedPic = m_av1BasicFeature->m_destSurfaceForDummyWL; |
| |
| pipeBufAddrParams.m_bitstreamDecoderEncoderLineRowstoreReadWriteBuffer = &m_bitstreamDecoderEncoderLineRowstoreReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_bitstreamDecoderEncoderTileLineRowstoreReadWriteBuffer = &m_bitstreamDecoderEncoderTileLineRowstoreReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_intraPredictionLineRowstoreReadWriteBuffer = &m_intraPredictionLineRowstoreReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_intraPredictionTileLineRowstoreReadWriteBuffer = &m_intraPredictionTileLineRowstoreReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_spatialMotionVectorLineReadWriteBuffer = &m_spatialMotionVectorLineReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_spatialMotionVectorCodingTileLineReadWriteBuffer = &m_spatialMotionVectorCodingTileLineReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_loopRestorationMetaTileColumnReadWriteBuffer = &m_loopRestorationMetaTileColumnReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_loopRestorationFilterTileReadWriteLineYBuffer = &m_loopRestorationFilterTileReadWriteLineYBuffer->OsResource; |
| pipeBufAddrParams.m_loopRestorationFilterTileReadWriteLineUBuffer = &m_loopRestorationFilterTileReadWriteLineUBuffer->OsResource; |
| pipeBufAddrParams.m_loopRestorationFilterTileReadWriteLineVBuffer = &m_loopRestorationFilterTileReadWriteLineVBuffer->OsResource; |
| pipeBufAddrParams.m_deblockerFilterLineReadWriteYBuffer = &m_deblockerFilterLineReadWriteYBuffer->OsResource; |
| pipeBufAddrParams.m_deblockerFilterLineReadWriteUBuffer = &m_deblockerFilterLineReadWriteUBuffer->OsResource; |
| pipeBufAddrParams.m_deblockerFilterLineReadWriteVBuffer = &m_deblockerFilterLineReadWriteVBuffer->OsResource; |
| pipeBufAddrParams.m_deblockerFilterTileLineReadWriteYBuffer = &m_deblockerFilterTileLineReadWriteYBuffer->OsResource; |
| pipeBufAddrParams.m_deblockerFilterTileLineReadWriteVBuffer = &m_deblockerFilterTileLineReadWriteVBuffer->OsResource; |
| pipeBufAddrParams.m_deblockerFilterTileLineReadWriteUBuffer = &m_deblockerFilterTileLineReadWriteUBuffer->OsResource; |
| pipeBufAddrParams.m_deblockerFilterTileColumnReadWriteYBuffer = &m_deblockerFilterTileColumnReadWriteYBuffer->OsResource; |
| pipeBufAddrParams.m_deblockerFilterTileColumnReadWriteUBuffer = &m_deblockerFilterTileColumnReadWriteUBuffer->OsResource; |
| pipeBufAddrParams.m_deblockerFilterTileColumnReadWriteVBuffer = &m_deblockerFilterTileColumnReadWriteVBuffer->OsResource; |
| pipeBufAddrParams.m_cdefFilterLineReadWriteBuffer = &m_cdefFilterLineReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_cdefFilterTileLineReadWriteBuffer = &m_cdefFilterTileLineReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_cdefFilterTileColumnReadWriteBuffer = &m_cdefFilterTileColumnReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_cdefFilterMetaTileLineReadWriteBuffer = &m_cdefFilterMetaTileLineReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_cdefFilterMetaTileColumnReadWriteBuffer = &m_cdefFilterMetaTileColumnReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_cdefFilterTopLeftCornerReadWriteBuffer = &m_cdefFilterTopLeftCornerReadWriteBuffer->OsResource; |
| pipeBufAddrParams.m_superResTileColumnReadWriteYBuffer = &m_superResTileColumnReadWriteYBuffer->OsResource; |
| pipeBufAddrParams.m_superResTileColumnReadWriteUBuffer = &m_superResTileColumnReadWriteUBuffer->OsResource; |
| pipeBufAddrParams.m_superResTileColumnReadWriteVBuffer = &m_superResTileColumnReadWriteVBuffer->OsResource; |
| pipeBufAddrParams.m_loopRestorationFilterTileColumnReadWriteYBuffer = &m_loopRestorationFilterTileColumnReadWriteYBuffer->OsResource; |
| pipeBufAddrParams.m_loopRestorationFilterTileColumnReadWriteUBuffer = &m_loopRestorationFilterTileColumnReadWriteUBuffer->OsResource; |
| pipeBufAddrParams.m_loopRestorationFilterTileColumnReadWriteVBuffer = &m_loopRestorationFilterTileColumnReadWriteVBuffer->OsResource; |
| pipeBufAddrParams.m_decodedFrameStatusErrorBuffer = &m_decodedFrameStatusErrorBuffer->OsResource; |
| pipeBufAddrParams.m_decodedBlockDataStreamoutBuffer = &m_decodedBlockDataStreamoutBuffer->OsResource; |
| |
| pipeBufAddrParams.m_curMvTemporalBuffer = &m_curMvBufferForDummyWL->OsResource; |
| pipeBufAddrParams.m_cdfTableInitializationBuffer = &m_av1BasicFeature->m_defaultCdfBuffers[3]->OsResource; |
| pipeBufAddrParams.m_cdfTableBwdAdaptationBuffer = &m_bwdAdaptCdfBufForDummyWL->OsResource; |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::UpdatePipeBufAddrForDummyWL(MOS_COMMAND_BUFFER &cmdBuffer) |
| { |
| DECODE_FUNC_CALL(); |
| |
| MhwVdboxAvpPipeBufAddrParams pipeBufAddrParams = {}; |
| DECODE_CHK_STATUS(SetAvpPipeBufAddrParamsForDummyWL(pipeBufAddrParams)); |
| #ifdef _MMC_SUPPORTED |
| pipeBufAddrParams.m_preDeblockSurfMmcState = MOS_MEMCOMP_DISABLED; |
| #endif |
| DECODE_CHK_STATUS(m_avpInterface->AddAvpPipeBufAddrCmd(&cmdBuffer, &pipeBufAddrParams)); |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::UpdateIndObjAddrForDummyWL(MOS_COMMAND_BUFFER &cmdBuffer) |
| { |
| DECODE_FUNC_CALL(); |
| |
| if (!m_isBsBufferWritten) |
| { |
| m_resDataBufferForDummyWL= *m_allocator->AllocateBuffer(140, "BsBuffer for inserted Dummy WL"); //140 Bytes |
| auto data = (uint8_t *)m_allocator->LockResouceForWrite(&m_resDataBufferForDummyWL.OsResource); |
| DECODE_CHK_NULL(data); |
| |
| uint32_t bsBuffer[] = |
| { |
| 0x3004260a, 0x1d95985a, 0x8311a32e, 0x4957f9a8, |
| 0x16000832, 0x00000100, 0x00900000, 0x88040000, |
| 0x797797f7, 0x346907ae, 0x00106332, 0x00010000, |
| 0x01c02a07, 0x9a165a76, 0x13041816, 0x92fd0c00, |
| 0x02fc1aad, 0xf94923f3, 0x88ce7a1b, 0xc440d4fb, |
| 0xcf5940bb, 0xe3a4fcff, 0x6c13cd19, 0x8e7b22b1, |
| 0x83f20193, 0x41c12b17, 0x7a266ac8, 0x9b0b871e, |
| 0x956345f8, 0x538c1c25, 0x2302b41f, 0x1e0587a8, |
| 0x182a0ec1, 0x3672822a, 0x5003db7b |
| }; |
| |
| MOS_SecureMemcpy(data, sizeof(bsBuffer), bsBuffer, sizeof(bsBuffer)); |
| m_isBsBufferWritten = true; |
| } |
| MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS indObjBaseAddrParams; |
| |
| MOS_ZeroMemory(&indObjBaseAddrParams, sizeof(indObjBaseAddrParams)); |
| indObjBaseAddrParams.Mode = CODECHAL_DECODE_MODE_AV1VLD; |
| indObjBaseAddrParams.dwDataSize = 140; |
| indObjBaseAddrParams.dwDataOffset = 0; |
| indObjBaseAddrParams.presDataBuffer = &(m_resDataBufferForDummyWL.OsResource); |
| |
| DECODE_CHK_STATUS(m_avpInterface->AddAvpIndObjBaseAddrCmd(&cmdBuffer, &indObjBaseAddrParams)); |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::SetAvpPicStateParams(MhwVdboxAvpPicStateParams& picStateParams) |
| { |
| DECODE_FUNC_CALL(); |
| |
| MOS_ZeroMemory(&picStateParams, sizeof(picStateParams)); |
| picStateParams.m_picParams = m_av1PicParams; |
| picStateParams.m_refList = &(m_av1BasicFeature->m_refFrames.m_refList[0]); |
| |
| DECODE_CHK_STATUS(SetupSkipModeFrames(picStateParams)); |
| DECODE_CHK_STATUS(SetupFrameSignBias(picStateParams)); |
| |
| memset(&m_av1PicParams->m_refFrameSide, 0, sizeof(m_av1PicParams->m_refFrameSide)); |
| if(m_av1PicParams->m_seqInfoFlags.m_fields.m_enableOrderHint && |
| !AV1_KEY_OR_INRA_FRAME(m_av1PicParams->m_picInfoFlags.m_fields.m_frameType)) |
| { |
| for (auto ref = 0; ref < av1NumInterRefFrames; ref++) |
| { |
| picStateParams.m_refOrderHints[ref] = m_av1BasicFeature->m_refFrames.m_currRefList->m_refOrderHint[ref]; |
| |
| if (m_av1BasicFeature->m_refFrames.GetRelativeDist(*m_av1PicParams, picStateParams.m_refOrderHints[ref], m_av1PicParams->m_orderHint) > 0 || |
| picStateParams.m_refOrderHints[ref] == m_av1PicParams->m_orderHint) |
| { |
| m_av1PicParams->m_refFrameSide[ref + lastFrame] = 1; |
| } |
| } |
| } |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::SetAvpInterPredStateParams(MhwVdboxAvpPicStateParams& picStateParams) |
| { |
| DECODE_FUNC_CALL(); |
| |
| MOS_ZeroMemory(&picStateParams, sizeof(picStateParams)); |
| picStateParams.m_picParams = m_av1PicParams; |
| |
| if(!AV1_KEY_OR_INRA_FRAME(m_av1PicParams->m_picInfoFlags.m_fields.m_frameType) && |
| m_av1PicParams->m_seqInfoFlags.m_fields.m_enableOrderHint) |
| { |
| for (auto ref = 0; ref < av1NumInterRefFrames; ref++) |
| { |
| uint8_t refPicIndex = m_av1PicParams->m_refFrameIdx[ref]; |
| if (!CodecHal_PictureIsInvalid(m_av1PicParams->m_refFrameMap[refPicIndex])) |
| { |
| uint8_t refFrameIdx = m_av1PicParams->m_refFrameMap[refPicIndex].FrameIdx; |
| for (auto i = 0; i < 7; i++) |
| { |
| picStateParams.m_savedRefOrderHints[ref][i] = m_av1BasicFeature->m_refFrames.m_refList[refFrameIdx]->m_refOrderHint[i]; |
| } |
| } |
| } |
| |
| DECODE_CHK_STATUS(m_av1BasicFeature->m_refFrames.SetupMotionFieldProjection(*m_av1PicParams)); |
| |
| picStateParams.m_refMaskMfProj = m_av1PicParams->m_activeRefBitMaskMfmv[0] | |
| (m_av1PicParams->m_activeRefBitMaskMfmv[1] << 1) | |
| (m_av1PicParams->m_activeRefBitMaskMfmv[2] << 2) | |
| (m_av1PicParams->m_activeRefBitMaskMfmv[3] << 3) | |
| (m_av1PicParams->m_activeRefBitMaskMfmv[4] << 4) | |
| (m_av1PicParams->m_activeRefBitMaskMfmv[5] << 5) | |
| (m_av1PicParams->m_activeRefBitMaskMfmv[6] << 6); |
| } |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::SetInloopFilterStateParams(MhwVdboxAvpPicStateParams& picStateParams) |
| { |
| DECODE_FUNC_CALL(); |
| |
| MOS_ZeroMemory(&picStateParams, sizeof(picStateParams)); |
| picStateParams.m_picParams = m_av1PicParams; |
| |
| if (m_av1PicParams->m_picInfoFlags.m_fields.m_useSuperres) |
| { |
| //setup super-res step/offset for luma/chroma, per av1_upscale_normative_rows() |
| if (m_av1BasicFeature->m_tileCoding.m_curTile == 0) |
| { |
| m_av1BasicFeature->m_tileCoding.GetUpscaleConvolveStepX0(*m_av1PicParams, false); // Luma |
| m_av1BasicFeature->m_tileCoding.GetUpscaleConvolveStepX0(*m_av1PicParams, true); // Chroma |
| } |
| |
| uint16_t col = m_av1BasicFeature->m_tileCoding.m_tileDesc[m_av1BasicFeature->m_tileCoding.m_curTile].m_tileColumn; |
| picStateParams.m_lumaPlaneXStepQn = m_av1BasicFeature->m_tileCoding.m_lumaXStepQn; |
| picStateParams.m_lumaPlaneX0Qn = m_av1BasicFeature->m_tileCoding.m_lumaX0Qn[col]; |
| picStateParams.m_chromaPlaneXStepQn = m_av1BasicFeature->m_tileCoding.m_chromaXStepQn; |
| picStateParams.m_chromaPlaneX0Qn = m_av1BasicFeature->m_tileCoding.m_chromaX0Qn[col]; |
| } |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::CalculateCommandSize(uint32_t &commandBufferSize, uint32_t &requestedPatchListSize) |
| { |
| DECODE_FUNC_CALL(); |
| |
| commandBufferSize = m_pictureStatesSize; |
| requestedPatchListSize = m_picturePatchListSize; |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::SetupSkipModeFrames(MhwVdboxAvpPicStateParams& picStateParams) |
| { |
| DECODE_FUNC_CALL(); |
| |
| if (!m_av1PicParams->m_seqInfoFlags.m_fields.m_enableOrderHint || |
| AV1_KEY_OR_INRA_FRAME(m_av1PicParams->m_picInfoFlags.m_fields.m_frameType) || |
| m_av1PicParams->m_modeControlFlags.m_fields.m_referenceMode == singleReference) |
| { |
| picStateParams.m_skipModeFrame[0] = -1; |
| picStateParams.m_skipModeFrame[1] = -1; |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| int32_t curFrameOffset = m_av1PicParams->m_orderHint; |
| int32_t refFrameOffset[2] = { -1, 0x7fffffff }; |
| int32_t refIdx[2] = { -1, -1 }; |
| Av1ReferenceFrames &refFrames = m_av1BasicFeature->m_refFrames; |
| DECODE_CHK_STATUS(refFrames.Identify1stNearRef(*m_av1PicParams, curFrameOffset, refFrameOffset, refIdx)); |
| |
| if (refIdx[0] != -1 && refIdx[1] != -1) |
| { |
| // == Bi-directional prediction == |
| //cm->is_skip_mode_allowed = 1; |
| picStateParams.m_skipModeFrame[0] = AOMMIN(refIdx[0], refIdx[1]); |
| picStateParams.m_skipModeFrame[1] = AOMMAX(refIdx[0], refIdx[1]); |
| } |
| else if (refIdx[0] != -1 && refIdx[1] == -1) |
| { |
| DECODE_CHK_STATUS(refFrames.Identify2ndNearRef(*m_av1PicParams, curFrameOffset, refFrameOffset, refIdx)); |
| if (refFrameOffset[1] != -1) |
| { |
| picStateParams.m_skipModeFrame[0] = AOMMIN(refIdx[0], refIdx[1]); |
| picStateParams.m_skipModeFrame[1] = AOMMAX(refIdx[0], refIdx[1]); |
| } |
| } |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS Av1DecodePicPkt::SetupFrameSignBias(MhwVdboxAvpPicStateParams& picStateParams) |
| { |
| DECODE_FUNC_CALL(); |
| |
| for (auto refFrame = (uint32_t)lastFrame; refFrame <= (uint32_t)altRefFrame; refFrame++)//no bias for intra frame |
| { |
| if (m_av1PicParams->m_seqInfoFlags.m_fields.m_enableOrderHint && |
| !AV1_KEY_OR_INRA_FRAME(m_av1PicParams->m_picInfoFlags.m_fields.m_frameType)) |
| { |
| int32_t refFrameOffset = -1; |
| |
| uint8_t refPicIndex = m_av1PicParams->m_refFrameIdx[refFrame - lastFrame];//0 corresponds to LAST_FRAME |
| PCODEC_PICTURE refFrameList = &(m_av1PicParams->m_refFrameMap[0]); |
| |
| if (!CodecHal_PictureIsInvalid(refFrameList[refPicIndex])) |
| { |
| uint8_t refFrameIdx = refFrameList[refPicIndex].FrameIdx; |
| refFrameOffset = m_av1BasicFeature->m_refFrames.m_refList[refFrameIdx]->m_orderHint; |
| } |
| |
| int32_t frameOffset = (int32_t)m_av1PicParams->m_orderHint; |
| picStateParams.m_referenceFrameSignBias[refFrame] = |
| (m_av1BasicFeature->m_refFrames.GetRelativeDist(*m_av1PicParams, refFrameOffset, frameOffset) <= 0) ? 0 : 1; |
| } |
| else |
| { |
| picStateParams.m_referenceFrameSignBias[refFrame] = 0; |
| } |
| } |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| #if USE_CODECHAL_DEBUG_TOOL |
| MOS_STATUS Av1DecodePicPkt::DumpResources(MhwVdboxAvpPipeBufAddrParams& pipeBufAddrParams) |
| { |
| DECODE_FUNC_CALL(); |
| |
| CodechalDebugInterface *debugInterface = m_av1Pipeline->GetDebugInterface(); |
| debugInterface->m_frameType = m_av1PicParams->m_picInfoFlags.m_fields.m_frameType ? P_TYPE : I_TYPE; |
| m_av1PicParams->m_currPic.PicFlags = PICTURE_FRAME; |
| debugInterface->m_currPic = m_av1PicParams->m_currPic; |
| debugInterface->m_bufferDumpFrameNum = m_av1BasicFeature->m_frameNum; |
| //For multi-tiles per frame case, only need dump these resources once. |
| if (m_av1BasicFeature->m_tileCoding.m_curTile == 0) |
| { |
| DECODE_CHK_STATUS(debugInterface->DumpBuffer( |
| pipeBufAddrParams.m_cdfTableInitializationBuffer, |
| CodechalDbgAttr::attrCoefProb, |
| "CdfTableInitialization", |
| m_av1BasicFeature->m_cdfMaxNumBytes, |
| CODECHAL_NUM_MEDIA_STATES)); |
| |
| if (pipeBufAddrParams.m_segmentIdReadBuffer != nullptr && |
| !m_allocator->ResourceIsNull(pipeBufAddrParams.m_segmentIdReadBuffer)) |
| { |
| DECODE_CHK_STATUS(debugInterface->DumpBuffer( |
| pipeBufAddrParams.m_segmentIdReadBuffer, |
| CodechalDbgAttr::attrSegId, |
| "SegIdReadBuffer", |
| (m_widthInSb * m_heightInSb * CODECHAL_CACHELINE_SIZE), |
| CODECHAL_NUM_MEDIA_STATES)); |
| } |
| |
| if (m_av1PicParams->m_picInfoFlags.m_fields.m_frameType != keyFrame) |
| { |
| for (auto n = 1; n < av1TotalRefsPerFrame; n++) |
| { |
| MOS_SURFACE destSurface; |
| MOS_ZeroMemory(&destSurface, sizeof(MOS_SURFACE)); |
| destSurface.OsResource = *(pipeBufAddrParams.m_references[n]); |
| DECODE_CHK_STATUS(m_allocator->GetSurfaceInfo(&destSurface)); |
| std::string refSurfName = "RefSurf[" + std::to_string(static_cast<uint32_t>(n)) + "]"; |
| DECODE_CHK_STATUS(debugInterface->DumpYUVSurface( |
| &destSurface, |
| CodechalDbgAttr::attrReferenceSurfaces, |
| refSurfName.c_str())); |
| } |
| } |
| } |
| |
| //Should dump each tile's bit stream |
| DECODE_CHK_STATUS(debugInterface->DumpBuffer( |
| &m_av1BasicFeature->m_resDataBuffer.OsResource, |
| CodechalDbgAttr::attrBitstream, |
| "DEC", |
| m_av1BasicFeature->m_dataSize, |
| m_av1BasicFeature->m_dataOffset, |
| CODECHAL_NUM_MEDIA_STATES)); |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| #endif |
| |
| } |