blob: 35ac31d6eee433c85272f84806664d69f93379d8 [file] [log] [blame]
/*
* Copyright (c) 2017-2019, 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_hevc_g12.cpp
//! \brief Implements the decode interface extension for HEVC.
//! \details Implements all functions required by CodecHal for HEVC decoding.
//!
#include "codechal_decoder.h"
#include "codechal_secure_decode_interface.h"
#include "codechal_decode_hevc_g12.h"
#include "codechal_decode_hevc_long_g12.h"
#include "codechal_decode_sfc_hevc_g12.h"
#include "mhw_vdbox_hcp_g12_X.h"
#include "mhw_vdbox_mfx_g12_X.h"
#include "mhw_vdbox_g12_X.h"
#include "mhw_mi_g12_X.h"
#include "codechal_mmc_decode_hevc_g12.h"
#include "codechal_hw_g12_X.h"
#include "media_user_settings_mgr_g12.h"
#include "codechal_decode_histogram.h"
#include "codechal_debug.h"
#include "hal_oca_interface.h"
//==<Functions>=======================================================
MOS_STATUS CodechalDecodeHevcG12::AllocateResourcesVariableSizes ()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_DECODE_FUNCTION_ENTER;
uint8_t maxBitDepth = (m_is12BitHevc) ? 12: ((m_is10BitHevc) ? 10 : 8);
uint8_t chromaFormatPic = m_hevcPicParams->chroma_format_idc;
uint8_t chromaFormat = m_chromaFormatinProfile;
CODECHAL_DECODE_ASSERT(chromaFormat >= chromaFormatPic);
uint32_t widthMax = MOS_MAX(m_width, m_widthLastMaxAlloced);
uint32_t heightMax = MOS_MAX(m_height, m_heightLastMaxAlloced);
uint32_t frameSizeMax = MOS_MAX((m_copyDataBufferInUse ? m_copyDataBufferSize : m_dataSize), m_frameSizeMaxAlloced);
uint32_t ctbLog2SizeYPic = m_hevcPicParams->log2_diff_max_min_luma_coding_block_size +
m_hevcPicParams->log2_min_luma_coding_block_size_minus3 + 3;
uint32_t ctbLog2SizeY = MOS_MAX(ctbLog2SizeYPic, m_ctbLog2SizeYMax);
//for Scalability
if (CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState))
{
MHW_VDBOX_HCP_BUFFER_REALLOC_PARAMS reallocParam;
MOS_ZeroMemory(&reallocParam, sizeof(reallocParam));
reallocParam.ucMaxBitDepth = maxBitDepth;
reallocParam.ucChromaFormat = chromaFormat;
reallocParam.dwCtbLog2SizeY = ctbLog2SizeY;
reallocParam.dwCtbLog2SizeYMax = m_ctbLog2SizeYMax;
reallocParam.dwPicWidth = widthMax;
reallocParam.dwPicWidthAlloced = m_widthLastMaxAlloced;
reallocParam.dwPicHeight = heightMax;
reallocParam.dwPicHeightAlloced = m_heightLastMaxAlloced;
reallocParam.dwFrameSize = frameSizeMax;
reallocParam.dwFrameSizeAlloced = m_frameSizeMaxAlloced;
MHW_VDBOX_HCP_BUFFER_SIZE_PARAMS hcpBufSizeParam;
MOS_ZeroMemory(&hcpBufSizeParam, sizeof(hcpBufSizeParam));
hcpBufSizeParam.ucMaxBitDepth = maxBitDepth;
hcpBufSizeParam.ucChromaFormat = chromaFormat;
hcpBufSizeParam.dwCtbLog2SizeY = ctbLog2SizeY;
hcpBufSizeParam.dwPicWidth = widthMax;
hcpBufSizeParam.dwPicHeight = heightMax;
hcpBufSizeParam.dwMaxFrameSize = frameSizeMax;
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_AllocateResources_VariableSizes_G12(
m_scalabilityState,
&hcpBufSizeParam,
&reallocParam));
m_frameSizeMaxAlloced = frameSizeMax;
}
if (CodecHalDecodeIsSCCIBCMode(m_hevcSccPicParams))
{
bool isNeedBiggerSize = (widthMax > m_widthLastMaxAlloced) || (heightMax > m_heightLastMaxAlloced);
bool isResourceNull = Mos_ResourceIsNull(&m_resRefBeforeLoopFilter);
if (isNeedBiggerSize || isResourceNull)
{
if (!isResourceNull)
{
m_osInterface->pfnFreeResource(
m_osInterface,
&m_resRefBeforeLoopFilter);
}
// allocate an internal temporary buffer as reference which holds pixels before in-loop filter
CODECHAL_DECODE_CHK_STATUS_RETURN(AllocateResourceRefBefLoopFilter());
}
}
// Reallocate second level batch buffer if it is needed
if (!m_cencBuf)
{
uint32_t count, size;
if (m_isRealTile)
{
count = m_hevcPicParams->num_tile_columns_minus1 + 1;
size = m_standardDecodeSizeNeeded * (m_decodeParams.m_numSlices + 1 + m_hevcPicParams->num_tile_rows_minus1);
}
else if (m_isSeparateTileDecoding)
{
count = 1;
size = m_standardDecodeSizeNeeded * (m_decodeParams.m_numSlices
+ (m_hevcPicParams->num_tile_rows_minus1 + 1) * (m_hevcPicParams->num_tile_columns_minus1 + 1));
}
else
{
count = 1;
size = m_standardDecodeSizeNeeded * m_decodeParams.m_numSlices;
}
if ((!Mos_ResourceIsNull(&m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex].OsResource) &&
(size > (uint32_t)m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex].iSize)) ||
(count > m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex].count))
{
Mhw_FreeBb(m_osInterface, &m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex], nullptr);
}
if (Mos_ResourceIsNull(&m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex].OsResource))
{
MOS_ZeroMemory(&m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex], sizeof(MHW_BATCH_BUFFER));
CODECHAL_DECODE_CHK_STATUS_RETURN(Mhw_AllocateBb(
m_osInterface,
&m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex],
nullptr,
size,
count));
m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex].bSecondLevel = true;
}
}
CODECHAL_DECODE_CHK_STATUS_RETURN(CodechalDecodeHevc::AllocateResourcesVariableSizes());
#ifdef _MMC_SUPPORTED
// To WA invalid aux data caused HW issue when MMC on
if (m_mmc && m_mmc->IsMmcEnabled() && MEDIA_IS_WA(m_waTable, Wa_1408785368) &&
!Mos_ResourceIsNull(&m_destSurface.OsResource) &&
m_destSurface.OsResource.bConvertedFromDDIResource)
{
CODECHAL_DECODE_VERBOSEMESSAGE("Clear CCS by VE resolve before frame %d submission", m_frameNum);
CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnDecompResource(m_osInterface, &m_destSurface.OsResource));
CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnSetGpuContext(m_osInterface, m_videoContext));
}
#endif
return eStatus;
}
MOS_STATUS CodechalDecodeHevcG12::AllocateResourceRefBefLoopFilter()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_DECODE_FUNCTION_ENTER;
if (!Mos_ResourceIsNull(&m_resRefBeforeLoopFilter))
{
return MOS_STATUS_SUCCESS;
}
MOS_SURFACE surface;
CODECHAL_DECODE_CHK_STATUS_MESSAGE_RETURN(AllocateSurface(
&surface,
m_destSurface.dwPitch,
m_destSurface.dwHeight,
"Reference before loop filter",
m_destSurface.Format),
"Failed to allocate reference before loop filter for IBC.");
m_resRefBeforeLoopFilter = surface.OsResource;
return eStatus;
}
MOS_STATUS CodechalDecodeHevcG12::AllocateHistogramSurface()
{
MOS_ALLOC_GFXRES_PARAMS allocParams;
if (m_histogramSurface == nullptr)
{
m_histogramSurface = (MOS_SURFACE*)MOS_AllocAndZeroMemory(sizeof(MOS_SURFACE));
CODECHAL_DECODE_CHK_NULL_RETURN(m_histogramSurface);
MOS_ZeroMemory(&allocParams, sizeof(MOS_ALLOC_GFXRES_PARAMS));
allocParams.Type = MOS_GFXRES_BUFFER;
allocParams.TileType = MOS_TILE_LINEAR;
allocParams.Format = Format_Buffer;
allocParams.dwBytes = 256 * 4;
allocParams.pBufName = "HistogramStreamOut";
CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnAllocateResource(
m_osInterface,
&allocParams,
&m_histogramSurface->OsResource));
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalGetResourceInfo(
m_osInterface,
m_histogramSurface));
}
if(m_decodeHistogram)
m_decodeHistogram->SetSrcHistogramSurface(m_histogramSurface);
return MOS_STATUS_SUCCESS;
}
CodechalDecodeHevcG12::~CodechalDecodeHevcG12 ()
{
CODECHAL_DECODE_FUNCTION_ENTER;
if (m_sinlgePipeVeState)
{
MOS_FreeMemAndSetNull(m_sinlgePipeVeState);
}
if (m_scalabilityState)
{
CodecHalDecodeScalability_Destroy(m_scalabilityState);
MOS_FreeMemAndSetNull(m_scalabilityState);
}
if (!Mos_ResourceIsNull(&m_resRefBeforeLoopFilter))
{
m_osInterface->pfnFreeResource(m_osInterface, &m_resRefBeforeLoopFilter);
}
for (uint32_t i = 0; i < CODEC_HEVC_NUM_SECOND_BB; i++)
{
if (!Mos_ResourceIsNull(&m_secondLevelBatchBuffer[i].OsResource))
{
Mhw_FreeBb(m_osInterface, &m_secondLevelBatchBuffer[i], nullptr);
}
}
//Note: virtual engine interface destroy is done in MOS layer
#if (_DEBUG || _RELEASE_INTERNAL)
// Report real tile frame count and virtual tile frame count
MOS_USER_FEATURE_VALUE_WRITE_DATA userFeatureWriteData = __NULL_USER_FEATURE_VALUE_WRITE_DATA__;
userFeatureWriteData.Value.i32Data = m_rtFrameCount;
userFeatureWriteData.ValueID = __MEDIA_USER_FEATURE_VALUE_ENABLE_HEVC_DECODE_RT_FRAME_COUNT_ID_G12;
MOS_UserFeature_WriteValues_ID(nullptr, &userFeatureWriteData, 1);
userFeatureWriteData.Value.i32Data = m_vtFrameCount;
userFeatureWriteData.ValueID = __MEDIA_USER_FEATURE_VALUE_ENABLE_HEVC_DECODE_VT_FRAME_COUNT_ID_G12;
MOS_UserFeature_WriteValues_ID(nullptr, &userFeatureWriteData, 1);
userFeatureWriteData.Value.i32Data = m_spFrameCount;
userFeatureWriteData.ValueID = __MEDIA_USER_FEATURE_VALUE_ENABLE_HEVC_DECODE_SP_FRAME_COUNT_ID_G12;
MOS_UserFeature_WriteValues_ID(nullptr, &userFeatureWriteData, 1);
#endif
if (m_histogramSurface)
{
if (!Mos_ResourceIsNull(&m_histogramSurface->OsResource))
{
m_osInterface->pfnFreeResource(
m_osInterface,
&m_histogramSurface->OsResource);
}
MOS_FreeMemory(m_histogramSurface);
m_histogramSurface = nullptr;
}
return;
}
MOS_STATUS CodechalDecodeHevcG12::CheckLCUSize()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_DECODE_FUNCTION_ENTER;
uint16_t LCUSize = 1 << (m_hevcPicParams->log2_diff_max_min_luma_coding_block_size +
m_hevcPicParams->log2_min_luma_coding_block_size_minus3 + 3);
if (m_width > CODECHAL_HEVC_MAX_DIM_FOR_MIN_LCU || m_height > CODECHAL_HEVC_MAX_DIM_FOR_MIN_LCU)
{
if (LCUSize == CODECHAL_HEVC_MIN_LCU)
{
CODECHAL_DECODE_ASSERTMESSAGE("Invalid LCU size.");
return MOS_STATUS_INVALID_PARAMETER;
}
}
return eStatus;
}
MOS_STATUS CodechalDecodeHevcG12::SetGpuCtxCreatOption(
CodechalSetting *codecHalSetting)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_DECODE_FUNCTION_ENTER;
if (!MOS_VE_CTXBASEDSCHEDULING_SUPPORTED(m_osInterface))
{
CodechalDecode::SetGpuCtxCreatOption(codecHalSetting);
}
else
{
m_gpuCtxCreatOpt = MOS_New(MOS_GPUCTX_CREATOPTIONS_ENHANCED);
CODECHAL_DECODE_CHK_NULL_RETURN(m_gpuCtxCreatOpt);
if (static_cast<MhwVdboxMfxInterfaceG12 *>(m_mfxInterface)->IsScalabilitySupported())
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodechalDecodeScalability_ConstructParmsForGpuCtxCreation(
m_scalabilityState,
(PMOS_GPUCTX_CREATOPTIONS_ENHANCED)m_gpuCtxCreatOpt,
codecHalSetting));
if (((PMOS_GPUCTX_CREATOPTIONS_ENHANCED)m_gpuCtxCreatOpt)->LRCACount == 2)
{
m_videoContext = MOS_VE_MULTINODESCALING_SUPPORTED(m_osInterface) ? MOS_GPU_CONTEXT_VIDEO5 : MOS_GPU_CONTEXT_VDBOX2_VIDEO;;
CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnCreateGpuContext(
m_osInterface,
m_videoContext,
MOS_GPU_NODE_VIDEO,
m_gpuCtxCreatOpt));
MOS_GPUCTX_CREATOPTIONS createOption;
CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnCreateGpuContext(
m_osInterface,
MOS_GPU_CONTEXT_VIDEO,
m_videoGpuNode,
&createOption));
}
else if (((PMOS_GPUCTX_CREATOPTIONS_ENHANCED)m_gpuCtxCreatOpt)->LRCACount == 3)
{
m_videoContext = MOS_VE_MULTINODESCALING_SUPPORTED(m_osInterface) ? MOS_GPU_CONTEXT_VIDEO7 : MOS_GPU_CONTEXT_VDBOX2_VIDEO2;
CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnCreateGpuContext(
m_osInterface,
m_videoContext,
MOS_GPU_NODE_VIDEO,
m_gpuCtxCreatOpt));
MOS_GPUCTX_CREATOPTIONS createOption;
CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnCreateGpuContext(
m_osInterface,
MOS_GPU_CONTEXT_VIDEO,
m_videoGpuNode,
&createOption));
}
else
{
m_videoContext = MOS_GPU_CONTEXT_VIDEO;
}
}
else
{
bool sfcInUse = (codecHalSetting->sfcInUseHinted && codecHalSetting->downsamplingHinted
&& (MEDIA_IS_SKU(m_skuTable, FtrSFCPipe) && !MEDIA_IS_SKU(m_skuTable, FtrDisableVDBox2SFC)));
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeSinglePipeVE_ConstructParmsForGpuCtxCreation(
m_sinlgePipeVeState,
(PMOS_GPUCTX_CREATOPTIONS_ENHANCED)m_gpuCtxCreatOpt,
sfcInUse));
m_videoContext = MOS_GPU_CONTEXT_VIDEO;
}
}
return eStatus;
}
uint32_t CodechalDecodeHevcG12::GetDmemBufferSize()
{
return MOS_ALIGN_CEIL(sizeof(HUC_HEVC_S2L_BSS_G12), CODECHAL_CACHELINE_SIZE);
}
MOS_STATUS CodechalDecodeHevcG12::SetHucDmemS2LPictureBss(
PHUC_HEVC_S2L_PIC_BSS hucHevcS2LPicBss)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_DECODE_FUNCTION_ENTER;
CODECHAL_DECODE_CHK_NULL_RETURN(hucHevcS2LPicBss);
CODECHAL_DECODE_CHK_STATUS_RETURN(CodechalDecodeHevc::SetHucDmemS2LPictureBss(hucHevcS2LPicBss));
if (m_hevcExtPicParams)
{
hucHevcS2LPicBss->high_precision_offsets_enabled_flag =
m_hevcExtPicParams->PicRangeExtensionFlags.fields.high_precision_offsets_enabled_flag;
hucHevcS2LPicBss->chroma_qp_offset_list_enabled_flag =
m_hevcExtPicParams->PicRangeExtensionFlags.fields.chroma_qp_offset_list_enabled_flag;
}
else
{
hucHevcS2LPicBss->high_precision_offsets_enabled_flag = 0;
hucHevcS2LPicBss->chroma_qp_offset_list_enabled_flag = 0;
}
PHUC_HEVC_S2L_PIC_BSS_G12 hucHevcS2LPicBssG12 = static_cast<PHUC_HEVC_S2L_PIC_BSS_G12>(hucHevcS2LPicBss);
hucHevcS2LPicBssG12->IsRealTileEnable = 0;
if (m_isRealTile)
{
hucHevcS2LPicBssG12->IsRealTileEnable = 1;
hucHevcS2LPicBssG12->BatchBufferSize = m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex].iSize;
hucHevcS2LPicBssG12->NumScalablePipes = m_scalabilityState->ucScalablePipeNum;
}
else if (CodecHalDecodeNeedsTileDecoding(m_hevcPicParams, m_hevcSccPicParams))
{
hucHevcS2LPicBssG12->NumScalablePipes = 1;
}
hucHevcS2LPicBssG12->IsSCCIBCMode = CodecHalDecodeIsSCCIBCMode(m_hevcSccPicParams);
hucHevcS2LPicBssG12->IsSCCPLTMode = CodecHalDecodeIsSCCPLTMode(m_hevcSccPicParams);
if (hucHevcS2LPicBssG12->IsSCCIBCMode)
{
uint8_t i = 0, k = 0;
for (i = 0; i < CODEC_MAX_NUM_REF_FRAME_HEVC; i++)
{
if (hucHevcS2LPicBssG12->PicOrderCntValList[i] == hucHevcS2LPicBssG12->CurrPicOrderCntVal)
{
break;
}
}
for (k = 0; k < CODECHAL_MAX_CUR_NUM_REF_FRAME_HEVC; k++)
{
if (hucHevcS2LPicBssG12->RefPicSetLtCurr[k] == 0xFF)
{
hucHevcS2LPicBssG12->RefPicSetLtCurr[k] = i;
break;
}
}
}
if (hucHevcS2LPicBssG12->IsSCCPLTMode)
{
hucHevcS2LPicBssG12->PredictorPaletteSize = m_hevcSccPicParams->PredictorPaletteSize;
MOS_SecureMemcpy(hucHevcS2LPicBssG12->PredictorPaletteEntries,
sizeof(hucHevcS2LPicBssG12->PredictorPaletteEntries),
m_hevcSccPicParams->PredictorPaletteEntries,
sizeof(m_hevcSccPicParams->PredictorPaletteEntries));
}
else
{
hucHevcS2LPicBssG12->PredictorPaletteSize = 0;
MOS_ZeroMemory(hucHevcS2LPicBssG12->PredictorPaletteEntries, sizeof(hucHevcS2LPicBssG12->PredictorPaletteEntries));
}
if (m_hevcSccPicParams)
{
hucHevcS2LPicBssG12->UseSliceACTOffset = m_hevcSccPicParams->PicSCCExtensionFlags.fields.pps_slice_act_qp_offsets_present_flag;
hucHevcS2LPicBssG12->pps_act_y_qp_offset = m_hevcSccPicParams->pps_act_y_qp_offset_plus5 - 5;
hucHevcS2LPicBssG12->pps_act_cb_qp_offset = m_hevcSccPicParams->pps_act_cb_qp_offset_plus5 - 5;
hucHevcS2LPicBssG12->pps_act_cr_qp_offset = m_hevcSccPicParams->pps_act_cr_qp_offset_plus3 - 3;
hucHevcS2LPicBssG12->MVRControlIdc = m_hevcSccPicParams->PicSCCExtensionFlags.fields.motion_vector_resolution_control_idc;
}
else
{
hucHevcS2LPicBssG12->UseSliceACTOffset = 0;
hucHevcS2LPicBssG12->pps_act_y_qp_offset = 0;
hucHevcS2LPicBssG12->pps_act_cb_qp_offset = 0;
hucHevcS2LPicBssG12->pps_act_cr_qp_offset = 0;
hucHevcS2LPicBssG12->MVRControlIdc = 0;
}
return eStatus;
}
MOS_STATUS CodechalDecodeHevcG12::CalcDownsamplingParams(
void *picParams,
uint32_t *refSurfWidth,
uint32_t *refSurfHeight,
MOS_FORMAT *format,
uint8_t *frameIdx)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_DECODE_CHK_NULL_RETURN(picParams);
CODECHAL_DECODE_CHK_NULL_RETURN(refSurfWidth);
CODECHAL_DECODE_CHK_NULL_RETURN(refSurfHeight);
CODECHAL_DECODE_CHK_NULL_RETURN(format);
CODECHAL_DECODE_CHK_NULL_RETURN(frameIdx);
PCODEC_HEVC_PIC_PARAMS hevcPicParams = (PCODEC_HEVC_PIC_PARAMS)picParams;
*refSurfWidth = 0;
*refSurfHeight = 0;
*format = Format_NV12;
*frameIdx = hevcPicParams->CurrPic.FrameIdx;
uint32_t widthInPix, heightInPix;
widthInPix = (1 << (hevcPicParams->log2_min_luma_coding_block_size_minus3 + 3)) * (hevcPicParams->PicWidthInMinCbsY);
heightInPix = (1 << (hevcPicParams->log2_min_luma_coding_block_size_minus3 + 3)) * (hevcPicParams->PicHeightInMinCbsY);
*refSurfWidth = MOS_ALIGN_CEIL(widthInPix, 64);
*refSurfHeight = MOS_ALIGN_CEIL(heightInPix, 64);
if (hevcPicParams->chroma_format_idc == HCP_CHROMA_FORMAT_YUV444)
{
if (hevcPicParams->bit_depth_luma_minus8 > 2 || hevcPicParams->bit_depth_chroma_minus8 > 2)
{
*format = Format_Y416;
}
else if (hevcPicParams->bit_depth_luma_minus8 > 0 || hevcPicParams->bit_depth_chroma_minus8 > 0)
{
*format = Format_Y410;
}
else
{
*format = Format_AYUV;
}
}
else if (hevcPicParams->chroma_format_idc == HCP_CHROMA_FORMAT_YUV422)
{
if (hevcPicParams->bit_depth_luma_minus8 > 2 || hevcPicParams->bit_depth_chroma_minus8 > 2)
{
*format = Format_Y216;
}
else if (hevcPicParams->bit_depth_luma_minus8 > 0 || hevcPicParams->bit_depth_chroma_minus8 > 0)
{
*format = Format_Y210;
}
else
{
*format = Format_YUY2;
}
}
else
{
if (hevcPicParams->bit_depth_luma_minus8 > 2 || hevcPicParams->bit_depth_chroma_minus8 > 2)
{
*format = Format_P016;
}
else if (hevcPicParams->bit_depth_luma_minus8 > 0 || hevcPicParams->bit_depth_chroma_minus8 > 0)
{
*format = Format_P010;
}
else
{
*format = Format_NV12;
}
}
return eStatus;
}
MOS_STATUS CodechalDecodeHevcG12::SetHucDmemParams (
PMOS_RESOURCE dmemBuffer)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_DECODE_FUNCTION_ENTER;
CODECHAL_DECODE_CHK_NULL_RETURN(dmemBuffer);
CodechalResLock DmemLock(m_osInterface, dmemBuffer);
auto hucHevcS2LBss = (PHUC_HEVC_S2L_BSS_G12)DmemLock.Lock(CodechalResLock::writeOnly);
CODECHAL_DECODE_CHK_NULL_RETURN(hucHevcS2LBss);
hucHevcS2LBss->ProductFamily = m_hucInterface->GetHucProductFamily();
hucHevcS2LBss->RevId = m_hwInterface->GetPlatform().usRevId;
hucHevcS2LBss->DummyRefIdxState =
MEDIA_IS_WA(m_waTable, WaDummyReference) && !m_osInterface->bSimIsActive;
CODECHAL_DECODE_CHK_STATUS_RETURN(SetHucDmemS2LPictureBss(&hucHevcS2LBss->PictureBss));
CODECHAL_DECODE_CHK_STATUS_RETURN(SetHucDmemS2LSliceBss(&hucHevcS2LBss->SliceBss[0]));
if (m_secureDecoder)
{
CODECHAL_DECODE_CHK_STATUS_RETURN(m_secureDecoder->SetHevcHucDmemS2LBss(this, &hucHevcS2LBss->PictureBss, &hucHevcS2LBss->SliceBss[0]));
}
if (m_numSlices < CODECHAL_HEVC_MAX_NUM_SLICES_LVL_6)
{
m_dmemTransferSize = (uint32_t)((uint8_t *)&(hucHevcS2LBss->SliceBss[m_numSlices]) - (uint8_t *)hucHevcS2LBss);
m_dmemTransferSize = MOS_ALIGN_CEIL(m_dmemTransferSize, CODECHAL_CACHELINE_SIZE);
}
else
{
m_dmemTransferSize = m_dmemBufferSize;
}
return eStatus;
}
MOS_STATUS CodechalDecodeHevcG12 ::InitializeDecodeMode()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_DECODE_FUNCTION_ENTER;
if (MOS_VE_SUPPORTED(m_osInterface) && static_cast<MhwVdboxMfxInterfaceG12 *>(m_mfxInterface)->IsScalabilitySupported())
{
CODECHAL_DECODE_SCALABILITY_INIT_PARAMS_G12 initParams;
MOS_ZeroMemory(&initParams, sizeof(initParams));
initParams.u32PicWidthInPixel = m_width;
initParams.u32PicHeightInPixel = m_height;
initParams.bIsTileEnabled = m_hevcPicParams->tiles_enabled_flag;
initParams.format = m_decodeParams.m_destSurface->Format;
initParams.usingSecureDecode = m_secureDecoder ? m_secureDecoder->IsSecureDecodeEnabled() : false;
// Only support SCC real tile mode. SCC virtual tile scalability mode is disabled here
initParams.bIsSccDecoding = m_hevcSccPicParams != nullptr;
initParams.u8NumTileColumns = m_hevcPicParams->num_tile_columns_minus1 + 1;
initParams.u8NumTileRows = m_hevcPicParams->num_tile_rows_minus1 + 1;
initParams.gpuCtxInUse = GetVideoContext();
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_InitScalableParams_G12(
m_scalabilityState,
&initParams,
&m_decodePassNum));
if (MOS_VE_CTXBASEDSCHEDULING_SUPPORTED(m_osInterface))
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodechalDecodeScalability_ChkGpuCtxReCreation(
m_scalabilityState,
(PMOS_GPUCTX_CREATOPTIONS_ENHANCED)m_gpuCtxCreatOpt));
SetVideoContext(m_scalabilityState->VideoContext);
}
m_isRealTile = CodecHalDecodeScalabilityIsRealTileMode(m_scalabilityState);
if (m_isRealTile)
{
m_isSeparateTileDecoding = false;
}
#if (_DEBUG || _RELEASE_INTERNAL)
if (m_isRealTile)
{
m_rtFrameCount++;
}
else if (CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState))
{
m_vtFrameCount++;
}
else
{
m_spFrameCount++;
}
#endif
}
return eStatus;
}
MOS_STATUS CodechalDecodeHevcG12::SetFrameStates ()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
PERF_UTILITY_AUTO(__FUNCTION__, PERF_DECODE, PERF_LEVEL_HAL);
CODECHAL_DECODE_FUNCTION_ENTER;
CODECHAL_DECODE_CHK_NULL_RETURN(m_decodeParams.m_destSurface);
CODECHAL_DECODE_CHK_NULL_RETURN(m_decodeParams.m_dataBuffer);
m_frameIdx++;
// Check HuC_status2 Imem loaded bit, if 0,return error
// As driver doesn't know when can get reg value afer storing HuC_Status2 register,
// Check the reg value here at the beginning of next frame
// Check twice, first entry and second entry
if (m_shortFormatInUse && m_frameIdx < 3 && m_statusQueryReportingEnabled &&
(((m_decodeStatusBuf.m_decodeStatus->m_hucErrorStatus2 >> 32) & m_hucInterface->GetHucStatus2ImemLoadedMask()) == 0))
{
CODECHAL_DECODE_ASSERTMESSAGE("HuC IMEM Loaded fails");
return MOS_STATUS_UNKNOWN;
}
m_cencBuf = m_decodeParams.m_cencBuf;
if (IsFirstExecuteCall()) // For DRC Multiple Execution Call, no need to update every value in pHevcState except first execute
{
m_dataSize = m_decodeParams.m_dataSize;
m_dataOffset = m_decodeParams.m_dataOffset;
m_numSlices = m_decodeParams.m_numSlices;
if (m_numSlices > CODECHAL_HEVC_MAX_NUM_SLICES_LVL_6)
{
CODECHAL_DECODE_ASSERTMESSAGE("Slice number doesn't support!");
return MOS_STATUS_INVALID_PARAMETER;
}
m_hevcPicParams = (PCODEC_HEVC_PIC_PARAMS)m_decodeParams.m_picParams;
m_hevcExtPicParams = (PCODEC_HEVC_EXT_PIC_PARAMS)m_decodeParams.m_extPicParams;
m_hevcSccPicParams = (PCODEC_HEVC_SCC_PIC_PARAMS)m_decodeParams.m_advPicParams;
CODECHAL_DECODE_CHK_NULL_RETURN(m_decodeParams.m_sliceParams);
m_hevcSliceParams = (PCODEC_HEVC_SLICE_PARAMS)m_decodeParams.m_sliceParams;
m_hevcExtSliceParams = (PCODEC_HEVC_EXT_SLICE_PARAMS)m_decodeParams.m_extSliceParams;
m_hevcSubsetParams = (PCODEC_HEVC_SUBSET_PARAMS)m_decodeParams.m_subsetParams;
m_hevcIqMatrixParams = (PCODECHAL_HEVC_IQ_MATRIX_PARAMS)m_decodeParams.m_iqMatrixBuffer;
m_destSurface = *(m_decodeParams.m_destSurface);
m_resDataBuffer = *(m_decodeParams.m_dataBuffer);
CODECHAL_DECODE_CHK_STATUS_RETURN(InitializeBitstreamCat());
}
else
{
m_dataSize = m_decodeParams.m_dataSize;
m_dataOffset = 0;
m_resDataBuffer = *(m_decodeParams.m_dataBuffer);
}
if (m_hevcPicParams->RequestCRC)
{
m_reportFrameCrc = true;
}
CODECHAL_DECODE_CHK_STATUS_RETURN(CheckAndCopyBitstream());
PCODEC_REF_LIST destEntry = m_hevcRefList[m_hevcPicParams->CurrPic.FrameIdx];
MOS_ZeroMemory(destEntry, sizeof(CODEC_REF_LIST));
if (m_incompletePicture)
{
return MOS_STATUS_SUCCESS;
}
CODECHAL_DECODE_CHK_NULL_RETURN(m_hevcPicParams);
CODECHAL_DECODE_CHK_NULL_RETURN(m_hevcIqMatrixParams);
// sanity check to make sure no same reference exists
uint32_t m = 0, n = 0;
for (m = 0; m < CODEC_MAX_NUM_REF_FRAME_HEVC; m++)
{
int32_t poc = m_hevcPicParams->PicOrderCntValList[m];
for (n = m + 1; n < CODEC_MAX_NUM_REF_FRAME_HEVC; n++)
{
if (poc == m_hevcPicParams->PicOrderCntValList[n])
{
m_hevcPicParams->RefFrameList[n].PicFlags = PICTURE_INVALID;
}
}
}
// Calculate bCurPicIntra
m_curPicIntra = true;
if (m_hevcPicParams->IntraPicFlag == 0)
{
for (uint32_t i = 0; i < CODECHAL_MAX_CUR_NUM_REF_FRAME_HEVC; i++)
{
uint8_t frameIdx = m_hevcPicParams->RefPicSetStCurrBefore[i];
if (frameIdx < 15)
{
m_curPicIntra = false;
break;
}
frameIdx = m_hevcPicParams->RefPicSetStCurrAfter[i];
if (frameIdx < 15)
{
m_curPicIntra = false;
break;
}
frameIdx = m_hevcPicParams->RefPicSetLtCurr[i];
if (frameIdx < 15)
{
m_curPicIntra = false;
break;
}
}
}
m_twoVersionsOfCurrDecPicFlag = 0;
if (CodecHalDecodeIsSCCIBCMode(m_hevcSccPicParams))
{
m_curPicIntra = false;
m_twoVersionsOfCurrDecPicFlag = !m_hevcPicParams->pps_deblocking_filter_disabled_flag
|| m_hevcPicParams->sample_adaptive_offset_enabled_flag
|| m_hevcPicParams->deblocking_filter_override_enabled_flag;
#ifdef _MMC_SUPPORTED
if (m_mmc->IsMmcEnabled())
{
// Due to limitation, IBC reference has to be uncompressed, while recon surface is still compressed.
// Always need internal surface for IBC reference for MMC.
m_twoVersionsOfCurrDecPicFlag = true;
}
#endif
}
CODECHAL_DECODE_CHK_STATUS_RETURN(SetPictureStructs());
uint32_t i;
for (i = 0; i < CODEC_MAX_NUM_REF_FRAME_HEVC; i++)
{
m_frameUsedAsCurRef[i] = false;
m_refIdxMapping[i] = -1;
}
// Calculate RefIdxMapping
for (i = 0; i < CODECHAL_MAX_CUR_NUM_REF_FRAME_HEVC; i++)
{
uint8_t frameIdx = m_hevcPicParams->RefPicSetStCurrBefore[i];
if (frameIdx < CODEC_MAX_NUM_REF_FRAME_HEVC)
{
m_frameUsedAsCurRef[frameIdx] = true;
}
frameIdx = m_hevcPicParams->RefPicSetStCurrAfter[i];
if (frameIdx < CODEC_MAX_NUM_REF_FRAME_HEVC)
{
m_frameUsedAsCurRef[frameIdx] = true;
}
frameIdx = m_hevcPicParams->RefPicSetLtCurr[i];
if (frameIdx < CODEC_MAX_NUM_REF_FRAME_HEVC)
{
m_frameUsedAsCurRef[frameIdx] = true;
}
}
if (CodecHalDecodeIsSCCIBCMode(m_hevcSccPicParams))
{
for (i = 0; i < CODEC_MAX_NUM_REF_FRAME_HEVC; i++)
{
if (!CodecHal_PictureIsInvalid(m_hevcPicParams->RefFrameList[i])
&& m_hevcPicParams->PicOrderCntValList[i] == m_hevcPicParams->CurrPicOrderCntVal)
{
m_frameUsedAsCurRef[i] = true;
break;
}
}
}
uint8_t curRefIdx = 0;
for (i = 0; i < CODEC_MAX_NUM_REF_FRAME_HEVC; i++)
{
if (m_frameUsedAsCurRef[i])
{
if (CodecHalDecodeIsSCCIBCMode(m_hevcSccPicParams))
{
if (m_hevcPicParams->PicOrderCntValList[i] == m_hevcPicParams->CurrPicOrderCntVal)
{
// pre-dbk reference id for IBC mode
m_IBCRefIdx = curRefIdx;
}
}
m_refIdxMapping[i] = curRefIdx++;
}
}
CODECHAL_DECODE_ASSERT(curRefIdx <= 8);
m_minCtbSize = 1 << (m_hevcPicParams->log2_min_luma_coding_block_size_minus3 + 3);
m_width = m_hevcPicParams->PicWidthInMinCbsY * m_minCtbSize;
m_height = m_hevcPicParams->PicHeightInMinCbsY * m_minCtbSize;
m_ctbSize = 1 << (m_hevcPicParams->log2_diff_max_min_luma_coding_block_size +
m_hevcPicParams->log2_min_luma_coding_block_size_minus3 + 3);
CODECHAL_DECODE_CHK_STATUS_RETURN(CheckLCUSize());
if (m_hcpInterface->IsRowStoreCachingSupported())
{
MHW_VDBOX_ROWSTORE_PARAMS rowstoreParams;
rowstoreParams.Mode = CODECHAL_DECODE_MODE_HEVCVLD;
rowstoreParams.dwPicWidth = m_width;
rowstoreParams.bMbaff = false;
rowstoreParams.ucBitDepthMinus8 = (uint8_t)MOS_MAX(m_hevcPicParams->bit_depth_luma_minus8, m_hevcPicParams->bit_depth_chroma_minus8);
rowstoreParams.ucChromaFormat = m_hevcPicParams->chroma_format_idc;
rowstoreParams.ucLCUSize = (uint8_t)m_ctbSize;
m_hwInterface->SetRowstoreCachingOffsets(&rowstoreParams);
}
// Calculate Tile info
if (m_hevcPicParams->tiles_enabled_flag)
{
CODECHAL_DECODE_CHK_STATUS_RETURN(GetAllTileInfo());
}
if (m_curPicIntra)
{
m_perfType = I_TYPE;
}
else
{
// Not possible to determine whether P or B is used for short format.
// For long format iterating through all of the slices to determine P vs
// B, so in order to avoid this, declare all other pictures MIXED_TYPE.
m_perfType = MIXED_TYPE;
}
m_crrPic = m_hevcPicParams->CurrPic;
m_secondField =
CodecHal_PictureIsBottomField(m_hevcPicParams->CurrPic);
CODECHAL_DEBUG_TOOL(
m_debugInterface->m_currPic = m_crrPic;
m_debugInterface->m_secondField = m_secondField;
m_debugInterface->m_frameType = m_perfType;
CODECHAL_DECODE_CHK_STATUS_RETURN(DumpPicParams(
m_hevcPicParams,
m_hevcExtPicParams,
m_hevcSccPicParams));
if (m_hevcIqMatrixParams) {
CODECHAL_DECODE_CHK_STATUS_RETURN(DumpIQParams(m_hevcIqMatrixParams));
}
if (m_hevcSliceParams) {
CODECHAL_DECODE_CHK_STATUS_RETURN(DumpSliceParams(
m_hevcSliceParams,
m_hevcExtSliceParams,
m_numSlices,
m_shortFormatInUse));
}
if(m_hevcSubsetParams) {
CODECHAL_DECODE_CHK_STATUS_RETURN(DumpSubsetsParams(m_hevcSubsetParams));
})
// Clear DMEM buffer program flag
if (m_shortFormatInUse)
{
m_dmemBufferProgrammed = false;
m_dmemBufferIdx++;
m_dmemBufferIdx %= CODECHAL_HEVC_NUM_DMEM_BUFFERS;
}
m_isSeparateTileDecoding = CodecHalDecodeNeedsTileDecoding(m_hevcPicParams, m_hevcSccPicParams);
InitializeDecodeMode();
#ifdef _DECODE_PROCESSING_SUPPORTED
if (m_decodeParams.m_procParams)
{
CodechalHevcSfcStateG12 *sfcStateG12 = static_cast<CodechalHevcSfcStateG12*>(m_sfcState);
CODECHAL_DECODE_CHK_NULL_RETURN(sfcStateG12);
CODECHAL_DECODE_CHK_STATUS_RETURN(AllocateHistogramSurface());
CODECHAL_DECODE_CHK_STATUS_RETURN(sfcStateG12->CheckAndInitialize(
(CODECHAL_DECODE_PROCESSING_PARAMS *)m_decodeParams.m_procParams,
m_hevcPicParams,
m_scalabilityState,
m_histogramSurface));
}
#endif
CODECHAL_DEBUG_TOOL(
if (!m_incompletePicture && !IsFirstExecuteCall()) {
CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
&m_resCopyDataBuffer,
CodechalDbgAttr::attrBitstream,
"_DEC",
m_estiBytesInBitstream,
0,
CODECHAL_NUM_MEDIA_STATES));
})
m_secondLevelBatchBufferIndex++;
m_secondLevelBatchBufferIndex %= CODEC_HEVC_NUM_SECOND_BB;
CODECHAL_DECODE_CHK_STATUS_RETURN(AllocateResourcesVariableSizes());
if (m_twoVersionsOfCurrDecPicFlag)
{
m_hevcRefList[m_hevcPicParams->CurrPic.FrameIdx]->resRefPic = m_resRefBeforeLoopFilter;
}
else
{
m_hevcRefList[m_hevcPicParams->CurrPic.FrameIdx]->resRefPic = m_destSurface.OsResource;
}
m_hcpDecPhase = CodechalHcpDecodePhaseInitialized;
if (!m_shortFormatInUse&&!m_cencBuf)
{
CodechalResLock bbLock(m_osInterface, &m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex].OsResource);
uint8_t *bbBase = (uint8_t*)bbLock.Lock(CodechalResLock::writeOnly);
HevcDecodeSliceLongG12 hevcLong(this, m_hcpInterface, m_miInterface);
CODECHAL_DECODE_CHK_STATUS_RETURN(hevcLong.ProcessSliceLong(bbBase, m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex].iSize));
}
return eStatus;
}
//!
//! \brief Determine Decode Phase
//! \details Determine decode phase in hevc decode
//! \param N/A
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS CodechalDecodeHevcG12::DetermineDecodePhase()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_DECODE_FUNCTION_ENTER;
if (static_cast<MhwVdboxMfxInterfaceG12*>(m_mfxInterface)->IsScalabilitySupported())
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_DetermineDecodePhase_G12(
m_scalabilityState,
&m_hcpDecPhase));
}
else
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodechalDecodeHevc::DetermineDecodePhase());
}
CODECHAL_DECODE_VERBOSEMESSAGE("Current Decode Phase: %d.", m_hcpDecPhase);
return eStatus;
}
MOS_STATUS CodechalDecodeHevcG12::SetAndPopulateVEHintParams(
PMOS_COMMAND_BUFFER primCmdBuf)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_DECODE_FUNCTION_ENTER;
if (static_cast<MhwVdboxMfxInterfaceG12*>(m_mfxInterface)->IsScalabilitySupported())
{
CODECHAL_DECODE_SCALABILITY_SETHINT_PARMS scalSetParms;
if (!MOS_VE_CTXBASEDSCHEDULING_SUPPORTED(m_osInterface))
{
scalSetParms.bNeedSyncWithPrevious = true;
scalSetParms.bSameEngineAsLastSubmission = false;
scalSetParms.bSFCInUse = false;
}
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_SetHintParams_G12(m_scalabilityState, &scalSetParms));
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_PopulateHintParams(m_scalabilityState, primCmdBuf));
}
else
{
if (!MOS_VE_CTXBASEDSCHEDULING_SUPPORTED(m_osInterface))
{
MOS_VIRTUALENGINE_SET_PARAMS vesetParams;
MOS_ZeroMemory(&vesetParams, sizeof(vesetParams));
vesetParams.bNeedSyncWithPrevious = true;
vesetParams.bSameEngineAsLastSubmission = false;
vesetParams.bSFCInUse = false;
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeSinglePipeVE_SetHintParams(m_sinlgePipeVeState, &vesetParams));
}
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeSinglePipeVE_PopulateHintParams(m_sinlgePipeVeState, primCmdBuf, true));
}
return eStatus;
}
MOS_STATUS CodechalDecodeHevcG12::DetermineSendProlgwithFrmTracking(
bool *sendPrologWithFrameTracking)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_DECODE_FUNCTION_ENTER;
CODECHAL_DECODE_CHK_NULL_RETURN(sendPrologWithFrameTracking);
if (CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState))
{
if (CodecHalDecodeScalability1stPhaseofSubmission(m_scalabilityState) ||
(CodecHalDecodeScalabilityIsFirstRealTilePhase(m_scalabilityState) && (m_scalabilityState->u8RtCurPipe == 0)))
{
*sendPrologWithFrameTracking = true;
}
}
else
{
if (m_shortFormatInUse)
{
*sendPrologWithFrameTracking = m_enableSf2DmaSubmits ? true : false;
}
else
{
*sendPrologWithFrameTracking = true;
}
}
return eStatus;
}
uint32_t CodechalDecodeHevcG12::RequestedSpaceSize(uint32_t requestedSize)
{
CODECHAL_DECODE_FUNCTION_ENTER;
if (m_scalabilityState && m_scalabilityState->bScalableDecodeMode)
{
//primary cmd buffer only including cmd buffer header .
return COMMAND_BUFFER_RESERVED_SPACE * 2;
}
else
{
return requestedSize;
}
}
void CodechalDecodeHevcG12::CalcRequestedSpace(
uint32_t &requestedSize,
uint32_t &additionalSizeNeeded,
uint32_t &requestedPatchListSize)
{
if (m_isRealTile)
{
if (m_cencBuf)
{
requestedSize = m_commandBufferSizeNeeded;
requestedPatchListSize = m_commandPatchListSizeNeeded;
additionalSizeNeeded = 0;
}
else
{
requestedSize = m_commandBufferSizeNeeded +
(m_standardDecodeSizeNeeded * (m_decodeParams.m_numSlices + 1 + m_hevcPicParams->num_tile_rows_minus1));
requestedPatchListSize = m_commandPatchListSizeNeeded +
(m_standardDecodePatchListSizeNeeded * (m_decodeParams.m_numSlices + 1 + m_hevcPicParams->num_tile_rows_minus1));
additionalSizeNeeded = COMMAND_BUFFER_RESERVED_SPACE;
}
requestedSize *= m_scalabilityState->u8RtPhaseNum;
requestedPatchListSize *= m_scalabilityState->u8RtPhaseNum;
}
else if (CodecHalDecodeNeedsTileDecoding(m_hevcPicParams, m_hevcSccPicParams))
{
if (m_cencBuf)
{
requestedSize = m_commandBufferSizeNeeded;
requestedPatchListSize = m_commandPatchListSizeNeeded;
additionalSizeNeeded = 0;
}
else
{
requestedSize = m_commandBufferSizeNeeded +
m_standardDecodeSizeNeeded * (m_decodeParams.m_numSlices + (1 + m_hevcPicParams->num_tile_rows_minus1) * (1 + m_hevcPicParams->num_tile_columns_minus1));
requestedPatchListSize = m_commandPatchListSizeNeeded +
m_standardDecodePatchListSizeNeeded * (m_decodeParams.m_numSlices + (1 + m_hevcPicParams->num_tile_rows_minus1) * (1 + m_hevcPicParams->num_tile_columns_minus1));
additionalSizeNeeded = COMMAND_BUFFER_RESERVED_SPACE;
}
}
else
{
if (m_cencBuf)
{
requestedSize = m_commandBufferSizeNeeded;
requestedPatchListSize = m_commandPatchListSizeNeeded;
additionalSizeNeeded = 0;
}
else
{
requestedSize = m_commandBufferSizeNeeded +
(m_standardDecodeSizeNeeded * (m_decodeParams.m_numSlices + 1));
requestedPatchListSize = m_commandPatchListSizeNeeded +
(m_standardDecodePatchListSizeNeeded * (m_decodeParams.m_numSlices + 1));
additionalSizeNeeded = COMMAND_BUFFER_RESERVED_SPACE;
}
}
}
MOS_STATUS CodechalDecodeHevcG12::VerifyExtraSpace(
uint32_t requestedSize,
uint32_t additionalSizeNeeded)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_DECODE_FUNCTION_ENTER;
if (m_scalabilityState && m_scalabilityState->bScalableDecodeMode)
{
eStatus = MOS_STATUS_NO_SPACE;
// Try a maximum of 3 attempts to request the required sizes from OS
// OS could reset the sizes if necessary, therefore, requires to re-verify
for (auto i = 0; (i < 3) && (eStatus != MOS_STATUS_SUCCESS); i++)
{
// Verify secondary cmd buffer
eStatus = (MOS_STATUS)m_osInterface->pfnVerifyCommandBufferSize(
m_osInterface,
requestedSize,
MOS_VE_HAVE_SECONDARY_CMDBUFFER);
// Resize command buffer if not enough
if (eStatus != MOS_STATUS_SUCCESS)
{
CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnResizeCommandBufferAndPatchList(
m_osInterface,
requestedSize + additionalSizeNeeded,
0,
MOS_VE_HAVE_SECONDARY_CMDBUFFER));
// Set status to NO_SPACE to enter the commaned buffer size verification on next loop.
eStatus = MOS_STATUS_NO_SPACE;
}
}
}
return eStatus;
}
MOS_STATUS CodechalDecodeHevcG12::DecodeStateLevel()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
PERF_UTILITY_AUTO(__FUNCTION__, PERF_DECODE, PERF_LEVEL_HAL);
CODECHAL_DECODE_FUNCTION_ENTER;
//HCP Decode Phase State Machine
CODECHAL_DECODE_CHK_STATUS_RETURN(DetermineDecodePhase());
if (CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState))
{
//Switch GPU context when necessary
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_SwitchGpuContext(m_scalabilityState));
}
// Set HEVC Decode Phase, and execute it.
if (m_shortFormatInUse && m_hcpDecPhase == CodechalHcpDecodePhaseLegacyS2L)
{
if (m_secureDecoder)
{
CODECHAL_DECODE_CHK_STATUS_RETURN(m_secureDecoder->Execute(this));
}
CODECHAL_DECODE_CHK_STATUS_RETURN(SendPictureS2L());
}
else
{
CODECHAL_DECODE_CHK_STATUS_RETURN(SendPictureLongFormat());
}
return eStatus;
}
MOS_STATUS CodechalDecodeHevcG12::SendPictureS2L()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_DECODE_FUNCTION_ENTER;
if (m_enableSf2DmaSubmits)
{
m_osInterface->pfnSetPerfTag(
m_osInterface,
(uint16_t)(((CODECHAL_DECODE_MODE_HUC << 4) & 0xF0) | (m_perfType & 0xF)));
}
MOS_COMMAND_BUFFER primCmdBuffer;
CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &primCmdBuffer, 0));
MHW_MI_FORCE_WAKEUP_PARAMS forceWakeupParams;
MOS_ZeroMemory(&forceWakeupParams, sizeof(MHW_MI_FORCE_WAKEUP_PARAMS));
forceWakeupParams.bMFXPowerWellControl = false;
forceWakeupParams.bMFXPowerWellControlMask = true;
forceWakeupParams.bHEVCPowerWellControl = true;
forceWakeupParams.bHEVCPowerWellControlMask = true;
CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiForceWakeupCmd(
&primCmdBuffer,
&forceWakeupParams));
CODECHAL_DECODE_CHK_STATUS_RETURN(SendPrologWithFrameTracking(
&primCmdBuffer, true));
PMOS_COMMAND_BUFFER cmdBufferInUse = &primCmdBuffer;
MOS_COMMAND_BUFFER scdryCmdBuffer;
if (CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState) && MOS_VE_SUPPORTED(m_osInterface))
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_GetCmdBufferToUse_G12(
m_scalabilityState,
&scdryCmdBuffer,
&cmdBufferInUse));
if (cmdBufferInUse == &scdryCmdBuffer)
{
MHW_MI_FORCE_WAKEUP_PARAMS forceWakeupParams;
MOS_ZeroMemory(&forceWakeupParams, sizeof(MHW_MI_FORCE_WAKEUP_PARAMS));
forceWakeupParams.bMFXPowerWellControl = false;
forceWakeupParams.bMFXPowerWellControlMask = true;
forceWakeupParams.bHEVCPowerWellControl = true;
forceWakeupParams.bHEVCPowerWellControlMask = true;
CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiForceWakeupCmd(
cmdBufferInUse,
&forceWakeupParams));
//send prolog at the start of a secondary cmd buffer
CODECHAL_DECODE_CHK_STATUS_RETURN(SendPrologWithFrameTracking(cmdBufferInUse, false));
}
}
if (CodecHalDecodeScalabilityIsVirtualTileMode(m_scalabilityState) && CodecHalDecodeScalability1stDecPhase(m_scalabilityState))
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_InitSemaMemResources(m_scalabilityState, cmdBufferInUse));
}
CODECHAL_DECODE_CHK_STATUS_RETURN(AddPictureS2LCmds(cmdBufferInUse));
m_osInterface->pfnReturnCommandBuffer(m_osInterface, &primCmdBuffer, 0);
if (CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState) && MOS_VE_SUPPORTED(m_osInterface))
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_ReturnSdryCmdBuffer_G12(m_scalabilityState, &scdryCmdBuffer));
}
return eStatus;
}
MOS_STATUS CodechalDecodeHevcG12::InitPicLongFormatMhwParams()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_DECODE_FUNCTION_ENTER;
// Reset all pic Mhw Params
auto pipeModeSelectParams =
static_cast<PMHW_VDBOX_PIPE_MODE_SELECT_PARAMS_G12>(m_picMhwParams.PipeModeSelectParams);
*pipeModeSelectParams = {};
auto pipeBufAddrParams =
static_cast<PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS_G12>(m_picMhwParams.PipeBufAddrParams);
*pipeBufAddrParams = {};
auto hevcPicStateParams =
static_cast<PMHW_VDBOX_HEVC_PIC_STATE_G12>(m_picMhwParams.HevcPicState);
*hevcPicStateParams = {};
CODECHAL_DECODE_CHK_STATUS_RETURN(CodechalDecodeHevc::InitPicLongFormatMhwParams());
pipeModeSelectParams->bHEVCSeparateTileProgramming = m_isSeparateTileDecoding;
if (CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState))
{
CodecHalDecodeScalablity_DecPhaseToHwWorkMode_G12(
pipeModeSelectParams->MultiEngineMode,
pipeModeSelectParams->PipeWorkMode);
if (m_isRealTile)
{
CodecHalDecodeScalablity_SetPhaseIndicator(
pipeModeSelectParams->ucPhaseIndicator);
}
pipeBufAddrParams->presSliceStateStreamOutBuffer =
&m_scalabilityState->resSliceStateStreamOutBuffer;
pipeBufAddrParams->presMvUpRightColStoreBuffer =
&m_scalabilityState->resMvUpRightColStoreBuffer;
pipeBufAddrParams->presIntraPredUpRightColStoreBuffer =
&m_scalabilityState->resIntraPredUpRightColStoreBuffer;
pipeBufAddrParams->presIntraPredLeftReconColStoreBuffer =
&m_scalabilityState->resIntraPredLeftReconColStoreBuffer;
pipeBufAddrParams->presCABACSyntaxStreamOutBuffer =
m_scalabilityState->presCABACStreamOutBuffer;
}
hevcPicStateParams->pHevcExtPicParams = m_hevcExtPicParams;
hevcPicStateParams->pHevcSccPicParams = m_hevcSccPicParams;
hevcPicStateParams->ucRecNotFilteredID = CodecHalDecodeIsSCCIBCMode(m_hevcSccPicParams) ? m_IBCRefIdx : 0;
return eStatus;
}
MOS_STATUS CodechalDecodeHevcG12::AddPictureLongFormatCmds(
PMOS_COMMAND_BUFFER cmdBufferInUse,
PIC_LONG_FORMAT_MHW_PARAMS *picMhwParams)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_MI_VD_CONTROL_STATE_PARAMS vdCtrlParam;
CODECHAL_DECODE_FUNCTION_ENTER;
CODECHAL_DECODE_CHK_NULL_RETURN(cmdBufferInUse);
CODECHAL_DECODE_CHK_NULL_RETURN(picMhwParams);
// Send VD_CONTROL_STATE Pipe Initialization
MOS_ZeroMemory(&vdCtrlParam, sizeof(MHW_MI_VD_CONTROL_STATE_PARAMS));
vdCtrlParam.initialization = true;
static_cast<MhwMiInterfaceG12*>(m_miInterface)->AddMiVdControlStateCmd(cmdBufferInUse, &vdCtrlParam);
CODECHAL_DECODE_CHK_STATUS_RETURN(m_hcpInterface->AddHcpPipeModeSelectCmd(
cmdBufferInUse,
picMhwParams->PipeModeSelectParams));
if (CodecHalDecodeScalabilityIsBEPhaseG12(m_scalabilityState) ||
m_isRealTile)
{
// Send VD_CONTROL_STATE HcpPipeLock
MOS_ZeroMemory(&vdCtrlParam, sizeof(MHW_MI_VD_CONTROL_STATE_PARAMS));
vdCtrlParam.scalableModePipeLock = true;
static_cast<MhwMiInterfaceG12*>(m_miInterface)->AddMiVdControlStateCmd(cmdBufferInUse, &vdCtrlParam);
}
#ifdef _DECODE_PROCESSING_SUPPORTED
if (!CodecHalDecodeScalabilityIsFEPhase(m_scalabilityState))
{
CODECHAL_DECODE_CHK_STATUS_RETURN(m_sfcState->AddSfcCommands(cmdBufferInUse));
}
#endif
#ifdef _MMC_SUPPORTED
CODECHAL_DECODE_CHK_STATUS_RETURN(m_mmc->SetSurfaceState(picMhwParams->SurfaceParams));
#endif
CODECHAL_DECODE_CHK_STATUS_RETURN(m_hcpInterface->AddHcpSurfaceCmd(
cmdBufferInUse,
picMhwParams->SurfaceParams));
// Let ref always use the same state (including MMC) as decode
picMhwParams->SurfaceParams->ucSurfaceStateId = CODECHAL_HCP_REF_SURFACE_ID;
#ifdef _MMC_SUPPORTED
if (CodecHalDecodeIsSCCIBCMode(m_hevcSccPicParams))
{
uint8_t skipMask = 0;
for (uint8_t i = 0; i < CODECHAL_MAX_CUR_NUM_REF_FRAME_HEVC; i++)
{
if (picMhwParams->PipeBufAddrParams->presReferences[i] == m_presReferences[m_IBCRefIdx])
{
skipMask |= (1 << i);
}
}
picMhwParams->SurfaceParams->mmcSkipMask = skipMask;
CODECHAL_DECODE_NORMALMESSAGE("IBC ref index %d, MMC skip mask %d,", m_IBCRefIdx, skipMask);
}
if (MEDIA_IS_WA(m_waTable, WaDummyReference))
{
uint8_t skipMask = 0;
for (uint8_t i = 0; i < CODECHAL_MAX_CUR_NUM_REF_FRAME_HEVC; i++)
{
if (m_dummyReferenceSlot[i])
{
skipMask |= (1 << i);
}
}
picMhwParams->SurfaceParams->mmcSkipMask |= skipMask;
}
#endif
CODECHAL_DECODE_CHK_STATUS_RETURN(m_hcpInterface->AddHcpSurfaceCmd(
cmdBufferInUse,
picMhwParams->SurfaceParams));
if (CodecHalDecodeIsSCCIBCMode(m_hevcSccPicParams))
{
uint8_t refIdxMask = 0;
for (uint8_t i = 0; i < CODECHAL_MAX_CUR_NUM_REF_FRAME_HEVC; i++)
{
if (picMhwParams->PipeBufAddrParams->presReferences[i] == m_presReferences[m_IBCRefIdx])
{
refIdxMask |= (1 << i);
}
}
picMhwParams->PipeBufAddrParams->IBCRefIdxMask = refIdxMask;
}
CODECHAL_DECODE_CHK_STATUS_RETURN(m_hcpInterface->AddHcpPipeBufAddrCmd(
cmdBufferInUse,
picMhwParams->PipeBufAddrParams));
CODECHAL_DECODE_CHK_STATUS_RETURN(m_hcpInterface->AddHcpIndObjBaseAddrCmd(
cmdBufferInUse,
picMhwParams->IndObjBaseAddrParams));
CODECHAL_DECODE_CHK_STATUS_RETURN(m_hcpInterface->AddHcpQmStateCmd(
cmdBufferInUse,
picMhwParams->QmParams));
CODECHAL_DECODE_CHK_STATUS_RETURN(m_hcpInterface->AddHcpPicStateCmd(
cmdBufferInUse,
picMhwParams->HevcPicState));
if (m_hevcPicParams->tiles_enabled_flag)
{
CODECHAL_DECODE_CHK_STATUS_RETURN(m_hcpInterface->AddHcpTileStateCmd(
cmdBufferInUse,
picMhwParams->HevcTileState));
}
return eStatus;
}
MOS_STATUS CodechalDecodeHevcG12::SendPictureLongFormat()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_DECODE_FUNCTION_ENTER;
if (m_enableSf2DmaSubmits)
{
m_osInterface->pfnSetPerfTag(
m_osInterface,
(uint16_t)(((CODECHAL_DECODE_MODE_HEVCVLD << 4) & 0xF0) | (m_perfType & 0xF)));
}
MOS_COMMAND_BUFFER primCmdBuffer;
CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &primCmdBuffer, 0));
bool sendPrologWithFrameTracking = false;
CODECHAL_DECODE_CHK_STATUS_RETURN(DetermineSendProlgwithFrmTracking(&sendPrologWithFrameTracking));
if (sendPrologWithFrameTracking)
{
MHW_MI_FORCE_WAKEUP_PARAMS forceWakeupParams;
MOS_ZeroMemory(&forceWakeupParams, sizeof(MHW_MI_FORCE_WAKEUP_PARAMS));
forceWakeupParams.bMFXPowerWellControl = false;
forceWakeupParams.bMFXPowerWellControlMask = true;
forceWakeupParams.bHEVCPowerWellControl = true;
forceWakeupParams.bHEVCPowerWellControlMask = true;
CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiForceWakeupCmd(
&primCmdBuffer,
&forceWakeupParams));
//Frame tracking functionality is called at the start of a command buffer.
CODECHAL_DECODE_CHK_STATUS_RETURN(SendPrologWithFrameTracking(
&primCmdBuffer, true));
}
PMOS_COMMAND_BUFFER cmdBufferInUse = &primCmdBuffer;
MOS_COMMAND_BUFFER scdryCmdBuffer;
auto mmioRegisters = m_hwInterface->GetMfxInterface()->GetMmioRegisters(m_vdboxIndex);
HalOcaInterface::On1stLevelBBStart(primCmdBuffer, *m_osInterface->pOsContext, m_osInterface->CurrentGpuContextHandle, *m_miInterface, *mmioRegisters);
if (CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState) && MOS_VE_SUPPORTED(m_osInterface))
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_GetCmdBufferToUse_G12(
m_scalabilityState,
&scdryCmdBuffer,
&cmdBufferInUse));
if ((!m_shortFormatInUse && !CodecHalDecodeScalabilityIsFESeparateSubmission(m_scalabilityState) &&
!m_isRealTile) ||
CodecHalDecodeScalabilityIsBEPhaseG12(m_scalabilityState) ||
CodecHalDecodeScalabilityIsFirstRealTilePhase(m_scalabilityState))
{
MHW_MI_FORCE_WAKEUP_PARAMS forceWakeupParams;
MOS_ZeroMemory(&forceWakeupParams, sizeof(MHW_MI_FORCE_WAKEUP_PARAMS));
forceWakeupParams.bMFXPowerWellControl = false;
forceWakeupParams.bMFXPowerWellControlMask = true;
forceWakeupParams.bHEVCPowerWellControl = true;
forceWakeupParams.bHEVCPowerWellControlMask = true;
CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiForceWakeupCmd(
cmdBufferInUse,
&forceWakeupParams));
//send prolog at the start of a secondary cmd buffer
CODECHAL_DECODE_CHK_STATUS_RETURN(SendPrologWithFrameTracking(cmdBufferInUse, false));
}
}
CODECHAL_DECODE_CHK_STATUS_RETURN(InitPicLongFormatMhwParams());
CODECHAL_DEBUG_TOOL(
for (int32_t n = 0; n < CODECHAL_MAX_CUR_NUM_REF_FRAME_HEVC; n++)
{
if (m_picMhwParams.PipeBufAddrParams->presReferences[n])
{
MOS_SURFACE dstSurface;
MOS_ZeroMemory(&dstSurface, sizeof(MOS_SURFACE));
dstSurface.OsResource = *(m_picMhwParams.PipeBufAddrParams->presReferences[n]);
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalGetResourceInfo(
m_osInterface,
&dstSurface));
m_debugInterface->m_refIndex = (uint16_t)n;
CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface(
&dstSurface,
CodechalDbgAttr::attrReferenceSurfaces,
"RefSurf"));
}
if (m_picMhwParams.PipeBufAddrParams->presColMvTempBuffer[n])
{
m_debugInterface->m_refIndex = (uint16_t)n;
// dump mvdata
CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
m_picMhwParams.PipeBufAddrParams->presColMvTempBuffer[n],
CodechalDbgAttr::attrMvData,
"_DEC",
m_mvBufferSize));
}
}
);
if (CodecHalDecodeScalabilityIsVirtualTileMode(m_scalabilityState) && CodecHalDecodeScalability1stDecPhase(m_scalabilityState))
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_InitSemaMemResources(m_scalabilityState, cmdBufferInUse));
}
//Send status report Start
if (m_statusQueryReportingEnabled)
{
bool sendStatusReportStart = true;
if (CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState))
{
sendStatusReportStart = CodecHalDecodeScalabilityIsFEPhase(m_scalabilityState) || m_scalabilityState->bIsRtMode;
}
if (sendStatusReportStart)
{
CODECHAL_DECODE_CHK_STATUS_RETURN(StartStatusReport(cmdBufferInUse));
}
}
if (m_shortFormatInUse &&
m_statusQueryReportingEnabled &&
(!CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState) ||
CodecHalDecodeScalabilityIsFEPhase(m_scalabilityState)))
{
uint32_t statusBufferOffset = (m_decodeStatusBuf.m_currIndex * sizeof(CodechalDecodeStatus)) +
m_decodeStatusBuf.m_storeDataOffset +
sizeof(uint32_t) * 2;
// Check HuC_STATUS bit15, HW continue if bit15 > 0, otherwise send COND BB END cmd.
CODECHAL_DECODE_CHK_STATUS_RETURN(static_cast<CodechalHwInterfaceG12*>(m_hwInterface)->SendCondBbEndCmd(
&m_decodeStatusBuf.m_statusBuffer,
statusBufferOffset + m_decodeStatusBuf.m_hucErrorStatusMaskOffset,
0,
false,
false,
mhw_mi_g12_X::MI_CONDITIONAL_BATCH_BUFFER_END_CMD::COMPARE_OPERATION_MADGREATERTHANIDD,
cmdBufferInUse));
}
if (CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState))
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_FEBESync_G12(
m_scalabilityState,
cmdBufferInUse,
m_osInterface->phasedSubmission));
if (m_perfFEBETimingEnabled && CodecHalDecodeScalabilityIsLastCompletePhase(m_scalabilityState))
{
CODECHAL_DECODE_CHK_STATUS_RETURN(m_perfProfiler->AddPerfCollectStartCmd((void *)this, m_osInterface, m_miInterface, &scdryCmdBuffer));
}
}
if (CodecHalDecodeScalabilityIsBEPhaseG12(m_scalabilityState) || CodecHalDecodeScalabilityIsFirstRealTilePhase(m_scalabilityState))
{
CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddWatchdogTimerStartCmd(cmdBufferInUse));
}
CODECHAL_DECODE_CHK_STATUS_RETURN(AddPictureLongFormatCmds(cmdBufferInUse, &m_picMhwParams));
m_osInterface->pfnReturnCommandBuffer(m_osInterface, &primCmdBuffer, 0);
if (CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState) && MOS_VE_SUPPORTED(m_osInterface))
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_ReturnSdryCmdBuffer_G12(m_scalabilityState, &scdryCmdBuffer));
}
return eStatus;
}
MOS_STATUS CodechalDecodeHevcG12::AddPipeEpilog(
PMOS_COMMAND_BUFFER cmdBufferInUse,
MOS_COMMAND_BUFFER &scdryCmdBuffer)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_MI_FLUSH_DW_PARAMS flushDwParams;
MOS_ZeroMemory(&flushDwParams, sizeof(flushDwParams));
CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiFlushDwCmd(
cmdBufferInUse,
&flushDwParams));
if (CodecHalDecodeScalabilityIsFEPhase(m_scalabilityState))
{
if (m_scalabilityState->bIsEnableEndCurrentBatchBuffLevel)
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalablity_GetFEReportedCabacStreamoutBufferSize(
m_scalabilityState,
cmdBufferInUse));
}
else
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalablity_SetFECabacStreamoutOverflowStatus(
m_scalabilityState,
cmdBufferInUse));
}
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_SignalFE2BESemaphore(
m_scalabilityState,
cmdBufferInUse));
if (m_perfFEBETimingEnabled)
{
CODECHAL_DECODE_CHK_STATUS_RETURN(m_perfProfiler->AddPerfCollectEndCmd((void *)this, m_osInterface, m_miInterface, &scdryCmdBuffer));
}
}
//Sync for decode completion in scalable mode
if (CodecHalDecodeScalabilityIsBEPhaseG12(m_scalabilityState))
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_BEsCompletionSync(
m_scalabilityState,
cmdBufferInUse));
}
bool syncDestSurface = true;
//if scalable decode, BE0 finish means whole frame complete.
// Check if destination surface needs to be synchronized
if (CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState))
{
syncDestSurface = CodecHalDecodeScalabilityIsLastCompletePhase(m_scalabilityState) ||
CodecHalDecodeScalabilityIsLastRealTilePass(m_scalabilityState);
}
if (syncDestSurface)
{
MOS_SYNC_PARAMS syncParams = g_cInitSyncParams;
syncParams.GpuContext = m_videoContext;
syncParams.presSyncResource = &m_destSurface.OsResource;
syncParams.bReadOnly = false;
syncParams.bDisableDecodeSyncLock = m_disableDecodeSyncLock;
syncParams.bDisableLockForTranscode = m_disableLockForTranscode;
if (!CodecHal_PictureIsField(m_hevcPicParams->CurrPic))
{
CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnPerformOverlaySync(m_osInterface, &syncParams));
CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnResourceWait(m_osInterface, &syncParams));
// Update the resource tag (s/w tag) for On-Demand Sync
m_osInterface->pfnSetResourceSyncTag(m_osInterface, &syncParams);
}
// Update the tag in GPU Sync eStatus buffer (H/W Tag) to match the current S/W tag
if (m_osInterface->bTagResourceSync)
{
CODECHAL_DECODE_CHK_STATUS_RETURN(m_hwInterface->WriteSyncTagToResource(
cmdBufferInUse,
&syncParams));
}
if (m_statusQueryReportingEnabled)
{
CodechalDecodeStatusReport decodeStatusReport;
MOS_ZeroMemory(&decodeStatusReport, sizeof(decodeStatusReport));
decodeStatusReport.m_statusReportNumber = m_statusReportFeedbackNumber;
decodeStatusReport.m_currDecodedPic = m_hevcPicParams->CurrPic;
decodeStatusReport.m_currDeblockedPic = m_hevcPicParams->CurrPic;
decodeStatusReport.m_codecStatus = CODECHAL_STATUS_UNAVAILABLE;
decodeStatusReport.m_currDecodedPicRes = m_hevcRefList[m_hevcPicParams->CurrPic.FrameIdx]->resRefPic;
#ifdef _DECODE_PROCESSING_SUPPORTED
CODECHAL_DEBUG_TOOL(
if (m_downsampledSurfaces && m_sfcState && m_sfcState->m_sfcOutputSurface) {
m_downsampledSurfaces[m_hevcPicParams->CurrPic.FrameIdx].OsResource = m_sfcState->m_sfcOutputSurface->OsResource;
decodeStatusReport.m_currSfcOutputPicRes = &m_downsampledSurfaces[m_hevcPicParams->CurrPic.FrameIdx].OsResource;
})
#endif
CODECHAL_DEBUG_TOOL(
decodeStatusReport.m_secondField = CodecHal_PictureIsBottomField(m_hevcPicParams->CurrPic);
decodeStatusReport.m_frameType = m_perfType;);
CODECHAL_DECODE_CHK_STATUS_RETURN(EndStatusReport(
decodeStatusReport,
cmdBufferInUse));
}
}
MOS_ZeroMemory(&flushDwParams, sizeof(flushDwParams));
CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiFlushDwCmd(
cmdBufferInUse,
&flushDwParams));
CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd(
cmdBufferInUse,
nullptr));
return eStatus;
}
MOS_STATUS CodechalDecodeHevcG12::SendShortSlices(PMOS_COMMAND_BUFFER cmdBuffer)
{
CODECHAL_DECODE_CHK_NULL_RETURN(cmdBuffer);
MHW_VDBOX_HEVC_SLICE_STATE_G12 hevcSliceState;
hevcSliceState.presDataBuffer = m_copyDataBufferInUse ? &m_resCopyDataBuffer : &m_resDataBuffer;
auto slc = m_hevcSliceParams;
for (uint16_t i = 0; i < m_numSlices; i++, slc++)
{
hevcSliceState.pHevcSliceParams = slc;
hevcSliceState.dwLength = slc->slice_data_size;
hevcSliceState.dwSliceIndex = i;
hevcSliceState.bLastSlice = (i == (m_numSlices - 1));
CODECHAL_DECODE_CHK_STATUS_RETURN(SendSliceS2L(cmdBuffer, &hevcSliceState));
}
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalDecodeHevcG12::SendHucFlush(PMOS_COMMAND_BUFFER cmdBuffer,
MOS_COMMAND_BUFFER &primCmdBuffer,
MOS_COMMAND_BUFFER &scdryCmdBuffer,
uint32_t renderingFlags)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_DECODE_CHK_NULL_RETURN(cmdBuffer);
CODECHAL_DECODE_CHK_COND_RETURN(
(m_vdboxIndex > m_mfxInterface->GetMaxVdboxIndex()),
"ERROR - vdbox index exceed the maximum");
auto mmioRegisters = m_hucInterface->GetMmioRegisters(m_vdboxIndex);
uint32_t statusBufferOffset = (m_decodeStatusBuf.m_currIndex * sizeof(CodechalDecodeStatus)) +
m_decodeStatusBuf.m_storeDataOffset +
sizeof(uint32_t) * 2;
// Send VD Pipe Flush command for SKL+
MHW_VDBOX_VD_PIPE_FLUSH_PARAMS vdpipeFlushParams;
MOS_ZeroMemory(&vdpipeFlushParams, sizeof(vdpipeFlushParams));
vdpipeFlushParams.Flags.bWaitDoneHEVC = 1;
vdpipeFlushParams.Flags.bFlushHEVC = 1;
vdpipeFlushParams.Flags.bWaitDoneVDCmdMsgParser = 1;
CODECHAL_DECODE_CHK_STATUS_RETURN(m_vdencInterface->AddVdPipelineFlushCmd(
cmdBuffer,
&vdpipeFlushParams));
MHW_MI_FLUSH_DW_PARAMS flushDwParams;
MOS_ZeroMemory(&flushDwParams, sizeof(flushDwParams));
CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiFlushDwCmd(
cmdBuffer,
&flushDwParams));
if (m_statusQueryReportingEnabled)
{
// Check HuC_STATUS2 bit6, if bit6 > 0 HW continue execution following cmd, otherwise it send a COND BB END cmd.
eStatus = static_cast<CodechalHwInterfaceG12*>(m_hwInterface)->SendCondBbEndCmd(
&m_decodeStatusBuf.m_statusBuffer,
statusBufferOffset + m_decodeStatusBuf.m_hucErrorStatus2MaskOffset,
0,
false,
false,
mhw_mi_g12_X::MI_CONDITIONAL_BATCH_BUFFER_END_CMD::COMPARE_OPERATION_MADGREATERTHANIDD,
cmdBuffer);
CODECHAL_DECODE_CHK_STATUS_RETURN(eStatus);
// Write HUC_STATUS mask
MHW_MI_STORE_DATA_PARAMS storeDataParams;
MOS_ZeroMemory(&storeDataParams, sizeof(storeDataParams));
storeDataParams.pOsResource = &m_decodeStatusBuf.m_statusBuffer;
storeDataParams.dwResourceOffset = statusBufferOffset + m_decodeStatusBuf.m_hucErrorStatusMaskOffset;
storeDataParams.dwValue = m_hucInterface->GetHucStatusHevcS2lFailureMask();
CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiStoreDataImmCmd(
cmdBuffer,
&storeDataParams));
// store HUC_STATUS register
MHW_MI_STORE_REGISTER_MEM_PARAMS storeRegParams;
MOS_ZeroMemory(&storeRegParams, sizeof(storeRegParams));
storeRegParams.presStoreBuffer = &m_decodeStatusBuf.m_statusBuffer;
storeRegParams.dwOffset = statusBufferOffset + m_decodeStatusBuf.m_hucErrorStatusRegOffset;
storeRegParams.dwRegister = mmioRegisters->hucStatusRegOffset;
CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiStoreRegisterMemCmd(
cmdBuffer,
&storeRegParams));
}
if (m_enableSf2DmaSubmits)
{
CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferEnd(
cmdBuffer,
nullptr));
}
CODECHAL_DECODE_CHK_NULL_RETURN(m_osInterface);
m_osInterface->pfnReturnCommandBuffer(m_osInterface, &primCmdBuffer, 0);
if (CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState) && MOS_VE_SUPPORTED(m_osInterface))
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_ReturnSdryCmdBuffer_G12(m_scalabilityState, &scdryCmdBuffer));
}
if (m_enableSf2DmaSubmits)
{
CODECHAL_DEBUG_TOOL(
CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
cmdBuffer,
CODECHAL_NUM_MEDIA_STATES,
"_DEC"));
);
CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(
m_osInterface,
cmdBuffer,
renderingFlags));
}
return eStatus;
}
MOS_STATUS CodechalDecodeHevcG12::DecodePrimitiveLevel()
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MHW_MI_VD_CONTROL_STATE_PARAMS vdCtrlParam;
CODECHAL_DECODE_FUNCTION_ENTER;
// Bitstream is incomplete, don't do any decoding work.
if (m_incompletePicture)
{
return MOS_STATUS_SUCCESS;
}
uint32_t renderingFlags = m_videoContextUsesNullHw;
MOS_COMMAND_BUFFER primCmdBuffer;
CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnGetCommandBuffer(m_osInterface, &primCmdBuffer, 0));
PMOS_COMMAND_BUFFER cmdBufferInUse = &primCmdBuffer;
MOS_COMMAND_BUFFER scdryCmdBuffer;
if (CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState) && MOS_VE_SUPPORTED(m_osInterface))
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_GetCmdBufferToUse_G12(
m_scalabilityState,
&scdryCmdBuffer,
&cmdBufferInUse));
}
if (m_shortFormatInUse && m_hcpDecPhase == CodechalHcpDecodePhaseLegacyS2L)
{
CODECHAL_DECODE_CHK_STATUS_RETURN(SendShortSlices(cmdBufferInUse));
return SendHucFlush(cmdBufferInUse, primCmdBuffer, scdryCmdBuffer, renderingFlags);
}
else if (CodecHalDecodeScalabilityIsBEPhaseG12(m_scalabilityState))
{
MHW_VDBOX_HCP_TILE_CODING_PARAMS_G12 hcpTileCodingParam;
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_CalculateHcpTileCodingParams<MHW_VDBOX_HCP_TILE_CODING_PARAMS_G12>(
m_scalabilityState,
m_hevcPicParams,
&hcpTileCodingParam));
CODECHAL_DECODE_CHK_STATUS_RETURN(static_cast<MhwVdboxHcpInterfaceG12*>(m_hcpInterface)->AddHcpTileCodingCmd(
cmdBufferInUse,
&hcpTileCodingParam));
}
else if (m_cencBuf)
{
CODECHAL_DECODE_CHK_STATUS_RETURN(SetCencBatchBuffer(cmdBufferInUse));
}
else
{
if (m_isRealTile)
{
uint8_t col = 0;
CodecHalDecodeScalability_GetCurrentRealTileColumnId(m_scalabilityState, col);
CODECHAL_DECODE_ASSERT(col < m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex].count);
m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex].dwOffset = col * m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex].iSize;
}
else
{
m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex].dwOffset = 0;
}
CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMiBatchBufferStartCmd(
cmdBufferInUse,
&m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex]));
}
// Send VD_CONTROL_STATE Memory Implict Flush
MOS_ZeroMemory(&vdCtrlParam, sizeof(MHW_MI_VD_CONTROL_STATE_PARAMS));
vdCtrlParam.memoryImplicitFlush = true;
static_cast<MhwMiInterfaceG12*>(m_miInterface)->AddMiVdControlStateCmd(cmdBufferInUse, &vdCtrlParam);
if (CodecHalDecodeScalabilityIsBEPhaseG12(m_scalabilityState) ||
m_isRealTile)
{
// Send VD_CONTROL_STATE HCP Pipe Unlock
MOS_ZeroMemory(&vdCtrlParam, sizeof(MHW_MI_VD_CONTROL_STATE_PARAMS));
vdCtrlParam.scalableModePipeUnlock = true;
static_cast<MhwMiInterfaceG12*>(m_miInterface)->AddMiVdControlStateCmd(cmdBufferInUse, &vdCtrlParam);
}
if (m_isRealTile)
{
CODECHAL_DECODE_CHK_STATUS_RETURN(m_miInterface->AddMfxWaitCmd(cmdBufferInUse, nullptr, true));
}
// store CS ENGINE ID register
if (static_cast<MhwVdboxMfxInterfaceG12*>(m_mfxInterface)->IsScalabilitySupported())
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_ReadCSEngineIDReg_G12(
m_scalabilityState,
&m_decodeStatusBuf,
cmdBufferInUse));
}
// Send VD Pipe Flush command for SKL+
MHW_VDBOX_VD_PIPE_FLUSH_PARAMS vdpipeFlushParams;
MOS_ZeroMemory(&vdpipeFlushParams, sizeof(vdpipeFlushParams));
vdpipeFlushParams.Flags.bWaitDoneHEVC = 1;
vdpipeFlushParams.Flags.bFlushHEVC = 1;
vdpipeFlushParams.Flags.bWaitDoneVDCmdMsgParser = 1;
CODECHAL_DECODE_CHK_STATUS_RETURN(m_vdencInterface->AddVdPipelineFlushCmd(
cmdBufferInUse,
&vdpipeFlushParams));
// Needs to be re-set for Linux buffer re-use scenarios
if (CodecHalDecodeScalabilityIsLastRealTilePass(m_scalabilityState) || !CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState))
{
m_hevcRefList[m_hevcPicParams->CurrPic.FrameIdx]->resRefPic =
m_destSurface.OsResource;
}
if (!m_isRealTile ||
CodecHalDecodeScalabilityIsLastRealTilePhase(m_scalabilityState))
{
CODECHAL_DECODE_CHK_STATUS_RETURN(AddPipeEpilog(cmdBufferInUse, scdryCmdBuffer));
}
m_osInterface->pfnReturnCommandBuffer(m_osInterface, &primCmdBuffer, 0);
if (CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState) && MOS_VE_SUPPORTED(m_osInterface))
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_ReturnSdryCmdBuffer_G12(m_scalabilityState, &scdryCmdBuffer));
}
bool syncCompleteFrame = m_copyDataBufferInUse;
if (MOS_VE_SUPPORTED(m_osInterface) && CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState))
{
syncCompleteFrame = syncCompleteFrame && CodecHalDecodeScalabilityIsFEPhase(m_scalabilityState);
}
if (syncCompleteFrame)
{
//Sync up complete frame
MOS_SYNC_PARAMS copyDataSyncParams = g_cInitSyncParams;
copyDataSyncParams.GpuContext = m_videoContextForWa;
copyDataSyncParams.presSyncResource = &m_resSyncObjectWaContextInUse;
CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineSignal(m_osInterface, &copyDataSyncParams));
copyDataSyncParams = g_cInitSyncParams;
copyDataSyncParams.GpuContext = m_videoContext;
copyDataSyncParams.presSyncResource = &m_resSyncObjectWaContextInUse;
CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnEngineWait(m_osInterface, &copyDataSyncParams));
}
CODECHAL_DEBUG_TOOL(
{
if (CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState))
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_DbgDumpCmdBuffer_G12(
this,
m_scalabilityState,
m_debugInterface,
&primCmdBuffer));
}
else
{
CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpCmdBuffer(
&primCmdBuffer,
CODECHAL_NUM_MEDIA_STATES,
"_DEC"));
}
});
bool submitCommand = true;
//submit command buffer
if (MOS_VE_SUPPORTED(m_osInterface) && CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState))
{
submitCommand = CodecHalDecodeScalabilityIsToSubmitCmdBuffer_G12(m_scalabilityState);
}
if (m_osInterface->osCpInterface->IsHMEnabled())
{
HalOcaInterface::DumpCpParam(primCmdBuffer, *m_osInterface->pOsContext, m_osInterface->osCpInterface->GetOcaDumper());
}
HalOcaInterface::On1stLevelBBEnd(primCmdBuffer, *m_osInterface->pOsContext);
if (submitCommand || m_osInterface->phasedSubmission)
{
//command buffer to submit is the primary cmd buffer.
if ( MOS_VE_SUPPORTED(m_osInterface))
{
CODECHAL_DECODE_CHK_STATUS_RETURN(SetAndPopulateVEHintParams(&primCmdBuffer));
}
if(m_osInterface->phasedSubmission
&& MOS_VE_SUPPORTED(m_osInterface)
&& CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState))
{
CodecHalDecodeScalability_DecPhaseToSubmissionType_G12(m_scalabilityState,cmdBufferInUse);
CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, cmdBufferInUse, renderingFlags));
}
else
{
CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &primCmdBuffer, renderingFlags));
}
}
// If S2L and 2nd pass, jump to 2nd level batch buffer
if ((!Mos_ResourceIsNull(&m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex].OsResource))
&& m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex].dwOffset == 0)
{
#if (_DEBUG || _RELEASE_INTERNAL)
m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex].iLastCurrent = m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex].iSize * m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex].count;
#endif
CODECHAL_DEBUG_TOOL(
CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->Dump2ndLvlBatch(
&m_secondLevelBatchBuffer[m_secondLevelBatchBufferIndex],
CODECHAL_NUM_MEDIA_STATES,
"_DEC"));)
}
CODECHAL_DEBUG_TOOL(
m_mmc->UpdateUserFeatureKey(&m_destSurface);
if (m_histogramDebug && m_histogramSurface)
{
CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpBuffer(
&m_histogramSurface->OsResource,
CodechalDbgAttr::attrSfcHistogram,
"_DEC",
256 * 4));
})
// Reset status report
if (m_statusQueryReportingEnabled)
{
bool resetStatusReport = true;
//if scalable decode, reset status report at final BE phase.
if (CodecHalDecodeScalabilityIsScalableMode(m_scalabilityState))
{
resetStatusReport = CodecHalDecodeScalabilityIsFinalBEPhaseG12(m_scalabilityState);
}
if (resetStatusReport)
{
CODECHAL_DECODE_CHK_STATUS_RETURN(ResetStatusReport(
m_videoContextUsesNullHw));
}
}
// Send the signal to indicate decode completion, in case On-Demand Sync is not present
if (!CodecHal_PictureIsField(m_hevcPicParams->CurrPic))
{
MOS_SYNC_PARAMS syncParams = g_cInitSyncParams;
syncParams.GpuContext = m_videoContext;
syncParams.presSyncResource = &m_destSurface.OsResource;
CODECHAL_DECODE_CHK_STATUS_RETURN(m_osInterface->pfnResourceSignal(m_osInterface, &syncParams));
}
// Scalability real tile, move to next tile column
if (m_isRealTile)
{
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_AdvanceRealTilePass(m_scalabilityState));
}
#ifdef LINUX
#ifdef _DECODE_PROCESSING_SUPPORTED
CODECHAL_DEBUG_TOOL(
if (m_sfcState->m_sfcOutputSurface)
{
MOS_SURFACE dstSurface;
MOS_ZeroMemory(&dstSurface, sizeof(dstSurface));
dstSurface.Format = Format_NV12;
dstSurface.OsResource = m_sfcState->m_sfcOutputSurface->OsResource;
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalGetResourceInfo(
m_osInterface,
&dstSurface));
CODECHAL_DECODE_CHK_STATUS_RETURN(m_debugInterface->DumpYUVSurface(
&dstSurface,
CodechalDbgAttr::attrSfcOutputSurface,
"SfcDstSurf"));
}
)
#endif
#endif
return eStatus;
}
MOS_STATUS CodechalDecodeHevcG12::InitMmcState()
{
#ifdef _MMC_SUPPORTED
m_mmc = MOS_New(CodechalMmcDecodeHevcG12, m_hwInterface, this);
CODECHAL_DECODE_CHK_NULL_RETURN(m_mmc);
#endif
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalDecodeHevcG12::AllocateStandard (
CodechalSetting * settings)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
CODECHAL_DECODE_FUNCTION_ENTER;
CODECHAL_DECODE_CHK_NULL_RETURN(settings);
CODECHAL_DECODE_CHK_STATUS_RETURN(InitMmcState());
m_width = settings->width;
m_height = settings->height;
m_is10BitHevc = (settings->lumaChromaDepth & CODECHAL_LUMA_CHROMA_DEPTH_10_BITS) ? true : false;
m_is12BitHevc = (settings->lumaChromaDepth & CODECHAL_LUMA_CHROMA_DEPTH_12_BITS) ? true : false;
m_chromaFormatinProfile = settings->chromaFormat;
m_shortFormatInUse = settings->shortFormatInUse;
#ifdef _DECODE_PROCESSING_SUPPORTED
m_sfcState = MOS_New(CodechalHevcSfcStateG12);
CODECHAL_DECODE_CHK_NULL_RETURN(m_sfcState);
CODECHAL_DECODE_CHK_STATUS_RETURN(m_sfcState->InitializeSfcState(
this,
m_hwInterface,
m_osInterface));
#endif
MOS_ZeroMemory(&m_currPic, sizeof(m_currPic));
m_frameIdx = 0;
if (m_shortFormatInUse)
{
// Legacy SF has 2 passes, 1st pass is S2L, 2nd pass is HEVC Long decode
// The pass number will be changed again if is scalable decode mode.
m_decodePassNum = 2;
MOS_USER_FEATURE_VALUE_DATA userFeatureData;
MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
MOS_UserFeature_ReadValue_ID(
nullptr,
__MEDIA_USER_FEATURE_VALUE_HEVC_SF_2_DMA_SUBMITS_ENABLE_ID,
&userFeatureData);
m_enableSf2DmaSubmits = userFeatureData.u32Data ? true : false;
}
MHW_VDBOX_STATE_CMDSIZE_PARAMS_G12 stateCmdSizeParams;
stateCmdSizeParams.bShortFormat = m_shortFormatInUse;
stateCmdSizeParams.bHucDummyStream = (m_secureDecoder ? m_secureDecoder->IsDummyStreamEnabled() : false);
stateCmdSizeParams.bScalableMode = static_cast<MhwVdboxMfxInterfaceG12*>(m_mfxInterface)->IsScalabilitySupported();
stateCmdSizeParams.bSfcInUse = true;
// Picture Level Commands
CODECHAL_DECODE_CHK_STATUS_RETURN(m_hwInterface->GetHxxStateCommandSize(
m_mode,
&m_commandBufferSizeNeeded,
&m_commandPatchListSizeNeeded,
&stateCmdSizeParams));
// Primitive Level Commands
CODECHAL_DECODE_CHK_STATUS_RETURN(m_hwInterface->GetHxxPrimitiveCommandSize(
m_mode,
&m_standardDecodeSizeNeeded,
&m_standardDecodePatchListSizeNeeded,
m_shortFormatInUse));
if ( MOS_VE_SUPPORTED(m_osInterface))
{
if (static_cast<MhwVdboxMfxInterfaceG12*>(m_mfxInterface)->IsScalabilitySupported())
{
m_scalabilityState = (PCODECHAL_DECODE_SCALABILITY_STATE_G12)MOS_AllocAndZeroMemory(sizeof(CODECHAL_DECODE_SCALABILITY_STATE_G12));
CODECHAL_DECODE_CHK_NULL_RETURN(m_scalabilityState);
//scalability initialize
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeScalability_InitializeState_G12(
this,
m_scalabilityState,
m_hwInterface,
m_shortFormatInUse));
}
else
{
//single pipe VE initialize
m_sinlgePipeVeState = (PCODECHAL_DECODE_SINGLEPIPE_VIRTUALENGINE_STATE)MOS_AllocAndZeroMemory(sizeof(CODECHAL_DECODE_SINGLEPIPE_VIRTUALENGINE_STATE));
CODECHAL_DECODE_CHK_NULL_RETURN(m_sinlgePipeVeState);
CODECHAL_DECODE_CHK_STATUS_RETURN(CodecHalDecodeSinglePipeVE_InitInterface(m_osInterface, m_sinlgePipeVeState));
}
}
CODECHAL_DECODE_CHK_STATUS_RETURN(CodechalDecodeHevc::AllocateResourcesFixedSizes());
// Prepare Pic Params
m_picMhwParams.PipeModeSelectParams = MOS_New(MHW_VDBOX_PIPE_MODE_SELECT_PARAMS_G12);
m_picMhwParams.SurfaceParams = MOS_New(MHW_VDBOX_SURFACE_PARAMS);
m_picMhwParams.PipeBufAddrParams = MOS_New(MHW_VDBOX_PIPE_BUF_ADDR_PARAMS_G12);
m_picMhwParams.IndObjBaseAddrParams = MOS_New(MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS);
m_picMhwParams.QmParams = MOS_New(MHW_VDBOX_QM_PARAMS);
m_picMhwParams.HevcPicState = MOS_New(MHW_VDBOX_HEVC_PIC_STATE_G12);
m_picMhwParams.HevcTileState = MOS_New(MHW_VDBOX_HEVC_TILE_STATE);
MOS_ZeroMemory(m_picMhwParams.SurfaceParams, sizeof(MHW_VDBOX_SURFACE_PARAMS));
MOS_ZeroMemory(m_picMhwParams.IndObjBaseAddrParams, sizeof(MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS));
MOS_ZeroMemory(m_picMhwParams.QmParams, sizeof(MHW_VDBOX_QM_PARAMS));
MOS_ZeroMemory(m_picMhwParams.HevcTileState, sizeof(MHW_VDBOX_HEVC_TILE_STATE));
return eStatus;
}
CodechalDecodeHevcG12::CodechalDecodeHevcG12(
CodechalHwInterface * hwInterface,
CodechalDebugInterface *debugInterface,
PCODECHAL_STANDARD_INFO standardInfo) : CodechalDecodeHevc(hwInterface, debugInterface, standardInfo),
m_hevcExtPicParams(nullptr),
m_hevcExtSliceParams(nullptr),
m_hevcSccPicParams(nullptr),
m_hevcSubsetParams(nullptr),
m_ctbSize(0),
m_frameSizeMaxAlloced(0),
m_twoVersionsOfCurrDecPicFlag(false),
m_IBCRefIdx(0),
#if (_DEBUG || _RELEASE_INTERNAL)
m_rtFrameCount(0),
m_vtFrameCount(0),
m_spFrameCount(0),
#endif
m_sinlgePipeVeState(nullptr),
m_scalabilityState(nullptr)
{
CODECHAL_DECODE_FUNCTION_ENTER;
MOS_ZeroMemory(&m_resRefBeforeLoopFilter, sizeof(m_resRefBeforeLoopFilter));
CODECHAL_DECODE_CHK_NULL_NO_STATUS_RETURN(m_osInterface);
Mos_CheckVirtualEngineSupported(m_osInterface, true, true);
#if (_DEBUG || _RELEASE_INTERNAL)
MOS_USER_FEATURE_VALUE_DATA userFeatureData;
MOS_ZeroMemory(&userFeatureData, sizeof(userFeatureData));
MOS_UserFeature_ReadValue_ID(
nullptr,
__MEDIA_USER_FEATURE_VALUE_HEVC_DECODE_HISTOGRAM_DEBUG_ID_G12,
&userFeatureData);
m_histogramDebug = userFeatureData.u32Data ? true : false;
#endif
}
#if USE_CODECHAL_DEBUG_TOOL
MOS_STATUS CodechalDecodeHevcG12::DumpPicParams(
PCODEC_HEVC_PIC_PARAMS picParams,
PCODEC_HEVC_EXT_PIC_PARAMS extPicParams,
PCODEC_HEVC_SCC_PIC_PARAMS sccPicParams)
{
CODECHAL_DEBUG_FUNCTION_ENTER;
if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrPicParams))
{
return MOS_STATUS_SUCCESS;
}
CODECHAL_DEBUG_CHK_NULL(picParams);
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss.setf(std::ios::hex, std::ios::basefield);
oss << "PicWidthInMinCbsY: " << +picParams->PicWidthInMinCbsY << std::endl;
oss << "PicHeightInMinCbsY: " << +picParams->PicHeightInMinCbsY << std::endl;
//wFormatAndSequenceInfoFlags
oss << "chroma_format_idc: " << +picParams->chroma_format_idc << std::endl;
oss << "separate_colour_plane_flag: " << +picParams->separate_colour_plane_flag << std::endl;
oss << "bit_depth_luma_minus8: " << +picParams->bit_depth_luma_minus8 << std::endl;
oss << "bit_depth_chroma_minus8: " << +picParams->bit_depth_chroma_minus8 << std::endl;
oss << "log2_max_pic_order_cnt_lsb_minus4: " << +picParams->log2_max_pic_order_cnt_lsb_minus4 << std::endl;
oss << "NoPicReorderingFlag: " << +picParams->NoPicReorderingFlag << std::endl;
oss << "ReservedBits1: " << +picParams->ReservedBits1 << std::endl;
oss << "wFormatAndSequenceInfoFlags: " << +picParams->wFormatAndSequenceInfoFlags << std::endl;
oss << "CurrPic FrameIdx: " << +picParams->CurrPic.FrameIdx << std::endl;
oss << "CurrPic PicFlags: " << +picParams->CurrPic.PicFlags << std::endl;
oss << "sps_max_dec_pic_buffering_minus1: " << +picParams->sps_max_dec_pic_buffering_minus1 << std::endl;
oss << "log2_min_luma_coding_block_size_minus3: " << +picParams->log2_min_luma_coding_block_size_minus3 << std::endl;
oss << "log2_diff_max_min_luma_coding_block_size: " << +picParams->log2_diff_max_min_luma_coding_block_size << std::endl;
oss << "log2_min_transform_block_size_minus2: " << +picParams->log2_min_transform_block_size_minus2 << std::endl;
oss << "log2_diff_max_min_transform_block_size: " << +picParams->log2_diff_max_min_transform_block_size << std::endl;
oss << "max_transform_hierarchy_depth_intra: " << +picParams->max_transform_hierarchy_depth_intra << std::endl;
oss << "max_transform_hierarchy_depth_inter: " << +picParams->max_transform_hierarchy_depth_inter << std::endl;
oss << "num_short_term_ref_pic_sets: " << +picParams->num_short_term_ref_pic_sets << std::endl;
oss << "num_long_term_ref_pic_sps: " << +picParams->num_long_term_ref_pic_sps << std::endl;
oss << "num_ref_idx_l0_default_active_minus1: " << +picParams->num_ref_idx_l0_default_active_minus1 << std::endl;
oss << "num_ref_idx_l1_default_active_minus1: " << +picParams->num_ref_idx_l1_default_active_minus1 << std::endl;
oss << "init_qp_minus26: " << +picParams->init_qp_minus26 << std::endl;
oss << "ucNumDeltaPocsOfRefRpsIdx: " << +picParams->ucNumDeltaPocsOfRefRpsIdx << std::endl;
oss << "wNumBitsForShortTermRPSInSlice: " << +picParams->wNumBitsForShortTermRPSInSlice << std::endl;
oss << "ReservedBits2: " << +picParams->ReservedBits2 << std::endl;
//dwCodingParamToolFlags
oss << "scaling_list_enabled_flag: " << +picParams->scaling_list_enabled_flag << std::endl;
oss << "amp_enabled_flag: " << +picParams->amp_enabled_flag << std::endl;
oss << "sample_adaptive_offset_enabled_flag: " << +picParams->sample_adaptive_offset_enabled_flag << std::endl;
oss << "pcm_enabled_flag: " << +picParams->pcm_enabled_flag << std::endl;
oss << "pcm_sample_bit_depth_luma_minus1: " << +picParams->pcm_sample_bit_depth_luma_minus1 << std::endl;
oss << "pcm_sample_bit_depth_chroma_minus1: " << +picParams->pcm_sample_bit_depth_chroma_minus1 << std::endl;
oss << "log2_min_pcm_luma_coding_block_size_minus3: " << +picParams->log2_min_pcm_luma_coding_block_size_minus3 << std::endl;
oss << "log2_diff_max_min_pcm_luma_coding_block_size: " << +picParams->log2_diff_max_min_pcm_luma_coding_block_size << std::endl;
oss << "pcm_loop_filter_disabled_flag: " << +picParams->pcm_loop_filter_disabled_flag << std::endl;
oss << "long_term_ref_pics_present_flag: " << +picParams->long_term_ref_pics_present_flag << std::endl;
oss << "sps_temporal_mvp_enabled_flag: " << +picParams->sps_temporal_mvp_enabled_flag << std::endl;
oss << "strong_intra_smoothing_enabled_flag: " << +picParams->strong_intra_smoothing_enabled_flag << std::endl;
oss << "dependent_slice_segments_enabled_flag: " << +picParams->dependent_slice_segments_enabled_flag << std::endl;
oss << "output_flag_present_flag: " << +picParams->output_flag_present_flag << std::endl;
oss << "num_extra_slice_header_bits: " << +picParams->num_extra_slice_header_bits << std::endl;
oss << "sign_data_hiding_enabled_flag: " << +picParams->sign_data_hiding_enabled_flag << std::endl;
oss << "cabac_init_present_flag: " << +picParams->cabac_init_present_flag << std::endl;
oss << "ReservedBits3: " << +picParams->ReservedBits3 << std::endl;
oss << "dwCodingParamToolFlags: " << +picParams->dwCodingParamToolFlags << std::endl;
//dwCodingSettingPicturePropertyFlags
oss << "constrained_intra_pred_flag: " << +picParams->constrained_intra_pred_flag << std::endl;
oss << "transform_skip_enabled_flag: " << +picParams->transform_skip_enabled_flag << std::endl;
oss << "cu_qp_delta_enabled_flag: " << +picParams->cu_qp_delta_enabled_flag << std::endl;
oss << "diff_cu_qp_delta_depth: " << +picParams->diff_cu_qp_delta_depth << std::endl;
oss << "pps_slice_chroma_qp_offsets_present_flag: " << +picParams->pps_slice_chroma_qp_offsets_present_flag << std::endl;
oss << "weighted_pred_flag: " << +picParams->weighted_pred_flag << std::endl;
oss << "weighted_bipred_flag: " << +picParams->weighted_bipred_flag << std::endl;
oss << "transquant_bypass_enabled_flag: " << +picParams->transquant_bypass_enabled_flag << std::endl;
oss << "tiles_enabled_flag: " << +picParams->tiles_enabled_flag << std::endl;
oss << "entropy_coding_sync_enabled_flag: " << +picParams->entropy_coding_sync_enabled_flag << std::endl;
oss << "uniform_spacing_flag: " << +picParams->uniform_spacing_flag << std::endl;
oss << "loop_filter_across_tiles_enabled_flag: " << +picParams->loop_filter_across_tiles_enabled_flag << std::endl;
oss << "pps_loop_filter_across_slices_enabled_flag: " << +picParams->pps_loop_filter_across_slices_enabled_flag << std::endl;
oss << "deblocking_filter_override_enabled_flag: " << +picParams->deblocking_filter_override_enabled_flag << std::endl;
oss << "pps_deblocking_filter_disabled_flag: " << +picParams->pps_deblocking_filter_disabled_flag << std::endl;
oss << "lists_modification_present_flag: " << +picParams->lists_modification_present_flag << std::endl;
oss << "slice_segment_header_extension_present_flag: " << +picParams->slice_segment_header_extension_present_flag << std::endl;
oss << "IrapPicFlag: " << +picParams->IrapPicFlag << std::endl;
oss << "IdrPicFlag: " << +picParams->IdrPicFlag << std::endl;
oss << "IntraPicFlag: " << +picParams->IntraPicFlag << std::endl;
oss << "ReservedBits4: " << +picParams->ReservedBits4 << std::endl;
oss << "dwCodingSettingPicturePropertyFlags: " << +picParams->dwCodingSettingPicturePropertyFlags << std::endl;
oss << "pps_cb_qp_offset: " << +picParams->pps_cb_qp_offset << std::endl;
oss << "pps_cr_qp_offset: " << +picParams->pps_cr_qp_offset << std::endl;
oss << "num_tile_columns_minus1: " << +picParams->num_tile_columns_minus1 << std::endl;
oss << "num_tile_rows_minus1: " << +picParams->num_tile_rows_minus1 << std::endl;
//Dump column width
oss << "column_width_minus1[19]:";
for (uint8_t i = 0; i < 19; i++)
oss << picParams->column_width_minus1[i] << " ";
oss << std::endl;
//Dump row height
oss << "row_height_minus1[21]:";
for (uint8_t i = 0; i < 21; i++)
oss << picParams->row_height_minus1[i] << " ";
oss << std::endl;
oss << "pps_beta_offset_div2: " << +picParams->pps_beta_offset_div2 << std::endl;
oss << "pps_tc_offset_div2: " << +picParams->pps_tc_offset_div2 << std::endl;
oss << "log2_parallel_merge_level_minus2: " << +picParams->log2_parallel_merge_level_minus2 << std::endl;
oss << "CurrPicOrderCntVal: " << +picParams->CurrPicOrderCntVal << std::endl;
oss.setf(std::ios::dec, std::ios::basefield);
//Dump RefFrameList[15]
for (uint8_t i = 0; i < 15; ++i)
{
oss << "RefFrameList[" << +i << "] FrameIdx:" << +picParams->RefFrameList[i].FrameIdx << std::endl;
oss << "RefFrameList[" << +i << "] PicFlags:" << +picParams->RefFrameList[i].PicFlags << std::endl;
}
//Dump POC List
oss << "PicOrderCntValList[15]:";
for (uint8_t i = 0; i < 15; i++)
oss << std::hex << picParams->PicOrderCntValList[i] << " ";
oss << std::endl;
//Dump Ref RefPicSetStCurrBefore List
oss << "RefPicSetStCurrBefore[8]:";
for (uint8_t i = 0; i < 8; i++)
oss << picParams->RefPicSetStCurrBefore[i] << " ";
oss << std::endl;
//Dump Ref RefPicSetStCurrAfter List
oss << "RefPicSetStCurrAfter[16]:";
for (uint8_t i = 0; i < 8; i++)
oss << picParams->RefPicSetStCurrAfter[i] << " ";
oss << std::endl;
//Dump Ref PicSetStCurr List
oss << "RefPicSetLtCurr[16]:";
for (uint8_t i = 0; i < 8; i++)
oss << picParams->RefPicSetLtCurr[i] << " ";
oss << std::endl;
//Dump Ref RefPicSetStCurrBefore List with POC
oss << "RefPicSetStCurrBefore[8] (POC): ";
for (uint8_t i = 0; i < 8; i++)
oss << picParams->PicOrderCntValList[picParams->RefPicSetStCurrBefore[i]] << " ";
oss << std::endl;
//Dump Ref RefPicSetStCurrAfter List with POC
oss << "RefPicSetStCurrAfter[16] (POC):";
for (uint8_t i = 0; i < 8; i++)
oss << picParams->PicOrderCntValList[picParams->RefPicSetStCurrAfter[i]] << " ";
oss << std::endl;
//Dump Ref PicSetStCurr List with POC
oss << "RefPicSetLtCurr[16] (POC): ";
for (uint8_t i = 0; i < 8; i++)
oss << picParams->PicOrderCntValList[picParams->RefPicSetLtCurr[i]] << " ";
oss << std::endl;
oss << "RefFieldPicFlag: " << +picParams->RefFieldPicFlag << std::endl;
oss << "RefBottomFieldFlag: " << +picParams->RefBottomFieldFlag << std::endl;
oss << "StatusReportFeedbackNumber: " << +picParams->StatusReportFeedbackNumber << std::endl;
if (extPicParams)
{
//PicRangeExtensionFlags
oss << "transform_skip_rotation_enabled_flag: " << +extPicParams->PicRangeExtensionFlags.fields.transform_skip_rotation_enabled_flag << std::endl;
oss << "transform_skip_context_enabled_flag: " << +extPicParams->PicRangeExtensionFlags.fields.transform_skip_context_enabled_flag << std::endl;
oss << "implicit_rdpcm_enabled_flag: " << +extPicParams->PicRangeExtensionFlags.fields.implicit_rdpcm_enabled_flag << std::endl;
oss << "explicit_rdpcm_enabled_flag: " << +extPicParams->PicRangeExtensionFlags.fields.explicit_rdpcm_enabled_flag << std::endl;
oss << "extended_precision_processing_flag: " << +extPicParams->PicRangeExtensionFlags.fields.extended_precision_processing_flag << std::endl;
oss << "intra_smoothing_disabled_flag: " << +extPicParams->PicRangeExtensionFlags.fields.intra_smoothing_disabled_flag << std::endl;
oss << "high_precision_offsets_enabled_flag: " << +extPicParams->PicRangeExtensionFlags.fields.high_precision_offsets_enabled_flag << std::endl;
oss << "persistent_rice_adaptation_enabled_flag: " << +extPicParams->PicRangeExtensionFlags.fields.persistent_rice_adaptation_enabled_flag << std::endl;
oss << "cabac_bypass_alignment_enabled_flag: " << +extPicParams->PicRangeExtensionFlags.fields.cabac_bypass_alignment_enabled_flag << std::endl;
oss << "cross_component_prediction_enabled_flag: " << +extPicParams->PicRangeExtensionFlags.fields.cross_component_prediction_enabled_flag << std::endl;
oss << "chroma_qp_offset_list_enabled_flag: " << +extPicParams->PicRangeExtensionFlags.fields.chroma_qp_offset_list_enabled_flag << std::endl;
oss << "BitDepthLuma16: " << +extPicParams->PicRangeExtensionFlags.fields.BitDepthLuma16 << std::endl;
oss << "BitDepthChroma16: " << +extPicParams->PicRangeExtensionFlags.fields.BitDepthChroma16 << std::endl;
oss << "diff_cu_chroma_qp_offset_depth: " << +extPicParams->diff_cu_chroma_qp_offset_depth << std::endl;
oss << "chroma_qp_offset_list_len_minus1: " << +extPicParams->chroma_qp_offset_list_len_minus1 << std::endl;
oss << "log2_sao_offset_scale_luma: " << +extPicParams->log2_sao_offset_scale_luma << std::endl;
oss << "log2_sao_offset_scale_chroma: " << +extPicParams->log2_sao_offset_scale_chroma << std::endl;
oss << "log2_max_transform_skip_block_size_minus2: " << +extPicParams->log2_max_transform_skip_block_size_minus2 << std::endl;
//Dump cb_qp_offset_list[6]
oss << "cb_qp_offset_list[6]: ";
for (uint8_t i = 0; i < 6; i++)
oss << extPicParams->cb_qp_offset_list[i] << " ";
oss << std::endl;
//Dump cr_qp_offset_list[6]
oss << "cr_qp_offset_list[6]: ";
for (uint8_t i = 0; i < 6; i++)
oss << extPicParams->cr_qp_offset_list[i] << " ";
oss << std::endl;
//Dump scc pic parameters
if(sccPicParams)
{
oss << "pps_curr_pic_ref_enabled_flag: " << +sccPicParams->PicSCCExtensionFlags.fields.pps_curr_pic_ref_enabled_flag<< std::endl;
oss << "palette_mode_enabled_flag: " << +sccPicParams->PicSCCExtensionFlags.fields.palette_mode_enabled_flag << std::endl;
oss << "motion_vector_resolution_control_idc: " << +sccPicParams->PicSCCExtensionFlags.fields.motion_vector_resolution_control_idc << std::endl;
oss << "intra_boundary_filtering_disabled_flag: " << +sccPicParams->PicSCCExtensionFlags.fields.intra_boundary_filtering_disabled_flag << std::endl;
oss << "residual_adaptive_colour_transform_enabled_flag: " << +sccPicParams->PicSCCExtensionFlags.fields.residual_adaptive_colour_transform_enabled_flag << std::endl;
oss << "pps_slice_act_qp_offsets_present_flag: " << +sccPicParams->PicSCCExtensionFlags.fields.pps_slice_act_qp_offsets_present_flag << std::endl;
oss << "palette_max_size: " << +sccPicParams->palette_max_size << std::endl;
oss << "delta_palette_max_predictor_size: " << +sccPicParams->delta_palette_max_predictor_size << std::endl;
oss << "PredictorPaletteSize: " << +sccPicParams->PredictorPaletteSize << std::endl;
for(uint8_t i = 0; i < 128; i++)
{
oss << "PredictorPaletteEntries[0][" << +i << "]: " << +sccPicParams->PredictorPaletteEntries[0][i] << std::endl;
oss << "PredictorPaletteEntries[1][" << +i << "]: " << +sccPicParams->PredictorPaletteEntries[1][i] << std::endl;
oss << "PredictorPaletteEntries[2][" << +i << "]: " << +sccPicParams->PredictorPaletteEntries[2][i] << std::endl;
}
oss << "pps_act_y_qp_offset_plus5: " << +sccPicParams->pps_act_y_qp_offset_plus5 << std::endl;
oss << "pps_act_cb_qp_offset_plus5: " << +sccPicParams->pps_act_y_qp_offset_plus5 << std::endl;
oss << "pps_act_cr_qp_offset_plus3: " << +sccPicParams->pps_act_y_qp_offset_plus5 << std::endl;
}
}
const char *fileName = m_debugInterface->CreateFileName(
"_DEC",
CodechalDbgBufferType::bufPicParams,
CodechalDbgExtType::txt);
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalDecodeHevcG12::DumpSliceParams(
PCODEC_HEVC_SLICE_PARAMS sliceParams,
PCODEC_HEVC_EXT_SLICE_PARAMS extSliceParams,
uint32_t numSlices,
bool shortFormatInUse)
{
CODECHAL_DEBUG_FUNCTION_ENTER;
if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrSlcParams))
{
return MOS_STATUS_SUCCESS;
}
CODECHAL_DEBUG_CHK_NULL(sliceParams);
PCODEC_HEVC_SLICE_PARAMS hevcSliceControl = nullptr;
PCODEC_HEVC_EXT_SLICE_PARAMS hevcExtSliceControl = nullptr;
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
for (uint16_t j = 0; j < numSlices; j++)
{
hevcSliceControl = &sliceParams[j];
if (extSliceParams)
{
hevcExtSliceControl = &extSliceParams[j];
}
oss << "====================================================================================================" << std::endl;
oss << "Data for Slice number = " << +j << std::endl;
oss << "slice_data_size: " << +hevcSliceControl->slice_data_size << std::endl;
oss << "slice_data_offset: " << +hevcSliceControl->slice_data_offset << std::endl;
if (!shortFormatInUse)
{
//Dump Long format specific
oss << "ByteOffsetToSliceData: " << +hevcSliceControl->ByteOffsetToSliceData << std::endl;
oss << "slice_segment_address: " << +hevcSliceControl->slice_segment_address << std::endl;
//Dump RefPicList[2][15]
for (uint8_t i = 0; i < 15; ++i)
{
oss << "RefPicList[0][" << +i << "]";
oss << "FrameIdx: " << +hevcSliceControl->RefPicList[0][i].FrameIdx;
oss << ", PicFlags: " << +hevcSliceControl->RefPicList[0][i].PicFlags;
oss << std::endl;
}
for (uint8_t i = 0; i < 15; ++i)
{
oss << "RefPicList[1][" << +i << "]";
oss << "FrameIdx: " << +hevcSliceControl->RefPicList[1][i].FrameIdx;
oss << ", PicFlags: " << +hevcSliceControl->RefPicList[1][i].PicFlags;
oss << std::endl;
}
oss << "last_slice_of_pic: " << +hevcSliceControl->LongSliceFlags.fields.LastSliceOfPic << std::endl;
oss << "dependent_slice_segment_flag: " << +hevcSliceControl->LongSliceFlags.fields.dependent_slice_segment_flag << std::endl;
oss << "slice_type: " << +hevcSliceControl->LongSliceFlags.fields.slice_type << std::endl;
oss << "color_plane_id: " << +hevcSliceControl->LongSliceFlags.fields.color_plane_id << std::endl;
oss << "slice_sao_luma_flag: " << +hevcSliceControl->LongSliceFlags.fields.slice_sao_luma_flag << std::endl;
oss << "slice_sao_chroma_flag: " << +hevcSliceControl->LongSliceFlags.fields.slice_sao_chroma_flag << std::endl;
oss << "mvd_l1_zero_flag: " << +hevcSliceControl->LongSliceFlags.fields.mvd_l1_zero_flag << std::endl;
oss << "cabac_init_flag: " << +hevcSliceControl->LongSliceFlags.fields.cabac_init_flag << std::endl;
oss << "slice_temporal_mvp_enabled_flag: " << +hevcSliceControl->LongSliceFlags.fields.slice_temporal_mvp_enabled_flag << std::endl;
oss << "slice_deblocking_filter_disabled_flag: " << +hevcSliceControl->LongSliceFlags.fields.slice_deblocking_filter_disabled_flag << std::endl;
oss << "collocated_from_l0_flag: " << +hevcSliceControl->LongSliceFlags.fields.collocated_from_l0_flag << std::endl;
oss << "slice_loop_filter_across_slices_enabled_flag: " << +hevcSliceControl->LongSliceFlags.fields.slice_loop_filter_across_slices_enabled_flag << std::endl;
oss << "reserved: " << +hevcSliceControl->LongSliceFlags.fields.reserved << std::endl;
oss << "collocated_ref_idx: " << +hevcSliceControl->collocated_ref_idx << std::endl;
oss << "num_ref_idx_l0_active_minus1: " << +hevcSliceControl->num_ref_idx_l0_active_minus1 << std::endl;
oss << "num_ref_idx_l1_active_minus1: " << +hevcSliceControl->num_ref_idx_l1_active_minus1 << std::endl;
oss << "slice_qp_delta: " << +hevcSliceControl->slice_qp_delta << std::endl;
oss << "slice_cb_qp_offset: " << +hevcSliceControl->slice_cb_qp_offset << std::endl;
oss << "slice_cr_qp_offset: " << +hevcSliceControl->slice_cr_qp_offset << std::endl;
oss << "slice_beta_offset_div2: " << +hevcSliceControl->slice_beta_offset_div2 << std::endl;
oss << "slice_tc_offset_div2: " << +hevcSliceControl->slice_tc_offset_div2 << std::endl;
oss << "luma_log2_weight_denom: " << +hevcSliceControl->luma_log2_weight_denom << std::endl;
oss << "delta_chroma_log2_weight_denom: " << +hevcSliceControl->delta_chroma_log2_weight_denom << std::endl;
//Dump luma_offset[2][15]
for (uint8_t i = 0; i < 15; i++)
{
oss << "luma_offset_l0[" << +i << "]: " << (extSliceParams ? +hevcExtSliceControl->luma_offset_l0[i] : +hevcSliceControl->luma_offset_l0[i]) << std::endl;
oss << "luma_offset_l1[" << +i << "]: " << (extSliceParams ? +hevcExtSliceControl->luma_offset_l1[i] : +hevcSliceControl->luma_offset_l1[i]) << std::endl;
}
//Dump delta_luma_weight[2][15]
for (uint8_t i = 0; i < 15; i++)
{
oss << "delta_luma_weight_l0[" << +i << "]: " << +hevcSliceControl->delta_luma_weight_l0[i] << std::endl;
oss << "delta_luma_weight_l1[" << +i << "]: " << +hevcSliceControl->delta_luma_weight_l0[i] << std::endl;
}
//Dump chroma_offset[2][15][2]
for (uint8_t i = 0; i < 15; i++)
{
oss << "ChromaOffsetL0[" << +i << "][0]: " << (extSliceParams ? +hevcExtSliceControl->ChromaOffsetL0[i][0] : +hevcSliceControl->ChromaOffsetL0[i][0]) << std::endl;
oss << "ChromaOffsetL0[" << +i << "][1]: " << (extSliceParams ? +hevcExtSliceControl->ChromaOffsetL0[i][1] : +hevcSliceControl->ChromaOffsetL0[i][1]) << std::endl;
oss << "ChromaOffsetL1[" << +i << "][0]: " << (extSliceParams ? +hevcExtSliceControl->ChromaOffsetL1[i][0] : +hevcSliceControl->ChromaOffsetL1[i][0]) << std::endl;
oss << "ChromaOffsetL1[" << +i << "][1]: " << (extSliceParams ? +hevcExtSliceControl->ChromaOffsetL1[i][1] : +hevcSliceControl->ChromaOffsetL1[i][1]) << std::endl;
}
//Dump delta_chroma_weight[2][15][2]
for (uint8_t i = 0; i < 15; i++)
{
oss << "delta_chroma_weight_l0[" << +i << "][0]: " << +hevcSliceControl->delta_chroma_weight_l0[i][0] << std::endl;
oss << "delta_chroma_weight_l0[" << +i << "][1]: " << +hevcSliceControl->delta_chroma_weight_l0[i][1] << std::endl;
oss << "delta_chroma_weight_l1[" << +i << "][0]: " << +hevcSliceControl->delta_chroma_weight_l1[i][0] << std::endl;
oss << "delta_chroma_weight_l1[" << +i << "][1]: " << +hevcSliceControl->delta_chroma_weight_l1[i][1] << std::endl;
}
oss << "five_minus_max_num_merge_cand: " << +hevcSliceControl->five_minus_max_num_merge_cand << std::endl;
oss << "num_entry_point_offsets: " << +hevcSliceControl->num_entry_point_offsets << std::endl;
oss << "EntryOffsetToSubsetArray: " << +hevcSliceControl->EntryOffsetToSubsetArray << std::endl;
if (extSliceParams)
{
oss << "cu_chroma_qp_offset_enabled_flag: " << +hevcExtSliceControl->cu_chroma_qp_offset_enabled_flag << std::endl;
//Dump scc slice parameters
oss << "slice_act_y_qp_offset: " << +hevcExtSliceControl->slice_act_y_qp_offset<< std::endl;
oss << "slice_act_cb_qp_offset: " << +hevcExtSliceControl->slice_act_cb_qp_offset << std::endl;
oss << "slice_act_cr_qp_offset: " << +hevcExtSliceControl->slice_act_cr_qp_offset << std::endl;
oss << "use_integer_mv_flag: " << +hevcExtSliceControl->use_integer_mv_flag << std::endl;
}
}
const char *fileName = m_debugInterface->CreateFileName(
"_DEC",
CodechalDbgBufferType::bufSlcParams,
CodechalDbgExtType::txt);
std::ofstream ofs;
if (j == 0)
{
ofs.open(fileName, std::ios::out);
}
else
{
ofs.open(fileName, std::ios::app);
}
ofs << oss.str();
ofs.close();
}
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalDecodeHevcG12::DumpSubsetsParams(
PCODEC_HEVC_SUBSET_PARAMS subsetsParams)
{
CODECHAL_DEBUG_FUNCTION_ENTER;
if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrSubsetsParams))
{
return MOS_STATUS_SUCCESS;
}
if(subsetsParams)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
for(uint16_t i = 0; i < 440; i++)
{
oss << "entry_point_offset_minus1[" << +i << "]: " << +subsetsParams->entry_point_offset_minus1[i]<< std::endl;
}
//create the file
const char *fileName = m_debugInterface->CreateFileName(
"_DEC",
CodechalDbgBufferType::bufSubsetsParams,
CodechalDbgExtType::txt);
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
return MOS_STATUS_SUCCESS;
}
#endif