blob: 78ee794d86cbc034dada35473ca4883d4a498376 [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_debug.cpp
//! \brief Defines the debug interface shared by codec only.
//! \details The debug interface dumps output from Media based on in input config file.
//!
#include "codechal_debug.h"
#if USE_CODECHAL_DEBUG_TOOL
#include "codechal_debug_config_manager.h"
CodechalDebugInterface::CodechalDebugInterface()
{
memset(&m_currPic, 0, sizeof(CODEC_PICTURE));
memset(m_fileName, 0, sizeof(m_fileName));
memset(m_path, 0, sizeof(m_path));
}
CodechalDebugInterface::~CodechalDebugInterface()
{
if (nullptr != m_configMgr)
{
MOS_Delete(m_configMgr);
}
}
MOS_STATUS CodechalDebugInterface::Initialize(
CodechalHwInterface *hwInterface,
CODECHAL_FUNCTION codecFunction)
{
CODECHAL_DEBUG_FUNCTION_ENTER;
CODECHAL_DEBUG_CHK_NULL(hwInterface);
m_hwInterface = hwInterface;
m_codecFunction = codecFunction;
m_osInterface = m_hwInterface->GetOsInterface();
m_cpInterface = m_hwInterface->GetCpInterface();
m_miInterface = m_hwInterface->GetMiInterface();
//dump loctaion is codechaldump
MediaDebugInterface::SetOutputFilePath();
m_configMgr = MOS_New(CodecDebugConfigMgr, this, m_codecFunction, m_outputFilePath);
CODECHAL_DEBUG_CHK_NULL(m_configMgr);
CODECHAL_DEBUG_CHK_STATUS(m_configMgr->ParseConfig(m_osInterface->pOsContext));
MediaDebugInterface::InitDumpLocation();
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalDebugInterface::DumpHucDmem(
PMOS_RESOURCE dmemResource,
uint32_t dmemSize,
uint32_t hucPassNum,
CodechalHucRegionDumpType dumpType)
{
CODECHAL_DEBUG_FUNCTION_ENTER;
if (!m_configMgr->AttrIsEnabled(MediaDbgAttr::attrHuCDmem))
{
return MOS_STATUS_SUCCESS;
}
CODECHAL_DEBUG_CHK_NULL(dmemResource);
if (Mos_ResourceIsNull(dmemResource))
{
return MOS_STATUS_NULL_POINTER;
}
std::string funcName = "";
if (m_codecFunction == CODECHAL_FUNCTION_DECODE)
{
funcName = "DEC_";
}
else if (m_codecFunction == CODECHAL_FUNCTION_CENC_DECODE)
{
funcName = "DEC_Cenc_";
}
else
{
funcName = "ENC_";
}
std::string dmemName = MediaDbgBufferType::bufHucDmem;
std::string passName = std::to_string(hucPassNum);
switch (dumpType)
{
case hucRegionDumpInit:
funcName = funcName + dmemName + "_InitPass" + passName;
break;
case hucRegionDumpUpdate:
funcName = funcName + dmemName + "_UpdatePass" + passName;
break;
case hucRegionDumpRegionLocked:
funcName = funcName + dmemName + "_RegionLocked" + passName;
break;
case hucRegionDumpCmdInitializer:
funcName = funcName + dmemName + "_CmdInitializerPass" + passName;
break;
case hucRegionDumpPakIntegrate:
funcName = funcName + dmemName + "_PakIntPass" + passName;
break;
case hucRegionDumpHpu:
funcName = funcName + dmemName + "_HpuPass" + passName;
break;
case hucRegionDumpHpuSuperFrame:
funcName = funcName + dmemName + "_HpuPass" + passName + "_SuperFramePass";
break;
case hucRegionDumpBackAnnotation:
funcName = funcName + dmemName + "_BackAnnotationPass" + passName;
break;
default:
funcName = funcName + dmemName + "_Pass" + passName;
break;
}
return DumpBuffer(dmemResource, nullptr, funcName.c_str(), dmemSize);
}
MOS_USER_FEATURE_VALUE_ID CodechalDebugInterface::SetOutputPathKey()
{
return __MEDIA_USER_FEATURE_VALUE_CODECHAL_DEBUG_OUTPUT_DIRECTORY_ID;
}
MOS_USER_FEATURE_VALUE_ID CodechalDebugInterface::InitDefaultOutput()
{
m_outputFilePath.append(MEDIA_DEBUG_CODECHAL_DUMP_OUTPUT_FOLDER);
return SetOutputPathKey();
}
MOS_STATUS CodechalDebugInterface::DumpHucRegion(
PMOS_RESOURCE region,
uint32_t regionOffset,
uint32_t regionSize,
uint32_t regionNum,
const char * regionName,
bool inputBuffer,
uint32_t hucPassNum,
CodechalHucRegionDumpType dumpType)
{
CODECHAL_DEBUG_FUNCTION_ENTER;
if (!m_configMgr->AttrIsEnabled(MediaDbgAttr::attrHucRegions))
{
return MOS_STATUS_SUCCESS;
}
CODECHAL_DEBUG_ASSERT(regionNum < 16);
CODECHAL_DEBUG_CHK_NULL(region);
if (Mos_ResourceIsNull(region))
{
return MOS_STATUS_NULL_POINTER;
}
std::string funcName = "";
if (m_codecFunction == CODECHAL_FUNCTION_DECODE)
{
funcName = "DEC_";
}
else if (m_codecFunction == CODECHAL_FUNCTION_CENC_DECODE)
{
funcName = "DEC_CENC_";
}
else
{
funcName = "ENC_";
}
std::string bufName = MediaDbgBufferType::bufHucRegion;
std::string inputName = (inputBuffer) ? "Input_" : "Output_";
std::string regionNumName = std::to_string(regionNum);
std::string passName = std::to_string(hucPassNum);
switch (dumpType)
{
case hucRegionDumpInit:
funcName = funcName + inputName + bufName + regionNumName + regionName + "_InitPass" + passName;
break;
case hucRegionDumpUpdate:
funcName = funcName + inputName + bufName + regionNumName + regionName + "_UpdatePass" + passName;
break;
case hucRegionDumpRegionLocked:
funcName = funcName + inputName + bufName + regionNumName + regionName + "_RegionLockedPass" + passName;
break;
case hucRegionDumpCmdInitializer:
funcName = funcName + inputName + bufName + regionNumName + regionName + "_CmdInitializerPass" + passName;
break;
case hucRegionDumpPakIntegrate:
funcName = funcName + inputName + bufName + regionNumName + regionName + "_PakIntPass" + passName;
break;
case hucRegionDumpHpu:
funcName = funcName + inputName + bufName + regionNumName + regionName + "_HpuPass" + passName;
break;
case hucRegionDumpBackAnnotation:
funcName = funcName + inputName + bufName + regionNumName + regionName + "_BackAnnotationPass" + passName;
break;
default:
funcName = funcName + inputName + bufName + regionNumName + regionName + "_Pass" + passName;
break;
}
return DumpBuffer(region, nullptr, funcName.c_str(), regionSize, regionOffset);
}
#define FIELD_TO_OFS(type, name) \
ofs << #name << ": " << (int64_t) * ((type *)report) << std::endl; \
report += sizeof(type) / sizeof(uint8_t);
#define POINTER_TO_OFS(type, name) \
ofs << #name << ": " << (void *)report << std::endl; \
report += sizeof(void *) / sizeof(uint8_t);
MOS_STATUS CodechalDebugInterface::DumpEncodeStatusReport(uint8_t *report)
{
CODECHAL_DEBUG_FUNCTION_ENTER;
CODECHAL_DEBUG_CHK_NULL(report);
const char *bufferName = "EncodeStatusReport_Parsed";
const char *attrName = MediaDbgAttr::attrStatusReport;
if (!m_configMgr->AttrIsEnabled(attrName))
{
return MOS_STATUS_SUCCESS;
}
const char * filePath = CreateFileName(bufferName, attrName, MediaDbgExtType::txt);
std::ofstream ofs(filePath);
if (ofs.fail())
{
return MOS_STATUS_UNKNOWN;
}
FIELD_TO_OFS(CODECHAL_STATUS, CodecStatus);
FIELD_TO_OFS(uint32_t, StatusReportNumber);
FIELD_TO_OFS(uint32_t, CurrOriginalPic.FrameIdx);
FIELD_TO_OFS(CODEC_PICTURE_FLAG, CurrOriginalPic.PicFlags);
FIELD_TO_OFS(uint32_t, CurrOriginalPic.PicEntry);
FIELD_TO_OFS(uint32_t, Func);
POINTER_TO_OFS(PCODEC_REF_LIST, pCurrRefList);
ofs << std::endl;
FIELD_TO_OFS(bool, bSequential);
FIELD_TO_OFS(uint32_t, bitstreamSize);
FIELD_TO_OFS(int8_t, QpY);
FIELD_TO_OFS(int8_t, SuggestedQpYDelta);
FIELD_TO_OFS(uint8_t, NumberPasses);
FIELD_TO_OFS(uint8_t, AverageQp);
FIELD_TO_OFS(uint64_t, HWCounterValue.IV);
FIELD_TO_OFS(uint64_t, HWCounterValue.Count);
POINTER_TO_OFS(uint64_t *, hwctr);
FIELD_TO_OFS(uint32_t, QueryStatusFlags);
ofs << std::endl;
FIELD_TO_OFS(uint32_t, MAD);
FIELD_TO_OFS(uint32_t, loopFilterLevel);
FIELD_TO_OFS(int8_t, LongTermIndication);
FIELD_TO_OFS(uint16_t, NextFrameWidthMinus1);
FIELD_TO_OFS(uint16_t, NextFrameHeightMinus1);
FIELD_TO_OFS(uint8_t, NumberSlices);
FIELD_TO_OFS(uint16_t, PSNRx100[0]);
FIELD_TO_OFS(uint16_t, PSNRx100[1]);
FIELD_TO_OFS(uint16_t, PSNRx100[2]);
FIELD_TO_OFS(uint32_t, NumberTilesInFrame);
FIELD_TO_OFS(uint8_t, UsedVdBoxNumber);
FIELD_TO_OFS(uint32_t, SizeOfSliceSizesBuffer);
POINTER_TO_OFS(uint16_t *, pSliceSizes);
FIELD_TO_OFS(uint32_t, SizeOfTileInfoBuffer);
POINTER_TO_OFS(void *, pHEVCTileinfo);
FIELD_TO_OFS(uint32_t, NumTileReported);
ofs << std::endl;
FIELD_TO_OFS(uint32_t, StreamId);
POINTER_TO_OFS(void *, pLookaheadStatus);
ofs.close();
return MOS_STATUS_SUCCESS;
}
#undef FIELD_TO_OFS
#undef POINTER_TO_OFS
#endif // USE_CODECHAL_DEBUG_TOOL