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_hevc_picture_packet_xe_m_base.h
24 //! \brief    Defines the implementation of hevc decode picture packet
25 //!
26 
27 #ifndef __DECODE_HEVC_PICTURE_PACKET_XE_M_BASE_H__
28 #define __DECODE_HEVC_PICTURE_PACKET_XE_M_BASE_H__
29 
30 #include "media_cmd_packet.h"
31 #include "decode_hevc_pipeline.h"
32 #include "decode_utils.h"
33 #include "decode_hevc_basic_feature.h"
34 #include "decode_downsampling_packet.h"
35 #include "codechal_hw.h"
36 
37 namespace decode
38 {
39 
40 class HevcDecodePicPktXe_M_Base : public DecodeSubPacket
41 {
42 public:
HevcDecodePicPktXe_M_Base(HevcPipeline * pipeline,CodechalHwInterface * hwInterface)43     HevcDecodePicPktXe_M_Base(HevcPipeline *pipeline, CodechalHwInterface *hwInterface)
44         : DecodeSubPacket(pipeline, *hwInterface), m_hevcPipeline(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_hcpInterface  = hwInterface->GetHcpInterface();
52         }
53     }
54     virtual ~HevcDecodePicPktXe_M_Base();
55 
56     //!
57     //! \brief  Initialize the media packet, allocate required resources
58     //! \return MOS_STATUS
59     //!         MOS_STATUS_SUCCESS if success, else fail reason
60     //!
61     virtual MOS_STATUS Init() override;
62 
63     //!
64     //! \brief  Prepare interal parameters, should be invoked for each frame
65     //! \return MOS_STATUS
66     //!         MOS_STATUS_SUCCESS if success, else fail reason
67     //!
68     virtual MOS_STATUS Prepare() override;
69 
70     //! \brief   Set current phase for packet
71     //!
72     //! \return   MOS_STATUS
73     //!           MOS_STATUS_SUCCESS if success, else fail reason
74     //!
75     MOS_STATUS SetPhase(DecodePhase *phase);
76 
77     //! \brief   Store cabac stream out size to memory
78     //!
79     //! \return   MOS_STATUS
80     //!           MOS_STATUS_SUCCESS if success, else fail reason
81     //!
82     MOS_STATUS ReportCabacStreamOutSize(MOS_COMMAND_BUFFER &cmdBuffer);
83 
84     //!
85     //! \brief  Execute hevc picture packet
86     //! \return MOS_STATUS
87     //!         MOS_STATUS_SUCCESS if success, else fail reason
88     //!
89     virtual MOS_STATUS Execute(MOS_COMMAND_BUFFER& cmdBuffer) = 0;
90 
91 protected:
92 
93     virtual MOS_STATUS AllocateFixedResources();
94     virtual MOS_STATUS AllocateVariableResources();
95 
96     virtual MOS_STATUS SetHcpDstSurfaceParams(MHW_VDBOX_SURFACE_PARAMS &dstSurfaceParams);
97     virtual MOS_STATUS SetHcpRefSurfaceParams(
98         const MHW_VDBOX_PIPE_BUF_ADDR_PARAMS &pipeBufAddrParams, MHW_VDBOX_SURFACE_PARAMS &refSurfaceParams);
99     virtual MOS_STATUS AddHcpSurfaces(MOS_COMMAND_BUFFER &cmdBuffer, const MHW_VDBOX_PIPE_BUF_ADDR_PARAMS &pipeBufAddrParams);
100 
101     MOS_STATUS         FixHcpPipeBufAddrParams(MHW_VDBOX_PIPE_BUF_ADDR_PARAMS &pipeBufAddrParams);
102     virtual MOS_STATUS SetHcpPipeBufAddrParams(MHW_VDBOX_PIPE_BUF_ADDR_PARAMS &pipeBufAddrParams);
103 
104     virtual MOS_STATUS AddHcpIndObjBaseAddrCmd(MOS_COMMAND_BUFFER &cmdBuffer);
105     virtual void       SetHcpIndObjBaseAddrParams(MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS &indObjBaseAddrParams);
106 
107     virtual MOS_STATUS AddHcpQmStateCmd(MOS_COMMAND_BUFFER &cmdBuffer);
108     virtual void       SetHcpQmStateParams(MHW_VDBOX_QM_PARAMS &qmParams);
109 
110     virtual void       SetHcpPipeModeSelectParams(MHW_VDBOX_PIPE_MODE_SELECT_PARAMS &vdboxPipeModeSelectParams);
111     virtual MOS_STATUS AddHcpPipeModeSelectCmd(MOS_COMMAND_BUFFER &cmdBuffer) = 0;
112 
113     virtual void       SetHcpPicStateParams(MHW_VDBOX_HEVC_PIC_STATE &picStateParams);
114 
115     virtual void       SetHcpTileStateParams(MHW_VDBOX_HEVC_TILE_STATE& tileStateParams);
116     virtual MOS_STATUS AddHcpTileStateCmd(MOS_COMMAND_BUFFER &cmdBuffer);
117 
118     //! \brief    Set Rowstore Cache offset
119     //!
120     //! \return   MOS_STATUS
121     //!           MOS_STATUS_SUCCESS if success, else fail reason
122     //!
123     virtual MOS_STATUS SetRowstoreCachingOffsets();
124 
125     virtual bool       IsRealTilePhase();
126     virtual bool       IsFrontEndPhase();
127     virtual bool       IsBackEndPhase();
128 
129     //!
130     //! \brief  Free resources
131     //! \return MOS_STATUS
132     //!         MOS_STATUS_SUCCESS if success, else fail reason
133     //!
134     MOS_STATUS FreeResources();
135 
136 #if USE_CODECHAL_DEBUG_TOOL
137     MOS_STATUS DumpResources(
138         MHW_VDBOX_PIPE_BUF_ADDR_PARAMS &pipeBufAddrParams,
139         uint8_t                         activeRefListSize,
140         uint32_t                        mvBufferSize);
141 #endif
142 
143     static constexpr uint32_t sliceStateCachelinesPerSlice = 9;
144 
145     HevcPipeline          *m_hevcPipeline     = nullptr;
146     MhwVdboxHcpInterface  *m_hcpInterface     = nullptr;
147     HevcBasicFeature      *m_hevcBasicFeature = nullptr;
148     DecodeAllocator       *m_allocator        = nullptr;
149 
150 #ifdef _MMC_SUPPORTED
151     DecodeMemComp         *m_mmcState         = nullptr;
152 #endif
153 
154 #ifdef _DECODE_PROCESSING_SUPPORTED
155     DecodeDownSamplingFeature *m_downSamplingFeature = nullptr;
156     DecodeDownSamplingPkt     *m_downSamplingPkt     = nullptr;
157 #endif
158 
159     DecodePhase           *m_phase            = nullptr;
160 
161     // Parameters passed from application
162     PCODEC_HEVC_PIC_PARAMS          m_hevcPicParams      = nullptr; //!< Pointer to picture parameter
163     PCODECHAL_HEVC_IQ_MATRIX_PARAMS m_hevcIqMatrixParams = nullptr; //!< Pointer to IQ matrix parameter
164     PCODEC_HEVC_EXT_PIC_PARAMS      m_hevcRextPicParams  = nullptr; //!< Extended pic params for Rext
165     PCODEC_HEVC_SCC_PIC_PARAMS      m_hevcSccPicParams   = nullptr; //!< Pic params for SCC
166 
167     CodechalHwInterface *m_hwInterface = nullptr;
168     MhwMiInterface      *m_miInterface = nullptr;
169 
170     PMOS_BUFFER m_resMfdDeblockingFilterRowStoreScratchBuffer    = nullptr; //!< Handle of MFD Deblocking Filter Row Store Scratch data surface
171     PMOS_BUFFER m_resDeblockingFilterTileRowStoreScratchBuffer   = nullptr; //!< Handle of Deblocking Filter Tile Row Store Scratch data surface
172     PMOS_BUFFER m_resDeblockingFilterColumnRowStoreScratchBuffer = nullptr; //!< Handle of Deblocking Filter Column Row Store Scratch data surface
173     PMOS_BUFFER m_resMetadataLineBuffer                          = nullptr; //!< Handle of Metadata Line data buffer
174     PMOS_BUFFER m_resMetadataTileLineBuffer                      = nullptr; //!< Handle of Metadata Tile Line data buffer
175     PMOS_BUFFER m_resMetadataTileColumnBuffer                    = nullptr; //!< Handle of Metadata Tile Column data buffer
176     PMOS_BUFFER m_resSaoLineBuffer                               = nullptr; //!< Handle of SAO Line data buffer
177     PMOS_BUFFER m_resSaoTileLineBuffer                           = nullptr; //!< Handle of SAO Tile Line data buffer
178     PMOS_BUFFER m_resSaoTileColumnBuffer                         = nullptr; //!< Handle of SAO Tile Column data buffer
179 
180     PMOS_BUFFER m_resSliceStateStreamOutBuffer                   = nullptr; //!< Handle of slice state stream out buffer
181     PMOS_BUFFER m_resMvUpRightColStoreBuffer                     = nullptr; //!< Handle of MV up right column store buffer
182     PMOS_BUFFER m_resIntraPredUpRightColStoreBuffer              = nullptr; //!< Handle of intra prediction up right column store buffer
183     PMOS_BUFFER m_resIntraPredLeftReconColStoreBuffer            = nullptr; //!< Handle of intra prediction left recon column store buffer
184     PMOS_BUFFER m_resCABACSyntaxStreamOutBuffer                  = nullptr; //!< Handle of CABAC syntax stream out buffer
185     PMOS_BUFFER m_resCABACStreamOutSizeBuffer                    = nullptr; //!< Handle of CABAC stream out size buffer
186 MEDIA_CLASS_DEFINE_END(decode__HevcDecodePicPktXe_M_Base)
187 };
188 
189 }  // namespace decode
190 #endif
191