| /* |
| * Copyright (c) 2011-2017, Intel Corporation |
| * |
| * Permission is hereby granted, free of charge, to any person obtaining a |
| * copy of this software and associated documentation files (the "Software"), |
| * to deal in the Software without restriction, including without limitation |
| * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
| * and/or sell copies of the Software, and to permit persons to whom the |
| * Software is furnished to do so, subject to the following conditions: |
| * |
| * The above copyright notice and this permission notice shall be included |
| * in all copies or substantial portions of the Software. |
| * |
| * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
| * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
| * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
| * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR |
| * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, |
| * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR |
| * OTHER DEALINGS IN THE SOFTWARE. |
| */ |
| |
| //! |
| //! \file codechal_decode_vc1.h |
| //! \brief Defines the decode interface extension for VC1. |
| //! \details Defines all types, macros, and functions required by CodecHal for VC1 decoding. |
| //! Definitions are not externally facing. |
| //! |
| |
| #ifndef __CODECHAL_DECODER_VC1_H__ |
| #define __CODECHAL_DECODER_VC1_H__ |
| |
| #include "codechal_decoder.h" |
| |
| //! |
| //! \def CODECHAL_DECODE_VC1_UNEQUAL_FIELD_WA_SURFACES |
| //! Unequal Field Surface max index |
| //! |
| #define CODECHAL_DECODE_VC1_UNEQUAL_FIELD_WA_SURFACES 4 |
| |
| //! |
| //! \def CODECHAL_DECODE_VC1_NUM_SYNC_TAGS |
| //! Sync Tags Number for StateHeap Settings |
| //! |
| #define CODECHAL_DECODE_VC1_NUM_SYNC_TAGS 36 |
| |
| //! |
| //! \def CODECHAL_DECODE_VC1_INITIAL_DSH_SIZE |
| //! Initial Dsh Size for StateHeap Settings |
| //! |
| #define CODECHAL_DECODE_VC1_INITIAL_DSH_SIZE (MHW_PAGE_SIZE * 2) |
| |
| //! |
| //! \def CODECHAL_DECODE_VC1_FAST_CHROMA_MV |
| //! Fast Chroma Mv calculation |
| //! |
| #define CODECHAL_DECODE_VC1_FAST_CHROMA_MV(cmv) ((cmv) - ((cmv) % 2)) |
| |
| //! |
| //! \def CODECHAL_DECODE_VC1_CHROMA_MV |
| //! Chroma Mv calculation |
| //! |
| #define CODECHAL_DECODE_VC1_CHROMA_MV(lmv) (((lmv) + CODECHAL_DECODE_VC1_RndTb[(lmv) & 3]) >> 1) |
| |
| //! |
| //! \def CODECHAL_DECODE_VC1_BITSTRM_BUF_LEN |
| //! Bitstream Buffer Length |
| //! |
| #define CODECHAL_DECODE_VC1_BITSTRM_BUF_LEN 8 |
| |
| //! |
| //! \def CODECHAL_DECODE_VC1_STUFFING_BYTES |
| //! |
| #define CODECHAL_DECODE_VC1_STUFFING_BYTES 64 |
| |
| //! |
| //! \def CODECHAL_DECODE_VC1_SC_PREFIX_LENGTH |
| //! Sc prefix lengith |
| //! |
| #define CODECHAL_DECODE_VC1_SC_PREFIX_LENGTH 3 |
| |
| //! |
| //! \struct CODECHAL_VC1_VLD_SLICE_RECORD |
| //! VC1 slice record |
| //! |
| typedef struct _CODECHAL_VC1_VLD_SLICE_RECORD |
| { |
| uint32_t dwSkip; |
| uint32_t dwOffset; |
| uint32_t dwLength; |
| uint32_t dwSliceYOffset; |
| uint32_t dwNextSliceYOffset; |
| } CODECHAL_VC1_VLD_SLICE_RECORD, *PCODECHAL_VC1_VLD_SLICE_RECORD; |
| |
| //! |
| //! \enum CODECHAL_DECODE_VC1_BINDING_TABLE_OFFSET_OLP |
| //! VC1 OLP Binding Table Offset |
| //! |
| typedef enum _CODECHAL_DECODE_VC1_BINDING_TABLE_OFFSET_OLP |
| { |
| CODECHAL_DECODE_VC1_OLP_SRC_Y = 0, |
| CODECHAL_DECODE_VC1_OLP_SRC_UV = 1, |
| CODECHAL_DECODE_VC1_OLP_DST_Y = 3, |
| CODECHAL_DECODE_VC1_OLP_DST_UV = 4, |
| CODECHAL_DECODE_VC1_OLP_NUM_SURFACES = 6 |
| }CODECHAL_DECODE_VC1_BINDING_TABLE_OFFSET_OLP; |
| |
| //! |
| //! \enum CODECHAL_DECODE_VC1_DMV_INDEX |
| //! VC1 DMV index |
| //! |
| typedef enum _CODECHAL_DECODE_VC1_DMV_INDEX |
| { |
| CODECHAL_DECODE_VC1_DMV_EVEN = 0, |
| CODECHAL_DECODE_VC1_DMV_ODD = 1, |
| CODECHAL_DECODE_VC1_DMV_MAX = 2 |
| }CODECHAL_DECODE_VC1_DMV_INDEX; |
| |
| //! |
| //! \struct _CODECHAL_DECODE_VC1_I_LUMA_BLOCKS |
| //! \brief Define Look Up Table Structure for Luma Polarity of Interlaced Picture |
| //! |
| typedef struct _CODECHAL_DECODE_VC1_I_LUMA_BLOCKS |
| { |
| uint8_t u8NumSamePolarity; |
| union |
| { |
| uint8_t u8Polarity; |
| uint8_t u8MvIndex0; |
| }; |
| uint8_t u8MvIndex1; |
| uint8_t u8MvIndex2; |
| uint8_t u8MvIndex3; |
| }CODECHAL_DECODE_VC1_I_LUMA_BLOCKS; |
| |
| //! |
| //! \struct _CODECHAL_DECODE_VC1_P_LUMA_BLOCKS |
| //! \brief Define Look Up Table for Luma Inter-coded Blocks of Progressive Picture |
| //! |
| typedef struct _CODECHAL_DECODE_VC1_P_LUMA_BLOCKS |
| { |
| uint8_t u8NumIntercodedBlocks; |
| uint8_t u8MvIndex1; |
| uint8_t u8MvIndex2; |
| uint8_t u8MvIndex3; |
| }CODECHAL_DECODE_VC1_P_LUMA_BLOCKS; |
| |
| //! |
| //! \struct _CODECHAL_DECODE_VC1_BITSTREAM |
| //! \brief Define variables for VC1 bitstream |
| //! |
| typedef struct _CODECHAL_DECODE_VC1_BITSTREAM |
| { |
| uint8_t* pOriginalBitBuffer; // pointer to the original capsuted bitstream |
| uint8_t* pOriginalBufferEnd; // pointer to the end of the original uncapsuted bitstream |
| uint32_t u32ZeroNum; // number of continuous zeros before the current bype. |
| uint32_t u32ProcessedBitNum; // number of bits being processed from initiation |
| uint8_t CacheBuffer[CODECHAL_DECODE_VC1_BITSTRM_BUF_LEN + 4]; // cache buffer of uncapsuted raw bitstream |
| uint32_t* pu32Cache; // pointer to the cache buffer |
| uint32_t* pu32CacheEnd; // pointer to the updating end of the cache buffer |
| uint32_t* pu32CacheDataEnd; // pointer to the last valid uint32_t of the cache buffer |
| int32_t iBitOffset; // offset = 32 is the MSB, offset = 1 is the LSB. |
| int32_t iBitOffsetEnd; // bit offset of the last valid uint32_t |
| bool bIsEBDU; // 1 if it is EBDU and emulation prevention bytes are present. |
| } CODECHAL_DECODE_VC1_BITSTREAM, *PCODECHAL_DECODE_VC1_BITSTREAM; |
| |
| //! |
| //! \struct _CODECHAL_DECODE_VC1_OLP_PARAMS |
| //! \brief Define variables of VC1 Olp params for hw cmd |
| //! |
| typedef struct _CODECHAL_DECODE_VC1_OLP_PARAMS |
| { |
| PMOS_COMMAND_BUFFER pCmdBuffer; |
| PMHW_PIPE_CONTROL_PARAMS pPipeControlParams; |
| PMHW_STATE_BASE_ADDR_PARAMS pStateBaseAddrParams; |
| PMHW_VFE_PARAMS pVfeParams; |
| PMHW_CURBE_LOAD_PARAMS pCurbeLoadParams; |
| PMHW_ID_LOAD_PARAMS pIdLoadParams; |
| }CODECHAL_DECODE_VC1_OLP_PARAMS, *PCODECHAL_DECODE_VC1_OLP_PARAMS; |
| |
| //! |
| //! \struct _CODECHAL_DECODE_VC1_OLP_STATIC_DATA |
| //! \brief Define VC1 OLP Static Data |
| //! |
| typedef struct _CODECHAL_DECODE_VC1_OLP_STATIC_DATA |
| { |
| // uint32_t 0 |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW0; |
| |
| // uint32_t 1 |
| union |
| { |
| struct |
| { |
| uint32_t BlockWidth : 16; // in byte |
| uint32_t BlockHeight : 16; // in byte |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW1; |
| |
| // uint32_t 2 |
| union |
| { |
| struct |
| { |
| uint32_t Profile : 1; |
| uint32_t RangeExpansionFlag : 1; // Simple & Main Profile only |
| uint32_t PictureUpsamplingFlag : 2; // 2:H, 3:V |
| uint32_t : 1; |
| uint32_t InterlaceFieldFlag : 1; |
| uint32_t : 2; |
| uint32_t RangeMapUV : 3; |
| uint32_t RangeMapUVFlag : 1; |
| uint32_t RangeMapY : 3; |
| uint32_t RangeMapYFlag : 1; |
| uint32_t : 4; |
| uint32_t ComponentFlag : 1; |
| uint32_t : 11; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW2; |
| |
| // uint32_t 3 |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW3; |
| |
| // uint32_t 4 |
| union |
| { |
| struct |
| { |
| uint32_t SourceDataBindingIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW4; |
| |
| // uint32_t 5 |
| union |
| { |
| struct |
| { |
| uint32_t DestDataBindingIndex; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW5; |
| |
| // uint32_t 6 |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW6; |
| |
| // uint32_t 7 |
| union |
| { |
| struct |
| { |
| uint32_t Reserved; |
| }; |
| struct |
| { |
| uint32_t Value; |
| }; |
| } DW7; |
| |
| } CODECHAL_DECODE_VC1_OLP_STATIC_DATA, *PCODECHAL_DECODE_VC1_OLP_STATIC_DATA; |
| |
| //! |
| //! \def CODECHAL_DECODE_VC1_CURBE_SIZE_OLP |
| //! VC1 Curbe Size for Olp |
| //! |
| #define CODECHAL_DECODE_VC1_CURBE_SIZE_OLP (sizeof(CODECHAL_DECODE_VC1_OLP_STATIC_DATA)) |
| |
| //! |
| //! \struct _CODECHAL_DECODE_VC1_KERNEL_HEADER_CM |
| //! \brief Define VC1 Kernel Header CM |
| //! |
| typedef struct _CODECHAL_DECODE_VC1_KERNEL_HEADER_CM { |
| int nKernelCount; |
| |
| CODECHAL_KERNEL_HEADER OLP; |
| CODECHAL_KERNEL_HEADER IC; |
| } CODECHAL_DECODE_VC1_KERNEL_HEADER_CM, *PCODECHAL_DECODE_VC1_KERNEL_HEADER_CM; |
| |
| //*------------------------------------------------------------------------------ |
| //* Codec Definitions |
| //*------------------------------------------------------------------------------ |
| |
| //! |
| //! \class CodechalDecodeVc1 |
| //! \brief This class defines the member fields, functions etc used by VC1 decoder. |
| //! |
| class CodechalDecodeVc1 : public CodechalDecode |
| { |
| public: |
| //! |
| //! \brief Constructor |
| //! \param [in] hwInterface |
| //! Hardware interface |
| //! \param [in] debugInterface |
| //! Debug interface |
| //! \param [in] standardInfo |
| //! The information of decode standard for this instance |
| //! |
| CodechalDecodeVc1( |
| CodechalHwInterface *hwInterface, |
| CodechalDebugInterface* debugInterface, |
| PCODECHAL_STANDARD_INFO standardInfo); |
| |
| //! |
| //! \brief Copy constructor |
| //! |
| CodechalDecodeVc1(const CodechalDecodeVc1&) = delete; |
| |
| //! |
| //! \brief Copy assignment operator |
| //! |
| CodechalDecodeVc1& operator=(const CodechalDecodeVc1&) = delete; |
| |
| //! |
| //! \brief Destructor |
| //! |
| ~CodechalDecodeVc1(); |
| |
| //! |
| //! \brief Allocate and initialize VC1 decoder standard |
| //! \param [in] settings |
| //! Pointer to CodechalSetting |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS AllocateStandard( |
| CodechalSetting * settings) override; |
| |
| //! |
| //! \brief Set states for each frame to prepare for VC1 decode |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS SetFrameStates() override; |
| |
| //! |
| //! \brief VC1 decoder state level function |
| //! \details State level function for VC1 decoder |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS DecodeStateLevel() override; |
| |
| //! |
| //! \brief VC1 decoder primitive level function |
| //! \details Primitive level function for GEN specific VC1 decoder |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS DecodePrimitiveLevel() override; |
| |
| MOS_STATUS InitMmcState() override; |
| |
| //! |
| //! \brief VC1 decoder primitive level function for VLD mode |
| //! \details Primitive level function for GEN specific VC1 decoder for VLD mode |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS DecodePrimitiveLevelVLD(); |
| |
| //! |
| //! \brief VC1 decoder primitive level function for IT mode |
| //! \details Primitive level function for GEN specific VC1 decoder for IT mode |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS DecodePrimitiveLevelIT(); |
| |
| // no downsampling |
| |
| //! |
| //! \brief Allocate resources for VC1 decoder |
| //! \details Allocate resources for VC1 decoder |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS AllocateResources(); |
| |
| //! |
| //! \brief Set GEN specific Curbe data for VC1 OLP |
| //! \details Configure Curbe data for VC1 OLP Y / UV component |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS SetCurbeOlp(); |
| |
| //! |
| //! \brief Update VC1 Kernel State |
| //! \details Get Decode Kernel and Update Kernel State |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS UpdateVc1KernelState(); |
| |
| virtual MOS_STATUS AddVc1OlpCmd( |
| PCODECHAL_DECODE_VC1_OLP_PARAMS vc1OlpParams); |
| |
| //! |
| //! \brief Return if Olp needed |
| //! \details Return value of member bOlpNeeded |
| //! \return bool |
| //! true if Olp needed, else false |
| //! |
| bool IsOlpNeeded() { return m_olpNeeded; }; |
| |
| PCODEC_VC1_PIC_PARAMS m_vc1PicParams = nullptr; //!< VC1 Picture Params |
| MOS_SURFACE m_destSurface; //!< Pointer to MOS_SURFACE of render surface |
| PMOS_RESOURCE m_presReferences[CODEC_MAX_NUM_REF_FRAME_NON_AVC]; //!< Reference Resources Handle list |
| bool m_deblockingEnabled = false; //!< Indicator of deblocking enabling |
| bool m_unequalFieldWaInUse = false; //!< Indicator of Unequal Field WA |
| |
| protected: |
| //! |
| //! \brief Construct VC1 decode bitstream buffer |
| //! \details For WaVC1ShortFormat. Construct VC1 decode bistream buffer by |
| // adding a stuffing byte ahead of frame bitstream data. It's for |
| // simple & main profile short format only. |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS ConstructBistreamBuffer(); |
| |
| //! |
| //! \brief Handle VC1 skipped frame |
| //! \details For skipped frame, use reference frame instead |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| virtual MOS_STATUS HandleSkipFrame(); |
| |
| //! |
| //! \brief Initialize Unequal Field Surface |
| //! \details Initialize Unequal Field Surface for VC1 decoder |
| //! \param [in] refListIdx |
| //! Index for pic in RefList |
| //! \param [in] nullHwInUse |
| //! Indicate if null HW is in use or not |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS InitializeUnequalFieldSurface( |
| uint8_t refListIdx, |
| bool nullHwInUse); |
| |
| //! |
| //! \brief Formats destination surface for VC1 decoder |
| //! \details Formats the destination surface, in the pack case the UV surface |
| // is moved to be adjacent to the UV surface such that NV12 |
| // formatting is maintained when the surface is returned to SW, |
| // in the unpack case the UV surface is moved to be 32 - pixel rows |
| // away from the Y surface so that during decoding HW will not |
| // overwrite the UV surface |
| //! \param [in] srcSurface |
| //! Source Surface |
| //! \param [in] dstSurface |
| //! Destiny Surface |
| //! \param [in] pack |
| //! Indicate pack case or unpack case |
| //! \param [in] nullHwInUse |
| //! Indicate if null HW is in use or not |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS FormatUnequalFieldPicture( |
| MOS_SURFACE srcSurface, |
| MOS_SURFACE dstSurface, |
| bool pack, |
| bool nullHwInUse); |
| |
| //! |
| //! \brief Parse Picture Header for VC1 decoder |
| //! \details Parse Picture Header in bitstream for VC1 decoder |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS ParsePictureHeader(); |
| |
| //! |
| //! \brief Parse Picture Header for VC1 decoder Advanced profile |
| //! \details Parse Picture Header in bitstream for VC1 decoder Advaced profile |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS ParsePictureHeaderAdvanced(); |
| |
| //! |
| //! \brief Parse Picture Header for VC1 decoder Simple profile |
| //! \details Parse Picture Header in bitstream for VC1 decoder Simple profile |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS ParsePictureHeaderMainSimple(); |
| |
| //! |
| //! \brief Initialise bitstream for VC1 decoder |
| //! \details Initialise members' value of bitstream struct for VC1 decoder |
| //! \param [in] buffer |
| //! Original bitstream buffer |
| //! \param [in] length |
| //! Original bitstream length |
| //! \param [in] isEBDU |
| //! Indicate if it is EBDU |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS InitialiseBitstream( |
| uint8_t* buffer, |
| uint32_t length, |
| bool isEBDU); |
| |
| //! |
| //! \brief Parse bitplane for VC1 decoder |
| //! \details Parse bitplane according to bitplane mode for VC1 decoder |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS ParseBitplane(); |
| |
| //! |
| //! \brief Parse bitplane in Norm2 Mode for VC1 decoder |
| //! \details Parse bitplane in Norm2 Mode for VC1 decoder |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS BitplaneNorm2Mode(); |
| |
| //! |
| //! \brief Parse bitplane in Norm6 Mode for VC1 decoder |
| //! \details Parse bitplane in Norm6 Mode for VC1 decoder |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS BitplaneNorm6Mode(); |
| |
| //! |
| //! \brief Parse bitplane in Rowskip Mode for VC1 decoder |
| //! \details Parse bitplane in Rowskip Mode for VC1 decoder |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS BitplaneRowskipMode(); |
| |
| //! |
| //! \brief Parse bitplane in Colskip Mode for VC1 decoder |
| //! \details Parse bitplane in Colskip Mode for VC1 decoder |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS BitplaneColskipMode(); |
| |
| //! |
| //! \brief Parse bitplane quantization for VC1 decoder |
| //! \details Parse bitplane quantization for VC1 decoder |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS ParseVopDquant(); |
| |
| //! |
| //! \brief Parse Mv Range for VC1 decoder |
| //! \details Parse Mv Range for VC1 decoder |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS ParseMvRange(); |
| |
| //! |
| //! \brief Parse Progressive Mv Mode for VC1 decoder |
| //! \details Parse Progressive Mv Mode for VC1 decoder |
| //! \param [in] mvModeTable[] |
| //! const MV Mode Table |
| //! \param [out] mvMode |
| //! pointer to Mv Mode |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS ParseProgressiveMvMode( |
| const uint32_t mvModeTable[], |
| uint32_t* mvMode); |
| |
| //! |
| //! \brief Parse Interlace Mv Mode for VC1 decoder |
| //! \details Parse Interlace Mv Mode for VC1 decoder |
| //! \param [in] isPPicture |
| //! indicate if it is P picture |
| //! \param [out] mvmode |
| //! pointer to Mv Mode |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS ParseInterlaceMVMode( |
| bool isPPicture, |
| uint32_t* mvmode); |
| |
| //! |
| //! \brief Parse I Picture Layer for VC1 decoder |
| //! \details Parse I Picture Layer for VC1 decoder advanced profile |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS ParsePictureLayerIAdvanced(); |
| |
| //! |
| //! \brief Parse P Picture Layer for VC1 decoder |
| //! \details Parse P Picture Layer for VC1 decoder advanced profile |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS ParsePictureLayerPAdvanced(); |
| |
| //! |
| //! \brief Parse B Picture Layer for VC1 decoder |
| //! \details Parse B Picture Layer for VC1 decoder advanced profile |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS ParsePictureLayerBAdvanced(); |
| |
| //! |
| //! \brief Parse P Field Picture Layer for VC1 decoder |
| //! \details Parse P Field Picture Layer for VC1 decoder advanced profile |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS ParseFieldPictureLayerPAdvanced(); |
| |
| //! |
| //! \brief Parse B Field Picture Layer for VC1 decoder |
| //! \details Parse B Field Picture Layer for VC1 decoder advanced profile |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS ParseFieldPictureLayerBAdvanced(); |
| |
| //! |
| //! \brief Get Macroblock Offset for VC1 decoder |
| //! \details Get Macroblock Offset for VC1 decoder slice params |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS GetSliceMbDataOffset(); |
| |
| //! |
| //! \brief Perform Olp for VC1 decoder |
| //! \details Perform Olp for VC1 decoder |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS PerformVc1Olp(); |
| |
| //! |
| //! \brief Initializes the VC1 OLP state |
| //! \details Initializes the VC1 OLP state based on parameters saved in InitInterface |
| //! command buffer or indirect state |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS InitKernelStateVc1Olp(); |
| |
| //! |
| //! \brief Pack Motion Vectors in Macro Block State |
| //! \param [in] vc1MbState |
| //! Pointer to Vc1 Macro Block State |
| //! \param [in] mv |
| //! Pointer to Motion Vector |
| //! \param [out] packedLumaMvs |
| //! Pointer to Packed Luma Motion Vectors |
| //! \param [out] packedChromaMv |
| //! Pointer to Packed Chroma Motion Vectors |
| //! \return void |
| //! |
| virtual void PackMotionVectors( |
| PMHW_VDBOX_VC1_MB_STATE vc1MbState, |
| int16_t *mv, |
| int16_t *packedLumaMvs, |
| int16_t *packedChromaMv); |
| |
| // Parameters passed by application |
| uint16_t m_picWidthInMb = 0; //!< Picture Width in MB width count |
| uint16_t m_picHeightInMb = 0; //!< Picture Height in MB height count |
| bool m_intelEntrypointInUse = false; //!< Indicator of using a Intel-specific entrypoint. |
| bool m_shortFormatInUse = false; //!< Short format slice data |
| bool m_vc1OddFrameHeight = false; //!< VC1 Odd Frame Height |
| uint32_t m_dataSize = 0; //!< Size of the data contained in presDataBuffer |
| uint32_t m_dataOffset = 0; //!< Offset of the data contained in presDataBuffer |
| uint32_t m_numSlices = 0; //!< [VLD mode] Number of slices to be decoded |
| uint32_t m_numMacroblocks = 0; //!< [IT mode] Number of MBs to be decoded |
| uint32_t m_numMacroblocksUv = 0; //!< [IT mode] Number of UV MBs to be decoded |
| PCODEC_VC1_SLICE_PARAMS m_vc1SliceParams = nullptr; //!< VC1 Slice Params |
| PCODEC_VC1_MB_PARAMS m_vc1MbParams = nullptr; //!< VC1 Macro Block Params |
| MOS_SURFACE m_deblockSurface; //!< Deblock Surface |
| MOS_RESOURCE m_resDataBuffer; //!< Handle of residual difference surface |
| MOS_RESOURCE m_resBitplaneBuffer; //!< Handle of Bitplane buffer |
| uint8_t * m_deblockDataBuffer = nullptr; //!< Pointer to the deblock data |
| |
| // Internally maintained |
| MOS_RESOURCE m_resMfdDeblockingFilterRowStoreScratchBuffer; //!< Handle of MFD Deblocking Filter Row Store Scratch data surface |
| MOS_RESOURCE m_resBsdMpcRowStoreScratchBuffer; //!< Handle of BSD/MPC Row Store Scratch data surface |
| MOS_RESOURCE m_resVc1BsdMvData[CODECHAL_DECODE_VC1_DMV_MAX]; //!< Handle of VC1 BSD MV Data |
| PCODECHAL_VC1_VLD_SLICE_RECORD m_vldSliceRecord = nullptr; //!< [VLD mode] Slice record |
| PCODEC_REF_LIST m_vc1RefList[CODECHAL_NUM_UNCOMPRESSED_SURFACE_VC1]; //!< VC1 Reference List |
| MOS_RESOURCE m_resSyncObject; //!< Handle of Sync Object |
| MOS_RESOURCE m_resPrivateBistreamBuffer; //!< Handle of Private Bistream Buffer |
| uint32_t m_privateBistreamBufferSize = 0; //!< Size of Private Bistream Buffer |
| CODECHAL_DECODE_VC1_BITSTREAM m_bitstream; //!< VC1 Bitstream |
| // PCODECHAL_DECODE_VC1_BITSTREAM pBitstream; //!< Pointer to Bitstream |
| |
| uint16_t m_prevAnchorPictureTff = 0; //!< Previous Anchor Picture Top Field First(TFF) |
| bool m_prevEvenAnchorPictureIsP = false; //!< Indicator of Previous Even Anchor Picture P frame |
| bool m_prevOddAnchorPictureIsP = false; //!< Indicator of Previous Odd Anchor Picture P frame |
| uint16_t m_referenceDistance = 0; //!< REFDIST. |
| |
| // OLP related |
| MHW_KERNEL_STATE m_olpKernelState; //!< Olp Kernel State |
| uint8_t * m_olpKernelBase = nullptr; //!< Pointer to Kernel Base Address |
| uint32_t m_olpKernelSize = 0; //!< Olp Kernel Size |
| bool m_olpNeeded = false; //!< Indicator if Olp Needed |
| uint16_t m_olpPicWidthInMb = 0; //!< Width of Olp Pic in Macro block |
| uint16_t m_olpPicHeightInMb = 0; //!< Height of Olp Pic in Macro block |
| uint32_t m_olpCurbeStaticDataLength = 0; //!< Olp Curbe Static Data Length |
| uint32_t m_olpDshSize = 0; //!< Olp DSH Size |
| |
| // IT mode related |
| MHW_BATCH_BUFFER m_itObjectBatchBuffer; //!< IT mode Object Batch Buffer |
| uint8_t m_fieldPolarity = 0; //!< Field Polarity Offset |
| |
| MOS_SURFACE m_unequalFieldSurface[CODECHAL_DECODE_VC1_UNEQUAL_FIELD_WA_SURFACES]; //!< Handle of Unequal Field Surface |
| uint8_t m_unequalFieldRefListIdx[CODECHAL_DECODE_VC1_UNEQUAL_FIELD_WA_SURFACES]; //!< Reference list of Unequal Field Surface |
| uint8_t m_unequalFieldSurfaceForBType = 0; //!< Unequal Field Surface Index for B frame |
| uint8_t m_currUnequalFieldSurface = 0; //!< Current Unequal Field Surface Index |
| |
| // HuC copy related |
| bool m_huCCopyInUse; //!< a sync flag used when huc copy and decoder run in the different VDBOX |
| MOS_RESOURCE m_resSyncObjectWaContextInUse; //!< signals on the video WA context |
| MOS_RESOURCE m_resSyncObjectVideoContextInUse; //!< signals on the video context |
| |
| private: |
| //! |
| //! \brief Wrapper function to read bits from VC1 bitstream |
| //! \param [in] bitsRead |
| //! Number of bits to be read |
| //! \param [out] value |
| //! VC1 bitstream status, EOS if reaching end of stream, else bitstream value |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS GetBits(uint32_t bitsRead, uint32_t &value); |
| |
| //! |
| //! \brief Wrapper function to get VLC from VC1 bitstream according to VLC Table |
| //! \param [in] table |
| //! Pointer to VLC Table |
| //! \param [out] value |
| //! VC1 bitstream status, EOS if reaching end of stream, else bitstream value |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS GetVLC(const uint32_t* table, uint32_t & value); |
| |
| //! |
| //! \brief Wrapper function to skip words from VC1 bitstream |
| //! \param [in] dwordNumber |
| //! Number of Dword to be skipped |
| //! \param [out] value |
| //! VC1 bitstream status, EOS if reaching end of stream, else bitstream value |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS SkipWords(uint32_t dwordNumber, uint32_t & value); |
| |
| //! |
| //! \brief Wrapper function to skip bits from VC1 bitstream |
| //! \param [in] bits |
| //! Number of bits to be skipped |
| //! \param [out] value |
| //! VC1 bitstream status, EOS if reaching end of stream, else bitstream value |
| //! \return MOS_STATUS |
| //! MOS_STATUS_SUCCESS if success, else fail reason |
| //! |
| MOS_STATUS SkipBits(uint32_t bits, uint32_t & value); |
| |
| //! |
| //! \brief Read bits from VC1 bitstream |
| //! \param [in] bitsRead |
| //! Number of bits to be read |
| //! \return uint32_t |
| //! EOS if reaching end of stream, else bitstream value |
| //! |
| uint32_t GetBits(uint32_t bitsRead); |
| |
| //! |
| //! \brief Update VC1 bitstream memeber value |
| //! \return uint32_t |
| //! EOS if reaching end of stream, else bitstream value |
| //! |
| uint32_t UpdateBitstreamBuffer(); |
| |
| //! |
| //! \brief Get VLC from VC1 bitstream according to VLC Table |
| //! \param [in] table |
| //! Pointer to VLC Table |
| //! \return uint32_t |
| //! EOS if reaching end of stream, else bitstream value |
| //! |
| uint32_t GetVLC(const uint32_t *table); |
| |
| //! |
| //! \brief Read bits from VC1 bitstream and don't update bitstream pointer |
| //! \param [in] bitsRead |
| //! Number of bits to be read |
| //! \return uint32_t |
| //! EOS if reaching end of stream, else bitstream value |
| //! |
| uint32_t PeekBits(uint32_t bitsRead); |
| |
| //! |
| //! \brief Skip bits from VC1 bitstream |
| //! \param [in] bits |
| //! Number of bits to be skipped |
| //! \return uint32_t |
| //! EOS if reaching end of stream, else bitstream value |
| //! |
| uint32_t SkipBits(uint32_t bitsRead); |
| |
| //! |
| //! \brief Pack Chroma/Luma Motion Vectors for Interlaced frame |
| //! \param [in] fieldSelect |
| //! Field Select Index |
| //! \param [in] currentField |
| //! Current Filed Indicator |
| //! \param [in] fastUVMotionCompensation |
| //! Fast UV Motion Compensation Indicator |
| //! \param [out] lmv |
| //! Pointer to Adjusted Luma Motion Vectors |
| //! \param [out] cmv |
| //! Pointer to Adjusted Chroma Motion Vectors |
| //! \return void |
| //! |
| uint8_t PackMotionVectorsChroma4MvI( |
| uint16_t fieldSelect, |
| uint16_t currentField, |
| bool fastUVMotionCompensation, |
| int16_t *lmv, |
| int16_t *cmv); |
| |
| //! |
| //! \brief Pack Chroma/Luma Motion Vectors for Picture frame |
| //! \param [in] intraFlags |
| //! Intra Flag Index |
| //! \param [out] lmv |
| //! Pointer to Adjusted Luma Motion Vectors |
| //! \param [out] cmv |
| //! Pointer to Adjusted Chroma Motion Vectors |
| //! \return void |
| //! |
| void PackMotionVectorsChroma4MvP(uint16_t intraFlags, int16_t *lmv, int16_t *cmv); |
| |
| //! |
| //! \brief Find Median for 3 MVs |
| //! \param [in] mv# |
| //! Motion Vectors |
| //! \return int16_t |
| //! return median for 3 MVs |
| //! |
| int16_t PackMotionVectorsMedian3(int16_t mv1, int16_t mv2, int16_t mv3); |
| //! |
| //! \brief Find Median for 4 MVs |
| //! \param [in] mv# |
| //! Motion Vectors |
| //! \return int16_t |
| //! return median for 4 MVs |
| //! |
| int16_t PackMotionVectorsMedian4(int16_t mv1, int16_t mv2, int16_t mv3, int16_t mv4); |
| |
| #if USE_CODECHAL_DEBUG_TOOL |
| MOS_STATUS DumpPicParams( |
| PCODEC_VC1_PIC_PARAMS vc1PicParams); |
| |
| MOS_STATUS DumpSliceParams( |
| PCODEC_VC1_SLICE_PARAMS sliceControl); |
| |
| MOS_STATUS DumpMbParams( |
| PCODEC_VC1_MB_PARAMS mbParams); |
| #endif |
| }; |
| |
| #endif // __CODECHAL_DECODER_VC1_H__ |