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