blob: d4383e5ab3c1e9b3e11527ad3d2dcbc32b885904 [file] [log] [blame]
/*
* 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_avc.h
//! \brief Defines the decode interface extension for AVC.
//! \details Defines all types, macros, and functions required by CodecHal for AVC decoding.
//! Definitions are not externally facing.
//!
#ifndef __CODECHAL_DECODER_AVC_H__
#define __CODECHAL_DECODER_AVC_H__
#include "codechal.h"
#include "codechal_decoder.h"
#include "codechal_decode_sfc_avc.h"
//!
//! \def CODECHAL_DECODE_AVC_MONOPIC_CHROMA_DEFAULT
//! default chroma value for mono picture
//!
#define CODECHAL_DECODE_AVC_MONOPIC_CHROMA_DEFAULT 0x80
//!
//! \def CODECHAL_DECODE_AVC_INVALID_FRAME_IDX
//! invalid value for invalid frame index
//!
#define CODECHAL_DECODE_AVC_INVALID_FRAME_IDX 0xFF
//!
//! \def CODECHAL_DECODE_AVC_INVALID_REFPIC_VALUE
//! invalid value for invalid ref frame index
//!
#define CODECHAL_DECODE_AVC_INVALID_REFPIC_VALUE 0x80
//!
//! \def CODECHAL_DECODE_AVC_MAX_NUM_MVC_VIEWS
//! max mvc views
//!
#define CODECHAL_DECODE_AVC_MAX_NUM_MVC_VIEWS 16
typedef class CodechalDecodeAvc *PCODECHAL_DECODE_AVC_STATE;
//!
//! \class CodechalDecodeAvc
//! \brief This class defines the member fields, functions etc used by AVC decoder.
//!
class CodechalDecodeAvc : public CodechalDecode
{
public:
//!
//! \brief Define params for AVC picture decoding
//!
struct PIC_MHW_PARAMS
{
MHW_VDBOX_PIPE_MODE_SELECT_PARAMS PipeModeSelectParams;
MHW_VDBOX_SURFACE_PARAMS SurfaceParams;
MHW_VDBOX_PIPE_BUF_ADDR_PARAMS PipeBufAddrParams;
MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS IndObjBaseAddrParams;
MHW_VDBOX_BSP_BUF_BASE_ADDR_PARAMS BspBufBaseAddrParams;
MHW_VDBOX_QM_PARAMS QmParams;
MHW_VDBOX_PIC_ID_PARAMS PicIdParams;
MHW_VDBOX_AVC_IMG_PARAMS ImgParams;
MHW_VDBOX_AVC_DIRECTMODE_PARAMS AvcDirectmodeParams;
};
//!
//! \brief Constructor
//! \param [in] hwInterface
//! Hardware interface
//! \param [in] debugInterface
//! Debug interface
//! \param [in] standardInfo
//! The information of decode standard for this instance
//!
CodechalDecodeAvc(
CodechalHwInterface *hwInterface,
CodechalDebugInterface* debugInterface,
PCODECHAL_STANDARD_INFO standardInfo);
//!
//! \brief Copy constructor
//!
CodechalDecodeAvc(const CodechalDecodeAvc&) = delete;
//!
//! \brief Copy assignment operator
//!
CodechalDecodeAvc& operator=(const CodechalDecodeAvc&) = delete;
//!
//! \brief Destructor
//!
~CodechalDecodeAvc();
//!
//! \brief Allocate and initialize AVC 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 AVC decode
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetFrameStates() override;
//!
//! \brief AVC decoder state level function
//! \details State level function for AVC decoder
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS DecodeStateLevel() override;
//!
//! \brief AVC decoder primitive level function
//! \details Primitive level function for GEN specific AVC decoder
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS DecodePrimitiveLevel() override;
//!
//! \brief AVC decoder downsampling calc function
//! \details calc downsample param for GEN specific AVC decoder
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS CalcDownsamplingParams(
void *picParams,
uint32_t *refSurfWidth,
uint32_t *refSurfHeight,
MOS_FORMAT *format,
uint8_t *frameIdx) override;
//!
//! \brief Allocate fixed sized resources
//! \details Allocate fixed sized resources AVC decode driver
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateResourcesFixedSizes();
//!
//! \brief Allocate variable sized resources
//! \details Allocate variable sized resources in AVC decode driver
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateResourcesVariableSizes();
//!
//! \brief Allocate invalid ref buffer
//! \details Allocate invalid ref buffer in AVC decode driver
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateInvalidRefBuffer();
//!
//! \brief Set Picture Struct
//! \details Set Picture Struct in AVC decode driver
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetPictureStructs();
//!
//! \brief Set and Alloc Dmv Buffer
//! \details Set and Alloc Dmv Buffer in AVC decode driver
//!
//! \param [in] avcMVBufList
//! Pointer to MV Buf List
//! \param [in] usedForRef
//! indicate it is used for ref
//! \param [in] frameIdx
//! frame idx
//! \param [in] avcDmvBufferSize
//! Dmv Bufer Size
//! \param [out] dmvIdx
//! Dmv Index
//! \param [out] avcDmvBuffers
//! Dmv Buffers
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetAndAllocateDmvBufferIndex(
PCODEC_AVC_DMV_LIST avcMVBufList,
bool usedForRef,
uint8_t frameIdx,
uint32_t avcDmvBufferSize,
uint8_t *dmvIdx,
MOS_RESOURCE *avcDmvBuffers);
//!
//! \brief Init Mvc Dummy Dmv Buffer
//! \details Init Mvc Dummy Dmv Buffer in AVC decode driver
//!
//! \param [in] mvcWaDummyDmvBuf
//! Pointer to Mvc Wa Dummy Dmv Buf
//! \param [in] size
//! Dmv Bufer Size
//! \param [out] mvcDummyDmvBuffer
//! Pointer to Mvc Dummy Dmv Buffer Resource
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS InitMvcDummyDmvBuffer(
uint32_t *mvcWaDummyDmvBuf,
uint32_t size,
PMOS_RESOURCE mvcDummyDmvBuffer);
//!
//! \brief Initialize AVC picture HW parameters
//! \details Initialize picture parameters for GEN specific AVC decoder
//!
//! \param [in] picMhwParams
//! Pointer to PIC_MHW_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitPicMhwParams(
PIC_MHW_PARAMS *picMhwParams);
//!
//! \brief Add picture commands
//! \details Add picture commands for GEN specific AVC decoder
//!
//! \param [in] cmdBuf
//! Pointer to PMOS_COMMAND_BUFFER
//! \param [in] picMhwParams
//! Pointer to PIC_MHW_PARAMS
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AddPictureCmds(
PMOS_COMMAND_BUFFER cmdBuf,
PIC_MHW_PARAMS *picMhwParams);
//!
//! \brief Parse AVC slice parameters
//! \details Parse slice parameters for GEN specific AVC decoder
//!
//! \param [in] cmdBuf
//! Pointer to PMOS_COMMAND_BUFFER
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ParseSlice(
PMOS_COMMAND_BUFFER cmdBuf);
//!
//! \brief Send Slice Command
//! \details Send Slice Command in AVC decode driver
//!
//! \param [in] avcSliceState
//! Pointer to AVC Slice State
//! \param [out] cmdBuffer
//! Pointer to Command buffer
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendSlice(
PMHW_VDBOX_AVC_SLICE_STATE avcSliceState,
PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Constrcut Mono Picture
//! \details Constrcut Mono Picture in AVC decode driver, Write 0x80 in the chroma plane for Monochrome clips
//! \param [in] surface
//! Pointer to the decode output surface
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS FormatAvcMonoPicture(PMOS_SURFACE surface);
//!
//! \brief Set frame store Id for avc codec.
//! \details
//! \param [in] frameIdx
//! frame index
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetFrameStoreIds(uint8_t frameIdx);
MOS_STATUS InitMmcState() override;
//!
//! \brief Initialize Sfc state for AVC decode
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitSfcState();
#if USE_CODECHAL_DEBUG_TOOL
MOS_STATUS DumpMvcExtPicParams(
PCODEC_MVC_EXT_PIC_PARAMS mvcExtPicParams);
MOS_STATUS DumpPicParams(
PCODEC_AVC_PIC_PARAMS picParams);
MOS_STATUS DumpSliceParams(
PCODEC_AVC_SLICE_PARAMS sliceParams,
uint32_t numSlices);
MOS_STATUS DumpIQParams(
PCODEC_AVC_IQ_MATRIX_PARAMS matrixData);
#endif
protected:
//!
//! \brief Indicates whether or not the SFC is inuse
//! \return If SFC is inuse
//!
bool IsSfcInUse(CodechalSetting * codecHalSettings) override
{
return (codecHalSettings->downsamplingHinted && (MEDIA_IS_SKU(m_skuTable, FtrSFCPipe) && !MEDIA_IS_SKU(m_skuTable, FtrDisableVDBox2SFC)));
}
public:
// Parameters passed by application
uint16_t m_picWidthInMb; //!< Picture Width in MB
uint16_t m_picHeightInMb; //!< Picture Height in MB
uint16_t m_picWidthInMbLastMaxAlloced; //!< Max Picture Width in MB used for buffer allocation in past frames
uint16_t m_picHeightInMbLastMaxAlloced; //!< Max Picture Height in MB used for buffer allocation in past frames
uint32_t m_dataSize; //!< Data size
uint32_t m_dataOffset; //!< Date offset
uint32_t m_numSlices; //!< Num of slices
uint32_t m_avcDmvBufferSize; //!< DMV Buffer Size
uint8_t m_avcMvBufferIndex; //!< MV Buffer Index
uint16_t m_bsdMpcRowStoreScratchBufferPicWidthInMb; //!< Bsd Mpc RowStore Scratch Buffer Pic Width in MB
uint16_t m_mfdIntraRowStoreScratchBufferPicWidthInMb; //!< Mfd Intra RowStore Scratch Buffer Pic Width in MB
uint16_t m_mprRowStoreScratchBufferPicWidthInMb; //!< Mpr RowStore Scratch Buffer Pic Width in MB
uint8_t m_firstFieldIdxList[CODECHAL_DECODE_AVC_MAX_NUM_MVC_VIEWS]; //!< First Field Index List
uint32_t m_refSurfaceNum; //!< Number of reference frame surface
bool m_isSecondField; //!< Indicate it is second field
bool m_intelEntrypointInUse; //!< Indicate it is Intel-specific Format
bool m_shortFormatInUse; //!< Indicate it is Short Format
bool m_picIdRemappingInUse; //!< Indicate PicId Remapping are in use
bool m_deblockingEnabled; //!< Indicate Deblocking is enabled
bool m_fullFrameData; //!< Indicate it is a full frame
#ifdef _DECODE_PROCESSING_SUPPORTED
CodechalAvcSfcState *m_sfcState = nullptr; //!< Avc Sfc State
#endif
CODEC_PICTURE m_currPic; //!< Current Picture Struct
CODEC_AVC_FRAME_STORE_ID m_avcFrameStoreId[CODEC_AVC_MAX_NUM_REF_FRAME]; //!< Avc Frame Store ID
CODEC_AVC_DMV_LIST m_avcDmvList[CODEC_AVC_NUM_DMV_BUFFERS]; //!< Avc Dmv List
CODEC_PIC_ID m_avcPicIdx[CODEC_AVC_MAX_NUM_REF_FRAME]; //!< Avc Pic Index
PCODEC_REF_LIST m_avcRefList[CODEC_AVC_NUM_UNCOMPRESSED_SURFACE]; //!< Pointer to AVC Ref List
PCODEC_AVC_PIC_PARAMS m_avcPicParams; //!< Pointer to AVC picture parameter
PCODEC_MVC_EXT_PIC_PARAMS m_mvcExtPicParams; //!< Pointer to MVC ext picture parameter
PCODEC_AVC_SLICE_PARAMS m_avcSliceParams; //!< Pointer to AVC slice parameter
PCODEC_AVC_IQ_MATRIX_PARAMS m_avcIqMatrixParams; //!< Pointer to AVC IQ matrix parameter
PCODECHAL_VLD_SLICE_RECORD m_vldSliceRecord;
MOS_RESOURCE m_resDataBuffer; //!< Handle of Data Buffer
MOS_RESOURCE m_resMonoPictureChromaBuffer; //!< Handle of MonoPicture's default Chroma data surface
MOS_RESOURCE m_resMfdIntraRowStoreScratchBuffer; //!< Handle of MFD Intra Row Store Scratch data surface
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_resMprRowStoreScratchBuffer; //!< Handle of MPR Row Store Scratch data surface
MOS_RESOURCE m_resAvcDmvBuffers[CODEC_AVC_NUM_DMV_BUFFERS]; //!< Handle of Dmv Buffers
MOS_RESOURCE m_resInvalidRefBuffer; //!< Handle of Invalid Ref Buffer
MOS_RESOURCE m_resMvcDummyDmvBuffer[2]; //!< Handle of Mvc Dummy Dmv Buffer
MOS_SURFACE m_destSurface; //!< Handle of Dest data surface
PMOS_SURFACE m_refFrameSurface; //!< Handle of reference frame surface
PMOS_RESOURCE m_presReferences[CODEC_AVC_MAX_NUM_REF_FRAME]; //!< Pointer to Handle of Reference Frames
MOS_RESOURCE m_resSyncObjectWaContextInUse; //!< signals on the video WA context
MOS_RESOURCE m_resSyncObjectVideoContextInUse; //!< signals on the video context
};
#endif // __CODECHAL_DECODER_AVC_H__