• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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