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     encode_preenc_basic_feature.h
24 //! \brief    Defines the common interface for encode preenc basic feature
25 //!
26 #ifndef __ENCODE_PREENC_BASIC_FEATURE_H__
27 #define __ENCODE_PREENC_BASIC_FEATURE_H__
28 
29 #include "encode_basic_feature.h"
30 #include "codec_def_encode_hevc.h"
31 #include "encode_hevc_dfs.h"
32 #include "mhw_vdbox_vdenc_itf.h"
33 #include "mhw_vdbox_hcp_itf.h"
34 #include "encode_mem_compression.h"
35 #include "encode_preenc_const_settings.h"
36 #include "codechal_debug.h"
37 #include "encode_preenc_defs.h"
38 #if _MEDIA_RESERVED
39 #include "encode_preenc_basic_feature_ext.h"
40 #endif // _MEDIA_RESERVED
41 
42 namespace encode
43 {
44 class PreEncBasicFeature : public EncodeBasicFeature, public mhw::vdbox::vdenc::Itf::ParSetting, public mhw::vdbox::hcp::Itf::ParSetting
45 {
46 public:
47     PreEncBasicFeature(MediaFeatureManager *featureManager,
48         EncodeAllocator *                   allocator,
49         CodechalHwInterfaceNext *               hwInterface,
50         TrackedBuffer *                     trackedBuf,
51         RecycleResource *                   recycleBuf,
EncodeBasicFeature(allocator,hwInterface,trackedBuf,recycleBuf)52         void *                              constSettings = nullptr) : EncodeBasicFeature(allocator, hwInterface, trackedBuf, recycleBuf)
53     {
54         m_hcpItf = std::static_pointer_cast<mhw::vdbox::hcp::Itf>(hwInterface->GetHcpInterfaceNext());
55         ENCODE_CHK_NULL_NO_STATUS_RETURN(m_hcpItf);
56         m_preEncConstSettings = MOS_New(EncodePreEncConstSettings);
57     };
58 
59     virtual ~PreEncBasicFeature();
60 
GetProfileLevelMaxFrameSize()61     virtual uint32_t GetProfileLevelMaxFrameSize() override { return 0; };
62 
63     virtual MOS_STATUS Init(void *setting) override;
64 
65     virtual MOS_STATUS Update(void *params) override;
66 
GetRefList()67     PCODEC_REF_LIST *GetRefList() { return m_preEncConfig.RefList; };
68 
GetRefIdxMapping()69     int8_t *GetRefIdxMapping() { return m_refIdxMapping; };
70 
GetPictureCodingType()71     uint16_t GetPictureCodingType() { return m_pictureCodingType; };
72 
IsLowDelay()73     bool IsLowDelay() const { return m_lowDelay; };
74 
75     virtual MOS_STATUS CalculatePreEncInfo(uint32_t width, uint32_t height, PreEncInfo &preEncInfo);
76 
77     virtual MOS_STATUS GetPreEncInfo(PreEncInfo &preEncInfo);
78 
79     MOS_STATUS EncodePreencBasicFuntion0(PMOS_RESOURCE& Buffer0, PMOS_RESOURCE& Buffer1);
80 
IsEnabled(bool & enabled)81     virtual MOS_STATUS IsEnabled(bool &enabled)
82     {
83         enabled = m_enabled;
84         return MOS_STATUS_SUCCESS;
85     }
86 
GetEncodeMode(uint32_t & encodeMode)87     MOS_STATUS GetEncodeMode(uint32_t &encodeMode)
88     {
89         encodeMode = m_encodeMode;
90         return MOS_STATUS_SUCCESS;
91     }
92 
93 #if USE_CODECHAL_DEBUG_TOOL
94     MOS_STATUS EncodePreencBasicFuntion1();
95 
96     FILE *pfile0 = nullptr;
97     FILE *pfile1 = nullptr;
98 #endif
99 
100     MHW_SETPAR_DECL_HDR(VDENC_PIPE_MODE_SELECT);
101 
102     MHW_SETPAR_DECL_HDR(VDENC_SRC_SURFACE_STATE);
103 
104     MHW_SETPAR_DECL_HDR(VDENC_REF_SURFACE_STATE);
105 
106     MHW_SETPAR_DECL_HDR(VDENC_DS_REF_SURFACE_STATE);
107 
108     MHW_SETPAR_DECL_HDR(VDENC_PIPE_BUF_ADDR_STATE);
109 
110     MHW_SETPAR_DECL_HDR(VDENC_CMD1);
111 
112     MHW_SETPAR_DECL_HDR(VDENC_CMD2);
113 
114     MHW_SETPAR_DECL_HDR(VDENC_WALKER_STATE);
115 
116     MHW_SETPAR_DECL_HDR(VDENC_HEVC_VP9_TILE_SLICE_STATE);
117 
118     MHW_SETPAR_DECL_HDR(VDENC_WEIGHTSOFFSETS_STATE);
119 
120     MHW_SETPAR_DECL_HDR(HCP_PIC_STATE);
121 
122     MHW_SETPAR_DECL_HDR(HEVC_VP9_RDOQ_STATE);
123 
124     MHW_SETPAR_DECL_HDR(HCP_PIPE_BUF_ADDR_STATE);
125 
126     MHW_SETPAR_DECL_HDR(HCP_PIPE_MODE_SELECT);
127 
128     MHW_SETPAR_DECL_HDR(HCP_SLICE_STATE);
129 
130     MHW_SETPAR_DECL_HDR(HCP_SURFACE_STATE);
131 
132     EncodeMemComp *m_mmcState = nullptr;
133 
134     static constexpr uint32_t m_maxLCUSize = 64;  //!< Max LCU size 64
135 
136     CODECHAL_HEVC_IQ_MATRIX_PARAMS m_hevcIqMatrixParams = {};  //!< Pointer to IQ matrix parameter
137 
138     CODEC_PRE_ENC_PARAMS m_preEncConfig = {};
139 
140     PMOS_SURFACE m_rawDsSurface     = nullptr;
141     PMOS_SURFACE m_preEncRawSurface = nullptr;
142 
143 protected:
144     virtual MOS_STATUS PreparePreEncConfig(void *params) = 0;
145 
146     bool IsCurrentUsedAsRef(uint8_t idx) const;
147 
148     virtual MOS_STATUS UpdateTrackedBufferParameters() override;
149     virtual MOS_STATUS GetTrackedBuffers() override;
150     virtual MOS_STATUS AllocateResources() override;
151     virtual MOS_STATUS GetRecycleBuffers();
152     virtual MOS_STATUS InitPreEncSize();
153 
154     MOS_STATUS SetSliceStructs();
155     MOS_STATUS SetPictureStructs();
156     MOS_STATUS ValidateLowDelayBFrame();
157     MOS_STATUS ValidateSameRefInL0L1();
158 
159     int8_t          m_refIdxMapping[CODEC_MAX_NUM_REF_FRAME_HEVC]     = {};       //!< Reference Index mapping
160     bool            m_currUsedRefPic[CODEC_MAX_NUM_REF_FRAME_HEVC]    = {};       //!< Reference picture usage array
161     bool            m_lowDelay                                        = false;    //!< Low delay flag
162     bool            m_sameRefList                                     = false;    //!< Flag to specify if ref list L0 and L1 are same
163     PreEncInfo      m_preEncInfo                                      = {};
164 
165     //Deblocking
166     bool          m_SliceDeblockingFilterDisabled                  = false;
167     uint32_t      m_SliceTcOffsetDiv2                              = 0;
168     uint32_t      m_SliceBettaOffsetDiv2                           = 0;
169     PMOS_RESOURCE m_resDeblockingFilterTileRowStoreScratchBuffer   = nullptr;  //!< De-blocking filter tile row store Scratch data buffer
170     PMOS_RESOURCE m_resDeblockingFilterColumnRowStoreScratchBuffer = nullptr;  //!< De-blocking filter column row Store scratch data buffer
171     PMOS_RESOURCE m_resDeblockingFilterRowStoreScratchBuffer       = nullptr;  //!< Handle of De-block row store surface
172 
173     uint32_t rawCTUBits = 0;
174     uint8_t  m_QP       = 22;
175 
176     uint32_t m_encodeMode             = 0;
177     uint8_t  EncodePreencBasicMember0 = 0;
178     uint8_t  EncodePreencBasicMember1 = 0;
179     uint32_t EncodePreencBasicMember2 = 0;
180     uint8_t  EncodePreencBasicMember5 = 0;
181     uint8_t  EncodePreencBasicMember6 = 0;
182     uint32_t m_preEncSrcWidth         = 0;
183     uint32_t m_preEncSrcHeight        = 0;
184 
185     PMOS_RESOURCE EncodePreencBasicMember3 = nullptr;
186     PMOS_RESOURCE EncodePreencBasicMember4 = nullptr;
187 
188     EncodePreEncConstSettings *m_preEncConstSettings = nullptr;
189 
190     std::shared_ptr<mhw::vdbox::hcp::Itf> m_hcpItf = nullptr;
191 
192     MEDIA_CLASS_DEFINE_END(encode__PreEncBasicFeature)
193 };
194 }  // namespace encode
195 
196 #endif  // !__ENCODE_PREENC_BASIC_FEATURE_H__
197