blob: 673b6f33d3249788f1b73e09aa8747d559f107a6 [file] [log] [blame]
/*
* 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_mpeg2_g10.cpp
//! \brief MPEG2 dual-pipe encoder for GEN10.
//!
#include "codechal_encode_mpeg2_g10.h"
#ifndef _FULL_OPEN_SOURCE
#include "igcodeckrn_g10.h"
#endif
struct KernelHeader
{
uint32_t m_kernelCount;
// MBEnc Norm/Perf/Quality moes for frame
CODECHAL_KERNEL_HEADER m_mpeg2MbEncI;
CODECHAL_KERNEL_HEADER m_mpeg2MbEncP;
CODECHAL_KERNEL_HEADER m_mpeg2MbEncB;
// ME Downscale
CODECHAL_KERNEL_HEADER m_plyDscalePly;
// AVC_ME kernels for distortion
CODECHAL_KERNEL_HEADER m_mpeg2AvcMeP;
CODECHAL_KERNEL_HEADER m_mpeg2AvcMeB;
CODECHAL_KERNEL_HEADER m_mpeg2InitFrameBrc;
CODECHAL_KERNEL_HEADER m_mpeg2FrameEncUpdate;
CODECHAL_KERNEL_HEADER m_mpeg2BrcResetFrame;
// BRCBlockCopy
CODECHAL_KERNEL_HEADER m_mpeg2BrcBlockCopy;
};
enum BindingTableOffsetMeG10
{
meMvDataSurface = 0,
meDistortionSurface = 2,
meBrcDistortion = 3,
meCurrForFwdRef = 5,
meFwdRefIdx0 = 6,
meCurrForBwdRef = 22,
meBwdRefIdx0 = 23,
meNumSurface = 27,
};
enum BindingTableOffsetMbEncG10
{
mbEncPakObj = 0,
mbEncPakObjPrev = 1,
mbEncCurrentY = 3,
mbEncBrcDistortionSurface = 8,
mbEncCurrentPic = 9,
mbEncForwardPic = 10,
mbEncBackwardPic = 11,
mbEncInterlaceFrameCurrentPic = 14,
mbEncInterlaceFrameBackwardPic = 15,
mbEncMbControl = 18,
mbEncNumBindingTableEntries = 19
};
class MeCurbe
{
public:
struct CurbeData
{
// DW0
union
{
struct
{
uint32_t m_skipModeEn : MOS_BITFIELD_BIT(0);
uint32_t m_adaptiveEn : MOS_BITFIELD_BIT(1);
uint32_t m_biMixDis : MOS_BITFIELD_BIT(2);
uint32_t m_reserved3 : MOS_BITFIELD_RANGE(3, 4);
uint32_t m_earlyImeSuccessEn : MOS_BITFIELD_BIT(5);
uint32_t m_reserved6 : MOS_BITFIELD_BIT(6);
uint32_t m_t8x8FlagForInterEn : MOS_BITFIELD_BIT(7);
uint32_t m_reserved8 : MOS_BITFIELD_RANGE(8, 23);
uint32_t m_earlyImeStop : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t m_value;
};
} DW0;
// DW1
union
{
struct
{
uint32_t m_maxNumMVs : MOS_BITFIELD_RANGE(0, 5);
uint32_t m_reserved6 : MOS_BITFIELD_RANGE(6, 15);
uint32_t m_biWeight : MOS_BITFIELD_RANGE(16, 21);
uint32_t m_reserved22 : MOS_BITFIELD_RANGE(22, 27);
uint32_t m_uniMixDisable : MOS_BITFIELD_BIT(28);
uint32_t m_reserved29 : MOS_BITFIELD_RANGE(29, 31);
};
struct
{
uint32_t m_value;
};
} DW1;
// DW2
union
{
struct
{
uint32_t m_maxLenSP : MOS_BITFIELD_RANGE(0, 7);
uint32_t m_maxNumSU : MOS_BITFIELD_RANGE(8, 15);
uint32_t m_reserved16 : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t m_value;
};
} DW2;
// DW3
union
{
struct
{
uint32_t m_srcSize : MOS_BITFIELD_RANGE(0, 1);
uint32_t m_reserved2 : MOS_BITFIELD_RANGE(2, 3);
uint32_t m_mbTypeRemap : MOS_BITFIELD_RANGE(4, 5);
uint32_t m_srcAccess : MOS_BITFIELD_BIT(6);
uint32_t m_refAccess : MOS_BITFIELD_BIT(7);
uint32_t m_searchCtrl : MOS_BITFIELD_RANGE(8, 10);
uint32_t m_dualSearchPathOption : MOS_BITFIELD_BIT(11);
uint32_t m_subPelMode : MOS_BITFIELD_RANGE(12, 13);
uint32_t m_skipType : MOS_BITFIELD_BIT(14);
uint32_t m_disableFieldCacheAlloc : MOS_BITFIELD_BIT(15);
uint32_t m_interChromaMode : MOS_BITFIELD_BIT(16);
uint32_t m_ftEnable : MOS_BITFIELD_BIT(17);
uint32_t m_bmeDisableFBR : MOS_BITFIELD_BIT(18);
uint32_t m_blockBasedSkipEnable : MOS_BITFIELD_BIT(19);
uint32_t m_interSAD : MOS_BITFIELD_RANGE(20, 21);
uint32_t m_intraSAD : MOS_BITFIELD_RANGE(22, 23);
uint32_t m_subMbPartMask : MOS_BITFIELD_RANGE(24, 30);
uint32_t m_reserved31 : MOS_BITFIELD_BIT(31);
};
struct
{
uint32_t m_value;
};
} DW3;
// DW4
union
{
struct
{
uint32_t m_reserved0 : MOS_BITFIELD_RANGE(0, 7);
uint32_t m_pictureHeightMinus1 : MOS_BITFIELD_RANGE(8, 15);
uint32_t m_pictureWidth : MOS_BITFIELD_RANGE(16, 23);
uint32_t m_reserved24 : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t m_value;
};
} DW4;
// DW5
union
{
struct
{
uint32_t m_reserved0 : MOS_BITFIELD_RANGE(0, 7);
uint32_t m_qpPrimeY : MOS_BITFIELD_RANGE(8, 15);
uint32_t m_refWidth : MOS_BITFIELD_RANGE(16, 23);
uint32_t m_refHeight : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t m_value;
};
} DW5;
// DW6
union
{
struct
{
uint32_t m_reserved0 : MOS_BITFIELD_RANGE(0, 2);
uint32_t m_writeDistortions : MOS_BITFIELD_BIT(3);
uint32_t m_useMvFromPrevStep : MOS_BITFIELD_BIT(4);
uint32_t m_reserved5 : MOS_BITFIELD_RANGE(5, 7);
uint32_t m_superCombineDist : MOS_BITFIELD_RANGE(8, 15);
uint32_t m_maxVmvR : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t m_value;
};
} DW6;
// DW7
union
{
struct
{
uint32_t m_reserved0 : MOS_BITFIELD_RANGE(0, 15);
uint32_t m_mvCostScaleFactor : MOS_BITFIELD_RANGE(16, 17);
uint32_t m_bilinearEnable : MOS_BITFIELD_BIT(18);
uint32_t m_srcFieldPolarity : MOS_BITFIELD_BIT(19);
uint32_t m_weightedSADHAAR : MOS_BITFIELD_BIT(20);
uint32_t m_acOnlyHAAR : MOS_BITFIELD_BIT(21);
uint32_t m_refIDCostMode : MOS_BITFIELD_BIT(22);
uint32_t m_reserved23 : MOS_BITFIELD_BIT(23);
uint32_t m_skipCenterMask : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t m_value;
};
} DW7;
// DW8
union
{
struct
{
uint32_t m_mode0Cost : MOS_BITFIELD_RANGE(0, 7);
uint32_t m_mode1Cost : MOS_BITFIELD_RANGE(8, 15);
uint32_t m_mode2Cost : MOS_BITFIELD_RANGE(16, 23);
uint32_t m_mode3Cost : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t m_value;
};
} DW8;
// DW9
union
{
struct
{
uint32_t m_mode4Cost : MOS_BITFIELD_RANGE(0, 7);
uint32_t m_mode5Cost : MOS_BITFIELD_RANGE(8, 15);
uint32_t m_mode6Cost : MOS_BITFIELD_RANGE(16, 23);
uint32_t m_mode7Cost : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t m_value;
};
} DW9;
// DW10
union
{
struct
{
uint32_t m_mode8Cost : MOS_BITFIELD_RANGE(0, 7);
uint32_t m_mode9Cost : MOS_BITFIELD_RANGE(8, 15);
uint32_t m_refIDCost : MOS_BITFIELD_RANGE(16, 23);
uint32_t m_chromaIntraModeCost : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t m_value;
};
} DW10;
// DW11
union
{
struct
{
uint32_t m_mv0Cost : MOS_BITFIELD_RANGE(0, 7);
uint32_t m_mv1Cost : MOS_BITFIELD_RANGE(8, 15);
uint32_t m_mv2Cost : MOS_BITFIELD_RANGE(16, 23);
uint32_t m_mv3Cost : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t m_value;
};
} DW11;
// DW12
union
{
struct
{
uint32_t m_mv4Cost : MOS_BITFIELD_RANGE(0, 7);
uint32_t m_mv5Cost : MOS_BITFIELD_RANGE(8, 15);
uint32_t m_mv6Cost : MOS_BITFIELD_RANGE(16, 23);
uint32_t m_mv7Cost : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t m_value;
};
} DW12;
// DW13
union
{
struct
{
uint32_t m_numRefIdxL0MinusOne : MOS_BITFIELD_RANGE(0, 7);
uint32_t m_numRefIdxL1MinusOne : MOS_BITFIELD_RANGE(8, 15);
uint32_t m_actualMBWidth : MOS_BITFIELD_RANGE(16, 23);
uint32_t m_actualMBHeight : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t m_value;
};
} DW13;
// DW14
union
{
struct
{
uint32_t m_list0RefID0FieldParity : MOS_BITFIELD_BIT(0);
uint32_t m_list0RefID1FieldParity : MOS_BITFIELD_BIT(1);
uint32_t m_list0RefID2FieldParity : MOS_BITFIELD_BIT(2);
uint32_t m_list0RefID3FieldParity : MOS_BITFIELD_BIT(3);
uint32_t m_list0RefID4FieldParity : MOS_BITFIELD_BIT(4);
uint32_t m_list0RefID5FieldParity : MOS_BITFIELD_BIT(5);
uint32_t m_list0RefID6FieldParity : MOS_BITFIELD_BIT(6);
uint32_t m_list0RefID7FieldParity : MOS_BITFIELD_BIT(7);
uint32_t m_list1RefID0FieldParity : MOS_BITFIELD_BIT(8);
uint32_t m_list1RefID1FieldParity : MOS_BITFIELD_BIT(9);
uint32_t m_reserved10 : MOS_BITFIELD_RANGE(10, 31);
};
struct
{
uint32_t m_value;
};
} DW14;
// DW15
union
{
struct
{
uint32_t m_prevMvReadPosFactor : MOS_BITFIELD_RANGE(0, 7);
uint32_t m_mvShiftFactor : MOS_BITFIELD_RANGE(8, 15);
uint32_t m_reserved16 : MOS_BITFIELD_RANGE(16, 31);
};
struct
{
uint32_t m_value;
};
} DW15;
struct
{
// DW16
union
{
struct
{
SearchPathDelta m_spDelta_0;
SearchPathDelta m_spDelta_1;
SearchPathDelta m_spDelta_2;
SearchPathDelta m_spDelta_3;
};
struct
{
uint32_t m_value;
};
} DW16;
// DW17
union
{
struct
{
SearchPathDelta m_spDelta_4;
SearchPathDelta m_spDelta_5;
SearchPathDelta m_spDelta_6;
SearchPathDelta m_spDelta_7;
};
struct
{
uint32_t m_value;
};
} DW17;
// DW18
union
{
struct
{
SearchPathDelta m_spDelta_8;
SearchPathDelta m_spDelta_9;
SearchPathDelta m_spDelta_10;
SearchPathDelta m_spDelta_11;
};
struct
{
uint32_t m_value;
};
} DW18;
// DW19
union
{
struct
{
SearchPathDelta m_spDelta_12;
SearchPathDelta m_spDelta_13;
SearchPathDelta m_spDelta_14;
SearchPathDelta m_spDelta_15;
};
struct
{
uint32_t m_value;
};
} DW19;
// DW20
union
{
struct
{
SearchPathDelta m_spDelta_16;
SearchPathDelta m_spDelta_17;
SearchPathDelta m_spDelta_18;
SearchPathDelta m_spDelta_19;
};
struct
{
uint32_t m_value;
};
} DW20;
// DW21
union
{
struct
{
SearchPathDelta m_spDelta_20;
SearchPathDelta m_spDelta_21;
SearchPathDelta m_spDelta_22;
SearchPathDelta m_spDelta_23;
};
struct
{
uint32_t m_value;
};
} DW21;
// DW22
union
{
struct
{
SearchPathDelta m_spDelta_24;
SearchPathDelta m_spDelta_25;
SearchPathDelta m_spDelta_26;
SearchPathDelta m_spDelta_27;
};
struct
{
uint32_t m_value;
};
} DW22;
// DW23
union
{
struct
{
SearchPathDelta m_spDelta_28;
SearchPathDelta m_spDelta_29;
SearchPathDelta m_spDelta_30;
SearchPathDelta m_spDelta_31;
};
struct
{
uint32_t m_value;
};
} DW23;
// DW24
union
{
struct
{
SearchPathDelta m_spDelta_32;
SearchPathDelta m_spDelta_33;
SearchPathDelta m_spDelta_34;
SearchPathDelta m_spDelta_35;
};
struct
{
uint32_t m_value;
};
} DW24;
// DW25
union
{
struct
{
SearchPathDelta m_spDelta_36;
SearchPathDelta m_spDelta_37;
SearchPathDelta m_spDelta_38;
SearchPathDelta m_spDelta_39;
};
struct
{
uint32_t m_value;
};
} DW25;
// DW26
union
{
struct
{
SearchPathDelta m_spDelta_40;
SearchPathDelta m_spDelta_41;
SearchPathDelta m_spDelta_42;
SearchPathDelta m_spDelta_43;
};
struct
{
uint32_t m_value;
};
} DW26;
// DW27
union
{
struct
{
SearchPathDelta m_spDelta_44;
SearchPathDelta m_spDelta_45;
SearchPathDelta m_spDelta_46;
SearchPathDelta m_spDelta_47;
};
struct
{
uint32_t m_value;
};
} DW27;
// DW28
union
{
struct
{
SearchPathDelta m_spDelta_48;
SearchPathDelta m_spDelta_49;
SearchPathDelta m_spDelta_50;
SearchPathDelta m_spDelta_51;
};
struct
{
uint32_t m_value;
};
} DW28;
// DW29
union
{
struct
{
SearchPathDelta m_spDelta_52;
SearchPathDelta m_spDelta_53;
SearchPathDelta m_spDelta_54;
SearchPathDelta m_spDelta_55;
};
struct
{
uint32_t m_value;
};
} DW29;
} SpDelta;
// DW30
union
{
struct
{
uint32_t m_reserved;
};
struct
{
uint32_t m_value;
};
} DW30;
// DW31
union
{
struct
{
uint32_t m_reserved;
};
struct
{
uint32_t m_value;
};
} DW31;
// DW32
union
{
struct
{
uint32_t m_4xMeMvOutputDataSurfIndex;
};
struct
{
uint32_t m_value;
};
} DW32;
// DW33
union
{
struct
{
uint32_t m_16xMeMvInputDataSurfIndex;
};
struct
{
uint32_t m_value;
};
} DW33;
// DW34
union
{
struct
{
uint32_t m_4xMeOutputDistSurfIndex;
};
struct
{
uint32_t m_value;
};
} DW34;
// DW35
union
{
struct
{
uint32_t m_4xMeOutputBrcDistSurfIndex;
};
struct
{
uint32_t m_value;
};
} DW35;
// DW36
union
{
struct
{
uint32_t m_vmeFwdInterPredictionSurfIndex;
};
struct
{
uint32_t m_value;
};
} DW36;
// DW37
union
{
struct
{
uint32_t m_vmeBwdInterPredictionSurfIndex;
};
struct
{
uint32_t m_value;
};
} DW37;
// DW38
union
{
struct
{
uint32_t m_reserved;
};
struct
{
uint32_t m_value;
};
} DW38;
}m_curbeData;
//!
//! \brief Constructor
//!
MeCurbe();
//!
//! \brief Destructor
//!
~MeCurbe(){};
static const size_t m_byteSize = sizeof(CurbeData);
} ;
class MbEncCurbeG10
{
public:
struct CurbeData
{
union
{
struct
{
uint32_t m_skipModeEn : MOS_BITFIELD_BIT(0);
uint32_t m_adaptiveEn : MOS_BITFIELD_BIT(1);
uint32_t m_biMixDis : MOS_BITFIELD_BIT(2);
uint32_t m_isInterlacedFrameFlag : MOS_BITFIELD_BIT(3);
uint32_t m_isTopFieldFirst : MOS_BITFIELD_BIT(4);
uint32_t m_earlyImeSuccessEn : MOS_BITFIELD_BIT(5);
uint32_t m_forceToSkip : MOS_BITFIELD_BIT(6);
uint32_t m_t8x8FlagForInterEn : MOS_BITFIELD_BIT(7);
uint32_t m_refPixOff : MOS_BITFIELD_RANGE(8,15);
uint32_t m_reserved1 : MOS_BITFIELD_RANGE(16,23);
uint32_t m_earlyImeStop : MOS_BITFIELD_RANGE(24,31);
};
struct
{
uint32_t m_value;
};
} DW0;
union
{
struct
{
uint32_t m_maxNumMVs : MOS_BITFIELD_RANGE(0,5);
uint32_t m_reserved0 : MOS_BITFIELD_RANGE(6,7);
uint32_t m_refIDPolBits : MOS_BITFIELD_RANGE(8,15);
uint32_t m_biWeight : MOS_BITFIELD_RANGE(16,21);
uint32_t m_gxMask : MOS_BITFIELD_BIT(22);
uint32_t m_gyMask : MOS_BITFIELD_BIT(23);
uint32_t m_refPixShift : MOS_BITFIELD_RANGE(24,27);
uint32_t m_uniMixDisable : MOS_BITFIELD_BIT(28);
uint32_t m_refPixBiasEn : MOS_BITFIELD_BIT(29); // m_refPixBiasEn (MBZ)
uint32_t m_idmShapeModeExt7x7 : MOS_BITFIELD_BIT(30);
uint32_t m_idmShapeModeExt5x5 : MOS_BITFIELD_BIT(31);
};
struct
{
uint32_t m_value;
};
} DW1;
union
{
struct
{
uint32_t m_maxLenSP : MOS_BITFIELD_RANGE(0,7);
uint32_t m_maxNumSU : MOS_BITFIELD_RANGE(8,15);
uint32_t m_start0X : MOS_BITFIELD_RANGE(16,19);
uint32_t m_start0Y : MOS_BITFIELD_RANGE(20,23);
uint32_t m_start1X : MOS_BITFIELD_RANGE(24,27);
uint32_t m_start1Y : MOS_BITFIELD_RANGE(28,31);
};
struct
{
uint32_t m_value;
};
} DW2;
union
{
struct
{
uint32_t m_fieldBias : MOS_BITFIELD_RANGE(0,7);
uint32_t m_oppFieldBias : MOS_BITFIELD_RANGE(8,15);
uint32_t m_fieldSkipThr : MOS_BITFIELD_RANGE(16,31);
};
struct
{
uint32_t m_value;
};
} DW3;
union
{
struct
{
uint32_t m_reserved0 : MOS_BITFIELD_RANGE(0,7);
uint32_t m_picHeightMinus1 : MOS_BITFIELD_RANGE(8,15);
uint32_t m_picWidth : MOS_BITFIELD_RANGE(16,23);
uint32_t m_reserved24 : MOS_BITFIELD_BIT(24); // WalkerType
uint32_t m_motionSeeding : MOS_BITFIELD_BIT(25);
uint32_t m_kernelMBModeDecision : MOS_BITFIELD_BIT(26);
uint32_t m_iFrameMBDistortionDumpEnable : MOS_BITFIELD_BIT(27);
uint32_t m_fieldFlag : MOS_BITFIELD_BIT(28);
uint32_t m_pictureType : MOS_BITFIELD_RANGE(29,30);
uint32_t m_reserved1 : MOS_BITFIELD_BIT(31);
};
struct
{
uint32_t m_value;
};
} DW4;
struct
{
union
{
struct
{
uint32_t m_mv0Cost : MOS_BITFIELD_RANGE(0, 7);
uint32_t m_mv1Cost : MOS_BITFIELD_RANGE(8, 15);
uint32_t m_mv2Cost : MOS_BITFIELD_RANGE(16, 23);
uint32_t m_mv3Cost : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t m_value;
};
} DW5;
union
{
struct
{
uint32_t m_mv4Cost : MOS_BITFIELD_RANGE(0,7);
uint32_t m_mv5Cost : MOS_BITFIELD_RANGE(8,15);
uint32_t m_mv6Cost : MOS_BITFIELD_RANGE(16,23);
uint32_t m_mv7Cost : MOS_BITFIELD_RANGE(24,31);
};
struct
{
uint32_t m_value;
};
} DW6;
} MvCost;
union
{
struct
{
uint32_t m_intraPartMask : MOS_BITFIELD_RANGE(0,4);
uint32_t m_nonSkipZMvAdded : MOS_BITFIELD_BIT(5);
uint32_t m_nonSkipModeAdded : MOS_BITFIELD_BIT(6);
uint32_t m_reserved7 : MOS_BITFIELD_BIT(7);
uint32_t m_reserved8 : MOS_BITFIELD_RANGE(8,15);
uint32_t m_mvCostScaleFactor : MOS_BITFIELD_RANGE(16,17);
uint32_t m_bilinearEnable : MOS_BITFIELD_BIT(18);
uint32_t m_srcFieldPolarity : MOS_BITFIELD_BIT(19);
uint32_t m_weightedSADHAAR : MOS_BITFIELD_BIT(20);
uint32_t m_acOnlyHAAR : MOS_BITFIELD_BIT(21);
uint32_t m_refIDCostMode : MOS_BITFIELD_BIT(22);
uint32_t m_idmShapeMode : MOS_BITFIELD_BIT(23);
uint32_t m_skipCenterMask : MOS_BITFIELD_RANGE(24,31);
};
struct
{
uint32_t m_value;
};
} DW7;
union
{
struct
{
uint32_t m_mode8Cost : MOS_BITFIELD_RANGE(0,7);
uint32_t m_mode9Cost : MOS_BITFIELD_RANGE(8,15);
uint32_t m_refIDCost : MOS_BITFIELD_RANGE(16,23);
uint32_t m_chromaIntraModeCost : MOS_BITFIELD_RANGE(24,31);
};
struct
{
uint32_t m_value;
};
} DW8;
union
{
struct
{
uint32_t m_srcSize : MOS_BITFIELD_RANGE(0,1);
uint32_t m_mbQPEnable : MOS_BITFIELD_BIT(2);
uint32_t m_mbSkipEnable : MOS_BITFIELD_BIT(3);
uint32_t m_mbNonSkipEnable : MOS_BITFIELD_BIT(4);
uint32_t m_reserved5 : MOS_BITFIELD_BIT(5);
uint32_t m_srcAccess : MOS_BITFIELD_BIT(6);
uint32_t m_refAccess : MOS_BITFIELD_BIT(7);
uint32_t m_searchCtrl : MOS_BITFIELD_RANGE(8,10);
uint32_t m_dualSearchOpt : MOS_BITFIELD_BIT(11);
uint32_t m_subPelMode : MOS_BITFIELD_RANGE(12,13);
uint32_t m_skipType : MOS_BITFIELD_BIT(14);
uint32_t m_fieldCacheAllocationDis : MOS_BITFIELD_BIT(15);
uint32_t m_interChromaMode : MOS_BITFIELD_BIT(16);
uint32_t m_ftEnable : MOS_BITFIELD_BIT(17);
uint32_t m_bmeDisableFBR : MOS_BITFIELD_BIT(18);
uint32_t m_reserved19 : MOS_BITFIELD_BIT(19);
uint32_t m_interSAD : MOS_BITFIELD_RANGE(20,21);
uint32_t m_intraSAD : MOS_BITFIELD_RANGE(22,23);
uint32_t m_subMbPartMask : MOS_BITFIELD_RANGE(24,30);
uint32_t m_reserved31 : MOS_BITFIELD_BIT(31);
};
struct
{
uint32_t m_value;
};
} DW9;
union
{
struct
{
uint32_t m_dispatchID : MOS_BITFIELD_RANGE(0,7);
uint32_t m_largeMbSizeInWord : MOS_BITFIELD_RANGE(8,15);
uint32_t m_refWidth : MOS_BITFIELD_RANGE(16,23);
uint32_t m_refHeight : MOS_BITFIELD_RANGE(24,31);
};
struct
{
uint32_t m_value;
};
} DW10;
union
{
struct
{
uint32_t m_qpScaleCode : MOS_BITFIELD_RANGE(0,7);
uint32_t m_intraFactor : MOS_BITFIELD_RANGE(8,11);
uint32_t m_intraMulFact : MOS_BITFIELD_RANGE(12,15);
uint32_t m_intraBiasFF : MOS_BITFIELD_RANGE(16,23);
uint32_t m_intraBiasFrame : MOS_BITFIELD_RANGE(24,31);
};
struct
{
uint32_t m_value;
};
} DW11;
union
{
struct
{
uint32_t m_isFastMode : MOS_BITFIELD_RANGE(0,7);
uint32_t m_smallMbSizeInWord : MOS_BITFIELD_RANGE(8,15);
uint32_t m_distScaleFactor : MOS_BITFIELD_RANGE(16,31);
};
struct
{
uint32_t m_value;
};
} DW12;
union
{
struct
{
uint32_t m_panicModeMBThreshold : MOS_BITFIELD_RANGE(0,15);
uint32_t m_targetSizeInWord : MOS_BITFIELD_RANGE(16,23);
uint32_t m_reserved14 : MOS_BITFIELD_RANGE(24,31);
};
struct
{
uint32_t m_value;
};
} DW13;
union
{
struct
{
uint32_t m_forwardHorizontalSearchRange : MOS_BITFIELD_RANGE(0,15);
uint32_t m_forwardVerticalSearchRange : MOS_BITFIELD_RANGE(16,31);
};
struct
{
uint32_t m_value;
};
} DW14;
union
{
struct
{
uint32_t m_backwardHorizontalSearchRange : MOS_BITFIELD_RANGE(0,15);
uint32_t m_backwardVerticalSearchRange : MOS_BITFIELD_RANGE(16,31);
};
struct
{
uint32_t m_value;
};
} DW15;
struct
{
union
{
struct
{
uint32_t m_meDelta0to3;
};
struct
{
uint32_t m_value;
};
} DW16;
union
{
struct
{
uint32_t m_meDelta4to7;
};
struct
{
uint32_t m_value;
};
} DW17;
union
{
struct
{
uint32_t m_meDelta8to11;
};
struct
{
uint32_t m_value;
};
} DW18;
union
{
struct
{
uint32_t m_meDelta12to15;
};
struct
{
uint32_t m_value;
};
} DW19;
union
{
struct
{
uint32_t m_meDelta16to19;
};
struct
{
uint32_t m_value;
};
} DW20;
union
{
struct
{
uint32_t m_meDelta20to23;
};
struct
{
uint32_t m_value;
};
} DW21;
union
{
struct
{
uint32_t m_meDelta24to27;
};
struct
{
uint32_t m_value;
};
} DW22;
union
{
struct
{
uint32_t m_meDelta28to31;
};
struct
{
uint32_t m_value;
};
} DW23;
union
{
struct
{
uint32_t m_meDelta32to35;
};
struct
{
uint32_t m_value;
};
} DW24;
union
{
struct
{
uint32_t m_meDelta36to39;
};
struct
{
uint32_t m_value;
};
} DW25;
union
{
struct
{
uint32_t m_meDelta40to43;
};
struct
{
uint32_t m_value;
};
} DW26;
union
{
struct
{
uint32_t m_meDelta44to47;
};
struct
{
uint32_t m_value;
};
} DW27;
union
{
struct
{
uint32_t m_meDelta48to51;
};
struct
{
uint32_t m_value;
};
} DW28;
union
{
struct
{
uint32_t m_meDelta52to55;
};
struct
{
uint32_t m_value;
};
} DW29;
union
{
struct
{
uint32_t m_mode0Cost : MOS_BITFIELD_RANGE(0, 7);
uint32_t m_mode1Cost : MOS_BITFIELD_RANGE(8, 15);
uint32_t m_mode2Cost : MOS_BITFIELD_RANGE(16, 23);
uint32_t m_mode3Cost : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t m_value;
};
} DW30;
union
{
struct
{
uint32_t m_mode4Cost : MOS_BITFIELD_RANGE(0, 7);
uint32_t m_mode5Cost : MOS_BITFIELD_RANGE(8, 15);
uint32_t m_mode6Cost : MOS_BITFIELD_RANGE(16, 23);
uint32_t m_mode7Cost : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t m_value;
};
} DW31;
} VmeSPath0;
struct
{
union
{
struct
{
uint32_t m_meDelta0to3;
};
struct
{
uint32_t m_value;
};
} DW32;
union
{
struct
{
uint32_t m_meDelta4to7;
};
struct
{
uint32_t m_value;
};
} DW33;
union
{
struct
{
uint32_t m_meDelta8to11;
};
struct
{
uint32_t m_value;
};
} DW34;
union
{
struct
{
uint32_t m_meDelta12to15;
};
struct
{
uint32_t m_value;
};
} DW35;
union
{
struct
{
uint32_t m_meDelta16to19;
};
struct
{
uint32_t m_value;
};
} DW36;
union
{
struct
{
uint32_t m_meDelta20to23;
};
struct
{
uint32_t m_value;
};
} DW37;
union
{
struct
{
uint32_t m_meDelta24to27;
};
struct
{
uint32_t m_value;
};
} DW38;
union
{
struct
{
uint32_t m_meDelta28to31;
};
struct
{
uint32_t m_value;
};
} DW39;
union
{
struct
{
uint32_t m_meDelta32to35;
};
struct
{
uint32_t m_value;
};
} DW40;
union
{
struct
{
uint32_t m_meDelta36to39;
};
struct
{
uint32_t m_value;
};
} DW41;
union
{
struct
{
uint32_t m_meDelta40to43;
};
struct
{
uint32_t m_value;
};
} DW42;
union
{
struct
{
uint32_t m_meDelta44to47;
};
struct
{
uint32_t m_value;
};
} DW43;
union
{
struct
{
uint32_t m_meDelta48to51;
};
struct
{
uint32_t m_value;
};
} DW44;
union
{
struct
{
uint32_t m_meDelta52to55;
};
struct
{
uint32_t m_value;
};
} DW45;
struct
{
union
{
struct
{
uint32_t m_mv0Cost_Interlaced : MOS_BITFIELD_RANGE(0, 7);
uint32_t m_mv1Cost_Interlaced : MOS_BITFIELD_RANGE(8, 15);
uint32_t m_mv2Cost_Interlaced : MOS_BITFIELD_RANGE(16, 23);
uint32_t m_mv3Cost_Interlaced : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t m_value;
};
} DW46;
union
{
struct
{
uint32_t m_mv4Cost_Interlaced : MOS_BITFIELD_RANGE(0, 7);
uint32_t m_mv5Cost_Interlaced : MOS_BITFIELD_RANGE(8, 15);
uint32_t m_mv6Cost_Interlaced : MOS_BITFIELD_RANGE(16, 23);
uint32_t m_mv7Cost_Interlaced : MOS_BITFIELD_RANGE(24, 31);
};
struct
{
uint32_t m_value;
};
} DW47;
} MvCostInterlace;
} VmeSPath1;
union
{
struct
{
uint32_t m_batchBufferEnd;
};
struct
{
uint32_t m_value;
};
} DW48;
union
{
struct
{
uint32_t m_pakObjCmds;
};
struct
{
uint32_t m_value;
};
} DW49;
union
{
struct
{
uint32_t m_prevmPakObjCmds;
};
struct
{
uint32_t m_value;
};
} DW50;
union
{
struct
{
uint32_t m_currPicY;
};
struct
{
uint32_t m_value;
};
} DW51;
union
{
struct
{
uint32_t m_currFwdBwdRef;
};
struct
{
uint32_t m_value;
};
} DW52;
union
{
struct
{
uint32_t m_currBwdRef;
};
struct
{
uint32_t m_value;
};
} DW53;
union
{
struct
{
uint32_t m_distSurf4x;
};
struct
{
uint32_t m_value;
};
} DW54;
union
{
struct
{
uint32_t m_mbControl;
};
struct
{
uint32_t m_value;
};
} DW55;
}m_curbeData;
//!
//! \brief Constructor
//!
MbEncCurbeG10(uint8_t codingType);
//!
//! \brief Destructor
//!
~MbEncCurbeG10(){};
static const size_t m_byteSize = sizeof(CurbeData);
};
MeCurbe::MeCurbe()
{
CODECHAL_ENCODE_FUNCTION_ENTER;
MOS_ZeroMemory(&m_curbeData, m_byteSize);
m_curbeData.DW0.m_value = 0x00000000;
m_curbeData.DW1.m_value = 0x00200010;
m_curbeData.DW2.m_value = 0x00003939;
m_curbeData.DW3.m_value = 0x77a43000;
m_curbeData.DW4.m_value = 0x00000000;
m_curbeData.DW5.m_value = 0x28300000;
m_curbeData.DW32.m_value = 0xffffffff;
m_curbeData.DW33.m_value = 0xffffffff;
m_curbeData.DW34.m_value = 0xffffffff;
m_curbeData.DW35.m_value = 0xffffffff;
m_curbeData.DW36.m_value = 0xffffffff;
m_curbeData.DW37.m_value = 0xffffffff;
m_curbeData.DW38.m_value = 0xffffffff;
}
MbEncCurbeG10::MbEncCurbeG10(uint8_t codingType)
{
CODECHAL_ENCODE_FUNCTION_ENTER;
MOS_ZeroMemory(&m_curbeData, m_byteSize);
m_curbeData.DW0.m_value = 0x00000023;
switch (codingType)
{
case I_TYPE:
m_curbeData.DW1.m_value = 0x00200020;
m_curbeData.DW2.m_value = 0x00000000;
m_curbeData.DW4.m_value = 0x00000000;
m_curbeData.DW7.m_value = 0x00050066;
m_curbeData.DW8.m_value = 0x00000000;
m_curbeData.DW9.m_value = 0x7EA41000;
m_curbeData.DW10.m_value = 0x0000FF00;
break;
case P_TYPE:
m_curbeData.DW1.m_value = 0x00200020;
m_curbeData.DW2.m_value = 0x00001009;
m_curbeData.DW4.m_value = 0x20000000;
m_curbeData.DW7.m_value = 0x00050066;
m_curbeData.DW8.m_value = 0x00000041;
m_curbeData.DW9.m_value = 0x7EA41000;
m_curbeData.DW10.m_value = 0x2830FF00;
break;
case B_TYPE:
default:
m_curbeData.DW1.m_value = 0x10200010;
m_curbeData.DW2.m_value = 0x00001005;
m_curbeData.DW4.m_value = 0x40000000;
m_curbeData.DW7.m_value = 0xFF050066;
m_curbeData.DW8.m_value = 0x00000041;
m_curbeData.DW9.m_value = 0x7EA01000;
m_curbeData.DW10.m_value = 0x2020FF00;
break;
}
m_curbeData.DW3.m_value = 0xFE0C0000;
m_curbeData.MvCost.DW5.m_value = 0x00000000;
m_curbeData.MvCost.DW6.m_value = 0x00000000;
m_curbeData.DW11.m_value = 0x5A325300;
m_curbeData.DW12.m_value = 0x0000FF00;
m_curbeData.DW13.m_value = 0x00FF0000;
}
CodechalEncodeMpeg2G10::CodechalEncodeMpeg2G10(
CodechalHwInterface* hwInterface,
CodechalDebugInterface* debugInterface,
PCODECHAL_STANDARD_INFO standardInfo)
:CodechalEncodeMpeg2(hwInterface, debugInterface, standardInfo)
{
CODECHAL_ENCODE_FUNCTION_ENTER;
pfnGetKernelHeaderAndSize = GetKernelHeaderAndSize;
uint8_t* kernelBase = nullptr;
#ifndef _FULL_OPEN_SOURCE
kernelBase = (uint8_t*)IGCODECKRN_G10;
#endif
MOS_STATUS eStatus = CodecHalGetKernelBinaryAndSize(
kernelBase,
m_kuid,
&m_kernelBinary,
&m_combinedKernelSize);
CODECHAL_ENCODE_ASSERT(eStatus == MOS_STATUS_SUCCESS);
m_hwInterface->GetStateHeapSettings()->dwIshSize +=
MOS_ALIGN_CEIL(m_combinedKernelSize, (1 << MHW_KERNEL_OFFSET_SHIFT));
}
MOS_STATUS CodechalEncodeMpeg2G10::Initialize(CodechalSetting * codecHalSettings)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
// common initilization
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodechalEncodeMpeg2::Initialize(codecHalSettings));
return eStatus;
}
MOS_STATUS CodechalEncodeMpeg2G10::GetKernelHeaderAndSize(
void *binary,
EncOperation operation,
uint32_t krnStateIdx,
void *krnHeader,
uint32_t *krnSize)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
CODECHAL_ENCODE_CHK_NULL_RETURN(binary);
CODECHAL_ENCODE_CHK_NULL_RETURN(krnHeader);
CODECHAL_ENCODE_CHK_NULL_RETURN(krnSize);
auto kernelHeaderTable = (KernelHeader *)binary;
PCODECHAL_KERNEL_HEADER currKrnHeader;
if (operation == ENC_SCALING4X)
{
currKrnHeader = &kernelHeaderTable->m_plyDscalePly;
}
else if (operation == ENC_ME)
{
currKrnHeader = &kernelHeaderTable->m_mpeg2AvcMeP;
}
else if (operation == ENC_BRC)
{
currKrnHeader = &kernelHeaderTable->m_mpeg2InitFrameBrc;
}
else if (operation == ENC_MBENC)
{
currKrnHeader = &kernelHeaderTable->m_mpeg2MbEncI;
}
else
{
CODECHAL_ENCODE_ASSERTMESSAGE("Unsupported ENC mode requested");
eStatus = MOS_STATUS_INVALID_PARAMETER;
return eStatus;
}
currKrnHeader += krnStateIdx;
*((PCODECHAL_KERNEL_HEADER)krnHeader) = *currKrnHeader;
PCODECHAL_KERNEL_HEADER invalidEntry = &(kernelHeaderTable->m_mpeg2BrcResetFrame) + 1;
PCODECHAL_KERNEL_HEADER nextKrnHeader = (currKrnHeader + 1);
uint32_t nextKrnOffset = *krnSize;
if (nextKrnHeader < invalidEntry)
{
nextKrnOffset = nextKrnHeader->KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT;
}
*krnSize = nextKrnOffset - (currKrnHeader->KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT);
return eStatus;
}
MOS_STATUS CodechalEncodeMpeg2G10::InitKernelState()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
// Init kernel state
CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelStateMe());
CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelStateMbEnc());
CODECHAL_ENCODE_CHK_STATUS_RETURN(InitKernelStateBrc());
return eStatus;
}
MOS_STATUS CodechalEncodeMpeg2G10::InitKernelStateMe()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
for (uint8_t krnStateIdx = 0; krnStateIdx < 2; krnStateIdx++)
{
auto kernelStatePtr = &m_meKernelStates[krnStateIdx];
auto kernelSize = m_combinedKernelSize;
CODECHAL_KERNEL_HEADER currKrnHeader;
CODECHAL_ENCODE_CHK_STATUS_RETURN(pfnGetKernelHeaderAndSize(
m_kernelBinary,
ENC_ME,
krnStateIdx,
&currKrnHeader,
&kernelSize));
kernelStatePtr->KernelParams.iBTCount = meNumSurface;
kernelStatePtr->KernelParams.iThreadCount = m_hwInterface->GetRenderInterface()->GetHwCaps()->dwMaxThreads;
kernelStatePtr->KernelParams.iCurbeLength = MeCurbe::m_byteSize;
kernelStatePtr->KernelParams.iBlockWidth = CODECHAL_MACROBLOCK_WIDTH;
kernelStatePtr->KernelParams.iBlockHeight = CODECHAL_MACROBLOCK_HEIGHT;
kernelStatePtr->KernelParams.iIdCount = 1;
kernelStatePtr->dwCurbeOffset = m_stateHeapInterface->pStateHeapInterface->GetSizeofCmdInterfaceDescriptorData();
kernelStatePtr->KernelParams.pBinary = m_kernelBinary + (currKrnHeader.KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT);
kernelStatePtr->KernelParams.iSize = kernelSize;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnCalculateSshAndBtSizesRequested(
m_stateHeapInterface,
kernelStatePtr->KernelParams.iBTCount,
&kernelStatePtr->dwSshSize,
&kernelStatePtr->dwBindingTableSize));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->MhwInitISH(m_stateHeapInterface, kernelStatePtr));
}
// Until a better way can be found, maintain old binding table structures
auto meBindingTable = &m_meBindingTable;
// Mpeg2 uses AVC ME Kernel for P/B distortion calculation
meBindingTable->dwMEMVDataSurface = meMvDataSurface;
meBindingTable->dwMECurrForFwdRef = meCurrForFwdRef;
meBindingTable->dwMECurrForBwdRef = meCurrForBwdRef;
meBindingTable->dwMEDist = meDistortionSurface;
meBindingTable->dwMEBRCDist = meBrcDistortion;
meBindingTable->dwMEFwdRefPicIdx[0] = meFwdRefIdx0;
meBindingTable->dwMEFwdRefPicIdx[1] = CODECHAL_INVALID_BINDING_TABLE_IDX;
meBindingTable->dwMEFwdRefPicIdx[2] = CODECHAL_INVALID_BINDING_TABLE_IDX;
meBindingTable->dwMEFwdRefPicIdx[3] = CODECHAL_INVALID_BINDING_TABLE_IDX;
meBindingTable->dwMEFwdRefPicIdx[4] = CODECHAL_INVALID_BINDING_TABLE_IDX;
meBindingTable->dwMEFwdRefPicIdx[5] = CODECHAL_INVALID_BINDING_TABLE_IDX;
meBindingTable->dwMEFwdRefPicIdx[6] = CODECHAL_INVALID_BINDING_TABLE_IDX;
meBindingTable->dwMEFwdRefPicIdx[7] = CODECHAL_INVALID_BINDING_TABLE_IDX;
meBindingTable->dwMEBwdRefPicIdx[0] = meBwdRefIdx0;
meBindingTable->dwMEBwdRefPicIdx[1] = CODECHAL_INVALID_BINDING_TABLE_IDX;
return eStatus;
}
MOS_STATUS CodechalEncodeMpeg2G10::InitKernelStateMbEnc()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
for (uint8_t krnStateIdx = 0; krnStateIdx < mbEncKernelIdxNum; krnStateIdx++)
{
auto kernelStatePtr = &m_mbEncKernelStates[krnStateIdx];
auto kernelSize = m_combinedKernelSize;
CODECHAL_KERNEL_HEADER currKrnHeader;
CODECHAL_ENCODE_CHK_STATUS_RETURN(pfnGetKernelHeaderAndSize(
m_kernelBinary,
ENC_MBENC,
krnStateIdx,
&currKrnHeader,
&kernelSize));
kernelStatePtr->KernelParams.iBTCount = mbEncNumBindingTableEntries;
kernelStatePtr->KernelParams.iThreadCount = m_hwInterface->GetRenderInterface()->GetHwCaps()->dwMaxThreads;
kernelStatePtr->KernelParams.iCurbeLength = MbEncCurbeG10::m_byteSize;
kernelStatePtr->KernelParams.iBlockWidth = CODECHAL_MACROBLOCK_WIDTH;
kernelStatePtr->KernelParams.iBlockHeight = CODECHAL_MACROBLOCK_HEIGHT;
kernelStatePtr->KernelParams.iIdCount = 1;
kernelStatePtr->dwCurbeOffset = m_stateHeapInterface->pStateHeapInterface->GetSizeofCmdInterfaceDescriptorData();
kernelStatePtr->KernelParams.pBinary = m_kernelBinary + (currKrnHeader.KernelStartPointer << MHW_KERNEL_OFFSET_SHIFT);
kernelStatePtr->KernelParams.iSize = kernelSize;
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_stateHeapInterface->pfnCalculateSshAndBtSizesRequested(
m_stateHeapInterface,
kernelStatePtr->KernelParams.iBTCount,
&kernelStatePtr->dwSshSize,
&kernelStatePtr->dwBindingTableSize));
CODECHAL_ENCODE_CHK_STATUS_RETURN(m_hwInterface->MhwInitISH(m_stateHeapInterface, kernelStatePtr));
}
m_mbEncBindingTable.m_mbEncPakObj = mbEncPakObj;
m_mbEncBindingTable.m_mbEncPakObjPrev = mbEncPakObjPrev;
m_mbEncBindingTable.m_mbEncCurrentY = mbEncCurrentY;
m_mbEncBindingTable.m_mbEncBrcDistortionSurface = mbEncBrcDistortionSurface;
m_mbEncBindingTable.m_mbEncCurrentPic = mbEncCurrentPic;
m_mbEncBindingTable.m_mbEncForwardPic = mbEncForwardPic;
m_mbEncBindingTable.m_mbEncBackwardPic = mbEncBackwardPic;
m_mbEncBindingTable.m_mbEncInterlaceFrameCurrentPic = mbEncInterlaceFrameCurrentPic;
m_mbEncBindingTable.m_mbEncInterlaceFrameBackwardPic = mbEncInterlaceFrameBackwardPic;
m_mbEncBindingTable.m_mbEncMbControl = mbEncMbControl;
return eStatus;
}
MOS_STATUS CodechalEncodeMpeg2G10::SetCurbeMe()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
MeCurbe cmd;
// r1
cmd.m_curbeData.DW3.m_subPelMode = 3;
if (m_fieldScalingOutputInterleaved)
{
cmd.m_curbeData.DW3.m_srcAccess = cmd.m_curbeData.DW3.m_refAccess =
CodecHal_PictureIsField(m_picParams->m_currOriginalPic) ? 1 : 0;
cmd.m_curbeData.DW7.m_srcFieldPolarity =
CodecHal_PictureIsBottomField(m_picParams->m_currOriginalPic) ? 1 : 0;
}
uint32_t scaleFactor = 4; // Scale factor always 4x, SHME/UHME not supported
cmd.m_curbeData.DW4.m_pictureHeightMinus1 =
CODECHAL_GET_HEIGHT_IN_MACROBLOCKS(m_frameFieldHeight / scaleFactor) - 1;
cmd.m_curbeData.DW4.m_pictureWidth =
CODECHAL_GET_HEIGHT_IN_MACROBLOCKS(m_frameWidth / scaleFactor);
cmd.m_curbeData.DW5.m_qpPrimeY = m_mvCostTableOffset;
cmd.m_curbeData.DW6.m_writeDistortions = false;
cmd.m_curbeData.DW6.m_useMvFromPrevStep = false;
cmd.m_curbeData.DW6.m_superCombineDist = m_superCombineDistGeneric[m_seqParams->m_targetUsage];
cmd.m_curbeData.DW6.m_maxVmvR = m_maxVmvr;
if (!CodecHal_PictureIsFrame(m_picParams->m_currOriginalPic))
{
cmd.m_curbeData.DW6.m_maxVmvR = cmd.m_curbeData.DW6.m_maxVmvR >> 1;
}
if (m_pictureCodingType == B_TYPE)
{
// This field is irrelevant since we are not using the bi-direct search.
// set it to 32
cmd.m_curbeData.DW1.m_biWeight = 32;
cmd.m_curbeData.DW13.m_numRefIdxL1MinusOne = 0; // always 0 for MPEG2
}
if (m_pictureCodingType == P_TYPE ||
m_pictureCodingType == B_TYPE)
{
cmd.m_curbeData.DW13.m_numRefIdxL0MinusOne = 0; // always 0 for MPEG2
}
// r3 & r4
uint8_t meMethod = (m_pictureCodingType == B_TYPE) ? m_bMeMethodGeneric[m_seqParams->m_targetUsage] : m_meMethodGeneric[m_seqParams->m_targetUsage];
uint8_t tableIdx = (m_pictureCodingType == B_TYPE) ? 1 : 0;
CODECHAL_ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy(
&(cmd.m_curbeData.SpDelta), 14 * sizeof(uint32_t),
m_encodeSearchPath[tableIdx][meMethod],
14 * sizeof(uint32_t)));
// r5
cmd.m_curbeData.DW32.m_4xMeMvOutputDataSurfIndex = m_meBindingTable.dwMEMVDataSurface ;
cmd.m_curbeData.DW34.m_4xMeOutputDistSurfIndex = m_meBindingTable.dwMEDist;
cmd.m_curbeData.DW35.m_4xMeOutputBrcDistSurfIndex = m_meBindingTable.dwMEBRCDist;
cmd.m_curbeData.DW36.m_vmeFwdInterPredictionSurfIndex = m_meBindingTable.dwMECurrForFwdRef;
cmd.m_curbeData.DW37.m_vmeBwdInterPredictionSurfIndex = m_meBindingTable.dwMECurrForBwdRef;
uint32_t krnStateIdx =
(m_pictureCodingType == P_TYPE) ? CODECHAL_ENCODE_ME_IDX_P : CODECHAL_ENCODE_ME_IDX_B;
if (m_pictureCodingType == B_TYPE && CodecHal_PictureIsInvalid(m_picParams->m_refFrameList[1]))
{
krnStateIdx = CODECHAL_ENCODE_ME_IDX_P;
}
auto kernelState = &m_meKernelStates[krnStateIdx];
CODECHAL_ENCODE_CHK_STATUS_RETURN(kernelState->m_dshRegion.AddData(
&cmd,
kernelState->dwCurbeOffset,
cmd.m_byteSize));
return eStatus;
}
MOS_STATUS CodechalEncodeMpeg2G10::SendMeSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_CHK_NULL_RETURN(cmdBuffer);
auto meBindingTable = &m_meBindingTable;
PMOS_SURFACE currScaledSurface = m_trackedBuf->Get4xDsSurface(CODEC_CURR_TRACKED_BUFFER);
PMOS_SURFACE meMvDataBuffer = &m_4xMEMVDataBuffer;
// Reference height and width information should be taken from the current scaled surface rather
// than from the reference scaled surface in the case of PAFF.
auto bufWidth = MOS_ALIGN_CEIL(m_downscaledWidthInMb4x * 32, 64);
auto bufHeight =
m_downscaledHeightInMb4x * 4 * CODECHAL_ENCODE_ME_DATA_SIZE_MULTIPLIER;
// Force the values
meMvDataBuffer->dwWidth = bufWidth;
meMvDataBuffer->dwHeight = bufHeight;
meMvDataBuffer->dwPitch = bufWidth;
uint32_t krnStateIdx =
(m_pictureCodingType == P_TYPE) ? CODECHAL_ENCODE_ME_IDX_P : CODECHAL_ENCODE_ME_IDX_B;
if (m_pictureCodingType == B_TYPE && CodecHal_PictureIsInvalid(m_picParams->m_refFrameList[1]))
{
krnStateIdx = CODECHAL_ENCODE_ME_IDX_P;
}
auto kernelState = &m_meKernelStates[krnStateIdx];
CODECHAL_SURFACE_CODEC_PARAMS surfaceParams;
MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams));
surfaceParams.bIs2DSurface = true;
surfaceParams.bMediaBlockRW = true;
surfaceParams.psSurface = meMvDataBuffer;
surfaceParams.dwOffset = m_memvBottomFieldOffset;
surfaceParams.dwCacheabilityControl =
m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_MV_DATA_ENCODE].Value;
surfaceParams.dwBindingTableOffset = meBindingTable->dwMEMVDataSurface;
surfaceParams.bIsWritable = true;
surfaceParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceParams,
kernelState));
// Insert Distortion buffers only for 4xMe case
MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams));
surfaceParams.bIs2DSurface = true;
surfaceParams.bMediaBlockRW = true;
surfaceParams.psSurface = &m_brcBuffers.sMeBrcDistortionBuffer;
surfaceParams.dwOffset = m_brcBuffers.dwMeBrcDistortionBottomFieldOffset;
surfaceParams.dwBindingTableOffset = meBindingTable->dwMEBRCDist;
surfaceParams.dwCacheabilityControl =
m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_BRC_ME_DISTORTION_ENCODE].Value;
surfaceParams.bIsWritable = true;
surfaceParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceParams,
kernelState));
MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams));
surfaceParams.bIs2DSurface = true;
surfaceParams.bMediaBlockRW = true;
surfaceParams.psSurface = &m_4xMEDistortionBuffer;
surfaceParams.dwOffset = m_meDistortionBottomFieldOffset;
surfaceParams.dwBindingTableOffset = meBindingTable->dwMEDist;
surfaceParams.dwCacheabilityControl =
m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_ME_DISTORTION_ENCODE].Value;
surfaceParams.bIsWritable = true;
surfaceParams.bRenderTarget = true;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceParams,
kernelState));
bool currFieldPicture = CodecHal_PictureIsField(m_currOriginalPic) ? 1 : 0;
bool currBottomField = CodecHal_PictureIsBottomField(m_currOriginalPic) ? 1 : 0;
uint8_t currVDirection = (!currFieldPicture) ? CODECHAL_VDIRECTION_FRAME :
((currBottomField) ? CODECHAL_VDIRECTION_BOT_FIELD : CODECHAL_VDIRECTION_TOP_FIELD);
uint32_t refScaledBottomFieldOffset = 0;
auto refScaledSurface = *currScaledSurface;
// Setup references 1...n
// LIST 0 references
CODEC_PICTURE refPic = m_picParams->m_refFrameList[0];
// no need to modify index if picture is invalid
if (refPic.PicFlags != PICTURE_INVALID)
{
refPic.FrameIdx = 0;
}
if (!CodecHal_PictureIsInvalid(refPic) && m_picIdx[refPic.FrameIdx].bValid)
{
// Current Picture Y - VME
MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams));
surfaceParams.bUseAdvState = true;
surfaceParams.psSurface = currScaledSurface;
surfaceParams.dwOffset = currBottomField ? (uint32_t)m_scaledBottomFieldOffset : 0;
surfaceParams.dwCacheabilityControl =
m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_CURR_ENCODE].Value;
surfaceParams.dwBindingTableOffset = meBindingTable->dwMECurrForFwdRef;
surfaceParams.ucVDirection = currVDirection;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceParams,
kernelState));
bool refBottomField = (CodecHal_PictureIsBottomField(refPic)) ? 1 : 0;
uint8_t refPicIdx = m_picIdx[refPic.FrameIdx].ucPicIdx;
uint8_t scaledIdx = m_refList[refPicIdx]->ucScalingIdx;
// for 4xMe
MOS_SURFACE* p4xSurface = m_trackedBuf->Get4xDsSurface(scaledIdx);
if (p4xSurface != nullptr)
{
refScaledSurface.OsResource = p4xSurface->OsResource;
}
refScaledSurface.OsResource = m_trackedBuf->Get4xDsSurface(scaledIdx)->OsResource;
refScaledBottomFieldOffset = refBottomField ? (uint32_t)m_scaledBottomFieldOffset : 0;
// L0 Reference Picture Y - VME
MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams));
surfaceParams.bUseAdvState = true;
surfaceParams.psSurface = &refScaledSurface;
surfaceParams.dwOffset = refBottomField ? refScaledBottomFieldOffset : 0;
surfaceParams.dwCacheabilityControl =
m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_REF_ENCODE].Value;
surfaceParams.dwBindingTableOffset = meBindingTable->dwMEFwdRefPicIdx[0];
surfaceParams.ucVDirection = !currFieldPicture ? CODECHAL_VDIRECTION_FRAME :
((refBottomField) ? CODECHAL_VDIRECTION_BOT_FIELD : CODECHAL_VDIRECTION_TOP_FIELD);
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceParams,
kernelState));
}
// Setup references 1...n
// LIST 1 references
refPic = m_picParams->m_refFrameList[1];
// no need to modify index if picture is invalid
if (refPic.PicFlags != PICTURE_INVALID)
{
refPic.FrameIdx = 1;
}
if (!CodecHal_PictureIsInvalid(refPic) && m_picIdx[refPic.FrameIdx].bValid)
{
// Current Picture Y - VME
MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams));
surfaceParams.bUseAdvState = true;
surfaceParams.psSurface = currScaledSurface;
surfaceParams.dwOffset = currBottomField ? (uint32_t)m_scaledBottomFieldOffset : 0;
surfaceParams.dwCacheabilityControl =
m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_CURR_ENCODE].Value;
surfaceParams.dwBindingTableOffset = meBindingTable->dwMECurrForBwdRef;
surfaceParams.ucVDirection = currVDirection;
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceParams,
kernelState));
bool refBottomField = (CodecHal_PictureIsBottomField(refPic)) ? 1 : 0;
uint8_t refPicIdx = m_picIdx[refPic.FrameIdx].ucPicIdx;
uint8_t scaledIdx = m_refList[refPicIdx]->ucScalingIdx;
// for 4xMe
MOS_SURFACE* p4xSurface = m_trackedBuf->Get4xDsSurface(scaledIdx);
if (p4xSurface != nullptr)
{
refScaledSurface.OsResource = p4xSurface->OsResource;
}
refScaledBottomFieldOffset = refBottomField ? (uint32_t)m_scaledBottomFieldOffset : 0;
// L1 Reference Picture Y - VME
MOS_ZeroMemory(&surfaceParams, sizeof(surfaceParams));
surfaceParams.bUseAdvState = true;
surfaceParams.psSurface = &refScaledSurface;
surfaceParams.dwOffset = refBottomField ? refScaledBottomFieldOffset : 0;
surfaceParams.dwCacheabilityControl =
m_hwInterface->GetCacheabilitySettings()[MOS_CODEC_RESOURCE_USAGE_SURFACE_REF_ENCODE].Value;
surfaceParams.dwBindingTableOffset = meBindingTable->dwMEBwdRefPicIdx[0];
surfaceParams.ucVDirection = (!currFieldPicture) ? CODECHAL_VDIRECTION_FRAME :
((refBottomField) ? CODECHAL_VDIRECTION_BOT_FIELD : CODECHAL_VDIRECTION_TOP_FIELD);
CODECHAL_ENCODE_CHK_STATUS_RETURN(CodecHalSetRcsSurfaceState(
m_hwInterface,
cmdBuffer,
&surfaceParams,
kernelState));
}
return eStatus;
}
MOS_STATUS CodechalEncodeMpeg2G10::SetCurbeMbEnc(
bool mbEncIFrameDistEnabled,
bool mbQpDataEnabled)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_ENCODE_FUNCTION_ENTER;
uint16_t picWidthInMb = mbEncIFrameDistEnabled ?
(uint16_t)m_downscaledWidthInMb4x : m_picWidthInMb;
uint16_t fieldFrameHeightInMb = mbEncIFrameDistEnabled ?
(uint16_t)m_downscaledFrameFieldHeightInMb4x : m_frameFieldHeightInMb;
MbEncCurbeG10 cmd(m_picParams->m_pictureCodingType);
// Set CURBE data as per
cmd.m_curbeData.DW0.m_isInterlacedFrameFlag =
(CodecHal_PictureIsFrame(m_picParams->m_currOriginalPic)) ? (m_picParams->m_fieldCodingFlag || m_picParams->m_fieldFrameCodingFlag) : 0;
cmd.m_curbeData.DW0.m_isTopFieldFirst = cmd.m_curbeData.DW0.m_isInterlacedFrameFlag ? !m_picParams->m_interleavedFieldBFF : 0;
cmd.m_curbeData.DW0.m_forceToSkip = 0;
cmd.m_curbeData.DW4.m_pictureType = m_picParams->m_pictureCodingType;
cmd.m_curbeData.DW4.m_fieldFlag = (CodecHal_PictureIsFrame(m_picParams->m_currOriginalPic)) ? 0 : 1;
cmd.m_curbeData.DW4.m_picWidth = picWidthInMb;
cmd.m_curbeData.DW4.m_picHeightMinus1 = fieldFrameHeightInMb - 1;
cmd.m_curbeData.DW7.m_bilinearEnable = 1;
cmd.m_curbeData.DW7.m_mvCostScaleFactor = 1; // half-pel
cmd.m_curbeData.DW7.m_idmShapeMode = 0;
cmd.m_curbeData.DW9.m_srcAccess = cmd.m_curbeData.DW9.m_refAccess = 0;
cmd.m_curbeData.DW9.m_fieldCacheAllocationDis = 0;
// This is approximation using first slice
// MPEG2 quantiser_scale_code legal range is [1, 31] inclusive
if (m_sliceParams->m_quantiserScaleCode < 1)
{
m_sliceParams->m_quantiserScaleCode = 1;
}
else if (m_sliceParams->m_quantiserScaleCode > 31)
{
m_sliceParams->m_quantiserScaleCode = 31;
}
cmd.m_curbeData.DW9.m_mbQPEnable = mbQpDataEnabled;
cmd.m_curbeData.DW11.m_qpScaleCode = m_sliceParams->m_quantiserScaleCode;
cmd.m_curbeData.DW2.m_maxNumSU = 0x10;
cmd.m_curbeData.DW12.m_isFastMode = 0;
if (m_seqParams ->m_rateControlMethod == RATECONTROL_CQP)
{
cmd.m_curbeData.DW13.m_panicModeMBThreshold = 0xFFFF;
}
cmd.m_curbeData.DW14.m_forwardHorizontalSearchRange = 4 << m_picParams->m_fcode00;
cmd.m_curbeData.DW14.m_forwardVerticalSearchRange = 4 << m_picParams->m_fcode01;
cmd.m_curbeData.DW15.m_backwardHorizontalSearchRange = 4 << m_picParams->m_fcode10;
cmd.m_curbeData.DW15.m_backwardVerticalSearchRange = 4 << m_picParams->m_fcode11;
if (m_picParams->m_pictureCodingType == I_TYPE)
{
cmd.m_curbeData.DW2.m_value = 0;
cmd.m_curbeData.DW4.m_pictureType = 0;
cmd.m_curbeData.DW9.m_intraSAD = 0x2;
// Modify CURBE for distortion calculation.
if (mbEncIFrameDistEnabled)
{
cmd.m_curbeData.DW4.m_iFrameMBDistortionDumpEnable = true;
}
else
{
// Make sure the distortion dump flag is disabled for the normal MBEnc case.
// No need to reset the height and width since they are set
// correctly above this if-else and not modified after.
cmd.m_curbeData.DW4.m_iFrameMBDistortionDumpEnable = false;
}
}
else if (m_picParams->m_pictureCodingType == P_TYPE)
{
cmd.m_curbeData.DW1.m_uniMixDisable = 0;
cmd.m_curbeData.DW1.m_biWeight = 32;
cmd.m_curbeData.DW2.m_maxLenSP = 0x09;
cmd.m_curbeData.DW4.m_pictureType = 1;
cmd.m_curbeData.DW9.m_interSAD = 2;
cmd.m_curbeData.DW9.m_intraSAD = 2;
cmd.m_curbeData.DW9.m_searchCtrl = 0;
cmd.m_curbeData.DW9.m_subPelMode = 1;
cmd.m_curbeData.DW9.m_skipType = 0;
cmd.m_curbeData.DW9.m_subMbPartMask = 0x7E;
cmd.m_curbeData.DW10.m_refWidth = 48;
cmd.m_curbeData.DW10.m_refHeight = 40;
cmd.m_curbeData.DW12.m_distScaleFactor = 0;
cmd.m_curbeData.DW7.m_skipCenterMask = 0x55;
//Motion vector cost is taken from VME_LUTXY
CODECHAL_ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy(
&(cmd.m_curbeData.MvCost),
sizeof(uint32_t)* 2,
m_vmeLutXyP,
sizeof(uint32_t)* 2));
//VME_SEARCH_PATH
CODECHAL_ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy(
&(cmd.m_curbeData.VmeSPath0),
sizeof(uint32_t)* 16,
m_vmeSPathP0,
sizeof(uint32_t)* 16));
CODECHAL_ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy(
&(cmd.m_curbeData.VmeSPath1),
sizeof(uint32_t)* 16,
m_vmeSPathP1,
sizeof(uint32_t)* 16));
//Interlaced motion vector cost is the same as progressive P frame
CODECHAL_ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy(
&(cmd.m_curbeData.VmeSPath1.MvCostInterlace),
sizeof(uint32_t)* 2,
m_vmeLutXyP,
sizeof(uint32_t)* 2));
}
else// B_TYPE
{
cmd.m_curbeData.DW1.m_biWeight = 32;
cmd.m_curbeData.DW1.m_refPixShift = 0;
cmd.m_curbeData.DW2.m_maxLenSP = 0x05;
cmd.m_curbeData.DW4.m_pictureType = 2;
cmd.m_curbeData.DW9.m_subMbPartMask = 0x7E;
cmd.m_curbeData.DW9.m_subPelMode = 1;
cmd.m_curbeData.DW9.m_skipType = 0;
cmd.m_curbeData.DW9.m_searchCtrl = 7;
cmd.m_curbeData.DW9.m_interSAD = 2;
cmd.m_curbeData.DW9.m_intraSAD = 2;
cmd.m_curbeData.DW10.m_refWidth = 32;
cmd.m_curbeData.DW10.m_refHeight = 32;
cmd.m_curbeData.DW7.m_skipCenterMask = 0xFF;
switch (m_picParams->m_gopRefDist)
{
case 3:
cmd.m_curbeData.DW12.m_distScaleFactor = (m_frameNumB > 1) ? 43 : 21;
break;
case 4:
cmd.m_curbeData.DW12.m_distScaleFactor = (m_frameNumB << 4);
break;
default:
cmd.m_curbeData.DW12.m_distScaleFactor = 32;
break;
}
//Motion vector cost is taken from VME_LUTXY
CODECHAL_ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy(
&(cmd.m_curbeData.MvCost), sizeof(uint32_t)* 2,
m_vmeLutXyB,
sizeof(uint32_t)* 2));
//VME_SEARCH_PATH
CODECHAL_ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy(
&(cmd.m_curbeData.VmeSPath0),
sizeof(uint32_t)* 16,
m_vmeSPathB0,
sizeof(uint32_t)* 16));
CODECHAL_ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy(
&(cmd.m_curbeData.VmeSPath1),
sizeof(uint32_t)* 16,
m_vmeSPathB1,
sizeof(uint32_t)* 16));
//Interlaced motion vector cost is the same as progressive P frame
CODECHAL_ENCODE_CHK_STATUS_RETURN(MOS_SecureMemcpy(
&(cmd.m_curbeData.VmeSPath1.MvCostInterlace),
sizeof(uint32_t)* 2,
m_vmeLutXyP,
sizeof(uint32_t)* 2));
}
//ModeCost for P/B pictures
if (m_picParams->m_pictureCodingType != I_TYPE)
{
cmd.m_curbeData.VmeSPath0.DW30.m_value = 0x83; // Setting mode 0 cost to 0x83 (131)
cmd.m_curbeData.VmeSPath0.DW31.m_value = 0x41414141; // Set mode 4, 5, 6, 7 costs to 0x41 (67)
cmd.m_curbeData.DW8.m_mode8Cost = 0x41;
}
cmd.m_curbeData.DW48.m_value = 0x05000000; // BB-End Command
cmd.m_curbeData.DW49.m_value = m_mbEncBindingTable.m_mbEncPakObj;
cmd.m_curbeData.DW50.m_value = m_mbEncBindingTable.m_mbEncPakObjPrev;
cmd.m_curbeData.DW51.m_value = m_mbEncBindingTable.m_mbEncCurrentY;
cmd.m_curbeData.DW52.m_value = m_mbEncBindingTable.m_mbEncCurrentPic; // Also FWD REF & BWD REF too, +1, +2 respectively
cmd.m_curbeData.DW53.m_value = m_mbEncBindingTable.m_mbEncInterlaceFrameCurrentPic; // Also Int BWD Ref (+1)
cmd.m_curbeData.DW54.m_value = m_mbEncBindingTable.m_mbEncBrcDistortionSurface;
cmd.m_curbeData.DW55.m_value = m_mbEncBindingTable.m_mbEncMbControl;
PMHW_KERNEL_STATE kernelState;
// Initialize DSH kernel region
if (mbEncIFrameDistEnabled)
{
kernelState = &m_brcKernelStates[CODECHAL_ENCODE_BRC_IDX_IFRAMEDIST];
}
else
{
// wPictureCodingType: I_TYPE = 1, P_TYPE = 2, B_TYPE = 3
// KernelStates are I: 0, P: 1, B: 2
// m_mbEncKernelStates: I: m_mbEncKernelStates[0], P: m_mbEncKernelStates[1], B: m_mbEncKernelStates[2]
uint32_t krnStateIdx = m_pictureCodingType - 1;
kernelState = &m_mbEncKernelStates[krnStateIdx];
}
CODECHAL_ENCODE_CHK_STATUS_RETURN(kernelState->m_dshRegion.AddData(
&cmd,
kernelState->dwCurbeOffset,
cmd.m_byteSize));
return eStatus;
}