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