1 /*
2 * Copyright (c) 2020, 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_tile_packet_m12.h
24 //! \brief    Defines the implementation of hevc decode tile coding packet for M12
25 //!
26 
27 #ifndef __DECODE_HEVC_TILE_PACKET_M12_H__
28 #define __DECODE_HEVC_TILE_PACKET_M12_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 "mhw_vdbox_hcp_g12_X.h"
35 #include "mhw_mi_g12_X.h"
36 #include "codechal_hw.h"
37 
38 namespace decode
39 {
40 
41 class HevcDecodeTilePktM12 : public DecodeSubPacket
42 {
43 public:
HevcDecodeTilePktM12(HevcPipeline * pipeline,CodechalHwInterface * hwInterface)44     HevcDecodeTilePktM12(HevcPipeline *pipeline, CodechalHwInterface *hwInterface)
45         : DecodeSubPacket(pipeline, *hwInterface), m_hevcPipeline(pipeline)
46     {
47         m_hwInterface = hwInterface;
48         if (m_hwInterface != nullptr)
49         {
50             m_miInterface  = m_hwInterface->GetMiInterface();
51             m_osInterface  = m_hwInterface->GetOsInterface();
52             m_hcpInterface = dynamic_cast<MhwVdboxHcpInterfaceG12 *>(hwInterface->GetHcpInterface());
53         }
54     }
55     virtual ~HevcDecodeTilePktM12();
56 
57     //!
58     //! \brief  Initialize the media packet, allocate required resources
59     //! \return MOS_STATUS
60     //!         MOS_STATUS_SUCCESS if success, else fail reason
61     //!
62     virtual MOS_STATUS Init() override;
63 
64     //!
65     //! \brief  Prepare interal parameters, should be invoked for each frame
66     //! \return MOS_STATUS
67     //!         MOS_STATUS_SUCCESS if success, else fail reason
68     //!
69     virtual MOS_STATUS Prepare() override;
70 
71     //!
72     //! \brief  Execute hevc tile packet for real tile
73     //! \param  [in] cmdBuffer
74     //!         Commnd buffer to program
75     //! \param  [in] tileX
76     //!         Tile X offset of slice
77     //! \param  [in] tileY
78     //!         Tile Y offset of slice
79     //! \return MOS_STATUS
80     //!         MOS_STATUS_SUCCESS if success, else fail reason
81     //!
82     virtual MOS_STATUS Execute(MOS_COMMAND_BUFFER& cmdBuffer, uint16_t tileX, uint16_t tileY);
83 
84     //!
85     //! \brief  Execute hevc tile packet for virtual tile
86     //! \param  [in] cmdBuffer
87     //!         Commnd buffer to program
88     //! \param  [in] virtualTileIdx
89     //!         The index of virtual tile
90     //! \return MOS_STATUS
91     //!         MOS_STATUS_SUCCESS if success, else fail reason
92     //!
93     virtual MOS_STATUS Execute(MOS_COMMAND_BUFFER& cmdBuffer, uint8_t virtualTileIdx);
94 
95     //!
96     //! \brief  Calculate Command Size
97     //!
98     //! \param  [in, out] commandBufferSize
99     //!         requested size
100     //! \param  [in, out] requestedPatchListSize
101     //!         requested size
102     //! \return MOS_STATUS
103     //!         status
104     //!
105     MOS_STATUS CalculateCommandSize(
106         uint32_t &commandBufferSize,
107         uint32_t &requestedPatchListSize) override;
108 
109 protected:
110     virtual MOS_STATUS SetHcpTileCodingParams(MHW_VDBOX_HCP_TILE_CODING_PARAMS_G12 &tileCodingParams,
111                                               uint16_t tileX, uint16_t tileY);
112 
113     virtual MOS_STATUS AddHcpTileCoding(MOS_COMMAND_BUFFER &cmdBuffer, uint16_t tileX, uint16_t tileY);
114 
115     virtual MOS_STATUS SetHcpTileCodingParams(MHW_VDBOX_HCP_TILE_CODING_PARAMS_G12 &tileCodingParams,
116                                               uint8_t virtualTileIdx);
117 
118     virtual MOS_STATUS AddHcpTileCoding(MOS_COMMAND_BUFFER &cmdBuffer, uint8_t virtualTileIdx);
119 
120     static constexpr uint32_t m_virtualTileMaxNum = 8; //!< The max num of virtual tile
121 
122     HevcPipeline *            m_hevcPipeline     = nullptr; //!< Pointer to hevc pipeline
123     MhwVdboxHcpInterfaceG12 * m_hcpInterface     = nullptr; //!< Pointer to hcp hw interface
124     HevcBasicFeature *        m_hevcBasicFeature = nullptr; //!< Pointer to hevc basic feature
125     PCODEC_HEVC_PIC_PARAMS    m_hevcPicParams    = nullptr; //!< Pointer to picture parameter
126     CodechalHwInterface      *m_hwInterface      = nullptr;
127     MhwMiInterface           *m_miInterface      = nullptr;
128 #if (_DEBUG || _RELEASE_INTERNAL)
129     uint32_t                  m_dbgOvrdWidthInMinCb = 0; //!< debug override for picture width in min ctb
130 #endif
131 MEDIA_CLASS_DEFINE_END(decode__HevcDecodeTilePktM12)
132 };
133 
134 }  // namespace decode
135 #endif
136