| /* |
| * 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_encoder_base.h |
| //! \brief Defines the encode interface for CodecHal. |
| //! \details The encode interface is further sub-divided by standard, this file is for the base interface which is shared by all encode standards. |
| //! |
| |
| #ifndef __CODECHAL_ENCODER_BASE_H__ |
| #define __CODECHAL_ENCODER_BASE_H__ |
| |
| #include "codechal.h" |
| #include "codechal_setting.h" |
| #include "codechal_hw.h" |
| #include "codechal_debug.h" |
| #include "codechal_encode_sfc.h" |
| #include "codechal_encode_csc_ds.h" |
| #include "codechal_encode_tracked_buffer.h" |
| #include "codechal_encode_allocator.h" |
| #include "codechal_mmc.h" |
| #include "codechal_utilities.h" |
| #include "codec_def_encode.h" |
| #include "cm_rt_umd.h" |
| #include "media_perf_profiler.h" |
| #include <algorithm> // std::reverse |
| |
| //------------------------------------------------------------------------------ |
| // Macros specific to MOS_CODEC_SUBCOMP_ENCODE sub-comp |
| //------------------------------------------------------------------------------ |
| #define CODECHAL_ENCODE_ASSERT(_expr) \ |
| MOS_ASSERT(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_ENCODE, _expr) |
| |
| #define CODECHAL_ENCODE_ASSERTMESSAGE(_message, ...) \ |
| MOS_ASSERTMESSAGE(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_ENCODE, _message, ##__VA_ARGS__) |
| |
| #define CODECHAL_ENCODE_NORMALMESSAGE(_message, ...) \ |
| MOS_NORMALMESSAGE(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_ENCODE, _message, ##__VA_ARGS__) |
| |
| #define CODECHAL_ENCODE_VERBOSEMESSAGE(_message, ...) \ |
| MOS_VERBOSEMESSAGE(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_ENCODE, _message, ##__VA_ARGS__) |
| |
| #define CODECHAL_ENCODE_FUNCTION_ENTER \ |
| MOS_FUNCTION_ENTER(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_ENCODE) |
| |
| #define CODECHAL_ENCODE_CHK_STATUS(_stmt) \ |
| MOS_CHK_STATUS(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_ENCODE, _stmt) |
| |
| #define CODECHAL_ENCODE_CHK_STATUS_MESSAGE(_stmt, _message, ...) \ |
| MOS_CHK_STATUS_MESSAGE(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_ENCODE, _stmt, _message, ##__VA_ARGS__) |
| |
| #define CODECHAL_ENCODE_CHK_NULL(_ptr) \ |
| MOS_CHK_NULL(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_ENCODE, _ptr) |
| |
| #define CODECHAL_ENCODE_CHK_NULL_NO_STATUS(_ptr) \ |
| MOS_CHK_NULL_NO_STATUS(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_ENCODE, _ptr) |
| |
| #define CODECHAL_ENCODE_CHK_COND(_expr, _message, ...) \ |
| MOS_CHK_COND(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_ENCODE,_expr,_message, ##__VA_ARGS__) |
| |
| #define CODECHAL_ENCODE_CHK_NULL_NO_STATUS_RETURN(_ptr) \ |
| MOS_CHK_NULL_NO_STATUS_RETURN(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_ENCODE, _ptr) |
| |
| #define CODECHAL_ENCODE_CHK_NULL_RETURN(_ptr) \ |
| MOS_CHK_NULL_RETURN(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_ENCODE, _ptr) |
| |
| #define CODECHAL_ENCODE_CHK_STATUS_RETURN(_stmt) \ |
| MOS_CHK_STATUS_RETURN(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_ENCODE, _stmt) |
| |
| #define CODECHAL_ENCODE_CHK_STATUS_MESSAGE_RETURN(_stmt, _message, ...) \ |
| MOS_CHK_STATUS_MESSAGE_RETURN(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_ENCODE, _stmt, _message, ##__VA_ARGS__) |
| |
| #define CODECHAL_ENCODE_CHK_COND_RETURN(_expr, _message, ...) \ |
| MOS_CHK_COND_RETURN(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_ENCODE,_expr,_message, ##__VA_ARGS__) |
| |
| // User Feature Report Writeout |
| #define CodecHalEncode_WriteKey64(key, value, mosCtx)\ |
| {\ |
| MOS_USER_FEATURE_VALUE_WRITE_DATA UserFeatureWriteData = __NULL_USER_FEATURE_VALUE_WRITE_DATA__;\ |
| UserFeatureWriteData.Value.i64Data = (value);\ |
| UserFeatureWriteData.ValueID = (key);\ |
| MOS_UserFeature_WriteValues_ID(nullptr, &UserFeatureWriteData, 1, mosCtx);\ |
| } |
| |
| #define CodecHalEncode_WriteKey(key, value, mosCtx)\ |
| {\ |
| MOS_USER_FEATURE_VALUE_WRITE_DATA UserFeatureWriteData = __NULL_USER_FEATURE_VALUE_WRITE_DATA__;\ |
| UserFeatureWriteData.Value.i32Data = (value);\ |
| UserFeatureWriteData.ValueID = (key);\ |
| MOS_UserFeature_WriteValues_ID(nullptr, &UserFeatureWriteData, 1, mosCtx);\ |
| } |
| |
| #define CodecHalEncode_WriteStringKey(key, value, len, mosCtx)\ |
| {\ |
| MOS_USER_FEATURE_VALUE_WRITE_DATA UserFeatureWriteData = __NULL_USER_FEATURE_VALUE_WRITE_DATA__;\ |
| UserFeatureWriteData.Value.StringData.pStringData = (value);\ |
| UserFeatureWriteData.Value.StringData.uSize = (len);\ |
| UserFeatureWriteData.ValueID = (key);\ |
| MOS_UserFeature_WriteValues_ID(nullptr, &UserFeatureWriteData, 1, mosCtx);\ |
| } |
| |
| //! |
| //! \brief Recycled buffers are buffers which are locked and populated each execute |
| //! to be consumed by HW. The driver loops through these buffers, if for the |
| //! current index it is detected that the buffers for that index are still in |
| //! use by HW, the driver waits until the buffers are available. 6 of each |
| //! recycled buffer type are allocated to achieve performance parity with the |
| //! old method of not having any waits. |
| //! |
| #define CODECHAL_ENCODE_RECYCLED_BUFFER_NUM 6 |
| |
| // Encode Sizes |
| #define CODECHAL_ENCODE_STATUS_NUM 512 |
| #define CODECHAL_ENCODE_VME_BBUF_NUM 2 |
| #define CODECHAL_ENCODE_MIN_SCALED_SURFACE_SIZE 48 |
| #define CODECHAL_ENCODE_BRC_PAK_STATISTICS_SIZE 64 |
| #define CODECHAL_ENCODE_MAX_NUM_MAD_BUFFERS CODEC_MAX_NUM_REF_FIELD |
| #define CODECHAL_ENCODE_SLICESIZE_BUF_SIZE (4960 * sizeof(uint16_t)) |
| #define CODECHAL_VDENC_BRC_NUM_OF_PASSES 2 |
| #define CODECHAL_VDENC_BRC_NUM_OF_PASSES_FOR_TILE_REPLAY 22 |
| #define CODECHAL_DP_MAX_NUM_BRC_PASSES 4 |
| #define CODECHAL_VDENC_NUMIMEPREDICTORS 8 |
| #define CODECHAL_VDENC_NUMIMEPREDICTORS_SPEED 4 |
| #define CODECHAL_VDENC_NUMIMEPREDICTORS_QUALITY 12 |
| #define CODECHAL_CMDINITIALIZER_MAX_CMD_SIZE CODECHAL_CACHELINE_SIZE * 4 |
| #define CODECHAL_ENCODE_NUM_MAX_VME_L0_REF 8 // multiref - G7.5+ - used from DDI |
| #define CODECHAL_ENCODE_NUM_MAX_VME_L1_REF 2 // multiref - G7.5+ - used from DDI |
| #define CODECHAL_ENCODE_ME_DATA_SIZE_MULTIPLIER (CODECHAL_ENCODE_NUM_MAX_VME_L0_REF + CODECHAL_ENCODE_NUM_MAX_VME_L1_REF) |
| #define CODECHAL_ENCODE_FIELD_NUM_MAX_VME_L0_REF 4 // multiref - G7.5+ |
| #define CODECHAL_ENCODE_FIELD_NUM_MAX_VME_L1_REF 1 // multiref - G7.5+ |
| #define CODECHAL_LPLA_NUM_OF_PASSES 2 |
| |
| // BRC |
| #define CODECHAL_ENCODE_BRC_KBPS 1000 // 1000bps for disk storage, aligned with industry usage |
| #define CODECHAL_ENCODE_SCENE_CHANGE_DETECTED_MASK 0xffff |
| |
| typedef enum _CODECHAL_ENCODE_FUNCTION_ID |
| { |
| CODECHAL_ENCODE_ENC_ID = 0x100, |
| CODECHAL_ENCODE_PAK_ID = 0x101, |
| CODECHAL_ENCODE_ENC_PAK_ID = 0x102, |
| CODECHAL_ENCODE_VPP_ID = 0x103, |
| CODECHAL_ENCODE_FORMAT_COUNT_ID = 0x104, |
| CODECHAL_ENCODE_FORMATS_ID = 0x105, |
| CODECHAL_ENCODE_ENC_CTRL_CAPS_ID = 0x106, |
| CODECHAL_ENCODE_ENC_CTRL_GET_ID = 0x107, |
| CODECHAL_ENCODE_ENC_CTRL_SET_ID = 0x108, |
| CODECHAL_ENCODE_MBDATA_LAYOUT_ID = 0x109, |
| CODECHAL_ENCODE_FEI_PRE_ENC_ID = 0x10A, |
| CODECHAL_ENCODE_FEI_ENC_ID = 0x10B, |
| CODECHAL_ENCODE_FEI_PAK_ID = 0x10C, |
| CODECHAL_ENCODE_FEI_ENC_PAK_ID = 0x10D, |
| CODECHAL_ENCODE_QUERY_STATUS_ID = 0x121 |
| } CODECHAL_ENCODE_FUNCTION_ID; |
| |
| typedef enum _CODECHAL_ENCODE_BRC_KERNEL_STATE_IDX |
| { |
| CODECHAL_ENCODE_BRC_IDX_INIT = 0, |
| CODECHAL_ENCODE_BRC_IDX_FrameBRC_UPDATE, |
| CODECHAL_ENCODE_BRC_IDX_RESET, |
| CODECHAL_ENCODE_BRC_IDX_IFRAMEDIST, |
| CODECHAL_ENCODE_BRC_IDX_BLOCKCOPY, |
| CODECHAL_ENCODE_BRC_IDX_MbBRC_UPDATE, // extra MbBRCUpdate kernel starting GEN9 |
| CODECHAL_ENCODE_BRC_IDX_NUM |
| } CODECHAL_ENCODE_BRC_KERNEL_STATE_IDX; |
| |
| typedef struct KernelHeaderEncode |
| { |
| int nKernelCount; |
| |
| union |
| { |
| struct |
| { |
| CODECHAL_KERNEL_HEADER Gen10_HEVC_VP9_VDEnc_DS4X_Frame; |
| CODECHAL_KERNEL_HEADER Gen10_HEVC_VP9_VDEnc_DS4X_Field; |
| CODECHAL_KERNEL_HEADER Gen10_HEVC_VP9_VDEnc_DS2X_Frame; |
| CODECHAL_KERNEL_HEADER Gen10_HEVC_VP9_VDEnc_DS2X_Field; |
| CODECHAL_KERNEL_HEADER Gen10_HEVC_VP9_VDEnc_HME_P; |
| CODECHAL_KERNEL_HEADER Gen10_HEVC_VP9_VDEnc_HME_B; |
| CODECHAL_KERNEL_HEADER Gen10_HEVC_VP9_VDEnc_HME_Streamin; |
| CODECHAL_KERNEL_HEADER Gen10_HEVC_VP9_VDEnc_HME_HEVC_Streamin; |
| CODECHAL_KERNEL_HEADER Gen10_HEVC_VP9_VDEnc_HMEDetection; |
| }; |
| }; |
| |
| }KernelHeaderEncode; |
| |
| //! |
| //! \enum BindingTableOffsetKernel |
| //! \brief Binding table offset kernel |
| //! |
| enum BindingTableOffsetKernel |
| { |
| // VDEnc HME kernel |
| HmeBegin = 0, |
| HmeMvDataSurfaceCm = HmeBegin, |
| Hme16xMeMvDataSurfaceCm, |
| Hme32xMeMvDataSurfaceCm = Hme16xMeMvDataSurfaceCm, |
| HmeDistortionSurfaceCm, |
| HmeBrcDistortionCm, |
| HmeCurrForFwdRefCm, |
| HmeFwdRefIdx0Cm, |
| HmeReserved1Cm, |
| HmeFwdRefIdx1Cm, |
| HmeReserved2Cm, |
| HmeFwdRefIdx2Cm, |
| HmeReserved3Cm, |
| HmeFwdRefIdx3Cm, |
| HmeReserved4Cm, |
| HmeFwdRefIdx4Cm, |
| HmeReserved5Cm, |
| HmeFwdRefIdx5Cm, |
| HmeReserved6Cm, |
| HmeFwdRefIdx6Cm, |
| HmeReserved7Cm, |
| HmeFwdRefIdx7Cm, |
| HmeReserved8Cm, |
| HmeCurrForBwdRefCm, |
| HmeBwdRefIdx0Cm, |
| HmeReserved9Cm, |
| HmeBwdRefIdx1Cm, |
| HmeReserved10Cm, |
| HmeVdencStreaminOutputCm, |
| HmeVdencStreaminInputCm, |
| HmeEnd, |
| }; |
| |
| //! |
| //! \enum BrcUpdateFlag |
| //! \brief Indicate the Brc Update Flag |
| //! |
| enum BrcUpdateFlag |
| { |
| brcUpdateIsField = 0x01, |
| brcUpdateIsMbaff = (0x01 << 1), |
| brcUpdateIsBottomField = (0x01 << 2), |
| brcUpdateAutoPbFrameSize = (0x01 << 3), |
| brcUpdateIsActualQp = (0x01 << 6), |
| brcUpdateIsReference = (0x01 << 7) |
| }; |
| |
| //! |
| //! \enum TrellisSetting |
| //! \brief Indicate the different Trellis Settings |
| //! |
| enum TrellisSetting |
| { |
| trellisInternal = 0, |
| trellisDisabled = 1, |
| trellisEnabledI = 2, |
| trellisEnabledP = 4, |
| trellisEnabledB = 8 |
| }; |
| |
| //! |
| //! \enum MbBrcSetting |
| //! \brief Indicate the MBBRC settings |
| //! |
| enum MbBrcSetting |
| { |
| mbBrcInternal = 0, |
| mbBrcEnabled = 1, |
| mbBrcDisabled = 2, |
| }; |
| |
| // User Feature Key Report Writeout |
| #define CodecHalEncodeWriteKey64(key, value, mosCtx)\ |
| {\ |
| MOS_USER_FEATURE_VALUE_WRITE_DATA UserFeatureWriteData = __NULL_USER_FEATURE_VALUE_WRITE_DATA__;\ |
| UserFeatureWriteData.Value.i64Data = (value);\ |
| UserFeatureWriteData.ValueID = (key);\ |
| MOS_UserFeature_WriteValues_ID(nullptr, &UserFeatureWriteData, 1, mosCtx);\ |
| } |
| |
| #define CodecHalEncodeWriteKey(key, value, mosCtx)\ |
| {\ |
| MOS_USER_FEATURE_VALUE_WRITE_DATA UserFeatureWriteData = __NULL_USER_FEATURE_VALUE_WRITE_DATA__;\ |
| UserFeatureWriteData.Value.i32Data = (value);\ |
| UserFeatureWriteData.ValueID = (key);\ |
| MOS_UserFeature_WriteValues_ID(nullptr, &UserFeatureWriteData, 1, mosCtx);\ |
| } |
| |
| #define CodecHalEncodeWriteStringKey(key, value, len, mosCtx)\ |
| {\ |
| MOS_USER_FEATURE_VALUE_WRITE_DATA UserFeatureWriteData = __NULL_USER_FEATURE_VALUE_WRITE_DATA__;\ |
| UserFeatureWriteData.Value.StringData.pStringData = (value);\ |
| UserFeatureWriteData.Value.StringData.uSize = (len);\ |
| UserFeatureWriteData.ValueID = (key);\ |
| MOS_UserFeature_WriteValues_ID(nullptr, &UserFeatureWriteData, 1, mosCtx);\ |
| } |
| |
| // --------------------------- |
| // Tables |
| // --------------------------- |
| |
| // --------------------------- |
| // Structures |
| // --------------------------- |
| |
| #define CODECHAL_ENCODE_SET_PERFTAG_INFO(perfTag, type) { \ |
| perfTag.Value = 0; \ |
| perfTag.Mode = m_mode & CODECHAL_ENCODE_MODE_BIT_MASK; \ |
| perfTag.CallType = type; \ |
| perfTag.PictureCodingType = m_pictureCodingType > 3 ? 0 : m_pictureCodingType; \ |
| m_osInterface->pfnSetPerfTag(m_osInterface, perfTag.Value); \ |
| m_osInterface->pfnIncPerfBufferID(m_osInterface); } |
| |
| //! |
| //! \struct CodechalEncodeMdfKernelResource |
| //! \brief Codechal encode mdf kernel resource |
| //! |
| struct CodechalEncodeMdfKernelResource |
| { |
| void *pCommonISA; |
| CmProgram *pCmProgram; |
| CmKernel **ppKernel; |
| uint8_t *pCurbe; |
| CmThreadSpace *pTS; |
| CmBuffer **ppCmBuf; |
| CmSurface2D **ppCmSurf; |
| SurfaceIndex **ppCmVmeSurf; |
| CmEvent *e; |
| |
| uint8_t KernelNum; |
| uint8_t BufNum; |
| uint8_t SurfNum; |
| uint8_t VmeSurfNum; |
| uint16_t wCurbeSize; |
| uint16_t wReserved; |
| }; |
| |
| //! |
| //! \struct MfeParams |
| //! \brief Mfe encode parameters |
| //! |
| struct MfeParams |
| { |
| uint32_t streamId; //!< Unique id |
| uint32_t submitIndex; //!< Index during this submission |
| uint32_t submitNumber; //!< Total stream number during this submission |
| uint32_t maxWidth; //!< Maximum width for all frames |
| uint32_t maxHeight; //!< Maximum height for all frames |
| }; |
| |
| //! |
| //! \struct MfeSharedState |
| //! \brief State shared across multiple streams |
| //! |
| struct MfeSharedState |
| { |
| CodechalHwInterface *pHwInterface = nullptr; |
| PMOS_INTERFACE pOsInterface; |
| PMHW_KERNEL_STATE pMfeMbEncKernelState; //!< Set in the first stream, Used by the rest streams |
| uint32_t dwPicWidthInMB; //!< Keep the maximum width |
| uint32_t dwPicHeightInMB; //!< Keep the maximum height |
| uint16_t sliceHeight; //!< Keep the maximum slice height |
| uint32_t maxTheadWidth = 0; //!< Keep the maximum width of the threadspace |
| uint32_t maxTheadHeight = 0; //!< Keep the maximum Height of the threadspace |
| uint32_t *maxThreadWidthFrames = nullptr; //!< Keep the thread space width for all frames |
| |
| CmDevice *pCmDev = nullptr; //!< Set in the first stream, Used by the rest streams |
| CmTask *pCmTask = nullptr; |
| CmQueue *pCmQueue = nullptr; |
| CodechalEncodeMdfKernelResource *resMbencKernel = nullptr; |
| SurfaceIndex *vmeSurface = nullptr; |
| SurfaceIndex *commonSurface = nullptr; |
| std::vector<CodechalEncoderState*> encoders; |
| }; |
| |
| //! |
| //! \struct FeiPreEncParams |
| //! \brief Fei pre-encode parameters |
| //! |
| struct FeiPreEncParams |
| { |
| MOS_RESOURCE resMvPredBuffer; |
| MOS_RESOURCE resMbQpBuffer; |
| MOS_RESOURCE resMvBuffer; |
| MOS_RESOURCE resStatsBuffer; |
| MOS_RESOURCE resStatsBotFieldBuffer; |
| |
| PMOS_SURFACE psCurrOriginalSurface; |
| |
| bool bInterlaced; |
| uint32_t dwNumPastReferences; |
| uint32_t dwNumFutureReferences; |
| |
| bool bCurPicUpdated; |
| CODEC_PICTURE CurrOriginalPicture; |
| |
| CODEC_PICTURE PastRefPicture; |
| bool bPastRefUpdated; |
| MOS_SURFACE sPastRefSurface; |
| bool bPastRefStatsNeeded; |
| MOS_RESOURCE sPastRefStatsBuffer; |
| MOS_RESOURCE sPastRefStatsBotFieldBuffer; |
| |
| CODEC_PICTURE FutureRefPicture; |
| bool bFutureRefUpdated; |
| MOS_SURFACE sFutureRefSurface; |
| bool bFutureRefStatsNeeded; |
| MOS_RESOURCE sFutureRefStatsBuffer; |
| MOS_RESOURCE sFutureRefStatsBotFieldBuffer; |
| |
| uint32_t dwFrameQp; |
| uint32_t dwLenSP; |
| uint32_t dwSearchPath; |
| uint32_t dwSubMBPartMask; |
| uint32_t dwIntraPartMask; |
| uint32_t dwSubPelMode; |
| uint32_t dwInterSAD; |
| uint32_t dwIntraSAD; |
| bool bAdaptiveSearch; |
| |
| uint32_t dwMVPredictorCtrl; |
| bool bMBQp; |
| bool bFTEnable; |
| uint32_t dwRefWidth; |
| uint32_t dwRefHeight; |
| uint32_t dwSearchWindow; |
| bool bDisableMVOutput; |
| bool bDisableStatisticsOutput; |
| bool bEnable8x8Statistics; |
| bool bInputUpdated; |
| }; |
| |
| //! |
| //! \enum EncOperation |
| //! \brief Encode operations |
| //! |
| enum EncOperation |
| { |
| ENC_SCALING4X = 0, |
| ENC_SCALING2X, |
| ENC_ME, |
| ENC_BRC, |
| ENC_MBENC, |
| ENC_MBENC_ADV, |
| ENC_RESETVLINESTRIDE, |
| ENC_MC, |
| ENC_MBPAK, |
| ENC_DEBLOCK, |
| ENC_PREPROC, |
| VDENC_ME, |
| ENC_WP, |
| ENC_SFD, //!< Static frame detection |
| ENC_SCOREBOARD, |
| ENC_MBENC_I_LUMA, |
| ENC_MPU, |
| ENC_TPU, |
| ENC_SCALING_CONVERSION, //!< for HEVC |
| ENC_DYS, |
| ENC_INTRA_DISTORTION, |
| VDENC_ME_P, |
| VDENC_ME_B, |
| VDENC_STREAMIN, |
| VDENC_STREAMIN_HEVC, |
| VDENC_STREAMIN_HEVC_RAB |
| }; |
| |
| //! |
| //! \enum HmeLevel |
| //! \brief Indicate the Hme level |
| //! |
| enum HmeLevel |
| { |
| HME_LEVEL_4x = 0, |
| HME_LEVEL_16x = 1, |
| HME_LEVEL_32x = 2 |
| }; |
| |
| //! |
| //! \enum EncodeMeMode |
| //! \brief Encode me mode |
| //! |
| enum EncodeMeMode |
| { |
| CODECHAL_ENCODE_ME16X_BEFORE_ME4X = 0, |
| CODECHAL_ENCODE_ME16X_ONLY = 1, |
| CODECHAL_ENCODE_ME4X_ONLY = 2, |
| CODECHAL_ENCODE_ME4X_AFTER_ME16X = 3 |
| }; |
| |
| //! |
| //! \enum CodechalEncodeBrcNumPasses |
| //! \brief used in GetNumBrcPakPasses |
| //! |
| enum CodechalEncodeBrcNumPasses |
| { |
| CODECHAL_ENCODE_BRC_SINGLE_PASS = 1, // No IPCM case |
| CODECHAL_ENCODE_BRC_MINIMUM_NUM_PASSES = 2, // 2 to cover IPCM case |
| CODECHAL_ENCODE_BRC_DEFAULT_NUM_PASSES = 4, |
| CODECHAL_ENCODE_BRC_MAXIMUM_NUM_PASSES = 7 |
| }; |
| |
| //! |
| //! \struct HmeParams |
| //! \brief Indicate the Hme parameters |
| //! |
| struct HmeParams |
| { |
| // ME |
| PMOS_SURFACE ps4xMeMvDataBuffer; |
| PMOS_SURFACE ps16xMeMvDataBuffer; |
| PMOS_SURFACE ps32xMeMvDataBuffer; |
| PMOS_SURFACE ps4xMeDistortionBuffer; |
| PMOS_RESOURCE presMvAndDistortionSumSurface; |
| bool b4xMeDistortionBufferSupported; |
| }; |
| |
| //! |
| //! \brief Generic binding table |
| //! |
| struct GenericBindingTable |
| { |
| uint32_t dwMediaState; |
| uint32_t dwBindingTableStartOffset; |
| uint32_t dwNumBindingTableEntries; |
| uint32_t dwBindingTableEntries[64]; |
| }; |
| using PCODECHAL_ENCODE_BINDING_TABLE_GENERIC = GenericBindingTable*; |
| |
| //! |
| //! \struct MeKernelBindingTable |
| //! \brief The struct of Me kernel binding table |
| //! |
| struct MeKernelBindingTable |
| { |
| uint32_t dwMEMVDataSurface; |
| uint32_t dwMECurrY; |
| uint32_t dwMEFwdRefY; |
| uint32_t dwMEBwdRefY; |
| uint32_t dwMECurrForFwdRef; |
| uint32_t dwMEFwdRef; |
| uint32_t dwMECurrForBwdRef; |
| uint32_t dwMEBwdRef; |
| uint32_t dw16xMEMVDataSurface; |
| uint32_t dw32xMEMVDataSurface; |
| uint32_t dwMEDist; |
| uint32_t dwMEBRCDist; |
| uint32_t dwMECurrForFwdRefIdx[CODECHAL_ENCODE_NUM_MAX_VME_L0_REF]; |
| uint32_t dwMECurrForBwdRefIdx[CODECHAL_ENCODE_NUM_MAX_VME_L1_REF]; |
| |
| // Frame Binding Table Entries |
| uint32_t dwMEFwdRefPicIdx[CODECHAL_ENCODE_NUM_MAX_VME_L0_REF]; |
| uint32_t dwMEBwdRefPicIdx[CODECHAL_ENCODE_NUM_MAX_VME_L1_REF]; |
| |
| // Field Binding Table Entries |
| uint32_t dwMEFwdRefPicTopIdx[CODECHAL_ENCODE_FIELD_NUM_MAX_VME_L0_REF]; |
| uint32_t dwMEFwdRefPicBotIdx[CODECHAL_ENCODE_FIELD_NUM_MAX_VME_L0_REF]; |
| uint32_t dwMEBwdRefPicTopIdx[CODECHAL_ENCODE_FIELD_NUM_MAX_VME_L1_REF]; |
| uint32_t dwMEBwdRefPicBotIdx[CODECHAL_ENCODE_FIELD_NUM_MAX_VME_L1_REF]; |
| |
| uint32_t dwVdencStreamInSurface; |
| uint32_t dwVdencStreamInInputSurface; |
| |
| uint32_t dwBindingTableStartOffset; |
| uint32_t dwNumBindingTableEntries; |
| }; |
| |
| //! |
| //! \struct MeSurfaceParams |
| //! \brief The struct of Me surface parameters |
| //! |
| struct MeSurfaceParams |
| { |
| PCODEC_REF_LIST *ppRefList; |
| PCODEC_PIC_ID pPicIdx; |
| PCODEC_PICTURE pCurrOriginalPic; |
| PMOS_SURFACE ps4xMeMvDataBuffer; |
| uint32_t dw4xMeMvBottomFieldOffset; |
| PMOS_SURFACE ps16xMeMvDataBuffer; |
| uint32_t dw16xMeMvBottomFieldOffset; |
| PMOS_SURFACE ps32xMeMvDataBuffer; |
| uint32_t dw32xMeMvBottomFieldOffset; |
| uint32_t dw4xScaledBottomFieldOffset; |
| uint32_t dw16xScaledBottomFieldOffset; |
| uint32_t dw32xScaledBottomFieldOffset; |
| PMOS_SURFACE psMeDistortionBuffer; |
| uint32_t dwMeDistortionBottomFieldOffset; |
| PMOS_SURFACE psMeBrcDistortionBuffer; |
| PMOS_RESOURCE psMeVdencStreamInBuffer; |
| uint32_t dwMeBrcDistortionBottomFieldOffset; |
| uint32_t dwDownscaledWidthInMb; |
| uint32_t dwDownscaledHeightInMb; |
| uint32_t dwVDEncStreamInSurfaceSize; |
| uint32_t dwVerticalLineStride; |
| uint32_t dwVerticalLineStrideOffset; |
| bool b16xMeInUse; |
| bool b32xMeInUse; |
| bool b16xMeEnabled; |
| bool b32xMeEnabled; |
| bool bVdencStreamInEnabled; |
| PCODEC_PICTURE pL0RefFrameList; |
| PCODEC_PICTURE pL1RefFrameList; |
| uint32_t dwNumRefIdxL0ActiveMinus1; |
| uint32_t dwNumRefIdxL1ActiveMinus1; |
| PMHW_KERNEL_STATE pKernelState; |
| MeKernelBindingTable* pMeBindingTable; |
| bool bMbaff; |
| bool b4xMeDistortionBufferSupported; |
| }; |
| |
| //! |
| //! \struct MeCurbeParams |
| //! \brief The struct of Me Curbe parameters |
| //! |
| struct MeCurbeParams |
| { |
| PMHW_KERNEL_STATE pKernelState; |
| HmeLevel hmeLvl; |
| bool b16xMeEnabled; |
| bool b32xMeEnabled; |
| bool segmapProvided; |
| uint8_t TargetUsage; |
| uint8_t *pMEMethodTable; |
| uint8_t *pBMEMethodTable; |
| int32_t MaxMvLen; |
| |
| // Picture parameters |
| CODEC_PICTURE CurrOriginalPic; // Source sent in by BeginFrame |
| int8_t pic_init_qp_minus26; |
| |
| // Slice parameters |
| int8_t slice_qp_delta; |
| uint8_t num_ref_idx_l0_active_minus1; |
| uint8_t num_ref_idx_l1_active_minus1; |
| bool List0RefID0FieldParity; |
| bool List0RefID1FieldParity; |
| bool List0RefID2FieldParity; |
| bool List0RefID3FieldParity; |
| bool List0RefID4FieldParity; |
| bool List0RefID5FieldParity; |
| bool List0RefID6FieldParity; |
| bool List0RefID7FieldParity; |
| bool List1RefID0FieldParity; |
| bool List1RefID1FieldParity; |
| uint8_t *pCurbeBinary; |
| }; |
| |
| //! |
| //! \struct EncodeReadBrcPakStatsParams |
| //! \brief Encode read brc pak states parameters |
| //! |
| struct EncodeReadBrcPakStatsParams |
| { |
| CodechalHwInterface *pHwInterface; |
| PMOS_RESOURCE presBrcPakStatisticBuffer; |
| PMOS_RESOURCE presStatusBuffer; |
| uint32_t dwStatusBufNumPassesOffset; |
| uint8_t ucPass; |
| MOS_GPU_CONTEXT VideoContext; |
| }; |
| |
| //! |
| //! \struct PakIntegrationBrcData |
| //! \brief The struct of Huc input command 2 |
| //! |
| struct PakIntegrationBrcData |
| { |
| uint32_t FrameByteCount; |
| uint32_t FrameByteCountNoHeader; |
| uint32_t HCP_ImageStatusControl; |
| }; |
| |
| //! |
| //! \struct SearchPathDelta |
| //! \brief The struct of Search Path Delta |
| //! |
| struct SearchPathDelta |
| { |
| uint8_t SearchPathDelta_X : 4; |
| uint8_t SearchPathDelta_Y : 4; |
| }; |
| |
| //! |
| //! \struct HwCounter |
| //! \brief Hardware counter |
| //! |
| struct HwCounter |
| { |
| uint64_t IV; // Big-Endian IV |
| uint64_t Count; // Big-Endian Block Count |
| }; |
| |
| //! |
| //! \struct PerfTagSetting |
| //! \brief Setting of performance tags |
| //! |
| struct PerfTagSetting |
| { |
| union |
| { |
| struct |
| { |
| uint16_t PictureCodingType : 2; |
| uint16_t CallType : 6; |
| uint16_t Mode : 4; |
| uint16_t : 4; |
| }; |
| uint16_t Value; |
| }; |
| }; |
| |
| //! |
| //! \struct SendKernelCmdsParams |
| //! \brief Struct of send kernel commands parameters |
| //! |
| struct SendKernelCmdsParams |
| { |
| CODECHAL_MEDIA_STATE_TYPE EncFunctionType = CODECHAL_NUM_MEDIA_STATES; |
| uint32_t uiDshIdx = 0; |
| uint8_t ucDmvPredFlag = 0; |
| bool bBrcResetRequested = false; |
| bool bEnable45ZWalkingPattern = false; |
| bool bEnableCustomScoreBoard = false; |
| PMHW_VFE_SCOREBOARD pCustomScoreBoard = nullptr; |
| PMHW_KERNEL_STATE pKernelState = nullptr; |
| bool bDshInUse = false; |
| }; |
| |
| //! |
| //! \struct BrcQpReport |
| //! \brief Struct of Query bit rate control and QP Status |
| //! |
| struct BrcQpReport |
| { |
| // uint32_t 0 |
| union |
| { |
| struct |
| { |
| uint32_t QPPrimeY : 8; |
| uint32_t QPPrimeCb : 8; |
| uint32_t QPPrimeCr : 8; |
| uint32_t Reserved : 8; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW0; |
| |
| // uint32_t 1 ~ 15 |
| struct |
| { |
| uint32_t Value[15]; |
| }; |
| }; |
| |
| //! |
| //! \struct LookaheadStatus |
| //! \brief Struct of Query bit rate control and QP Status |
| //! |
| struct LookaheadReport |
| { |
| uint32_t StatusReportNumber; |
| union |
| { |
| struct |
| { |
| uint32_t cqmHint : 8; |
| uint32_t intraHint : 1; |
| uint32_t reserved2 : 22; |
| uint32_t isValid : 1; |
| }; |
| uint32_t encodeHints; |
| }; |
| uint32_t targetFrameSize; |
| uint32_t targetBufferFulness; |
| uint32_t pyramidDeltaQP; |
| uint8_t miniGopSize; |
| uint8_t reserved1[3]; |
| uint32_t reserved3[10]; |
| }; |
| |
| //! |
| //! \struct EncodeBrcBuffers |
| //! \brief Encode brc buffers |
| //! |
| struct EncodeBrcBuffers |
| { |
| MOS_RESOURCE resBrcHistoryBuffer; // BRC history buffer |
| MOS_RESOURCE resBrcPakStatisticBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; |
| uint32_t uiCurrBrcPakStasIdxForRead; |
| uint32_t uiCurrBrcPakStasIdxForWrite; |
| MOS_RESOURCE resBrcImageStatesReadBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; // read only BRC image state buffer |
| MOS_RESOURCE resBrcImageStatesWriteBuffer; // write only BRC image state buffer |
| MOS_RESOURCE resHevcBrcImageStatesWriteBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; // write only HEVC BRC image state buffers |
| MOS_RESOURCE resPakQPInputTable; |
| MOS_RESOURCE resBrcConstantDataBuffer; |
| MOS_RESOURCE resEncoderCfgCommandReadBuffer; |
| MOS_RESOURCE resEncoderCfgCommandWriteBuffer; |
| MOS_RESOURCE resBrcPakStatsBeforeDumpBuffer; // These buffers are used to dump all the MMIO read values |
| MOS_RESOURCE resBrcPakStatsAfterDumpBuffer; // which are super-set of PakStat |
| MOS_SURFACE sBrcConstantDataBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; |
| MOS_SURFACE sMeBrcDistortionBuffer; |
| uint32_t dwMeBrcDistortionBottomFieldOffset; |
| MOS_RESOURCE resMbBrcConstDataBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; |
| MOS_SURFACE sBrcMbQpBuffer; |
| uint32_t dwBrcMbQpBottomFieldOffset; |
| MOS_RESOURCE resBrcPicHeaderInputBuffer; |
| MOS_RESOURCE resBrcPicHeaderOutputBuffer; |
| MOS_RESOURCE resMbEncAdvancedDsh; |
| MOS_RESOURCE resMbEncBrcBuffer; |
| MOS_SURFACE sBrcRoiSurface; // BRC ROI surface |
| PMHW_KERNEL_STATE pMbEncKernelStateInUse; |
| }; |
| |
| //! |
| //! \struct CODECHAL_ENCODE_BUFFER |
| //! \brief Codechal encode buffer |
| //! |
| struct CODECHAL_ENCODE_BUFFER |
| { |
| MOS_RESOURCE sResource; |
| uint32_t dwSize = 0; |
| }; |
| using PCODECHAL_ENCODE_BUFFER = CODECHAL_ENCODE_BUFFER*; |
| |
| //! |
| //! \struct CodechalTileInfo |
| //! \brief Tile info report to application |
| //! |
| struct CodechalTileInfo |
| { |
| uint16_t TileRowNum; |
| uint16_t TileColNum; |
| uint32_t TileBitStreamOffset; |
| uint32_t TileSizeInBytes; |
| |
| uint32_t reserved; |
| HwCounter HWCounterValue; |
| }; |
| |
| //! |
| //! \struct EncodeStatusReport |
| //! \brief Encode status report structure |
| //! |
| struct EncodeStatusReport |
| { |
| CODECHAL_STATUS CodecStatus; //!< Status for the picture associated with this status report |
| uint32_t StatusReportNumber; //!< Status report number associated with the picture in this status report provided in CodechalEncoderState::Execute() |
| CODEC_PICTURE CurrOriginalPic; //!< Uncompressed frame information for the picture associated with this status report |
| CODECHAL_ENCODE_FUNCTION_ID Func; //!< Encode function requested at CodechalEncoderState::Execute() |
| PCODEC_REF_LIST pCurrRefList; //!< Reference list for the current frame, used for dump purposes with CodecHal Debug Tool |
| /*! \brief Specifies the order in which the statuses are expected. |
| * |
| * The order in which a status is returned is requested at the DDI level and the order itself is determined by StatusReportNumber. |
| * FALSE indicates the statuses should be returned in reverse order. |
| * TRUE indicates the statuses should be returned in sequential order. |
| */ |
| bool bSequential; |
| /*! \brief Coded bitstream size reported by HW. |
| * |
| * The size reported by HW is the total bitstream size that is encoded by HW including any bitstream buffer overrun. That is, HW continues counting the encoded bytes past the programmed upperbound based on the allocated bitstream buffer size. The framework can compare this value to the allocated buffer size to determine if there was overflow for this frame and can act accordingly. |
| */ |
| uint32_t bitstreamSize; |
| /*! \brief Qp value for Y used for the first PAK pass. |
| * |
| * It is not valid if CQP is set by framework. |
| */ |
| int8_t QpY; |
| /*! \brief Suggested Qp delta value for Y. |
| * |
| * Framework can add this delta Qp with the first pass QpY to get the final Qp used for multi-pass. It is not valid if CQP is set by framework. |
| * Note: Framework can use this reported QpY and suggestedQpYDelta to set QpY in picture parameter to minimize LCU level Qp delta. |
| */ |
| int8_t SuggestedQpYDelta; |
| uint8_t NumberPasses; //!< Number of PAK passes executed. |
| uint8_t AverageQp; //!< The average QP of all MBs or LCUs of the frame. |
| HwCounter HWCounterValue; |
| uint64_t * hwctr; |
| union |
| { |
| struct |
| { |
| uint32_t PanicMode : 1; //!< Indicates that panic mode was triggered by HW for this frame. |
| uint32_t SliceSizeOverflow : 1; //!< When SliceLevelRateCtrl is used, indicates the requested slice size was not met for one or more generated slices. |
| uint32_t NumSlicesNonCompliant : 1; //!< When SliceLevelRateCtrl is used, indicates whether or not the number of generated slices exceeds specification limits. |
| uint32_t LongTermReference : 1; |
| uint32_t FrameSkipped : 1; |
| uint32_t SceneChangeDetected : 1; |
| uint32_t : 26; |
| }; |
| uint32_t QueryStatusFlags; |
| }; |
| /*! \brief The average MAD (Mean Absolute Difference) across all macroblocks in the Y plane. |
| * |
| * The MAD value is the mean of the absolute difference between the pixels in the original block and the corresponding pixels in the block being used for comparison, from motion compensation or intra spatial prediction. MAD reporting is disabled by default. |
| */ |
| uint32_t MAD; |
| uint32_t loopFilterLevel; //!< [VP9] |
| int8_t LongTermIndication; //!< [VP9] |
| uint16_t NextFrameWidthMinus1; //!< [VP9] |
| uint16_t NextFrameHeightMinus1; //!< [VP9] |
| uint8_t NumberSlices; //!< Number of slices generated for the frame. |
| uint16_t PSNRx100[3]; //!< PSNR for different channels |
| uint32_t NumberTilesInFrame; //!< Number of tiles generated for the frame. |
| uint8_t UsedVdBoxNumber; //!< Number of vdbox used. |
| uint32_t SizeOfSliceSizesBuffer; //!< Store the size of slice size buffer |
| uint16_t *pSliceSizes; //!< Pointer to the slice size buffer |
| uint32_t SizeOfTileInfoBuffer; //!< Store the size of tile info buffer |
| CodechalTileInfo* pHEVCTileinfo; //!< Pointer to the tile info buffer |
| uint32_t NumTileReported; //!< The number of tiles reported in status |
| |
| /*! \brief indicate whether it is single stream encoder or MFE. |
| * |
| * For single stream encoder (regular), this value should be set to default 0. For Multi-Frame-Encoder (MFE), this value is the StreamId that is set by application. |
| */ |
| uint32_t StreamId; |
| |
| LookaheadReport* pLookaheadStatus; //!< Pointer to the lookahead status buffer. Valid in lookahead pass only. |
| }; |
| |
| //! |
| //! \struct EncodeStatusSliceReport |
| //! \brief The struct stores Encode status buffers |
| //! |
| struct EncodeStatusSliceReport |
| { |
| uint32_t SliceSizeOverflow; |
| uint8_t NumberSlices; |
| uint32_t SizeOfSliceSizesBuffer; |
| PMOS_RESOURCE pSliceSize; |
| uint32_t reserved; |
| }; |
| |
| //! |
| //! \struct EncodeStatus |
| //! \brief The struct stores Encode status |
| //! |
| struct EncodeStatus |
| { |
| uint32_t dwStoredDataMfx; //!< HW requires a QW aligned offset for data storage |
| uint32_t dwPad; //!< Pad |
| struct |
| { |
| uint32_t dwStoredData; |
| uint32_t dwPad; |
| } qwStoredDataEnc[CODECHAL_NUM_MEDIA_STATES]; //!< Media states of stored encode data |
| uint32_t dwStoredData; //!< SW stored data |
| uint32_t dwMFCBitstreamByteCountPerFrame; //!< Media fixed function bitstream byte count per frame |
| uint32_t dwMFCBitstreamSyntaxElementOnlyBitCount; //!< Media fixed function bitstream bit count for syntax element only |
| uint32_t reserved; |
| uint32_t dwImageStatusMask; //!< MUST ENSURE THAT THIS IS QWORD ALIGNED as it's used for the conditional BB end |
| MHW_VDBOX_IMAGE_STATUS_CONTROL ImageStatusCtrl; //!< Used for storing the control flags for the image status |
| uint32_t HuCStatusRegMask; //!< MUST ENSURE THAT THIS IS QWORD ALIGNED as it's used for the conditional BB end |
| uint32_t HuCStatusReg; //!< Register value saving HuC Status |
| MHW_VDBOX_PAK_NUM_OF_SLICES NumSlices; //!< Num of slices for encode |
| uint32_t dwErrorFlags; //!< The definition is different on SNB/IVB, hence DWORD |
| union |
| { |
| BrcQpReport BrcQPReport; //!< Query bit rate control and QP Status |
| LookaheadReport lookaheadStatus; //!< Lookahead status. valid in lookahead pass only |
| }; |
| uint32_t dwNumberPasses; //!< Number of passes |
| uint32_t dwHeaderBytesInserted; //!< The size including header, prevention bytes and dummy "0xff" inserted by SW driver |
| CodechalQpStatusCount QpStatusCount; //!< This is used to obtain the cumulative QP |
| EncodeStatusReport encodeStatusReport; //!< The detailed encode status report structure |
| uint16_t wPictureCodingType; //!< Type of picture coding |
| uint32_t LoopFilterLevel; //!< The level of loop filter |
| MHW_VDBOX_IMAGE_STATUS_CONTROL ImageStatusCtrlOfLastBRCPass; //!< The level of loop filter |
| uint32_t dwSceneChangedFlag; //!< The flag indicate if the scene is changed |
| uint64_t sumSquareError[3]; //!< The list of sum square error |
| EncodeStatusSliceReport sliceReport; |
| }; |
| |
| //! |
| //! \struct EncodeStatusBuffer |
| //! \brief The sturct of encode status buffer |
| //! |
| struct EncodeStatusBuffer |
| { |
| uint8_t *pEncodeStatus; //!> needs to be first to ensure alingment of dwStoredDataMfx/Vme |
| MOS_RESOURCE resStatusBuffer; //!> Handle of eStatus buffer |
| uint32_t *pData; //!> Pointer of the buffer of actual data |
| uint16_t wFirstIndex; //!> Indicate the first index of status |
| uint16_t wCurrIndex; //!> Indicate current index of status |
| uint32_t dwStoreDataOffset; //!> The offset of stored data |
| uint32_t dwBSByteCountOffset; //!> The offset of BS byte count |
| uint32_t dwBSSEBitCountOffset; //!> The offset of BS SE byte count |
| uint32_t dwImageStatusMaskOffset; //!> The offset of image status mask |
| uint32_t dwImageStatusCtrlOffset; //!> The offset of status control |
| uint32_t dwHuCStatusMaskOffset; //!> The offset of HuC status register mask |
| uint32_t dwHuCStatusRegOffset; //!> The offset of HuC status register |
| uint32_t dwNumSlicesOffset; //!> The offset of silce num |
| uint32_t dwErrorFlagOffset; //!> The offset of error flag |
| uint32_t dwBRCQPReportOffset; //!> The offset of bitrate control QP report |
| uint32_t dwNumPassesOffset; //!> The offset of passes number |
| uint32_t dwQpStatusCountOffset; //!> The offset of QP status count |
| uint32_t dwImageStatusCtrlOfLastBRCPassOffset; //!> The offset of image status control of last bitrate control pass |
| uint32_t dwSceneChangedOffset; //!> The offset of the scene changed flag |
| uint32_t dwSumSquareErrorOffset; //!> The offset of list of sum square error |
| uint32_t dwSliceReportOffset; //!> The offset of slice size report structure |
| uint32_t dwLookaheadStatusOffset; //!> The offset of lookahead status |
| uint32_t dwSize; //!> Size of status buffer |
| uint32_t dwReportSize; //!> Size of report |
| }; |
| |
| //! |
| //! \struct AtomicScratchBuffer |
| //! \brief The sturct of Atomic Scratch Buffer |
| //! |
| struct AtomicScratchBuffer |
| { |
| MOS_RESOURCE resAtomicScratchBuffer; //!> Handle of eStatus buffer |
| uint32_t *pData; //!> Pointer of the buffer of actual data |
| uint16_t wEncodeUpdateIndex; //!> used for VDBOX update encode status |
| uint16_t wTearDownIndex; //!> Reserved for future extension |
| uint32_t dwZeroValueOffset; //!> Store the result of the ATOMIC_CMP |
| uint32_t dwOperand1Offset; //!> Operand 1 of the ATOMIC_CMP |
| uint32_t dwOperand2Offset; //!> Operand 2 of the ATOMIC_CMP |
| uint32_t dwOperand3Offset; //!> Copy of the operand 1 |
| |
| uint32_t dwSize; //!> Size of the buffer |
| uint32_t dwOperandSetSize; //!> Size of Operand set |
| }; |
| |
| //! |
| //! \struct CodechalEncodeBbuf |
| //! \brief Struct for Batch buffer |
| //! |
| struct CodechalEncodeBbuf |
| { |
| MHW_BATCH_BUFFER BatchBuffer; |
| uint32_t dwSize; |
| uint32_t dwNumMbsInBBuf; |
| bool fieldScale; |
| }; |
| |
| //! |
| //! \struct CodechalEncodeIdOffsetParams |
| //! \brief Indicate the ID Offset parameters |
| //! |
| struct CodechalEncodeIdOffsetParams |
| { |
| uint32_t Standard; |
| CODECHAL_MEDIA_STATE_TYPE EncFunctionType; |
| uint16_t wPictureCodingType; |
| uint8_t ucDmvPredFlag; |
| bool interlacedField; |
| }; |
| |
| //! |
| //! \struct VdencBrcPakMmio |
| //! \brief MMIO of BRC and PAK |
| //! |
| struct VdencBrcPakMmio |
| { |
| uint32_t dwReEncode[4]; |
| }; |
| |
| //! |
| //! \struct VdencHucErrorStatus |
| //! \brief Huc Error Flags |
| //! |
| struct VdencHucErrorStatus |
| { |
| uint32_t dwErrorFlag[4]; |
| }; |
| |
| //! |
| //! \enum EncodeMode |
| //! \brief Encode mode |
| //! |
| enum EncodeMode |
| { |
| encodeNormalMode = 0, |
| encodePerformanceMode = 1, |
| encodeQualityMode = 2 |
| }; |
| |
| enum |
| { |
| CODECHAL_ENCODE_PERFTAG_CALL_MBENC_KERNEL, |
| CODECHAL_ENCODE_PERFTAG_CALL_MBENC_PHASE1_KERNEL = CODECHAL_ENCODE_PERFTAG_CALL_MBENC_KERNEL, |
| CODECHAL_ENCODE_PERFTAG_CALL_MBENC_PHASE2_KERNEL, |
| CODECHAL_ENCODE_PERFTAG_CALL_SCALING_KERNEL, |
| CODECHAL_ENCODE_PERFTAG_CALL_INTRA_DIST, |
| CODECHAL_ENCODE_PERFTAG_CALL_ME_KERNEL, |
| CODECHAL_ENCODE_PERFTAG_CALL_BRC_INIT_RESET, |
| CODECHAL_ENCODE_PERFTAG_CALL_BRC_UPDATE, |
| CODECHAL_ENCODE_PERFTAG_CALL_BRC_COPY, |
| CODECHAL_ENCODE_PERFTAG_CALL_PAK_ENGINE, |
| CODECHAL_ENCODE_PERFTAG_CALL_PAK_KERNEL, |
| CODECHAL_ENCODE_PERFTAG_CALL_PAK_PHASE1_KERNEL = CODECHAL_ENCODE_PERFTAG_CALL_PAK_KERNEL, |
| CODECHAL_ENCODE_PERFTAG_CALL_PAK_PHASE2_KERNEL, |
| CODECHAL_ENCODE_PERFTAG_CALL_UPSCALING, |
| CODECHAL_ENCODE_PERFTAG_CALL_DEBLOCKING, |
| CODECHAL_ENCODE_PERFTAG_CALL_WP_KERNEL, |
| CODECHAL_ENCODE_PERFTAG_CALL_32X32_PU_MD, |
| CODECHAL_ENCODE_PERFTAG_CALL_32X32_B_IC, |
| CODECHAL_ENCODE_PERFTAG_CALL_16X16_PU_MD, |
| CODECHAL_ENCODE_PERFTAG_CALL_16X16_SAD, |
| CODECHAL_ENCODE_PERFTAG_CALL_8X8_PU, |
| CODECHAL_ENCODE_PERFTAG_CALL_8X8_FMODE, |
| CODECHAL_ENCODE_PERFTAG_CALL_BRC_UPDATE_LCU, |
| CODECHAL_ENCODE_PERFTAG_CALL_MBENC_I_32x32, |
| CODECHAL_ENCODE_PERFTAG_CALL_MBENC_I_16x16, |
| CODECHAL_ENCODE_PERFTAG_CALL_MBENC_P, |
| CODECHAL_ENCODE_PERFTAG_CALL_MBENC_TX, |
| CODECHAL_ENCODE_PERFTAG_CALL_MBPAK_RECON_LUMA, |
| CODECHAL_ENCODE_PERFTAG_CALL_MBPAK_RECON_CHROMA, |
| CODECHAL_ENCODE_PERFTAG_CALL_MBPAK_RECON_LUMA_32x32, |
| CODECHAL_ENCODE_PERFTAG_CALL_MBPAK_RECON_INTRA_LUMA, |
| CODECHAL_ENCODE_PERFTAG_CALL_MBPAK_RECON_INTRA_CHROMA, |
| CODECHAL_ENCODE_PERFTAG_CALL_MBPAK_DEBLOCK_MASK, |
| CODECHAL_ENCODE_PERFTAG_CALL_MBPAK_DEBLOCK_LUMA, |
| CODECHAL_ENCODE_PERFTAG_CALL_MBPAK_DEBLOCK_CHROMA, |
| CODECHAL_ENCODE_PERFTAG_CALL_MBPAK_MC, |
| CODECHAL_ENCODE_PERFTAG_CALL_PREPROC_KERNEL, |
| CODECHAL_ENCODE_PERFTAG_CALL_DS_CONVERSION_KERNEL, |
| CODECHAL_ENCODE_PERFTAG_CALL_SCOREBOARD, |
| CODECHAL_ENCODE_PERFTAG_CALL_SFD_KERNEL |
| }; |
| |
| class CodechalEncodeWP; |
| #if USE_CODECHAL_DEBUG_TOOL |
| class CodechalDebugEncodePar; |
| #endif |
| |
| //! |
| //! \class CodechalEncoderGenState |
| //! \brief Codechal encoder gen state |
| //! |
| class CodechalEncoderGenState |
| { |
| public: |
| CodechalEncoderGenState(CodechalEncoderState* encoder); |
| |
| virtual ~CodechalEncoderGenState() {} |
| |
| CodechalEncoderState* m_encoder = nullptr; |
| // Encoder private data |
| CodechalHwInterface* m_hwInterface = nullptr; |
| PMOS_INTERFACE m_osInterface = nullptr; |
| CodechalDebugInterface* m_debugInterface = nullptr; |
| MhwMiInterface* m_miInterface = nullptr; //!< Common Mi Interface |
| MhwRenderInterface* m_renderEngineInterface = nullptr; //!< Render engine interface |
| PMHW_STATE_HEAP_INTERFACE m_stateHeapInterface = nullptr; //!< State heap interface |
| |
| virtual MOS_STATUS SetCurbeMe( |
| MeCurbeParams* params) |
| { |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| virtual MOS_STATUS SendMeSurfaces( |
| PMOS_COMMAND_BUFFER cmdBuffer, |
| MeSurfaceParams* params) |
| { |
| return MOS_STATUS_SUCCESS; |
| } |
| }; |
| |
| //! |
| //! \class CodechalEncoderState |
| //! \brief This base class defines the common member fields, functions etc used by all encoder. |
| //! |
| class CodechalEncoderState : public Codechal |
| { |
| public: |
| //! |
| //! \enum RefId |
| //! \brief Reference id |
| //! |
| enum RefId |
| { |
| CODECHAL_ENCODE_REF_ID_0 = 0, |
| CODECHAL_ENCODE_REF_ID_1 = 1, |
| CODECHAL_ENCODE_REF_ID_2 = 2, |
| CODECHAL_ENCODE_REF_ID_3 = 3, |
| CODECHAL_ENCODE_REF_ID_4 = 4, |
| CODECHAL_ENCODE_REF_ID_5 = 5, |
| CODECHAL_ENCODE_REF_ID_6 = 6, |
| CODECHAL_ENCODE_REF_ID_7 = 7, |
| }; |
| |
| // this is used for Mpeg2 encoding BRC as well, |
| // therefore, the last entry is for Mpeg2 |
| const uint8_t m_bMeMethodGeneric[NUM_TARGET_USAGE_MODES + 1] = {0, 4, 4, 6, 6, 6, 6, 4, 7}; |
| |
| const uint8_t m_meMethodGeneric[NUM_TARGET_USAGE_MODES + 1] = {0, 4, 4, 6, 6, 6, 6, 4, 7}; |
| |
| const uint32_t m_superCombineDistGeneric[NUM_TARGET_USAGE_MODES + 1] ={0, 1, 1, 5, 5, 5, 9, 9, 0}; |
| |
| static constexpr uint32_t CODECHAL_ENCODE_BRCINIT_ISCBR = 0x0010; |
| static constexpr uint32_t CODECHAL_ENCODE_BRCINIT_ISVBR = 0x0020; |
| static constexpr uint32_t CODECHAL_ENCODE_BRCINIT_ISAVBR = 0x0040; |
| static constexpr uint32_t CODECHAL_ENCODE_BRCINIT_ISCQL = 0x0080; |
| static constexpr uint32_t CODECHAL_ENCODE_BRCINIT_FIELD_PIC = 0x0100; |
| static constexpr uint32_t CODECHAL_ENCODE_BRCINIT_ISICQ = 0x0200; |
| static constexpr uint32_t CODECHAL_ENCODE_BRCINIT_ISVCM = 0x0400; |
| static constexpr uint32_t CODECHAL_ENCODE_BRCINIT_IGNORE_PICTURE_HEADER_SIZE = 0x2000; |
| static constexpr uint32_t CODECHAL_ENCODE_BRCINIT_ISQVBR = 0x4000; |
| static constexpr uint32_t CODECHAL_ENCODE_BRCINIT_DISABLE_MBBRC = 0x8000; |
| static constexpr uint32_t m_numLaDataEntry = 128; //!< number of entries in lookahead data buffer and lookahead stats buffer |
| |
| // SearchPath Table, index [CodingType][MEMethod][] |
| const uint32_t m_encodeSearchPath[2][8][16] = |
| { |
| // I-Frame & P-Frame |
| { |
| // MEMethod: 0 |
| { |
| 0x120FF10F, 0x1E22E20D, 0x20E2FF10, 0x2EDD06FC, 0x11D33FF1, 0xEB1FF33D, 0x4EF1F1F1, 0xF1F21211, |
| 0x0DFFFFE0, 0x11201F1F, 0x1105F1CF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 |
| }, |
| // MEMethod: 1 |
| { |
| 0x120FF10F, 0x1E22E20D, 0x20E2FF10, 0x2EDD06FC, 0x11D33FF1, 0xEB1FF33D, 0x4EF1F1F1, 0xF1F21211, |
| 0x0DFFFFE0, 0x11201F1F, 0x1105F1CF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 |
| }, |
| // MEMethod: 2 |
| { |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, |
| 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 |
| }, |
| // MEMethod: 3 |
| { |
| 0x01010101, 0x11010101, 0x01010101, 0x11010101, 0x01010101, 0x11010101, 0x01010101, 0x11010101, |
| 0x01010101, 0x11010101, 0x01010101, 0x00010101, 0x00000000, 0x00000000, 0x00000000, 0x00000000 |
| }, |
| // MEMethod: 4 |
| { |
| 0x0101F00F, 0x0F0F1010, 0xF0F0F00F, 0x01010101, 0x10101010, 0x0F0F0F0F, 0xF0F0F00F, 0x0101F0F0, |
| 0x01010101, 0x10101010, 0x0F0F1010, 0x0F0F0F0F, 0xF0F0F00F, 0xF0F0F0F0, 0x00000000, 0x00000000 |
| }, |
| // MEMethod: 5 |
| { |
| 0x0101F00F, 0x0F0F1010, 0xF0F0F00F, 0x01010101, 0x10101010, 0x0F0F0F0F, 0xF0F0F00F, 0x0101F0F0, |
| 0x01010101, 0x10101010, 0x0F0F1010, 0x0F0F0F0F, 0xF0F0F00F, 0xF0F0F0F0, 0x00000000, 0x00000000 |
| }, |
| // MEMethod: 6 |
| { |
| 0x120FF10F, 0x1E22E20D, 0x20E2FF10, 0x2EDD06FC, 0x11D33FF1, 0xEB1FF33D, 0x4EF1F1F1, 0xF1F21211, |
| 0x0DFFFFE0, 0x11201F1F, 0x1105F1CF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 |
| }, |
| // MEMethod: 7 used for mpeg2 encoding P frames |
| { |
| 0x1F11F10F, 0x2E22E2FE, 0x20E220DF, 0x2EDD06FC, 0x11D33FF1, 0xEB1FF33D, 0x02F1F1F1, 0x1F201111, |
| 0xF1EFFF0C, 0xF01104F1, 0x10FF0A50, 0x000FF1C0, 0x00000000, 0x00000000, 0x00000000, 0x00000000 |
| } |
| }, |
| // B-Frame |
| { |
| // MEMethod: 0 |
| { |
| 0x0101F00F, 0x0F0F1010, 0xF0F0F00F, 0x01010101, 0x10101010, 0x0F0F0F0F, 0xF0F0F00F, 0x0101F0F0, |
| 0x01010101, 0x10101010, 0x0F0F1010, 0x0F0F0F0F, 0xF0F0F00F, 0xF0F0F0F0, 0x00000000, 0x00000000 |
| }, |
| // MEMethod: 1 |
| { |
| 0x0101F00F, 0x0F0F1010, 0xF0F0F00F, 0x01010101, 0x10101010, 0x0F0F0F0F, 0xF0F0F00F, 0x0101F0F0, |
| 0x01010101, 0x10101010, 0x0F0F1010, 0x0F0F0F0F, 0xF0F0F00F, 0xF0F0F0F0, 0x00000000, 0x00000000 |
| }, |
| // MEMethod: 2 |
| { |
| 0x0101F00F, 0x0F0F1010, 0xF0F0F00F, 0x01010101, 0x10101010, 0x0F0F0F0F, 0xF0F0F00F, 0x0101F0F0, |
| 0x01010101, 0x10101010, 0x0F0F1010, 0x0F0F0F0F, 0xF0F0F00F, 0xF0F0F0F0, 0x00000000, 0x00000000 |
| }, |
| // MEMethod: 3 |
| { |
| 0x0101F00F, 0x0F0F1010, 0xF0F0F00F, 0x01010101, 0x10101010, 0x0F0F0F0F, 0xF0F0F00F, 0x0101F0F0, |
| 0x01010101, 0x10101010, 0x0F0F1010, 0x0F0F0F0F, 0xF0F0F00F, 0xF0F0F0F0, 0x00000000, 0x00000000 |
| }, |
| // MEMethod: 4 |
| { |
| 0x0101F00F, 0x0F0F1010, 0xF0F0F00F, 0x01010101, 0x10101010, 0x0F0F0F0F, 0xF0F0F00F, 0x0101F0F0, |
| 0x01010101, 0x10101010, 0x0F0F1010, 0x0F0F0F0F, 0xF0F0F00F, 0xF0F0F0F0, 0x00000000, 0x00000000 |
| }, |
| // MEMethod: 5 |
| { |
| 0x0101F00F, 0x0F0F1010, 0xF0F0F00F, 0x01010101, 0x10101010, 0x0F0F0F0F, 0xF0F0F00F, 0x0101F0F0, |
| 0x01010101, 0x10101010, 0x0F0F1010, 0x0F0F0F0F, 0xF0F0F00F, 0xF0F0F0F0, 0x00000000, 0x00000000 |
| }, |
| // MEMethod: 6 |
| { |
| 0x120FF10F, 0x1E22E20D, 0x20E2FF10, 0x2EDD06FC, 0x11D33FF1, 0xEB1FF33D, 0x4EF1F1F1, 0xF1F21211, |
| 0x0DFFFFE0, 0x11201F1F, 0x1105F1CF, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 |
| }, |
| // MEMethod: 7 used for mpeg2 encoding B frames |
| { |
| 0x1F11F10F, 0x2E22E2FE, 0x20E220DF, 0x2EDD06FC, 0x11D33FF1, 0xEB1FF33D, 0x02F1F1F1, 0x1F201111, |
| 0xF1EFFF0C, 0xF01104F1, 0x10FF0A50, 0x000FF1C0, 0x00000000, 0x00000000, 0x00000000, 0x00000000 |
| } |
| } |
| }; |
| |
| // ME kernel |
| enum |
| { |
| CODECHAL_ENCODE_ME_IDX_P = 0, |
| CODECHAL_ENCODE_ME_IDX_B = 1, |
| CODECHAL_ENCODE_ME_IDX_VDENC = 1, |
| CODECHAL_ENCODE_ME_IDX_NUM = 2 |
| }; |
| |
| //! |
| //! \struct MediaObjectInlineData |
| //! \brief Media object inline data |
| //! |
| struct MediaObjectInlineData |
| { |
| // uint32_t 0 |
| union |
| { |
| struct |
| { |
| uint32_t mbHorizontalOrigin : 8; // in MB unit |
| uint32_t mbVerticalOrigin : 8; // in MB unit |
| uint32_t : 16; |
| }; |
| // For BRC Block Copy kernels |
| struct |
| { |
| uint32_t blockHeight : 16; |
| uint32_t bufferOffset : 16; |
| }; |
| struct |
| { |
| uint32_t value; |
| }; |
| } DW0; |
| }; |
| |
| //! |
| //! \brief Constructor |
| //! |
| CodechalEncoderState( |
| CodechalHwInterface* hwInterface, |
| CodechalDebugInterface* debugInterface, |
| PCODECHAL_STANDARD_INFO standardInfo); |
| |
| //! |
| //! \brief Destructor |
| //! |
| virtual ~CodechalEncoderState(); |
| |
| // Encoder private data |
| MhwVdboxMfxInterface* m_mfxInterface = nullptr; //!< Mfx Interface |
| MhwVdboxHcpInterface* m_hcpInterface = nullptr; //!< Hcp Interface |
| MhwVdboxHucInterface* m_hucInterface = nullptr; //!< Huc Interface |
| MhwVdboxVdencInterface* m_vdencInterface = nullptr; //!< Vdenc Interface |
| MhwMiInterface* m_miInterface = nullptr; //!< Mi Interface |
| MhwRenderInterface* m_renderEngineInterface = nullptr; //!< Render engine interface |
| PMHW_STATE_HEAP_INTERFACE m_stateHeapInterface = nullptr; //!< State heap interface |
| CodechalEncodeAllocator* m_allocator = nullptr; //!< Resource allocator |
| CodechalEncodeTrackedBuffer* m_trackedBuf = nullptr; //!< Tracked buffer state |
| |
| PLATFORM m_platform = {}; //!< The platorm info |
| MEDIA_FEATURE_TABLE *m_skuTable = nullptr; //!< SKU table |
| MEDIA_WA_TABLE *m_waTable = nullptr; //!< WA table |
| CodecHalMmcState* m_mmcState = nullptr; //!< Memory compression |
| MEDIA_SYSTEM_INFO *m_gtSystemInfo = nullptr; //!< GT system infomation |
| MOS_GPU_NODE m_videoGpuNode = MOS_GPU_NODE_MAX; //!< GPU node of video |
| MOS_GPU_CONTEXT m_videoContext = MOS_GPU_CONTEXT_INVALID_HANDLE; //!< GPU context of video |
| MOS_GPU_CONTEXT m_videoContextExt[4]; //!< Extand GPU context |
| MOS_GPU_CONTEXT m_renderContext = MOS_GPU_CONTEXT_INVALID_HANDLE; //!< GPU context of render |
| bool m_pakEnabled = false; //!< flag to indicate if PAK is enabled |
| bool m_encEnabled = false; //!< flag to indicate if ENC is enabled |
| bool m_videoNodeAssociationCreated = false; //!< flag to indicate if video node association is created |
| bool m_computeContextEnabled = false; //!< flag to indicate if compute context is enabled |
| bool m_needCheckCpEnabled = false; //!< Indicate if checking cp is needed when prepare default nodes |
| bool m_vdboxOneDefaultUsed = false; //!< Indicate VDBOX 1 is always used when prepare default nodes |
| |
| CodechalEncoderGenState* m_encoderGenState = nullptr; //!< Pointer to Gen Specific Encoder State |
| CodechalEncodeCscDs* m_cscDsState = nullptr; //!< pointer to CSC Downscaling state |
| CodechalEncodeWP* m_wpState = nullptr; //!< pointer to weighted prediction state |
| CODECHAL_FUNCTION m_codecFunction = CODECHAL_FUNCTION_INVALID; //!< The encode state's codec function used |
| uint32_t m_standard = 0; //!< The encode state's standard |
| uint32_t m_mode = 0; //!< The encode mode |
| MHW_WALKER_MODE m_walkerMode = MHW_WALKER_MODE_NOT_SET; //!< The encode walker's mode |
| uint8_t m_kernelMode = 0; //!< normal, performance, quality. |
| |
| bool m_mfeEnabled = false; //!< Mfe enabled |
| bool m_mfeMbEncEanbled = false; //!< Mfe MBEnc kernel enabled |
| bool m_mfeLastStream = false; //!< Is last stream during this submission |
| bool m_mfeFirstStream = false; //!< Is first stream during this submission |
| bool m_mfeInitialized = false; //!< Used for initializing MFE resources during first execute |
| MfeParams m_mfeEncodeParams = {}; //!< Mfe encode params during this submission |
| MfeSharedState * m_mfeEncodeSharedState = nullptr; //!< shared state from the parent context |
| |
| // Common Kernel Parameters |
| uint8_t* m_kernelBase = nullptr; //!< Kernel base address |
| uint32_t m_kuid = 0; //!< Kernel unified ID |
| |
| // Per-frame Application Settings |
| EncoderParams m_encodeParams = {}; //!< Encode parameters used in each frame |
| uint32_t *m_dataHwCount = nullptr; //!< HW count data |
| MOS_RESOURCE m_resHwCount = {}; //!< Resource of HW count |
| MOS_SURFACE m_prevRawSurface = {}; //!< Pointer to MOS_SURFACE of previous raw surface |
| MOS_SURFACE m_rawSurface = {}; //!< Pointer to MOS_SURFACE of raw surface |
| MOS_SURFACE m_reconSurface = {}; //!< Pointer to MOS_SURFACE of reconstructed surface |
| MOS_RESOURCE m_resBitstreamBuffer = {}; //!< Pointer to MOS_SURFACE of bitstream surface |
| PMOS_RESOURCE m_presMetadataBuffer = {}; //!< Pointer to metadata buffer |
| MetaDataOffset m_metaDataOffset = {}; //!< meta data offset |
| MOS_RESOURCE m_resMbCodeSurface = {}; //!< Pointer to MOS_SURFACE of MbCode surface |
| MOS_RESOURCE m_resMvDataSurface = {}; //!< Pointer to MOS_SURFACE of MvData surface |
| uint32_t m_mbDataBufferSize = 0; |
| HwCounter m_regHwCount[CODECHAL_ENCODE_STATUS_NUM + 1]; //!< HW count register value |
| |
| CODEC_PICTURE m_currOriginalPic = {}; //!< Raw. |
| CODEC_PICTURE m_currReconstructedPic = {}; //!< Recon. |
| uint16_t m_pictureCodingType = 0; //!< I, P, or B frame |
| int16_t m_frameNum = 0; //!< Frame number |
| bool m_firstFrame = true; //!< Flag to indicate if it is first frame |
| bool m_firstTwoFrames = false; //!< Flag to indicate if they are first two frames |
| bool m_firstField = true; //!< Flag to indicate if it is first field |
| bool m_resolutionChanged = false; //!< Flag to indicate if resolution is changed |
| bool m_scalingEnabled = false; //!< 4x Scaling kernel needs to be called for this frame |
| bool m_2xScalingEnabled = false; //!< 2x Scaling kernel only used by HEVC now |
| bool m_useRawForRef = false; //!< Flag to indicate if using raw surface for reference |
| bool m_disableReconMMCD = false; //!< disable Recon surface's MMC |
| bool m_repeatFrame = false; //!< Flag to indicate if current frame is repeat frame |
| bool m_pollingSyncEnabled = false; //!< Flag to indicate if GPU polling based sync for raw surface copy is enabled |
| uint32_t m_syncMarkerOffset = 0; //!< Sync marker offset in raw surface for GPU polling based sync |
| uint32_t m_syncMarkerValue = 0; //!< Sync marker value in raw surface for GPU polling based sync |
| uint8_t m_prevReconFrameIdx = 0; //!< Previous reconstruct frame index |
| uint8_t m_currReconFrameIdx = 0; //!< Current reconstruct frame index |
| |
| uint32_t m_frameWidth = 0; //!< Frame width in luma samples |
| uint32_t m_frameHeight = 0; //!< Frame height in luma samples |
| uint32_t m_frameFieldHeight = 0; //!< Frame height in luma samples |
| uint32_t m_oriFrameHeight = 0; //!< Original frame height |
| uint32_t m_oriFrameWidth = 0; //!< Original frame width |
| uint32_t m_createWidth = 0; //!< Max Frame Width for resolution reset |
| uint32_t m_createHeight = 0; //!< Max Frame Height for resolution reset |
| uint16_t m_picWidthInMb = 0; //!< Picture Width in MB width count |
| uint16_t m_picHeightInMb = 0; //!< Picture Height in MB height count |
| uint16_t m_frameFieldHeightInMb = 0; //!< Frame/field Height in MB |
| uint32_t m_bitstreamUpperBound = 0; //!< Bitstream upper bound |
| uint8_t m_oriFieldCodingFlag = 0; //!< Original field coding flag |
| uint32_t m_maxBtCount = 0; //!< Max bt count |
| bool m_cmKernelEnable = false; //!< Flag to indicate if cm kernel is enabled |
| bool m_feiEnable = false; //!< FEI is enabled |
| |
| // Synchronization |
| MOS_RESOURCE m_resSyncObjectRenderContextInUse = {}; //!< Resource of the sync object to indicate render context is in use |
| MOS_RESOURCE m_resSyncObjectVideoContextInUse = {}; //!< Resource of the sync object to indicate video context is in use |
| bool m_waitForPak = false; //!< Flag to indicate if waiting for PAK |
| bool m_signalEnc = false; //!< Flag used to signal ENC |
| uint32_t m_semaphoreObjCount = 0; //!< Count of semaphore objects |
| uint32_t m_semaphoreMaxCount = 0; //!< Max count of semaphore |
| |
| // Status Reporting |
| bool m_codecGetStatusReportDefined = false; //!< Need to be set to true by any codec/gen that has their own impleementation. |
| uint32_t m_storeData = 0; //!< Stored data |
| bool m_statusQueryReportingEnabled = false; //!< Flag to indicate if we support eStatus query reporting on current Platform |
| EncodeStatusBuffer m_encodeStatusBuf = {}; //!< Stores all the status_query related data for PAK engine |
| EncodeStatusBuffer m_encodeStatusBufRcs = {}; //!< Stores all the status_query related data for render ring (RCS) |
| MHW_VDBOX_IMAGE_STATUS_CONTROL m_imgStatusControlBuffer; //!< Stores image eStatus control data |
| uint32_t m_statusReportFeedbackNumber = 0; //!< Status report feed back number |
| bool m_frameTrackingEnabled = false; //!< Flag to indicate if we enable KMD frame tracking |
| uint32_t m_numberTilesInFrame = 0; //!< Track number of tiles per frame |
| bool m_inlineEncodeStatusUpdate = false; //!< check whether use inline encode status update or seperate BB |
| AtomicScratchBuffer m_atomicScratchBuf = {}; //!< Stores atomic operands and result |
| bool m_skipFrameBasedHWCounterRead = false; //!< Skip reading Frame base HW counter for status report |
| bool m_disableStatusReport = false; //!< Indicate status report is not needed. |
| |
| // Shared Parameters |
| BSBuffer m_bsBuffer = {}; //!< Bitstream buffer |
| bool m_newSeqHeader = false; //!< New sequence header flag |
| bool m_newPpsHeader = false; //!< New PPS header flag |
| bool m_newVuiData = false; //!< New Vui data flag |
| bool m_newSeq = false; //!< New sequence flag |
| bool m_lastPicInSeq = false; //!< Flag to indicate if it is last picture in sequence |
| bool m_lastPicInStream = false; //!< Flag to indicate if it is last picture in stream |
| uint8_t m_numRefPair = 0; //!< number of reference pair (forward & backward) |
| uint8_t m_numPasses = 0; //!< Number passes |
| uint8_t m_currPass = 0; //!< Current pass |
| bool m_forceSinglePakPass = false; //!< Flag to enable forcing single pak pass |
| bool m_useCmScalingKernel = false; //!< Flag to use cm scaling kernel |
| bool m_useMwWlkrForAsmScalingKernel = false; //!< Use media walker for ASM scaling kernel flag |
| bool m_combinedDownScaleAndDepthConversion = false; //!< Combied downscale and depth conversion |
| uint32_t m_brcPakStatisticsSize = 0; //!< Bitrate control PAK statistics size |
| uint32_t m_brcHistoryBufferSize = 0; //!< Bitrate control history buffer size |
| uint32_t m_mbencBrcBufferSize = 0; //!< Mbenc bitrate control buffer size |
| uint8_t m_numVdbox = 0; //!< Number of vdbox |
| uint8_t m_numUsedVdbox = 0; //!< Number of vdbox used |
| |
| // ENC/PAK batch buffer and surface indices |
| PCODEC_REF_LIST m_currRefList = nullptr; //!< Current reference list |
| uint8_t m_currRecycledBufIdx = 0; //!< Current recycled buffer index |
| uint8_t m_currEncBbSet = 0; //!< Current encode bb set |
| uint8_t m_currMbCodeIdx = 0; //!< Current mb code index |
| uint8_t m_currMadBufferIdx = 0; //!< Current mad buffer |
| uint32_t m_recycledBufStatusNum[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM] = {0}; //!< Recycled buffer status num list |
| uint32_t m_recycledBufWaitMs = 0; //!< Recycled buffer wait (ms) |
| |
| // User Feature Key Capabilities |
| bool m_hmeSupported = false; //!< Flag to indicate if HME is supported |
| bool m_noMeKernelForPFrame = false; //!< HEVC does not have P-frame, no need to load P-frame ME kernel |
| bool m_16xMeSupported = false; //!< 16x ME supported |
| bool m_16xMeUserfeatureControl = false; //!< User feature control if 16x ME is supported |
| bool m_32xMeSupported = false; //!< 32x ME supported |
| bool m_useNonLegacyStreamin = false; //!< Use non-legacy stream in |
| bool m_32xMeUserfeatureControl = false; //!< User feature control if 32x ME is supported |
| bool m_2xMeSupported = false; //!< 2x DS surface, currently only used by Gen10 Hevc Encode |
| bool m_suppressReconPicSupported = false; //!< Suppress reconstructed picture supported flag |
| bool m_useHwScoreboard = true; //!< Flag to indicate if HW score board is used |
| bool m_hwWalker = false; //!< HW walker used |
| bool m_panicEnable = false; //!< Rc panic enabled flag |
| bool m_sliceShutdownEnable = false; //!< Slice Shutdown Enable |
| uint32_t m_encodeVfeMaxThreads = 0; //!< Encode vfe max threads number |
| uint32_t m_encodeVfeMaxThreadsScaling = 0; //!< Encode vfe max threads scaling number |
| uint32_t m_hwScoreboardType = 0; //!< HW score board type |
| bool m_flatnessCheckSupported = false; //!< Flatness check supported flag |
| bool m_groupIdSelectSupported = false; //!< Group id select supported flag |
| uint8_t m_groupId = 0; //!< Group id |
| bool m_multipassBrcSupported = false; //!< Multi-pass bitrate control supported flag |
| uint8_t m_targetUsageOverride = 0; //!< Target usage override |
| bool m_userFeatureKeyReport = false; //!< User feature key report flag |
| bool m_singlePassDys = false; //!< sungle pass dynamic scaling supported flag |
| |
| // CmdGen HuC FW for HEVC/VP9 VDEnc |
| MOS_RESOURCE m_resVdencCmdInitializerDmemBuffer = {}; //!< Resource of vdenc command initializer DMEM buffer |
| MOS_RESOURCE m_resVdencCmdInitializerDataBuffer[2]; //!< Resource of vdenc command initializer data buffer |
| |
| // VDEnc params |
| bool m_vdencEnabled = false; //!< Vdenc enabled flag |
| bool m_vdencBrcEnabled = false; //!< Vdenc bitrate control enabled flag |
| bool m_vdencStreamInEnabled = false; //!< Vdenc stream in enabled flag |
| bool m_vdencNoTailInsertion = false; //!< Vdenc no tail insertion enabled flag |
| uint32_t m_vdencBrcStatsBufferSize = 0; //!< Vdenc bitrate control buffer size |
| uint32_t m_vdencBrcPakStatsBufferSize = 0; //!< Vdenc bitrate control PAK buffer size |
| uint32_t m_vdencBrcNumOfSliceOffset = 0; //!< Vdenc bitrate control number of slice offset |
| bool m_waReadVDEncOverflowStatus = false; //!< Read vdenc overflow status used flag |
| bool m_vdencBrcImgStatAllocated = false; //!< Vdenc bitrate control image state allocated flag |
| uint32_t m_vdencMvTemporalBufferSize = 0; //!< Vdenc temporal MV buffer size |
| |
| // VDEnc dynamic slice control params |
| uint32_t m_vdencFlushDelayCount = 0; //!< Vdenc flush delay count |
| |
| HMODULE m_swBrcMode = nullptr; //!< Software bitrate control mode |
| |
| // IQmatrix params |
| bool m_picQuant = false; //!< picture quant |
| bool m_newQmatrixData = false; //!< New Qmatrix data |
| PCODEC_ENCODER_SLCDATA m_slcData = nullptr; //!< record slice header size & position |
| uint32_t m_numSlices = 0; //!< Number of slices |
| uint32_t m_numHuffBuffers = 0; //!< Number of Huffman buffers |
| |
| // ENC input/output buffers |
| uint32_t m_mbCodeStrideInDW = 0; //!< Offset + Size of MB + size of MV |
| uint32_t m_mbCodeOffset = 0; //!< MB data offset |
| uint32_t m_mvOffset = 0; //!< MV data offset, in 64 byte |
| uint32_t m_mbCodeSize = 0; //!< MB code buffer size |
| uint32_t m_mbcodeBottomFieldOffset = 0; //!< MB code offset frame/TopField - zero, BottomField - nonzero |
| uint32_t m_mvDataSize = 0; //!< MV data size |
| uint32_t m_mvBottomFieldOffset = 0; //!< MV data offset frame/TopField - zero, BottomField - nonzero |
| MOS_RESOURCE m_resDistortionBuffer = {}; //!< MBEnc Distortion Buffer |
| MOS_RESOURCE m_resMadDataBuffer[CODECHAL_ENCODE_MAX_NUM_MAD_BUFFERS]; //!< Buffers to store Mean of Absolute Differences |
| bool m_madEnabled = false; //!< Mad enabled flag |
| |
| bool m_arbitraryNumMbsInSlice = false; //!< Flag to indicate if the sliceMapSurface needs to be programmed or not |
| MOS_SURFACE m_sliceMapSurface[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; //!< Slice map surface |
| uint32_t m_sliceMapBottomFieldOffset = 0; //!< Slice map bottom field offset |
| |
| // VDENC and PAK Data Buffer |
| PMOS_RESOURCE m_resVdencStatsBuffer = nullptr; //!< Resource of Vdenc status buffer |
| PMOS_RESOURCE m_resVdencCuObjStreamOutBuffer = nullptr; //!< Resource of Vdenc Cu object stream out buffer |
| PMOS_RESOURCE m_resVdencPakObjCmdStreamOutBuffer = nullptr; //!< Resource of Vdenc Pak object command stream out buffer |
| PMOS_RESOURCE m_resPakStatsBuffer = nullptr; //!< Resource of Pak status buffer |
| PMOS_RESOURCE m_resSliceCountBuffer = nullptr; //!< Resource of slice count buffer |
| PMOS_RESOURCE m_resVdencModeTimerBuffer = nullptr; //!< Resource of Vdenc mode timer buffer |
| |
| // VDEnc StreamIn Buffer |
| MOS_RESOURCE m_resVdencStreamInBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; //!< Resources of Vdenc stream in buffer |
| |
| // Maximum number of slices allowed by video spec |
| uint32_t m_maxNumSlicesAllowed = 0; //!< Max number of slices allowed |
| |
| //VDEnc HuC FW status |
| MOS_RESOURCE m_resPakMmioBuffer = {}; //!< Resource of PAK MMIO buffer |
| MOS_RESOURCE m_resHucErrorStatusBuffer = {}; //!< Resource of Huc Error Status buffer |
| MOS_RESOURCE m_resHucStatus2Buffer = {}; //!< Resource of HuC status 2 buffer |
| MOS_RESOURCE m_resHucFwBuffer = {}; //!< Resource of HuC Fw buffer |
| PMOS_RESOURCE m_resVdencBrcUpdateDmemBufferPtr[2] = {nullptr, nullptr}; //!< One for 1st pass of next frame, and the other for the next pass of current frame. |
| |
| // PAK Scratch Buffers |
| MOS_RESOURCE m_resDeblockingFilterRowStoreScratchBuffer = {}; //!< Handle of deblock row store surface |
| MOS_RESOURCE m_resMPCRowStoreScratchBuffer = {}; //!< Handle of mpc row store surface |
| MOS_RESOURCE m_resStreamOutBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; //!< Handle of streamout data surface |
| |
| // Scaling |
| MHW_KERNEL_STATE m_scaling4xKernelStates[CODEC_NUM_FIELDS_PER_FRAME]; //!< Scaling 4x Kernel States |
| ScalingBindingTable m_scaling4xBindingTable = {}; //!< Scaling 4x Binding Table |
| MHW_KERNEL_STATE m_scaling2xKernelStates[CODEC_NUM_FIELDS_PER_FRAME]; //!< Scaling 2x Kernel States |
| ScalingBindingTable m_scaling2xBindingTable = {}; //!< Scaling 2x Binding Table |
| uint32_t m_scalingCurbeSize = 0; //!< Scaling curbe size |
| bool m_interlacedFieldDisabled = false; //!< interlaced field disabled flag |
| CodechalEncodeBbuf m_scalingBBUF[CODECHAL_ENCODE_VME_BBUF_NUM]; //!< This Batch Buffer is used for scaling kernel. |
| uint32_t m_scaledBottomFieldOffset = 0; //!< Scaled Bottom Field Offset |
| uint32_t m_scaled16xBottomFieldOffset = 0; //!< Scaled 16x Bottom Field Offset |
| uint32_t m_scaled32xBottomFieldOffset = 0; //!< Scaled 32x Bottom Field Offset |
| uint32_t m_scalingBBufIdx = 0; //!< Scaling batch buffer index |
| uint8_t m_minScaledDimension = 0; //!< min scaled dimension |
| uint8_t m_minScaledDimensionInMb = 0; //!< min scaled dimension in Mb |
| uint32_t m_downscaledWidth2x = 0; //!< Downscale width 2x |
| uint32_t m_downscaledHeight2x = 0; //!< Downscale height 2x |
| uint32_t m_downscaledWidth4x = 0; //!< Downscale width 4x |
| uint32_t m_downscaledHeight4x = 0; //!< Downscale height 4x |
| uint32_t m_downscaledWidthInMb4x = 0; //!< Downscale width in Mb 4x |
| uint32_t m_downscaledHeightInMb4x = 0; //!< Downscale height in Mb 4x |
| uint32_t m_downscaledFrameFieldHeightInMb4x = 0; //!< Downscale frame field height in Mb 4x |
| uint32_t m_downscaledWidth16x = 0; //!< Downscale width 16x |
| uint32_t m_downscaledHeight16x = 0; //!< Downscale height 16x |
| uint32_t m_downscaledWidthInMb16x = 0; //!< Downscale width in Mb 16x |
| uint32_t m_downscaledHeightInMb16x = 0; //!< Downscale height in Mb 16x |
| uint32_t m_downscaledFrameFieldHeightInMb16x = 0; //!< Downscale frame field height in Mb 16x |
| uint32_t m_downscaledWidth32x = 0; //!< Downscale width 2x |
| uint32_t m_downscaledHeight32x = 0; //!< Downscale height 2x |
| uint32_t m_downscaledWidthInMb32x = 0; //!< Downscale width 2x |
| uint32_t m_downscaledHeightInMb32x = 0; //!< Downscale height 2x |
| uint32_t m_downscaledFrameFieldHeightInMb32x = 0; //!< Downscale frame field height in Mb 32x |
| |
| bool m_fieldScalingOutputInterleaved = false; //!< Field scaling output interleaved flag |
| MOS_SURFACE m_flatnessCheckSurface = {}; //!< Flatness check surface |
| uint32_t m_flatnessCheckBottomFieldOffset = 0; //!< Flatness check bottom field offset |
| bool m_flatnessCheckEnabled = false; //!< Flatness check enabled flag |
| bool m_mbStatsEnabled = false; //!< MB status enabled flag |
| bool m_adaptiveTransformDecisionEnabled = false; //!< Adaptive Transform Decision Enabled flag |
| bool m_forceBrcMbStatsEnabled = false; //!< Force Brc Mb statistics Enabled flag |
| uint32_t m_mbvProcStatsBottomFieldOffset = 0; //!< MB VProc statistics Bottom Field Offset |
| CODECHAL_ENCODE_BUFFER m_resMbStatisticsSurface; //!< Resource of Mb statistics surface |
| bool m_mbStatsSupported = false; //!< Mb statistics supported flag |
| MOS_RESOURCE m_resMbStatsBuffer = {}; //!< Resource of Mb statistics buffer |
| uint32_t m_mbStatsBottomFieldOffset = 0; //!< Mb statistics bottom field offset |
| |
| // ME |
| MHW_KERNEL_STATE m_meKernelStates[CODECHAL_ENCODE_ME_IDX_NUM]; //!< ME kernel states |
| MeKernelBindingTable m_meBindingTable = {}; //!< ME binding table |
| bool bStreamOutEnable = false; |
| MOS_RESOURCE StreamOutBuffer = {}; // StreamOut buffer |
| |
| //GVA paramters to change inter and intra rounding |
| bool bCoeffRoundTag = false; |
| uint32_t uiRoundIntra = 0; |
| uint32_t uiRoundInter = 0; |
| |
| // Ds+Copy kernel optimization |
| uint8_t m_outputChromaFormat = (uint8_t)HCP_CHROMA_FORMAT_YUV420; //!< 1: 420 2: 422 3: 444 |
| bool m_gopIsIdrFrameOnly = false; //!< GOP structure contains I-frame only |
| PMOS_SURFACE m_rawSurfaceToEnc = nullptr; //!< raw surf to enc |
| PMOS_SURFACE m_rawSurfaceToPak = nullptr; //!< raw surf to pak |
| |
| // HME VDEnc |
| GenericBindingTable m_vdencMeKernelBindingTable = {}; //!< Vdenc ME kernel binding table |
| MHW_KERNEL_STATE m_vdencMeKernelState; //!< Vdenc ME kernel state for Low Delay B |
| MHW_KERNEL_STATE m_vdencMeKernelStateRAB = {}; //!< Vdenc ME kernel state for Random Access B |
| |
| GenericBindingTable m_vdencStreaminKernelBindingTable = {}; //!< Vdenc stream in kernel binding table |
| MHW_KERNEL_STATE m_vdencStreaminKernelState; //!< Vdenc stream in kernel state for Low Delay B |
| MHW_KERNEL_STATE m_vdencStreaminKernelStateRAB; //!< Vdenc stream in kernel state for Random Access B |
| |
| // Common kernel |
| uint32_t m_kuidCommon = 0; //!< Common kernel UID |
| bool m_useCommonKernel = false; //!< Use common kernel |
| bool m_wpUseCommonKernel = false; //!< WP uses common kernel |
| |
| // Generic ENC parameters |
| uint32_t m_verticalLineStride = 0; //!< vertical line stride |
| uint32_t m_verticalLineStrideOffset = 0; //!< vertical line stride offset |
| |
| // CMD buffer sizes |
| uint32_t m_pictureStatesSize = 0; //!< Picture states size |
| uint32_t m_extraPictureStatesSize = 0; //!< Picture states size extra |
| uint32_t m_sliceStatesSize = 0; //!< Slice states size |
| uint32_t m_vmeStatesSize = 0; //!< VME states size |
| uint32_t m_hucCommandsSize = 0; //!< HuC command size |
| |
| // Patch List Size |
| uint32_t m_picturePatchListSize = 0; //!< Picture patch list size |
| uint32_t m_extraPicturePatchListSize = 0; //!< Picture patch list size extra |
| uint32_t m_slicePatchListSize = 0; //!< Slice patch list size |
| uint32_t m_vmePatchListSize = 0; //!< not used yet, for future development |
| |
| // Single Task Phase parameters |
| bool m_singleTaskPhaseSupported = false; //!< Single task phase supported flag |
| bool m_firstTaskInPhase = false; //!< first task in phase flag |
| bool m_lastTaskInPhase = false; //!< last task in phase flag |
| bool m_lastEncPhase = false; //!< first enc phase flag |
| bool m_singleTaskPhaseSupportedInPak = false; //!< Single task phase supported in pak flag |
| uint32_t m_headerBytesInserted = 0; //!< Header bytes inserted flag |
| |
| // Null Rendering Flags |
| bool m_videoContextUsesNullHw = false; //!< Using null HW flags for video context |
| bool m_renderContextUsesNullHw = false; //!< Using null HW flags for render context |
| |
| // Slice Shutdown parameters |
| bool m_setRequestedEUSlices = false; //!< Flag to indicate the need to set requested EU slices |
| bool m_setRequestedSubSlices = false; //!< Flag to indicate the need to set requested EU sub-slices |
| bool m_setRequestedEUs = false; //!< Flag to indicate the need to set requested EUs |
| uint32_t m_sliceShutdownDefaultState = 0; //!< Default state of slice shutdown |
| uint32_t m_sliceShutdownRequestState = 0; //!< Request state of slice shutdown |
| uint32_t m_ssdResolutionThreshold = 0; //!< Resolution threshold for slice shutdown |
| uint32_t m_ssdTargetUsageThreshold = 0; //!< Target usage threshold for slice shutdown |
| uint32_t m_targetUsage = 0; //!< Target usage |
| |
| // Skip frame params |
| uint8_t m_skipFrameFlag = 0; //!< Skip frame flag |
| uint32_t m_numSkipFrames = 0; //!< Number of skip frame |
| uint32_t m_sizeSkipFrames = 0; //!< acccumulative size of skipped frames for skipflag = 2 |
| uint32_t m_sizeCurrSkipFrame = 0; //!< size of curr skipped frame for skipflag = 2 |
| |
| // Lookahead |
| uint8_t m_lookaheadDepth = 0; //!< Number of frames to lookahead |
| uint8_t m_currLaDataIdx = 0; //!< Current lookahead data index |
| uint32_t m_averageFrameSize = 0; //!< Average frame size based on targed bitrate and frame rate, in unit of bits |
| uint32_t m_prevTargetFrameSize = 0; //!< Target frame size of previous frame. |
| uint32_t m_targetBufferFulness = 0; //!< Target encode buffer fulness in bits, used by BRC and calculated from initial buffer fulness, target frame size (from DDI) and average frame size |
| |
| MHW_VDBOX_NODE_IND m_vdboxIndex = MHW_VDBOX_NODE_MAX; //!< Index of vdbox |
| MediaPerfProfiler *m_perfProfiler = nullptr; //!< Performance data profiler |
| PMOS_GPUCTX_CREATOPTIONS m_gpuCtxCreatOpt = nullptr; //!< Used for creating GPU context |
| bool intraModeMaskControl = false; |
| uint32_t intraModeMask = 0; // to disable intra mode |
| bool interMbTransformSizeControl = false; |
| bool interMbTransform8x8Enabled = false; |
| |
| PMOS_RESOURCE presMbInlineData = nullptr; |
| PMOS_RESOURCE presMbConstSurface = nullptr; |
| PMOS_RESOURCE presVMEOutSurface = nullptr; |
| |
| #if (_DEBUG || _RELEASE_INTERNAL) |
| bool m_mmcUserFeatureUpdated; //!< indicate if the user feature is updated with MMC state |
| #endif |
| |
| CmDevice *m_cmDev = nullptr; |
| CmTask * m_cmTask = nullptr; |
| CmQueue * m_cmQueue = nullptr; |
| CmDevice *m_origCmDev = nullptr; |
| |
| #define CM_EVENT_NUM 128 |
| CmEvent *m_cmEvent[CM_EVENT_NUM] = {nullptr}; |
| short m_cmEventIdx = 0; // current event idx |
| short m_cmEventCheckIdx = 0; |
| |
| #ifdef FEI_ENABLE_CMRT |
| CodechalEncodeMdfKernelResource resDSKernel; |
| #endif |
| |
| bool m_colorbitSupported = false; |
| |
| #if USE_CODECHAL_DEBUG_TOOL |
| CodechalDebugEncodePar *m_encodeParState = nullptr; //!< Encode Par state |
| #endif |
| |
| //! |
| //! \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 The entry to encode each frame. |
| //! \param [in] params |
| //! Pointer to encode parameters of this frame |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS Execute(void *params) override; |
| |
| //! |
| //! \brief The entry to get status report. |
| //! \param [out] status |
| //! The point to encode status |
| //! \param [in] numStatus |
| //! The requested number of status reports |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS GetStatusReport(void *status, uint16_t numStatus) override; |
| |
| //! |
| //! \brief Get Status Report for the common codec part |
| //! \param [out] encodeStatus |
| //! Encoder status |
| //! \param [out] encodeStatusReport |
| //! Encoder status report |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS GetStatusReportCommon( |
| EncodeStatus* encodeStatus, |
| EncodeStatusReport* encodeStatusReport); |
| |
| //! |
| //! \brief Read counter value for encode. |
| //! \param [in] index |
| //! The index of status report number |
| //! \param [in, out] encodeStatusReport |
| //! The address of encodeStatusReport |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS ReadCounterValue(uint16_t index, EncodeStatusReport* encodeStatusReport); |
| |
| //! |
| //! \brief Initialize the encoder state |
| //! \param [in] settings |
| //! Pointer to the initialize settings |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS Initialize( |
| CodechalSetting * settings); |
| |
| //! |
| //! \brief Allocate resources for encoder |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS AllocateResources(); |
| |
| //! |
| //! \brief Free resources in encoder |
| //! \return void |
| //! |
| virtual void FreeResources(); |
| |
| //! |
| //! \brief Initialize the picture |
| //! \param [in] params |
| //! Encoder parameters |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS InitializePicture(const EncoderParams& params) = 0; |
| |
| //! |
| //! \brief Execute kernel functions |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS ExecuteKernelFunctions() = 0; |
| |
| //! |
| //! \brief Execute picture level in encoder |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS ExecutePictureLevel() = 0; |
| |
| //! |
| //! \brief Execute slice level in encoder |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS ExecuteSliceLevel() = 0; |
| |
| //! |
| //! \brief Get Status Report |
| //! \details Each Codec need to define its own GetStatusReport |
| //! \param [out] encodeStatus |
| //! Encoder status |
| //! \param [out] encodeStatusReport |
| //! Encoder status report |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS GetStatusReport( |
| EncodeStatus* encodeStatus, |
| EncodeStatusReport* encodeStatusReport) = 0; |
| |
| //! |
| //! \brief User Feature Key Report |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS UserFeatureKeyReport(); |
| |
| //! |
| //! \brief Help function to submit a command buffer |
| //! |
| //! \param [in] cmdBuffer |
| //! Pointer to command buffer |
| //! \param [in] nullRendering |
| //! Null rendering flag |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS SubmitCommandBuffer( |
| PMOS_COMMAND_BUFFER cmdBuffer, |
| int32_t nullRendering); |
| |
| //! |
| //! \brief Check Supported Format |
| //! \param [in] surface |
| //! Input surface to check |
| //! \return bool |
| //! true if supported, false if not |
| //! |
| virtual bool CheckSupportedFormat( |
| PMOS_SURFACE surface); |
| |
| //! |
| //! \brief Encode Copy Skip Frame |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS EncodeCopySkipFrame() |
| { |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| //! |
| //! \brief Read Image Status |
| //! \param [in, out] cmdBuffer |
| //! Input and output cmdbuffer |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS ReadImageStatus( |
| PMOS_COMMAND_BUFFER cmdBuffer); |
| |
| //! |
| //! \brief Read Mfc Status |
| //! \param [in, out] cmdBuffer |
| //! Input and output cmdbuffer |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS ReadMfcStatus( |
| PMOS_COMMAND_BUFFER cmdBuffer); |
| |
| //! |
| //! \brief Send Prolog With Frame Tracking |
| //! \param [in, out] cmdBuffer |
| //! Input and output cmdbuffer |
| //! \param [in] frameTrackingRequested |
| //! frame Tracking Requested |
| //! \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); |
| |
| //! |
| //! \brief Calculate Command Buffer Size |
| //! |
| //! \return uint32_t |
| //! Command buffer size calculated |
| //! |
| virtual uint32_t CalculateCommandBufferSize(); |
| |
| //! |
| //! \brief Prepare Nodes |
| //! \param [in, out] videoGpuNode |
| //! GPU node prepared |
| //! \param [in, out] setVideoNode |
| //! flag indicates if node needs to set |
| //! \return void |
| //! |
| virtual void PrepareNodes( |
| MOS_GPU_NODE& videoGpuNode, |
| bool& setVideoNode); |
| |
| //! |
| //! \brief Set up params for gpu context creation |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS SetGpuCtxCreatOption(); |
| |
| //! |
| //! \brief Sets video gpu context |
| //! |
| void SetVideoContext(MOS_GPU_CONTEXT videoContext) { m_videoContext = videoContext; } |
| |
| //! |
| //! \brief Create Gpu Contexts |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS CreateGpuContexts(); |
| |
| //! |
| //! \brief Verify Space Available |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS VerifySpaceAvailable(); |
| |
| //! |
| //! \brief Add MEDIA_VFE command to command buffer |
| //! \param [in, out] cmdBuffer |
| //! cmdbuffer to send cmds |
| //! \param [in] params |
| //! Parameters for send cmds |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS AddMediaVfeCmd( |
| PMOS_COMMAND_BUFFER cmdBuffer, |
| SendKernelCmdsParams *params); |
| |
| //! |
| //! \brief Send Generic Kernel Cmds |
| //! \param [in, out] cmdBuffer |
| //! cmdbuffer to send cmds |
| //! \param [in] params |
| //! Parameters for send cmds |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS SendGenericKernelCmds( |
| PMOS_COMMAND_BUFFER cmdBuffer, |
| SendKernelCmdsParams *params); |
| |
| //! |
| //! \brief Start Status Report |
| //! \param [in, out] cmdBuffer |
| //! cmdbuffer to send cmds |
| //! \param [in] encFunctionType |
| //! encFunctionType for send cmds |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS StartStatusReport( |
| PMOS_COMMAND_BUFFER cmdBuffer, |
| CODECHAL_MEDIA_STATE_TYPE encFunctionType); |
| |
| //! |
| //! \brief End Status Report |
| //! \param [in, out] cmdBuffer |
| //! cmdbuffer to send cmds |
| //! \param [in] encFunctionType |
| //! encFunctionType for send cmds |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS EndStatusReport( |
| PMOS_COMMAND_BUFFER cmdBuffer, |
| CODECHAL_MEDIA_STATE_TYPE encFunctionType); |
| |
| //! |
| //! \brief Set Status Report Parameters |
| //! \param [in] currRefList |
| //! current RefList used to set |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS SetStatusReportParams( |
| PCODEC_REF_LIST currRefList); |
| |
| //! |
| //! \brief Motion Estimation Disable Check |
| //! |
| //! \return void |
| //! |
| virtual void MotionEstimationDisableCheck(); |
| |
| //! |
| //! \brief Execute the encode |
| //! |
| //! \param [in] encodeParams |
| //! Encode parameters used |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS ExecuteEnc( |
| EncoderParams* encodeParams); |
| |
| //! \brief Execute FEI PreEnc |
| //! |
| //! \param [in] encodeParams |
| //! Encode parameters used |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS ExecutePreEnc( |
| EncoderParams* encodeParams) { return MOS_STATUS_SUCCESS; } |
| |
| //! |
| //! \brief Destroy Me Resources |
| //! |
| //! \param [in] param |
| //! Hme parameters used |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS DestroyMeResources( |
| HmeParams* param); |
| |
| //! |
| //! \brief Clean Up Resource |
| //! |
| //! \param [in, out] resource |
| //! Resource to clean up |
| //! \param [in] allocParams |
| //! allocParams used to clean |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS CleanUpResource( |
| PMOS_RESOURCE resource, |
| PMOS_ALLOC_GFXRES_PARAMS allocParams); |
| |
| //! |
| //! \brief Allocate Resources 4x Me |
| //! |
| //! \param [in] param |
| //! Hme parameters used |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS AllocateResources4xMe( |
| HmeParams* param); |
| |
| //! |
| //! \brief Allocate Resources 16x Me |
| //! |
| //! \param [in] param |
| //! Hme parameters used |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS AllocateResources16xMe( |
| HmeParams* param); |
| |
| //! |
| //! \brief Allocate Resources 32x Me |
| //! |
| //! \param [in] param |
| //! Hme parameters used |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS AllocateResources32xMe( |
| HmeParams* param); |
| |
| //! |
| //! \brief Initialize Common |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS InitCommon(); |
| |
| //! |
| //! \brief Resize Internal Buffer on Resolution Change |
| //! |
| virtual void ResizeOnResChange(); |
| |
| //! |
| //! \brief Check Resolution Change and CSC |
| //! |
| //! \details On resolution change, resize internal buffer |
| //! Check raw surface to set flag for CSC operation |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS CheckResChangeAndCsc(); |
| |
| //! |
| //! \brief Destroy encode state |
| //! |
| //! \return void |
| //! |
| void Destroy() override; |
| |
| //! |
| //! \brief Allocate Scaling Resources |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS AllocateScalingResources(); |
| |
| //! |
| //! \brief Execute Me Kernel |
| //! |
| //! \param [in] meParams |
| //! meParams used to execute kernel |
| //! \param [in] meSurfaceParams |
| //! meSurfaceParams used to execute kernel |
| //! \param [in] hmeLevel |
| //! hme Level used to execute kernel |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS ExecuteMeKernel( |
| MeCurbeParams *meParams, |
| MeSurfaceParams *meSurfaceParams, |
| HmeLevel hmeLevel); |
| |
| //! |
| //! \brief Initialize Status Report |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS InitStatusReport(); |
| |
| //! |
| //! \brief Update Encode Status |
| //! |
| //! \param [in, out] cmdBuffer |
| //! cmdbuffer to send cmds |
| //! \param [in] forceOperation |
| //! forceOperation flag used |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS UpdateEncodeStatus( |
| PMOS_COMMAND_BUFFER cmdBuffer, |
| bool forceOperation); |
| |
| //! |
| //! \brief Reset Encode Status |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS ResetStatusReport(); |
| |
| //! |
| //! \brief Read Brc Pak Statistics |
| //! |
| //! \param [in, out] cmdBuffer |
| //! cmdbuffer to send cmds |
| //! \param [in] params |
| //! parameters used |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS ReadBrcPakStatistics( |
| PMOS_COMMAND_BUFFER cmdBuffer, |
| EncodeReadBrcPakStatsParams* params); |
| |
| //! |
| //! \brief Update command buffer attribute |
| //! |
| //! \param [in] cmdBuffer |
| //! cmdbuffer to send cmds |
| //! \param [in] renderEngineInUse |
| //! renderEngineInUse flag used |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS UpdateCmdBufAttribute( |
| PMOS_COMMAND_BUFFER cmdBuffer, |
| bool renderEngineInUse); |
| |
| //! |
| //! \brief Function pointer of Get Kernel Header And Size |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS(*pfnGetKernelHeaderAndSize) ( |
| void *binary, |
| EncOperation operation, |
| uint32_t krnStateIdx, |
| void *krnHeader, |
| uint32_t *krnSize); |
| |
| //! |
| //! \brief Function to allocate MDF required resources |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS AllocateMDFResources(); |
| |
| //! |
| //! \brief Function to destroy MDF required resources |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS DestroyMDFResources(); |
| |
| //! |
| //! \brief Function to set MFE Shared State |
| //! |
| //! \details Pointer on passed object will be saved in the local field, |
| //! content of source object might be changed later |
| //! (for example, CmDevice might be set or chagned) |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS SetMfeSharedState(MfeSharedState *pMfeSharedState); |
| |
| //! |
| //! \brief Function to add MDF kernel |
| //! |
| //! \param [in] device |
| //! pointer to CmDevice |
| //! \param [in] queue |
| //! pointer to CmQueue |
| //! \param [in] kernel |
| //! pointer to CmKernel |
| //! \param [in] task |
| //! pointer to CmTask |
| //! \param [in] threadspace |
| //! pointer to CmThreadSpace |
| //! \param [in] event |
| //! reference to CmEvent* |
| //! \param [in] isEnqueue |
| //! bool |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS AddKernelMdf( |
| CmDevice *device, |
| CmQueue *queue, |
| CmKernel *kernel, |
| CmTask *task, |
| CmThreadSpace *threadspace, |
| CmEvent *&event, |
| bool isEnqueue); |
| |
| //! |
| //! \brief Function to create Mdf Kernel resource |
| //! |
| //! \param [out] resource |
| //! pointer to CodechalEncodeMdfKernelResource |
| //! \param [in] kernelNum |
| //! uint8_t, kernel number |
| //! \param [in] bufNum |
| //! uint8_t, buffer number |
| //! \param [in] surfNum |
| //! uint8_t, surface number |
| //! \param [in] vmeSurfNum |
| //! uint8_t, vme surface number |
| //! \param [in] curbeSize |
| //! uint16_t, curbe structure size |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS CreateMDFKernelResource( |
| CodechalEncodeMdfKernelResource *resource, |
| uint8_t kernelNum, |
| uint8_t bufNum, |
| uint8_t surfNum, |
| uint8_t vmeSurfNum, |
| uint16_t curbeSize); |
| |
| //! |
| //! \brief Function to destroy Mdf kernel resource |
| //! |
| //! \param [in] resource |
| //! pointer to CodechalEncodeMdfKernelResource |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS DestroyMDFKernelResource( |
| CodechalEncodeMdfKernelResource *resource); |
| |
| //! |
| //! \brief Function to free Mdf kernel surfaces |
| //! |
| //! \param [in] resource |
| //! pointer to CodechalEncodeMdfKernelResource |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS FreeMDFKernelSurfaces( |
| CodechalEncodeMdfKernelResource *resource); |
| |
| //! |
| //! \brief Returns number of PAK Passes based on BRC Precision flag |
| //! |
| //! \param [in] usBRCPrecision |
| //! refer to CodechalEncodeBrcNumPasses |
| //! |
| //! \return uint8_t |
| //! number of pak passes |
| //! |
| uint8_t GetNumBrcPakPasses(uint16_t usBRCPrecision); |
| |
| //! |
| //! \brief Setup Walker Context |
| //! \param [in, out] cmdBuffer |
| //! Input and output cmdbuffer |
| //! \param [in] Pointer to kernel state |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS SetupWalkerContext( |
| MOS_COMMAND_BUFFER* cmdBuffer, |
| SendKernelCmdsParams* params); |
| |
| MOS_STATUS ResolveMetaData( |
| PMOS_RESOURCE pHwLayoutMetaData, |
| PMOS_RESOURCE pResolvedLayoutMetadata) override; |
| |
| virtual MOS_STATUS PrepareHWMetaData( |
| PMOS_RESOURCE presMetadataBuffer, |
| PMOS_RESOURCE presLcuBaseAddressBuffer, |
| PMOS_COMMAND_BUFFER cmdBuffer) |
| { |
| return MOS_STATUS_SUCCESS; |
| } |
| |
| #if USE_CODECHAL_DEBUG_TOOL |
| virtual MOS_STATUS DumpMbEncPakOutput(PCODEC_REF_LIST currRefList, CodechalDebugInterface* debugInterface); |
| virtual MOS_STATUS DumpFrameStatsBuffer(CodechalDebugInterface* debugInterface) { return MOS_STATUS_SUCCESS; } |
| |
| //! |
| //! \brief Add/Subtract a value to specified gfx memory |
| //! |
| //! \param [in] cmdBuffer |
| //! command buffer |
| //! \param [in] presStoreBuffer |
| //! buffer to modify |
| //! \param [in] offset |
| //! member offset in the buffer |
| //! \param [in] value |
| //! value to add/subtract |
| //! \param [in] bAdd |
| //! add or subtract |
| //! |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS AddBufferWithIMMValue( |
| PMOS_COMMAND_BUFFER cmdBuffer, |
| PMOS_RESOURCE presStoreBuffer, |
| uint32_t offset, |
| uint32_t value, |
| bool bAdd); |
| |
| bool m_enableFakeHrdSize = false; |
| int32_t m_fakeIFrameHrdSize = 0; |
| int32_t m_fakePBFrameHrdSize = 0; |
| #endif |
| }; |
| |
| static void PutBit(BSBuffer *bsbuffer, uint32_t code) |
| { |
| if (code & 1) |
| { |
| *(bsbuffer->pCurrent) = (*(bsbuffer->pCurrent) | (uint8_t)(0x01 << (7 - bsbuffer->BitOffset))); |
| } |
| |
| bsbuffer->BitOffset++; |
| if (bsbuffer->BitOffset == 8) |
| { |
| bsbuffer->BitOffset = 0; |
| bsbuffer->pCurrent++; |
| *(bsbuffer->pCurrent) = 0; |
| } |
| } |
| |
| static void PutBitsSub(BSBuffer *bsbuffer, uint32_t code, uint32_t length) |
| { |
| uint8_t *byte = bsbuffer->pCurrent; |
| |
| // make sure that the number of bits given is <= 24 |
| CODECHAL_ENCODE_ASSERT(length <= 24); |
| |
| code <<= (32 - length); |
| |
| // shift field so that the given code begins at the current bit |
| // offset in the most significant byte of the 32-bit word |
| length += bsbuffer->BitOffset; |
| code >>= bsbuffer->BitOffset; |
| |
| // write bytes back into memory, big-endian |
| byte[0] = (uint8_t)((code >> 24) | byte[0]); |
| byte[1] = (uint8_t)(code >> 16); |
| if (length > 16) |
| { |
| byte[2] = (uint8_t)(code >> 8); |
| byte[3] = (uint8_t)code; |
| } |
| else |
| { |
| byte[2] = 0; |
| } |
| |
| // update bitstream pointer and bit offset |
| bsbuffer->pCurrent += (length >> 3); |
| bsbuffer->BitOffset = (length & 7); |
| } |
| |
| static void PutBits(BSBuffer *bsbuffer, uint32_t code, uint32_t length) |
| { |
| uint32_t code1, code2; |
| |
| // temp solution, only support up to 32 bits based on current usage |
| CODECHAL_ENCODE_ASSERT(length <= 32); |
| |
| if (length >= 24) |
| { |
| code1 = code & 0xFFFF; |
| code2 = code >> 16; |
| |
| // high bits go first |
| PutBitsSub(bsbuffer, code2, length - 16); |
| PutBitsSub(bsbuffer, code1, 16); |
| } |
| else |
| { |
| PutBitsSub(bsbuffer, code, length); |
| } |
| } |
| |
| template<typename ValueType> |
| static ValueType SwapEndianness(ValueType value) |
| { |
| uint8_t* startLocation = reinterpret_cast<uint8_t*>(&value); |
| uint8_t* endLocation = startLocation + sizeof(ValueType); |
| std::reverse(startLocation, endLocation); |
| return value; |
| } |
| #endif // __CODECHAL_ENCODER_BASE_H__ |