| /* |
| * Copyright (c) 2017, Intel Corporation |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included |
| * in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
| * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
| * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
| * OTHER DEALINGS IN THE SOFTWARE. |
| */ |
| //! |
| //! \file codechal_encode_avc_g9_skl.cpp |
| //! \brief AVC dual-pipe encoder for GEN9 SKL & BXT. |
| //! |
| #include "codechal_encode_avc_g9_skl.h" |
| #include "igcodeckrn_g9.h" |
| #if USE_CODECHAL_DEBUG_TOOL |
| #include "mhw_vdbox_mfx_hwcmd_g9_skl.h" |
| #endif |
| |
| #define MBENC_NUM_TARGET_USAGES_CM_G9_SKL 3 |
| |
| const uint32_t CodechalEncodeAvcEncG9Skl::TrellisQuantizationEnable[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 1, 0, 0, 0, 0, 0, 0 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEncG9Skl::TrellisQuantizationRounding[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 6, 0, 0, 0, 0, 0, 0 |
| }; |
| |
| const uint32_t CodechalEncodeAvcEncG9Skl::EnableAdaptiveTrellisQuantization[NUM_TARGET_USAGE_MODES] = |
| { |
| 0, 1, 0, 0, 0, 0, 0, 0 |
| }; |
| |
| typedef struct _CODECHAL_ENCODE_AVC_MBENC_CURBE_CM_G9 |
| { |
| // DW0 |
| union |
| { |
| struct |
| { |
| uint32_t SkipModeEn : MOS_BITFIELD_BIT( 0 ); |
| uint32_t AdaptiveEn : MOS_BITFIELD_BIT( 1 ); |
| uint32_t BiMixDis : MOS_BITFIELD_BIT( 2 ); |
| uint32_t : MOS_BITFIELD_RANGE( 3, 4 ); |
| uint32_t EarlyImeSuccessEn : MOS_BITFIELD_BIT( 5 ); |
| uint32_t : MOS_BITFIELD_BIT( 6 ); |
| uint32_t T8x8FlagForInterEn : MOS_BITFIELD_BIT( 7 ); |
| uint32_t : MOS_BITFIELD_RANGE( 8,23 ); |
| uint32_t EarlyImeStop : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW0; |
| |
| // DW1 |
| union |
| { |
| struct |
| { |
| uint32_t MaxNumMVs : MOS_BITFIELD_RANGE( 0, 5 ); |
| uint32_t : MOS_BITFIELD_RANGE( 6,15 ); |
| uint32_t BiWeight : MOS_BITFIELD_RANGE( 16,21 ); |
| uint32_t : MOS_BITFIELD_RANGE( 22,27 ); |
| uint32_t UniMixDisable : MOS_BITFIELD_BIT( 28 ); |
| uint32_t : MOS_BITFIELD_RANGE( 29,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW1; |
| |
| // DW2 |
| union |
| { |
| struct |
| { |
| uint32_t LenSP : MOS_BITFIELD_RANGE( 0, 7 ); |
| uint32_t MaxNumSU : MOS_BITFIELD_RANGE( 8,15 ); |
| uint32_t PicWidth : MOS_BITFIELD_RANGE( 16,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW2; |
| |
| // DW3 |
| union |
| { |
| struct |
| { |
| uint32_t SrcSize : MOS_BITFIELD_RANGE( 0, 1 ); |
| uint32_t : MOS_BITFIELD_RANGE( 2, 3 ); |
| uint32_t MbTypeRemap : MOS_BITFIELD_RANGE( 4, 5 ); |
| uint32_t SrcAccess : MOS_BITFIELD_BIT( 6 ); |
| uint32_t RefAccess : MOS_BITFIELD_BIT( 7 ); |
| uint32_t SearchCtrl : MOS_BITFIELD_RANGE( 8,10 ); |
| uint32_t DualSearchPathOption : MOS_BITFIELD_BIT( 11 ); |
| uint32_t SubPelMode : MOS_BITFIELD_RANGE( 12,13 ); |
| uint32_t SkipType : MOS_BITFIELD_BIT( 14 ); |
| uint32_t DisableFieldCacheAlloc : MOS_BITFIELD_BIT( 15 ); |
| uint32_t InterChromaMode : MOS_BITFIELD_BIT( 16 ); |
| uint32_t FTEnable : MOS_BITFIELD_BIT( 17 ); |
| uint32_t BMEDisableFBR : MOS_BITFIELD_BIT( 18 ); |
| uint32_t BlockBasedSkipEnable : MOS_BITFIELD_BIT( 19 ); |
| uint32_t InterSAD : MOS_BITFIELD_RANGE( 20,21 ); |
| uint32_t IntraSAD : MOS_BITFIELD_RANGE( 22,23 ); |
| uint32_t SubMbPartMask : MOS_BITFIELD_RANGE( 24,30 ); |
| uint32_t : MOS_BITFIELD_BIT( 31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW3; |
| |
| // DW4 |
| union |
| { |
| struct |
| { |
| uint32_t PicHeightMinus1 : MOS_BITFIELD_RANGE( 0,15 ); |
| uint32_t MvRestrictionInSliceEnable : MOS_BITFIELD_BIT( 16 ); |
| uint32_t DeltaMvEnable : MOS_BITFIELD_BIT( 17 ); |
| uint32_t TrueDistortionEnable : MOS_BITFIELD_BIT( 18 ); |
| uint32_t EnableWavefrontOptimization : MOS_BITFIELD_BIT( 19); |
| uint32_t : MOS_BITFIELD_BIT( 20); |
| uint32_t EnableIntraCostScalingForStaticFrame: MOS_BITFIELD_BIT( 21); |
| uint32_t EnableIntraRefresh : MOS_BITFIELD_BIT( 22); |
| uint32_t Reserved : MOS_BITFIELD_BIT( 23); |
| uint32_t EnableDirtyRect : MOS_BITFIELD_BIT( 24); |
| uint32_t bCurFldIDR : MOS_BITFIELD_BIT( 25 ); |
| uint32_t ConstrainedIntraPredFlag : MOS_BITFIELD_BIT( 26 ); |
| uint32_t FieldParityFlag : MOS_BITFIELD_BIT( 27 ); |
| uint32_t HMEEnable : MOS_BITFIELD_BIT( 28 ); |
| uint32_t PictureType : MOS_BITFIELD_RANGE( 29,30 ); |
| uint32_t UseActualRefQPValue : MOS_BITFIELD_BIT( 31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW4; |
| |
| // DW5 |
| union |
| { |
| struct |
| { |
| uint32_t SliceMbHeight : MOS_BITFIELD_RANGE( 0,15 ); |
| uint32_t RefWidth : MOS_BITFIELD_RANGE( 16,23 ); |
| uint32_t RefHeight : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW5; |
| |
| // DW6 |
| union |
| { |
| struct |
| { |
| uint32_t BatchBufferEnd : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW6; |
| |
| // DW7 |
| union |
| { |
| struct |
| { |
| uint32_t IntraPartMask : MOS_BITFIELD_RANGE( 0, 4 ); |
| uint32_t NonSkipZMvAdded : MOS_BITFIELD_BIT( 5 ); |
| uint32_t NonSkipModeAdded : MOS_BITFIELD_BIT( 6 ); |
| uint32_t LumaIntraSrcCornerSwap : MOS_BITFIELD_BIT( 7 ); |
| uint32_t : MOS_BITFIELD_RANGE( 8,15 ); |
| uint32_t MVCostScaleFactor : MOS_BITFIELD_RANGE( 16,17 ); |
| uint32_t BilinearEnable : MOS_BITFIELD_BIT( 18 ); |
| uint32_t SrcFieldPolarity : MOS_BITFIELD_BIT( 19 ); |
| uint32_t WeightedSADHAAR : MOS_BITFIELD_BIT( 20 ); |
| uint32_t AConlyHAAR : MOS_BITFIELD_BIT( 21 ); |
| uint32_t RefIDCostMode : MOS_BITFIELD_BIT( 22 ); |
| uint32_t : MOS_BITFIELD_BIT( 23 ); |
| uint32_t SkipCenterMask : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW7; |
| |
| // DW8 |
| union |
| { |
| struct |
| { |
| uint32_t Mode0Cost : MOS_BITFIELD_RANGE( 0, 7 ); |
| uint32_t Mode1Cost : MOS_BITFIELD_RANGE( 8,15 ); |
| uint32_t Mode2Cost : MOS_BITFIELD_RANGE( 16,23 ); |
| uint32_t Mode3Cost : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW8; |
| |
| // DW9 |
| union |
| { |
| struct |
| { |
| uint32_t Mode4Cost : MOS_BITFIELD_RANGE( 0, 7 ); |
| uint32_t Mode5Cost : MOS_BITFIELD_RANGE( 8,15 ); |
| uint32_t Mode6Cost : MOS_BITFIELD_RANGE( 16,23 ); |
| uint32_t Mode7Cost : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW9; |
| |
| // DW10 |
| union |
| { |
| struct |
| { |
| uint32_t Mode8Cost : MOS_BITFIELD_RANGE( 0, 7 ); |
| uint32_t Mode9Cost : MOS_BITFIELD_RANGE( 8,15 ); |
| uint32_t RefIDCost : MOS_BITFIELD_RANGE( 16,23 ); |
| uint32_t ChromaIntraModeCost : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW10; |
| |
| // DW11 |
| union |
| { |
| struct |
| { |
| uint32_t MV0Cost : MOS_BITFIELD_RANGE( 0, 7 ); |
| uint32_t MV1Cost : MOS_BITFIELD_RANGE( 8,15 ); |
| uint32_t MV2Cost : MOS_BITFIELD_RANGE( 16,23 ); |
| uint32_t MV3Cost : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW11; |
| |
| // DW12 |
| union |
| { |
| struct |
| { |
| uint32_t MV4Cost : MOS_BITFIELD_RANGE( 0, 7 ); |
| uint32_t MV5Cost : MOS_BITFIELD_RANGE( 8,15 ); |
| uint32_t MV6Cost : MOS_BITFIELD_RANGE( 16,23 ); |
| uint32_t MV7Cost : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW12; |
| |
| // DW13 |
| union |
| { |
| struct |
| { |
| uint32_t QpPrimeY : MOS_BITFIELD_RANGE( 0, 7 ); |
| uint32_t QpPrimeCb : MOS_BITFIELD_RANGE( 8,15 ); |
| uint32_t QpPrimeCr : MOS_BITFIELD_RANGE( 16,23 ); |
| uint32_t TargetSizeInWord : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW13; |
| |
| // DW14 |
| union |
| { |
| struct |
| { |
| uint32_t SICFwdTransCoeffThreshold_0 : MOS_BITFIELD_RANGE( 0,15 ); |
| uint32_t SICFwdTransCoeffThreshold_1 : MOS_BITFIELD_RANGE( 16,23 ); |
| uint32_t SICFwdTransCoeffThreshold_2 : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW14; |
| |
| // DW15 |
| union |
| { |
| struct |
| { |
| uint32_t SICFwdTransCoeffThreshold_3 : MOS_BITFIELD_RANGE( 0, 7 ); |
| uint32_t SICFwdTransCoeffThreshold_4 : MOS_BITFIELD_RANGE( 8,15 ); |
| uint32_t SICFwdTransCoeffThreshold_5 : MOS_BITFIELD_RANGE( 16,23 ); |
| uint32_t SICFwdTransCoeffThreshold_6 : MOS_BITFIELD_RANGE( 24,31 ); // Highest Freq |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW15; |
| |
| // DW16 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_0; |
| SearchPathDelta SPDelta_1; |
| SearchPathDelta SPDelta_2; |
| SearchPathDelta SPDelta_3; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW16; |
| |
| // DW17 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_4; |
| SearchPathDelta SPDelta_5; |
| SearchPathDelta SPDelta_6; |
| SearchPathDelta SPDelta_7; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW17; |
| |
| // DW18 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_8; |
| SearchPathDelta SPDelta_9; |
| SearchPathDelta SPDelta_10; |
| SearchPathDelta SPDelta_11; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW18; |
| |
| // DW19 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_12; |
| SearchPathDelta SPDelta_13; |
| SearchPathDelta SPDelta_14; |
| SearchPathDelta SPDelta_15; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW19; |
| |
| // DW20 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_16; |
| SearchPathDelta SPDelta_17; |
| SearchPathDelta SPDelta_18; |
| SearchPathDelta SPDelta_19; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW20; |
| |
| // DW21 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_20; |
| SearchPathDelta SPDelta_21; |
| SearchPathDelta SPDelta_22; |
| SearchPathDelta SPDelta_23; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW21; |
| |
| // DW22 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_24; |
| SearchPathDelta SPDelta_25; |
| SearchPathDelta SPDelta_26; |
| SearchPathDelta SPDelta_27; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW22; |
| |
| // DW23 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_28; |
| SearchPathDelta SPDelta_29; |
| SearchPathDelta SPDelta_30; |
| SearchPathDelta SPDelta_31; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW23; |
| |
| // DW24 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_32; |
| SearchPathDelta SPDelta_33; |
| SearchPathDelta SPDelta_34; |
| SearchPathDelta SPDelta_35; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW24; |
| |
| // DW25 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_36; |
| SearchPathDelta SPDelta_37; |
| SearchPathDelta SPDelta_38; |
| SearchPathDelta SPDelta_39; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW25; |
| |
| // DW26 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_40; |
| SearchPathDelta SPDelta_41; |
| SearchPathDelta SPDelta_42; |
| SearchPathDelta SPDelta_43; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW26; |
| |
| // DW27 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_44; |
| SearchPathDelta SPDelta_45; |
| SearchPathDelta SPDelta_46; |
| SearchPathDelta SPDelta_47; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW27; |
| |
| // DW28 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_48; |
| SearchPathDelta SPDelta_49; |
| SearchPathDelta SPDelta_50; |
| SearchPathDelta SPDelta_51; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW28; |
| |
| // DW29 |
| union |
| { |
| struct |
| { |
| SearchPathDelta SPDelta_52; |
| SearchPathDelta SPDelta_53; |
| SearchPathDelta SPDelta_54; |
| SearchPathDelta SPDelta_55; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW29; |
| |
| // DW30 |
| union |
| { |
| struct |
| { |
| uint32_t Intra4x4ModeMask : MOS_BITFIELD_RANGE( 0, 8 ); |
| uint32_t : MOS_BITFIELD_RANGE( 9,15 ); |
| uint32_t Intra8x8ModeMask : MOS_BITFIELD_RANGE( 16,24 ); |
| uint32_t : MOS_BITFIELD_RANGE( 25,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW30; |
| |
| // DW31 |
| union |
| { |
| struct |
| { |
| uint32_t Intra16x16ModeMask : MOS_BITFIELD_RANGE( 0, 3 ); |
| uint32_t IntraChromaModeMask : MOS_BITFIELD_RANGE( 4, 7 ); |
| uint32_t IntraComputeType : MOS_BITFIELD_RANGE( 8, 9 ); |
| uint32_t : MOS_BITFIELD_RANGE( 10,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW31; |
| |
| // DW32 |
| union |
| { |
| struct |
| { |
| uint32_t SkipVal : MOS_BITFIELD_RANGE( 0,15 ); |
| uint32_t MultiPredL0Disable : MOS_BITFIELD_RANGE( 16,23 ); |
| uint32_t MultiPredL1Disable : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW32; |
| |
| // DW33 |
| union |
| { |
| struct |
| { |
| uint32_t Intra16x16NonDCPredPenalty : MOS_BITFIELD_RANGE( 0,7 ); |
| uint32_t Intra8x8NonDCPredPenalty : MOS_BITFIELD_RANGE( 8,15 ); |
| uint32_t Intra4x4NonDCPredPenalty : MOS_BITFIELD_RANGE( 16,23 ); |
| uint32_t : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW33; |
| |
| // DW34 |
| union |
| { |
| struct |
| { |
| uint32_t List0RefID0FieldParity : MOS_BITFIELD_BIT( 0 ); |
| uint32_t List0RefID1FieldParity : MOS_BITFIELD_BIT( 1 ); |
| uint32_t List0RefID2FieldParity : MOS_BITFIELD_BIT( 2 ); |
| uint32_t List0RefID3FieldParity : MOS_BITFIELD_BIT( 3 ); |
| uint32_t List0RefID4FieldParity : MOS_BITFIELD_BIT( 4 ); |
| uint32_t List0RefID5FieldParity : MOS_BITFIELD_BIT( 5 ); |
| uint32_t List0RefID6FieldParity : MOS_BITFIELD_BIT( 6 ); |
| uint32_t List0RefID7FieldParity : MOS_BITFIELD_BIT( 7 ); |
| uint32_t List1RefID0FrameFieldFlag : MOS_BITFIELD_BIT( 8 ); |
| uint32_t List1RefID1FrameFieldFlag : MOS_BITFIELD_BIT( 9 ); |
| uint32_t IntraRefreshEn : MOS_BITFIELD_RANGE( 10,11 ); |
| uint32_t ArbitraryNumMbsPerSlice : MOS_BITFIELD_BIT( 12 ); |
| uint32_t ForceNonSkipMbEnable : MOS_BITFIELD_BIT( 13 ); |
| uint32_t DisableEncSkipCheck : MOS_BITFIELD_BIT( 14 ); |
| uint32_t EnableDirectBiasAdjustment : MOS_BITFIELD_BIT( 15 ); |
| uint32_t EnableGlobalMotionBiasAdjustment: MOS_BITFIELD_BIT( 16 ); |
| uint32_t bForceToSkip : MOS_BITFIELD_BIT( 17 ); |
| uint32_t : MOS_BITFIELD_RANGE( 18,23 ); |
| uint32_t List1RefID0FieldParity : MOS_BITFIELD_BIT( 24 ); |
| uint32_t List1RefID1FieldParity : MOS_BITFIELD_BIT( 25 ); |
| uint32_t MADEnableFlag : MOS_BITFIELD_BIT( 26 ); |
| uint32_t ROIEnableFlag : MOS_BITFIELD_BIT( 27 ); |
| uint32_t EnableMBFlatnessChkOptimization : MOS_BITFIELD_BIT( 28 ); |
| uint32_t bDirectMode : MOS_BITFIELD_BIT( 29 ); |
| uint32_t MBBrcEnable : MOS_BITFIELD_BIT( 30 ); |
| uint32_t bOriginalBff : MOS_BITFIELD_BIT( 31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW34; |
| |
| // DW35 |
| union |
| { |
| struct |
| { |
| uint32_t PanicModeMBThreshold : MOS_BITFIELD_RANGE( 0,15 ); |
| uint32_t SmallMbSizeInWord : MOS_BITFIELD_RANGE( 16,23 ); |
| uint32_t LargeMbSizeInWord : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW35; |
| |
| // DW36 |
| union |
| { |
| struct |
| { |
| uint32_t NumRefIdxL0MinusOne : MOS_BITFIELD_RANGE( 0, 7 ); |
| uint32_t HMECombinedExtraSUs : MOS_BITFIELD_RANGE( 8,15 ); |
| uint32_t NumRefIdxL1MinusOne : MOS_BITFIELD_RANGE( 16,23 ); |
| uint32_t EnableCABACAdvanced : MOS_BITFIELD_BIT( 24 ); |
| uint32_t : MOS_BITFIELD_RANGE( 25,27 ); |
| uint32_t IsFwdFrameShortTermRef : MOS_BITFIELD_BIT( 28 ); |
| uint32_t CheckAllFractionalEnable : MOS_BITFIELD_BIT( 29 ); |
| uint32_t HMECombineOverlap : MOS_BITFIELD_RANGE( 30,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW36; |
| |
| // DW37 |
| union |
| { |
| struct |
| { |
| uint32_t SkipModeEn : MOS_BITFIELD_BIT( 0 ); |
| uint32_t AdaptiveEn : MOS_BITFIELD_BIT( 1 ); |
| uint32_t BiMixDis : MOS_BITFIELD_BIT( 2 ); |
| uint32_t : MOS_BITFIELD_RANGE( 3, 4 ); |
| uint32_t EarlyImeSuccessEn : MOS_BITFIELD_BIT( 5 ); |
| uint32_t : MOS_BITFIELD_BIT( 6 ); |
| uint32_t T8x8FlagForInterEn : MOS_BITFIELD_BIT( 7 ); |
| uint32_t : MOS_BITFIELD_RANGE( 8,23 ); |
| uint32_t EarlyImeStop : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW37; |
| |
| // DW38 |
| union |
| { |
| struct |
| { |
| uint32_t LenSP : MOS_BITFIELD_RANGE( 0, 7 ); |
| uint32_t MaxNumSU : MOS_BITFIELD_RANGE( 8,15 ); |
| uint32_t RefThreshold : MOS_BITFIELD_RANGE( 16,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW38; |
| |
| // DW39 |
| union |
| { |
| struct |
| { |
| uint32_t : MOS_BITFIELD_RANGE( 0, 7 ); |
| uint32_t HMERefWindowsCombThreshold : MOS_BITFIELD_RANGE( 8,15 ); |
| uint32_t RefWidth : MOS_BITFIELD_RANGE( 16,23 ); |
| uint32_t RefHeight : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW39; |
| |
| // DW40 |
| union |
| { |
| struct |
| { |
| uint32_t DistScaleFactorRefID0List0 : MOS_BITFIELD_RANGE( 0,15 ); |
| uint32_t DistScaleFactorRefID1List0 : MOS_BITFIELD_RANGE( 16,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW40; |
| |
| // DW41 |
| union |
| { |
| struct |
| { |
| uint32_t DistScaleFactorRefID2List0 : MOS_BITFIELD_RANGE( 0,15 ); |
| uint32_t DistScaleFactorRefID3List0 : MOS_BITFIELD_RANGE( 16,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW41; |
| |
| // DW42 |
| union |
| { |
| struct |
| { |
| uint32_t DistScaleFactorRefID4List0 : MOS_BITFIELD_RANGE( 0,15 ); |
| uint32_t DistScaleFactorRefID5List0 : MOS_BITFIELD_RANGE( 16,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW42; |
| |
| // DW43 |
| union |
| { |
| struct |
| { |
| uint32_t DistScaleFactorRefID6List0 : MOS_BITFIELD_RANGE( 0,15 ); |
| uint32_t DistScaleFactorRefID7List0 : MOS_BITFIELD_RANGE( 16,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW43; |
| |
| // DW44 |
| union |
| { |
| struct |
| { |
| uint32_t ActualQPValueForRefID0List0 : MOS_BITFIELD_RANGE( 0, 7 ); |
| uint32_t ActualQPValueForRefID1List0 : MOS_BITFIELD_RANGE( 8,15 ); |
| uint32_t ActualQPValueForRefID2List0 : MOS_BITFIELD_RANGE( 16,23 ); |
| uint32_t ActualQPValueForRefID3List0 : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW44; |
| |
| // DW45 |
| union |
| { |
| struct |
| { |
| uint32_t ActualQPValueForRefID4List0 : MOS_BITFIELD_RANGE( 0, 7 ); |
| uint32_t ActualQPValueForRefID5List0 : MOS_BITFIELD_RANGE( 8,15 ); |
| uint32_t ActualQPValueForRefID6List0 : MOS_BITFIELD_RANGE( 16,23 ); |
| uint32_t ActualQPValueForRefID7List0 : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW45; |
| |
| // DW46 |
| union |
| { |
| struct |
| { |
| uint32_t ActualQPValueForRefID0List1 : MOS_BITFIELD_RANGE( 0, 7 ); |
| uint32_t ActualQPValueForRefID1List1 : MOS_BITFIELD_RANGE( 8,15 ); |
| uint32_t RefCost : MOS_BITFIELD_RANGE( 16,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW46; |
| |
| // DW47 |
| union |
| { |
| struct |
| { |
| uint32_t MbQpReadFactor : MOS_BITFIELD_RANGE( 0, 7 ); |
| uint32_t IntraCostSF : MOS_BITFIELD_RANGE( 8,15 ); |
| uint32_t MaxVmvR : MOS_BITFIELD_RANGE( 16,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW47; |
| |
| //DW48 |
| union |
| { |
| struct |
| { |
| uint32_t IntraRefreshMBx : MOS_BITFIELD_RANGE( 0, 15 ); |
| uint32_t IntraRefreshUnitInMBMinus1 : MOS_BITFIELD_RANGE( 16,23 ); |
| uint32_t IntraRefreshQPDelta : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW48; |
| |
| // DW49 |
| union |
| { |
| struct |
| { |
| uint32_t ROI1_X_left : MOS_BITFIELD_RANGE( 0,15 ); |
| uint32_t ROI1_Y_top : MOS_BITFIELD_RANGE( 16,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW49; |
| |
| // DW50 |
| union |
| { |
| struct |
| { |
| uint32_t ROI1_X_right : MOS_BITFIELD_RANGE( 0,15 ); |
| uint32_t ROI1_Y_bottom : MOS_BITFIELD_RANGE( 16,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW50; |
| |
| // DW51 |
| union |
| { |
| struct |
| { |
| uint32_t ROI2_X_left : MOS_BITFIELD_RANGE( 0,15 ); |
| uint32_t ROI2_Y_top : MOS_BITFIELD_RANGE( 16,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW51; |
| |
| // DW52 |
| union |
| { |
| struct |
| { |
| uint32_t ROI2_X_right : MOS_BITFIELD_RANGE( 0,15 ); |
| uint32_t ROI2_Y_bottom : MOS_BITFIELD_RANGE( 16,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW52; |
| |
| // DW53 |
| union |
| { |
| struct |
| { |
| uint32_t ROI3_X_left : MOS_BITFIELD_RANGE( 0,15 ); |
| uint32_t ROI3_Y_top : MOS_BITFIELD_RANGE( 16,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW53; |
| |
| // DW54 |
| union |
| { |
| struct |
| { |
| uint32_t ROI3_X_right : MOS_BITFIELD_RANGE( 0,15 ); |
| uint32_t ROI3_Y_bottom : MOS_BITFIELD_RANGE( 16,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW54; |
| |
| // DW55 |
| union |
| { |
| struct |
| { |
| uint32_t ROI4_X_left : MOS_BITFIELD_RANGE( 0,15 ); |
| uint32_t ROI4_Y_top : MOS_BITFIELD_RANGE( 16,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW55; |
| |
| // DW56 |
| union |
| { |
| struct |
| { |
| uint32_t ROI4_X_right : MOS_BITFIELD_RANGE( 0,15 ); |
| uint32_t ROI4_Y_bottom : MOS_BITFIELD_RANGE( 16,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW56; |
| |
| // DW57 |
| union |
| { |
| struct |
| { |
| uint32_t ROI1_dQpPrimeY : MOS_BITFIELD_RANGE( 0, 7 ); |
| uint32_t ROI2_dQpPrimeY : MOS_BITFIELD_RANGE( 8,15 ); |
| uint32_t ROI3_dQpPrimeY : MOS_BITFIELD_RANGE( 16,23 ); |
| uint32_t ROI4_dQpPrimeY : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW57; |
| |
| // DW58 |
| union |
| { |
| struct |
| { |
| uint32_t HMEMVCostScalingFactor : MOS_BITFIELD_RANGE( 0, 7 ); |
| uint32_t Reserved : MOS_BITFIELD_RANGE( 8, 15 ); |
| uint32_t IntraRefreshMBy : MOS_BITFIELD_RANGE( 16, 31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW58; |
| |
| // DW59 |
| union |
| { |
| struct |
| { |
| uint32_t Reserved : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW59; |
| |
| // DW60 |
| union |
| { |
| struct |
| { |
| uint32_t CabacWaZone0Threshold : MOS_BITFIELD_RANGE( 0,15 ); |
| uint32_t CabacWaZone1Threshold : MOS_BITFIELD_RANGE( 16,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW60; |
| |
| // DW61 |
| union |
| { |
| struct |
| { |
| uint32_t CabacWaZone2Threshold : MOS_BITFIELD_RANGE( 0,15 ); |
| uint32_t CabacWaZone3Threshold : MOS_BITFIELD_RANGE( 16,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW61; |
| |
| // DW62 |
| union |
| { |
| struct |
| { |
| uint32_t CABACWAZone0IntraMinQP : MOS_BITFIELD_RANGE( 0, 7 ); |
| uint32_t CABACWAZone1IntraMinQP : MOS_BITFIELD_RANGE( 8,15 ); |
| uint32_t CABACWAZone2IntraMinQP : MOS_BITFIELD_RANGE( 16,23 ); |
| uint32_t CABACWAZone3IntraMinQP : MOS_BITFIELD_RANGE( 24,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW62; |
| |
| // DW63 |
| union |
| { |
| struct |
| { |
| uint32_t Reserved : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW63; |
| |
| // DW64 |
| union |
| { |
| struct |
| { |
| uint32_t Reserved : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW64; |
| |
| // DW65 |
| union |
| { |
| struct |
| { |
| uint32_t MBDataSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW65; |
| |
| // DW66 |
| union |
| { |
| struct |
| { |
| uint32_t MVDataSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW66; |
| |
| // DW67 |
| union |
| { |
| struct |
| { |
| uint32_t IDistSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW67; |
| |
| // DW68 |
| union |
| { |
| struct |
| { |
| uint32_t SrcYSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW68; |
| |
| // DW69 |
| union |
| { |
| struct |
| { |
| uint32_t MBSpecificDataSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW69; |
| |
| // DW70 |
| union |
| { |
| struct |
| { |
| uint32_t AuxVmeOutSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW70; |
| |
| // DW71 |
| union |
| { |
| struct |
| { |
| uint32_t CurrRefPicSelSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW71; |
| |
| // DW72 |
| union |
| { |
| struct |
| { |
| uint32_t HMEMVPredFwdBwdSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW72; |
| |
| // DW73 |
| union |
| { |
| struct |
| { |
| uint32_t HMEDistSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW73; |
| |
| // DW74 |
| union |
| { |
| struct |
| { |
| uint32_t SliceMapSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW74; |
| |
| // DW75 |
| union |
| { |
| struct |
| { |
| uint32_t FwdFrmMBDataSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW75; |
| |
| // DW76 |
| union |
| { |
| struct |
| { |
| uint32_t FwdFrmMVSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW76; |
| |
| // DW77 |
| union |
| { |
| struct |
| { |
| uint32_t MBQPBuffer : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW77; |
| |
| // DW78 |
| union |
| { |
| struct |
| { |
| uint32_t MBBRCLut : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW78; |
| |
| // DW79 |
| union |
| { |
| struct |
| { |
| uint32_t VMEInterPredictionSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW79; |
| |
| // DW80 |
| union |
| { |
| struct |
| { |
| uint32_t VMEInterPredictionMRSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW80; |
| |
| // DW81 |
| union |
| { |
| struct |
| { |
| uint32_t FlatnessChkSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW81; |
| |
| // DW82 |
| union |
| { |
| struct |
| { |
| uint32_t MADSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW82; |
| |
| // DW83 |
| union |
| { |
| struct |
| { |
| uint32_t ForceNonSkipMBmapSurface : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW83; |
| |
| // DW84 |
| union |
| { |
| struct |
| { |
| uint32_t Reserved : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW84; |
| |
| // DW85 |
| union |
| { |
| struct |
| { |
| uint32_t BRCCurbeSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW85; |
| |
| // DW86 |
| union |
| { |
| struct |
| { |
| uint32_t StaticDetectionOutputBufferIndex: MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW86; |
| |
| // DW87 |
| union |
| { |
| struct |
| { |
| uint32_t Reserved : MOS_BITFIELD_RANGE( 0,31 ); |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW87; |
| |
| } CODECHAL_ENCODE_AVC_MBENC_CURBE_CM_G9_SKL, *PCODECHAL_ENCODE_AVC_MBENC_CURBE_CM_G9_SKL; |
| |
| C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CODECHAL_ENCODE_AVC_MBENC_CURBE_CM_G9_SKL)) == 88); |
| |
| typedef struct _CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_VME_BTI_G9 |
| { |
| // DW0 |
| struct |
| { |
| uint32_t m_vmeInterPredictionSurfIndex; |
| } DW0; |
| // DW1 |
| struct |
| { |
| uint32_t m_vmeInterPredictionMRSurfIndex; |
| } DW1; |
| } CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_VME_BTI_G9; |
| |
| typedef struct _CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_COMMON_BTI_G9 |
| { |
| // DW8 |
| struct |
| { |
| uint32_t m_curbeDataSurfIndex; |
| } DW8; |
| // DW9 |
| struct |
| { |
| uint32_t m_mbDataSurfIndex; |
| } DW9; |
| // DW10 |
| struct |
| { |
| uint32_t m_mvDataSurfIndex; |
| } DW10; |
| // DW11 |
| struct |
| { |
| uint32_t m_fwdFrmMBDataSurfIndex; |
| } DW11; |
| // DW12 |
| struct |
| { |
| uint32_t m_fwdFrmMVSurfIndex; |
| } DW12; |
| // DW13 |
| struct |
| { |
| uint32_t m_hmeMVPredFwdBwdSurfIndex; |
| } DW13; |
| // DW14 |
| struct |
| { |
| uint32_t m_hmeDistSurfIndex; |
| } DW14; |
| // DW15 |
| struct |
| { |
| uint32_t m_iDistSurfIndex; |
| } DW15; |
| // DW16 |
| struct |
| { |
| uint32_t m_srcYSurfIndex; |
| } DW16; |
| // DW17 |
| struct |
| { |
| uint32_t m_mbBRCLut; |
| } DW17; |
| // DW18 |
| struct |
| { |
| uint32_t m_madSurfIndex; |
| } DW18; |
| // DW19 |
| struct |
| { |
| uint32_t m_reservedIndex; |
| } DW19; |
| // DW20 |
| struct |
| { |
| uint32_t m_staticDetectionCostTableIndex; |
| } DW20; |
| // DW21 |
| struct |
| { |
| uint32_t m_currRefPicSelSurfIndex; |
| } DW21; |
| // DW22 |
| struct |
| { |
| uint32_t m_mbStatsSurfIndex; |
| } DW22; |
| // DW23 |
| struct |
| { |
| uint32_t m_mbSpecificDataSurfIndex; |
| } DW23; |
| // DW24 |
| struct |
| { |
| uint32_t m_forceNonSkipMBmapSurface; |
| } DW24; |
| // DW25 |
| struct |
| { |
| uint32_t m_sliceMapSurfIndex; |
| } DW25; |
| // DW26 |
| struct |
| { |
| uint32_t m_mbQPBuffer; |
| } DW26; |
| // DW27 |
| struct |
| { |
| uint32_t m_auxVmeOutSurfIndex; |
| } DW27; |
| // DW28 |
| struct |
| { |
| uint32_t m_feiMVPredictorSurfIndex; |
| } DW28; |
| // DW29 |
| struct |
| { |
| uint32_t m_reserved; |
| } DW29; |
| // DW30 |
| struct |
| { |
| uint32_t m_reserved; |
| } DW30; |
| // DW31 |
| struct |
| { |
| uint32_t m_reserved; |
| } DW31; |
| } CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_COMMON_BTI_G9; |
| |
| typedef struct _CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_G9 |
| { |
| CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_VME_BTI_G9 m_vme[CODECHAL_ENCODE_AVC_MFE_MAX_FRAMES_G9]; |
| CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_COMMON_BTI_G9 m_common[CODECHAL_ENCODE_AVC_MFE_MAX_FRAMES_G9]; |
| |
| } CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_G9, *PCODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_G9; |
| |
| // AVC MBEnc CURBE init data for G9 Kernel |
| const uint32_t CodechalEncodeAvcEncG9Skl::MBEnc_CURBE_normal_I_frame[MBENC_CURBE_SIZE_IN_DWORD_G9_SKL] = |
| { |
| 0x00000082, 0x00000000, 0x00003910, 0x00a83000, 0x00000000, 0x28300000, 0x05000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x80800000, 0x00040c24, 0x00000000, 0xffff00ff, 0x40000000, 0x00000080, 0x00003900, 0x28301000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff |
| }; |
| |
| const uint32_t CodechalEncodeAvcEncG9Skl::MBEnc_CURBE_normal_I_field[MBENC_CURBE_SIZE_IN_DWORD_G9_SKL] = |
| { |
| 0x00000082, 0x00000000, 0x00003910, 0x00a830c0, 0x02000000, 0x28300000, 0x05000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x80800000, 0x00040c24, 0x00000000, 0xffff00ff, 0x40000000, 0x00000080, 0x00003900, 0x28301000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000002, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff |
| }; |
| |
| const uint32_t CodechalEncodeAvcEncG9Skl::MBEnc_CURBE_normal_P_frame[MBENC_CURBE_SIZE_IN_DWORD_G9_SKL] = |
| { |
| 0x000000a3, 0x00000008, 0x00003910, 0x00ae3000, 0x30000000, 0x28300000, 0x05000000, 0x01400060, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x80010000, 0x00040c24, 0x00000000, 0xffff00ff, 0x60000000, 0x000000a1, 0x00003900, 0x28301000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x08000002, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff |
| }; |
| |
| const uint32_t CodechalEncodeAvcEncG9Skl::MBEnc_CURBE_normal_P_field[MBENC_CURBE_SIZE_IN_DWORD_G9_SKL] = |
| { |
| 0x000000a3, 0x00000008, 0x00003910, 0x00ae30c0, 0x30000000, 0x28300000, 0x05000000, 0x01400060, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x80010000, 0x00040c24, 0x00000000, 0xffff00ff, 0x40000000, 0x000000a1, 0x00003900, 0x28301000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04000002, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff |
| }; |
| |
| const uint32_t CodechalEncodeAvcEncG9Skl::MBEnc_CURBE_normal_B_frame[MBENC_CURBE_SIZE_IN_DWORD_G9_SKL] = |
| { |
| 0x000000a3, 0x00200008, 0x00003910, 0x00aa7700, 0x50020000, 0x20200000, 0x05000000, 0xff400000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x01010000, 0x00040c24, 0x00000000, 0xffff00ff, 0x60000000, 0x000000a1, 0x00003900, 0x28301000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x08000002, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff |
| }; |
| |
| const uint32_t CodechalEncodeAvcEncG9Skl::MBEnc_CURBE_normal_B_field[MBENC_CURBE_SIZE_IN_DWORD_G9_SKL] = |
| { |
| 0x000000a3, 0x00200008, 0x00003919, 0x00aa77c0, 0x50020000, 0x20200000, 0x05000000, 0xff400000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x01010000, 0x00040c24, 0x00000000, 0xffff00ff, 0x40000000, 0x000000a1, 0x00003900, 0x28301000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x04000002, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff |
| }; |
| |
| // AVC I_DIST CURBE init data for G9 Kernel |
| const uint32_t CodechalEncodeAvcEncG9Skl::MBEnc_CURBE_I_frame_DIST[MBENC_CURBE_SIZE_IN_DWORD_G9_SKL] = |
| { |
| 0x00000082, 0x00200008, 0x001e3910, 0x00a83000, 0x90000000, 0x28300000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0xff000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000100, |
| 0x80800000, 0x00000000, 0x00000800, 0xffff00ff, 0x40000000, 0x00000080, 0x00003900, 0x28300000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, |
| 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff |
| }; |
| |
| const int32_t CodechalEncodeAvcEncG9Skl::BRC_BTCOUNTS[CODECHAL_ENCODE_BRC_IDX_NUM] = { |
| CODECHAL_ENCODE_AVC_BRC_INIT_RESET_NUM_SURFACES, |
| CODECHAL_ENCODE_AVC_FRAME_BRC_UPDATE_NUM_SURFACES_G9, |
| CODECHAL_ENCODE_AVC_BRC_INIT_RESET_NUM_SURFACES, |
| CODECHAL_ENCODE_AVC_MBENC_NUM_SURFACES_CM_G9, |
| CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_NUM_SURFACES, |
| CODECHAL_ENCODE_AVC_MB_BRC_UPDATE_NUM_SURFACES_G9 // MbBRCUpdate kernel starting GEN9 |
| }; |
| |
| const int32_t CodechalEncodeAvcEncG9Skl::BRC_CURBE_SIZE[CODECHAL_ENCODE_BRC_IDX_NUM] = { |
| (sizeof(CODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_G9)), |
| (sizeof(CODECHAL_ENCODE_AVC_FRAME_BRC_UPDATE_CURBE_G9)), |
| (sizeof(CODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_G9)), |
| (sizeof(CODECHAL_ENCODE_AVC_MBENC_CURBE_G9)), |
| 0, |
| (sizeof(CODECHAL_ENCODE_AVC_MB_BRC_UPDATE_CURBE_G9)) // MbBRCUpdate kernel starting GEN9 |
| }; |
| |
| MOS_STATUS CodechalEncodeAvcEncG9Skl::GetKernelHeaderAndSize(void *pvBinary, EncOperation Operation, uint32_t dwKrnStateIdx, void *pvKrnHeader, uint32_t *pdwKrnSize) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pvBinary); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pvKrnHeader); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pdwKrnSize); |
| |
| auto pKernelHeaderTable = (PCODECHAL_ENCODE_AVC_KERNEL_HEADER_G9)pvBinary; |
| auto pInvalidEntry = &(pKernelHeaderTable->AVCMBEnc_Qlty_MFE) + 1; |
| auto dwNextKrnOffset = *pdwKrnSize; |
| |
| PCODECHAL_KERNEL_HEADER pCurrKrnHeader; |
| if (Operation == ENC_SCALING4X) |
| { |
| pCurrKrnHeader = &pKernelHeaderTable->PLY_DScale_PLY; |
| } |
| else if (Operation == ENC_SCALING2X) |
| { |
| pCurrKrnHeader = &pKernelHeaderTable->PLY_2xDScale_PLY; |
| } |
| else if (Operation == ENC_ME) |
| { |
| pCurrKrnHeader = &pKernelHeaderTable->AVC_ME_P; |
| } |
| else if (Operation == VDENC_ME) |
| { |
| pCurrKrnHeader = &pKernelHeaderTable->AVC_ME_VDENC; |
| } |
| else if (Operation == ENC_BRC) |
| { |
| pCurrKrnHeader = &pKernelHeaderTable->InitFrameBRC; |
| } |
| else if (Operation == ENC_MBENC) |
| { |
| pCurrKrnHeader = &pKernelHeaderTable->AVCMBEnc_Qlty_I; |
| } |
| else if (Operation == ENC_MBENC_ADV) |
| { |
| pCurrKrnHeader = &pKernelHeaderTable->AVCMBEnc_Adv_I; |
| } |
| else if (Operation == ENC_WP) |
| { |
| pCurrKrnHeader = &pKernelHeaderTable->AVC_WeightedPrediction; |
| } |
| else if (Operation == ENC_SFD) |
| { |
| pCurrKrnHeader = &pKernelHeaderTable->AVC_StaticFrameDetection; |
| } |
| else |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Unsupported ENC mode requested"); |
| eStatus = MOS_STATUS_INVALID_PARAMETER; |
| return eStatus; |
| } |
| |
| pCurrKrnHeader += dwKrnStateIdx; |
| *((PCODECHAL_KERNEL_HEADER)pvKrnHeader) = *pCurrKrnHeader; |
| |
| auto pNextKrnHeader = (pCurrKrnHeader + 1); |
| if (pNextKrnHeader < pInvalidEntry) |
| { |
| dwNextKrnOffset = pNextKrnHeader->KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT; |
| } |
| *pdwKrnSize = dwNextKrnOffset - (pCurrKrnHeader->KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG9Skl::InitMfe() |
| { |
| if (!m_mfeEnabled) |
| { |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| m_mfeLastStream = (m_mfeEncodeParams.submitIndex == m_mfeEncodeParams.submitNumber - 1); |
| m_mfeFirstStream = (m_mfeEncodeParams.submitIndex == 0); |
| |
| // Defer allocate some MFE specific resources and init flags |
| if (!m_mfeInitialized) |
| { |
| // MFE use surface as MbEnc curbe, which is inited by brc update kernel. |
| m_mbencBrcBufferSize = sizeof(CODECHAL_ENCODE_AVC_MBENC_CURBE_G9); |
| uint32_t size = MOS_ALIGN_CEIL(m_mbencBrcBufferSize, |
| m_stateHeapInterface->pStateHeapInterface->GetCurbeAlignment()); |
| |
| MOS_LOCK_PARAMS LockFlagsWriteOnly; |
| MOS_ZeroMemory(&LockFlagsWriteOnly, sizeof(MOS_LOCK_PARAMS)); |
| LockFlagsWriteOnly.WriteOnly = 1; |
| |
| MOS_ALLOC_GFXRES_PARAMS AllocParamsForBufferLinear; |
| MOS_ZeroMemory(&AllocParamsForBufferLinear, sizeof(MOS_ALLOC_GFXRES_PARAMS)); |
| AllocParamsForBufferLinear.Type = MOS_GFXRES_BUFFER; |
| AllocParamsForBufferLinear.TileType = MOS_TILE_LINEAR; |
| AllocParamsForBufferLinear.Format = Format_Buffer; |
| AllocParamsForBufferLinear.dwBytes = size; |
| AllocParamsForBufferLinear.pBufName = "MbEnc BRC buffer"; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_osInterface->pfnAllocateResource( |
| m_osInterface, |
| &AllocParamsForBufferLinear, |
| &BrcBuffers.resMbEncBrcBuffer)); |
| |
| uint8_t* pData = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| &(BrcBuffers.resMbEncBrcBuffer), |
| &LockFlagsWriteOnly); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pData); |
| |
| MOS_ZeroMemory(pData, size); |
| m_osInterface->pfnUnlockResource(m_osInterface, &BrcBuffers.resMbEncBrcBuffer); |
| CODECHAL_DEBUG_TOOL( |
| m_debugInterface->m_streamId = m_mfeEncodeParams.streamId;) |
| |
| // bookkeeping the orignal interfaces, which are changed during mfe mbenc kernel |
| m_origHwInterface = m_hwInterface; |
| m_origOsInterface = m_osInterface; |
| m_origStateHeapInterface = m_stateHeapInterface; |
| |
| // Whether mfe mbenc kernel is enabled or not |
| MOS_USER_FEATURE_VALUE_DATA UserFeatureData; |
| MOS_ZeroMemory(&UserFeatureData, sizeof(UserFeatureData)); |
| MOS_UserFeature_ReadValue_ID( |
| nullptr, |
| __MEDIA_USER_FEATURE_VALUE_MFE_MBENC_ENABLE_ID, |
| &UserFeatureData, |
| m_osInterface->pOsContext); |
| m_mfeMbEncEanbled = (UserFeatureData.i32Data) ? true : false; |
| |
| m_mfeInitialized = true; |
| } |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG9Skl::SetCurbeAvcMfeMbEnc(PCODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS pParams) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_G9 Cmd; |
| PCODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC pBindingTable = pParams->pBindingTable; |
| |
| if (pParams->submitNumber > CODECHAL_ENCODE_AVC_MFE_MAX_FRAMES_G9) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("MFE submission number exceeds the threshold"); |
| eStatus = MOS_STATUS_INVALID_PARAMETER; |
| return eStatus; |
| } |
| |
| MOS_ZeroMemory(&Cmd, sizeof(Cmd)); |
| |
| for (uint32_t submitIdx = 0; submitIdx < pParams->submitNumber; submitIdx++) |
| { |
| uint32_t dwBindingTableBase = CODECHAL_ENCODE_AVC_MBENC_NUM_SURFACES_G9 * submitIdx; |
| Cmd.m_vme[submitIdx].DW0.m_vmeInterPredictionSurfIndex = pBindingTable->dwAvcMBEncCurrPicFrame[0] + dwBindingTableBase; |
| Cmd.m_vme[submitIdx].DW1.m_vmeInterPredictionMRSurfIndex = pBindingTable->dwAvcMBEncCurrPicFrame[1] + dwBindingTableBase; |
| |
| Cmd.m_common[submitIdx].DW8.m_curbeDataSurfIndex = pBindingTable->dwAvcMbEncBRCCurbeData + dwBindingTableBase; |
| Cmd.m_common[submitIdx].DW9.m_mbDataSurfIndex = pBindingTable->dwAvcMBEncMfcAvcPakObj + dwBindingTableBase; |
| Cmd.m_common[submitIdx].DW10.m_mvDataSurfIndex = pBindingTable->dwAvcMBEncIndMVData + dwBindingTableBase; |
| Cmd.m_common[submitIdx].DW11.m_fwdFrmMBDataSurfIndex = pBindingTable->dwAvcMBEncBwdRefMBData + dwBindingTableBase; |
| Cmd.m_common[submitIdx].DW12.m_fwdFrmMVSurfIndex = pBindingTable->dwAvcMBEncBwdRefMVData + dwBindingTableBase; |
| Cmd.m_common[submitIdx].DW13.m_hmeMVPredFwdBwdSurfIndex = pBindingTable->dwAvcMBEncMVDataFromME + dwBindingTableBase; |
| Cmd.m_common[submitIdx].DW14.m_hmeDistSurfIndex = pBindingTable->dwAvcMBEncMEDist + dwBindingTableBase; |
| Cmd.m_common[submitIdx].DW15.m_iDistSurfIndex = pBindingTable->dwAvcMBEncBRCDist + dwBindingTableBase; |
| Cmd.m_common[submitIdx].DW16.m_srcYSurfIndex = pBindingTable->dwAvcMBEncCurrY + dwBindingTableBase; |
| Cmd.m_common[submitIdx].DW17.m_mbBRCLut = pBindingTable->dwAvcMBEncMbBrcConstData + dwBindingTableBase; |
| Cmd.m_common[submitIdx].DW18.m_madSurfIndex = pBindingTable->dwAvcMBEncMADData + dwBindingTableBase; |
| Cmd.m_common[submitIdx].DW19.m_reservedIndex = pBindingTable->dwAvcMBEncAdv + dwBindingTableBase; |
| Cmd.m_common[submitIdx].DW20.m_staticDetectionCostTableIndex = pBindingTable->dwAvcMBEncStaticDetectionCostTable + dwBindingTableBase; |
| Cmd.m_common[submitIdx].DW21.m_currRefPicSelSurfIndex = pBindingTable->dwAvcMBEncRefPicSelectL0 + dwBindingTableBase; |
| Cmd.m_common[submitIdx].DW22.m_mbStatsSurfIndex = pBindingTable->dwAvcMBEncMBStats + dwBindingTableBase; |
| Cmd.m_common[submitIdx].DW23.m_mbSpecificDataSurfIndex = pBindingTable->dwAvcMBEncMbSpecificData + dwBindingTableBase; |
| Cmd.m_common[submitIdx].DW24.m_forceNonSkipMBmapSurface = pBindingTable->dwAvcMBEncMbNonSkipMap + dwBindingTableBase; |
| Cmd.m_common[submitIdx].DW25.m_sliceMapSurfIndex = pBindingTable->dwAvcMBEncSliceMapData + dwBindingTableBase; |
| Cmd.m_common[submitIdx].DW26.m_mbQPBuffer = pBindingTable->dwAvcMBEncMbQpFrame + dwBindingTableBase; |
| } |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(pParams->pKernelState->m_dshRegion.AddData( |
| &Cmd, |
| pParams->pKernelState->dwCurbeOffset, |
| sizeof(Cmd))); |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG9Skl::UpdateMfeMbEncBindingTable(uint32_t submitIndex) |
| { |
| auto pBindingTable = &MbEncBindingTable; |
| |
| uint32_t dwBindingTableBase = CODECHAL_ENCODE_AVC_MBENC_NUM_SURFACES_G9 * submitIndex; |
| |
| pBindingTable->dwAvcMBEncMfcAvcPakObj = CODECHAL_ENCODE_AVC_MBENC_MFC_AVC_PAK_OBJ_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncIndMVData = CODECHAL_ENCODE_AVC_MBENC_IND_MV_DATA_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncBRCDist = CODECHAL_ENCODE_AVC_MBENC_BRC_DISTORTION_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncCurrY = CODECHAL_ENCODE_AVC_MBENC_CURR_Y_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncCurrUV = CODECHAL_ENCODE_AVC_MBENC_CURR_UV_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncMbSpecificData = CODECHAL_ENCODE_AVC_MBENC_MB_SPECIFIC_DATA_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncRefPicSelectL0 = CODECHAL_ENCODE_AVC_MBENC_REFPICSELECT_L0_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncMVDataFromME = CODECHAL_ENCODE_AVC_MBENC_MV_DATA_FROM_ME_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncMEDist = CODECHAL_ENCODE_AVC_MBENC_4xME_DISTORTION_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncSliceMapData = CODECHAL_ENCODE_AVC_MBENC_SLICEMAP_DATA_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncBwdRefMBData = CODECHAL_ENCODE_AVC_MBENC_FWD_MB_DATA_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncBwdRefMVData = CODECHAL_ENCODE_AVC_MBENC_FWD_MV_DATA_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncMbBrcConstData = CODECHAL_ENCODE_AVC_MBENC_MBBRC_CONST_DATA_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncMBStats = CODECHAL_ENCODE_AVC_MBENC_MB_STATS_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncMADData = CODECHAL_ENCODE_AVC_MBENC_MAD_DATA_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncMbNonSkipMap = CODECHAL_ENCODE_AVC_MBENC_FORCE_NONSKIP_MB_MAP_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncAdv = CODECHAL_ENCODE_AVC_MBENC_ADV_WA_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMbEncBRCCurbeData = CODECHAL_ENCODE_AVC_MBENC_BRC_CURBE_DATA_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFlatnessChk = CODECHAL_ENCODE_AVC_MBENC_FLATNESS_CHECK_CM_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncStaticDetectionCostTable = CODECHAL_ENCODE_AVC_MBENC_SFD_COST_TABLE_G9 + dwBindingTableBase; |
| |
| // Frame |
| pBindingTable->dwAvcMBEncMbQpFrame = CODECHAL_ENCODE_AVC_MBENC_MBQP_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncCurrPicFrame[0] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_CURR_PIC_IDX_0_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicFrame[0] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX0_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncBwdPicFrame[0] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX0_0_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicFrame[1] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX1_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncBwdPicFrame[1] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX1_0_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicFrame[2] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX2_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicFrame[3] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX3_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicFrame[4] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX4_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicFrame[5] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX5_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicFrame[6] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX6_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicFrame[7] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX7_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncCurrPicFrame[1] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_CURR_PIC_IDX_1_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncBwdPicFrame[2] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX0_1_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncBwdPicFrame[3] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX1_1_G9 + dwBindingTableBase; |
| |
| // Field |
| pBindingTable->dwAvcMBEncMbQpField = CODECHAL_ENCODE_AVC_MBENC_MBQP_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFieldCurrPic[0] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_CURR_PIC_IDX_0_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicTopField[0] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX0_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncBwdPicTopField[0] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX0_0_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicBotField[0] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX0_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncBwdPicBotField[0] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX0_0_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicTopField[1] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX1_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncBwdPicTopField[1] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX1_0_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicBotField[1] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX1_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncBwdPicBotField[1] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX1_0_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicTopField[2] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX2_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicBotField[2] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX2_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicTopField[3] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX3_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicBotField[3] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX3_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicTopField[4] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX4_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicBotField[4] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX4_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicTopField[5] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX5_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicBotField[5] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX5_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicTopField[6] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX6_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicBotField[6] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX6_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicTopField[7] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX7_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFwdPicBotField[7] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX7_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncFieldCurrPic[1] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_CURR_PIC_IDX_1_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncBwdPicTopField[2] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX0_1_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncBwdPicBotField[2] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX0_1_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncBwdPicTopField[3] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX1_1_G9 + dwBindingTableBase; |
| pBindingTable->dwAvcMBEncBwdPicBotField[3] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX1_1_G9 + dwBindingTableBase; |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG9Skl::SetCurbeAvcMbEnc(PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS pParams) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pParams); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pParams->pPicParams); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pParams->pSeqParams); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pParams->pSlcParams); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pParams->pdwBlockBasedSkipEn); |
| |
| auto pPicParams = pParams->pPicParams; |
| auto pSeqParams = pParams->pSeqParams; |
| auto pSlcParams = pParams->pSlcParams; |
| CODECHAL_ENCODE_ASSERT(pSeqParams->TargetUsage < NUM_TARGET_USAGE_MODES); |
| |
| uint8_t ucMeMethod = |
| (m_pictureCodingType == B_TYPE) ? m_bMeMethodGeneric[pSeqParams->TargetUsage] : m_meMethodGeneric[pSeqParams->TargetUsage]; |
| // set SliceQP to MAX_SLICE_QP for MbEnc Adv kernel, we can use it to verify whether QP is changed or not |
| uint8_t SliceQP = (pParams->bUseMbEncAdvKernel && pParams->bBrcEnabled) ? CODECHAL_ENCODE_AVC_MAX_SLICE_QP : pPicParams->pic_init_qp_minus26 + 26 + pSlcParams->slice_qp_delta; |
| bool bFramePicture = CodecHal_PictureIsFrame(pPicParams->CurrOriginalPic); |
| bool bTopField = CodecHal_PictureIsTopField(pPicParams->CurrOriginalPic); |
| bool bBottomField = CodecHal_PictureIsBottomField(pPicParams->CurrOriginalPic); |
| |
| CODECHAL_ENCODE_AVC_MBENC_CURBE_G9 Cmd; |
| if (pParams->bMbEncIFrameDistEnabled) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy( |
| &Cmd, |
| sizeof(CODECHAL_ENCODE_AVC_MBENC_CURBE_G9), |
| MBEnc_CURBE_I_frame_DIST, |
| sizeof(CODECHAL_ENCODE_AVC_MBENC_CURBE_G9))); |
| } |
| else |
| { |
| switch (m_pictureCodingType) |
| { |
| case I_TYPE: |
| if (bFramePicture) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy( |
| &Cmd, |
| sizeof(CODECHAL_ENCODE_AVC_MBENC_CURBE_G9), |
| MBEnc_CURBE_normal_I_frame, |
| sizeof(CODECHAL_ENCODE_AVC_MBENC_CURBE_G9))); |
| } |
| else |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy( |
| &Cmd, |
| sizeof(CODECHAL_ENCODE_AVC_MBENC_CURBE_G9), |
| MBEnc_CURBE_normal_I_field, |
| sizeof(CODECHAL_ENCODE_AVC_MBENC_CURBE_G9))); |
| } |
| break; |
| |
| case P_TYPE: |
| if (bFramePicture) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy( |
| &Cmd, |
| sizeof(CODECHAL_ENCODE_AVC_MBENC_CURBE_G9), |
| MBEnc_CURBE_normal_P_frame, |
| sizeof(CODECHAL_ENCODE_AVC_MBENC_CURBE_G9))); |
| } |
| else |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy( |
| &Cmd, |
| sizeof(CODECHAL_ENCODE_AVC_MBENC_CURBE_G9), |
| MBEnc_CURBE_normal_P_field, |
| sizeof(CODECHAL_ENCODE_AVC_MBENC_CURBE_G9))); |
| } |
| break; |
| |
| case B_TYPE: |
| if (bFramePicture) |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy( |
| &Cmd, |
| sizeof(CODECHAL_ENCODE_AVC_MBENC_CURBE_G9), |
| MBEnc_CURBE_normal_B_frame, |
| sizeof(CODECHAL_ENCODE_AVC_MBENC_CURBE_G9))); |
| } |
| else |
| { |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy( |
| &Cmd, |
| sizeof(CODECHAL_ENCODE_AVC_MBENC_CURBE_G9), |
| MBEnc_CURBE_normal_B_field, |
| sizeof(CODECHAL_ENCODE_AVC_MBENC_CURBE_G9))); |
| } |
| break; |
| |
| default: |
| CODECHAL_ENCODE_ASSERTMESSAGE("Invalid picture coding type."); |
| eStatus = MOS_STATUS_UNKNOWN; |
| return eStatus; |
| } |
| } |
| |
| // r1 |
| Cmd.common.DW0.AdaptiveEn = |
| Cmd.common.DW37.AdaptiveEn = EnableAdaptiveSearch[pSeqParams->TargetUsage]; |
| Cmd.common.DW0.T8x8FlagForInterEn = |
| Cmd.common.DW37.T8x8FlagForInterEn = pPicParams->transform_8x8_mode_flag; |
| Cmd.common.DW2.LenSP = MaxLenSP[pSeqParams->TargetUsage]; |
| Cmd.common.DW38.LenSP = 0; // MBZ |
| Cmd.common.DW3.SrcAccess = |
| Cmd.common.DW3.RefAccess = bFramePicture ? 0 : 1; |
| if (m_pictureCodingType != I_TYPE && bFTQEnable) |
| { |
| if (pParams->pAvcQCParams && pParams->pAvcQCParams->FTQOverride) |
| { |
| Cmd.common.DW3.FTEnable = pParams->pAvcQCParams->FTQEnable; |
| } |
| else |
| { |
| if (m_pictureCodingType == P_TYPE) |
| { |
| Cmd.common.DW3.FTEnable = FTQBasedSkip[pSeqParams->TargetUsage] & 0x01; |
| } |
| else // B_TYPE |
| { |
| Cmd.common.DW3.FTEnable = (FTQBasedSkip[pSeqParams->TargetUsage] >> 1) & 0x01; |
| } |
| } |
| } |
| else |
| { |
| Cmd.common.DW3.FTEnable = 0; |
| } |
| if (pPicParams->UserFlags.bDisableSubMBPartition) |
| { |
| Cmd.common.DW3.SubMbPartMask = CODECHAL_ENCODE_AVC_DISABLE_4X4_SUB_MB_PARTITION | CODECHAL_ENCODE_AVC_DISABLE_4X8_SUB_MB_PARTITION | CODECHAL_ENCODE_AVC_DISABLE_8X4_SUB_MB_PARTITION; |
| } |
| |
| if (pPicParams->bEnableSubMbPartMask) |
| { |
| Cmd.common.DW3.SubMbPartMask |= pPicParams->SubMbPartMask; |
| } |
| |
| if (pPicParams->bEnableSubPelMode) |
| { |
| Cmd.common.DW3.SubPelMode = pPicParams->SubPelMode; |
| } |
| |
| Cmd.common.DW2.PicWidth = pParams->wPicWidthInMb; |
| Cmd.common.DW4.PicHeightMinus1 = pParams->wFieldFrameHeightInMb - 1; |
| Cmd.common.DW4.EnableFBRBypass = bFBRBypassEnable; |
| Cmd.common.DW4.EnableIntraCostScalingForStaticFrame = pParams->bStaticFrameDetectionEnabled; |
| Cmd.common.DW4.FieldParityFlag = bBottomField; |
| Cmd.common.DW4.bCurFldIDR = !bFramePicture && (pPicParams->bIdrPic || m_firstFieldIdrPic); |
| Cmd.common.DW4.ConstrainedIntraPredFlag = pPicParams->constrained_intra_pred_flag; |
| Cmd.common.DW4.HMEEnable = m_hmeEnabled; |
| Cmd.common.DW4.PictureType = m_pictureCodingType - 1; |
| Cmd.common.DW4.UseActualRefQPValue = m_hmeEnabled && (MRDisableQPCheck[pSeqParams->TargetUsage] == 0); |
| Cmd.common.DW5.SliceMbHeight = pParams->usSliceHeight; |
| Cmd.common.DW7.IntraPartMask = pPicParams->transform_8x8_mode_flag ? 0 : 0x2; // Disable 8x8 if flag is not set |
| Cmd.common.DW7.SrcFieldPolarity = bBottomField; |
| |
| // r2 |
| if (pParams->bMbEncIFrameDistEnabled) |
| { |
| Cmd.common.DW6.BatchBufferEnd = 0; |
| } |
| else |
| { |
| uint8_t ucTableIdx = m_pictureCodingType - 1; |
| eStatus = MOS_SecureMemcpy(&(Cmd.common.DW8), 8 * sizeof(uint32_t), ModeMvCost_Cm[ucTableIdx][SliceQP], 8 * sizeof(uint32_t)); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| |
| if (m_pictureCodingType == I_TYPE && bOldModeCostEnable) |
| { |
| // Old intra mode cost needs to be used if bOldModeCostEnable is 1 |
| Cmd.common.DW8.Value = OldIntraModeCost_Cm_Common[SliceQP]; |
| } |
| else if (m_skipBiasAdjustmentEnable) |
| { |
| // Load different MvCost for P picture when SkipBiasAdjustment is enabled |
| // No need to check for P picture as the flag is only enabled for P picture |
| Cmd.common.DW11.Value = MvCost_PSkipAdjustment_Cm_Common[SliceQP]; |
| } |
| } |
| |
| if (pParams->pAvcQCParams && pParams->pAvcQCParams->FTQSkipThresholdLUTInput) |
| { |
| Cmd.common.DW14.SICFwdTransCoeffThreshold_0 = pParams->pAvcQCParams->FTQSkipThresholdLUT[SliceQP]; |
| Cmd.common.DW14.SICFwdTransCoeffThreshold_1 = pParams->pAvcQCParams->FTQSkipThresholdLUT[SliceQP]; |
| Cmd.common.DW14.SICFwdTransCoeffThreshold_2 = pParams->pAvcQCParams->FTQSkipThresholdLUT[SliceQP]; |
| Cmd.common.DW15.SICFwdTransCoeffThreshold_3 = pParams->pAvcQCParams->FTQSkipThresholdLUT[SliceQP]; |
| Cmd.common.DW15.SICFwdTransCoeffThreshold_4 = pParams->pAvcQCParams->FTQSkipThresholdLUT[SliceQP]; |
| Cmd.common.DW15.SICFwdTransCoeffThreshold_5 = pParams->pAvcQCParams->FTQSkipThresholdLUT[SliceQP]; |
| Cmd.common.DW15.SICFwdTransCoeffThreshold_6 = pParams->pAvcQCParams->FTQSkipThresholdLUT[SliceQP]; |
| } |
| |
| // r3 & r4 |
| if (pParams->bMbEncIFrameDistEnabled) |
| { |
| Cmd.common.DW31.IntraComputeType = 1; |
| } |
| else |
| { |
| uint8_t ucTableIdx = (m_pictureCodingType == B_TYPE) ? 1 : 0; |
| eStatus = MOS_SecureMemcpy(&(Cmd.common.DW16), 16 * sizeof(uint32_t), CodechalEncoderState::m_encodeSearchPath[ucTableIdx][ucMeMethod], 16 * sizeof(uint32_t)); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| } |
| |
| // r5 |
| if (m_pictureCodingType != I_TYPE && pParams->pAvcQCParams && pParams->pAvcQCParams->NonFTQSkipThresholdLUTInput) |
| { |
| Cmd.common.DW32.SkipVal = (uint16_t)CalcSkipVal(Cmd.common.DW3.BlockBasedSkipEnable, pPicParams->transform_8x8_mode_flag, |
| pParams->pAvcQCParams->NonFTQSkipThresholdLUT[SliceQP]); |
| |
| } |
| else |
| { |
| if (m_pictureCodingType == P_TYPE) |
| { |
| Cmd.common.DW32.SkipVal = SkipVal_P_Common |
| [Cmd.common.DW3.BlockBasedSkipEnable] |
| [pPicParams->transform_8x8_mode_flag] |
| [SliceQP]; |
| } |
| else if (m_pictureCodingType == B_TYPE) |
| { |
| Cmd.common.DW32.SkipVal = SkipVal_B_Common |
| [Cmd.common.DW3.BlockBasedSkipEnable] |
| [pPicParams->transform_8x8_mode_flag] |
| [SliceQP]; |
| } |
| } |
| |
| Cmd.common.DW13.QpPrimeY = SliceQP; |
| // QpPrimeCb and QpPrimeCr are not used by Kernel. Following settings are for CModel matching. |
| Cmd.common.DW13.QpPrimeCb = SliceQP; |
| Cmd.common.DW13.QpPrimeCr = SliceQP; |
| Cmd.common.DW13.TargetSizeInWord = 0xff; // hardcoded for BRC disabled |
| |
| if (bMultiPredEnable && (m_pictureCodingType != I_TYPE)) |
| { |
| switch (MultiPred[pSeqParams->TargetUsage]) |
| { |
| case 0: // Disable multipred for both P & B picture types |
| Cmd.common.DW32.MultiPredL0Disable = CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| Cmd.common.DW32.MultiPredL1Disable = CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| break; |
| |
| case 1: // Enable multipred for P pictures only |
| Cmd.common.DW32.MultiPredL0Disable = (m_pictureCodingType == P_TYPE) ? CODECHAL_ENCODE_AVC_MULTIPRED_ENABLE : CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| Cmd.common.DW32.MultiPredL1Disable = CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| break; |
| |
| case 2: // Enable multipred for B pictures only |
| Cmd.common.DW32.MultiPredL0Disable = (m_pictureCodingType == B_TYPE) ? |
| CODECHAL_ENCODE_AVC_MULTIPRED_ENABLE : CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| Cmd.common.DW32.MultiPredL1Disable = (m_pictureCodingType == B_TYPE) ? |
| CODECHAL_ENCODE_AVC_MULTIPRED_ENABLE : CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| break; |
| |
| case 3: // Enable multipred for both P & B picture types |
| Cmd.common.DW32.MultiPredL0Disable = CODECHAL_ENCODE_AVC_MULTIPRED_ENABLE; |
| Cmd.common.DW32.MultiPredL1Disable = (m_pictureCodingType == B_TYPE) ? |
| CODECHAL_ENCODE_AVC_MULTIPRED_ENABLE : CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| break; |
| } |
| } |
| else |
| { |
| Cmd.common.DW32.MultiPredL0Disable = CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| Cmd.common.DW32.MultiPredL1Disable = CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| } |
| |
| if (!bFramePicture) |
| { |
| if (m_pictureCodingType != I_TYPE) |
| { |
| Cmd.common.DW34.List0RefID0FieldParity = CodecHalAvcEncode_GetFieldParity(pSlcParams, LIST_0, CODECHAL_ENCODE_REF_ID_0); |
| Cmd.common.DW34.List0RefID1FieldParity = CodecHalAvcEncode_GetFieldParity(pSlcParams, LIST_0, CODECHAL_ENCODE_REF_ID_1); |
| Cmd.common.DW34.List0RefID2FieldParity = CodecHalAvcEncode_GetFieldParity(pSlcParams, LIST_0, CODECHAL_ENCODE_REF_ID_2); |
| Cmd.common.DW34.List0RefID3FieldParity = CodecHalAvcEncode_GetFieldParity(pSlcParams, LIST_0, CODECHAL_ENCODE_REF_ID_3); |
| Cmd.common.DW34.List0RefID4FieldParity = CodecHalAvcEncode_GetFieldParity(pSlcParams, LIST_0, CODECHAL_ENCODE_REF_ID_4); |
| Cmd.common.DW34.List0RefID5FieldParity = CodecHalAvcEncode_GetFieldParity(pSlcParams, LIST_0, CODECHAL_ENCODE_REF_ID_5); |
| Cmd.common.DW34.List0RefID6FieldParity = CodecHalAvcEncode_GetFieldParity(pSlcParams, LIST_0, CODECHAL_ENCODE_REF_ID_6); |
| Cmd.common.DW34.List0RefID7FieldParity = CodecHalAvcEncode_GetFieldParity(pSlcParams, LIST_0, CODECHAL_ENCODE_REF_ID_7); |
| } |
| if (m_pictureCodingType == B_TYPE) |
| { |
| Cmd.common.DW34.List1RefID0FieldParity = CodecHalAvcEncode_GetFieldParity(pSlcParams, LIST_1, CODECHAL_ENCODE_REF_ID_0); |
| Cmd.common.DW34.List1RefID1FieldParity = CodecHalAvcEncode_GetFieldParity(pSlcParams, LIST_1, CODECHAL_ENCODE_REF_ID_1); |
| } |
| } |
| Cmd.common.DW34.RemoveIntraRefreshOverlap = pPicParams->bDisableRollingIntraRefreshOverlap; |
| if (m_adaptiveTransformDecisionEnabled) |
| { |
| if (m_pictureCodingType != I_TYPE) |
| { |
| Cmd.common.DW34.EnableAdaptiveTxDecision = true; |
| } |
| |
| Cmd.common.DW58.TxDecisonThreshold = CODECHAL_ENCODE_AVC_ADAPTIVE_TX_DECISION_THRESHOLD_G9; |
| } |
| |
| if (m_adaptiveTransformDecisionEnabled || m_flatnessCheckEnabled) |
| { |
| Cmd.common.DW58.MBTextureThreshold = CODECHAL_ENCODE_AVC_MB_TEXTURE_THRESHOLD_G9; |
| } |
| |
| if (m_pictureCodingType == B_TYPE) |
| { |
| Cmd.common.DW34.List1RefID0FrameFieldFlag = GetRefPicFieldFlag(pParams, LIST_1, CODECHAL_ENCODE_REF_ID_0); |
| Cmd.common.DW34.List1RefID1FrameFieldFlag = GetRefPicFieldFlag(pParams, LIST_1, CODECHAL_ENCODE_REF_ID_1); |
| Cmd.common.DW34.bDirectMode = pSlcParams->direct_spatial_mv_pred_flag; |
| } |
| Cmd.common.DW34.bOriginalBff = bFramePicture ? 0 : |
| ((m_firstField && (bBottomField)) || (!m_firstField && (!bBottomField))); |
| Cmd.common.DW34.EnableMBFlatnessChkOptimization = m_flatnessCheckEnabled; |
| Cmd.common.DW34.ROIEnableFlag = pParams->bRoiEnabled; |
| Cmd.common.DW34.MADEnableFlag = m_madEnabled; |
| Cmd.common.DW34.MBBrcEnable = bMbBrcEnabled || bMbQpDataEnabled; |
| Cmd.common.DW34.ArbitraryNumMbsPerSlice = m_arbitraryNumMbsInSlice; |
| Cmd.common.DW34.ForceNonSkipMbEnable = pParams->bMbDisableSkipMapEnabled; |
| if (pParams->pAvcQCParams && !Cmd.common.DW34.ForceNonSkipMbEnable) // ignore DisableEncSkipCheck if Mb Disable Skip Map is available |
| { |
| Cmd.common.DW34.DisableEncSkipCheck = pParams->pAvcQCParams->skipCheckDisable; |
| } |
| Cmd.common.DW36.CheckAllFractionalEnable = bCAFEnable; |
| Cmd.common.DW38.RefThreshold = m_refThreshold; |
| Cmd.common.DW39.HMERefWindowsCombThreshold = (m_pictureCodingType == B_TYPE) ? |
| HMEBCombineLen[pSeqParams->TargetUsage] : HMECombineLen[pSeqParams->TargetUsage]; |
| |
| // Default:2 used for MBBRC (MB QP Surface width and height are 4x downscaled picture in MB unit * 4 bytes) |
| // 0 used for MBQP data surface (MB QP Surface width and height are same as the input picture size in MB unit * 1bytes) |
| // starting GEN9, BRC use split kernel, MB QP surface is same size as input picture |
| Cmd.common.DW47.MbQpReadFactor = (bMbBrcEnabled || bMbQpDataEnabled) ? 0 : 2; |
| |
| // Those fields are not really used for I_dist kernel, |
| // but set them to 0 to get bit-exact match with kernel prototype |
| if (pParams->bMbEncIFrameDistEnabled) |
| { |
| Cmd.common.DW13.QpPrimeY = 0; |
| Cmd.common.DW13.QpPrimeCb = 0; |
| Cmd.common.DW13.QpPrimeCr = 0; |
| Cmd.common.DW33.Intra16x16NonDCPredPenalty = 0; |
| Cmd.common.DW33.Intra4x4NonDCPredPenalty = 0; |
| Cmd.common.DW33.Intra8x8NonDCPredPenalty = 0; |
| } |
| |
| //r6 |
| if (Cmd.common.DW4.UseActualRefQPValue) |
| { |
| Cmd.common.DW44.ActualQPValueForRefID0List0 = AVCGetQPValueFromRefList(pParams, LIST_0, CODECHAL_ENCODE_REF_ID_0); |
| Cmd.common.DW44.ActualQPValueForRefID1List0 = AVCGetQPValueFromRefList(pParams, LIST_0, CODECHAL_ENCODE_REF_ID_1); |
| Cmd.common.DW44.ActualQPValueForRefID2List0 = AVCGetQPValueFromRefList(pParams, LIST_0, CODECHAL_ENCODE_REF_ID_2); |
| Cmd.common.DW44.ActualQPValueForRefID3List0 = AVCGetQPValueFromRefList(pParams, LIST_0, CODECHAL_ENCODE_REF_ID_3); |
| Cmd.common.DW45.ActualQPValueForRefID4List0 = AVCGetQPValueFromRefList(pParams, LIST_0, CODECHAL_ENCODE_REF_ID_4); |
| Cmd.common.DW45.ActualQPValueForRefID5List0 = AVCGetQPValueFromRefList(pParams, LIST_0, CODECHAL_ENCODE_REF_ID_5); |
| Cmd.common.DW45.ActualQPValueForRefID6List0 = AVCGetQPValueFromRefList(pParams, LIST_0, CODECHAL_ENCODE_REF_ID_6); |
| Cmd.common.DW45.ActualQPValueForRefID7List0 = AVCGetQPValueFromRefList(pParams, LIST_0, CODECHAL_ENCODE_REF_ID_7); |
| Cmd.common.DW46.ActualQPValueForRefID0List1 = AVCGetQPValueFromRefList(pParams, LIST_1, CODECHAL_ENCODE_REF_ID_0); |
| Cmd.common.DW46.ActualQPValueForRefID1List1 = AVCGetQPValueFromRefList(pParams, LIST_1, CODECHAL_ENCODE_REF_ID_1); |
| } |
| |
| uint8_t ucTableIdx = m_pictureCodingType - 1; |
| Cmd.common.DW46.RefCost = RefCost_MultiRefQp[ucTableIdx][SliceQP]; |
| |
| // Picture Coding Type dependent parameters |
| if (m_pictureCodingType == I_TYPE) |
| { |
| Cmd.common.DW0.SkipModeEn = 0; |
| Cmd.common.DW37.SkipModeEn = 0; |
| Cmd.common.DW36.HMECombineOverlap = 0; |
| Cmd.common.DW47.IntraCostSF = 16; // This is not used but recommended to set this to 16 by Kernel team |
| Cmd.common.DW34.EnableDirectBiasAdjustment = 0; |
| Cmd.common.DW34.EnableGlobalMotionBiasAdjustment = 0; |
| } |
| else if (m_pictureCodingType == P_TYPE) |
| { |
| Cmd.common.DW1.MaxNumMVs = GetMaxMvsPer2Mb(pSeqParams->Level) / 2; |
| Cmd.common.DW3.BMEDisableFBR = 1; |
| Cmd.common.DW5.RefWidth = SearchX[pSeqParams->TargetUsage]; |
| Cmd.common.DW5.RefHeight = SearchY[pSeqParams->TargetUsage]; |
| Cmd.common.DW7.NonSkipZMvAdded = 1; |
| Cmd.common.DW7.NonSkipModeAdded = 1; |
| Cmd.common.DW7.SkipCenterMask = 1; |
| Cmd.common.DW47.IntraCostSF = |
| bAdaptiveIntraScalingEnable ? |
| AdaptiveIntraScalingFactor_Cm_Common[SliceQP] : |
| IntraScalingFactor_Cm_Common[SliceQP]; |
| Cmd.common.DW47.MaxVmvR = (bFramePicture) ? CodecHalAvcEncode_GetMaxMvLen(pSeqParams->Level) * 4 : (CodecHalAvcEncode_GetMaxMvLen(pSeqParams->Level) >> 1) * 4; |
| Cmd.common.DW36.HMECombineOverlap = 1; |
| Cmd.common.DW36.NumRefIdxL0MinusOne = bMultiPredEnable ? pSlcParams->num_ref_idx_l0_active_minus1 : 0; |
| Cmd.common.DW39.RefWidth = SearchX[pSeqParams->TargetUsage]; |
| Cmd.common.DW39.RefHeight = SearchY[pSeqParams->TargetUsage]; |
| Cmd.common.DW34.EnableDirectBiasAdjustment = 0; |
| if (pParams->pAvcQCParams) |
| { |
| Cmd.common.DW34.EnableGlobalMotionBiasAdjustment = pParams->pAvcQCParams->globalMotionBiasAdjustmentEnable; |
| if (Cmd.common.DW34.EnableGlobalMotionBiasAdjustment) |
| { |
| Cmd.common.DW59.HMEMVCostScalingFactor = pParams->pAvcQCParams->HMEMVCostScalingFactor; |
| } |
| } |
| } |
| else |
| { |
| // B_TYPE |
| Cmd.common.DW1.MaxNumMVs = GetMaxMvsPer2Mb(pSeqParams->Level) / 2; |
| Cmd.common.DW1.BiWeight = m_biWeight; |
| Cmd.common.DW3.SearchCtrl = 7; |
| Cmd.common.DW3.SkipType = 1; |
| Cmd.common.DW5.RefWidth = BSearchX[pSeqParams->TargetUsage]; |
| Cmd.common.DW5.RefHeight = BSearchY[pSeqParams->TargetUsage]; |
| Cmd.common.DW7.SkipCenterMask = 0xFF; |
| Cmd.common.DW47.IntraCostSF = |
| bAdaptiveIntraScalingEnable ? |
| AdaptiveIntraScalingFactor_Cm_Common[SliceQP] : |
| IntraScalingFactor_Cm_Common[SliceQP]; |
| Cmd.common.DW47.MaxVmvR = (bFramePicture) ? CodecHalAvcEncode_GetMaxMvLen(pSeqParams->Level) * 4 : (CodecHalAvcEncode_GetMaxMvLen(pSeqParams->Level) >> 1) * 4; |
| Cmd.common.DW36.HMECombineOverlap = 1; |
| // Checking if the forward frame (List 1 index 0) is a short term reference |
| { |
| CODEC_PICTURE CodecHalPic = pParams->pSlcParams->RefPicList[LIST_1][0]; |
| if (CodecHalPic.PicFlags != PICTURE_INVALID && |
| CodecHalPic.FrameIdx != CODECHAL_ENCODE_AVC_INVALID_PIC_ID && |
| pParams->pPicIdx[CodecHalPic.FrameIdx].bValid) |
| { |
| // Although its name is FWD, it actually means the future frame or the backward reference frame |
| Cmd.common.DW36.IsFwdFrameShortTermRef = CodecHal_PictureIsShortTermRef(pParams->pPicParams->RefFrameList[CodecHalPic.FrameIdx]); |
| } |
| else |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Invalid backward reference frame."); |
| eStatus = MOS_STATUS_INVALID_PARAMETER; |
| return eStatus; |
| } |
| } |
| Cmd.common.DW36.NumRefIdxL0MinusOne = bMultiPredEnable ? pSlcParams->num_ref_idx_l0_active_minus1 : 0; |
| Cmd.common.DW36.NumRefIdxL1MinusOne = bMultiPredEnable ? pSlcParams->num_ref_idx_l1_active_minus1 : 0; |
| Cmd.common.DW39.RefWidth = BSearchX[pSeqParams->TargetUsage]; |
| Cmd.common.DW39.RefHeight = BSearchY[pSeqParams->TargetUsage]; |
| Cmd.common.DW40.DistScaleFactorRefID0List0 = m_distScaleFactorList0[0]; |
| Cmd.common.DW40.DistScaleFactorRefID1List0 = m_distScaleFactorList0[1]; |
| Cmd.common.DW41.DistScaleFactorRefID2List0 = m_distScaleFactorList0[2]; |
| Cmd.common.DW41.DistScaleFactorRefID3List0 = m_distScaleFactorList0[3]; |
| Cmd.common.DW42.DistScaleFactorRefID4List0 = m_distScaleFactorList0[4]; |
| Cmd.common.DW42.DistScaleFactorRefID5List0 = m_distScaleFactorList0[5]; |
| Cmd.common.DW43.DistScaleFactorRefID6List0 = m_distScaleFactorList0[6]; |
| Cmd.common.DW43.DistScaleFactorRefID7List0 = m_distScaleFactorList0[7]; |
| if (pParams->pAvcQCParams) |
| { |
| Cmd.common.DW34.EnableDirectBiasAdjustment = pParams->pAvcQCParams->directBiasAdjustmentEnable; |
| if (Cmd.common.DW34.EnableDirectBiasAdjustment) |
| { |
| Cmd.common.DW7.NonSkipModeAdded = 1; |
| Cmd.common.DW7.NonSkipZMvAdded = 1; |
| } |
| |
| Cmd.common.DW34.EnableGlobalMotionBiasAdjustment = pParams->pAvcQCParams->globalMotionBiasAdjustmentEnable; |
| if (Cmd.common.DW34.EnableGlobalMotionBiasAdjustment) |
| { |
| Cmd.common.DW59.HMEMVCostScalingFactor = pParams->pAvcQCParams->HMEMVCostScalingFactor; |
| } |
| } |
| { |
| CODEC_PICTURE RefPic; |
| RefPic = pSlcParams->RefPicList[LIST_1][0]; |
| |
| Cmd.common.DW64.L1ListRef0PictureCodingType = m_refList[m_picIdx[RefPic.FrameIdx].ucPicIdx]->ucAvcPictureCodingType; |
| if(bFramePicture && ((Cmd.common.DW64.L1ListRef0PictureCodingType == CODEC_AVC_PIC_CODING_TYPE_TFF_FIELD) || (Cmd.common.DW64.L1ListRef0PictureCodingType == CODEC_AVC_PIC_CODING_TYPE_BFF_FIELD))) |
| { |
| uint16_t wFieldHeightInMb = (pParams->wFieldFrameHeightInMb + 1) >> 1; |
| Cmd.common.DW66.BottomFieldOffsetL1ListRef0MV = MOS_ALIGN_CEIL(wFieldHeightInMb * pParams->wPicWidthInMb * (32 * 4), 0x1000); |
| Cmd.common.DW67.BottomFieldOffsetL1ListRef0MBCode = wFieldHeightInMb * pParams->wPicWidthInMb * 64; |
| } |
| } |
| } |
| |
| *pParams->pdwBlockBasedSkipEn = Cmd.common.DW3.BlockBasedSkipEnable; |
| |
| if (pPicParams->EnableRollingIntraRefresh) |
| { |
| Cmd.common.DW34.IntraRefreshEn = pPicParams->EnableRollingIntraRefresh; |
| |
| /* Multiple predictor should be completely disabled for the RollingI feature. This does not lead to much quality drop for P frames especially for TU as 1 */ |
| Cmd.common.DW32.MultiPredL0Disable = CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE; |
| |
| /* Pass the same IntraRefreshUnit to the kernel w/o the adjustment by -1, so as to have an overlap of one MB row or column of Intra macroblocks |
| across one P frame to another P frame, as needed by the RollingI algo */ |
| Cmd.common.DW48.IntraRefreshMBNum = pPicParams->IntraRefreshMBNum; /* MB row or column number */ |
| Cmd.common.DW48.IntraRefreshUnitInMBMinus1 = pPicParams->IntraRefreshUnitinMB; |
| Cmd.common.DW48.IntraRefreshQPDelta = pPicParams->IntraRefreshQPDelta; |
| } |
| else |
| { |
| Cmd.common.DW34.IntraRefreshEn = 0; |
| } |
| |
| Cmd.common.DW34.EnablePerMBStaticCheck = pParams->bStaticFrameDetectionEnabled; |
| Cmd.common.DW34.EnableAdaptiveSearchWindowSize = pParams->bApdatvieSearchWindowSizeEnabled; |
| |
| if (true == pParams->bRoiEnabled) |
| { |
| Cmd.common.DW49.ROI1_X_left = pPicParams->ROI[0].Left; |
| Cmd.common.DW49.ROI1_Y_top = pPicParams->ROI[0].Top; |
| Cmd.common.DW50.ROI1_X_right = pPicParams->ROI[0].Right; |
| Cmd.common.DW50.ROI1_Y_bottom = pPicParams->ROI[0].Bottom; |
| |
| Cmd.common.DW51.ROI2_X_left = pPicParams->ROI[1].Left; |
| Cmd.common.DW51.ROI2_Y_top = pPicParams->ROI[1].Top; |
| Cmd.common.DW52.ROI2_X_right = pPicParams->ROI[1].Right; |
| Cmd.common.DW52.ROI2_Y_bottom = pPicParams->ROI[1].Bottom; |
| |
| Cmd.common.DW53.ROI3_X_left = pPicParams->ROI[2].Left; |
| Cmd.common.DW53.ROI3_Y_top = pPicParams->ROI[2].Top; |
| Cmd.common.DW54.ROI3_X_right = pPicParams->ROI[2].Right; |
| Cmd.common.DW54.ROI3_Y_bottom = pPicParams->ROI[2].Bottom; |
| |
| Cmd.common.DW55.ROI4_X_left = pPicParams->ROI[3].Left; |
| Cmd.common.DW55.ROI4_Y_top = pPicParams->ROI[3].Top; |
| Cmd.common.DW56.ROI4_X_right = pPicParams->ROI[3].Right; |
| Cmd.common.DW56.ROI4_Y_bottom = pPicParams->ROI[3].Bottom; |
| |
| if (bBrcEnabled == false) |
| { |
| uint16_t numROI = pPicParams->NumROI; |
| char priorityLevelOrDQp[CODECHAL_ENCODE_AVC_MAX_ROI_NUMBER] = { 0 }; |
| |
| // cqp case |
| for (unsigned int i = 0; i < numROI; i += 1) |
| { |
| char dQpRoi = pPicParams->ROI[i].PriorityLevelOrDQp; |
| |
| // clip qp roi in order to have (qp + qpY) in range [0, 51] |
| priorityLevelOrDQp[i] = (char)CodecHal_Clip3(-SliceQP, CODECHAL_ENCODE_AVC_MAX_SLICE_QP - SliceQP, dQpRoi); |
| } |
| |
| Cmd.common.DW57.ROI1_dQpPrimeY = priorityLevelOrDQp[0]; |
| Cmd.common.DW57.ROI2_dQpPrimeY = priorityLevelOrDQp[1]; |
| Cmd.common.DW57.ROI3_dQpPrimeY = priorityLevelOrDQp[2]; |
| Cmd.common.DW57.ROI4_dQpPrimeY = priorityLevelOrDQp[3]; |
| } |
| else |
| { |
| // kernel does not support BRC case |
| Cmd.common.DW34.ROIEnableFlag = 0; |
| } |
| } |
| else if (pParams->bDirtyRoiEnabled) |
| { |
| // enable Dirty Rect flag |
| Cmd.common.DW4.EnableDirtyRect = true; |
| |
| Cmd.common.DW49.ROI1_X_left = pParams->pPicParams->DirtyROI[0].Left; |
| Cmd.common.DW49.ROI1_Y_top = pParams->pPicParams->DirtyROI[0].Top; |
| Cmd.common.DW50.ROI1_X_right = pParams->pPicParams->DirtyROI[0].Right; |
| Cmd.common.DW50.ROI1_Y_bottom = pParams->pPicParams->DirtyROI[0].Bottom; |
| |
| Cmd.common.DW51.ROI2_X_left = pParams->pPicParams->DirtyROI[1].Left; |
| Cmd.common.DW51.ROI2_Y_top = pParams->pPicParams->DirtyROI[1].Top; |
| Cmd.common.DW52.ROI2_X_right = pParams->pPicParams->DirtyROI[1].Right; |
| Cmd.common.DW52.ROI2_Y_bottom = pParams->pPicParams->DirtyROI[1].Bottom; |
| |
| Cmd.common.DW53.ROI3_X_left = pParams->pPicParams->DirtyROI[2].Left; |
| Cmd.common.DW53.ROI3_Y_top = pParams->pPicParams->DirtyROI[2].Top; |
| Cmd.common.DW54.ROI3_X_right = pParams->pPicParams->DirtyROI[2].Right; |
| Cmd.common.DW54.ROI3_Y_bottom = pParams->pPicParams->DirtyROI[2].Bottom; |
| |
| Cmd.common.DW55.ROI4_X_left = pParams->pPicParams->DirtyROI[3].Left; |
| Cmd.common.DW55.ROI4_Y_top = pParams->pPicParams->DirtyROI[3].Top; |
| Cmd.common.DW56.ROI4_X_right = pParams->pPicParams->DirtyROI[3].Right; |
| Cmd.common.DW56.ROI4_Y_bottom = pParams->pPicParams->DirtyROI[3].Bottom; |
| } |
| |
| //IPCM QP and threshold |
| Cmd.common.DW60.IPCM_QP0 = IPCM_Threshold_Table[0].QP; |
| Cmd.common.DW60.IPCM_QP1 = IPCM_Threshold_Table[1].QP; |
| Cmd.common.DW60.IPCM_QP2 = IPCM_Threshold_Table[2].QP; |
| Cmd.common.DW60.IPCM_QP3 = IPCM_Threshold_Table[3].QP; |
| Cmd.common.DW61.IPCM_QP4 = IPCM_Threshold_Table[4].QP; |
| |
| Cmd.common.DW61.IPCM_Thresh0 = IPCM_Threshold_Table[0].Threshold; |
| Cmd.common.DW62.IPCM_Thresh1 = IPCM_Threshold_Table[1].Threshold; |
| Cmd.common.DW62.IPCM_Thresh2 = IPCM_Threshold_Table[2].Threshold; |
| Cmd.common.DW63.IPCM_Thresh3 = IPCM_Threshold_Table[3].Threshold; |
| Cmd.common.DW63.IPCM_Thresh4 = IPCM_Threshold_Table[4].Threshold; |
| |
| Cmd.common.DW64.EnableColorBleedWAforIntraSlice = 0; |
| Cmd.common.DW64.MBInputEnable = bMbSpecificDataEnabled; |
| |
| if (IsMfeMbEncEnabled(pParams->bMbEncIFrameDistEnabled)) |
| { |
| |
| // MFE uses quality mode kernel for perf mode. It changes |
| // some curbe settings to simulate the perf mode kernel |
| // These settings include: |
| // MultipredictorL0EnableBit/MultipredictorL1EnableBit = 0, set by MultiPred[TargetUsage] |
| // AllFractional = 0, set by CODECHAL_ENCODE_AVC_AllFractional_Common[TargetUsage] |
| // EnableATD = 0, set by CODECHAL_ENCODE_AVC_EnableAdaptiveTxDecision_Common[TargetUsage] |
| // EnableFBRBypass = 0 |
| // NumRefIdxL0MinusOne/NumRefIdxL1MinusOne = 0 |
| if (m_targetUsage == TARGETUSAGE_BEST_SPEED) |
| { |
| Cmd.common.DW4.EnableFBRBypass = false; |
| Cmd.common.DW36.NumRefIdxL0MinusOne = 0; |
| Cmd.common.DW36.NumRefIdxL1MinusOne = 0; |
| } |
| |
| MOS_LOCK_PARAMS LockFlagsWriteOnly; |
| MOS_ZeroMemory(&LockFlagsWriteOnly, sizeof(MOS_LOCK_PARAMS)); |
| LockFlagsWriteOnly.WriteOnly = 1; |
| |
| uint8_t* pData = (uint8_t*)m_osInterface->pfnLockResource( |
| m_osInterface, |
| &(BrcBuffers.resMbEncBrcBuffer), |
| &LockFlagsWriteOnly); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pData); |
| |
| MOS_SecureMemcpy(pData, sizeof(Cmd.common), (void *)&Cmd, sizeof(Cmd.common)); |
| |
| m_osInterface->pfnUnlockResource(m_osInterface, &BrcBuffers.resMbEncBrcBuffer); |
| } |
| else |
| { |
| Cmd.surfaces.DW80.MBDataSurfIndex = CODECHAL_ENCODE_AVC_MBENC_MFC_AVC_PAK_OBJ_G9; |
| Cmd.surfaces.DW81.MVDataSurfIndex = CODECHAL_ENCODE_AVC_MBENC_IND_MV_DATA_G9; |
| Cmd.surfaces.DW82.IDistSurfIndex = CODECHAL_ENCODE_AVC_MBENC_BRC_DISTORTION_G9; |
| Cmd.surfaces.DW83.SrcYSurfIndex = CODECHAL_ENCODE_AVC_MBENC_CURR_Y_G9; |
| Cmd.surfaces.DW84.MBSpecificDataSurfIndex = CODECHAL_ENCODE_AVC_MBENC_MB_SPECIFIC_DATA_G9; |
| Cmd.surfaces.DW85.AuxVmeOutSurfIndex = CODECHAL_ENCODE_AVC_MBENC_AUX_VME_OUT_G9; |
| Cmd.surfaces.DW86.CurrRefPicSelSurfIndex = CODECHAL_ENCODE_AVC_MBENC_REFPICSELECT_L0_G9; |
| Cmd.surfaces.DW87.HMEMVPredFwdBwdSurfIndex = CODECHAL_ENCODE_AVC_MBENC_MV_DATA_FROM_ME_G9; |
| Cmd.surfaces.DW88.HMEDistSurfIndex = CODECHAL_ENCODE_AVC_MBENC_4xME_DISTORTION_G9; |
| Cmd.surfaces.DW89.SliceMapSurfIndex = CODECHAL_ENCODE_AVC_MBENC_SLICEMAP_DATA_G9; |
| Cmd.surfaces.DW90.FwdFrmMBDataSurfIndex = CODECHAL_ENCODE_AVC_MBENC_FWD_MB_DATA_G9; |
| Cmd.surfaces.DW91.FwdFrmMVSurfIndex = CODECHAL_ENCODE_AVC_MBENC_FWD_MV_DATA_G9; |
| Cmd.surfaces.DW92.MBQPBuffer = CODECHAL_ENCODE_AVC_MBENC_MBQP_G9; |
| Cmd.surfaces.DW93.MBBRCLut = CODECHAL_ENCODE_AVC_MBENC_MBBRC_CONST_DATA_G9; |
| Cmd.surfaces.DW94.VMEInterPredictionSurfIndex = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_CURR_PIC_IDX_0_G9; |
| Cmd.surfaces.DW95.VMEInterPredictionMRSurfIndex = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_CURR_PIC_IDX_1_G9; |
| Cmd.surfaces.DW96.MbStatsSurfIndex = CODECHAL_ENCODE_AVC_MBENC_MB_STATS_G9; |
| Cmd.surfaces.DW97.MADSurfIndex = CODECHAL_ENCODE_AVC_MBENC_MAD_DATA_G9; |
| Cmd.surfaces.DW98.ForceNonSkipMBmapSurface = CODECHAL_ENCODE_AVC_MBENC_FORCE_NONSKIP_MB_MAP_G9; |
| Cmd.surfaces.DW99.ReservedIndex = CODECHAL_ENCODE_AVC_MBENC_ADV_WA_G9; |
| Cmd.surfaces.DW100.BRCCurbeSurfIndex = CODECHAL_ENCODE_AVC_MBENC_BRC_CURBE_DATA_G9; |
| Cmd.surfaces.DW101.StaticDetectionCostTableIndex = CODECHAL_ENCODE_AVC_MBENC_SFD_COST_TABLE_G9; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(pParams->pKernelState->m_dshRegion.AddData( |
| &Cmd, |
| pParams->pKernelState->dwCurbeOffset, |
| sizeof(Cmd))); |
| } |
| |
| CODECHAL_DEBUG_TOOL( |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(PopulateEncParam( |
| ucMeMethod, |
| &Cmd)); |
| ) |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG9Skl::GetTrellisQuantization(PCODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS pParams, PCODECHAL_ENCODE_AVC_TQ_PARAMS pTrellisQuantParams) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pParams); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pTrellisQuantParams); |
| |
| pTrellisQuantParams->dwTqEnabled = TrellisQuantizationEnable[pParams->ucTargetUsage]; |
| pTrellisQuantParams->dwTqRounding = |
| pTrellisQuantParams->dwTqEnabled ? TrellisQuantizationRounding[pParams->ucTargetUsage] : 0; |
| |
| // If AdaptiveTrellisQuantization is enabled then disable trellis quantization for |
| // B-frames with QP > 26 only in CQP mode |
| if (pTrellisQuantParams->dwTqEnabled |
| && EnableAdaptiveTrellisQuantization[pParams->ucTargetUsage] |
| && pParams->wPictureCodingType == B_TYPE |
| && !pParams->bBrcEnabled && pParams->ucQP > 26) |
| { |
| pTrellisQuantParams->dwTqEnabled = 0; |
| pTrellisQuantParams->dwTqRounding = 0; |
| } |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG9Skl::InitBrcConstantBufferMultiRefQP(PCODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS pParams) |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pParams); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pParams->pOsInterface); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pParams->pPicParams); |
| |
| uint8_t ucTableIdx = pParams->wPictureCodingType - 1; |
| bool bBlockBasedSkipEn = pParams->dwMbEncBlockBasedSkipEn ? true : false; |
| bool bTransform_8x8_mode_flag = pParams->pPicParams->transform_8x8_mode_flag ? true : false; |
| |
| if (ucTableIdx >= 3) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Invalid input parameter."); |
| eStatus = MOS_STATUS_INVALID_PARAMETER; |
| return eStatus; |
| } |
| |
| MOS_LOCK_PARAMS LockFlags; |
| MOS_ZeroMemory(&LockFlags, sizeof(MOS_LOCK_PARAMS)); |
| LockFlags.WriteOnly = 1; |
| uint8_t* pbData = (uint8_t*)pParams->pOsInterface->pfnLockResource( |
| pParams->pOsInterface, |
| &pParams->sBrcConstantDataBuffer.OsResource, |
| &LockFlags); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pbData); |
| |
| MOS_ZeroMemory(pbData, pParams->sBrcConstantDataBuffer.dwWidth * pParams->sBrcConstantDataBuffer.dwHeight); |
| |
| // Fill surface with QP Adjustment table, Distortion threshold table, MaxFrame threshold table, Distortion QP Adjustment Table |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| sizeof(m_qpDistMaxFrameAdjustmentCm), |
| (void*)m_qpDistMaxFrameAdjustmentCm, |
| sizeof(m_qpDistMaxFrameAdjustmentCm)); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| |
| pbData += sizeof(m_qpDistMaxFrameAdjustmentCm); |
| |
| // Fill surface with Skip Threshold Table |
| switch (pParams->wPictureCodingType) |
| { |
| case P_TYPE: |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| m_brcConstantSurfaceEarlySkipTableSize, |
| (void*)&SkipVal_P_Common[bBlockBasedSkipEn][bTransform_8x8_mode_flag][0], |
| m_brcConstantSurfaceEarlySkipTableSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| break; |
| case B_TYPE: |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| m_brcConstantSurfaceEarlySkipTableSize, |
| (void*)&SkipVal_B_Common[bBlockBasedSkipEn][bTransform_8x8_mode_flag][0], |
| m_brcConstantSurfaceEarlySkipTableSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| break; |
| default: |
| // do nothing for I TYPE |
| break; |
| } |
| |
| if ((pParams->wPictureCodingType != I_TYPE) && (pParams->pAvcQCParams != nullptr) && (pParams->pAvcQCParams->NonFTQSkipThresholdLUTInput)) |
| { |
| for (uint8_t ucQp = 0; ucQp < CODEC_AVC_NUM_QP; ucQp++) |
| { |
| *(pbData + 1 + (ucQp * 2)) = (uint8_t)CalcSkipVal((pParams->dwMbEncBlockBasedSkipEn ? true : false), (pParams->pPicParams->transform_8x8_mode_flag ? true : false), pParams->pAvcQCParams->NonFTQSkipThresholdLUT[ucQp]); |
| } |
| } |
| |
| pbData += m_brcConstantSurfaceEarlySkipTableSize; |
| |
| // Fill surface with QP list |
| |
| // Initialize to -1 (0xff) |
| MOS_FillMemory(pbData, CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_QP_LIST_0_G9, 0xff); |
| MOS_FillMemory(pbData |
| + CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_QP_LIST_0_G9 |
| + CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_QP_LIST_0_RESERVED_G9, |
| CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_QP_LIST_1_G9, 0xff); |
| |
| uint8_t ucRefIdx; |
| CODEC_PICTURE RefPic; |
| switch (pParams->wPictureCodingType) |
| { |
| case B_TYPE: |
| pbData += (CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_QP_LIST_0_G9 + CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_QP_LIST_0_RESERVED_G9); |
| |
| for (ucRefIdx = 0; ucRefIdx <= pParams->pAvcSlcParams->num_ref_idx_l1_active_minus1; ucRefIdx++) |
| { |
| RefPic = pParams->pAvcSlcParams->RefPicList[LIST_1][ucRefIdx]; |
| if (!CodecHal_PictureIsInvalid(RefPic) && pParams->pAvcPicIdx[RefPic.FrameIdx].bValid) |
| { |
| *(pbData + ucRefIdx) = pParams->pAvcPicIdx[RefPic.FrameIdx].ucPicIdx; |
| } |
| } |
| pbData -= (CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_QP_LIST_0_G9 + CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_QP_LIST_0_RESERVED_G9); |
| // break statement omitted intentionally |
| case P_TYPE: |
| for (ucRefIdx = 0; ucRefIdx <= pParams->pAvcSlcParams->num_ref_idx_l0_active_minus1; ucRefIdx++) |
| { |
| RefPic = pParams->pAvcSlcParams->RefPicList[LIST_0][ucRefIdx]; |
| if (!CodecHal_PictureIsInvalid(RefPic) && pParams->pAvcPicIdx[RefPic.FrameIdx].bValid) |
| { |
| *(pbData + ucRefIdx) = pParams->pAvcPicIdx[RefPic.FrameIdx].ucPicIdx; |
| } |
| } |
| break; |
| default: |
| // do nothing for I type |
| break; |
| } |
| |
| pbData += (CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_QP_LIST_0_G9 + CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_QP_LIST_0_RESERVED_G9 |
| + CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_QP_LIST_1_G9 + CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_QP_LIST_1_RESERVED_G9); |
| |
| // Fill surface with Mode cost and MV cost |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| m_brcConstantSurfacModeMvCostSize, |
| (void*)ModeMvCost_Cm[ucTableIdx], |
| m_brcConstantSurfacModeMvCostSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| |
| // If old mode cost is used the update the table |
| uint32_t* pdwDataTemp; |
| if (pParams->wPictureCodingType == I_TYPE && pParams->bOldModeCostEnable) |
| { |
| pdwDataTemp = (uint32_t*)pbData; |
| for (uint8_t ucQp = 0; ucQp < CODEC_AVC_NUM_QP; ucQp++) |
| { |
| // Writing to DW0 in each sub-array of 16 DWs |
| *pdwDataTemp = (uint32_t)OldIntraModeCost_Cm_Common[ucQp]; |
| pdwDataTemp += 16; |
| } |
| } |
| |
| if (pParams->pAvcQCParams) |
| { |
| for (uint8_t ucQp = 0; ucQp < CODEC_AVC_NUM_QP; ucQp++) |
| { |
| if (pParams->pAvcQCParams->FTQSkipThresholdLUTInput) |
| { |
| *(pbData + (ucQp * 32) + 24) = |
| *(pbData + (ucQp * 32) + 25) = |
| *(pbData + (ucQp * 32) + 27) = |
| *(pbData + (ucQp * 32) + 28) = |
| *(pbData + (ucQp * 32) + 29) = |
| *(pbData + (ucQp * 32) + 30) = |
| *(pbData + (ucQp * 32) + 31) = pParams->pAvcQCParams->FTQSkipThresholdLUT[ucQp]; |
| } |
| } |
| } |
| |
| pbData += m_brcConstantSurfacModeMvCostSize; |
| |
| // Fill surface with Refcost |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| m_brcConstantSurfaceRefCostSize, |
| (void*)&RefCost_MultiRefQp[ucTableIdx][0], |
| m_brcConstantSurfaceRefCostSize); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| pbData += m_brcConstantSurfaceRefCostSize; |
| |
| //Fill surface with Intra cost scaling Factor |
| if (pParams->bAdaptiveIntraScalingEnable) |
| { |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_INTRACOST_SCALING_FACTOR_G9, |
| (void*)&AdaptiveIntraScalingFactor_Cm_Common[0], |
| CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_INTRACOST_SCALING_FACTOR_G9); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| } |
| else |
| { |
| eStatus = MOS_SecureMemcpy( |
| pbData, |
| CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_INTRACOST_SCALING_FACTOR_G9, |
| (void*)&IntraScalingFactor_Cm_Common[0], |
| CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_INTRACOST_SCALING_FACTOR_G9); |
| if (eStatus != MOS_STATUS_SUCCESS) |
| { |
| CODECHAL_ENCODE_ASSERTMESSAGE("Failed to copy memory."); |
| return eStatus; |
| } |
| } |
| |
| pParams->pOsInterface->pfnUnlockResource( |
| pParams->pOsInterface, |
| &pParams->sBrcConstantDataBuffer.OsResource); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG9Skl::InitBrcConstantBuffer(PCODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS pParams) |
| { |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| if (bMultiRefQpEnabled) |
| { |
| return InitBrcConstantBufferMultiRefQP(pParams); |
| } |
| else |
| { |
| return CodechalEncodeAvcEnc::InitBrcConstantBuffer(pParams); |
| } |
| } |
| |
| CodechalEncodeAvcEncG9Skl::CodechalEncodeAvcEncG9Skl( |
| CodechalHwInterface * hwInterface, |
| CodechalDebugInterface *debugInterface, |
| PCODECHAL_STANDARD_INFO standardInfo): CodechalEncodeAvcEncG9(hwInterface, debugInterface, standardInfo) |
| { |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| m_cmKernelEnable = true; |
| bBrcSplitEnable = true; |
| bBrcRoiSupported = true; |
| bHighTextureModeCostEnable = true; |
| |
| this->pfnGetKernelHeaderAndSize = this->GetKernelHeaderAndSize; |
| |
| m_mbStatsSupported = true; //Starting from GEN9 |
| m_kernelBase = (uint8_t *)IGCODECKRN_G9; |
| AddIshSize(m_kuid, m_kernelBase); |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG9Skl::InitializeState() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncodeAvcEncG9::InitializeState()); |
| |
| m_brcHistoryBufferSize = CODECHAL_ENCODE_AVC_BRC_HISTORY_BUFFER_SIZE_G9; |
| dwBrcConstantSurfaceWidth = CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_WIDTH_G9; |
| dwBrcConstantSurfaceHeight = CODECHAL_ENCODE_AVC_BRC_CONSTANTSURFACE_HEIGHT_G9; |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG9Skl::InitKernelStateMbEnc() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| dwNumMbEncEncKrnStates = |
| MBENC_TARGET_USAGE_CM * MBENC_NUM_TARGET_USAGES_CM_G9_SKL; |
| dwNumMbEncEncKrnStates += MBENC_TARGET_USAGE_CM; |
| pMbEncKernelStates = |
| MOS_NewArray(MHW_KERNEL_STATE, dwNumMbEncEncKrnStates); |
| CODECHAL_ENCODE_CHK_NULL_RETURN(pMbEncKernelStates); |
| |
| PMHW_KERNEL_STATE pKernelStatePtr = pMbEncKernelStates; |
| CODECHAL_KERNEL_HEADER CurrKrnHeader; |
| |
| uint8_t* kernelBinary; |
| uint32_t kernelSize; |
| |
| MOS_STATUS status = CodecHalGetKernelBinaryAndSize(m_kernelBase, m_kuid, &kernelBinary, &kernelSize); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(status); |
| |
| for (uint32_t dwKrnStateIdx = 0; dwKrnStateIdx < dwNumMbEncEncKrnStates; dwKrnStateIdx++) |
| { |
| bool bKernelState = (dwKrnStateIdx >= MBENC_TARGET_USAGE_CM * MBENC_NUM_TARGET_USAGES_CM_G9_SKL); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GetKernelHeaderAndSize( |
| kernelBinary, |
| (bKernelState ? ENC_MBENC_ADV : ENC_MBENC), |
| (bKernelState ? dwKrnStateIdx - MBENC_TARGET_USAGE_CM * MBENC_NUM_TARGET_USAGES_CM_G9_SKL : dwKrnStateIdx), |
| (void*)&CurrKrnHeader, |
| &kernelSize)); |
| |
| pKernelStatePtr->KernelParams.iBTCount = CODECHAL_ENCODE_AVC_MBENC_NUM_SURFACES_G9; |
| pKernelStatePtr->KernelParams.iThreadCount = m_renderEngineInterface->GetHwCaps()->dwMaxThreads; |
| pKernelStatePtr->KernelParams.iCurbeLength = sizeof(CODECHAL_ENCODE_AVC_MBENC_CURBE_G9); |
| pKernelStatePtr->KernelParams.iBlockWidth = CODECHAL_MACROBLOCK_WIDTH; |
| pKernelStatePtr->KernelParams.iBlockHeight = CODECHAL_MACROBLOCK_HEIGHT; |
| pKernelStatePtr->KernelParams.iIdCount = 1; |
| |
| pKernelStatePtr->dwCurbeOffset = m_stateHeapInterface->pStateHeapInterface->GetSizeofCmdInterfaceDescriptorData(); |
| pKernelStatePtr->KernelParams.pBinary = kernelBinary + (CurrKrnHeader.KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT); |
| pKernelStatePtr->KernelParams.iSize = kernelSize; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnCalculateSshAndBtSizesRequested( |
| m_stateHeapInterface, |
| pKernelStatePtr->KernelParams.iBTCount, |
| &pKernelStatePtr->dwSshSize, |
| &pKernelStatePtr->dwBindingTableSize)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->MhwInitISH(m_stateHeapInterface, pKernelStatePtr)); |
| |
| pKernelStatePtr++; |
| } |
| |
| // Until a better way can be found, maintain old binding table structures |
| auto pBindingTable = &MbEncBindingTable; |
| |
| pBindingTable->dwAvcMBEncMfcAvcPakObj = CODECHAL_ENCODE_AVC_MBENC_MFC_AVC_PAK_OBJ_G9; |
| pBindingTable->dwAvcMBEncIndMVData = CODECHAL_ENCODE_AVC_MBENC_IND_MV_DATA_G9; |
| pBindingTable->dwAvcMBEncBRCDist = CODECHAL_ENCODE_AVC_MBENC_BRC_DISTORTION_G9; |
| pBindingTable->dwAvcMBEncCurrY = CODECHAL_ENCODE_AVC_MBENC_CURR_Y_G9; |
| pBindingTable->dwAvcMBEncCurrUV = CODECHAL_ENCODE_AVC_MBENC_CURR_UV_G9; |
| pBindingTable->dwAvcMBEncMbSpecificData = CODECHAL_ENCODE_AVC_MBENC_MB_SPECIFIC_DATA_G9; |
| |
| pBindingTable->dwAvcMBEncRefPicSelectL0 = CODECHAL_ENCODE_AVC_MBENC_REFPICSELECT_L0_G9; |
| pBindingTable->dwAvcMBEncMVDataFromME = CODECHAL_ENCODE_AVC_MBENC_MV_DATA_FROM_ME_G9; |
| pBindingTable->dwAvcMBEncMEDist = CODECHAL_ENCODE_AVC_MBENC_4xME_DISTORTION_G9; |
| pBindingTable->dwAvcMBEncSliceMapData = CODECHAL_ENCODE_AVC_MBENC_SLICEMAP_DATA_G9; |
| pBindingTable->dwAvcMBEncBwdRefMBData = CODECHAL_ENCODE_AVC_MBENC_FWD_MB_DATA_G9; |
| pBindingTable->dwAvcMBEncBwdRefMVData = CODECHAL_ENCODE_AVC_MBENC_FWD_MV_DATA_G9; |
| pBindingTable->dwAvcMBEncMbBrcConstData = CODECHAL_ENCODE_AVC_MBENC_MBBRC_CONST_DATA_G9; |
| pBindingTable->dwAvcMBEncMBStats = CODECHAL_ENCODE_AVC_MBENC_MB_STATS_G9; |
| pBindingTable->dwAvcMBEncMADData = CODECHAL_ENCODE_AVC_MBENC_MAD_DATA_G9; |
| pBindingTable->dwAvcMBEncMbNonSkipMap = CODECHAL_ENCODE_AVC_MBENC_FORCE_NONSKIP_MB_MAP_G9; |
| pBindingTable->dwAvcMBEncAdv = CODECHAL_ENCODE_AVC_MBENC_ADV_WA_G9; |
| pBindingTable->dwAvcMbEncBRCCurbeData = CODECHAL_ENCODE_AVC_MBENC_BRC_CURBE_DATA_G9; |
| pBindingTable->dwAvcMBEncFlatnessChk = CODECHAL_ENCODE_AVC_MBENC_FLATNESS_CHECK_CM_G9; |
| pBindingTable->dwAvcMBEncStaticDetectionCostTable = CODECHAL_ENCODE_AVC_MBENC_SFD_COST_TABLE_G9; |
| |
| // Frame |
| pBindingTable->dwAvcMBEncMbQpFrame = CODECHAL_ENCODE_AVC_MBENC_MBQP_G9; |
| pBindingTable->dwAvcMBEncCurrPicFrame[0] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_CURR_PIC_IDX_0_G9; |
| pBindingTable->dwAvcMBEncFwdPicFrame[0] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX0_G9; |
| pBindingTable->dwAvcMBEncBwdPicFrame[0] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX0_0_G9; |
| pBindingTable->dwAvcMBEncFwdPicFrame[1] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX1_G9; |
| pBindingTable->dwAvcMBEncBwdPicFrame[1] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX1_0_G9; |
| pBindingTable->dwAvcMBEncFwdPicFrame[2] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX2_G9; |
| pBindingTable->dwAvcMBEncFwdPicFrame[3] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX3_G9; |
| pBindingTable->dwAvcMBEncFwdPicFrame[4] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX4_G9; |
| pBindingTable->dwAvcMBEncFwdPicFrame[5] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX5_G9; |
| pBindingTable->dwAvcMBEncFwdPicFrame[6] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX6_G9; |
| pBindingTable->dwAvcMBEncFwdPicFrame[7] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX7_G9; |
| pBindingTable->dwAvcMBEncCurrPicFrame[1] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_CURR_PIC_IDX_1_G9; |
| pBindingTable->dwAvcMBEncBwdPicFrame[2] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX0_1_G9; |
| pBindingTable->dwAvcMBEncBwdPicFrame[3] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX1_1_G9; |
| |
| // Field |
| pBindingTable->dwAvcMBEncMbQpField = CODECHAL_ENCODE_AVC_MBENC_MBQP_G9; |
| pBindingTable->dwAvcMBEncFieldCurrPic[0] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_CURR_PIC_IDX_0_G9; |
| pBindingTable->dwAvcMBEncFwdPicTopField[0] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX0_G9; |
| pBindingTable->dwAvcMBEncBwdPicTopField[0] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX0_0_G9; |
| pBindingTable->dwAvcMBEncFwdPicBotField[0] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX0_G9; |
| pBindingTable->dwAvcMBEncBwdPicBotField[0] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX0_0_G9; |
| pBindingTable->dwAvcMBEncFwdPicTopField[1] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX1_G9; |
| pBindingTable->dwAvcMBEncBwdPicTopField[1] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX1_0_G9; |
| pBindingTable->dwAvcMBEncFwdPicBotField[1] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX1_G9; |
| pBindingTable->dwAvcMBEncBwdPicBotField[1] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX1_0_G9; |
| pBindingTable->dwAvcMBEncFwdPicTopField[2] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX2_G9; |
| pBindingTable->dwAvcMBEncFwdPicBotField[2] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX2_G9; |
| pBindingTable->dwAvcMBEncFwdPicTopField[3] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX3_G9; |
| pBindingTable->dwAvcMBEncFwdPicBotField[3] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX3_G9; |
| pBindingTable->dwAvcMBEncFwdPicTopField[4] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX4_G9; |
| pBindingTable->dwAvcMBEncFwdPicBotField[4] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX4_G9; |
| pBindingTable->dwAvcMBEncFwdPicTopField[5] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX5_G9; |
| pBindingTable->dwAvcMBEncFwdPicBotField[5] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX5_G9; |
| pBindingTable->dwAvcMBEncFwdPicTopField[6] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX6_G9; |
| pBindingTable->dwAvcMBEncFwdPicBotField[6] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX6_G9; |
| pBindingTable->dwAvcMBEncFwdPicTopField[7] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX7_G9; |
| pBindingTable->dwAvcMBEncFwdPicBotField[7] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_FWD_PIC_IDX7_G9; |
| pBindingTable->dwAvcMBEncFieldCurrPic[1] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_CURR_PIC_IDX_1_G9; |
| pBindingTable->dwAvcMBEncBwdPicTopField[2] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX0_1_G9; |
| pBindingTable->dwAvcMBEncBwdPicBotField[2] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX0_1_G9; |
| pBindingTable->dwAvcMBEncBwdPicTopField[3] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX1_1_G9; |
| pBindingTable->dwAvcMBEncBwdPicBotField[3] = CODECHAL_ENCODE_AVC_MBENC_VME_INTER_PRED_BWD_PIC_IDX1_1_G9; |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG9Skl::InitKernelStateMfeMbEnc() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| CODECHAL_KERNEL_HEADER CurrKrnHeader; |
| auto pKernelStatePtr = &mfeMbEncKernelState; |
| |
| uint8_t* kernelBinary; |
| uint32_t kernelSize; |
| |
| MOS_STATUS status = CodecHalGetKernelBinaryAndSize(m_kernelBase, m_kuid, &kernelBinary, &kernelSize); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(status); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GetKernelHeaderAndSize( |
| kernelBinary, |
| ENC_MBENC, |
| CODECHAL_ENCODE_AVC_MFE_MBENC_KERNEL_IDX, |
| (void*)&CurrKrnHeader, |
| &kernelSize)); |
| |
| pKernelStatePtr->KernelParams.iBTCount = CODECHAL_ENCODE_AVC_MBENC_NUM_SURFACES_G9 * CODECHAL_ENCODE_AVC_MFE_MAX_FRAMES_G9; |
| pKernelStatePtr->KernelParams.iCurbeLength = sizeof(CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_G9); |
| pKernelStatePtr->KernelParams.iThreadCount = m_renderEngineInterface->GetHwCaps()->dwMaxThreads; |
| pKernelStatePtr->KernelParams.iBlockWidth = CODECHAL_MACROBLOCK_WIDTH; |
| pKernelStatePtr->KernelParams.iBlockHeight = CODECHAL_MACROBLOCK_HEIGHT; |
| pKernelStatePtr->KernelParams.iIdCount = 1; |
| |
| pKernelStatePtr->dwCurbeOffset = m_stateHeapInterface->pStateHeapInterface->GetSizeofCmdInterfaceDescriptorData(); |
| pKernelStatePtr->KernelParams.pBinary = kernelBinary + (CurrKrnHeader.KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT); |
| pKernelStatePtr->KernelParams.iSize = kernelSize; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnCalculateSshAndBtSizesRequested( |
| m_stateHeapInterface, |
| pKernelStatePtr->KernelParams.iBTCount, |
| &pKernelStatePtr->dwSshSize, |
| &pKernelStatePtr->dwBindingTableSize)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->MhwInitISH(m_stateHeapInterface, pKernelStatePtr)); |
| |
| return eStatus; |
| } |
| |
| MOS_STATUS CodechalEncodeAvcEncG9Skl::InitKernelStateBrc() |
| { |
| MOS_STATUS eStatus = MOS_STATUS_SUCCESS; |
| |
| CODECHAL_ENCODE_FUNCTION_ENTER; |
| |
| uint8_t* kernelBinary; |
| uint32_t kernelSize; |
| |
| MOS_STATUS status = CodecHalGetKernelBinaryAndSize(m_kernelBase, m_kuid, &kernelBinary, &kernelSize); |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(status); |
| |
| CODECHAL_KERNEL_HEADER CurrKrnHeader; |
| for (uint32_t dwKrnStateIdx = 0; dwKrnStateIdx < CODECHAL_ENCODE_BRC_IDX_NUM; dwKrnStateIdx++) |
| { |
| auto pKernelStatePtr = &BrcKernelStates[dwKrnStateIdx]; |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(GetKernelHeaderAndSize( |
| kernelBinary, |
| ENC_BRC, |
| dwKrnStateIdx, |
| (void*)&CurrKrnHeader, |
| &kernelSize)); |
| |
| pKernelStatePtr->KernelParams.iBTCount = BRC_BTCOUNTS[dwKrnStateIdx]; |
| pKernelStatePtr->KernelParams.iThreadCount = m_renderEngineInterface->GetHwCaps()->dwMaxThreads; |
| pKernelStatePtr->KernelParams.iCurbeLength = BRC_CURBE_SIZE[dwKrnStateIdx]; |
| pKernelStatePtr->KernelParams.iBlockWidth = CODECHAL_MACROBLOCK_WIDTH; |
| pKernelStatePtr->KernelParams.iBlockHeight = CODECHAL_MACROBLOCK_HEIGHT; |
| pKernelStatePtr->KernelParams.iIdCount = 1; |
| |
| pKernelStatePtr->dwCurbeOffset = m_stateHeapInterface->pStateHeapInterface->GetSizeofCmdInterfaceDescriptorData(); |
| pKernelStatePtr->KernelParams.pBinary = kernelBinary + (CurrKrnHeader.KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT); |
| pKernelStatePtr->KernelParams.iSize = kernelSize; |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnCalculateSshAndBtSizesRequested( |
| m_stateHeapInterface, |
| pKernelStatePtr->KernelParams.iBTCount, |
| &pKernelStatePtr->dwSshSize, |
| &pKernelStatePtr->dwBindingTableSize)); |
| |
| CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->MhwInitISH(m_stateHeapInterface, pKernelStatePtr)); |
| } |
| |
| // Until a better way can be found, maintain old binding table structures |
| auto pBindingTable = &BrcUpdateBindingTable; |
| pBindingTable->dwFrameBrcHistoryBuffer = CODECHAL_ENCODE_AVC_FRAME_BRC_UPDATE_HISTORY_G9; |
| pBindingTable->dwFrameBrcPakStatisticsOutputBuffer = CODECHAL_ENCODE_AVC_FRAME_BRC_UPDATE_PAK_STATISTICS_OUTPUT_G9; |
| pBindingTable->dwFrameBrcImageStateReadBuffer = CODECHAL_ENCODE_AVC_FRAME_BRC_UPDATE_IMAGE_STATE_READ_G9; |
| pBindingTable->dwFrameBrcImageStateWriteBuffer = CODECHAL_ENCODE_AVC_FRAME_BRC_UPDATE_IMAGE_STATE_WRITE_G9; |
| pBindingTable->dwFrameBrcMbEncCurbeReadBuffer = CODECHAL_ENCODE_AVC_FRAME_BRC_UPDATE_MBENC_CURBE_READ_G9; |
| pBindingTable->dwFrameBrcMbEncCurbeWriteData = CODECHAL_ENCODE_AVC_FRAME_BRC_UPDATE_MBENC_CURBE_WRITE_G9; |
| pBindingTable->dwFrameBrcDistortionBuffer = CODECHAL_ENCODE_AVC_FRAME_BRC_UPDATE_DISTORTION_G9; |
| pBindingTable->dwFrameBrcConstantData = CODECHAL_ENCODE_AVC_FRAME_BRC_UPDATE_CONSTANT_DATA_G9; |
| pBindingTable->dwFrameBrcMbStatBuffer = CODECHAL_ENCODE_AVC_FRAME_BRC_UPDATE_MB_STAT_G9; |
| // starting GEN9 BRC kernel has split into a frame level update, and an MB level update. |
| // above is BTI for frame level, below is BTI for MB level |
| pBindingTable->dwMbBrcHistoryBuffer = CODECHAL_ENCODE_AVC_MB_BRC_UPDATE_HISTORY_G9; |
| pBindingTable->dwMbBrcMbQpBuffer = CODECHAL_ENCODE_AVC_MB_BRC_UPDATE_MB_QP_G9; |
| pBindingTable->dwMbBrcROISurface = CODECHAL_ENCODE_AVC_MB_BRC_UPDATE_ROI_G9; |
| pBindingTable->dwMbBrcMbStatBuffer = CODECHAL_ENCODE_AVC_MB_BRC_UPDATE_MB_STAT_G9; |
| |
| return eStatus; |
| } |
| |
| void CodechalEncodeAvcEncG9Skl::UpdateSSDSliceCount() |
| { |
| CodechalEncodeAvcBase::UpdateSSDSliceCount(); |
| |
| uint32_t sliceCount; |
| |
| // Adjust DymanicSliceShutdown policy for multi-frame encode cases |
| if (m_mfeEnabled && m_mfeEncodeParams.submitNumber > 1) |
| { |
| if (m_frameHeight * m_frameWidth >= 1920*1080 && m_targetUsage <= 4) |
| { |
| sliceCount = 3; |
| } |
| else if ((m_frameHeight * m_frameWidth >= 3840*2160) || |
| (m_frameHeight * m_frameWidth >= 1920*1080 && m_targetUsage > 4) || |
| (m_frameHeight * m_frameWidth >= 1280*720 && m_targetUsage <= 4)) |
| { |
| sliceCount = 2; |
| } |
| else |
| { |
| sliceCount = 1; |
| } |
| } |
| else |
| { |
| if ((m_frameHeight * m_frameWidth >= 1920*1080 && m_targetUsage <= 4) || |
| (m_frameHeight * m_frameWidth >= 1280*720 && m_targetUsage <= 2) || |
| (m_frameHeight * m_frameWidth >= 3840*2160)) |
| { |
| sliceCount = 2; |
| } |
| else |
| { |
| sliceCount = 1; |
| } |
| } |
| |
| if (m_osInterface->pfnSetSliceCount) |
| { |
| m_osInterface->pfnSetSliceCount(m_osInterface, &sliceCount); |
| } |
| } |
| |
| #if USE_CODECHAL_DEBUG_TOOL |
| MOS_STATUS CodechalEncodeAvcEncG9Skl::PopulatePakParam( |
| PMOS_COMMAND_BUFFER cmdBuffer, |
| PMHW_BATCH_BUFFER secondLevelBatchBuffer) |
| { |
| CODECHAL_DEBUG_FUNCTION_ENTER; |
| |
| CODECHAL_DEBUG_CHK_NULL(m_debugInterface); |
| |
| if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrDumpEncodePar)) |
| { |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| uint8_t *data = nullptr; |
| MOS_LOCK_PARAMS lockFlags; |
| MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS)); |
| lockFlags.ReadOnly = 1; |
| |
| if (cmdBuffer != nullptr) |
| { |
| data = (uint8_t*)(cmdBuffer->pCmdPtr - (mhw_vdbox_mfx_g9_skl::MFX_AVC_IMG_STATE_CMD::byteSize / sizeof(uint32_t))); |
| } |
| else if (secondLevelBatchBuffer != nullptr) |
| { |
| data = secondLevelBatchBuffer->pData; |
| } |
| else |
| { |
| data = (uint8_t*)m_osInterface->pfnLockResource(m_osInterface, &BrcBuffers.resBrcImageStatesReadBuffer[m_currRecycledBufIdx], &lockFlags); |
| } |
| |
| CODECHAL_DEBUG_CHK_NULL(data); |
| |
| mhw_vdbox_mfx_g9_skl::MFX_AVC_IMG_STATE_CMD mfxCmd; |
| mfxCmd = *(mhw_vdbox_mfx_g9_skl::MFX_AVC_IMG_STATE_CMD *)(data); |
| |
| if (m_pictureCodingType == I_TYPE) |
| { |
| m_avcPar->TrellisQuantizationEnable = mfxCmd.DW5.TrellisQuantizationEnabledTqenb; |
| m_avcPar->EnableAdaptiveTrellisQuantization = mfxCmd.DW5.TrellisQuantizationEnabledTqenb; |
| m_avcPar->TrellisQuantizationRounding = mfxCmd.DW5.TrellisQuantizationRoundingTqr; |
| m_avcPar->TrellisQuantizationChromaDisable = mfxCmd.DW5.TrellisQuantizationChromaDisableTqchromadisable; |
| m_avcPar->ExtendedRhoDomainEn = mfxCmd.DW16_17.ExtendedRhodomainStatisticsEnable; |
| } |
| |
| if (data && (cmdBuffer == nullptr) && (secondLevelBatchBuffer == nullptr)) |
| { |
| m_osInterface->pfnUnlockResource( |
| m_osInterface, |
| &BrcBuffers.resBrcImageStatesReadBuffer[m_currRecycledBufIdx]); |
| } |
| |
| return MOS_STATUS_SUCCESS; |
| } |
| #endif |