blob: c071778b07e6b47b77659f44c518781345498ec3 [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.h
//! \brief Defines base class for MPEG2 dual-pipe encoder.
//!
#ifndef __CODECHAL_ENCODE_MPEG2_H__
#define __CODECHAL_ENCODE_MPEG2_H__
#include "codechal_encoder_base.h"
class CodechalKernelHme;
//!
//! \class CodechalEncodeMpeg2
//! \brief MPEG2 dual-pipe encoder base class
//! \details This class defines the base class for MPEG2 dual-pipe encoder, it includes
//! common member fields, functions, interfaces etc shared by all GENs.
//! Gen specific definitions, features should be put into their corresponding classes.
//! To create a MPEG2 dual-pipe encoder instance, client needs to new the instance in media interfaces
//!
class CodechalEncodeMpeg2 : public CodechalEncoderState
{
public:
//!
//! \brief Copy construtor
//!
CodechalEncodeMpeg2(const CodechalEncodeMpeg2&) = delete;
//!
//! \brief Copy assignment construtor
//!
CodechalEncodeMpeg2& operator=(const CodechalEncodeMpeg2&) = delete;
//!
//! \brief Destructor
//!
virtual ~CodechalEncodeMpeg2();
//!
//! \brief Allocate resources for encoder instance
//! \details It is invoked when initializing encoder instance and it would call #AllocateEncResources(), #AllocateBrcResources()
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateResources() override;
//!
//! \brief Free encoder resources
//! \details It is invoked when destorying encoder instance and it would call #FreeEncResources(), #FreeBrcResources()
//! and FreePakResources()
//!
//! \return void
//!
void FreeResources() override;
//!
//! \brief Initialize encoder at picture level
//!
//! \param [in] params
//! Picture encoding parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS InitializePicture(const EncoderParams& params) override;
//!
//! \brief Encode kernel functions
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS ExecuteKernelFunctions() override;
//!
//! \brief Encode command at picture level
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ExecutePictureLevel() override;
//!
//! \brief Encode command at slice level
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ExecuteSliceLevel() override;
//!
//! \brief Copy skip frame
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS EncodeCopySkipFrame() override;
//!
//! \brief Initialize encoder instance
//! \details When GEN specific derived class implements this function to do its own initialization,
// it is required that the derived class calls #CodechalEncodeMpeg2::Initialize() first
// which would do common initialization for all GENs
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS Initialize(CodechalSetting * codecHalSettings) override;
//!
//! \brief Inserts the generic prologue command for a command buffer
//! \param [in] cmdBuffer
//! Command buffer
//! \param [in] frameTracking
//! Indicate if frame tracking requested
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SendPrologWithFrameTracking(
PMOS_COMMAND_BUFFER cmdBuffer,
bool frameTracking,
MHW_MI_MMIOREGISTERS *mmioRegister = nullptr) override;
//!
//! \brief Initialize MMC state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success
//!
virtual MOS_STATUS InitMmcState();
CodecEncodeMpeg2PictureParams *m_picParams = nullptr; //!< Pointer to picture parameter
PCODEC_REF_LIST m_refList[CODECHAL_NUM_UNCOMPRESSED_SURFACE_MPEG2]; //!< Pointer to reference list
// Codec to define its own GetStatusReport
MOS_STATUS GetStatusReport(
EncodeStatus *encodeStatus,
EncodeStatusReport *encodeStatusReport) override { return MOS_STATUS_SUCCESS; }
MOS_STATUS AddMediaVfeCmd(
PMOS_COMMAND_BUFFER cmdBuffer,
SendKernelCmdsParams *params) override;
protected:
//!
//! \brief Constructor
//!
CodechalEncodeMpeg2(
CodechalHwInterface* hwInterface,
CodechalDebugInterface* debugInterface,
PCODECHAL_STANDARD_INFO standardInfo);
//!
//! \brief Help function to allocate a 1D buffer
//!
//! \param [in,out] buffer
//! Pointer to allocated buffer
//! \param [in] bufSize
//! Buffer size
//! \param [in] name
//! Buffer name
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateBuffer(
PMOS_RESOURCE buffer,
uint32_t bufSize,
PCCHAR name);
//!
//! \brief Help function to allocate a generic 2D surface
//!
//! \param [in,out] surface
//! Pointer to allocated surface
//! \param [in] surfWidth
//! Surface width
//! \param [in] surfHeight
//! Surface height
//! \param [in] name
//! Surface name
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateBuffer2D(
PMOS_SURFACE surface,
uint32_t surfWidth,
uint32_t surfHeight,
PCCHAR name);
//!
//! \brief Help function to allocate a 1D buffer
//!
//! \param [in,out] batchBuffer
//! Pointer to allocated batch buffer
//! \param [in] bufSize
//! Buffer size
//! \param [in] name
//! Batch buffer name
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateBatchBuffer(
PMHW_BATCH_BUFFER batchBuffer,
uint32_t bufSize,
PCCHAR name);
//!
//! \brief Allocate resources for ENC
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateEncResources();
//!
//! \brief Allocate BRC resources
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateBrcResources();
//!
//! \brief Free BRC resources
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS FreeBrcResources();
//!
//! \brief Free ENC resources
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS FreeEncResources();
//!
//! \brief Check profile and level
//! \details Check if the required profile and level are supported by driver
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS CheckProfileAndLevel();
//!
//! \brief Setup/configure encoder based on sequence parameter set
//! \details It is invoked when the encoder receives a new sequence parameter set and it would
//! set up and configure the encoder state that used for the sequence
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetSequenceStructs();
//!
//! \brief Setup/configure encoder based on picture parameter set
//! \details It is invoked for every picture and it would set up and configure the
// encoder state that used for current picture
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetPictureStructs();
//!
//! \brief Setup/configure Slice Group
//! \details It is invoked for every picture and it would set up and configure the
// encoder state that used for current picture
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetSliceGroups();
//!
//! \brief Get current byte offset
//! \details Get current byte offset for the bit stream buffer
//! \param bsBuffer
//! [in] Bit stream buffer
//! \return uint32_t
//! Byte offset
//!
uint32_t GetCurByteOffset(BSBuffer* bsBuffer);
//!
//! \brief Pack display sequence extension
//! \details Pack display sequence extension, MPEG2 Spec 6.2.2.4
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
MOS_STATUS PackDisplaySeqExtension();
//!
//! \brief Pack sequence extension
//! \details Pack sequence extension, MPEG2 Spec 6.2.2.3
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
MOS_STATUS PackSeqExtension();
//!
//! \brief Pack sequence header
//! \details Pack sequence extension
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
MOS_STATUS PackSeqHeader();
//!
//! \brief Pack sequence parameters
//! \details Pack sequence parameters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
MOS_STATUS PackSequenceParams();
//!
//! \brief Pack picture coding extension
//! \details Pack picture coding extension, MPEG2 Spec 6.2.3.1
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
MOS_STATUS PackPicCodingExtension();
//!
//! \brief Pack picture user data
//! \details Pack picture user data
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
MOS_STATUS PackPicUserData();
//!
//! \brief Pack picture header
//! \details Pack picture header, MPEG2 Spec 6.2.3
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
MOS_STATUS PackPicHeader();
//!
//! \brief Pack group of pictures header
//! \details Pack group of pictures header, MPEG2 Spec 6.2.2.6
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
MOS_STATUS PackGroupOfPicHeader();
//!
//! \brief Pack picture paramters
//! \details Pack icture paramters
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
MOS_STATUS PackPictureParams();
//!
//! \brief Pack Picture Header
//! \details Function to Pack Picture Header
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
MOS_STATUS PackPictureHeader();
//!
//! \brief Pack skip slice data
//! \details Function to pack skip slice data
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
MOS_STATUS PackSkipSliceData();
//!
//! \brief Pack skipped MB
//! \details Function to pack skipped MB
//! \param [in] mbIncrement
//! Number MBs for slice
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
MOS_STATUS PackSkippedMB(uint32_t mbIncrement);
//!
//! \brief Invoke ME kernel
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS EncodeMeKernel();
//!
//! \brief Calculate frame rate value
//!
//! \param [in] frameRateCode
//! Frame rate code
//! \param [in] factor
//! factor
//!
//! \return uint32_t
//! Frame rate value
//!
uint32_t CalcFrameRateValue(uint16_t frameRateCode, uint32_t factor);
//!
//! \brief Setup Curbe for BRC Init/Reset kernel
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetCurbeBrcInitReset();
//!
//! \brief Send surfaces BRC Init/Reset kernel
//!
//! \param [in] cmdBuffer
//! Pointer to command buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendBrcInitResetSurfaces(PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Invoke BRC Init/Reset kernel
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS EncodeBrcInitResetKernel();
//!
//! \brief Top level function for invoking MBenc kernel
//!
//! \param [in] mbEncIFrameDistEnabled
//! Indicate if MbEnc I-Frame distortion is enabled
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS EncodeMbEncKernel(bool mbEncIFrameDistEnabled);
//!
//! \brief Send surfaces for BRC Update kernel
//!
//! \param [in] cmdBuffer
//! Pointer to command buffer
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendBrcUpdateSurfaces(PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Setup Curbe for BRC Update kernel
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetCurbeBrcUpdate();
//!
//! \brief Initialize for BRC constant buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS InitBrcConstantBuffer();
//!
//! \brief Invoke BRC update kernel
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS EncodeBrcUpdateKernel();
//!
//! \brief Send Slice parameters
//!
//! \param [in] cmdBuffer
//! Pointer to command buffer
//! \param [in] params
//! Pointer to PMHW_VDBOX_MPEG2_SLICE_STATE
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendSliceParams(
PMOS_COMMAND_BUFFER cmdBuffer,
PMHW_VDBOX_MPEG2_SLICE_STATE params);
//!
//! \brief Send Surfaces for MbEnc kernel
//!
//! \param [in] cmdBuffer
//! Pointer to command buffer
//! \param [in] mbEncIFrameDistEnabled
//! Indicate if MbEnc I-Frame distortion is enabled
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SendMbEncSurfaces(
PMOS_COMMAND_BUFFER cmdBuffer,
bool mbEncIFrameDistEnabled);
//!
//! \brief Initialize kernel state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitKernelState() = 0;
//!
//! \brief Get maximum BT count
//!
//! \return uint32_t
//! Maximum BT count
//!
virtual uint32_t GetMaxBtCount();
//!
//! \brief Prepare the Curbe for ME kernel
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetCurbeMe()
{
// No operations when m_hmeKernel exists
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Send surfaces to the ME kernel
//!
//! \param [in] cmdBuffer
//! Pointer to command buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SendMeSurfaces(PMOS_COMMAND_BUFFER cmdBuffer)
{
// No operations when m_hmeKernel exists
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Setup Curbe for MbEnc Kernels
//!
//! \param [in] mbEncIFrameDistEnabled
//! Indicate if MbEnc I-Frame distortion is enabled
//! \param [in] mbQpDataEnabled
//! Indicate if MB QP data is enabled
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetCurbeMbEnc(
bool mbEncIFrameDistEnabled,
bool mbQpDataEnabled) = 0;
//!
//! \brief Initialize BRC kernel state
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitKernelStateBrc();
//!
//! \brief Update the slice count according to the DymanicSliceShutdown policy
//!
virtual void UpdateSSDSliceCount();
#if USE_CODECHAL_DEBUG_TOOL
MOS_STATUS DumpSeqParams(
CodecEncodeMpeg2SequenceParams *seqParams);
MOS_STATUS DumpPicParams(
CodecEncodeMpeg2PictureParams *picParams);
MOS_STATUS DumpSliceParams(
CodecEncodeMpeg2SliceParmas *sliceParams);
MOS_STATUS DumpVuiParams(
CodecEncodeMpeg2VuiParams *vuiParams);
#endif
//!
//! \enum MbEncKernelStateIdx
//! \brief MbEnc kernel index
//!
enum MbEncKernelStateIdx
{
mbEncKernelIdxI = 0,
mbEncKernelIdxP,
mbEncKernelIdxB,
mbEncKernelIdxNum,
};
//!
//! \struct BindingTableMbEnc
//! \brief MbEnc binding table r structure
//!
struct BindingTableMbEnc
{
uint32_t m_mbEncPakObj;
uint32_t m_mbEncPakObjPrev;
uint32_t m_mbEncCurrentY;
uint32_t m_mbEncBrcDistortionSurface;
uint32_t m_mbEncCurrentPic;
uint32_t m_mbEncForwardPic;
uint32_t m_mbEncBackwardPic;
uint32_t m_mbEncInterlaceFrameCurrentPic;
uint32_t m_mbEncInterlaceFrameBackwardPic;
uint32_t m_mbEncMbControl;
uint32_t m_mbEncScoreboard;
};
static const uint32_t m_numSyncTags = 36; //!< Number of kernels: per frame & kernel workload
static const uint32_t m_initDshSize = MHW_PAGE_SIZE * 2; //!< Perfomance tuning might be needed depending on curbe size
static const uint32_t m_frameRateDenom = 100; //!< Frame rate denom
static const uint32_t m_frameThresholdArraySize = 64; //!< Frame threadold array size
static const uint32_t m_distQpAdjustmentArraySize = 96; //!< QP adjustemnt array size
static const uint32_t m_brcConstantSurfaceWidth = 64; //!< BRC constant surface width
static const uint32_t m_brcPicHeaderSurfaceSize = 1024; //!< BRC picture header surface size
static const uint32_t m_brcHistoryBufferSize = 576; //!< BRC history buffer size
static const uint32_t m_targetUsageNum = 8; //!< Target usage number
static const uint32_t m_maxVmvr = 128 * 4; //!< Max VMVR
static const uint32_t m_mvCostTableOffset = 52; //!< MV cost table offset
static const uint8_t m_qpAdjustmentDistThresholdMaxFrameThresholdI[m_frameThresholdArraySize];//!< QP adjustment threashold array for I frame
static const uint8_t m_qpAdjustmentDistThresholdMaxFrameThresholdP[m_frameThresholdArraySize];//!< QP adjustment threashold array for P frame
static const uint8_t m_qpAdjustmentDistThresholdMaxFrameThresholdB[m_frameThresholdArraySize];//!< QP adjustment threashold array for B frame
static const uint8_t m_distQpAdjustmentI[m_distQpAdjustmentArraySize]; //!< QP adjustment array for I frame
static const uint8_t m_distQpAdjustmentP[m_distQpAdjustmentArraySize]; //!< QP adjustment array for P frame
static const uint8_t m_distQpAdjustmentB[m_distQpAdjustmentArraySize]; //!< QP adjustment array for B frame
static const uint8_t m_targetUsageToKernelMode[m_targetUsageNum]; //!< Table for target usage to kernel mode convert
static const uint32_t m_vmeLutXyP[2]; //!< vme LUT XY table for P frame
static const uint32_t m_vmeLutXyB[2]; //!< vme LUT XY table for B frame
static const uint32_t m_vmeSPathP0[16]; //!< vme search path table 0 for P frame
static const uint32_t m_vmeSPathP1[16]; //!< vme search path table 1 for P frame
static const uint32_t m_vmeSPathB0[16]; //!< vme search path table 0 for B frame
static const uint32_t m_vmeSPathB1[16]; //!< vme search path table 1 for B frame
CodecEncodeMpeg2SequenceParams *m_seqParams = nullptr; //!< Pointer to sequence parameter
CodecEncodeMpeg2VuiParams *m_vuiParams = nullptr; //!< Pointer to vui parameter
CodecEncodeMpeg2SliceParmas *m_sliceParams = nullptr; //!< Pointer to slice parameter
CodecEncodeMpeg2QmatixParams *m_qMatrixParams = nullptr; //!< Pointer to qmatrix parameter
CODEC_PIC_ID m_picIdx[CODEC_MAX_NUM_REF_FRAME_NON_AVC]; //!< Picture index
uint8_t* m_kernelBinary = nullptr; //!< Pointer to the kernel binary
uint32_t m_combinedKernelSize = 0; //!< Combined kernel binary size
bool m_sliceStateEnable = true; //!< Indicate if slice state is enabled
// BRC
bool m_brcInit = true; //!< Indicate if BRC is initilized
bool m_mbEncCurbeSetInBrcUpdate = false; //!< Indicatd if Mbenc curbe is set
bool m_brcEnabled = false; //!< Indicate if BRC is enabled
bool m_brcReset = false; //!< Indicate if BRC is reset
#if (_DEBUG || _RELEASE_INTERNAL)
bool m_brcDistortionBufferSupported = false; //!< Indicate if BRC distorion buffer is supported
#endif
uint16_t m_avbrAccuracy = 0; //!< AVBR Accuracy
uint16_t m_avbrConvergence = 0; //!< AVBR Convergence
uint32_t m_picHeaderDataBufferSize = 0; //!< Picture header buffer size
uint32_t m_qScaleTypeByteOffse = 0; //!< Offset for QScle
uint32_t m_vbvDelayOffset = 0; //!< Offset for Vbv delay
uint32_t m_intraDcPrecisionOffset = 0; //!< Offset for Intra DC precision
MHW_KERNEL_STATE m_brcKernelStates[CODECHAL_ENCODE_BRC_IDX_NUM]; //!< BRC kernel state
EncodeBrcBuffers m_brcBuffers; //!< BRC buffers
double m_brcInitCurrentTargetBufFullInBits = 0; //!< BRC init buffer full
double m_brcInitResetInputBitsPerFrame = 0; //!< BRC init reset input bits per frame
double m_brcInitResetBufSizeInBits = 0; //!< BRC init reset buffer size
// MbEnc
bool m_mbQpDataEnabled = false; //!< Mb Qp data flag
MOS_SURFACE m_mbQpDataSurface; //!< MOS_SURFACE of Mb Qp data surface
uint32_t m_frameNumB = 0; //!< The num of the successive B frames
uint32_t m_prevMBCodeIdx = 0; //!< Previous MB Code index // MbEnc
uint8_t m_mbEncForcePictureCodingType = 0; //!< force I, P, or B for MbEnc kernel only
MHW_KERNEL_STATE m_mbEncKernelStates[mbEncKernelIdxNum]; //!< MbEnc kernel state
BindingTableMbEnc m_mbEncBindingTable; //!< MbEnc binding table
// ME
CodechalKernelHme *m_hmeKernel = nullptr; //!< ME kernel object
bool m_hmeEnabled = false; //!< HME enable flag
MOS_SURFACE m_4xMEMVDataBuffer; //!< 4xME mv data buffer
MHW_BATCH_BUFFER m_batchBufForMEDistBuffer[NUM_ENCODE_BB_TYPE]; //!< ME Distortion batch buffer for ME call
uint32_t m_memvBottomFieldOffset = 0; //!< MEMV bottom filed offset
MOS_SURFACE m_4xMEDistortionBuffer; //!< MOS_SURFACE of ME distortion surface
uint32_t m_meDistortionBottomFieldOffset = 0; //!< ME distortion bottom filed offset
private:
//!
//! \brief Walker function
//!
void MBWalker(uint16_t, uint16_t, uint16_t*);
void MBWalker45Degree(uint16_t, uint16_t, uint16_t*);
void MBWalkerMBAFF(uint16_t, uint16_t, uint16_t*);
void MBWalkerRasterScan(uint16_t, uint16_t, uint16_t*);
void MBWalkerVerticalScan(uint16_t, uint16_t, uint16_t*);
};
#endif // __CODECHAL_ENCODE_MPEG2_H__