1 /* 2 * Copyright (c) 2021-2022, 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_vvc_packet.h 24 //! \brief Defines the implementation of VVC decode packet 25 //! 26 27 #ifndef __DECODE_VVC_PACKET_H__ 28 #define __DECODE_VVC_PACKET_H__ 29 30 #include "media_cmd_packet.h" 31 #include "decode_vvc_pipeline.h" 32 #include "decode_utils.h" 33 #include "decode_status_report.h" 34 #include "decode_vvc_basic_feature.h" 35 #include "decode_vvc_picture_packet.h" 36 #include "decode_vvc_slice_packet.h" 37 #include "mhw_vdbox_vvcp_itf.h" 38 39 namespace decode 40 { 41 class VvcPipeline; 42 class VvcDecodePicPkt; 43 class VvcDecodePkt : public CmdPacket, public MediaStatusReportObserver 44 { 45 public: VvcDecodePkt(MediaPipeline * pipeline,MediaTask * task,CodechalHwInterfaceNext * hwInterface)46 VvcDecodePkt(MediaPipeline *pipeline, MediaTask *task, CodechalHwInterfaceNext *hwInterface) 47 : CmdPacket(task) 48 { 49 if (pipeline != nullptr) 50 { 51 m_statusReport = pipeline->GetStatusReportInstance(); 52 m_featureManager = pipeline->GetFeatureManager(); 53 m_vvcPipeline = dynamic_cast<VvcPipeline*>(pipeline); 54 } 55 if (hwInterface != nullptr) 56 { 57 m_hwInterface = hwInterface; 58 m_osInterface = hwInterface->GetOsInterface(); 59 m_miItf = std::static_pointer_cast<mhw::mi::Itf>(hwInterface->GetMiInterfaceNext()); 60 m_vdencItf = std::static_pointer_cast<mhw::vdbox::vdenc::Itf>(hwInterface->GetVdencInterfaceNext()); 61 if (m_hwInterface != nullptr) 62 { 63 m_vvcpItf = std::static_pointer_cast<mhw::vdbox::vvcp::Itf>(m_hwInterface->GetVvcpInterfaceNext()); 64 } 65 } 66 } ~VvcDecodePkt()67 virtual ~VvcDecodePkt(){}; 68 69 //! 70 //! \brief Initialize the media packet, allocate required resources 71 //! \return MOS_STATUS 72 //! MOS_STATUS_SUCCESS if success, else fail reason 73 //! 74 virtual MOS_STATUS Init() override; 75 76 //! 77 //! \brief Prepare interal parameters, should be invoked for each frame 78 //! \return MOS_STATUS 79 //! MOS_STATUS_SUCCESS if success, else fail reason 80 //! 81 virtual MOS_STATUS Prepare() override; 82 83 //! 84 //! \brief Destroy the media packet and release the resources 85 //! \return MOS_STATUS 86 //! MOS_STATUS_SUCCESS if success, else fail reason 87 //! 88 virtual MOS_STATUS Destroy() override; 89 90 //! 91 //! \brief One frame is completed 92 //! \param [in] mfxStatus 93 //! pointer to status buffer which for mfx 94 //! \param [in] rcsStatus 95 //! pointer to status buffer which for RCS 96 //! \param [in, out] statusReport 97 //! pointer of DecoderStatusReport 98 //! \return MOS_STATUS 99 //! MOS_STATUS_SUCCESS if success, else fail reason 100 //! 101 virtual MOS_STATUS Completed(void *mfxStatus, void *rcsStatus, void *statusReport) override; 102 103 //! 104 //! \brief Calculate Command Size 105 //! 106 //! \param [in, out] commandBufferSize 107 //! requested size 108 //! \param [in, out] requestedPatchListSize 109 //! requested size 110 //! \return MOS_STATUS 111 //! status 112 //! 113 MOS_STATUS CalculateCommandSize(uint32_t &commandBufferSize, uint32_t &requestedPatchListSize) override; 114 115 //! 116 //! \brief Get Packet Name 117 //! \return std::string 118 //! GetPacketName()119 virtual std::string GetPacketName() override 120 { 121 return "VVC_DECODE"; 122 } 123 GetPictureLvlBB()124 PMHW_BATCH_BUFFER GetPictureLvlBB() { return m_picBatchBuf; }; 125 126 //! 127 //! \brief Add the command sequence into the commandBuffer and 128 //! and return to the caller task 129 //! \param [in] commandBuffer 130 //! Pointer to the command buffer which is allocated by caller 131 //! \return MOS_STATUS 132 //! MOS_STATUS_SUCCESS if success, else fail reason 133 //! 134 virtual MOS_STATUS Submit(MOS_COMMAND_BUFFER* commandBuffer, uint8_t packetPhase = otherPacket) override; 135 136 protected: 137 //! 138 //! \brief Calculate Command Buffer Size 139 //! 140 //! \return uint32_t 141 //! Command buffer size calculated 142 //! 143 virtual uint32_t CalculateCommandBufferSize(); 144 145 //! 146 //! \brief Calculate Patch List Size 147 //! 148 //! \return uint32_t 149 //! Patchlist size calculated 150 //! 151 virtual uint32_t CalculatePatchListSize(); 152 153 //! 154 //! \brief Calculate pic-level command size 155 //! \return uint32_t 156 //! Pic-level command size calculated 157 //! 158 virtual uint32_t CalculatePicCommandSize(); 159 160 //! 161 //! \brief Calculate pic-level patch list size 162 //! \return uint32_t 163 //! Pic-level patch list size calculated 164 //! 165 virtual uint32_t CalculatePicPatchListSize(); 166 167 void CalculateVvcSliceLvlCmdSize(); 168 169 void SetPerfTag(CODECHAL_MODE mode, uint16_t picCodingType); 170 bool IsPrologRequired(); 171 MOS_STATUS SendPrologWithFrameTracking(MOS_COMMAND_BUFFER &cmdBuffer, bool frameTrackingRequested); 172 MOS_STATUS VdPipelineFlush(MOS_COMMAND_BUFFER & cmdBuffer); 173 MOS_STATUS MiFlush(MOS_COMMAND_BUFFER & cmdBuffer); 174 MOS_STATUS AddForceWakeup(MOS_COMMAND_BUFFER &cmdBuffer); 175 176 virtual MOS_STATUS ReadVvcpStatus(MediaStatusReport* statusReport, MOS_COMMAND_BUFFER& cmdBuffer); 177 virtual MOS_STATUS StartStatusReport(uint32_t srType, MOS_COMMAND_BUFFER* cmdBuffer) override; 178 virtual MOS_STATUS EndStatusReport(uint32_t srType, MOS_COMMAND_BUFFER* cmdBuffer) override; 179 180 MOS_STATUS InitPicLevelCmdBuffer(MHW_BATCH_BUFFER &batchBuffer, uint8_t *batchBufBase); 181 182 #if USE_CODECHAL_DEBUG_TOOL 183 //! \brief Dump the output resources in status report callback function 184 //! 185 //! \param [in] decodeStatusMfx 186 //! Pointer to decoder status for vdbox 187 //! \param [in] statusReportData 188 //! Pointer to decoder status report data 189 //! 190 //! \return MOS_STATUS 191 //! MOS_STATUS_SUCCESS if success, else fail reason 192 //! 193 MOS_STATUS DumpResources( 194 DecodeStatusMfx *decodeStatusMfx, 195 DecodeStatusReportData *statusReportData); 196 #endif 197 198 MOS_STATUS PackPictureLevelCmds(MOS_COMMAND_BUFFER &cmdBuffer); 199 MOS_STATUS PackSliceLevelCmds(MOS_COMMAND_BUFFER &cmdBuffer); 200 MOS_STATUS PackS2LSliceLevelCmds(MOS_COMMAND_BUFFER &cmdBuffer); 201 MOS_STATUS VdMemoryFlush(MOS_COMMAND_BUFFER &cmdBuffer); 202 MOS_STATUS EnsureAllCommandsExecuted(MOS_COMMAND_BUFFER &cmdBuffer); 203 204 MediaFeatureManager *m_featureManager = nullptr; 205 VvcPipeline *m_vvcPipeline = nullptr; 206 DecodeAllocator *m_allocator = nullptr; 207 VvcBasicFeature *m_vvcBasicFeature = nullptr; 208 DecodeMemComp *m_mmcState = nullptr; 209 VvcDecodePicPkt *m_picturePkt = nullptr; 210 VvcDecodeSlicePkt *m_slicePkt = nullptr; 211 bool m_isFirstSliceInFrame = true; 212 bool m_isLastSliceInFrame = false; 213 const CodecVvcPicParams *m_vvcPicParams = nullptr; //!< Pointer to picture parameter 214 215 uint32_t m_pictureStatesSize = 0; 216 uint32_t m_picturePatchListSize = 0; 217 uint32_t m_sliceStatesSize = 0; 218 uint32_t m_slicePatchListSize = 0; 219 uint32_t m_tileStateSize = 0; 220 uint32_t m_tilePatchListSize = 0; 221 uint32_t m_vvcpSliceCmdSize = 0; //Slice Lvl Command Size 222 223 MOS_COMMAND_BUFFER m_picCmdBuffer; //!< picture command buffer 224 PMHW_BATCH_BUFFER m_picBatchBuf = nullptr; //!< Pointer to batch buffer 225 bool m_picCmdSizeCalculated = false; //!< flag to indicate if pic-level cmd size is included 226 227 PMHW_BATCH_BUFFER m_tileLevelBB = nullptr; 228 CodechalHwInterfaceNext *m_hwInterface = nullptr; 229 std::shared_ptr<mhw::vdbox::vdenc::Itf> m_vdencItf = nullptr; 230 std::shared_ptr<mhw::vdbox::vvcp::Itf> m_vvcpItf = nullptr; 231 232 233 MEDIA_CLASS_DEFINE_END(decode__VvcDecodePkt) 234 }; 235 236 } // namespace decode 237 #endif // !__DECODE_VVC_PACKET_H__ 238 239