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_avc_slice_packet.h 24 //! \brief Defines the implementation of avc decode slice packet 25 //! 26 27 #ifndef __DECODE_AVC_SLICE_PACKET_H__ 28 #define __DECODE_AVC_SLICE_PACKET_H__ 29 30 #include "media_cmd_packet.h" 31 #include "decode_avc_pipeline.h" 32 #include "decode_utils.h" 33 #include "decode_avc_basic_feature.h" 34 #include "mhw_vdbox_mfx_itf.h" 35 36 namespace decode 37 { 38 //! 39 //! \struct AvcRefListWrite 40 //! \brief Average reference list write 41 //! 42 struct AvcRefListWrite 43 { 44 union 45 { 46 struct 47 { 48 uint8_t bottomField : 1; 49 uint8_t frameStoreID : 4; 50 uint8_t fieldPicFlag : 1; 51 uint8_t longTermFlag : 1; 52 uint8_t nonExisting : 1; 53 }; 54 struct 55 { 56 uint8_t value; 57 }; 58 } Ref[32]; 59 }; 60 61 class AvcDecodeSlcPkt : public DecodeSubPacket, public mhw::vdbox::mfx::Itf::ParSetting 62 { 63 public: AvcDecodeSlcPkt(AvcPipeline * pipeline,CodechalHwInterfaceNext * hwInterface)64 AvcDecodeSlcPkt(AvcPipeline *pipeline, CodechalHwInterfaceNext*hwInterface) 65 : DecodeSubPacket(pipeline, hwInterface), m_avcPipeline(pipeline) 66 { 67 if (m_hwInterface != nullptr) 68 { 69 m_mfxItf = std::static_pointer_cast<mhw::vdbox::mfx::Itf>(m_hwInterface->GetMfxInterfaceNext()); 70 m_miItf = std::static_pointer_cast<mhw::mi::Itf>(hwInterface->GetMiInterfaceNext()); 71 } 72 } ~AvcDecodeSlcPkt()73 virtual ~AvcDecodeSlcPkt(){}; 74 75 //! 76 //! \brief Initialize the media packet, allocate required resources 77 //! \return MOS_STATUS 78 //! MOS_STATUS_SUCCESS if success, else fail reason 79 //! 80 virtual MOS_STATUS Init() override; 81 82 //! 83 //! \brief Prepare interal parameters, should be invoked for each frame 84 //! \return MOS_STATUS 85 //! MOS_STATUS_SUCCESS if success, else fail reason 86 //! 87 virtual MOS_STATUS Prepare() override; 88 89 //! 90 //! \brief Execute avc slice packet 91 //! \return MOS_STATUS 92 //! MOS_STATUS_SUCCESS if success, else fail reason 93 //! 94 virtual MOS_STATUS Execute(MOS_COMMAND_BUFFER &cmdBuffer, uint32_t slcIdx) = 0; 95 96 //! 97 //! \brief Calculate Command Size 98 //! 99 //! \param [in, out] commandBufferSize 100 //! requested size 101 //! \param [in, out] requestedPatchListSize 102 //! requested size 103 //! \return MOS_STATUS 104 //! status 105 //! 106 MOS_STATUS CalculateCommandSize( 107 uint32_t &commandBufferSize, 108 uint32_t &requestedPatchListSize) override; 109 110 bool m_firstValidSlice = true; //!< Indicate the first valid slice if error slices are skipped 111 protected: 112 MOS_STATUS AddCmd_AVC_SLICE_STATE(MOS_COMMAND_BUFFER &cmdBuffer, uint32_t slcIdx); 113 MOS_STATUS SET_AVC_SLICE_STATE(MOS_COMMAND_BUFFER &cmdBuffer, uint32_t slcIdx); 114 MOS_STATUS AddCmd_AVC_PHANTOM_SLICE(MOS_COMMAND_BUFFER &cmdBuffer, uint32_t slcIdx); 115 MOS_STATUS AddCmd_AVC_SLICE_WEIGHT_OFFSET(MOS_COMMAND_BUFFER &cmdBuffer, uint32_t slcIdx); 116 MOS_STATUS AddCmd_AVC_SLICE_REF_IDX(MOS_COMMAND_BUFFER &cmdBuffer, uint32_t slcIdx); 117 MOS_STATUS AddCmd_AVC_BSD_OBJECT(MOS_COMMAND_BUFFER &cmdBuffer, uint32_t slcIdx); 118 MOS_STATUS AddCmd_AVC_SLICE_Addr(MOS_COMMAND_BUFFER &cmdBuffer, uint32_t slcIdx); 119 MOS_STATUS SetAndAddAvcSliceState(MOS_COMMAND_BUFFER &cmdBuffer, uint32_t slcIdx); 120 MHW_SETPAR_DECL_HDR(MFD_AVC_BSD_OBJECT); 121 MHW_SETPAR_DECL_HDR(MFX_AVC_WEIGHTOFFSET_STATE); 122 MHW_SETPAR_DECL_HDR(MFX_AVC_REF_IDX_STATE); 123 124 //! 125 //! \brief Calculate slice level command Buffer Size 126 //! 127 //! \return uint32_t 128 //! Command buffer size calculated 129 //! 130 virtual MOS_STATUS CalculateSliceStateCommandSize(); 131 132 AvcPipeline * m_avcPipeline = nullptr; 133 AvcBasicFeature * m_avcBasicFeature = nullptr; 134 DecodeAllocator * m_allocator = nullptr; 135 136 // Parameters passed from application 137 CODEC_AVC_PIC_PARAMS * m_avcPicParams = nullptr; //!< Pointer to AVC picture parameter 138 CODEC_AVC_SLICE_PARAMS *m_avcSliceParams = nullptr; //!< Pointer to AVC slices parameter 139 140 uint32_t m_sliceStatesSize = 0; //!< Slice state command size 141 uint32_t m_slicePatchListSize = 0; //!< Slice patch list size 142 uint32_t m_curSliceNum = 0; 143 uint32_t m_listID = 0; 144 std::shared_ptr<mhw::vdbox::mfx::Itf> m_mfxItf = nullptr; 145 146 uint32_t m_IndirectBsdDataLength = 0; 147 uint32_t m_IndirectBsdDataStartAddress = 0; 148 bool m_LastsliceFlag = false; 149 uint32_t m_FirstMacroblockMbBitOffset = 0; 150 uint32_t m_FirstMbByteOffsetOfSliceDataOrSliceHeader = 0; 151 bool m_decodeInUse = false; 152 PCODEC_AVC_SLICE_PARAMS m_pAvcSliceParams = nullptr; 153 154 MEDIA_CLASS_DEFINE_END(decode__AvcDecodeSlcPkt) 155 }; 156 157 } // namespace decode 158 #endif 159