blob: 32ffcf83d65240ea1079cf83de3c96ad5e997115 [file]
/*
* Copyright (c) 2011-2023, Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
//!
//! \file codechal_debug.cpp
//! \brief Defines the debug interface shared by codec only.
//! \details The debug interface dumps output from Media based on in input config file.
//!
#include "codechal_debug.h"
#if USE_CODECHAL_DEBUG_TOOL
#include "codechal_debug_config_manager.h"
#include "media_debug_fast_dump.h"
#include <iomanip>
#define QUERY_STATUS_BUFFER_INITIAL_VALUE 0xf
#define STORE_DATA_DWORD_DATA 0x01010102
// AVC Decode
std::ostream &operator<<(std::ostream &oss, const CODEC_AVC_PIC_PARAMS &cr)
{
const CODEC_AVC_PIC_PARAMS *picParams = &cr;
oss << "CurrPic FrameIdx: " << +picParams->CurrPic.FrameIdx << std::endl;
oss << "CurrPic PicFlags: " << +picParams->CurrPic.PicFlags << std::endl;
// 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;
}
oss << "pic_width_in_mbs_minus1: " << +picParams->pic_width_in_mbs_minus1 << std::endl;
oss << "pic_height_in_mbs_minus1: " << +picParams->pic_height_in_mbs_minus1 << 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 << "num_ref_frames: " << +picParams->num_ref_frames << std::endl;
oss << "CurrFieldOrderCnt: " << +picParams->CurrFieldOrderCnt[0] << std::endl;
oss << "CurrFieldOrderCnt: " << +picParams->CurrFieldOrderCnt[1] << std::endl;
// Dump FieldOrderCntList (16x2)
for (uint8_t i = 0; i < 2; ++i)
{
oss << "FieldOrderCntList[" << +i << "]:";
for (uint8_t j = 0; j < 16; j++)
oss << +picParams->FieldOrderCntList[j][i] << " ";
oss << std::endl;
}
// Dump seq_fields
oss << "seq_fields value: " << +picParams->seq_fields.value << std::endl;
oss << "chroma_format_idc: " << +picParams->seq_fields.chroma_format_idc << std::endl;
oss << "residual_colour_transform_flag: " << +picParams->seq_fields.residual_colour_transform_flag << std::endl;
oss << "frame_mbs_only_flag: " << +picParams->seq_fields.frame_mbs_only_flag << std::endl;
oss << "mb_adaptive_frame_field_flag: " << +picParams->seq_fields.mb_adaptive_frame_field_flag << std::endl;
oss << "direct_8x8_inference_flag: " << +picParams->seq_fields.direct_8x8_inference_flag << std::endl;
oss << "log2_max_frame_num_minus4: " << +picParams->seq_fields.log2_max_frame_num_minus4 << std::endl;
oss << "pic_order_cnt_type: " << +picParams->seq_fields.pic_order_cnt_type << std::endl;
oss << "log2_max_pic_order_cnt_lsb_minus4: " << +picParams->seq_fields.log2_max_pic_order_cnt_lsb_minus4 << std::endl;
oss << "delta_pic_order_always_zero_flag: " << +picParams->seq_fields.delta_pic_order_always_zero_flag << std::endl;
oss << "num_slice_groups_minus1:" << +picParams->num_slice_groups_minus1 << std::endl;
oss << "slice_group_map_type:" << +picParams->slice_group_map_type << std::endl;
oss << "slice_group_change_rate_minus1:" << +picParams->slice_group_change_rate_minus1 << std::endl;
oss << "pic_init_qp_minus26:" << +picParams->pic_init_qp_minus26 << std::endl;
oss << "chroma_qp_index_offset:" << +picParams->chroma_qp_index_offset << std::endl;
oss << "second_chroma_qp_index_offset:" << +picParams->second_chroma_qp_index_offset << std::endl;
// Dump pic_fields
oss << "pic_fields value: " << +picParams->pic_fields.value << std::endl;
oss << "entropy_coding_mode_flag: " << +picParams->pic_fields.entropy_coding_mode_flag << std::endl;
oss << "weighted_pred_flag: " << +picParams->pic_fields.weighted_pred_flag << std::endl;
oss << "weighted_bipred_idc: " << +picParams->pic_fields.weighted_bipred_idc << std::endl;
oss << "transform_8x8_mode_flag: " << +picParams->pic_fields.transform_8x8_mode_flag << std::endl;
oss << "field_pic_flag: " << +picParams->pic_fields.field_pic_flag << std::endl;
oss << "constrained_intra_pred_flag: " << +picParams->pic_fields.constrained_intra_pred_flag << std::endl;
oss << "pic_order_present_flag: " << +picParams->pic_fields.pic_order_present_flag << std::endl;
oss << "deblocking_filter_control_present_flag: " << +picParams->pic_fields.deblocking_filter_control_present_flag << std::endl;
oss << "redundant_pic_cnt_present_flag: " << +picParams->pic_fields.redundant_pic_cnt_present_flag << std::endl;
oss << "reference_pic_flag: " << +picParams->pic_fields.reference_pic_flag << std::endl;
oss << "IntraPicFlag: " << +picParams->pic_fields.IntraPicFlag << std::endl;
// Dump Short format specific
oss << "num_ref_idx_l0_active_minus1: " << +picParams->num_ref_idx_l0_active_minus1 << std::endl;
oss << "num_ref_idx_l1_active_minus1: " << +picParams->num_ref_idx_l1_active_minus1 << std::endl;
oss << "NonExistingFrameFlags: " << +picParams->NonExistingFrameFlags << std::endl;
oss << "UsedForReferenceFlags: " << +picParams->UsedForReferenceFlags << std::endl;
oss << "frame_num: " << +picParams->frame_num << std::endl;
oss << "StatusReportFeedbackNumber: " << +picParams->StatusReportFeedbackNumber << std::endl;
// Dump FrameNumList[16]
oss << "scaling_list_present_flag_buffer:";
for (uint8_t i = 0; i < 16; i++)
oss << picParams->FrameNumList[i];
oss << std::endl;
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CODEC_AVC_SF_SLICE_PARAMS &cr)
{
const CODEC_AVC_SF_SLICE_PARAMS *sliceControl = &cr;
oss << "slice_data_size: " << +sliceControl->slice_data_size << std::endl;
oss << "slice_data_offset: " << +sliceControl->slice_data_offset << std::endl;
oss << std::endl;
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CODEC_AVC_SLICE_PARAMS &cr)
{
const CODEC_AVC_SLICE_PARAMS *sliceControl = &cr;
oss << "slice_data_size: " << +sliceControl->slice_data_size << std::endl;
oss << "slice_data_offset: " << +sliceControl->slice_data_offset << std::endl;
// Dump Long format Params
oss << std::endl;
oss << "// Long Format Specific" << std::endl;
oss << "slice_data_bit_offset: " << +sliceControl->slice_data_bit_offset << std::endl;
oss << "first_mb_in_slice: " << +sliceControl->first_mb_in_slice << std::endl;
oss << "NumMbsForSlice: " << +sliceControl->NumMbsForSlice << std::endl;
oss << "slice_type: " << +sliceControl->slice_type << std::endl;
oss << "direct_spatial_mv_pred_flag: " << +sliceControl->direct_spatial_mv_pred_flag << std::endl;
oss << "num_ref_idx_l0_active_minus1: " << +sliceControl->num_ref_idx_l0_active_minus1 << std::endl;
oss << "num_ref_idx_l1_active_minus1: " << +sliceControl->num_ref_idx_l1_active_minus1 << std::endl;
oss << "cabac_init_idc: " << +sliceControl->cabac_init_idc << std::endl;
oss << "slice_qp_delta: " << +sliceControl->slice_qp_delta << std::endl;
oss << "disable_deblocking_filter_idc: " << +sliceControl->disable_deblocking_filter_idc << std::endl;
oss << "slice_alpha_c0_offset_div2: " << +sliceControl->slice_alpha_c0_offset_div2 << std::endl;
oss << "slice_beta_offset_div2: " << +sliceControl->slice_beta_offset_div2 << std::endl;
// Dump RefPicList[2][32]
for (uint8_t i = 0; i < 32; ++i)
{
oss << "RefPicList[0][" << +i << "] FrameIdx: " << +sliceControl->RefPicList[0][i].FrameIdx << std::endl;
oss << "RefPicList[0][" << +i << "] PicFlags: " << +sliceControl->RefPicList[0][i].PicFlags << std::endl;
oss << "RefPicList[1][" << +i << "] FrameIdx: " << +sliceControl->RefPicList[1][i].FrameIdx << std::endl;
oss << "RefPicList[1][" << +i << "] PicFlags: " << +sliceControl->RefPicList[1][i].PicFlags << std::endl;
}
oss << "luma_log2_weight_denom: " << +sliceControl->luma_log2_weight_denom << std::endl;
oss << "chroma_log2_weight_denom: " << +sliceControl->chroma_log2_weight_denom << std::endl;
oss << "slice_id: " << +sliceControl->slice_id << std::endl;
// Dump Weights[2][32][3][2]
for (uint8_t i = 0; i < 32; ++i)
{
oss << "Weights[0][" << +i << "][0][0]: " << +sliceControl->Weights[0][i][0][0] << std::endl;
oss << "Weights[0][" << +i << "][0][1]: " << +sliceControl->Weights[0][i][0][1] << std::endl;
oss << "Weights[0][" << +i << "][1][0]: " << +sliceControl->Weights[0][i][1][0] << std::endl;
oss << "Weights[0][" << +i << "][1][1]: " << +sliceControl->Weights[0][i][1][1] << std::endl;
oss << "Weights[1][" << +i << "][0][0]: " << +sliceControl->Weights[1][i][0][0] << std::endl;
oss << "Weights[1][" << +i << "][0][1]: " << +sliceControl->Weights[1][i][0][1] << std::endl;
oss << "Weights[1][" << +i << "][1][0]: " << +sliceControl->Weights[1][i][1][0] << std::endl;
oss << "Weights[1][" << +i << "][1][1]: " << +sliceControl->Weights[1][i][1][1] << std::endl;
oss << "Weights[0][" << +i << "][2][0]: " << +sliceControl->Weights[0][i][2][0] << std::endl;
oss << "Weights[0][" << +i << "][2][1]: " << +sliceControl->Weights[0][i][2][1] << std::endl;
oss << "Weights[1][" << +i << "][2][0]: " << +sliceControl->Weights[1][i][2][0] << std::endl;
oss << "Weights[1][" << +i << "][2][1]: " << +sliceControl->Weights[1][i][2][1] << std::endl;
}
oss << std::endl;
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CODEC_AVC_IQ_MATRIX_PARAMS &cr)
{
const CODEC_AVC_IQ_MATRIX_PARAMS *iqParams = &cr;
uint32_t idx, idx2;
// 4x4 block
for (idx2 = 0; idx2 < 6; idx2++)
{
oss << "Qmatrix_H264_ScalingLists4x4[" << +idx2 << "]:" << std::endl;
for (idx = 0; idx < 12; idx += 4)
{
oss << "ScalingList4x4[" << +idx / 4 << "]:";
oss << +iqParams->ScalingList4x4[idx2][idx] << " ";
oss << +iqParams->ScalingList4x4[idx2][idx + 1] << " ";
oss << +iqParams->ScalingList4x4[idx2][idx + 2] << " ";
oss << +iqParams->ScalingList4x4[idx2][idx + 3] << " ";
oss << std::endl;
}
oss << std::endl;
}
// 8x8 block
for (idx2 = 0; idx2 < 2; idx2++)
{
oss << "Qmatrix_H264_ScalingLists8x8[" << +idx2 << "]:" << std::endl;
for (idx = 0; idx < 56; idx += 8)
{
oss << "ScalingList8x8[" << +idx / 8 << "]:";
oss << +iqParams->ScalingList8x8[idx2][idx] << " ";
oss << +iqParams->ScalingList8x8[idx2][idx + 1] << " ";
oss << +iqParams->ScalingList8x8[idx2][idx + 2] << " ";
oss << +iqParams->ScalingList8x8[idx2][idx + 3] << " ";
oss << +iqParams->ScalingList8x8[idx2][idx + 4] << " ";
oss << +iqParams->ScalingList8x8[idx2][idx + 5] << " ";
oss << +iqParams->ScalingList8x8[idx2][idx + 6] << " ";
oss << +iqParams->ScalingList8x8[idx2][idx + 7] << " ";
oss << std::endl;
}
oss << std::endl;
}
return oss;
}
void DumpDecodeAvcPicParams(PCODEC_AVC_PIC_PARAMS picParams, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *picParams << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
void DumpDecodeAvcSliceParams(PCODEC_AVC_SLICE_PARAMS sliceParams, uint32_t numSlices, std::string fileName, bool shortFormatInUse)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
if (numSlices > 1)
{
oss << "Total Num: " << numSlices << std::endl;
oss << std::endl;
}
for (uint16_t i = 0; i < numSlices; i++)
{
if (numSlices > 1)
{
oss << "---------Index = " << i << "---------" << std::endl;
}
if (shortFormatInUse)
{
oss << reinterpret_cast<CODEC_AVC_SF_SLICE_PARAMS &>(sliceParams[i]) << std::endl;
}
else
{
oss << sliceParams[i] << std::endl;
}
}
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
void DumpDecodeAvcIQParams(PCODEC_AVC_IQ_MATRIX_PARAMS iqParams, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *iqParams << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
// HEVC Decode
std::ostream &operator<<(std::ostream &oss, const CODEC_HEVC_PIC_PARAMS &cr)
{
const CODEC_HEVC_PIC_PARAMS *picParams = &cr;
oss << "PicWidthInMinCbsY: " << +picParams->PicWidthInMinCbsY << std::endl;
oss << "PicHeightInMinCbsY: " << +picParams->PicHeightInMinCbsY << std::endl;
// FormatAndSequenceInfoFlags
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;
// CodingParamToolFlags
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;
// CodingSettingPicturePropertyFlags
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;
// column width
oss << "column_width_minus1[19]:";
for (uint8_t i = 0; i < 19; i++)
oss << picParams->column_width_minus1[i] << " ";
oss << std::endl;
// 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);
// 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;
}
// POC List
oss << "PicOrderCntValList[15]:";
for (uint8_t i = 0; i < 15; i++)
oss << picParams->PicOrderCntValList[i] << " ";
oss << std::endl;
// Ref RefPicSetStCurrBefore List
oss << "RefPicSetStCurrBefore[8]:";
for (uint8_t i = 0; i < 8; i++)
oss << +picParams->RefPicSetStCurrBefore[i] << " ";
oss << std::endl;
// Ref RefPicSetStCurrAfter List
oss << "RefPicSetStCurrAfter[16]:";
for (uint8_t i = 0; i < 8; i++)
oss << +picParams->RefPicSetStCurrAfter[i] << " ";
oss << std::endl;
// Ref PicSetStCurr List
oss << "RefPicSetLtCurr[16]:";
for (uint8_t i = 0; i < 8; i++)
oss << +picParams->RefPicSetLtCurr[i] << " ";
oss << std::endl;
// Ref RefPicSetStCurrBefore List with POC
oss << "POC of RefPicSetStCurrBefore[8]: ";
for (uint8_t i = 0; i < 8; i++)
oss << +picParams->PicOrderCntValList[picParams->RefPicSetStCurrBefore[i] % 15] << " ";
oss << std::endl;
// Ref RefPicSetStCurrAfter List with POC
oss << "POC of RefPicSetStCurrAfter[16]:";
for (uint8_t i = 0; i < 8; i++)
oss << +picParams->PicOrderCntValList[picParams->RefPicSetStCurrAfter[i] % 15] << " ";
oss << std::endl;
// Ref PicSetStCurr List with POC
oss << "POC of RefPicSetLtCurr[16]: ";
for (uint8_t i = 0; i < 8; i++)
oss << +picParams->PicOrderCntValList[picParams->RefPicSetLtCurr[i] % 15] << " ";
oss << std::endl;
oss << "RefFieldPicFlag: " << +picParams->RefFieldPicFlag << std::endl;
oss << "RefBottomFieldFlag: " << +picParams->RefBottomFieldFlag << std::endl;
oss << "StatusReportFeedbackNumber: " << +picParams->StatusReportFeedbackNumber << std::endl;
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CODEC_HEVC_EXT_PIC_PARAMS &cr)
{
const CODEC_HEVC_EXT_PIC_PARAMS *extPicParams = &cr;
// 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;
// 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;
// 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;
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CODEC_HEVC_SCC_PIC_PARAMS &cr)
{
const CODEC_HEVC_SCC_PIC_PARAMS *sccPicParams = &cr;
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;
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CODEC_HEVC_SF_SLICE_PARAMS &cr)
{
const CODEC_HEVC_SF_SLICE_PARAMS *sliceControl = &cr;
oss << "slice_data_size: " << +sliceControl->slice_data_size << std::endl;
oss << "slice_data_offset: " << +sliceControl->slice_data_offset << std::endl;
oss << "slice_chopping: " << +sliceControl->slice_chopping << std::endl;
oss << std::endl;
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CODEC_HEVC_SLICE_PARAMS &cr)
{
const CODEC_HEVC_SLICE_PARAMS *hevcSliceControl = &cr;
oss << "slice_data_size: " << +hevcSliceControl->slice_data_size << std::endl;
oss << "slice_data_offset: " << +hevcSliceControl->slice_data_offset << std::endl;
oss << "slice_chopping: " << +hevcSliceControl->slice_chopping << std::endl;
// Dump Long format Params
oss << std::endl;
oss << "ByteOffsetToSliceData: " << +hevcSliceControl->ByteOffsetToSliceData << std::endl;
oss << "slice_segment_address: " << +hevcSliceControl->slice_segment_address << std::endl;
// RefPicList[2][15]
for (uint8_t i = 0; i < 15; ++i)
{
oss << "RefPicList[0][" << +i << "]";
oss << ".FrameIdx: " << +hevcSliceControl->RefPicList[0][i].FrameIdx << std::endl;
oss << "RefPicList[0][" << +i << "]";
oss << ".PicFlags: " << +hevcSliceControl->RefPicList[0][i].PicFlags << std::endl;
}
for (uint8_t i = 0; i < 15; ++i)
{
oss << "RefPicList[1][" << +i << "]";
oss << ".FrameIdx: " << +hevcSliceControl->RefPicList[1][i].FrameIdx << std::endl;
oss << "RefPicList[1][" << +i << "]";
oss << ".PicFlags: " << +hevcSliceControl->RefPicList[1][i].PicFlags << 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;
// luma_offset[2][15]
for (uint8_t i = 0; i < 15; i++)
{
oss << "luma_offset_l0[" << +i << "]: " << +hevcSliceControl->luma_offset_l0[i] << std::endl;
oss << "luma_offset_l1[" << +i << "]: " << +hevcSliceControl->luma_offset_l1[i] << std::endl;
}
// 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_l1[i] << std::endl;
}
// chroma_offset[2][15][2]
for (uint8_t i = 0; i < 15; i++)
{
oss << "ChromaOffsetL0[" << +i << "][0]: " << +hevcSliceControl->ChromaOffsetL0[i][0] << std::endl;
oss << "ChromaOffsetL0[" << +i << "][1]: " << +hevcSliceControl->ChromaOffsetL0[i][1] << std::endl;
oss << "ChromaOffsetL1[" << +i << "][0]: " << +hevcSliceControl->ChromaOffsetL1[i][0] << std::endl;
oss << "ChromaOffsetL1[" << +i << "][1]: " << +hevcSliceControl->ChromaOffsetL1[i][1] << std::endl;
}
// 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;
oss << std::endl;
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CODEC_HEVC_EXT_SLICE_PARAMS &cr)
{
const CODEC_HEVC_EXT_SLICE_PARAMS *hevcExtSliceControl = &cr;
// luma_offset[2][15]
for (uint8_t i = 0; i < 15; i++)
{
oss << "luma_offset_l0[" << +i << "]: " << +hevcExtSliceControl->luma_offset_l0[i] << std::endl;
oss << "luma_offset_l1[" << +i << "]: " << +hevcExtSliceControl->luma_offset_l1[i] << std::endl;
}
// chroma_offset[2][15][2]
for (uint8_t i = 0; i < 15; i++)
{
oss << "ChromaOffsetL0[" << +i << "][0]: " << +hevcExtSliceControl->ChromaOffsetL0[i][0] << std::endl;
oss << "ChromaOffsetL0[" << +i << "][1]: " << +hevcExtSliceControl->ChromaOffsetL0[i][1] << std::endl;
oss << "ChromaOffsetL1[" << +i << "][0]: " << +hevcExtSliceControl->ChromaOffsetL1[i][0] << std::endl;
oss << "ChromaOffsetL1[" << +i << "][1]: " << +hevcExtSliceControl->ChromaOffsetL1[i][1] << std::endl;
}
oss << "cu_chroma_qp_offset_enabled_flag: " << +hevcExtSliceControl->cu_chroma_qp_offset_enabled_flag << std::endl;
// 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;
oss << std::endl;
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CODECHAL_HEVC_IQ_MATRIX_PARAMS &cr)
{
const CODECHAL_HEVC_IQ_MATRIX_PARAMS *iqParams = &cr;
uint32_t idx;
uint32_t idx2;
// 4x4 block
for (idx2 = 0; idx2 < 6; idx2++)
{
oss << "Qmatrix_HEVC_ucScalingLists0[" << +idx2 << "]:" << std::endl;
oss << "ucScalingLists0[" << +idx2 << "]:";
for (uint8_t i = 0; i < 16; i++)
oss << +iqParams->ucScalingLists0[idx2][i] << " ";
oss << std::endl;
}
// 8x8 block
for (idx2 = 0; idx2 < 6; idx2++)
{
oss << "ucScalingLists1[" << +idx2 << "]:" << std::endl;
for (idx = 0; idx < 64; idx += 8)
{
oss << "ucScalingLists1[" << +idx / 8 << "]:" << std::endl;
for (uint8_t i = 0; i < 8; i++)
oss << +iqParams->ucScalingLists1[idx2][idx + i] << " ";
oss << std::endl;
}
}
// 16x16 block
for (idx2 = 0; idx2 < 6; idx2++)
{
oss << "ucScalingLists2[" << +idx2 << "]:" << std::endl;
for (idx = 0; idx < 64; idx += 8)
{
oss << "ucScalingLists2[" << +idx / 8 << "]:" << std::endl;
for (uint8_t i = 0; i < 8; i++)
oss << +iqParams->ucScalingLists2[idx2][idx + i] << " ";
oss << std::endl;
}
}
// 32x32 block
for (idx2 = 0; idx2 < 2; idx2++)
{
oss << "ucScalingLists3[" << +idx2 << "]:" << std::endl;
for (idx = 0; idx < 64; idx += 8)
{
oss << "ucScalingLists3[" << +idx / 8 << "]:" << std::endl;
for (uint8_t i = 0; i < 8; i++)
oss << +iqParams->ucScalingLists3[idx2][idx + i] << " ";
oss << std::endl;
}
}
// DC16x16 block
oss << "ucScalingListDCCoefSizeID2: ";
for (uint8_t i = 0; i < 6; i++)
oss << +iqParams->ucScalingListDCCoefSizeID2[i] << " ";
oss << std::endl;
// DC32x32 block
oss << "ucScalingListDCCoefSizeID3: ";
oss << +iqParams->ucScalingListDCCoefSizeID3[0] << " " << +iqParams->ucScalingListDCCoefSizeID3[1] << std::endl;
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CODEC_HEVC_SUBSET_PARAMS &cr)
{
const CODEC_HEVC_SUBSET_PARAMS *subsetsParams = &cr;
for (uint16_t i = 0; i < 440; i++)
{
oss << "entry_point_offset_minus1[" << +i << "]: " << +subsetsParams->entry_point_offset_minus1[i] << std::endl;
}
return oss;
}
void DumpDecodeHevcPicParams(PCODEC_HEVC_PIC_PARAMS picParams, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *picParams << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
void DumpDecodeHevcExtPicParams(PCODEC_HEVC_EXT_PIC_PARAMS extPicParams, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *extPicParams << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
void DumpDecodeHevcSccPicParams(PCODEC_HEVC_SCC_PIC_PARAMS sccPicParams, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *sccPicParams << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
void DumpDecodeHevcSliceParams(PCODEC_HEVC_SLICE_PARAMS sliceParams, uint32_t numSlices, std::string fileName, bool shortFormatInUse)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
if (numSlices > 1)
{
oss << "Total Num: " << numSlices << std::endl;
oss << std::endl;
}
for (uint16_t i = 0; i < numSlices; i++)
{
if (numSlices > 1)
{
oss << "---------Index = " << i << "---------" << std::endl;
}
if (shortFormatInUse)
{
oss << reinterpret_cast<CODEC_HEVC_SF_SLICE_PARAMS &>(sliceParams[i]) << std::endl;
}
else
{
oss << sliceParams[i] << std::endl;
}
}
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
void DumpDecodeHevcExtSliceParams(PCODEC_HEVC_EXT_SLICE_PARAMS extSliceParams, uint32_t numSlices, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
if (numSlices > 1)
{
oss << "Total Num: " << numSlices << std::endl;
oss << std::endl;
}
for (uint16_t i = 0; i < numSlices; i++)
{
if (numSlices > 1)
{
oss << "---------Index = " << i << "---------" << std::endl;
}
oss << extSliceParams[i] << std::endl;
}
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
void DumpDecodeHevcIQParams(PCODECHAL_HEVC_IQ_MATRIX_PARAMS iqParams, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *iqParams << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
void DumpDecodeHevcSubsetParams(PCODEC_HEVC_SUBSET_PARAMS subsetsParams, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *subsetsParams << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
// VP9 Decode
std::ostream &operator<<(std::ostream &oss, const CODEC_VP9_PIC_PARAMS &cr)
{
const CODEC_VP9_PIC_PARAMS *picParams = &cr;
oss << "CurrPic FrameIdx: " << +picParams->CurrPic.FrameIdx << std::endl;
oss << "CurrPic PicFlags: " << +picParams->CurrPic.PicFlags << std::endl;
for (uint8_t i = 0; i < 8; ++i)
{
oss << "RefFrameList[" << +i << "] FrameIdx:" << +picParams->RefFrameList[i].FrameIdx << std::endl;
oss << "RefFrameList[" << +i << "] PicFlags:" << +picParams->RefFrameList[i].PicFlags << std::endl;
}
oss << "FrameWidthMinus1: " << +picParams->FrameWidthMinus1 << std::endl;
oss << "FrameHeightMinus1: " << +picParams->FrameHeightMinus1 << std::endl;
oss << "PicFlags value: " << +picParams->PicFlags.value << std::endl;
oss << "frame_type: " << +picParams->PicFlags.fields.frame_type << std::endl;
oss << "show_frame: " << +picParams->PicFlags.fields.show_frame << std::endl;
oss << "error_resilient_mode: " << +picParams->PicFlags.fields.error_resilient_mode << std::endl;
oss << "intra_only: " << +picParams->PicFlags.fields.intra_only << std::endl;
oss << "LastRefIdx: " << +picParams->PicFlags.fields.LastRefIdx << std::endl;
oss << "LastRefSignBias: " << +picParams->PicFlags.fields.LastRefSignBias << std::endl;
oss << "GoldenRefIdx: " << +picParams->PicFlags.fields.GoldenRefIdx << std::endl;
oss << "GoldenRefSignBias: " << +picParams->PicFlags.fields.GoldenRefSignBias << std::endl;
oss << "AltRefIdx: " << +picParams->PicFlags.fields.AltRefIdx << std::endl;
oss << "AltRefSignBias: " << +picParams->PicFlags.fields.AltRefSignBias << std::endl;
oss << "allow_high_precision_mv: " << +picParams->PicFlags.fields.allow_high_precision_mv << std::endl;
oss << "mcomp_filter_type: " << +picParams->PicFlags.fields.mcomp_filter_type << std::endl;
oss << "frame_parallel_decoding_mode: " << +picParams->PicFlags.fields.frame_parallel_decoding_mode << std::endl;
oss << "segmentation_enabled: " << +picParams->PicFlags.fields.segmentation_enabled << std::endl;
oss << "segmentation_temporal_update: " << +picParams->PicFlags.fields.segmentation_temporal_update << std::endl;
oss << "segmentation_update_map: " << +picParams->PicFlags.fields.segmentation_update_map << std::endl;
oss << "reset_frame_context: " << +picParams->PicFlags.fields.reset_frame_context << std::endl;
oss << "refresh_frame_context: " << +picParams->PicFlags.fields.refresh_frame_context << std::endl;
oss << "frame_context_idx: " << +picParams->PicFlags.fields.frame_context_idx << std::endl;
oss << "LosslessFlag: " << +picParams->PicFlags.fields.LosslessFlag << std::endl;
oss << "ReservedField: " << +picParams->PicFlags.fields.ReservedField << std::endl;
oss << "filter_level: " << +picParams->filter_level << std::endl;
oss << "sharpness_level: " << +picParams->sharpness_level << std::endl;
oss << "log2_tile_rows: " << +picParams->log2_tile_rows << std::endl;
oss << "log2_tile_columns: " << +picParams->log2_tile_columns << std::endl;
oss << "UncompressedHeaderLengthInBytes: " << +picParams->UncompressedHeaderLengthInBytes << std::endl;
oss << "FirstPartitionSize: " << +picParams->FirstPartitionSize << std::endl;
oss << "profile: " << +picParams->profile << std::endl;
oss << "BitDepthMinus8: " << +picParams->BitDepthMinus8 << std::endl;
oss << "subsampling_x: " << +picParams->subsampling_x << std::endl;
oss << "subsampling_y: " << +picParams->subsampling_y << std::endl;
for (uint8_t i = 0; i < 7; ++i)
{
oss << "SegTreeProbs[" << +i << "]: " << +picParams->SegTreeProbs[i] << std::endl;
}
for (uint8_t i = 0; i < 3; ++i)
{
oss << "SegPredProbs[" << +i << "]: " << +picParams->SegPredProbs[i] << std::endl;
}
oss << "BSBytesInBuffer: " << +picParams->BSBytesInBuffer << std::endl;
oss << "StatusReportFeedbackNumber: " << +picParams->StatusReportFeedbackNumber << std::endl;
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CODEC_VP9_SLICE_PARAMS &cr)
{
const CODEC_VP9_SLICE_PARAMS *slcParams = &cr;
oss << "BSNALunitDataLocation: " << +slcParams->BSNALunitDataLocation << std::endl;
oss << "SliceBytesInBuffer: " << +slcParams->SliceBytesInBuffer << std::endl;
oss << "wBadSliceChopping: " << +slcParams->wBadSliceChopping << std::endl;
oss << std::endl;
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CODEC_VP9_SEGMENT_PARAMS &cr)
{
const CODEC_VP9_SEGMENT_PARAMS *segmentParams = &cr;
for (uint8_t i = 0; i < 8; ++i)
{
oss << "SegData[" << +i << "] SegmentFlags value: " << +segmentParams->SegData[i].SegmentFlags.value << std::endl;
oss << "SegData[" << +i << "] SegmentReferenceEnabled: " << +segmentParams->SegData[i].SegmentFlags.fields.SegmentReferenceEnabled << std::endl;
oss << "SegData[" << +i << "] SegmentReference: " << +segmentParams->SegData[i].SegmentFlags.fields.SegmentReference << std::endl;
oss << "SegData[" << +i << "] SegmentReferenceSkipped: " << +segmentParams->SegData[i].SegmentFlags.fields.SegmentReferenceSkipped << std::endl;
oss << "SegData[" << +i << "] ReservedField3: " << +segmentParams->SegData[i].SegmentFlags.fields.ReservedField3 << std::endl;
for (uint8_t j = 0; j < 4; ++j)
{
oss << "SegData[" << +i << "] FilterLevel[" << +j << "]:";
oss << +segmentParams->SegData[i].FilterLevel[j][0] << " ";
oss << +segmentParams->SegData[i].FilterLevel[j][1] << std::endl;
}
oss << "SegData[" << +i << "] LumaACQuantScale: " << +segmentParams->SegData[i].LumaACQuantScale << std::endl;
oss << "SegData[" << +i << "] LumaDCQuantScale: " << +segmentParams->SegData[i].LumaDCQuantScale << std::endl;
oss << "SegData[" << +i << "] ChromaACQuantScale: " << +segmentParams->SegData[i].ChromaACQuantScale << std::endl;
oss << "SegData[" << +i << "] ChromaDCQuantScale: " << +segmentParams->SegData[i].ChromaDCQuantScale << std::endl;
}
return oss;
}
void DumpDecodeVp9PicParams(PCODEC_VP9_PIC_PARAMS picParams, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *picParams << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
void DumpDecodeVp9SliceParams(PCODEC_VP9_SLICE_PARAMS slcParams, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *slcParams << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
void DumpDecodeVp9SegmentParams(PCODEC_VP9_SEGMENT_PARAMS segmentParams, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *segmentParams << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
// AV1 Decode
std::ostream &operator<<(std::ostream &oss, const CodecAv1PicParams &cr)
{
const CodecAv1PicParams *picParams = &cr;
oss << "CurrPic FrameIdx: " << +picParams->m_currPic.FrameIdx << std::endl;
oss << "CurrDisplayPic FrameIdx: " << +picParams->m_currDisplayPic.FrameIdx << std::endl;
oss << "Profile: " << +picParams->m_profile << std::endl;
oss << "AnchorFrameInsertion: " << +picParams->m_anchorFrameInsertion << std::endl;
oss << "order_hint_bits_minus_1: " << +picParams->m_orderHintBitsMinus1 << std::endl;
oss << "BitDepthIdx: " << +picParams->m_bitDepthIdx << std::endl;
//Sequence Info Flags
oss << "dwSeqInfoFlags: " << +picParams->m_seqInfoFlags.m_value << std::endl;
oss << "still_picture: " << +picParams->m_seqInfoFlags.m_fields.m_stillPicture << std::endl;
oss << "use_128x128_superblock: " << +picParams->m_seqInfoFlags.m_fields.m_use128x128Superblock << std::endl;
oss << "enable_filter_intra: " << +picParams->m_seqInfoFlags.m_fields.m_enableFilterIntra << std::endl;
oss << "enable_intra_edge_filter: " << +picParams->m_seqInfoFlags.m_fields.m_enableIntraEdgeFilter << std::endl;
oss << "enable_interintra_compound: " << +picParams->m_seqInfoFlags.m_fields.m_enableInterintraCompound << std::endl;
oss << "enable_masked_compound: " << +picParams->m_seqInfoFlags.m_fields.m_enableMaskedCompound << std::endl;
oss << "enable_dual_filter: " << +picParams->m_seqInfoFlags.m_fields.m_enableDualFilter << std::endl;
oss << "enable_order_hint: " << +picParams->m_seqInfoFlags.m_fields.m_enableOrderHint << std::endl;
oss << "enable_jnt_comp: " << +picParams->m_seqInfoFlags.m_fields.m_enableJntComp << std::endl;
oss << "enable_cdef: " << +picParams->m_seqInfoFlags.m_fields.m_enableCdef << std::endl;
oss << "mono_chrome: " << +picParams->m_seqInfoFlags.m_fields.m_monoChrome << std::endl;
oss << "color_range: " << +picParams->m_seqInfoFlags.m_fields.m_colorRange << std::endl;
oss << "subsampling_x: " << +picParams->m_seqInfoFlags.m_fields.m_subsamplingX << std::endl;
oss << "subsampling_y: " << +picParams->m_seqInfoFlags.m_fields.m_subsamplingY << std::endl;
oss << "chroma_sample_position: " << +picParams->m_seqInfoFlags.m_fields.m_chromaSamplePosition << std::endl;
oss << "film_grain_params_present: " << +picParams->m_seqInfoFlags.m_fields.m_filmGrainParamsPresent << std::endl;
//frame info
oss << "dwPicInfoFlags: " << +picParams->m_picInfoFlags.m_value << std::endl;
oss << "frame_type: " << +picParams->m_picInfoFlags.m_fields.m_frameType << std::endl;
oss << "show_frame: " << +picParams->m_picInfoFlags.m_fields.m_showFrame << std::endl;
oss << "showable_frame: " << +picParams->m_picInfoFlags.m_fields.m_showableFrame << std::endl;
oss << "error_resilient_mode: " << +picParams->m_picInfoFlags.m_fields.m_errorResilientMode << std::endl;
oss << "disable_cdf_update: " << +picParams->m_picInfoFlags.m_fields.m_disableCdfUpdate << std::endl;
oss << "allow_screen_content_tools: " << +picParams->m_picInfoFlags.m_fields.m_allowScreenContentTools << std::endl;
oss << "force_integer_mv: " << +picParams->m_picInfoFlags.m_fields.m_forceIntegerMv << std::endl;
oss << "allow_intrabc: " << +picParams->m_picInfoFlags.m_fields.m_allowIntrabc << std::endl;
oss << "use_superres: " << +picParams->m_picInfoFlags.m_fields.m_useSuperres << std::endl;
oss << "allow_high_precision_mv: " << +picParams->m_picInfoFlags.m_fields.m_allowHighPrecisionMv << std::endl;
oss << "is_motion_mode_switchable: " << +picParams->m_picInfoFlags.m_fields.m_isMotionModeSwitchable << std::endl;
oss << "use_ref_frame_mvs: " << +picParams->m_picInfoFlags.m_fields.m_useRefFrameMvs << std::endl;
oss << "disable_frame_end_update_cdf: " << +picParams->m_picInfoFlags.m_fields.m_disableFrameEndUpdateCdf << std::endl;
oss << "uniform_tile_spacing_flag: " << +picParams->m_picInfoFlags.m_fields.m_uniformTileSpacingFlag << std::endl;
oss << "allow_warped_motion: " << +picParams->m_picInfoFlags.m_fields.m_allowWarpedMotion << std::endl;
oss << "large_scale_tile: " << +picParams->m_picInfoFlags.m_fields.m_largeScaleTile << std::endl;
oss << "frame_width_minus1: " << +picParams->m_frameWidthMinus1 << std::endl;
oss << "frame_height_minus1: " << +picParams->m_frameHeightMinus1 << std::endl;
for (auto i = 0; i < 8; ++i)
{
oss << "ref_frame_map[" << +i << "] FrameIdx:" << +picParams->m_refFrameMap[i].FrameIdx << std::endl;
oss << "ref_frame_map[" << +i << "] PicFlags:" << +picParams->m_refFrameMap[i].PicFlags << std::endl;
}
for (auto i = 0; i < 7; i++)
{
oss << "ref_frame_idx[" << +i << "]: " << +picParams->m_refFrameIdx[i] << std::endl;
}
oss << "primary_ref_frame: " << +picParams->m_primaryRefFrame << std::endl;
oss << "output_frame_width_in_tiles_minus_1: " << +picParams->m_outputFrameWidthInTilesMinus1 << std::endl;
oss << "output_frame_height_in_tiles_minus_1: " << +picParams->m_outputFrameHeightInTilesMinus1 << std::endl;
for (auto i = 0; i < 2; i++)
{
oss << "filter_level[" << +i << "]: " << +picParams->m_filterLevel[i] << std::endl;
}
oss << "filter_level_u: " << +picParams->m_filterLevelU << std::endl;
oss << "filter_level_v: " << +picParams->m_filterLevelV << std::endl;
//Loop Filter Info Flags
oss << "cLoopFilterInfoFlags value: " << +picParams->m_loopFilterInfoFlags.m_value << std::endl;
oss << "sharpness_level: " << +picParams->m_loopFilterInfoFlags.m_fields.m_sharpnessLevel << std::endl;
oss << "mode_ref_delta_enabled: " << +picParams->m_loopFilterInfoFlags.m_fields.m_modeRefDeltaEnabled << std::endl;
oss << "mode_ref_delta_update: " << +picParams->m_loopFilterInfoFlags.m_fields.m_modeRefDeltaUpdate << std::endl;
oss << "order_hint: " << +picParams->m_orderHint << std::endl;
oss << "superres_scale_denominator: " << +picParams->m_superresScaleDenominator << std::endl;
oss << "interp_filter: " << +picParams->m_interpFilter << std::endl;
for (auto i = 0; i < 8; i++)
{
oss << "ref_deltas[" << +i << "]: " << +picParams->m_refDeltas[i] << std::endl;
}
for (auto i = 0; i < 2; i++)
{
oss << "mode_deltas[" << +i << "]: " << +picParams->m_modeDeltas[i] << std::endl;
}
oss << "base_qindex: " << +picParams->m_baseQindex << std::endl;
oss << "y_dc_delta_q: " << +picParams->m_yDcDeltaQ << std::endl;
oss << "u_dc_delta_q: " << +picParams->m_uDcDeltaQ << std::endl;
oss << "u_ac_delta_q: " << +picParams->m_uAcDeltaQ << std::endl;
oss << "v_dc_delta_q: " << +picParams->m_vDcDeltaQ << std::endl;
oss << "v_ac_delta_q: " << +picParams->m_vAcDeltaQ << std::endl;
// quantization_matrix
oss << "wQMatrixFlags value: " << +picParams->m_qMatrixFlags.m_value << std::endl;
oss << "using_qmatrix: " << +picParams->m_qMatrixFlags.m_fields.m_usingQmatrix << std::endl;
oss << "qm_y: " << +picParams->m_qMatrixFlags.m_fields.m_qmY << std::endl;
oss << "qm_u: " << +picParams->m_qMatrixFlags.m_fields.m_qmU << std::endl;
oss << "qm_v: " << +picParams->m_qMatrixFlags.m_fields.m_qmV << std::endl;
// Mode control flags
oss << "dwModeControlFlags value: " << +picParams->m_modeControlFlags.m_value << std::endl;
oss << "delta_q_present_flag: " << +picParams->m_modeControlFlags.m_fields.m_deltaQPresentFlag << std::endl;
oss << "log2_delta_q_res: " << +picParams->m_modeControlFlags.m_fields.m_log2DeltaQRes << std::endl;
oss << "delta_lf_present_flag: " << +picParams->m_modeControlFlags.m_fields.m_deltaLfPresentFlag << std::endl;
oss << "log2_delta_lf_res: " << +picParams->m_modeControlFlags.m_fields.m_log2DeltaLfRes << std::endl;
oss << "delta_lf_multi: " << +picParams->m_modeControlFlags.m_fields.m_deltaLfMulti << std::endl;
oss << "tx_mode: " << +picParams->m_modeControlFlags.m_fields.m_txMode << std::endl;
oss << "reference_mode: " << +picParams->m_modeControlFlags.m_fields.m_referenceMode << std::endl;
oss << "reduced_tx_set_used: " << +picParams->m_modeControlFlags.m_fields.m_reducedTxSetUsed << std::endl;
oss << "skip_mode_present: " << +picParams->m_modeControlFlags.m_fields.m_skipModePresent << std::endl;
// Segmentation
oss << "enabled: " << +picParams->m_av1SegData.m_enabled << std::endl;
oss << "update_map: " << +picParams->m_av1SegData.m_updateMap << std::endl;
oss << "temporal_update: " << +picParams->m_av1SegData.m_temporalUpdate << std::endl;
oss << "update_data: " << +picParams->m_av1SegData.m_updateData << std::endl;
for (auto i = 0; i < 8; i++)
{
for (auto j = 0; j < 8; j++)
{
oss << "feature_data[" << +i << "][" << +j << "]: " << +picParams->m_av1SegData.m_featureData[i][j] << std::endl;
}
}
for (auto i = 0; i < 8; i++)
{
oss << "feature_mask[" << +i << "]: " << +picParams->m_av1SegData.m_featureMask[i] << std::endl;
}
oss << "tile_cols: " << +picParams->m_tileCols << std::endl;
for (auto i = 0; i < 63; i++)
{
oss << "width_in_sbs_minus_1[" << +i << "]: " << +picParams->m_widthInSbsMinus1[i] << std::endl;
}
oss << "tile_rows: " << +picParams->m_tileRows << std::endl;
for (auto i = 0; i < 63; i++)
{
oss << "height_in_sbs_minus_1[" << +i << "]: " << +picParams->m_heightInSbsMinus1[i] << std::endl;
}
oss << "tile_count_minus_1: " << +picParams->m_tileCountMinus1 << std::endl;
oss << "context_update_tile_id: " << +picParams->m_contextUpdateTileId << std::endl;
oss << "cdef_damping_minus_3: " << +picParams->m_cdefDampingMinus3 << std::endl;
oss << "cdef_bits: " << +picParams->m_cdefBits << std::endl;
for (auto i = 0; i < 8; i++)
{
oss << "cdef_y_strengths[" << +i << "]: " << +picParams->m_cdefYStrengths[i] << std::endl;
}
for (auto i = 0; i < 8; i++)
{
oss << "cdef_uv_strengths[" << +i << "]: " << +picParams->m_cdefUvStrengths[i] << std::endl;
}
// Loop Restoration Flags
oss << "LoopRestorationFlags value: " << +picParams->m_loopRestorationFlags.m_value << std::endl;
oss << "yframe_restoration_type: " << +picParams->m_loopRestorationFlags.m_fields.m_yframeRestorationType << std::endl;
oss << "cbframe_restoration_type: " << +picParams->m_loopRestorationFlags.m_fields.m_cbframeRestorationType << std::endl;
oss << "crframe_restoration_type: " << +picParams->m_loopRestorationFlags.m_fields.m_crframeRestorationType << std::endl;
oss << "lr_unit_shift: " << +picParams->m_loopRestorationFlags.m_fields.m_lrUnitShift << std::endl;
oss << "lr_uv_shift: " << +picParams->m_loopRestorationFlags.m_fields.m_lrUvShift << std::endl;
for (auto i = 0; i < 7; i++)
{
oss << "wm[" << +i << "].wmtype: " << +picParams->m_wm[i].m_wmtype << std::endl;
for (auto j = 0; j < 8; j++)
{
oss << "wm[" << +i << "].wmmat[" << +j << "]: " << +picParams->m_wm[i].m_wmmat[j] << std::endl;
}
}
//Film Grain params
oss << "apply_grain: " << +picParams->m_filmGrainParams.m_filmGrainInfoFlags.m_fields.m_applyGrain << std::endl;
oss << "chroma_scaling_from_luma: " << +picParams->m_filmGrainParams.m_filmGrainInfoFlags.m_fields.m_chromaScalingFromLuma << std::endl;
oss << "grain_scaling_minus_8: " << +picParams->m_filmGrainParams.m_filmGrainInfoFlags.m_fields.m_grainScalingMinus8 << std::endl;
oss << "ar_coeff_lag: " << +picParams->m_filmGrainParams.m_filmGrainInfoFlags.m_fields.m_arCoeffLag << std::endl;
oss << "ar_coeff_shift_minus_6: " << +picParams->m_filmGrainParams.m_filmGrainInfoFlags.m_fields.m_arCoeffShiftMinus6 << std::endl;
oss << "grain_scale_shift: " << +picParams->m_filmGrainParams.m_filmGrainInfoFlags.m_fields.m_grainScaleShift << std::endl;
oss << "overlap_flag: " << +picParams->m_filmGrainParams.m_filmGrainInfoFlags.m_fields.m_overlapFlag << std::endl;
oss << "clip_to_restricted_range: " << +picParams->m_filmGrainParams.m_filmGrainInfoFlags.m_fields.m_clipToRestrictedRange << std::endl;
oss << "random_seed: " << +picParams->m_filmGrainParams.m_randomSeed << std::endl;
oss << "num_y_points: " << +picParams->m_filmGrainParams.m_numYPoints << std::endl;
for (auto i = 0; i < 14; i++)
{
oss << "point_y_value[" << +i << "]: " << +picParams->m_filmGrainParams.m_pointYValue[i] << std::endl;
}
for (auto i = 0; i < 14; i++)
{
oss << "point_y_scaling[" << +i << "]: " << +picParams->m_filmGrainParams.m_pointYScaling[i] << std::endl;
}
oss << "num_cb_points: " << +picParams->m_filmGrainParams.m_numCbPoints << std::endl;
for (auto i = 0; i < 10; i++)
{
oss << "point_cb_value[" << +i << "]: " << +picParams->m_filmGrainParams.m_pointCbValue[i] << std::endl;
}
for (auto i = 0; i < 10; i++)
{
oss << "point_cb_scaling[" << +i << "]: " << +picParams->m_filmGrainParams.m_pointCbScaling[i] << std::endl;
}
oss << "num_cr_points: " << +picParams->m_filmGrainParams.m_numCrPoints << std::endl;
for (auto i = 0; i < 10; i++)
{
oss << "point_cr_value[" << +i << "]: " << +picParams->m_filmGrainParams.m_pointCrValue[i] << std::endl;
}
for (auto i = 0; i < 10; i++)
{
oss << "point_cr_scaling[" << +i << "]: " << +picParams->m_filmGrainParams.m_pointCrScaling[i] << std::endl;
}
for (auto i = 0; i < 24; i++)
{
oss << "ar_coeffs_y[" << +i << "]: " << +picParams->m_filmGrainParams.m_arCoeffsY[i] << std::endl;
}
for (auto i = 0; i < 25; i++)
{
oss << "ar_coeffs_cb[" << +i << "]: " << +picParams->m_filmGrainParams.m_arCoeffsCb[i] << std::endl;
}
for (auto i = 0; i < 25; i++)
{
oss << "ar_coeffs_cr[" << +i << "]: " << +picParams->m_filmGrainParams.m_arCoeffsCr[i] << std::endl;
}
oss << "cb_mult: " << +picParams->m_filmGrainParams.m_cbMult << std::endl;
oss << "cb_luma_mult: " << +picParams->m_filmGrainParams.m_cbLumaMult << std::endl;
oss << "cb_offset: " << +picParams->m_filmGrainParams.m_cbOffset << std::endl;
oss << "cr_mult: " << +picParams->m_filmGrainParams.m_crMult << std::endl;
oss << "cr_luma_mult: " << +picParams->m_filmGrainParams.m_crLumaMult << std::endl;
oss << "cr_offset: " << +picParams->m_filmGrainParams.m_crOffset << std::endl;
oss << "StatusReportFeedbackNumber: " << +picParams->m_statusReportFeedbackNumber << std::endl;
//Driver internal
oss << "losslessMode: " << +picParams->m_losslessMode << std::endl;
oss << "superResUpscaledWidthMinus1: " << +picParams->m_superResUpscaledWidthMinus1 << std::endl;
oss << "superResUpscaledHeightMinus1: " << +picParams->m_superResUpscaledHeightMinus1 << std::endl;
for (auto i = 0; i < 8; i++)
{
oss << "activeRefBitMaskMfmv[" << +i << "]: " << +picParams->m_activeRefBitMaskMfmv[i] << std::endl;
}
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CodecAv1TileParams &cr)
{
const CodecAv1TileParams *tileParams = &cr;
oss << "BSTileDataLocation" << +tileParams->m_bsTileDataLocation << std::endl;
oss << "BSTileBytesInBuffer" << +tileParams->m_bsTileBytesInBuffer << std::endl;
oss << "wBadBSBufferChopping" << +tileParams->m_badBSBufferChopping << std::endl;
oss << "tile_row" << +tileParams->m_tileRow << std::endl;
oss << "tile_column" << +tileParams->m_tileColumn << std::endl;
oss << "anchor_frame_idx" << +tileParams->m_anchorFrameIdx.FrameIdx << std::endl;
oss << "BSTilePayloadSizeInBytes" << +tileParams->m_bsTilePayloadSizeInBytes << std::endl;
oss << "--------- Intel Profile Specific ---------" << std::endl;
oss << "tile_index" << +tileParams->m_tileIndex << std::endl;
oss << "StartTileIdx" << +tileParams->m_startTileIdx << std::endl;
oss << "EndTileIdx" << +tileParams->m_endTileIdx << std::endl;
return oss;
}
void DumpDecodeAv1PicParams(CodecAv1PicParams *picParams, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *picParams << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
void DumpDecodeAv1TileParams(CodecAv1TileParams *tileParams, uint32_t tileNum, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
if (tileNum > 1)
{
oss << "Total Num: " << tileNum << std::endl;
oss << std::endl;
}
for (uint16_t i = 0; i < tileNum; i++)
{
if (tileNum > 1)
{
oss << "---------Index = " << i << "---------" << std::endl;
}
oss << tileParams[i] << std::endl;
}
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
// JPEG Decode
std::ostream &operator<<(std::ostream &oss, const CodecDecodeJpegPicParams &cr)
{
const CodecDecodeJpegPicParams *picParams = &cr;
oss << "destPic.FrameIdx: " << +picParams->m_destPic.FrameIdx << std::endl;
oss << "destPic.PicFlags: " << +picParams->m_destPic.PicFlags << std::endl;
oss << "frameWidth: " << +picParams->m_frameWidth << std::endl;
oss << "frameHeight: " << +picParams->m_frameHeight << std::endl;
oss << "numCompInFrame: " << +picParams->m_numCompInFrame << std::endl;
// componentIdentifier[jpegNumComponent]
for (uint32_t i = 0; i < jpegNumComponent; ++i)
{
oss << "componentIdentifier[" << +i << "]: " << +picParams->m_componentIdentifier[i] << std::endl;
}
// quantTableSelector[jpegNumComponent]
for (uint32_t i = 0; i < jpegNumComponent; ++i)
{
oss << "quantTableSelector[" << +i << "]: " << +picParams->m_quantTableSelector[i] << std::endl;
}
oss << "chromaType: " << +picParams->m_chromaType << std::endl;
oss << "rotation: " << +picParams->m_rotation << std::endl;
oss << "totalScans: " << +picParams->m_totalScans << std::endl;
oss << "interleavedData: " << +picParams->m_interleavedData << std::endl;
oss << "reserved: " << +picParams->m_reserved << std::endl;
oss << "statusReportFeedbackNumber: " << +picParams->m_statusReportFeedbackNumber << std::endl;
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CodecDecodeJpegScanParameter &cr)
{
const CodecDecodeJpegScanParameter *scanParams = &cr;
oss << "NumScans: " << +scanParams->NumScans << std::endl;
// ScanHeader[jpegNumComponent]
for (uint32_t i = 0; i < jpegNumComponent; ++i)
{
oss << "ScanHeader[" << +i << "].NumComponents: " << +scanParams->ScanHeader[i].NumComponents << std::endl;
// ComponentSelector[jpegNumComponent]
for (uint32_t j = 0; j < jpegNumComponent; ++j)
{
oss << "ScanHeader[" << +i << "].ComponentSelector[" << +j << "]: " << +scanParams->ScanHeader[i].ComponentSelector[j] << std::endl;
}
// DcHuffTblSelector[jpegNumComponent]
for (uint32_t j = 0; j < jpegNumComponent; ++j)
{
oss << "ScanHeader[" << +i << "].DcHuffTblSelector[" << +j << "]: " << +scanParams->ScanHeader[i].DcHuffTblSelector[j] << std::endl;
}
// AcHuffTblSelector[jpegNumComponent]
for (uint32_t j = 0; j < jpegNumComponent; ++j)
{
oss << "ScanHeader[" << +i << "].AcHuffTblSelector[" << +j << "]: " << +scanParams->ScanHeader[i].AcHuffTblSelector[j] << std::endl;
}
oss << "ScanHeader[" << +i << "].RestartInterval: " << +scanParams->ScanHeader[i].RestartInterval << std::endl;
oss << "ScanHeader[" << +i << "].MCUCount: " << +scanParams->ScanHeader[i].MCUCount << std::endl;
oss << "ScanHeader[" << +i << "].ScanHoriPosition: " << +scanParams->ScanHeader[i].ScanHoriPosition << std::endl;
oss << "ScanHeader[" << +i << "].ScanVertPosition: " << +scanParams->ScanHeader[i].ScanVertPosition << std::endl;
oss << "ScanHeader[" << +i << "].DataOffset: " << +scanParams->ScanHeader[i].DataOffset << std::endl;
oss << "ScanHeader[" << +i << "].DataLength: " << +scanParams->ScanHeader[i].DataLength << std::endl;
}
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CODECHAL_DECODE_JPEG_HUFFMAN_TABLE &cr)
{
const CODECHAL_DECODE_JPEG_HUFFMAN_TABLE *huffmanTable = &cr;
// HuffTable[JPEG_MAX_NUM_HUFF_TABLE_INDEX]
for (uint32_t i = 0; i < JPEG_MAX_NUM_HUFF_TABLE_INDEX; ++i)
{
// DC_BITS[JPEG_NUM_HUFF_TABLE_DC_BITS]
oss << "HuffTable[" << +i << "].DC_BITS[0-" << (JPEG_NUM_HUFF_TABLE_DC_BITS - 1) << "]: " << std::endl;
for (uint32_t j = 0; j < JPEG_NUM_HUFF_TABLE_DC_BITS; ++j)
{
oss << +huffmanTable->HuffTable[i].DC_BITS[j] << " ";
if (j % 6 == 5 || j == JPEG_NUM_HUFF_TABLE_DC_BITS - 1)
{
oss << std::endl;
}
}
// DC_HUFFVAL[JPEG_NUM_HUFF_TABLE_DC_HUFFVAL]
oss << "HuffTable[" << +i << "].DC_HUFFVAL[0-" << (JPEG_NUM_HUFF_TABLE_DC_HUFFVAL - 1) << "]: " << std::endl;
for (uint32_t j = 0; j < JPEG_NUM_HUFF_TABLE_DC_HUFFVAL; ++j)
{
oss << +huffmanTable->HuffTable[i].DC_HUFFVAL[j] << ' ';
if (j % 6 == 5 || j == JPEG_NUM_HUFF_TABLE_DC_HUFFVAL - 1)
{
oss << std::endl;
}
}
// AC_BITS[JPEG_NUM_HUFF_TABLE_AC_BITS]
oss << "HuffTable[" << +i << "].AC_BITS[0-" << (JPEG_NUM_HUFF_TABLE_AC_BITS - 1) << "]: " << std::endl;
for (uint32_t j = 0; j < JPEG_NUM_HUFF_TABLE_AC_BITS; ++j)
{
oss << +huffmanTable->HuffTable[i].AC_BITS[j] << ' ';
if (j % 8 == 7 || j == JPEG_NUM_HUFF_TABLE_AC_BITS - 1)
{
oss << std::endl;
}
}
// AC_HUFFVAL[JPEG_NUM_HUFF_TABLE_AC_HUFFVAL]
oss << "HuffTable[" << +i << "].AC_HUFFVAL[0-" << (JPEG_NUM_HUFF_TABLE_AC_HUFFVAL - 1) << "]: " << std::endl;
for (uint32_t j = 0; j < JPEG_NUM_HUFF_TABLE_AC_HUFFVAL; ++j)
{
oss << +huffmanTable->HuffTable[i].AC_HUFFVAL[j] << ' ';
if (j % 9 == 8 || j == JPEG_NUM_HUFF_TABLE_AC_HUFFVAL - 1)
{
oss << std::endl;
}
}
}
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CodecJpegQuantMatrix &cr)
{
const CodecJpegQuantMatrix *iqParams = &cr;
for (uint32_t j = 0; j < jpegNumComponent; j++)
{
oss << "Qmatrix " << +j << ": " << std::endl;
for (int8_t i = 0; i < 56; i += 8)
{
oss << "Qmatrix[" << +i / 8 << "]:";
for (uint8_t k = 0; k < 8; k++)
oss << +iqParams->m_quantMatrix[j][i + k] << " ";
oss << std::endl;
}
}
return oss;
}
void DumpDecodeJpegPicParams(CodecDecodeJpegPicParams *picParams, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *picParams << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
void DumpDecodeJpegScanParams(CodecDecodeJpegScanParameter *scanParams, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *scanParams << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
void DumpDecodeJpegHuffmanParams(PCODECHAL_DECODE_JPEG_HUFFMAN_TABLE huffmanTable, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *huffmanTable << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
void DumpDecodeJpegIqParams(CodecJpegQuantMatrix *iqParams, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *iqParams << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
// MPEG2 Decode
std::ostream &operator<<(std::ostream &oss, const CodecDecodeMpeg2PicParams &cr)
{
const CodecDecodeMpeg2PicParams *picParams = &cr;
oss << "m_currPic FrameIdx: " << +picParams->m_currPic.FrameIdx << std::endl;
oss << "m_currPic PicFlags: " << +picParams->m_currPic.PicFlags << std::endl;
oss << "m_forwardRefIdx: " << +picParams->m_forwardRefIdx << std::endl;
oss << "m_backwardRefIdx: " << +picParams->m_backwardRefIdx << std::endl;
oss << "m_topFieldFirst: " << +picParams->m_topFieldFirst << std::endl;
oss << "m_secondField: " << +picParams->m_secondField << std::endl;
oss << "m_statusReportFeedbackNumber: " << +picParams->m_statusReportFeedbackNumber << std::endl;
// union w0
oss << "w0 m_value: " << +picParams->W0.m_value << std::endl;
oss << "m_scanOrder: " << +picParams->W0.m_scanOrder << std::endl;
oss << "m_intraVlcFormat: " << +picParams->W0.m_intraVlcFormat << std::endl;
oss << "m_quantizerScaleType: " << +picParams->W0.m_quantizerScaleType << std::endl;
oss << "m_concealmentMVFlag: " << +picParams->W0.m_concealmentMVFlag << std::endl;
oss << "m_frameDctPrediction: " << +picParams->W0.m_frameDctPrediction << std::endl;
oss << "m_topFieldFirst: " << +picParams->W0.m_topFieldFirst << std::endl;
oss << "m_intraDCPrecision: " << +picParams->W0.m_intraDCPrecision << std::endl;
// union w1
oss << "w1 m_value: " << +picParams->W1.m_value << std::endl;
oss << "m_fcode11: " << +picParams->W1.m_fcode11 << std::endl;
oss << "m_fcode10: " << +picParams->W1.m_fcode10 << std::endl;
oss << "m_fcode01: " << +picParams->W1.m_fcode01 << std::endl;
oss << "m_fcode00: " << +picParams->W1.m_fcode00 << std::endl;
oss << "m_horizontalSize: " << +picParams->m_horizontalSize << std::endl;
oss << "m_verticalSize: " << +picParams->m_verticalSize << std::endl;
oss << "m_pictureCodingType: " << +picParams->m_pictureCodingType << std::endl;
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CodecDecodeMpeg2SliceParams &cr)
{
const CodecDecodeMpeg2SliceParams *sliceControl = &cr;
oss << "m_sliceDataSize: " << +sliceControl->m_sliceDataSize << std::endl;
oss << "m_sliceDataOffset: " << +sliceControl->m_sliceDataOffset << std::endl;
oss << "m_macroblockOffset: " << +sliceControl->m_macroblockOffset << std::endl;
oss << "m_sliceHorizontalPosition: " << +sliceControl->m_sliceHorizontalPosition << std::endl;
oss << "m_sliceVerticalPosition: " << +sliceControl->m_sliceVerticalPosition << std::endl;
oss << "m_quantiserScaleCode: " << +sliceControl->m_quantiserScaleCode << std::endl;
oss << "m_numMbsForSlice: " << +sliceControl->m_numMbsForSlice << std::endl;
oss << "m_numMbsForSliceOverflow: " << +sliceControl->m_numMbsForSliceOverflow << std::endl;
oss << "m_reservedBits: " << +sliceControl->m_reservedBits << std::endl;
oss << "m_startCodeBitOffset: " << +sliceControl->m_startCodeBitOffset << std::endl;
oss << std::endl;
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CodecDecodeMpeg2MbParams &cr)
{
const CodecDecodeMpeg2MbParams *mbParams = &cr;
oss << "m_mbAddr: " << +mbParams->m_mbAddr << std::endl;
oss << "MBType.m_intraMb: " << +mbParams->MBType.m_intraMb << std::endl;
oss << "MBType.m_motionFwd: " << +mbParams->MBType.m_motionFwd << std::endl;
oss << "MBType.m_motionBwd: " << +mbParams->MBType.m_motionBwd << std::endl;
oss << "MBType.m_motion4mv: " << +mbParams->MBType.m_motion4mv << std::endl;
oss << "MBType.m_h261Lpfilter: " << +mbParams->MBType.m_h261Lpfilter << std::endl;
oss << "MBType.m_fieldResidual: " << +mbParams->MBType.m_fieldResidual << std::endl;
oss << "MBType.m_mbScanMethod: " << +mbParams->MBType.m_mbScanMethod << std::endl;
oss << "MBType.m_motionType: " << +mbParams->MBType.m_motionType << std::endl;
oss << "MBType.m_hostResidualDiff: " << +mbParams->MBType.m_hostResidualDiff << std::endl;
oss << "MBType.m_mvertFieldSel: " << +mbParams->MBType.m_mvertFieldSel << std::endl;
oss << "m_mbSkipFollowing: " << +mbParams->m_mbSkipFollowing << std::endl;
oss << "m_mbDataLoc: " << +mbParams->m_mbDataLoc << std::endl;
oss << "m_codedBlockPattern: " << +mbParams->m_codedBlockPattern << std::endl;
// NumCoeff[CODEC_NUM_BLOCK_PER_MB]
for (uint16_t i = 0; i < CODEC_NUM_BLOCK_PER_MB; ++i)
{
oss << "m_numCoeff[" << +i << "]: " << +mbParams->m_numCoeff[i] << std::endl;
}
// motion_vectors[8],printing them in 4 value chunks per line
for (uint8_t i = 0; i < 2; ++i)
{
oss << "m_motionVectors[" << +i * 4 << "-" << (+i * 4) + 3 << "]: ";
for (uint8_t j = 0; j < 4; j++)
oss << +mbParams->m_motionVectors[i * 4 + j] << " ";
oss << std::endl;
}
oss << std::endl;
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CodecMpeg2IqMatrix &cr)
{
const CodecMpeg2IqMatrix *iqParams = &cr;
if (iqParams->m_loadIntraQuantiserMatrix)
{
oss << "intra_QmatrixData:" << std::endl;
for (uint8_t i = 0; i < 56; i += 8)
{
oss << "Qmatrix[" << +i / 8 << "]: ";
for (uint8_t j = 0; j < 8; j++)
oss << +iqParams->m_intraQuantiserMatrix[i + j] << " ";
oss << std::endl;
}
}
if (iqParams->m_loadNonIntraQuantiserMatrix)
{
oss << "non_intra_QmatrixData:" << std::endl;
for (uint8_t i = 0; i < 56; i += 8)
{
oss << "Qmatrix[" << +i / 8 << "]: ";
for (uint8_t j = 0; j < 8; j++)
oss << +iqParams->m_nonIntraQuantiserMatrix[i + j] << " ";
oss << std::endl;
}
}
if (iqParams->m_loadChromaIntraQuantiserMatrix)
{
oss << "chroma_intra_QmatrixData:" << std::endl;
for (uint8_t i = 0; i < 56; i += 8)
{
oss << "Qmatrix[" << +i / 8 << "]: ";
for (uint8_t j = 0; j < 8; j++)
oss << +iqParams->m_chromaIntraQuantiserMatrix[i + j] << " ";
oss << std::endl;
}
}
if (iqParams->m_loadChromaNonIntraQuantiserMatrix)
{
oss << "chroma_non_intra_QmatrixData:" << std::endl;
for (uint8_t i = 0; i < 56; i += 8)
{
oss << "Qmatrix[" << +i / 8 << "]: ";
for (uint8_t j = 0; j < 8; j++)
oss << +iqParams->m_chromaNonIntraQuantiserMatrix[i + j] << " ";
oss << std::endl;
}
}
return oss;
}
void DumpDecodeMpeg2PicParams(CodecDecodeMpeg2PicParams *picParams, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *picParams << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
void DumpDecodeMpeg2SliceParams(CodecDecodeMpeg2SliceParams *sliceParams, uint32_t numSlices, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
if (numSlices > 1)
{
oss << "Total Num: " << numSlices << std::endl;
oss << std::endl;
}
for (uint32_t i = 0; i < numSlices; i++)
{
if (numSlices > 1)
{
oss << "---------Index = " << i << "---------" << std::endl;
}
oss << sliceParams[i] << std::endl;
}
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
void DumpDecodeMpeg2MbParams(CodecDecodeMpeg2MbParams *mbParams, uint32_t numMbs, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
if (numMbs > 1)
{
oss << "Total Num: " << numMbs << std::endl;
oss << std::endl;
}
for (uint32_t i = 0; i < numMbs; i++)
{
if (numMbs > 1)
{
oss << "---------Index = " << i << "---------" << std::endl;
}
oss << mbParams[i] << std::endl;
}
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
void DumpDecodeMpeg2IqParams(CodecMpeg2IqMatrix *iqParams, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *iqParams << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
// VP8 Decode
std::ostream &operator<<(std::ostream &oss, const CODEC_VP8_PIC_PARAMS &cr)
{
const CODEC_VP8_PIC_PARAMS *picParams = &cr;
oss << "CurrPic FrameIdx: " << +picParams->CurrPic.FrameIdx << std::endl;
oss << "CurrPic PicFlags: " << +picParams->CurrPic.PicFlags << std::endl;
oss << "wFrameWidthInMbsMinus1: " << +picParams->wFrameWidthInMbsMinus1 << std::endl;
oss << "wFrameHeightInMbsMinus1: " << +picParams->wFrameHeightInMbsMinus1 << std::endl;
oss << "ucCurrPicIndex: " << +picParams->ucCurrPicIndex << std::endl;
oss << "ucLastRefPicIndex: " << +picParams->ucLastRefPicIndex << std::endl;
oss << "ucGoldenRefPicIndex: " << +picParams->ucGoldenRefPicIndex << std::endl;
oss << "ucAltRefPicIndex: " << +picParams->ucAltRefPicIndex << std::endl;
oss << "ucDeblockedPicIndex: " << +picParams->ucDeblockedPicIndex << std::endl;
oss << "ucReserved8Bits: " << +picParams->ucReserved8Bits << std::endl;
oss << "wPicFlags: " << +picParams->wPicFlags << std::endl;
oss << "key_frame: " << +picParams->key_frame << std::endl;
oss << "version: " << +picParams->version << std::endl;
oss << "segmentation_enabled: " << +picParams->segmentation_enabled << std::endl;
oss << "update_mb_segmentation_map: " << +picParams->update_mb_segmentation_map << std::endl;
oss << "update_segment_feature_data: " << +picParams->update_segment_feature_data << std::endl;
oss << "filter_type: " << +picParams->filter_type << std::endl;
oss << "sign_bias_golden: " << +picParams->sign_bias_golden << std::endl;
oss << "sign_bias_alternate: " << +picParams->sign_bias_alternate << std::endl;
oss << "mb_no_coeff_skip: " << +picParams->mb_no_coeff_skip << std::endl;
oss << "mode_ref_lf_delta_update: " << +picParams->mode_ref_lf_delta_update << std::endl;
oss << "CodedCoeffTokenPartition: " << +picParams->CodedCoeffTokenPartition << std::endl;
oss << "LoopFilterDisable: " << +picParams->LoopFilterDisable << std::endl;
oss << "loop_filter_adj_enable: " << +picParams->loop_filter_adj_enable << std::endl;
for (uint8_t i = 0; i < 4; ++i)
{
oss << "ucLoopFilterLevel[" << +i << "]: " << +picParams->ucLoopFilterLevel[i] << std::endl;
}
for (uint8_t i = 0; i < 4; ++i)
{
oss << "cRefLfDelta[" << +i << "]: " << +picParams->cRefLfDelta[i] << std::endl;
}
for (uint8_t i = 0; i < 4; ++i)
{
oss << "cModeLfDelta[" << +i << "]: " << +picParams->cModeLfDelta[i] << std::endl;
}
oss << "ucSharpnessLevel: " << +picParams->ucSharpnessLevel << std::endl;
for (uint8_t i = 0; i < 3; ++i)
{
oss << "cMbSegmentTreeProbs[" << +i << "]: " << +picParams->cMbSegmentTreeProbs[i] << std::endl;
}
oss << "ucProbSkipFalse: " << +picParams->ucProbSkipFalse << std::endl;
oss << "ucProbIntra: " << +picParams->ucProbIntra << std::endl;
oss << "ucProbLast: " << +picParams->ucProbLast << std::endl;
oss << "ucProbGolden: " << +picParams->ucProbGolden << std::endl;
for (uint8_t i = 0; i < 4; ++i)
{
oss << "ucYModeProbs[" << +i << "]: " << +picParams->ucYModeProbs[i] << std::endl;
}
for (uint8_t i = 0; i < 3; ++i)
{
oss << "ucUvModeProbs[" << +i << "]: " << +picParams->ucUvModeProbs[i] << std::endl;
}
oss << "ucReserved8Bits1: " << +picParams->ucReserved8Bits1 << std::endl;
oss << "ucP0EntropyCount: " << +picParams->ucP0EntropyCount << std::endl;
oss << "ucP0EntropyValue: " << +picParams->ucP0EntropyValue << std::endl;
oss << "uiP0EntropyRange: " << +picParams->uiP0EntropyRange << std::endl;
oss << "uiFirstMbByteOffset: " << +picParams->uiFirstMbByteOffset << std::endl;
for (uint8_t i = 0; i < 2; ++i)
{
for (uint8_t j = 0; j < CODEC_VP8_MVP_COUNT; ++j)
{
oss << "ucMvUpdateProb[" << +i << "][" << +j << "]: " << +picParams->ucMvUpdateProb[i][j] << std::endl;
}
}
for (uint8_t i = 0; i < CODEC_VP8_MAX_PARTITION_NUMBER; ++i)
{
oss << "uiPartitionSize[" << +i << "]: " << +picParams->uiPartitionSize[i] << std::endl;
}
oss << "uiStatusReportFeedbackNumber: " << +picParams->uiStatusReportFeedbackNumber << std::endl;
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CODEC_VP8_SLICE_PARAMS &cr)
{
const CODEC_VP8_SLICE_PARAMS *sliceParams = &cr;
oss << "BSNALunitDataLocation: " << +sliceParams->BSNALunitDataLocation << std::endl;
oss << "SliceBytesInBuffer: " << +sliceParams->SliceBytesInBuffer << std::endl;
oss << std::endl;
return oss;
}
std::ostream &operator<<(std::ostream &oss, const CODEC_VP8_IQ_MATRIX_PARAMS &cr)
{
const CODEC_VP8_IQ_MATRIX_PARAMS *iqParams = &cr;
for (uint8_t i = 0; i < 4; ++i)
{
for (uint8_t j = 0; j < 6; ++j)
{
oss << "quantization_values[" << +i << "][" << +j << "]: " << +iqParams->quantization_values[i][j] << std::endl;
}
}
return oss;
}
void DumpDecodeVp8PicParams(PCODEC_VP8_PIC_PARAMS picParams, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *picParams << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
void DumpDecodeVp8SliceParams(PCODEC_VP8_SLICE_PARAMS sliceParams, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *sliceParams << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
void DumpDecodeVp8IqParams(PCODEC_VP8_IQ_MATRIX_PARAMS iqParams, std::string fileName)
{
std::ostringstream oss;
oss.setf(std::ios::showbase | std::ios::uppercase);
oss << *iqParams << std::endl;
std::ofstream ofs(fileName, std::ios::out);
ofs << oss.str();
ofs.close();
}
CodechalDebugInterface::CodechalDebugInterface()
{
MOS_ZeroMemory(m_fileName, sizeof(m_fileName));
MOS_ZeroMemory(m_path, sizeof(m_path));
m_dumpYUVSurfaceLegacy = [this](
PMOS_SURFACE surface,
const char *attrName,
const char *surfName,
CODECHAL_MEDIA_STATE_TYPE mediaState,
uint32_t width_in,
uint32_t height_in) {
bool hasAuxSurf = false;
bool isPlanar = true;
bool hasRefSurf = false;
uint8_t *surfBaseAddr = nullptr;
uint8_t *lockedAddr = nullptr;
if (!DumpIsEnabled(attrName, mediaState))
{
return MOS_STATUS_SUCCESS;
}
const char *funcName = (m_codecFunction == CODECHAL_FUNCTION_DECODE) ? "_DEC" : (m_codecFunction == CODECHAL_FUNCTION_CENC_DECODE ? "_DEC" : "_ENC");
std::string bufName = std::string(surfName) + "_w[" + std::to_string(surface->dwWidth) + "]_h[" + std::to_string(surface->dwHeight) + "]_p[" + std::to_string(surface->dwPitch) + "]";
const char *filePath = CreateFileName(funcName, bufName.c_str(), hasAuxSurf ? ".Y" : ".yuv");
MOS_LOCK_PARAMS lockFlags;
GMM_RESOURCE_FLAG gmmFlags;
MOS_ZeroMemory(&gmmFlags, sizeof(gmmFlags));
CODECHAL_DEBUG_CHK_NULL(surface);
gmmFlags = surface->OsResource.pGmmResInfo->GetResFlags();
hasAuxSurf = (gmmFlags.Gpu.MMC || gmmFlags.Info.MediaCompressed) && gmmFlags.Gpu.UnifiedAuxSurface;
if (!m_configMgr->AttrIsEnabled(CodechalDbgAttr::attrDecodeAuxSurface))
{
hasAuxSurf = false;
}
isPlanar = !!(m_osInterface->pfnGetGmmClientContext(m_osInterface)->IsPlanar(surface->OsResource.pGmmResInfo->GetResourceFormat()));
MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS));
lockFlags.ReadOnly = 1;
lockFlags.TiledAsTiled = 1; // Bypass GMM CPU blit due to some issues in GMM CpuBlt function
if (hasAuxSurf)
{
// Dump MMC surface as raw layout
lockFlags.NoDecompress = 1;
}
// when not setting dump compressed surface cfg, use ve copy for dump
if (!m_configMgr->AttrIsEnabled(CodechalDbgAttr::attrDecodeCompSurface))
{
DumpUncompressedYUVSurface(surface);
lockedAddr = (uint8_t *)m_osInterface->pfnLockResource(m_osInterface, &m_temp2DSurfForCopy.OsResource, &lockFlags);
CODECHAL_DEBUG_CHK_NULL(lockedAddr);
surface = &m_temp2DSurfForCopy;
}
else
{
// when setting dump compressed surface cfg, try directly lock surface
lockedAddr = (uint8_t *)m_osInterface->pfnLockResource(m_osInterface, &surface->OsResource, &lockFlags);
// if failed to lock, try to submit copy task and reallocate temp surface for dump
if (lockedAddr == nullptr)
{
uint32_t sizeToBeCopied = 0;
MOS_GFXRES_TYPE ResType;
#if !defined(LINUX)
ResType = surface->OsResource.ResType;
CODECHAL_DEBUG_CHK_STATUS(ReAllocateSurface(
&m_temp2DSurfForCopy,
surface,
"Temp2DSurfForSurfDumper",
ResType));
#endif
uint32_t arraySize = surface->OsResource.pGmmResInfo->GetArraySize();
if (arraySize == 0)
{
return MOS_STATUS_UNKNOWN;
}
uint32_t sizeSrcSurface = (uint32_t)(surface->OsResource.pGmmResInfo->GetSizeMainSurface()) / arraySize;
// Ensure allocated buffer size contains the source surface size
if (m_temp2DSurfForCopy.OsResource.pGmmResInfo->GetSizeMainSurface() >= sizeSrcSurface)
{
sizeToBeCopied = sizeSrcSurface;
}
if (sizeToBeCopied == 0)
{
CODECHAL_DEBUG_ASSERTMESSAGE("Cannot allocate correct size, failed to copy nonlockable resource");
return MOS_STATUS_INVALID_PARAMETER;
}
CODECHAL_DEBUG_VERBOSEMESSAGE("Temp2DSurfaceForCopy width %d, height %d, pitch %d, TileType %d, bIsCompressed %d, CompressionMode %d",
m_temp2DSurfForCopy.dwWidth,
m_temp2DSurfForCopy.dwHeight,
m_temp2DSurfForCopy.dwPitch,
m_temp2DSurfForCopy.TileType,
m_temp2DSurfForCopy.bIsCompressed,
m_temp2DSurfForCopy.CompressionMode);
uint32_t bpp = surface->OsResource.pGmmResInfo->GetBitsPerPixel();
CODECHAL_DEBUG_CHK_STATUS(m_osInterface->pfnMediaCopyResource2D(m_osInterface, &surface->OsResource, &m_temp2DSurfForCopy.OsResource, surface->dwPitch, sizeSrcSurface / (surface->dwPitch), bpp, false));
lockedAddr = (uint8_t *)m_osInterface->pfnLockResource(m_osInterface, &m_temp2DSurfForCopy.OsResource, &lockFlags);
CODECHAL_DEBUG_CHK_NULL(lockedAddr);
surface = &m_temp2DSurfForCopy;
}
}
gmmFlags = surface->OsResource.pGmmResInfo->GetResFlags();
surfBaseAddr = lockedAddr;
// Use MOS swizzle for non-vecopy dump
if (m_configMgr->AttrIsEnabled(CodechalDbgAttr::attrDecodeCompSurface))
{
uint32_t sizeMain = (uint32_t)(surface->OsResource.pGmmResInfo->GetSizeMainSurface());
surfBaseAddr = (uint8_t *)MOS_AllocMemory(sizeMain);
CODECHAL_DEBUG_CHK_NULL(surfBaseAddr);
Mos_SwizzleData(lockedAddr, surfBaseAddr, surface->TileType, MOS_TILE_LINEAR, sizeMain / surface->dwPitch, surface->dwPitch, !MEDIA_IS_SKU(m_osInterface->pfnGetSkuTable(m_osInterface), FtrTileY) || gmmFlags.Info.Tile4);
}
uint8_t *data = surfBaseAddr;
data += surface->dwOffset + surface->YPlaneOffset.iYOffset * surface->dwPitch;
uint32_t width = width_in ? width_in : surface->dwWidth;
uint32_t height = height_in ? height_in : surface->dwHeight;
uint32_t lumaheight = 0;
switch (surface->Format)
{
case Format_YUY2:
case Format_P010:
case Format_P016:
width = width << 1;
break;
case Format_Y216:
case Format_Y210: //422 10bit -- Y0[15:0]:U[15:0]:Y1[15:0]:V[15:0] = 32bits per pixel = 4Bytes per pixel
case Format_Y410: //444 10bit -- A[31:30]:V[29:20]:Y[19:10]:U[9:0] = 32bits per pixel = 4Bytes per pixel
case Format_R10G10B10A2:
case Format_AYUV: //444 8bit -- A[31:24]:Y[23:16]:U[15:8]:V[7:0] = 32bits per pixel = 4Bytes per pixel
case Format_A8R8G8B8:
width = width << 2;
break;
case Format_Y416:
width = width << 3;
break;
case Format_R8G8B8:
width = width * 3;
break;
default:
break;
}
uint32_t pitch = surface->dwPitch;
if (surface->Format == Format_UYVY)
pitch = width;
if (CodecHal_PictureIsBottomField(m_currPic))
{
data += pitch;
}
if (CodecHal_PictureIsField(m_currPic))
{
pitch *= 2;
height /= 2;
}
lumaheight = hasAuxSurf ? GFX_ALIGN(height, 32) : height;
std::ofstream ofs(filePath, std::ios_base::out | std::ios_base::binary);
if (ofs.fail())
{
return MOS_STATUS_UNKNOWN;
}
// write luma data to file
for (uint32_t h = 0; h < lumaheight; h++)
{
ofs.write((char *)data, hasAuxSurf ? pitch : width);
data += pitch;
}
switch (surface->Format)
{
case Format_NV12:
case Format_P010:
case Format_P016:
height = height >> 1;
break;
case Format_Y416: //444 16bit
case Format_AYUV: //444 8bit
case Format_AUYV:
case Format_Y410: //444 10bit
case Format_R10G10B10A2:
height = height << 1;
break;
case Format_YUY2:
case Format_YUYV:
case Format_YVYU:
case Format_UYVY:
case Format_VYUY:
case Format_Y216: //422 16bit
case Format_Y210: //422 10bit
case Format_P208: //422 8bit
case Format_RGBP:
case Format_BGRP:
break;
case Format_422V:
case Format_IMC3:
height = height / 2;
break;
default:
height = 0;
break;
}
uint8_t *vPlaneData = surfBaseAddr;
if (isPlanar)
{
if (hasAuxSurf)
{
data = surfBaseAddr + surface->UPlaneOffset.iSurfaceOffset;
}
else
{
// LibVA uses iSurfaceOffset instead of iLockSurfaceOffset.To use this dump in Linux,
// changing the variable to iSurfaceOffset may be necessary for the chroma dump to work properly.
#if defined(LINUX)
data = surfBaseAddr + surface->UPlaneOffset.iSurfaceOffset;
if (surface->Format == Format_422V || surface->Format == Format_IMC3)
{
vPlaneData = surfBaseAddr + surface->VPlaneOffset.iSurfaceOffset;
}
#else
data = surfBaseAddr + surface->UPlaneOffset.iLockSurfaceOffset;
if (surface->Format == Format_422V ||
surface->Format == Format_IMC3 ||
surface->Format == Format_RGBP ||
surface->Format == Format_BGRP)
{
vPlaneData = surfBaseAddr + surface->VPlaneOffset.iLockSurfaceOffset;
}
#endif
}
//No seperate chroma for linear surfaces
// Seperate Y/UV if MMC is enabled
if (hasAuxSurf)
{
const char *uvfilePath = CreateFileName(funcName, bufName.c_str(), ".UV");
std::ofstream ofs1(uvfilePath, std::ios_base::out | std::ios_base::binary);
if (ofs1.fail())
{
return MOS_STATUS_UNKNOWN;
}
// write chroma data to file
for (uint32_t h = 0; h < GFX_ALIGN(height, 32); h++)
{
ofs1.write((char *)data, pitch);
data += pitch;
}
ofs1.close();
}
else
{
// write chroma data to file
for (uint32_t h = 0; h < height; h++)
{
ofs.write((char *)data, hasAuxSurf ? pitch : width);
data += pitch;
}
// write v planar data to file
if (surface->Format == Format_422V ||
surface->Format == Format_IMC3 ||
surface->Format == Format_RGBP ||
surface->Format == Format_BGRP)
{
for (uint32_t h = 0; h < height; h++)
{
ofs.write((char *)vPlaneData, hasAuxSurf ? pitch : width);
vPlaneData += pitch;
}
}
}
ofs.close();
}
if (hasAuxSurf)
{
uint32_t resourceIndex = m_osInterface->pfnGetResourceIndex(&surface->OsResource);
uint8_t *yAuxData = (uint8_t *)lockedAddr + surface->OsResource.pGmmResInfo->GetPlanarAuxOffset(resourceIndex, GMM_AUX_Y_CCS);
uint32_t yAuxSize = isPlanar ? ((uint32_t)(surface->OsResource.pGmmResInfo->GetPlanarAuxOffset(resourceIndex, GMM_AUX_UV_CCS) -
surface->OsResource.pGmmResInfo->GetPlanarAuxOffset(resourceIndex, GMM_AUX_Y_CCS)))
: (uint32_t)surface->OsResource.pGmmResInfo->GetAuxQPitch();
// Y Aux data
const char *yAuxfilePath = CreateFileName(funcName, bufName.c_str(), ".Yaux");
std::ofstream ofs2(yAuxfilePath, std::ios_base::out | std::ios_base::binary);
if (ofs2.fail())
{
return MOS_STATUS_UNKNOWN;
}
ofs2.write((char *)yAuxData, yAuxSize);
ofs2.close();
if (isPlanar)
{
uint8_t *uvAuxData = (uint8_t *)lockedAddr + surface->OsResource.pGmmResInfo->GetPlanarAuxOffset(resourceIndex, GMM_AUX_UV_CCS);
uint32_t uvAuxSize = (uint32_t)surface->OsResource.pGmmResInfo->GetAuxQPitch() - yAuxSize;
// UV Aux data
const char *uvAuxfilePath = CreateFileName(funcName, bufName.c_str(), ".UVaux");
std::ofstream ofs3(uvAuxfilePath, std::ios_base::out | std::ios_base::binary);
if (ofs3.fail())
{
return MOS_STATUS_UNKNOWN;
}
ofs3.write((char *)uvAuxData, uvAuxSize);
ofs3.close();
}
}
if (surfBaseAddr && m_configMgr->AttrIsEnabled(CodechalDbgAttr::attrDecodeCompSurface))
{
MOS_FreeMemory(surfBaseAddr);
}
if (lockedAddr)
{
m_osInterface->pfnUnlockResource(m_osInterface, &surface->OsResource);
}
return MOS_STATUS_SUCCESS;
};
m_dumpYUVSurface = [this](
PMOS_SURFACE surface,
const char *attrName,
const char *surfName,
CODECHAL_MEDIA_STATE_TYPE mediaState,
uint32_t width_in,
uint32_t height_in) {
if (!DumpIsEnabled(attrName, mediaState))
{
return MOS_STATUS_SUCCESS;
}
const char *funcName = (m_codecFunction == CODECHAL_FUNCTION_DECODE) ? "_DEC" : (m_codecFunction == CODECHAL_FUNCTION_CENC_DECODE ? "_DEC" : "_ENC");
std::string bufName = std::string(surfName) + "_w[" + std::to_string(surface->dwWidth) + "]_h[" + std::to_string(surface->dwHeight) + "]_p[" + std::to_string(surface->dwPitch) + "]";
const char *filePath = CreateFileName(funcName, bufName.c_str(), ".yuv");
MediaDebugFastDump::Dump(surface->OsResource, filePath);
if (!MediaDebugFastDump::IsGood())
{
return m_dumpYUVSurfaceLegacy(
surface,
attrName,
surfName,
mediaState,
width_in,
height_in);
}
return MOS_STATUS_SUCCESS;
};
m_dumpBufferLegacy = [this](
PMOS_RESOURCE resource,
const char *attrName,
const char *bufferName,
uint32_t size,
uint32_t offset,
CODECHAL_MEDIA_STATE_TYPE mediaState) {
MEDIA_DEBUG_FUNCTION_ENTER;
MEDIA_DEBUG_CHK_NULL(resource);
MEDIA_DEBUG_CHK_NULL(bufferName);
if (size == 0)
{
return MOS_STATUS_SUCCESS;
}
if (attrName)
{
bool attrEnabled = false;
if (mediaState == CODECHAL_NUM_MEDIA_STATES)
{
attrEnabled = m_configMgr->AttrIsEnabled(attrName);
}
else
{
attrEnabled = static_cast<CodecDebugConfigMgr *>(m_configMgr)->AttrIsEnabled(mediaState, attrName);
}
if (!attrEnabled)
{
return MOS_STATUS_SUCCESS;
}
}
const char *fileName;
bool binaryDump = false;
if ((!strcmp(attrName, MediaDbgAttr::attrDecodeBitstream)) ||
(!strcmp(attrName, MediaDbgAttr::attrStreamIn)) ||
(!strcmp(attrName, MediaDbgAttr::attrStreamOut)) ||
(!strcmp(attrName, MediaDbgAttr::attrMvData)) ||
(!strcmp(attrName, MediaDbgAttr::attrSegId)) ||
(!strcmp(attrName, MediaDbgAttr::attrCoefProb)) ||
m_configMgr->AttrIsEnabled(MediaDbgAttr::attrDumpBufferInBinary))
{
binaryDump = true;
}
const char *extType = binaryDump ? MediaDbgExtType::dat : MediaDbgExtType::txt;
if (mediaState == CODECHAL_NUM_MEDIA_STATES)
{
fileName = CreateFileName(bufferName, attrName, extType);
}
else
{
std::string kernelName = static_cast<CodecDebugConfigMgr *>(m_configMgr)->GetMediaStateStr(mediaState);
fileName = CreateFileName(kernelName.c_str(), bufferName, extType);
}
MOS_STATUS status = MOS_STATUS_SUCCESS;
if ((resource->pGmmResInfo != nullptr) &&
(resource->pGmmResInfo->GetResFlags().Info.NotLockable))
{
uint8_t *data = nullptr;
PMOS_RESOURCE pReadbackBuffer = (PMOS_RESOURCE)MOS_AllocAndZeroMemory(sizeof(MOS_RESOURCE));
CODECHAL_DEBUG_CHK_NULL(pReadbackBuffer);
status = AllocateLinearResource(MOS_GFXRES_BUFFER, (uint32_t)resource->pGmmResInfo->GetBaseWidth(), (uint32_t)resource->pGmmResInfo->GetBaseHeight(), Format_Any, pReadbackBuffer);
if (MOS_FAILED(status))
{
MOS_FreeMemAndSetNull(pReadbackBuffer);
}
CODECHAL_DEBUG_CHK_STATUS(status);
status = VDBypassCopyResource(resource, pReadbackBuffer);
if (MOS_FAILED(status))
{
m_osInterface->pfnFreeResource(m_osInterface, pReadbackBuffer);
MOS_FreeMemAndSetNull(pReadbackBuffer);
}
CODECHAL_DEBUG_CHK_STATUS(status);
MOS_LOCK_PARAMS lockFlags;
MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS));
lockFlags.ReadOnly = 1;
data = (uint8_t *)m_osInterface->pfnLockResource(m_osInterface, pReadbackBuffer, &lockFlags);
if(data == nullptr)
{
m_osInterface->pfnFreeResource(m_osInterface, pReadbackBuffer);
MOS_FreeMemAndSetNull(pReadbackBuffer);
}
CODECHAL_DEBUG_CHK_NULL(data);
data += offset;
if (binaryDump)
{
status = DumpBufferInBinary(data, size);
}
else
{
status = DumpBufferInHexDwords(data, size);
}
m_osInterface->pfnUnlockResource(m_osInterface, pReadbackBuffer);
m_osInterface->pfnFreeResource(m_osInterface, pReadbackBuffer);
MOS_FreeMemAndSetNull(pReadbackBuffer);
CODECHAL_DEBUG_CHK_STATUS(status);
}
else
{
MOS_LOCK_PARAMS lockFlags;
MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS));
lockFlags.ReadOnly = 1;
uint8_t *data = (uint8_t *)m_osInterface->pfnLockResource(m_osInterface, resource, &lockFlags);
MEDIA_DEBUG_CHK_NULL(data);
data += offset;
if (binaryDump)
{
status = DumpBufferInBinary(data, size);
}
else
{
status = DumpBufferInHexDwords(data, size);
}
if (data)
{
m_osInterface->pfnUnlockResource(m_osInterface, resource);
}
}
return status;
};
m_dumpBuffer = [this](
PMOS_RESOURCE resource,
const char *attrName,
const char *bufferName,
uint32_t size,
uint32_t offset,
CODECHAL_MEDIA_STATE_TYPE mediaState) {
MEDIA_DEBUG_FUNCTION_ENTER;
MEDIA_DEBUG_CHK_NULL(resource);
MEDIA_DEBUG_CHK_NULL(bufferName);
if (size == 0)
{
return MOS_STATUS_SUCCESS;
}
bool attrEnabled = false;
if (mediaState == CODECHAL_NUM_MEDIA_STATES)
{
attrEnabled = m_configMgr->AttrIsEnabled(attrName);
}
else
{
attrEnabled = static_cast<CodecDebugConfigMgr *>(m_configMgr)->AttrIsEnabled(mediaState, attrName);
}
if (!attrEnabled)
{
return MOS_STATUS_SUCCESS;
}
const char *fileName;
bool binaryDump = false;
if ((!strcmp(attrName, MediaDbgAttr::attrDecodeBitstream)) ||
(!strcmp(attrName, MediaDbgAttr::attrStreamIn)) ||
(!strcmp(attrName, MediaDbgAttr::attrStreamOut)) ||
(!strcmp(attrName, MediaDbgAttr::attrMvData)) ||
(!strcmp(attrName, MediaDbgAttr::attrSegId)) ||
(!strcmp(attrName, MediaDbgAttr::attrCoefProb)) ||
m_configMgr->AttrIsEnabled(MediaDbgAttr::attrDumpBufferInBinary))
{
binaryDump = true;
}
const char *extType = binaryDump ? MediaDbgExtType::dat : MediaDbgExtType::txt;
if (mediaState == CODECHAL_NUM_MEDIA_STATES)
{
fileName = CreateFileName(bufferName, attrName, extType);
}
else
{
std::string kernelName = static_cast<CodecDebugConfigMgr *>(m_configMgr)->GetMediaStateStr(mediaState);
fileName = CreateFileName(kernelName.c_str(), bufferName, extType);
}
MediaDebugFastDump::Dump(*resource, fileName, size, offset);
if (!MediaDebugFastDump::IsGood())
{
return m_dumpBufferLegacy(
resource,
attrName,
bufferName,
size,
offset,
mediaState);
}
return MOS_STATUS_SUCCESS;
};
}
CodechalDebugInterface::~CodechalDebugInterface()
{
if (nullptr != m_configMgr)
{
MOS_Delete(m_configMgr);
}
MediaDebugFastDump::DestroyInstance();
}
CodechalDebugInterface* CodechalDebugInterface::Create()
{
return MOS_New(CodechalDebugInterface);
}
void CodechalDebugInterface::CheckGoldenReferenceExist()
{
std::ifstream crcGoldenRefStream(m_crcGoldenRefFileName);
m_goldenReferenceExist = crcGoldenRefStream.good() ? true : false;
}
MOS_STATUS CodechalDebugInterface::DumpRgbDataOnYUVSurface(
PMOS_SURFACE surface,
const char *attrName,
const char *surfName,
CODECHAL_MEDIA_STATE_TYPE mediaState,
uint32_t width_in,
uint32_t height_in)
{
bool hasAuxSurf = false;
bool isPlanar = true;
bool hasRefSurf = false;
uint8_t *surfBaseAddr = nullptr;
uint8_t *lockedAddr = nullptr;
if (!DumpIsEnabled(attrName, mediaState))
{
return MOS_STATUS_SUCCESS;
}
//To write RGB data on AYUV surface for validation purpose due to similiar layout
int32_t sfcOutputRgbFormatFlag = 0;
int32_t bIsSfcOutputLinearFlag = 0;
//tile type read from reg key
{
MediaUserSetting::Value outValue;
ReadUserSettingForDebug(
m_userSettingPtr,
outValue,
__MEDIA_USER_FEATURE_VALUE_DECODE_SFC_RGBFORMAT_OUTPUT_DEBUG,
MediaUserSetting::Group::Sequence);
sfcOutputRgbFormatFlag = outValue.Get<int32_t>();
}
//rgb format output read from reg key
{
MediaUserSetting::Value outValue;
ReadUserSettingForDebug(
m_userSettingPtr,
outValue,
__MEDIA_USER_FEATURE_VALUE_DECODE_SFC_LINEAR_OUTPUT_DEBUG,
MediaUserSetting::Group::Sequence);
bIsSfcOutputLinearFlag = outValue.Get<int32_t>();
}
if (!sfcOutputRgbFormatFlag)
{
return MOS_STATUS_SUCCESS;
}
MOS_FORMAT outputFormat = surface->Format;
const char *filePostfix = "unsupport";
switch (sfcOutputRgbFormatFlag)
{
case 1: //RGBP
outputFormat = Format_RGBP;
filePostfix = "rgbp";
break;
case 2: //BGRP
outputFormat = Format_BGRP;
filePostfix = "bgrp";
break;
case 3: //RGB24 only support Tile Linear
if (bIsSfcOutputLinearFlag)
{
outputFormat = Format_R8G8B8;
filePostfix = "rgb24";
break;
}
default:
CODECHAL_DEBUG_ASSERTMESSAGE("unsupport rgb format");
return MOS_STATUS_SUCCESS;
}
MOS_TILE_TYPE outputTileType = MOS_TILE_Y;
if (bIsSfcOutputLinearFlag == 1)
{
outputTileType = MOS_TILE_LINEAR;
}
MOS_LOCK_PARAMS lockFlags;
GMM_RESOURCE_FLAG gmmFlags;
MOS_ZeroMemory(&gmmFlags, sizeof(gmmFlags));
CODECHAL_DEBUG_CHK_NULL(surface);
gmmFlags = surface->OsResource.pGmmResInfo->GetResFlags();
hasAuxSurf = (gmmFlags.Gpu.MMC || gmmFlags.Info.MediaCompressed) && gmmFlags.Gpu.UnifiedAuxSurface;
if (!m_configMgr->AttrIsEnabled(CodechalDbgAttr::attrDecodeAuxSurface))
{
hasAuxSurf = false;
}
if (strcmp(attrName, CodechalDbgAttr::attrDecodeReferenceSurfaces) == 0)
{
hasRefSurf = true;
}
MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS));
lockFlags.ReadOnly = 1;
lockFlags.TiledAsTiled = 1; // Bypass GMM CPU blit due to some issues in GMM CpuBlt function
if (hasAuxSurf)
{
// Dump MMC surface as raw layout
lockFlags.NoDecompress = 1;
}
lockedAddr = (uint8_t *)m_osInterface->pfnLockResource(m_osInterface, &surface->OsResource, &lockFlags);
if (lockedAddr == nullptr) // Failed to lock. Try to submit copy task and dump another surface
{
uint32_t sizeToBeCopied = 0;
MOS_GFXRES_TYPE ResType;
#if LINUX
// Linux does not have OsResource->ResType
ResType = surface->Type;
#else
ResType = surface->OsResource.ResType;
#endif
CODECHAL_DEBUG_CHK_STATUS(ReAllocateSurface(
&m_temp2DSurfForCopy,
surface,
"Temp2DSurfForSurfDumper",
ResType));
if (!hasRefSurf)
{
uint32_t arraySize = surface->OsResource.pGmmResInfo->GetArraySize();
if (arraySize == 0)
{
return MOS_STATUS_UNKNOWN;
}
uint32_t sizeSrcSurface = (uint32_t)(surface->OsResource.pGmmResInfo->GetSizeMainSurface()) / arraySize;
// Ensure allocated buffer size contains the source surface size
if (m_temp2DSurfForCopy.OsResource.pGmmResInfo->GetSizeMainSurface() >= sizeSrcSurface)
{
sizeToBeCopied = sizeSrcSurface;
}
if (sizeToBeCopied == 0)
{
// Currently, MOS's pfnAllocateResource does not support allocate a surface reference to another surface.
// When the source surface is not created from Media, it is possible that we cannot allocate the same size as source.
// For example, on Gen9, Render target might have GMM set CCS=1 MMC=0, but MOS cannot allocate surface with such combination.
// When Gmm allocation parameter is different, the resulting surface size/padding/pitch will be differnt.
// Once if MOS can support allocate a surface by reference another surface, we can do a bit to bit copy without problem.
CODECHAL_DEBUG_ASSERTMESSAGE("Cannot allocate correct size, failed to copy nonlockable resource");
return MOS_STATUS_NULL_POINTER;
}
CODECHAL_DEBUG_VERBOSEMESSAGE("Temp2DSurfaceForCopy width %d, height %d, pitch %d, TileType %d, bIsCompressed %d, CompressionMode %d",
m_temp2DSurfForCopy.dwWidth,
m_temp2DSurfForCopy.dwHeight,
m_temp2DSurfForCopy.dwPitch,
m_temp2DSurfForCopy.TileType,
m_temp2DSurfForCopy.bIsCompressed,
m_temp2DSurfForCopy.CompressionMode);
uint32_t bpp = surface->OsResource.pGmmResInfo->GetBitsPerPixel();
CODECHAL_DEBUG_CHK_STATUS(m_osInterface->pfnMediaCopyResource2D(m_osInterface, &surface->OsResource, &m_temp2DSurfForCopy.OsResource, surface->dwPitch, sizeSrcSurface / (surface->dwPitch), bpp, false));
}
else
{
CODECHAL_DEBUG_CHK_STATUS(m_osInterface->pfnDoubleBufferCopyResource(m_osInterface, &surface->OsResource, &m_temp2DSurfForCopy.OsResource, false));
}
lockedAddr = (uint8_t *)m_osInterface->pfnLockResource(m_osInterface, &m_temp2DSurfForCopy.OsResource, &lockFlags);
CODECHAL_DEBUG_CHK_NULL(lockedAddr);
surface = &m_temp2DSurfForCopy;
gmmFlags = surface->OsResource.pGmmResInfo->GetResFlags();
}
if (hasAuxSurf)
{
uint32_t sizeMain = (uint32_t)(surface->OsResource.pGmmResInfo->GetSizeMainSurface());
surfBaseAddr = (uint8_t *)MOS_AllocMemory(sizeMain);
CODECHAL_DEBUG_CHK_NULL(surfBaseAddr);
Mos_SwizzleData(lockedAddr, surfBaseAddr, surface->TileType, MOS_TILE_LINEAR, sizeMain / surface->dwPitch, surface->dwPitch, true);
}
else
{
surfBaseAddr = lockedAddr;
}
// Allocate RGB surface internally to get surface info
MOS_SURFACE *tmpRgbSurface = MOS_New(MOS_SURFACE);
CODECHAL_DEBUG_CHK_NULL(tmpRgbSurface);
MOS_ALLOC_GFXRES_PARAMS allocParams;
MOS_ZeroMemory(&allocParams, sizeof(MOS_ALLOC_GFXRES_PARAMS));
allocParams.Type = MOS_GFXRES_2D;
allocParams.TileType = outputTileType;
allocParams.Format = outputFormat;
allocParams.dwWidth = surface->dwWidth;
allocParams.dwHeight = surface->dwHeight;
allocParams.dwArraySize = 1;
allocParams.pBufName = "dump rgb surface";
allocParams.bIsCompressible = false;
allocParams.ResUsageType = MOS_HW_RESOURCE_DEF_MAX;
allocParams.m_tileModeByForce = MOS_TILE_UNSET_GMM;
CODECHAL_DEBUG_CHK_STATUS(m_osInterface->pfnAllocateResource(
m_osInterface,
&allocParams,
&tmpRgbSurface->OsResource));
tmpRgbSurface->Format = Format_Invalid;
CODECHAL_DEBUG_CHK_STATUS(m_osInterface->pfnGetResourceInfo(m_osInterface, &tmpRgbSurface->OsResource, tmpRgbSurface));
uint32_t rgbPitch = tmpRgbSurface->dwPitch;
uint32_t alignedHeight = surface->dwHeight;
uint32_t alignedWidth = surface->dwWidth;
if (outputFormat == Format_RGBP || outputFormat == Format_BGRP && rgbPitch)
{
alignedHeight = tmpRgbSurface->RenderOffset.YUV.U.BaseOffset / rgbPitch;
alignedWidth = rgbPitch;
}
// Always use MOS swizzle instead of GMM Cpu blit
uint32_t sizeMain = (uint32_t)(surface->OsResource.pGmmResInfo->GetSizeMainSurface());
surfBaseAddr = (uint8_t *)MOS_AllocMemory(sizeMain);
CODECHAL_DEBUG_CHK_NULL(surfBaseAddr);
int32_t swizzleHeight = sizeMain / surface->dwPitch;
int32_t swizzlePitch = surface->dwPitch;
uint8_t *data = lockedAddr;
CODECHAL_DEBUG_VERBOSEMESSAGE("RGB Surface info: format %d, tiletype %d, pitch %d,UOffset %d, dwSize %d, sizemain %d",
outputFormat,
tmpRgbSurface->TileType,
tmpRgbSurface->dwPitch,
tmpRgbSurface->RenderOffset.YUV.U.BaseOffset,
tmpRgbSurface->dwSize,
sizeMain);
if (outputTileType == MOS_TILE_Y)
{
swizzlePitch = rgbPitch;
Mos_SwizzleData(lockedAddr, surfBaseAddr, outputTileType, MOS_TILE_LINEAR, sizeMain / swizzlePitch, swizzlePitch, !MEDIA_IS_SKU(m_osInterface->pfnGetSkuTable(m_osInterface), FtrTileY) || gmmFlags.Info.Tile4);
data = surfBaseAddr;
}
data += surface->dwOffset + surface->YPlaneOffset.iYOffset * surface->dwPitch;
uint32_t width = (width_in ? width_in : surface->dwWidth) << 2;
uint32_t height = height_in ? height_in : surface->dwHeight;
uint32_t lumaheight = 0;
uint32_t pitch = surface->dwPitch;
lumaheight = hasAuxSurf ? GFX_ALIGN(height, 32) : height;
const char *funcName = (m_codecFunction == CODECHAL_FUNCTION_DECODE) ? "_DEC" : (m_codecFunction == CODECHAL_FUNCTION_CENC_DECODE ? "_DEC" : "_ENC");
std::string bufName = std::string(surfName) + "_w[" + std::to_string(alignedWidth) + "]_h[" + std::to_string(alignedHeight) + "]_p[" + std::to_string(rgbPitch) + "]";
const char *filePath = CreateFileName(funcName, bufName.c_str(), filePostfix);
std::ofstream ofs(filePath, std::ios_base::out | std::ios_base::binary);
if (ofs.fail())
{
return MOS_STATUS_UNKNOWN;
}
// RGB data has one zero byte in every 64 bytes, need to remove this byte
if (IS_RGB24_FORMAT(outputFormat))
{
for (uint32_t h = 0; h < lumaheight; h++)
{
width = surface->dwWidth * 3;
int dummyBytesPerLine = width / 63;
int resPixel = width - 63 * dummyBytesPerLine;
int resBytesPerLine = rgbPitch;
for (int p = 0; p < dummyBytesPerLine; p++)
{
ofs.write((char *)data, 63);
data += 64;
resBytesPerLine -= 64;
}
if (resPixel > 0)
{
ofs.write((char *)data, resPixel);
data += resPixel;
resBytesPerLine -= resPixel;
}
if (resBytesPerLine)
{
data += resBytesPerLine;
}
}
}
else
{
for (uint32_t h = 0; h < lumaheight; h++)
{
ofs.write((char *)data, hasAuxSurf ? pitch : width);
data += pitch;
}
}
if (surfBaseAddr)
{
MOS_FreeMemory(surfBaseAddr);
}
if (lockedAddr)
{
m_osInterface->pfnUnlockResource(m_osInterface, &surface->OsResource);
}
m_osInterface->pfnFreeResource(m_osInterface, &(tmpRgbSurface->OsResource));
MOS_Delete(tmpRgbSurface);
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalDebugInterface::DumpBltOutput(
PMOS_SURFACE surface,
const char *attrName)
{
if (!DumpIsEnabled(attrName))
{
return MOS_STATUS_SUCCESS;
}
else
{
CODECHAL_DEBUG_NORMALMESSAGE("Don't support BltOutput dump, pls not use BltState directly!");
return MOS_STATUS_SUCCESS;
}
}
MOS_STATUS CodechalDebugInterface::InitializeUserSetting()
{
CODECHAL_DEBUG_FUNCTION_ENTER;
CODECHAL_DEBUG_CHK_STATUS(MediaDebugInterface::InitializeUserSetting());
DeclareUserSettingKeyForDebug(
m_userSettingPtr,
__MEDIA_USER_FEATURE_ENABLE_HW_DEBUG_HOOKS_DEBUG,
MediaUserSetting::Group::Device,
int32_t(0),
false);
DeclareUserSettingKeyForDebug(
m_userSettingPtr,
__MEDIA_USER_FEATURE_VALUE_CODECHAL_FRAME_NUMBER_TO_STOP_DEBUG,
MediaUserSetting::Group::Device,
int32_t(-1),
false);
DeclareUserSettingKeyForDebug(
m_userSettingPtr,
__MEDIA_USER_FEATURE_VALUE_CODECHAL_ENABLE_SW_CRC_DEBUG,
MediaUserSetting::Group::Device,
uint32_t(0),
false);
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalDebugInterface::Initialize(
CodechalHwInterfaceNext *hwInterface,
CODECHAL_FUNCTION codecFunction,
MediaCopyWrapper *mediaCopyWrapper)
{
CODECHAL_DEBUG_FUNCTION_ENTER;
CODECHAL_DEBUG_CHK_NULL(hwInterface);
m_hwInterfaceNext = hwInterface;
m_codecFunction = codecFunction;
m_osInterface = m_hwInterfaceNext->GetOsInterface();
m_cpInterface = m_hwInterfaceNext->GetCpInterface();
CODECHAL_DEBUG_CHK_NULL(m_osInterface);
m_userSettingPtr = m_osInterface->pfnGetUserSettingInstance(m_osInterface);
CODECHAL_DEBUG_CHK_STATUS(InitializeUserSetting());
//dump loctaion is codechaldump
MediaDebugInterface::SetOutputFilePath();
m_configMgr = MOS_New(CodecDebugConfigMgr, this, m_codecFunction, m_outputFilePath);
CODECHAL_DEBUG_CHK_NULL(m_configMgr);
CODECHAL_DEBUG_CHK_STATUS(m_configMgr->ParseConfig(m_osInterface->pOsContext));
MediaDebugInterface::InitDumpLocation();
m_osInterface->pfnGetPlatform(m_osInterface, &m_platform);
#if (_DEBUG || _RELEASE_INTERNAL)
{
MediaUserSetting::Value outValue;
ReadUserSettingForDebug(
m_userSettingPtr,
outValue,
__MEDIA_USER_FEATURE_ENABLE_HW_DEBUG_HOOKS_DEBUG,
MediaUserSetting::Group::Device,
0,
true);
m_enableHwDebugHooks = outValue.Get<bool>();
}
CheckGoldenReferenceExist();
if (m_enableHwDebugHooks && m_goldenReferenceExist)
{
LoadGoldenReference();
}
{
MediaUserSetting::Value outValue;
ReadUserSettingForDebug(
m_userSettingPtr,
outValue,
__MEDIA_USER_FEATURE_VALUE_CODECHAL_FRAME_NUMBER_TO_STOP_DEBUG,
MediaUserSetting::Group::Device,
-1,
true);
m_stopFrameNumber = outValue.Get<int32_t>();
}
{
MediaUserSetting::Value outValue;
ReadUserSettingForDebug(
m_userSettingPtr,
outValue,
__MEDIA_USER_FEATURE_VALUE_CODECHAL_ENABLE_SW_CRC_DEBUG,
MediaUserSetting::Group::Device,
0,
true);
m_swCRC = outValue.Get<bool>();
}
#endif
SetFastDumpConfig(mediaCopyWrapper);
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalDebugInterface::DumpHucDmem(
PMOS_RESOURCE dmemResource,
uint32_t dmemSize,
uint32_t hucPassNum,
CodechalHucRegionDumpType dumpType)
{
CODECHAL_DEBUG_FUNCTION_ENTER;
if (!m_configMgr->AttrIsEnabled(MediaDbgAttr::attrHuCDmem) && !MosUtilities::GetTraceSetting())
{
return MOS_STATUS_SUCCESS;
}
CODECHAL_DEBUG_CHK_NULL(dmemResource);
if (Mos_ResourceIsNull(dmemResource))
{
return MOS_STATUS_NULL_POINTER;
}
std::string funcName = "";
if (m_codecFunction == CODECHAL_FUNCTION_DECODE)
{
funcName = "DEC_";
}
else if (m_codecFunction == CODECHAL_FUNCTION_CENC_DECODE)
{
funcName = "DEC_Cenc_";
}
else
{
funcName = "ENC_";
}
std::string dmemName = MediaDbgBufferType::bufHucDmem;
std::string passName = std::to_string(hucPassNum);
switch (dumpType)
{
case hucRegionDumpInit:
funcName = funcName + dmemName + "_InitPass" + passName;
break;
case hucRegionDumpUpdate:
funcName = funcName + dmemName + "_UpdatePass" + passName;
break;
case hucRegionDumpLAUpdate:
funcName = funcName + dmemName + "_LookaheadUpdatePass" + passName;
break;
case hucRegionDumpRegionLocked:
funcName = funcName + dmemName + "_RegionLocked" + passName;
break;
case hucRegionDumpCmdInitializer:
funcName = funcName + dmemName + "_CmdInitializerPass" + passName;
break;
case hucRegionDumpPakIntegrate:
funcName = funcName + dmemName + "_PakIntPass" + passName;
break;
case hucRegionDumpHpu:
funcName = funcName + dmemName + "_HpuPass" + passName;
break;
case hucRegionDumpHpuSuperFrame:
funcName = funcName + dmemName + "_HpuPass" + passName + "_SuperFramePass";
break;
case hucRegionDumpBackAnnotation:
funcName = funcName + dmemName + "_BackAnnotationPass" + passName;
break;
default:
funcName = funcName + dmemName + "_Pass" + passName;
break;
}
return DumpBuffer(dmemResource, MediaDbgAttr::attrHuCDmem, funcName.c_str(), dmemSize);
}
std::string CodechalDebugInterface::SetOutputPathKey()
{
return __MEDIA_USER_FEATURE_VALUE_CODECHAL_DEBUG_OUTPUT_DIRECTORY;
}
std::string CodechalDebugInterface::InitDefaultOutput()
{
m_outputFilePath.append(MEDIA_DEBUG_CODECHAL_DUMP_OUTPUT_FOLDER);
return SetOutputPathKey();
}
MOS_STATUS CodechalDebugInterface::VDBypassCopyResource(PMOS_RESOURCE src, PMOS_RESOURCE dst)
{
CODECHAL_DEBUG_FUNCTION_ENTER;
CODECHAL_DEBUG_CHK_NULL(m_osInterface);
CODECHAL_DEBUG_CHK_NULL(m_hwInterfaceNext)
CODECHAL_DEBUG_CHK_NULL(src);
CODECHAL_DEBUG_CHK_NULL(dst);
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MOS_GPUCTX_CREATOPTIONS_ENHANCED createOption;
MOS_COMMAND_BUFFER cmdBuffer;
std::shared_ptr<mhw::mi::Itf> miInterface = m_hwInterfaceNext->GetMiInterfaceNext();
PMHW_MI_MMIOREGISTERS pMmioRegisters = miInterface->GetMmioRegisters();
MOS_CONTEXT *pOsContext = m_osInterface->pOsContext;
MHW_ADD_CP_COPY_PARAMS cpCopyParams;
MHW_MI_FLUSH_DW_PARAMS FlushDwParams;
MhwCpInterface *mhwCpInterface = m_hwInterfaceNext->GetCpInterface();
CODECHAL_DEBUG_CHK_NULL(pMmioRegisters);
CODECHAL_DEBUG_CHK_NULL(pOsContext);
CODECHAL_DEBUG_CHK_NULL(mhwCpInterface);
CODECHAL_DEBUG_CHK_STATUS(m_osInterface->pfnGetCommandBuffer(m_osInterface, &cmdBuffer, 0));
CODECHAL_DEBUG_CHK_STATUS(miInterface->AddProtectedProlog(&cmdBuffer));
MOS_ZeroMemory(&cpCopyParams, sizeof(cpCopyParams));
uint32_t dwWidth = (uint32_t)src->pGmmResInfo->GetBaseWidth();
uint32_t dwHeight = (uint32_t)src->pGmmResInfo->GetBaseHeight();
cpCopyParams.size = dwWidth * dwHeight;
cpCopyParams.presSrc = src;
cpCopyParams.presDst = dst;
cpCopyParams.offset = 0;
cpCopyParams.bypass = true;
eStatus = mhwCpInterface->AddCpCopy(m_osInterface, &cmdBuffer, &cpCopyParams);
auto &flushDwParams = miInterface->MHW_GETPAR_F(MI_FLUSH_DW)();
flushDwParams = {};
CODECHAL_DEBUG_CHK_STATUS(miInterface->MHW_ADDCMD_F(MI_FLUSH_DW)(&cmdBuffer));
PMOS_RESOURCE pStoreResource = (PMOS_RESOURCE)MOS_AllocAndZeroMemory(sizeof(MOS_RESOURCE));
CODECHAL_DEBUG_CHK_NULL(pStoreResource);
// Create store resource
{
//Insert MFX_WAIT command.
auto &mfxWaitParams = miInterface->MHW_GETPAR_F(MFX_WAIT)();
mfxWaitParams = {};
mfxWaitParams.iStallVdboxPipeline = true;
CODECHAL_DEBUG_CHK_STATUS(miInterface->MHW_ADDCMD_F(MFX_WAIT)(&cmdBuffer, nullptr));
eStatus = AllocateLinearResource(MOS_GFXRES_BUFFER, sizeof(uint32_t), 1, Format_Buffer, pStoreResource, true);
if (MOS_FAILED(eStatus))
{
MOS_FreeMemAndSetNull(pStoreResource);
}
CODECHAL_DEBUG_CHK_STATUS(eStatus);
eStatus = FillResourceMemory(*pStoreResource, sizeof(uint32_t), QUERY_STATUS_BUFFER_INITIAL_VALUE);
if (MOS_FAILED(eStatus))
{
CODECHAL_DEBUG_ASSERTMESSAGE("Error: Failed FillResourceMemory to pStoreResource.");
m_osInterface->pfnFreeResource(m_osInterface, pStoreResource);
MOS_FreeMemAndSetNull(pStoreResource);
}
CODECHAL_DEBUG_CHK_STATUS(eStatus);
auto &flushDwParams = miInterface->MHW_GETPAR_F(MI_FLUSH_DW)();
flushDwParams = {};
flushDwParams.postSyncOperation = MHW_FLUSH_WRITE_IMMEDIATE_DATA;
flushDwParams.pOsResource = pStoreResource;
flushDwParams.dwResourceOffset = 0;
flushDwParams.dwDataDW1 = STORE_DATA_DWORD_DATA;
eStatus = miInterface->MHW_ADDCMD_F(MI_FLUSH_DW)(&cmdBuffer);
if (MOS_FAILED(eStatus))
{
CODECHAL_DEBUG_ASSERTMESSAGE("Error: Failed MHW_ADDCMD_F(MI_FLUSH_DW).");
m_osInterface->pfnFreeResource(m_osInterface, pStoreResource);
MOS_FreeMemAndSetNull(pStoreResource);
}
}
do
{
auto &batchBufferEndParams = miInterface->MHW_GETPAR_F(MI_BATCH_BUFFER_END)();
batchBufferEndParams = {};
eStatus = miInterface->MHW_ADDCMD_F(MI_BATCH_BUFFER_END)(&cmdBuffer);
if (MOS_FAILED(eStatus))
{
CODECHAL_DEBUG_ASSERTMESSAGE("Error: Failed MHW_ADDCMD_F(MI_BATCH_BUFFER_END).");
break;
}
m_osInterface->pfnReturnCommandBuffer(m_osInterface, &cmdBuffer, 0);
eStatus = m_osInterface->pfnSubmitCommandBuffer(m_osInterface, &cmdBuffer, false);
if (MOS_FAILED(eStatus))
{
CODECHAL_DEBUG_ASSERTMESSAGE("Error: Failed MHW_ADDCMD_F(MI_BATCH_BUFFER_END).");
break;
}
volatile uint32_t dwValueInMemory = 0;
MOS_LOCK_PARAMS sMosLockParams{};
sMosLockParams.ReadOnly = 1;
uint8_t *pStoreResBytes = reinterpret_cast<uint8_t*>(m_osInterface->pfnLockResource(m_osInterface, pStoreResource, &sMosLockParams));
if (pStoreResBytes == nullptr)
{
CODECHAL_DEBUG_ASSERTMESSAGE("Error: Failed locking pStoreResource.");
eStatus = MOS_STATUS_UNINITIALIZED;
break;
}
dwValueInMemory = *(reinterpret_cast<uint32_t *>(pStoreResBytes));
if (dwValueInMemory != STORE_DATA_DWORD_DATA)
{
CODECHAL_DEBUG_ASSERTMESSAGE("Error: Failed to read Store Data output.");
m_osInterface->pfnUnlockResource(m_osInterface, pStoreResource);
eStatus = MOS_STATUS_SUCCESS;
break;
}
m_osInterface->pfnUnlockResource(m_osInterface, pStoreResource);
} while (false);
m_osInterface->pfnFreeResource(m_osInterface, pStoreResource);
MOS_FreeMemAndSetNull(pStoreResource);
return eStatus;
}
MOS_STATUS CodechalDebugInterface::AllocateLinearResource(MOS_GFXRES_TYPE eType, uint32_t dwWidth, uint32_t dwHeight, MOS_FORMAT eFormat, PMOS_RESOURCE pResource, bool bSystemMem, bool bLockable) const
{
MOS_ALLOC_GFXRES_PARAMS sMosAllocParams;
MOS_STATUS eStatus;
CODECHAL_DEBUG_FUNCTION_ENTER;
CODECHAL_DEBUG_CHK_NULL(m_osInterface);
CODECHAL_DEBUG_CHK_NULL(m_osInterface->pfnAllocateResource);
do
{
if (eType != MOS_GFXRES_BUFFER &&
eType != MOS_GFXRES_2D)
{
CODECHAL_DEBUG_ASSERTMESSAGE("Error: Only 'BUFFER' and '2D' types are supported in CP.");
eStatus = MOS_STATUS_INVALID_PARAMETER;
break;
}
if (eType == MOS_GFXRES_BUFFER &&
dwHeight != 1)
{
CODECHAL_DEBUG_ASSERTMESSAGE("Error: Resources of type 'BUFFER' must have height = 1.");
eStatus = MOS_STATUS_INVALID_PARAMETER;
break;
}
if (pResource == nullptr)
{
CODECHAL_DEBUG_ASSERTMESSAGE("Error: Failed to allocate memory for MOS_RESOURCE.");
eStatus = MOS_STATUS_NO_SPACE;
break;
}
MOS_ZeroMemory(pResource, sizeof(*pResource));
MOS_ZeroMemory(&sMosAllocParams, sizeof(sMosAllocParams));
sMosAllocParams.Type = eType;
sMosAllocParams.dwWidth = dwWidth;
sMosAllocParams.dwHeight = dwHeight;
sMosAllocParams.TileType = MOS_TILE_LINEAR;
sMosAllocParams.Format = eFormat;
if (MEDIA_IS_SKU(m_osInterface->pfnGetSkuTable(m_osInterface), FtrLimitedLMemBar))
{
if (bSystemMem)
{
sMosAllocParams.dwMemType = MOS_MEMPOOL_SYSTEMMEMORY;
}
else if (!bLockable)
{
sMosAllocParams.Flags.bNotLockable = 1;
sMosAllocParams.dwMemType = MOS_MEMPOOL_DEVICEMEMORY;
}
else if (bLockable)
{
sMosAllocParams.Flags.bNotLockable = 0;
sMosAllocParams.dwMemType = MOS_MEMPOOL_VIDEOMEMORY;
}
}
if (MEDIA_IS_SKU(m_osInterface->pfnGetSkuTable(m_osInterface), FtrSAMediaCachePolicy))
{
sMosAllocParams.ResUsageType = MOS_HW_RESOURCE_USAGE_CP_INTERNAL_WRITE;
}
eStatus = m_osInterface->pfnAllocateResource(
m_osInterface,
&sMosAllocParams,
pResource);
if (MOS_FAILED(eStatus))
{
CODECHAL_DEBUG_ASSERTMESSAGE("Failed to allocate resource. Error = 0x%x.", eStatus);
eStatus = MOS_STATUS_UNKNOWN;
}
} while (false);
return eStatus;
}
MOS_STATUS CodechalDebugInterface::FillResourceMemory(MOS_RESOURCE &sResource, uint32_t uiSize, uint8_t ucValue)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
void *pSurface = nullptr;
CODECHAL_DEBUG_FUNCTION_ENTER;
if (uiSize == 0)
{
// Nothing to do.
CODECHAL_DEBUG_ASSERTMESSAGE("Received uiSize = 0. This should never happen!");
return MOS_STATUS_INVALID_PARAMETER;
}
do
{
MOS_LOCK_PARAMS sMosLockParams{};
sMosLockParams.WriteOnly = true;
// Lock the surface for writing.
pSurface = m_osInterface->pfnLockResource(m_osInterface, &sResource, &sMosLockParams);
if (pSurface == nullptr)
{
CODECHAL_DEBUG_ASSERTMESSAGE("Error: Failed locking the resource.");
eStatus = MOS_STATUS_UNKNOWN;
break;
}
// Fill the surface with the wanted value.
MOS_FillMemory(pSurface, uiSize, ucValue);
} while (false);
// Unlock the resource if needed.
m_osInterface->pfnUnlockResource(m_osInterface, &sResource);
return eStatus;
}
MOS_STATUS CodechalDebugInterface::DumpHucRegion(
PMOS_RESOURCE region,
uint32_t regionOffset,
uint32_t regionSize,
uint32_t regionNum,
const char * regionName,
bool inputBuffer,
uint32_t hucPassNum,
CodechalHucRegionDumpType dumpType)
{
CODECHAL_DEBUG_FUNCTION_ENTER;
if (!m_configMgr->AttrIsEnabled(MediaDbgAttr::attrHucRegions) && !MosUtilities::GetTraceSetting())
{
return MOS_STATUS_SUCCESS;
}
CODECHAL_DEBUG_ASSERT(regionNum < 16);
CODECHAL_DEBUG_CHK_NULL(region);
if (Mos_ResourceIsNull(region))
{
return MOS_STATUS_NULL_POINTER;
}
std::string funcName = "";
if (m_codecFunction == CODECHAL_FUNCTION_DECODE)
{
funcName = "DEC_";
}
else if (m_codecFunction == CODECHAL_FUNCTION_CENC_DECODE)
{
funcName = "DEC_CENC_";
}
else
{
funcName = "ENC_";
}
std::string bufName = MediaDbgBufferType::bufHucRegion;
std::string inputName = (inputBuffer) ? "Input_" : "Output_";
std::string regionNumName = std::to_string(regionNum);
std::string passName = std::to_string(hucPassNum);
switch (dumpType)
{
case hucRegionDumpInit:
funcName = funcName + inputName + bufName + regionNumName + regionName + "_InitPass" + passName;
break;
case hucRegionDumpUpdate:
funcName = funcName + inputName + bufName + regionNumName + regionName + "_UpdatePass" + passName;
break;
case hucRegionDumpLAUpdate:
funcName = funcName + inputName + bufName + regionNumName + regionName + "_LookaheadUpdatePass" + passName;
break;
case hucRegionDumpRegionLocked:
funcName = funcName + inputName + bufName + regionNumName + regionName + "_RegionLockedPass" + passName;
break;
case hucRegionDumpCmdInitializer:
funcName = funcName + inputName + bufName + regionNumName + regionName + "_CmdInitializerPass" + passName;
break;
case hucRegionDumpPakIntegrate:
funcName = funcName + inputName + bufName + regionNumName + regionName + "_PakIntPass" + passName;
break;
case hucRegionDumpHpu:
funcName = funcName + inputName + bufName + regionNumName + regionName + "_HpuPass" + passName;
break;
case hucRegionDumpBackAnnotation:
funcName = funcName + inputName + bufName + regionNumName + regionName + "_BackAnnotationPass" + passName;
break;
default:
funcName = funcName + inputName + bufName + regionNumName + regionName + "_Pass" + passName;
break;
}
return DumpBuffer(region, MediaDbgAttr::attrHucRegions, funcName.c_str(), regionSize, regionOffset);
}
#define FIELD_TO_OFS(field_name) ofs << print_shift << std::setfill(' ') << std::setw(25) << std::left << std::string(#field_name) + ": " << (int64_t)report->field_name << std::endl;
#define PTR_TO_OFS(ptr_name) ofs << print_shift << std::setfill(' ') << std::setw(25) << std::left << std::string(#ptr_name) + ": " << report->ptr_name << std::endl;
MOS_STATUS CodechalDebugInterface::DumpEncodeStatusReport(const encode::EncodeStatusReportData *report)
{
CODECHAL_DEBUG_FUNCTION_ENTER;
CODECHAL_DEBUG_CHK_NULL(report);
const char *bufferName = "EncodeStatusReport_Parsed";
const char *attrName = MediaDbgAttr::attrStatusReport;
if (!m_configMgr->AttrIsEnabled(attrName))
{
return MOS_STATUS_SUCCESS;
}
const char * filePath = CreateFileName(bufferName, attrName, MediaDbgExtType::txt);
std::ofstream ofs(filePath);
if (ofs.fail())
{
return MOS_STATUS_UNKNOWN;
}
std::string print_shift = "";
sizeof(report->codecStatus);
FIELD_TO_OFS(codecStatus);
FIELD_TO_OFS(statusReportNumber);
FIELD_TO_OFS(currOriginalPic.FrameIdx);
FIELD_TO_OFS(currOriginalPic.PicFlags);
FIELD_TO_OFS(currOriginalPic.PicEntry);
FIELD_TO_OFS(func);
PTR_TO_OFS( currRefList);
ofs << std::endl;
FIELD_TO_OFS(sequential);
FIELD_TO_OFS(bitstreamSize);
FIELD_TO_OFS(qpY);
FIELD_TO_OFS(suggestedQPYDelta);
FIELD_TO_OFS(numberPasses);
FIELD_TO_OFS(averageQP);
FIELD_TO_OFS(hwCounterValue.IV);
FIELD_TO_OFS(hwCounterValue.Count);
PTR_TO_OFS(hwCtr);
FIELD_TO_OFS(queryStatusFlags);
print_shift = " ";
FIELD_TO_OFS(panicMode);
FIELD_TO_OFS(sliceSizeOverflow);
FIELD_TO_OFS(numSlicesNonCompliant);
FIELD_TO_OFS(longTermReference);
FIELD_TO_OFS(frameSkipped);
FIELD_TO_OFS(sceneChangeDetected);
print_shift = "";
ofs << std::endl;
FIELD_TO_OFS(mad);
FIELD_TO_OFS(loopFilterLevel);
FIELD_TO_OFS(longTermIndication);
FIELD_TO_OFS(nextFrameWidthMinus1);
FIELD_TO_OFS(nextFrameHeightMinus1);
FIELD_TO_OFS(numberSlices);
FIELD_TO_OFS(psnrX100[0]);
FIELD_TO_OFS(psnrX100[1]);
FIELD_TO_OFS(psnrX100[2]);
FIELD_TO_OFS(numberTilesInFrame);
FIELD_TO_OFS(usedVdBoxNumber);
FIELD_TO_OFS(sizeOfSliceSizesBuffer);
PTR_TO_OFS( sliceSizes);
FIELD_TO_OFS(sizeOfTileInfoBuffer);
PTR_TO_OFS( hevcTileinfo);
FIELD_TO_OFS(numTileReported);
ofs << std::endl;
FIELD_TO_OFS(streamId);
PTR_TO_OFS( pLookaheadStatus);
ofs.close();
return MOS_STATUS_SUCCESS;
}
#undef FIELD_TO_OFS
#undef PTR_TO_OFS
bool CodechalDebugInterface::DumpIsEnabled(
const char * attr,
CODECHAL_MEDIA_STATE_TYPE mediaState)
{
if (nullptr == m_configMgr)
{
return false;
}
if (mediaState != CODECHAL_NUM_MEDIA_STATES)
{
return static_cast<CodecDebugConfigMgr*>(m_configMgr)->AttrIsEnabled(mediaState, attr);
}
else
{
return m_configMgr->AttrIsEnabled(attr);
}
}
MOS_STATUS CodechalDebugInterface::SetFastDumpConfig(MediaCopyWrapper *mediaCopyWrapper)
{
auto traceSetting = MosUtilities::GetTraceSetting();
if (!mediaCopyWrapper || !(DumpIsEnabled(MediaDbgAttr::attrEnableFastDump) || traceSetting))
{
return MOS_STATUS_SUCCESS;
}
MediaDebugFastDump::Config cfg{};
if (traceSetting)
{
const auto &c = traceSetting->fastDump;
cfg.allowDataLoss = c.allowDataLoss;
cfg.frameIdx = c.frameIdxBasedSampling ? &m_bufferDumpFrameNum : nullptr;
cfg.samplingTime = static_cast<size_t>(c.samplingTime);
cfg.samplingInterval = static_cast<size_t>(c.samplingInterval);
cfg.memUsagePolicy = c.memUsagePolicy;
cfg.maxPrioritizedMem = c.maxPrioritizedMem;
cfg.maxDeprioritizedMem = c.maxDeprioritizedMem;
cfg.weightRenderCopy = c.weightRenderCopy;
cfg.weightVECopy = c.weightVECopy;
cfg.weightBLTCopy = c.weightBLTCopy;
cfg.writeMode = c.writeMode;
cfg.bufferSize = static_cast<size_t>(c.bufferSize);
cfg.informOnError = c.informOnError;
auto suffix = cfg.writeMode == 0 ? ".bin" : cfg.writeMode == 1 ? ".txt"
: "";
class DumpEnabled
{
public:
bool operator()(const char *attrName)
{
decltype(m_filter)::const_iterator it;
return (it = m_filter.find(attrName)) != m_filter.end() &&
MOS_TraceKeyEnabled(it->second);
}
private:
const std::map<std::string, MEDIA_EVENT_FILTER_KEYID> m_filter = {
{MediaDbgAttr::attrDecodeOutputSurface, TR_KEY_DECODE_DSTYUV},
{MediaDbgAttr::attrDecodeReferenceSurfaces, TR_KEY_DECODE_REFYUV},
{MediaDbgAttr::attrDecodeBitstream, TR_KEY_DECODE_BITSTREAM},
{MediaDbgAttr::attrEncodeRawInputSurface, TR_KEY_ENCODE_DATA_INPUT_SURFACE},
{MediaDbgAttr::attrReferenceSurfaces, TR_KEY_ENCODE_DATA_REF_SURFACE},
{MediaDbgAttr::attrReconstructedSurface, TR_KEY_ENCODE_DATA_RECON_SURFACE},
{MediaDbgAttr::attrBitstream, TR_KEY_ENCODE_DATA_BITSTREAM},
{MediaDbgAttr::attrHuCDmem, TR_KEY_ENCODE_DATA_HUC_DMEM},
{MediaDbgAttr::attrHucRegions, TR_KEY_ENCODE_DATA_HUC_REGION},
};
};
auto dumpEnabled = std::make_shared<DumpEnabled>();
m_dumpYUVSurface = [this, dumpEnabled, traceSetting, suffix](
PMOS_SURFACE surface,
const char *attrName,
const char *surfName,
CODECHAL_MEDIA_STATE_TYPE mediaState,
uint32_t,
uint32_t) {
if ((*dumpEnabled)(attrName))
{
MediaDebugFastDump::Dump(
surface->OsResource,
std::string(traceSetting->fastDump.filePath) +
std::to_string(m_bufferDumpFrameNum) +
'-' +
surfName +
"w[0]_h[0]_p[0]" +
suffix);
}
return MOS_STATUS_SUCCESS;
};
m_dumpBuffer = [this, dumpEnabled, traceSetting, suffix](
PMOS_RESOURCE resource,
const char *attrName,
const char *compName,
uint32_t size,
uint32_t offset,
CODECHAL_MEDIA_STATE_TYPE mediaState) {
if ((*dumpEnabled)(attrName))
{
std::string bufferName = "";
if (!strcmp(attrName, "DecodeBitstream") || !strcmp(attrName, "Bitstream"))
{
bufferName = "_Bitstream";
}
MediaDebugFastDump::Dump(
*resource,
std::string(traceSetting->fastDump.filePath) +
std::to_string(m_bufferDumpFrameNum) +
'-' +
compName + bufferName +
suffix,
size,
offset,
MediaDebugSerializer<uint32_t>());
}
return MOS_STATUS_SUCCESS;
};
}
else
{
cfg.allowDataLoss = false;
cfg.informOnError = false;
MediaUserSetting::Value outValue{};
ReadUserSettingForDebug(
m_userSettingPtr,
outValue,
"Enable VECopy For Surface Dump",
MediaUserSetting::Group::Sequence);
if (outValue.Get<bool>())
{
// use VE copy
cfg.weightRenderCopy = 0;
cfg.weightVECopy = 100;
cfg.weightBLTCopy = 0;
}
}
MediaDebugFastDump::CreateInstance(*m_osInterface, *mediaCopyWrapper, &cfg);
return MOS_STATUS_SUCCESS;
}
const char *CodechalDebugInterface::CreateFileName(
const char *funcName,
const char *bufType,
const char *extType)
{
if (nullptr == funcName || nullptr == extType)
{
return nullptr;
}
char frameType = 'X';
// Sets the frameType label
if (m_frameType == I_TYPE)
{
frameType = 'I';
}
else if (m_frameType == P_TYPE)
{
frameType = 'P';
}
else if (m_frameType == B_TYPE)
{
frameType = 'B';
}
else if (m_frameType == MIXED_TYPE)
{
frameType = 'M';
}
const char *fieldOrder;
// Sets the Field Order label
if (CodecHal_PictureIsTopField(m_currPic))
{
fieldOrder = MediaDbgFieldType::topField;
}
else if (CodecHal_PictureIsBottomField(m_currPic))
{
fieldOrder = MediaDbgFieldType::botField;
}
else
{
fieldOrder = MediaDbgFieldType::frame;
}
// Sets the Postfix label
if (m_configMgr->AttrIsEnabled(MediaDbgAttr::attrDumpBufferInBinary) &&
strcmp(extType, MediaDbgExtType::txt) == 0)
{
extType = MediaDbgExtType::dat;
}
if (bufType != nullptr &&
!strncmp(bufType, MediaDbgBufferType::bufSlcParams, sizeof(MediaDbgBufferType::bufSlcParams) - 1) && !strncmp(funcName, "_DDIEnc", sizeof("_DDIEnc") - 1))
{
m_outputFileName = m_outputFilePath +
std::to_string(m_bufferDumpFrameNum) + '-' +
std::to_string(m_streamId) + '_' +
std::to_string(m_sliceId + 1) +
funcName + '_' + bufType + '_' + frameType + fieldOrder + extType;
}
else if (bufType != nullptr &&
!strncmp(bufType, MediaDbgBufferType::bufEncodePar, sizeof(MediaDbgBufferType::bufEncodePar) - 1))
{
if (!strncmp(funcName, "EncodeSequence", sizeof("EncodeSequence") - 1))
{
m_outputFileName = m_outputFilePath +
std::to_string(m_streamId) + '_' +
funcName + extType;
}
else
{
m_outputFileName = m_outputFilePath +
std::to_string(m_bufferDumpFrameNum) + '-' +
std::to_string(m_streamId) + '_' +
funcName + frameType + fieldOrder + extType;
}
}
else
{
if (funcName[0] == '_')
funcName += 1;
if (bufType != nullptr)
{
m_outputFileName = m_outputFilePath +
std::to_string(m_bufferDumpFrameNum) + '-' +
std::to_string(m_streamId) + '_' +
funcName + '_' + bufType + '_' + frameType + fieldOrder + extType;
}
else
{
m_outputFileName = m_outputFilePath +
std::to_string(m_bufferDumpFrameNum) + '-' +
std::to_string(m_streamId) + '_' +
funcName + '_' + frameType + fieldOrder + extType;
}
}
return m_outputFileName.c_str();
}
MOS_STATUS CodechalDebugInterface::DumpStringStream(std::stringstream& ss, const char* bufferName, const char* attrName)
{
MEDIA_DEBUG_FUNCTION_ENTER;
MEDIA_DEBUG_CHK_NULL(bufferName);
MEDIA_DEBUG_CHK_NULL(attrName);
if (!m_configMgr->AttrIsEnabled(attrName))
{
return MOS_STATUS_SUCCESS;
}
const char* filePath = CreateFileName(bufferName, nullptr, MediaDbgExtType::txt);
std::ofstream ofs(filePath);
ofs << ss.str();
ofs.close();
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalDebugInterface::DumpCmdBuffer(
PMOS_COMMAND_BUFFER cmdBuffer,
CODECHAL_MEDIA_STATE_TYPE mediaState,
const char * cmdName)
{
MEDIA_DEBUG_FUNCTION_ENTER;
bool attrEnabled = m_configMgr->AttrIsEnabled(MediaDbgAttr::attrCmdBufferMfx);
if (!attrEnabled && mediaState != CODECHAL_NUM_MEDIA_STATES)
{
attrEnabled = static_cast<CodecDebugConfigMgr*>(m_configMgr)->AttrIsEnabled(mediaState, MediaDbgAttr::attrCmdBuffer);
}
if (!attrEnabled)
{
return MOS_STATUS_SUCCESS;
}
bool binaryDumpEnabled = m_configMgr->AttrIsEnabled(MediaDbgAttr::attrDumpCmdBufInBinary);
std::string funcName = cmdName ? cmdName : static_cast<CodecDebugConfigMgr*>(m_configMgr)->GetMediaStateStr(mediaState);
const char *fileName = CreateFileName(
funcName.c_str(),
MediaDbgBufferType::bufCmd,
binaryDumpEnabled ? MediaDbgExtType::dat : MediaDbgExtType::txt);
if (m_configMgr->AttrIsEnabled(CodechalDbgAttr::attrEnableFastDump) && MediaDebugFastDump::IsGood())
{
MediaDebugFastDump::Dump(
(uint8_t *)cmdBuffer->pCmdBase,
fileName,
(uint32_t)cmdBuffer->iOffset,
0,
MediaDebugSerializer<uint32_t>());
}
else
{
if (binaryDumpEnabled)
{
DumpBufferInBinary((uint8_t *)cmdBuffer->pCmdBase, (uint32_t)cmdBuffer->iOffset);
}
else
{
DumpBufferInHexDwords((uint8_t *)cmdBuffer->pCmdBase, (uint32_t)cmdBuffer->iOffset);
}
}
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalDebugInterface::Dump2ndLvlBatch(
PMHW_BATCH_BUFFER batchBuffer,
CODECHAL_MEDIA_STATE_TYPE mediaState,
const char * batchName)
{
MEDIA_DEBUG_FUNCTION_ENTER;
MEDIA_DEBUG_CHK_NULL(batchBuffer);
bool attrEnabled = m_configMgr->AttrIsEnabled(MediaDbgAttr::attr2ndLvlBatchMfx);
if (!attrEnabled && mediaState != CODECHAL_NUM_MEDIA_STATES)
{
attrEnabled = static_cast<CodecDebugConfigMgr*>(m_configMgr)->AttrIsEnabled(mediaState, MediaDbgAttr::attr2ndLvlBatch);
}
if (!attrEnabled)
{
return MOS_STATUS_SUCCESS;
}
std::string funcName = batchName ? batchName : static_cast<CodecDebugConfigMgr*>(m_configMgr)->GetMediaStateStr(mediaState);
const char *fileName = CreateFileName(
funcName.c_str(),
MediaDbgBufferType::buf2ndLvl,
MediaDbgExtType::txt);
MOS_STATUS status = MOS_STATUS_SUCCESS;
if ((batchBuffer->OsResource.pGmmResInfo != nullptr) &&
(batchBuffer->OsResource.pGmmResInfo->GetResFlags().Info.NotLockable))
{
uint8_t *data = nullptr;
PMOS_RESOURCE pReadbackBuffer = (PMOS_RESOURCE)MOS_AllocAndZeroMemory(sizeof(MOS_RESOURCE));
CODECHAL_DEBUG_CHK_NULL(pReadbackBuffer);
status = AllocateLinearResource(MOS_GFXRES_BUFFER, (uint32_t)batchBuffer->OsResource.pGmmResInfo->GetBaseWidth(), (uint32_t)batchBuffer->OsResource.pGmmResInfo->GetBaseHeight(), Format_Any, pReadbackBuffer);
if (MOS_FAILED(status))
{
MOS_FreeMemAndSetNull(pReadbackBuffer);
}
CODECHAL_DEBUG_CHK_STATUS(status);
status = VDBypassCopyResource(&batchBuffer->OsResource, pReadbackBuffer);
if (MOS_FAILED(status))
{
m_osInterface->pfnFreeResource(m_osInterface, pReadbackBuffer);
MOS_FreeMemAndSetNull(pReadbackBuffer);
}
CODECHAL_DEBUG_CHK_STATUS(status);
MOS_LOCK_PARAMS lockFlags;
MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS));
lockFlags.ReadOnly = 1;
data = (uint8_t *)m_osInterface->pfnLockResource(m_osInterface, pReadbackBuffer, &lockFlags);
if (data == nullptr)
{
m_osInterface->pfnFreeResource(m_osInterface, pReadbackBuffer);
MOS_FreeMemAndSetNull(pReadbackBuffer);
}
CODECHAL_DEBUG_CHK_NULL(data);
if (DumpIsEnabled(MediaDbgAttr::attrEnableFastDump) && MediaDebugFastDump::IsGood())
{
MediaDebugFastDump::Dump(
data + batchBuffer->dwOffset,
fileName,
(uint32_t)batchBuffer->iLastCurrent,
0,
MediaDebugSerializer<uint32_t>());
}
else
{
DumpBufferInHexDwords(data + batchBuffer->dwOffset,
(uint32_t)batchBuffer->iLastCurrent);
}
m_osInterface->pfnUnlockResource(m_osInterface, pReadbackBuffer);
m_osInterface->pfnFreeResource(m_osInterface, pReadbackBuffer);
MOS_FreeMemAndSetNull(pReadbackBuffer);
CODECHAL_DEBUG_CHK_STATUS(status);
}
else
{
bool batchLockedForDebug = !batchBuffer->bLocked;
if (batchLockedForDebug)
{
(Mhw_LockBb(m_osInterface, batchBuffer));
}
batchBuffer->pData += batchBuffer->dwOffset;
if (DumpIsEnabled(MediaDbgAttr::attrEnableFastDump) && MediaDebugFastDump::IsGood())
{
MediaDebugFastDump::Dump(
batchBuffer->pData,
fileName,
(uint32_t)batchBuffer->iLastCurrent,
0,
MediaDebugSerializer<uint32_t>());
}
else
{
DumpBufferInHexDwords(batchBuffer->pData,
(uint32_t)batchBuffer->iLastCurrent);
}
if (batchLockedForDebug)
{
(Mhw_UnlockBb(m_osInterface, batchBuffer, false));
}
}
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalDebugInterface::DumpCurbe(
CODECHAL_MEDIA_STATE_TYPE mediaState,
PMHW_KERNEL_STATE kernelState)
{
MEDIA_DEBUG_FUNCTION_ENTER;
if (mediaState >= CODECHAL_NUM_MEDIA_STATES ||
!static_cast<CodecDebugConfigMgr*>(m_configMgr)->AttrIsEnabled(mediaState, MediaDbgAttr::attrCurbe))
{
return MOS_STATUS_SUCCESS;
}
std::string funcName = static_cast<CodecDebugConfigMgr*>(m_configMgr)->GetMediaStateStr(mediaState);
bool binaryDump = m_configMgr->AttrIsEnabled(MediaDbgAttr::attrDumpBufferInBinary);
const char *fileName = CreateFileName(
funcName.c_str(),
MediaDbgBufferType::bufCurbe,
MediaDbgExtType::txt);
return kernelState->m_dshRegion.Dump(
fileName,
kernelState->dwCurbeOffset,
kernelState->KernelParams.iCurbeLength,
binaryDump);
}
MOS_STATUS CodechalDebugInterface::DumpMDFCurbe(
CODECHAL_MEDIA_STATE_TYPE mediaState,
uint8_t * curbeBuffer,
uint32_t curbeSize)
{
MEDIA_DEBUG_FUNCTION_ENTER;
uint8_t * curbeAlignedData = nullptr;
uint32_t curbeAlignedSize = 0;
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
if (mediaState >= CODECHAL_NUM_MEDIA_STATES ||
!static_cast<CodecDebugConfigMgr*>(m_configMgr)->AttrIsEnabled(mediaState, MediaDbgAttr::attrCurbe))
{
return eStatus;
}
std::string funcName = static_cast<CodecDebugConfigMgr*>(m_configMgr)->GetMediaStateStr(mediaState);
bool binaryDump = m_configMgr->AttrIsEnabled(MediaDbgAttr::attrDumpBufferInBinary);
const char *extType = binaryDump ? MediaDbgExtType::dat : MediaDbgExtType::txt;
const char *fileName = CreateFileName(
funcName.c_str(),
MediaDbgBufferType::bufCurbe,
extType);
curbeAlignedSize = MOS_ALIGN_CEIL(curbeSize, 64);
curbeAlignedData = (uint8_t *)malloc(curbeAlignedSize * sizeof(uint8_t));
if (curbeAlignedData == nullptr)
{
eStatus = MOS_STATUS_NULL_POINTER;
return eStatus;
}
MOS_ZeroMemory(curbeAlignedData, curbeAlignedSize);
MOS_SecureMemcpy(curbeAlignedData, curbeSize, curbeBuffer, curbeSize);
if (binaryDump)
{
eStatus = DumpBufferInBinary(curbeAlignedData, curbeAlignedSize);
}
else
{
eStatus = DumpBufferInHexDwords(curbeAlignedData, curbeAlignedSize);
}
free(curbeAlignedData);
return eStatus;
}
MOS_STATUS CodechalDebugInterface::DumpKernelRegion(
CODECHAL_MEDIA_STATE_TYPE mediaState,
MHW_STATE_HEAP_TYPE stateHeap,
PMHW_KERNEL_STATE kernelState)
{
MEDIA_DEBUG_FUNCTION_ENTER;
uint8_t *sshData = nullptr;
uint32_t sshSize = 0;
MemoryBlock *regionBlock = nullptr;
bool attrEnabled = false;
const char * bufferType;
if (stateHeap == MHW_ISH_TYPE)
{
regionBlock = &kernelState->m_ishRegion;
attrEnabled = static_cast<CodecDebugConfigMgr*>(m_configMgr)->AttrIsEnabled(mediaState, MediaDbgAttr::attrIsh);
bufferType = MediaDbgBufferType::bufISH;
}
else if (stateHeap == MHW_DSH_TYPE)
{
regionBlock = &kernelState->m_dshRegion;
attrEnabled = static_cast<CodecDebugConfigMgr*>(m_configMgr)->AttrIsEnabled(mediaState, MediaDbgAttr::attrDsh);
bufferType = MediaDbgBufferType::bufDSH;
}
else
{
attrEnabled = static_cast<CodecDebugConfigMgr*>(m_configMgr)->AttrIsEnabled(mediaState, MediaDbgAttr::attrSsh);
bufferType = MediaDbgBufferType::bufSSH;
MEDIA_DEBUG_CHK_NULL(m_osInterface);
MEDIA_DEBUG_CHK_STATUS(m_osInterface->pfnGetIndirectStatePointer(
m_osInterface,
&sshData));
sshData += kernelState->dwSshOffset;
sshSize = kernelState->dwSshSize;
}
if (!attrEnabled)
{
return MOS_STATUS_SUCCESS;
}
std::string funcName = static_cast<CodecDebugConfigMgr*>(m_configMgr)->GetMediaStateStr(mediaState);
const char *fileName = CreateFileName(
funcName.c_str(),
bufferType,
MediaDbgExtType::txt);
bool binaryDump = m_configMgr->AttrIsEnabled(MediaDbgAttr::attrDumpBufferInBinary);
if (regionBlock)
{
return regionBlock->Dump(fileName, 0, 0, binaryDump);
}
else
{
return DumpBufferInHexDwords(sshData, sshSize);
}
}
MOS_STATUS CodechalDebugInterface::DumpYUVSurfaceToBuffer(PMOS_SURFACE surface,
uint8_t * buffer,
uint32_t & size)
{
MOS_STATUS eStatus = MOS_STATUS_SUCCESS;
MOS_LOCK_PARAMS lockFlags;
MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS));
lockFlags.ReadOnly = 1;
lockFlags.TiledAsTiled = 1; // Bypass GMM CPU blit due to some issues in GMM CpuBlt function
uint8_t *lockedAddr = (uint8_t *)m_osInterface->pfnLockResource(m_osInterface, &surface->OsResource, &lockFlags);
if (lockedAddr == nullptr) // Failed to lock. Try to submit copy task and dump another surface
{
uint32_t sizeToBeCopied = 0;
MOS_GFXRES_TYPE ResType;
#if LINUX
// Linux does not have OsResource->ResType
ResType = surface->Type;
#else
ResType = surface->OsResource.ResType;
#endif
GMM_RESOURCE_FLAG gmmFlags = surface->OsResource.pGmmResInfo->GetResFlags();
bool allocated = false;
MEDIA_DEBUG_CHK_STATUS(ReAllocateSurface(
&m_temp2DSurfForCopy,
surface,
"Temp2DSurfForSurfDumper",
ResType));
// Ensure allocated buffer size contains the source surface size
if (m_temp2DSurfForCopy.OsResource.pGmmResInfo->GetSizeMainSurface() >= surface->OsResource.pGmmResInfo->GetSizeMainSurface())
{
sizeToBeCopied = (uint32_t)surface->OsResource.pGmmResInfo->GetSizeMainSurface();
}
if (sizeToBeCopied == 0)
{
// Currently, MOS's pfnAllocateResource does not support allocate a surface reference to another surface.
// When the source surface is not created from Media, it is possible that we cannot allocate the same size as source.
// For example, on Gen9, Render target might have GMM set CCS=1 MMC=0, but MOS cannot allocate surface with such combination.
// When Gmm allocation parameter is different, the resulting surface size/padding/pitch will be differnt.
// Once if MOS can support allocate a surface by reference another surface, we can do a bit to bit copy without problem.
MEDIA_DEBUG_ASSERTMESSAGE("Cannot allocate correct size, failed to copy nonlockable resource");
return MOS_STATUS_NULL_POINTER;
}
MEDIA_DEBUG_VERBOSEMESSAGE("Temp2DSurfaceForCopy width %d, height %d, pitch %d, TileType %d, bIsCompressed %d, CompressionMode %d",
m_temp2DSurfForCopy.dwWidth,
m_temp2DSurfForCopy.dwHeight,
m_temp2DSurfForCopy.dwPitch,
m_temp2DSurfForCopy.TileType,
m_temp2DSurfForCopy.bIsCompressed,
m_temp2DSurfForCopy.CompressionMode);
if (CopySurfaceData_Vdbox(sizeToBeCopied, &surface->OsResource, &m_temp2DSurfForCopy.OsResource) != MOS_STATUS_SUCCESS)
{
MEDIA_DEBUG_ASSERTMESSAGE("CopyDataSurface_Vdbox failed");
m_osInterface->pfnFreeResource(m_osInterface, &m_temp2DSurfForCopy.OsResource);
return MOS_STATUS_NULL_POINTER;
}
lockedAddr = (uint8_t *)m_osInterface->pfnLockResource(m_osInterface, &m_temp2DSurfForCopy.OsResource, &lockFlags);
MEDIA_DEBUG_CHK_NULL(lockedAddr);
}
uint32_t sizeMain = (uint32_t)(surface->OsResource.pGmmResInfo->GetSizeMainSurface());
uint8_t *surfBaseAddr = (uint8_t *)MOS_AllocMemory(sizeMain);
MEDIA_DEBUG_CHK_NULL(surfBaseAddr);
Mos_SwizzleData(lockedAddr, surfBaseAddr, surface->TileType, MOS_TILE_LINEAR, sizeMain / surface->dwPitch, surface->dwPitch, 0);
uint8_t *data = surfBaseAddr;
data += surface->dwOffset + surface->YPlaneOffset.iYOffset * surface->dwPitch;
uint32_t width = surface->dwWidth;
uint32_t height = surface->dwHeight;
switch (surface->Format)
{
case Format_YUY2:
case Format_Y216V:
case Format_P010:
case Format_P016:
width = width << 1;
break;
case Format_Y216:
case Format_Y210: //422 10bit -- Y0[15:0]:U[15:0]:Y1[15:0]:V[15:0] = 32bits per pixel = 4Bytes per pixel
case Format_Y410: //444 10bit -- A[31:30]:V[29:20]:Y[19:10]:U[9:0] = 32bits per pixel = 4Bytes per pixel
case Format_R10G10B10A2:
case Format_AYUV: //444 8bit -- A[31:24]:Y[23:16]:U[15:8]:V[7:0] = 32bits per pixel = 4Bytes per pixel
case Format_A8R8G8B8:
width = width << 2;
break;
default:
break;
}
uint32_t pitch = surface->dwPitch;
if (surface->Format == Format_UYVY)
pitch = width;
if (CodecHal_PictureIsBottomField(m_currPic))
{
data += pitch;
}
if (CodecHal_PictureIsField(m_currPic))
{
pitch *= 2;
height /= 2;
}
// write luma data to file
for (uint32_t h = 0; h < height; h++)
{
MOS_SecureMemcpy(buffer, width, data, width);
buffer += width;
size += width;
data += pitch;
}
if (surface->Format != Format_A8B8G8R8)
{
switch (surface->Format)
{
case Format_NV12:
case Format_P010:
case Format_P016:
height >>= 1;
break;
case Format_Y416:
case Format_AUYV:
case Format_R10G10B10A2:
height *= 2;
break;
case Format_YUY2:
case Format_YUYV:
case Format_YUY2V:
case Format_Y216V:
case Format_YVYU:
case Format_UYVY:
case Format_VYUY:
case Format_Y216: //422 16bit
case Format_Y210: //422 10bit
case Format_P208: //422 8bit
break;
case Format_422V:
case Format_IMC3:
height = height / 2;
break;
case Format_AYUV:
default:
height = 0;
break;
}
uint8_t *vPlaneData = surfBaseAddr;
#ifdef LINUX
data = surfBaseAddr + surface->UPlaneOffset.iSurfaceOffset;
if (surface->Format == Format_422V || surface->Format == Format_IMC3)
{
vPlaneData = surfBaseAddr + surface->VPlaneOffset.iSurfaceOffset;
}
#else
data = surfBaseAddr + surface->UPlaneOffset.iLockSurfaceOffset;
if (surface->Format == Format_422V || surface->Format == Format_IMC3)
{
vPlaneData = surfBaseAddr + surface->VPlaneOffset.iLockSurfaceOffset;
}
#endif
// write chroma data to file
for (uint32_t h = 0; h < height; h++)
{
MOS_SecureMemcpy(buffer, width, data, width);
buffer += width;
size += width;
data += pitch;
}
// write v planar data to file
if (surface->Format == Format_422V || surface->Format == Format_IMC3)
{
for (uint32_t h = 0; h < height; h++)
{
MOS_SecureMemcpy(buffer, width, vPlaneData, width);
buffer += width;
size += width;
vPlaneData += pitch;
}
}
}
m_osInterface->pfnUnlockResource(m_osInterface, &surface->OsResource);
MOS_FreeMemory(surfBaseAddr);
return MOS_STATUS_SUCCESS;
}
MOS_STATUS CodechalDebugInterface::DumpYUVSurface(
PMOS_SURFACE surface,
const char * attrName,
const char * surfName,
CODECHAL_MEDIA_STATE_TYPE mediaState,
uint32_t width_in,
uint32_t height_in)
{
return m_dumpYUVSurface(
surface,
attrName,
surfName,
mediaState,
width_in,
height_in);
}
MOS_STATUS CodechalDebugInterface::DumpBuffer(
PMOS_RESOURCE resource,
const char * attrName,
const char * bufferName,
uint32_t size,
uint32_t offset,
CODECHAL_MEDIA_STATE_TYPE mediaState)
{
return m_dumpBuffer(
resource,
attrName,
bufferName,
size,
offset,
mediaState);
}
MOS_STATUS CodechalDebugInterface::DumpSurface(
PMOS_SURFACE surface,
const char * attrName,
const char * surfaceName,
CODECHAL_MEDIA_STATE_TYPE mediaState)
{
MEDIA_DEBUG_FUNCTION_ENTER;
MEDIA_DEBUG_CHK_NULL(surface);
MEDIA_DEBUG_CHK_NULL(attrName);
MEDIA_DEBUG_CHK_NULL(surfaceName);
bool attrEnabled = false;
if (mediaState == CODECHAL_NUM_MEDIA_STATES)
{
attrEnabled = m_configMgr->AttrIsEnabled(attrName);
}
else
{
attrEnabled = static_cast<CodecDebugConfigMgr*>(m_configMgr)->AttrIsEnabled(mediaState, attrName);
}
if (!attrEnabled)
{
return MOS_STATUS_SUCCESS;
}
bool binaryDump = m_configMgr->AttrIsEnabled(MediaDbgAttr::attrDumpBufferInBinary);
const char *extType = binaryDump ? MediaDbgExtType::dat : MediaDbgExtType::txt;
MOS_LOCK_PARAMS lockFlags;
MOS_ZeroMemory(&lockFlags, sizeof(MOS_LOCK_PARAMS));
lockFlags.ReadOnly = 1;
uint8_t *data = (uint8_t *)m_osInterface->pfnLockResource(m_osInterface, &surface->OsResource, &lockFlags);
MEDIA_DEBUG_CHK_NULL(data);
std::string bufName = std::string(surfaceName) + "_w[" + std::to_string(surface->dwWidth) + "]_h[" + std::to_string(surface->dwHeight) + "]_p[" + std::to_string(surface->dwPitch) + "]";
const char *fileName;
if (mediaState == CODECHAL_NUM_MEDIA_STATES)
{
fileName = CreateFileName(bufName.c_str(), nullptr, extType);
}
else
{
std::string kernelName = static_cast<CodecDebugConfigMgr*>(m_configMgr)->GetMediaStateStr(mediaState);
fileName = CreateFileName(kernelName.c_str(), bufName.c_str(), extType);
}
MOS_STATUS status;
if (binaryDump)
{
status = Dump2DBufferInBinary(data, surface->dwWidth, surface->dwHeight, surface->dwPitch);
}
else
{
status = DumpBufferInHexDwords(data, surface->dwHeight * surface->dwPitch);
}
if (data)
{
m_osInterface->pfnUnlockResource(m_osInterface, &surface->OsResource);
}
return status;
}
MOS_STATUS CodechalDebugInterface::DumpData(
void * data,
uint32_t size,
const char *attrName,
const char *bufferName)
{
MEDIA_DEBUG_FUNCTION_ENTER;
MEDIA_DEBUG_CHK_NULL(data);
MEDIA_DEBUG_CHK_NULL(attrName);
MEDIA_DEBUG_CHK_NULL(bufferName);
if (!m_configMgr->AttrIsEnabled(attrName))
{
return MOS_STATUS_SUCCESS;
}
bool binaryDump = m_configMgr->AttrIsEnabled(MediaDbgAttr::attrDumpBufferInBinary);
const char *fileName = CreateFileName(bufferName, nullptr, binaryDump ? MediaDbgExtType::dat : MediaDbgExtType::txt);
if (binaryDump)
{
DumpBufferInBinary((uint8_t *)data, size);
}
else
{
DumpBufferInHexDwords((uint8_t *)data, size);
}
return MOS_STATUS_SUCCESS;
}
#define FIELD_TO_OFS(name, shift) ofs << shift #name << ": " << (int64_t)ptr->name << std::endl;
#define EMPTY_TO_OFS()
#define UNION_STRUCT_START_TO_OFS() ofs << "union" << std::endl \
<< "{" << std::endl \
<< " struct" << std::endl \
<< " {" << std::endl;
#define UNION_STRUCT_FIELD_TO_OFS(name) ofs << " "#name << ": " << ptr->name << std::endl;
#define UNION_END_TO_OFS(name) ofs << " }" << std::endl \
<< " "#name << ": " << ptr->name << std::endl \
<< "}" << std::endl;
#define OFFSET_FIELD_TO_OFS(class_name, f_name, shift) << shift " "#f_name": " << ptr->class_name.f_name << std::endl
#define PLANE_OFFSET_TO_OFS(name) ofs << "MOS_PLANE_OFFSET "#name << std::endl \
OFFSET_FIELD_TO_OFS(name, iSurfaceOffset,) \
OFFSET_FIELD_TO_OFS(name, iXOffset,) \
OFFSET_FIELD_TO_OFS(name, iYOffset,) \
OFFSET_FIELD_TO_OFS(name, iLockSurfaceOffset,);
#define RESOURCE_OFFSET_TO_OFS(name, shift) ofs << shift "MOS_RESOURCE_OFFSETS "#name << std::endl \
OFFSET_FIELD_TO_OFS(name, BaseOffset, shift) \
OFFSET_FIELD_TO_OFS(name, XOffset, shift) \
OFFSET_FIELD_TO_OFS(name, YOffset, shift);
#define FIELD_TO_OFS_8SHIFT(name) FIELD_TO_OFS(name, " ")
MOS_STATUS CodechalDebugInterface::DumpSurfaceInfo(
PMOS_SURFACE surface,
const char* surfaceName)
{
MEDIA_DEBUG_FUNCTION_ENTER;
MEDIA_DEBUG_CHK_NULL(surface);
MEDIA_DEBUG_CHK_NULL(surfaceName);
if (!m_configMgr->AttrIsEnabled(MediaDbgAttr::attrSurfaceInfo))
{
return MOS_STATUS_SUCCESS;
}
const char* funcName = (m_mediafunction == MEDIA_FUNCTION_VP) ? "_VP" : ((m_mediafunction == MEDIA_FUNCTION_ENCODE) ? "_ENC" : "_DEC");
const char* filePath = CreateFileName(funcName, surfaceName, MediaDbgExtType::txt);
std::ofstream ofs(filePath);
PMOS_SURFACE ptr = surface;
if (ofs.fail())
{
return MOS_STATUS_UNKNOWN;
}
ofs << "Surface name: " << surfaceName << std::endl;
EMPTY_TO_OFS();
ofs << "MOS_SURFACE:" << std::endl;
FIELD_TO_OFS(dwArraySlice, );
FIELD_TO_OFS(dwMipSlice, );
FIELD_TO_OFS(S3dChannel, );
EMPTY_TO_OFS();
FIELD_TO_OFS(Type, );
FIELD_TO_OFS(bOverlay, );
FIELD_TO_OFS(bFlipChain, );
#if !defined(LINUX)
EMPTY_TO_OFS();
UNION_STRUCT_START_TO_OFS();
UNION_STRUCT_FIELD_TO_OFS(dwFirstArraySlice);
UNION_STRUCT_FIELD_TO_OFS(dwFirstMipSlice);
UNION_END_TO_OFS(dwSubResourceIndex);
#endif
EMPTY_TO_OFS();
FIELD_TO_OFS(dwWidth, );
FIELD_TO_OFS(dwHeight, );
FIELD_TO_OFS(dwSize, );
FIELD_TO_OFS(dwDepth, );
FIELD_TO_OFS(dwArraySize, );
FIELD_TO_OFS(dwLockPitch, );
FIELD_TO_OFS(dwPitch, );
FIELD_TO_OFS(dwSlicePitch, );
FIELD_TO_OFS(dwQPitch, );
FIELD_TO_OFS(TileType, );
FIELD_TO_OFS(TileModeGMM, );
FIELD_TO_OFS(bGMMTileEnabled, );
FIELD_TO_OFS(Format, );
FIELD_TO_OFS(bArraySpacing, );
FIELD_TO_OFS(bCompressible, );
EMPTY_TO_OFS();
FIELD_TO_OFS(dwOffset, );
PLANE_OFFSET_TO_OFS(YPlaneOffset);
PLANE_OFFSET_TO_OFS(UPlaneOffset);
PLANE_OFFSET_TO_OFS(VPlaneOffset);
EMPTY_TO_OFS();
UNION_STRUCT_START_TO_OFS();
RESOURCE_OFFSET_TO_OFS(RenderOffset.YUV.Y, " ");
RESOURCE_OFFSET_TO_OFS(RenderOffset.YUV.U, " ");
RESOURCE_OFFSET_TO_OFS(RenderOffset.YUV.V, " ");
ofs << " } YUV;" << std::endl;
RESOURCE_OFFSET_TO_OFS(RenderOffset.RGB, );
ofs << "}" << std::endl;
EMPTY_TO_OFS();
UNION_STRUCT_START_TO_OFS();
UNION_STRUCT_FIELD_TO_OFS(LockOffset.YUV.Y);
UNION_STRUCT_FIELD_TO_OFS(LockOffset.YUV.U);
UNION_STRUCT_FIELD_TO_OFS(LockOffset.YUV.V);
UNION_END_TO_OFS(LockOffset.RGB);
EMPTY_TO_OFS();
FIELD_TO_OFS(bIsCompressed, );
FIELD_TO_OFS(CompressionMode, );
FIELD_TO_OFS(CompressionFormat, );
FIELD_TO_OFS(YoffsetForUplane, );
FIELD_TO_OFS(YoffsetForVplane, );
EMPTY_TO_OFS();
EMPTY_TO_OFS();
MOS_STATUS sts = DumpMosSpecificResourceInfoToOfs(&surface->OsResource, ofs);
ofs.close();
return sts;
}
#endif // USE_CODECHAL_DEBUG_TOOL