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_huc_s2l_xe_m_base_packet.h
24 //! \brief    Defines the implementation of huc S2L packet
25 //!
26 
27 #ifndef __DECODE_HUC_S2L_XE_M_BASE_PACKET_H__
28 #define __DECODE_HUC_S2L_XE_M_BASE_PACKET_H__
29 
30 #include "media_cmd_packet.h"
31 #include "decode_huc_g12_base.h"
32 #include "media_pipeline.h"
33 #include "codechal_hw.h"
34 #include "decode_utils.h"
35 #include "decode_hevc_pipeline.h"
36 #include "decode_hevc_basic_feature.h"
37 
38 namespace decode
39 {
40     struct HucHevcS2lPicBssXe_M_Base
41     {
42         uint32_t    pic_width_in_min_cbs_y;
43         uint32_t    pic_height_in_min_cbs_y;
44         uint8_t     log2_min_luma_coding_block_size_minus3;
45         uint8_t     log2_diff_max_min_luma_coding_block_size;
46         uint16_t    chroma_format_idc                           : 2;  //!< range 0..3
47         uint16_t    separate_colour_plane_flag                  : 1;
48         uint16_t    bit_depth_luma_minus8                       : 4;
49         uint16_t    bit_depth_chroma_minus8                     : 4;
50         uint16_t    log2_max_pic_order_cnt_lsb_minus4           : 4;  //!< range 0..12
51         uint16_t    sample_adaptive_offset_enabled_flag         : 1;
52         uint8_t     num_short_term_ref_pic_sets;                      //!< range 0..64
53         uint8_t     long_term_ref_pics_present_flag             : 1;
54         uint8_t     num_long_term_ref_pics_sps                  : 6;  //!< range 0..32
55         uint8_t     sps_temporal_mvp_enable_flag                : 1;
56 
57         uint8_t     num_ref_idx_l0_default_active_minus1        : 4;  //!< range 0..15
58         uint8_t     num_ref_idx_l1_default_active_minus1        : 4;  //!< range 0..15
59         int8_t      pic_init_qp_minus26;                              //!< range -62..25
60         uint8_t     dependent_slice_segments_enabled_flag       : 1;
61         uint8_t     cabac_init_present_flag                     : 1;
62         uint8_t     pps_slice_chroma_qp_offsets_present_flag    : 1;
63         uint8_t     weighted_pred_flag                          : 1;
64         uint8_t     weighted_bipred_flag                        : 1;
65         uint8_t     output_flag_present_flag                    : 1;
66         uint8_t     tiles_enabled_flag                          : 1;
67         uint8_t     entropy_coding_sync_enabled_flag            : 1;
68         uint8_t     loop_filter_across_slices_enabled_flag      : 1;
69         uint8_t     deblocking_filter_override_enabled_flag     : 1;
70         uint8_t     pic_disable_deblocking_filter_flag          : 1;
71         uint8_t     lists_modification_present_flag             : 1;
72         uint8_t     slice_segment_header_extension_present_flag : 1;
73         uint8_t     high_precision_offsets_enabled_flag         : 1;
74         uint8_t     chroma_qp_offset_list_enabled_flag          : 1;
75         uint8_t                                                 : 1;
76 
77         int32_t     CurrPicOrderCntVal;
78         int32_t     PicOrderCntValList[CODEC_MAX_NUM_REF_FRAME_HEVC];
79         uint8_t     RefPicSetStCurrBefore[8];
80         uint8_t     RefPicSetStCurrAfter[8];
81         uint8_t     RefPicSetLtCurr[8];
82         uint16_t    RefFieldPicFlag;
83         uint16_t    RefBottomFieldFlag;
84         int8_t      pps_beta_offset_div2;
85         int8_t      pps_tc_offset_div2;
86         uint16_t    StRPSBits;
87 
88         uint8_t     num_tile_columns_minus1;
89         uint8_t     num_tile_rows_minus1;
90         uint16_t    column_width[HEVC_NUM_MAX_TILE_COLUMN];
91         uint16_t    row_height[HEVC_NUM_MAX_TILE_ROW];
92 
93         uint16_t    NumSlices;
94         uint8_t     num_extra_slice_header_bits;
95         int8_t      RefIdxMapping[CODEC_MAX_NUM_REF_FRAME_HEVC];
96 
97         struct
98         {
99             uint8_t     reserve_0;
100             uint16_t    reserve_1;
101             uint32_t    reserve_2;
102             uint32_t    reserve_3;
103         } reserve;
104     };
105 
106     struct HucHevcS2lSliceBssXe_M_Base
107     {
108         uint32_t    BSNALunitDataLocation;
109         uint32_t    SliceBytesInBuffer;
110 
111         struct
112         {
113             uint32_t    reserve_0;
114             uint32_t    reserve_1;
115             uint32_t    reserve_2;
116             uint32_t    reserve_3;
117         } reserve;
118     };
119 
120     class HucS2lPktXe_M_Base : public DecodeHucBasic_G12_Base
121     {
122     public:
HucS2lPktXe_M_Base(MediaPipeline * pipeline,MediaTask * task,CodechalHwInterface * hwInterface)123         HucS2lPktXe_M_Base(MediaPipeline *pipeline, MediaTask *task, CodechalHwInterface *hwInterface)
124             : DecodeHucBasic_G12_Base(pipeline, task, hwInterface)
125         {
126             if (pipeline != nullptr)
127             {
128                 m_statusReport = pipeline->GetStatusReportInstance();
129                 m_hevcPipeline = dynamic_cast<HevcPipeline *>(pipeline);
130             }
131         }
132 
~HucS2lPktXe_M_Base()133         virtual ~HucS2lPktXe_M_Base() {}
134 
135         //!
136         //! \brief  Initialize the media packet, allocate required resources
137         //! \return MOS_STATUS
138         //!         MOS_STATUS_SUCCESS if success, else fail reason
139         //!
140         virtual MOS_STATUS Init() override;
141 
142         //!
143         //! \brief  Prepare interal parameters, should be invoked for each frame
144         //! \return MOS_STATUS
145         //!         MOS_STATUS_SUCCESS if success, else fail reason
146         //!
147         virtual MOS_STATUS Prepare() override;
148 
149         //!
150         //! \brief  Calculate Command Size
151         //!
152         //! \param  [in, out] commandBufferSize
153         //!         requested size
154         //! \param  [in, out] requestedPatchListSize
155         //!         requested size
156         //! \return MOS_STATUS
157         //!         status
158         //!
159         virtual MOS_STATUS CalculateCommandSize(
160             uint32_t &commandBufferSize,
161             uint32_t &requestedPatchListSize) override;
162 
163         //!
164         //! \brief  Get Packet Name
165         //! \return std::string
166         //!
GetPacketName()167         virtual std::string GetPacketName() override
168         {
169             return "S2L";
170         }
171 
172     protected:
173         //!
174         //! \brief  Calculate Command Buffer Size
175         //!
176         //! \return uint32_t
177         //!         Command buffer size calculated
178         //!
179         virtual uint32_t CalculateCommandBufferSize();
180 
181         //!
182         //! \brief  Calculate Patch List Size
183         //!
184         //! \return uint32_t
185         //!         Patchlist size calculated
186         //!
187         virtual uint32_t CalculatePatchListSize();
188 
189         virtual void       SetImemParameters(MHW_VDBOX_HUC_IMEM_STATE_PARAMS &imemParams) override;
190         virtual MOS_STATUS AddHucImem(MOS_COMMAND_BUFFER &cmdBuffer) override;
191 
192         virtual void       SetHucPipeModeSelectParameters(MHW_VDBOX_PIPE_MODE_SELECT_PARAMS &pipeModeSelectParams) override;
193 
194         virtual void       SetDmemParameters(MHW_VDBOX_HUC_DMEM_STATE_PARAMS &dmemParams) override;
195         virtual MOS_STATUS AddHucDmem(MOS_COMMAND_BUFFER &cmdBuffer) override;
196 
197         virtual void       SetRegionParameters(MHW_VDBOX_HUC_VIRTUAL_ADDR_PARAMS &virtualAddrParams) override;
198         virtual MOS_STATUS AddHucRegion(MOS_COMMAND_BUFFER &cmdBuffer) override;
199 
200         virtual void       SetIndObjParameters(MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS &indObjParams) override;
201         virtual MOS_STATUS AddHucIndObj(MOS_COMMAND_BUFFER &cmdBuffer) override;
202 
203         virtual void       SetStreamObjectParameters(MHW_VDBOX_HUC_STREAM_OBJ_PARAMS &streamObjParams,
204                                                      CODEC_HEVC_SLICE_PARAMS &sliceParams) override;
205         virtual MOS_STATUS AddHucStreamObject(MOS_COMMAND_BUFFER &cmdBuffer, CODEC_HEVC_SLICE_PARAMS &sliceParams) override;
206 
207         virtual MOS_STATUS SetHucDmemPictureBss(HucHevcS2lPicBssXe_M_Base &hucHevcS2LPicBss);
208         virtual MOS_STATUS SetHucDmemSliceBss(
209             HucHevcS2lSliceBssXe_M_Base (&hucHevcS2LSliceBss)[CODECHAL_HEVC_MAX_NUM_SLICES_LVL_6]);
210         MOS_STATUS AddHucCpState(MOS_COMMAND_BUFFER &cmdBuffer, uint32_t index, CODEC_HEVC_SLICE_PARAMS &sliceParams);
211 
212 #if USE_CODECHAL_DEBUG_TOOL
213         virtual MOS_STATUS DumpHucS2l();
214 #endif
215 
216         static constexpr uint32_t m_vdboxHucHevcS2lKernelDescriptor = 1; //!< Huc HEVC S2L kernel descriptor
217 
218         HevcPipeline *             m_hevcPipeline      = nullptr; //!< Pointer to hevc pipeline
219         HevcBasicFeature *         m_hevcBasicFeature  = nullptr; //!< Pointer to hevc basic feature
220         PCODEC_HEVC_PIC_PARAMS     m_hevcPicParams     = nullptr; //!< Pointer to picture parameter
221         PCODEC_HEVC_EXT_PIC_PARAMS m_hevcRextPicParams = nullptr; //!< Extended pic params for Rext
222         PCODEC_HEVC_SLICE_PARAMS   m_hevcSliceParams   = nullptr; //!< Pointer to slice parameter
223         PCODEC_HEVC_SCC_PIC_PARAMS m_hevcSccPicParams  = nullptr; //!< Pic params for SCC
224 
225         MOS_BUFFER*                m_s2lDmemBuffer     = nullptr; //!< Resource of current DMEM buffer
226         uint32_t                   m_dmemBufferSize    = 0;       //!< Size of DMEM buffer
227         uint32_t                   m_dmemTransferSize  = 0;       //!< Transfer size of current DMEM buffer
228 
229         uint32_t                   m_pictureStatesSize    = 0;
230         uint32_t                   m_picturePatchListSize = 0;
231         uint32_t                   m_sliceStatesSize      = 0;
232         uint32_t                   m_slicePatchListSize   = 0;
233     };
234 
235 }  // namespace decode
236 #endif
237