1 /*
2 * Copyright (c) 2011-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_encode_avc.h
24 //! \brief    This file defines the base C++ class/interface for AVC DualPipe encoding
25 //!           to be used across CODECHAL components.
26 //!
27 
28 #ifndef __CODECHAL_ENCODE_AVC_H__
29 #define __CODECHAL_ENCODE_AVC_H__
30 
31 #include "codechal_encode_avc_base.h"
32 
33 #define CODECHAL_ENCODE_AVC_MAX_LAMBDA                                  0xEFFF
34 
35 // BRC Block Copy
36 #define CODECHAL_ENCODE_AVC_BRC_COPY_NUM_ROWS_PER_VME_SEND_MSG          8
37 #define CODECHAL_ENCODE_AVC_BRC_COPY_NUM_SEND_MSGS_PER_KERNEL           3
38 #define CODECHAL_ENCODE_AVC_BRC_COPY_BLOCK_WIDTH                        64
39 
40 // SubMbPartMask defined in CURBE for AVC ENC
41 #define CODECHAL_ENCODE_AVC_DISABLE_4X4_SUB_MB_PARTITION                0x40
42 #define CODECHAL_ENCODE_AVC_DISABLE_4X8_SUB_MB_PARTITION                0x20
43 #define CODECHAL_ENCODE_AVC_DISABLE_8X4_SUB_MB_PARTITION                0x10
44 
45 typedef enum _CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_BRC_INIT_RESET
46 {
47     CODECHAL_ENCODE_AVC_BRC_INIT_RESET_HISTORY = 0,
48     CODECHAL_ENCODE_AVC_BRC_INIT_RESET_DISTORTION,
49     CODECHAL_ENCODE_AVC_BRC_INIT_RESET_NUM_SURFACES
50 } CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_BRC_INIT_RESET;
51 
52 typedef enum _CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_BRC_BLOCK_COPY
53 {
54     CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_INPUT = 0,
55     CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_OUTPUT,
56     CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_NUM_SURFACES
57 } CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_BRC_BLOCK_COPY;
58 
59 typedef struct _CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS
60 {
61     PMHW_KERNEL_STATE                       pKernelState;
62     uint32_t                                dwBufferOffset;
63     uint32_t                                dwBlockHeight;
64 } CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS;
65 
66 typedef struct _CODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS
67 {
68     PMOS_INTERFACE                              pOsInterface;
69     PCODEC_AVC_ENCODE_SLICE_PARAMS              pAvcSlcParams;
70     PCODEC_PIC_ID                               pAvcPicIdx;
71     MOS_SURFACE                                 sBrcConstantDataBuffer; // sBrcConstantDataBuffer[uiCurrDSH]
72     uint32_t                                    dwMbEncBlockBasedSkipEn;
73     PCODEC_AVC_ENCODE_PIC_PARAMS                pPicParams;             // pAvcPicParams[ucPPSIdx]
74     uint16_t                                    wPictureCodingType;
75     bool                                        bSkipBiasAdjustmentEnable;
76     bool                                        bAdaptiveIntraScalingEnable;
77     bool                                        bOldModeCostEnable;
78     PCODECHAL_ENCODE_AVC_QUALITY_CTRL_PARAMS    pAvcQCParams;
79 } CODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS, *PCODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS;
80 
81 typedef struct _CODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS
82 {
83     PMOS_RESOURCE                       presBrcHistoryBuffer;
84     PMOS_SURFACE                        psMeBrcDistortionBuffer;
85     uint32_t                            dwMeBrcDistortionBottomFieldOffset;
86     uint32_t                            dwDownscaledWidthInMb4x;
87     uint32_t                            dwDownscaledFrameFieldHeightInMb4x;
88 } CODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS;
89 
90 typedef struct _CODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS
91 {
92     double                                 *pdBrcInitCurrentTargetBufFullInBits;   // Passed back to Render Interface
93     double                                 *pdBrcInitResetInputBitsPerFrame;       // Passed back to Render Interface
94     uint32_t*                               pdwBrcInitResetBufSizeInBits;           // Passed back to Render Interface
95     PMHW_KERNEL_STATE                       pKernelState;
96 } CODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS;
97 
98 typedef struct _CODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS
99 {
100     PMOS_INTERFACE                              pOsInterface;
101     PMOS_RESOURCE                               presBrcConstantDataBuffer;
102     uint32_t                                    dwMbEncBlockBasedSkipEn;
103     PCODEC_AVC_ENCODE_PIC_PARAMS                pPicParams;             // pAvcPicParams[ucPPSIdx]
104     uint16_t                                    wPictureCodingType;
105     bool                                        bSkipBiasAdjustmentEnable;
106     bool                                        bAdaptiveIntraScalingEnable;
107     bool                                        bOldModeCostEnable;
108     bool                                        bPreProcEnable;
109     bool                                        bEnableKernelTrellis;
110     PCODECHAL_ENCODE_AVC_QUALITY_CTRL_PARAMS    pAvcQCParams;
111     uint32_t                                    Lambda[52][2];
112 } CODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS, *PCODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS;
113 
114 typedef struct _CODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS
115 {
116     PCODEC_AVC_ENCODE_SEQUENCE_PARAMS           pSeqParams;
117     PCODEC_AVC_ENCODE_PIC_PARAMS                pPicParams;
118     PCODEC_AVC_ENCODE_SLICE_PARAMS              pSlcParams;
119     PCODEC_REF_LIST                             *ppRefList;
120     PCODEC_PIC_ID                               pPicIdx;
121     PCODECHAL_ENCODE_AVC_QUALITY_CTRL_PARAMS    pAvcQCParams;
122     uint16_t                                    wPicWidthInMb;
123     uint16_t                                    wFieldFrameHeightInMb;
124     uint32_t*                                   pdwBlockBasedSkipEn; // To be returned to render interface
125     bool                                        bBrcEnabled;
126     bool                                        bMbEncIFrameDistEnabled;
127     bool                                        bRoiEnabled;
128     bool                                        bDirtyRoiEnabled;
129     bool                                        bUseMbEncAdvKernel;
130     bool                                        bMbDisableSkipMapEnabled;
131     bool                                        bStaticFrameDetectionEnabled;   // static frame detection enable or not
132     bool                                        bApdatvieSearchWindowSizeEnabled;
133     bool                                        bSquareRollingIEnabled;
134     uint16_t                                    usSliceHeight;
135     PMHW_KERNEL_STATE                           pKernelState;
136     uint8_t*                                    pCurbeBinary;
137 } CODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS;
138 
139 typedef struct _CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS
140 {
141     double                                  *pdBrcInitCurrentTargetBufFullInBits;    // Passed in and back
142     uint32_t                                dwNumSkipFrames;
143     uint32_t                                dwSizeSkipFrames;
144     uint8_t                                 ucMinQP;  // Limit min QP that the kernel can choose, based on app setting
145     uint8_t                                 ucMaxQP;  // Limit max QP that the kernel can choose, based on app setting
146     uint8_t                                 ucEnableROI;                            // ROI feature for BRC
147     uint32_t                                dwIntraRefreshQpThreshold;
148     bool                                    bSquareRollingIEnabled;
149     PMHW_KERNEL_STATE                       pKernelState;
150 } CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS;
151 typedef struct _CODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE
152 {
153     uint32_t   dwFrameBrcHistoryBuffer;
154     uint32_t   dwFrameBrcPakStatisticsOutputBuffer;
155     uint32_t   dwFrameBrcImageStateReadBuffer;
156     uint32_t   dwFrameBrcImageStateWriteBuffer;
157     uint32_t   dwFrameBrcMbEncCurbeReadBuffer;
158     uint32_t   dwFrameBrcMbEncCurbeWriteData;
159     uint32_t   dwFrameBrcDistortionBuffer;
160     uint32_t   dwFrameBrcConstantData;
161     uint32_t   dwFrameBrcMbStatBuffer;
162     uint32_t   dwFrameBrcMvDataBuffer;
163     uint32_t   dwMbBrcHistoryBuffer;
164     uint32_t   dwMbBrcDistortionBuffer;
165     uint32_t   dwMbBrcMbQpBuffer;
166     uint32_t   dwMbBrcROISurface;
167     uint32_t   dwMbBrcIntraDistortionPBFrameSurface;
168     uint32_t   dwMbBrcMbStatBuffer;
169     uint32_t   dwBindingTableStartOffset;
170     uint32_t   dwNumBindingTableEntries;
171 } CODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE, *PCODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE;
172 
173 typedef struct _CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS
174 {
175     CODECHAL_MEDIA_STATE_TYPE                       MbEncMediaStateType;
176     EncodeBrcBuffers*                               pBrcBuffers;
177     uint32_t                                        dwDownscaledWidthInMb4x;
178     uint32_t                                        dwDownscaledFrameFieldHeightInMb4x;
179     bool                                            bMbBrcEnabled;
180     bool                                            bUseAdvancedDsh;
181     bool                                            bBrcRoiEnabled;
182     PMOS_RESOURCE                                   presMbEncCurbeBuffer;
183     PMOS_RESOURCE                                   presMbEncBRCBuffer; //extra surface on KBL BRC update
184     PMOS_SURFACE                                    psRoiSurface;
185     PMOS_RESOURCE                                   presMbStatBuffer;
186     PMOS_SURFACE                                    psMvDataBuffer;
187     uint32_t                                        dwBrcPakStatisticsSize;
188     uint32_t                                        dwBrcHistoryBufferSize;
189     uint32_t                                        dwMbEncBRCBufferSize;
190     uint32_t                                        dwMvBottomFieldOffset;
191     uint8_t                                         ucCurrRecycledBufIdx;
192     PCODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE   pBrcUpdateBindingTable;
193     PMHW_KERNEL_STATE                               pKernelState;
194 } CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS;
195 
196 typedef struct _CODECHAL_ENCODE_AVC_IPCM_THRESHOLD
197 {
198     uint8_t   QP;
199     uint16_t  Threshold;
200 } CODECHAL_ENCODE_AVC_IPCM_THRESHOLD;
201 
202 // Force RepartitionCheck
203 typedef enum _CODECHAL_ENCODE_AVC_RPC
204 {
205     CODECHAL_ENCODE_RPC_FOLLOW_DRIVER = 0,
206     CODECHAL_ENCODE_RPC_FORCE_ENABLE,
207     CODECHAL_ENCODE_RPC_FORCE_DISABLE
208 } CODECHAL_ENCODE_AVC_RPC;
209 
210 typedef struct _CODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC
211 {
212     uint32_t   dwAvcMBEncMfcAvcPakObj;
213     uint32_t   dwAvcMBEncIndMVData;
214     uint32_t   dwAvcVPPStatistics;
215     uint32_t   dwAvcMBEncCurrY;
216     uint32_t   dwAvcMBEncCurrUV;
217     uint32_t   dwAvcMBEncMbSpecificData;
218     uint32_t   dwAvcMBEncFwdRefY;
219     uint32_t   dwAvcMBEncBwdRefY;
220     uint32_t   dwAvcMBEncFwdRefMVData;
221     uint32_t   dwAvcMBEncBwdRefMBData;
222     uint32_t   dwAvcMBEncBwdRefMVData;
223     uint32_t   dwAvcMBEncMVDataFromME;
224     uint32_t   dwAvcMBEncRefPicSelectL0;
225     uint32_t   dwAvcMBEncRefPicSelectL1;
226     uint32_t   dwAvcMBEncCurrPic;
227     uint32_t   dwAvcMBEncFwdPic;
228     uint32_t   dwAvcMBEncBwdPic;
229     uint32_t   dwAvcMBEncMbBrcConstData;
230     uint32_t   dwAvcMBEncMEDist;
231     uint32_t   dwAvcMBEncBRCDist;
232     uint32_t   dwAvcMBEncDebugScratch;
233     uint32_t   dwAvcMBEncFlatnessChk;
234     uint32_t   dwAvcMBEncMBStats;
235     uint32_t   dwAvcMBEncMADData;
236     uint32_t   dwAvcMBEncVMEDistortion;
237     uint32_t   dwAvcMbEncBRCCurbeData;
238     uint32_t   dwAvcMBEncSliceMapData;
239     uint32_t   dwAvcMBEncMvPrediction;
240     uint32_t   dwAvcMBEncMbNonSkipMap;
241     uint32_t   dwAvcMBEncAdv;
242     uint32_t   dwAvcMBEncStaticDetectionCostTable;
243 
244     // Frame Binding Table Entries
245     uint32_t   dwAvcMBEncCurrPicFrame[CODEC_AVC_NUM_REF_LISTS];
246     uint32_t   dwAvcMBEncFwdPicFrame[CODECHAL_ENCODE_NUM_MAX_VME_L0_REF];
247     uint32_t   dwAvcMBEncBwdPicFrame[CODECHAL_ENCODE_NUM_MAX_VME_L1_REF * 2];   // Bwd ref IDX0 and IDX1 are repeated, so include two extra to account for this
248     uint32_t   dwAvcMBEncMbQpFrame;
249     uint32_t   dwAvcMbEncMADFrame;
250     uint32_t   dwAvcMBEncSliceMapFrame;
251     uint32_t   dwAvcMBEncMbNonSkipMapFrame;
252 
253     // Field Binding Table Entries
254     uint32_t   dwAvcMBEncFieldCurrPic[CODEC_AVC_NUM_REF_LISTS];
255     uint32_t   dwAvcMBEncFwdPicTopField[CODECHAL_ENCODE_NUM_MAX_VME_L0_REF];
256     uint32_t   dwAvcMBEncFwdPicBotField[CODECHAL_ENCODE_NUM_MAX_VME_L0_REF];
257     uint32_t   dwAvcMBEncBwdPicTopField[CODECHAL_ENCODE_NUM_MAX_VME_L1_REF * 2];
258     uint32_t   dwAvcMBEncBwdPicBotField[CODECHAL_ENCODE_NUM_MAX_VME_L1_REF * 2];
259     uint32_t   dwAvcMBEncMbQpField;
260     uint32_t   dwAvcMBEncMADField;
261     uint32_t   dwAvcMBEncSliceMapField;
262     uint32_t   dwAvcMBEncMbNonSkipMapField;
263 
264     uint32_t   dwBindingTableStartOffset;
265     uint32_t   dwNumBindingTableEntries;
266 } CODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC, *PCODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC;
267 
268 typedef struct _CODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS
269 {
270     CODECHAL_MEDIA_STATE_TYPE                   MediaStateType;
271     PCODEC_AVC_ENCODE_SLICE_PARAMS              pAvcSlcParams;
272     CodecEncodeAvcFeiPicParams                  *pFeiPicParams;
273     PCODEC_REF_LIST                             *ppRefList;
274     PCODEC_PIC_ID                               pAvcPicIdx;
275     PCODEC_PICTURE                              pCurrOriginalPic;
276     PCODEC_PICTURE                              pCurrReconstructedPic;
277     uint16_t                                    wPictureCodingType;
278     PMOS_SURFACE                                psCurrPicSurface;
279     uint32_t                                    dwCurrPicSurfaceOffset;
280     uint32_t                                    dwMbCodeBottomFieldOffset;
281     uint32_t                                    dwMvBottomFieldOffset;
282     PMOS_SURFACE                                ps4xMeMvDataBuffer;
283     CmSurface2D                                 *ps4xMeMvDataCmBuffer;
284     uint32_t                                    dwMeMvBottomFieldOffset;
285     PMOS_SURFACE                                ps4xMeDistortionBuffer;
286     CmSurface2D                                 *ps4xMeDistortionCmBuffer;
287     uint32_t                                    dwMeDistortionBottomFieldOffset;
288     uint32_t                                    dwRefPicSelectBottomFieldOffset;
289     PMOS_SURFACE                                psMeBrcDistortionBuffer;
290     uint32_t                                    dwMeBrcDistortionBottomFieldOffset;
291     PMOS_RESOURCE                               presMbBrcConstDataBuffer;
292     PMOS_RESOURCE                               presMbSpecificDataBuffer;
293     PMOS_SURFACE                                psMbQpBuffer;
294     uint32_t                                    dwMbQpBottomFieldOffset;
295     bool                                        bFlatnessCheckEnabled;
296     PMOS_SURFACE                                psFlatnessCheckSurface;
297     uint32_t                                    dwFlatnessCheckBottomFieldOffset;
298     bool                                        bMBVProcStatsEnabled;
299     PMOS_RESOURCE                               presMBVProcStatsBuffer;
300     uint32_t                                    dwMBVProcStatsBottomFieldOffset;
301     PMOS_RESOURCE                               presMADDataBuffer;
302     bool                                        bMADEnabled;
303     uint32_t                                    dwFrameWidthInMb;
304     uint32_t                                    dwFrameFieldHeightInMb;
305     uint32_t                                    dwFrameHeightInMb;
306     uint32_t                                    dwVerticalLineStride;
307     uint32_t                                    dwVerticalLineStrideOffset;
308     bool                                        bHmeEnabled;
309     bool                                        bMbEncIFrameDistInUse;
310     bool                                        bMbQpBufferInUse;
311     bool                                        bMbSpecificDataEnabled;
312     bool                                        bMbConstDataBufferInUse;
313     bool                                        bUsedAsRef;
314     PMOS_RESOURCE                               presMbEncCurbeBuffer;
315     PMOS_RESOURCE                               presMbEncBRCBuffer;  //extra surface on KBL BRC update
316     uint32_t                                    dwMbEncBRCBufferSize;
317     bool                                        bUseMbEncAdvKernel;
318     bool                                        bArbitraryNumMbsInSlice;
319     PMOS_SURFACE                                psSliceMapSurface;           // Slice map for arbitrary number of mbs in slice feature
320     uint32_t                                    dwSliceMapBottomFieldOffset;
321     bool                                        bBrcEnabled;
322     PMHW_KERNEL_STATE                           pKernelState;
323     bool                                        bUseAdvancedDsh;
324     PCODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC    pMbEncBindingTable;
325     bool                                        bMbDisableSkipMapEnabled;
326     PMOS_SURFACE                                psMbDisableSkipMapSurface;
327     bool                                        bStaticFrameDetectionEnabled;
328     PMOS_RESOURCE                               presSFDOutputBuffer;
329     PMOS_RESOURCE                               presSFDCostTableBuffer;
330     PCODEC_AVC_REF_PIC_SELECT_LIST              pWeightedPredOutputPicSelectList;
331     bool                                        bUseWeightedSurfaceForL0;
332     bool                                        bUseWeightedSurfaceForL1;
333     PMOS_RESOURCE                               presMbInlineData;
334     PMOS_RESOURCE                               presVMEOutSurface;
335 } CODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS;
336 
337 typedef struct _CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS
338 {
339     uint32_t                                    submitNumber;
340     PMHW_KERNEL_STATE                           pKernelState;
341     PCODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC    pBindingTable;
342 } CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS;
343 
344 typedef enum _CODECHAL_ENCODE_AVC_MULTIPRED
345 {
346     CODECHAL_ENCODE_AVC_MULTIPRED_ENABLE            =   0x01,
347     CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE           =   0x80
348 } CODECHAL_ENCODE_AVC_MULTIPRED;
349 
350 typedef struct _CODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC
351 {
352     uint32_t   dwAvcPreProcCurrY;
353     uint32_t   dwAvcPreProcCurrUV;
354     uint32_t   dwAvcPreProcMVDataFromHME;
355     uint32_t   dwAvcPreProcMvPredictor;
356     uint32_t   dwAvcPreProcMbQp;
357     uint32_t   dwAvcPreProcMvDataOut;
358     uint32_t   dwAvcPreProcMbStatsOut;
359 
360     uint32_t   dwAvcPreProcVMECurrPicFrame[CODEC_AVC_NUM_REF_LISTS];
361     uint32_t   dwAvcPreProcVMEFwdPicFrame;
362     uint32_t   dwAvcPreProcVMEBwdPicFrame[2];   // Bwd ref IDX0 and IDX1 are repeated, so include two to account for this
363     uint32_t   dwAvcPreProcFtqLut;
364 
365     uint32_t   dwAvcPreProcVMECurrPicField[2];
366     uint32_t   dwAvcPreProcVMEFwdPicField[2];
367     uint32_t   dwAvcPreProcVMEBwdPicField[2];
368     uint32_t   dwAvcPreProcFtqLutField;
369 
370     uint32_t   dwBindingTableStartOffset;
371     uint32_t   dwNumBindingTableEntries;
372 } CODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC, *PCODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC;
373 
374 typedef struct _CODECHAL_ENCOCDE_AVC_PREPROC_SURFACE_PARAMS
375 {
376     FeiPreEncParams                             *pPreEncParams;
377     PCODEC_REF_LIST                             *ppRefList;
378     PCODEC_PICTURE                              pCurrOriginalPic;
379     PMOS_SURFACE                                psCurrPicSurface;
380     PMOS_SURFACE                                ps4xMeMvDataBuffer;
381     PMOS_RESOURCE                               presFtqLutBuffer;
382     uint32_t                                    dwMeMvBottomFieldOffset;
383     uint32_t                                    dwMBVProcStatsBottomFieldOffset;
384     uint32_t                                    dwFrameWidthInMb;
385     uint32_t                                    dwFrameFieldHeightInMb;
386     uint32_t                                    dwVerticalLineStride;
387     uint32_t                                    dwVerticalLineStrideOffset;
388     bool                                        bHmeEnabled;
389     PMHW_KERNEL_STATE                           pKernelState;
390     PCODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC  pPreProcBindingTable;
391 } CODECHAL_ENCODE_AVC_PREPROC_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_PREPROC_SURFACE_PARAMS;
392 
393 typedef struct _CODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS
394 {
395     FeiPreEncParams                         *pPreEncParams;
396     uint16_t                                wPicWidthInMb;
397     uint16_t                                wFieldFrameHeightInMb;
398     PMHW_KERNEL_STATE                       pKernelState;
399     uint8_t*                                pCurbeBinary;
400 } CODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS;
401 
402 typedef struct _CODECHAL_ENCODE_AVC_WP_CURBE_PARAMS
403 {
404     uint8_t   RefPicListIdx;
405     uint32_t  WPIdx;
406 } CODECHAL_ENCODE_AVC_WP_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_WP_CURBE_PARAMS;
407 
408 typedef struct _CODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS
409 {
410     PMOS_SURFACE                       psInputRefBuffer;
411     PMOS_SURFACE                       psOutputScaledBuffer;
412     uint32_t                           dwVerticalLineStride;
413     uint32_t                           dwVerticalLineStrideOffset;
414     uint8_t                            ucVDirection;
415     PMHW_KERNEL_STATE                  pKernelState;
416 } CODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS;
417 
418 //!
419 //! \struct    CodechalEncodeAvcEnc
420 //! \brief     Codechal encode Avc Encode
421 //!
422 struct CodechalEncodeAvcEnc : public CodechalEncodeAvcBase
423 {
424 
425     typedef struct _CODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS
426     {
427         union
428         {
429             struct
430             {
431                 uint32_t   ForceToIntra                                : MOS_BITFIELD_RANGE( 0, 0 );
432                 uint32_t   Reserved                                    : MOS_BITFIELD_RANGE( 1,31 );
433             };
434             struct
435             {
436                 uint32_t   Value;
437             };
438         } DW0;
439 
440         union
441         {
442             struct
443             {
444                 uint32_t   Reserved                                    : MOS_BITFIELD_RANGE(  0,31 );
445             };
446             struct
447             {
448                 uint32_t   Value;
449             };
450         } DW1;
451 
452         union
453         {
454             struct
455             {
456                 uint32_t   Reserved                                    : MOS_BITFIELD_RANGE(  0,31 );
457             };
458             struct
459             {
460                 uint32_t   Value;
461             };
462         } DW2;
463 
464         union
465         {
466             struct
467             {
468                 uint32_t   Reserved                                    : MOS_BITFIELD_RANGE(  0,31 );
469             };
470             struct
471             {
472                 uint32_t   Value;
473             };
474         } DW3;
475     } CODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS, *PCODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS;
476     C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS)) == 4);
477 
478     // SEI
479     CodechalEncodeSeiData               SeiData;                                            //!< Encode SEI data parameter.
480     uint32_t                            dwSEIDataOffset;                                    //!< Encode SEI data offset.
481     uint8_t*                            pSeiParamBuffer;                                    //!< Encode SEI data buffer.
482 
483     bool                                bMbEncCurbeSetInBrcUpdate;                          //!< bMbEncCurbeSetInBrcUpdate.
484     bool                                bMbEncIFrameDistEnabled;                            //!< bMbEncIFrameDistEnabled.
485     bool                                bBrcInit;                                           //!< BRC init enable flag.
486     bool                                bBrcReset;                                          //!< BRC reset enable flag.
487     bool                                bBrcEnabled;                                        //!< BRC enable flag.
488     bool                                bMbBrcEnabled;                                      //!< MBBrc enable flag.
489     bool                                bBrcRoiEnabled;                                     //!< BRC ROI feature enable flag.
490     bool                                bROIValueInDeltaQP;                                 //!< ROI QP in delta QP flag.
491     bool                                bROISmoothEnabled;                                  //!< ROI smooth area enable flag.
492     bool                                bMbBrcUserFeatureKeyControl;                        //!< MBBRC user feature control enable flag.
493     double                              dBrcTargetSize;                                     //!< BRC target size.
494     uint32_t                            dwTrellis;                                          //!< Trellis Number.
495     bool                                bAcceleratorHeaderPackingCaps;                      //!< Flag set by driver from driver caps.
496     uint32_t                            dwIntraRefreshQpThreshold;                          //!< Intra Refresh QP Threshold.
497     bool                                bSquareRollingIEnabled;                             //!< SquareRollingI enable flag.
498 
499     // VME Scratch Buffers
500     MOS_RESOURCE                        resVMEScratchBuffer;                                //!< VME Scratch Buffer resource.
501     bool                                bVMEScratchBuffer;                                  //!< VME ScratchBuffer enable flag.
502     MOS_RESOURCE                        resVmeKernelDumpBuffer;                             //!< VME Kernel Dump resource.
503     bool                                bVMEKernelDump;                                     //!< VME kernel dump flag.
504     uint32_t                            ulVMEKernelDumpBottomFieldOffset;                   //!< VME Kernel Dump Bottom Field Offset
505 
506     // MbEnc
507     PMHW_KERNEL_STATE                           pMbEncKernelStates;                                             //!< Pointer to MbEnc Kernel States.
508     CODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC     MbEncBindingTable;                                              //!< Pointer to MbEnc BindingTable.
509     uint32_t                                    dwNumMbEncEncKrnStates;                                         //!< MbEncEncKrnStates Number.
510     CODEC_AVC_REF_PIC_SELECT_LIST               RefPicSelectList[CODECHAL_ENCODE_AVC_REF_PIC_SELECT_ENTRIES];   //!< Array of RefPicSelect.
511     uint8_t                                     ucCurrRefPicSelectIndex;                                        //!< Current RefPic Select Index
512     uint32_t                                    ulRefPicSelectBottomFieldOffset;                                //!< RefPic Select BottomField Offset
513     uint32_t                                    dwMbEncBlockBasedSkipEn;                                        //!< MbEnc Block Based Skip enable flag.
514     bool                                        bKernelTrellis;                                                 //!< Kernel controlled Trellis Quantization.
515     bool                                        bExtendedMvCostRange;                                           //!< Extended MV Cost Range for Gen10+.
516 
517     //MFE MbEnc
518     MHW_KERNEL_STATE                            mfeMbEncKernelState;                                             //!< Mfe MbEnc Kernel State.
519 
520     // Intra Distortion
521     PMHW_KERNEL_STATE                           pIntraDistortionKernelStates;                                   //!< Point to Intra Distortion Kernel States.
522 
523     // WP
524     PMHW_KERNEL_STATE                   pWPKernelState;                                                         //!< Point to WP Kernel State.
525     CODEC_AVC_REF_PIC_SELECT_LIST       WeightedPredOutputPicSelectList[CODEC_AVC_NUM_WP_FRAME];                //!< Array of WeightedPredOutputPicSelectList.
526 
527     // BRC Params
528     MHW_KERNEL_STATE                                BrcKernelStates[CODECHAL_ENCODE_BRC_IDX_NUM];               //!< Array of BrcKernelStates.
529     CODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE    BrcUpdateBindingTable;                                      //!< BrcUpdate BindingTable
530 
531     // PreProc
532     MHW_KERNEL_STATE                                PreProcKernelState;                                         //!< PreProc KernelState
533     CODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC       PreProcBindingTable;                                        //!< PreProc BindingTable
534 
535     EncodeBrcBuffers                    BrcBuffers;                                                     //!< BRC related buffers
536     uint16_t                            usAVBRAccuracy;                                                 //!< AVBR Accuracy
537     uint16_t                            usAVBRConvergence;                                              //!< AVBR Convergence
538     double                              dBrcInitCurrentTargetBufFullInBits;                             //!< BRC init current target buffer full in bits
539     double                              dBrcInitResetInputBitsPerFrame;                                 //!< BrcInitReset Input Bits Per Frame
540     uint32_t                            dwBrcInitResetBufSizeInBits;                                    //!< BrcInitReset Buffer Size In Bits
541     uint32_t                            dwBrcInitPreviousTargetBufFullInBits;                           //!< BRC Init Previous Target Buffer Full In Bits
542     // Below values will be set if qp control params are sent by app
543     bool                                bMinMaxQPControlEnabled;                                        //!< Flag to indicate if min/max QP feature is enabled or not.
544     uint8_t                             ucIMinQP;                                                       //!< I frame Minimum QP.
545     uint8_t                             ucIMaxQP;                                                       //!< I frame Maximum QP.
546     uint8_t                             ucPMinQP;                                                       //!< P frame Minimum QP.
547     uint8_t                             ucPMaxQP;                                                       //!< P frame Maximum QP.
548     uint8_t                             ucBMinQP;                                                       //!< B frame Minimum QP.
549     uint8_t                             ucBMaxQP;                                                       //!< B frame Maximum QP.
550     bool                                bPFrameMinMaxQPControl;                                         //!< Indicates min/max QP values for P-frames are set separately or not.
551     bool                                bBFrameMinMaxQPControl;                                         //!< Indicates min/max QP values for B-frames are set separately or not.
552 
553     uint32_t                            dwSkipFrameBufferSize;                                          //!< size of skip frame packed data.
554     MOS_RESOURCE                        resSkipFrameBuffer;                                             //!< copy skip frame packed data from DDI.
555     // Mb Disable Skip Map
556     bool                                bMbDisableSkipMapEnabled;                                       //!< MbDisableSkipMap Flag.
557     PMOS_SURFACE                        psMbDisableSkipMapSurface;                                      //!< Point to MbDisableSkipMap Surface.
558 
559     // Mb Qp Data
560     bool                                bMbQpDataEnabled;                                               //!< Mb Qp Data Enable Flag.
561     MOS_SURFACE                         sMbQpDataSurface;                                               //!< Pointer to MOS_SURFACE of Mb Qp data surface, provided by DDI.
562 
563         // Mb specific Data
564     bool                                bMbSpecificDataEnabled;
565     MOS_RESOURCE                        resMbSpecificDataBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM];
566 
567     // Static frame detection
568     bool                                bStaticFrameDetectionEnable;                                    //!< Static frame detection enable.
569     bool                                bApdatvieSearchWindowEnable;                                    //!< allow search window size change when SFD enabled.
570     bool                                bPerMbSFD;                                                      //!<
571     MOS_RESOURCE                        resSFDOutputBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM];        //!< Array of SFDOutputBuffer.
572     MOS_RESOURCE                        resSFDCostTablePFrameBuffer;                                    //!< SFD CostTable of P Frame.
573     MOS_RESOURCE                        resSFDCostTableBFrameBuffer;                                    //!< SFD CostTable of B Frame.
574     PMHW_KERNEL_STATE                   pSFDKernelState;                                                //!< Point to SFD kernel state.
575 
576     // Generation Specific Support Flags & User Feature Key Reads
577     bool                                bBrcDistortionBufferSupported;                                  //!< BRC DistortionBuffer Support Flag.
578     bool                                bRefPicSelectListSupported;                                     //!< RefPicSelectList Support Flag.
579     uint8_t                             ucMbBrcSupportCaps;                                             //!< MbBrcSupport Capability.
580     bool                                bMultiPredEnable;                                               //!< MultiPredictor enable, 6 predictors
581     bool                                bFTQEnable;                                                     //!< FTQEnable
582     bool                                bCAFSupported;                                                  //!< CAFSupported
583     bool                                bCAFEnable;                                                     //!< CAFEnable
584     bool                                bCAFDisableHD;                                                  //!< Disable CAF for HD
585     bool                                bSkipBiasAdjustmentSupported;                                   //!< SkipBiasAdjustment support for P frame
586     bool                                bAdaptiveIntraScalingEnable;                                    //!< Enable AdaptiveIntraScaling
587     bool                                bOldModeCostEnable;                                             //!< Enable Old Mode Cost (HSW cost table for BDW)
588     bool                                bMultiRefQpEnabled;                                             //!< BDW MultiRef QP
589     bool                                bAdvancedDshInUse;                                              //!< Use MbEnc Adv kernel
590     bool                                bUseMbEncAdvKernel;                                             //!< Use MbEnc Adv kernel
591     bool                                bUseWeightedSurfaceForL0;                                       //!< Use WP Surface for L0
592     bool                                bUseWeightedSurfaceForL1;                                       //!< Use WP Surface for L1
593     bool                                bWeightedPredictionSupported;                                   //!< Weighted prediction support
594     bool                                bBrcSplitEnable;                                                //!< starting GEN9 BRC kernel has split into frame-level and MB-level update.
595     bool                                bDecoupleMbEncCurbeFromBRC;                                     //!< starting GEN95 BRC kernel write to extra surface instead of MBEnc curbe.
596     bool                                bSliceLevelReportSupported;                                     //!< Slice Level Report support
597     bool                                bFBRBypassEnable;                                               //!< FBRBypassEnable
598     bool                                bBrcRoiSupported;                                               //!< BRC Roi Support Flag.
599     bool                                bMvDataNeededByBRC;                                             //!< starting G95, mv data buffer from HME is needed by BRC frame update kernel.
600     bool                                bHighTextureModeCostEnable;                                     //!< HighTexture ModeCost Enable Flag.
601 
602     bool                                bRoundingInterEnable;                                           //!< RoundingInter Enable Flag.
603     bool                                bAdaptiveRoundingInterEnable;                                   //!< Adaptive Rounding Inter Enable Flag.
604     uint32_t                            dwRoundingInterP;                                               //!< Rounding Inter for P frame
605     uint32_t                            dwRoundingInterB;                                               //!< Rounding Inter for B frame
606     uint32_t                            dwRoundingInterBRef;                                            //!< Rounding Inter for BRef frame
607     uint32_t                            dwBrcConstantSurfaceWidth;                                      //!< Brc Constant Surface Width
608     uint32_t                            dwBrcConstantSurfaceHeight;                                     //!< Brc Constant Surface Height
609 
610     uint32_t                            dwSlidingWindowSize;                                            //!< Sliding Window Size
611     bool                                bForceToSkipEnable;                                             //!< ForceToSkip Enable Flag
612     bool                                bBRCVarCompuBypass;                                             //!< Bypass variance computation in BRC kernel
613 
614     static const uint32_t MaxLenSP[NUM_TARGET_USAGE_MODES];
615     static const uint32_t EnableAdaptiveSearch[NUM_TARGET_USAGE_MODES];
616     static const uint32_t FTQBasedSkip[NUM_TARGET_USAGE_MODES];
617     static const uint32_t HMEBCombineLen[NUM_TARGET_USAGE_MODES];
618     static const uint32_t HMECombineLen[NUM_TARGET_USAGE_MODES];
619     static const uint32_t SearchX[NUM_TARGET_USAGE_MODES];
620     static const uint32_t SearchY[NUM_TARGET_USAGE_MODES];
621     static const uint32_t BSearchX[NUM_TARGET_USAGE_MODES];
622     static const uint32_t BSearchY[NUM_TARGET_USAGE_MODES];
623 
624     static const uint32_t InterRoundingP_TQ[NUM_TARGET_USAGE_MODES];
625     static const uint32_t InterRoundingBRef_TQ[NUM_TARGET_USAGE_MODES];
626     static const uint32_t InterRoundingB_TQ[NUM_TARGET_USAGE_MODES];
627     static const uint32_t TrellisQuantizationEnable[NUM_TARGET_USAGE_MODES];
628     static const uint32_t EnableAdaptiveTrellisQuantization[NUM_TARGET_USAGE_MODES];
629     static const uint32_t TQ_LAMBDA_I_FRAME[CODEC_AVC_NUM_QP][2];
630     static const uint32_t TQ_LAMBDA_P_FRAME[CODEC_AVC_NUM_QP][2];
631     static const uint32_t TQ_LAMBDA_B_FRAME[CODEC_AVC_NUM_QP][2];
632     static const uint8_t  IntraScalingFactor_Cm_Common[64];
633     static const uint8_t  AdaptiveIntraScalingFactor_Cm_Common[64];
634     static const uint32_t OldIntraModeCost_Cm_Common[CODEC_AVC_NUM_QP];
635     static const uint32_t MvCost_PSkipAdjustment_Cm_Common[CODEC_AVC_NUM_QP];
636     static const uint16_t SkipVal_B_Common[2][2][64];
637     static const uint16_t SkipVal_P_Common[2][2][64];
638     static const uint32_t PreProcFtqLut_Cm_Common[CODEC_AVC_NUM_QP][16];
639     static const uint32_t MBBrcConstantData_Cm_Common[3][CODEC_AVC_NUM_QP][16];
640 
641     static const uint32_t ModeMvCost_Common[3][CODEC_AVC_NUM_QP][8];
642     static const uint16_t RefCost_Common[3][64];
643     static const uint8_t  MaxRefIdx0_Progressive_4K[NUM_TARGET_USAGE_MODES];
644     static const uint8_t  MaxRefIdx0[NUM_TARGET_USAGE_MODES];
645     static const uint8_t  MaxBRefIdx0[NUM_TARGET_USAGE_MODES];
646     static const uint8_t  MaxRefIdx1[NUM_TARGET_USAGE_MODES];
647     static const uint32_t SuperHME[NUM_TARGET_USAGE_MODES];
648     static const uint32_t UltraHME[NUM_TARGET_USAGE_MODES];
649 
650     static const uint32_t ModeMvCost_Cm[3][52][8];
651 
652     static const uint8_t  m_qpDistMaxFrameAdjustmentCm[576];
653     static const uint32_t MultiPred[NUM_TARGET_USAGE_MODES];
654     static const uint32_t MRDisableQPCheck[NUM_TARGET_USAGE_MODES];
655     static const uint16_t RefCost_MultiRefQp[NUM_PIC_TYPES][64];
656     static const uint32_t CODECHAL_ENCODE_AVC_AllFractional_Common[NUM_TARGET_USAGE_MODES];
657     static const uint32_t CODECHAL_ENCODE_AVC_DisableAllFractionalCheckForHighRes_Common[NUM_TARGET_USAGE_MODES];
658 
659     static const uint32_t m_refThreshold = 400;
660     static const uint32_t m_mbencNumTargetUsages = 3;
661     static const uint32_t m_brcConstantSurfaceEarlySkipTableSize = 128;
662     static const uint32_t m_brcConstantSurfaceRefCostSize = 128;
663     static const uint32_t m_brcConstantSurfacModeMvCostSize = 1664;
664 
665     typedef enum _ID_OFFSET_MBENC_CM
666     {
667         MBENC_I_OFFSET_CM = 0,
668         MBENC_P_OFFSET_CM = 1,
669         MBENC_B_OFFSET_CM = 2,
670         MBENC_TARGET_USAGE_CM = 3
671     } ID_OFFSET_MBENC_CM;
672 
673     //!
674     //! \brief    Constructor
675     //!
676     CodechalEncodeAvcEnc(
677         CodechalHwInterface *   hwInterface,
678         CodechalDebugInterface *debugInterface,
679         PCODECHAL_STANDARD_INFO standardInfo);
680 
681     //!
682     //! \brief    Copy constructor
683     //!
684     CodechalEncodeAvcEnc(const CodechalEncodeAvcEnc&) = delete;
685 
686     //!
687     //! \brief    Copy assignment operator
688     //!
689     CodechalEncodeAvcEnc& operator=(const CodechalEncodeAvcEnc&) = delete;
690 
691     //!
692     //! \brief    Destructor
693     //!
694     virtual ~CodechalEncodeAvcEnc();
695 
696     //Encode interface implementations
697     //!
698     //! \brief    Initialize standard related members.
699     //! \details  Initialize members, set proper value
700     //!           to involved variables, allocate resources.
701     //!
702     //! \param    [in] settings
703     //!           Encode settings.
704     //!
705     //! \return   MOS_STATUS
706     //!           MOS_STATUS_SUCCESS if success
707     //!
708     virtual MOS_STATUS Initialize(
709         CodechalSetting * settings) override;
710 
711     //!
712     //! \brief    Initialize encoder related members.
713     //! \details  Initialize members, set proper value
714     //!           to involved variables, allocate resources.
715     //!
716     //! \return   MOS_STATUS
717     //!           MOS_STATUS_SUCCESS if success
718     //!
719     virtual MOS_STATUS InitializePicture(const EncoderParams& params) override;
720 
721     //!
722     //! \brief    Call media kernel functions.
723     //! \details  Call to related encode kernel functions.
724     //!
725     //! \return   MOS_STATUS
726     //!           MOS_STATUS_SUCCESS if success
727     //!
728     virtual MOS_STATUS ExecuteKernelFunctions() override;
729 
730     //!
731     //! \brief    Encode frame in picture level.
732     //! \details  Call related encode functions to encode
733     //!           one frame in picture level.
734     //!
735     //! \return   MOS_STATUS
736     //!           MOS_STATUS_SUCCESS if success
737     //!
738     virtual MOS_STATUS ExecutePictureLevel() override;
739 
740     //!
741     //! \brief    Encode frame in slice level.
742     //! \details  Call related encode functions to encode
743     //!           one frame in slice level.
744     //!
745     //! \return   MOS_STATUS
746     //!           MOS_STATUS_SUCCESS if success
747     //!
748     virtual MOS_STATUS ExecuteSliceLevel() override;
749 
750     //!
751     //! \brief    Encode User Feature Key Report.
752     //! \details  Report user feature values set by encode.
753     //!
754     //! \return   MOS_STATUS
755     //!           MOS_STATUS_SUCCESS if success
756     //!
757     virtual MOS_STATUS UserFeatureKeyReport() override;
758 
759     virtual MOS_STATUS ExecutePreEnc(EncoderParams* encodeParams) override;
760     //!
761     //! \brief    Slice map surface programming
762     //! \details  Set slice map data.
763     //!
764     //! \param    [in] data
765     //!           Encode interface
766     //! \param    [in] avcSliceParams
767     //!           Slice map command params
768     //!
769     //! \return   MOS_STATUS
770     //!           MOS_STATUS_SUCCESS if success
771     //!
772     virtual MOS_STATUS EncodeGenerateSliceMap(
773         uint8_t* data,
774         PCODEC_AVC_ENCODE_SLICE_PARAMS avcSliceParams);
775 
776     //!
777     //! \brief    Allocate necessary resources.
778     //!
779     //! \return   MOS_STATUS
780     //!           MOS_STATUS_SUCCESS if success
781     //!
782     virtual MOS_STATUS AllocateResources() override;
783 
784     //!
785     //! \brief    Allocate necessary resources for BRC case.
786     //!
787     //! \return   MOS_STATUS
788     //!           MOS_STATUS_SUCCESS if success
789     //!
790     virtual MOS_STATUS AllocateResourcesBrc();
791 
792     //!
793     //! \brief    Allocate necessary resources for MBBRC case.
794     //!
795     //! \return   MOS_STATUS
796     //!           MOS_STATUS_SUCCESS if success
797     //!
798     virtual MOS_STATUS AllocateResourcesMbBrc();
799 
800     //!
801     //! \brief    Release allocated resources for BRC case.
802     //!
803     //! \return   MOS_STATUS
804     //!           MOS_STATUS_SUCCESS if success
805     //!
806     virtual MOS_STATUS ReleaseResourcesBrc();
807 
808     //!
809     //! \brief    Release allocated resources for MBBRC case.
810     //!
811     //! \return   MOS_STATUS
812     //!           MOS_STATUS_SUCCESS if success
813     //!
814     virtual MOS_STATUS ReleaseResourcesMbBrc();
815 
816     //!
817     //! \brief    AVC Enc State Initialization.
818     //!
819     //! \return   MOS_STATUS
820     //!           MOS_STATUS_SUCCESS if success
821     //!
822     virtual MOS_STATUS Initialize() override;
823 
824     //!
825     //! \brief    Generic State Picture Level Encoding..
826     //!
827     //! \param    [in] params
828     //!           Pointer to the CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS
829     //!
830     //! \return   MOS_STATUS
831     //!           MOS_STATUS_SUCCESS if success
832     //!
833     virtual MOS_STATUS GenericEncodePictureLevel(
834         PCODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS   params);
835 
836     //!
837     //! \brief    Run Encode ME kernel
838     //!
839     //! \param    [in] brcBuffers
840     //!           Pointer to the EncodeBrcBuffers
841     //! \param    [in] hmeLevel
842     //!           Hme level
843     //!
844     //! \return   MOS_STATUS
845     //!           MOS_STATUS_SUCCESS if success
846     //!
847     virtual MOS_STATUS GenericEncodeMeKernel(EncodeBrcBuffers* brcBuffers, HmeLevel hmeLevel);
848 
849     //!
850     //! \brief    Initialize Encode ME kernel state
851     //!
852     //! \return   MOS_STATUS
853     //!           MOS_STATUS_SUCCESS if success
854     //!
855     virtual MOS_STATUS InitKernelStateMe() override;
856 
857     //!
858     //! \brief    Set Encode ME kernel Curbe data.
859     //!
860     //! \param    [in] params
861     //!           Pointer to the MeCurbeParams
862     //!
863     //! \return   MOS_STATUS
864     //!           MOS_STATUS_SUCCESS if success
865     //!
866     virtual MOS_STATUS SetCurbeMe (
867         MeCurbeParams* params) override;
868 
869     //!
870     //! \brief    Set Encode ME kernel Surfaces
871     //!
872     //! \param    [in] cmdBuffer
873     //!           Pointer to the PMOS_COMMAND_BUFFER
874     //! \param    [in] params
875     //!           Pointer to the CODECHAL_ME_SURFACE_PARAMS
876     //!
877     //! \return   MOS_STATUS
878     //!           MOS_STATUS_SUCCESS if success
879     //!
880     virtual MOS_STATUS SendMeSurfaces (
881         PMOS_COMMAND_BUFFER cmdBuffer,
882         MeSurfaceParams* params) override;
883 
884     // AvcState functions.
885     //!
886     //! \brief    Initialize data members of AVC encoder instance
887     //!
888     //! \return   void
889     //!
890     virtual void InitializeDataMember();
891 
892     // state related funcs
893     //!
894     //! \brief    Initialize encode state
895     //!
896     //! \return   MOS_STATUS
897     //!           MOS_STATUS_SUCCESS if success, else fail reason
898     //!
899     virtual MOS_STATUS InitializeState();
900 
901     //!
902     //! \brief    Validate reference list L0 and L1.
903     //!
904     //! \param    [in] params
905     //!           Pointer to CODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS
906     //!
907     //! \return   MOS_STATUS
908     //!           MOS_STATUS_SUCCESS if success, else fail reason
909     //!
910     virtual MOS_STATUS ValidateNumReferences(
911         PCODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS               params);
912 
913     //!
914     //! \brief    Initialize brc constant buffer
915     //!
916     //! \param    [in] params
917     //!           Pointer to CODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS
918     //!
919     //! \return   MOS_STATUS
920     //!           MOS_STATUS_SUCCESS if success, else fail reason
921     //!
922     virtual MOS_STATUS InitBrcConstantBuffer(
923         PCODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS        params);
924 
925     //!
926     //! \brief    Initialize mbbrc constant buffer
927     //!
928     //! \param    [in] params
929     //!           Pointer to CODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS
930     //!
931     //! \return   MOS_STATUS
932     //!           MOS_STATUS_SUCCESS if success, else fail reason
933     //!
934     virtual MOS_STATUS InitMbBrcConstantDataBuffer(
935         PCODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS params);
936 
937     //!
938     //! \brief    Get inter rounding value.
939     //!
940     //! \param    [in] sliceState
941     //!           Pointer to MHW_VDBOX_AVC_SLICE_STATE
942     //!
943     //! \return   MOS_STATUS
944     //!           MOS_STATUS_SUCCESS if success, else fail reason
945     //!
946     virtual MOS_STATUS GetInterRounding(
947         PMHW_VDBOX_AVC_SLICE_STATE sliceState);
948 
949     //!
950     //! \brief    Calculate lambda table.
951     //!
952     //! \param    [in] slice_type
953     //!           Slice type.
954     //! \param    [out] lambda
955     //!           Lambda table.
956     //!
957     //! \return   MOS_STATUS
958     //!           MOS_STATUS_SUCCESS if success, else fail reason
959     //!
960     virtual MOS_STATUS CalcLambdaTable(
961         uint16_t slice_type,
962         uint32_t* lambda);
963 
964     //!
965     //! \brief    Get Trellis Quantization mode/value enable or not.
966     //!
967     //! \param    [in] params
968     //!           Pointer to CODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS.
969     //! \param    [out] trellisQuantParams
970     //!           Pointer to CODECHAL_ENCODE_AVC_TQ_PARAMS, mode & value setup.
971     //!
972     //! \return   MOS_STATUS
973     //!           MOS_STATUS_SUCCESS if success, else fail reason
974     //!
GetTrellisQuantizationCodechalEncodeAvcEnc975     virtual MOS_STATUS GetTrellisQuantization(
976         PCODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS    params,
977         PCODECHAL_ENCODE_AVC_TQ_PARAMS          trellisQuantParams)
978     {
979         return MOS_STATUS_SUCCESS;
980     }
981 
982     //!
983     //! \brief    Get Skip Bias Adjustment.
984     //!
985     //! \param    [in] sliceQP
986     //!           Slice QP.
987     //! \param    [in] gopRefDist
988     //!           GOP reference dist.
989     //! \param    [in] skipBiasAdjustmentEnable
990     //!           Adjustable or not.
991     //!
992     //! \return   MOS_STATUS
993     //!           MOS_STATUS_SUCCESS if success, else fail reason
994     //!
995     virtual MOS_STATUS GetSkipBiasAdjustment(
996         uint8_t sliceQP,
997         uint16_t gopRefDist,
998         bool* skipBiasAdjustmentEnable);
999 
1000     //!
1001     //! \brief    Get Hme Supported Based On TU.
1002     //!
1003     //! \param    [in] hmeLevel
1004     //!           HME level
1005     //! \param    [out] supported
1006     //!           Supported or not
1007     //!
1008     //! \return   MOS_STATUS
1009     //!           MOS_STATUS_SUCCESS if success, else fail reason
1010     //!
1011     virtual MOS_STATUS GetHmeSupportedBasedOnTU(
1012         HmeLevel hmeLevel,
1013         bool *supported);
1014 
1015     //!
1016     //! \brief    Get MbBrc status.
1017     //!
1018     //! \param    [in] targetUsage
1019     //!           Target Usage.
1020     //! \param    [out] mbBrcEnabled
1021     //!           MBBRC enabled or not
1022     //!
1023     //! \return   MOS_STATUS
1024     //!           MOS_STATUS_SUCCESS if success, else fail reason
1025     //!
1026     virtual MOS_STATUS GetMbBrcEnabled(
1027         uint32_t                    targetUsage,
1028         bool                       *mbBrcEnabled);
1029 
1030     //!
1031     //! \brief    CAF enabled or not.
1032     //!
1033     //! \param    [out] cafEnable
1034     //!           CAF enabled or not
1035     //!
1036     //! \return   MOS_STATUS
1037     //!           MOS_STATUS_SUCCESS if success, else fail reason
1038     //!
1039     virtual MOS_STATUS GetCAFEnabled(
1040         bool *cafEnable);
1041 
1042     //!
1043     //! \brief    ATD enabled or not.
1044     //!
1045     //! \return   MOS_STATUS
1046     //!           MOS_STATUS_SUCCESS if success, else fail reason
1047     //!
1048     virtual MOS_STATUS GetATDEnabled();
1049 
1050     //!
1051     //! \brief    Init BRC reset kernel
1052     //!
1053     //! \return   MOS_STATUS
1054     //!           MOS_STATUS_SUCCESS if success, else fail reason
1055     //!
1056     MOS_STATUS BrcInitResetKernel();
1057 
1058     //!
1059     //! \brief    Init MbEnc kernel state
1060     //!
1061     //! \return   MOS_STATUS
1062     //!           MOS_STATUS_SUCCESS if success, else fail reason
1063     //!
InitKernelStateMbEncCodechalEncodeAvcEnc1064     virtual MOS_STATUS InitKernelStateMbEnc()
1065     {
1066         return MOS_STATUS_SUCCESS;
1067     }
1068 
1069     //!
1070     //! \brief    Init Weight Prediction kernel state
1071     //!
1072     //! \return   MOS_STATUS
1073     //!           MOS_STATUS_SUCCESS if success, else fail reason
1074     //!
InitKernelStateWPCodechalEncodeAvcEnc1075     virtual MOS_STATUS InitKernelStateWP()
1076     {
1077         return MOS_STATUS_SUCCESS;
1078     }
1079 
1080     //!
1081     //! \brief    Init BRC kernel state
1082     //!
1083     //! \return   MOS_STATUS
1084     //!           MOS_STATUS_SUCCESS if success, else fail reason
1085     //!
InitKernelStateBrcCodechalEncodeAvcEnc1086     virtual MOS_STATUS InitKernelStateBrc()
1087     {
1088         return MOS_STATUS_SUCCESS;
1089     }
1090 
1091     //!
1092     //! \brief    Init FEI PreProc kernel state
1093     //!
1094     //! \return   MOS_STATUS
1095     //!           MOS_STATUS_SUCCESS if success, else fail reason
1096     //!
InitKernelStatePreProcCodechalEncodeAvcEnc1097     virtual MOS_STATUS InitKernelStatePreProc()
1098     {
1099         return MOS_STATUS_SUCCESS;
1100     }
1101 
1102     //!
1103     //! \brief    Init SFD(still frame detection) kernel state
1104     //!
1105     //! \return   MOS_STATUS
1106     //!           MOS_STATUS_SUCCESS if success, else fail reason
1107     //!
1108     virtual MOS_STATUS InitKernelStateSFD();
1109 
1110     //!
1111     //! \brief    Init kernel state
1112     //!
1113     //! \return   MOS_STATUS
1114     //!           MOS_STATUS_SUCCESS if success, else fail reason
1115     //!
1116     virtual MOS_STATUS InitKernelState();
1117 
1118     //!
1119     //! \brief    Insert RefPic Select List
1120     //!
1121     //! \return   MOS_STATUS
1122     //!           MOS_STATUS_SUCCESS if success, else fail reason
1123     //!
1124     MOS_STATUS InsertInRefPicSelectList();
1125 
1126     //!
1127     //! \brief    Run MbEnc Kernel.
1128     //!
1129     //! \param    [in] mbEncIFrameDistInUse
1130     //!           MbEncIFrameDist in use or not
1131     //!
1132     //! \return   MOS_STATUS
1133     //!           MOS_STATUS_SUCCESS if success, else fail reason
1134     //!
1135     virtual MOS_STATUS MbEncKernel(
1136         bool mbEncIFrameDistInUse);
1137 
1138     //!
1139     //! \brief    Run Brc Frame Update Kernel.
1140     //!
1141     //! \return   MOS_STATUS
1142     //!           MOS_STATUS_SUCCESS if success, else fail reason
1143     //!
1144     MOS_STATUS BrcFrameUpdateKernel();
1145 
1146     //!
1147     //! \brief    Run Brc Copy Kernel.
1148     //!
1149     //! \return   MOS_STATUS
1150     //!           MOS_STATUS_SUCCESS if success, else fail reason
1151     //!
1152     MOS_STATUS BrcCopyKernel();
1153 
1154     //!
1155     //! \brief    Run Brc MB update Kernel.
1156     //!
1157     //! \return   MOS_STATUS
1158     //!           MOS_STATUS_SUCCESS if success, else fail reason
1159     //!
1160     MOS_STATUS BrcMbUpdateKernel();
1161 
1162     //!
1163     //! \brief    Run MbEnc Kernel.
1164     //!
1165     //! \param    [in] useRefPicList1
1166     //!           Use RefPicList 1 or Not.
1167     //! \param    [in] index
1168     //!           Index
1169     //!
1170     //! \return   MOS_STATUS
1171     //!           MOS_STATUS_SUCCESS if success, else fail reason
1172     //!
1173     MOS_STATUS WPKernel(
1174                     bool useRefPicList1,
1175                     uint32_t index);
1176 
1177     //!
1178     //! \brief    Run SFD(still frame detection) kernel
1179     //!
1180     //! \return   MOS_STATUS
1181     //!           MOS_STATUS_SUCCESS if success, else fail reason
1182     //!
1183     virtual MOS_STATUS SFDKernel();
1184 
1185     //!
1186     //! \brief    Get MbEnc kernel state Idx
1187     //!
1188     //! \param    [in] params
1189     //!           Pointer to the CodechalEncodeIdOffsetParams
1190     //! \param    [in] kernelOffset
1191     //!           kernel offset
1192     //!
1193     //! \return   MOS_STATUS
1194     //!           MOS_STATUS_SUCCESS if success, else fail reason
1195     //!
GetMbEncKernelStateIdxCodechalEncodeAvcEnc1196     virtual MOS_STATUS GetMbEncKernelStateIdx(
1197         CodechalEncodeIdOffsetParams*          params,
1198         uint32_t*                              kernelOffset)
1199     {
1200         return MOS_STATUS_SUCCESS;
1201     }
1202 
1203     //!
1204     //! \brief    Get MbEnc kernel curbe data
1205     //!
1206     //! \param    [in] params
1207     //!           Pointer to CODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS
1208     //!
1209     //! \return   MOS_STATUS
1210     //!           MOS_STATUS_SUCCESS if success, else fail reason
1211     //!
SetCurbeAvcMbEncCodechalEncodeAvcEnc1212     virtual MOS_STATUS SetCurbeAvcMbEnc(
1213         PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS params)
1214     {
1215         return MOS_STATUS_SUCCESS;
1216     }
1217 
1218     //!
1219     //! \brief    Set MFE MbEnc kernel curbe data
1220     //!
1221     //! \param    [in] mbEncIFrameDistInUse
1222     //!           MbEncIFrameDist in use or not
1223     //!
1224     //! \return   BOOL
1225     //!           true if MFE MbEnc is enabled, otherwise false
1226     //!
IsMfeMbEncEnabledCodechalEncodeAvcEnc1227     virtual bool IsMfeMbEncEnabled(
1228         bool mbEncIFrameDistInUse)
1229     {
1230         return false;
1231     }
1232 
1233     //!
1234     //! \brief    Init Mfe MbEnc kernel state
1235     //!
1236     //! \return   MOS_STATUS
1237     //!           MOS_STATUS_SUCCESS if success, else fail reason
1238     //!
InitKernelStateMfeMbEncCodechalEncodeAvcEnc1239     virtual MOS_STATUS InitKernelStateMfeMbEnc()
1240     {
1241         return MOS_STATUS_SUCCESS;
1242     }
1243 
1244     //!
1245     //! \brief    Defer init MFE specific resoruces and flags.
1246     //!
1247     //! \return   MOS_STATUS
1248     //!           MOS_STATUS_SUCCESS if success, else fail reason
1249     //!
InitMfeCodechalEncodeAvcEnc1250     virtual MOS_STATUS InitMfe()
1251     {
1252         return MOS_STATUS_SUCCESS;
1253     }
1254 
1255     //!
1256     //! \brief    Set MFE MbEnc kernel curbe data
1257     //!
1258     //! \param    [in] params
1259     //!           Pointer to CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS
1260     //!
1261     //! \return   MOS_STATUS
1262     //!           MOS_STATUS_SUCCESS if success, else fail reason
1263     //!
SetCurbeAvcMfeMbEncCodechalEncodeAvcEnc1264     virtual MOS_STATUS SetCurbeAvcMfeMbEnc(
1265         PCODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS params)
1266     {
1267         return MOS_STATUS_SUCCESS;
1268     }
1269 
1270     //!
1271     //! \brief    Update binding table for MFE MbEnc kernel
1272     //!
1273     //! \param    [in] submitIndex
1274     //!           Index in this mfe submission call
1275     //!
1276     //! \return   MOS_STATUS
1277     //!           MOS_STATUS_SUCCESS if success, else fail reason
1278     //!
UpdateMfeMbEncBindingTableCodechalEncodeAvcEnc1279     virtual MOS_STATUS UpdateMfeMbEncBindingTable(
1280         uint32_t submitIndex)
1281     {
1282         return MOS_STATUS_SUCCESS;
1283     }
1284 
1285     //!
1286     //! \brief    Get Weighted Prediction kernel curbe data
1287     //!
1288     //! \param    [in] params
1289     //!           Pointer to CODECHAL_ENCODE_AVC_WP_CURBE_PARAMS
1290     //!
1291     //! \return   MOS_STATUS
1292     //!           MOS_STATUS_SUCCESS if success, else fail reason
1293     //!
SetCurbeAvcWPCodechalEncodeAvcEnc1294     virtual MOS_STATUS SetCurbeAvcWP(
1295         PCODECHAL_ENCODE_AVC_WP_CURBE_PARAMS params)
1296     {
1297         return MOS_STATUS_SUCCESS;
1298     }
1299 
1300     //!
1301     //! \brief    Get FEI PreProc kernel curbe data
1302     //!
1303     //! \param    [in] params
1304     //!           Pointer to CODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS
1305     //!
1306     //! \return   MOS_STATUS
1307     //!           MOS_STATUS_SUCCESS if success, else fail reason
1308     //!
SetCurbeAvcPreProcCodechalEncodeAvcEnc1309     virtual MOS_STATUS SetCurbeAvcPreProc(
1310         PCODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS params)
1311     {
1312         return MOS_STATUS_SUCCESS;
1313     }
1314 
1315     //!
1316     //! \brief    Get BRC InitReset kernel curbe data
1317     //!
1318     //! \param    [in] params
1319     //!           Pointer to CODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS
1320     //!
1321     //! \return   MOS_STATUS
1322     //!           MOS_STATUS_SUCCESS if success, else fail reason
1323     //!
SetCurbeAvcBrcInitResetCodechalEncodeAvcEnc1324     virtual MOS_STATUS SetCurbeAvcBrcInitReset(
1325         PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS params)
1326     {
1327         return MOS_STATUS_SUCCESS;
1328     }
1329 
1330     //!
1331     //! \brief    Get FrameBRCUpdate kernel curbe data
1332     //!
1333     //! \param    [in] params
1334     //!           Pointer to CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS
1335     //!
1336     //! \return   MOS_STATUS
1337     //!           MOS_STATUS_SUCCESS if success, else fail reason
1338     //!
SetCurbeAvcFrameBrcUpdateCodechalEncodeAvcEnc1339     virtual MOS_STATUS SetCurbeAvcFrameBrcUpdate(
1340         PCODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS params)
1341     {
1342         return MOS_STATUS_SUCCESS;
1343     }
1344 
1345     //!
1346     //! \brief    Get MbBrcUpdate kernel curbe data
1347     //!
1348     //! \param    [in] params
1349     //!           Pointer to CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS
1350     //!
1351     //! \return   MOS_STATUS
1352     //!           MOS_STATUS_SUCCESS if success, else fail reason
1353     //!
SetCurbeAvcMbBrcUpdateCodechalEncodeAvcEnc1354     virtual MOS_STATUS SetCurbeAvcMbBrcUpdate(
1355         PCODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS params)
1356     {
1357         return MOS_STATUS_SUCCESS;
1358     }
1359 
1360     //!
1361     //! \brief    Get Brc Block Copy kernel curbe data
1362     //!
1363     //! \param    [in] params
1364     //!           Pointer to CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS
1365     //!
1366     //! \return   MOS_STATUS
1367     //!           MOS_STATUS_SUCCESS if success, else fail reason
1368     //!
SetCurbeAvcBrcBlockCopyCodechalEncodeAvcEnc1369     virtual MOS_STATUS SetCurbeAvcBrcBlockCopy(
1370         PCODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS params)
1371     {
1372         return MOS_STATUS_SUCCESS;
1373     }
1374 
1375     //!
1376     //! \brief    Get SFD kernel curbe data
1377     //!
1378     //! \param    [in] params
1379     //!           Pointer to CODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS
1380     //!
1381     //! \return   MOS_STATUS
1382     //!           MOS_STATUS_SUCCESS if success, else fail reason
1383     //!
1384     virtual MOS_STATUS SetCurbeAvcSFD(
1385         PCODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS params);
1386 
1387     //!
1388     //! \brief    Set Sequence Structs
1389     //!
1390     //! \return   MOS_STATUS
1391     //!           MOS_STATUS_SUCCESS if success, else fail reason
1392     //!
1393     virtual MOS_STATUS SetSequenceStructs() override;
1394 
1395     //!
1396     //! \brief    Set Sequence Structs
1397     //!
1398     //! \return   MOS_STATUS
1399     //!           MOS_STATUS_SUCCESS if success, else fail reason
1400     //!
1401     virtual MOS_STATUS SetPictureStructs() override;
1402 
1403     //!
1404     //! \brief    Set slice Structs
1405     //!
1406     //! \return   MOS_STATUS
1407     //!           MOS_STATUS_SUCCESS if success, else fail reason
1408     //!
1409     MOS_STATUS SetSliceStructs() override;
1410 
1411     //!
1412     //! \brief    Set BRC InitReset kernel Surface
1413     //!
1414     //! \param    [in] cmdBuffer
1415     //!           Cmd Buffer
1416     //! \param    [in] params
1417     //!           Pointer to CODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS
1418     //!
1419     //! \return   MOS_STATUS
1420     //!           MOS_STATUS_SUCCESS if success, else fail reason
1421     //!
1422     MOS_STATUS SendBrcInitResetSurfaces(
1423         PMOS_COMMAND_BUFFER cmdBuffer,
1424         PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS params);
1425 
1426     //!
1427     //! \brief    Set MbEnc kernel Surface data
1428     //!
1429     //! \param    [in] cmdBuffer
1430     //!           Cmd Buffer
1431     //! \param    [in] params
1432     //!           Pointer to CODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS
1433     //!
1434     //! \return   MOS_STATUS
1435     //!           MOS_STATUS_SUCCESS if success, else fail reason
1436     //!
SendAvcMbEncSurfacesCodechalEncodeAvcEnc1437     virtual MOS_STATUS SendAvcMbEncSurfaces(
1438         PMOS_COMMAND_BUFFER cmdBuffer,
1439         PCODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS params)
1440     {
1441         return MOS_STATUS_SUCCESS;
1442     }
1443 
1444     //!
1445     //! \brief    Set Weighted Prediction kernel Surface state
1446     //!
1447     //! \param    [in] cmdBuffer
1448     //!           Cmd Buffer
1449     //! \param    [in] params
1450     //!           Pointer to CODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS
1451     //!
1452     //! \return   MOS_STATUS
1453     //!           MOS_STATUS_SUCCESS if success, else fail reason
1454     //!
SendAvcWPSurfacesCodechalEncodeAvcEnc1455     virtual MOS_STATUS SendAvcWPSurfaces(
1456         PMOS_COMMAND_BUFFER cmdBuffer,
1457         PCODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS params)
1458     {
1459         return MOS_STATUS_SUCCESS;
1460     }
1461 
1462     //!
1463     //! \brief    Set FEI PreProc kernel Surface state
1464     //!
1465     //! \param    [in] cmdBuffer
1466     //!           Cmd Buffer
1467     //! \param    [in] params
1468     //!           Pointer to CODECHAL_ENCODE_AVC_PREPROC_SURFACE_PARAMS
1469     //!
1470     //! \return   MOS_STATUS
1471     //!           MOS_STATUS_SUCCESS if success, else fail reason
1472     //!
SendAvcPreProcSurfacesCodechalEncodeAvcEnc1473     virtual MOS_STATUS SendAvcPreProcSurfaces(
1474         PMOS_COMMAND_BUFFER cmdBuffer,
1475         PCODECHAL_ENCODE_AVC_PREPROC_SURFACE_PARAMS params)
1476     {
1477         return MOS_STATUS_SUCCESS;
1478     }
1479 
1480     //!
1481     //! \brief    Set BrcFrameUpdate kernel Surface state
1482     //!
1483     //! \param    [in] cmdBuffer
1484     //!           Cmd Buffer
1485     //! \param    [in] params
1486     //!           pointer to CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS
1487     //!
1488     //! \return   MOS_STATUS
1489     //!           MOS_STATUS_SUCCESS if success, else fail reason
1490     //!
SendAvcBrcFrameUpdateSurfacesCodechalEncodeAvcEnc1491     virtual MOS_STATUS SendAvcBrcFrameUpdateSurfaces(
1492         PMOS_COMMAND_BUFFER cmdBuffer,
1493         PCODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS params)
1494     {
1495         return MOS_STATUS_SUCCESS;
1496     }
1497 
1498     //!
1499     //! \brief    Set BrcMbUpdate kernel Surface state
1500     //!
1501     //! \param    [in] cmdBuffer
1502     //!           Cmd Buffer
1503     //! \param    [in] params
1504     //!           Pointer to CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS
1505     //!
1506     //! \return   MOS_STATUS
1507     //!           MOS_STATUS_SUCCESS if success, else fail reason
1508     //!
SendAvcBrcMbUpdateSurfacesCodechalEncodeAvcEnc1509     virtual MOS_STATUS SendAvcBrcMbUpdateSurfaces(
1510         PMOS_COMMAND_BUFFER cmdBuffer,
1511         PCODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS params)
1512     {
1513         return MOS_STATUS_SUCCESS;
1514     }
1515 
1516     //!
1517     //! \brief    Set SFD kernel Surface state
1518     //!
1519     //! \param    [in] cmdBuffer
1520     //!           Cmd Buffer
1521     //! \param    [in] params
1522     //!           Pointer to CODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS
1523     //!
1524     //! \return   MOS_STATUS
1525     //!           MOS_STATUS_SUCCESS if success, else fail reason
1526     //!
1527     virtual MOS_STATUS SendAvcSFDSurfaces(
1528         PMOS_COMMAND_BUFFER cmdBuffer,
1529         PCODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS params);
1530 
1531     //!
1532     //! \brief    Set ROI kernel Surface state
1533     //!
1534     //! \return   MOS_STATUS
1535     //!           MOS_STATUS_SUCCESS if success, else fail reason
1536     //!
SetupROISurfaceCodechalEncodeAvcEnc1537     virtual MOS_STATUS SetupROISurface()
1538     {
1539         return MOS_STATUS_SUCCESS;
1540     }
1541 
1542     //!
1543     //! \brief  Inserts the generic prologue command for a command buffer
1544     //! \param  [in] cmdBuffer
1545     //!         Command buffer
1546     //! \param  [in] frameTracking
1547     //!         Indicate if frame tracking requested
1548     //! \return MOS_STATUS
1549     //!         MOS_STATUS_SUCCESS if success, else fail reason
1550     //!
1551     virtual MOS_STATUS SendPrologWithFrameTracking(
1552         PMOS_COMMAND_BUFFER         cmdBuffer,
1553         bool                        frameTracking,
1554         MHW_MI_MMIOREGISTERS       *mmioRegister = nullptr) override;
1555 
1556     //!
1557     //! \brief  Realize the scene change report
1558     //! \param  [in] cmdBuffer
1559     //!         Command buffer
1560     //!         [in]  params
1561     //!           Pointer to the CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS
1562     //! \return MOS_STATUS
1563     //!         MOS_STATUS_SUCCESS if success
1564     //!
SceneChangeReportCodechalEncodeAvcEnc1565     virtual MOS_STATUS SceneChangeReport(
1566         PMOS_COMMAND_BUFFER       cmdBuffer,
1567         PCODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS  params)
1568     {
1569         return MOS_STATUS_SUCCESS;
1570     };
1571 
1572     //! \brief    Dump encode kernel output
1573     //!
1574     //! \return   MOS_STATUS
1575     //!           MOS_STATUS_SUCCESS if success, else fail reason
1576     //!
1577     MOS_STATUS DumpEncodeKernelOutput();
1578 
1579     //!
1580     //! \brief    Calculate skip value
1581     //! \param    [in] encBlockBasedSkipEn
1582     //!           Indicate if encode block Based skip enabled
1583     //! \param    [in] transform8x8Flag
1584     //!           Indicate if transform8*8 makes effect
1585     //! \param    [in] skipVal
1586     //!           input Skip value
1587     //! \return   uint16_t
1588     //!           return the updated Skip value
1589     //!
1590     uint16_t CalcSkipVal(
1591         bool    encBlockBasedSkipEn,
1592         bool    transform8x8Flag,
1593         uint16_t  skipVal);
1594 
1595     //!
1596     //! \brief    Get Max MV value per 2 mbs based on LevelIdc
1597     //! \details  VDBOX private function to get max MV value per 2 mbs
1598     //! \param    [in] levelIdc
1599     //!           AVC level
1600     //! \return   uint32_t
1601     //!           return the max mv value per 2 mbs
1602     //!
1603     uint32_t GetMaxMvsPer2Mb(uint8_t levelIdc);
1604 
1605      //!
1606      //! \brief    Get QP value
1607      //! \param    [in] params
1608      //!           AVC mbenc cubre params
1609      //! \param    [in] list
1610      //!           forword or backword reference
1611      //! \param    [in] index
1612      //!           reference frame index
1613      //! \return   uint8_t
1614      //!           return 0
1615     uint32_t GetRefPicFieldFlag(
1616         PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS     params,
1617         uint32_t                                    list,
1618         uint32_t                                    index);
1619 
1620      //!
1621      //! \brief    Get QP value
1622      //! \param    [in] params
1623      //!           AVC mbenc cubre params
1624      //! \param    [list] list
1625      //!           forword or backword reference
1626      //! \param    [in] index
1627      //!           reference frame index
1628      //! \return   uint8_t
1629      //!           return 0
1630     uint8_t AVCGetQPValueFromRefList(
1631         PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS     params,
1632         uint32_t                                    list,
1633         uint32_t                                    index);
1634 
1635      //!
1636      //! \brief    Send surfaces for the AVC BRC Block Copy kernel
1637      //! \param    [in] hwInterface
1638      //!           Hardware interface
1639      //! \param    [in] cmdBuffer
1640      //!           comand buffer
1641      //! \param    [in] mbEncKernelState
1642      //!           MB encoder kernel state
1643      //! \param    [in] kernelState
1644      //!           Kernel State
1645      //! \param    [in] presAdvancedDsh
1646      //!           pmos resource
1647      //! \return   MOS_STATUS
1648      //!           MOS_STATUS_SUCCESS if success, else fail reason
1649      //!
1650     MOS_STATUS SendBrcBlockCopySurfaces(
1651         CodechalHwInterface    *hwInterface,
1652         PMOS_COMMAND_BUFFER     cmdBuffer,
1653         PMHW_KERNEL_STATE       mbEncKernelState,
1654         PMHW_KERNEL_STATE       kernelState,
1655         PMOS_RESOURCE           presAdvancedDsh);
1656 
1657 #if USE_CODECHAL_DEBUG_TOOL
1658 protected:
1659     virtual MOS_STATUS DumpSeqParFile()  override;
1660     virtual MOS_STATUS DumpFrameParFile() override;
1661 
1662     virtual MOS_STATUS PopulateHmeParam(
1663         bool    is16xMeEnabled,
1664         bool    is32xMeEnabled,
1665         uint8_t meMethod,
1666         void    *cmd) override;
1667 #endif
1668 };
1669 #endif  // __CODECHAL_ENCODE_AVC_H__
1670