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_picture_packet_g12_base.h 24 //! \brief Defines the implementation of av1 decode picture packet 25 //! 26 27 #ifndef __DECODE_AV1_PICTURE_PACKET_G12_BASE_H__ 28 #define __DECODE_AV1_PICTURE_PACKET_G12_BASE_H__ 29 30 #include "media_cmd_packet.h" 31 #include "decode_av1_pipeline_g12_base.h" 32 #include "decode_utils.h" 33 #include "decode_av1_basic_feature_g12.h" 34 35 namespace decode 36 { 37 class Av1DecodePicPkt_G12_Base : public DecodeSubPacket 38 { 39 public: 40 //! 41 //! \brief Av1DecodePicPkt_G12_Base constructor 42 //! Av1DecodePicPkt_G12_Base(Av1PipelineG12_Base * pipeline,CodechalHwInterface * hwInterface)43 Av1DecodePicPkt_G12_Base(Av1PipelineG12_Base *pipeline, CodechalHwInterface *hwInterface) 44 : DecodeSubPacket(pipeline, *hwInterface), m_av1Pipeline(pipeline) 45 { 46 m_hwInterface = hwInterface; 47 if (m_hwInterface != nullptr) 48 { 49 m_miInterface = m_hwInterface->GetMiInterface(); 50 m_osInterface = m_hwInterface->GetOsInterface(); 51 m_avpInterface = hwInterface->GetAvpInterface(); 52 } 53 } 54 55 //! 56 //! \brief Av1DecodePicPkt_G12_Base deconstructor 57 //! 58 virtual ~Av1DecodePicPkt_G12_Base(); 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 MOS_STATUS UpdatePipeBufAddrForDummyWL(MOS_COMMAND_BUFFER &cmdBuffer); 103 104 MOS_STATUS UpdateIndObjAddrForDummyWL(MOS_COMMAND_BUFFER &cmdBuffer); 105 106 protected: 107 108 virtual MOS_STATUS AllocateFixedResources(); 109 virtual MOS_STATUS AllocateVariableResources(); 110 111 virtual MOS_STATUS SetAvpDstSurfaceParams(MHW_VDBOX_SURFACE_PARAMS &dstSurfaceParams); 112 virtual MOS_STATUS SetAvpRefSurfaceParams(MHW_VDBOX_SURFACE_PARAMS *refSurfaceParams); 113 virtual MOS_STATUS SetAvpIntraBCSurfaceParams(MHW_VDBOX_SURFACE_PARAMS &intraBCSurfaceParams); 114 virtual MOS_STATUS AddAvpSurfacesCmd(MOS_COMMAND_BUFFER &cmdBuffer); 115 116 virtual MOS_STATUS SetAvpSegmentStateParams(MhwVdboxAvpSegmentStateParams& segStateParams); 117 virtual MOS_STATUS AddAvpSegmentStateCmd(MOS_COMMAND_BUFFER &cmdBuffer); 118 119 MOS_STATUS FixAvpPipeBufAddrParams(MhwVdboxAvpPipeBufAddrParams &pipeBufAddrParams); 120 virtual MOS_STATUS SetAvpPipeBufAddrParams(MhwVdboxAvpPipeBufAddrParams &pipeBufAddrParams); 121 virtual MOS_STATUS AddAvpPipeBufAddrCmd(MOS_COMMAND_BUFFER &cmdBuffer) = 0; 122 123 MOS_STATUS SetAvpPipeBufAddrParamsForDummyWL(MhwVdboxAvpPipeBufAddrParams& pipeBufAddrParams); 124 125 virtual MOS_STATUS AddAvpIndObjBaseAddrCmd(MOS_COMMAND_BUFFER &cmdBuffer); 126 virtual void SetAvpIndObjBaseAddrParams(MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS &indObjBaseAddrParams); 127 128 virtual MOS_STATUS AddAvpPipeModeSelectCmd(MOS_COMMAND_BUFFER &cmdBuffer) = 0; 129 130 virtual MOS_STATUS SetAvpPicStateParams(MhwVdboxAvpPicStateParams &picStateParams); 131 virtual MOS_STATUS SetAvpInterPredStateParams(MhwVdboxAvpPicStateParams &picStateParams); 132 133 //! \brief Set Rowstore Cache offset 134 //! 135 //! \return MOS_STATUS 136 //! MOS_STATUS_SUCCESS if success, else fail reason 137 //! 138 virtual MOS_STATUS SetRowstoreCachingOffsets(); 139 140 //! 141 //! \brief Free resources 142 //! \return MOS_STATUS 143 //! MOS_STATUS_SUCCESS if success, else fail reason 144 //! 145 MOS_STATUS FreeResources(); 146 147 //! 148 //! \brief Dump resources 149 //! \return MOS_STATUS 150 //! MOS_STATUS_SUCCESS if success, else fail reason 151 //! 152 MOS_STATUS DumpResources(MhwVdboxAvpPipeBufAddrParams& pipeBufAddrParams, uint32_t refSize); 153 154 //Interfaces 155 Av1PipelineG12_Base *m_av1Pipeline = nullptr; 156 MhwVdboxAvpInterface *m_avpInterface = nullptr; 157 Av1BasicFeatureG12 *m_av1BasicFeature = nullptr; 158 DecodeAllocator *m_allocator = nullptr; 159 DecodeMemComp *m_mmcState = nullptr; 160 CodechalHwInterface *m_hwInterface = nullptr; 161 MhwMiInterface *m_miInterface = nullptr; 162 163 CodecAv1PicParams *m_av1PicParams = nullptr; //!< Pointer to picture parameter 164 MOS_SURFACE refSurface[av1TotalRefsPerFrame]; 165 166 //! 167 //! \brief Setup SkipModeFrame[0] and SkipModeFrame[1] per av1_setup_skip_mode_allowed of ref decoder 168 //! \return MOS_STATUS 169 //! MOS_STATUS_SUCCESS if success, else fail reason 170 //! 171 MOS_STATUS SetupSkipModeFrames(MhwVdboxAvpPicStateParams& picStateParams); 172 173 //! 174 //! \brief Setup Frame Sign Bias 175 //! \return MOS_STATUS 176 //! MOS_STATUS_SUCCESS if success, else fail reason 177 //! 178 MOS_STATUS SetupFrameSignBias(MhwVdboxAvpPicStateParams& picStateParams); 179 180 PMOS_SURFACE m_intrabcDecodedOutputFrameBuffer = nullptr; //!< IntraBC Decoded output frame buffer 181 182 //non-temporal buffers 183 PMOS_BUFFER m_bitstreamDecoderEncoderLineRowstoreReadWriteBuffer = nullptr; //!< Handle of Bitstream Decode Line Rowstore buffer, can be programmed to use Local Media Storage VMM instead of Memory 184 PMOS_BUFFER m_bitstreamDecoderEncoderTileLineRowstoreReadWriteBuffer = nullptr; //!< Handle of Bitstream Decode Tile Line buffer 185 PMOS_BUFFER m_intraPredictionLineRowstoreReadWriteBuffer = nullptr; //!< Handle of Intra Prediction Line Rowstore Read/Write Buffer 186 PMOS_BUFFER m_intraPredictionTileLineRowstoreReadWriteBuffer = nullptr; //!< Handle of Intra Prediction Tile Line Rowstore Read/Write Buffer 187 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 188 PMOS_BUFFER m_spatialMotionVectorCodingTileLineReadWriteBuffer = nullptr; //!< Handle of Spatial Motion Vector Tile Line buffer 189 PMOS_BUFFER m_loopRestorationMetaTileColumnReadWriteBuffer = nullptr; //!< DW80..81, Loop Restoration Meta Tile Column Read/Write Buffer Address 190 PMOS_BUFFER m_loopRestorationFilterTileReadWriteLineYBuffer = nullptr; //!< DW83..84, Loop Restoration Filter Tile Read/Write Line Y Buffer Address 191 PMOS_BUFFER m_loopRestorationFilterTileReadWriteLineUBuffer = nullptr; //!< DW86..87, Loop Restoration Filter Tile Read/Write Line U Buffer Address 192 PMOS_BUFFER m_loopRestorationFilterTileReadWriteLineVBuffer = nullptr; //!< DW89..90, Loop Restoration Filter Tile Read/Write Line V Buffer Address 193 PMOS_BUFFER m_deblockerFilterLineReadWriteYBuffer = nullptr; //!< DW92..93, Deblocker Filter Line Read/Write Y Buffer Address 194 PMOS_BUFFER m_deblockerFilterLineReadWriteUBuffer = nullptr; //!< DW95..96, Deblocker Filter Line Read/Write U Buffer Address 195 PMOS_BUFFER m_deblockerFilterLineReadWriteVBuffer = nullptr; //!< DW98..99, Deblocker Filter Line Read/Write V Buffer Address 196 PMOS_BUFFER m_deblockerFilterTileLineReadWriteYBuffer = nullptr; //!< DW101..102, Deblocker Filter Tile Line Read/Write Y Buffer Address 197 PMOS_BUFFER m_deblockerFilterTileLineReadWriteVBuffer = nullptr; //!< DW104..105, Deblocker Filter Tile Line Read/Write V Buffer Address 198 PMOS_BUFFER m_deblockerFilterTileLineReadWriteUBuffer = nullptr; //!< DW107..108, Deblocker Filter Tile Line Read/Write U Buffer Address 199 PMOS_BUFFER m_deblockerFilterTileColumnReadWriteYBuffer = nullptr; //!< DW110..111, Deblocker Filter Tile Column Read/Write Y Buffer Address 200 PMOS_BUFFER m_deblockerFilterTileColumnReadWriteUBuffer = nullptr; //!< DW113..114, Deblocker Filter Tile Column Read/Write U Buffer Address 201 PMOS_BUFFER m_deblockerFilterTileColumnReadWriteVBuffer = nullptr; //!< DW116..117, Deblocker Filter Tile Column Read/Write V Buffer Address 202 PMOS_BUFFER m_cdefFilterLineReadWriteBuffer = nullptr; //!< DW119..120, CDEF Filter Line Read/Write Y Buffer Address 203 PMOS_BUFFER m_cdefFilterTileLineReadWriteBuffer = nullptr; //!< DW128..129, CDEF Filter Tile Line Read/Write Y Buffer Address 204 PMOS_BUFFER m_cdefFilterTileColumnReadWriteBuffer = nullptr; //!< DW137..138, CDEF Filter Tile Column Read/Write Y Buffer Address 205 PMOS_BUFFER m_cdefFilterMetaTileLineReadWriteBuffer = nullptr; //!< DW140..141, CDEF Filter Meta Tile Line Read/Write Buffer Address 206 PMOS_BUFFER m_cdefFilterMetaTileColumnReadWriteBuffer = nullptr; //!< DW143..144, CDEF Filter Meta Tile Column Read/Write Buffer Address 207 PMOS_BUFFER m_cdefFilterTopLeftCornerReadWriteBuffer = nullptr; //!< DW146..147, CDEF Filter Top-Left Corner Read/Write Buffer Address 208 PMOS_BUFFER m_superResTileColumnReadWriteYBuffer = nullptr; //!< DW149..150, Super-Res Tile Column Read/Write Y Buffer Address 209 PMOS_BUFFER m_superResTileColumnReadWriteUBuffer = nullptr; //!< DW152..153, Super-Res Tile Column Read/Write U Buffer Address 210 PMOS_BUFFER m_superResTileColumnReadWriteVBuffer = nullptr; //!< DW155..156, Super-Res Tile Column Read/Write V Buffer Address 211 PMOS_BUFFER m_loopRestorationFilterTileColumnReadWriteYBuffer = nullptr; //!< DW158..159, Loop Restoration Filter Tile Column Read/Write Y Buffer Address 212 PMOS_BUFFER m_loopRestorationFilterTileColumnReadWriteUBuffer = nullptr; //!< DW161..162, Loop Restoration Filter Tile Column Read/Write U Buffer Address 213 PMOS_BUFFER m_loopRestorationFilterTileColumnReadWriteVBuffer = nullptr; //!< DW164..165, Loop Restoration Filter Tile Column Read/Write V Buffer Address 214 215 //streamout buffer 216 PMOS_BUFFER m_decodedFrameStatusErrorBuffer = nullptr; //!< DW176..177, Decoded Frame Status/Error Buffer Base Address 217 PMOS_BUFFER m_decodedBlockDataStreamoutBuffer = nullptr; //!< DW179..180, Decoded Block Data Streamout Buffer Address 218 219 PMOS_BUFFER m_resMfdDeblockingFilterRowStoreScratchBuffer = nullptr; //!< Handle of MFD Deblocking Filter Row Store Scratch data surface 220 PMOS_BUFFER m_resDeblockingFilterTileRowStoreScratchBuffer = nullptr; //!< Handle of Deblocking Filter Tile Row Store Scratch data surface 221 PMOS_BUFFER m_resDeblockingFilterColumnRowStoreScratchBuffer = nullptr; //!< Handle of Deblocking Filter Column Row Store Scratch data surface 222 PMOS_BUFFER m_resMetadataLineBuffer = nullptr; //!< Handle of Metadata Line data buffer 223 PMOS_BUFFER m_resMetadataTileLineBuffer = nullptr; //!< Handle of Metadata Tile Line data buffer 224 PMOS_BUFFER m_resMetadataTileColumnBuffer = nullptr; //!< Handle of Metadata Tile Column data buffer 225 PMOS_BUFFER m_resSaoLineBuffer = nullptr; //!< Handle of SAO Line data buffer 226 PMOS_BUFFER m_resSaoTileLineBuffer = nullptr; //!< Handle of SAO Tile Line data buffer 227 PMOS_BUFFER m_resSaoTileColumnBuffer = nullptr; //!< Handle of SAO Tile Column data buffer 228 229 //buffers for dummy workload 230 PMOS_BUFFER m_curMvBufferForDummyWL = nullptr; 231 PMOS_BUFFER m_bwdAdaptCdfBufForDummyWL = nullptr; 232 PMOS_BUFFER m_resDataBufferForDummyWL = nullptr; 233 bool m_dummyBsBufInited = false; 234 235 uint32_t m_prevFrmWidth = 0; //!< Frame width of the previous frame 236 uint32_t m_prevFrmHeight = 0; //!< Frame height of the previous frame 237 uint32_t m_pictureStatesSize = 0; //!< Picture states size 238 uint32_t m_picturePatchListSize = 0; //!< Picture patch list size 239 uint16_t chromaSamplingFormat = 0; //!< Chroma sampling fromat 240 uint32_t m_widthInSb = 0; //!< Width in unit of SB 241 uint32_t m_heightInSb = 0; //!< Height in unit of SB 242 MEDIA_CLASS_DEFINE_END(decode__Av1DecodePicPkt_G12_Base) 243 }; 244 245 } // namespace decode 246 #endif 247