1 /*
2 * Copyright (c) 2017-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     codechal_vdenc_avc_g12.h
24 //! \brief    This file defines the base C++ class/interface for G12 AVC VDENC
25 //!           encoding to be used across CODECHAL components.
26 //!
27 
28 #ifndef __CODECHAL_VDENC_AVC_G12_H__
29 #define __CODECHAL_VDENC_AVC_G12_H__
30 
31 #include "codechal_vdenc_avc.h"
32 #include "codechal_encode_singlepipe_virtualengine.h"
33 
34 class CodechalVdencAvcStateG12 : public CodechalVdencAvcState
35 {
36    public:
37     uint8_t m_qpModulationStrength = 0;       //!< Current QP modulation strength
38     bool m_isFirstDeltaQP = true;              //!< check if it is first time
39 
40     PCODECHAL_ENCODE_SINGLEPIPE_VIRTUALENGINE_STATE m_sinlgePipeVeState;  //!< single pipe virtual engine state
41     //!
42     //! \brief    Constructor
43     //!
44     CodechalVdencAvcStateG12(
45         CodechalHwInterface *   hwInterface,
46         CodechalDebugInterface *debugInterface,
47         PCODECHAL_STANDARD_INFO standardInfo);
48 
49     //!
50     //! \brief    Destructor
51     //!
52     virtual ~CodechalVdencAvcStateG12();
53 
54     bool CheckSupportedFormat(PMOS_SURFACE surface) override;
AdjustNumRefIdx(uint32_t & numRefIdxL0Minus1,uint32_t & numRefIdxL1Minus1)55     virtual void AdjustNumRefIdx(uint32_t &numRefIdxL0Minus1, uint32_t &numRefIdxL1Minus1)
56     {
57         numRefIdxL0Minus1 = m_avcSliceParams->num_ref_idx_l0_active_minus1;
58         numRefIdxL1Minus1 = m_avcSliceParams->num_ref_idx_l1_active_minus1;
59     }
60 
61     virtual void InitializeDataMember() override;
62 
63     MOS_STATUS InitializeState() override;
64 
65     virtual MOS_STATUS AllocateResources() override;
66 
67     MOS_STATUS SetSequenceStructs() override;
68 
69     MOS_STATUS SetPictureStructs() override;
70 
71     MOS_STATUS ExecutePictureLevel() override;
72 
73     MOS_STATUS GetTrellisQuantization(
74         PCODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS params,
75         PCODECHAL_ENCODE_AVC_TQ_PARAMS       trellisQuantParams) override;
76 
77     virtual MOS_STATUS AddHucOutputRegistersHandling(
78         MmioRegistersHuc* mmioRegisters,
79         PMOS_COMMAND_BUFFER cmdBuffer,
80         bool                addToEncodeStatus) override;
81 
82     virtual MOS_STATUS InsertConditionalBBEndWithHucErrorStatus(PMOS_COMMAND_BUFFER cmdBuffer);
83 
HuCBrcDummyStreamObject(PMOS_COMMAND_BUFFER cmdBuffer)84     MOS_STATUS HuCBrcDummyStreamObject(PMOS_COMMAND_BUFFER cmdBuffer) override { return MOS_STATUS_SUCCESS; }
85 
86     MOS_STATUS SetDmemHuCBrcInitReset() override;
87 
88     virtual MOS_STATUS DeltaQPUpdate(uint8_t QpModulationStrength);
89 
90     MOS_STATUS SetDmemHuCBrcUpdate() override;
91 
92     MOS_STATUS LoadMvCost(uint8_t qp) override;
93 
94     MOS_STATUS LoadHmeMvCost(uint8_t qp) override;
95 
96     MOS_STATUS LoadHmeMvCostTable(
97         PCODEC_AVC_ENCODE_SEQUENCE_PARAMS seqParams,
98         uint8_t                           hmeMvCostTable[8][42]) override;
99 
100     MOS_STATUS SubmitCommandBuffer(
101         PMOS_COMMAND_BUFFER cmdBuffer,
102         bool             bNullRendering) override;
103 
104     MOS_STATUS InitKernelStateSFD() override;
105 
106     MOS_STATUS Initialize(CodechalSetting * settings) override;
107 
108     virtual bool ProcessRoiDeltaQp() override;
109 
110     virtual bool IsMBBRCControlEnabled() override;
111 
112     MOS_STATUS AddVdencWalkerStateCmd(
113         PMOS_COMMAND_BUFFER cmdBuffer) override;
114 
115     MOS_STATUS SendPrologWithFrameTracking(
116         PMOS_COMMAND_BUFFER               cmdBuffer,
117         bool                              frameTracking,
118         MHW_MI_MMIOREGISTERS             *mmioRegister = nullptr) override;
119 
120     MOS_STATUS InitMmcState() override;
121 
122     virtual MOS_STATUS CheckResChangeAndCsc() override;
123 
124     //!
125     //! \brief    Create MHW_VDBOX_STATE_CMDSIZE_PARAMS
126     //!
127     //! \return   PMHW_VDBOX_STATE_CMDSIZE_PARAMS
128     //!
129     PMHW_VDBOX_STATE_CMDSIZE_PARAMS CreateMhwVdboxStateCmdsizeParams() override;
130 
131     //!
132     //! \brief    Create PMHW_VDBOX_AVC_IMG_PARAMS.
133     //!
134     //! \return   PMHW_VDBOX_AVC_IMG_PARAMS
135     //!
136     PMHW_VDBOX_AVC_IMG_PARAMS CreateMhwVdboxAvcImgParams() override;
137 
138     //!
139     //! \brief    Create PMHW_VDBOX_VDENC_WALKER_STATE_PARAMS.
140     //!
141     //! \return   PMHW_VDBOX_VDENC_WALKER_STATE_PARAMS
142     //!
143     PMHW_VDBOX_VDENC_WALKER_STATE_PARAMS CreateMhwVdboxVdencWalkerStateParams() override;
144 
145     MOS_STATUS InitKernelStateMe() override;
146 
147     MOS_STATUS ExecuteMeKernel() override;
148 
149     MOS_STATUS UpdateCmdBufAttribute(
150         PMOS_COMMAND_BUFFER cmdBuffer,
151         bool                renderEngineInUse) override;
152 
153     MOS_STATUS AddMediaVfeCmd(
154         PMOS_COMMAND_BUFFER cmdBuffer,
155         SendKernelCmdsParams *params) override;
156 
157     //!
158     //! \brief  Set up params for gpu context creation
159     //! \return   MOS_STATUS
160     //!           MOS_STATUS_SUCCESS if success, else fail reason
161     //!
162     virtual MOS_STATUS SetGpuCtxCreatOption() override;
163     //!
164     //! \brief    Set And Populate VE Hint parameters
165     //! \details  Set Virtual Engine hint parameter and populate it to primary cmd buffer attributes
166     //! \param    [in] cmdBuffer
167     //!               Pointer to primary cmd buffer
168     //! \return   MOS_STATUS
169     //!           MOS_STATUS_SUCCESS if success, else fail reason
170     //!
171     MOS_STATUS  SetAndPopulateVEHintParams(
172         PMOS_COMMAND_BUFFER  cmdBuffer);
173 
174     //!
175     //! \brief    Set VDENC StreamIn QP Surface state
176     //!
177     //! \param    [in] vdencStreamIn
178     //!           StreamIn Surface Resource.
179     //!
180     //! \return   MOS_STATUS
181     //!           MOS_STATUS_SUCCESS if success, else fail reason
182     //!
183     virtual MOS_STATUS SetupMBQPStreamIn(PMOS_RESOURCE vdencStreamIn);
184 
185     //!
186     //! \brief    Encode User Feature Key Report.
187     //! \details  Report user feature values set by encode.
188     //!
189     //! \return   MOS_STATUS
190     //!           MOS_STATUS_SUCCESS if success
191     //!
192     virtual MOS_STATUS UserFeatureKeyReport() override;
193 
194     virtual void SetBufferToStorePakStatistics() override;
195 
196     virtual MOS_STATUS AddMiStoreForHWOutputToHucDmem(PMOS_COMMAND_BUFFER cmdBuffer) override;
197 
198    protected:
199     class SfdCurbe;
200     struct BrcInitDmem;
201     struct BrcUpdateDmem;
202     bool                  m_vdencUltraModeEnable = false;   //!< Enable VDEnc ultra mode
203     bool                  m_forcedTCBRC = false;            //!< TCBRC forced instead of LowDelayBRC
204 
205     MOS_STATUS CalculateVdencCommandsSize() override;
206     virtual void SetMfxAvcImgStateParams(MHW_VDBOX_AVC_IMG_PARAMS& param) override;
207 
208    private:
209     static const uint32_t m_mvCostSkipBiasQPel[3][8];
210     static const uint32_t m_hmeCostDisplayRemote[8][CODEC_AVC_NUM_QP];
211     static const uint32_t m_hmeCost[8][CODEC_AVC_NUM_QP];
212     static const int8_t   m_brcInitDistQpDeltaI8[4];
213     static const int8_t   m_brcInitDistQpDeltaI8LowDelay[4];
214     static const uint32_t m_singlePassMinFrameWidth   = 3840;
215     static const uint32_t m_singlePassMinFrameHeight  = 2160;
216     static const uint32_t m_singlePassMinFramePer100s = 6000;
217     uint8_t* m_pMBQPShadowBuffer = nullptr;
218     uint32_t m_uiMBQPShadowBufferSize = 0;
219 
220     MOS_RESOURCE m_resPakOutputViaMmioBuffer = {}; //!< Buffer for PAK statistics output via MMIO
221 
222 protected:
223 
224     void SetMfxPipeModeSelectParams(
225         const CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS& genericParam,
226         MHW_VDBOX_PIPE_MODE_SELECT_PARAMS& param) override;
227 
228     virtual void CopyMBQPDataToStreamIn(CODECHAL_VDENC_STREAMIN_STATE* pData, uint8_t* pInputData);
229 
GetAdaptiveRoundingNumSlices()230     virtual uint16_t GetAdaptiveRoundingNumSlices() { return 0; }
231 
232 #if USE_CODECHAL_DEBUG_TOOL
233 protected:
234     virtual MOS_STATUS PopulateBrcInitParam(
235         void *cmd) override;
236 
237     virtual MOS_STATUS PopulateBrcUpdateParam(
238         void *cmd) override;
239 
240     virtual MOS_STATUS PopulateEncParam(
241         uint8_t meMethod,
242         void    *cmd) override;
243 
244     virtual MOS_STATUS PopulatePakParam(
245         PMOS_COMMAND_BUFFER cmdBuffer,
246         PMHW_BATCH_BUFFER   secondLevelBatchBuffer) override;
247 
248     virtual MOS_STATUS ModifyEncodedFrameSizeWithFakeHeaderSize( PMOS_COMMAND_BUFFER cmdBuffer) override;
249 
250     MOS_STATUS DumpParsedBRCInitDmem(
251         struct BrcInitDmem* dmem);
252 
253     MOS_STATUS DumpParsedBRCUpdateDmem(
254         struct BrcUpdateDmem* dmem);
255 #endif
256 };
257 
258 #endif  // __CODECHAL_VDENC_AVC_G12_H__
259