1 /*
2 * Copyright (c) 2018-2020, 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     encode_avc_vdenc_pipeline.cpp
24 //! \brief    Defines the interface for avc vdenc encode pipeline
25 //!
26 
27 #include "encode_avc_vdenc_pipeline.h"
28 #include "encode_avc_basic_feature.h"
29 #include "encode_avc_brc.h"
30 #include "encode_scalability_defs.h"
31 #include "encode_status_report_defs.h"
32 #include "media_avc_feature_defs.h"
33 #include "encode_preenc_packet.h"
34 #include "encode_avc_vdenc_preenc.h"
35 
36 // SubMbPartMask defined in CURBE for AVC ENC
37 #define CODECHAL_ENCODE_AVC_DISABLE_4X4_SUB_MB_PARTITION 0x40
38 #define CODECHAL_ENCODE_AVC_DISABLE_4X8_SUB_MB_PARTITION 0x20
39 #define CODECHAL_ENCODE_AVC_DISABLE_8X4_SUB_MB_PARTITION 0x10
40 
41 namespace encode {
42 
AvcVdencPipeline(CodechalHwInterfaceNext * hwInterface,CodechalDebugInterface * debugInterface)43 AvcVdencPipeline::AvcVdencPipeline(
44     CodechalHwInterfaceNext *   hwInterface,
45     CodechalDebugInterface *debugInterface)
46     : EncodePipeline(hwInterface, debugInterface)
47 {
48 }
49 
Initialize(void * settings)50 MOS_STATUS AvcVdencPipeline::Initialize(void *settings)
51 {
52     ENCODE_FUNC_CALL();
53     ENCODE_CHK_STATUS_RETURN(InitUserSetting(m_userSettingPtr));
54     ENCODE_CHK_STATUS_RETURN(EncodePipeline::Initialize(settings));
55 
56 #if MHW_HWCMDPARSER_ENABLED
57     mhw::HwcmdParser::InitInstance(m_osInterface, mhw::HwcmdParser::AddOnMode::AVCe);
58 #endif
59 
60     return MOS_STATUS_SUCCESS;
61 }
62 
Uninitialize()63 MOS_STATUS AvcVdencPipeline::Uninitialize()
64 {
65     ENCODE_FUNC_CALL();
66 
67     if (m_mmcState != nullptr)
68     {
69         MOS_Delete(m_mmcState);
70     }
71 
72     ENCODE_CHK_STATUS_RETURN(EncodePipeline::Uninitialize());
73 
74     return MOS_STATUS_SUCCESS;
75 }
76 
UserFeatureReport()77 MOS_STATUS AvcVdencPipeline::UserFeatureReport()
78 {
79     ENCODE_FUNC_CALL();
80     ENCODE_CHK_STATUS_RETURN(EncodePipeline::UserFeatureReport());
81 
82     ReportUserSetting(
83         m_userSettingPtr,
84         "AVC Encode Mode",
85         m_codecFunction,
86         MediaUserSetting::Group::Sequence);
87 
88 #if (_DEBUG || _RELEASE_INTERNAL)
89     ReportUserSettingForDebug(
90         m_userSettingPtr,
91         "VDENC In Use",
92         1,
93         MediaUserSetting::Group::Frame);
94 
95     ReportUserSettingForDebug(
96         m_userSettingPtr,
97         "Enable Encode VE CtxBasedScheduling",
98         MOS_VE_CTXBASEDSCHEDULING_SUPPORTED(m_osInterface),
99         MediaUserSetting::Group::Frame);
100 #endif
101 
102     return MOS_STATUS_SUCCESS;
103 }
104 
Prepare(void * params)105 MOS_STATUS AvcVdencPipeline::Prepare(void *params)
106 {
107     ENCODE_FUNC_CALL();
108 
109     EncoderParams *encodeParams = (EncoderParams *)params;
110     ENCODE_CHK_NULL_RETURN(encodeParams);
111 
112     //TODO: should check with m_codecFunction
113     if (encodeParams->ExecCodecFunction != CODECHAL_FUNCTION_ENC_VDENC_PAK)
114     {
115         return MOS_STATUS_INVALID_PARAMETER;
116     }
117 
118     ENCODE_CHK_STATUS_RETURN(EncodePipeline::Prepare(params));
119 
120     auto basicFeature = dynamic_cast<AvcBasicFeature*>(m_featureManager->GetFeature(FeatureIDs::basicFeature));
121     ENCODE_CHK_NULL_RETURN(basicFeature);
122 
123     CODECHAL_DEBUG_TOOL
124     (
125         m_debugInterface->m_currPic            = basicFeature->m_currOriginalPic;
126         m_debugInterface->m_bufferDumpFrameNum = basicFeature->m_frameNum + 1;
127         m_debugInterface->m_frameType          = basicFeature->m_pictureCodingType;
128 
129         if (basicFeature->m_newSeq) {
130             ENCODE_CHK_STATUS_RETURN(DumpSeqParams(
131                 basicFeature->m_seqParam,
132                 basicFeature->m_iqMatrixParams));
133         }
134 
135         if (basicFeature->m_newVuiData) {
136             ENCODE_CHK_STATUS_RETURN(DumpVuiParams(
137                 basicFeature->m_vuiParams));
138         }
139 
140         ENCODE_CHK_STATUS_RETURN(DumpPicParams(
141             basicFeature->m_picParam,
142             basicFeature->m_iqMatrixParams));
143 
144         for (uint32_t i = 0; i < basicFeature->m_numSlices; i++) {
145             ENCODE_CHK_STATUS_RETURN(DumpSliceParams(
146                 &basicFeature->m_sliceParams[i],
147                 basicFeature->m_picParam));
148         }
149     )
150 
151     PCODEC_AVC_ENCODE_PIC_PARAMS picParams = static_cast<PCODEC_AVC_ENCODE_PIC_PARAMS>(encodeParams->pPicParams);
152     ENCODE_CHK_NULL_RETURN(picParams);
153 
154     ENCODE_CHK_STATUS_RETURN(SwitchContext(basicFeature->m_outputChromaFormat));
155 
156     EncoderStatusParameters inputParameters = {};
157     MOS_ZeroMemory(&inputParameters, sizeof(EncoderStatusParameters));
158 
159     inputParameters.statusReportFeedbackNumber = picParams->StatusReportFeedbackNumber;
160     inputParameters.codecFunction              = encodeParams->ExecCodecFunction;
161     inputParameters.currRefList                = basicFeature->m_ref->GetCurrRefList();
162     inputParameters.picWidthInMb               = basicFeature->m_picWidthInMb;
163     inputParameters.frameFieldHeightInMb       = basicFeature->m_frameFieldHeightInMb;
164     inputParameters.currOriginalPic            = basicFeature->m_currOriginalPic;
165     inputParameters.pictureCodingType          = basicFeature->m_pictureCodingType;
166     inputParameters.numUsedVdbox               = m_numVdbox;
167     inputParameters.hwWalker                   = false;
168     inputParameters.maxNumSlicesAllowed        = basicFeature->m_maxNumSlicesAllowed;
169     inputParameters.numberTilesInFrame         = 1;
170 
171     ENCODE_CHK_STATUS_RETURN(m_statusReport->Init(&inputParameters));
172 
173     return MOS_STATUS_SUCCESS;
174 }
175 
Execute()176 MOS_STATUS AvcVdencPipeline::Execute()
177 {
178     ENCODE_FUNC_CALL();
179 
180     ENCODE_CHK_STATUS_RETURN(ActivateVdencVideoPackets());
181     ENCODE_CHK_STATUS_RETURN(ExecuteActivePackets());
182     ENCODE_CHK_STATUS_RETURN(ResetParams());
183 
184     return MOS_STATUS_SUCCESS;
185 }
186 
GetStatusReport(void * status,uint16_t numStatus)187 MOS_STATUS AvcVdencPipeline::GetStatusReport(void *status, uint16_t numStatus)
188 {
189     ENCODE_FUNC_CALL();
190     ENCODE_CHK_STATUS_RETURN(m_statusReport->GetReport(numStatus, status));
191 
192     return MOS_STATUS_SUCCESS;
193 }
194 
Destroy()195 MOS_STATUS AvcVdencPipeline::Destroy()
196 {
197     ENCODE_FUNC_CALL();
198     ENCODE_CHK_STATUS_RETURN(Uninitialize());
199 
200     return MOS_STATUS_SUCCESS;
201 }
202 
ActivateVdencVideoPackets()203 MOS_STATUS AvcVdencPipeline::ActivateVdencVideoPackets()
204 {
205     ENCODE_FUNC_CALL();
206 
207     auto brcFeature = dynamic_cast<AvcEncodeBRC*>(m_featureManager->GetFeature(AvcFeatureIDs::avcBrcFeature));
208     ENCODE_CHK_NULL_RETURN(brcFeature);
209     bool immediateSubmit = !m_singleTaskPhaseSupported;
210     ENCODE_NORMALMESSAGE("immediateSubmit = %d", immediateSubmit);
211 
212     if (m_preEncEnabled)
213     {
214         ENCODE_CHK_STATUS_RETURN(ActivatePacket(encodePreEncPacket, immediateSubmit, 0, 0));
215         ENCODE_NORMALMESSAGE("encodePreEncPacket was activated");
216         if (m_encodeMode == MediaEncodeMode::MANUAL_RES_PRE_ENC || m_encodeMode == MediaEncodeMode::AUTO_RES_PRE_ENC)
217         {
218             m_activePacketList.back().immediateSubmit = true;
219             return MOS_STATUS_SUCCESS;
220         }
221     }
222 
223     if (brcFeature->IsBRCInitRequired())
224     {
225         ENCODE_NORMALMESSAGE("HucBrcInit was activated");
226         ENCODE_CHK_STATUS_RETURN(ActivatePacket(HucBrcInit, immediateSubmit, 0, 0));
227     }
228 
229     for (uint8_t curPass = 0; curPass < GetPassNum(); curPass++)
230     {
231         if (brcFeature->IsBRCUpdateRequired())
232         {
233             ENCODE_NORMALMESSAGE("HucBrcUpdate was activated");
234             ENCODE_CHK_STATUS_RETURN(ActivatePacket(HucBrcUpdate, immediateSubmit, curPass, 0));
235         }
236         ENCODE_NORMALMESSAGE("VdencPacket was activated");
237         ENCODE_CHK_STATUS_RETURN(ActivatePacket(VdencPacket, immediateSubmit, curPass, 0));
238     }
239 
240     SetFrameTrackingForMultiTaskPhase();
241 
242     // Last element in m_activePacketList must be immediately submitted
243     m_activePacketList.back().immediateSubmit = true;
244 
245     return MOS_STATUS_SUCCESS;
246 }
247 
CreateBufferTracker()248 MOS_STATUS AvcVdencPipeline::CreateBufferTracker()
249 {
250     return MOS_STATUS_SUCCESS;
251 }
252 
CreateStatusReport()253 MOS_STATUS AvcVdencPipeline::CreateStatusReport()
254 {
255     return MOS_STATUS_SUCCESS;
256 }
257 
ResetParams()258 MOS_STATUS AvcVdencPipeline::ResetParams()
259 {
260     ENCODE_FUNC_CALL();
261 
262     auto avcBasicfeature = dynamic_cast<AvcBasicFeature *>(m_featureManager->GetFeature(FeatureIDs::basicFeature));
263     ENCODE_CHK_NULL_RETURN(avcBasicfeature);
264 
265     m_currRecycledBufIdx = (m_currRecycledBufIdx + 1) % CODECHAL_ENCODE_RECYCLED_BUFFER_NUM;
266     if (m_currRecycledBufIdx == 0)
267     {
268         MOS_ZeroMemory(m_recycledBufStatusNum, sizeof(m_recycledBufStatusNum));
269     }
270 
271     // Only update user features for first frame.
272     if (avcBasicfeature->m_frameNum == 0)
273     {
274         ENCODE_CHK_STATUS_RETURN(UserFeatureReport());
275     }
276 
277     avcBasicfeature->m_frameNum++;
278 
279     ENCODE_CHK_STATUS_RETURN(m_statusReport->Reset());
280 
281     return MOS_STATUS_SUCCESS;
282 }
283 
SwitchContext(uint8_t outputChromaFormat)284 MOS_STATUS AvcVdencPipeline::SwitchContext(uint8_t outputChromaFormat)
285 {
286     ENCODE_FUNC_CALL();
287 
288     if (!m_scalPars)
289     {
290         m_scalPars = std::make_shared<EncodeScalabilityPars>();
291     }
292 
293     *m_scalPars             = {};
294     m_scalPars->enableVDEnc = true;
295     m_scalPars->enableVE    = MOS_VE_SUPPORTED(m_osInterface);
296     m_scalPars->numVdbox    = m_numVdbox;
297 
298     m_scalPars->forceMultiPipe     = false;
299     m_scalPars->outputChromaFormat = outputChromaFormat;
300 
301     m_scalPars->numTileRows    = 1;
302     m_scalPars->numTileColumns = 1;
303 
304     m_scalPars->IsPak = true;
305 
306     m_mediaContext->SwitchContext(VdboxEncodeFunc, &*m_scalPars, &m_scalability);
307     ENCODE_CHK_NULL_RETURN(m_scalability);
308 
309     m_scalability->SetPassNumber(m_featureManager->GetNumPass());
310 
311     return MOS_STATUS_SUCCESS;
312 }
313 
314 #if USE_CODECHAL_DEBUG_TOOL
DumpEncodePicReorder(std::ostringstream & oss,uint32_t x,uint32_t y,const CODEC_PIC_REORDER * picReorder)315 MOS_STATUS AvcVdencPipeline::DumpEncodePicReorder(
316     std::ostringstream       &oss,
317     uint32_t                  x,
318     uint32_t                  y,
319     const CODEC_PIC_REORDER * picReorder)
320 {
321     uint8_t botField;
322 
323     CODECHAL_DEBUG_CHK_NULL(picReorder);
324 
325     botField = CodecHal_PictureIsBottomField(picReorder->Picture) ? 1 : 0;
326 
327     oss << "# PicOrder[" << std::dec << +x << "][" << std::dec << +y << "] =" << std::endl;
328     oss << "# \tPicNum = " << std::dec << +picReorder->PicNum << std::endl;
329     oss << "# \tPOC = " << std::dec << +picReorder->POC << std::endl;
330     oss << "# \tReorderPicNumIDC = " << std::dec << +picReorder->ReorderPicNumIDC << std::endl;
331     oss << "# \tDiffPicNumMinus1 = " << std::dec << +picReorder->DiffPicNumMinus1 << std::endl;
332     oss << "# \tFrameIdx = " << std::dec << +picReorder->Picture.FrameIdx << std::endl;
333     oss << "# \tBotField = " << std::dec << +botField << std::endl;
334 
335     return MOS_STATUS_SUCCESS;
336 }
337 
DumpSeqParams(const CODEC_AVC_ENCODE_SEQUENCE_PARAMS * seqParams,const CODEC_AVC_IQ_MATRIX_PARAMS * matrixParams)338 MOS_STATUS AvcVdencPipeline::DumpSeqParams(
339     const CODEC_AVC_ENCODE_SEQUENCE_PARAMS *seqParams,
340     const CODEC_AVC_IQ_MATRIX_PARAMS       *matrixParams)
341 {
342     ENCODE_FUNC_CALL();
343     ENCODE_CHK_NULL_RETURN(m_debugInterface);
344 
345     if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrSeqParams))
346     {
347         return MOS_STATUS_SUCCESS;
348     }
349 
350     CODECHAL_DEBUG_CHK_NULL(seqParams);
351 
352     std::ostringstream oss;
353     oss.setf(std::ios::showbase | std::ios::uppercase);
354 
355     oss << "# DDI Parameters:" << std::endl;
356     oss << "FrameWidth = " << +seqParams->FrameWidth << std::endl;
357     oss << "FrameHeight = " << +seqParams->FrameHeight << std::endl;
358     oss << "Profile = " << +seqParams->Profile << std::endl;
359     oss << "Level = " << +seqParams->Level << std::endl;
360     oss << "GopPicSize = " << +seqParams->GopPicSize << std::endl;
361     oss << "GopRefDist = " << +seqParams->GopRefDist << std::endl;
362     oss << "GopOptFlag = " << +seqParams->GopOptFlag << std::endl;
363     oss << "TargetUsage = " << +seqParams->TargetUsage << std::endl;
364     oss << "RateControlMethod = " << +seqParams->RateControlMethod << std::endl;
365     oss << "TargetBitRate = " << +seqParams->TargetBitRate << std::endl;
366     oss << "MaxBitRate = " << +seqParams->MaxBitRate << std::endl;
367     oss << "MinBitRate = " << +seqParams->MinBitRate << std::endl;
368     oss << "FramesPer100Sec = " << +seqParams->FramesPer100Sec << std::endl;
369     oss << "InitVBVBufferFullnessInBit = " << +seqParams->InitVBVBufferFullnessInBit << std::endl;
370     oss << "VBVBufferSizeInBit = " << +seqParams->VBVBufferSizeInBit << std::endl;
371     oss << "NumRefFrames = " << +seqParams->NumRefFrames / 2 << std::endl;  // this prints the value passed from DDI
372     oss << "# NumRefFrames (Actual Value in CodecHal is twice the value passed from DDI) = "
373         << +seqParams->NumRefFrames << std::endl;  // this prints the actual value in CodecHal seq param structure
374     oss << "seq_parameter_set_id = " << +seqParams->seq_parameter_set_id << std::endl;
375     oss << "chroma_format_idc = " << +seqParams->chroma_format_idc << std::endl;
376     oss << "bit_depth_luma_minus8 = " << +seqParams->bit_depth_luma_minus8 << std::endl;
377     oss << "bit_depth_chroma_minus8 = " << +seqParams->bit_depth_chroma_minus8 << std::endl;
378     oss << "log2_max_frame_num_minus4 = " << +seqParams->log2_max_frame_num_minus4 << std::endl;
379     oss << "pic_order_cnt_type = " << +seqParams->pic_order_cnt_type << std::endl;
380     oss << "log2_max_pic_order_cnt_lsb_minus4 = " << +seqParams->log2_max_pic_order_cnt_lsb_minus4 << std::endl;
381     oss << "num_ref_frames_in_pic_order_cnt_cycle = " << +seqParams->num_ref_frames_in_pic_order_cnt_cycle << std::endl;
382     oss << "offset_for_non_ref_pic = " << +seqParams->offset_for_non_ref_pic << std::endl;
383     oss << "offset_for_top_to_bottom_field = " << +seqParams->offset_for_top_to_bottom_field << std::endl;
384 
385     // Conditionally printed (only when pic_order_cnt_type = 1).  Contains 256 elements.
386     if (seqParams->pic_order_cnt_type == 1)
387     {
388         for (uint16_t i = 0; i < 256; ++i)
389         {
390             oss << "offset_for_ref_frame[" << +i << "] = " << +seqParams->offset_for_ref_frame[i] << std::endl;
391         }
392     }
393 
394     oss << "frame_crop_left_offset = " << +seqParams->frame_crop_left_offset << std::endl;
395     oss << "frame_crop_right_offset = " << +seqParams->frame_crop_right_offset << std::endl;
396     oss << "frame_crop_top_offset = " << +seqParams->frame_crop_top_offset << std::endl;
397     oss << "frame_crop_bottom_offset = " << +seqParams->frame_crop_bottom_offset << std::endl;
398     oss << "seq_scaling_matrix_present_flag = " << +seqParams->seq_scaling_matrix_present_flag << std::endl;
399     oss << "seq_scaling_list_present_flag = " << +seqParams->seq_scaling_list_present_flag[0] << std::endl;
400 
401     // seq_scaling_list_present_flag with 12 elements (only 1 element acknowledged in DDI doc)
402     oss << "# seq_scaling_list_present_flag[1-11]:";
403     for (uint8_t i = 1; i < 12; i++)
404         oss << +seqParams->seq_scaling_list_present_flag[i] << " ";
405     oss << std::endl;
406 
407     oss << "delta_pic_order_always_zero_flag = " << +seqParams->delta_pic_order_always_zero_flag << std::endl;
408     oss << "frame_mbs_only_flag = " << +seqParams->frame_mbs_only_flag << std::endl;
409     oss << "direct_8x8_inference_flag = " << +seqParams->direct_8x8_inference_flag << std::endl;
410     oss << "vui_parameters_present_flag = " << +seqParams->vui_parameters_present_flag << std::endl;
411     oss << "frame_cropping_flag = " << +seqParams->frame_cropping_flag << std::endl;
412     oss << "EnableSliceLevelRateCtrl = " << +seqParams->EnableSliceLevelRateCtrl << std::endl;
413     oss << "ICQQualityFactor = " << +seqParams->ICQQualityFactor << std::endl;
414     oss << "InputColorSpace = " << +seqParams->InputColorSpace << std::endl;
415 
416     // begining of union/struct
417     oss << "# bResetBRC = " << +seqParams->bResetBRC << std::endl;
418     oss << "# bNoAcceleratorSPSInsertion = " << +seqParams->bNoAcceleratorSPSInsertion << std::endl;
419     oss << "# GlobalSearch = " << +seqParams->GlobalSearch << std::endl;
420     oss << "# LocalSearch = " << +seqParams->LocalSearch << std::endl;
421     oss << "# EarlySkip = " << +seqParams->EarlySkip << std::endl;
422     oss << "# Trellis = " << +seqParams->Trellis << std::endl;
423     oss << "# MBBRC = " << +seqParams->MBBRC << std::endl;
424     oss << "# bTemporalScalability = " << +seqParams->bTemporalScalability << std::endl;
425     oss << "# ROIValueInDeltaQP = " << +seqParams->ROIValueInDeltaQP << std::endl;
426     oss << "# bAutoMaxPBFrameSizeForSceneChange = " << +seqParams->bAutoMaxPBFrameSizeForSceneChange << std::endl;
427     oss << "sFlags = " << +seqParams->sFlags << std::endl;
428 
429     // end of union/struct
430     oss << "UserMaxIFrameSize = " << +seqParams->UserMaxFrameSize << std::endl;
431     oss << "UserMaxPBFrameSize = " << +seqParams->UserMaxPBFrameSize << std::endl;
432 
433     // Parameters not defined in DDI (Any non-DDI parameters printed should be preceeded by #)
434     oss << "# Non-DDI Parameters:" << std::endl;
435     oss << "# constraint_set0_flag = " << std::hex << +seqParams->constraint_set0_flag << std::endl;
436     oss << "# constraint_set1_flag = " << std::hex << +seqParams->constraint_set1_flag << std::endl;
437     oss << "# constraint_set2_flag = " << std::hex << +seqParams->constraint_set2_flag << std::endl;
438     oss << "# constraint_set3_flag = " << std::hex << +seqParams->constraint_set3_flag << std::endl;
439 
440     oss << "# separate_colour_plane_flag = " << std::hex << +seqParams->separate_colour_plane_flag << std::endl;
441     oss << "# qpprime_y_zero_transform_bypass_flag = " << std::hex << +seqParams->qpprime_y_zero_transform_bypass_flag << std::endl;
442     oss << "# gaps_in_frame_num_value_allowed_flag = " << std::hex << +seqParams->gaps_in_frame_num_value_allowed_flag << std::endl;
443     oss << "# pic_width_in_mbs_minus1 = " << std::hex << +seqParams->pic_width_in_mbs_minus1 << std::endl;
444     oss << "# pic_height_in_map_units_minus1 = " << std::hex << +seqParams->pic_height_in_map_units_minus1 << std::endl;
445     oss << "# mb_adaptive_frame_field_flag = " << std::hex << +seqParams->mb_adaptive_frame_field_flag << std::endl;
446 
447     // Dump ScalingList4x4 (6 x 16)
448     for (uint8_t i = 0; i < 16; ++i)
449     {
450         oss << "# ScalingList4x4[" << std::dec << +i * 6 << "-" << (+i * 6) + 5 << "][" << +i << "]";
451         for (uint8_t j = 0; j < 6; j++)
452             oss << std::hex << +matrixParams->ScalingList4x4[j][i] << " ";
453         oss << std::endl;
454     }
455 
456     // ScalingList8x8 (2 x 64)
457     for (uint8_t i = 0; i < 64; ++i)
458     {
459         oss << "# ScalingList8x8[0 / 1][ " << std::dec << +i << "] = ";
460         oss << +matrixParams->ScalingList8x8[0][i] << " / " << +matrixParams->ScalingList8x8[1][i];
461         oss << std::endl;
462     }
463 
464     const char *fileName = m_debugInterface->CreateFileName(
465         "_DDIEnc",
466         CodechalDbgBufferType::bufSeqParams,
467         CodechalDbgExtType::txt);
468 
469     std::ofstream ofs(fileName, std::ios::out);
470     ofs << oss.str();
471     ofs.close();
472 
473     if (m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrDriverUltDump))
474     {
475         if (!m_debugInterface->m_ddiFileName.empty())
476         {
477             std::ofstream ofs(m_debugInterface->m_ddiFileName, std::ios::app);
478             ofs << "SeqParamFile"
479                 << " = \"" << m_debugInterface->m_fileName << "\"" << std::endl;
480             ofs.close();
481         }
482     }
483 
484     return MOS_STATUS_SUCCESS;
485 }
486 
DumpPicParams(const CODEC_AVC_ENCODE_PIC_PARAMS * picParams,const CODEC_AVC_IQ_MATRIX_PARAMS * matrixParams)487 MOS_STATUS AvcVdencPipeline::DumpPicParams(
488     const CODEC_AVC_ENCODE_PIC_PARAMS *picParams,
489     const CODEC_AVC_IQ_MATRIX_PARAMS  *matrixParams)
490 {
491     ENCODE_FUNC_CALL();
492     ENCODE_CHK_NULL_RETURN(m_debugInterface);
493 
494     if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrPicParams))
495     {
496         return MOS_STATUS_SUCCESS;
497     }
498 
499     CODECHAL_DEBUG_CHK_NULL(picParams);
500 
501     std::ostringstream oss;
502     oss.setf(std::ios::showbase | std::ios::uppercase);
503 
504     oss << "# DDI Parameters:" << std::endl;
505     oss << "TargetFrameSize = " << +picParams->TargetFrameSize << std::endl;
506     oss << "CurrOriginalPic = " << +picParams->CurrOriginalPic.PicEntry << std::endl;
507     oss << "CurrReconstructedPic = " << +picParams->CurrReconstructedPic.PicEntry << std::endl;
508     oss << "CodingType = " << +picParams->CodingType << std::endl;
509     oss << "FieldCodingFlag = " << +picParams->FieldCodingFlag << std::endl;
510     oss << "FieldFrameCodingFlag = " << +picParams->FieldFrameCodingFlag << std::endl;
511     oss << "NumSlice = " << +picParams->NumSlice << std::endl;
512     oss << "QpY = " << +picParams->QpY << std::endl;
513 
514     for (uint8_t i = 0; i < 16; ++i)
515     {
516         oss << "RefFrameList[" << +i << "] = " << +picParams->RefFrameList[i].PicEntry << std::endl;
517     }
518 
519     oss << "UsedForReferenceFlags = " << +picParams->UsedForReferenceFlags << std::endl;
520     oss << "CurrFieldOrderCnt[0] = " << +picParams->CurrFieldOrderCnt[0] << std::endl;
521     oss << "CurrFieldOrderCnt[1] = " << +picParams->CurrFieldOrderCnt[1] << std::endl;
522 
523     for (uint8_t i = 0; i < 16; ++i)
524     {
525         for (uint8_t j = 0; j < 2; ++j)
526         {
527             oss << "FieldOrderCntList[" << +i << "]"
528                 << "[" << +j << "] = " << +picParams->FieldOrderCntList[i][j] << std::endl;
529         }
530     }
531 
532     oss << "frame_num = " << +picParams->frame_num << std::endl;
533     oss << "bLastPicInSeq = " << +picParams->bLastPicInSeq << std::endl;
534     oss << "bLastPicInStream = " << +picParams->bLastPicInStream << std::endl;
535 
536     // User Flags parameters
537     oss << "# bUseRawPicForRef = " << +picParams->UserFlags.bUseRawPicForRef << std::endl;
538     oss << "# bDisableAcceleratorHeaderPacking = " << +picParams->UserFlags.bDisableAcceleratorHeaderPacking << std::endl;
539     oss << "# bDisableSubMBPartition = " << +picParams->UserFlags.bDisableSubMBPartition << std::endl;
540     oss << "# bEmulationByteInsertion = " << +picParams->UserFlags.bEmulationByteInsertion << std::endl;
541     oss << "# bEnableRollingIntraRefresh = " << +picParams->UserFlags.bEnableRollingIntraRefresh << std::endl;
542     oss << "ForceRepartitionCheck =" << +picParams->UserFlags.ForceRepartitionCheck << std::endl;
543     oss << "UserFlags = " << +picParams->UserFlags.Value << std::endl;
544     oss << "StatusReportFeedbackNumber = " << +picParams->StatusReportFeedbackNumber << std::endl;
545     oss << "bIdrPic = " << +picParams->bIdrPic << std::endl;
546     oss << "pic_parameter_set_id = " << +picParams->pic_parameter_set_id << std::endl;
547     oss << "seq_parameter_set_id = " << +picParams->seq_parameter_set_id << std::endl;
548     oss << "num_ref_idx_l0_active_minus1 = " << +picParams->num_ref_idx_l0_active_minus1 << std::endl;
549     oss << "num_ref_idx_l1_active_minus1 = " << +picParams->num_ref_idx_l1_active_minus1 << std::endl;
550     oss << "chroma_qp_index_offset = " << +picParams->chroma_qp_index_offset << std::endl;
551     oss << "second_chroma_qp_index_offset = " << +picParams->second_chroma_qp_index_offset << std::endl;
552     oss << "entropy_coding_mode_flag = " << +picParams->entropy_coding_mode_flag << std::endl;
553     oss << "pic_order_present_flag = " << +picParams->pic_order_present_flag << std::endl;
554     oss << "weighted_pred_flag = " << +picParams->weighted_pred_flag << std::endl;
555     oss << "weighted_bipred_idc = " << +picParams->weighted_bipred_idc << std::endl;
556     oss << "constrained_intra_pred_flag = " << +picParams->constrained_intra_pred_flag << std::endl;
557     oss << "transform_8x8_mode_flag = " << +picParams->transform_8x8_mode_flag << std::endl;
558     oss << "pic_scaling_matrix_present_flag = " << +picParams->pic_scaling_matrix_present_flag << std::endl;
559     oss << "pic_scaling_list_present_flag = " << +picParams->pic_scaling_list_present_flag[0] << std::endl;
560 
561     // pic_scaling_list_present_flag buffer contains 12 elements (only 1 acknowledged DDI document)
562     oss << "# pic_scaling_list_present_flag[1-11]:";
563     oss << +picParams->pic_scaling_list_present_flag[1] << " ";
564     oss << +picParams->pic_scaling_list_present_flag[2] << " ";
565     oss << +picParams->pic_scaling_list_present_flag[3] << " ";
566     oss << +picParams->pic_scaling_list_present_flag[4] << " ";
567     oss << +picParams->pic_scaling_list_present_flag[5] << " ";
568     oss << +picParams->pic_scaling_list_present_flag[6] << " ";
569     oss << +picParams->pic_scaling_list_present_flag[7] << " ";
570     oss << +picParams->pic_scaling_list_present_flag[8] << " ";
571     oss << +picParams->pic_scaling_list_present_flag[9] << " ";
572     oss << +picParams->pic_scaling_list_present_flag[10] << " ";
573     oss << +picParams->pic_scaling_list_present_flag[11] << std::endl;
574 
575     oss << "RefPicFlag = " << +picParams->RefPicFlag << std::endl;
576     oss << "BRCPrecision = " << +picParams->BRCPrecision << std::endl;
577     oss << "IntraInsertionLocation = " << +picParams->IntraRefreshMBNum << std::endl;
578     oss << "IntraInsertionSize = " << +picParams->IntraRefreshUnitinMB << std::endl;
579     oss << "QpDeltaForInsertedIntra = " << +picParams->IntraRefreshQPDelta << std::endl;
580     oss << "SliceSizeInBytes = " << +picParams->SliceSizeInBytes << std::endl;
581     oss << "bDisableRollingIntraRefreshOverlap = " << +picParams->bDisableRollingIntraRefreshOverlap << std::endl;
582     oss << "NumROI = " << +picParams->NumROI << std::endl;
583     oss << "MinDeltaQp = " << +picParams->MinDeltaQp << std::endl;
584     oss << "MaxDeltaQp = " << +picParams->MaxDeltaQp << std::endl;
585 
586     // Dump ROI coordinates and PriorityLevelOrDQp
587     for (uint16_t i = 0; i < picParams->NumROI; ++i)
588     {
589         oss << "ROI[" << +i << "] = [";
590         oss << +picParams->ROI[i].Top << ",";
591         oss << +picParams->ROI[i].Bottom << ",";
592         oss << +picParams->ROI[i].Left << ",";
593         oss << +picParams->ROI[i].Right << "], ";
594         oss << "PriorityLevelOrDQp = " << +picParams->ROI[i].PriorityLevelOrDQp << std::endl;
595     }
596 
597     oss << "NumDirtyROI = " << +picParams->NumDirtyROI << std::endl;
598 
599     // Dump Dirty ROI coordinates and PriorityLevelOrDQp
600     for (uint16_t i = 0; i < picParams->NumDirtyROI; ++i)
601     {
602         oss << "DirtyROI[" << +i << "] = [";
603         oss << +picParams->DirtyROI[i].Top << ",";
604         oss << +picParams->DirtyROI[i].Bottom << ",";
605         oss << +picParams->DirtyROI[i].Left << ",";
606         oss << +picParams->DirtyROI[i].Right << "], ";
607         oss << "PriorityLevelOrDQp = " << +picParams->DirtyROI[i].PriorityLevelOrDQp << std::endl;
608     }
609 
610     oss << "SkipFrameFlag = " << +picParams->SkipFrameFlag << std::endl;
611     oss << "NumSkipFrames = " << +picParams->NumSkipFrames << std::endl;
612     oss << "SizeSkipFrames = " << +picParams->SizeSkipFrames << std::endl;
613 
614     // Dump Min/Max QP params
615     oss << "BRCMinQp = " << +picParams->ucMinimumQP << std::endl;
616     oss << "BRCMaxQp = " << +picParams->ucMaximumQP << std::endl;
617 
618     // Dump SFD threshold
619     oss << "dwZMvThreshold = " << +picParams->dwZMvThreshold << std::endl;
620 
621     // Dump HME offset
622     for (uint8_t i = 0; i < 16; ++i)
623     {
624         for (uint8_t j = 0; j < 2; ++j)
625         {
626             for (uint8_t k = 0; k < 2; ++k)
627             {
628                 oss << "HMEOffset[" << +i << "][" << +j << "][" << +k << "] = " << +picParams->HMEOffset[i][j][k] << std::endl;
629             }
630         }
631     }
632 
633     // Parameters not defined in DDI (Any non-DDI parameters printed should be preceeded by #)
634     oss << "# Non-DDI Parameters:" << std::endl;
635     oss << "# num_slice_groups_minus1 = " << +picParams->num_slice_groups_minus1 << std::endl;
636     oss << "# pic_init_qp_minus26 = " << +picParams->pic_init_qp_minus26 << std::endl;
637     oss << "# pic_init_qs_minus26 = " << +picParams->pic_init_qs_minus26 << std::endl;
638     oss << "# deblocking_filter_control_present_flag = " << +picParams->deblocking_filter_control_present_flag << std::endl;
639     oss << "# redundant_pic_cnt_present_flag = " << +picParams->redundant_pic_cnt_present_flag << std::endl;
640     oss << "# EnableRollingIntraRefresh = " << +picParams->EnableRollingIntraRefresh << std::endl;
641     oss << "# IntraRefreshMBx = " << +picParams->IntraRefreshMBx << std::endl;
642     oss << "# IntraRefreshMBy = " << +picParams->IntraRefreshMBy << std::endl;
643     oss << "# IntraRefreshUnitinMB = " << +picParams->IntraRefreshUnitinMB << std::endl;
644     oss << "# IntraRefreshQPDelta = " << +picParams->IntraRefreshQPDelta << std::endl;
645 
646     // Dump ScalingList4x4 (6 x 16)
647     for (uint8_t i = 0; i < 16; ++i)
648     {
649         oss << "# ScalingList4x4[" << +i << "] = ";
650         oss << +matrixParams->ScalingList4x4[0][i] << " ";
651         oss << +matrixParams->ScalingList4x4[1][i] << " ";
652         oss << +matrixParams->ScalingList4x4[2][i] << " ";
653         oss << +matrixParams->ScalingList4x4[3][i] << " ";
654         oss << +matrixParams->ScalingList4x4[4][i] << " ";
655         oss << +matrixParams->ScalingList4x4[5][i] << std::endl;
656     }
657 
658     // ScalingList8x8 (2 x 64)
659     for (uint8_t i = 0; i < 64; ++i)
660     {
661         oss << "# ScalingList8x8[0/1][" << +i << "] = " << +matrixParams->ScalingList8x8[0][i] << " / " << +matrixParams->ScalingList8x8[1][i] << std::endl;
662     }
663 
664     const char *fileName = m_debugInterface->CreateFileName(
665         "_DDIEnc",
666         CodechalDbgBufferType::bufPicParams,
667         CodechalDbgExtType::txt);
668 
669     std::ofstream ofs(fileName, std::ios::out);
670     ofs << oss.str();
671     ofs.close();
672 
673     if (m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrDriverUltDump))
674     {
675         if (!m_debugInterface->m_ddiFileName.empty())
676         {
677             std::ofstream ofs(m_debugInterface->m_ddiFileName, std::ios::app);
678             ofs << "PicNum"
679                 << " = \"" << m_debugInterface->m_bufferDumpFrameNum << "\"" << std::endl;
680             ofs << "PicParamFile"
681                 << " = \"" << m_debugInterface->m_fileName << "\"" << std::endl;
682             ofs.close();
683         }
684     }
685 
686     return MOS_STATUS_SUCCESS;
687 }
688 
DumpSliceParams(const CODEC_AVC_ENCODE_SLICE_PARAMS * sliceParams,const CODEC_AVC_ENCODE_PIC_PARAMS * picParams)689 MOS_STATUS AvcVdencPipeline::DumpSliceParams(
690     const CODEC_AVC_ENCODE_SLICE_PARAMS *sliceParams,
691     const CODEC_AVC_ENCODE_PIC_PARAMS *picParams)
692 {
693     ENCODE_FUNC_CALL();
694 
695     ENCODE_CHK_NULL_RETURN(m_debugInterface);
696 
697     if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrSlcParams))
698     {
699         return MOS_STATUS_SUCCESS;
700     }
701 
702     CODECHAL_DEBUG_CHK_NULL(sliceParams);
703 
704     m_debugInterface->m_sliceId = sliceParams->slice_id;  // set here for constructing debug file name
705 
706     std::ostringstream oss;
707     oss.setf(std::ios::showbase | std::ios::uppercase);
708 
709     oss << "# DDI Parameters:" << std::endl;
710     oss << "NumMbsForSlice = " << +sliceParams->NumMbsForSlice << std::endl;
711 
712     // RefPicList (2 x 32)
713     for (uint8_t i = 0; i < 2; ++i)
714     {
715         for (uint8_t j = 0; j < 32; ++j)
716         {
717             oss << "RefPicList[" << +i << "][" << +j << "] = " << +sliceParams->RefPicList[i][j].PicEntry << std::endl;
718         }
719     }
720 
721     // Conditionally printed (only when picture parameters weighted_pred_flag or weighted_bipred_idc are set).
722     // Weights contains 192 elements (2 x 32 x 3 x 2).
723     if (picParams->weighted_pred_flag || picParams->weighted_bipred_idc)
724     {
725         for (uint8_t i = 0; i < 2; ++i)
726         {
727             for (uint8_t j = 0; j < 32; ++j)
728             {
729                 for (uint8_t k = 0; k < 3; ++k)
730                 {
731                     for (uint8_t l = 0; l < 2; ++l)
732                     {
733                         oss << "Weights[" << +i << "][" << +j << "][" << +k << "][" << +l << "]: " << +sliceParams->Weights[i][j][k][l] << std::endl;
734                     }
735                 }
736             }
737         }
738     }
739 
740     oss << "first_mb_in_slice = " << +sliceParams->first_mb_in_slice << std::endl;
741     oss << "slice_type = " << +sliceParams->slice_type << std::endl;
742     oss << "pic_parameter_set_id = " << +sliceParams->pic_parameter_set_id << std::endl;
743     oss << "direct_spatial_mv_pred_flag = " << +sliceParams->direct_spatial_mv_pred_flag << std::endl;
744     oss << "num_ref_idx_active_override_flag = " << +sliceParams->num_ref_idx_active_override_flag << std::endl;
745     oss << "long_term_reference_flag = " << +sliceParams->long_term_reference_flag << std::endl;
746     oss << "idr_pic_id = " << +sliceParams->idr_pic_id << std::endl;
747     oss << "pic_order_cnt_lsb = " << +sliceParams->pic_order_cnt_lsb << std::endl;
748     oss << "delta_pic_order_cnt_bottom = " << +sliceParams->delta_pic_order_cnt_bottom << std::endl;
749     oss << "delta_pic_order_cnt[0] = " << +sliceParams->delta_pic_order_cnt[0] << std::endl;
750     oss << "delta_pic_order_cnt[1] = " << +sliceParams->delta_pic_order_cnt[1] << std::endl;
751     oss << "num_ref_idx_l0_active_minus1 = " << +sliceParams->num_ref_idx_l0_active_minus1 << std::endl;
752     oss << "num_ref_idx_l1_active_minus1 = " << +sliceParams->num_ref_idx_l1_active_minus1 << std::endl;
753     oss << "luma_log2_weight_denom = " << +sliceParams->luma_log2_weight_denom << std::endl;
754     oss << "chroma_log2_weight_denom = " << +sliceParams->chroma_log2_weight_denom << std::endl;
755     oss << "cabac_init_idc = " << +sliceParams->cabac_init_idc << std::endl;
756     oss << "slice_qp_delta = " << +sliceParams->slice_qp_delta << std::endl;
757     oss << "disable_deblocking_filter_idc = " << +sliceParams->disable_deblocking_filter_idc << std::endl;
758     oss << "slice_alpha_c0_offset_div2 = " << +sliceParams->slice_alpha_c0_offset_div2 << std::endl;
759     oss << "slice_beta_offset_div2 = " << +sliceParams->slice_beta_offset_div2 << std::endl;
760     oss << "slice_id = " << +sliceParams->slice_id << std::endl;
761     oss << "luma_weight_flag[0] = " << +sliceParams->luma_weight_flag[0] << std::endl;
762     oss << "luma_weight_flag[1] = " << +sliceParams->luma_weight_flag[1] << std::endl;
763     oss << "chroma_weight_flag[0] = " << +sliceParams->chroma_weight_flag[0] << std::endl;
764     oss << "chroma_weight_flag[1] = " << +sliceParams->chroma_weight_flag[1] << std::endl;
765 
766     // Parameters not in DDI (Any non-DDI parameters printed should be preceeded by #)
767     oss << "# Non-DDI Parameters:" << std::endl;
768 
769     // PicOrder (2 x 32) - Dump in 32 blocks of 2 chunks per line
770     for (uint16_t i = 0; i < 32; ++i)
771     {
772         CODECHAL_DEBUG_CHK_STATUS(DumpEncodePicReorder(
773             oss,
774             0,
775             i,
776             &(sliceParams->PicOrder[0][i])));
777         CODECHAL_DEBUG_CHK_STATUS(DumpEncodePicReorder(
778             oss,
779             1,
780             i,
781             &(sliceParams->PicOrder[1][i])));
782     }
783 
784     oss << "# colour_plane_id = " << +sliceParams->colour_plane_id << std::endl;
785     oss << "# frame_num = " << +sliceParams->frame_num << std::endl;
786     oss << "# field_pic_flag = " << std::hex << +sliceParams->field_pic_flag << std::endl;
787     oss << "# bottom_field_flag = " << std::hex << +sliceParams->bottom_field_flag << std::endl;
788     oss << "# redundant_pic_cnt = " << std::dec << +sliceParams->redundant_pic_cnt << std::endl;
789     oss << "# sp_for_switch_flag = " << std::hex << +sliceParams->sp_for_switch_flag << std::endl;
790     oss << "# slice_qs_delta = " << std::dec << +sliceParams->slice_qs_delta << std::endl;
791     oss << "# ref_pic_list_reordering_flag_l0 = " << std::hex << +sliceParams->ref_pic_list_reordering_flag_l0 << std::endl;
792     oss << "# ref_pic_list_reordering_flag_l1 = " << std::hex << +sliceParams->ref_pic_list_reordering_flag_l1 << std::endl;
793     oss << "# no_output_of_prior_pics_flag = " << std::hex << +sliceParams->no_output_of_prior_pics_flag << std::endl;
794     oss << "# adaptive_ref_pic_marking_mode_flag = " << std::hex << +sliceParams->adaptive_ref_pic_marking_mode_flag << std::endl;
795     oss << "# MaxFrameNum = " << std::dec << +sliceParams->MaxFrameNum << std::endl;
796     oss << "# NumReorder = " << std::dec << +sliceParams->NumReorder << std::endl;
797 
798     const char *fileName = m_debugInterface->CreateFileName(
799         "_DDIEnc",
800         CodechalDbgBufferType::bufSlcParams,
801         CodechalDbgExtType::txt);
802 
803     std::ofstream ofs(fileName, std::ios::out);
804     ofs << oss.str();
805     ofs.close();
806 
807     if (m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrDriverUltDump))
808     {
809         if (!m_debugInterface->m_ddiFileName.empty())
810         {
811             std::ofstream ofs(m_debugInterface->m_ddiFileName, std::ios::app);
812             ofs << "SlcParamFile"
813                 << " = \"" << m_debugInterface->m_fileName << "\"" << std::endl;
814             ofs.close();
815         }
816     }
817 
818     return MOS_STATUS_SUCCESS;
819 }
820 
DumpVuiParams(const CODECHAL_ENCODE_AVC_VUI_PARAMS * vuiParams)821 MOS_STATUS AvcVdencPipeline::DumpVuiParams(
822     const CODECHAL_ENCODE_AVC_VUI_PARAMS *vuiParams)
823 {
824     ENCODE_FUNC_CALL();
825     ENCODE_CHK_NULL_RETURN(m_debugInterface);
826 
827     if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrVuiParams))
828     {
829         return MOS_STATUS_SUCCESS;
830     }
831 
832     CODECHAL_DEBUG_CHK_NULL(vuiParams);
833 
834     std::ostringstream oss;
835     oss.setf(std::ios::showbase | std::ios::uppercase);
836 
837     oss << "# DDI Parameters:" << std::endl;
838     oss << "aspect_ratio_info_present_flag = " << +vuiParams->aspect_ratio_info_present_flag << std::endl;
839     oss << "overscan_info_present_flag = " << +vuiParams->overscan_info_present_flag << std::endl;
840     oss << "overscan_appropriate_flag = " << +vuiParams->overscan_appropriate_flag << std::endl;
841     oss << "video_signal_type_present_flag = " << +vuiParams->video_signal_type_present_flag << std::endl;
842     oss << "video_full_range_flag = " << +vuiParams->video_full_range_flag << std::endl;
843     oss << "colour_description_present_flag = " << +vuiParams->colour_description_present_flag << std::endl;
844     oss << "chroma_loc_info_present_flag = " << +vuiParams->chroma_loc_info_present_flag << std::endl;
845     oss << "timing_info_present_flag = " << +vuiParams->timing_info_present_flag << std::endl;
846     oss << "fixed_frame_rate_flag = " << +vuiParams->fixed_frame_rate_flag << std::endl;
847     oss << "nal_hrd_parameters_present_flag = " << +vuiParams->nal_hrd_parameters_present_flag << std::endl;
848     oss << "vcl_hrd_parameters_present_flag = " << +vuiParams->vcl_hrd_parameters_present_flag << std::endl;
849     oss << "low_delay_hrd_flag = " << +vuiParams->low_delay_hrd_flag << std::endl;
850     oss << "pic_struct_present_flag = " << +vuiParams->pic_struct_present_flag << std::endl;
851     oss << "bitstream_restriction_flag = " << +vuiParams->bitstream_restriction_flag << std::endl;
852     oss << "motion_vectors_over_pic_boundaries_flag = " << +vuiParams->motion_vectors_over_pic_boundaries_flag << std::endl;
853     oss << "sar_width = " << +vuiParams->sar_width << std::endl;
854     oss << "sar_height = " << +vuiParams->sar_height << std::endl;
855     oss << "aspect_ratio_idc = " << +vuiParams->aspect_ratio_idc << std::endl;
856     oss << "video_format = " << +vuiParams->video_format << std::endl;
857     oss << "colour_primaries = " << +vuiParams->colour_primaries << std::endl;
858     oss << "transfer_characteristics = " << +vuiParams->transfer_characteristics << std::endl;
859     oss << "matrix_coefficients = " << +vuiParams->matrix_coefficients << std::endl;
860     oss << "chroma_sample_loc_type_top_field = " << +vuiParams->chroma_sample_loc_type_top_field << std::endl;
861     oss << "chroma_sample_loc_type_bottom_field = " << +vuiParams->chroma_sample_loc_type_bottom_field << std::endl;
862     oss << "max_bytes_per_pic_denom = " << +vuiParams->max_bytes_per_pic_denom << std::endl;
863     oss << "max_bits_per_mb_denom = " << +vuiParams->max_bits_per_mb_denom << std::endl;
864     oss << "log2_max_mv_length_horizontal = " << +vuiParams->log2_max_mv_length_horizontal << std::endl;
865     oss << "log2_max_mv_length_vertical = " << +vuiParams->log2_max_mv_length_vertical << std::endl;
866     oss << "num_reorder_frames = " << +vuiParams->num_reorder_frames << std::endl;
867     oss << "num_units_in_tick = " << +vuiParams->num_units_in_tick << std::endl;
868     oss << "time_scale = " << +vuiParams->time_scale << std::endl;
869     oss << "max_dec_frame_buffering = " << +vuiParams->max_dec_frame_buffering << std::endl;
870     oss << "cpb_cnt_minus1 = " << +vuiParams->cpb_cnt_minus1 << std::endl;
871     oss << "bit_rate_scale = " << +vuiParams->bit_rate_scale << std::endl;
872     oss << "cpb_size_scale = " << +vuiParams->cpb_size_scale << std::endl;
873 
874     // bit_rate_value_minus1 (32 in size)
875     for (uint8_t i = 0; i < 32; ++i)
876     {
877         oss << "bit_rate_value_minus1[" << +i << "] = " << +vuiParams->bit_rate_value_minus1[i] << std::endl;
878     }
879 
880     // cpb_size_value_minus1 (32 in size)
881     for (uint8_t i = 0; i < 32; ++i)
882     {
883         oss << "cpb_size_value_minus1[" << +i << "] = " << +vuiParams->cpb_size_value_minus1[i] << std::endl;
884     }
885 
886     oss << "cbr_flag = " << +vuiParams->cbr_flag << std::endl;
887     oss << "initial_cpb_removal_delay_length_minus1 = " << +vuiParams->initial_cpb_removal_delay_length_minus1 << std::endl;
888     oss << "cpb_removal_delay_length_minus1 = " << +vuiParams->cpb_removal_delay_length_minus1 << std::endl;
889     oss << "dpb_output_delay_length_minus1 = " << +vuiParams->dpb_output_delay_length_minus1 << std::endl;
890     oss << "time_offset_length = " << +vuiParams->time_offset_length << std::endl;
891 
892     const char *fileName = m_debugInterface->CreateFileName(
893         "_DDIEnc",
894         CodechalDbgBufferType::bufVuiParams,
895         CodechalDbgExtType::txt);
896 
897     std::ofstream ofs(fileName, std::ios::out);
898     ofs << oss.str();
899     ofs.close();
900 
901     if (m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrDriverUltDump))
902     {
903         if (!m_debugInterface->m_ddiFileName.empty())
904         {
905             std::ofstream ofs(m_debugInterface->m_ddiFileName, std::ios::app);
906             ofs << "VuiParamFile"
907                 << " = \"" << m_debugInterface->m_fileName << "\"" << std::endl;
908             ofs.close();
909         }
910     }
911 
912     return MOS_STATUS_SUCCESS;
913 }
914 
PopulateTargetUsage()915 MOS_STATUS AvcVdencPipeline::PopulateTargetUsage()
916 {
917     ENCODE_FUNC_CALL();
918 
919     const char *fileName = m_debugInterface->CreateFileName(
920         "EncodeSequence",
921         "EncodePar",
922         CodechalDbgExtType::par);
923 
924     auto basicFeature = dynamic_cast<AvcBasicFeature *>(m_featureManager->GetFeature(FeatureIDs::basicFeature));
925     ENCODE_CHK_NULL_RETURN(basicFeature);
926 
927     auto avcSeqParam = basicFeature->m_seqParam;
928     ENCODE_CHK_NULL_RETURN(avcSeqParam);
929 
930     std::ifstream ifs(fileName);
931     std::string   str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
932     ifs.close();
933     std::ofstream ofs(fileName, std::ios::trunc);
934     ofs << "TargetUsage = " << static_cast<uint32_t>(avcSeqParam->TargetUsage) << std::endl;
935     ofs << str;
936     ofs.close();
937 
938     return MOS_STATUS_SUCCESS;
939 }
940 
PopulateQuantPrecision()941 MOS_STATUS AvcVdencPipeline::PopulateQuantPrecision()
942 {
943     ENCODE_FUNC_CALL();
944 
945     const char *fileName = m_debugInterface->CreateFileName(
946         "EncodeSequence",
947         "EncodePar",
948         CodechalDbgExtType::par);
949 
950     std::ifstream ifs(fileName);
951     std::string   str((std::istreambuf_iterator<char>(ifs)), std::istreambuf_iterator<char>());
952     ifs.close();
953     std::ofstream ofs(fileName, std::ios::trunc);
954     ofs << "UsePrecisionDecreasingQT = 1" << std::endl;
955     ofs << str;
956     ofs.close();
957 
958     return MOS_STATUS_SUCCESS;
959 }
960 #endif
961 
962 }
963