xref: /aosp_15_r20/external/intel-media-driver/media_driver/agnostic/common/codec/hal/codechal_vdenc_hevc.h (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2017, 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_hevc.h
24 //! \brief    Defines base class for HEVC VDEnc encoder.
25 //!
26 
27 #ifndef __CODECHAL_VDENC_HEVC_H__
28 #define __CODECHAL_VDENC_HEVC_H__
29 
30 #include "codechal_encode_hevc_base.h"
31 #include "codechal_mmc_encode_hevc.h"
32 #include "codechal_huc_cmd_initializer.h"
33 
34 //!
35 //! \struct    CodechalVdencHevcPakInfo
36 //! \brief     Codechal Vdenc HEVC Pak info
37 //!
38 struct CodechalVdencHevcPakInfo
39 {
40     uint32_t  FrameByteCount;
41     uint8_t   PAKPassNum;
42 };
43 
44 using pCodechalVdencHevcPakInfo = CodechalVdencHevcPakInfo*;
45 
46 //!
47 //! \struct    CodechalVdencHevcLaStats
48 //! \brief     Codechal Vdenc HEVC lookahead info for BRC
49 //!
50 struct CodechalVdencHevcLaStats
51 {
52     uint32_t  sad;
53     uint32_t  frameByteCount;
54     uint32_t  headerBitCount;
55     uint32_t  intraCuCount;
56     uint32_t  reserved[4];
57 };
58 
59 //!
60 //! \struct    CodechalVdencHevcLaData
61 //! \brief     Codechal encode lookahead analysis output data structure
62 //!
63 struct CodechalVdencHevcLaData
64 {
65     uint32_t reserved0[1];
66     uint32_t targetFrameSize;
67     uint32_t targetBufferFulness;
68     uint32_t reserved1[2];
69     union
70     {
71         struct
72         {
73             uint32_t cqmHint    : 8;  //!< Custom quantization matrix hint. 0x00 - flat matrix; 0x01 - CQM; 0xFF - invalid hint; other values are reserved.
74             uint32_t reserved2  : 24;
75         };
76         uint32_t encodeHints;
77     };
78     uint32_t pyramidDeltaQP;
79     uint8_t  adaptive_rounding;
80     uint8_t  miniGopSize;
81     uint32_t reserved3[8];
82 };
83 
84 //!
85 //! \struct    DeltaQpForROI
86 //! \brief     This struct is defined for BRC Update HUC kernel
87 //!            region 10 - Delta Qp for ROI Buffer
88 //!
89 struct DeltaQpForROI
90 {
91     int8_t    iDeltaQp;
92 };
93 
94 using PDeltaQpForROI = DeltaQpForROI*;
95 
96 //!
97 //! \struct    CodechalVdencHevcLaDmem
98 //! \brief     This struct is defined for Lookahead HUC kernel DMEM
99 //!
100 struct CodechalVdencHevcLaDmem
101 {
102     uint32_t lookAheadFunc;       // 0: init, 1 update
103     // for Init, valid only when lookAheadFunc = 0
104     uint32_t lengthAhead;         // in the units of frames
105     uint32_t vbvBufferSize;       // in the units of frames
106     uint32_t vbvInitialFullness;  // in the units of frames
107     uint32_t cuCount;             // normalized 8x8 CU count
108     uint32_t statsRecords;        // # of statistic records
109     uint32_t avgFrameSizeInByte;  // in the units of bytes
110     uint16_t minGop;
111     uint16_t maxGop;
112     uint16_t BGop;
113     uint16_t AGop;
114     uint16_t AGop_Threshold;
115     uint16_t PGop;
116     uint8_t  downscaleRatio;     // 0-no scale, 1-2x, 2-4x
117     uint8_t  isIframeInsideBGOP;
118     uint8_t  adaptiveIDR;
119     uint8_t  GopOpt;  //0 open GOP, 1 close GOP, 2 strict GOP
120     uint32_t mbr_ratio;
121     uint8_t  la_dump_type;
122     uint8_t  codec_type;
123     uint8_t  RSVD[2];
124     uint32_t enc_frame_width;
125     uint32_t enc_frame_height;
126     uint8_t  RSVD1[4];
127     // for Update, valid only when lookAheadFunc = 1
128     uint32_t validStatsRecords;  // # of valid stats records
129     uint32_t offset;             // offset in unit of entries
130     uint8_t  cqmQpThreshold;     // QP threshold for CQM enable/disable. If estimated QP > CQM_QP_threshold, kernel set HUC_LOOKAHEAD_DATA.enableCQM to 1.
131     uint8_t  currentPass;
132     uint8_t  RSVD2[54];
133 };
134 
135 using PCodechalVdencHevcLaDmem = CodechalVdencHevcLaDmem *;
136 
137 //!
138 //! \class    CodechalVdencHevcState
139 //! \brief    HEVC VDEnc encoder base class
140 //! \details    This class defines the base class for HEVC VDEnc encoder, it includes
141 //!        common member fields, functions, interfaces etc shared by all GENs.
142 //!        Gen specific definitions, features should be put into their corresponding classes.
143 //!
144 class CodechalVdencHevcState : public CodechalEncodeHevcBase
145 {
146 public:
147     //!
148     //! \struct    HevcVdencBrcBuffers
149     //! \brief     Hevc Vdenc brc buffers
150     //!
151     struct HevcVdencBrcBuffers
152     {
153         MOS_RESOURCE                        resBrcPakStatisticBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM];
154         uint32_t                            uiCurrBrcPakStasIdxForRead;
155         uint32_t                            uiCurrBrcPakStasIdxForWrite;
156     };
157 
158     static constexpr uint8_t                m_numMaxVdencL0Ref = 3;                   //!< Max number of reference frame list0
159     static constexpr uint8_t                m_numMaxVdencL1Ref = 3;                   //!< Max number of reference frame list1
160     static constexpr uint32_t               m_brcPakStatsBufSize = 512;               //!< Pak statistic buffer size
161     static constexpr uint32_t               m_brcStatsBufSize = 1216;                 //!< BRC Statistic buf size: 48DWs (3CLs) of HMDC Frame Stats + 256 DWs (16CLs) of Histogram Stats = 1216 bytes
162     static constexpr uint32_t               m_brcHistoryBufSize = 6080;              //!< BRC history buffer size
163     static constexpr uint32_t               m_brcDebugBufSize = 0x1000;               //!< BRC debug buffer size
164     static constexpr uint32_t               m_LaHistoryBufSize = 8192;                //!< Lookahead history buffer size
165     static constexpr uint32_t               m_weightHistSize = 1024;                  //!< Weight Histogram (part of VDEnc Statistic): 256 DWs (16CLs) of Histogram Stats = 1024
166     static constexpr uint32_t               m_roiStreamInBufferSize = 65536 * CODECHAL_CACHELINE_SIZE; //!< ROI Streamin buffer size (part of BRC Update)
167     static constexpr uint32_t               m_deltaQpBufferSize = 65536;              //!< DeltaQp buffer size (part of BRC Update)
168     static constexpr uint32_t               m_brcLooaheadStatsBufferSize = m_numLaDataEntry * sizeof(CodechalVdencHevcLaStats); //!< Lookahead statistics buffer size
169     static constexpr uint32_t               m_brcLooaheadDataBufferSize = m_numLaDataEntry * sizeof(CodechalVdencHevcLaData); //!< Lookahead data buffer size
170     static constexpr uint32_t               m_vdboxHucHevcBrcInitKernelDescriptor = 8;//!< Huc HEVC Brc init kernel descriptor
171     static constexpr uint32_t               m_vdboxHucHevcBrcUpdateKernelDescriptor = 9;//!< Huc HEVC Brc update kernel descriptor
172     static constexpr uint32_t               m_vdboxHucHevcBrcLowdelayKernelDescriptor = 10;//!< Huc HEVC Brc low delay kernel descriptor
173     static constexpr uint32_t               m_vdboxHucHevcLaAnalysisKernelDescriptor = 16;//!< Huc lookahead analysis kernel descriptor
174 
175     //!< \cond SKIP_DOXYGEN
176     // HuC tables
177     // Note: These const values are same for all Gen now.
178     // In case they become diff later, then need to move declaration to each Gen's derived class
179     static const uint8_t                    m_estRateThreshP0[7];
180     static const uint8_t                    m_estRateThreshB0[7];
181     static const uint8_t                    m_estRateThreshI0[7];
182     static const int8_t                     m_instRateThreshP0[4];
183     static const int8_t                     m_instRateThreshB0[4];
184     static const int8_t                     m_instRateThreshI0[4];
185     static const uint16_t                   m_startGAdjFrame[4];
186     static const uint8_t                    m_startGAdjMult[5];
187     static const uint8_t                    m_startGAdjDiv[5];
188     static const uint8_t                    m_rateRatioThreshold[7];
189     static const uint8_t                    m_rateRatioThresholdQP[8];
190     static const uint32_t                   m_hucModeCostsIFrame[364];
191     static const uint32_t                   m_hucModeCostsPbFrame[364];
192     static const uint16_t                   m_sadQpLambdaI[52];
193     static const uint16_t                   m_sadQpLambdaI_VQI[52];
194     static const uint16_t                   m_sadQpLambdaP[52];
195     static const uint16_t                   m_rdQpLambdaI[52];
196     static const uint16_t                   m_rdQpLambdaP[52];
197     static const uint8_t                    m_penaltyForIntraNonDC32x32PredMode[52];
198     static const uint8_t                    m_penaltyForIntraNonDC32x32PredMode_VQI[52];
199     //! \endcond
200 
201     bool                                    m_hevcVdencAcqpEnabled = false;                    //!< ACQP enable flag
202     bool                                    m_hevcRdoqAdaptationEnabled = false;               //!< RDOQ adaptation enable flag
203     bool                                    m_hevcVdencRoundingEnabled = false;                //!< Rounding enable flag
204     bool                                    m_vdencPakObjCmdStreamOutEnabled = false;          //!< Pakobj stream out enable flag
205     bool                                    m_vdencHucUsed = false;                            //!< HUC usage flag
206     bool                                    m_hevcVdencWeightedPredEnabled = false;            //!< Weighted pred enable flag
207     bool                                    m_vdencHuCConditional2ndPass = false;              //!< HuC conditional 2nd pass enable flag
208     bool                                    m_vdencNativeROIEnabled = false;                   //!< Native ROI enable flag
209     bool                                    m_pakOnlyPass = false;                             //!< flag to signal VDEnc+PAK vs. PAK only
210     bool                                    m_hevcVisualQualityImprovement = false;            //!< VQI enable flag
211     bool                                    m_enableMotionAdaptive = false;                    //!< Motion adaptive enable flag
212     bool                                    m_brcAdaptiveRegionBoostSupported = false;         //!< ARB in BRC mode supported flag.
213     bool                                    m_brcAdaptiveRegionBoostEnable = false;            //!< ARB in BRC mode enable flag.
214 
215     //Resources for VDEnc
216     MOS_RESOURCE                            m_sliceCountBuffer;                                //!< Slice count buffer
217     MOS_RESOURCE                            m_vdencModeTimerBuffer;                            //!< VDEnc mode timer buffer
218     MOS_RESOURCE                            m_resSliceReport[CODECHAL_ENCODE_STATUS_NUM];      //!< Slice size report buffer to be saved across passes
219     uint8_t                                 m_maxNumROI = CODECHAL_ENCODE_HEVC_MAX_NUM_ROI;    //!< VDEnc maximum number of ROI supported
220     uint8_t                                 m_maxNumNativeROI = ENCODE_VDENC_HEVC_MAX_STREAMINROI_G10;  //!< Number of native ROI supported by VDEnc HW
221     uint8_t                                 m_imgStateImePredictors = 8;                       //!< Number of predictors for IME
222     uint32_t                                m_currGopIFramePOC = -1;                           //!< PoC for I frame in current GoP
223 
224     // BRC
225     HevcVdencBrcBuffers                     m_vdencBrcBuffers = {};                                 //!< VDEnc Brc buffers
226     MOS_RESOURCE                            m_dataFromPicsBuffer = {};                              //!< Data Buffer of Current and Reference Pictures for Weighted Prediction
227     MOS_RESOURCE                            m_vdencDeltaQpBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM] = {};                              //!< VDEnc delta QP buffer
228     MOS_RESOURCE                            m_vdencOutputROIStreaminBuffer = {};                    //!< VDEnc Output ROI Streamin Buffer
229     MOS_RESOURCE                            m_vdencBrcUpdateDmemBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM][CODECHAL_VDENC_BRC_NUM_OF_PASSES_FOR_TILE_REPLAY] = {};  //!< VDEnc BrcUpdate DMEM buffer
230     MOS_RESOURCE                            m_vdencBrcInitDmemBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM] = {};                          //!< VDEnc BrcInit DMEM buffer
231     MOS_RESOURCE                            m_vdencBrcConstDataBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM] = {};                         //!< VDEnc brc constant data buffer
232     MOS_RESOURCE                            m_vdencBrcHistoryBuffer = {};                           //!< VDEnc brc history buffer
233     MOS_RESOURCE                            m_vdencReadBatchBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM][CODECHAL_VDENC_BRC_NUM_OF_PASSES] = {};  //!< VDEnc read batch buffer
234     MOS_RESOURCE                            m_vdencGroup3BatchBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM][CODECHAL_VDENC_BRC_NUM_OF_PASSES] = {};  //!< VDEnc read batch buffer for Group3
235     MOS_RESOURCE                            m_vdencBrcDbgBuffer = {};                               //!< VDEnc brc debug buffer
236     uint32_t                                m_deltaQpRoiBufferSize = 0;                            //!< VDEnc DeltaQp for ROI buffer size
237     uint32_t                                m_brcRoiBufferSize = 0;                                //!< BRC ROI input buffer size
238     MHW_VDBOX_HUC_VIRTUAL_ADDR_PARAMS       m_virtualAddrParams = {};                              //!< BRC virtual address parameter
239 
240     // Batch Buffer for VDEnc
241     MHW_BATCH_BUFFER                        m_vdenc2ndLevelBatchBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM] = {};  //!< VDEnc 2nd level batch buffer
242     uint32_t                                m_vdenc2ndLevelBatchBufferSize[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM] = {0};
243     uint32_t                                m_vdencBatchBufferPerSliceVarSize[ENCODE_HEVC_VDENC_NUM_MAX_SLICES] = { 0 };    //!< VDEnc batch buffer slice size array
244     uint32_t                                m_1stPakInsertObjectCmdSize = 0;                   //!< Size of 1st PAK_INSERT_OBJ cmd
245     uint32_t                                m_hcpWeightOffsetStateCmdSize = 0;                 //!< Size of HCP_WEIGHT_OFFSET_STATE cmd
246     uint32_t                                m_hcpSliceStateCmdSize = 0;                        //!< Size of HCP_SLICE_STATE cmd
247     uint32_t                                m_vdencWeightOffsetStateCmdSize = 0;               //!< Size of VDENC_WEIGHT_OFFSET_STATE cmd
248     uint32_t                                m_miBatchBufferEndCmdSize = 0;                     //!< Size of MI_BATCH_BUFFER_END cmd
249     uint32_t                                m_picStateCmdStartInBytes = 0;                     //!< Offset of PIC_STATE cmd in batch buffer
250     uint32_t                                m_cmd2StartInBytes = 0;
251     uint32_t                                m_vdencBrcInitDmemBufferSize = 0;                  //!< Offset of BRC init DMEM buffer
252     uint32_t                                m_vdencBrcUpdateDmemBufferSize = 0;                //!< Offset of BRC update DMEM buffer
253     uint32_t                                m_vdencBrcConstDataBufferSize = 0;                 //!< Offset of BRC const data buffer
254     unsigned char                           m_virtualEngineBbIndex = 0;                        //!< Virtual engine batch buffer index
255 
256     // Tile related
257     uint32_t                                m_maxTileNumber = 1;                               //!< max tile number, equal to 1 for Gen10
258 
259     PCODECHAL_CMD_INITIALIZER               m_hucCmdInitializer = nullptr;
260 
261     MOS_RESOURCE                            m_resDelayMinus = {0};
262     uint32_t                                m_numDelay = 0;
263 
264     // Lookahead
265     MOS_RESOURCE                            m_vdencLaStatsBuffer;                              //!< VDEnc statistics buffer for lookahead
266     MOS_RESOURCE                            m_vdencLaDataBuffer;                               //!< lookahead data buffer, output of lookahead analysis
267     MOS_RESOURCE                            m_vdencLaInitDmemBuffer = {};                           //!< VDEnc Lookahead Init DMEM buffer
268     MOS_RESOURCE                            m_vdencLaUpdateDmemBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM][CODECHAL_LPLA_NUM_OF_PASSES] = {};  //!< VDEnc Lookahead Update DMEM buffer
269     MOS_RESOURCE                            m_vdencLaHistoryBuffer = {};                            //!< VDEnc lookahead history buffer
270     bool                                    m_lookaheadPass = false;                           //!< Indicate if current pass is lookahead pass or encode pass
271     bool                                    m_lookaheadInit = true;                            //!< Lookahead init flag
272     bool                                    m_lookaheadReport = false;                         //!< Lookahead report valid flag
273     bool                                    m_lookaheadAdaptiveI = false;                      //!< Adaptive I flag for lookahead
274     uint32_t                                m_vdencLaInitDmemBufferSize = 0;                   //!< Offset of Lookahead init DMEM buffer
275     uint32_t                                m_vdencLaUpdateDmemBufferSize = 0;                 //!< Offset of Lookahead update DMEM buffer
276     uint32_t                                m_numValidLaRecords = 0;                           //!< Number of valid lookahead records
277     uint32_t                                m_intraInterval = 0;                               //!< Frame count since last I frame
278     int32_t                                 m_bufferFulnessError = 0;                          //!< VBV buffer fulness error between unit of bits (used by driver) and unit of frame (used by LA analsis kernel)
279     uint8_t                                 m_cqmQpThreshold = 40;                             //!< QP threshold for CQM enable/disable. Used by lookahead analysis kernel.
280     HMODULE                                 m_swLaMode = nullptr;                              //!< Software lookahead analysis mode
281 
282 protected:
283     //!
284     //! \brief    Constructor
285     //!
286     CodechalVdencHevcState(CodechalHwInterface* hwInterface,
287         CodechalDebugInterface* debugInterface,
288         PCODECHAL_STANDARD_INFO standardInfo);
289 
290 public:
291     //!
292     //! \brief    Destructor
293     //!
~CodechalVdencHevcState()294     virtual ~CodechalVdencHevcState() {};
295 
296     //!
297     //! \brief    Setup ROI stream-in resource for BRC and ACQP mode
298     //!
299     //! \param    [in,out] streamIn
300     //!           Pointer to ROI stream-in resource
301     //! \param    [in,out] deltaQpBuffer
302     //!           Pointer to ROI DeltaQp buffer
303     //!
304     //! \return   MOS_STATUS
305     //!           MOS_STATUS_SUCCESS if success, else fail reason
306     //!
307     virtual MOS_STATUS SetupBRCROIStreamIn(PMOS_RESOURCE streamIn, PMOS_RESOURCE deltaQpBuffer);
308 
309     //!
310     //! \brief    Setup ROI stream-in resource for CQP mode
311     //!
312     //! \param    [in,out] streamIn
313     //!           Pointer to ROI stream-in resource
314     //!
315     //! \return   MOS_STATUS
316     //!           MOS_STATUS_SUCCESS if success, else fail reason
317     //!
318     virtual MOS_STATUS SetupROIStreamIn(PMOS_RESOURCE streamIn);
319     //!
320     //! \brief    Setup mb Qp stream-in resource
321     //!
322     //! \param    [in,out] streamIn
323     //!           Pointer to mb Qp stream-in resource
324     //!
325     //! \return   MOS_STATUS
326     //!           MOS_STATUS_SUCCESS if success, else fail reason
327     //!
328     virtual MOS_STATUS SetupMbQpStreamIn(PMOS_RESOURCE streamIn);
329 
330     //!
331     //! \brief    Setup dirty rectangle stream-in resource
332     //!
333     //! \param    [in,out] streamIn
334     //!           Pointer to dirty rectangle stream-in resource
335     //!
336     //! \return   MOS_STATUS
337     //!           MOS_STATUS_SUCCESS if success, else fail reason
338     //!
339     virtual MOS_STATUS SetupDirtyRectStreamIn(PMOS_RESOURCE streamIn);
340 
341     //!
342     //! \brief    Prepare VDEnc stream-in data
343     //!
344     //! \return   MOS_STATUS
345     //!           MOS_STATUS_SUCCESS if success, else fail reason
346     //!
347     virtual MOS_STATUS PrepareVDEncStreamInData();
348 
349     //!
350     //! \brief    Setup stream-in data per region
351     //!
352     //! \param    [in] streamInWidth, top, bottom, left, right
353     //!                streamInWidth, region corner locations,
354     //! \param    [in] streaminParams
355     //!                 pointer to MHW_VDBOX_VDENC_STREAMIN_STATE_PARAMS
356     //! \param    [out] streaminData
357     //!                 pointer to streaminData
358     //!
359     //! \return   void
360     //!
361     virtual void SetStreaminDataPerRegion(
362         uint32_t streamInWidth,
363         uint32_t top,
364         uint32_t bottom,
365         uint32_t left,
366         uint32_t right,
367         PMHW_VDBOX_VDENC_STREAMIN_STATE_PARAMS streaminParams,
368         void* streaminData);
369 
370     //!
371     //! \brief    Setup stream-in data per region
372     //!
373     //! \param    [in] streamInWidth, top, bottom, left, right
374     //!                streamInWidth, region corner locations
375     //! \param    [in] regionId
376     //!                region ID
377     //! \param    [out] deltaQpMap
378     //!                pointer to DeltaQpForROI
379     //!
380     //! \return   void
381     //!
382     virtual void SetBrcRoiDeltaQpMap(
383         uint32_t streamInWidth,
384         uint32_t top,
385         uint32_t bottom,
386         uint32_t left,
387         uint32_t right,
388         uint8_t regionId,
389         PDeltaQpForROI deltaQpMap);
390 
391     //!
392     //! \brief    Setup stream-in surface for a dirty rectangle
393     //!
394     //! \param    [in] streamInWidth, top, bottom, left, right, maxcu
395     //!           StreamInWidth, dirtyRect corner locations, maxCuSize
396     //! \param    [out] streaminData
397     //!           Pointer to streaminData
398     //!
399     //! \return   void
400     //!
401     virtual void StreaminSetDirtyRectRegion(
402         uint32_t streamInWidth,
403         uint32_t top,
404         uint32_t bottom,
405         uint32_t left,
406         uint32_t right,
407         uint8_t  maxcu,
408         void* streaminData);
409 
410     //!
411     //! \brief    Calculate X/Y offsets for zigzag scan within 64 LCU
412     //!
413     //! \param    [in] streamInWidth
414     //!           StreamInWidth, location of top left corner
415     //! \param    [in] x
416     //!           Position X
417     //! \param    [in] y
418     //!           Position Y
419     //! \param    [out] offset
420     //!           Offsets into the stream-in surface
421     //! \param    [out] xyOffset
422     //!           XY Offsets into the stream-in surface
423     //!
424     //! \return   void
425     //!
426     virtual void StreaminZigZagToLinearMap(
427         uint32_t streamInWidth,
428         uint32_t x,
429         uint32_t y,
430         uint32_t* offset,
431         uint32_t* xyOffset);
432 
433     //!
434     //! \brief    Setup stream-in for border of non-64 aligned region
435     //!
436     //! \param    [in] streamInWidth, top, bottom, left, right
437     //!           StreamInWidth, dirtyRect corner locations
438     //! \param    [out] streaminData
439     //!           Pointer to streaminData
440     //!
441     //! \return   void
442     //!
443     virtual void StreaminSetBorderNon64AlignStaticRegion(
444         uint32_t streamInWidth,
445         uint32_t top,
446         uint32_t bottom,
447         uint32_t left,
448         uint32_t right,
449         void* streaminData);
450 
451     //!
452     //! \brief    Write out stream-in data for each LCU
453     //!
454     //! \param    [in] streaminParams
455     //!           Params to write into stream in surface
456     //! \param    [out] streaminData
457     //!           Pointer to streaminData
458     //!
459     //! \return   void
460     //!
SetStreaminDataPerLcu(PMHW_VDBOX_VDENC_STREAMIN_STATE_PARAMS streaminParams,void * streaminData)461     virtual void SetStreaminDataPerLcu(
462         PMHW_VDBOX_VDENC_STREAMIN_STATE_PARAMS streaminParams,
463         void* streaminData)
464     {
465         return;
466     }
467 
468     //!
469     //! \brief    Add commands in input SLB buffer for HuC Initializer CQP
470     //!
471     //! \param    [in,out] batchBuffer
472     //!           Pointer to SLB buffer which commands are added
473     //!
474     //! \return   MOS_STATUS
475     //!           MOS_STATUS_SUCCESS if success, else fail reason
476     //!
ConstructBatchBufferHuCCQP(PMOS_RESOURCE batchBuffer)477     virtual MOS_STATUS ConstructBatchBufferHuCCQP(PMOS_RESOURCE batchBuffer)
478     {
479         return MOS_STATUS_SUCCESS;
480     }
481 
482     //!
483     //! \brief    Add commands in input SLB buffer for HuC BRC (including ACQP)
484     //!
485     //! \param    [in,out] batchBuffer
486     //!           Pointer to SLB buffer which commands are added
487     //!
488     //! \return   MOS_STATUS
489     //!           MOS_STATUS_SUCCESS if success, else fail reason
490     //!
ConstructBatchBufferHuCBRC(PMOS_RESOURCE batchBuffer)491     virtual MOS_STATUS ConstructBatchBufferHuCBRC(PMOS_RESOURCE batchBuffer)
492     {
493         return MOS_STATUS_SUCCESS;
494     }
495 
496     //!
497     //! \brief    Setup DMEM for HuC BRC init/reset
498     //!
499     //! \return   MOS_STATUS
500     //!           MOS_STATUS_SUCCESS if success, else fail reason
501     //!
SetDmemHuCBrcInitReset()502     virtual MOS_STATUS SetDmemHuCBrcInitReset()
503     {
504         return MOS_STATUS_SUCCESS;
505     }
506 
507     //!
508     //! \brief    Setup constant data for HuC BRC update
509     //!
510     //! \return   MOS_STATUS
511     //!           MOS_STATUS_SUCCESS if success, else fail reason
512     //!
SetConstDataHuCBrcUpdate()513     virtual MOS_STATUS SetConstDataHuCBrcUpdate()
514     {
515         return MOS_STATUS_SUCCESS;
516     }
517 
518     //!
519     //! \brief    Setup DMEM for HuC BRC update
520     //!
521     //! \return   MOS_STATUS
522     //!           MOS_STATUS_SUCCESS if success, else fail reason
523     //!
SetDmemHuCBrcUpdate()524     virtual MOS_STATUS SetDmemHuCBrcUpdate()
525     {
526         return MOS_STATUS_SUCCESS;
527     }
528 
529     //!
530     //! \brief    Setup Virtual Address Regions for HuC BRC update
531     //!
532     //! \param    [in] virtualAddrParams
533     //!           Huc Virtual Address parameters
534     //!
535     //! \return   MOS_STATUS
536     //!           MOS_STATUS_SUCCESS if success, else fail reason
537     //!
538     virtual MOS_STATUS SetRegionsHuCBrcUpdate(PMHW_VDBOX_HUC_VIRTUAL_ADDR_PARAMS virtualAddrParams);
539 
540     // HCP/PAK functions
541 
542     //!
543     //! \brief    Set VDENC_PIPE_MODE_SELECT parameters
544     //!
545     //! \param    [in, out] pipeModeSelectParams
546     //!           Pipe mode select parameters
547     //!
548     //! \return   void
549     //!
550     virtual void SetVdencPipeModeSelectParams(
551         MHW_VDBOX_PIPE_MODE_SELECT_PARAMS& pipeModeSelectParams);
552 
553     //!
554     //! \brief    Set VDENC_SRC_SURFACE_STATE, VDENC_REF_SURFACE_STATE and
555     //!           VDENC_DS_REF_SURFACE_STATE parameters
556     //!
557     //! \param    [in, out] srcSurfaceParams
558     //!           Source picture surface parameters
559     //! \param    [in, out] reconSurfaceParams
560     //!           Recon picture surface parameters
561     //! \param    [in, out] ds8xSurfaceParams
562     //!           8x Down scaled reference surface parameters
563     //! \param    [in, out] ds4xSurfaceParams
564     //!           4x Down scaled reference surface parameters
565     //!
566     //! \return   void
567     //!
568     virtual void SetVdencSurfaceStateParams(
569         MHW_VDBOX_SURFACE_PARAMS& srcSurfaceParams,
570         MHW_VDBOX_SURFACE_PARAMS& reconSurfaceParams,
571         MHW_VDBOX_SURFACE_PARAMS& ds8xSurfaceParams,
572         MHW_VDBOX_SURFACE_PARAMS& ds4xSurfaceParams);
573 
574     //!
575     //! \brief    Set VDENC_PIPE_BUF_ADDR parameters
576     //!
577     //! \param    [in, out] PipeBufAddrParams
578     //!           Pipe buf addr parameters
579     //!
580     //! \return   void
581     //!
582     virtual void SetVdencPipeBufAddrParams(
583         MHW_VDBOX_PIPE_BUF_ADDR_PARAMS& PipeBufAddrParams);
584 
585     //!
586     //! \brief    Add HCP_WEIGHT_OFFSET_STATE command to command buffer
587     //!
588     //! \param    [in, out] cmdBuffer
589     //!           Pointer to the command buffer
590     //! \param    [in] hevcSlcParams
591     //!           Pointer to HEVC slice parameters
592     //!
593     //! \return   MOS_STATUS
594     //!           MOS_STATUS_SUCCESS if success, else fail reason
595     //!
596     virtual MOS_STATUS AddHcpWeightOffsetStateCmd(
597         PMOS_COMMAND_BUFFER cmdBuffer,
598         PCODEC_HEVC_ENCODE_SLICE_PARAMS hevcSlcParams);
599 
600     //!
601     //! \brief    Add VDENC_WEIGHT_OFFSET_STATE command to command buffer
602     //!
603     //! \param    [in, out] cmdBuffer
604     //!           Pointer to the command buffer
605     //! \param    [in] hevcSlcParams
606     //!           Pointer to HEVC slice parameters
607     //!
608     //! \return   MOS_STATUS
609     //!           MOS_STATUS_SUCCESS if success, else fail reason
610     //!
611     virtual MOS_STATUS AddVdencWeightOffsetStateCmd(
612         PMOS_COMMAND_BUFFER cmdBuffer,
613         PCODEC_HEVC_ENCODE_SLICE_PARAMS hevcSlcParams);
614 
615     //!
616     //! \brief    Add VDENC_WALKER_STATE commands to command buffer
617     //!
618     //! \param    [in, out] cmdBuffer
619     //!           Pointer to the command buffer
620     //! \param    [in] params
621     //!           Pointer to MHW_VDBOX_HEVC_SLICE_STATE parameters
622     //!
623     //! \return   MOS_STATUS
624     //!           MOS_STATUS_SUCCESS if success, else fail reason
625     //!
626     virtual MOS_STATUS AddVdencWalkerStateCmd(
627         PMOS_COMMAND_BUFFER cmdBuffer,
628         PMHW_VDBOX_HEVC_SLICE_STATE params);
629 
630     //!
631     //! \brief    Read stats for BRC from PAK
632     //!
633     //! \param    [in] cmdBuffer
634     //!            Pointer to command buffer
635     //!
636     //! \return   MOS_STATUS
637     //!           MOS_STATUS_SUCCESS if success, else fail reason
638     //!
639     virtual MOS_STATUS ReadBrcPakStats(PMOS_COMMAND_BUFFER cmdBuffer);
640 
641     //!
642     //! \brief    Read stats from VDEnc and PAK for lookahead
643     //!
644     //! \param    [in] cmdBuffer
645     //!            Pointer to command buffer
646     //!
647     //! \return   MOS_STATUS
648     //!           MOS_STATUS_SUCCESS if success, else fail reason
649     //!
650     virtual MOS_STATUS StoreLookaheadStatistics(PMOS_COMMAND_BUFFER cmdBuffer);
651 
652     //!
653     //! \brief    Read stats from VDEnc for lookahead
654     //!
655     //! \param    [in] cmdBuffer
656     //!            Pointer to command buffer
657     //!
658     //! \return   MOS_STATUS
659     //!           MOS_STATUS_SUCCESS if success, else fail reason
660     //!
661     virtual MOS_STATUS StoreVdencStatistics(PMOS_COMMAND_BUFFER cmdBuffer);
662 
663     //!
664     //! \brief    Read slice size info from PAK
665     //!
666     //! \param    [in] cmdBuffer
667     //!            Pointer to command buffer
668     //!
669     //! \return   MOS_STATUS
670     //!           MOS_STATUS_SUCCESS if success, else fail reason
671     //!
672     virtual MOS_STATUS ReadSliceSize(PMOS_COMMAND_BUFFER cmdBuffer);
673 
674     //! \brief    Copies a page aligned chunk of memory using HuC
675     //!
676     //! \param    [in] cmdBuffer
677     //!           Pointer to command buffer
678     //! \param    [in] Source/ Dest surfaces/ offsets page aligned
679     //!            Pointer to surfaces
680     //! \param    [in] copySize
681     //!            Size in bytes of data to be copied
682     //!
683     //! \return   MOS_STATUS
684     //!           MOS_STATUS_SUCCESS if success, else fail reason
685     //!
686     virtual MOS_STATUS CopyDataBlock(
687         PMOS_COMMAND_BUFFER cmdBuffer,
688         PMOS_RESOURCE sourceSurface,
689         uint32_t sourceOffset,
690         PMOS_RESOURCE destSurface,
691         uint32_t destOffset,
692         uint32_t copySize);
693     //!
694     //! \brief    Get maximal number of slices allowed for specific LevelId
695     //!
696     //! \param    [in] levelIdc
697     //!           Level Id
698     //!
699     //! \return   Maximal number of slices allowed
700     //!
701     uint32_t GetMaxAllowedSlices(uint8_t levelIdc);
702 
703     //!
704     //! \brief    Specify if VDEnc+PAK or Pak only pass is used
705     //!
706     //! \return   void
707     //!
708     void SetPakPassType();
709 
710     //!
711     //! \brief    Invoke HuC BRC init/reset
712     //!
713     //! \return   MOS_STATUS
714     //!           MOS_STATUS_SUCCESS if success, else fail reason
715     //!
716     virtual MOS_STATUS HuCBrcInitReset();
717 
718     //!
719     //! \brief    Invoke HuC BRC update
720     //!
721     //! \return   MOS_STATUS
722     //!           MOS_STATUS_SUCCESS if success, else fail reason
723     //!
724     virtual MOS_STATUS HuCBrcUpdate();
725 
726     //!
727     //! \brief    Use dummy stream object for HuC BRC FW.
728     //!
729     //! \param    [in] cmdBuffer
730     //!           Command Buffer.
731     //!
732     //! \return   MOS_STATUS
733     //!           MOS_STATUS_SUCCESS if success, else fail reason
734     //!
735     MOS_STATUS HuCBrcDummyStreamObject(PMOS_COMMAND_BUFFER cmdBuffer);
736 
737     //!
738     //! \brief    Computer QP initialization value used for BRC
739     //!
740     //! \param    [out] initQPIP
741     //!           QP initialization value for I/P frame
742     //! \param    [out] initQPB
743     //!           QP initialization value for B frame
744     //!
745     //! \return   void
746     //!
747     void ComputeVDEncInitQP(int32_t& initQPIP, int32_t& initQPB);
748 
749     //!
750     //! \brief    Add store HUC_STATUS2 register command in the command buffer
751     //!
752     //! \param    [in] cmdBuffer
753     //!           Pointer to the command buffer
754     //!
755     //! \return   MOS_STATUS
756     //!           MOS_STATUS_SUCCESS if success, else fail reason
757     //!
758     MOS_STATUS StoreHuCStatus2Register(PMOS_COMMAND_BUFFER cmdBuffer);
759 
760     //!
761     //! \brief    Add store HUC_ERROR_STATUS register command in the command buffer
762     //!
763     //! \param    [in] mmioRegisters
764     //!           Pointer to mmio huc register
765     //! \param    [in] cmdBuffer
766     //!           Pointer to the command buffer
767     //! \param    [in] addToEnncodeStatus
768     //!           Flag to indicate whether huc error status will be stored in encode status buffer
769     //!
770     //! \return   MOS_STATUS
771     //!           MOS_STATUS_SUCCESS if success, else fail reason
772     //!
773     MOS_STATUS StoreHucErrorStatus(MmioRegistersHuc* mmioRegisters, PMOS_COMMAND_BUFFER cmdBuffer, bool addToEnncodeStatus);
774 
775     //!
776     //! \brief    Put slice level commands in command buffer
777     //!
778     //! \param    [in] cmdBuffer
779     //!           Pointer to command buffer
780     //! \param    [in] params
781     //!           Pointer to slice state parameters
782     //!
783     //! \return   MOS_STATUS
784     //!           MOS_STATUS_SUCCESS if success, else fail reason
785     //!
786     virtual MOS_STATUS SendHwSliceEncodeCommand(PMOS_COMMAND_BUFFER cmdBuffer, PMHW_VDBOX_HEVC_SLICE_STATE params);
787 
788     //!
789     //! \brief    Sort and set distinct delta QPs
790     //!
791     //! \return   void
792     //!
793     virtual void ProcessRoiDeltaQp();
794 
795     //!
796     //! \brief    Program streamin buffer to force all the CUs to intra
797     //!
798     //! \param    [in] streamIn
799     //!           Pointer to streamin buffer
800     MOS_STATUS SetupForceIntraStreamIn(PMOS_RESOURCE streamIn);
801 
802     //! \brief    Set VDENC StreamIn Surface for BRC Adaptive Region Boost
803     //!
804     //! \param    [in] vdencStreamIn
805     //!           StreamIn Surface Resource.
806     //! \param    [in] boostIndex
807     //!           Region index for boosting.
808     //!
809     //! \return   MOS_STATUS
810     //!           MOS_STATUS_SUCCESS if success, else fail reason
811     //!
812     virtual MOS_STATUS SetupRegionBoosting(
813         PMOS_RESOURCE                vdencStreamIn,
814         uint16_t                     boostIndex);
815 
816     // Inherited virtual function
817     MOS_STATUS Initialize(CodechalSetting * settings)  override;
818     MOS_STATUS AllocatePakResources() override;
819     MOS_STATUS FreePakResources() override;
820     MOS_STATUS AllocateEncResources() override;
821     MOS_STATUS FreeEncResources() override;
822     MOS_STATUS AllocateBrcResources() override;
823     MOS_STATUS FreeBrcResources() override;
824     MOS_STATUS InitializePicture(const EncoderParams& params) override;
825     MOS_STATUS SetSequenceStructs() override;
826     MOS_STATUS SetPictureStructs() override;
827     MOS_STATUS CalcScaledDimensions() override;
828     MOS_STATUS ValidateRefFrameData(PCODEC_HEVC_ENCODE_SLICE_PARAMS slcParams) override;
829     MOS_STATUS ExecutePictureLevel() override;
830     MOS_STATUS ExecuteSliceLevel() override;
831     MOS_STATUS ReadHcpStatus(PMOS_COMMAND_BUFFER cmdBuffer) override;
832     MOS_STATUS UserFeatureKeyReport() override;
833     MOS_STATUS GetStatusReport(
834         EncodeStatus *encodeStatus,
835         EncodeStatusReport *encodeStatusReport) override;
836     void SetHcpSliceStateCommonParams(MHW_VDBOX_HEVC_SLICE_STATE& sliceStateParams) override;
837     MOS_STATUS AddHcpPakInsertSliceHeader(
838         PMOS_COMMAND_BUFFER cmdBuffer,
839         PMHW_BATCH_BUFFER batchBuffer,
840         PMHW_VDBOX_HEVC_SLICE_STATE params) override;
841 
842     MOS_STATUS PrepareHWMetaData(PMOS_COMMAND_BUFFER cmdBuffer);
843 
844 #if USE_CODECHAL_DEBUG_TOOL
845     virtual MOS_STATUS DumpHucBrcInit();
846     virtual MOS_STATUS DumpHucBrcUpdate(bool isInput);
847     virtual MOS_STATUS DumpVdencOutputs();
848 
849     //!
850     //! \brief  Modify the frame size with fake header size
851     //!
852     //! \param  [in] cmdBuffer
853     //!         command buffer
854     //! \param  [in] fakeHeaderSizeInByte
855     //!         fake header size in bytes
856     //! \param  [in] resBrcUpdateCurbe
857     //!         Curebe/Dmem for brcupdate kernel
858     //! \param  [in] targetSizePos
859     //!         offset of targetSize in resBrcUpdateCurbe
860     //! \param  [in] resPakStat
861     //!         Pak stastics
862     //! \param  [in] slcHrdSizePos
863     //!         offset of slcHrdSizePos in resPakStat
864     //!
865     //! \return MOS_STATUS
866     //!           MOS_STATUS_SUCCESS if success, else fail reason
867     //!
868     MOS_STATUS ModifyEncodedFrameSizeWithFakeHeaderSize(
869         PMOS_COMMAND_BUFFER                 cmdBuffer,
870         uint32_t                            fakeHeaderSizeInByte,
871         PMOS_RESOURCE                       resBrcUpdateCurbe,
872         uint32_t                            targetSizePos,
873         PMOS_RESOURCE                       resPakStat,
874         uint32_t                            slcHrdSizePos);
875 #endif
876 
877 };
878 
879 //! typedef of class CodechalVdencHevcState*
880 using PCODECHAL_VDENC_HEVC_STATE = class CodechalVdencHevcState*;
881 
882 #endif  // __CODECHAL_VDENC_HEVC_H__
883