1 /* 2 * Copyright (c) 2018-2021, 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 decode_avc_pipeline.cpp 24 //! \brief Defines the interface for avc decode pipeline 25 //! 26 #include "decode_avc_pipeline.h" 27 #include "decode_utils.h" 28 #include "media_user_settings_mgr_g12.h" 29 #include "codechal_setting.h" 30 #include "decode_avc_feature_manager.h" 31 #include "decode_huc_packet_creator.h" 32 33 namespace decode 34 { AvcPipeline(CodechalHwInterface * hwInterface,CodechalDebugInterface * debugInterface)35 AvcPipeline::AvcPipeline( 36 CodechalHwInterface * hwInterface, 37 CodechalDebugInterface *debugInterface) 38 : DecodePipeline(hwInterface, debugInterface) 39 { 40 41 } 42 Initialize(void * settings)43 MOS_STATUS AvcPipeline::Initialize(void *settings) 44 { 45 DECODE_FUNC_CALL(); 46 DECODE_CHK_STATUS(DecodePipeline::Initialize(settings)); 47 48 m_basicFeature = dynamic_cast<AvcBasicFeature*>(m_featureManager->GetFeature(FeatureIDs::basicFeature)); 49 DECODE_CHK_NULL(m_basicFeature); 50 51 // Create basic GPU context 52 DecodeScalabilityPars scalPars; 53 MOS_ZeroMemory(&scalPars, sizeof(scalPars)); 54 DECODE_CHK_STATUS(m_mediaContext->SwitchContext(VdboxDecodeFunc, &scalPars, &m_scalability)); 55 m_decodeContext = m_osInterface->pfnGetGpuContext(m_osInterface); 56 57 auto *codecSettings = (CodechalSetting*)settings; 58 DECODE_CHK_NULL(codecSettings); 59 m_intelEntrypointInUse = (codecSettings->intelEntrypointInUse) ? true : false; 60 m_shortFormatInUse = (codecSettings->shortFormatInUse) ? true : false; 61 62 HucPacketCreatorBase *hucPktCreator = dynamic_cast<HucPacketCreatorBase *>(this); 63 DECODE_CHK_NULL(hucPktCreator); 64 m_formatMonoPicPkt = hucPktCreator->CreateHucCopyPkt(this, m_task, m_hwInterface); 65 DECODE_CHK_NULL(m_formatMonoPicPkt); 66 MediaPacket *packet = dynamic_cast<MediaPacket *>(m_formatMonoPicPkt); 67 DECODE_CHK_NULL(packet); 68 DECODE_CHK_STATUS(RegisterPacket(DecodePacketId(this, avcFormatMonoPicPktId), packet)); 69 DECODE_CHK_STATUS(packet->Init()); 70 71 return MOS_STATUS_SUCCESS; 72 } 73 LinearToYTiledAddress(uint32_t x,uint32_t y,uint32_t pitch)74 static uint32_t LinearToYTiledAddress( 75 uint32_t x, 76 uint32_t y, 77 uint32_t pitch) 78 { 79 uint32_t tileW = 128; 80 uint32_t tileH = 32; 81 82 uint32_t tileSize = tileW * tileH; 83 84 uint32_t rowSize = (pitch / tileW) * tileSize; 85 86 uint32_t xOffWithinTile = x % tileW; 87 uint32_t yOffWithinTile = y % tileH; 88 89 uint32_t tileNumberInX = x / tileW; 90 uint32_t tileNumberInY = y / tileH; 91 92 uint32_t tileOffset = 93 rowSize * tileNumberInY + 94 tileSize * tileNumberInX + 95 tileH * 16 * (xOffWithinTile / 16) + 96 yOffWithinTile * 16 + 97 (xOffWithinTile % 16); 98 99 return tileOffset; 100 } 101 Prepare(void * params)102 MOS_STATUS AvcPipeline::Prepare(void *params) 103 { 104 DECODE_FUNC_CALL(); 105 DECODE_CHK_NULL(params); 106 107 DECODE_CHK_STATUS(DecodePipeline::Prepare(params)); 108 109 if (m_basicFeature->m_avcPicParams->seq_fields.chroma_format_idc == avcChromaFormatMono) 110 { 111 uint32_t height = m_basicFeature->m_destSurface.dwHeight; 112 uint32_t pitch = m_basicFeature->m_destSurface.dwPitch; 113 uint32_t chromaHeight = height >> 1; 114 uint32_t frameHeight = MOS_ALIGN_CEIL(height, 16); 115 uint32_t alignedFrameHeight = MOS_ALIGN_CEIL(frameHeight, MOS_YTILE_H_ALIGNMENT); 116 uint32_t frameSize = pitch * MOS_ALIGN_CEIL((frameHeight + chromaHeight), MOS_YTILE_H_ALIGNMENT); 117 118 uint32_t uvblockHeight = CODECHAL_MACROBLOCK_HEIGHT; 119 uint32_t uvrowSize = pitch * uvblockHeight * 2; 120 uint32_t dstOffset = 0, x = 0, uvsize = 0; 121 122 //update decode output surface's cpTag before decode submitbuffer, pfnMediaCopyResource2D can decide clear/secure workload by output surface's cptag. 123 if (m_osInterface->osCpInterface && m_osInterface->osCpInterface->IsHMEnabled()) 124 { 125 DECODE_CHK_STATUS(m_osInterface->osCpInterface->SetResourceEncryption(&m_basicFeature->m_destSurface.OsResource, true)); 126 } 127 128 HucCopyPktItf::HucCopyParams copyParams = {}; 129 130 if (frameHeight % MOS_YTILE_H_ALIGNMENT) 131 { 132 dstOffset = LinearToYTiledAddress(x, frameHeight, pitch); 133 134 if (!m_basicFeature->m_usingVeRing) 135 { 136 copyParams.srcBuffer = &(m_basicFeature->m_resMonoPicChromaBuffer->OsResource); 137 copyParams.srcOffset = 0; 138 copyParams.destBuffer = &(m_basicFeature->m_destSurface.OsResource); 139 copyParams.destOffset = dstOffset; 140 copyParams.copyLength = uvrowSize; 141 m_formatMonoPicPkt->PushCopyParams(copyParams); 142 } 143 else 144 { 145 m_osInterface->pfnMediaCopyResource2D( 146 m_osInterface, 147 &m_basicFeature->m_resMonoPicChromaBuffer->OsResource, 148 &m_basicFeature->m_destSurface.OsResource, 149 pitch, 150 uvblockHeight * 2, 151 0, 152 dstOffset, 153 16, 154 false); 155 } 156 } 157 158 dstOffset = m_basicFeature->m_destSurface.UPlaneOffset.iSurfaceOffset; 159 uvsize = frameSize - pitch * alignedFrameHeight; 160 161 if (!m_basicFeature->m_usingVeRing) 162 { 163 copyParams.srcBuffer = &(m_basicFeature->m_resMonoPicChromaBuffer->OsResource); 164 copyParams.srcOffset = 0; 165 copyParams.destBuffer = &(m_basicFeature->m_destSurface.OsResource); 166 copyParams.destOffset = dstOffset; 167 copyParams.copyLength = uvsize; 168 m_formatMonoPicPkt->PushCopyParams(copyParams); 169 } 170 else 171 { 172 m_osInterface->pfnMediaCopyResource2D( 173 m_osInterface, 174 &m_basicFeature->m_resMonoPicChromaBuffer->OsResource, 175 &m_basicFeature->m_destSurface.OsResource, 176 pitch, 177 uvsize / pitch, 178 0, 179 dstOffset, 180 16, 181 false); 182 } 183 } 184 185 return MOS_STATUS_SUCCESS; 186 } 187 UserFeatureReport()188 MOS_STATUS AvcPipeline::UserFeatureReport() 189 { 190 DECODE_FUNC_CALL(); 191 DECODE_CHK_STATUS(DecodePipeline::UserFeatureReport()); 192 #if (_DEBUG || _RELEASE_INTERNAL) 193 WriteUserFeature(__MEDIA_USER_FEATURE_VALUE_APOGEIOS_AVCD_ENABLE_ID, 1, m_osInterface->pOsContext); 194 #endif 195 return MOS_STATUS_SUCCESS; 196 } 197 Uninitialize()198 MOS_STATUS AvcPipeline::Uninitialize() 199 { 200 DECODE_FUNC_CALL(); 201 202 return DecodePipeline::Uninitialize(); 203 } 204 ActivateDecodePackets()205 MOS_STATUS AvcPipeline::ActivateDecodePackets() 206 { 207 DECODE_FUNC_CALL(); 208 209 bool immediateSubmit = false; 210 211 if (m_basicFeature->m_avcPicParams->seq_fields.chroma_format_idc == avcChromaFormatMono && !m_basicFeature->m_usingVeRing) 212 { 213 DECODE_CHK_STATUS(ActivatePacket(DecodePacketId(this, avcFormatMonoPicPktId), immediateSubmit, 0, 0)); 214 } 215 216 for (uint8_t curPass = 0; curPass < GetPassNum(); curPass++) 217 { 218 DECODE_CHK_STATUS(ActivatePacket(DecodePacketId(this, avcDecodePacketId), immediateSubmit, curPass, 0)); 219 } 220 221 return MOS_STATUS_SUCCESS; 222 } 223 CreateFeatureManager()224 MOS_STATUS AvcPipeline::CreateFeatureManager() 225 { 226 DECODE_FUNC_CALL(); 227 m_featureManager = MOS_New(DecodeAvcFeatureManager, m_allocator, m_hwInterface); 228 DECODE_CHK_NULL(m_featureManager); 229 return MOS_STATUS_SUCCESS; 230 } 231 CreateSubPackets(DecodeSubPacketManager & subPacketManager,CodechalSetting & codecSettings)232 MOS_STATUS AvcPipeline::CreateSubPackets(DecodeSubPacketManager& subPacketManager, CodechalSetting &codecSettings) 233 { 234 DECODE_FUNC_CALL(); 235 236 DECODE_CHK_STATUS(DecodePipeline::CreateSubPackets(subPacketManager, codecSettings)); 237 238 return MOS_STATUS_SUCCESS; 239 } 240 GetDecodeMode()241 AvcPipeline::AvcDecodeMode AvcPipeline::GetDecodeMode() 242 { 243 return m_decodeMode; 244 } 245 IsShortFormat()246 bool AvcPipeline::IsShortFormat() 247 { 248 return m_shortFormatInUse; 249 } 250 251 #if USE_CODECHAL_DEBUG_TOOL DumpPicParams(PCODEC_AVC_PIC_PARAMS picParams)252 MOS_STATUS AvcPipeline::DumpPicParams( 253 PCODEC_AVC_PIC_PARAMS picParams) 254 { 255 DECODE_FUNC_CALL(); 256 257 if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrPicParams)) 258 { 259 return MOS_STATUS_SUCCESS; 260 } 261 262 CODECHAL_DEBUG_CHK_NULL(picParams); 263 264 std::ostringstream oss; 265 oss.setf(std::ios::showbase | std::ios::uppercase); 266 267 oss << "CurrPic FrameIdx: " << std::dec << +picParams->CurrPic.FrameIdx << std::endl; 268 oss << "CurrPic PicFlags: " << std::hex << +picParams->CurrPic.PicFlags << std::endl; 269 270 //Dump RefFrameList[15] 271 for (uint8_t i = 0; i < 15; ++i) 272 { 273 oss << "RefFrameList[" << std::dec << +i << "] FrameIdx:" << +picParams->RefFrameList[i].FrameIdx << std::endl; 274 oss << "RefFrameList[" << +i << "] PicFlags:" << std::hex << +picParams->RefFrameList[i].PicFlags << std::endl; 275 } 276 277 oss << "pic_width_in_mbs_minus1: " << std::dec << +picParams->pic_width_in_mbs_minus1 << std::endl; 278 oss << "pic_height_in_mbs_minus1: " << +picParams->pic_height_in_mbs_minus1 << std::endl; 279 oss << "bit_depth_luma_minus8: " << +picParams->bit_depth_luma_minus8 << std::endl; 280 oss << "bit_depth_chroma_minus8: " << +picParams->bit_depth_chroma_minus8 << std::endl; 281 oss << "num_ref_frames: " << +picParams->num_ref_frames << std::endl; 282 oss << "CurrFieldOrderCnt: " << +picParams->CurrFieldOrderCnt[0] << std::endl; 283 oss << "CurrFieldOrderCnt: " << +picParams->CurrFieldOrderCnt[1] << std::endl; 284 285 //Dump FieldOrderCntList (16x2) 286 for (uint8_t i = 0; i < 2; ++i) 287 { 288 oss << "FieldOrderCntList[" << +i << "]:"; 289 for (uint8_t j = 0; j < 16; j++) 290 oss << +picParams->FieldOrderCntList[j][i] << " "; 291 oss << std::endl; 292 } 293 294 //Dump seq_fields 295 oss << "seq_fields value: " << +picParams->seq_fields.value << std::endl; 296 oss << "chroma_format_idc: " << +picParams->seq_fields.chroma_format_idc << std::endl; 297 oss << "residual_colour_transform_flag: " << std::hex << +picParams->seq_fields.residual_colour_transform_flag << std::endl; 298 oss << "frame_mbs_only_flag: " << std::hex << +picParams->seq_fields.frame_mbs_only_flag << std::endl; 299 oss << "mb_adaptive_frame_field_flag: " << std::hex << +picParams->seq_fields.mb_adaptive_frame_field_flag << std::endl; 300 oss << "direct_8x8_inference_flag: " << std::hex << +picParams->seq_fields.direct_8x8_inference_flag << std::endl; 301 oss << "log2_max_frame_num_minus4: " << std::dec << +picParams->seq_fields.log2_max_frame_num_minus4 << std::endl; 302 oss << "pic_order_cnt_type: " << +picParams->seq_fields.pic_order_cnt_type << std::endl; 303 oss << "log2_max_pic_order_cnt_lsb_minus4: " << +picParams->seq_fields.log2_max_pic_order_cnt_lsb_minus4 << std::endl; 304 oss << "delta_pic_order_always_zero_flag: " << std::hex << +picParams->seq_fields.delta_pic_order_always_zero_flag << std::endl; 305 oss << "num_slice_groups_minus1:" << std::dec << +picParams->num_slice_groups_minus1 << std::endl; 306 oss << "slice_group_map_type:" << std::dec << +picParams->slice_group_map_type << std::endl; 307 oss << "slice_group_change_rate_minus1:" << std::dec << +picParams->slice_group_change_rate_minus1 << std::endl; 308 oss << "pic_init_qp_minus26:" << std::dec << +picParams->pic_init_qp_minus26 << std::endl; 309 oss << "chroma_qp_index_offset:" << std::dec << +picParams->chroma_qp_index_offset << std::endl; 310 oss << "second_chroma_qp_index_offset:" << std::dec << +picParams->second_chroma_qp_index_offset << std::endl; 311 312 //Dump pic_fields 313 oss << "pic_fields value: " << std::dec << +picParams->pic_fields.value << std::endl; 314 oss << "entropy_coding_mode_flag: " << std::hex << +picParams->pic_fields.entropy_coding_mode_flag << std::endl; 315 oss << "weighted_pred_flag: " << std::hex << +picParams->pic_fields.weighted_pred_flag << std::endl; 316 oss << "weighted_bipred_idc: " << std::dec << +picParams->pic_fields.weighted_bipred_idc << std::endl; 317 oss << "transform_8x8_mode_flag: " << std::hex << +picParams->pic_fields.transform_8x8_mode_flag << std::endl; 318 oss << "field_pic_flag: " << std::hex << +picParams->pic_fields.field_pic_flag << std::endl; 319 oss << "constrained_intra_pred_flag: " << std::hex << +picParams->pic_fields.constrained_intra_pred_flag << std::endl; 320 oss << "pic_order_present_flag: " << std::hex << +picParams->pic_fields.pic_order_present_flag << std::endl; 321 oss << "deblocking_filter_control_present_flag: " << std::hex << +picParams->pic_fields.deblocking_filter_control_present_flag << std::endl; 322 oss << "redundant_pic_cnt_present_flag: " << std::hex << +picParams->pic_fields.redundant_pic_cnt_present_flag << std::endl; 323 oss << "reference_pic_flag: " << std::hex << +picParams->pic_fields.reference_pic_flag << std::endl; 324 oss << "IntraPicFlag: " << std::hex << +picParams->pic_fields.IntraPicFlag << std::endl; 325 326 //Dump Short format specific 327 oss << "num_ref_idx_l0_active_minus1: " << std::dec << +picParams->num_ref_idx_l0_active_minus1 << std::endl; 328 oss << "num_ref_idx_l1_active_minus1: " << std::dec << +picParams->num_ref_idx_l1_active_minus1 << std::endl; 329 oss << "NonExistingFrameFlags: " << std::hex << +picParams->NonExistingFrameFlags << std::endl; 330 oss << "UsedForReferenceFlags: " << std::hex << +picParams->UsedForReferenceFlags << std::endl; 331 oss << "frame_num: " << std::dec << +picParams->frame_num << std::endl; 332 oss << "StatusReportFeedbackNumber: " << std::dec << +picParams->StatusReportFeedbackNumber << std::endl; 333 334 //Dump FrameNumList[16] 335 oss << "scaling_list_present_flag_buffer:"; 336 for (uint8_t i = 0; i < 16; i++) 337 oss << std::hex << picParams->FrameNumList[i]; 338 oss << std::endl; 339 340 const char *fileName = m_debugInterface->CreateFileName( 341 "_DEC", 342 CodechalDbgBufferType::bufPicParams, 343 CodechalDbgExtType::txt); 344 345 std::ofstream ofs(fileName, std::ios::out); 346 ofs << oss.str(); 347 ofs.close(); 348 return MOS_STATUS_SUCCESS; 349 } 350 DumpSliceParams(PCODEC_AVC_SLICE_PARAMS sliceParams,uint32_t numSlices)351 MOS_STATUS AvcPipeline::DumpSliceParams( 352 PCODEC_AVC_SLICE_PARAMS sliceParams, 353 uint32_t numSlices) 354 { 355 DECODE_FUNC_CALL(); 356 357 if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrSlcParams)) 358 { 359 return MOS_STATUS_SUCCESS; 360 } 361 362 CODECHAL_DEBUG_CHK_NULL(sliceParams); 363 364 PCODEC_AVC_SLICE_PARAMS sliceControl = nullptr; 365 366 std::ostringstream oss; 367 oss.setf(std::ios::showbase | std::ios::uppercase); 368 369 for (uint16_t j = 0; j < numSlices; j++) 370 { 371 sliceControl = &sliceParams[j]; 372 373 oss << "Data for Slice number = " << std::dec << +j << std::endl; 374 oss << "slice_data_size: " << std::dec << +sliceControl->slice_data_size << std::endl; 375 oss << "slice_data_offset: " << std::dec << +sliceControl->slice_data_offset << std::endl; 376 //Dump Long format specific 377 oss << "slice_data_bit_offset: " << std::dec << +sliceControl->slice_data_bit_offset << std::endl; 378 oss << "first_mb_in_slice: " << std::dec << +sliceControl->first_mb_in_slice << std::endl; 379 oss << "NumMbsForSlice: " << std::dec << +sliceControl->NumMbsForSlice << std::endl; 380 oss << "slice_type: " << std::dec << +sliceControl->slice_type << std::endl; 381 oss << "direct_spatial_mv_pred_flag: " << std::hex << +sliceControl->direct_spatial_mv_pred_flag << std::endl; 382 oss << "num_ref_idx_l0_active_minus1: " << std::dec << +sliceControl->num_ref_idx_l0_active_minus1 << std::endl; 383 oss << "num_ref_idx_l1_active_minus1: " << std::dec << +sliceControl->num_ref_idx_l1_active_minus1 << std::endl; 384 oss << "cabac_init_idc: " << std::dec << +sliceControl->cabac_init_idc << std::endl; 385 oss << "slice_qp_delta: " << std::dec << +sliceControl->slice_qp_delta << std::endl; 386 oss << "disable_deblocking_filter_idc: " << std::dec << +sliceControl->disable_deblocking_filter_idc << std::endl; 387 oss << "slice_alpha_c0_offset_div2: " << std::dec << +sliceControl->slice_alpha_c0_offset_div2 << std::endl; 388 oss << "slice_beta_offset_div2: " << std::dec << +sliceControl->slice_beta_offset_div2 << std::endl; 389 390 //Dump RefPicList[2][32] 391 for (uint8_t i = 0; i < 32; ++i) 392 { 393 oss << "RefPicList[0][" << std::dec << +i << "] FrameIdx: " << std::dec << +sliceControl->RefPicList[0][i].FrameIdx << std::endl; 394 oss << "RefPicList[0][" << std::dec << +i << "] PicFlags: " << std::hex << +sliceControl->RefPicList[0][i].PicFlags << std::endl; 395 oss << "RefPicList[1][" << std::dec << +i << "] FrameIdx: " << std::dec << +sliceControl->RefPicList[1][i].FrameIdx << std::endl; 396 oss << "RefPicList[1][" << std::dec << +i << "] PicFlags: " << std::hex << +sliceControl->RefPicList[1][i].PicFlags << std::endl; 397 } 398 399 oss << "luma_log2_weight_denom: " << std::dec << +sliceControl->luma_log2_weight_denom << std::endl; 400 oss << "chroma_log2_weight_denom: " << std::dec << +sliceControl->chroma_log2_weight_denom << std::endl; 401 oss << "slice_id: " << std::dec << +sliceControl->slice_id << std::endl; 402 403 //Dump Weights[2][32][3][2] 404 for (uint8_t i = 0; i < 32; ++i) 405 { 406 oss << "Weights[0][" << std::dec << +i << "][0][0]: " << std::hex << +sliceControl->Weights[0][i][0][0] << std::endl; 407 oss << "Weights[0][" << std::dec << +i << "][0][1]: " << std::hex << +sliceControl->Weights[0][i][0][1] << std::endl; 408 oss << "Weights[0][" << std::dec << +i << "][1][0]: " << std::hex << +sliceControl->Weights[0][i][1][0] << std::endl; 409 oss << "Weights[0][" << std::dec << +i << "][1][1]: " << std::hex << +sliceControl->Weights[0][i][1][1] << std::endl; 410 oss << "Weights[1][" << std::dec << +i << "][0][0]: " << std::hex << +sliceControl->Weights[1][i][0][0] << std::endl; 411 oss << "Weights[1][" << std::dec << +i << "][0][1]: " << std::hex << +sliceControl->Weights[1][i][0][1] << std::endl; 412 oss << "Weights[1][" << std::dec << +i << "][1][0]: " << std::hex << +sliceControl->Weights[1][i][1][0] << std::endl; 413 oss << "Weights[1][" << std::dec << +i << "][1][1]: " << std::hex << +sliceControl->Weights[1][i][1][1] << std::endl; 414 oss << "Weights[0][" << std::dec << +i << "][2][0]: " << std::hex << +sliceControl->Weights[0][i][2][0] << std::endl; 415 oss << "Weights[0][" << std::dec << +i << "][2][1]: " << std::hex << +sliceControl->Weights[0][i][2][1] << std::endl; 416 oss << "Weights[1][" << std::dec << +i << "][2][0]: " << std::hex << +sliceControl->Weights[1][i][2][0] << std::endl; 417 oss << "Weights[1][" << std::dec << +i << "][2][1]: " << std::hex << +sliceControl->Weights[1][i][2][1] << std::endl; 418 } 419 420 const char *fileName = m_debugInterface->CreateFileName( 421 "_DEC", 422 CodechalDbgBufferType::bufSlcParams, 423 CodechalDbgExtType::txt); 424 425 std::ofstream ofs; 426 if (j == 0) 427 { 428 ofs.open(fileName, std::ios::out); 429 } 430 else 431 { 432 ofs.open(fileName, std::ios::app); 433 } 434 ofs << oss.str(); 435 ofs.close(); 436 } 437 438 return MOS_STATUS_SUCCESS; 439 } 440 DumpIQParams(PCODEC_AVC_IQ_MATRIX_PARAMS matrixData)441 MOS_STATUS AvcPipeline::DumpIQParams( 442 PCODEC_AVC_IQ_MATRIX_PARAMS matrixData) 443 { 444 DECODE_FUNC_CALL(); 445 446 if (!m_debugInterface->DumpIsEnabled(CodechalDbgAttr::attrIqParams)) 447 { 448 return MOS_STATUS_SUCCESS; 449 } 450 451 CODECHAL_DEBUG_CHK_NULL(matrixData); 452 453 std::ostringstream oss; 454 oss.setf(std::ios::showbase | std::ios::uppercase); 455 456 uint32_t idx, idx2; 457 // 4x4 block 458 for (idx2 = 0; idx2 < 6; idx2++) 459 { 460 oss << "Qmatrix_H264_ScalingLists4x4[" << std::dec << +idx2 << "]:" << std::endl; 461 for (idx = 0; idx < 12; idx += 4) 462 { 463 oss << "ScalingList4x4[" << std::dec << +idx / 4 << "]:"; 464 oss << std::hex << +matrixData->ScalingList4x4[idx2][idx] << " "; 465 oss << std::hex << +matrixData->ScalingList4x4[idx2][idx + 1] << " "; 466 oss << std::hex << +matrixData->ScalingList4x4[idx2][idx + 2] << " "; 467 oss << std::hex << +matrixData->ScalingList4x4[idx2][idx + 3] << " "; 468 oss << std::endl; 469 } 470 oss << std::endl; 471 } 472 // 8x8 block 473 for (idx2 = 0; idx2 < 2; idx2++) 474 { 475 oss << "Qmatrix_H264_ScalingLists8x8[" << std::dec << +idx2 << "]:" << std::endl; 476 for (idx = 0; idx < 56; idx += 8) 477 { 478 oss << "ScalingList8x8[" << std::dec << +idx / 8 << "]:"; 479 oss << std::hex << +matrixData->ScalingList8x8[idx2][idx] << " " ; 480 oss << std::hex << +matrixData->ScalingList8x8[idx2][idx + 1] << " " ; 481 oss << std::hex << +matrixData->ScalingList8x8[idx2][idx + 2] << " " ; 482 oss << std::hex << +matrixData->ScalingList8x8[idx2][idx + 3] << " " ; 483 oss << std::hex << +matrixData->ScalingList8x8[idx2][idx + 4] << " " ; 484 oss << std::hex << +matrixData->ScalingList8x8[idx2][idx + 5] << " " ; 485 oss << std::hex << +matrixData->ScalingList8x8[idx2][idx + 6] << " " ; 486 oss << std::hex << +matrixData->ScalingList8x8[idx2][idx + 7] << " " ; 487 oss << std::endl; 488 } 489 oss << std::endl; 490 } 491 492 const char *fileName = m_debugInterface->CreateFileName( 493 "_DEC", 494 CodechalDbgBufferType::bufIqParams, 495 CodechalDbgExtType::txt); 496 497 std::ofstream ofs(fileName, std::ios::out); 498 ofs << oss.str(); 499 ofs.close(); 500 501 return MOS_STATUS_SUCCESS; 502 } 503 504 #endif 505 } 506