1 /* 2 * Copyright (c) 2011-2017, Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included 12 * in all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 */ 22 //! 23 //! \file codechal_encode_avc.h 24 //! \brief This file defines the base C++ class/interface for AVC DualPipe encoding 25 //! to be used across CODECHAL components. 26 //! 27 28 #ifndef __CODECHAL_ENCODE_AVC_H__ 29 #define __CODECHAL_ENCODE_AVC_H__ 30 31 #include "codechal_encode_avc_base.h" 32 33 #define CODECHAL_ENCODE_AVC_MAX_LAMBDA 0xEFFF 34 35 // BRC Block Copy 36 #define CODECHAL_ENCODE_AVC_BRC_COPY_NUM_ROWS_PER_VME_SEND_MSG 8 37 #define CODECHAL_ENCODE_AVC_BRC_COPY_NUM_SEND_MSGS_PER_KERNEL 3 38 #define CODECHAL_ENCODE_AVC_BRC_COPY_BLOCK_WIDTH 64 39 40 // SubMbPartMask defined in CURBE for AVC ENC 41 #define CODECHAL_ENCODE_AVC_DISABLE_4X4_SUB_MB_PARTITION 0x40 42 #define CODECHAL_ENCODE_AVC_DISABLE_4X8_SUB_MB_PARTITION 0x20 43 #define CODECHAL_ENCODE_AVC_DISABLE_8X4_SUB_MB_PARTITION 0x10 44 45 typedef enum _CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_BRC_INIT_RESET 46 { 47 CODECHAL_ENCODE_AVC_BRC_INIT_RESET_HISTORY = 0, 48 CODECHAL_ENCODE_AVC_BRC_INIT_RESET_DISTORTION, 49 CODECHAL_ENCODE_AVC_BRC_INIT_RESET_NUM_SURFACES 50 } CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_BRC_INIT_RESET; 51 52 typedef enum _CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_BRC_BLOCK_COPY 53 { 54 CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_INPUT = 0, 55 CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_OUTPUT, 56 CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_NUM_SURFACES 57 } CODECHAL_ENCODE_AVC_BINDING_TABLE_OFFSET_BRC_BLOCK_COPY; 58 59 typedef struct _CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS 60 { 61 PMHW_KERNEL_STATE pKernelState; 62 uint32_t dwBufferOffset; 63 uint32_t dwBlockHeight; 64 } CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS; 65 66 typedef struct _CODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS 67 { 68 PMOS_INTERFACE pOsInterface; 69 PCODEC_AVC_ENCODE_SLICE_PARAMS pAvcSlcParams; 70 PCODEC_PIC_ID pAvcPicIdx; 71 MOS_SURFACE sBrcConstantDataBuffer; // sBrcConstantDataBuffer[uiCurrDSH] 72 uint32_t dwMbEncBlockBasedSkipEn; 73 PCODEC_AVC_ENCODE_PIC_PARAMS pPicParams; // pAvcPicParams[ucPPSIdx] 74 uint16_t wPictureCodingType; 75 bool bSkipBiasAdjustmentEnable; 76 bool bAdaptiveIntraScalingEnable; 77 bool bOldModeCostEnable; 78 PCODECHAL_ENCODE_AVC_QUALITY_CTRL_PARAMS pAvcQCParams; 79 } CODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS, *PCODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS; 80 81 typedef struct _CODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS 82 { 83 PMOS_RESOURCE presBrcHistoryBuffer; 84 PMOS_SURFACE psMeBrcDistortionBuffer; 85 uint32_t dwMeBrcDistortionBottomFieldOffset; 86 uint32_t dwDownscaledWidthInMb4x; 87 uint32_t dwDownscaledFrameFieldHeightInMb4x; 88 } CODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS; 89 90 typedef struct _CODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS 91 { 92 double *pdBrcInitCurrentTargetBufFullInBits; // Passed back to Render Interface 93 double *pdBrcInitResetInputBitsPerFrame; // Passed back to Render Interface 94 uint32_t* pdwBrcInitResetBufSizeInBits; // Passed back to Render Interface 95 PMHW_KERNEL_STATE pKernelState; 96 } CODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS; 97 98 typedef struct _CODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS 99 { 100 PMOS_INTERFACE pOsInterface; 101 PMOS_RESOURCE presBrcConstantDataBuffer; 102 uint32_t dwMbEncBlockBasedSkipEn; 103 PCODEC_AVC_ENCODE_PIC_PARAMS pPicParams; // pAvcPicParams[ucPPSIdx] 104 uint16_t wPictureCodingType; 105 bool bSkipBiasAdjustmentEnable; 106 bool bAdaptiveIntraScalingEnable; 107 bool bOldModeCostEnable; 108 bool bPreProcEnable; 109 bool bEnableKernelTrellis; 110 PCODECHAL_ENCODE_AVC_QUALITY_CTRL_PARAMS pAvcQCParams; 111 uint32_t Lambda[52][2]; 112 } CODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS, *PCODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS; 113 114 typedef struct _CODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS 115 { 116 PCODEC_AVC_ENCODE_SEQUENCE_PARAMS pSeqParams; 117 PCODEC_AVC_ENCODE_PIC_PARAMS pPicParams; 118 PCODEC_AVC_ENCODE_SLICE_PARAMS pSlcParams; 119 PCODEC_REF_LIST *ppRefList; 120 PCODEC_PIC_ID pPicIdx; 121 PCODECHAL_ENCODE_AVC_QUALITY_CTRL_PARAMS pAvcQCParams; 122 uint16_t wPicWidthInMb; 123 uint16_t wFieldFrameHeightInMb; 124 uint32_t* pdwBlockBasedSkipEn; // To be returned to render interface 125 bool bBrcEnabled; 126 bool bMbEncIFrameDistEnabled; 127 bool bRoiEnabled; 128 bool bDirtyRoiEnabled; 129 bool bUseMbEncAdvKernel; 130 bool bMbDisableSkipMapEnabled; 131 bool bStaticFrameDetectionEnabled; // static frame detection enable or not 132 bool bApdatvieSearchWindowSizeEnabled; 133 bool bSquareRollingIEnabled; 134 uint16_t usSliceHeight; 135 PMHW_KERNEL_STATE pKernelState; 136 uint8_t* pCurbeBinary; 137 } CODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS; 138 139 typedef struct _CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS 140 { 141 double *pdBrcInitCurrentTargetBufFullInBits; // Passed in and back 142 uint32_t dwNumSkipFrames; 143 uint32_t dwSizeSkipFrames; 144 uint8_t ucMinQP; // Limit min QP that the kernel can choose, based on app setting 145 uint8_t ucMaxQP; // Limit max QP that the kernel can choose, based on app setting 146 uint8_t ucEnableROI; // ROI feature for BRC 147 uint32_t dwIntraRefreshQpThreshold; 148 bool bSquareRollingIEnabled; 149 PMHW_KERNEL_STATE pKernelState; 150 } CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS; 151 typedef struct _CODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE 152 { 153 uint32_t dwFrameBrcHistoryBuffer; 154 uint32_t dwFrameBrcPakStatisticsOutputBuffer; 155 uint32_t dwFrameBrcImageStateReadBuffer; 156 uint32_t dwFrameBrcImageStateWriteBuffer; 157 uint32_t dwFrameBrcMbEncCurbeReadBuffer; 158 uint32_t dwFrameBrcMbEncCurbeWriteData; 159 uint32_t dwFrameBrcDistortionBuffer; 160 uint32_t dwFrameBrcConstantData; 161 uint32_t dwFrameBrcMbStatBuffer; 162 uint32_t dwFrameBrcMvDataBuffer; 163 uint32_t dwMbBrcHistoryBuffer; 164 uint32_t dwMbBrcDistortionBuffer; 165 uint32_t dwMbBrcMbQpBuffer; 166 uint32_t dwMbBrcROISurface; 167 uint32_t dwMbBrcIntraDistortionPBFrameSurface; 168 uint32_t dwMbBrcMbStatBuffer; 169 uint32_t dwBindingTableStartOffset; 170 uint32_t dwNumBindingTableEntries; 171 } CODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE, *PCODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE; 172 173 typedef struct _CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS 174 { 175 CODECHAL_MEDIA_STATE_TYPE MbEncMediaStateType; 176 EncodeBrcBuffers* pBrcBuffers; 177 uint32_t dwDownscaledWidthInMb4x; 178 uint32_t dwDownscaledFrameFieldHeightInMb4x; 179 bool bMbBrcEnabled; 180 bool bUseAdvancedDsh; 181 bool bBrcRoiEnabled; 182 PMOS_RESOURCE presMbEncCurbeBuffer; 183 PMOS_RESOURCE presMbEncBRCBuffer; //extra surface on KBL BRC update 184 PMOS_SURFACE psRoiSurface; 185 PMOS_RESOURCE presMbStatBuffer; 186 PMOS_SURFACE psMvDataBuffer; 187 uint32_t dwBrcPakStatisticsSize; 188 uint32_t dwBrcHistoryBufferSize; 189 uint32_t dwMbEncBRCBufferSize; 190 uint32_t dwMvBottomFieldOffset; 191 uint8_t ucCurrRecycledBufIdx; 192 PCODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE pBrcUpdateBindingTable; 193 PMHW_KERNEL_STATE pKernelState; 194 } CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS; 195 196 typedef struct _CODECHAL_ENCODE_AVC_IPCM_THRESHOLD 197 { 198 uint8_t QP; 199 uint16_t Threshold; 200 } CODECHAL_ENCODE_AVC_IPCM_THRESHOLD; 201 202 // Force RepartitionCheck 203 typedef enum _CODECHAL_ENCODE_AVC_RPC 204 { 205 CODECHAL_ENCODE_RPC_FOLLOW_DRIVER = 0, 206 CODECHAL_ENCODE_RPC_FORCE_ENABLE, 207 CODECHAL_ENCODE_RPC_FORCE_DISABLE 208 } CODECHAL_ENCODE_AVC_RPC; 209 210 typedef struct _CODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC 211 { 212 uint32_t dwAvcMBEncMfcAvcPakObj; 213 uint32_t dwAvcMBEncIndMVData; 214 uint32_t dwAvcVPPStatistics; 215 uint32_t dwAvcMBEncCurrY; 216 uint32_t dwAvcMBEncCurrUV; 217 uint32_t dwAvcMBEncMbSpecificData; 218 uint32_t dwAvcMBEncFwdRefY; 219 uint32_t dwAvcMBEncBwdRefY; 220 uint32_t dwAvcMBEncFwdRefMVData; 221 uint32_t dwAvcMBEncBwdRefMBData; 222 uint32_t dwAvcMBEncBwdRefMVData; 223 uint32_t dwAvcMBEncMVDataFromME; 224 uint32_t dwAvcMBEncRefPicSelectL0; 225 uint32_t dwAvcMBEncRefPicSelectL1; 226 uint32_t dwAvcMBEncCurrPic; 227 uint32_t dwAvcMBEncFwdPic; 228 uint32_t dwAvcMBEncBwdPic; 229 uint32_t dwAvcMBEncMbBrcConstData; 230 uint32_t dwAvcMBEncMEDist; 231 uint32_t dwAvcMBEncBRCDist; 232 uint32_t dwAvcMBEncDebugScratch; 233 uint32_t dwAvcMBEncFlatnessChk; 234 uint32_t dwAvcMBEncMBStats; 235 uint32_t dwAvcMBEncMADData; 236 uint32_t dwAvcMBEncVMEDistortion; 237 uint32_t dwAvcMbEncBRCCurbeData; 238 uint32_t dwAvcMBEncSliceMapData; 239 uint32_t dwAvcMBEncMvPrediction; 240 uint32_t dwAvcMBEncMbNonSkipMap; 241 uint32_t dwAvcMBEncAdv; 242 uint32_t dwAvcMBEncStaticDetectionCostTable; 243 244 // Frame Binding Table Entries 245 uint32_t dwAvcMBEncCurrPicFrame[CODEC_AVC_NUM_REF_LISTS]; 246 uint32_t dwAvcMBEncFwdPicFrame[CODECHAL_ENCODE_NUM_MAX_VME_L0_REF]; 247 uint32_t dwAvcMBEncBwdPicFrame[CODECHAL_ENCODE_NUM_MAX_VME_L1_REF * 2]; // Bwd ref IDX0 and IDX1 are repeated, so include two extra to account for this 248 uint32_t dwAvcMBEncMbQpFrame; 249 uint32_t dwAvcMbEncMADFrame; 250 uint32_t dwAvcMBEncSliceMapFrame; 251 uint32_t dwAvcMBEncMbNonSkipMapFrame; 252 253 // Field Binding Table Entries 254 uint32_t dwAvcMBEncFieldCurrPic[CODEC_AVC_NUM_REF_LISTS]; 255 uint32_t dwAvcMBEncFwdPicTopField[CODECHAL_ENCODE_NUM_MAX_VME_L0_REF]; 256 uint32_t dwAvcMBEncFwdPicBotField[CODECHAL_ENCODE_NUM_MAX_VME_L0_REF]; 257 uint32_t dwAvcMBEncBwdPicTopField[CODECHAL_ENCODE_NUM_MAX_VME_L1_REF * 2]; 258 uint32_t dwAvcMBEncBwdPicBotField[CODECHAL_ENCODE_NUM_MAX_VME_L1_REF * 2]; 259 uint32_t dwAvcMBEncMbQpField; 260 uint32_t dwAvcMBEncMADField; 261 uint32_t dwAvcMBEncSliceMapField; 262 uint32_t dwAvcMBEncMbNonSkipMapField; 263 264 uint32_t dwBindingTableStartOffset; 265 uint32_t dwNumBindingTableEntries; 266 } CODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC, *PCODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC; 267 268 typedef struct _CODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS 269 { 270 CODECHAL_MEDIA_STATE_TYPE MediaStateType; 271 PCODEC_AVC_ENCODE_SLICE_PARAMS pAvcSlcParams; 272 CodecEncodeAvcFeiPicParams *pFeiPicParams; 273 PCODEC_REF_LIST *ppRefList; 274 PCODEC_PIC_ID pAvcPicIdx; 275 PCODEC_PICTURE pCurrOriginalPic; 276 PCODEC_PICTURE pCurrReconstructedPic; 277 uint16_t wPictureCodingType; 278 PMOS_SURFACE psCurrPicSurface; 279 uint32_t dwCurrPicSurfaceOffset; 280 uint32_t dwMbCodeBottomFieldOffset; 281 uint32_t dwMvBottomFieldOffset; 282 PMOS_SURFACE ps4xMeMvDataBuffer; 283 CmSurface2D *ps4xMeMvDataCmBuffer; 284 uint32_t dwMeMvBottomFieldOffset; 285 PMOS_SURFACE ps4xMeDistortionBuffer; 286 CmSurface2D *ps4xMeDistortionCmBuffer; 287 uint32_t dwMeDistortionBottomFieldOffset; 288 uint32_t dwRefPicSelectBottomFieldOffset; 289 PMOS_SURFACE psMeBrcDistortionBuffer; 290 uint32_t dwMeBrcDistortionBottomFieldOffset; 291 PMOS_RESOURCE presMbBrcConstDataBuffer; 292 PMOS_RESOURCE presMbSpecificDataBuffer; 293 PMOS_SURFACE psMbQpBuffer; 294 uint32_t dwMbQpBottomFieldOffset; 295 bool bFlatnessCheckEnabled; 296 PMOS_SURFACE psFlatnessCheckSurface; 297 uint32_t dwFlatnessCheckBottomFieldOffset; 298 bool bMBVProcStatsEnabled; 299 PMOS_RESOURCE presMBVProcStatsBuffer; 300 uint32_t dwMBVProcStatsBottomFieldOffset; 301 PMOS_RESOURCE presMADDataBuffer; 302 bool bMADEnabled; 303 uint32_t dwFrameWidthInMb; 304 uint32_t dwFrameFieldHeightInMb; 305 uint32_t dwFrameHeightInMb; 306 uint32_t dwVerticalLineStride; 307 uint32_t dwVerticalLineStrideOffset; 308 bool bHmeEnabled; 309 bool bMbEncIFrameDistInUse; 310 bool bMbQpBufferInUse; 311 bool bMbSpecificDataEnabled; 312 bool bMbConstDataBufferInUse; 313 bool bUsedAsRef; 314 PMOS_RESOURCE presMbEncCurbeBuffer; 315 PMOS_RESOURCE presMbEncBRCBuffer; //extra surface on KBL BRC update 316 uint32_t dwMbEncBRCBufferSize; 317 bool bUseMbEncAdvKernel; 318 bool bArbitraryNumMbsInSlice; 319 PMOS_SURFACE psSliceMapSurface; // Slice map for arbitrary number of mbs in slice feature 320 uint32_t dwSliceMapBottomFieldOffset; 321 bool bBrcEnabled; 322 PMHW_KERNEL_STATE pKernelState; 323 bool bUseAdvancedDsh; 324 PCODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC pMbEncBindingTable; 325 bool bMbDisableSkipMapEnabled; 326 PMOS_SURFACE psMbDisableSkipMapSurface; 327 bool bStaticFrameDetectionEnabled; 328 PMOS_RESOURCE presSFDOutputBuffer; 329 PMOS_RESOURCE presSFDCostTableBuffer; 330 PCODEC_AVC_REF_PIC_SELECT_LIST pWeightedPredOutputPicSelectList; 331 bool bUseWeightedSurfaceForL0; 332 bool bUseWeightedSurfaceForL1; 333 PMOS_RESOURCE presMbInlineData; 334 PMOS_RESOURCE presVMEOutSurface; 335 } CODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS; 336 337 typedef struct _CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS 338 { 339 uint32_t submitNumber; 340 PMHW_KERNEL_STATE pKernelState; 341 PCODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC pBindingTable; 342 } CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS; 343 344 typedef enum _CODECHAL_ENCODE_AVC_MULTIPRED 345 { 346 CODECHAL_ENCODE_AVC_MULTIPRED_ENABLE = 0x01, 347 CODECHAL_ENCODE_AVC_MULTIPRED_DISABLE = 0x80 348 } CODECHAL_ENCODE_AVC_MULTIPRED; 349 350 typedef struct _CODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC 351 { 352 uint32_t dwAvcPreProcCurrY; 353 uint32_t dwAvcPreProcCurrUV; 354 uint32_t dwAvcPreProcMVDataFromHME; 355 uint32_t dwAvcPreProcMvPredictor; 356 uint32_t dwAvcPreProcMbQp; 357 uint32_t dwAvcPreProcMvDataOut; 358 uint32_t dwAvcPreProcMbStatsOut; 359 360 uint32_t dwAvcPreProcVMECurrPicFrame[CODEC_AVC_NUM_REF_LISTS]; 361 uint32_t dwAvcPreProcVMEFwdPicFrame; 362 uint32_t dwAvcPreProcVMEBwdPicFrame[2]; // Bwd ref IDX0 and IDX1 are repeated, so include two to account for this 363 uint32_t dwAvcPreProcFtqLut; 364 365 uint32_t dwAvcPreProcVMECurrPicField[2]; 366 uint32_t dwAvcPreProcVMEFwdPicField[2]; 367 uint32_t dwAvcPreProcVMEBwdPicField[2]; 368 uint32_t dwAvcPreProcFtqLutField; 369 370 uint32_t dwBindingTableStartOffset; 371 uint32_t dwNumBindingTableEntries; 372 } CODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC, *PCODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC; 373 374 typedef struct _CODECHAL_ENCOCDE_AVC_PREPROC_SURFACE_PARAMS 375 { 376 FeiPreEncParams *pPreEncParams; 377 PCODEC_REF_LIST *ppRefList; 378 PCODEC_PICTURE pCurrOriginalPic; 379 PMOS_SURFACE psCurrPicSurface; 380 PMOS_SURFACE ps4xMeMvDataBuffer; 381 PMOS_RESOURCE presFtqLutBuffer; 382 uint32_t dwMeMvBottomFieldOffset; 383 uint32_t dwMBVProcStatsBottomFieldOffset; 384 uint32_t dwFrameWidthInMb; 385 uint32_t dwFrameFieldHeightInMb; 386 uint32_t dwVerticalLineStride; 387 uint32_t dwVerticalLineStrideOffset; 388 bool bHmeEnabled; 389 PMHW_KERNEL_STATE pKernelState; 390 PCODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC pPreProcBindingTable; 391 } CODECHAL_ENCODE_AVC_PREPROC_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_PREPROC_SURFACE_PARAMS; 392 393 typedef struct _CODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS 394 { 395 FeiPreEncParams *pPreEncParams; 396 uint16_t wPicWidthInMb; 397 uint16_t wFieldFrameHeightInMb; 398 PMHW_KERNEL_STATE pKernelState; 399 uint8_t* pCurbeBinary; 400 } CODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS; 401 402 typedef struct _CODECHAL_ENCODE_AVC_WP_CURBE_PARAMS 403 { 404 uint8_t RefPicListIdx; 405 uint32_t WPIdx; 406 } CODECHAL_ENCODE_AVC_WP_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_WP_CURBE_PARAMS; 407 408 typedef struct _CODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS 409 { 410 PMOS_SURFACE psInputRefBuffer; 411 PMOS_SURFACE psOutputScaledBuffer; 412 uint32_t dwVerticalLineStride; 413 uint32_t dwVerticalLineStrideOffset; 414 uint8_t ucVDirection; 415 PMHW_KERNEL_STATE pKernelState; 416 } CODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS; 417 418 //! 419 //! \struct CodechalEncodeAvcEnc 420 //! \brief Codechal encode Avc Encode 421 //! 422 struct CodechalEncodeAvcEnc : public CodechalEncodeAvcBase 423 { 424 425 typedef struct _CODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS 426 { 427 union 428 { 429 struct 430 { 431 uint32_t ForceToIntra : MOS_BITFIELD_RANGE( 0, 0 ); 432 uint32_t Reserved : MOS_BITFIELD_RANGE( 1,31 ); 433 }; 434 struct 435 { 436 uint32_t Value; 437 }; 438 } DW0; 439 440 union 441 { 442 struct 443 { 444 uint32_t Reserved : MOS_BITFIELD_RANGE( 0,31 ); 445 }; 446 struct 447 { 448 uint32_t Value; 449 }; 450 } DW1; 451 452 union 453 { 454 struct 455 { 456 uint32_t Reserved : MOS_BITFIELD_RANGE( 0,31 ); 457 }; 458 struct 459 { 460 uint32_t Value; 461 }; 462 } DW2; 463 464 union 465 { 466 struct 467 { 468 uint32_t Reserved : MOS_BITFIELD_RANGE( 0,31 ); 469 }; 470 struct 471 { 472 uint32_t Value; 473 }; 474 } DW3; 475 } CODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS, *PCODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS; 476 C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CODECHAL_ENCODE_AVC_MB_SPECIFIC_PARAMS)) == 4); 477 478 // SEI 479 CodechalEncodeSeiData SeiData; //!< Encode SEI data parameter. 480 uint32_t dwSEIDataOffset; //!< Encode SEI data offset. 481 uint8_t* pSeiParamBuffer; //!< Encode SEI data buffer. 482 483 bool bMbEncCurbeSetInBrcUpdate; //!< bMbEncCurbeSetInBrcUpdate. 484 bool bMbEncIFrameDistEnabled; //!< bMbEncIFrameDistEnabled. 485 bool bBrcInit; //!< BRC init enable flag. 486 bool bBrcReset; //!< BRC reset enable flag. 487 bool bBrcEnabled; //!< BRC enable flag. 488 bool bMbBrcEnabled; //!< MBBrc enable flag. 489 bool bBrcRoiEnabled; //!< BRC ROI feature enable flag. 490 bool bROIValueInDeltaQP; //!< ROI QP in delta QP flag. 491 bool bROISmoothEnabled; //!< ROI smooth area enable flag. 492 bool bMbBrcUserFeatureKeyControl; //!< MBBRC user feature control enable flag. 493 double dBrcTargetSize; //!< BRC target size. 494 uint32_t dwTrellis; //!< Trellis Number. 495 bool bAcceleratorHeaderPackingCaps; //!< Flag set by driver from driver caps. 496 uint32_t dwIntraRefreshQpThreshold; //!< Intra Refresh QP Threshold. 497 bool bSquareRollingIEnabled; //!< SquareRollingI enable flag. 498 499 // VME Scratch Buffers 500 MOS_RESOURCE resVMEScratchBuffer; //!< VME Scratch Buffer resource. 501 bool bVMEScratchBuffer; //!< VME ScratchBuffer enable flag. 502 MOS_RESOURCE resVmeKernelDumpBuffer; //!< VME Kernel Dump resource. 503 bool bVMEKernelDump; //!< VME kernel dump flag. 504 uint32_t ulVMEKernelDumpBottomFieldOffset; //!< VME Kernel Dump Bottom Field Offset 505 506 // MbEnc 507 PMHW_KERNEL_STATE pMbEncKernelStates; //!< Pointer to MbEnc Kernel States. 508 CODECHAL_ENCODE_AVC_BINDING_TABLE_MBENC MbEncBindingTable; //!< Pointer to MbEnc BindingTable. 509 uint32_t dwNumMbEncEncKrnStates; //!< MbEncEncKrnStates Number. 510 CODEC_AVC_REF_PIC_SELECT_LIST RefPicSelectList[CODECHAL_ENCODE_AVC_REF_PIC_SELECT_ENTRIES]; //!< Array of RefPicSelect. 511 uint8_t ucCurrRefPicSelectIndex; //!< Current RefPic Select Index 512 uint32_t ulRefPicSelectBottomFieldOffset; //!< RefPic Select BottomField Offset 513 uint32_t dwMbEncBlockBasedSkipEn; //!< MbEnc Block Based Skip enable flag. 514 bool bKernelTrellis; //!< Kernel controlled Trellis Quantization. 515 bool bExtendedMvCostRange; //!< Extended MV Cost Range for Gen10+. 516 517 //MFE MbEnc 518 MHW_KERNEL_STATE mfeMbEncKernelState; //!< Mfe MbEnc Kernel State. 519 520 // Intra Distortion 521 PMHW_KERNEL_STATE pIntraDistortionKernelStates = {}; //!< Point to Intra Distortion Kernel States. 522 523 // WP 524 PMHW_KERNEL_STATE pWPKernelState; //!< Point to WP Kernel State. 525 CODEC_AVC_REF_PIC_SELECT_LIST WeightedPredOutputPicSelectList[CODEC_AVC_NUM_WP_FRAME]; //!< Array of WeightedPredOutputPicSelectList. 526 527 // BRC Params 528 MHW_KERNEL_STATE BrcKernelStates[CODECHAL_ENCODE_BRC_IDX_NUM]; //!< Array of BrcKernelStates. 529 CODECHAL_ENCODE_AVC_BINDING_TABLE_BRC_UPDATE BrcUpdateBindingTable; //!< BrcUpdate BindingTable 530 531 // PreProc 532 MHW_KERNEL_STATE PreProcKernelState; //!< PreProc KernelState 533 CODECHAL_ENCODE_AVC_BINDING_TABLE_PREPROC PreProcBindingTable; //!< PreProc BindingTable 534 535 EncodeBrcBuffers BrcBuffers; //!< BRC related buffers 536 uint16_t usAVBRAccuracy; //!< AVBR Accuracy 537 uint16_t usAVBRConvergence; //!< AVBR Convergence 538 double dBrcInitCurrentTargetBufFullInBits; //!< BRC init current target buffer full in bits 539 double dBrcInitResetInputBitsPerFrame; //!< BrcInitReset Input Bits Per Frame 540 uint32_t dwBrcInitResetBufSizeInBits; //!< BrcInitReset Buffer Size In Bits 541 uint32_t dwBrcInitPreviousTargetBufFullInBits; //!< BRC Init Previous Target Buffer Full In Bits 542 // Below values will be set if qp control params are sent by app 543 bool bMinMaxQPControlEnabled; //!< Flag to indicate if min/max QP feature is enabled or not. 544 uint8_t ucIMinQP; //!< I frame Minimum QP. 545 uint8_t ucIMaxQP; //!< I frame Maximum QP. 546 uint8_t ucPMinQP; //!< P frame Minimum QP. 547 uint8_t ucPMaxQP; //!< P frame Maximum QP. 548 uint8_t ucBMinQP; //!< B frame Minimum QP. 549 uint8_t ucBMaxQP; //!< B frame Maximum QP. 550 bool bPFrameMinMaxQPControl; //!< Indicates min/max QP values for P-frames are set separately or not. 551 bool bBFrameMinMaxQPControl; //!< Indicates min/max QP values for B-frames are set separately or not. 552 553 uint32_t dwSkipFrameBufferSize; //!< size of skip frame packed data. 554 MOS_RESOURCE resSkipFrameBuffer; //!< copy skip frame packed data from DDI. 555 // Mb Disable Skip Map 556 bool bMbDisableSkipMapEnabled; //!< MbDisableSkipMap Flag. 557 PMOS_SURFACE psMbDisableSkipMapSurface; //!< Point to MbDisableSkipMap Surface. 558 559 // Mb Qp Data 560 bool bMbQpDataEnabled; //!< Mb Qp Data Enable Flag. 561 MOS_SURFACE sMbQpDataSurface; //!< Pointer to MOS_SURFACE of Mb Qp data surface, provided by DDI. 562 563 // Mb specific Data 564 bool bMbSpecificDataEnabled; 565 MOS_RESOURCE resMbSpecificDataBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; 566 567 // Static frame detection 568 bool bStaticFrameDetectionEnable; //!< Static frame detection enable. 569 bool bApdatvieSearchWindowEnable; //!< allow search window size change when SFD enabled. 570 bool bPerMbSFD; //!< 571 MOS_RESOURCE resSFDOutputBuffer[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; //!< Array of SFDOutputBuffer. 572 MOS_RESOURCE resSFDCostTablePFrameBuffer; //!< SFD CostTable of P Frame. 573 MOS_RESOURCE resSFDCostTableBFrameBuffer; //!< SFD CostTable of B Frame. 574 PMHW_KERNEL_STATE pSFDKernelState; //!< Point to SFD kernel state. 575 576 // Generation Specific Support Flags & User Feature Key Reads 577 bool bBrcDistortionBufferSupported; //!< BRC DistortionBuffer Support Flag. 578 bool bRefPicSelectListSupported; //!< RefPicSelectList Support Flag. 579 uint8_t ucMbBrcSupportCaps; //!< MbBrcSupport Capability. 580 bool bMultiPredEnable; //!< MultiPredictor enable, 6 predictors 581 bool bFTQEnable; //!< FTQEnable 582 bool bCAFSupported; //!< CAFSupported 583 bool bCAFEnable; //!< CAFEnable 584 bool bCAFDisableHD; //!< Disable CAF for HD 585 bool bSkipBiasAdjustmentSupported; //!< SkipBiasAdjustment support for P frame 586 bool bAdaptiveIntraScalingEnable; //!< Enable AdaptiveIntraScaling 587 bool bOldModeCostEnable; //!< Enable Old Mode Cost (HSW cost table for BDW) 588 bool bMultiRefQpEnabled; //!< BDW MultiRef QP 589 bool bAdvancedDshInUse; //!< Use MbEnc Adv kernel 590 bool bUseMbEncAdvKernel; //!< Use MbEnc Adv kernel 591 bool bUseWeightedSurfaceForL0; //!< Use WP Surface for L0 592 bool bUseWeightedSurfaceForL1; //!< Use WP Surface for L1 593 bool bWeightedPredictionSupported; //!< Weighted prediction support 594 bool bBrcSplitEnable; //!< starting GEN9 BRC kernel has split into frame-level and MB-level update. 595 bool bDecoupleMbEncCurbeFromBRC; //!< starting GEN95 BRC kernel write to extra surface instead of MBEnc curbe. 596 bool bSliceLevelReportSupported; //!< Slice Level Report support 597 bool bFBRBypassEnable; //!< FBRBypassEnable 598 bool bBrcRoiSupported; //!< BRC Roi Support Flag. 599 bool bMvDataNeededByBRC; //!< starting G95, mv data buffer from HME is needed by BRC frame update kernel. 600 bool bHighTextureModeCostEnable; //!< HighTexture ModeCost Enable Flag. 601 602 bool bRoundingInterEnable; //!< RoundingInter Enable Flag. 603 bool bAdaptiveRoundingInterEnable; //!< Adaptive Rounding Inter Enable Flag. 604 uint32_t dwRoundingInterP; //!< Rounding Inter for P frame 605 uint32_t dwRoundingInterB; //!< Rounding Inter for B frame 606 uint32_t dwRoundingInterBRef; //!< Rounding Inter for BRef frame 607 uint32_t dwBrcConstantSurfaceWidth; //!< Brc Constant Surface Width 608 uint32_t dwBrcConstantSurfaceHeight; //!< Brc Constant Surface Height 609 610 uint32_t dwSlidingWindowSize = 0; //!< Sliding Window Size 611 bool bForceToSkipEnable = false; //!< ForceToSkip Enable Flag 612 bool bBRCVarCompuBypass = false; //!< Bypass variance computation in BRC kernel 613 614 static const uint32_t MaxLenSP[NUM_TARGET_USAGE_MODES]; 615 static const uint32_t EnableAdaptiveSearch[NUM_TARGET_USAGE_MODES]; 616 static const uint32_t FTQBasedSkip[NUM_TARGET_USAGE_MODES]; 617 static const uint32_t HMEBCombineLen[NUM_TARGET_USAGE_MODES]; 618 static const uint32_t HMECombineLen[NUM_TARGET_USAGE_MODES]; 619 static const uint32_t SearchX[NUM_TARGET_USAGE_MODES]; 620 static const uint32_t SearchY[NUM_TARGET_USAGE_MODES]; 621 static const uint32_t BSearchX[NUM_TARGET_USAGE_MODES]; 622 static const uint32_t BSearchY[NUM_TARGET_USAGE_MODES]; 623 624 static const uint32_t InterRoundingP_TQ[NUM_TARGET_USAGE_MODES]; 625 static const uint32_t InterRoundingBRef_TQ[NUM_TARGET_USAGE_MODES]; 626 static const uint32_t InterRoundingB_TQ[NUM_TARGET_USAGE_MODES]; 627 static const uint32_t TrellisQuantizationEnable[NUM_TARGET_USAGE_MODES]; 628 static const uint32_t EnableAdaptiveTrellisQuantization[NUM_TARGET_USAGE_MODES]; 629 static const uint32_t TQ_LAMBDA_I_FRAME[CODEC_AVC_NUM_QP][2]; 630 static const uint32_t TQ_LAMBDA_P_FRAME[CODEC_AVC_NUM_QP][2]; 631 static const uint32_t TQ_LAMBDA_B_FRAME[CODEC_AVC_NUM_QP][2]; 632 static const uint8_t IntraScalingFactor_Cm_Common[64]; 633 static const uint8_t AdaptiveIntraScalingFactor_Cm_Common[64]; 634 static const uint32_t OldIntraModeCost_Cm_Common[CODEC_AVC_NUM_QP]; 635 static const uint32_t MvCost_PSkipAdjustment_Cm_Common[CODEC_AVC_NUM_QP]; 636 static const uint16_t SkipVal_B_Common[2][2][64]; 637 static const uint16_t SkipVal_P_Common[2][2][64]; 638 static const uint32_t PreProcFtqLut_Cm_Common[CODEC_AVC_NUM_QP][16]; 639 static const uint32_t MBBrcConstantData_Cm_Common[3][CODEC_AVC_NUM_QP][16]; 640 641 static const uint32_t ModeMvCost_Common[3][CODEC_AVC_NUM_QP][8]; 642 static const uint16_t RefCost_Common[3][64]; 643 static const uint8_t MaxRefIdx0_Progressive_4K[NUM_TARGET_USAGE_MODES]; 644 static const uint8_t MaxRefIdx0[NUM_TARGET_USAGE_MODES]; 645 static const uint8_t MaxBRefIdx0[NUM_TARGET_USAGE_MODES]; 646 static const uint8_t MaxRefIdx1[NUM_TARGET_USAGE_MODES]; 647 static const uint32_t SuperHME[NUM_TARGET_USAGE_MODES]; 648 static const uint32_t UltraHME[NUM_TARGET_USAGE_MODES]; 649 650 static const uint32_t ModeMvCost_Cm[3][52][8]; 651 652 static const uint8_t m_qpDistMaxFrameAdjustmentCm[576]; 653 static const uint32_t MultiPred[NUM_TARGET_USAGE_MODES]; 654 static const uint32_t MRDisableQPCheck[NUM_TARGET_USAGE_MODES]; 655 static const uint16_t RefCost_MultiRefQp[NUM_PIC_TYPES][64]; 656 static const uint32_t CODECHAL_ENCODE_AVC_AllFractional_Common[NUM_TARGET_USAGE_MODES]; 657 static const uint32_t CODECHAL_ENCODE_AVC_DisableAllFractionalCheckForHighRes_Common[NUM_TARGET_USAGE_MODES]; 658 659 static const uint32_t m_refThreshold = 400; 660 static const uint32_t m_mbencNumTargetUsages = 3; 661 static const uint32_t m_brcConstantSurfaceEarlySkipTableSize = 128; 662 static const uint32_t m_brcConstantSurfaceRefCostSize = 128; 663 static const uint32_t m_brcConstantSurfacModeMvCostSize = 1664; 664 665 typedef enum _ID_OFFSET_MBENC_CM 666 { 667 MBENC_I_OFFSET_CM = 0, 668 MBENC_P_OFFSET_CM = 1, 669 MBENC_B_OFFSET_CM = 2, 670 MBENC_TARGET_USAGE_CM = 3 671 } ID_OFFSET_MBENC_CM; 672 673 //! 674 //! \brief Constructor 675 //! 676 CodechalEncodeAvcEnc( 677 CodechalHwInterface * hwInterface, 678 CodechalDebugInterface *debugInterface, 679 PCODECHAL_STANDARD_INFO standardInfo); 680 681 //! 682 //! \brief Copy constructor 683 //! 684 CodechalEncodeAvcEnc(const CodechalEncodeAvcEnc&) = delete; 685 686 //! 687 //! \brief Copy assignment operator 688 //! 689 CodechalEncodeAvcEnc& operator=(const CodechalEncodeAvcEnc&) = delete; 690 691 //! 692 //! \brief Destructor 693 //! 694 virtual ~CodechalEncodeAvcEnc(); 695 696 //Encode interface implementations 697 //! 698 //! \brief Initialize standard related members. 699 //! \details Initialize members, set proper value 700 //! to involved variables, allocate resources. 701 //! 702 //! \param [in] settings 703 //! Encode settings. 704 //! 705 //! \return MOS_STATUS 706 //! MOS_STATUS_SUCCESS if success 707 //! 708 virtual MOS_STATUS Initialize( 709 CodechalSetting * settings) override; 710 711 //! 712 //! \brief Initialize encoder related members. 713 //! \details Initialize members, set proper value 714 //! to involved variables, allocate resources. 715 //! 716 //! \return MOS_STATUS 717 //! MOS_STATUS_SUCCESS if success 718 //! 719 virtual MOS_STATUS InitializePicture(const EncoderParams& params) override; 720 721 //! 722 //! \brief Call media kernel functions. 723 //! \details Call to related encode kernel functions. 724 //! 725 //! \return MOS_STATUS 726 //! MOS_STATUS_SUCCESS if success 727 //! 728 virtual MOS_STATUS ExecuteKernelFunctions() override; 729 730 //! 731 //! \brief Encode frame in picture level. 732 //! \details Call related encode functions to encode 733 //! one frame in picture level. 734 //! 735 //! \return MOS_STATUS 736 //! MOS_STATUS_SUCCESS if success 737 //! 738 virtual MOS_STATUS ExecutePictureLevel() override; 739 740 //! 741 //! \brief Encode frame in slice level. 742 //! \details Call related encode functions to encode 743 //! one frame in slice level. 744 //! 745 //! \return MOS_STATUS 746 //! MOS_STATUS_SUCCESS if success 747 //! 748 virtual MOS_STATUS ExecuteSliceLevel() override; 749 750 //! 751 //! \brief Encode User Feature Key Report. 752 //! \details Report user feature values set by encode. 753 //! 754 //! \return MOS_STATUS 755 //! MOS_STATUS_SUCCESS if success 756 //! 757 virtual MOS_STATUS UserFeatureKeyReport() override; 758 759 virtual MOS_STATUS ExecutePreEnc(EncoderParams* encodeParams) override; 760 //! 761 //! \brief Slice map surface programming 762 //! \details Set slice map data. 763 //! 764 //! \param [in] data 765 //! Encode interface 766 //! \param [in] avcSliceParams 767 //! Slice map command params 768 //! 769 //! \return MOS_STATUS 770 //! MOS_STATUS_SUCCESS if success 771 //! 772 virtual MOS_STATUS EncodeGenerateSliceMap( 773 uint8_t* data, 774 PCODEC_AVC_ENCODE_SLICE_PARAMS avcSliceParams); 775 776 //! 777 //! \brief Allocate necessary resources. 778 //! 779 //! \return MOS_STATUS 780 //! MOS_STATUS_SUCCESS if success 781 //! 782 virtual MOS_STATUS AllocateResources() override; 783 784 //! 785 //! \brief Allocate necessary resources for BRC case. 786 //! 787 //! \return MOS_STATUS 788 //! MOS_STATUS_SUCCESS if success 789 //! 790 virtual MOS_STATUS AllocateResourcesBrc(); 791 792 //! 793 //! \brief Allocate necessary resources for MBBRC case. 794 //! 795 //! \return MOS_STATUS 796 //! MOS_STATUS_SUCCESS if success 797 //! 798 virtual MOS_STATUS AllocateResourcesMbBrc(); 799 800 //! 801 //! \brief Release allocated resources for BRC case. 802 //! 803 //! \return MOS_STATUS 804 //! MOS_STATUS_SUCCESS if success 805 //! 806 virtual MOS_STATUS ReleaseResourcesBrc(); 807 808 //! 809 //! \brief Release allocated resources for MBBRC case. 810 //! 811 //! \return MOS_STATUS 812 //! MOS_STATUS_SUCCESS if success 813 //! 814 virtual MOS_STATUS ReleaseResourcesMbBrc(); 815 816 //! 817 //! \brief AVC Enc State Initialization. 818 //! 819 //! \return MOS_STATUS 820 //! MOS_STATUS_SUCCESS if success 821 //! 822 virtual MOS_STATUS Initialize() override; 823 824 //! 825 //! \brief Generic State Picture Level Encoding.. 826 //! 827 //! \param [in] params 828 //! Pointer to the CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS 829 //! 830 //! \return MOS_STATUS 831 //! MOS_STATUS_SUCCESS if success 832 //! 833 virtual MOS_STATUS GenericEncodePictureLevel( 834 PCODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS params); 835 836 //! 837 //! \brief Run Encode ME kernel 838 //! 839 //! \param [in] brcBuffers 840 //! Pointer to the EncodeBrcBuffers 841 //! \param [in] hmeLevel 842 //! Hme level 843 //! 844 //! \return MOS_STATUS 845 //! MOS_STATUS_SUCCESS if success 846 //! 847 virtual MOS_STATUS GenericEncodeMeKernel(EncodeBrcBuffers* brcBuffers, HmeLevel hmeLevel); 848 849 //! 850 //! \brief Initialize Encode ME kernel state 851 //! 852 //! \return MOS_STATUS 853 //! MOS_STATUS_SUCCESS if success 854 //! 855 virtual MOS_STATUS InitKernelStateMe() override; 856 857 //! 858 //! \brief Set Encode ME kernel Curbe data. 859 //! 860 //! \param [in] params 861 //! Pointer to the MeCurbeParams 862 //! 863 //! \return MOS_STATUS 864 //! MOS_STATUS_SUCCESS if success 865 //! 866 virtual MOS_STATUS SetCurbeMe ( 867 MeCurbeParams* params) override; 868 869 //! 870 //! \brief Set Encode ME kernel Surfaces 871 //! 872 //! \param [in] cmdBuffer 873 //! Pointer to the PMOS_COMMAND_BUFFER 874 //! \param [in] params 875 //! Pointer to the CODECHAL_ME_SURFACE_PARAMS 876 //! 877 //! \return MOS_STATUS 878 //! MOS_STATUS_SUCCESS if success 879 //! 880 virtual MOS_STATUS SendMeSurfaces ( 881 PMOS_COMMAND_BUFFER cmdBuffer, 882 MeSurfaceParams* params) override; 883 884 // AvcState functions. 885 //! 886 //! \brief Initialize data members of AVC encoder instance 887 //! 888 //! \return void 889 //! 890 virtual void InitializeDataMember(); 891 892 // state related funcs 893 //! 894 //! \brief Initialize encode state 895 //! 896 //! \return MOS_STATUS 897 //! MOS_STATUS_SUCCESS if success, else fail reason 898 //! 899 virtual MOS_STATUS InitializeState(); 900 901 //! 902 //! \brief Validate reference list L0 and L1. 903 //! 904 //! \param [in] params 905 //! Pointer to CODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS 906 //! 907 //! \return MOS_STATUS 908 //! MOS_STATUS_SUCCESS if success, else fail reason 909 //! 910 virtual MOS_STATUS ValidateNumReferences( 911 PCODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS params); 912 913 //! 914 //! \brief Initialize brc constant buffer 915 //! 916 //! \param [in] params 917 //! Pointer to CODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS 918 //! 919 //! \return MOS_STATUS 920 //! MOS_STATUS_SUCCESS if success, else fail reason 921 //! 922 virtual MOS_STATUS InitBrcConstantBuffer( 923 PCODECHAL_ENCODE_AVC_INIT_BRC_CONSTANT_BUFFER_PARAMS params); 924 925 //! 926 //! \brief Initialize mbbrc constant buffer 927 //! 928 //! \param [in] params 929 //! Pointer to CODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS 930 //! 931 //! \return MOS_STATUS 932 //! MOS_STATUS_SUCCESS if success, else fail reason 933 //! 934 virtual MOS_STATUS InitMbBrcConstantDataBuffer( 935 PCODECHAL_ENCODE_AVC_INIT_MBBRC_CONSTANT_DATA_BUFFER_PARAMS params); 936 937 //! 938 //! \brief Get inter rounding value. 939 //! 940 //! \param [in] sliceState 941 //! Pointer to MHW_VDBOX_AVC_SLICE_STATE 942 //! 943 //! \return MOS_STATUS 944 //! MOS_STATUS_SUCCESS if success, else fail reason 945 //! 946 virtual MOS_STATUS GetInterRounding( 947 PMHW_VDBOX_AVC_SLICE_STATE sliceState); 948 949 //! 950 //! \brief Calculate lambda table. 951 //! 952 //! \param [in] slice_type 953 //! Slice type. 954 //! \param [out] lambda 955 //! Lambda table. 956 //! 957 //! \return MOS_STATUS 958 //! MOS_STATUS_SUCCESS if success, else fail reason 959 //! 960 virtual MOS_STATUS CalcLambdaTable( 961 uint16_t slice_type, 962 uint32_t* lambda); 963 964 //! 965 //! \brief Get Trellis Quantization mode/value enable or not. 966 //! 967 //! \param [in] params 968 //! Pointer to CODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS. 969 //! \param [out] trellisQuantParams 970 //! Pointer to CODECHAL_ENCODE_AVC_TQ_PARAMS, mode & value setup. 971 //! 972 //! \return MOS_STATUS 973 //! MOS_STATUS_SUCCESS if success, else fail reason 974 //! GetTrellisQuantizationCodechalEncodeAvcEnc975 virtual MOS_STATUS GetTrellisQuantization( 976 PCODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS params, 977 PCODECHAL_ENCODE_AVC_TQ_PARAMS trellisQuantParams) 978 { 979 return MOS_STATUS_SUCCESS; 980 } 981 982 //! 983 //! \brief Get Skip Bias Adjustment. 984 //! 985 //! \param [in] sliceQP 986 //! Slice QP. 987 //! \param [in] gopRefDist 988 //! GOP reference dist. 989 //! \param [in] skipBiasAdjustmentEnable 990 //! Adjustable or not. 991 //! 992 //! \return MOS_STATUS 993 //! MOS_STATUS_SUCCESS if success, else fail reason 994 //! 995 virtual MOS_STATUS GetSkipBiasAdjustment( 996 uint8_t sliceQP, 997 uint16_t gopRefDist, 998 bool* skipBiasAdjustmentEnable); 999 1000 //! 1001 //! \brief Get Hme Supported Based On TU. 1002 //! 1003 //! \param [in] hmeLevel 1004 //! HME level 1005 //! \param [out] supported 1006 //! Supported or not 1007 //! 1008 //! \return MOS_STATUS 1009 //! MOS_STATUS_SUCCESS if success, else fail reason 1010 //! 1011 virtual MOS_STATUS GetHmeSupportedBasedOnTU( 1012 HmeLevel hmeLevel, 1013 bool *supported); 1014 1015 //! 1016 //! \brief Get MbBrc status. 1017 //! 1018 //! \param [in] targetUsage 1019 //! Target Usage. 1020 //! \param [out] mbBrcEnabled 1021 //! MBBRC enabled or not 1022 //! 1023 //! \return MOS_STATUS 1024 //! MOS_STATUS_SUCCESS if success, else fail reason 1025 //! 1026 virtual MOS_STATUS GetMbBrcEnabled( 1027 uint32_t targetUsage, 1028 bool *mbBrcEnabled); 1029 1030 //! 1031 //! \brief CAF enabled or not. 1032 //! 1033 //! \param [out] cafEnable 1034 //! CAF enabled or not 1035 //! 1036 //! \return MOS_STATUS 1037 //! MOS_STATUS_SUCCESS if success, else fail reason 1038 //! 1039 virtual MOS_STATUS GetCAFEnabled( 1040 bool *cafEnable); 1041 1042 //! 1043 //! \brief ATD enabled or not. 1044 //! 1045 //! \return MOS_STATUS 1046 //! MOS_STATUS_SUCCESS if success, else fail reason 1047 //! 1048 virtual MOS_STATUS GetATDEnabled(); 1049 1050 //! 1051 //! \brief Init BRC reset kernel 1052 //! 1053 //! \return MOS_STATUS 1054 //! MOS_STATUS_SUCCESS if success, else fail reason 1055 //! 1056 MOS_STATUS BrcInitResetKernel(); 1057 1058 //! 1059 //! \brief Init MbEnc kernel state 1060 //! 1061 //! \return MOS_STATUS 1062 //! MOS_STATUS_SUCCESS if success, else fail reason 1063 //! InitKernelStateMbEncCodechalEncodeAvcEnc1064 virtual MOS_STATUS InitKernelStateMbEnc() 1065 { 1066 return MOS_STATUS_SUCCESS; 1067 } 1068 1069 //! 1070 //! \brief Init Weight Prediction kernel state 1071 //! 1072 //! \return MOS_STATUS 1073 //! MOS_STATUS_SUCCESS if success, else fail reason 1074 //! InitKernelStateWPCodechalEncodeAvcEnc1075 virtual MOS_STATUS InitKernelStateWP() 1076 { 1077 return MOS_STATUS_SUCCESS; 1078 } 1079 1080 //! 1081 //! \brief Init BRC kernel state 1082 //! 1083 //! \return MOS_STATUS 1084 //! MOS_STATUS_SUCCESS if success, else fail reason 1085 //! InitKernelStateBrcCodechalEncodeAvcEnc1086 virtual MOS_STATUS InitKernelStateBrc() 1087 { 1088 return MOS_STATUS_SUCCESS; 1089 } 1090 1091 //! 1092 //! \brief Init FEI PreProc kernel state 1093 //! 1094 //! \return MOS_STATUS 1095 //! MOS_STATUS_SUCCESS if success, else fail reason 1096 //! InitKernelStatePreProcCodechalEncodeAvcEnc1097 virtual MOS_STATUS InitKernelStatePreProc() 1098 { 1099 return MOS_STATUS_SUCCESS; 1100 } 1101 1102 //! 1103 //! \brief Init SFD(still frame detection) kernel state 1104 //! 1105 //! \return MOS_STATUS 1106 //! MOS_STATUS_SUCCESS if success, else fail reason 1107 //! 1108 virtual MOS_STATUS InitKernelStateSFD(); 1109 1110 //! 1111 //! \brief Init kernel state 1112 //! 1113 //! \return MOS_STATUS 1114 //! MOS_STATUS_SUCCESS if success, else fail reason 1115 //! 1116 virtual MOS_STATUS InitKernelState(); 1117 1118 //! 1119 //! \brief Insert RefPic Select List 1120 //! 1121 //! \return MOS_STATUS 1122 //! MOS_STATUS_SUCCESS if success, else fail reason 1123 //! 1124 MOS_STATUS InsertInRefPicSelectList(); 1125 1126 //! 1127 //! \brief Run MbEnc Kernel. 1128 //! 1129 //! \param [in] mbEncIFrameDistInUse 1130 //! MbEncIFrameDist in use or not 1131 //! 1132 //! \return MOS_STATUS 1133 //! MOS_STATUS_SUCCESS if success, else fail reason 1134 //! 1135 virtual MOS_STATUS MbEncKernel( 1136 bool mbEncIFrameDistInUse); 1137 1138 //! 1139 //! \brief Run Brc Frame Update Kernel. 1140 //! 1141 //! \return MOS_STATUS 1142 //! MOS_STATUS_SUCCESS if success, else fail reason 1143 //! 1144 MOS_STATUS BrcFrameUpdateKernel(); 1145 1146 //! 1147 //! \brief Run Brc Copy Kernel. 1148 //! 1149 //! \return MOS_STATUS 1150 //! MOS_STATUS_SUCCESS if success, else fail reason 1151 //! 1152 MOS_STATUS BrcCopyKernel(); 1153 1154 //! 1155 //! \brief Run Brc MB update Kernel. 1156 //! 1157 //! \return MOS_STATUS 1158 //! MOS_STATUS_SUCCESS if success, else fail reason 1159 //! 1160 MOS_STATUS BrcMbUpdateKernel(); 1161 1162 //! 1163 //! \brief Run MbEnc Kernel. 1164 //! 1165 //! \param [in] useRefPicList1 1166 //! Use RefPicList 1 or Not. 1167 //! \param [in] index 1168 //! Index 1169 //! 1170 //! \return MOS_STATUS 1171 //! MOS_STATUS_SUCCESS if success, else fail reason 1172 //! 1173 MOS_STATUS WPKernel( 1174 bool useRefPicList1, 1175 uint32_t index); 1176 1177 //! 1178 //! \brief Run SFD(still frame detection) kernel 1179 //! 1180 //! \return MOS_STATUS 1181 //! MOS_STATUS_SUCCESS if success, else fail reason 1182 //! 1183 virtual MOS_STATUS SFDKernel(); 1184 1185 //! 1186 //! \brief Get MbEnc kernel state Idx 1187 //! 1188 //! \param [in] params 1189 //! Pointer to the CodechalEncodeIdOffsetParams 1190 //! \param [in] kernelOffset 1191 //! kernel offset 1192 //! 1193 //! \return MOS_STATUS 1194 //! MOS_STATUS_SUCCESS if success, else fail reason 1195 //! GetMbEncKernelStateIdxCodechalEncodeAvcEnc1196 virtual MOS_STATUS GetMbEncKernelStateIdx( 1197 CodechalEncodeIdOffsetParams* params, 1198 uint32_t* kernelOffset) 1199 { 1200 return MOS_STATUS_SUCCESS; 1201 } 1202 1203 //! 1204 //! \brief Get MbEnc kernel curbe data 1205 //! 1206 //! \param [in] params 1207 //! Pointer to CODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS 1208 //! 1209 //! \return MOS_STATUS 1210 //! MOS_STATUS_SUCCESS if success, else fail reason 1211 //! SetCurbeAvcMbEncCodechalEncodeAvcEnc1212 virtual MOS_STATUS SetCurbeAvcMbEnc( 1213 PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS params) 1214 { 1215 return MOS_STATUS_SUCCESS; 1216 } 1217 1218 //! 1219 //! \brief Set MFE MbEnc kernel curbe data 1220 //! 1221 //! \param [in] mbEncIFrameDistInUse 1222 //! MbEncIFrameDist in use or not 1223 //! 1224 //! \return BOOL 1225 //! true if MFE MbEnc is enabled, otherwise false 1226 //! IsMfeMbEncEnabledCodechalEncodeAvcEnc1227 virtual bool IsMfeMbEncEnabled( 1228 bool mbEncIFrameDistInUse) 1229 { 1230 return false; 1231 } 1232 1233 //! 1234 //! \brief Init Mfe MbEnc kernel state 1235 //! 1236 //! \return MOS_STATUS 1237 //! MOS_STATUS_SUCCESS if success, else fail reason 1238 //! InitKernelStateMfeMbEncCodechalEncodeAvcEnc1239 virtual MOS_STATUS InitKernelStateMfeMbEnc() 1240 { 1241 return MOS_STATUS_SUCCESS; 1242 } 1243 1244 //! 1245 //! \brief Defer init MFE specific resoruces and flags. 1246 //! 1247 //! \return MOS_STATUS 1248 //! MOS_STATUS_SUCCESS if success, else fail reason 1249 //! InitMfeCodechalEncodeAvcEnc1250 virtual MOS_STATUS InitMfe() 1251 { 1252 return MOS_STATUS_SUCCESS; 1253 } 1254 1255 //! 1256 //! \brief Set MFE MbEnc kernel curbe data 1257 //! 1258 //! \param [in] params 1259 //! Pointer to CODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS 1260 //! 1261 //! \return MOS_STATUS 1262 //! MOS_STATUS_SUCCESS if success, else fail reason 1263 //! SetCurbeAvcMfeMbEncCodechalEncodeAvcEnc1264 virtual MOS_STATUS SetCurbeAvcMfeMbEnc( 1265 PCODECHAL_ENCODE_AVC_MFE_MBENC_CURBE_PARAMS params) 1266 { 1267 return MOS_STATUS_SUCCESS; 1268 } 1269 1270 //! 1271 //! \brief Update binding table for MFE MbEnc kernel 1272 //! 1273 //! \param [in] submitIndex 1274 //! Index in this mfe submission call 1275 //! 1276 //! \return MOS_STATUS 1277 //! MOS_STATUS_SUCCESS if success, else fail reason 1278 //! UpdateMfeMbEncBindingTableCodechalEncodeAvcEnc1279 virtual MOS_STATUS UpdateMfeMbEncBindingTable( 1280 uint32_t submitIndex) 1281 { 1282 return MOS_STATUS_SUCCESS; 1283 } 1284 1285 //! 1286 //! \brief Get Weighted Prediction kernel curbe data 1287 //! 1288 //! \param [in] params 1289 //! Pointer to CODECHAL_ENCODE_AVC_WP_CURBE_PARAMS 1290 //! 1291 //! \return MOS_STATUS 1292 //! MOS_STATUS_SUCCESS if success, else fail reason 1293 //! SetCurbeAvcWPCodechalEncodeAvcEnc1294 virtual MOS_STATUS SetCurbeAvcWP( 1295 PCODECHAL_ENCODE_AVC_WP_CURBE_PARAMS params) 1296 { 1297 return MOS_STATUS_SUCCESS; 1298 } 1299 1300 //! 1301 //! \brief Get FEI PreProc kernel curbe data 1302 //! 1303 //! \param [in] params 1304 //! Pointer to CODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS 1305 //! 1306 //! \return MOS_STATUS 1307 //! MOS_STATUS_SUCCESS if success, else fail reason 1308 //! SetCurbeAvcPreProcCodechalEncodeAvcEnc1309 virtual MOS_STATUS SetCurbeAvcPreProc( 1310 PCODECHAL_ENCODE_AVC_PREPROC_CURBE_PARAMS params) 1311 { 1312 return MOS_STATUS_SUCCESS; 1313 } 1314 1315 //! 1316 //! \brief Get BRC InitReset kernel curbe data 1317 //! 1318 //! \param [in] params 1319 //! Pointer to CODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS 1320 //! 1321 //! \return MOS_STATUS 1322 //! MOS_STATUS_SUCCESS if success, else fail reason 1323 //! SetCurbeAvcBrcInitResetCodechalEncodeAvcEnc1324 virtual MOS_STATUS SetCurbeAvcBrcInitReset( 1325 PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_CURBE_PARAMS params) 1326 { 1327 return MOS_STATUS_SUCCESS; 1328 } 1329 1330 //! 1331 //! \brief Get FrameBRCUpdate kernel curbe data 1332 //! 1333 //! \param [in] params 1334 //! Pointer to CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS 1335 //! 1336 //! \return MOS_STATUS 1337 //! MOS_STATUS_SUCCESS if success, else fail reason 1338 //! SetCurbeAvcFrameBrcUpdateCodechalEncodeAvcEnc1339 virtual MOS_STATUS SetCurbeAvcFrameBrcUpdate( 1340 PCODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS params) 1341 { 1342 return MOS_STATUS_SUCCESS; 1343 } 1344 1345 //! 1346 //! \brief Get MbBrcUpdate kernel curbe data 1347 //! 1348 //! \param [in] params 1349 //! Pointer to CODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS 1350 //! 1351 //! \return MOS_STATUS 1352 //! MOS_STATUS_SUCCESS if success, else fail reason 1353 //! SetCurbeAvcMbBrcUpdateCodechalEncodeAvcEnc1354 virtual MOS_STATUS SetCurbeAvcMbBrcUpdate( 1355 PCODECHAL_ENCODE_AVC_BRC_UPDATE_CURBE_PARAMS params) 1356 { 1357 return MOS_STATUS_SUCCESS; 1358 } 1359 1360 //! 1361 //! \brief Get Brc Block Copy kernel curbe data 1362 //! 1363 //! \param [in] params 1364 //! Pointer to CODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS 1365 //! 1366 //! \return MOS_STATUS 1367 //! MOS_STATUS_SUCCESS if success, else fail reason 1368 //! SetCurbeAvcBrcBlockCopyCodechalEncodeAvcEnc1369 virtual MOS_STATUS SetCurbeAvcBrcBlockCopy( 1370 PCODECHAL_ENCODE_AVC_BRC_BLOCK_COPY_CURBE_PARAMS params) 1371 { 1372 return MOS_STATUS_SUCCESS; 1373 } 1374 1375 //! 1376 //! \brief Get SFD kernel curbe data 1377 //! 1378 //! \param [in] params 1379 //! Pointer to CODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS 1380 //! 1381 //! \return MOS_STATUS 1382 //! MOS_STATUS_SUCCESS if success, else fail reason 1383 //! 1384 virtual MOS_STATUS SetCurbeAvcSFD( 1385 PCODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS params); 1386 1387 //! 1388 //! \brief Set Sequence Structs 1389 //! 1390 //! \return MOS_STATUS 1391 //! MOS_STATUS_SUCCESS if success, else fail reason 1392 //! 1393 virtual MOS_STATUS SetSequenceStructs() override; 1394 1395 //! 1396 //! \brief Set Sequence Structs 1397 //! 1398 //! \return MOS_STATUS 1399 //! MOS_STATUS_SUCCESS if success, else fail reason 1400 //! 1401 virtual MOS_STATUS SetPictureStructs() override; 1402 1403 //! 1404 //! \brief Set slice Structs 1405 //! 1406 //! \return MOS_STATUS 1407 //! MOS_STATUS_SUCCESS if success, else fail reason 1408 //! 1409 MOS_STATUS SetSliceStructs() override; 1410 1411 //! 1412 //! \brief Set BRC InitReset kernel Surface 1413 //! 1414 //! \param [in] cmdBuffer 1415 //! Cmd Buffer 1416 //! \param [in] params 1417 //! Pointer to CODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS 1418 //! 1419 //! \return MOS_STATUS 1420 //! MOS_STATUS_SUCCESS if success, else fail reason 1421 //! 1422 MOS_STATUS SendBrcInitResetSurfaces( 1423 PMOS_COMMAND_BUFFER cmdBuffer, 1424 PCODECHAL_ENCODE_AVC_BRC_INIT_RESET_SURFACE_PARAMS params); 1425 1426 //! 1427 //! \brief Set MbEnc kernel Surface data 1428 //! 1429 //! \param [in] cmdBuffer 1430 //! Cmd Buffer 1431 //! \param [in] params 1432 //! Pointer to CODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS 1433 //! 1434 //! \return MOS_STATUS 1435 //! MOS_STATUS_SUCCESS if success, else fail reason 1436 //! SendAvcMbEncSurfacesCodechalEncodeAvcEnc1437 virtual MOS_STATUS SendAvcMbEncSurfaces( 1438 PMOS_COMMAND_BUFFER cmdBuffer, 1439 PCODECHAL_ENCODE_AVC_MBENC_SURFACE_PARAMS params) 1440 { 1441 return MOS_STATUS_SUCCESS; 1442 } 1443 1444 //! 1445 //! \brief Set Weighted Prediction kernel Surface state 1446 //! 1447 //! \param [in] cmdBuffer 1448 //! Cmd Buffer 1449 //! \param [in] params 1450 //! Pointer to CODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS 1451 //! 1452 //! \return MOS_STATUS 1453 //! MOS_STATUS_SUCCESS if success, else fail reason 1454 //! SendAvcWPSurfacesCodechalEncodeAvcEnc1455 virtual MOS_STATUS SendAvcWPSurfaces( 1456 PMOS_COMMAND_BUFFER cmdBuffer, 1457 PCODECHAL_ENCODE_AVC_WP_SURFACE_PARAMS params) 1458 { 1459 return MOS_STATUS_SUCCESS; 1460 } 1461 1462 //! 1463 //! \brief Set FEI PreProc kernel Surface state 1464 //! 1465 //! \param [in] cmdBuffer 1466 //! Cmd Buffer 1467 //! \param [in] params 1468 //! Pointer to CODECHAL_ENCODE_AVC_PREPROC_SURFACE_PARAMS 1469 //! 1470 //! \return MOS_STATUS 1471 //! MOS_STATUS_SUCCESS if success, else fail reason 1472 //! SendAvcPreProcSurfacesCodechalEncodeAvcEnc1473 virtual MOS_STATUS SendAvcPreProcSurfaces( 1474 PMOS_COMMAND_BUFFER cmdBuffer, 1475 PCODECHAL_ENCODE_AVC_PREPROC_SURFACE_PARAMS params) 1476 { 1477 return MOS_STATUS_SUCCESS; 1478 } 1479 1480 //! 1481 //! \brief Set BrcFrameUpdate kernel Surface state 1482 //! 1483 //! \param [in] cmdBuffer 1484 //! Cmd Buffer 1485 //! \param [in] params 1486 //! pointer to CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS 1487 //! 1488 //! \return MOS_STATUS 1489 //! MOS_STATUS_SUCCESS if success, else fail reason 1490 //! SendAvcBrcFrameUpdateSurfacesCodechalEncodeAvcEnc1491 virtual MOS_STATUS SendAvcBrcFrameUpdateSurfaces( 1492 PMOS_COMMAND_BUFFER cmdBuffer, 1493 PCODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS params) 1494 { 1495 return MOS_STATUS_SUCCESS; 1496 } 1497 1498 //! 1499 //! \brief Set BrcMbUpdate kernel Surface state 1500 //! 1501 //! \param [in] cmdBuffer 1502 //! Cmd Buffer 1503 //! \param [in] params 1504 //! Pointer to CODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS 1505 //! 1506 //! \return MOS_STATUS 1507 //! MOS_STATUS_SUCCESS if success, else fail reason 1508 //! SendAvcBrcMbUpdateSurfacesCodechalEncodeAvcEnc1509 virtual MOS_STATUS SendAvcBrcMbUpdateSurfaces( 1510 PMOS_COMMAND_BUFFER cmdBuffer, 1511 PCODECHAL_ENCODE_AVC_BRC_UPDATE_SURFACE_PARAMS params) 1512 { 1513 return MOS_STATUS_SUCCESS; 1514 } 1515 1516 //! 1517 //! \brief Set SFD kernel Surface state 1518 //! 1519 //! \param [in] cmdBuffer 1520 //! Cmd Buffer 1521 //! \param [in] params 1522 //! Pointer to CODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS 1523 //! 1524 //! \return MOS_STATUS 1525 //! MOS_STATUS_SUCCESS if success, else fail reason 1526 //! 1527 virtual MOS_STATUS SendAvcSFDSurfaces( 1528 PMOS_COMMAND_BUFFER cmdBuffer, 1529 PCODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS params); 1530 1531 //! 1532 //! \brief Set ROI kernel Surface state 1533 //! 1534 //! \return MOS_STATUS 1535 //! MOS_STATUS_SUCCESS if success, else fail reason 1536 //! SetupROISurfaceCodechalEncodeAvcEnc1537 virtual MOS_STATUS SetupROISurface() 1538 { 1539 return MOS_STATUS_SUCCESS; 1540 } 1541 1542 //! 1543 //! \brief Inserts the generic prologue command for a command buffer 1544 //! \param [in] cmdBuffer 1545 //! Command buffer 1546 //! \param [in] frameTracking 1547 //! Indicate if frame tracking requested 1548 //! \return MOS_STATUS 1549 //! MOS_STATUS_SUCCESS if success, else fail reason 1550 //! 1551 virtual MOS_STATUS SendPrologWithFrameTracking( 1552 PMOS_COMMAND_BUFFER cmdBuffer, 1553 bool frameTracking, 1554 MHW_MI_MMIOREGISTERS *mmioRegister = nullptr) override; 1555 1556 //! 1557 //! \brief Realize the scene change report 1558 //! \param [in] cmdBuffer 1559 //! Command buffer 1560 //! [in] params 1561 //! Pointer to the CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS 1562 //! \return MOS_STATUS 1563 //! MOS_STATUS_SUCCESS if success 1564 //! SceneChangeReportCodechalEncodeAvcEnc1565 virtual MOS_STATUS SceneChangeReport( 1566 PMOS_COMMAND_BUFFER cmdBuffer, 1567 PCODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS params) 1568 { 1569 return MOS_STATUS_SUCCESS; 1570 }; 1571 1572 //! \brief Dump encode kernel output 1573 //! 1574 //! \return MOS_STATUS 1575 //! MOS_STATUS_SUCCESS if success, else fail reason 1576 //! 1577 MOS_STATUS DumpEncodeKernelOutput(); 1578 1579 //! 1580 //! \brief Calculate skip value 1581 //! \param [in] encBlockBasedSkipEn 1582 //! Indicate if encode block Based skip enabled 1583 //! \param [in] transform8x8Flag 1584 //! Indicate if transform8*8 makes effect 1585 //! \param [in] skipVal 1586 //! input Skip value 1587 //! \return uint16_t 1588 //! return the updated Skip value 1589 //! 1590 uint16_t CalcSkipVal( 1591 bool encBlockBasedSkipEn, 1592 bool transform8x8Flag, 1593 uint16_t skipVal); 1594 1595 //! 1596 //! \brief Get Max MV value per 2 mbs based on LevelIdc 1597 //! \details VDBOX private function to get max MV value per 2 mbs 1598 //! \param [in] levelIdc 1599 //! AVC level 1600 //! \return uint32_t 1601 //! return the max mv value per 2 mbs 1602 //! 1603 uint32_t GetMaxMvsPer2Mb(uint8_t levelIdc); 1604 1605 //! 1606 //! \brief Get QP value 1607 //! \param [in] params 1608 //! AVC mbenc cubre params 1609 //! \param [in] list 1610 //! forword or backword reference 1611 //! \param [in] index 1612 //! reference frame index 1613 //! \return uint8_t 1614 //! return 0 1615 uint32_t GetRefPicFieldFlag( 1616 PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS params, 1617 uint32_t list, 1618 uint32_t index); 1619 1620 //! 1621 //! \brief Get QP value 1622 //! \param [in] params 1623 //! AVC mbenc cubre params 1624 //! \param [list] list 1625 //! forword or backword reference 1626 //! \param [in] index 1627 //! reference frame index 1628 //! \return uint8_t 1629 //! return 0 1630 uint8_t AVCGetQPValueFromRefList( 1631 PCODECHAL_ENCODE_AVC_MBENC_CURBE_PARAMS params, 1632 uint32_t list, 1633 uint32_t index); 1634 1635 //! 1636 //! \brief Send surfaces for the AVC BRC Block Copy kernel 1637 //! \param [in] hwInterface 1638 //! Hardware interface 1639 //! \param [in] cmdBuffer 1640 //! comand buffer 1641 //! \param [in] mbEncKernelState 1642 //! MB encoder kernel state 1643 //! \param [in] kernelState 1644 //! Kernel State 1645 //! \param [in] presAdvancedDsh 1646 //! pmos resource 1647 //! \return MOS_STATUS 1648 //! MOS_STATUS_SUCCESS if success, else fail reason 1649 //! 1650 MOS_STATUS SendBrcBlockCopySurfaces( 1651 CodechalHwInterface *hwInterface, 1652 PMOS_COMMAND_BUFFER cmdBuffer, 1653 PMHW_KERNEL_STATE mbEncKernelState, 1654 PMHW_KERNEL_STATE kernelState, 1655 PMOS_RESOURCE presAdvancedDsh); 1656 1657 #if USE_CODECHAL_DEBUG_TOOL 1658 protected: 1659 virtual MOS_STATUS DumpSeqParFile() override; 1660 virtual MOS_STATUS DumpFrameParFile() override; 1661 1662 virtual MOS_STATUS PopulateHmeParam( 1663 bool is16xMeEnabled, 1664 bool is32xMeEnabled, 1665 uint8_t meMethod, 1666 void *cmd) override; 1667 #endif 1668 }; 1669 #endif // __CODECHAL_ENCODE_AVC_H__ 1670