blob: 7df8bf16a47278e79959540ee5579f69e2c5b09f [file] [log] [blame]
/*
* Copyright (c) 2011-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_decoder.h
//! \brief Defines the decode interface for CodecHal.
//! \details The decode interface is further sub-divided by standard, this file is for the base interface which is shared by all decode standards.
//!
#ifndef __CODECHAL_DECODER_H__
#define __CODECHAL_DECODER_H__
#include "codechal.h"
#include "codechal_setting.h"
#include "codechal_hw.h"
#include "codechal_debug.h"
#include "codechal_decode_downsampling.h"
#include "codechal_decode_sfc.h"
#include "codechal_mmc.h"
#include "codechal_utilities.h"
#include "codec_def_decode.h"
#include "cm_wrapper.h"
#include "media_perf_profiler.h"
#include "codec_def_cenc_decode.h"
class CodechalSecureDecodeInterface;
class CodechalDecodeHistogram;
//------------------------------------------------------------------------------
// Macros specific to MOS_CODEC_SUBCOMP_DECODE sub-comp
//------------------------------------------------------------------------------
#define CODECHAL_DECODE_ASSERT(_expr) \
MOS_ASSERT(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DECODE, _expr)
#define CODECHAL_DECODE_COND_ASSERTMESSAGE(_expr, _message, ...) \
if (_expr) \
{ \
CODECHAL_DECODE_ASSERTMESSAGE(_message, ##__VA_ARGS__) \
}
#define CODECHAL_DECODE_ASSERTMESSAGE(_message, ...) \
MOS_ASSERTMESSAGE(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DECODE, _message, ##__VA_ARGS__)
#define CODECHAL_DECODE_NORMALMESSAGE(_message, ...) \
MOS_NORMALMESSAGE(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DECODE, _message, ##__VA_ARGS__)
#define CODECHAL_DECODE_VERBOSEMESSAGE(_message, ...) \
MOS_VERBOSEMESSAGE(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DECODE, _message, ##__VA_ARGS__)
#define CODECHAL_DECODE_FUNCTION_ENTER \
MOS_FUNCTION_ENTER(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DECODE)
#define CODECHAL_DECODE_CHK_STATUS(_stmt) \
MOS_CHK_STATUS(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DECODE, _stmt)
#define CODECHAL_DECODE_CHK_STATUS_RETURN(_stmt) \
MOS_CHK_STATUS_RETURN(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DECODE, _stmt)
#define CODECHAL_DECODE_CHK_STATUS_BREAK(_stmt) \
MOS_CHK_STATUS_BREAK(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DECODE, _stmt)
#define CODECHAL_DECODE_CHK_STATUS_MESSAGE(_stmt, _message, ...) \
MOS_CHK_STATUS_MESSAGE(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DECODE, _stmt, _message, ##__VA_ARGS__)
#define CODECHAL_DECODE_CHK_STATUS_MESSAGE_RETURN(_stmt, _message, ...) \
MOS_CHK_STATUS_MESSAGE_RETURN(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DECODE, _stmt, _message, ##__VA_ARGS__)
#define CODECHAL_DECODE_CHK_NULL(_ptr) \
MOS_CHK_NULL(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DECODE, _ptr)
#define CODECHAL_DECODE_CHK_NULL_RETURN(_ptr) \
MOS_CHK_NULL_RETURN(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DECODE, _ptr)
#define CODECHAL_DECODE_CHK_NULL_NO_STATUS(_ptr) \
MOS_CHK_NULL_NO_STATUS(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DECODE, _ptr)
#define CODECHAL_DECODE_CHK_NULL_NO_STATUS_RETURN(_ptr) \
MOS_CHK_NULL_NO_STATUS_RETURN(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DECODE, _ptr)
#define CODECHAL_DECODE_CHK_COND(_expr, _message, ...) \
MOS_CHK_COND(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DECODE,_expr,_message, ##__VA_ARGS__)
#define CODECHAL_DECODE_CHK_COND_RETURN(_expr, _message, ...) \
MOS_CHK_COND_RETURN(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DECODE,_expr,_message, ##__VA_ARGS__)
#define CODECHAL_DECODE_NUM_STREAM_OUT_BUFFERS 5
#define CODECHAL_DECODE_STATUS_NUM 512
typedef enum _CODECHAL_CS_ENGINE_ID_DEF
{
// Instance ID
CODECHAL_CS_INSTANCE_ID_VDBOX0 = 0,
CODECHAL_CS_INSTANCE_ID_VDBOX1 = 1,
CODECHAL_CS_INSTANCE_ID_VDBOX2 = 2,
CODECHAL_CS_INSTANCE_ID_VDBOX3 = 3,
CODECHAL_CS_INSTANCE_ID_VDBOX4 = 4,
CODECHAL_CS_INSTANCE_ID_VDBOX5 = 5,
CODECHAL_CS_INSTANCE_ID_VDBOX6 = 6,
CODECHAL_CS_INSTANCE_ID_VDBOX7 = 7,
CODECHAL_CS_INSTANCE_ID_MAX,
// Class ID
CODECHAL_CLASS_ID_VIDEO_ENGINE = 1,
} CODECHAL_CS_ENGINE_ID_DEF;
typedef union _CODECHAL_CS_ENGINE_ID
{
struct
{
uint32_t ClassId : 3; //[0...4]
uint32_t ReservedFiled1 : 1; //[0]
uint32_t InstanceId : 6; //[0...7]
uint32_t ReservedField2 : 22; //[0]
} fields;
uint32_t value;
} CODECHAL_CS_ENGINE_ID, *PCODECHAL_CS_ENGINE_ID;
typedef struct _CODECHAL_VLD_SLICE_RECORD
{
uint32_t dwSkip;
uint32_t dwOffset;
uint32_t dwLength;
uint32_t dwSliceStartMbOffset;
bool bIsLastSlice;
} CODECHAL_VLD_SLICE_RECORD, *PCODECHAL_VLD_SLICE_RECORD;
//!
//! \struct CodechalDecodeStatusReport
//! \brief Information pertaining to a particular picture's decode operation
//!
struct CodechalDecodeStatusReport
{
//! \brief Status for the picture associated with this status report
CODECHAL_STATUS m_codecStatus = CODECHAL_STATUS_SUCCESSFUL;
//! \brief Status report number associated with the picture in this status report provided in Execute()
uint32_t m_statusReportNumber = 0;
//! \brief Uncompressed frame information for the picture associated with this status report
CODEC_PICTURE m_currDecodedPic = {0};
//! \brief Applies for VC1 and MPEG2 only, uncompressed frame information for the out of loop deblock destination
CODEC_PICTURE m_currDeblockedPic = {0};
//! \brief Pointer to the resource for the decode render target for the picture associated with this status report
MOS_RESOURCE m_currDecodedPicRes = {0};
//! \brief Applies when debug dumps are enabled for VC1 only, resource of deblocked picture
MOS_RESOURCE m_deblockedPicResOlp = {0};
//! \brief number of MBs decoded or if unused set to 0xFFFF
uint16_t m_numMbsAffected = 0;
//! \brief Crc of frame from MMIO
uint32_t m_frameCrc = 0;
#if (_DEBUG || _RELEASE_INTERNAL)
//! \brief Applies when debug dumps are enabled, pointer to SFC output resource for the picture associated with this status report
PMOS_RESOURCE m_currSfcOutputPicRes = nullptr;
//! \brief Applies when debug dumps are enabled, stream out buffer
PMOS_RESOURCE m_streamOutBuf = nullptr;
//! \brief Applies when debug dumps are enabled, index of the streamout buffer
uint32_t m_streamoutIdx = 0;
//! \brief Applies when debug dumps are enabled, indicates whether or not this is the final field in the frame.
bool m_secondField = false;
//! \brief Applies to VC1 only, indicates whether or not the frame required OLP.
bool m_olpNeeded = false;
//! \brief Applies when debug dumps are enabled, frame type (I/P/B)
uint16_t m_frameType = 0;
#endif // (_DEBUG || _RELEASE_INTERNAL)
};
//!
//! \struct CodechalDecodeStatus
//! \brief Codechal decode status for the frame
//!
struct CodechalDecodeStatus
{
//! \brief Value stored by MFX engine
uint32_t m_hwStoredData = 0;
//! \brief SW(driver) stored value
uint32_t m_swStoredData = 0;
//! \brief Value of MMIO decoding effor eStatus register
uint32_t m_mmioErrorStatusReg = 0;
//! \brief Value of MMIO decoding MB error register
uint32_t m_mmioMBCountReg = 0;
//! \brief Frame CRC related to current frames
uint32_t m_mmioFrameCrcReg = 0;
//! \brief Value of MMIO CS Engine ID register for each BB
uint32_t m_mmioCsEngineIdReg[CODECHAL_CS_INSTANCE_ID_MAX] = {0};
//! \brief Huc error for HEVC Fix Function, DWORD0: mask value, DWORD1: reg value
uint64_t m_hucErrorStatus2 = 0;
//! \brief Huc error for HEVC Fix Function, DWORD0: mask value, DWORD1: reg value
uint64_t m_hucErrorStatus = 0;
CodechalDecodeStatusReport m_decodeStatusReport;
};
//!
//! \struct CodechalDecodeStatusBuffer
//! \brief Codechal decode status buffer
//!
struct CodechalDecodeStatusBuffer
{
//! \brief Codechal decode status
CodechalDecodeStatus *m_decodeStatus = nullptr;
//! \brief Handle of status buffer
MOS_RESOURCE m_statusBuffer = {0};
//! \brief Locked data point of status buffer
uint32_t *m_data = nullptr;
//! \brief Software store data
uint32_t m_swStoreData = 0;
//! \brief First index for status buffer
uint16_t m_firstIndex = 0;
//! \brief Current index for status buffer
uint16_t m_currIndex = 0;
//! \brief Offset to store data
uint8_t m_storeDataOffset = 0;
//! \brief Offset to decode error status
uint8_t m_decErrorStatusOffset = 0;
//! \brief Offset to decode frame CRC
uint8_t m_decFrameCrcOffset = 0;
//! \brief Offset to decode MB count
uint8_t m_decMBCountOffset = 0;
//! \brief Offset to CS engine ID
uint8_t m_csEngineIdOffset = 0;
//! \brief Offset to mask of MMIO HuCErrorStatus2
uint8_t m_hucErrorStatus2MaskOffset = 0;
//! \brief Offset to MMIO HuCErrorStatus2
uint8_t m_hucErrorStatus2RegOffset = 0;
//! \brief Offset to mask of MMIO HuCErrorStatus
uint8_t m_hucErrorStatusMaskOffset = 0;
//! \brief Offset to MMIO HuCErrorStatus
uint8_t m_hucErrorStatusRegOffset = 0;
};
//!
//! \class CodechalDecode
//! \brief This class defines the common member fields, functions etc as decode base class.
//!
class CodechalDecode : public Codechal
{
public:
//!
//! \enum CodechalHcpDecodePhase
//! \brief enum constant for HEVC/VP9 decode pass control
//!
enum CodechalHcpDecodePhase
{
CodechalHcpDecodePhaseInitialized = 0x00, //!< Initial phase
CodechalHcpDecodePhaseLegacyLong, //!< Legacy long format phase
CodechalHcpDecodePhaseLegacyS2L, //!< Legacy short to long phase
CodechalHcpDecodePhaseMax //!< Maximal phases
};
//!
//! \enum CodechalDecodeMotionType
//! \brief Codechal decode motion type
//!
enum CodechalDecodeMotionType
{
CodechalDecodeMcField = 1, //!< Field motion type
CodechalDecodeMcFrame = 2, //!< Frame motion type
CodechalDecodeMc16x8 = 2, //!< 16x8 motion type
CodechalDecodeMcDmv = 3 //!< DMV motion type
};
//!
//! \enum CodechalDecodeMvPacking
//! \brief For motion vector packing: the equivilant derefences of a [2][2][2] array mapped as a [8] array
//!
enum CodechalDecodeMvPacking
{
CodechalDecodeRstFirstForwHorz = 0, //!< first forward horizontal
CodechalDecodeRstFirstForwVert = 1, //!< first forward vertical
CodechalDecodeRstFirstBackHorz = 2, //!< first backward horizontal
CodechalDecodeRstFirstBackVert = 3, //!< first backward vertical
CodechalDecodeRstSecndForwHorz = 4, //!< second forward horizontal
CodechalDecodeRstSecndForwVert = 5, //!< second forward vertical
CodechalDecodeRstSecndBackHorz = 6, //!< second backward horizontal
CodechalDecodeRstSecndBackVert = 7 //!< second backward vertical
};
//!
//! \enum CodechalDecodeRefAddrIndex
//! \brief Reference address indexes
//!
enum CodechalDecodeRefAddrIndex
{
// MPEG2/VC1 reference address indexes
CodechalDecodeFwdRefTop = 0, //!< forward reference top field
CodechalDecodeBwdRefTop = 1, //!< backward reference top field
CodechalDecodeFwdRefBottom = 2, //!< forward reference bottom field
CodechalDecodeBwdRefBottom = 3, //!< backward reference bottom field
// VP8/VP9 reference address indexes
CodechalDecodeLastRef = 0, //!< last reference
CodechalDecodeGoldenRef = 1, //!< golden reference
CodechalDecodeAlternateRef = 2 //!< alternate reference
};
//!
//! \brief Constructor
//! \param [in] hwInterface
//! Hardware interface
//! \param [in] debugInterface
//! Debug interface
//! \param [in] standardInfo
//! The information of decode standard for this instance
//!
CodechalDecode(
CodechalHwInterface *hwInterface,
CodechalDebugInterface* debugInterface,
PCODECHAL_STANDARD_INFO standardInfo);
//!
//! \brief Copy constructor
//!
CodechalDecode(const CodechalDecode&) = delete;
//!
//! \brief Copy assignment operator
//!
CodechalDecode& operator=(const CodechalDecode&) = delete;
//!
//! \brief Destructor
//!
virtual ~CodechalDecode();
//!
//! \brief Get picture width for decode
//! \return Width value
//!
virtual uint32_t GetWidth() { return m_width; }
//!
//! \brief Get picture height for decode
//! \return Height value
//!
virtual uint32_t GetHeight() { return m_height; }
//!
//! \brief Help function to allocate a 1D linear buffer for each decode standard
//! \param [in,out] resource
//! Pointer to allocated buffer
//! \param [in] size
//! Buffer size
//! \param [in] name
//! Buffer name
//! \param [in] initialize
//! Initialization flag, by default is false
//! \param [in] value
//! Initialization value when intialize flag is true, by default is 0
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateBuffer(
PMOS_RESOURCE resource,
uint32_t size,
const char* name,
bool initialize = false,
uint8_t value = 0,
bool bPersistent = false);
//!
//! \brief Help function to allocate a NV12 TILE_Y surface
//! \details Help function to allocate a NV12 TILE_Y surface for each decode standard
//!
//! \param [in,out] surface
//! Pointer to allocated surface
//! \param [in] width
//! Surface width
//! \param [in] height
//! Surface height
//! \param [in] name
//! Surface name
//! \param [in] format
//! Surface format, by default is NV12
//! \param [in] isCompressible
//! Compressible flag, by default is false
MOS_STATUS AllocateSurface(
PMOS_SURFACE surface,
uint32_t width,
uint32_t height,
const char* name,
MOS_FORMAT format = Format_NV12,
bool isCompressible = false);
MOS_STATUS DestroySurface(PMOS_SURFACE surface);
//!
//! \brief Entry to allocate and intialize the decode instance
//! \param [in] codecHalSettings
//! The settings to inialize the decode instance
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS Allocate(CodechalSetting * codecHalSettings) override;
//!
//! \brief The handle at the end of each frame.
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS EndFrame() override;
//!
//! \brief The entry to decode each frame.
//! \param [in] params
//! Pointer to decode parameters of this frame
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS Execute(void *params) override;
//!
//! \brief Inserts the generic prologue command for a command buffer
//! \param [in] cmdBuffer
//! Command buffer
//! \param [in] frameTrackingRequested
//! frame Tracking Requested
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendPrologWithFrameTracking(
PMOS_COMMAND_BUFFER cmdBuffer,
bool frameTrackingRequested);
//!
//! \brief Inserts predication command for a command buffer
//! \param [in] cmdBuffer
//! Command buffer
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendPredicationCommand(
PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Inserts marker commands for a command buffer
//! \param [in] cmdBuffer
//! Command buffer
//! \param [in] isRender
//! Whether render engine workload or not
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SendMarkerCommand(
PMOS_COMMAND_BUFFER cmdBuffer,
bool isRender);
//!
//! \brief The entry to get status report.
//! \param [out] status
//! The point to decode status
//! \param [in] numStatus
//! The requested number of status reports
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS GetStatusReport(
void *status,
uint16_t numStatus) override;
//!
//! \brief Reset status report for GEN specific decoder
//! \param [in] nullHwInUse
//! Indicates whether or not null hardware is inuse
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS ResetStatusReport(
bool nullHwInUse);
//!
//! \brief Help function to copy resource
//! \details Help function to copy resource via Huc stream out function.
//! \param [out] cmdBuffer
//! Pointer to command buffer
//! \param [in] src
//! Pointer to source resource
//! \param [out] dst
//! Pointer to destination resource
//! \param [in] copyLength
//! The copy length starts from source offset
//! \param [in] copyInputOffset
//! The copy offset relative to source offset, by default is 0.
//! \param [in] copyOutputOffset
//! The output offset relative to destination offset, by default is 0.
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS HucCopy(
PMOS_COMMAND_BUFFER cmdBuffer,
PMOS_RESOURCE src,
PMOS_RESOURCE dst,
uint32_t copyLength,
uint32_t copyInputOffset = 0,
uint32_t copyOutputOffset = 0);
//!
//! \brief Gets the decode mode
//! \return The decode mode \see m_mode
//!
uint32_t GetMode() { return m_mode; }
//!
//! \brief Get the perf profiler pointer
//! \return The perf profiler \see m_perfProfiler
//!
MediaPerfProfiler *GetPerfProfiler()
{
return m_perfProfiler;
}
//!
//! \brief Gets the decode standard
//! \return The decode standard \see m_standard
//!
uint32_t GetStandard() { return m_standard; }
//!
//! \brief Gets video context
//! \return The video context \see m_videoContext
//!
MOS_GPU_CONTEXT GetVideoContext() { return m_videoContext; }
//!
//! \brief Sets video context
//! \return The video context \see m_videoContext
//!
void SetVideoContext(MOS_GPU_CONTEXT context) { m_videoContext = context; }
//!
//! \brief Gets video WA context
//! \return The video WA context \see m_videoContextForWa
//!
MOS_GPU_CONTEXT GetVideoWAContext() { return m_videoContextForWa; }
//!
//! \brief Sets cenc decoder batch buffer
//! \param [in] cmdBuffer
//! Pointer of command buffer.
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetCencBatchBuffer( PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Indicates whether or not the status query reporting is enabled
//! \return If status query reporting is enabled \see m_statusQueryReportingEnabled
//!
bool IsStatusQueryReportingEnabled() { return m_statusQueryReportingEnabled; }
//!
//! \brief Gets decode status buffer
//! \return The decode status buffer \see m_decodeStatusBuf
//!
CodechalDecodeStatusBuffer *GetDecodeStatusBuf() { return &m_decodeStatusBuf; }
//!
//! \brief Gets vdbox index
//! \return The vdbox index \see m_vdboxIndex
//!
MHW_VDBOX_NODE_IND GetVdboxIndex() { return m_vdboxIndex; }
//!
//! \brief Indicates whether or not the first execute call
//! \return If first execute call \see m_executeCallIndex
//!
inline bool IsFirstExecuteCall() { return (m_executeCallIndex == 0); }
//!
//! \brief Indicates whether or not the decoder is inuse
//! \return If decoder is inuse \see m_isHybridDecoder
//!
bool IsHybridDecoder() { return m_isHybridDecoder; }
//!
//! \brief Indicates whether or not the picture is incomplete
//! \return If picture is incomplete \see m_incompletePicture
//!
bool IsIncompletePicture() { return m_incompletePicture; }
//!
//! \brief Indicates whether or not the jpeg scan is incomplete
//! \return If jpeg scan is incomplete \see m_incompleteJpegScan
//!
virtual bool IsIncompleteJpegScan() { return false; }
//!
//! \brief Gets flags which indicates whether video context uses null hardware
//! \return Flags which indicates whether video context uses null hardware \see m_videoContextUsesNullHw
//!
bool GetVideoContextUsesNullHw() { return m_videoContextUsesNullHw; }
//!
//! \brief Gets flags which indicates whether video context for using null hardware
//! \return Flags which indicates whether video context for using null hardware \see m_videoContextForWaUsesNullHw
//!
bool GetVideoContextForWaUsesNullHw() { return m_videoContextForWaUsesNullHw; }
//!
//! \brief Gets flags which indicates whether render context uses null hardware
//! \return Flags which indicates whether render context uses null hardware \see m_renderContextUsesNullHw
//!
bool GetRenderContextUsesNullHw() { return m_renderContextUsesNullHw; }
//!
//! \brief Set decode histogram
//! \return No return
//!
void SetDecodeHistogram(CodechalDecodeHistogram *decodeHistogram) { m_decodeHistogram = decodeHistogram; }
//!
//! \brief Get decode histogram
//! \return Pointer of codechal decode histogram
//!
CodechalDecodeHistogram* GetDecodeHistogram() { return m_decodeHistogram; }
#ifdef _DECODE_PROCESSING_SUPPORTED
//!
//! \brief Indicates whether or not the vd sfc is supported
//! \return If vd sfc is supported \see m_vdSfcSupported
//!
bool IsVdSfcSupported() { return m_vdSfcSupported; }
//!
//! \brief Set if vd sfc supported
//! \return No return
//!
void SetVdSfcSupportedFlag(bool isVdSfcSpported) { m_vdSfcSupported = isVdSfcSpported; }
//! \brief Field scaling interface
FieldScalingInterface *m_fieldScalingInterface = nullptr;
#endif
//!
//! \brief Get dummy reference surface
//! \return Pointer of reference surface
//!
MOS_SURFACE* GetDummyReference() { return &m_dummyReference; }
//!
//! \brief Get dummy reference status
//! \return CODECHAL_DUMMY_REFERENCE_STATUS
//!
CODECHAL_DUMMY_REFERENCE_STATUS GetDummyReferenceStatus() { return m_dummyReferenceStatus; }
//!
//! \brief Set dummy reference status
//! \return void
//!
void SetDummyReferenceStatus(CODECHAL_DUMMY_REFERENCE_STATUS status)
{
m_dummyReferenceStatus = status;
}
//!
//! \brief Get mmc enable flag
//! \return bool
//!
bool IsDecoderMmcEnabled(){return m_mmc ? m_mmc->IsMmcEnabled() : false;}
protected:
//!
//! \brief Set up params for gpu context creation
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetGpuCtxCreatOption(CodechalSetting * settings);
//!
//! \brief Allocate and initialize GEN specific decoder standard
//! \param [in] settings
//! Pointer to CodechalSetting
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS AllocateStandard(CodechalSetting * settings) = 0;
//!
//! \brief Set states for each frame to prepare for decode
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetFrameStates() = 0;
//!
//! \brief State level function for standard specific decoder
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS DecodeStateLevel() = 0;
//!
//! \brief Primitive level function for GEN specific decoder
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS DecodePrimitiveLevel() = 0;
//!
//! \brief Calculate downsample param for GEN specific decoder
//! \param [in] picParams
//! Pointer to picture parameter
//! \param [in] refSurfWidth
//! Reference surface width
//! \param [in] refSurfHeight
//! Reference surface height
//! \param [in] format
//! Pointer to MOS_FORMAT
//! \param [in] frameIdx
//! Frame index
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS CalcDownsamplingParams(
void *picParams,
uint32_t *refSurfWidth,
uint32_t *refSurfHeight,
MOS_FORMAT *format,
uint8_t *frameIdx)
{
CODECHAL_DECODE_ASSERTMESSAGE("Unsupported Downsampling for current Codec !");
return MOS_STATUS_UNIMPLEMENTED;
}
//!
//! \brief Get decoder status for GEN specific hybird decoder
//! \param [in] decodeStatus
//! Decode status
//! \param [in] index
//! Index of status buffer
//! \param [in] defaultStatus
//! Default status
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS DecodeGetHybridStatus(
CodechalDecodeStatus *decodeStatus,
uint32_t index,
uint32_t defaultStatus)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Start status report for GEN specific decoder
//! \param [out] cmdBuffer
//! Pointer to command buffer
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS StartStatusReport(PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief End status report for GEN specific decoder
//! \param [in] decodeStatusReport
//! Decode status
//! \param [out] cmdBuffer
//! Pointer to command buffer
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS EndStatusReport(
CodechalDecodeStatusReport &decodeStatusReport,
PMOS_COMMAND_BUFFER cmdBuffer);
//!
//! \brief Initialize MMC state for specified decode device
//!
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS InitMmcState()
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Linear to Y tiled address
//!
//! \param [in] x
//! Position of X
//! \param [in] y
//! Position of Y
//! \param [in] pitch
//! Pitch
//! \return uint32_t
//! Return 0 if success, else -1 if fail
//!
uint32_t LinearToYTiledAddress(
uint32_t x,
uint32_t y,
uint32_t pitch);
#if USE_CODECHAL_DEBUG_TOOL
MOS_STATUS DumpProcessingParams(
DecodeProcessingParams *decProcParams);
#endif
private:
//!
//! \brief Calculate command buffer size needed for picture level and slice level commands
//! \param [out] requestedSize
//! Return command buffer size for picture level and slice level command
//! \param [out] additionalSizeNeeded
//! Return additianl size needed
//! \param [out] requestedPatchListSize
//! return patch list size used in this command buffer
//! \return None
//!
virtual void CalcRequestedSpace(
uint32_t &requestedSize,
uint32_t &additionalSizeNeeded,
uint32_t &requestedPatchListSize);
//!
//! \brief Verify command buffer size and patch list size, reallocate if required
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS VerifySpaceAvailable ();
//!
//! \brief Create GPU context for GEN specific decoder
//! \param [in] codecHalSettings
//! Pointer to CODECHAL Settings
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS CreateGpuContexts(
CodechalSetting * codecHalSettings);
//!
//! \brief Indicates whether or not the SFC is inuse
//! \param [in] codecHalSettings
//! Pointer to CODECHAL Settings
//! \return If SFC is inuse
//!
virtual bool IsSfcInUse(CodechalSetting * codecHalSettings) { return false; }
//!
//! \brief Indicates whether or not the frame level multiple thread is enable
//! \return If frame level multiple thread is enable
//!
virtual bool IsFrameMTEnabled() { return false; }
//!
//! \brief The virtual function for decode standard to override the requested space size
//! \param [in] requestedSize
//! The intial request size computed by picture level and slice level
//! \return The final requested space size
//!
virtual uint32_t RequestedSpaceSize(uint32_t requestedSize) { return requestedSize; }
//!
//! \brief The virtual function for decode standard to override the extra requested space size
//! \param [in] requestedSize
//! The intial request size computed by picture level and slice level
//! \param [in] additionalSizeNeeded
//! The additional request size for command buffer
//! \return The extra requested space size
//!
virtual MOS_STATUS VerifyExtraSpace(
uint32_t requestedSize,
uint32_t additionalSizeNeeded)
{
return MOS_STATUS_SUCCESS;
}
//!
//! \brief Allocate reference surfaces
//! \details Allocate reference surfaces for decode downsampling for all codec types
//! \param allocWidth
//! [in] Width of the surfaces to be allocated
//! \param allocHeight
//! [in] Height of the surfaces to be allocated
//! \param format
//! [in] Flag to indicate the format of the surfaces to be allocated
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS AllocateRefSurfaces(
uint32_t allocWidth,
uint32_t allocHeight,
MOS_FORMAT format);
bool isSyncFreeNeededForMMCSurface(PMOS_SURFACE surface);
//!
//! \brief Resize specific reference surfaces
//! \details Resize specific reference surfaces for decode downsampling for all codec types
//! \param frameIdx
//! [in] index of surfaces array
//! \param width
//! [in] Width of the surfaces to be allocated
//! \param height
//! [in] Height of the surfaces to be allocated
//! \param format
//! [in] Flag to indicate the format of the surfaces to be allocated
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS RefSurfacesResize(
uint32_t frameIdx,
uint32_t width,
uint32_t height,
MOS_FORMAT format);
//!
//! \brief Deallocate specific reference surfaces
//! \details Deallocate specific reference surfaces for decode downsampling for all codec types
//! \param frameIdx
//! [in] index of surfaces array
//! \return N/A
//!
void DeallocateSpecificRefSurfaces(uint32_t frameIdx);
//!
//! \brief Deallocate reference surfaces
//! \details Deallocate reference surfaces for decode downsampling for all codec types
//! \return N/A
//!
void DeallocateRefSurfaces();
//!
//! \brief Set dummy reference
//! \details Set dummy reference for error concealment
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetDummyReference();
protected:
//! \brief Mfx Interface
MhwVdboxMfxInterface *m_mfxInterface = nullptr;
//! \brief Hcp Interface
MhwVdboxHcpInterface *m_hcpInterface = nullptr;
//! \brief Huc Interface
MhwVdboxHucInterface *m_hucInterface = nullptr;
//! \brief Vdenc Interface
MhwVdboxVdencInterface *m_vdencInterface = nullptr;
//! \brief Common Mi Interface
MhwMiInterface *m_miInterface = nullptr;
//! \brief Cp Interface
MhwCpInterface *m_cpInterface = nullptr;
//! \brief Security Decode
CodechalSecureDecodeInterface *m_secureDecoder = nullptr;
//! \brief WA table
MEDIA_WA_TABLE *m_waTable = nullptr;
//! \brief SKU table
MEDIA_FEATURE_TABLE *m_skuTable = nullptr;
//!< mmc state
CodecHalMmcState *m_mmc = nullptr;
//! \brief Decode parameters
CodechalDecodeParams m_decodeParams;
//! \brief Decode mode
uint32_t m_mode = CODECHAL_UNSUPPORTED_MODE;
//! \brief Decode standard
uint32_t m_standard = CODECHAL_UNDEFINED;
//! \brief Current frame number
uint32_t m_frameNum = 0;
//! \brief Indicates if current field is second field
bool m_secondField = false;
//! \brief Indidates if fields are completed
uint32_t m_fullFieldsFrame = 0;
//! \brief picture information of current render target
CODEC_PICTURE m_crrPic = {0};
//! \brief Video GPU node inuse
MOS_GPU_NODE m_videoGpuNode = MOS_GPU_NODE_MAX;
//! \brief Video context inuse
MOS_GPU_CONTEXT m_videoContext = MOS_GPU_CONTEXT_INVALID_HANDLE;
//! \brief Video WA context inuse
MOS_GPU_CONTEXT m_videoContextForWa = MOS_GPU_CONTEXT_INVALID_HANDLE;
//! \brief Render context inuse
MOS_GPU_CONTEXT m_renderContext = MOS_GPU_CONTEXT_RENDER;
//! \brief Picture Width
uint32_t m_width = 0;
//! \brief Picture Height
uint32_t m_height = 0;
//! \brief Picture level command buffer size is required
uint32_t m_commandBufferSizeNeeded = 0;
//! \brief Picture level patch list size is required
uint32_t m_commandPatchListSizeNeeded = 0;
//! \brief Slice level command buffer size is required
uint32_t m_standardDecodeSizeNeeded = 0;
//! \brief Slice level patch list size is required
uint32_t m_standardDecodePatchListSizeNeeded = 0;
//! \brief Indicates if current input bitstream is incomplete
bool m_incompletePicture = false;
//! \brief The index of execution call in multiple execution call mode
bool m_executeCallIndex = 0;
//! \brief Indicates if current is frist execution call in multiple execution call mode
bool m_consecutiveMbErrorConcealmentInUse = false;
//! \brief Indicates if phantom MBs is required for MPEG2 decode
bool m_decodePhantomMbs = false;
//! \brief Flag to indicate if we support eStatus query reporting on current platform
bool m_statusQueryReportingEnabled = false;
//! \brief Flag to indicate if UMD Perf Profiler FE BE timing measurement is enabled
bool m_perfFEBETimingEnabled = false;
#ifdef _DECODE_PROCESSING_SUPPORTED
//! \brief Flag to indicate if vd sfc is supported
bool m_vdSfcSupported = false;
#endif
//! \brief Stores all the status_query related data
CodechalDecodeStatusBuffer m_decodeStatusBuf;
//! \brief The feedback number reported by app in picparams call
uint32_t m_statusReportFeedbackNumber = 0;
//! \brief Flag to indicate if report frame CRC
bool m_reportFrameCrc = false;
//! \brief Indicates if stream out enabled
bool m_streamOutEnabled = false;
//! \brief Stream out buffers
MOS_RESOURCE m_streamOutBuffer[CODECHAL_DECODE_NUM_STREAM_OUT_BUFFERS] = {{0}};
//! \brief Indicates if stream out buffer is inuse with same index
uint32_t m_streamOutCurrStatusIdx[CODECHAL_DECODE_NUM_STREAM_OUT_BUFFERS] = {CODECHAL_DECODE_STATUS_NUM};
//! \brief Current stream out buffer index
uint32_t m_streamOutCurrBufIdx = 0;
//! \brief Performance testing parameters
uint16_t m_perfType = 0;
//! \brief Indicates if video context uses null hardware
bool m_videoContextUsesNullHw = false;
//! \brief Indicates if video WA context uses null hardware
bool m_videoContextForWaUsesNullHw = false;
//! \brief Indicates if render context uses null hardware
bool m_renderContextUsesNullHw = false;
//! \brief Indicates if decode sync lock is disabled
bool m_disableDecodeSyncLock = false;
//! \brief Indicates if transcoe lock is disabled
bool m_disableLockForTranscode = false;
//! \brief Indicate how many passes is needed to finish decoding a picture
//! \details Initialize decode pass number to 1, for those decoder need more than 1 decoding pass,
//! modify this value in specific decoder files.
uint16_t m_decodePassNum = 1;
//! \brief MMIO Hcp Frame CRC report offset
uint32_t m_hcpFrameCrcRegOffset = 0;
//! \brief The vdbox index for current frame
MHW_VDBOX_NODE_IND m_vdboxIndex = MHW_VDBOX_NODE_1;
//! \brief Indicates if HCP is inuse
bool m_hcpInUse = false;
//! \brief Indicates if decoder is inuse
bool m_isHybridDecoder = false;
//! \brief Indicates if downsampling is required
bool m_downsamplingHinted = false;
//! \brief Reference surface for downsampling
PMOS_SURFACE m_refSurfaces = nullptr;
//! \brief Number of reference surface for downsampling
uint32_t m_refFrmCnt = 0;
//! \brief Internal buffer for predication
MOS_RESOURCE m_predicationBuffer = { 0 };
#if (_DEBUG || _RELEASE_INTERNAL)
//! \brief Downsampled surfaces
PMOS_SURFACE m_downsampledSurfaces = nullptr;
#endif
//! \brief Decode histogram interface
//! \details Support YUV Luma histogram.
CodechalDecodeHistogram *m_decodeHistogram = nullptr;
PMOS_GPUCTX_CREATOPTIONS m_gpuCtxCreatOpt = nullptr;
//! \brief Performance data profiler
MediaPerfProfiler *m_perfProfiler = nullptr;
// CencDecode buffer
CencDecodeShareBuf *m_cencBuf = nullptr;
//! \brief Dummy reference surface
MOS_SURFACE m_dummyReference;
//! \brief Indicate the status of dummy reference
CODECHAL_DUMMY_REFERENCE_STATUS m_dummyReferenceStatus = CODECHAL_DUMMY_REFERENCE_INVALID;
};
#endif // __CODECHAL_DECODER_H__