blob: acd12e080b653729189d297556ad8e0cffd4ca52 [file]
/*
* Copyright (c) 2011-2023, 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_debug.h
//! \brief Defines the debug interface shared by codec only.
//! \details The debug interface dumps output from Media based on in input config file.
//!
#ifndef __CODEC_DEBUG_H__
#define __CODEC_DEBUG_H__
#include "media_debug_interface.h"
#include "codec_hw_next.h"
#include "encode_status_report.h"
#include "codechal_event_debug.h"
#include "codec_def_decode_avc.h"
#include "codec_def_decode_av1.h"
#include "codec_def_decode_jpeg.h"
#include "codec_def_decode_mpeg2.h"
#include "codec_def_decode_vp8.h"
static uint32_t DecodeFrameIndex = 0;
static uint32_t DecodeOutputIndex = 0;
#if USE_MEDIA_DEBUG_TOOL
#define USE_CODECHAL_DEBUG_TOOL 1
#define CODECHAL_DEBUG_TOOL(expr) expr;
typedef struct _CODECHAL_DBG_CFG CODECHAL_DBG_CFG, *PCODECHAL_DBG_CFG;
namespace CodechalDbgFieldType = MediaDbgFieldType;
namespace CodechalDbgExtType = MediaDbgExtType;
namespace CodechalDbgSurfaceType = MediaDbgSurfaceType;
namespace CodechalDbgBufferType = MediaDbgBufferType;
namespace CodechalDbgAttr = MediaDbgAttr;
#define __MEDIA_USER_FEATURE_VALUE_DECODE_SFC_RGBFORMAT_OUTPUT_DEBUG "Decode SFC RGB Format Output"
#define __MEDIA_USER_FEATURE_VALUE_DECODE_SFC_LINEAR_OUTPUT_DEBUG "Decode SFC Linear Output Debug"
#define __MEDIA_USER_FEATURE_ENABLE_HW_DEBUG_HOOKS_DEBUG "Enable Media Debug Hooks"
#define __MEDIA_USER_FEATURE_VALUE_CODECHAL_FRAME_NUMBER_TO_STOP_DEBUG "Decode Stop To Frame"
#define __MEDIA_USER_FEATURE_VALUE_CODECHAL_ENABLE_SW_CRC_DEBUG "Enable SW CRC"
//------------------------------------------------------------------------------
// Macros specific to MOS_CODEC_SUBCOMP_DEBUG sub-comp
//------------------------------------------------------------------------------
#define CODECHAL_DEBUG_ASSERT(_expr) \
MOS_ASSERT(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DEBUG, _expr)
#define CODECHAL_DEBUG_ASSERTMESSAGE(_message, ...) \
MOS_ASSERTMESSAGE(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DEBUG, _message, ##__VA_ARGS__)
#define CODECHAL_DEBUG_NORMALMESSAGE(_message, ...) \
MOS_NORMALMESSAGE(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DEBUG, _message, ##__VA_ARGS__)
#define CODECHAL_DEBUG_VERBOSEMESSAGE(_message, ...) \
MOS_VERBOSEMESSAGE(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DEBUG, _message, ##__VA_ARGS__)
#define CODECHAL_DEBUG_FUNCTION_ENTER \
MOS_FUNCTION_ENTER(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DEBUG)
#define CODECHAL_DEBUG_CHK_STATUS(_stmt) \
MOS_CHK_STATUS_RETURN(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DEBUG, _stmt)
#define CODECHAL_DEBUG_CHK_STATUS_MESSAGE(_stmt, _message, ...) \
MOS_CHK_STATUS_MESSAGE_RETURN(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DEBUG, _stmt, _message, ##__VA_ARGS__)
#define CODECHAL_DEBUG_CHK_NULL(_ptr) \
MOS_CHK_NULL_RETURN(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DEBUG, _ptr)
#define CODECHAL_DEBUG_CHK_NULL_NO_STATUS(_ptr) \
MOS_CHK_NULL_NO_STATUS_RETURN(MOS_COMPONENT_CODEC, MOS_CODEC_SUBCOMP_DEBUG, _ptr)
enum CodechalHucRegionDumpType
{
hucRegionDumpDefault = 0,
hucRegionDumpInit = 1,
hucRegionDumpUpdate = 2,
hucRegionDumpLAUpdate = 3,
hucRegionDumpRegionLocked = 4,
hucRegionDumpCmdInitializer = 5,
hucRegionDumpPakIntegrate = 6,
hucRegionDumpHpu = 7,
hucRegionDumpBackAnnotation = 8,
hucRegionDumpHpuSuperFrame = 9
};
typedef struct _CODECHAL_ME_OUTPUT_PARAMS
{
PMOS_SURFACE psMeMvBuffer;
PMOS_SURFACE psMeBrcDistortionBuffer;
PMOS_SURFACE psMeDistortionBuffer;
PMOS_RESOURCE pResVdenStreamInBuffer;
bool b16xMeInUse;
bool b32xMeInUse;
bool bVdencStreamInInUse;
} CODECHAL_ME_OUTPUT_PARAMS, *PCODECHAL_ME_OUTPUT_PARAMS;
std::ostream &operator<<(std::ostream &oss, const CODEC_AVC_PIC_PARAMS &cr);
std::ostream &operator<<(std::ostream &oss, const CODEC_AVC_SF_SLICE_PARAMS &cr);
std::ostream &operator<<(std::ostream &oss, const CODEC_AVC_SLICE_PARAMS &cr);
std::ostream &operator<<(std::ostream &oss, const CODEC_AVC_IQ_MATRIX_PARAMS &cr);
std::ostream &operator<<(std::ostream &oss, const CODEC_HEVC_PIC_PARAMS &cr);
std::ostream &operator<<(std::ostream &oss, const CODEC_HEVC_EXT_PIC_PARAMS &cr);
std::ostream &operator<<(std::ostream &oss, const CODEC_HEVC_SCC_PIC_PARAMS &cr);
std::ostream &operator<<(std::ostream &oss, const CODEC_HEVC_SF_SLICE_PARAMS &cr);
std::ostream &operator<<(std::ostream &oss, const CODEC_HEVC_SLICE_PARAMS &cr);
std::ostream &operator<<(std::ostream &oss, const CODEC_HEVC_EXT_SLICE_PARAMS &cr);
std::ostream &operator<<(std::ostream &oss, const CODECHAL_HEVC_IQ_MATRIX_PARAMS &cr);
std::ostream &operator<<(std::ostream &oss, const CODEC_HEVC_SUBSET_PARAMS &cr);
std::ostream &operator<<(std::ostream &oss, const CODEC_VP9_PIC_PARAMS &cr);
std::ostream &operator<<(std::ostream &oss, const CODEC_VP9_SLICE_PARAMS &cr);
std::ostream &operator<<(std::ostream &oss, const CODEC_VP9_SEGMENT_PARAMS &cr);
std::ostream &operator<<(std::ostream &oss, const CodecAv1PicParams &cr);
std::ostream &operator<<(std::ostream &oss, const CodecAv1TileParams &cr);
std::ostream &operator<<(std::ostream &oss, const CodecDecodeJpegPicParams &cr);
std::ostream &operator<<(std::ostream &oss, const CodecDecodeJpegScanParameter &cr);
std::ostream &operator<<(std::ostream &oss, const CODECHAL_DECODE_JPEG_HUFFMAN_TABLE &cr);
std::ostream &operator<<(std::ostream &oss, const CodecJpegQuantMatrix &cr);
std::ostream &operator<<(std::ostream &oss, const CodecDecodeMpeg2PicParams &cr);
std::ostream &operator<<(std::ostream &oss, const CodecDecodeMpeg2SliceParams &cr);
std::ostream &operator<<(std::ostream &oss, const CodecDecodeMpeg2MbParams &cr);
std::ostream &operator<<(std::ostream &oss, const CodecMpeg2IqMatrix &cr);
std::ostream &operator<<(std::ostream &oss, const CODEC_VP8_PIC_PARAMS &cr);
std::ostream &operator<<(std::ostream &oss, const CODEC_VP8_SLICE_PARAMS &cr);
std::ostream &operator<<(std::ostream &oss, const CODEC_VP8_IQ_MATRIX_PARAMS &cr);
void DumpDecodeAvcPicParams(PCODEC_AVC_PIC_PARAMS picParams, std::string fileName);
void DumpDecodeAvcSliceParams(PCODEC_AVC_SLICE_PARAMS sliceParams, uint32_t numSlices, std::string fileName, bool shortFormatInUse);
void DumpDecodeAvcIQParams(PCODEC_AVC_IQ_MATRIX_PARAMS iqParams, std::string fileName);
void DumpDecodeHevcPicParams(PCODEC_HEVC_PIC_PARAMS picParams, std::string fileName);
void DumpDecodeHevcExtPicParams(PCODEC_HEVC_EXT_PIC_PARAMS extPicParams, std::string fileName);
void DumpDecodeHevcSccPicParams(PCODEC_HEVC_SCC_PIC_PARAMS sccPicParams, std::string fileName);
void DumpDecodeHevcSliceParams(PCODEC_HEVC_SLICE_PARAMS sliceParams, uint32_t numSlices, std::string fileName, bool shortFormatInUse);
void DumpDecodeHevcExtSliceParams(PCODEC_HEVC_EXT_SLICE_PARAMS extSliceParams, uint32_t numSlices, std::string fileName);
void DumpDecodeHevcIQParams(PCODECHAL_HEVC_IQ_MATRIX_PARAMS iqParams, std::string fileName);
void DumpDecodeHevcSubsetParams(PCODEC_HEVC_SUBSET_PARAMS subsetsParams, std::string fileName);
void DumpDecodeVp9PicParams(PCODEC_VP9_PIC_PARAMS picParams, std::string fileName);
void DumpDecodeVp9SliceParams(PCODEC_VP9_SLICE_PARAMS slcParams, std::string fileName);
void DumpDecodeVp9SegmentParams(PCODEC_VP9_SEGMENT_PARAMS segmentParams, std::string fileName);
void DumpDecodeAv1PicParams(CodecAv1PicParams *picParams, std::string fileName);
void DumpDecodeAv1TileParams(CodecAv1TileParams *tileParams, uint32_t tileNum, std::string fileName);
void DumpDecodeJpegPicParams(CodecDecodeJpegPicParams *picParams, std::string fileName);
void DumpDecodeJpegScanParams(CodecDecodeJpegScanParameter *scanParams, std::string fileName);
void DumpDecodeJpegHuffmanParams(PCODECHAL_DECODE_JPEG_HUFFMAN_TABLE huffmanTable, std::string fileName);
void DumpDecodeJpegIqParams(CodecJpegQuantMatrix *iqParams, std::string fileName);
void DumpDecodeMpeg2PicParams(CodecDecodeMpeg2PicParams *picParams, std::string fileName);
void DumpDecodeMpeg2SliceParams(CodecDecodeMpeg2SliceParams *sliceParams, uint32_t numSlices, std::string fileName);
void DumpDecodeMpeg2MbParams(CodecDecodeMpeg2MbParams *mbParams, uint32_t numMbs, std::string fileName);
void DumpDecodeMpeg2IqParams(CodecMpeg2IqMatrix *iqParams, std::string fileName);
void DumpDecodeVp8PicParams(PCODEC_VP8_PIC_PARAMS picParams, std::string fileName);
void DumpDecodeVp8SliceParams(PCODEC_VP8_SLICE_PARAMS sliceParams, std::string fileName);
void DumpDecodeVp8IqParams(PCODEC_VP8_IQ_MATRIX_PARAMS iqParams, std::string fileName);
class MediaDebugInterface;
class CodechalHwInterface;
class CodechalDebugInterface : public MediaDebugInterface
{
public:
CodechalDebugInterface();
virtual ~CodechalDebugInterface();
static CodechalDebugInterface* Create();
virtual MOS_STATUS Initialize(
CodechalHwInterface *hwInterface,
CODECHAL_FUNCTION codecFunction,
MediaCopyWrapper *mediaCopyWrapper = nullptr);
virtual MOS_STATUS Initialize(
CodechalHwInterfaceNext *hwInterface,
CODECHAL_FUNCTION codecFunction,
MediaCopyWrapper *mediaCopyWrapper = nullptr);
virtual MOS_STATUS DumpHucDmem(
PMOS_RESOURCE dmemResource,
uint32_t dmemSize,
uint32_t hucPassNum,
CodechalHucRegionDumpType dumpType);
virtual MOS_STATUS DumpHucRegion(
PMOS_RESOURCE region,
uint32_t regionOffset,
uint32_t regionSize,
uint32_t regionNum,
const char * regionName,
bool inputBuffer,
uint32_t hucPassNum,
CodechalHucRegionDumpType dumpType);
MOS_STATUS DetectCorruptionSw(std::vector<MOS_RESOURCE>& vResource, PMOS_RESOURCE frameCntRes, uint8_t *buf, uint32_t &size, uint32_t frameNum);
MOS_STATUS DetectCorruptionHw(void *hwInterface, PMOS_RESOURCE frameCntRes, uint32_t curIdx, uint32_t frameCrcOffset, std::vector<MOS_RESOURCE> &vStatusBuffer, PMOS_COMMAND_BUFFER pCmdBuffer, uint32_t frameNum);
MOS_STATUS StoreNumFrame(PMHW_MI_INTERFACE pMiInterface, PMOS_RESOURCE pResource, int32_t frameNum, PMOS_COMMAND_BUFFER pCmdBuffer);
MOS_STATUS DumpEncodeStatusReport(
const struct EncodeStatusReport *report);
MOS_STATUS DumpEncodeStatusReport(
const struct encode::EncodeStatusReportData *report);
void CheckGoldenReferenceExist();
MOS_STATUS DumpRgbDataOnYUVSurface(
PMOS_SURFACE surface,
const char *attrName,
const char *surfName,
CODECHAL_MEDIA_STATE_TYPE mediaState = CODECHAL_NUM_MEDIA_STATES,
uint32_t width_in = 0,
uint32_t height_in = 0);
MOS_STATUS DumpBltOutput(
PMOS_SURFACE surface,
const char *attrName) override;
virtual MOS_STATUS InitializeUserSetting() override;
bool DumpIsEnabled(
const char * attr,
CODECHAL_MEDIA_STATE_TYPE mediaState = CODECHAL_NUM_MEDIA_STATES);
MOS_STATUS SetFastDumpConfig(MediaCopyWrapper *mediaCopyWrapper);
const char *CreateFileName(
const char *funcName,
const char *bufType,
const char *extType);
MOS_STATUS DumpStringStream(
std::stringstream& ss,
const char* bufferName,
const char* attrName);
virtual MOS_STATUS DumpCmdBuffer(
PMOS_COMMAND_BUFFER cmdBuffer,
CODECHAL_MEDIA_STATE_TYPE mediaState,
const char * cmdName = nullptr);
MOS_STATUS Dump2ndLvlBatch(
PMHW_BATCH_BUFFER batchBuffer,
CODECHAL_MEDIA_STATE_TYPE mediaState,
const char * batchName = nullptr);
MOS_STATUS DumpCurbe(
CODECHAL_MEDIA_STATE_TYPE mediaState,
PMHW_KERNEL_STATE kernelState);
MOS_STATUS DumpMDFCurbe(
CODECHAL_MEDIA_STATE_TYPE mediaState,
uint8_t * curbeBuffer,
uint32_t curbeSize);
MOS_STATUS DumpKernelRegion(
CODECHAL_MEDIA_STATE_TYPE mediaState,
MHW_STATE_HEAP_TYPE stateHeapType,
PMHW_KERNEL_STATE kernelState);
MOS_STATUS DumpYUVSurfaceToBuffer(PMOS_SURFACE surface, uint8_t *buffer, uint32_t &size);
MOS_STATUS DumpYUVSurface(
PMOS_SURFACE surface,
const char * attrName,
const char * surfName,
CODECHAL_MEDIA_STATE_TYPE mediaState = CODECHAL_NUM_MEDIA_STATES,
uint32_t width_in = 0,
uint32_t height_in = 0);
virtual MOS_STATUS DumpBuffer(
PMOS_RESOURCE resource,
const char * attrName,
const char * bufferName,
uint32_t size,
uint32_t offset = 0,
CODECHAL_MEDIA_STATE_TYPE mediaState = CODECHAL_NUM_MEDIA_STATES);
MOS_STATUS DumpSurface(
PMOS_SURFACE surface,
const char * attrName,
const char * surfaceName,
CODECHAL_MEDIA_STATE_TYPE mediaState = CODECHAL_NUM_MEDIA_STATES);
MOS_STATUS DumpData(
void *data,
uint32_t size,
const char *attrName,
const char *bufferName);
MOS_STATUS DumpSurfaceInfo(
PMOS_SURFACE surface,
const char* surfaceName);
CodechalHwInterface *m_hwInterface = nullptr;
CodechalHwInterfaceNext *m_hwInterfaceNext = nullptr;
CODECHAL_FUNCTION m_codecFunction = CODECHAL_FUNCTION_INVALID;
PCODECHAL_DBG_CFG m_dbgCfgHead = nullptr;
CODEC_PICTURE m_currPic = {};
protected:
std::string SetOutputPathKey() override;
std::string InitDefaultOutput() override;
uint8_t *m_decodeOutputBuf = nullptr;
PLATFORM m_platform = {};
std::function<
MOS_STATUS(
PMOS_SURFACE surface,
const char *attrName,
const char *surfName,
CODECHAL_MEDIA_STATE_TYPE mediaState,
uint32_t width_in,
uint32_t height_in)>
m_dumpYUVSurface;
std::function<
MOS_STATUS(
PMOS_SURFACE surface,
const char *attrName,
const char *surfName,
CODECHAL_MEDIA_STATE_TYPE mediaState,
uint32_t width_in,
uint32_t height_in)>
m_dumpYUVSurfaceLegacy;
std::function<
MOS_STATUS(
PMOS_RESOURCE resource,
const char *attrName,
const char *bufferName,
uint32_t size,
uint32_t offset,
CODECHAL_MEDIA_STATE_TYPE mediaState)>
m_dumpBuffer;
std::function<
MOS_STATUS(
PMOS_RESOURCE resource,
const char *attrName,
const char *bufferName,
uint32_t size,
uint32_t offset,
CODECHAL_MEDIA_STATE_TYPE mediaState)>
m_dumpBufferLegacy;
private:
MOS_STATUS VDBypassCopyResource(PMOS_RESOURCE src, PMOS_RESOURCE dst);
MOS_STATUS AllocateLinearResource(
MOS_GFXRES_TYPE eType,
uint32_t dwWidth,
uint32_t dwHeight,
MOS_FORMAT eFormat,
PMOS_RESOURCE pResource,
bool bSystemMem = false,
bool bLockable = false) const;
MOS_STATUS FillResourceMemory(
MOS_RESOURCE &sResource,
uint32_t uiSize,
uint8_t ucValue);
MEDIA_CLASS_DEFINE_END(CodechalDebugInterface)
};
#else
#define USE_CODECHAL_DEBUG_TOOL 0
#define CODECHAL_DEBUG_TOOL(expr) ;
#endif // USE_MEDIA_DEBUG_TOOL
#endif /* __MEDIA_DEBUG_H__ */