blob: ae7f7f4455d223902b26642ebf9a43fc37f8eb58 [file] [log] [blame]
/*
* Copyright (c) 2012-2020, 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_vp9.h
//! \brief Defines the decode interface extension for VP9.
//! \details Defines all types, macros, and functions required by CodecHal for VP9 decoding.
//! Definitions are not externally facing.
//!
#ifndef __CODECHAL_DECODE_VP9_H__
#define __CODECHAL_DECODE_VP9_H__
#include "codechal_decoder.h"
#include "codec_def_vp9_probs.h"
//!
//! \struct _CODECHAL_DECODE_VP9_PROB_UPDATE
//! \brief Define variables for VP9 decode probabilty updated
//!
typedef struct _CODECHAL_DECODE_VP9_PROB_UPDATE
{
int32_t bSegProbCopy; //!< seg tree and pred prob update with values from App.
int32_t bProbSave; //!< Save prob buffer
int32_t bProbRestore; //!< Restore prob buffer
int32_t bProbReset; //!< 1: reset; 0: not reset
int32_t bResetFull; //!< full reset or partial (section A) reset
int32_t bResetKeyDefault; //!< reset to key or inter default
uint8_t SegTreeProbs[7]; //!< Segment tree prob buffers
uint8_t SegPredProbs[3]; //!< Segment predict prob buffers
} CODECHAL_DECODE_VP9_PROB_UPDATE, *PCODECHAL_DECODE_VP9_PROB_UPDATE;
//!
//! \class CodechalDecodeVp9
//! \brief This class defines the member fields, functions etc used by VP9 decoder.
//!
class CodechalDecodeVp9 : 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
//!
CodechalDecodeVp9(
CodechalHwInterface *hwInterface,
CodechalDebugInterface* debugInterface,
PCODECHAL_STANDARD_INFO standardInfo);
//!
//! \brief Destructor
//!
~CodechalDecodeVp9();
//!
//! \brief Allocate and initialize VP9 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 VP9 decode
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetFrameStates () override;
//!
//! \brief VP9 decoder state level function
//! \details State level function for VP9 decoder
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS DecodeStateLevel () override;
//!
//! \brief VP9 decoder primitive level function
//! \details Primitive level function for GEN specific VP9 decoder
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS DecodePrimitiveLevel () override;
MOS_STATUS InitMmcState() override;
//!
//! \brief Init context buffer
//! \details
//! \param [in,out] ctxBuffer
//! Pointer to context buffer
//!
//! \param [in] setToKey
//! Specify if it's key frame
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ContextBufferInit(
uint8_t *ctxBuffer,
bool setToKey);
//!
//! \brief Populate prob values which are different between Key and Non-Key frame
//! \details
//! \param [in,out] ctxBuffer
//! Pointer to context buffer
//!
//! \param [in] setToKey
//! Specify if it's key frame
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS CtxBufDiffInit(
uint8_t *ctxBuffer,
bool setToKey);
//!
//! \brief Intialize VP9 decode mode
//! \details Do nothing for base class, will be overloaded by inheritted class for dynamic mode switch support
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitializeDecodeMode ();
//!
//! \brief Check and initialize SFC support and state
//! \details Check whether SFC can be used and initialize SFC if it is supported in VP9 decode
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitSfcState();
//!
//! \brief Allocate fixed sized resources
//! \details Allocate fixed sized resources VP9 decode driver
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AllocateResourcesFixedSizes();
//!
//! \brief Allocate variable sized resources
//! \details Allocate variable sized resources in VP9 decode driver
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AllocateResourcesVariableSizes();
//!
//! \brief Determine Decode Phase
//! \details Determine decode phase in VP9 decode
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS DetermineDecodePhase();
// Parameters passed by application
uint16_t m_usFrameWidthAlignedMinBlk; //!< Picture Width aligned to minBlock
uint16_t m_usFrameHeightAlignedMinBlk; //!< Picture Height aligned to minBlock
uint8_t m_vp9DepthIndicator; //!< Indicate it is 8/10/12 bit VP9
uint8_t m_chromaFormatinProfile; //!< Chroma format with current profilce
uint32_t m_dataSize; //!< Data size
uint32_t m_dataOffset; //!< Date offset
PCODEC_VP9_PIC_PARAMS m_vp9PicParams = nullptr; //!< Pointer to VP9 picture parameter
PCODEC_VP9_SEGMENT_PARAMS m_vp9SegmentParams = nullptr; //!< Pointer to VP9 segment parameter
PCODEC_VP9_SLICE_PARAMS m_vp9SliceParams = nullptr; //!< Pointer to VP9 slice parameter
MOS_SURFACE m_destSurface; //!< MOS_SURFACE of render surface
PMOS_RESOURCE m_presLastRefSurface = nullptr; //!< Pointer to last reference surface
PMOS_RESOURCE m_presGoldenRefSurface = nullptr; //!< Pointer to golden reference surface
PMOS_RESOURCE m_presAltRefSurface = nullptr; //!< Pointer to alternate reference surface
MOS_SURFACE m_lastRefSurface; //!< MOS_SURFACE of last reference surface
MOS_SURFACE m_goldenRefSurface; //!< MOS_SURFACE of golden reference surface
MOS_SURFACE m_altRefSurface; //!< MOS_SURFACE of alternate reference surface
MOS_RESOURCE m_resDataBuffer; //!< Handle of bitstream data surface
MOS_RESOURCE m_resCoefProbBuffer; //!< Handle of Coefficient Probability Data surface
// Internally maintained
uint8_t m_frameCtxIdx;
MOS_RESOURCE m_resDeblockingFilterLineRowStoreScratchBuffer; //!< Handle of Deblocking Filter Line Row Store Scratch data surface
MOS_RESOURCE m_resDeblockingFilterTileRowStoreScratchBuffer; //!< Handle of Deblocking Filter Tile Row Store Scratch data surface
MOS_RESOURCE m_resDeblockingFilterColumnRowStoreScratchBuffer; //!< Handle of Deblocking Filter Column Row Store Scratch data surface
MOS_RESOURCE m_resMetadataLineBuffer; //!< Handle of Metadata Line data buffer
MOS_RESOURCE m_resMetadataTileLineBuffer; //!< Handle of Metadata Tile Line data buffer
MOS_RESOURCE m_resMetadataTileColumnBuffer; //!< Handle of Metadata Tile Column data buffer
MOS_RESOURCE m_resHvcLineRowstoreBuffer; //!< Handle of HVC Line Row Store surface
MOS_RESOURCE m_resHvcTileRowstoreBuffer; //!< Handle of HVC Tile Row Store surface
MOS_RESOURCE m_resVp9ProbBuffer[CODEC_VP9_NUM_CONTEXTS + 1]; //!< Handle of VP9 Probability surface
MOS_RESOURCE m_resVp9SegmentIdBuffer; //!< Handle of VP9 Segment ID surface
MOS_RESOURCE m_resVp9MvTemporalBuffer[CODECHAL_VP9_NUM_MV_BUFFERS]; //!< Handle of VP9 MV Temporal buffer
PCODEC_REF_LIST m_vp9RefList[CODECHAL_NUM_UNCOMPRESSED_SURFACE_VP9]; //!< Pointer to reference list
MOS_RESOURCE m_resSyncObject; //!< Handle of synce object
uint8_t m_curMvTempBufIdx; //!< Current mv temporal buffer index
uint8_t m_colMvTempBufIdx; //!< Colocated mv temporal buffer index
MOS_RESOURCE m_resCopyDataBuffer; //!< Handle of buffer to store copy data
uint32_t m_copyDataBufferSize; //!< Buffer size of copy data
uint32_t m_copyDataOffset; //!< Data offset of copy data
bool m_copyDataBufferInUse; //!< Indicate if copy data buffer is in use
MOS_RESOURCE m_resSyncObjectWaContextInUse; //!< signals on the video WA context
MOS_RESOURCE m_resSyncObjectVideoContextInUse; //!< signals on the video contex
uint32_t m_hcpDecPhase; //!< Hcp Decode phase
union
{
struct
{
uint8_t KeyFrame : 1; //!< [0..1]
uint8_t IntraOnly : 1; //!< [0..1]
uint8_t Display : 1; //!< [0..1]
uint8_t ReservedField : 5; //!< [0]
} fields;
uint8_t value;
} m_prevFrameParams; //!< Previous frame parameters
uint32_t m_prevFrmWidth; //!< Frame width of the previous frame
uint32_t m_prevFrmHeight; //!< Frame height of the previous frame
uint32_t m_allocatedWidthInSb; //!< Frame width in super block
uint32_t m_allocatedHeightInSb; //!< Frame height in super block
uint32_t m_mvBufferSize; //!< MV buffer size
//for Internal buffer upating
bool m_resetSegIdBuffer; //!< if segment id buffer need to do reset
bool m_pendingResetPartial; //!< indicating if there is pending partial reset operation on prob buffer 0.
bool m_saveInterProbs; //!< indicating if inter probs is saved for prob buffer 0.
bool m_pendingResetFullTables[CODEC_VP9_NUM_CONTEXTS]; //!< indicating if there is pending full frame context table reset operation on each prob buffers except 0.
bool m_pendingCopySegProbs[CODEC_VP9_NUM_CONTEXTS]; //!< indicating if there is pending seg probs copy operation on each prob buffers.
uint8_t m_segTreeProbs[7]; //!< saved seg tree probs for pending seg probs copy operation to use
uint8_t m_segPredProbs[3]; //!< saved seg pred probs for pending seg probs copy operation to use
bool m_fullProbBufferUpdate; //!< indicating if prob buffer is a full buffer update
uint8_t m_interProbSaved[CODECHAL_VP9_INTER_PROB_SIZE]; //!< indicating if internal prob buffer saved
uint32_t m_dmemBufferSize; //!< Dmem buffer size
MOS_RESOURCE m_resDmemBuffer; //!< Handle of Dmem buffer
MOS_RESOURCE m_resInterProbSaveBuffer; //!< Handle of inter prob saved buffer
CODECHAL_DECODE_VP9_PROB_UPDATE m_probUpdateFlags; //!< Prob update flags
MOS_RESOURCE m_resSegmentIdBuffReset; //!< Handle of segment Id reset buffer
MOS_RESOURCE m_resHucSharedBuffer; //!< Handle of Huc shared buffer
protected:
//!
//! \struct CodechalDecodeVp9:: PIC_STATE_MHW_PARAMS
//! \brief Define MHW parameters for picture state
//!
typedef struct
{
PMHW_VDBOX_PIPE_MODE_SELECT_PARAMS PipeModeSelectParams;
PMHW_VDBOX_SURFACE_PARAMS SurfaceParams[4];
PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS PipeBufAddrParams;
PMHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS IndObjBaseAddrParams;
PMHW_VDBOX_VP9_PIC_STATE Vp9PicState;
PMHW_VDBOX_VP9_SEGMENT_STATE Vp9SegmentState;
} PIC_STATE_MHW_PARAMS;
PIC_STATE_MHW_PARAMS m_picMhwParams; //!< Picture state params
//!
//! \brief VP9 Prob buffer partial update with driver
//! \details using driver to do the parital prob buffer update
//! for clear decode
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ProbBufferPartialUpdatewithDrv();
//!
//! \brief VP9 Prob buffer full update with driver
//! \details full prob buffer udpate in clear decode
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ProbBufFullUpdatewithDrv();
//!
//! \brief VP9 Segment id buffer reset with driver
//! \details VP9 Segment id buffer reset with driver in clear decode
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ResetSegIdBufferwithDrv();
//!
//! \brief VP9 Prob buffer full update with Huc Streamout command
//! \details VP9 prob buffer full update with Huc Streamout
//! \param cmdBuffer
//! [in] command buffer to hold HW commands
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS ProbBufFullUpdatewithHucStreamout(
PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief VP9 Segment Id buffer reset with HucStreamout command
//! \details vp9 segment id buffer reset using Huc Streamout command
//! \param cmdBuffer
//! [in] command buffer to hold HW commands
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ResetSegIdBufferwithHucStreamout(
PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Determine the internal bufer update
//! \details Decide if vp9 prob buffer or segment id buffer need to do
//! update and what updat type it is
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS DetermineInternalBufferUpdate();
//!
//! \brief Initialize during begin frame
//! \details Initialize during begin frame in VP9 decode driver
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS InitializeBeginFrame();
//!
//! \brief Copy data surface
//! \details Copy data surface in VP9 decode driver
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS CopyDataSurface();
//!
//! \brief Check and copy bit stream
//! \details Check and copy bit stream in VP9 decode driver
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS CheckAndCopyBitStream();
//!
//! \brief Initialize picture state mhw parameters
//! \details Initialize picture state mhw parameters for VP9 decoder
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS InitPicStateMhwParams();
//!
//! \brief Add picture state mhw parameters
//! \details Add picture state mhw parameters to command buffer for VP9 decoder
//! \param [in] cmdBuffer
//! Command buffer to hold HW commands
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddPicStateMhwCmds(
PMOS_COMMAND_BUFFER cmdBuffer
);
//!
//! \brief Update picture state buffers
//! \details Update picture state buffers for VP9 decoder
//! \param [in] cmdBuffer
//! Command buffer to hold HW commands
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS UpdatePicStateBuffers(
PMOS_COMMAND_BUFFER cmdBuffer);
#if USE_CODECHAL_DEBUG_TOOL
MOS_STATUS DumpDecodePicParams(
PCODEC_VP9_PIC_PARAMS picParams);
MOS_STATUS DumpDecodeSegmentParams(
PCODEC_VP9_SEGMENT_PARAMS segmentParams);
#endif
};
#endif // __CODECHAL_DECODE_VP9_H__