1 /* 2 * Copyright (c) 2022, Intel Corporation 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice shall be included 12 * in all copies or substantial portions of the Software. 13 * 14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 18 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 19 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 20 * OTHER DEALINGS IN THE SOFTWARE. 21 */ 22 //! 23 //! \file codec_def_encode_hevc_trace.h 24 //! 25 26 #pragma once 27 #include <vector> 28 #include "codec_def_encode_hevc.h" 29 #include "mos_utilities.h" 30 31 #define NUM_ELEM_ARRAY(member) (sizeof(obj.member) / sizeof(obj.member[0])) 32 #define PUSH(member) data.push_back(obj.member) 33 #define PUSH64(member) \ 34 { \ 35 auto p = reinterpret_cast<const uint32_t *>(&obj.member); \ 36 data.push_back(p[0]); \ 37 data.push_back(p[1]); \ 38 } 39 #define PUSH_ARRAY(member) \ 40 for (size_t i0 = 0; i0 < NUM_ELEM_ARRAY(member); i0++) \ 41 { \ 42 PUSH(member[i0]); \ 43 } 44 #define PUSH_ARRAY2(member) \ 45 for (size_t i1 = 0; i1 < NUM_ELEM_ARRAY(member); i1++) \ 46 { \ 47 PUSH_ARRAY(member[i1]); \ 48 } 49 #define PUSH_ARRAY3(member) \ 50 for (size_t i2 = 0; i2 < NUM_ELEM_ARRAY(member); i2++) \ 51 { \ 52 PUSH_ARRAY2(member[i2]); \ 53 } 54 #define PUSH_SEQ(member, num) \ 55 for (size_t i = 0; i < num; i++) \ 56 { \ 57 PUSH(member[i]); \ 58 } 59 60 class CodecDefEncodeHevcTrace 61 { 62 public: TraceDDI(const CODEC_HEVC_ENCODE_SEQUENCE_PARAMS & obj)63 static void TraceDDI(const CODEC_HEVC_ENCODE_SEQUENCE_PARAMS &obj) 64 { 65 if (!TraceDDIEn()) 66 { 67 return; 68 } 69 70 std::vector<uint32_t> data; 71 data.reserve(sizeof(obj)); 72 73 PUSH(wFrameWidthInMinCbMinus1); 74 PUSH(wFrameHeightInMinCbMinus1); 75 PUSH(general_profile_idc); 76 PUSH(Level); 77 PUSH(general_tier_flag); 78 PUSH(GopPicSize); 79 PUSH(GopRefDist); 80 PUSH(GopOptFlag); 81 PUSH(TargetUsage); 82 PUSH(RateControlMethod); 83 PUSH(TargetBitRate); 84 PUSH(MaxBitRate); 85 PUSH(MinBitRate); 86 PUSH(FrameRate.Numerator); 87 PUSH(FrameRate.Denominator); 88 PUSH(InitVBVBufferFullnessInBit); 89 PUSH(VBVBufferSizeInBit); 90 PUSH(bResetBRC); 91 PUSH(GlobalSearch); 92 PUSH(LocalSearch); 93 PUSH(EarlySkip); 94 PUSH(MBBRC); 95 PUSH(ParallelBRC); 96 PUSH(SliceSizeControl); 97 PUSH(SourceFormat); 98 PUSH(SourceBitDepth); 99 PUSH(QpAdjustment); 100 PUSH(ROIValueInDeltaQP); 101 PUSH(BlockQPforNonRectROI); 102 PUSH(EnableTileBasedEncode); 103 PUSH(bAutoMaxPBFrameSizeForSceneChange); 104 PUSH(EnableStreamingBufferLLC); 105 PUSH(EnableStreamingBufferDDR); 106 PUSH(LowDelayMode); 107 PUSH(DisableHRDConformance); 108 PUSH(HierarchicalFlag); 109 PUSH(TCBRCEnable); 110 PUSH(bLookAheadPhase); 111 PUSH(UserMaxIFrameSize); 112 PUSH(UserMaxPBFrameSize); 113 PUSH(ICQQualityFactor); 114 PUSH(StreamBufferSessionID); 115 PUSH(maxAdaptiveMiniGopSize); 116 PUSH(GopFlags.fields.ClosedGop); 117 PUSH(GopFlags.fields.StrictGop); 118 PUSH(GopFlags.fields.AdaptiveGop); 119 PUSH_ARRAY(NumOfBInGop); 120 PUSH(scaling_list_enable_flag); 121 PUSH(sps_temporal_mvp_enable_flag); 122 PUSH(strong_intra_smoothing_enable_flag); 123 PUSH(amp_enabled_flag); 124 PUSH(SAO_enabled_flag); 125 PUSH(pcm_enabled_flag); 126 PUSH(pcm_loop_filter_disable_flag); 127 PUSH(chroma_format_idc); 128 PUSH(separate_colour_plane_flag); 129 PUSH(palette_mode_enabled_flag); 130 PUSH(RGBEncodingEnable); 131 PUSH(PrimaryChannelForRGBEncoding); 132 PUSH(SecondaryChannelForRGBEncoding); 133 PUSH(log2_max_coding_block_size_minus3); 134 PUSH(log2_min_coding_block_size_minus3); 135 PUSH(log2_max_transform_block_size_minus2); 136 PUSH(log2_min_transform_block_size_minus2); 137 PUSH(max_transform_hierarchy_depth_intra); 138 PUSH(max_transform_hierarchy_depth_inter); 139 PUSH(log2_min_PCM_cb_size_minus3); 140 PUSH(log2_max_PCM_cb_size_minus3); 141 PUSH(bit_depth_luma_minus8); 142 PUSH(bit_depth_chroma_minus8); 143 PUSH(pcm_sample_bit_depth_luma_minus1); 144 PUSH(pcm_sample_bit_depth_chroma_minus1); 145 PUSH(InputColorSpace); // enum ENCODE_INPUT_COLORSPACE 146 PUSH(ScenarioInfo); // enum ENCODE_SCENARIO 147 PUSH(contentInfo); // enum ENCODE_CONTENT 148 PUSH(FrameSizeTolerance); // enum ENCODE_FRAMESIZE_TOLERANCE 149 PUSH(SlidingWindowSize); 150 PUSH(MaxBitRatePerSlidingWindow); 151 PUSH(MinBitRatePerSlidingWindow); 152 PUSH(LookaheadDepth); 153 PUSH(MinAdaptiveGopPicSize); 154 PUSH(MaxAdaptiveGopPicSize); 155 PUSH(FullPassCodecType); 156 157 MOS_TraceEventExt( 158 EVENT_ENCODE_DDI_SEQ_PARAM_HEVC, 159 EVENT_TYPE_INFO, 160 data.data(), 161 data.size() * sizeof(decltype(data)::value_type)); 162 } 163 TraceDDI(const CODEC_HEVC_ENCODE_PICTURE_PARAMS & obj)164 static void TraceDDI(const CODEC_HEVC_ENCODE_PICTURE_PARAMS &obj) 165 { 166 if (!TraceDDIEn()) 167 { 168 return; 169 } 170 171 std::vector<uint32_t> data; 172 data.reserve(sizeof(obj)); 173 174 PUSH(CurrOriginalPic.PicEntry); 175 PUSH(CurrReconstructedPic.PicEntry); 176 PUSH(CollocatedRefPicIndex); 177 for (size_t i = 0; i < NUM_ELEM_ARRAY(RefFrameList); i++) 178 { 179 PUSH(RefFrameList[i].PicEntry); 180 } 181 PUSH(CurrPicOrderCnt); // int32_t 182 PUSH_ARRAY(RefFramePOCList); // int32_t 183 PUSH(CodingType); 184 PUSH(HierarchLevelPlus1); 185 PUSH(NumSlices); 186 PUSH(tiles_enabled_flag); 187 PUSH(entropy_coding_sync_enabled_flag); 188 PUSH(sign_data_hiding_flag); 189 PUSH(constrained_intra_pred_flag); 190 PUSH(transform_skip_enabled_flag); 191 PUSH(transquant_bypass_enabled_flag); 192 PUSH(cu_qp_delta_enabled_flag); 193 PUSH(weighted_pred_flag); 194 PUSH(weighted_bipred_flag); 195 PUSH(loop_filter_across_slices_flag); 196 PUSH(loop_filter_across_tiles_flag); 197 PUSH(scaling_list_data_present_flag); 198 PUSH(dependent_slice_segments_enabled_flag); 199 PUSH(bLastPicInSeq); 200 PUSH(bLastPicInStream); 201 PUSH(bUseRawPicForRef); 202 PUSH(bEmulationByteInsertion); 203 PUSH(BRCPrecision); 204 PUSH(bEnableSliceLevelReport); 205 PUSH(bEnableRollingIntraRefresh); 206 PUSH(no_output_of_prior_pics_flag); 207 PUSH(bEnableGPUWeightedPrediction); 208 PUSH(bDisplayFormatSwizzle); 209 PUSH(deblocking_filter_override_enabled_flag); 210 PUSH(pps_deblocking_filter_disabled_flag); 211 PUSH(bEnableCTULevelReport); 212 PUSH(bEnablePartialFrameUpdate); 213 PUSH(QpY); // int8_t 214 PUSH(diff_cu_qp_delta_depth); 215 PUSH(pps_cb_qp_offset); // int8_t 216 PUSH(pps_cr_qp_offset); // int8_t 217 PUSH(num_tile_columns_minus1); 218 PUSH(num_tile_rows_minus1); 219 PUSH_ARRAY(tile_column_width); 220 PUSH_ARRAY(tile_row_height); 221 PUSH(log2_parallel_merge_level_minus2); 222 PUSH(num_ref_idx_l0_default_active_minus1); 223 PUSH(num_ref_idx_l1_default_active_minus1); 224 PUSH(LcuMaxBitsizeAllowed); 225 PUSH(IntraInsertionLocation); 226 PUSH(IntraInsertionSize); 227 PUSH(QpDeltaForInsertedIntra); // int8_t 228 PUSH(StatusReportFeedbackNumber); 229 PUSH(slice_pic_parameter_set_id); 230 PUSH(nal_unit_type); 231 PUSH(MaxSliceSizeInBytes); 232 PUSH(NumROI); 233 for (size_t i = 0; i < NUM_ELEM_ARRAY(ROI); i++) 234 { 235 PUSH(ROI[i].PriorityLevelOrDQp); // int8_t 236 PUSH(ROI[i].Top); 237 PUSH(ROI[i].Bottom); 238 PUSH(ROI[i].Left); 239 PUSH(ROI[i].Right); 240 } 241 PUSH(MaxDeltaQp); // int8_t 242 PUSH(MinDeltaQp); // int8_t 243 PUSH(CustomRoundingOffsetsParams.fields.EnableCustomRoudingIntra); 244 PUSH(CustomRoundingOffsetsParams.fields.RoundingOffsetIntra); 245 PUSH(CustomRoundingOffsetsParams.fields.EnableCustomRoudingInter); 246 PUSH(CustomRoundingOffsetsParams.fields.RoundingOffsetInter); 247 PUSH(SkipFrameFlag); 248 PUSH(NumSkipFrames); 249 PUSH(SizeSkipFrames); 250 PUSH(BRCMaxQp); 251 PUSH(BRCMinQp); 252 PUSH(bEnableHMEOffset); 253 PUSH_ARRAY2(HMEOffset); // int16_t 254 PUSH(NumDirtyRects); 255 PUSH64(pDirtyRect); 256 if (obj.pDirtyRect) 257 { 258 for (size_t i = 0; i < obj.NumDirtyRects; i++) 259 { 260 PUSH(pDirtyRect[i].Top); 261 PUSH(pDirtyRect[i].Bottom); 262 PUSH(pDirtyRect[i].Left); 263 PUSH(pDirtyRect[i].Right); 264 } 265 } 266 PUSH(NumMoveRects); 267 PUSH(LcuMaxBitsizeAllowedHigh16b); 268 PUSH(DownScaleRatio.fields.X16Minus1_X); 269 PUSH(DownScaleRatio.fields.X16Minus1_Y); 270 PUSH(QpModulationStrength); 271 PUSH(TargetFrameSize); 272 PUSH(StatusReportEnable.fields.FrameStats); 273 PUSH(StatusReportEnable.fields.BlockStats); 274 275 MOS_TraceEventExt( 276 EVENT_ENCODE_DDI_PIC_PARAM_HEVC, 277 EVENT_TYPE_INFO, 278 data.data(), 279 data.size() * sizeof(decltype(data)::value_type)); 280 } 281 TraceDDI(const CODEC_HEVC_ENCODE_SLICE_PARAMS & obj)282 static void TraceDDI(const CODEC_HEVC_ENCODE_SLICE_PARAMS &obj) 283 { 284 if (!TraceDDIEn()) 285 { 286 return; 287 } 288 289 std::vector<uint32_t> data; 290 data.reserve(sizeof(obj)); 291 292 PUSH(slice_segment_address); 293 PUSH(NumLCUsInSlice); 294 for (size_t i = 0; i < NUM_ELEM_ARRAY(RefPicList); i++) 295 { 296 for (size_t j = 0; j < NUM_ELEM_ARRAY(RefPicList[0]); j++) 297 { 298 PUSH(RefPicList[i][j].PicEntry); 299 } 300 } 301 PUSH(num_ref_idx_l0_active_minus1); 302 PUSH(num_ref_idx_l1_active_minus1); 303 PUSH(bLastSliceOfPic); 304 PUSH(dependent_slice_segment_flag); 305 PUSH(slice_temporal_mvp_enable_flag); 306 PUSH(slice_type); 307 PUSH(slice_sao_luma_flag); 308 PUSH(slice_sao_chroma_flag); 309 PUSH(mvd_l1_zero_flag); 310 PUSH(cabac_init_flag); 311 PUSH(slice_deblocking_filter_disable_flag); 312 PUSH(collocated_from_l0_flag); 313 PUSH(slice_qp_delta); // int8_t 314 PUSH(slice_cb_qp_offset); // int8_t 315 PUSH(slice_cr_qp_offset); // int8_t 316 PUSH(beta_offset_div2); // int8_t 317 PUSH(tc_offset_div2); // int8_t 318 PUSH(luma_log2_weight_denom); 319 PUSH(delta_chroma_log2_weight_denom); // int8_t 320 PUSH_ARRAY2(luma_offset); // int8_t 321 PUSH_ARRAY2(delta_luma_weight); // int8_t 322 PUSH_ARRAY3(chroma_offset); // int8_t 323 PUSH_ARRAY3(delta_chroma_weight); // int8_t 324 PUSH(MaxNumMergeCand); 325 PUSH(slice_id); 326 PUSH(BitLengthSliceHeaderStartingPortion); 327 PUSH(SliceHeaderByteOffset); 328 PUSH(SliceQpDeltaBitOffset); 329 PUSH(PredWeightTableBitOffset); 330 PUSH(PredWeightTableBitLength); 331 PUSH(SliceSAOFlagBitOffset); 332 333 MOS_TraceEventExt( 334 EVENT_ENCODE_DDI_SLC_PARAM_HEVC, 335 EVENT_TYPE_INFO, 336 data.data(), 337 data.size() * sizeof(decltype(data)::value_type)); 338 } 339 340 private: TraceDDIEn()341 static bool TraceDDIEn() 342 { 343 return MosUtilities::TraceKeyEnabled(TR_KEY_ENCODE_EVENT_DDI) && 344 MosUtilities::TracelevelEnabled(MT_EVENT_LEVEL::ALWAYS); 345 } 346 }; 347 348 #undef NUM_ELEM_ARRAY 349 #undef PUSH 350 #undef PUSH64 351 #undef PUSH_ARRAY 352 #undef PUSH_ARRAY2 353 #undef PUSH_ARRAY3 354 #undef PUSH_SEQ 355