blob: 90ca78474d84a828782a1f70bdcd6f5d80e2d895 [file] [log] [blame]
/*
* Copyright (c) 2019-2020, 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.h
//! \brief Defines the implementation of av1 decode picture packet
//!
#ifndef __DECODE_AV1_PICTURE_PACKET_H__
#define __DECODE_AV1_PICTURE_PACKET_H__
#include "media_cmd_packet.h"
#include "decode_av1_pipeline.h"
#include "decode_utils.h"
#include "decode_av1_basic_feature.h"
namespace decode
{
class Av1DecodePicPkt : public DecodeSubPacket
{
public:
//!
//! \brief Av1DecodePicPkt constructor
//!
Av1DecodePicPkt(Av1Pipeline *pipeline, CodechalHwInterface *hwInterface)
: DecodeSubPacket(pipeline, hwInterface), m_av1Pipeline(pipeline)
{
if (m_hwInterface != nullptr)
{
m_avpInterface = static_cast<CodechalHwInterfaceG12*>(hwInterface)->GetAvpInterface();
}
}
//!
//! \brief Av1DecodePicPkt deconstructor
//!
virtual ~Av1DecodePicPkt();
//!
//! \brief Initialize the media packet, allocate required resources
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS Init() override;
//!
//! \brief Prepare interal parameters, should be invoked for each frame
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS Prepare() override;
//!
//! \brief Execute av1 picture packet
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS Execute(MOS_COMMAND_BUFFER& cmdBuffer) = 0;
//!
//! \brief Calculate Command Size
//!
//! \param [in, out] commandBufferSize
//! requested size
//! \param [in, out] requestedPatchListSize
//! requested size
//! \return MOS_STATUS
//! status
//!
MOS_STATUS CalculateCommandSize(
uint32_t &commandBufferSize,
uint32_t &requestedPatchListSize) override;
MOS_STATUS UpdatePipeBufAddrForDummyWL(MOS_COMMAND_BUFFER &cmdBuffer);
MOS_STATUS UpdateIndObjAddrForDummyWL(MOS_COMMAND_BUFFER &cmdBuffer);
protected:
virtual MOS_STATUS AllocateFixedResources();
virtual MOS_STATUS AllocateVariableResources();
virtual MOS_STATUS SetAvpDstSurfaceParams(MHW_VDBOX_SURFACE_PARAMS &dstSurfaceParams);
virtual MOS_STATUS SetAvpRefSurfaceParams(MHW_VDBOX_SURFACE_PARAMS *refSurfaceParams);
virtual MOS_STATUS SetAvpIntraBCSurfaceParams(MHW_VDBOX_SURFACE_PARAMS &intraBCSurfaceParams);
virtual MOS_STATUS AddAvpSurfacesCmd(MOS_COMMAND_BUFFER &cmdBuffer);
virtual MOS_STATUS SetAvpSegmentStateParams(MhwVdboxAvpSegmentStateParams& segStateParams);
virtual MOS_STATUS AddAvpSegmentStateCmd(MOS_COMMAND_BUFFER &cmdBuffer);
MOS_STATUS FixAvpPipeBufAddrParams(MhwVdboxAvpPipeBufAddrParams &pipeBufAddrParams);
virtual MOS_STATUS SetAvpPipeBufAddrParams(MhwVdboxAvpPipeBufAddrParams &pipeBufAddrParams);
virtual MOS_STATUS AddAvpPipeBufAddrCmd(MOS_COMMAND_BUFFER &cmdBuffer) = 0;
MOS_STATUS SetAvpPipeBufAddrParamsForDummyWL(MhwVdboxAvpPipeBufAddrParams& pipeBufAddrParams);
virtual MOS_STATUS AddAvpIndObjBaseAddrCmd(MOS_COMMAND_BUFFER &cmdBuffer);
virtual void SetAvpIndObjBaseAddrParams(MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS &indObjBaseAddrParams);
virtual void SetAvpPipeModeSelectParams(MHW_VDBOX_PIPE_MODE_SELECT_PARAMS_G12 &vdboxPipeModeSelectParams);
virtual MOS_STATUS AddAvpPipeModeSelectCmd(MOS_COMMAND_BUFFER &cmdBuffer) = 0;
virtual MOS_STATUS SetAvpPicStateParams(MhwVdboxAvpPicStateParams &picStateParams);
virtual MOS_STATUS SetAvpInterPredStateParams(MhwVdboxAvpPicStateParams &picStateParams);
virtual MOS_STATUS SetInloopFilterStateParams(MhwVdboxAvpPicStateParams &picStateParams);
//! \brief Set Rowstore Cache offset
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetRowstoreCachingOffsets();
//!
//! \brief Free resources
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS FreeResources();
//!
//! \brief Dump resources
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS DumpResources(MhwVdboxAvpPipeBufAddrParams& pipeBufAddrParams);
//Interfaces
Av1Pipeline *m_av1Pipeline = nullptr;
MhwVdboxAvpInterface *m_avpInterface = nullptr;
Av1BasicFeature *m_av1BasicFeature = nullptr;
DecodeAllocator *m_allocator = nullptr;
DecodeMemComp *m_mmcState = nullptr;
CodecAv1PicParams *m_av1PicParams = nullptr; //!< Pointer to picture parameter
MOS_SURFACE refSurface[av1TotalRefsPerFrame];
MOS_BUFFER m_resDataBufferForDummyWL;
//!
//! \brief Setup SkipModeFrame[0] and SkipModeFrame[1] per av1_setup_skip_mode_allowed of ref decoder
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetupSkipModeFrames(MhwVdboxAvpPicStateParams& picStateParams);
//!
//! \brief Setup Frame Sign Bias
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetupFrameSignBias(MhwVdboxAvpPicStateParams& picStateParams);
PMOS_SURFACE m_intrabcDecodedOutputFrameBuffer = nullptr; //!< IntraBC Decoded output frame buffer
//non-temporal buffers
PMOS_BUFFER m_bitstreamDecoderEncoderLineRowstoreReadWriteBuffer = nullptr; //!< Handle of Bitstream Decode Line Rowstore buffer, can be programmed to use Local Media Storage VMM instead of Memory
PMOS_BUFFER m_bitstreamDecoderEncoderTileLineRowstoreReadWriteBuffer = nullptr; //!< Handle of Bitstream Decode Tile Line buffer
PMOS_BUFFER m_intraPredictionLineRowstoreReadWriteBuffer = nullptr; //!< Handle of Intra Prediction Line Rowstore Read/Write Buffer
PMOS_BUFFER m_intraPredictionTileLineRowstoreReadWriteBuffer = nullptr; //!< Handle of Intra Prediction Tile Line Rowstore Read/Write Buffer
PMOS_BUFFER m_spatialMotionVectorLineReadWriteBuffer = nullptr; //!< Handle of Spatial Motion Vector Line rowstore buffer, can be programmed to use Local Media Storage VMM instead of Memory
PMOS_BUFFER m_spatialMotionVectorCodingTileLineReadWriteBuffer = nullptr; //!< Handle of Spatial Motion Vector Tile Line buffer
PMOS_BUFFER m_loopRestorationMetaTileColumnReadWriteBuffer = nullptr; //!< DW80..81, Loop Restoration Meta Tile Column Read/Write Buffer Address
PMOS_BUFFER m_loopRestorationFilterTileReadWriteLineYBuffer = nullptr; //!< DW83..84, Loop Restoration Filter Tile Read/Write Line Y Buffer Address
PMOS_BUFFER m_loopRestorationFilterTileReadWriteLineUBuffer = nullptr; //!< DW86..87, Loop Restoration Filter Tile Read/Write Line U Buffer Address
PMOS_BUFFER m_loopRestorationFilterTileReadWriteLineVBuffer = nullptr; //!< DW89..90, Loop Restoration Filter Tile Read/Write Line V Buffer Address
PMOS_BUFFER m_deblockerFilterLineReadWriteYBuffer = nullptr; //!< DW92..93, Deblocker Filter Line Read/Write Y Buffer Address
PMOS_BUFFER m_deblockerFilterLineReadWriteUBuffer = nullptr; //!< DW95..96, Deblocker Filter Line Read/Write U Buffer Address
PMOS_BUFFER m_deblockerFilterLineReadWriteVBuffer = nullptr; //!< DW98..99, Deblocker Filter Line Read/Write V Buffer Address
PMOS_BUFFER m_deblockerFilterTileLineReadWriteYBuffer = nullptr; //!< DW101..102, Deblocker Filter Tile Line Read/Write Y Buffer Address
PMOS_BUFFER m_deblockerFilterTileLineReadWriteVBuffer = nullptr; //!< DW104..105, Deblocker Filter Tile Line Read/Write V Buffer Address
PMOS_BUFFER m_deblockerFilterTileLineReadWriteUBuffer = nullptr; //!< DW107..108, Deblocker Filter Tile Line Read/Write U Buffer Address
PMOS_BUFFER m_deblockerFilterTileColumnReadWriteYBuffer = nullptr; //!< DW110..111, Deblocker Filter Tile Column Read/Write Y Buffer Address
PMOS_BUFFER m_deblockerFilterTileColumnReadWriteUBuffer = nullptr; //!< DW113..114, Deblocker Filter Tile Column Read/Write U Buffer Address
PMOS_BUFFER m_deblockerFilterTileColumnReadWriteVBuffer = nullptr; //!< DW116..117, Deblocker Filter Tile Column Read/Write V Buffer Address
PMOS_BUFFER m_cdefFilterLineReadWriteBuffer = nullptr; //!< DW119..120, CDEF Filter Line Read/Write Y Buffer Address
PMOS_BUFFER m_cdefFilterTileLineReadWriteBuffer = nullptr; //!< DW128..129, CDEF Filter Tile Line Read/Write Y Buffer Address
PMOS_BUFFER m_cdefFilterTileColumnReadWriteBuffer = nullptr; //!< DW137..138, CDEF Filter Tile Column Read/Write Y Buffer Address
PMOS_BUFFER m_cdefFilterMetaTileLineReadWriteBuffer = nullptr; //!< DW140..141, CDEF Filter Meta Tile Line Read/Write Buffer Address
PMOS_BUFFER m_cdefFilterMetaTileColumnReadWriteBuffer = nullptr; //!< DW143..144, CDEF Filter Meta Tile Column Read/Write Buffer Address
PMOS_BUFFER m_cdefFilterTopLeftCornerReadWriteBuffer = nullptr; //!< DW146..147, CDEF Filter Top-Left Corner Read/Write Buffer Address
PMOS_BUFFER m_superResTileColumnReadWriteYBuffer = nullptr; //!< DW149..150, Super-Res Tile Column Read/Write Y Buffer Address
PMOS_BUFFER m_superResTileColumnReadWriteUBuffer = nullptr; //!< DW152..153, Super-Res Tile Column Read/Write U Buffer Address
PMOS_BUFFER m_superResTileColumnReadWriteVBuffer = nullptr; //!< DW155..156, Super-Res Tile Column Read/Write V Buffer Address
PMOS_BUFFER m_loopRestorationFilterTileColumnReadWriteYBuffer = nullptr; //!< DW158..159, Loop Restoration Filter Tile Column Read/Write Y Buffer Address
PMOS_BUFFER m_loopRestorationFilterTileColumnReadWriteUBuffer = nullptr; //!< DW161..162, Loop Restoration Filter Tile Column Read/Write U Buffer Address
PMOS_BUFFER m_loopRestorationFilterTileColumnReadWriteVBuffer = nullptr; //!< DW164..165, Loop Restoration Filter Tile Column Read/Write V Buffer Address
//streamout buffer
PMOS_BUFFER m_decodedFrameStatusErrorBuffer = nullptr; //!< DW176..177, Decoded Frame Status/Error Buffer Base Address
PMOS_BUFFER m_decodedBlockDataStreamoutBuffer = nullptr; //!< DW179..180, Decoded Block Data Streamout Buffer Address
PMOS_BUFFER m_resMfdDeblockingFilterRowStoreScratchBuffer = nullptr; //!< Handle of MFD Deblocking Filter Row Store Scratch data surface
PMOS_BUFFER m_resDeblockingFilterTileRowStoreScratchBuffer = nullptr; //!< Handle of Deblocking Filter Tile Row Store Scratch data surface
PMOS_BUFFER m_resDeblockingFilterColumnRowStoreScratchBuffer = nullptr; //!< Handle of Deblocking Filter Column Row Store Scratch data surface
PMOS_BUFFER m_resMetadataLineBuffer = nullptr; //!< Handle of Metadata Line data buffer
PMOS_BUFFER m_resMetadataTileLineBuffer = nullptr; //!< Handle of Metadata Tile Line data buffer
PMOS_BUFFER m_resMetadataTileColumnBuffer = nullptr; //!< Handle of Metadata Tile Column data buffer
PMOS_BUFFER m_resSaoLineBuffer = nullptr; //!< Handle of SAO Line data buffer
PMOS_BUFFER m_resSaoTileLineBuffer = nullptr; //!< Handle of SAO Tile Line data buffer
PMOS_BUFFER m_resSaoTileColumnBuffer = nullptr; //!< Handle of SAO Tile Column data buffer
//buffers for dummy workload
PMOS_BUFFER m_curMvBufferForDummyWL = nullptr;
PMOS_BUFFER m_bwdAdaptCdfBufForDummyWL = nullptr;
bool m_isBsBufferWritten = false;
uint32_t m_prevFrmWidth = 0; //!< Frame width of the previous frame
uint32_t m_prevFrmHeight = 0; //!< Frame height of the previous frame
uint32_t m_pictureStatesSize = 0; //!< Picture states size
uint32_t m_picturePatchListSize = 0; //!< Picture patch list size
uint16_t chromaSamplingFormat = 0; //!< Chroma sampling fromat
uint32_t m_widthInSb = 0; //!< Width in unit of SB
uint32_t m_heightInSb = 0; //!< Height in unit of SB
};
} // namespace decode
#endif