1 /* 2 * Copyright (c) 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_picture_packet.h 24 //! \brief Defines the implementation of av1 decode picture packet 25 //! 26 27 #ifndef __DECODE_AV1_PICTURE_PACKET_H__ 28 #define __DECODE_AV1_PICTURE_PACKET_H__ 29 30 #include "media_cmd_packet.h" 31 #include "decode_av1_pipeline.h" 32 #include "decode_utils.h" 33 #include "decode_av1_basic_feature.h" 34 #include "mhw_vdbox_avp_itf.h" 35 36 using namespace mhw::vdbox::avp; 37 namespace decode 38 { 39 class Av1DecodePicPkt : public DecodeSubPacket , public mhw::vdbox::avp::Itf::ParSetting 40 { 41 public: 42 //! 43 //! \brief Av1DecodePicPkt constructor 44 //! Av1DecodePicPkt(Av1Pipeline * pipeline,CodechalHwInterfaceNext * hwInterface)45 Av1DecodePicPkt(Av1Pipeline *pipeline, CodechalHwInterfaceNext*hwInterface) 46 : DecodeSubPacket(pipeline, hwInterface), m_av1Pipeline(pipeline) 47 { 48 if (m_hwInterface != nullptr) 49 { 50 m_avpItf = std::static_pointer_cast<mhw::vdbox::avp::Itf>(m_hwInterface->GetAvpInterfaceNext()); 51 m_miItf = std::static_pointer_cast<mhw::mi::Itf>(m_hwInterface->GetMiInterfaceNext()); 52 } 53 } 54 55 //! 56 //! \brief Av1DecodePicPkt deconstructor 57 //! 58 virtual ~Av1DecodePicPkt(); 59 60 //! 61 //! \brief Initialize the media packet, allocate required resources 62 //! \return MOS_STATUS 63 //! MOS_STATUS_SUCCESS if success, else fail reason 64 //! 65 virtual MOS_STATUS Init() override; 66 67 //! 68 //! \brief Prepare interal parameters, should be invoked for each frame 69 //! \return MOS_STATUS 70 //! MOS_STATUS_SUCCESS if success, else fail reason 71 //! 72 virtual MOS_STATUS Prepare() override; 73 74 //! 75 //! \brief Execute av1 picture packet 76 //! \return MOS_STATUS 77 //! MOS_STATUS_SUCCESS if success, else fail reason 78 //! 79 virtual MOS_STATUS Execute(MOS_COMMAND_BUFFER& cmdBuffer) = 0; 80 81 //! 82 //! \brief Init av1 state commands 83 //! \return MOS_STATUS 84 //! MOS_STATUS_SUCCESS if success, else fail reason 85 //! InitAv1State(MOS_COMMAND_BUFFER & cmdBuffer)86 virtual MOS_STATUS InitAv1State(MOS_COMMAND_BUFFER& cmdBuffer) { return MOS_STATUS_SUCCESS; }; 87 88 //! 89 //! \brief Calculate Command Size 90 //! 91 //! \param [in, out] commandBufferSize 92 //! requested size 93 //! \param [in, out] requestedPatchListSize 94 //! requested size 95 //! \return MOS_STATUS 96 //! status 97 //! 98 MOS_STATUS CalculateCommandSize( 99 uint32_t &commandBufferSize, 100 uint32_t &requestedPatchListSize) override; 101 102 protected: 103 virtual MOS_STATUS AllocateVariableResources(); 104 105 virtual MOS_STATUS AddAllCmds_AVP_SURFACE_STATE(MOS_COMMAND_BUFFER& cmdBuffer); 106 MOS_STATUS AddAllCmds_AVP_PIPE_MODE_SELECT(MOS_COMMAND_BUFFER& cmdBuffer); 107 MOS_STATUS AddAllCmds_AVP_SEGMENT_STATE(MOS_COMMAND_BUFFER& cmdBuffer); 108 MOS_STATUS SetSkipModeFrameParam() const; 109 MOS_STATUS SetRefPicStateParam() const; 110 MOS_STATUS RefAddrErrorConcel() const; 111 MOS_STATUS GetSurfaceMmcInfo(PMOS_SURFACE surface, MOS_MEMCOMP_STATE& mmcState, uint32_t& compressionFormat) const; 112 virtual MOS_STATUS GetChromaFormat(); 113 114 MHW_SETPAR_DECL_HDR(AVP_PIPE_MODE_SELECT); 115 MHW_SETPAR_DECL_HDR(AVP_PIC_STATE); 116 MHW_SETPAR_DECL_HDR(AVP_IND_OBJ_BASE_ADDR_STATE); 117 MHW_SETPAR_DECL_HDR(AVP_PIPE_BUF_ADDR_STATE); 118 MHW_SETPAR_DECL_HDR(AVP_INTER_PRED_STATE); 119 MHW_SETPAR_DECL_HDR(AVP_SURFACE_STATE); 120 121 //! \brief Set Rowstore Cache offset 122 //! 123 //! \return MOS_STATUS 124 //! MOS_STATUS_SUCCESS if success, else fail reason 125 //! 126 virtual MOS_STATUS SetRowstoreCachingOffsets(); 127 128 //! 129 //! \brief Free resources 130 //! \return MOS_STATUS 131 //! MOS_STATUS_SUCCESS if success, else fail reason 132 //! 133 MOS_STATUS FreeResources(); 134 135 #if USE_CODECHAL_DEBUG_TOOL 136 //! 137 //! \brief Dump resources 138 //! \return MOS_STATUS 139 //! MOS_STATUS_SUCCESS if success, else fail reason 140 //! 141 MOS_STATUS DumpResources(uint32_t refSize) const; 142 #endif 143 144 //Interfaces 145 Av1Pipeline *m_av1Pipeline = nullptr; 146 CodechalHwInterfaceNext *m_hwInterfaceNext = nullptr; 147 Av1BasicFeature *m_av1BasicFeature = nullptr; 148 DecodeAllocator *m_allocator = nullptr; 149 DecodeMemComp *m_mmcState = nullptr; 150 std::shared_ptr<mhw::vdbox::avp::Itf> m_avpItf = nullptr; 151 152 CodecAv1PicParams *m_av1PicParams = nullptr; //!< Pointer to picture parameter 153 MOS_SURFACE m_refSurface[av1TotalRefsPerFrame]; 154 MOS_MEMCOMP_STATE m_refMmcState[av1TotalRefsPerFrame] = { MOS_MEMCOMP_DISABLED }; 155 uint32_t m_refCompressionFormat = 0; 156 PMOS_SURFACE m_intrabcDecodedOutputFrameBuffer = nullptr; //!< IntraBC Decoded output frame buffer 157 158 //non-temporal buffers 159 PMOS_BUFFER m_bitstreamDecoderEncoderLineRowstoreReadWriteBuffer = nullptr; //!< Handle of Bitstream Decode Line Rowstore buffer, can be programmed to use Local Media Storage VMM instead of Memory 160 PMOS_BUFFER m_bitstreamDecoderEncoderTileLineRowstoreReadWriteBuffer = nullptr; //!< Handle of Bitstream Decode Tile Line buffer 161 PMOS_BUFFER m_intraPredictionLineRowstoreReadWriteBuffer = nullptr; //!< Handle of Intra Prediction Line Rowstore Read/Write Buffer 162 PMOS_BUFFER m_intraPredictionTileLineRowstoreReadWriteBuffer = nullptr; //!< Handle of Intra Prediction Tile Line Rowstore Read/Write Buffer 163 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 164 PMOS_BUFFER m_spatialMotionVectorCodingTileLineReadWriteBuffer = nullptr; //!< Handle of Spatial Motion Vector Tile Line buffer 165 PMOS_BUFFER m_loopRestorationMetaTileColumnReadWriteBuffer = nullptr; //!< DW80..81, Loop Restoration Meta Tile Column Read/Write Buffer Address 166 PMOS_BUFFER m_loopRestorationFilterTileReadWriteLineYBuffer = nullptr; //!< DW83..84, Loop Restoration Filter Tile Read/Write Line Y Buffer Address 167 PMOS_BUFFER m_loopRestorationFilterTileReadWriteLineUBuffer = nullptr; //!< DW86..87, Loop Restoration Filter Tile Read/Write Line U Buffer Address 168 PMOS_BUFFER m_loopRestorationFilterTileReadWriteLineVBuffer = nullptr; //!< DW89..90, Loop Restoration Filter Tile Read/Write Line V Buffer Address 169 PMOS_BUFFER m_deblockerFilterLineReadWriteYBuffer = nullptr; //!< DW92..93, Deblocker Filter Line Read/Write Y Buffer Address 170 PMOS_BUFFER m_deblockerFilterLineReadWriteUBuffer = nullptr; //!< DW95..96, Deblocker Filter Line Read/Write U Buffer Address 171 PMOS_BUFFER m_deblockerFilterLineReadWriteVBuffer = nullptr; //!< DW98..99, Deblocker Filter Line Read/Write V Buffer Address 172 PMOS_BUFFER m_deblockerFilterTileLineReadWriteYBuffer = nullptr; //!< DW101..102, Deblocker Filter Tile Line Read/Write Y Buffer Address 173 PMOS_BUFFER m_deblockerFilterTileLineReadWriteVBuffer = nullptr; //!< DW104..105, Deblocker Filter Tile Line Read/Write V Buffer Address 174 PMOS_BUFFER m_deblockerFilterTileLineReadWriteUBuffer = nullptr; //!< DW107..108, Deblocker Filter Tile Line Read/Write U Buffer Address 175 PMOS_BUFFER m_deblockerFilterTileColumnReadWriteYBuffer = nullptr; //!< DW110..111, Deblocker Filter Tile Column Read/Write Y Buffer Address 176 PMOS_BUFFER m_deblockerFilterTileColumnReadWriteUBuffer = nullptr; //!< DW113..114, Deblocker Filter Tile Column Read/Write U Buffer Address 177 PMOS_BUFFER m_deblockerFilterTileColumnReadWriteVBuffer = nullptr; //!< DW116..117, Deblocker Filter Tile Column Read/Write V Buffer Address 178 PMOS_BUFFER m_cdefFilterLineReadWriteBuffer = nullptr; //!< DW119..120, CDEF Filter Line Read/Write Y Buffer Address 179 PMOS_BUFFER m_cdefFilterTileLineReadWriteBuffer = nullptr; //!< DW128..129, CDEF Filter Tile Line Read/Write Y Buffer Address 180 PMOS_BUFFER m_cdefFilterTileColumnReadWriteBuffer = nullptr; //!< DW137..138, CDEF Filter Tile Column Read/Write Y Buffer Address 181 PMOS_BUFFER m_cdefFilterMetaTileLineReadWriteBuffer = nullptr; //!< DW140..141, CDEF Filter Meta Tile Line Read/Write Buffer Address 182 PMOS_BUFFER m_cdefFilterMetaTileColumnReadWriteBuffer = nullptr; //!< DW143..144, CDEF Filter Meta Tile Column Read/Write Buffer Address 183 PMOS_BUFFER m_cdefFilterTopLeftCornerReadWriteBuffer = nullptr; //!< DW146..147, CDEF Filter Top-Left Corner Read/Write Buffer Address 184 PMOS_BUFFER m_superResTileColumnReadWriteYBuffer = nullptr; //!< DW149..150, Super-Res Tile Column Read/Write Y Buffer Address 185 PMOS_BUFFER m_superResTileColumnReadWriteUBuffer = nullptr; //!< DW152..153, Super-Res Tile Column Read/Write U Buffer Address 186 PMOS_BUFFER m_superResTileColumnReadWriteVBuffer = nullptr; //!< DW155..156, Super-Res Tile Column Read/Write V Buffer Address 187 PMOS_BUFFER m_loopRestorationFilterTileColumnReadWriteYBuffer = nullptr; //!< DW158..159, Loop Restoration Filter Tile Column Read/Write Y Buffer Address 188 PMOS_BUFFER m_loopRestorationFilterTileColumnReadWriteUBuffer = nullptr; //!< DW161..162, Loop Restoration Filter Tile Column Read/Write U Buffer Address 189 PMOS_BUFFER m_loopRestorationFilterTileColumnReadWriteVBuffer = nullptr; //!< DW164..165, Loop Restoration Filter Tile Column Read/Write V Buffer Address 190 191 //streamout buffer 192 PMOS_BUFFER m_decodedFrameStatusErrorBuffer = nullptr; //!< DW176..177, Decoded Frame Status/Error Buffer Base Address 193 PMOS_BUFFER m_decodedBlockDataStreamoutBuffer = nullptr; //!< DW179..180, Decoded Block Data Streamout Buffer Address 194 195 PMOS_BUFFER m_resMfdDeblockingFilterRowStoreScratchBuffer = nullptr; //!< Handle of MFD Deblocking Filter Row Store Scratch data surface 196 PMOS_BUFFER m_resDeblockingFilterTileRowStoreScratchBuffer = nullptr; //!< Handle of Deblocking Filter Tile Row Store Scratch data surface 197 PMOS_BUFFER m_resDeblockingFilterColumnRowStoreScratchBuffer = nullptr; //!< Handle of Deblocking Filter Column Row Store Scratch data surface 198 PMOS_BUFFER m_resMetadataLineBuffer = nullptr; //!< Handle of Metadata Line data buffer 199 PMOS_BUFFER m_resMetadataTileLineBuffer = nullptr; //!< Handle of Metadata Tile Line data buffer 200 PMOS_BUFFER m_resMetadataTileColumnBuffer = nullptr; //!< Handle of Metadata Tile Column data buffer 201 PMOS_BUFFER m_resSaoLineBuffer = nullptr; //!< Handle of SAO Line data buffer 202 PMOS_BUFFER m_resSaoTileLineBuffer = nullptr; //!< Handle of SAO Tile Line data buffer 203 PMOS_BUFFER m_resSaoTileColumnBuffer = nullptr; //!< Handle of SAO Tile Column data buffer 204 205 PMOS_BUFFER m_filmGrainTileColumnDataBuf = nullptr; //!< Film Grain tile column data read/write buffer 206 PMOS_BUFFER m_filmGrainSampleTemplateBuf = nullptr; //!< Film Grain sample template buffer 207 PMOS_BUFFER m_loopRestorationFilterTileColumnAlignmentBuf = nullptr; //!< Loop restoration filter tile column alignment read/write buffer 208 209 uint32_t m_prevFrmWidth = 0; //!< Frame width of the previous frame 210 uint32_t m_prevFrmHeight = 0; //!< Frame height of the previous frame 211 uint32_t m_pictureStatesSize = 0; //!< Picture states size 212 uint32_t m_picturePatchListSize = 0; //!< Picture patch list size 213 uint16_t chromaSamplingFormat = 0; //!< Chroma sampling fromat 214 uint32_t m_widthInSb = 0; //!< Width in unit of SB 215 uint32_t m_heightInSb = 0; //!< Height in unit of SB 216 217 static const uint32_t m_av1ScalingFactor = (1 << 14); //!< AV1 Scaling factor 218 mutable uint8_t m_curAvpSurfStateId = 0; 219 220 MEDIA_CLASS_DEFINE_END(decode__Av1DecodePicPkt) 221 }; 222 223 } // namespace decode 224 #endif 225