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_encode_avc_base.h
24 //! \brief    Defines base class for AVC encoder.
25 //!
26 
27 #ifndef __CODECHAL_ENCODE_AVC_BASE_H__
28 #define __CODECHAL_ENCODE_AVC_BASE_H__
29 
30 #include "codechal_encoder_base.h"
31 #include "codechal_kernel_hme.h"
32 #if USE_CODECHAL_DEBUG_TOOL
33 #include "codechal_debug_encode_par.h"
34 #endif
35 
36 #define CODECHAL_ENCODE_AVC_INVALID_ROUNDING                0xFF
37 #define CODECHAL_ENCODE_AVC_NUM_SYNC_TAGS                   64
38 #define CODECHAL_ENCODE_AVC_INIT_DSH_SIZE                   MHW_PAGE_SIZE * 3
39 #define CODECHAL_ENCODE_AVC_MAX_SLICE_QP                    (CODEC_AVC_NUM_QP - 1) // 0 - 51 inclusive
40 #define CODECHAL_ENCODE_AVC_MIN_ICQ_QUALITYFACTOR           1
41 #define CODECHAL_ENCODE_AVC_MAX_ICQ_QUALITYFACTOR           51
42 #define CODECHAL_ENCODE_AVC_MAX_SLICES_SUPPORTED            256
43 #define CODECHAL_ENCODE_AVC_DEFAULT_AVBR_ACCURACY           30
44 #define CODECHAL_ENCODE_AVC_MIN_AVBR_CONVERGENCE            100
45 #define CODECHAL_ENCODE_AVC_DEFAULT_AVBR_CONVERGENCE        150
46 #define CODECHAL_ENCODE_AVC_REF_PIC_SELECT_ENTRIES          (CODEC_AVC_MAX_NUM_REF_FRAME + 1) // one extra for current picture
47 // Invalid AVC PicID
48 #define CODECHAL_ENCODE_AVC_INVALID_PIC_ID                      CODEC_AVC_NUM_UNCOMPRESSED_SURFACE
49 
50 #define CODECHAL_ENCODE_AVC_SFD_OUTPUT_BUFFER_SIZE_COMMON   128
51 
52 #if USE_CODECHAL_DEBUG_TOOL
53 #define CODECHAL_DEBUG_ENCODE_AVC_NAL_START_CODE_SEI        0x00000106
54 #define CODECHAL_DEBUG_ENCODE_AVC_NAL_START_CODE_PPS        0x00000128
55 
56 struct EncodeAvcPar
57 {
58     // DDI Params
59     uint8_t                     ProfileIDC;
60     uint8_t                     LevelIDC;
61     uint8_t                     CabacInitIDC;
62     uint8_t                     ChromaFormatIDC;
63     uint8_t                     PictureCodingType;
64     uint8_t                     MaxRefIdxL0;
65     uint8_t                     MaxRefIdxL1;
66     uint8_t                     MaxBRefIdxL0;
67     uint8_t                     BRCMethod;
68     uint8_t                     BRCType;
69     uint8_t                     DeblockingIDC;
70     uint8_t                     WeightedPred;
71     uint8_t                     WeightedBiPred;
72     char                        ChromaQpOffset;
73     char                        SecondChromaQpOffset;
74     char                        ISliceQP;
75     char                        PSliceQP;
76     char                        BSliceQP;
77     char                        DeblockingFilterAlpha;
78     char                        DeblockingFilterBeta;
79     bool                        EnableSEI;
80     bool                        DisableVUIHeader;
81     bool                        EnableWeightPredictionDetection;
82     bool                        EntropyCodingMode;
83     bool                        DirectInference;
84     bool                        Transform8x8Mode;
85     bool                        UseOrigAsRef;
86     bool                        BiSubMbPartMask;
87     uint16_t                    NumP;
88     uint16_t                    NumB;
89     uint16_t                    FrameRateM;
90     uint16_t                    FrameRateD;
91     uint16_t                    CRFQualityFactor;
92     uint32_t                    NumSlices;
93     uint32_t                    SliceHeight;
94     uint32_t                    NumSuperSlices;
95     uint32_t                    SuperSliceHeight[CODECHAL_ENCODE_AVC_MAX_SLICES_SUPPORTED];
96     bool                        ConstrainedIntraPred;
97     uint8_t                     SliceMode;
98     int16_t                     hme0XOffset;
99     int16_t                     hme0YOffset;
100     int16_t                     hme1XOffset;
101     int16_t                     hme1YOffset;
102 
103     // HME Params
104     uint8_t                     SuperCombineDist;
105     bool                        SuperHME;
106     bool                        UltraHME;
107     bool                        StreamInEnable;
108     uint8_t                     StreamInL0FromNewRef;
109     uint8_t                     StreamInL1FromNewRef;
110 
111     // BRC init Params
112     bool                        MBBRCEnable;
113     bool                        MBRC;
114     uint16_t                    AvbrAccuracy;
115     uint16_t                    AvbrConvergence;
116     uint32_t                    BitRate;
117     uint32_t                    InitVbvFullnessInBit;
118     uint32_t                    MaxBitRate;
119     uint32_t                    VbvSzInBit;
120     uint32_t                    SlidingWindowEnable;
121     uint32_t                    SlidingWindowSize;
122     uint32_t                    SlidingWindowMaxRateRatio;
123     uint32_t                    LowDelayGoldenFrameBoost;
124     uint32_t                    TopQPDeltaThrforAdaptive2Pass;
125     uint32_t                    BotQPDeltaThrforAdaptive2Pass;
126     uint32_t                    TopFrmSzPctThrforAdaptive2Pass;
127     uint32_t                    BotFrmSzPctThrforAdaptive2Pass;
128     uint32_t                    MBHeaderCompensation;
129     uint32_t                    QPSelectMethodforFirstPass;
130     bool                        MBQpCtrl;
131     bool                        ICQReEncode;
132     bool                        AdaptiveCostAdjustEnable;
133     bool                        AdaptiveHMEExtension;
134     uint32_t                    QPMin;
135     uint32_t                    QPMax;
136     bool                        HrdConformanceCheckDisable;
137     uint8_t                     StreamInStaticRegion;
138     uint8_t                     ScenarioInfo;
139     bool                        SliceSizeWA;
140     uint32_t                    INumMbsLag;
141     uint32_t                    PNumMbsLag;
142     uint32_t                    LongTermInterval;
143 
144     // BRC frame update Params
145     bool                        EnableMultipass;
146     uint8_t                     MaxNumPakPasses;
147     uint32_t                    UserMaxFrame;
148     uint32_t                    UserMaxFrameP;
149     bool                        FrameSkipEnable;
150     bool                        SceneChgDetectEn;
151     uint32_t                    SceneChgPrevIntraPctThresh;
152     uint32_t                    SceneChgCurIntraPctThresh;
153     uint32_t                    SceneChgWidth0;
154     uint32_t                    SceneChgWidth1;
155     bool                        Transform8x8PDisable;
156     uint32_t                    SliceSizeThr;
157     uint32_t                    SliceMaxSize;
158 
159     // Enc Params
160     uint8_t                     SubPelMode;
161     uint8_t                     MaxLenSP;
162     uint8_t                     MEMethod;
163     uint8_t                     BMEMethod;
164     uint8_t                     HMECombineOverlap;
165     uint8_t                     SearchX;
166     uint8_t                     SearchY;
167     uint8_t                     BSearchX;
168     uint8_t                     BSearchY;
169     uint8_t                     SearchControl;
170     uint8_t                     BSearchControl;
171     uint8_t                     BiMixDisable;
172     uint32_t                    BiWeight;
173     bool                        DisableExtendedMvCostRange;
174     bool                        EnableAdaptiveSearch;
175     bool                        EnableFBRBypass;
176     bool                        BlockBasedSkip;
177     bool                        MADEnableFlag;
178     bool                        EnableMBFlatnessCheckOptimization;
179     bool                        EnableArbitrarySliceSize;
180     bool                        EnableWavefrontOptimization;
181     bool                        BSkipType;
182     bool                        EnableAdaptiveTxDecision;
183     bool                        EnablePerMBStaticCheck;
184     bool                        EnableAdaptiveSearchWindowSize;
185     bool                        EnableIntraCostScalingForStaticFrame;
186     uint32_t                    StaticFrameZMVPercent;
187     uint32_t                    StaticFrameIntraCostScalingRatioP;
188     uint32_t                    StaticFrameIntraCostScalingRatioB;
189     bool                        AdaptiveMvStreamIn;
190     uint32_t                    LargeMvThresh;
191     uint32_t                    LargeMvPctThreshold;
192     bool                        UniMixDisable;
193     bool                        DirectMode;
194     uint16_t                    RefThresh;
195     uint16_t                    MBTextureThreshold;
196     uint16_t                    TxDecisionThr;
197     uint32_t                    MRDisableQPCheck;
198     uint32_t                    AllFractional;
199     uint32_t                    DisableAllFractionalCheckForHighRes;
200     uint32_t                    HMECombineLen;
201     uint32_t                    HMEBCombineLen;
202     uint32_t                    FTQBasedSkip;
203     uint32_t                    MultiplePred;
204     uint32_t                    EnableAdaptiveIntraScaling;
205     uint32_t                    SurvivedSkipCost;
206     bool                        VDEncPerfMode;
207     bool                        VdencExtPakObjDisable;
208     bool                        PPMVDisable;
209     uint8_t                     LeftNbrPelMode;
210     uint8_t                     DisPSubPartMask;
211     uint8_t                     DisPSubMbMask;
212     uint8_t                     DisBSubPartMask;
213     uint8_t                     DisBSubMbMask;
214     uint8_t                     ImePredOverlapThr;
215     uint8_t                     MBSizeEstScalingRatioINTRA;
216     bool                        IntraMBHdrScaleFactor;
217     uint8_t                     MBSizeEstScalingRatioINTER;
218     bool                        InterMBHdrScaleFactor;
219     uint8_t                     PFrameMaxNumImePred;
220     uint8_t                     BFrameMaxNumImePred;
221     uint8_t                     HMERefWindowSize;
222     uint8_t                     IMELeftPredDep;
223     uint8_t                     NumFMECandCheck;
224     uint8_t                     PFrameImePredLargeSW;
225     uint8_t                     BFrameImePredLargeSW;
226     bool                        RdoChromaEnable;
227     uint16_t                    Intra4x4ModeMask;
228     uint16_t                    Intra8x8ModeMask;
229     bool                        RdoIntraChromaSearch;
230     uint8_t                     Intra16x16ModeMask;
231     uint8_t                     InitMBBudgetTr4x4;
232     bool                        ROIEnable;
233     uint8_t                     PFrameZeroCbfEn;
234     uint8_t                     BFrameZeroCbfEn;
235     uint8_t                     ForceIPCMMinQP;
236     uint8_t                     IntraTr4x4Percent;
237     bool                        MultiPassHmeEnable;
238     uint32_t                    IntraPredictionIFrame;
239     uint32_t                    IntraPrediction;
240 
241     // PAK Params
242     uint8_t                     RoundingIntra;
243     bool                        RoundingIntraEnabled;
244     bool                        EnableAdaptiveRounding;
245     bool                        RoundingInterEnabled;
246     bool                        EnableAdaptiveTrellisQuantization;
247     bool                        TrellisQuantizationEnable;
248     bool                        TrellisQuantizationChromaDisable;
249     uint32_t                    RoundingInter;
250     uint32_t                    RoundingInterB;
251     uint32_t                    TrellisQuantizationRounding;
252     uint8_t                     FrmHdrEncodingFrequency;
253     bool                        ExtendedRhoDomainEn;
254 };
255 #endif
256 
257 static const uint8_t CodecHal_TargetUsageToMode_AVC[NUM_TARGET_USAGE_MODES] =
258 { encodeNormalMode,  encodeQualityMode,  encodeQualityMode, encodeNormalMode,
259 encodeNormalMode, encodeNormalMode, encodeNormalMode, encodePerformanceMode };
260 
261 typedef struct _CODEC_AVC_REF_PIC_SELECT_LIST
262 {
263     uint8_t                 FrameIdx;
264     MOS_SURFACE             sBuffer;
265 } CODEC_AVC_REF_PIC_SELECT_LIST, *PCODEC_AVC_REF_PIC_SELECT_LIST;
266 
267 typedef struct _CODECHAL_ENCODE_AVC_TQ_PARAMS
268 {
269     uint32_t    dwTqEnabled;
270     uint32_t    dwTqRounding;
271 } CODECHAL_ENCODE_AVC_TQ_PARAMS, *PCODECHAL_ENCODE_AVC_TQ_PARAMS;
272 
273 typedef struct _CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS
274 {
275     PMOS_SURFACE                psPreDeblockSurface;
276     PMOS_SURFACE                psPostDeblockSurface;
277     PMOS_RESOURCE               presMacroblockIldbStreamOutBuffer1;
278     PMOS_RESOURCE               presMacroblockIldbStreamOutBuffer2;
279 
280     bool                        bBrcEnabled;
281     PMHW_BATCH_BUFFER           pImgStateBatchBuffer;
282     PMOS_RESOURCE               presBrcHistoryBuffer;
283 
284     bool                        bDeblockerStreamOutEnable;
285     bool                        bPostDeblockOutEnable;
286     bool                        bPreDeblockOutEnable;
287     bool                        bPerMBStreamOutEnable;
288 } CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS, *PCODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS;
289 
290 typedef struct _CODECHAL_ENCODE_AVC_ME_CURBE
291 {
292     // DW0
293     union
294     {
295         struct
296         {
297             uint32_t   SkipModeEn                          : MOS_BITFIELD_BIT(       0 );
298             uint32_t   AdaptiveEn                          : MOS_BITFIELD_BIT(       1 );
299             uint32_t   BiMixDis                            : MOS_BITFIELD_BIT(       2 );
300             uint32_t                                       : MOS_BITFIELD_RANGE(  3, 4 );
301             uint32_t   EarlyImeSuccessEn                   : MOS_BITFIELD_BIT(       5 );
302             uint32_t                                       : MOS_BITFIELD_BIT(       6 );
303             uint32_t   T8x8FlagForInterEn                  : MOS_BITFIELD_BIT(       7 );
304             uint32_t                                       : MOS_BITFIELD_RANGE(  8,23 );
305             uint32_t   EarlyImeStop                        : MOS_BITFIELD_RANGE( 24,31 );
306         };
307         struct
308         {
309             uint32_t   Value;
310         };
311     } DW0;
312 
313     // DW1
314     union
315     {
316         struct
317         {
318             uint32_t   MaxNumMVs                           : MOS_BITFIELD_RANGE(  0, 5 );
319             uint32_t                                       : MOS_BITFIELD_RANGE(  6,15 );
320             uint32_t   BiWeight                            : MOS_BITFIELD_RANGE( 16,21 );
321             uint32_t                                       : MOS_BITFIELD_RANGE( 22,27 );
322             uint32_t   UniMixDisable                       : MOS_BITFIELD_BIT(      28 );
323             uint32_t                                       : MOS_BITFIELD_RANGE( 29,31 );
324         };
325         struct
326         {
327             uint32_t   Value;
328         };
329     } DW1;
330 
331     // DW2
332     union
333     {
334         struct
335         {
336             uint32_t   MaxLenSP                            : MOS_BITFIELD_RANGE(  0, 7 );
337             uint32_t   MaxNumSU                            : MOS_BITFIELD_RANGE(  8,15 );
338             uint32_t                                       : MOS_BITFIELD_RANGE( 16,31 );
339         };
340         struct
341         {
342             uint32_t   Value;
343         };
344     } DW2;
345 
346     // DW3
347     union
348     {
349         struct
350         {
351             uint32_t   SrcSize                             : MOS_BITFIELD_RANGE(  0, 1 );
352             uint32_t                                       : MOS_BITFIELD_RANGE(  2, 3 );
353             uint32_t   MbTypeRemap                         : MOS_BITFIELD_RANGE(  4, 5 );
354             uint32_t   SrcAccess                           : MOS_BITFIELD_BIT(       6 );
355             uint32_t   RefAccess                           : MOS_BITFIELD_BIT(       7 );
356             uint32_t   SearchCtrl                          : MOS_BITFIELD_RANGE(  8,10 );
357             uint32_t   DualSearchPathOption                : MOS_BITFIELD_BIT(      11 );
358             uint32_t   SubPelMode                          : MOS_BITFIELD_RANGE( 12,13 );
359             uint32_t   SkipType                            : MOS_BITFIELD_BIT(      14 );
360             uint32_t   DisableFieldCacheAlloc              : MOS_BITFIELD_BIT(      15 );
361             uint32_t   InterChromaMode                     : MOS_BITFIELD_BIT(      16 );
362             uint32_t   FTEnable                            : MOS_BITFIELD_BIT(      17 );
363             uint32_t   BMEDisableFBR                       : MOS_BITFIELD_BIT(      18 );
364             uint32_t   BlockBasedSkipEnable                : MOS_BITFIELD_BIT(      19 );
365             uint32_t   InterSAD                            : MOS_BITFIELD_RANGE( 20,21 );
366             uint32_t   IntraSAD                            : MOS_BITFIELD_RANGE( 22,23 );
367             uint32_t   SubMbPartMask                       : MOS_BITFIELD_RANGE( 24,30 );
368             uint32_t                                       : MOS_BITFIELD_BIT(      31 );
369         };
370         struct
371         {
372             uint32_t   Value;
373         };
374     } DW3;
375 
376     // DW4
377     union
378     {
379         struct
380         {
381             uint32_t                                       : MOS_BITFIELD_RANGE(  0, 7 );
382             uint32_t   PictureHeightMinus1                 : MOS_BITFIELD_RANGE(  8,15 );
383             uint32_t   PictureWidth                        : MOS_BITFIELD_RANGE( 16,23 );
384             uint32_t                                       : MOS_BITFIELD_RANGE( 24,31 );
385         };
386         struct
387         {
388             uint32_t   Value;
389         };
390     } DW4;
391 
392     // DW5
393     union
394     {
395         struct
396         {
397             uint32_t                                       : MOS_BITFIELD_RANGE(  0, 7 );
398             uint32_t   QpPrimeY                            : MOS_BITFIELD_RANGE(  8,15 );
399             uint32_t   RefWidth                            : MOS_BITFIELD_RANGE( 16,23 );
400             uint32_t   RefHeight                           : MOS_BITFIELD_RANGE( 24,31 );
401         };
402         struct
403         {
404             uint32_t   Value;
405         };
406     } DW5;
407 
408     // DW6
409     union
410     {
411         struct
412         {
413             uint32_t                                       : MOS_BITFIELD_RANGE(  0, 2 );
414             uint32_t   WriteDistortions                    : MOS_BITFIELD_BIT(       3 );
415             uint32_t   UseMvFromPrevStep                   : MOS_BITFIELD_BIT(       4 );
416             uint32_t                                       : MOS_BITFIELD_RANGE(  5, 7 );
417             uint32_t   SuperCombineDist                    : MOS_BITFIELD_RANGE(  8,15 );
418             uint32_t   MaxVmvR                             : MOS_BITFIELD_RANGE( 16,31 );
419         };
420         struct
421         {
422             uint32_t   Value;
423         };
424     } DW6;
425 
426     // DW7
427     union
428     {
429         struct
430         {
431             uint32_t                                       : MOS_BITFIELD_RANGE(  0,15 );
432             uint32_t   MVCostScaleFactor                   : MOS_BITFIELD_RANGE( 16,17 );
433             uint32_t   BilinearEnable                      : MOS_BITFIELD_BIT(      18 );
434             uint32_t   SrcFieldPolarity                    : MOS_BITFIELD_BIT(      19 );
435             uint32_t   WeightedSADHAAR                     : MOS_BITFIELD_BIT(      20 );
436             uint32_t   AConlyHAAR                          : MOS_BITFIELD_BIT(      21 );
437             uint32_t   RefIDCostMode                       : MOS_BITFIELD_BIT(      22 );
438             uint32_t                                       : MOS_BITFIELD_BIT(      23 );
439             uint32_t   SkipCenterMask                      : MOS_BITFIELD_RANGE( 24,31 );
440         };
441         struct
442         {
443             uint32_t   Value;
444         };
445     } DW7;
446 
447     // DW8
448     union
449     {
450         struct
451         {
452             uint32_t   Mode0Cost                           : MOS_BITFIELD_RANGE(  0, 7 );
453             uint32_t   Mode1Cost                           : MOS_BITFIELD_RANGE(  8,15 );
454             uint32_t   Mode2Cost                           : MOS_BITFIELD_RANGE( 16,23 );
455             uint32_t   Mode3Cost                           : MOS_BITFIELD_RANGE( 24,31 );
456         };
457         struct
458         {
459             uint32_t   Value;
460         };
461     } DW8;
462 
463     // DW9
464     union
465     {
466         struct
467         {
468             uint32_t   Mode4Cost                           : MOS_BITFIELD_RANGE(  0, 7 );
469             uint32_t   Mode5Cost                           : MOS_BITFIELD_RANGE(  8,15 );
470             uint32_t   Mode6Cost                           : MOS_BITFIELD_RANGE( 16,23 );
471             uint32_t   Mode7Cost                           : MOS_BITFIELD_RANGE( 24,31 );
472         };
473         struct
474         {
475             uint32_t   Value;
476         };
477     } DW9;
478 
479     // DW10
480     union
481     {
482         struct
483         {
484             uint32_t   Mode8Cost                           : MOS_BITFIELD_RANGE(  0, 7 );
485             uint32_t   Mode9Cost                           : MOS_BITFIELD_RANGE(  8,15 );
486             uint32_t   RefIDCost                           : MOS_BITFIELD_RANGE( 16,23 );
487             uint32_t   ChromaIntraModeCost                 : MOS_BITFIELD_RANGE( 24,31 );
488         };
489         struct
490         {
491             uint32_t   Value;
492         };
493     } DW10;
494 
495     // DW11
496     union
497     {
498         struct
499         {
500             uint32_t   MV0Cost                             : MOS_BITFIELD_RANGE(  0, 7 );
501             uint32_t   MV1Cost                             : MOS_BITFIELD_RANGE(  8,15 );
502             uint32_t   MV2Cost                             : MOS_BITFIELD_RANGE( 16,23 );
503             uint32_t   MV3Cost                             : MOS_BITFIELD_RANGE( 24,31 );
504         };
505         struct
506         {
507             uint32_t   Value;
508         };
509     } DW11;
510 
511     // DW12
512     union
513     {
514         struct
515         {
516             uint32_t   MV4Cost                             : MOS_BITFIELD_RANGE(  0, 7 );
517             uint32_t   MV5Cost                             : MOS_BITFIELD_RANGE(  8,15 );
518             uint32_t   MV6Cost                             : MOS_BITFIELD_RANGE( 16,23 );
519             uint32_t   MV7Cost                             : MOS_BITFIELD_RANGE( 24,31 );
520         };
521         struct
522         {
523             uint32_t   Value;
524         };
525     } DW12;
526 
527     // DW13
528     union
529     {
530         struct
531         {
532             uint32_t   NumRefIdxL0MinusOne                 : MOS_BITFIELD_RANGE(  0, 7 );
533             uint32_t   NumRefIdxL1MinusOne                 : MOS_BITFIELD_RANGE(  8,15 );
534             uint32_t   RefStreaminCost                     : MOS_BITFIELD_RANGE( 16,23 );
535             uint32_t   ROIEnable                           : MOS_BITFIELD_RANGE( 24,26 );
536             uint32_t                                       : MOS_BITFIELD_RANGE( 27,31 );
537         };
538         struct
539         {
540             uint32_t   Value;
541         };
542     } DW13;
543 
544     // DW14
545     union
546     {
547         struct
548         {
549             uint32_t   List0RefID0FieldParity              : MOS_BITFIELD_BIT(       0 );
550             uint32_t   List0RefID1FieldParity              : MOS_BITFIELD_BIT(       1 );
551             uint32_t   List0RefID2FieldParity              : MOS_BITFIELD_BIT(       2 );
552             uint32_t   List0RefID3FieldParity              : MOS_BITFIELD_BIT(       3 );
553             uint32_t   List0RefID4FieldParity              : MOS_BITFIELD_BIT(       4 );
554             uint32_t   List0RefID5FieldParity              : MOS_BITFIELD_BIT(       5 );
555             uint32_t   List0RefID6FieldParity              : MOS_BITFIELD_BIT(       6 );
556             uint32_t   List0RefID7FieldParity              : MOS_BITFIELD_BIT(       7 );
557             uint32_t   List1RefID0FieldParity              : MOS_BITFIELD_BIT(       8 );
558             uint32_t   List1RefID1FieldParity              : MOS_BITFIELD_BIT(       9 );
559             uint32_t                                       : MOS_BITFIELD_RANGE( 10,31 );
560         };
561         struct
562         {
563             uint32_t   Value;
564         };
565     } DW14;
566 
567     // DW15
568     union
569     {
570         struct
571         {
572             uint32_t   PrevMvReadPosFactor                 : MOS_BITFIELD_RANGE(  0, 7 );
573             uint32_t   MvShiftFactor                       : MOS_BITFIELD_RANGE(  8,15 );
574             uint32_t   Reserved                            : MOS_BITFIELD_RANGE( 16,31 );
575         };
576         struct
577         {
578             uint32_t   Value;
579         };
580     } DW15;
581 
582     struct
583     {
584         // DW16
585         union
586         {
587             struct
588             {
589                 SearchPathDelta   SPDelta_0;
590                 SearchPathDelta   SPDelta_1;
591                 SearchPathDelta   SPDelta_2;
592                 SearchPathDelta   SPDelta_3;
593             };
594             struct
595             {
596                 uint32_t   Value;
597             };
598         } DW16;
599 
600         // DW17
601         union
602         {
603             struct
604             {
605                 SearchPathDelta   SPDelta_4;
606                 SearchPathDelta   SPDelta_5;
607                 SearchPathDelta   SPDelta_6;
608                 SearchPathDelta   SPDelta_7;
609             };
610             struct
611             {
612                 uint32_t   Value;
613             };
614         } DW17;
615 
616         // DW18
617         union
618         {
619             struct
620             {
621                 SearchPathDelta   SPDelta_8;
622                 SearchPathDelta   SPDelta_9;
623                 SearchPathDelta   SPDelta_10;
624                 SearchPathDelta   SPDelta_11;
625             };
626             struct
627             {
628                 uint32_t   Value;
629             };
630         } DW18;
631 
632         // DW19
633         union
634         {
635             struct
636             {
637                 SearchPathDelta   SPDelta_12;
638                 SearchPathDelta   SPDelta_13;
639                 SearchPathDelta   SPDelta_14;
640                 SearchPathDelta   SPDelta_15;
641             };
642             struct
643             {
644                 uint32_t   Value;
645             };
646         } DW19;
647 
648         // DW20
649         union
650         {
651             struct
652             {
653                 SearchPathDelta   SPDelta_16;
654                 SearchPathDelta   SPDelta_17;
655                 SearchPathDelta   SPDelta_18;
656                 SearchPathDelta   SPDelta_19;
657             };
658             struct
659             {
660                 uint32_t   Value;
661             };
662         } DW20;
663 
664         // DW21
665         union
666         {
667             struct
668             {
669                 SearchPathDelta   SPDelta_20;
670                 SearchPathDelta   SPDelta_21;
671                 SearchPathDelta   SPDelta_22;
672                 SearchPathDelta   SPDelta_23;
673             };
674             struct
675             {
676                 uint32_t   Value;
677             };
678         } DW21;
679 
680         // DW22
681         union
682         {
683             struct
684             {
685                 SearchPathDelta   SPDelta_24;
686                 SearchPathDelta   SPDelta_25;
687                 SearchPathDelta   SPDelta_26;
688                 SearchPathDelta   SPDelta_27;
689             };
690             struct
691             {
692                 uint32_t   Value;
693             };
694         } DW22;
695 
696         // DW23
697         union
698         {
699             struct
700             {
701                 SearchPathDelta   SPDelta_28;
702                 SearchPathDelta   SPDelta_29;
703                 SearchPathDelta   SPDelta_30;
704                 SearchPathDelta   SPDelta_31;
705             };
706             struct
707             {
708                 uint32_t   Value;
709             };
710         } DW23;
711 
712         // DW24
713         union
714         {
715             struct
716             {
717                 SearchPathDelta   SPDelta_32;
718                 SearchPathDelta   SPDelta_33;
719                 SearchPathDelta   SPDelta_34;
720                 SearchPathDelta   SPDelta_35;
721             };
722             struct
723             {
724                 uint32_t   Value;
725             };
726         } DW24;
727 
728         // DW25
729         union
730         {
731             struct
732             {
733                 SearchPathDelta   SPDelta_36;
734                 SearchPathDelta   SPDelta_37;
735                 SearchPathDelta   SPDelta_38;
736                 SearchPathDelta   SPDelta_39;
737             };
738             struct
739             {
740                 uint32_t   Value;
741             };
742         } DW25;
743 
744         // DW26
745         union
746         {
747             struct
748             {
749                 SearchPathDelta   SPDelta_40;
750                 SearchPathDelta   SPDelta_41;
751                 SearchPathDelta   SPDelta_42;
752                 SearchPathDelta   SPDelta_43;
753             };
754             struct
755             {
756                 uint32_t   Value;
757             };
758         } DW26;
759 
760         // DW27
761         union
762         {
763             struct
764             {
765                 SearchPathDelta   SPDelta_44;
766                 SearchPathDelta   SPDelta_45;
767                 SearchPathDelta   SPDelta_46;
768                 SearchPathDelta   SPDelta_47;
769             };
770             struct
771             {
772                 uint32_t   Value;
773             };
774         } DW27;
775 
776         // DW28
777         union
778         {
779             struct
780             {
781                 SearchPathDelta   SPDelta_48;
782                 SearchPathDelta   SPDelta_49;
783                 SearchPathDelta   SPDelta_50;
784                 SearchPathDelta   SPDelta_51;
785             };
786             struct
787             {
788                 uint32_t   Value;
789             };
790         } DW28;
791 
792         // DW29
793         union
794         {
795             struct
796             {
797                 SearchPathDelta   SPDelta_52;
798                 SearchPathDelta   SPDelta_53;
799                 SearchPathDelta   SPDelta_54;
800                 SearchPathDelta   SPDelta_55;
801             };
802             struct
803             {
804                 uint32_t   Value;
805             };
806         } DW29;
807     } SPDelta;
808 
809     // DW30
810     union
811     {
812         struct
813         {
814             uint32_t   ActualMBWidth                            : MOS_BITFIELD_RANGE(  0,15 );
815             uint32_t   ActualMBHeight                           : MOS_BITFIELD_RANGE( 16,31 );
816         };
817         struct
818         {
819             uint32_t   Value;
820         };
821     } DW30;
822 
823     // DW31
824     union
825     {
826         struct
827         {
828             uint32_t   Reserved                                 : MOS_BITFIELD_RANGE(  0,31 );
829         };
830         struct
831         {
832             uint32_t   Value;
833         };
834     } DW31;
835 
836     // DW32
837     union
838     {
839         struct
840         {
841             uint32_t   _4xMeMvOutputDataSurfIndex               : MOS_BITFIELD_RANGE(  0,31 );
842         };
843         struct
844         {
845             uint32_t   Value;
846         };
847     } DW32;
848 
849     // DW33
850     union
851     {
852         struct
853         {
854             uint32_t   _16xOr32xMeMvInputDataSurfIndex          : MOS_BITFIELD_RANGE(  0,31 );
855         };
856         struct
857         {
858             uint32_t   Value;
859         };
860     } DW33;
861 
862     // DW34
863     union
864     {
865         struct
866         {
867             uint32_t   _4xMeOutputDistSurfIndex                 : MOS_BITFIELD_RANGE(  0,31 );
868         };
869         struct
870         {
871             uint32_t   Value;
872         };
873     } DW34;
874 
875     // DW35
876     union
877     {
878         struct
879         {
880             uint32_t   _4xMeOutputBrcDistSurfIndex              : MOS_BITFIELD_RANGE(  0,31 );
881         };
882         struct
883         {
884             uint32_t   Value;
885         };
886     } DW35;
887 
888     // DW36
889     union
890     {
891         struct
892         {
893             uint32_t   VMEFwdInterPredictionSurfIndex           : MOS_BITFIELD_RANGE(  0,31 );
894         };
895         struct
896         {
897             uint32_t   Value;
898         };
899     } DW36;
900 
901     // DW37
902     union
903     {
904         struct
905         {
906             uint32_t   VMEBwdInterPredictionSurfIndex           : MOS_BITFIELD_RANGE( 0,31 );
907         };
908         struct
909         {
910             uint32_t   Value;
911         };
912     } DW37;
913 
914     // DW38
915     union
916     {
917         struct
918         {
919             uint32_t   VDEncStreamInSurfIndex                   : MOS_BITFIELD_RANGE(  0,31 );
920         };
921         struct
922         {
923             uint32_t   Value;
924         };
925     } DW38;
926 
927 } CODECHAL_ENCODE_AVC_ME_CURBE, *PCODECHAL_ENCODE_AVC_ME_CURBE;
928 C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CODECHAL_ENCODE_AVC_ME_CURBE)) == 39);
929 
930 // AVC ME CURBE init data for G9 CM Kernel
931 static const uint32_t g_cInit_CODECHAL_ENCODE_AVC_ME_CURBE[39] =
932 {
933     0x00000000, 0x00200010, 0x00003939, 0x77a43000, 0x00000000, 0x28300000, 0x00000000, 0x00000000,
934     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
935     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
936     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,
937     0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff
938 };
939 
940 // CURBE for Static Frame Detection kernel
941 typedef struct _CODECHAL_ENCODE_AVC_SFD_CURBE_COMMON
942 {
943     union
944     {
945         struct
946         {
947             uint32_t   VDEncModeDisable                            : MOS_BITFIELD_BIT(        0 );
948             uint32_t   BRCModeEnable                               : MOS_BITFIELD_BIT(        1 );
949             uint32_t   SliceType                                   : MOS_BITFIELD_RANGE(  2,  3 );
950             uint32_t                                               : MOS_BITFIELD_BIT(        4 );
951             uint32_t   StreamInType                                : MOS_BITFIELD_RANGE(  5,  8 );
952             uint32_t   EnableAdaptiveMvStreamIn                    : MOS_BITFIELD_BIT(        9 );
953             uint32_t                                               : MOS_BITFIELD_BIT(       10 );
954             uint32_t   EnableIntraCostScalingForStaticFrame        : MOS_BITFIELD_BIT(       11 );
955             uint32_t   Reserved                                    : MOS_BITFIELD_RANGE( 12, 31 );
956         };
957         struct
958         {
959             uint32_t   Value;
960         };
961     } DW0;
962 
963     union
964     {
965         struct
966         {
967             uint32_t   QPValue                                     : MOS_BITFIELD_RANGE(  0,  7 );
968             uint32_t   NumOfRefs                                   : MOS_BITFIELD_RANGE(  8, 15 );
969             uint32_t   HMEStreamInRefCost                          : MOS_BITFIELD_RANGE( 16, 23 );
970             uint32_t   Reserved                                    : MOS_BITFIELD_RANGE( 24, 31 );
971         };
972         struct
973         {
974             uint32_t   Value;
975         };
976     } DW1;
977 
978     union
979     {
980         struct
981         {
982             uint32_t   FrameWidthInMBs                             : MOS_BITFIELD_RANGE(  0, 15 );     // round-up to 4-MB aligned
983             uint32_t   FrameHeightInMBs                            : MOS_BITFIELD_RANGE( 16, 31 );     // round-up to 4-MB aligned
984         };
985         struct
986         {
987             uint32_t   Value;
988         };
989     } DW2;
990 
991     union
992     {
993         struct
994         {
995             uint32_t   LargeMvThresh                               : MOS_BITFIELD_RANGE( 0, 31 );
996         };
997         struct
998         {
999             uint32_t   Value;
1000         };
1001     } DW3;
1002 
1003     union
1004     {
1005         struct
1006         {
1007             uint32_t   TotalLargeMvThreshold                       : MOS_BITFIELD_RANGE( 0, 31 );
1008         };
1009         struct
1010         {
1011             uint32_t   Value;
1012         };
1013     } DW4;
1014 
1015     union
1016     {
1017         struct
1018         {
1019             uint32_t   ZMVThreshold                                : MOS_BITFIELD_RANGE( 0, 31 );
1020         };
1021         struct
1022         {
1023             uint32_t   Value;
1024         };
1025     } DW5;
1026 
1027     union
1028     {
1029         struct
1030         {
1031             uint32_t   TotalZMVThreshold                           : MOS_BITFIELD_RANGE( 0, 31 );
1032         };
1033         struct
1034         {
1035             uint32_t   Value;
1036         };
1037     } DW6;
1038 
1039     union
1040     {
1041         struct
1042         {
1043             uint32_t   MinDistThreshold                            : MOS_BITFIELD_RANGE( 0, 31 );
1044         };
1045         struct
1046         {
1047             uint32_t   Value;
1048         };
1049     } DW7;
1050 
1051     uint8_t                                                        CostTable[52];
1052 
1053     union
1054     {
1055         struct
1056         {
1057             uint32_t   ActualWidthInMB                             : MOS_BITFIELD_RANGE(  0, 15 );
1058             uint32_t   ActualHeightInMB                            : MOS_BITFIELD_RANGE( 16, 31 );
1059         };
1060         struct
1061         {
1062             uint32_t   Value;
1063         };
1064     } DW21;
1065 
1066     union
1067     {
1068         struct
1069         {
1070             uint32_t   Reserved                                    : MOS_BITFIELD_RANGE(  0,31 );
1071         };
1072         struct
1073         {
1074             uint32_t   Value;
1075         };
1076     } DW22;
1077 
1078     union
1079     {
1080         struct
1081         {
1082             uint32_t   Reserved                                    : MOS_BITFIELD_RANGE(  0,31 );
1083         };
1084         struct
1085         {
1086             uint32_t   Value;
1087         };
1088     } DW23;
1089 
1090     union
1091     {
1092         struct
1093         {
1094             uint32_t   VDEncInputImagStateIndex                    : MOS_BITFIELD_RANGE( 0, 31 );      // used in VDEnc CQP mode
1095         };
1096         struct
1097         {
1098             uint32_t   Value;
1099         };
1100     } DW24;
1101 
1102     union
1103     {
1104         struct
1105         {
1106             uint32_t   Reserved                                    : MOS_BITFIELD_RANGE(  0,31 );
1107         };
1108         struct
1109         {
1110             uint32_t   Value;
1111         };
1112     } DW25;
1113 
1114     union
1115     {
1116         struct
1117         {
1118             uint32_t   MVDataSurfaceIndex                          : MOS_BITFIELD_RANGE( 0, 31 );      // contains HME MV Data generated by HME kernel
1119         };
1120         struct
1121         {
1122             uint32_t   Value;
1123         };
1124     } DW26;
1125 
1126     union
1127     {
1128         struct
1129         {
1130             uint32_t   InterDistortionSurfaceIndex                 : MOS_BITFIELD_RANGE( 0, 31 );      // contains HME Inter Distortion generated by HME kernel
1131         };
1132         struct
1133         {
1134             uint32_t   Value;
1135         };
1136     } DW27;
1137 
1138     union
1139     {
1140         struct
1141         {
1142             uint32_t   OutputDataSurfaceIndex                      : MOS_BITFIELD_RANGE( 0, 31 );
1143         };
1144         struct
1145         {
1146             uint32_t   Value;
1147         };
1148     } DW28;
1149 
1150     union
1151     {
1152         struct
1153         {
1154             uint32_t   VDEncOutputImagStateIndex                   : MOS_BITFIELD_RANGE( 0, 31 );
1155         };
1156         struct
1157         {
1158             uint32_t   Value;
1159         };
1160     } DW29;
1161 
1162 } CODECHAL_ENCODE_AVC_SFD_CURBE_COMMON, *PCODECHAL_ENCODE_AVC_SFD_CURBE_COMMON;
1163 C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CODECHAL_ENCODE_AVC_SFD_CURBE_COMMON)) == 30);
1164 
1165 typedef struct _CODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS
1166 {
1167     uint32_t                                dwDownscaledWidthInMb4x;
1168     uint32_t                                dwDownscaledHeightInMb4x;
1169     uint32_t                                dwMeMvBottomFieldOffset;
1170     uint32_t                                dwMeDistortionBottomFieldOffset;
1171     PMOS_RESOURCE                           presVDEncImageStateInputBuffer;
1172     PMOS_SURFACE                            psMeMvDataSurface;
1173     PMOS_SURFACE                            psMeDistortionSurface;
1174     PMOS_RESOURCE                           presOutputBuffer;
1175     PMOS_RESOURCE                           presVDEncImageStateOutputBuffer;
1176     PMHW_KERNEL_STATE                       pKernelState;
1177     bool                                    bVdencActive;
1178     bool                                    bVdencBrcEnabled;
1179 } CODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS;
1180 
1181 typedef struct _CODECHAL_ENCODE_AVC_PACK_PIC_HEADER_PARAMS
1182 {
1183     PBSBuffer                               pBsBuffer;
1184     PCODEC_AVC_ENCODE_PIC_PARAMS            pPicParams;     // pAvcPicParams[ucPPSIdx]
1185     PCODEC_AVC_ENCODE_SEQUENCE_PARAMS       pSeqParams;     // pAvcSeqParams[ucSPSIdx]
1186     PCODECHAL_ENCODE_AVC_VUI_PARAMS         pAvcVuiParams;
1187     PCODEC_AVC_IQ_MATRIX_PARAMS          pAvcIQMatrixParams;
1188     PCODECHAL_NAL_UNIT_PARAMS               *ppNALUnitParams;
1189     CodechalEncodeSeiData*                  pSeiData;
1190     uint32_t                                dwFrameHeight;
1191     uint32_t                                dwOriFrameHeight;
1192     uint16_t                                wPictureCodingType;
1193     bool                                    bNewSeq;
1194     bool                                   *pbNewPPSHeader;
1195     bool                                   *pbNewSeqHeader;
1196 } CODECHAL_ENCODE_AVC_PACK_PIC_HEADER_PARAMS, *PCODECHAL_ENCODE_AVC_PACK_PIC_HEADER_PARAMS;
1197 
1198 typedef struct _CODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS
1199 {
1200     PBSBuffer                               pBsBuffer;
1201     PCODEC_AVC_ENCODE_PIC_PARAMS            pPicParams;     // pAvcPicParams[ucPPSIdx]
1202     PCODEC_AVC_ENCODE_SEQUENCE_PARAMS       pSeqParams;     // pAvcSeqParams[ucSPSIdx]
1203     PCODEC_AVC_ENCODE_SLICE_PARAMS          pAvcSliceParams;
1204     PCODEC_REF_LIST                         *ppRefList;
1205     CODEC_PICTURE                           CurrPic;
1206     CODEC_PICTURE                           CurrReconPic;
1207     CODEC_AVC_ENCODE_USER_FLAGS             UserFlags;
1208     CODECHAL_ENCODE_AVC_NAL_UNIT_TYPE       NalUnitType;
1209     uint16_t                                wPictureCodingType;
1210     bool                                    bVdencEnabled;
1211 } CODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS, *PCODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS;
1212 
1213 typedef struct _CODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS
1214 {
1215     PCODEC_AVC_ENCODE_SEQUENCE_PARAMS       pSeqParams;     // pAvcSeqParams[ucSPSIdx]
1216     PCODEC_AVC_ENCODE_PIC_PARAMS            pPicParams;
1217     PCODEC_AVC_ENCODE_SLICE_PARAMS          pAvcSliceParams;
1218     uint16_t                                wPictureCodingType;
1219     uint16_t                                wPicHeightInMB;
1220     uint16_t                                wFrameFieldHeightInMB;
1221     bool                                    bFirstFieldIPic;
1222     bool                                    bVDEncEnabled;
1223     bool                                    bPAKonly;
1224 } CODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS, *PCODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS;
1225 
1226 typedef struct _CODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS
1227 {
1228     uint16_t  wPictureCodingType;
1229     uint8_t   ucTargetUsage;
1230     uint8_t   ucQP;
1231     bool      bBrcEnabled;
1232     bool      bVdEncEnabled;
1233 } CODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS, *PCODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS;
1234 
1235 typedef struct _CODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS
1236 {
1237     PMHW_KERNEL_STATE                       pKernelState;
1238 } CODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS;
1239 
1240      //!
1241      //! \brief    Vertical MV component range based on levelIdc
1242      //! \details  VDBOX private function to get vertical MV componet range
1243      //! \param    [in] levelIdc
1244      //!           AVC level
1245      //! \return   uint32_t
1246      //!           return the max vertical mv component base on input level
1247      //!
1248      uint32_t CodecHalAvcEncode_GetMaxVmvR(uint8_t levelIdc);
1249 
1250      //!
1251      //! \brief    Get MV component range based on levelIdc
1252      //! \details  VDBOX private function to get MV componet range
1253      //! \param    [in] levelIdc
1254      //!           AVC level
1255      //! \return   uint32_t
1256      //!           return the max mv component base on input level
1257      //!
1258      uint32_t CodecHalAvcEncode_GetMaxMvLen(uint8_t levelIdc);
1259 
1260      //!
1261      //! \brief    Get the filed parity: Top filed or Bottom filed
1262      //! \details  Client facing function to get the filed parity: Top filed or Bottom filed
1263      //! \param    [in] params
1264      //!           PCODEC_AVC_ENCODE_SLICE_PARAMS pSlcParams
1265      //! \param    [list] list
1266      //!           forword or backword reference
1267      //! \param    [in] index
1268      //!           reference frame index
1269      //! \return   uint32_t
1270      //!           Bottom field or Top field
1271      //!
1272      bool CodecHalAvcEncode_GetFieldParity(
1273         PCODEC_AVC_ENCODE_SLICE_PARAMS      params,
1274         uint32_t                            list,
1275         uint32_t                            index);
1276 
1277      //!
1278      //! \brief    Get profile level max frame size
1279      //! \param    [in] seqParams
1280      //!           Encoder Sequence params
1281      //! \param    [in] encoder
1282      //!           Encoder structure
1283      //! \param    [in] profileLevelMaxFrame
1284      //!           Profile Level Max Frame
1285      //! \return   MOS_STATUS
1286      //!           MOS_STATUS_SUCCESS if success, else fail reason
1287      //!
1288      MOS_STATUS CodecHalAvcEncode_GetProfileLevelMaxFrameSize(
1289         PCODEC_AVC_ENCODE_SEQUENCE_PARAMS   seqParams,
1290         CodechalEncoderState*               encoder,
1291         uint32_t*                           profileLevelMaxFrame);
1292 
1293      //! \brief    Get the max number of allowed slice
1294      //! \param    [in] profileIdc
1295      //!           AVC profile idc
1296      //! \param    [in] levelIdc
1297      //!           AVC level idc
1298      //! \param    [in] framesPer100Sec
1299      //!           frame Per 100Sec
1300      //! \return   uint16_t
1301      //!           return uiMaxAllowedNumSlices
1302      //!
1303      uint16_t CodecHalAvcEncode_GetMaxNumSlicesAllowed(
1304         CODEC_AVC_PROFILE_IDC profileIdc,
1305         CODEC_AVC_LEVEL_IDC   levelIdc,
1306         uint32_t                 framesPer100Sec);
1307 
1308      //!
1309      //! \brief    Use to pack picture header related params
1310      //! \param    [in] params
1311      //!           picture header pack params
1312      //! \return   MOS_STATUS
1313      //!           MOS_STATUS_SUCCESS if success, else fail reason
1314      //!
1315      MOS_STATUS CodecHalAvcEncode_PackPictureHeader(
1316         PCODECHAL_ENCODE_AVC_PACK_PIC_HEADER_PARAMS    params);
1317 
1318      //!
1319      //! \brief    Use to pack slice header related params
1320      //! \param    [in] params
1321      //!           slice header pack params
1322      //! \return   MOS_STATUS
1323      //!           MOS_STATUS_SUCCESS if success, else fail reason
1324      //!
1325      MOS_STATUS CodecHalAvcEncode_PackSliceHeader(
1326         PCODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS    params);
1327 
1328      //!
1329      //! \brief    Use to get picture num of slice header to be packed
1330      //! \param    [in] params
1331      //!           pack slice header pack params
1332      //! \param    [in] list
1333      //!           forword or backword reference
1334      //! \return   void
1335      //!
1336      static void CodecHal_PackSliceHeader_GetPicNum (
1337         PCODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS     params,
1338         uint8_t                                         list);
1339 
1340 //!
1341 //! \class    CodechalEncodeAvcBase
1342 //! \brief    CodechalE encode Avc base
1343 //!
1344 class CodechalEncodeAvcBase : public CodechalEncoderState
1345 {
1346 public:
1347     // AvcState functions.
1348     //!
1349     //! \brief    Constructor
1350     //!
1351     CodechalEncodeAvcBase(
1352         CodechalHwInterface *   hwInterface,
1353         CodechalDebugInterface *debugInterface,
1354         PCODECHAL_STANDARD_INFO standardInfo);
1355 
1356     //!
1357     //! \brief    Copy constructor
1358     //!
1359     CodechalEncodeAvcBase(const CodechalEncodeAvcBase&) = delete;
1360 
1361     //!
1362     //! \brief    Copy assignment operator
1363     //!
1364     CodechalEncodeAvcBase& operator=(const CodechalEncodeAvcBase&) = delete;
1365 
1366     //!
1367     //! \brief    Destructor
1368     //!
1369     virtual ~CodechalEncodeAvcBase();
1370 
1371     //Encode interface definitions
1372     //!
1373     //! \brief    Initialize standard related members.
1374     //! \details  Initialize members, set proper value
1375     //!           to involved variables, allocate resources.
1376     //! \param    [in] settings
1377     //!           Encode settings.
1378     //!
1379     //! \return   MOS_STATUS
1380     //!           MOS_STATUS_SUCCESS if success
1381     //!
1382     virtual MOS_STATUS Initialize(CodechalSetting * settings);
1383 
GetStatusReport(EncodeStatus * encodeStatus,EncodeStatusReport * encodeStatusReport)1384     virtual MOS_STATUS GetStatusReport(
1385         EncodeStatus* encodeStatus,
1386         EncodeStatusReport* encodeStatusReport)
1387     {
1388         return MOS_STATUS_SUCCESS;
1389     }
1390 
1391     //!
1392     //! \brief    Encode User Feature Key Report.
1393     //! \details  Report user feature values set by encode.
1394     //!
1395     //! \return   MOS_STATUS
1396     //!           MOS_STATUS_SUCCESS if success
1397     //!
1398     virtual MOS_STATUS UserFeatureKeyReport();
1399 
1400     //!
1401     //! \brief    Initialize Encode ME kernel state
1402     //!
1403     //! \return   MOS_STATUS
1404     //!           MOS_STATUS_SUCCESS if success
1405     //!
1406     virtual MOS_STATUS InitKernelStateMe() = 0;
1407 
1408     //!
1409     //! \brief    Set Encode ME kernel Curbe data.
1410     //!
1411     //! \param    [in] params
1412     //!           Pointer to the MeCurbeParams
1413     //!
1414     //! \return   MOS_STATUS
1415     //!           MOS_STATUS_SUCCESS if success
1416     //!
1417     virtual MOS_STATUS SetCurbeMe( MeCurbeParams* params ) = 0;
1418 
1419     //!
1420     //! \brief    Set Encode ME kernel Surfaces
1421     //!
1422     //! \param    [in] cmdBuffer
1423     //!           Pointer to the MOS_COMMAND_BUFFER
1424     //! \param    [in] params
1425     //!           Pointer to the CODECHAL_ME_SURFACE_PARAMS
1426     //!
1427     //! \return   MOS_STATUS
1428     //!           MOS_STATUS_SUCCESS if success
1429     //!
1430     virtual MOS_STATUS SendMeSurfaces(
1431         PMOS_COMMAND_BUFFER         cmdBuffer,
1432         MeSurfaceParams* params) = 0;
1433     //!
1434     //! \brief    AVC State Initialization.
1435     //!
1436     //! \return   MOS_STATUS
1437     //!           MOS_STATUS_SUCCESS if success
1438     //!
1439     virtual MOS_STATUS Initialize();
1440 
1441 
1442     //!
1443     //! \brief    AVC Resource Allocation for ENC.
1444     //!
1445     //! \return   MOS_STATUS
1446     //!           MOS_STATUS_SUCCESS if success
1447     //!
1448     virtual MOS_STATUS AllocateEncResources();
1449 
1450     //!
1451     //! \brief    AVC Resource Allocation for Encoder.
1452     //!
1453     //! \return   MOS_STATUS
1454     //!           MOS_STATUS_SUCCESS if success
1455     //!
1456     virtual MOS_STATUS AllocateResources();
1457 
1458     //!
1459     //! \brief    Set AVC Sequence Structs.
1460     //!
1461     //! \return   MOS_STATUS
1462     //!           MOS_STATUS_SUCCESS if success
1463     //!
1464     virtual MOS_STATUS SetSequenceStructs();
1465 
1466     //!
1467     //! \brief    Set AVC Picture Structs.
1468     //!
1469     //! \return   MOS_STATUS
1470     //!           MOS_STATUS_SUCCESS if success
1471     //!
1472     virtual MOS_STATUS SetPictureStructs();
1473 
1474     //!
1475     //! \brief    Set AVC Slice Structs.
1476     //!
1477     //! \return   MOS_STATUS
1478     //!           MOS_STATUS_SUCCESS if success
1479     //!
1480     virtual MOS_STATUS SetSliceStructs();
1481 
1482     //!
1483     //! \brief    Run Encode ME kernel
1484     //!
1485     //! \param    [in] brcBuffers
1486     //!           Pointer to the EncodeBrcBuffers
1487     //! \param    [in] hmeLevel
1488     //!           Hme level
1489     //!
1490     //! \return   MOS_STATUS
1491     //!           MOS_STATUS_SUCCESS if success
1492     //!
1493     virtual MOS_STATUS EncodeMeKernel(
1494         EncodeBrcBuffers* brcBuffers,
1495         HmeLevel          hmeLevel);
1496 
1497     //!
1498     //! \brief    Allocate Batch Buffer For PakSlice.
1499     //!
1500     //! \param    [in] numSlices
1501     //!           Number of Slice
1502     //! \param    [in] numPakPasses
1503     //!           Number of PAK pass.
1504     //! \param    [in] currRecycledBufIdx
1505     //!           Current Recycle Buffer Index.
1506     //!
1507     //! \return   MOS_STATUS
1508     //!           MOS_STATUS_SUCCESS if success
1509     //!
1510     virtual MOS_STATUS AllocateBatchBufferForPakSlices(
1511         uint32_t numSlices,
1512         uint8_t numPakPasses,
1513         uint8_t currRecycledBufIdx);
1514 
1515     //!
1516     //! \brief    Release Batch Buffer For PakSlice.
1517     //!
1518     //! \param    [in] currRecycledBufIdx
1519     //!           Current Recycle Buffer Index.
1520     //!
1521     //! \return   MOS_STATUS
1522     //!           MOS_STATUS_SUCCESS if success
1523     //!
1524     virtual MOS_STATUS ReleaseBatchBufferForPakSlices( uint8_t currRecycledBufIdx);
1525 
1526     //!
1527     //! \brief    Initialize kernel binary size info.
1528     //!
1529     //! \return   MOS_STATUS
1530     //!           MOS_STATUS_SUCCESS if success
1531     //!
1532     MOS_STATUS AddIshSize(uint32_t kuid, uint8_t* kernelBase);
1533 
1534     //!
1535     //! \brief    Calculate scaling list
1536     //!
1537     //! \return   void
1538     //!
1539     void ScalingListFlat();
1540 
1541     //!
1542     //! \brief    Calculate scaling list
1543     //!
1544     //! \return   void
1545     //!
1546     void ScalingListFallbackRuleA();
1547 
1548     //!
1549     //! \brief    Get Dist Scale factor
1550     //!
1551     //! \return   void
1552     //!
1553     void GetDistScaleFactor();
1554 
1555     //!
1556     //! \brief    Initialize MMC state
1557     //!
1558     //! \return   MOS_STATUS
1559     //!           MOS_STATUS_SUCCESS if success
1560     //!
1561     virtual MOS_STATUS InitMmcState();
1562 
1563     //!
1564     //! \brief    Get bidirectional weight
1565     //!
1566     //! \param    [in] distScaleFactorRefID0List0
1567     //!           DistScaleFactorRefID0List0
1568     //! \param    [in] weightedBiPredIdc
1569     //!           Same as AVC syntax element.
1570     //!
1571     //! \return   int32_t
1572     //!           Bidirectional weight
1573     //!
1574     int32_t GetBiWeight(
1575         uint32_t distScaleFactorRefID0List0,
1576         uint16_t weightedBiPredIdc);
1577 
1578     //!
1579     //! \brief    Update the slice count according to the slice shutdown policy
1580     //!
1581     virtual void UpdateSSDSliceCount();
1582 
1583     //!
1584     //! \brief    Build slices with header insertion
1585     //! \param    [in] cmdBuffer
1586     //!           command buffer
1587     //! \param    [in] params
1588     //!           VDBOX AVC slice state params
1589     //! \return   MOS_STATUS
1590     //!           MOS_STATUS_SUCCESS if success, else fail reason
1591     //!
1592     MOS_STATUS SendSlice(
1593         PMOS_COMMAND_BUFFER             cmdBuffer,
1594         PMHW_VDBOX_AVC_SLICE_STATE      params);
1595 
1596     //!
1597     //! \brief      Store number passes
1598     //!
1599     //! \param      [in] encodeStatusBuf
1600     //!             Encode status buffer
1601     //! \param      [in] miInterface
1602     //!             Mi interface
1603     //! \param      [in] cmdBuffer
1604     //!             Command buffer
1605     //! \param      [in] currPass
1606     //!             Curr pass
1607     //!
1608     //! \return     MOS_STATUS
1609     //!             MOS_STATUS_SUCCESS if success, else fail reason
1610     //!
1611     MOS_STATUS StoreNumPasses(
1612         EncodeStatusBuffer             *encodeStatusBuf,
1613         MhwMiInterface                 *miInterface,
1614         PMOS_COMMAND_BUFFER            cmdBuffer,
1615         uint32_t                       currPass);
1616 
1617 #if USE_CODECHAL_DEBUG_TOOL
1618     MOS_STATUS DumpSeqParams(
1619         PCODEC_AVC_ENCODE_SEQUENCE_PARAMS seqParams,
1620         PCODEC_AVC_IQ_MATRIX_PARAMS    matrixParams);
1621 
1622     MOS_STATUS DumpPicParams(
1623         PCODEC_AVC_ENCODE_PIC_PARAMS   picParams,
1624         PCODEC_AVC_IQ_MATRIX_PARAMS matrixParams);
1625 
1626     MOS_STATUS DumpFeiPicParams(
1627         CodecEncodeAvcFeiPicParams *feiPicParams);
1628 
1629     MOS_STATUS DumpSliceParams(
1630         PCODEC_AVC_ENCODE_SLICE_PARAMS sliceParams,
1631         PCODEC_AVC_ENCODE_PIC_PARAMS   picParams);
1632 
1633     MOS_STATUS DumpVuiParams(
1634         PCODECHAL_ENCODE_AVC_VUI_PARAMS avcVuiParams);
1635 
1636 #endif
1637 
1638 protected:
1639     //!
1640     //! \brief    Set MFX_PIPE_MODE_SELECT parameter
1641     //!
1642     //! \param    [in] genericParam
1643     //!           CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS
1644     //! \param    [out] param
1645     //!           reference to MHW_VDBOX_PIPE_MODE_SELECT_PARAMS
1646     //!
1647     //! \return   void
1648     //!
1649     virtual void SetMfxPipeModeSelectParams(
1650         const CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS& genericParam,
1651         MHW_VDBOX_PIPE_MODE_SELECT_PARAMS& param);
1652 
1653     //!
1654     //! \brief    set MFX_PIPE_BUF_ADDR_STATE parameter
1655     //!
1656     //! \param    [in] genericParam
1657     //!           CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS
1658     //! \param    [out] param
1659     //!           reference to MHW_VDBOX_PIPE_BUF_ADDR_PARAMS
1660     //!
1661     //! \return   MOS_STATUS
1662     //!           MOS_STATUS_SUCCESS if success
1663     //!
1664     virtual MOS_STATUS SetMfxPipeBufAddrStateParams(
1665         CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS genericParam,
1666         MHW_VDBOX_PIPE_BUF_ADDR_PARAMS& param);
1667 
1668     //!
1669     //! \brief    Set MFX_IND_OBJ_BASE_ADDR_STATE parameter
1670     //!
1671     //! \param    [out] param
1672     //!           reference to MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS
1673     //!
1674     //! \return   void
1675     //!
1676     virtual void SetMfxIndObjBaseAddrStateParams(MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS& param);
1677 
1678     //!
1679     //! \brief    Set MHW_VDBOX_BSP_BUF_BASE_ADDR_STATE parameter
1680     //!
1681     //! \param    [out] param
1682     //!           reference to MHW_VDBOX_BSP_BUF_BASE_ADDR_PARAMS
1683     //!
1684     //! \return   void
1685     //!
1686     virtual void SetMfxBspBufBaseAddrStateParams(MHW_VDBOX_BSP_BUF_BASE_ADDR_PARAMS& param);
1687 
1688     //!
1689     //! \brief    Set MHW_VDBOX_QM_STATE parameter
1690     //!
1691     //! \param    [out] qmParams
1692     //!           reference to MHW_VDBOX_QM_PARAMS
1693     //! \param    [out] fqmParams
1694     //!           reference to MHW_VDBOX_QM_PARAMS
1695     //!
1696     //! \return   void
1697     //!
1698     virtual void SetMfxQmStateParams(MHW_VDBOX_QM_PARAMS& qmParams, MHW_VDBOX_QM_PARAMS & fqmParams);
1699 
1700     //!
1701     //! \brief    Set MHW_VDBOX_AVC_IMG_STATE parameter
1702     //!
1703     //! \param    [out] param
1704     //!           reference to MHW_VDBOX_AVC_IMG_PARAMS
1705     //!
1706     //! \return   void
1707     //!
1708     virtual void SetMfxAvcImgStateParams(MHW_VDBOX_AVC_IMG_PARAMS& param);
1709 
1710 public:
1711     PMOS_INTERFACE                              m_origOsInterface           = nullptr;    //!< Os Interface
1712     CodechalHwInterface                         *m_origHwInterface          = nullptr;    //!< Hw Interface
1713     PMHW_STATE_HEAP_INTERFACE                   m_origStateHeapInterface    = nullptr;    //!< StateHeap Interface
1714 
1715     // Parameters passed by application
1716     PCODEC_AVC_ENCODE_PIC_PARAMS                m_avcPicParams[CODEC_AVC_MAX_PPS_NUM];    //!< Pointer to array of picture parameter, could be removed
1717     PCODEC_AVC_ENCODE_SEQUENCE_PARAMS           m_avcSeqParams[CODEC_AVC_MAX_SPS_NUM];    //!< Pointer to array of sequence parameter, could be removed
1718     PCODEC_AVC_ENCODE_PIC_PARAMS                m_avcPicParam           = nullptr;  //!< Pointer to AVC picture parameter
1719     PCODEC_AVC_ENCODE_SEQUENCE_PARAMS           m_avcSeqParam           = nullptr;  //!< Pointer to AVC sequence parameter
1720     PCODECHAL_ENCODE_AVC_QUALITY_CTRL_PARAMS    m_avcQCParams           = nullptr;  //!< Pointer to video quality control parameter
1721     PCODECHAL_ENCODE_AVC_ROUNDING_PARAMS        m_avcRoundingParams     = nullptr;  //!< Pointer to AVC rounding parameter
1722     PCODECHAL_ENCODE_AVC_VUI_PARAMS             m_avcVuiParams          = nullptr;  //!< Pointer to AVC Uvi parameter
1723     PCODEC_AVC_ENCODE_SLICE_PARAMS              m_avcSliceParams        = nullptr;  //!< Pointer to AVC slice parameter
1724     CodecEncodeAvcFeiPicParams                  *m_avcFeiPicParams       = nullptr;  //!< Pointer to FEI picture parameter
1725     PCODEC_AVC_IQ_MATRIX_PARAMS              m_avcIQMatrixParams     = nullptr;  //!< Pointer to IQMaxtrix parameter
1726     PCODEC_AVC_ENCODE_IQ_WEIGTHSCALE_LISTS      m_avcIQWeightScaleLists = nullptr;  //!< Pointer to IQWidght ScaleLists
1727     CODEC_AVC_ENCODE_USER_FLAGS                 m_userFlags;                        //!< Encoder user flag settings
1728     uint32_t                                    m_reconFrameSurfaceId[CODEC_AVC_NUM_UNCOMPRESSED_SURFACE];
1729     CODECHAL_ENCODE_AVC_ENCODER_USAGE           m_encoderUsage = CODECHAL_ENCODE_AVC_SINGLE_PASS;
1730 
1731     CODEC_PIC_ID                                m_picIdx[CODEC_AVC_MAX_NUM_REF_FRAME];              //!< Picture index
1732     PCODEC_REF_LIST                             m_refList[CODEC_AVC_NUM_UNCOMPRESSED_SURFACE];   //!< Pointer to reference list
1733     CODEC_AVC_FRAME_STORE_ID                 m_avcFrameStoreID[CODEC_AVC_MAX_NUM_REF_FRAME];     //!< Refer to CODEC_AVC_FRAME_STORE_ID
1734     CODECHAL_ENCODE_AVC_NAL_UNIT_TYPE           m_nalUnitType;                      //!< Nal unit type
1735     PCODECHAL_NAL_UNIT_PARAMS                   *m_nalUnitParams    = nullptr;      //!< Pointers to NAL unit parameters array
1736     uint16_t                                    m_sliceHeight       = 0;            //!< Slice height
1737     uint8_t                                     m_biWeightNumB      = 0;            //!< Bi direction Weight B frames num
1738     bool                                        m_deblockingEnabled = false;        //!< Enable deblocking flag
1739     bool                                        m_mbaffEnabled      = false;        //!< Enable MBAFF flag
1740     bool                                        m_firstFieldIdrPic  = false;        //!< First field IDR flag
1741     bool                                        m_hmeEnabled        = false;        //!< Enable HME flag
1742     bool                                        m_16xMeEnabled      = false;        //!< Enable 16x ME flag
1743     bool                                        m_32xMeEnabled      = false;        //!< Enable 32x ME flag
1744     bool                                        m_skipBiasAdjustmentEnable  = false;//!< Enable SkipBiasAdjustment flag
1745     bool                                        m_staticFrameDetectionInUse = false;//!< Enable Static Frame Detection flag
1746     uint32_t                                    m_sliceStructCaps = 0;              //!< Slice struct
1747 
1748     CODECHAL_ENCODE_AVC_TQ_PARAMS               m_trellisQuantParams;               //!< Trellis Quantization params
1749 
1750     // B-frame
1751     uint32_t                                    m_distScaleFactorList0[CODEC_AVC_MAX_NUM_REF_FRAME * 2];    //!< the DistScaleFactor used to derive temporal direct motion vector
1752     uint32_t                                    m_biWeight = 0;                     //!< Bidirectional Weight
1753 
1754     // Batch Buffers
1755     MHW_BATCH_BUFFER                            m_batchBufferForVdencImgStat[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; //!< VDEnc image state batch buffers
1756 
1757     // ME
1758     CodechalKernelHme                           *m_hmeKernel = nullptr;           //!< ME kernel object
1759     MOS_SURFACE                                 m_4xMeMvDataBuffer;               //!< 4x motion estimation MV data buffer
1760     uint32_t                                    m_meMvBottomFieldOffset = 0;      //!< ME MV bottom filed offset
1761     MOS_SURFACE                                 m_16xMeMvDataBuffer;              //!< 16x motion estimation MV data buffer
1762     uint32_t                                    m_meMv16xBottomFieldOffset = 0;   //!< 16x motion estimation MV bottom filed offset
1763     MOS_SURFACE                                 m_32xMeMvDataBuffer;              //!< 32x motion estimation MV data buffer
1764     uint32_t                                    m_meMv32xBottomFieldOffset = 0;   //!< 32x motion estimation MV bottom filed offset
1765     MOS_SURFACE                                 m_4xMeDistortionBuffer;           //!< 4x ME distortion buffer
1766     uint32_t                                    m_meDistortionBottomFieldOffset = 0; //!< ME distortion bottom field offset
1767     uint8_t                                     *m_bmeMethodTable = nullptr;      //!< Point to BME Method table
1768     uint8_t                                     *m_meMethodTable  = nullptr;      //!< Pointer to ME Method table
1769 
1770     // PAK Scratch Buffers
1771     MOS_RESOURCE                                m_intraRowStoreScratchBuffer;                                   //!< Handle of intra row store surface
1772     MHW_BATCH_BUFFER                            m_batchBufferForPakSlices[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; //!< PAK Slice batch buffers
1773     uint32_t                                    m_pakSliceSize = 0;               //!< PAK Slice Size
1774     uint32_t                                    m_pakSlicePatchListSize = 0;      //!< PAK Slice patch list size
1775     uint32_t                                    m_currPakSliceIdx = 0;            //!< Current PAK slice index
1776 
1777     bool                                        m_4xMeDistortionBufferSupported = false;  //!< Generation Specific Support Flags & User Feature Key Reads
1778 
1779     bool                                        m_sliceSizeStreamoutSupported = false;    //!< Enable PAK slice size streamout, valid for AVC VDEnc on KBL/CNL+
1780     MOS_RESOURCE                                m_pakSliceSizeStreamoutBuffer;            //!< PAK slice size streamout buffer
1781 
1782     bool                                        m_crePrefetchEnable = false;              //!< Enable CRE prefetch flag
1783     bool                                        m_tlbPrefetchEnable = false;              //!< Enable TLB prefetch flag
1784 
1785     const uint8_t m_codechalEncodeAvcSfdCostTablePFrame[CODEC_AVC_NUM_QP] =
1786         {
1787             44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 60, 60, 60, 60, 73, 73, 73, 76, 76, 76, 88, 89, 89, 91, 92, 93, 104, 104, 106, 107, 108, 109, 120, 120, 122, 123, 124, 125, 136, 136, 138, 139, 140, 141, 143, 143};
1788 
1789     const uint8_t m_codechalEncodeAvcSfdCostTableBFrame[CODEC_AVC_NUM_QP] =
1790         {
1791             57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 73, 73, 73, 73, 77, 77, 77, 89, 89, 89, 91, 93, 93, 95, 105, 106, 107, 108, 110, 111, 121, 122, 123, 124, 125, 127, 137, 138, 139, 140, 142, 143, 143, 143, 143, 143};
1792 
1793     const uint8_t m_codechalEncodeAvcSfdCostTableVdEnc[CODEC_AVC_NUM_QP] =
1794         {
1795             45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 47, 56, 57, 59, 44, 45, 47, 56, 44, 47, 47, 45, 47, 47, 47, 47, 45, 47, 47, 56, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47};
1796 
1797 #if USE_CODECHAL_DEBUG_TOOL
1798 protected:
1799     //!
1800     //! \brief    Create AVC PAR
1801     //!
1802     //! \return   MOS_STATUS
1803     //!           MOS_STATUS_SUCCESS if success, else fail reason
1804     //!
1805     MOS_STATUS CreateAvcPar();
1806 
1807     //!
1808     //! \brief    Destroy AVC PAR
1809     //!
1810     //! \return   MOS_STATUS
1811     //!           MOS_STATUS_SUCCESS if success, else fail reason
1812     //!
1813     MOS_STATUS DestroyAvcPar();
1814 
1815     //!
1816     //! \brief    Dump sequence PAR file
1817     //!
1818     //! \return   MOS_STATUS
1819     //!           MOS_STATUS_SUCCESS if success, else fail reason
1820     //!
DumpSeqParFile()1821     virtual MOS_STATUS DumpSeqParFile() { return MOS_STATUS_SUCCESS; }
1822 
1823     //!
1824     //! \brief    Dump frame PAR file
1825     //!
1826     //! \return   MOS_STATUS
1827     //!           MOS_STATUS_SUCCESS if success, else fail reason
1828     //!
DumpFrameParFile()1829     virtual MOS_STATUS DumpFrameParFile() { return MOS_STATUS_SUCCESS; }
1830 
1831     //!
1832     //! \brief    Populate const parameters
1833     //!
1834     //! \return   MOS_STATUS
1835     //!           MOS_STATUS_SUCCESS if success, else fail reason
1836     //!
1837     MOS_STATUS PopulateConstParam();
1838 
1839     //!
1840     //! \brief    Populate target usage as the first parameter of dumped par file
1841     //!
1842     //! \return   MOS_STATUS
1843     //!           MOS_STATUS_SUCCESS if success, else fail reason
1844     //!
1845     MOS_STATUS PopulateTargetUsage();
1846 
1847     //!
1848     //! \brief    Set MHW_VDBOX_AVC_IMG_STATE parameter
1849     //!
1850     //! \param    [in] avcSeqParams
1851     //!           pointer to AVC encode sequence parameters
1852     //! \param    [in] avcPicParams
1853     //!           pointer to AVC encode picture parameters
1854     //! \param    [in] avcSlcParams
1855     //!           pointer to AVC encode slice parameters
1856     //!
1857     //! \return   MOS_STATUS
1858     //!           MOS_STATUS_SUCCESS if success, else fail reason
1859     //!
1860     MOS_STATUS PopulateDdiParam(
1861         PCODEC_AVC_ENCODE_SEQUENCE_PARAMS avcSeqParams,
1862         PCODEC_AVC_ENCODE_PIC_PARAMS      avcPicParams,
1863         PCODEC_AVC_ENCODE_SLICE_PARAMS    avcSlcParams);
1864 
1865     //!
1866     //! \brief    Set MHW_VDBOX_AVC_IMG_STATE parameter
1867     //!
1868     //! \param    [in] adaptiveRoundingInterEnable
1869     //!           adaptive rounding inter enable flag
1870     //! \param    [in] sliceState
1871     //!           pointer to slice state
1872     //!
1873     //! \return   MOS_STATUS
1874     //!           MOS_STATUS_SUCCESS if success, else fail reason
1875     //!
1876     MOS_STATUS PopulateSliceStateParam(
1877         bool                       adaptiveRoundingInterEnable,
1878         PMHW_VDBOX_AVC_SLICE_STATE sliceState);
1879 
1880     //!
1881     //! \brief    Set MHW_VDBOX_AVC_IMG_STATE parameter
1882     //!
1883     //! \param    [in] *cmd
1884     //!           pointer to command
1885     //!
1886     //! \return   MOS_STATUS
1887     //!           MOS_STATUS_SUCCESS if success, else fail reason
1888     //!
1889     MOS_STATUS PopulateSfdParam(
1890         void *cmd);
1891 
1892     //!
1893     //! \brief    Set MHW_VDBOX_AVC_IMG_STATE parameter
1894     //!
1895     //! \param    [in] is16xMeEnabled
1896     //!           16x ME enabled flag
1897     //! \param    [in] is32xMeEnabled
1898     //!           32x ME enabled flag
1899     //! \param    [in] meMethod
1900     //!           ME method
1901     //! \param    [in] *cmd
1902     //!           pointer to command
1903     //!
1904     //! \return   MOS_STATUS
1905     //!           MOS_STATUS_SUCCESS if success, else fail reason
1906     //!
PopulateHmeParam(bool is16xMeEnabled,bool is32xMeEnabled,uint8_t meMethod,void * cmd)1907     virtual MOS_STATUS PopulateHmeParam(
1908         bool    is16xMeEnabled,
1909         bool    is32xMeEnabled,
1910         uint8_t meMethod,
1911         void    *cmd) { return MOS_STATUS_SUCCESS; }
1912 
1913     //!
1914     //! \brief    Set MHW_VDBOX_AVC_IMG_STATE parameter
1915     //!
1916     //! \param    [in] *cmd
1917     //!           pointer to command
1918     //!
1919     //! \return   MOS_STATUS
1920     //!           MOS_STATUS_SUCCESS if success, else fail reason
1921     //!
PopulateBrcInitParam(void * cmd)1922     virtual MOS_STATUS PopulateBrcInitParam(
1923         void *cmd) { return MOS_STATUS_SUCCESS; }
1924 
1925     //!
1926     //! \brief    Set MHW_VDBOX_AVC_IMG_STATE parameter
1927     //!
1928     //! \param    [in] *cmd
1929     //!           pointer to command
1930     //!
1931     //! \return   MOS_STATUS
1932     //!           MOS_STATUS_SUCCESS if success, else fail reason
1933     //!
PopulateBrcUpdateParam(void * cmd)1934     virtual MOS_STATUS PopulateBrcUpdateParam(
1935         void *cmd) { return MOS_STATUS_SUCCESS; }
1936 
1937     //!
1938     //! \brief    Set MHW_VDBOX_AVC_IMG_STATE parameter
1939     //!
1940     //! \param    [in] meMethod
1941     //!           ME method
1942     //! \param    [in] *cmd
1943     //!           pointer to command
1944     //!
1945     //! \return   MOS_STATUS
1946     //!           MOS_STATUS_SUCCESS if success, else fail reason
1947     //!
PopulateEncParam(uint8_t meMethod,void * cmd)1948     virtual MOS_STATUS PopulateEncParam(
1949         uint8_t meMethod,
1950         void    *cmd) { return MOS_STATUS_SUCCESS; }
1951 
1952     //!
1953     //! \brief    Set MHW_VDBOX_AVC_IMG_STATE parameter
1954     //!
1955     //! \param    [in] cmdBuffer
1956     //!           pointer to command buffer
1957     //! \param    [in] secondLevelBatchBuffer
1958     //!           pointer to second level batch buffer
1959     //!
1960     //! \return   MOS_STATUS
1961     //!           MOS_STATUS_SUCCESS if success, else fail reason
1962     //!
PopulatePakParam(PMOS_COMMAND_BUFFER cmdBuffer,PMHW_BATCH_BUFFER secondLevelBatchBuffer)1963     virtual MOS_STATUS PopulatePakParam(
1964         PMOS_COMMAND_BUFFER cmdBuffer,
1965         PMHW_BATCH_BUFFER   secondLevelBatchBuffer) { return MOS_STATUS_SUCCESS; }
1966 
1967     EncodeAvcPar *m_avcPar             = nullptr;  //!< AVC PAR parameters
1968     bool         m_populateTargetUsage = false;
1969 #endif
1970 
1971     //!
1972     //! \brief    Set frame store Id for avc codec.
1973     //! \details
1974     //! \return   frameIdx
1975     //!           [in] frame index
1976     //! \return   MOS_STATUS
1977     //!           MOS_STATUS_SUCCESS if success, else fail reason
1978     //!
1979     MOS_STATUS SetFrameStoreIds(uint8_t frameIdx);
1980 };
1981 #endif // __CODECHAL_ENCODE_AVC_BASE_H__
1982