1 /* 2 * Copyright (c) 2012-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_decode_vp8.h 24 //! \brief Defines the decode interface extension for VP8. 25 //! \details Defines all types, macros, and functions required by CodecHal for VP8 decoding. 26 //! Definitions are not externally facing. 27 //! 28 #ifndef __CODECHAL_DECODER_VP8_H__ 29 #define __CODECHAL_DECODER_VP8_H__ 30 31 #include "codechal.h" 32 #include "codechal_hw.h" 33 #include "codechal_decoder.h" 34 35 //*------------------------------------------------------------------------------ 36 //* Codec Definitions 37 //*------------------------------------------------------------------------------ 38 39 //! 40 //! \enum VP8_MB_LVL_FEATURES 41 //! VP8 MB Level Features 42 //! 43 typedef enum 44 { 45 VP8_MB_LVL_ALT_Q = 0, 46 VP8_MB_LVL_ALT_LF = 1, 47 VP8_MB_LVL_MAX = 2 48 } VP8_MB_LVL_FEATURES; 49 50 //! 51 //! \enum VP8_MB_PREDICTION_MODE 52 //! VP8 MB Prediction Mode 53 //! 54 typedef enum 55 { 56 VP8_DC_PRED, 57 VP8_V_PRED, 58 VP8_H_PRED, 59 VP8_TM_PRED, 60 VP8_B_PRED, 61 62 VP8_NEARESTMV, 63 VP8_NEARMV, 64 VP8_ZEROMV, 65 VP8_NEWMV, 66 SPLITMV, 67 68 VP8_MB_MODE_COUNT 69 } VP8_MB_PREDICTION_MODE; 70 71 //! 72 //! \enum VP8_LF_TYPE 73 //! VP8 LF Type 74 //! 75 typedef enum 76 { 77 VP8_NORMAL_LF = 0, 78 VP8_SIMPLE_LF = 1 79 } VP8_LF_TYPE; 80 81 //! 82 //! \enum VP8_TOKEN_PARTITION 83 //! VP8 Token Partition 84 //! 85 typedef enum 86 { 87 VP8_ONE_PARTITION = 0, 88 VP8_TWO_PARTITION = 1, 89 VP8_FOUR_PARTITION = 2, 90 VP8_EIGHT_PARTITION = 3 91 } VP8_TOKEN_PARTITION; 92 93 //! 94 //! \enum VP8_MV_REFERENCE_FRAME 95 //! VP8 MV Reference Frame 96 //! 97 typedef enum 98 { 99 VP8_NONE = -1, 100 VP8_INTRA_FRAME = 0, 101 VP8_LAST_FRAME = 1, 102 VP8_GOLDEN_FRAME = 2, 103 VP8_ALTREF_FRAME = 3, 104 VP8_MAX_REF_FRAMES = 4 105 } VP8_MV_REFERENCE_FRAME; 106 107 //! 108 //! \def VP8_Y_MODES 109 //! VP8 Y Mode Max Index 110 //! 111 #define VP8_Y_MODES (VP8_B_PRED + 1) 112 //! 113 //! \def VP8_UV_MODES 114 //! VP8 UV Mode Max Index 115 //! 116 #define VP8_UV_MODES (VP8_TM_PRED + 1) 117 118 //! 119 //! \def VP8_MAX_MB_SEGMENTS 120 //! Max Index of VP8 MB Segment 121 //! 122 #define VP8_MAX_MB_SEGMENTS 4 123 //! 124 //! \def VP8_MB_SEGMENT_TREE_PROBS 125 //! Max Index of Prob Tree for MB Segment Id 126 //! 127 #define VP8_MB_SEGMENT_TREE_PROBS 3 128 129 //! 130 //! \def VP8_MAX_REF_LF_DELTAS 131 //! Max Index of VP8 Ref LF Deltas 132 //! 133 #define VP8_MAX_REF_LF_DELTAS 4 134 //! 135 //! \def VP8_MAX_MODE_LF_DELTAS 136 //! Max Index of VP8 Mode LF Deltas 137 //! 138 #define VP8_MAX_MODE_LF_DELTAS 4 139 140 //! 141 //! \def VP8_MAX_Q 142 //! VP8 Max Q Index 143 //! 144 #define VP8_MAX_Q 127 145 //! 146 //! \def VP8_Q_INDEX_RANGE 147 //! VP8 Q Index range 148 //! 149 #define VP8_Q_INDEX_RANGE (VP8_MAX_Q + 1) 150 151 //! 152 //! \def VP8_BLOCK_TYPES 153 //! VP8 Block Types Max Index 154 //! 155 #define VP8_BLOCK_TYPES 4 156 //! 157 //! \def VP8_COEF_BANDS 158 //! VP8 Coef Bands Max Index 159 //! 160 #define VP8_COEF_BANDS 8 161 //! 162 //! \def VP8_PREV_COEF_CONTEXTS 163 //! VP8 Prev Coef Context Max Index 164 //! 165 #define VP8_PREV_COEF_CONTEXTS 3 166 //! 167 //! \def VP8_ENTROPY_NODES 168 //! VP8 Entropy Nodes Max Index 169 //! 170 #define VP8_ENTROPY_NODES 11 171 172 //! 173 //! \struct _VP8_FRAME_CONTEXT 174 //! \brief Define variables for VP8 Frame Context 175 //! 176 typedef struct _VP8_FRAME_CONTEXT 177 { 178 uint8_t YModeProb[VP8_Y_MODES - 1]; 179 uint8_t UVModeProb[VP8_UV_MODES - 1]; 180 uint8_t CoefProbs[VP8_BLOCK_TYPES][VP8_COEF_BANDS][VP8_PREV_COEF_CONTEXTS][VP8_ENTROPY_NODES]; 181 MV_CONTEXT MvContext[2]; 182 } VP8_FRAME_CONTEXT; 183 184 typedef struct _CODECHAL_DECODE_VP8_FRAME_HEAD CODECHAL_DECODE_VP8_FRAME_HEAD, *PCODECHAL_DECODE_VP8_FRAME_HEAD; 185 186 //! 187 //! \struct _CODECHAL_DECODE_VP8_FRAME_HEAD 188 //! \brief Define variables for VP8 Frame Head 189 //! 190 struct _CODECHAL_DECODE_VP8_FRAME_HEAD 191 { 192 193 int16_t Y1DeQuant[VP8_Q_INDEX_RANGE][2]; 194 int16_t Y2DeQuant[VP8_Q_INDEX_RANGE][2]; 195 int16_t UVDeQuant[VP8_Q_INDEX_RANGE][2]; 196 197 int32_t iNewFrameBufferIdx, iLastFrameBufferIdx, iGoldenFrameBufferIdx, iAltFrameBufferIdx; 198 int32_t iLastFrameBufferCurrIdx, iGoldenFrameBufferCurrIdx, iAltFrameBufferCurrIdx; 199 200 int32_t iFrameType; 201 202 int32_t iShowframe; 203 204 int32_t iMbNoCoeffSkip; 205 int32_t iProbSkipFalse; 206 207 int32_t iBaseQIndex; 208 209 int32_t iY1DcDeltaQ; 210 int32_t iY2DcDeltaQ; 211 int32_t iY2AcDeltaQ; 212 int32_t iUVDcDeltaQ; 213 int32_t iUVAcDeltaQ; 214 215 VP8_LF_TYPE FilterType; 216 217 int32_t iFilterLevel; 218 int32_t iSharpnessLevel; 219 220 int32_t iRefreshLastFrame; 221 int32_t iRefreshGoldenFrame; 222 int32_t iRefreshAltFrame; 223 224 int32_t iCopyBufferToGolden; //!< 0 - None, 1 - Last to Golden, 2 - ALT to Golden 225 int32_t iCopyBufferToAlt; //!< 0 - None, 1 - Last to ALT, 2 - Golden to ALT 226 227 int32_t iRefreshEntropyProbs; 228 229 int32_t RefFrameSignBias[VP8_MAX_REF_FRAMES]; 230 231 VP8_FRAME_CONTEXT LastFrameContext; 232 VP8_FRAME_CONTEXT FrameContext; 233 234 int32_t iVersion; 235 236 VP8_TOKEN_PARTITION MultiTokenPartition; 237 238 uint8_t u8SegmentationEnabled; 239 240 uint8_t u8UpdateMbSegmentationMap; 241 uint8_t u8UpdateMbSegmentationData; 242 243 uint8_t u8MbSegementAbsDelta; 244 245 uint8_t MbSegmentTreeProbs[VP8_MB_SEGMENT_TREE_PROBS]; //!< Prob Tree for MB Segment Id 246 247 int8_t SegmentFeatureData[VP8_MB_LVL_MAX][VP8_MAX_MB_SEGMENTS]; 248 int8_t LoopFilterLevel[VP8_MAX_MB_SEGMENTS]; 249 250 uint8_t u8ModeRefLfDeltaEnabled; 251 uint8_t u8ModeRefLfDeltaUpdate; 252 253 int8_t RefLFDeltas[VP8_MAX_REF_LF_DELTAS]; //!< Intra, Last, Golden, ALT 254 int8_t ModeLFDeltas[VP8_MAX_MODE_LF_DELTAS]; //!< BPRED, ZERO_MV, MV, SPLIT 255 256 uint32_t uiFirstPartitionLengthInBytes; 257 258 uint8_t YModeProbs[4]; 259 uint8_t UVModeProbs[3]; 260 261 uint8_t ProbIntra; 262 uint8_t ProbLast; 263 uint8_t ProbGf; 264 265 bool bNotFirstCall; 266 }; 267 268 //! 269 //! \class Vp8EntropyState 270 //! \brief This class defines the member fields, functions etc used by VP8 entropy decoder to parse frame head. 271 //! 272 class Vp8EntropyState 273 { 274 public: 275 const uint8_t m_keyFrame = 0; //!< VP8 Key Frame Flag 276 const uint8_t m_interFrame = 1; //!< VP8 Inter Frame Flag 277 const uint32_t m_bdValueSize = ((uint32_t)sizeof(uint32_t) * CHAR_BIT); // VP8 BD Value Size 278 const uint32_t m_lotsOfBits = 0x40000000; //!< Offset for parsing frame head 279 const uint8_t m_probHalf = 128; //!< VP8 Half Probability 280 281 //! 282 //! \brief Constructor 283 //! Vp8EntropyState()284 Vp8EntropyState() {}; 285 //! 286 //! \brief Destructor 287 //! ~Vp8EntropyState()288 ~Vp8EntropyState() {}; 289 290 //! 291 //! \brief Initialize VP8 entropy state 292 //! \details Initialize VP8 bitstream buffer and related index 293 //! \param [in] vp8FrameHeadIn 294 //! Pointer to VP8 Frame Head 295 //! \param [in] bitstreamBufferIn 296 //! Pointer to VP8 bitstream buffer 297 //! \param [in] bitstreamBufferSizeIn 298 //! VP8 bitstream buffer size 299 //! \return void 300 //! 301 void Initialize( 302 PCODECHAL_DECODE_VP8_FRAME_HEAD vp8FrameHeadIn, 303 uint8_t* bitstreamBufferIn, 304 uint32_t bitstreamBufferSizeIn); 305 306 //! 307 //! \brief Parse VP8 Frame Head 308 //! \details Parse VP8 Frame Head based on VP8 Pic Params 309 //! \param [in] vp8PicParams 310 //! Pointer to VP8 Pic Params 311 //! \return MOS_STATUS 312 //! MOS_STATUS_SUCCESS if success, else fail reason 313 //! 314 MOS_STATUS ParseFrameHead( 315 PCODEC_VP8_PIC_PARAMS vp8PicParams); 316 317 //! 318 //! \brief Update Quant Index in VP8 Frame Head 319 //! \details Update Quant Index in VP8 Frame Head for 320 //! Y/UV based on DeltaQ in VP8 Pic Params 321 //! \param [in] vp8PicParams 322 //! Pointer to VP8 Pic Params 323 //! \return void 324 //! 325 void FrameHeadQuantUpdate( 326 PCODEC_VP8_PIC_PARAMS vp8PicParams); 327 328 protected: 329 //! 330 //! \brief Initialize Frame Head in VP8 Entropy State class 331 //! \details Initialize Frame Head for VP8 Frame Head Parser 332 //! \return void 333 //! 334 void ParseFrameHeadInit(); 335 336 //! 337 //! \brief Start Entropy Decode 338 //! \return int32_t 339 //! 1 if Buffer is empty or pointer is nullptr, else call DecodeFill and return 0 340 //! 341 int32_t StartEntropyDecode(); 342 343 //! 344 //! \brief Update Segmentation Info in Frame Head 345 //! \details Parse bitstream to update frame head segmentation info 346 //! \return void 347 //! 348 void SegmentationEnabled(); 349 350 //! 351 //! \brief Update Mv Contexts in Frame Head 352 //! \details Parse bitstream to update Mv Contexts Info 353 //! \param [out] mvContext 354 //! Pointer to Mv Contexts 355 //! \return void 356 //! 357 void ReadMvContexts(MV_CONTEXT *mvContext); 358 359 PCODECHAL_DECODE_VP8_FRAME_HEAD m_frameHead = nullptr; //!< Pointer to VP8 Frame Head 360 uint8_t * m_bitstreamBuffer = nullptr; //!< Pointer to Bitstream Buffer 361 uint32_t m_bitstreamBufferSize = 0; //!< Size of Bitstream Buffer 362 uint8_t * m_dataBuffer = nullptr; //!< Pointer to Data Buffer 363 uint8_t * m_dataBufferEnd = nullptr; //<! Pointer to Data Buffer End 364 365 private: 366 //! 367 //! \brief Update Entropy Decode State Info 368 //! \details Calculate left bitstream size to update pointer info 369 //! \return void 370 //! 371 void DecodeFill(); 372 373 //! 374 //! \brief Update Entropy Decode State according to probability 375 //! \param [in] probability 376 //! Probability to do entropy decode 377 //! \return uint32_t 378 //! return 1 if entropy decode value meets the requirement of probability, else 0 379 //! 380 uint32_t DecodeBool(int32_t probability); 381 382 //! 383 //! \brief Update Entropy Decode State according to Bits Number 384 //! \param [in] bits 385 //! Bits to do entropy decode 386 //! \return int32_t 387 //! return value calculated by DecodeBool using 0x80 as probability 388 //! 389 int32_t DecodeValue(int32_t bits); 390 391 //! 392 //! \brief Update Loop Filter Info in VP8 Frame Header 393 //! \param [in] defaultFilterLvl 394 //! Default Segmentation Level 395 //! \return void 396 //! 397 void LoopFilterInit(int32_t defaultFilterLvl); 398 399 //! 400 //! \brief Update Loop Filter Deltas and Default Loop Filter Level 401 //! \details Parse Loop Filter Deltas and Default Loop Filter Level Info to 402 //! Initialize Loop Filter 403 //! \return void 404 //! 405 void LoopFilterEnabled(); 406 407 //! 408 //! \brief Get DeltaQ from Frame Header 409 //! \details Parse Frame Header to Get DeltaQ value Based on 410 //! Current DeltaQ Value and Update info 411 //! \param [in] prevVal 412 //! Previous DeltaQ Value 413 //! \param [in] qupdate 414 //! Pointer to DeltaQ Update Value 415 //! \return int32_t 416 //! Return Calculated DeltaQ Value 417 //! 418 int32_t GetDeltaQ(int32_t prevVal, int32_t * qupdate); 419 420 //! 421 //! \brief Get DC Quant Value from Lookup Table 422 //! \param [in] qindex 423 //! Quant Index 424 //! \param [in] delta 425 //! Quant Index Offset 426 //! \return int32_t 427 //! Return DC Quant Value in Lookup Table with Index and Offset 428 //! 429 int32_t DcQuant(int32_t qindex, int32_t delta); 430 431 //! 432 //! \brief Get Double DC Quant Value from Lookup Table 433 //! \param [in] qindex 434 //! Quant Index 435 //! \param [in] delta 436 //! Quant Index Offset 437 //! \return int32_t 438 //! Return Double DC Quant Value in Lookup Table with Index and Offset 439 //! 440 int32_t Dc2Quant(int32_t qindex, int32_t delta); 441 442 //! 443 //! \brief Get DC Quant Value from Lookup Table for UV 444 //! \param [in] qindex 445 //! Quant Index 446 //! \param [in] delta 447 //! Quant Index Offset 448 //! \return int32_t 449 //! Return DC Quant Value in Lookup Table with Index and Offset for UV 450 //! 451 int32_t DcUVQuant(int32_t qindex, int32_t delta); 452 453 //! 454 //! \brief Get AC Quant Value from Lookup Table for Y 455 //! \param [in] qindex 456 //! Quant Index 457 //! \return int32_t 458 //! Return AC Quant Value in Lookup Table with Index and Offset for Y 459 //! 460 int32_t AcYQuant(int32_t qindex); 461 462 //! 463 //! \brief Get ~Double AC Quant Value from Lookup Table 464 //! \param [in] qindex 465 //! Quant Index 466 //! \param [in] delta 467 //! Quant Index Offset 468 //! \return int32_t 469 //! Return AC Quant Value in Lookup Table with Index and Offset 470 //! Multiplied by 101581 and Then Devided by 2^16 (About 1.55) 471 //! 472 int32_t Ac2Quant(int32_t qindex, int32_t delta); 473 474 //! 475 //! \brief Get AC Quant Value from Lookup Table for UV 476 //! \param [in] qindex 477 //! Quant Index 478 //! \param [in] delta 479 //! Quant Index Offset 480 //! \return int32_t 481 //! Return AC Quant Value in Lookup Table with Index and Offset for UV 482 //! 483 int32_t AcUVQuant(int32_t qindex, int32_t delta); 484 485 //! 486 //! \brief Initialize Quant Table for Y/UV in Frame Head 487 //! \return void 488 //! 489 void QuantInit(); 490 491 //! 492 //! \brief Initialize DC/AC DeltaQ Value in Frame Head for Y/UV 493 //! \return void 494 //! 495 void QuantSetup(); 496 497 const uint8_t *m_bufferEnd = nullptr; //!< Pointer to Data Buffer End 498 const uint8_t *m_buffer = nullptr; //!< Pointer to Data Buffer 499 int32_t m_count = 0; //!< Bits Count for Bitstream Buffer 500 uint32_t m_value = 0; //!< Entropy Value 501 uint32_t m_range = 0; //!< Entropy Range 502 }; 503 504 using PVP8_ENTROPY_STATE = Vp8EntropyState*; 505 506 //! 507 //! \class CodechalDecodeVp8 508 //! \brief This class defines the member fields, functions etc used by VP8 decoder. 509 //! 510 class CodechalDecodeVp8 : public CodechalDecode 511 { 512 public: 513 const int32_t m_codechalDecodeVp8CoeffprobTableSize = 4 * 8 * 3 * 11; 514 515 //! 516 //! \brief Constructor 517 //! \param [in] hwInterface 518 //! Hardware interface 519 //! \param [in] debugInterface 520 //! Debug interface 521 //! \param [in] standardInfo 522 //! The information of decode standard for this instance 523 //! 524 CodechalDecodeVp8( 525 CodechalHwInterface *hwInterface, 526 CodechalDebugInterface* debugInterface, 527 PCODECHAL_STANDARD_INFO standardInfo); 528 529 //! 530 //! \brief Destructor 531 //! 532 ~CodechalDecodeVp8(); 533 534 //! 535 //! \brief Allocate and initialize VP8 decoder standard 536 //! \param [in] settings 537 //! Pointer to CodechalSetting 538 //! \return MOS_STATUS 539 //! MOS_STATUS_SUCCESS if success, else fail reason 540 //! 541 MOS_STATUS AllocateStandard( 542 CodechalSetting * settings) override; 543 544 //! 545 //! \brief Set states for each frame to prepare for VP8 decode 546 //! \return MOS_STATUS 547 //! MOS_STATUS_SUCCESS if success, else fail reason 548 //! 549 MOS_STATUS SetFrameStates() override; 550 551 //! 552 //! \brief VP8 decoder state level function 553 //! \details State level function for VP8 decoder 554 //! 555 //! \return MOS_STATUS 556 //! MOS_STATUS_SUCCESS if success, else fail reason 557 //! 558 MOS_STATUS DecodeStateLevel() override; 559 560 //! 561 //! \brief VP9 decoder primitive level function 562 //! \details Primitive level function for GEN specific VP8 decoder 563 //! 564 //! \return MOS_STATUS 565 //! MOS_STATUS_SUCCESS if success, else fail reason 566 //! 567 MOS_STATUS DecodePrimitiveLevel() override; 568 569 MOS_STATUS InitMmcState() override; 570 571 //! 572 //! \brief Allocate fixed sized resources 573 //! \details Allocate fixed sized resources VP8 decode driver 574 //! \return MOS_STATUS 575 //! MOS_STATUS_SUCCESS if success, else fail reason 576 //! 577 MOS_STATUS AllocateResourcesFixedSizes(); 578 579 //! 580 //! \brief Allocate variable sized resources 581 //! \details Allocate variable sized resources in VP8 decode driver 582 //! \return MOS_STATUS 583 //! MOS_STATUS_SUCCESS if success, else fail reason 584 //! 585 MOS_STATUS AllocateResourcesVariableSizes(); 586 587 // Parameters passed by application 588 uint16_t m_picWidthInMbLastMaxAlloced; //!< Max Picture Width in MB used for buffer allocation in past frames 589 uint16_t m_picHeightInMbLastMaxAlloced; //!< Max Picture Height in MB used for buffer allocation in past frames 590 bool m_shortFormatInUse; //!< Short Format Indicator 591 uint32_t m_dataSize; //!< Data Size in Decode Params 592 uint32_t m_dataOffset; //!< Data Offset in Decode Params 593 PCODEC_VP8_PIC_PARAMS m_vp8PicParams; //!< Pointer to VP8 Pic Params 594 PCODEC_VP8_IQ_MATRIX_PARAMS m_vp8IqMatrixParams; //!< Pointer to VP8 IQ Matrix Params 595 MOS_SURFACE m_destSurface; //!< Pointer to MOS_SURFACE of render surface 596 PMOS_RESOURCE m_presLastRefSurface; //!< Pointer to resource of Last Reference Surface 597 PMOS_RESOURCE m_presGoldenRefSurface; //!< Pointer to resource of Golden Reference Surface 598 PMOS_RESOURCE m_presAltRefSurface; //!< Pointer to resource of Alternate Reference Surface 599 MOS_RESOURCE m_resDataBuffer; //!< Graphics resource of bitstream data surface 600 MOS_RESOURCE m_resCoefProbBuffer; //!< Graphics resource of Coefficient Probability data surface 601 602 // Track for several row store buffer's max picture width in MB used for buffer allocation in past frames 603 uint16_t m_mfdDeblockingFilterRowStoreScratchBufferPicWidthInMb; 604 uint16_t m_mfdIntraRowStoreScratchBufferPicWidthInMb; 605 uint16_t m_bsdMpcRowStoreScratchBufferPicWidthInMb; 606 607 // Internally maintained 608 MOS_RESOURCE m_resTmpBitstreamBuffer; //!< Graphics resource of Bitstream data surface 609 MOS_RESOURCE m_resMfdIntraRowStoreScratchBuffer; //!< Graphics resource of MFD Intra Row Store Scratch data surface 610 MOS_RESOURCE m_resMfdDeblockingFilterRowStoreScratchBuffer; //!< Graphics resource of MFD Deblocking Filter Row Store Scratch data surface 611 MOS_RESOURCE m_resBsdMpcRowStoreScratchBuffer; //!< Graphics resource of BSD/MPC Row Store Scratch data surface 612 MOS_RESOURCE m_resMprRowStoreScratchBuffer; //!< Graphics resource of MPR Row Store Scratch data surface 613 MOS_RESOURCE m_resSegmentationIdStreamBuffer; //!< Graphics resource of Segmentation ID Stream data surface 614 PCODEC_REF_LIST m_vp8RefList[CODECHAL_NUM_UNCOMPRESSED_SURFACE_VP8]; //!< VP8 Reference List 615 MOS_RESOURCE m_resSyncObject; //!< Graphics resource of Sync Object 616 MOS_RESOURCE m_resPrivateInputBuffer; //!< Graphics resource of private surface for bitstream and coeff prob table 617 uint32_t m_privateInputBufferSize; //!< Size of private surface 618 uint32_t m_coeffProbTableOffset; //!< Coefficient Probability Table Offset 619 620 bool m_deblockingEnabled; //!< VP8 Loop Filter Enable Indicator 621 622 // VP8 Frame Head 623 Vp8EntropyState m_vp8EntropyState; //!< VP8 Entropy State class to parse frame head 624 CODECHAL_DECODE_VP8_FRAME_HEAD m_vp8FrameHead; //!< VP8 Frame Head 625 626 // HuC copy related 627 bool m_huCCopyInUse; //!< a sync flag used when huc copy and decoder run in the different VDBOX 628 MOS_RESOURCE m_resSyncObjectWaContextInUse; //!< signals on the video WA context 629 MOS_RESOURCE m_resSyncObjectVideoContextInUse; //!< signals on the video context 630 631 protected: 632 //! 633 //! \brief Parse Frame Head 634 //! \details Parse Frame Head from Bitstream Buffer for VP8 635 //! 636 //! \param [in] bitstreamBuffer 637 //! Pointer to input Bitstream Buffer 638 //! \param [in] bitstreamBufferSize 639 //! Size of Input Bitstream Buffer 640 //! \return MOS_STATUS 641 //! MOS_STATUS_SUCCESS if success, else fail reason 642 //! 643 MOS_STATUS ParseFrameHead( 644 uint8_t* bitstreamBuffer, 645 uint32_t bitstreamBufferSize); 646 647 //! 648 //! \brief Copy Bitstream Buffer 649 //! \details Copy Bitstream Buffer from Source to Destiny 650 //! 651 //! \param [in] srcBitstreamBuffer 652 //! Resource of Source Bitstream Buffer 653 //! \param [in] dstBitstreamBuffer 654 //! Pointer to Resource of Destiny Bitstream Buffer 655 //! \param [in] size 656 //! Size of Bitstream Buffer 657 //! \return MOS_STATUS 658 //! MOS_STATUS_SUCCESS if success, else fail reason 659 //! 660 MOS_STATUS CopyBitstreamBuffer( 661 MOS_RESOURCE srcBitstreamBuffer, 662 PMOS_RESOURCE dstBitstreamBuffer, 663 uint32_t size); 664 665 #if USE_CODECHAL_DEBUG_TOOL 666 MOS_STATUS DumpPicParams( 667 PCODEC_VP8_PIC_PARAMS picParams); 668 669 MOS_STATUS DumpIQParams( 670 PCODEC_VP8_IQ_MATRIX_PARAMS matrixData); 671 #endif 672 }; 673 674 #endif // __CODECHAL_DECODER_VP8_H__ 675