1 /* 2 * Copyright (c) 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_base.h 24 //! \brief Defines base class for AVC encoder. 25 //! 26 27 #ifndef __CODECHAL_ENCODE_AVC_BASE_H__ 28 #define __CODECHAL_ENCODE_AVC_BASE_H__ 29 30 #include "codechal_encoder_base.h" 31 #include "codechal_kernel_hme.h" 32 #if USE_CODECHAL_DEBUG_TOOL 33 #include "codechal_debug_encode_par.h" 34 #endif 35 36 #define CODECHAL_ENCODE_AVC_INVALID_ROUNDING 0xFF 37 #define CODECHAL_ENCODE_AVC_NUM_SYNC_TAGS 64 38 #define CODECHAL_ENCODE_AVC_INIT_DSH_SIZE MHW_PAGE_SIZE * 3 39 #define CODECHAL_ENCODE_AVC_MAX_SLICE_QP (CODEC_AVC_NUM_QP - 1) // 0 - 51 inclusive 40 #define CODECHAL_ENCODE_AVC_MIN_ICQ_QUALITYFACTOR 1 41 #define CODECHAL_ENCODE_AVC_MAX_ICQ_QUALITYFACTOR 51 42 #define CODECHAL_ENCODE_AVC_MAX_SLICES_SUPPORTED 256 43 #define CODECHAL_ENCODE_AVC_DEFAULT_AVBR_ACCURACY 30 44 #define CODECHAL_ENCODE_AVC_MIN_AVBR_CONVERGENCE 100 45 #define CODECHAL_ENCODE_AVC_DEFAULT_AVBR_CONVERGENCE 150 46 #define CODECHAL_ENCODE_AVC_REF_PIC_SELECT_ENTRIES (CODEC_AVC_MAX_NUM_REF_FRAME + 1) // one extra for current picture 47 // Invalid AVC PicID 48 #define CODECHAL_ENCODE_AVC_INVALID_PIC_ID CODEC_AVC_NUM_UNCOMPRESSED_SURFACE 49 50 #define CODECHAL_ENCODE_AVC_SFD_OUTPUT_BUFFER_SIZE_COMMON 128 51 52 #if USE_CODECHAL_DEBUG_TOOL 53 #define CODECHAL_DEBUG_ENCODE_AVC_NAL_START_CODE_SEI 0x00000106 54 #define CODECHAL_DEBUG_ENCODE_AVC_NAL_START_CODE_PPS 0x00000128 55 56 struct EncodeAvcPar 57 { 58 // DDI Params 59 uint8_t ProfileIDC; 60 uint8_t LevelIDC; 61 uint8_t CabacInitIDC; 62 uint8_t ChromaFormatIDC; 63 uint8_t PictureCodingType; 64 uint8_t MaxRefIdxL0; 65 uint8_t MaxRefIdxL1; 66 uint8_t MaxBRefIdxL0; 67 uint8_t BRCMethod; 68 uint8_t BRCType; 69 uint8_t DeblockingIDC; 70 uint8_t WeightedPred; 71 uint8_t WeightedBiPred; 72 char ChromaQpOffset; 73 char SecondChromaQpOffset; 74 char ISliceQP; 75 char PSliceQP; 76 char BSliceQP; 77 char DeblockingFilterAlpha; 78 char DeblockingFilterBeta; 79 bool EnableSEI; 80 bool DisableVUIHeader; 81 bool EnableWeightPredictionDetection; 82 bool EntropyCodingMode; 83 bool DirectInference; 84 bool Transform8x8Mode; 85 bool UseOrigAsRef; 86 bool BiSubMbPartMask; 87 uint16_t NumP; 88 uint16_t NumB; 89 uint16_t FrameRateM; 90 uint16_t FrameRateD; 91 uint16_t CRFQualityFactor; 92 uint32_t NumSlices; 93 uint32_t SliceHeight; 94 uint32_t NumSuperSlices; 95 uint32_t SuperSliceHeight[CODECHAL_ENCODE_AVC_MAX_SLICES_SUPPORTED]; 96 bool ConstrainedIntraPred; 97 uint8_t SliceMode; 98 int16_t hme0XOffset; 99 int16_t hme0YOffset; 100 int16_t hme1XOffset; 101 int16_t hme1YOffset; 102 103 // HME Params 104 uint8_t SuperCombineDist; 105 bool SuperHME; 106 bool UltraHME; 107 bool StreamInEnable; 108 uint8_t StreamInL0FromNewRef; 109 uint8_t StreamInL1FromNewRef; 110 111 // BRC init Params 112 bool MBBRCEnable; 113 bool MBRC; 114 uint16_t AvbrAccuracy; 115 uint16_t AvbrConvergence; 116 uint32_t BitRate; 117 uint32_t InitVbvFullnessInBit; 118 uint32_t MaxBitRate; 119 uint32_t VbvSzInBit; 120 uint32_t SlidingWindowEnable; 121 uint32_t SlidingWindowSize; 122 uint32_t SlidingWindowMaxRateRatio; 123 uint32_t LowDelayGoldenFrameBoost; 124 uint32_t TopQPDeltaThrforAdaptive2Pass; 125 uint32_t BotQPDeltaThrforAdaptive2Pass; 126 uint32_t TopFrmSzPctThrforAdaptive2Pass; 127 uint32_t BotFrmSzPctThrforAdaptive2Pass; 128 uint32_t MBHeaderCompensation; 129 uint32_t QPSelectMethodforFirstPass; 130 bool MBQpCtrl; 131 bool ICQReEncode; 132 bool AdaptiveCostAdjustEnable; 133 bool AdaptiveHMEExtension; 134 uint32_t QPMin; 135 uint32_t QPMax; 136 bool HrdConformanceCheckDisable; 137 uint8_t StreamInStaticRegion; 138 uint8_t ScenarioInfo; 139 bool SliceSizeWA; 140 uint32_t INumMbsLag; 141 uint32_t PNumMbsLag; 142 uint32_t LongTermInterval; 143 144 // BRC frame update Params 145 bool EnableMultipass; 146 uint8_t MaxNumPakPasses; 147 uint32_t UserMaxFrame; 148 uint32_t UserMaxFrameP; 149 bool FrameSkipEnable; 150 bool SceneChgDetectEn; 151 uint32_t SceneChgPrevIntraPctThresh; 152 uint32_t SceneChgCurIntraPctThresh; 153 uint32_t SceneChgWidth0; 154 uint32_t SceneChgWidth1; 155 bool Transform8x8PDisable; 156 uint32_t SliceSizeThr; 157 uint32_t SliceMaxSize; 158 159 // Enc Params 160 uint8_t SubPelMode; 161 uint8_t MaxLenSP; 162 uint8_t MEMethod; 163 uint8_t BMEMethod; 164 uint8_t HMECombineOverlap; 165 uint8_t SearchX; 166 uint8_t SearchY; 167 uint8_t BSearchX; 168 uint8_t BSearchY; 169 uint8_t SearchControl; 170 uint8_t BSearchControl; 171 uint8_t BiMixDisable; 172 uint32_t BiWeight; 173 bool DisableExtendedMvCostRange; 174 bool EnableAdaptiveSearch; 175 bool EnableFBRBypass; 176 bool BlockBasedSkip; 177 bool MADEnableFlag; 178 bool EnableMBFlatnessCheckOptimization; 179 bool EnableArbitrarySliceSize; 180 bool EnableWavefrontOptimization; 181 bool BSkipType; 182 bool EnableAdaptiveTxDecision; 183 bool EnablePerMBStaticCheck; 184 bool EnableAdaptiveSearchWindowSize; 185 bool EnableIntraCostScalingForStaticFrame; 186 uint32_t StaticFrameZMVPercent; 187 uint32_t StaticFrameIntraCostScalingRatioP; 188 uint32_t StaticFrameIntraCostScalingRatioB; 189 bool AdaptiveMvStreamIn; 190 uint32_t LargeMvThresh; 191 uint32_t LargeMvPctThreshold; 192 bool UniMixDisable; 193 bool DirectMode; 194 uint16_t RefThresh; 195 uint16_t MBTextureThreshold; 196 uint16_t TxDecisionThr; 197 uint32_t MRDisableQPCheck; 198 uint32_t AllFractional; 199 uint32_t DisableAllFractionalCheckForHighRes; 200 uint32_t HMECombineLen; 201 uint32_t HMEBCombineLen; 202 uint32_t FTQBasedSkip; 203 uint32_t MultiplePred; 204 uint32_t EnableAdaptiveIntraScaling; 205 uint32_t SurvivedSkipCost; 206 bool VDEncPerfMode; 207 bool VdencExtPakObjDisable; 208 bool PPMVDisable; 209 uint8_t LeftNbrPelMode; 210 uint8_t DisPSubPartMask; 211 uint8_t DisPSubMbMask; 212 uint8_t DisBSubPartMask; 213 uint8_t DisBSubMbMask; 214 uint8_t ImePredOverlapThr; 215 uint8_t MBSizeEstScalingRatioINTRA; 216 bool IntraMBHdrScaleFactor; 217 uint8_t MBSizeEstScalingRatioINTER; 218 bool InterMBHdrScaleFactor; 219 uint8_t PFrameMaxNumImePred; 220 uint8_t BFrameMaxNumImePred; 221 uint8_t HMERefWindowSize; 222 uint8_t IMELeftPredDep; 223 uint8_t NumFMECandCheck; 224 uint8_t PFrameImePredLargeSW; 225 uint8_t BFrameImePredLargeSW; 226 bool RdoChromaEnable; 227 uint16_t Intra4x4ModeMask; 228 uint16_t Intra8x8ModeMask; 229 bool RdoIntraChromaSearch; 230 uint8_t Intra16x16ModeMask; 231 uint8_t InitMBBudgetTr4x4; 232 bool ROIEnable; 233 uint8_t PFrameZeroCbfEn; 234 uint8_t BFrameZeroCbfEn; 235 uint8_t ForceIPCMMinQP; 236 uint8_t IntraTr4x4Percent; 237 bool MultiPassHmeEnable; 238 uint32_t IntraPredictionIFrame; 239 uint32_t IntraPrediction; 240 241 // PAK Params 242 uint8_t RoundingIntra; 243 bool RoundingIntraEnabled; 244 bool EnableAdaptiveRounding; 245 bool RoundingInterEnabled; 246 bool EnableAdaptiveTrellisQuantization; 247 bool TrellisQuantizationEnable; 248 bool TrellisQuantizationChromaDisable; 249 uint32_t RoundingInter; 250 uint32_t RoundingInterB; 251 uint32_t TrellisQuantizationRounding; 252 uint8_t FrmHdrEncodingFrequency; 253 bool ExtendedRhoDomainEn; 254 }; 255 #endif 256 257 static const uint8_t CodecHal_TargetUsageToMode_AVC[NUM_TARGET_USAGE_MODES] = 258 { encodeNormalMode, encodeQualityMode, encodeQualityMode, encodeNormalMode, 259 encodeNormalMode, encodeNormalMode, encodeNormalMode, encodePerformanceMode }; 260 261 typedef struct _CODEC_AVC_REF_PIC_SELECT_LIST 262 { 263 uint8_t FrameIdx; 264 MOS_SURFACE sBuffer; 265 } CODEC_AVC_REF_PIC_SELECT_LIST, *PCODEC_AVC_REF_PIC_SELECT_LIST; 266 267 typedef struct _CODECHAL_ENCODE_AVC_TQ_PARAMS 268 { 269 uint32_t dwTqEnabled; 270 uint32_t dwTqRounding; 271 } CODECHAL_ENCODE_AVC_TQ_PARAMS, *PCODECHAL_ENCODE_AVC_TQ_PARAMS; 272 273 typedef struct _CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS 274 { 275 PMOS_SURFACE psPreDeblockSurface; 276 PMOS_SURFACE psPostDeblockSurface; 277 PMOS_RESOURCE presMacroblockIldbStreamOutBuffer1; 278 PMOS_RESOURCE presMacroblockIldbStreamOutBuffer2; 279 280 bool bBrcEnabled; 281 PMHW_BATCH_BUFFER pImgStateBatchBuffer; 282 PMOS_RESOURCE presBrcHistoryBuffer; 283 284 bool bDeblockerStreamOutEnable; 285 bool bPostDeblockOutEnable; 286 bool bPreDeblockOutEnable; 287 bool bPerMBStreamOutEnable; 288 } CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS, *PCODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS; 289 290 typedef struct _CODECHAL_ENCODE_AVC_ME_CURBE 291 { 292 // DW0 293 union 294 { 295 struct 296 { 297 uint32_t SkipModeEn : MOS_BITFIELD_BIT( 0 ); 298 uint32_t AdaptiveEn : MOS_BITFIELD_BIT( 1 ); 299 uint32_t BiMixDis : MOS_BITFIELD_BIT( 2 ); 300 uint32_t : MOS_BITFIELD_RANGE( 3, 4 ); 301 uint32_t EarlyImeSuccessEn : MOS_BITFIELD_BIT( 5 ); 302 uint32_t : MOS_BITFIELD_BIT( 6 ); 303 uint32_t T8x8FlagForInterEn : MOS_BITFIELD_BIT( 7 ); 304 uint32_t : MOS_BITFIELD_RANGE( 8,23 ); 305 uint32_t EarlyImeStop : MOS_BITFIELD_RANGE( 24,31 ); 306 }; 307 struct 308 { 309 uint32_t Value; 310 }; 311 } DW0; 312 313 // DW1 314 union 315 { 316 struct 317 { 318 uint32_t MaxNumMVs : MOS_BITFIELD_RANGE( 0, 5 ); 319 uint32_t : MOS_BITFIELD_RANGE( 6,15 ); 320 uint32_t BiWeight : MOS_BITFIELD_RANGE( 16,21 ); 321 uint32_t : MOS_BITFIELD_RANGE( 22,27 ); 322 uint32_t UniMixDisable : MOS_BITFIELD_BIT( 28 ); 323 uint32_t : MOS_BITFIELD_RANGE( 29,31 ); 324 }; 325 struct 326 { 327 uint32_t Value; 328 }; 329 } DW1; 330 331 // DW2 332 union 333 { 334 struct 335 { 336 uint32_t MaxLenSP : MOS_BITFIELD_RANGE( 0, 7 ); 337 uint32_t MaxNumSU : MOS_BITFIELD_RANGE( 8,15 ); 338 uint32_t : MOS_BITFIELD_RANGE( 16,31 ); 339 }; 340 struct 341 { 342 uint32_t Value; 343 }; 344 } DW2; 345 346 // DW3 347 union 348 { 349 struct 350 { 351 uint32_t SrcSize : MOS_BITFIELD_RANGE( 0, 1 ); 352 uint32_t : MOS_BITFIELD_RANGE( 2, 3 ); 353 uint32_t MbTypeRemap : MOS_BITFIELD_RANGE( 4, 5 ); 354 uint32_t SrcAccess : MOS_BITFIELD_BIT( 6 ); 355 uint32_t RefAccess : MOS_BITFIELD_BIT( 7 ); 356 uint32_t SearchCtrl : MOS_BITFIELD_RANGE( 8,10 ); 357 uint32_t DualSearchPathOption : MOS_BITFIELD_BIT( 11 ); 358 uint32_t SubPelMode : MOS_BITFIELD_RANGE( 12,13 ); 359 uint32_t SkipType : MOS_BITFIELD_BIT( 14 ); 360 uint32_t DisableFieldCacheAlloc : MOS_BITFIELD_BIT( 15 ); 361 uint32_t InterChromaMode : MOS_BITFIELD_BIT( 16 ); 362 uint32_t FTEnable : MOS_BITFIELD_BIT( 17 ); 363 uint32_t BMEDisableFBR : MOS_BITFIELD_BIT( 18 ); 364 uint32_t BlockBasedSkipEnable : MOS_BITFIELD_BIT( 19 ); 365 uint32_t InterSAD : MOS_BITFIELD_RANGE( 20,21 ); 366 uint32_t IntraSAD : MOS_BITFIELD_RANGE( 22,23 ); 367 uint32_t SubMbPartMask : MOS_BITFIELD_RANGE( 24,30 ); 368 uint32_t : MOS_BITFIELD_BIT( 31 ); 369 }; 370 struct 371 { 372 uint32_t Value; 373 }; 374 } DW3; 375 376 // DW4 377 union 378 { 379 struct 380 { 381 uint32_t : MOS_BITFIELD_RANGE( 0, 7 ); 382 uint32_t PictureHeightMinus1 : MOS_BITFIELD_RANGE( 8,15 ); 383 uint32_t PictureWidth : MOS_BITFIELD_RANGE( 16,23 ); 384 uint32_t : MOS_BITFIELD_RANGE( 24,31 ); 385 }; 386 struct 387 { 388 uint32_t Value; 389 }; 390 } DW4; 391 392 // DW5 393 union 394 { 395 struct 396 { 397 uint32_t : MOS_BITFIELD_RANGE( 0, 7 ); 398 uint32_t QpPrimeY : MOS_BITFIELD_RANGE( 8,15 ); 399 uint32_t RefWidth : MOS_BITFIELD_RANGE( 16,23 ); 400 uint32_t RefHeight : MOS_BITFIELD_RANGE( 24,31 ); 401 }; 402 struct 403 { 404 uint32_t Value; 405 }; 406 } DW5; 407 408 // DW6 409 union 410 { 411 struct 412 { 413 uint32_t : MOS_BITFIELD_RANGE( 0, 2 ); 414 uint32_t WriteDistortions : MOS_BITFIELD_BIT( 3 ); 415 uint32_t UseMvFromPrevStep : MOS_BITFIELD_BIT( 4 ); 416 uint32_t : MOS_BITFIELD_RANGE( 5, 7 ); 417 uint32_t SuperCombineDist : MOS_BITFIELD_RANGE( 8,15 ); 418 uint32_t MaxVmvR : MOS_BITFIELD_RANGE( 16,31 ); 419 }; 420 struct 421 { 422 uint32_t Value; 423 }; 424 } DW6; 425 426 // DW7 427 union 428 { 429 struct 430 { 431 uint32_t : MOS_BITFIELD_RANGE( 0,15 ); 432 uint32_t MVCostScaleFactor : MOS_BITFIELD_RANGE( 16,17 ); 433 uint32_t BilinearEnable : MOS_BITFIELD_BIT( 18 ); 434 uint32_t SrcFieldPolarity : MOS_BITFIELD_BIT( 19 ); 435 uint32_t WeightedSADHAAR : MOS_BITFIELD_BIT( 20 ); 436 uint32_t AConlyHAAR : MOS_BITFIELD_BIT( 21 ); 437 uint32_t RefIDCostMode : MOS_BITFIELD_BIT( 22 ); 438 uint32_t : MOS_BITFIELD_BIT( 23 ); 439 uint32_t SkipCenterMask : MOS_BITFIELD_RANGE( 24,31 ); 440 }; 441 struct 442 { 443 uint32_t Value; 444 }; 445 } DW7; 446 447 // DW8 448 union 449 { 450 struct 451 { 452 uint32_t Mode0Cost : MOS_BITFIELD_RANGE( 0, 7 ); 453 uint32_t Mode1Cost : MOS_BITFIELD_RANGE( 8,15 ); 454 uint32_t Mode2Cost : MOS_BITFIELD_RANGE( 16,23 ); 455 uint32_t Mode3Cost : MOS_BITFIELD_RANGE( 24,31 ); 456 }; 457 struct 458 { 459 uint32_t Value; 460 }; 461 } DW8; 462 463 // DW9 464 union 465 { 466 struct 467 { 468 uint32_t Mode4Cost : MOS_BITFIELD_RANGE( 0, 7 ); 469 uint32_t Mode5Cost : MOS_BITFIELD_RANGE( 8,15 ); 470 uint32_t Mode6Cost : MOS_BITFIELD_RANGE( 16,23 ); 471 uint32_t Mode7Cost : MOS_BITFIELD_RANGE( 24,31 ); 472 }; 473 struct 474 { 475 uint32_t Value; 476 }; 477 } DW9; 478 479 // DW10 480 union 481 { 482 struct 483 { 484 uint32_t Mode8Cost : MOS_BITFIELD_RANGE( 0, 7 ); 485 uint32_t Mode9Cost : MOS_BITFIELD_RANGE( 8,15 ); 486 uint32_t RefIDCost : MOS_BITFIELD_RANGE( 16,23 ); 487 uint32_t ChromaIntraModeCost : MOS_BITFIELD_RANGE( 24,31 ); 488 }; 489 struct 490 { 491 uint32_t Value; 492 }; 493 } DW10; 494 495 // DW11 496 union 497 { 498 struct 499 { 500 uint32_t MV0Cost : MOS_BITFIELD_RANGE( 0, 7 ); 501 uint32_t MV1Cost : MOS_BITFIELD_RANGE( 8,15 ); 502 uint32_t MV2Cost : MOS_BITFIELD_RANGE( 16,23 ); 503 uint32_t MV3Cost : MOS_BITFIELD_RANGE( 24,31 ); 504 }; 505 struct 506 { 507 uint32_t Value; 508 }; 509 } DW11; 510 511 // DW12 512 union 513 { 514 struct 515 { 516 uint32_t MV4Cost : MOS_BITFIELD_RANGE( 0, 7 ); 517 uint32_t MV5Cost : MOS_BITFIELD_RANGE( 8,15 ); 518 uint32_t MV6Cost : MOS_BITFIELD_RANGE( 16,23 ); 519 uint32_t MV7Cost : MOS_BITFIELD_RANGE( 24,31 ); 520 }; 521 struct 522 { 523 uint32_t Value; 524 }; 525 } DW12; 526 527 // DW13 528 union 529 { 530 struct 531 { 532 uint32_t NumRefIdxL0MinusOne : MOS_BITFIELD_RANGE( 0, 7 ); 533 uint32_t NumRefIdxL1MinusOne : MOS_BITFIELD_RANGE( 8,15 ); 534 uint32_t RefStreaminCost : MOS_BITFIELD_RANGE( 16,23 ); 535 uint32_t ROIEnable : MOS_BITFIELD_RANGE( 24,26 ); 536 uint32_t : MOS_BITFIELD_RANGE( 27,31 ); 537 }; 538 struct 539 { 540 uint32_t Value; 541 }; 542 } DW13; 543 544 // DW14 545 union 546 { 547 struct 548 { 549 uint32_t List0RefID0FieldParity : MOS_BITFIELD_BIT( 0 ); 550 uint32_t List0RefID1FieldParity : MOS_BITFIELD_BIT( 1 ); 551 uint32_t List0RefID2FieldParity : MOS_BITFIELD_BIT( 2 ); 552 uint32_t List0RefID3FieldParity : MOS_BITFIELD_BIT( 3 ); 553 uint32_t List0RefID4FieldParity : MOS_BITFIELD_BIT( 4 ); 554 uint32_t List0RefID5FieldParity : MOS_BITFIELD_BIT( 5 ); 555 uint32_t List0RefID6FieldParity : MOS_BITFIELD_BIT( 6 ); 556 uint32_t List0RefID7FieldParity : MOS_BITFIELD_BIT( 7 ); 557 uint32_t List1RefID0FieldParity : MOS_BITFIELD_BIT( 8 ); 558 uint32_t List1RefID1FieldParity : MOS_BITFIELD_BIT( 9 ); 559 uint32_t : MOS_BITFIELD_RANGE( 10,31 ); 560 }; 561 struct 562 { 563 uint32_t Value; 564 }; 565 } DW14; 566 567 // DW15 568 union 569 { 570 struct 571 { 572 uint32_t PrevMvReadPosFactor : MOS_BITFIELD_RANGE( 0, 7 ); 573 uint32_t MvShiftFactor : MOS_BITFIELD_RANGE( 8,15 ); 574 uint32_t Reserved : MOS_BITFIELD_RANGE( 16,31 ); 575 }; 576 struct 577 { 578 uint32_t Value; 579 }; 580 } DW15; 581 582 struct 583 { 584 // DW16 585 union 586 { 587 struct 588 { 589 SearchPathDelta SPDelta_0; 590 SearchPathDelta SPDelta_1; 591 SearchPathDelta SPDelta_2; 592 SearchPathDelta SPDelta_3; 593 }; 594 struct 595 { 596 uint32_t Value; 597 }; 598 } DW16; 599 600 // DW17 601 union 602 { 603 struct 604 { 605 SearchPathDelta SPDelta_4; 606 SearchPathDelta SPDelta_5; 607 SearchPathDelta SPDelta_6; 608 SearchPathDelta SPDelta_7; 609 }; 610 struct 611 { 612 uint32_t Value; 613 }; 614 } DW17; 615 616 // DW18 617 union 618 { 619 struct 620 { 621 SearchPathDelta SPDelta_8; 622 SearchPathDelta SPDelta_9; 623 SearchPathDelta SPDelta_10; 624 SearchPathDelta SPDelta_11; 625 }; 626 struct 627 { 628 uint32_t Value; 629 }; 630 } DW18; 631 632 // DW19 633 union 634 { 635 struct 636 { 637 SearchPathDelta SPDelta_12; 638 SearchPathDelta SPDelta_13; 639 SearchPathDelta SPDelta_14; 640 SearchPathDelta SPDelta_15; 641 }; 642 struct 643 { 644 uint32_t Value; 645 }; 646 } DW19; 647 648 // DW20 649 union 650 { 651 struct 652 { 653 SearchPathDelta SPDelta_16; 654 SearchPathDelta SPDelta_17; 655 SearchPathDelta SPDelta_18; 656 SearchPathDelta SPDelta_19; 657 }; 658 struct 659 { 660 uint32_t Value; 661 }; 662 } DW20; 663 664 // DW21 665 union 666 { 667 struct 668 { 669 SearchPathDelta SPDelta_20; 670 SearchPathDelta SPDelta_21; 671 SearchPathDelta SPDelta_22; 672 SearchPathDelta SPDelta_23; 673 }; 674 struct 675 { 676 uint32_t Value; 677 }; 678 } DW21; 679 680 // DW22 681 union 682 { 683 struct 684 { 685 SearchPathDelta SPDelta_24; 686 SearchPathDelta SPDelta_25; 687 SearchPathDelta SPDelta_26; 688 SearchPathDelta SPDelta_27; 689 }; 690 struct 691 { 692 uint32_t Value; 693 }; 694 } DW22; 695 696 // DW23 697 union 698 { 699 struct 700 { 701 SearchPathDelta SPDelta_28; 702 SearchPathDelta SPDelta_29; 703 SearchPathDelta SPDelta_30; 704 SearchPathDelta SPDelta_31; 705 }; 706 struct 707 { 708 uint32_t Value; 709 }; 710 } DW23; 711 712 // DW24 713 union 714 { 715 struct 716 { 717 SearchPathDelta SPDelta_32; 718 SearchPathDelta SPDelta_33; 719 SearchPathDelta SPDelta_34; 720 SearchPathDelta SPDelta_35; 721 }; 722 struct 723 { 724 uint32_t Value; 725 }; 726 } DW24; 727 728 // DW25 729 union 730 { 731 struct 732 { 733 SearchPathDelta SPDelta_36; 734 SearchPathDelta SPDelta_37; 735 SearchPathDelta SPDelta_38; 736 SearchPathDelta SPDelta_39; 737 }; 738 struct 739 { 740 uint32_t Value; 741 }; 742 } DW25; 743 744 // DW26 745 union 746 { 747 struct 748 { 749 SearchPathDelta SPDelta_40; 750 SearchPathDelta SPDelta_41; 751 SearchPathDelta SPDelta_42; 752 SearchPathDelta SPDelta_43; 753 }; 754 struct 755 { 756 uint32_t Value; 757 }; 758 } DW26; 759 760 // DW27 761 union 762 { 763 struct 764 { 765 SearchPathDelta SPDelta_44; 766 SearchPathDelta SPDelta_45; 767 SearchPathDelta SPDelta_46; 768 SearchPathDelta SPDelta_47; 769 }; 770 struct 771 { 772 uint32_t Value; 773 }; 774 } DW27; 775 776 // DW28 777 union 778 { 779 struct 780 { 781 SearchPathDelta SPDelta_48; 782 SearchPathDelta SPDelta_49; 783 SearchPathDelta SPDelta_50; 784 SearchPathDelta SPDelta_51; 785 }; 786 struct 787 { 788 uint32_t Value; 789 }; 790 } DW28; 791 792 // DW29 793 union 794 { 795 struct 796 { 797 SearchPathDelta SPDelta_52; 798 SearchPathDelta SPDelta_53; 799 SearchPathDelta SPDelta_54; 800 SearchPathDelta SPDelta_55; 801 }; 802 struct 803 { 804 uint32_t Value; 805 }; 806 } DW29; 807 } SPDelta; 808 809 // DW30 810 union 811 { 812 struct 813 { 814 uint32_t ActualMBWidth : MOS_BITFIELD_RANGE( 0,15 ); 815 uint32_t ActualMBHeight : MOS_BITFIELD_RANGE( 16,31 ); 816 }; 817 struct 818 { 819 uint32_t Value; 820 }; 821 } DW30; 822 823 // DW31 824 union 825 { 826 struct 827 { 828 uint32_t Reserved : MOS_BITFIELD_RANGE( 0,31 ); 829 }; 830 struct 831 { 832 uint32_t Value; 833 }; 834 } DW31; 835 836 // DW32 837 union 838 { 839 struct 840 { 841 uint32_t _4xMeMvOutputDataSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); 842 }; 843 struct 844 { 845 uint32_t Value; 846 }; 847 } DW32; 848 849 // DW33 850 union 851 { 852 struct 853 { 854 uint32_t _16xOr32xMeMvInputDataSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); 855 }; 856 struct 857 { 858 uint32_t Value; 859 }; 860 } DW33; 861 862 // DW34 863 union 864 { 865 struct 866 { 867 uint32_t _4xMeOutputDistSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); 868 }; 869 struct 870 { 871 uint32_t Value; 872 }; 873 } DW34; 874 875 // DW35 876 union 877 { 878 struct 879 { 880 uint32_t _4xMeOutputBrcDistSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); 881 }; 882 struct 883 { 884 uint32_t Value; 885 }; 886 } DW35; 887 888 // DW36 889 union 890 { 891 struct 892 { 893 uint32_t VMEFwdInterPredictionSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); 894 }; 895 struct 896 { 897 uint32_t Value; 898 }; 899 } DW36; 900 901 // DW37 902 union 903 { 904 struct 905 { 906 uint32_t VMEBwdInterPredictionSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); 907 }; 908 struct 909 { 910 uint32_t Value; 911 }; 912 } DW37; 913 914 // DW38 915 union 916 { 917 struct 918 { 919 uint32_t VDEncStreamInSurfIndex : MOS_BITFIELD_RANGE( 0,31 ); 920 }; 921 struct 922 { 923 uint32_t Value; 924 }; 925 } DW38; 926 927 } CODECHAL_ENCODE_AVC_ME_CURBE, *PCODECHAL_ENCODE_AVC_ME_CURBE; 928 C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CODECHAL_ENCODE_AVC_ME_CURBE)) == 39); 929 930 // AVC ME CURBE init data for G9 CM Kernel 931 static const uint32_t g_cInit_CODECHAL_ENCODE_AVC_ME_CURBE[39] = 932 { 933 0x00000000, 0x00200010, 0x00003939, 0x77a43000, 0x00000000, 0x28300000, 0x00000000, 0x00000000, 934 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 935 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 936 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 937 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff 938 }; 939 940 // CURBE for Static Frame Detection kernel 941 typedef struct _CODECHAL_ENCODE_AVC_SFD_CURBE_COMMON 942 { 943 union 944 { 945 struct 946 { 947 uint32_t VDEncModeDisable : MOS_BITFIELD_BIT( 0 ); 948 uint32_t BRCModeEnable : MOS_BITFIELD_BIT( 1 ); 949 uint32_t SliceType : MOS_BITFIELD_RANGE( 2, 3 ); 950 uint32_t : MOS_BITFIELD_BIT( 4 ); 951 uint32_t StreamInType : MOS_BITFIELD_RANGE( 5, 8 ); 952 uint32_t EnableAdaptiveMvStreamIn : MOS_BITFIELD_BIT( 9 ); 953 uint32_t : MOS_BITFIELD_BIT( 10 ); 954 uint32_t EnableIntraCostScalingForStaticFrame : MOS_BITFIELD_BIT( 11 ); 955 uint32_t Reserved : MOS_BITFIELD_RANGE( 12, 31 ); 956 }; 957 struct 958 { 959 uint32_t Value; 960 }; 961 } DW0; 962 963 union 964 { 965 struct 966 { 967 uint32_t QPValue : MOS_BITFIELD_RANGE( 0, 7 ); 968 uint32_t NumOfRefs : MOS_BITFIELD_RANGE( 8, 15 ); 969 uint32_t HMEStreamInRefCost : MOS_BITFIELD_RANGE( 16, 23 ); 970 uint32_t Reserved : MOS_BITFIELD_RANGE( 24, 31 ); 971 }; 972 struct 973 { 974 uint32_t Value; 975 }; 976 } DW1; 977 978 union 979 { 980 struct 981 { 982 uint32_t FrameWidthInMBs : MOS_BITFIELD_RANGE( 0, 15 ); // round-up to 4-MB aligned 983 uint32_t FrameHeightInMBs : MOS_BITFIELD_RANGE( 16, 31 ); // round-up to 4-MB aligned 984 }; 985 struct 986 { 987 uint32_t Value; 988 }; 989 } DW2; 990 991 union 992 { 993 struct 994 { 995 uint32_t LargeMvThresh : MOS_BITFIELD_RANGE( 0, 31 ); 996 }; 997 struct 998 { 999 uint32_t Value; 1000 }; 1001 } DW3; 1002 1003 union 1004 { 1005 struct 1006 { 1007 uint32_t TotalLargeMvThreshold : MOS_BITFIELD_RANGE( 0, 31 ); 1008 }; 1009 struct 1010 { 1011 uint32_t Value; 1012 }; 1013 } DW4; 1014 1015 union 1016 { 1017 struct 1018 { 1019 uint32_t ZMVThreshold : MOS_BITFIELD_RANGE( 0, 31 ); 1020 }; 1021 struct 1022 { 1023 uint32_t Value; 1024 }; 1025 } DW5; 1026 1027 union 1028 { 1029 struct 1030 { 1031 uint32_t TotalZMVThreshold : MOS_BITFIELD_RANGE( 0, 31 ); 1032 }; 1033 struct 1034 { 1035 uint32_t Value; 1036 }; 1037 } DW6; 1038 1039 union 1040 { 1041 struct 1042 { 1043 uint32_t MinDistThreshold : MOS_BITFIELD_RANGE( 0, 31 ); 1044 }; 1045 struct 1046 { 1047 uint32_t Value; 1048 }; 1049 } DW7; 1050 1051 uint8_t CostTable[52]; 1052 1053 union 1054 { 1055 struct 1056 { 1057 uint32_t ActualWidthInMB : MOS_BITFIELD_RANGE( 0, 15 ); 1058 uint32_t ActualHeightInMB : MOS_BITFIELD_RANGE( 16, 31 ); 1059 }; 1060 struct 1061 { 1062 uint32_t Value; 1063 }; 1064 } DW21; 1065 1066 union 1067 { 1068 struct 1069 { 1070 uint32_t Reserved : MOS_BITFIELD_RANGE( 0,31 ); 1071 }; 1072 struct 1073 { 1074 uint32_t Value; 1075 }; 1076 } DW22; 1077 1078 union 1079 { 1080 struct 1081 { 1082 uint32_t Reserved : MOS_BITFIELD_RANGE( 0,31 ); 1083 }; 1084 struct 1085 { 1086 uint32_t Value; 1087 }; 1088 } DW23; 1089 1090 union 1091 { 1092 struct 1093 { 1094 uint32_t VDEncInputImagStateIndex : MOS_BITFIELD_RANGE( 0, 31 ); // used in VDEnc CQP mode 1095 }; 1096 struct 1097 { 1098 uint32_t Value; 1099 }; 1100 } DW24; 1101 1102 union 1103 { 1104 struct 1105 { 1106 uint32_t Reserved : MOS_BITFIELD_RANGE( 0,31 ); 1107 }; 1108 struct 1109 { 1110 uint32_t Value; 1111 }; 1112 } DW25; 1113 1114 union 1115 { 1116 struct 1117 { 1118 uint32_t MVDataSurfaceIndex : MOS_BITFIELD_RANGE( 0, 31 ); // contains HME MV Data generated by HME kernel 1119 }; 1120 struct 1121 { 1122 uint32_t Value; 1123 }; 1124 } DW26; 1125 1126 union 1127 { 1128 struct 1129 { 1130 uint32_t InterDistortionSurfaceIndex : MOS_BITFIELD_RANGE( 0, 31 ); // contains HME Inter Distortion generated by HME kernel 1131 }; 1132 struct 1133 { 1134 uint32_t Value; 1135 }; 1136 } DW27; 1137 1138 union 1139 { 1140 struct 1141 { 1142 uint32_t OutputDataSurfaceIndex : MOS_BITFIELD_RANGE( 0, 31 ); 1143 }; 1144 struct 1145 { 1146 uint32_t Value; 1147 }; 1148 } DW28; 1149 1150 union 1151 { 1152 struct 1153 { 1154 uint32_t VDEncOutputImagStateIndex : MOS_BITFIELD_RANGE( 0, 31 ); 1155 }; 1156 struct 1157 { 1158 uint32_t Value; 1159 }; 1160 } DW29; 1161 1162 } CODECHAL_ENCODE_AVC_SFD_CURBE_COMMON, *PCODECHAL_ENCODE_AVC_SFD_CURBE_COMMON; 1163 C_ASSERT(MOS_BYTES_TO_DWORDS(sizeof(CODECHAL_ENCODE_AVC_SFD_CURBE_COMMON)) == 30); 1164 1165 typedef struct _CODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS 1166 { 1167 uint32_t dwDownscaledWidthInMb4x; 1168 uint32_t dwDownscaledHeightInMb4x; 1169 uint32_t dwMeMvBottomFieldOffset; 1170 uint32_t dwMeDistortionBottomFieldOffset; 1171 PMOS_RESOURCE presVDEncImageStateInputBuffer; 1172 PMOS_SURFACE psMeMvDataSurface; 1173 PMOS_SURFACE psMeDistortionSurface; 1174 PMOS_RESOURCE presOutputBuffer; 1175 PMOS_RESOURCE presVDEncImageStateOutputBuffer; 1176 PMHW_KERNEL_STATE pKernelState; 1177 bool bVdencActive; 1178 bool bVdencBrcEnabled; 1179 } CODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS, *PCODECHAL_ENCODE_AVC_SFD_SURFACE_PARAMS; 1180 1181 typedef struct _CODECHAL_ENCODE_AVC_PACK_PIC_HEADER_PARAMS 1182 { 1183 PBSBuffer pBsBuffer; 1184 PCODEC_AVC_ENCODE_PIC_PARAMS pPicParams; // pAvcPicParams[ucPPSIdx] 1185 PCODEC_AVC_ENCODE_SEQUENCE_PARAMS pSeqParams; // pAvcSeqParams[ucSPSIdx] 1186 PCODECHAL_ENCODE_AVC_VUI_PARAMS pAvcVuiParams; 1187 PCODEC_AVC_IQ_MATRIX_PARAMS pAvcIQMatrixParams; 1188 PCODECHAL_NAL_UNIT_PARAMS *ppNALUnitParams; 1189 CodechalEncodeSeiData* pSeiData; 1190 uint32_t dwFrameHeight; 1191 uint32_t dwOriFrameHeight; 1192 uint16_t wPictureCodingType; 1193 bool bNewSeq; 1194 bool *pbNewPPSHeader; 1195 bool *pbNewSeqHeader; 1196 } CODECHAL_ENCODE_AVC_PACK_PIC_HEADER_PARAMS, *PCODECHAL_ENCODE_AVC_PACK_PIC_HEADER_PARAMS; 1197 1198 typedef struct _CODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS 1199 { 1200 PBSBuffer pBsBuffer; 1201 PCODEC_AVC_ENCODE_PIC_PARAMS pPicParams; // pAvcPicParams[ucPPSIdx] 1202 PCODEC_AVC_ENCODE_SEQUENCE_PARAMS pSeqParams; // pAvcSeqParams[ucSPSIdx] 1203 PCODEC_AVC_ENCODE_SLICE_PARAMS pAvcSliceParams; 1204 PCODEC_REF_LIST *ppRefList; 1205 CODEC_PICTURE CurrPic; 1206 CODEC_PICTURE CurrReconPic; 1207 CODEC_AVC_ENCODE_USER_FLAGS UserFlags; 1208 CODECHAL_ENCODE_AVC_NAL_UNIT_TYPE NalUnitType; 1209 uint16_t wPictureCodingType; 1210 bool bVdencEnabled; 1211 } CODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS, *PCODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS; 1212 1213 typedef struct _CODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS 1214 { 1215 PCODEC_AVC_ENCODE_SEQUENCE_PARAMS pSeqParams; // pAvcSeqParams[ucSPSIdx] 1216 PCODEC_AVC_ENCODE_PIC_PARAMS pPicParams; 1217 PCODEC_AVC_ENCODE_SLICE_PARAMS pAvcSliceParams; 1218 uint16_t wPictureCodingType; 1219 uint16_t wPicHeightInMB; 1220 uint16_t wFrameFieldHeightInMB; 1221 bool bFirstFieldIPic; 1222 bool bVDEncEnabled; 1223 bool bPAKonly; 1224 } CODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS, *PCODECHAL_ENCODE_AVC_VALIDATE_NUM_REFS_PARAMS; 1225 1226 typedef struct _CODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS 1227 { 1228 uint16_t wPictureCodingType; 1229 uint8_t ucTargetUsage; 1230 uint8_t ucQP; 1231 bool bBrcEnabled; 1232 bool bVdEncEnabled; 1233 } CODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS, *PCODECHAL_ENCODE_AVC_TQ_INPUT_PARAMS; 1234 1235 typedef struct _CODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS 1236 { 1237 PMHW_KERNEL_STATE pKernelState; 1238 } CODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS, *PCODECHAL_ENCODE_AVC_SFD_CURBE_PARAMS; 1239 1240 //! 1241 //! \brief Vertical MV component range based on levelIdc 1242 //! \details VDBOX private function to get vertical MV componet range 1243 //! \param [in] levelIdc 1244 //! AVC level 1245 //! \return uint32_t 1246 //! return the max vertical mv component base on input level 1247 //! 1248 uint32_t CodecHalAvcEncode_GetMaxVmvR(uint8_t levelIdc); 1249 1250 //! 1251 //! \brief Get MV component range based on levelIdc 1252 //! \details VDBOX private function to get MV componet range 1253 //! \param [in] levelIdc 1254 //! AVC level 1255 //! \return uint32_t 1256 //! return the max mv component base on input level 1257 //! 1258 uint32_t CodecHalAvcEncode_GetMaxMvLen(uint8_t levelIdc); 1259 1260 //! 1261 //! \brief Get the filed parity: Top filed or Bottom filed 1262 //! \details Client facing function to get the filed parity: Top filed or Bottom filed 1263 //! \param [in] params 1264 //! PCODEC_AVC_ENCODE_SLICE_PARAMS pSlcParams 1265 //! \param [list] list 1266 //! forword or backword reference 1267 //! \param [in] index 1268 //! reference frame index 1269 //! \return uint32_t 1270 //! Bottom field or Top field 1271 //! 1272 bool CodecHalAvcEncode_GetFieldParity( 1273 PCODEC_AVC_ENCODE_SLICE_PARAMS params, 1274 uint32_t list, 1275 uint32_t index); 1276 1277 //! 1278 //! \brief Get profile level max frame size 1279 //! \param [in] seqParams 1280 //! Encoder Sequence params 1281 //! \param [in] encoder 1282 //! Encoder structure 1283 //! \param [in] profileLevelMaxFrame 1284 //! Profile Level Max Frame 1285 //! \return MOS_STATUS 1286 //! MOS_STATUS_SUCCESS if success, else fail reason 1287 //! 1288 MOS_STATUS CodecHalAvcEncode_GetProfileLevelMaxFrameSize( 1289 PCODEC_AVC_ENCODE_SEQUENCE_PARAMS seqParams, 1290 CodechalEncoderState* encoder, 1291 uint32_t* profileLevelMaxFrame); 1292 1293 //! \brief Get the max number of allowed slice 1294 //! \param [in] profileIdc 1295 //! AVC profile idc 1296 //! \param [in] levelIdc 1297 //! AVC level idc 1298 //! \param [in] framesPer100Sec 1299 //! frame Per 100Sec 1300 //! \return uint16_t 1301 //! return uiMaxAllowedNumSlices 1302 //! 1303 uint16_t CodecHalAvcEncode_GetMaxNumSlicesAllowed( 1304 CODEC_AVC_PROFILE_IDC profileIdc, 1305 CODEC_AVC_LEVEL_IDC levelIdc, 1306 uint32_t framesPer100Sec); 1307 1308 //! 1309 //! \brief Use to pack picture header related params 1310 //! \param [in] params 1311 //! picture header pack params 1312 //! \return MOS_STATUS 1313 //! MOS_STATUS_SUCCESS if success, else fail reason 1314 //! 1315 MOS_STATUS CodecHalAvcEncode_PackPictureHeader( 1316 PCODECHAL_ENCODE_AVC_PACK_PIC_HEADER_PARAMS params); 1317 1318 //! 1319 //! \brief Use to pack slice header related params 1320 //! \param [in] params 1321 //! slice header pack params 1322 //! \return MOS_STATUS 1323 //! MOS_STATUS_SUCCESS if success, else fail reason 1324 //! 1325 MOS_STATUS CodecHalAvcEncode_PackSliceHeader( 1326 PCODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS params); 1327 1328 //! 1329 //! \brief Use to get picture num of slice header to be packed 1330 //! \param [in] params 1331 //! pack slice header pack params 1332 //! \param [in] list 1333 //! forword or backword reference 1334 //! \return void 1335 //! 1336 static void CodecHal_PackSliceHeader_GetPicNum ( 1337 PCODECHAL_ENCODE_AVC_PACK_SLC_HEADER_PARAMS params, 1338 uint8_t list); 1339 1340 //! 1341 //! \class CodechalEncodeAvcBase 1342 //! \brief CodechalE encode Avc base 1343 //! 1344 class CodechalEncodeAvcBase : public CodechalEncoderState 1345 { 1346 public: 1347 // AvcState functions. 1348 //! 1349 //! \brief Constructor 1350 //! 1351 CodechalEncodeAvcBase( 1352 CodechalHwInterface * hwInterface, 1353 CodechalDebugInterface *debugInterface, 1354 PCODECHAL_STANDARD_INFO standardInfo); 1355 1356 //! 1357 //! \brief Copy constructor 1358 //! 1359 CodechalEncodeAvcBase(const CodechalEncodeAvcBase&) = delete; 1360 1361 //! 1362 //! \brief Copy assignment operator 1363 //! 1364 CodechalEncodeAvcBase& operator=(const CodechalEncodeAvcBase&) = delete; 1365 1366 //! 1367 //! \brief Destructor 1368 //! 1369 virtual ~CodechalEncodeAvcBase(); 1370 1371 //Encode interface definitions 1372 //! 1373 //! \brief Initialize standard related members. 1374 //! \details Initialize members, set proper value 1375 //! to involved variables, allocate resources. 1376 //! \param [in] settings 1377 //! Encode settings. 1378 //! 1379 //! \return MOS_STATUS 1380 //! MOS_STATUS_SUCCESS if success 1381 //! 1382 virtual MOS_STATUS Initialize(CodechalSetting * settings); 1383 GetStatusReport(EncodeStatus * encodeStatus,EncodeStatusReport * encodeStatusReport)1384 virtual MOS_STATUS GetStatusReport( 1385 EncodeStatus* encodeStatus, 1386 EncodeStatusReport* encodeStatusReport) 1387 { 1388 return MOS_STATUS_SUCCESS; 1389 } 1390 1391 //! 1392 //! \brief Encode User Feature Key Report. 1393 //! \details Report user feature values set by encode. 1394 //! 1395 //! \return MOS_STATUS 1396 //! MOS_STATUS_SUCCESS if success 1397 //! 1398 virtual MOS_STATUS UserFeatureKeyReport(); 1399 1400 //! 1401 //! \brief Initialize Encode ME kernel state 1402 //! 1403 //! \return MOS_STATUS 1404 //! MOS_STATUS_SUCCESS if success 1405 //! 1406 virtual MOS_STATUS InitKernelStateMe() = 0; 1407 1408 //! 1409 //! \brief Set Encode ME kernel Curbe data. 1410 //! 1411 //! \param [in] params 1412 //! Pointer to the MeCurbeParams 1413 //! 1414 //! \return MOS_STATUS 1415 //! MOS_STATUS_SUCCESS if success 1416 //! 1417 virtual MOS_STATUS SetCurbeMe( MeCurbeParams* params ) = 0; 1418 1419 //! 1420 //! \brief Set Encode ME kernel Surfaces 1421 //! 1422 //! \param [in] cmdBuffer 1423 //! Pointer to the MOS_COMMAND_BUFFER 1424 //! \param [in] params 1425 //! Pointer to the CODECHAL_ME_SURFACE_PARAMS 1426 //! 1427 //! \return MOS_STATUS 1428 //! MOS_STATUS_SUCCESS if success 1429 //! 1430 virtual MOS_STATUS SendMeSurfaces( 1431 PMOS_COMMAND_BUFFER cmdBuffer, 1432 MeSurfaceParams* params) = 0; 1433 //! 1434 //! \brief AVC State Initialization. 1435 //! 1436 //! \return MOS_STATUS 1437 //! MOS_STATUS_SUCCESS if success 1438 //! 1439 virtual MOS_STATUS Initialize(); 1440 1441 1442 //! 1443 //! \brief AVC Resource Allocation for ENC. 1444 //! 1445 //! \return MOS_STATUS 1446 //! MOS_STATUS_SUCCESS if success 1447 //! 1448 virtual MOS_STATUS AllocateEncResources(); 1449 1450 //! 1451 //! \brief AVC Resource Allocation for Encoder. 1452 //! 1453 //! \return MOS_STATUS 1454 //! MOS_STATUS_SUCCESS if success 1455 //! 1456 virtual MOS_STATUS AllocateResources(); 1457 1458 //! 1459 //! \brief Set AVC Sequence Structs. 1460 //! 1461 //! \return MOS_STATUS 1462 //! MOS_STATUS_SUCCESS if success 1463 //! 1464 virtual MOS_STATUS SetSequenceStructs(); 1465 1466 //! 1467 //! \brief Set AVC Picture Structs. 1468 //! 1469 //! \return MOS_STATUS 1470 //! MOS_STATUS_SUCCESS if success 1471 //! 1472 virtual MOS_STATUS SetPictureStructs(); 1473 1474 //! 1475 //! \brief Set AVC Slice Structs. 1476 //! 1477 //! \return MOS_STATUS 1478 //! MOS_STATUS_SUCCESS if success 1479 //! 1480 virtual MOS_STATUS SetSliceStructs(); 1481 1482 //! 1483 //! \brief Run Encode ME kernel 1484 //! 1485 //! \param [in] brcBuffers 1486 //! Pointer to the EncodeBrcBuffers 1487 //! \param [in] hmeLevel 1488 //! Hme level 1489 //! 1490 //! \return MOS_STATUS 1491 //! MOS_STATUS_SUCCESS if success 1492 //! 1493 virtual MOS_STATUS EncodeMeKernel( 1494 EncodeBrcBuffers* brcBuffers, 1495 HmeLevel hmeLevel); 1496 1497 //! 1498 //! \brief Allocate Batch Buffer For PakSlice. 1499 //! 1500 //! \param [in] numSlices 1501 //! Number of Slice 1502 //! \param [in] numPakPasses 1503 //! Number of PAK pass. 1504 //! \param [in] currRecycledBufIdx 1505 //! Current Recycle Buffer Index. 1506 //! 1507 //! \return MOS_STATUS 1508 //! MOS_STATUS_SUCCESS if success 1509 //! 1510 virtual MOS_STATUS AllocateBatchBufferForPakSlices( 1511 uint32_t numSlices, 1512 uint8_t numPakPasses, 1513 uint8_t currRecycledBufIdx); 1514 1515 //! 1516 //! \brief Release Batch Buffer For PakSlice. 1517 //! 1518 //! \param [in] currRecycledBufIdx 1519 //! Current Recycle Buffer Index. 1520 //! 1521 //! \return MOS_STATUS 1522 //! MOS_STATUS_SUCCESS if success 1523 //! 1524 virtual MOS_STATUS ReleaseBatchBufferForPakSlices( uint8_t currRecycledBufIdx); 1525 1526 //! 1527 //! \brief Initialize kernel binary size info. 1528 //! 1529 //! \return MOS_STATUS 1530 //! MOS_STATUS_SUCCESS if success 1531 //! 1532 MOS_STATUS AddIshSize(uint32_t kuid, uint8_t* kernelBase); 1533 1534 //! 1535 //! \brief Calculate scaling list 1536 //! 1537 //! \return void 1538 //! 1539 void ScalingListFlat(); 1540 1541 //! 1542 //! \brief Calculate scaling list 1543 //! 1544 //! \return void 1545 //! 1546 void ScalingListFallbackRuleA(); 1547 1548 //! 1549 //! \brief Get Dist Scale factor 1550 //! 1551 //! \return void 1552 //! 1553 void GetDistScaleFactor(); 1554 1555 //! 1556 //! \brief Initialize MMC state 1557 //! 1558 //! \return MOS_STATUS 1559 //! MOS_STATUS_SUCCESS if success 1560 //! 1561 virtual MOS_STATUS InitMmcState(); 1562 1563 //! 1564 //! \brief Get bidirectional weight 1565 //! 1566 //! \param [in] distScaleFactorRefID0List0 1567 //! DistScaleFactorRefID0List0 1568 //! \param [in] weightedBiPredIdc 1569 //! Same as AVC syntax element. 1570 //! 1571 //! \return int32_t 1572 //! Bidirectional weight 1573 //! 1574 int32_t GetBiWeight( 1575 uint32_t distScaleFactorRefID0List0, 1576 uint16_t weightedBiPredIdc); 1577 1578 //! 1579 //! \brief Update the slice count according to the slice shutdown policy 1580 //! 1581 virtual void UpdateSSDSliceCount(); 1582 1583 //! 1584 //! \brief Build slices with header insertion 1585 //! \param [in] cmdBuffer 1586 //! command buffer 1587 //! \param [in] params 1588 //! VDBOX AVC slice state params 1589 //! \return MOS_STATUS 1590 //! MOS_STATUS_SUCCESS if success, else fail reason 1591 //! 1592 MOS_STATUS SendSlice( 1593 PMOS_COMMAND_BUFFER cmdBuffer, 1594 PMHW_VDBOX_AVC_SLICE_STATE params); 1595 1596 //! 1597 //! \brief Store number passes 1598 //! 1599 //! \param [in] encodeStatusBuf 1600 //! Encode status buffer 1601 //! \param [in] miInterface 1602 //! Mi interface 1603 //! \param [in] cmdBuffer 1604 //! Command buffer 1605 //! \param [in] currPass 1606 //! Curr pass 1607 //! 1608 //! \return MOS_STATUS 1609 //! MOS_STATUS_SUCCESS if success, else fail reason 1610 //! 1611 MOS_STATUS StoreNumPasses( 1612 EncodeStatusBuffer *encodeStatusBuf, 1613 MhwMiInterface *miInterface, 1614 PMOS_COMMAND_BUFFER cmdBuffer, 1615 uint32_t currPass); 1616 1617 #if USE_CODECHAL_DEBUG_TOOL 1618 MOS_STATUS DumpSeqParams( 1619 PCODEC_AVC_ENCODE_SEQUENCE_PARAMS seqParams, 1620 PCODEC_AVC_IQ_MATRIX_PARAMS matrixParams); 1621 1622 MOS_STATUS DumpPicParams( 1623 PCODEC_AVC_ENCODE_PIC_PARAMS picParams, 1624 PCODEC_AVC_IQ_MATRIX_PARAMS matrixParams); 1625 1626 MOS_STATUS DumpFeiPicParams( 1627 CodecEncodeAvcFeiPicParams *feiPicParams); 1628 1629 MOS_STATUS DumpSliceParams( 1630 PCODEC_AVC_ENCODE_SLICE_PARAMS sliceParams, 1631 PCODEC_AVC_ENCODE_PIC_PARAMS picParams); 1632 1633 MOS_STATUS DumpVuiParams( 1634 PCODECHAL_ENCODE_AVC_VUI_PARAMS avcVuiParams); 1635 1636 #endif 1637 1638 protected: 1639 //! 1640 //! \brief Set MFX_PIPE_MODE_SELECT parameter 1641 //! 1642 //! \param [in] genericParam 1643 //! CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS 1644 //! \param [out] param 1645 //! reference to MHW_VDBOX_PIPE_MODE_SELECT_PARAMS 1646 //! 1647 //! \return void 1648 //! 1649 virtual void SetMfxPipeModeSelectParams( 1650 const CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS& genericParam, 1651 MHW_VDBOX_PIPE_MODE_SELECT_PARAMS& param); 1652 1653 //! 1654 //! \brief set MFX_PIPE_BUF_ADDR_STATE parameter 1655 //! 1656 //! \param [in] genericParam 1657 //! CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS 1658 //! \param [out] param 1659 //! reference to MHW_VDBOX_PIPE_BUF_ADDR_PARAMS 1660 //! 1661 //! \return MOS_STATUS 1662 //! MOS_STATUS_SUCCESS if success 1663 //! 1664 virtual MOS_STATUS SetMfxPipeBufAddrStateParams( 1665 CODECHAL_ENCODE_AVC_GENERIC_PICTURE_LEVEL_PARAMS genericParam, 1666 MHW_VDBOX_PIPE_BUF_ADDR_PARAMS& param); 1667 1668 //! 1669 //! \brief Set MFX_IND_OBJ_BASE_ADDR_STATE parameter 1670 //! 1671 //! \param [out] param 1672 //! reference to MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS 1673 //! 1674 //! \return void 1675 //! 1676 virtual void SetMfxIndObjBaseAddrStateParams(MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS& param); 1677 1678 //! 1679 //! \brief Set MHW_VDBOX_BSP_BUF_BASE_ADDR_STATE parameter 1680 //! 1681 //! \param [out] param 1682 //! reference to MHW_VDBOX_BSP_BUF_BASE_ADDR_PARAMS 1683 //! 1684 //! \return void 1685 //! 1686 virtual void SetMfxBspBufBaseAddrStateParams(MHW_VDBOX_BSP_BUF_BASE_ADDR_PARAMS& param); 1687 1688 //! 1689 //! \brief Set MHW_VDBOX_QM_STATE parameter 1690 //! 1691 //! \param [out] qmParams 1692 //! reference to MHW_VDBOX_QM_PARAMS 1693 //! \param [out] fqmParams 1694 //! reference to MHW_VDBOX_QM_PARAMS 1695 //! 1696 //! \return void 1697 //! 1698 virtual void SetMfxQmStateParams(MHW_VDBOX_QM_PARAMS& qmParams, MHW_VDBOX_QM_PARAMS & fqmParams); 1699 1700 //! 1701 //! \brief Set MHW_VDBOX_AVC_IMG_STATE parameter 1702 //! 1703 //! \param [out] param 1704 //! reference to MHW_VDBOX_AVC_IMG_PARAMS 1705 //! 1706 //! \return void 1707 //! 1708 virtual void SetMfxAvcImgStateParams(MHW_VDBOX_AVC_IMG_PARAMS& param); 1709 1710 public: 1711 PMOS_INTERFACE m_origOsInterface = nullptr; //!< Os Interface 1712 CodechalHwInterface *m_origHwInterface = nullptr; //!< Hw Interface 1713 PMHW_STATE_HEAP_INTERFACE m_origStateHeapInterface = nullptr; //!< StateHeap Interface 1714 1715 // Parameters passed by application 1716 PCODEC_AVC_ENCODE_PIC_PARAMS m_avcPicParams[CODEC_AVC_MAX_PPS_NUM]; //!< Pointer to array of picture parameter, could be removed 1717 PCODEC_AVC_ENCODE_SEQUENCE_PARAMS m_avcSeqParams[CODEC_AVC_MAX_SPS_NUM]; //!< Pointer to array of sequence parameter, could be removed 1718 PCODEC_AVC_ENCODE_PIC_PARAMS m_avcPicParam = nullptr; //!< Pointer to AVC picture parameter 1719 PCODEC_AVC_ENCODE_SEQUENCE_PARAMS m_avcSeqParam = nullptr; //!< Pointer to AVC sequence parameter 1720 PCODECHAL_ENCODE_AVC_QUALITY_CTRL_PARAMS m_avcQCParams = nullptr; //!< Pointer to video quality control parameter 1721 PCODECHAL_ENCODE_AVC_ROUNDING_PARAMS m_avcRoundingParams = nullptr; //!< Pointer to AVC rounding parameter 1722 PCODECHAL_ENCODE_AVC_VUI_PARAMS m_avcVuiParams = nullptr; //!< Pointer to AVC Uvi parameter 1723 PCODEC_AVC_ENCODE_SLICE_PARAMS m_avcSliceParams = nullptr; //!< Pointer to AVC slice parameter 1724 CodecEncodeAvcFeiPicParams *m_avcFeiPicParams = nullptr; //!< Pointer to FEI picture parameter 1725 PCODEC_AVC_IQ_MATRIX_PARAMS m_avcIQMatrixParams = nullptr; //!< Pointer to IQMaxtrix parameter 1726 PCODEC_AVC_ENCODE_IQ_WEIGTHSCALE_LISTS m_avcIQWeightScaleLists = nullptr; //!< Pointer to IQWidght ScaleLists 1727 CODEC_AVC_ENCODE_USER_FLAGS m_userFlags; //!< Encoder user flag settings 1728 uint32_t m_reconFrameSurfaceId[CODEC_AVC_NUM_UNCOMPRESSED_SURFACE]; 1729 CODECHAL_ENCODE_AVC_ENCODER_USAGE m_encoderUsage = CODECHAL_ENCODE_AVC_SINGLE_PASS; 1730 1731 CODEC_PIC_ID m_picIdx[CODEC_AVC_MAX_NUM_REF_FRAME]; //!< Picture index 1732 PCODEC_REF_LIST m_refList[CODEC_AVC_NUM_UNCOMPRESSED_SURFACE]; //!< Pointer to reference list 1733 CODEC_AVC_FRAME_STORE_ID m_avcFrameStoreID[CODEC_AVC_MAX_NUM_REF_FRAME]; //!< Refer to CODEC_AVC_FRAME_STORE_ID 1734 CODECHAL_ENCODE_AVC_NAL_UNIT_TYPE m_nalUnitType; //!< Nal unit type 1735 PCODECHAL_NAL_UNIT_PARAMS *m_nalUnitParams = nullptr; //!< Pointers to NAL unit parameters array 1736 uint16_t m_sliceHeight = 0; //!< Slice height 1737 uint8_t m_biWeightNumB = 0; //!< Bi direction Weight B frames num 1738 bool m_deblockingEnabled = false; //!< Enable deblocking flag 1739 bool m_mbaffEnabled = false; //!< Enable MBAFF flag 1740 bool m_firstFieldIdrPic = false; //!< First field IDR flag 1741 bool m_hmeEnabled = false; //!< Enable HME flag 1742 bool m_16xMeEnabled = false; //!< Enable 16x ME flag 1743 bool m_32xMeEnabled = false; //!< Enable 32x ME flag 1744 bool m_skipBiasAdjustmentEnable = false;//!< Enable SkipBiasAdjustment flag 1745 bool m_staticFrameDetectionInUse = false;//!< Enable Static Frame Detection flag 1746 uint32_t m_sliceStructCaps = 0; //!< Slice struct 1747 1748 CODECHAL_ENCODE_AVC_TQ_PARAMS m_trellisQuantParams; //!< Trellis Quantization params 1749 1750 // B-frame 1751 uint32_t m_distScaleFactorList0[CODEC_AVC_MAX_NUM_REF_FRAME * 2]; //!< the DistScaleFactor used to derive temporal direct motion vector 1752 uint32_t m_biWeight = 0; //!< Bidirectional Weight 1753 1754 // Batch Buffers 1755 MHW_BATCH_BUFFER m_batchBufferForVdencImgStat[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; //!< VDEnc image state batch buffers 1756 1757 // ME 1758 CodechalKernelHme *m_hmeKernel = nullptr; //!< ME kernel object 1759 MOS_SURFACE m_4xMeMvDataBuffer; //!< 4x motion estimation MV data buffer 1760 uint32_t m_meMvBottomFieldOffset = 0; //!< ME MV bottom filed offset 1761 MOS_SURFACE m_16xMeMvDataBuffer; //!< 16x motion estimation MV data buffer 1762 uint32_t m_meMv16xBottomFieldOffset = 0; //!< 16x motion estimation MV bottom filed offset 1763 MOS_SURFACE m_32xMeMvDataBuffer; //!< 32x motion estimation MV data buffer 1764 uint32_t m_meMv32xBottomFieldOffset = 0; //!< 32x motion estimation MV bottom filed offset 1765 MOS_SURFACE m_4xMeDistortionBuffer; //!< 4x ME distortion buffer 1766 uint32_t m_meDistortionBottomFieldOffset = 0; //!< ME distortion bottom field offset 1767 uint8_t *m_bmeMethodTable = nullptr; //!< Point to BME Method table 1768 uint8_t *m_meMethodTable = nullptr; //!< Pointer to ME Method table 1769 1770 // PAK Scratch Buffers 1771 MOS_RESOURCE m_intraRowStoreScratchBuffer; //!< Handle of intra row store surface 1772 MHW_BATCH_BUFFER m_batchBufferForPakSlices[CODECHAL_ENCODE_RECYCLED_BUFFER_NUM]; //!< PAK Slice batch buffers 1773 uint32_t m_pakSliceSize = 0; //!< PAK Slice Size 1774 uint32_t m_pakSlicePatchListSize = 0; //!< PAK Slice patch list size 1775 uint32_t m_currPakSliceIdx = 0; //!< Current PAK slice index 1776 1777 bool m_4xMeDistortionBufferSupported = false; //!< Generation Specific Support Flags & User Feature Key Reads 1778 1779 bool m_sliceSizeStreamoutSupported = false; //!< Enable PAK slice size streamout, valid for AVC VDEnc on KBL/CNL+ 1780 MOS_RESOURCE m_pakSliceSizeStreamoutBuffer; //!< PAK slice size streamout buffer 1781 1782 bool m_crePrefetchEnable = false; //!< Enable CRE prefetch flag 1783 bool m_tlbPrefetchEnable = false; //!< Enable TLB prefetch flag 1784 1785 const uint8_t m_codechalEncodeAvcSfdCostTablePFrame[CODEC_AVC_NUM_QP] = 1786 { 1787 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 60, 60, 60, 60, 73, 73, 73, 76, 76, 76, 88, 89, 89, 91, 92, 93, 104, 104, 106, 107, 108, 109, 120, 120, 122, 123, 124, 125, 136, 136, 138, 139, 140, 141, 143, 143}; 1788 1789 const uint8_t m_codechalEncodeAvcSfdCostTableBFrame[CODEC_AVC_NUM_QP] = 1790 { 1791 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 73, 73, 73, 73, 77, 77, 77, 89, 89, 89, 91, 93, 93, 95, 105, 106, 107, 108, 110, 111, 121, 122, 123, 124, 125, 127, 137, 138, 139, 140, 142, 143, 143, 143, 143, 143}; 1792 1793 const uint8_t m_codechalEncodeAvcSfdCostTableVdEnc[CODEC_AVC_NUM_QP] = 1794 { 1795 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 47, 56, 57, 59, 44, 45, 47, 56, 44, 47, 47, 45, 47, 47, 47, 47, 45, 47, 47, 56, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47}; 1796 1797 #if USE_CODECHAL_DEBUG_TOOL 1798 protected: 1799 //! 1800 //! \brief Create AVC PAR 1801 //! 1802 //! \return MOS_STATUS 1803 //! MOS_STATUS_SUCCESS if success, else fail reason 1804 //! 1805 MOS_STATUS CreateAvcPar(); 1806 1807 //! 1808 //! \brief Destroy AVC PAR 1809 //! 1810 //! \return MOS_STATUS 1811 //! MOS_STATUS_SUCCESS if success, else fail reason 1812 //! 1813 MOS_STATUS DestroyAvcPar(); 1814 1815 //! 1816 //! \brief Dump sequence PAR file 1817 //! 1818 //! \return MOS_STATUS 1819 //! MOS_STATUS_SUCCESS if success, else fail reason 1820 //! DumpSeqParFile()1821 virtual MOS_STATUS DumpSeqParFile() { return MOS_STATUS_SUCCESS; } 1822 1823 //! 1824 //! \brief Dump frame PAR file 1825 //! 1826 //! \return MOS_STATUS 1827 //! MOS_STATUS_SUCCESS if success, else fail reason 1828 //! DumpFrameParFile()1829 virtual MOS_STATUS DumpFrameParFile() { return MOS_STATUS_SUCCESS; } 1830 1831 //! 1832 //! \brief Populate const parameters 1833 //! 1834 //! \return MOS_STATUS 1835 //! MOS_STATUS_SUCCESS if success, else fail reason 1836 //! 1837 MOS_STATUS PopulateConstParam(); 1838 1839 //! 1840 //! \brief Populate target usage as the first parameter of dumped par file 1841 //! 1842 //! \return MOS_STATUS 1843 //! MOS_STATUS_SUCCESS if success, else fail reason 1844 //! 1845 MOS_STATUS PopulateTargetUsage(); 1846 1847 //! 1848 //! \brief Set MHW_VDBOX_AVC_IMG_STATE parameter 1849 //! 1850 //! \param [in] avcSeqParams 1851 //! pointer to AVC encode sequence parameters 1852 //! \param [in] avcPicParams 1853 //! pointer to AVC encode picture parameters 1854 //! \param [in] avcSlcParams 1855 //! pointer to AVC encode slice parameters 1856 //! 1857 //! \return MOS_STATUS 1858 //! MOS_STATUS_SUCCESS if success, else fail reason 1859 //! 1860 MOS_STATUS PopulateDdiParam( 1861 PCODEC_AVC_ENCODE_SEQUENCE_PARAMS avcSeqParams, 1862 PCODEC_AVC_ENCODE_PIC_PARAMS avcPicParams, 1863 PCODEC_AVC_ENCODE_SLICE_PARAMS avcSlcParams); 1864 1865 //! 1866 //! \brief Set MHW_VDBOX_AVC_IMG_STATE parameter 1867 //! 1868 //! \param [in] adaptiveRoundingInterEnable 1869 //! adaptive rounding inter enable flag 1870 //! \param [in] sliceState 1871 //! pointer to slice state 1872 //! 1873 //! \return MOS_STATUS 1874 //! MOS_STATUS_SUCCESS if success, else fail reason 1875 //! 1876 MOS_STATUS PopulateSliceStateParam( 1877 bool adaptiveRoundingInterEnable, 1878 PMHW_VDBOX_AVC_SLICE_STATE sliceState); 1879 1880 //! 1881 //! \brief Set MHW_VDBOX_AVC_IMG_STATE parameter 1882 //! 1883 //! \param [in] *cmd 1884 //! pointer to command 1885 //! 1886 //! \return MOS_STATUS 1887 //! MOS_STATUS_SUCCESS if success, else fail reason 1888 //! 1889 MOS_STATUS PopulateSfdParam( 1890 void *cmd); 1891 1892 //! 1893 //! \brief Set MHW_VDBOX_AVC_IMG_STATE parameter 1894 //! 1895 //! \param [in] is16xMeEnabled 1896 //! 16x ME enabled flag 1897 //! \param [in] is32xMeEnabled 1898 //! 32x ME enabled flag 1899 //! \param [in] meMethod 1900 //! ME method 1901 //! \param [in] *cmd 1902 //! pointer to command 1903 //! 1904 //! \return MOS_STATUS 1905 //! MOS_STATUS_SUCCESS if success, else fail reason 1906 //! PopulateHmeParam(bool is16xMeEnabled,bool is32xMeEnabled,uint8_t meMethod,void * cmd)1907 virtual MOS_STATUS PopulateHmeParam( 1908 bool is16xMeEnabled, 1909 bool is32xMeEnabled, 1910 uint8_t meMethod, 1911 void *cmd) { return MOS_STATUS_SUCCESS; } 1912 1913 //! 1914 //! \brief Set MHW_VDBOX_AVC_IMG_STATE parameter 1915 //! 1916 //! \param [in] *cmd 1917 //! pointer to command 1918 //! 1919 //! \return MOS_STATUS 1920 //! MOS_STATUS_SUCCESS if success, else fail reason 1921 //! PopulateBrcInitParam(void * cmd)1922 virtual MOS_STATUS PopulateBrcInitParam( 1923 void *cmd) { return MOS_STATUS_SUCCESS; } 1924 1925 //! 1926 //! \brief Set MHW_VDBOX_AVC_IMG_STATE parameter 1927 //! 1928 //! \param [in] *cmd 1929 //! pointer to command 1930 //! 1931 //! \return MOS_STATUS 1932 //! MOS_STATUS_SUCCESS if success, else fail reason 1933 //! PopulateBrcUpdateParam(void * cmd)1934 virtual MOS_STATUS PopulateBrcUpdateParam( 1935 void *cmd) { return MOS_STATUS_SUCCESS; } 1936 1937 //! 1938 //! \brief Set MHW_VDBOX_AVC_IMG_STATE parameter 1939 //! 1940 //! \param [in] meMethod 1941 //! ME method 1942 //! \param [in] *cmd 1943 //! pointer to command 1944 //! 1945 //! \return MOS_STATUS 1946 //! MOS_STATUS_SUCCESS if success, else fail reason 1947 //! PopulateEncParam(uint8_t meMethod,void * cmd)1948 virtual MOS_STATUS PopulateEncParam( 1949 uint8_t meMethod, 1950 void *cmd) { return MOS_STATUS_SUCCESS; } 1951 1952 //! 1953 //! \brief Set MHW_VDBOX_AVC_IMG_STATE parameter 1954 //! 1955 //! \param [in] cmdBuffer 1956 //! pointer to command buffer 1957 //! \param [in] secondLevelBatchBuffer 1958 //! pointer to second level batch buffer 1959 //! 1960 //! \return MOS_STATUS 1961 //! MOS_STATUS_SUCCESS if success, else fail reason 1962 //! PopulatePakParam(PMOS_COMMAND_BUFFER cmdBuffer,PMHW_BATCH_BUFFER secondLevelBatchBuffer)1963 virtual MOS_STATUS PopulatePakParam( 1964 PMOS_COMMAND_BUFFER cmdBuffer, 1965 PMHW_BATCH_BUFFER secondLevelBatchBuffer) { return MOS_STATUS_SUCCESS; } 1966 1967 EncodeAvcPar *m_avcPar = nullptr; //!< AVC PAR parameters 1968 bool m_populateTargetUsage = false; 1969 #endif 1970 1971 //! 1972 //! \brief Set frame store Id for avc codec. 1973 //! \details 1974 //! \return frameIdx 1975 //! [in] frame index 1976 //! \return MOS_STATUS 1977 //! MOS_STATUS_SUCCESS if success, else fail reason 1978 //! 1979 MOS_STATUS SetFrameStoreIds(uint8_t frameIdx); 1980 }; 1981 #endif // __CODECHAL_ENCODE_AVC_BASE_H__ 1982