blob: dac9a45cbd60b8254f397670a2cb4c6821f4f369 [file] [log] [blame]
/*
* Copyright (c) 2017-2019, 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_hevc_g12.h
//! \brief HEVC dual-pipe encoder for GEN12 platform.
//!
#ifndef __CODECHAL_ENCODE_HEVC_G12_H__
#define __CODECHAL_ENCODE_HEVC_G12_H__
#include "codechal_encode_hevc.h"
#include "codechal_encode_sw_scoreboard_g12.h"
#include "codechal_encode_sw_scoreboard_mdf_g12.h"
#include "codechal_encode_wp_mdf_g12.h"
#include "mhw_vdbox_g12_X.h"
#include "codechal_kernel_intra_dist.h"
#include "codechal_encode_hevc_brc_g12.h"
#include "codechal_encode_singlepipe_virtualengine.h"
#include "codechal_encode_scalability.h"
#define VDBOX_HUC_PAK_INTEGRATION_KERNEL_DESCRIPTOR 15
#define BRC_IMG_STATE_SIZE_PER_PASS_G12 192
#define HEVC_BRC_LONG_TERM_REFRENCE_FLAG 0x8000
#define MAX_CONCURRENT_GROUP 4
//!
//! \struct HucPakStitchDmemEncG12
//! \brief The struct of Huc Com Dmem
//!
struct HucPakStitchDmemEncG12
{
uint32_t TileSizeRecord_offset[5]; // Tile Size Records, start offset in byte, 0xffffffff means unavailable
uint32_t VDENCSTAT_offset[5]; // needed for HEVC VDEnc, VP9 VDEnc, start offset in byte, 0xffffffff means unavailable
uint32_t HEVC_PAKSTAT_offset[5]; //needed for HEVC VDEnc, start offset in byte, 0xffffffff means unavailable
uint32_t HEVC_Streamout_offset[5]; //needed for HEVC VDEnc, start offset in byte, 0xffffffff means unavailable
uint32_t VP9_PAK_STAT_offset[5]; //needed for VP9 VDEnc, start offset in byte, 0xffffffff means unavailable
uint32_t Vp9CounterBuffer_offset[5]; //needed for VP9 VDEnc, start offset in byte, 0xffffffff means unavailable
uint32_t LastTileBS_StartInBytes;// last tile in bitstream for region 4 and region 5
uint32_t SliceHeaderSizeinBits;// needed for HEVC dual pipe BRC
uint16_t TotalSizeInCommandBuffer; // Total size in bytes of valid data in the command buffer
uint16_t OffsetInCommandBuffer; // Byte offset of the to-be-updated Length (uint32_t) in the command buffer, 0xffff means unavailable
uint16_t PicWidthInPixel; // Picture width in pixel
uint16_t PicHeightInPixel; // Picture hieght in pixel
uint16_t TotalNumberOfPAKs; // [2..4]
uint16_t NumSlices[4]; // this is number of slices from each PAK
uint16_t NumTiles[4]; // this is number of tiles from each PAK
uint16_t PIC_STATE_StartInBytes;// offset for region 7 and region 8
uint8_t Codec; // 1: HEVC DP; 2: HEVC VDEnc; 3: VP9 VDEnc
uint8_t MAXPass; // Max number of BRC pass >=1
uint8_t CurrentPass; // Current BRC pass [1..MAXPass]
uint8_t MinCUSize; // Minimum CU size (3: 8x8, 4:16x16), HEVC only.
uint8_t CabacZeroWordFlag; // cabac zero flag, HEVC only
uint8_t bitdepth_luma; // luma bitdepth, HEVC only
uint8_t bitdepth_chroma; // chroma bitdepth, HEVC only
uint8_t ChromaFormatIdc; // chroma format idc, HEVC only
uint8_t currFrameBRClevel; // Hevc dual pipe only
uint8_t brcUnderFlowEnable; // Hevc dual pipe only
uint8_t StitchEnable;// enable stitch cmd for Hevc dual pipe
uint8_t reserved1;
uint16_t StitchCommandOffset; // offset in region 10 which is the second level batch buffer
uint16_t reserved2;
uint32_t BBEndforStitch;
uint8_t RSVD[16]; //mbz
};
//!
//! \struct HucInputCmdG12
//! \brief The struct of Huc input command
//!
struct HucInputCmdG12
{
uint8_t SelectionForIndData = 0;
uint8_t CmdMode = 0;
uint16_t LengthOfTable = 0;
uint32_t SrcBaseOffset = 0;
uint32_t DestBaseOffset = 0;
uint32_t Reserved[3] = { 0 };
uint32_t CopySize = 0; // use this as indicator of size for copy base addr cmd. Since encode will not implement CopySize for copy cmd
uint32_t ReservedCounter[4] = {0};
uint32_t SrcAddrBottom = 0;
uint32_t SrcAddrTop = 0;
uint32_t DestAddrBottom = 0;
uint32_t DestAddrTop = 0;
};
//! HEVC dual-pipe encoder class for GEN12
/*!
This class defines the member fields, functions for GEN12 platform
*/
class CodechalEncHevcStateG12 : public CodechalEncHevcState
{
public:
//!< Constants for mode bits look-up-tables
enum
{
LUTMODEBITS_INTRA_64X64 = 0x00,
LUTMODEBITS_INTRA_32X32 = 0x01,
LUTMODEBITS_INTRA_16X16 = 0x02,
LUTMODEBITS_INTRA_8X8 = 0x03,
LUTMODEBITS_INTRA_NXN = 0x04,
LUTMODEBITS_INTRA_MPM = 0x07,
LUTMODEBITS_INTRA_CHROMA = 0x08,
LUTMODEBITS_INTRA_DC_32X32 = 0x09,
LUTMODEBITS_INTRA_DC_8X8 = 0x0A,
LUTMODEBITS_INTRA_NONDC_32X32 = 0x0B,
LUTMODEBITS_INTRA_NONDC_16X16 = 0x0C, // only used by CRE
LUTMODEBITS_INTRA_NONDC_8X8 = 0x0D,
LUTMODEBITS_INTER_64X64 = 0x0E, // only used by Kernel
LUTMODEBITS_INTER_64X32 = 0x0F,
LUTMODEBITS_INTER_32X64 = 0x0F,
LUTMODEBITS_INTER_32X32 = 0x10,
LUTMODEBITS_INTER_32X16 = 0x11,
LUTMODEBITS_INTER_16X32 = 0x11,
LUTMODEBITS_INTER_AMP = 0x11,
LUTMODEBITS_INTER_16X8 = 0x13,
LUTMODEBITS_INTER_8X16 = 0x13,
LUTMODEBITS_INTER_8X8 = 0x14,
LUTMODEBITS_INTER_BIDIR = 0x15,
LUTMODEBITS_INTER_REFID = 0x16,
LUTMODEBITS_MERGE_64X64 = 0x17,
LUTMODEBITS_MERGE_32X32 = 0x18,
LUTMODEBITS_MERGE_16X16 = 0x19,
LUTMODEBITS_MERGE_8X8 = 0x1A,
LUTMODEBITS_INTER_SKIP = 0x1B, // only used by CRE
LUTMODEBITS_SKIP_64X64 = 0x1C,
LUTMODEBITS_SKIP_32X32 = 0x1D,
LUTMODEBITS_SKIP_16X16 = 0x1E,
LUTMODEBITS_SKIP_8X8 = 0x1F,
LUTMODEBITS_TU_DEPTH_0 = 0x23, // shared by HEVC & VP9
LUTMODEBITS_TU_DEPTH_1 = 0x24, // shared by HEVC & VP9
LUTMODEBITS_INTER_16X16 = 0x12,
LUTMODEBITS_CBF = 0x26,
LUTMODEBITS_INTRA_CBF_32X32 = LUTMODEBITS_CBF + 0,
LUTMODEBITS_INTRA_CBF_16X16 = LUTMODEBITS_CBF + 1,
LUTMODEBITS_INTRA_CBF_8X8 = LUTMODEBITS_CBF + 2,
LUTMODEBITS_INTRA_CBF_4X4 = LUTMODEBITS_CBF + 3,
LUTMODEBITS_INTER_CBF_32X32 = LUTMODEBITS_CBF + 4,
LUTMODEBITS_INTER_CBF_16X16 = LUTMODEBITS_CBF + 5,
LUTMODEBITS_INTER_CBF_8X8 = LUTMODEBITS_CBF + 6,
LUTMODEBITS_INTER_CBF_4X4 = LUTMODEBITS_CBF + 7,
NUM_LUTMODEBITS = 46
};
//!< Constants for CRE costing look-up-tables
enum
{
LUTCREMODE_INTRA_NONPRED = 0x00, // MPM
LUTCREMODE_INTRA_32X32 = 0x01,
LUTCREMODE_INTRA_16X16 = 0x02,
LUTCREMODE_INTRA_8X8 = 0x03,
LUTCREMODE_INTER_32X16 = 0x04,
LUTCREMODE_INTER_16X32 = 0x04,
LUTCREMODE_INTER_AMP = 0x04,
LUTCREMODE_INTER_16X16 = 0x05,
LUTCREMODE_INTER_16X8 = 0x06,
LUTCREMODE_INTER_8X16 = 0x06,
LUTCREMODE_INTER_8X8 = 0x07,
LUTCREMODE_INTER_32X32 = 0x08,
LUTCREMODE_INTER_BIDIR = 0x09,
LUTCREMODE_REF_ID = 0x0A,
LUTCREMODE_INTRA_CHROMA = 0x0B,
LUTCREMODE_INTER_SKIP = 0x0C,
LUTCREMODE_INTRA_NONDC_32X32 = 0x0D,
LUTCREMODE_INTRA_NONDC_16X16 = 0x0E,
LUTCREMODE_INTRA_NONDC_8X8 = 0x0F,
NUM_LUTCREMODE = 16
};
//!< Constants for RDE costing look-up-tables
enum
{
LUTRDEMODE_INTRA_64X64 = 0x00,
LUTRDEMODE_INTRA_32X32 = 0x01,
LUTRDEMODE_INTRA_16X16 = 0x02,
LUTRDEMODE_INTRA_8X8 = 0x03,
LUTRDEMODE_INTRA_NXN = 0x04,
LUTRDEMODE_INTRA_MPM = 0x07,
LUTRDEMODE_INTRA_DC_32X32 = 0x08,
LUTRDEMODE_INTRA_DC_8X8 = 0x09,
LUTRDEMODE_INTRA_NONDC_32X32 = 0x0A,
LUTRDEMODE_INTRA_NONDC_8X8 = 0x0B,
LUTRDEMODE_INTER_BIDIR = 0x0C,
LUTRDEMODE_INTER_REFID = 0x0D,
LUTRDEMODE_SKIP_64X64 = 0x0E,
LUTRDEMODE_SKIP_32X32 = 0x0F,
LUTRDEMODE_SKIP_16X16 = 0x10,
LUTRDEMODE_SKIP_8X8 = 0x11,
LUTRDEMODE_MERGE_64X64 = 0x12,
LUTRDEMODE_MERGE_32X32 = 0x13,
LUTRDEMODE_MERGE_16X16 = 0x14,
LUTRDEMODE_MERGE_8X8 = 0x15,
LUTRDEMODE_INTER_32X32 = 0x16,
LUTRDEMODE_INTER_32X16 = 0x17,
LUTRDEMODE_INTER_16X32 = 0x17,
LUTRDEMODE_INTER_AMP = 0x17,
LUTRDEMODE_INTER_16X16 = 0x18,
LUTRDEMODE_INTER_16X8 = 0x19,
LUTRDEMODE_INTER_8X16 = 0x19,
LUTRDEMODE_INTER_8X8 = 0x1A,
LUTRDEMODE_TU_DEPTH_0 = 0x1E,
LUTRDEMODE_TU_DEPTH_1 = 0x1F,
LUTRDEMODE_CBF = 0x21,
LUTRDEMODE_INTRA_CBF_32X32 = LUTRDEMODE_CBF+0,
LUTRDEMODE_INTRA_CBF_16X16 = LUTRDEMODE_CBF+1,
LUTRDEMODE_INTRA_CBF_8X8 = LUTRDEMODE_CBF+2,
LUTRDEMODE_INTRA_CBF_4X4 = LUTRDEMODE_CBF+3,
LUTRDEMODE_INTER_CBF_32X32 = LUTRDEMODE_CBF+4,
LUTRDEMODE_INTER_CBF_16X16 = LUTRDEMODE_CBF+5,
LUTRDEMODE_INTER_CBF_8X8 = LUTRDEMODE_CBF+6,
LUTRDEMODE_INTER_CBF_4X4 = LUTRDEMODE_CBF+7,
NUM_LUTRDEMODE = 41,
};
//!< MBENC kernel index
enum
{
MBENC_LCU32_KRNIDX = 0,
MBENC_LCU64_KRNIDX = 1,
MBENC_NUM_KRN
};
//!< Binding table offset
enum
{
//BRC Init/Reset
BRC_INIT_RESET_BEGIN = 0,
BRC_INIT_RESET_HISTORY = BRC_INIT_RESET_BEGIN,
BRC_INIT_RESET_DISTORTION,
BRC_INIT_RESET_END,
//BRC Update (frame based)
BRC_UPDATE_BEGIN = 0,
BRC_UPDATE_HISTORY = BRC_UPDATE_BEGIN,
BRC_UPDATE_PREV_PAK,
BRC_UPDATE_PIC_STATE_R,
BRC_UPDATE_PIC_STATE_W,
BRC_UPDATE_ENC_OUTPUT,
BRC_UPDATE_DISTORTION,
BRC_UPDATE_BRCDATA,
BRC_UPDATE_MB_STATS,
BRC_UPDATE_MV_AND_DISTORTION_SUM,
BRC_UPDATE_END,
//BRC Update (LCU-based)
BRC_LCU_UPDATE_BEGIN = 0,
BRC_LCU_UPDATE_HISTORY = BRC_LCU_UPDATE_BEGIN,
BRC_LCU_UPDATE_DISTORTION,
BRC_LCU_UPDATE_MB_STATS,
BRC_LCU_UPDATE_MB_QP,
BRC_LCU_UPDATE_ROI,
BRC_LCU_UPDATE_END,
// MBEnc I-kernel
MBENC_I_FRAME_BEGIN = 0,
MBENC_I_FRAME_VME_PRED_CURR_PIC_IDX0 = MBENC_I_FRAME_BEGIN,
MBENC_I_FRAME_VME_PRED_FWD_PIC_IDX0,
MBENC_I_FRAME_VME_PRED_BWD_PIC_IDX0,
MBENC_I_FRAME_VME_PRED_FWD_PIC_IDX1,
MBENC_I_FRAME_VME_PRED_BWD_PIC_IDX1,
MBENC_I_FRAME_VME_PRED_FWD_PIC_IDX2,
MBENC_I_FRAME_VME_PRED_BWD_PIC_IDX2,
MBENC_I_FRAME_VME_PRED_FWD_PIC_IDX3,
MBENC_I_FRAME_VME_PRED_BWD_PIC_IDX3,
MBENC_I_FRAME_CURR_Y,
MBENC_I_FRAME_CURR_UV,
MBENC_I_FRAME_CURR_Y_WITH_RECON_BOUNDARY_PIX,
MBENC_I_FRAME_INTERMEDIATE_CU_RECORD,
MBENC_I_FRAME_PAK_OBJ,
MBENC_I_FRAME_PAK_CU_RECORD,
MBENC_I_FRAME_SW_SCOREBOARD,
MBENC_I_FRAME_SCRATCH_SURFACE,
MBENC_I_FRAME_CU_QP_DATA,
MBENC_I_FRAME_LCU_LEVEL_DATA_INPUT,
MBENC_I_FRAME_ENC_CONST_TABLE,
MBENC_I_FRAME_CONCURRENT_TG_DATA,
MBENC_I_FRAME_BRC_COMBINED_ENC_PARAMETER_SURFACE,
MBENC_I_FRAME_DEBUG_DUMP,
MBENC_I_FRAME_END,
//MBEnc B-Kernel
MBENC_B_FRAME_BEGIN = 0,
MBENC_B_FRAME_ENCODER_COMBINED_BUFFER1 = MBENC_B_FRAME_BEGIN,
MBENC_B_FRAME_ENCODER_COMBINED_BUFFER2,
MBENC_B_FRAME_VME_PRED_CURR_PIC_IDX0,
MBENC_B_FRAME_VME_PRED_FWD_PIC_IDX0,
MBENC_B_FRAME_VME_PRED_BWD_PIC_IDX0,
MBENC_B_FRAME_VME_PRED_FWD_PIC_IDX1,
MBENC_B_FRAME_VME_PRED_BWD_PIC_IDX1,
MBENC_B_FRAME_VME_PRED_FWD_PIC_IDX2,
MBENC_B_FRAME_VME_PRED_BWD_PIC_IDX2,
MBENC_B_FRAME_VME_PRED_FWD_PIC_IDX3,
MBENC_B_FRAME_VME_PRED_BWD_PIC_IDX3,
MBENC_B_FRAME_CURR_Y,
MBENC_B_FRAME_CURR_UV,
MBENC_B_FRAME_CURR_Y_WITH_RECON_BOUNDARY_PIX,
MBENC_B_FRAME_ENC_CU_RECORD,
MBENC_B_FRAME_PAK_OBJ,
MBENC_B_FRAME_PAK_CU_RECORD,
MBENC_B_FRAME_SW_SCOREBOARD,
MBENC_B_FRAME_SCRATCH_SURFACE,
MBENC_B_FRAME_CU_QP_DATA,
MBENC_B_FRAME_LCU_LEVEL_DATA_INPUT,
MBENC_B_FRAME_ENC_CONST_TABLE,
MBENC_B_FRAME_COLOCATED_CU_MV_DATA,
MBENC_B_FRAME_HME_MOTION_PREDICTOR_DATA,
MBENC_B_FRAME_CONCURRENT_TG_DATA,
MBENC_B_FRAME_BRC_COMBINED_ENC_PARAMETER_SURFACE,
MBENC_B_FRAME_VME_PRED_FOR_2X_DS_CURR,
MBENC_B_FRAME_VME_PRED_FOR_2X_DS_FWD_PIC_IDX0,
MBENC_B_FRAME_VME_PRED_FOR_2X_DS_BWD_PIC_IDX0,
MBENC_B_FRAME_VME_PRED_FOR_2X_DS_FWD_PIC_IDX1,
MBENC_B_FRAME_VME_PRED_FOR_2X_DS_BWD_PIC_IDX1,
MBENC_B_FRAME_VME_PRED_FOR_2X_DS_FWD_PIC_IDX2,
MBENC_B_FRAME_VME_PRED_FOR_2X_DS_BWD_PIC_IDX2,
MBENC_B_FRAME_VME_PRED_FOR_2X_DS_FWD_PIC_IDX3,
MBENC_B_FRAME_VME_PRED_FOR_2X_DS_BWD_PIC_IDX3,
MBENC_B_FRAME_ENCODER_HISTORY_INPUT_BUFFER,
MBENC_B_FRAME_ENCODER_HISTORY_OUTPUT_BUFFER,
MBENC_B_FRAME_DEBUG_SURFACE,
MBENC_B_FRAME_DEBUG_SURFACE1,
MBENC_B_FRAME_DEBUG_SURFACE2,
MBENC_B_FRAME_DEBUG_SURFACE3,
MBENC_B_FRAME_END,
};
//!< Constants for TU based params
enum
{
IntraSpotCheckFlagTuParam,
EnableCu64CheckTuParam,
DynamicOrderThTuParam,
Dynamic64ThTuParam,
Dynamic64OrderTuParam,
Dynamic64EnableTuParam,
IncreaseExitThreshTuParam,
Log2TUMaxDepthInterTuParam,
Log2TUMaxDepthIntraTuParam,
MaxNumIMESearchCenterTuParam,
Fake32EnableTuParam,
Dynamic64Min32,
TotalTuParams
};
//! \cond SKIP_DOXYGEN
//! Kernel Header structure
struct CODECHAL_HEVC_KERNEL_HEADER
{
int nKernelCount;
union
{
struct
{
CODECHAL_KERNEL_HEADER HEVC_Enc_LCU32;
CODECHAL_KERNEL_HEADER HEVC_Enc_LCU64;
CODECHAL_KERNEL_HEADER HEVC_brc_init;
CODECHAL_KERNEL_HEADER HEVC_brc_reset;
CODECHAL_KERNEL_HEADER HEVC_brc_update;
CODECHAL_KERNEL_HEADER HEVC_brc_lcuqp;
};
};
};
using PCODECHAL_HEVC_KERNEL_HEADER = CODECHAL_HEVC_KERNEL_HEADER*;
static const uint32_t MAX_MULTI_FRAME_NUMBER = 4;
//! MBENC LCU32 kernel BTI structure
struct MBENC_LCU32_BTI
{
uint32_t Combined1DSurIndexMF1[MAX_MULTI_FRAME_NUMBER];
uint32_t Combined1DSurIndexMF2[MAX_MULTI_FRAME_NUMBER];
uint32_t VMEInterPredictionSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t SrcSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t SrcReconSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t CURecordSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t PAKObjectSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t CUPacketSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t SWScoreBoardSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t QPCU16SurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t LCULevelDataSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t TemporalMVSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t HmeDataSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t HEVCCnstLutSurfIndex;
uint32_t LoadBalenceSurfIndex;
uint32_t ReservedBTI0;
uint32_t ReservedBTI1;
uint32_t DebugSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
};
using PMBENC_LCU32_BTI = MBENC_LCU32_BTI*;
//! MBENC LCU64 kernel BTI structure
struct MBENC_LCU64_BTI
{
uint32_t Combined1DSurIndexMF1[MAX_MULTI_FRAME_NUMBER];
uint32_t Combined1DSurIndexMF2[MAX_MULTI_FRAME_NUMBER];
uint32_t VMEInterPredictionSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t SrcSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t SrcReconSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t CURecordSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t PAKObjectSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t CUPacketSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t SWScoreBoardSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t QPCU16SurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t LCULevelDataSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t TemporalMVSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t HmeDataSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t VME2XInterPredictionSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
uint32_t HEVCCnstLutSurfIndex;
uint32_t LoadBalenceSurfIndex;
uint32_t DebugSurfIndexMF[MAX_MULTI_FRAME_NUMBER];
};
using PMBENC_LCU64_BTI = MBENC_LCU64_BTI*;
struct MBENC_COMBINED_BTI
{
MBENC_COMBINED_BTI()
{
MOS_ZeroMemory(this, sizeof(*this));
}
union
{
MBENC_LCU32_BTI BTI_LCU32;
MBENC_LCU64_BTI BTI_LCU64;
};
};
//! BRC Init/Reset kernel Curbe structure
struct BRC_INITRESET_CURBE
{
// uint32_t 0
uint32_t DW0_ProfileLevelMaxFrame : MOS_BITFIELD_RANGE(0, 31);
// uint32_t 1
uint32_t DW1_InitBufFull : MOS_BITFIELD_RANGE(0, 31);
// uint32_t 2
uint32_t DW2_BufSize : MOS_BITFIELD_RANGE(0, 31);
// uint32_t 3
uint32_t DW3_TargetBitRate : MOS_BITFIELD_RANGE(0, 31);
// uint32_t 4
uint32_t DW4_MaximumBitRate : MOS_BITFIELD_RANGE(0, 31);
// uint32_t 5
uint32_t DW5_MinimumBitRate : MOS_BITFIELD_RANGE(0, 31);
// uint32_t 6
uint32_t DW6_FrameRateM : MOS_BITFIELD_RANGE(0, 31);
// uint32_t 7
uint32_t DW7_FrameRateD : MOS_BITFIELD_RANGE(0, 31);
// uint32_t 8
uint32_t DW8_BRCFlag : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW8_BRCGopP : MOS_BITFIELD_RANGE(16, 31);
// uint32_t 9
uint32_t DW9_BRCGopB : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW9_FrameWidth : MOS_BITFIELD_RANGE(16, 31);
// uint32_t 10
uint32_t DW10_FrameHeight : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW10_AVBRAccuracy : MOS_BITFIELD_RANGE(16, 31);
// uint32_t 11
uint32_t DW11_AVBRConvergence : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW11_MinimumQP : MOS_BITFIELD_RANGE(16, 31);
// uint32_t 12
uint32_t DW12_MaximumQP : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW12_NumberSlice : MOS_BITFIELD_RANGE(16, 31);
// uint32_t 13
uint32_t DW13_Reserved_0 : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW13_BRCGopB1 : MOS_BITFIELD_RANGE(16, 31);
// uint32_t 14
uint32_t DW14_BRCGopB2 : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW14_MaxBRCLevel : MOS_BITFIELD_RANGE(16, 31);
// uint32_t 15
uint32_t DW15_LongTermInterval : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW15_Reserved_0 : MOS_BITFIELD_RANGE(16, 31);
// uint32_t 16
uint32_t DW16_InstantRateThreshold0_Pframe : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW16_InstantRateThreshold1_Pframe : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW16_InstantRateThreshold2_Pframe : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW16_InstantRateThreshold3_Pframe : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 17
uint32_t DW17_InstantRateThreshold0_Bframe : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW17_InstantRateThreshold1_Bframe : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW17_InstantRateThreshold2_Bframe : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW17_InstantRateThreshold3_Bframe : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 18
uint32_t DW18_InstantRateThreshold0_Iframe : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW18_InstantRateThreshold1_Iframe : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW18_InstantRateThreshold2_Iframe : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW18_InstantRateThreshold3_Iframe : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 19
uint32_t DW19_DeviationThreshold0_PBframe : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW19_DeviationThreshold1_PBframe : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW19_DeviationThreshold2_PBframe : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW19_DeviationThreshold3_PBframe : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 20
uint32_t DW20_DeviationThreshold4_PBframe : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW20_DeviationThreshold5_PBframe : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW20_DeviationThreshold6_PBframe : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW20_DeviationThreshold7_PBframe : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 21
uint32_t DW21_DeviationThreshold0_VBRcontrol : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW21_DeviationThreshold1_VBRcontrol : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW21_DeviationThreshold2_VBRcontrol : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW21_DeviationThreshold3_VBRcontrol : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 22
uint32_t DW22_DeviationThreshold4_VBRcontrol : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW22_DeviationThreshold5_VBRcontrol : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW22_DeviationThreshold6_VBRcontrol : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW22_DeviationThreshold7_VBRcontrol : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 23
uint32_t DW23_DeviationThreshold0_Iframe : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW23_DeviationThreshold1_Iframe : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW23_DeviationThreshold2_Iframe : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW23_DeviationThreshold3_Iframe : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 24
uint32_t DW24_DeviationThreshold4_Iframe : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW24_DeviationThreshold5_Iframe : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW24_DeviationThreshold6_Iframe : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW24_DeviationThreshold7_Iframe : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 25
uint32_t DW25_ACQPBuffer : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW25_IntraSADTransform : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW25_Log2MaxCuSize : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW25_SlidingWindowSize : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 26
uint32_t DW26_BGOPSize : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW26_RandomAccess : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW26_Reserved_0 : MOS_BITFIELD_RANGE(16, 31);
// uint32_t 27
uint32_t DW27_Reserved_0 : MOS_BITFIELD_RANGE(0, 31);
// uint32_t 28
uint32_t DW28_Reserved_0 : MOS_BITFIELD_RANGE(0, 31);
// uint32_t 29
uint32_t DW29_Reserved_0 : MOS_BITFIELD_RANGE(0, 31);
// uint32_t 30
uint32_t DW30_Reserved_0 : MOS_BITFIELD_RANGE(0, 31);
// uint32_t 31
uint32_t DW31_Reserved_0 : MOS_BITFIELD_RANGE(0, 31);
};
C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(BRC_INITRESET_CURBE)) == 32);
using PBRC_INITRESET_CURBE = BRC_INITRESET_CURBE*;
//! BRC Update kernel Curbe structure
struct BRCUPDATE_CURBE
{
// uint32_t 0
uint32_t DW0_TargetSize : MOS_BITFIELD_RANGE(0, 31);
// uint32_t 1
uint32_t DW1_FrameNumber : MOS_BITFIELD_RANGE(0, 31);
// uint32_t 2
uint32_t DW2_PictureHeaderSize : MOS_BITFIELD_RANGE(0, 31);
// uint32_t 3
uint32_t DW3_StartGAdjFrame0 : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW3_StartGAdjFrame1 : MOS_BITFIELD_RANGE(16, 31);
// uint32_t 4
uint32_t DW4_StartGAdjFrame2 : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW4_StartGAdjFrame3 : MOS_BITFIELD_RANGE(16, 31);
// uint32_t 5
uint32_t DW5_TargetSize_Flag : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW5_Reserved_0 : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW5_MaxNumPAKs : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW5_CurrFrameBrcLevel : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 6
uint32_t DW6_NumSkippedFrames : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW6_CqpValue : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW6_ROIEnable : MOS_BITFIELD_RANGE(16, 16);
uint32_t DW6_BRCROIEnable : MOS_BITFIELD_RANGE(17, 17);
uint32_t DW6_LowDelayEnable : MOS_BITFIELD_RANGE(18, 18);
uint32_t DW6_Reserved1 : MOS_BITFIELD_RANGE(19, 19);
uint32_t DW6_SlidingWindowEnable : MOS_BITFIELD_RANGE(20, 20);
uint32_t DW6_Reserved2 : MOS_BITFIELD_RANGE(21, 23);
uint32_t DW6_RoiRatio : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 7
uint32_t DW7_Reserved_0 : MOS_BITFIELD_RANGE(0, 15);
uint32_t DW7_FrameMinQP : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW7_FrameMaxQP : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 8
uint32_t DW8_StartGlobalAdjustMult0 : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW8_StartGlobalAdjustMult1 : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW8_StartGlobalAdjustMult2 : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW8_StartGlobalAdjustMult3 : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 9
uint32_t DW9_StartGlobalAdjustMult4 : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW9_StartGlobalAdjustDivd0 : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW9_StartGlobalAdjustDivd1 : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW9_StartGlobalAdjustDivd2 : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 10
uint32_t DW10_StartGlobalAdjustDivd3 : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW10_StartGlobalAdjustDivd4 : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW10_QPThreshold0 : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW10_QPThreshold1 : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 11
uint32_t DW11_QPThreshold2 : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW11_QPThreshold3 : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW11_gRateRatioThreshold0 : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW11_gRateRatioThreshold1 : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 12
uint32_t DW12_gRateRatioThreshold2 : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW12_gRateRatioThreshold3 : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW12_gRateRatioThreshold4 : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW12_gRateRatioThreshold5 : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 13
uint32_t DW13_gRateRatioThreshold6 : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW13_gRateRatioThreshold7 : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW13_gRateRatioThreshold8 : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW13_gRateRatioThreshold9 : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 14
uint32_t DW14_gRateRatioThreshold10 : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW14_gRateRatioThreshold11 : MOS_BITFIELD_RANGE(8, 15);
uint32_t DW14_gRateRatioThreshold12 : MOS_BITFIELD_RANGE(16, 23);
uint32_t DW14_ParallelMode : MOS_BITFIELD_RANGE(24, 31);
// uint32_t 15
uint32_t DW15_SizeOfSkippedFrames : MOS_BITFIELD_RANGE(0, 31);
// uint32_t 16
uint32_t DW16_UserMaxFrameSize : MOS_BITFIELD_RANGE(0, 31);
// uint32_t 17
uint32_t DW17_LongTerm_Current : MOS_BITFIELD_RANGE(0, 7);
uint32_t DW17_Reserved_0 : MOS_BITFIELD_RANGE(8, 31);
// uint32_t 18 - 23 reserved
uint32_t DW18_Reserved_0 : MOS_BITFIELD_RANGE(0, 31);
uint32_t DW19_Reserved_0 : MOS_BITFIELD_RANGE(0, 31);
uint32_t DW20_Reserved_0 : MOS_BITFIELD_RANGE(0, 31);
uint32_t DW21_Reserved_0 : MOS_BITFIELD_RANGE(0, 31);
uint32_t DW22_Reserved_0 : MOS_BITFIELD_RANGE(0, 31);
uint32_t DW23_Reserved_0 : MOS_BITFIELD_RANGE(0, 31);
};
C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(BRCUPDATE_CURBE)) == 24);
using PBRCUPDATE_CURBE = BRCUPDATE_CURBE*;
//! LCU level data structure
struct LCU_LEVEL_DATA
{
uint16_t SliceStartLcuIndex;
uint16_t SliceEndLcuIndex;
uint16_t TileId;
uint16_t SliceId;
uint16_t TileStartCoordinateX;
uint16_t TileStartCoordinateY;
uint16_t TileEndCoordinateX;
uint16_t TileEndCoordinateY;
};
C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(LCU_LEVEL_DATA)) == 4);
using PLCU_LEVEL_DATA = LCU_LEVEL_DATA*;
//! Concurrent thread group data structure
struct CONCURRENT_THREAD_GROUP_DATA
{
uint16_t CurrSliceStartLcuX;
uint16_t CurrSliceStartLcuY;
uint16_t CurrSliceEndLcuX;
uint16_t CurrSliceEndLcuY;
uint16_t CurrTgStartLcuX;
uint16_t CurrTgStartLcuY;
uint16_t CurrTgEndLcuX;
uint16_t CurrTgEndLcuY;
uint16_t Reserved[24];
};
C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CONCURRENT_THREAD_GROUP_DATA)) == 16);
using PCONCURRENT_THREAD_GROUP_DATA = CONCURRENT_THREAD_GROUP_DATA*;
struct MBENC_CURBE
{
MBENC_CURBE()
{
MOS_SecureMemcpy(this, sizeof(*this), m_mbencCurbeInit, sizeof(m_mbencCurbeInit));
}
//R1.0 //DW0
union
{
uint32_t R1_0;
struct
{
uint32_t FrameWidthInSamples : 16;
uint32_t FrameHeightInSamples : 16;
};
};
//R1.1 //DW1
union
{
uint32_t R1_1;
struct
{
uint32_t Log2MaxCUSize : 4;
uint32_t Log2MinCUSize : 4;
uint32_t Log2MaxTUSize : 4;
uint32_t Log2MinTUSize : 4;
uint32_t MaxNumIMESearchCenter : 3;
uint32_t MaxIntraRdeIter : 3;
uint32_t ROIEnable : 1;
uint32_t QPType : 2;
uint32_t MaxTransformDepthInter : 2; //<= Log2TUMaxDepthInter
uint32_t MaxTransformDepthIntra : 2; //<= Log2TUMaxDepthIntra
uint32_t Log2ParallelMergeLevel : 3;
};
};
//R1.2 //DW2
union
{
uint32_t R1_2;
struct
{
uint32_t CornerNeighborPixel : 8;
uint32_t IntraNeighborAvailFlags : 6;
uint32_t ChromaFormatType : 2;
uint32_t SubPelMode : 2; //Unin R0.3[16:17] SubPelMode
uint32_t IntraSpotCheck : 2;
uint32_t InterSADMeasure : 2; //Unin R0.3[20:21] InterSADMeasure
uint32_t IntraSADMeasure : 2; //Unin R0.3[22:23] IntraSADMeasureAdj
uint32_t IntraPrediction : 3; //UninR0.1 LumaIntraPartMask
uint32_t RefIDCostMode : 1; //UninR0.1[22] RefIDCostMode
uint32_t TUBasedCostSetting : 3;
uint32_t MBZ_1_2_1 : 1;
};
};
//R1.3 //DW3
union
{
uint32_t R1_3;
struct
{ //UniversalInputSegmentPhase0_2: DW R1.0
uint32_t ExplictModeEn : 1; // [0]
uint32_t AdaptiveEn : 1; // [1] ImageState.AdaptiveEn
uint32_t MBZ_1_3_1 : 3; // [4:2]
uint32_t EarlyImeSuccessEn : 1; // [5] imageState.EarlyImeSuccessEn
uint32_t IntraSpeedMode : 1; // [6]
uint32_t IMECostCentersSel : 1; // [7] L0/L1
uint32_t RDEQuantRoundValue : 8; // [15:8] 0
uint32_t IMERefWindowSize : 2; // [17:16] m_ImageState.ImeRefWindowSize
uint32_t IntraComputeType : 1; // [18] 0
uint32_t Depth0IntraPredition : 1; // [19] 0
uint32_t TUDepthControl : 2; // [21:20]
uint32_t IntraTuRecFeedbackDisable : 1; // [22]
uint32_t MergeListBiDisable : 1; // [23]
uint32_t EarlyImeStop : 8; // [31:24] imageState->EarlyImeStopThres
};
};
//R1.4 //DW4
union
{
uint32_t R1_4;
struct
{
uint32_t FrameQP : 7;
uint32_t FrameQPSign : 1;
uint32_t ConcurrentGroupNum : 8;
uint32_t NumofUnitInWaveFront : 16;
};
};
//R1.5 //DW5
union
{
uint32_t R1_5;
struct
{
uint32_t LoadBalenceEnable : 1;
uint32_t NumberofMultiFrame : 3;
uint32_t MBZ_1_4_1 : 4;
uint32_t Degree45 : 1;
uint32_t Break12Dependency : 1;
uint32_t Fake32Enable : 1;
uint32_t MBZ_1_4_2 : 5;
uint32_t ThreadNumber : 8;
uint32_t MBZ_1_4_3 : 8;
};
};
//R1.6 - R2.7 //DW6 - DW15
uint32_t Reserved1[10];
//R3.0 //DW16
union
{
uint32_t R3_0;
struct
{
uint32_t Pic_init_qp_B : 8;
uint32_t Pic_init_qp_P : 8;
uint32_t Pic_init_qp_I : 8;
uint32_t MBZ_3_0_0 : 8;
};
};
//R3.1 //DW17
union
{
uint32_t R3_1;
struct
{
uint32_t MBZ_3_1_0 : 16;
uint32_t NumofRowTile : 8;
uint32_t NumofColumnTile : 8;
};
};
//R3.2 //DW18
union
{
uint32_t R3_2;
struct
{
uint32_t TransquantBypassEnableFlag : 1; //<= EnableTransquantBypass (need in Pak data setup)
uint32_t PCMEnabledFlag : 1; //<= EnableIPCM
uint32_t MBZ_3_2_0 : 2; //reserved
uint32_t CuQpDeltaEnabledFlag : 1; //<= CuQpDeltaEnabledFlag
uint32_t Stepping : 2;
uint32_t WaveFrontSplitsEnable : 1;
uint32_t HMEFlag : 2;
uint32_t SuperHME : 1;
uint32_t UltraHME : 1;
uint32_t MBZ_3_2_2 : 4; //reserved
uint32_t Cu64SkipCheckOnly : 1;
uint32_t EnableCu64Check : 1;
uint32_t Cu642Nx2NCheckOnly : 1;
uint32_t EnableCu64AmpCheck : 1;
uint32_t MBZ_3_2_3 : 1; //reserved
uint32_t DisablePIntra : 1;
uint32_t DisableIntraTURec : 1;
uint32_t InheritIntraModeFromTU0 : 1;
uint32_t MBZ_3_2_4 : 3; //reserved
uint32_t CostScalingForRA : 1;
uint32_t DisableIntraNxN : 1;
uint32_t MBZ_3_2_5 : 3; //reserved
};
};
//R3.3 //DW19
union
{
uint32_t R3_3;
struct
{
uint32_t MaxRefIdxL0 : 8;
uint32_t MaxRefIdxL1 : 8;
uint32_t MaxBRefIdxL0 : 8;
uint32_t MBZ_3_3_0 : 8;
};
};
//R3.4 //DW20
union
{
uint32_t R3_4;
struct
{
uint32_t SkipEarlyTermination : 2;
uint32_t SkipEarlyTermSize : 2;
uint32_t Dynamic64Enable : 2;
uint32_t Dynamic64Order : 2;
uint32_t Dynamic64Th : 4;
uint32_t DynamicOrderTh : 4;
uint32_t PerBFrameQPOffset : 8;
uint32_t IncreaseExitThresh : 4;
uint32_t Dynamic64Min32 : 2;
uint32_t MBZ_3_4_0 : 1; //reserved
uint32_t LastFrameIsIntra : 1;
};
};
//R3.5 //DW21
union
{
uint32_t R3_5;
struct
{
uint32_t LenSP : 8; //Unin R1.2[16:23] LenSP
uint32_t MaxNumSU : 8; //Unin R1.2[24:31] MaxNumSU
uint32_t MBZ_3_5_1 : 16;
};
};
//R3.6 //DW22
union
{
uint32_t R3_6;
struct
{
uint32_t CostTableIndex : 8;
uint32_t MBZ_3_6_1 : 24;
};
};
//R3.7 //DW23
union
{
uint32_t R3_7;
struct
{
uint32_t SliceType : 2;
uint32_t TemporalMvpEnableFlag : 1; //<= EnableTemporalMvp
uint32_t CollocatedFromL0Flag : 1;
uint32_t theSameRefList : 1;
uint32_t IsLowDelay : 1;
uint32_t DisableTemporal16and8 : 1;
uint32_t MBZ_3_7_1 : 1;
uint32_t MaxNumMergeCand : 8;
uint32_t NumRefIdxL0 : 8;
uint32_t NumRefIdxL1 : 8;
};
};
//R4.0 //DW24
union
{
uint32_t R4_0;
struct
{
uint32_t FwdPocNumber_L0_mTb_0 : 8;
uint32_t BwdPocNumber_L1_mTb_0 : 8;
uint32_t FwdPocNumber_L0_mTb_1 : 8;
uint32_t BwdPocNumber_L1_mTb_1 : 8;
};
};
//R4.1 //DW25
union
{
uint32_t R4_1;
struct
{
uint32_t FwdPocNumber_L0_mTb_2 : 8;
uint32_t BwdPocNumber_L1_mTb_2 : 8;
uint32_t FwdPocNumber_L0_mTb_3 : 8;
uint32_t BwdPocNumber_L1_mTb_3 : 8;
};
};
//R4.2 //DW26
union
{
uint32_t R4_2;
struct
{
uint32_t FwdPocNumber_L0_mTb_4 : 8;
uint32_t BwdPocNumber_L1_mTb_4 : 8;
uint32_t FwdPocNumber_L0_mTb_5 : 8;
uint32_t BwdPocNumber_L1_mTb_5 : 8;
};
};
//R4.3 //DW27
union
{
uint32_t R4_3;
struct
{
uint32_t FwdPocNumber_L0_mTb_6 : 8;
uint32_t BwdPocNumber_L1_mTb_6 : 8;
uint32_t FwdPocNumber_L0_mTb_7 : 8;
uint32_t BwdPocNumber_L1_mTb_7 : 8;
};
};
//R4.4 //DW28
union
{
uint32_t R4_4;
struct
{
uint32_t LongTermReferenceFlags_L0 : 16;
uint32_t LongTermReferenceFlags_L1 : 16;
};
};
//R4.5 //DW29
union
{
uint32_t R4_5;
struct
{
uint32_t RefFrameWinWidth : 16;
uint32_t RefFrameWinHeight : 16;
};
};
//R4.6 //DW30
union
{
uint32_t R4_6;
struct
{
uint32_t RoundingInter : 8;
uint32_t RoundingIntra : 8;
uint32_t MaxThreadWidth : 8;
uint32_t MaxThreadHeight : 8;
};
};
//R4.7 - R5.7
uint32_t Reserved2[9];
};
static uint32_t const hevcCurbeBufferConstSize = 256;
C_ASSERT(hevcCurbeBufferConstSize > sizeof(MBENC_CURBE));
static const uint32_t maxColorBitSupport = 256;
struct CONCURRENT_THREAD_GROUP_DATA_BUF
{
CONCURRENT_THREAD_GROUP_DATA item[maxColorBitSupport];
};
struct MBENC_COMBINED_BUFFER1
{
MBENC_COMBINED_BUFFER1()
{
MOS_ZeroMemory(&(this->concurrent), sizeof(this->concurrent));
}
union
{
MBENC_CURBE Curbe;
uint8_t Data[hevcCurbeBufferConstSize];
};
CONCURRENT_THREAD_GROUP_DATA_BUF concurrent;
};
using PMBENC_COMBINED_BUFFER1 = MBENC_COMBINED_BUFFER1*;
static const uint32_t HEVC_HISTORY_BUF_CONST_SIZE = 64;
static const uint32_t HEVC_FRAMEBRC_BUF_CONST_SIZE = 1024;
struct MBENC_COMBINED_BUFFER2
{
uint8_t ucBrcCombinedEncBuffer[HEVC_FRAMEBRC_BUF_CONST_SIZE];
uint8_t ucHistoryInBuffer[HEVC_HISTORY_BUF_CONST_SIZE];
};
using PMBENC_COMBINED_BUFFER2 = MBENC_COMBINED_BUFFER2*;
struct CODECHAL_HEVC_VIRTUAL_ENGINE_OVERRIDE
{
union {
uint8_t VdBox[MOS_MAX_ENGINE_INSTANCE_PER_CLASS];
uint64_t Value;
};
};
//! \endcond
static const uint8_t m_maxNumVmeL0Ref = 4; //!< Maximum number of L0 references
static const uint8_t m_maxNumVmeL1Ref = 4; //!< Maximum number of L1 references
static const uint16_t m_maxThreadsPerLcuB = 8; //!< Maximum number of threads per LCU B
static const uint16_t m_minThreadsPerLcuB = 3; //!< Minimum number of threads per LCU B
static const uint8_t m_maxMultiFrames = 4; //!< Maximum number of supported multi-frames
static const uint8_t m_maxMfeSurfaces = 32; //!< Maximum number of surfaces per mfe stream
static const uint32_t m_encConstantDataLutSize = 81920; //!< Constant data LUT size in ints for B-kernel
static const uint32_t m_brcBufferSize = 1024; //!< Size of the BRC buffer for Enc kernel
static const uint32_t m_debugSurfaceSize = (8192 * 1024); //!< 8MB for the debug surface
static const uint32_t m_maxThreadGprs = 256; //!< Maximum number of thread groups
static const uint32_t m_brcLambdaModeCostTableSize = 416; //!< Size in DWs of Lambda Mode cost table for BRC
static const uint32_t m_mvdistSummationSurfSize = 32; //!< Size of MV distortion summation surface
static const uint8_t m_sumMVThreshold = 16;
uint8_t m_hevcThreadTaskDataNum = 2;
uint32_t m_maxWavefrontsforTU1 = 2;
uint32_t m_maxWavefrontsforTU4 = 2;
static const uint32_t m_loadBalanceSize = (256 * 16); //!< Load balance size used for load balance array.
uint32_t m_alignReconFactor = 1;
uint32_t m_threadMapSize = (256 * 16); //!< Thread map surface size will be updated depending on various gen
static const uint8_t m_meMethod[NUM_TARGET_USAGE_MODES]; //!< ME method
static const uint8_t m_aStep = 1; //!< A Stepping
static const uint32_t m_encLcu32ConstantDataLut[m_encConstantDataLutSize/sizeof(uint32_t)]; //!< Constant data table for B kernel
static const uint32_t m_encLcu64ConstantDataLut[m_encConstantDataLutSize/sizeof(uint32_t)]; //!< Constant data table for B kernel
static const uint32_t m_brcLcu32x32LambdaModeCostInit[m_brcLambdaModeCostTableSize]; //!< Lambda mode cost table for BRC LCU32x32
static const uint32_t m_brcLcu64x64LambdaModeCostInit[m_brcLambdaModeCostTableSize]; //!< Lambda mode cost table for BRC LCU64x64
static const uint32_t m_mbencCurbeInit[40]; //!< Initialization data for MBENC B kernel
static const BRC_INITRESET_CURBE m_brcInitResetCurbeInit; //!< Initialization data for BRC Init/Reset kernel
static const BRCUPDATE_CURBE m_brcUpdateCurbeInit; //!< Initialization data for BRC update kernel
static const uint8_t m_tuSettings[TotalTuParams][3]; //!< Table for TU based settings for different params
static const double m_modeBits[2][46][3]; //!< Mode bits LUT based on LCUType/Mode/SliceType
static const double m_modeBitsScale[46][3]; //!< Mode bits LUT based on [mode][SliceType]
MOS_SURFACE m_currPicWithReconBoundaryPix; //!< Current Picture with Reconstructed boundary pixels
MOS_SURFACE m_lcuLevelInputDataSurface[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; //!< In Gen11 Lculevel Data is a 2D surface instead of Buffer
MOS_SURFACE m_encoderHistoryInputBuffer; //!< Encoder History Input Data
MOS_SURFACE m_encoderHistoryOutputBuffer; //!< Encoder History Output Data
MOS_SURFACE m_intermediateCuRecordSurfaceLcu32; //!< Intermediate CU Record surface for I and B kernel
MOS_SURFACE m_scratchSurface; //!< Scratch surface for I-kernel
MOS_SURFACE m_16x16QpInputData; //!< CU 16x16 QP data input surface
MOS_RESOURCE m_SAORowStoreBuffer = {}; //!< SAO RowStore buffer
CODECHAL_ENCODE_BUFFER m_debugSurface[4]; //!< Debug surface used in MBENC kernels
CODECHAL_ENCODE_BUFFER m_encConstantTableForB; //!< Enc constant table for B LCU32
CODECHAL_ENCODE_BUFFER m_mvAndDistortionSumSurface; //!< Mv and Distortion summation surface
PMHW_VDBOX_HCP_TILE_CODING_PARAMS_G12 m_tileParams = nullptr; //!< Pointer to the Tile params
PCODECHAL_ENCODE_SCALABILITY_STATE m_scalabilityState = nullptr; //!< Scalability state
bool m_colorBitMfeEnabled = false; //!< enable color bit for MFE: combine frames into one mbenc kernel
bool m_multiWalkerEnabled = false; //!< enable multiple hw walkder
bool m_useMdf = false; //!< Use MDF for MBEnc kernels.
bool m_enableTileStitchByHW = false; //!< Enable HW to stitch commands in scalable mode
bool m_enableHWSemaphore = false; //!< Enable HW semaphore
bool m_weightedPredictionSupported = false; //!< Enable WP support
bool m_useWeightedSurfaceForL0 = false; //!< Flag indicating if L0 Ref using weighted reference frame
bool m_useWeightedSurfaceForL1 = false; //!< Flag indicating if L1 Ref using weighted reference frame
bool m_sseEnabled = false; //!< Flag indicating if SSE is enabled in PAK
bool m_degree45Needed = false; //!< Flag indicating if 45 degree dispatch pattern is used
bool m_pakPiplStrmOutEnable = false;
bool m_loadKernelInput = false;
char m_loadKernelInputDataFolder[MOS_USER_CONTROL_MAX_DATA_SIZE] = {0}; //!< kernel input load from data folder name
bool m_HierchGopBRCEnabled = false; //!< Flag indicating if hierarchical Gop is enabled in BRC
uint16_t m_totalNumThreadsPerLcu = 0; //!< Total number of threads per LCU
uint8_t m_modeCostRde[42] = { 0 }; //!< RDE cost
uint8_t m_modeCostCre[16] = { 0 }; //!< CRE cost
uint32_t m_lambdaRD = 0; //!< Lambda value to multiply the RD costs
uint8_t m_numberEncKernelSubThread = m_hevcThreadTaskDataNum;
uint32_t m_numberConcurrentGroup = MAX_CONCURRENT_GROUP; // can dividie one picture into several groups
uint32_t m_numWavefrontInOneRegion = 0;
uint16_t m_lastPictureCodingType = I_TYPE;
uint8_t* m_swScoreboard = nullptr;
bool m_useSwInitScoreboard = false;
CODECHAL_ENCODE_BUFFER m_encBCombinedBuffer1[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM];
CODECHAL_ENCODE_BUFFER m_encBCombinedBuffer2[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM];
PCODECHAL_ENCODE_BUFFER m_brcInputForEncKernelBuffer = nullptr;
uint8_t m_lastRecycledBufIdx = CODECHAL_ENCODE_RECYCLED_BUFFER_NUM - 1;
uint32_t m_historyOutBufferSize = 0;
uint32_t m_historyOutBufferOffset = 0;
uint32_t m_threadTaskBufferSize = 0;
uint32_t m_threadTaskBufferOffset = 0;
bool m_initEncConstTable = true;
bool m_enableBrcLTR = 1; //!< flag to enable long term reference BRC feature.
bool m_isFrameLTR = 0; //!<flag to check if current frame is set as long term reference
uint32_t m_ltrInterval = 0; //!< long term reference interval
CodechalKernelIntraDist *m_intraDistKernel = nullptr;
CodechalEncodeSwScoreboardG12 *m_swScoreboardState = nullptr; //!< pointer to SW scoreboard ini state.
CodecHalHevcBrcG12* m_hevcBrcG12 = nullptr;
// scalability
unsigned char m_numPipe = 1; //!< Number of pipes
unsigned char m_numPassesInOnePipe = 1; //!< Number of PAK passes in one pipe
CODECHAL_ENCODE_BUFFER m_resPakSliceLevelStreamoutData; //!< Surface for slice level stream out data from PAK
CODECHAL_HEVC_VIRTUAL_ENGINE_OVERRIDE m_kmdVeOveride; //!< KMD override virtual engine index
uint32_t m_numTiles = 1; //!< Number of tiles
CODECHAL_ENCODE_BUFFER m_resHcpScalabilitySyncBuffer; //!< Hcp sync buffer for scalability
CODECHAL_ENCODE_BUFFER m_resTileBasedStatisticsBuffer[CODECHAL_NUM_UNCOMPRESSED_SURFACE_HEVC];
CODECHAL_ENCODE_BUFFER m_resHuCPakAggregatedFrameStatsBuffer;
CODECHAL_ENCODE_BUFFER m_tileRecordBuffer[CODECHAL_NUM_UNCOMPRESSED_SURFACE_HEVC];
HEVC_TILE_STATS_INFO m_hevcTileStatsOffset = {}; //!< Page aligned offsets used to program HCP / VDEnc pipe and HuC PAK Integration kernel input
HEVC_TILE_STATS_INFO m_hevcFrameStatsOffset = {}; //!< Page aligned offsets used to program HuC PAK Integration kernel output, HuC BRC kernel input
HEVC_TILE_STATS_INFO m_hevcStatsSize = {}; //!< HEVC Statistics size
bool m_enableTestMediaReset = 0; //!< enable media reset test. driver will send cmd to make hang happens
bool m_forceScalability = false; //!< force scalability for resolution < 4K if other checking for scalability passed
bool m_enableFramePanicMode = true; //!< Flag to control frame panic feature
// HuC PAK stitch kernel
bool m_hucPakStitchEnabled = false; //!< HuC PAK stitch enabled flag
MOS_RESOURCE m_resHucPakStitchDmemBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM][CODECHAL_DP_MAX_NUM_BRC_PASSES]; //!< HuC Pak Integration Dmem data for each pass
MOS_RESOURCE m_resBrcDataBuffer; //!< Resource of bitrate control data buffer
MOS_RESOURCE m_resHucStitchDataBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM][CODECHAL_HEVC_MAX_NUM_BRC_PASSES]; // data buffer for huc input cmd generation
MHW_BATCH_BUFFER m_HucStitchCmdBatchBuffer = {}; //!< SLB for huc stitch cmd
// BRC panic mode
struct SkipFrameInfo
{
uint32_t numSlices = 0;
MOS_RESOURCE m_resMbCodeSkipFrameSurface; //!< PAK obj and CU records
}
m_skipFrameInfo;
// virtual engine
// virtual engine
bool m_useVirtualEngine = false; //!< Virtual engine enable flag
MOS_COMMAND_BUFFER m_veBatchBuffer[CODECHAL_NUM_UNCOMPRESSED_SURFACE_HEVC][CODECHAL_HEVC_MAX_NUM_HCP_PIPE][CODECHAL_HEVC_MAX_NUM_BRC_PASSES]; //!< Virtual engine batch buffers
MOS_COMMAND_BUFFER m_realCmdBuffer; //!< Virtual engine command buffer
uint32_t m_sizeOfVeBatchBuffer = 0; //!< Virtual engine batch buffer size
unsigned char m_virtualEngineBbIndex = 0; //!< Virtual engine batch buffer index
CODECHAL_ENCODE_BUFFER m_resBrcSemaphoreMem[CODECHAL_HEVC_MAX_NUM_HCP_PIPE]; //!< BRC HW semaphore
CODECHAL_ENCODE_BUFFER m_resBrcPakSemaphoreMem; //!< BRC PAK HW semaphore
MOS_RESOURCE m_resPipeStartSemaMem; //!< HW semaphore for scalability pipe start at the same time
MOS_RESOURCE m_resPipeCompleteSemaMem;
MOS_RESOURCE m_resDelayMinus = {};
uint32_t m_numDelay = 0;
// the following constant integers and tables are from the kernel for score board computation
static uint32_t const m_ct = 3;
static uint32_t const m_maxNumDependency = 32;
static uint32_t const m_numDependencyHorizontal = 1;
static uint32_t const m_numDependencyVertical = 1;
static uint32_t const m_numDependency45Degree = 2;
static uint32_t const m_numDependency26Degree = 3;
static uint32_t const m_numDependency45xDegree = 3 + (m_ct - 1);
static uint32_t const m_numDependency26xDegree = 4 + (m_ct - 1);
static uint32_t const m_numDependency45xDegreeAlt = 2;
static uint32_t const m_numDependency26xDegreeAlt = 3;
static uint32_t const m_numDependency45xVp9Degree = 4;
static uint32_t const m_numDependency26zDegree = 5;
static uint32_t const m_numDependency26ZigDegree = 6;
static uint32_t const m_numDependencyNone = 0;
static uint32_t const m_numDependencyCustom = 0;
static const char m_dxWavefrontHorizontal[m_maxNumDependency];
static const char m_dyWavefrontHorizontal[m_maxNumDependency];
static const char m_dxWavefrontVertical[m_maxNumDependency];
static const char m_dyWavefrontVertical[m_maxNumDependency];
static const char m_dxWavefront45Degree[m_maxNumDependency];
static const char m_dyWavefront45Degree[m_maxNumDependency];
static const char m_dxWavefront26Degree[m_maxNumDependency];
static const char m_dyWavefront26Degree[m_maxNumDependency];
static const char m_dxWavefront45xDegree[m_maxNumDependency];
static const char m_dyWavefront45xDegree[m_maxNumDependency];
static const char m_dxWavefront26xDegree[m_maxNumDependency];
static const char m_dyWavefront26xDegree[m_maxNumDependency];
static const char m_dxWavefront45xDegreeAlt[m_maxNumDependency];
static const char m_dyWavefront45xDegreeAlt[m_maxNumDependency];
static const char m_dxWavefront26xDegreeAlt[m_maxNumDependency];
static const char m_dyWavefront26xDegreeAlt[m_maxNumDependency];
static const char m_dxWavefront45xVp9Degree[m_maxNumDependency];
static const char m_dyWavefront45xVp9Degree[m_maxNumDependency];
static const char m_dxWavefront26zDegree[m_maxNumDependency];
static const char m_dyWavefront26zDegree[m_maxNumDependency];
static const char m_dxWavefront26ZigDegree[m_maxNumDependency];
static const char m_dyWavefront26ZigDegree[m_maxNumDependency];
static const char m_dxWavefrontNone[m_maxNumDependency];
static const char m_dyWavefrontNone[m_maxNumDependency];
static const char m_dxWavefrontCustom[m_maxNumDependency];
static const char m_dyWavefrontCustom[m_maxNumDependency];
//!
//! \brief Constructor
//!
CodechalEncHevcStateG12(CodechalHwInterface* hwInterface,
CodechalDebugInterface* debugInterface,
PCODECHAL_STANDARD_INFO standardInfo);
//!
//! \brief Copy constructor
//!
CodechalEncHevcStateG12(const CodechalEncHevcStateG12&) = delete;
//!
//! \brief Copy assignment operator
//!
CodechalEncHevcStateG12& operator=(const CodechalEncHevcStateG12&) = delete;
//!
//! \brief Destructor
//!
virtual ~CodechalEncHevcStateG12();
//!
//! \brief Entry to allocate and intialize the encode instance
//! \param [in] codecHalSettings
//! The settings to inialize the encode instance
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS Allocate(CodechalSetting * codecHalSettings) override;
//!
//! \brief Help function to get current pipe
//!
//! \return Current pipe value
//!
int GetCurrentPipe()
{
if (m_numPipe <= 1)
{
return 0;
}
return (int)(m_currPass) % (int)m_numPipe;
}
//!
//! \brief Help function to get current PAK pass
//!
//! \return Current PAK pass
//!
int GetCurrentPass() override
{
if (m_numPipe <= 1)
{
return m_currPass;
}
return (int)(m_currPass) / (int)m_numPipe;
}
//!
//! \brief Help function to check if current pipe is first pipe
//!
//! \return True if current pipe is first pipe, otherwise return false
//!
bool IsFirstPipe()
{
return GetCurrentPipe() == 0 ? true : false;
}
//!
//! \brief Help function to check if current pipe is last pipe
//!
//! \return True if current pipe is last pipe, otherwise return false
//!
bool IsLastPipe()
{
return GetCurrentPipe() == m_numPipe - 1 ? true : false;
}
//!
//! \brief Help function to check if current PAK pass is first pass
//!
//! \return True if current PAK pass is first pass, otherwise return false
//!
bool IsFirstPass() override
{
return GetCurrentPass() == 0 ? true : false;
}
//!
//! \brief Help function to check if current PAK pass is last pass
//!
//! \return True if current PAK pass is last pass, otherwise return false
//!
bool IsLastPass() override
{
return GetCurrentPass() == m_numPassesInOnePipe ? true : false;
}
//!
//! \brief Help function to check if current PAK pass is the panic mode pass
//!
//! \return True if current PAK pass is the panic mode pass, otherwise return false
//!
bool IsPanicModePass()
{
return GetCurrentPass() == CODECHAL_HEVC_MAX_NUM_BRC_PASSES ? true : false;
}
// inherited virtual functions
MOS_STATUS SetPictureStructs() override;
MOS_STATUS CalcScaledDimensions() override;
MOS_STATUS InitializePicture(const EncoderParams& params) override;
MOS_STATUS ExecutePictureLevel() override;
MOS_STATUS ExecuteSliceLevel() override;
MOS_STATUS Initialize(CodechalSetting * settings) override;
virtual MOS_STATUS InitKernelState() override;
virtual uint32_t GetMaxBtCount() override;
bool CheckSupportedFormat(PMOS_SURFACE surface) override;
MOS_STATUS EncodeKernelFunctions() override;
MOS_STATUS EncodeMeKernel() override;
virtual MOS_STATUS EncodeIntraDistKernel();
virtual MOS_STATUS AllocateEncResources() override;
virtual MOS_STATUS FreeEncResources() override;
MOS_STATUS AllocatePakResources() override;
MOS_STATUS FreePakResources() override;
virtual MOS_STATUS GetFrameBrcLevel() override;
void CreateMhwParams() override;
void GetMaxRefFrames(uint8_t& maxNumRef0, uint8_t& maxNumRef1) override;
void SetHcpSliceStateCommonParams(MHW_VDBOX_HEVC_SLICE_STATE& sliceStateParams) override;
MOS_STATUS PlatformCapabilityCheck() override;
MOS_STATUS GetStatusReport(
EncodeStatus *encodeStatus,
EncodeStatusReport *encodeStatusReport) override;
MOS_STATUS SetRegionsHuCPakIntegrate(PMHW_VDBOX_HUC_VIRTUAL_ADDR_PARAMS virtualAddrParams);
MOS_STATUS SetDmemHuCPakIntegrate(PMHW_VDBOX_HUC_DMEM_STATE_PARAMS dmemParams);
MOS_STATUS SetRegionsHuCPakIntegrateCqp(PMHW_VDBOX_HUC_VIRTUAL_ADDR_PARAMS virtualAddrParams);
MOS_STATUS SetDmemHuCPakIntegrateCqp(PMHW_VDBOX_HUC_DMEM_STATE_PARAMS dmemParams);
MOS_STATUS ReadBrcPakStatisticsForScalability(PMOS_COMMAND_BUFFER cmdBuffer);
#if (_DEBUG || _RELEASE_INTERNAL)
MOS_STATUS ResetImgCtrlRegInPAKStatisticsBuffer(PMOS_COMMAND_BUFFER cmdBuffer);
#endif
MOS_STATUS GetCommandBuffer(PMOS_COMMAND_BUFFER cmdBuffer) override;
MOS_STATUS ReturnCommandBuffer(PMOS_COMMAND_BUFFER cmdBuffer) override;
MOS_STATUS SubmitCommandBuffer(
PMOS_COMMAND_BUFFER cmdBuffer,
bool nullRendering) override;
MOS_STATUS SetSliceStructs() override;
MOS_STATUS AllocateTileStatistics();
void SetHcpIndObjBaseAddrParams(MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS& indObjBaseAddrParams) override;
void SetHcpPipeBufAddrParams(MHW_VDBOX_PIPE_BUF_ADDR_PARAMS& pipeBufAddrParams) override;
void SetHcpPicStateParams(MHW_VDBOX_HEVC_PIC_STATE& picStateParams) override;
MOS_STATUS ReadSseStatistics(PMOS_COMMAND_BUFFER cmdBuffer) override;
MOS_STATUS SetGpuCtxCreatOption() override;
//!
//! \brief Decide number of pipes used for encoding
//! \details called inside PlatformCapabilityCheck
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS DecideEncodingPipeNumber();
//!
//! \brief Get U62 Mode bits
//!
//! \return 8 bit mode cost for RDE
//!
inline uint8_t GetU62ModeBits(float mcost)
{
return (uint8_t)(mcost * 4 + 0.5);
}
//!
//! \brief Update surface info for YUY2 input
//!
//! \param [in] surface
//! Reference to input surface
//! \param [in] is10Bit
//! Flag to indicate if 10 bit
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS UpdateYUY2SurfaceInfo(
MOS_SURFACE& surface,
bool is10Bit);
//!
//! \brief Allocate ME resources
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateMeResources();
//!
//! \brief Free ME resources
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS FreeMeResources();
//!
//! \brief Encode command at tile level
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS EncTileLevel();
//!
//! \brief Get encoder kernel header and kernel size
//!
//! \param [in] binary
//! Pointer to kernel binary
//! \param [in] operation
//! Enc kernel operation
//! \param [in] krnStateIdx
//! Kernel state index
//! \param [out] krnHeader
//! Pointer to kernel header
//! \param [out] krnSize
//! Pointer to kernel size
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
static MOS_STATUS GetKernelHeaderAndSize(
void* binary,
EncOperation operation,
uint32_t krnStateIdx,
void* krnHeader,
uint32_t* krnSize);
//!
//! \brief Get encoder kernel header and kernel size
//!
//! \param [in] encOperation
//! Specifies the media function type
//! \param [in] kernelParams
//! Pointer to kernel parameters
//! \param [in] idx
//! MbEnc/BRC kernel index
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetKernelParams(
EncOperation encOperation,
MHW_KERNEL_PARAM* kernelParams,
uint32_t idx);
//!
//! \brief Set Binding table for different kernelsge
//!
//! \param [in] encOperation
//! Specifies the media function type
//! \param [in] hevcEncBindingTable
//! Pointer to the binding table
//! \param [in] idx
//! MbEnc/BRC kernel index
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetBindingTable(
EncOperation encOperation,
PCODECHAL_ENCODE_BINDING_TABLE_GENERIC hevcEncBindingTable,
uint32_t idx);
//!
//! \brief Initialize MbEnc kernel state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS InitKernelStateMbEnc();
//!
//! \brief Initialize BRC kernel state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitKernelStateBrc();
//!
//! \brief Invoke BRC Init/Reset kernel
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS EncodeBrcInitResetKernel();
//!
//! \brief Send surfaces BRC Init/Reset kernel
//!
//! \param [in] cmdBuffer
//! Pointer to command buffer
//! \param [in] krnIdx
//! Index of the BRC kernel for which surfaces are being sent
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendBrcInitResetSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
CODECHAL_HEVC_BRC_KRNIDX krnIdx);
//!
//! \brief Setup Curbe for BRC Init/Reset kernel
//!
//! \param [in] brcKrnIdx
//! Index of the BRC kernel for which Curbe is setup
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetCurbeBrcInitReset(CODECHAL_HEVC_BRC_KRNIDX brcKrnIdx);
//!
//! \brief Invoke frame level BRC update kernel
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS EncodeBrcFrameUpdateKernel();
//!
//! \brief Send surfaces for BRC Frame Update kernel
//!
//! \param [in] cmdBuffer
//! Pointer to command buffer
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendBrcFrameUpdateSurfaces(PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Setup Curbe for BRC Update kernel
//!
//! \param [in] brcKrnIdx
//! Index of the BRC update kernel(frame or lcu) for which Curbe is setup
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetCurbeBrcUpdate(CODECHAL_HEVC_BRC_KRNIDX brcKrnIdx);
//!
//! \brief Invoke LCU level BRC update kernel
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS EncodeBrcLcuUpdateKernel();
//!
//! \brief Send surfaces for BRC LCU Update kernel
//!
//! \param [in] cmdBuffer
//! Pointer to command buffer
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SendBrcLcuUpdateSurfaces(PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Top level function for invoking MBenc kernel
//! \details I, B or LCU64_B MBEnc kernel, based on EncFunctionType
//! \param [in] encFunctionType
//! Specifies the media state type
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS EncodeMbEncKernel(CODECHAL_MEDIA_STATE_TYPE encFunctionType);
//!
//! \brief Send Surfaces for MbEnc I kernel
//!
//! \param [in] cmdBuffer
//! Pointer to command buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendMbEncSurfacesIKernel(PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Setup Curbe for MbEnc I kernel
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetCurbeMbEncIKernel();
//!
//! \brief Send Surfaces for MbEnc B kernel
//!
//! \param [in] cmdBuffer
//! Pointer to command buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendMbEncSurfacesBKernel(PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Setup Curbe for MbEnc B LCU32 and LCU64_32 Kernels
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetCurbeMbEncBKernel();
//!
//! \brief Generate LCU Level Data
//!
//! \param [in] lcuLevelInputDataSurfaceParam
//! input lcu surface
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS GenerateLcuLevelData(MOS_SURFACE &lcuLevelInputDataSurfaceParam);
//!
//! \brief Generate 'Skip frame' mbCodeSurface
//!
//! \param [in] skipframeInfo
//! skip frame surface
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS GenerateSkipFrameMbCodeSurface(SkipFrameInfo &skipframeInfo);
//!
//! \brief Convert from Y210 to Y210V format
//!
//! \param [in] source
//! Source surface
//! \param [out] target
//! Destination surface
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ConvertY210ToY210V(
PMOS_SURFACE source,
PMOS_SURFACE target);
//!
//! \brief Convert from P010 to P010V format
//!
//! \param [in] source
//! Source surface
//! \param [out] target
//! Destination surface
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ConvertP010ToP010V(
PMOS_SURFACE source,
PMOS_SURFACE target);
//!
//! \brief Convert from YUY2 to YUY2V format
//!
//! \param [in] source
//! Source surface
//! \param [out] target
//! Destination surface
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ConvertYUY2ToYUY2V(
PMOS_SURFACE source,
PMOS_SURFACE target);
//!
//! \brief Downscale input by 2X
//!
//! \param [in] source
//! Source surface
//! \param [out] target
//! Destination surface
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS DownScaling2X(
PMOS_SURFACE source,
PMOS_SURFACE target);
//!
//! \brief Load cost table
//!
//! \param [in] sliceType
//! Slice Type
//! \param [in] qp
//! QP value
//!
//! \return void
//!
void LoadCosts(uint8_t sliceType, uint8_t qp);
//!
//! \brief Prepare walker params for custom pattern thread dispatch
//!
//! \param [in] walkerParams
//! Pointer to HW walker params
//! \param [in] walkerCodecParams
//! Input params to program the HW walker
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS GetCustomDispatchPattern(
PMHW_WALKER_PARAMS walkerParams,
PCODECHAL_WALKER_CODEC_PARAMS walkerCodecParams);
//!
//! \brief Generate concurrent thread group data
//!
//! \param [in] concurrentThreadGroupData
//! reference to the concurrentThreadGroupData surface
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS GenerateConcurrentThreadGroupData(MOS_RESOURCE & concurrentThreadGroupData);
//!
//! \brief Load Pak command and CuRecord from file
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS LoadPakCommandAndCuRecordFromFile();
//!
//! \brief Load source surface and 2xDownScaled references from file
//!
//! \param [in] pRef2xSurface
//! reference surface to be dumped
//! \param [in] pSrc2xSurface
//! source surface to be dumped
//! \param [in] reflist
//! ref list, l0 or l1
//! \param [in] refIdx
//! ref index to the ref list
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS LoadSourceAndRef2xDSFromFile(PMOS_SURFACE pRef2xSurface, PMOS_SURFACE pSrc2xSurface, uint8_t reflist, uint8_t refIdx);
//!
//! \brief Re-calculate buffer size and offets during resolution reset
//!
//! \return void
//!
void ResizeBufferOffset();
//!
//! \brief Set HCP_SLICE_STATE parameters that are different at slice level
//!
//! \param [in, out] sliceState
//! HCP_SLICE_STATE parameters
//! \param [in] slcData
//! Pointer to CODEC_ENCODE_SLCDATA
//! \param [in] slcCount
//! Current slice index
//! \param [in] tileCodingParams
//! Pointer to TileCodingParams
//! \param [in] lastSliceInTile
//! Flag to indicate if slice is the last one in the tile
//! \param [in] idx
//! Index of the tile
//!
//! \return void
//!
void SetHcpSliceStateParams(
MHW_VDBOX_HEVC_SLICE_STATE& sliceState,
PCODEC_ENCODER_SLCDATA slcData,
uint16_t slcCount,
PMHW_VDBOX_HCP_TILE_CODING_PARAMS_G12 tileCodingParams,
bool lastSliceInTile,
uint32_t idx);
//!
//! \brief Set MFX_VIDEO_COPY commands for HW stitch in scalable mode
//!
//! \param [in] cmdBuffer
//! Pointer to the command buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetMfxVideoCopyCmdParams(
PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Setup BRC constant data
//!
//! \param [in, out] brcConstantData
//! Pointer to BRC constant data surface
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetupBrcConstantTable(PMOS_SURFACE brcConstantData);
//!
//! \brief Check whether Scalability is enabled or not,
//! Set number of VDBoxes accordingly
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS GetSystemPipeNumberCommon();
//!
//! \brief Set And Populate VE Hint parameters
//! \details Set Virtual Engine hint parameter and populate it to primary cmd buffer attributes
//! \param [in] cmdBuffer
//! Pointer to primary cmd buffer
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetAndPopulateVEHintParams(
PMOS_COMMAND_BUFFER cmdBuffer);
bool IsDegree45Needed();
virtual void DecideConcurrentGroupAndWaveFrontNumber();
virtual void InitSwScoreBoardParams(CodechalEncodeSwScoreboard::KernelParams & swScoreboardKernelParames);
MOS_STATUS UserFeatureKeyReport() override;
MOS_STATUS SetupSwScoreBoard(CodechalEncodeSwScoreboard::KernelParams *params);
void InitSWScoreboard(
uint8_t* scoreboard,
uint32_t scoreboardWidth,
uint32_t scoreboardHeight,
uint32_t dependencyPattern,
char childThreadNumber);
uint8_t PicCodingTypeToSliceType(uint16_t pictureCodingType);
MOS_STATUS InitMediaObjectWalker(
uint32_t threadSpaceWidth,
uint32_t threadSpaceHeight,
uint32_t colorCountMinusOne,
DependencyPattern dependencyPattern,
uint32_t childThreadNumber,
uint32_t localLoopExecCount,
MHW_WALKER_PARAMS& walkerParams);
void SetDependency(uint8_t &numDependencies,
char* scoreboardDeltaX,
char* scoreboardDeltaY,
uint32_t dependencyPattern,
char childThreadNumber);
//!
//! \brief Dump HuC based debug output buffers
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS DumpHucDebugOutputBuffers();
void SetHcpPipeModeSelectParams(MHW_VDBOX_PIPE_MODE_SELECT_PARAMS& pipeModeSelectParams) override;
MOS_STATUS AddHcpPipeModeSelectCmd(MOS_COMMAND_BUFFER* cmdBuffer) override;
MOS_STATUS AddHcpSurfaceStateCmds(MOS_COMMAND_BUFFER* cmdBuffer) override;
MOS_STATUS AddHcpPictureStateCmd(MOS_COMMAND_BUFFER* cmdBuffer) override;
MOS_STATUS CalculatePictureStateCommandSize() override;
MOS_STATUS AddHcpPipeBufAddrCmd(
PMOS_COMMAND_BUFFER cmdBuffer) override;
//!
//! \brief Is slice in the current tile
//!
//! \param [in] sliceNumber
//! Slice number
//! \param [in] currentTile
//! Pointer to current tile coding params
//! \param [out] sliceInTile
//! Pointer to return if slice in tile
//! \param [out] lastSliceInTile
//! Pointer to return if last slice in tile
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS IsSliceInTile(
uint32_t sliceNumber,
PMHW_VDBOX_HCP_TILE_CODING_PARAMS_G12 currentTile,
bool *sliceInTile,
bool *lastSliceInTile);
//!
//! \brief Set tile data
//!
//! \param [in] tileCodingParams
//! Pointer to tile coding params
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetTileData(MHW_VDBOX_HCP_TILE_CODING_PARAMS_G12* tileCodingParams, uint32_t bistreamBufSize);
MOS_STATUS AddHcpRefIdxCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_BATCH_BUFFER batchBuffer,
PMHW_VDBOX_HEVC_SLICE_STATE params) override;
//!
//! \brief Help function to verify command buffer size
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS VerifyCommandBufferSize() override;
//!
//! \brief Help function to send prolog with frame tracking information
//!
//! \param [in] cmdBuffer
//! Pointer to command buffer
//! \param [in] frameTrackingRequested
//! True if frame tracking info is needed, false otherwise
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SendPrologWithFrameTracking(
PMOS_COMMAND_BUFFER cmdBuffer,
bool frameTrackingRequested,
MHW_MI_MMIOREGISTERS *mmioRegister = nullptr) override;
//!
//! \brief HuC PAK integrate
//!
//! \param [in] cmdBuffer
//! Pointer to command buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS HucPakIntegrate(
PMOS_COMMAND_BUFFER cmdBuffer);
MOS_STATUS InitMmcState() override;
MOS_STATUS UpdateCmdBufAttribute(
PMOS_COMMAND_BUFFER cmdBuffer,
bool renderEngineInUse) override;
//!
//! \brief Configue stitch data buffer as Huc Pak Integration input
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ConfigStitchDataBuffer();
MOS_STATUS AddMediaVfeCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
SendKernelCmdsParams *params) override;
//!
//! \brief allocate resources with sizes varying from frame to frame
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateResourcesVariableSize();
#if USE_CODECHAL_DEBUG_TOOL
//!
//! \brief Dump PAK output buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS DumpPakOutput();
MOS_STATUS DumpFrameStatsBuffer(CodechalDebugInterface *debugInterface) override;
#endif
uint32_t CodecHalHevc_GetFileSize(char* fileName);
};
//! \brief typedef of class CodechalEncHevcStateG12*
using PCODECHAL_ENC_HEVC_STATE_G12 = class CodechalEncHevcStateG12*;
#endif // __CODECHAL_ENCODE_HEVC_G12_H__