xref: /aosp_15_r20/external/intel-media-driver/media_driver/agnostic/common/codec/hal/codechal_decode_hevc.h (revision ba62d9d3abf0e404f2022b4cd7a85e107f48596f)
1 /*
2 * Copyright (c) 2012-2017, 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     codechal_decode_hevc.h
24 //! \brief    Defines the decode interface extension for HEVC.
25 //! \details  Defines all types, macros, and functions required by CodecHal for HEVC decoding. Definitions are not externally facing.
26 //!
27 
28 #ifndef __CODECHAL_DECODER_HEVC_H__
29 #define __CODECHAL_DECODER_HEVC_H__
30 
31 #include "codechal.h"
32 #include "codechal_hw.h"
33 #include "codechal_decode_sfc_hevc.h"
34 #include "codechal_decoder.h"
35 
36 class CodechalDecodeNV12ToP010;
37 
38 typedef class CodechalDecodeHevc *PCODECHAL_DECODE_HEVC_STATE;
39 
40 typedef struct _CODECHAL_DECODE_HEVC_MV_LIST
41 {
42     uint8_t             u8FrameId;
43     bool                bInUse;
44     bool                bReUse;
45 } CODECHAL_DECODE_HEVC_MV_LIST, *PCODECHAL_DECODE_HEVC_MV_LIST;
46 
47 typedef struct
48 {
49     uint32_t    pic_width_in_min_cbs_y;
50     uint32_t    pic_height_in_min_cbs_y;
51     uint8_t     log2_min_luma_coding_block_size_minus3;
52     uint8_t     log2_diff_max_min_luma_coding_block_size;
53     uint16_t    chroma_format_idc                           : 2;  //!< range 0..3
54     uint16_t    separate_colour_plane_flag                  : 1;
55     uint16_t    bit_depth_luma_minus8                       : 4;
56     uint16_t    bit_depth_chroma_minus8                     : 4;
57     uint16_t    log2_max_pic_order_cnt_lsb_minus4           : 4;  //!< range 0..12
58     uint16_t    sample_adaptive_offset_enabled_flag         : 1;
59     uint8_t     num_short_term_ref_pic_sets;                      //!< range 0..64
60     uint8_t     long_term_ref_pics_present_flag             : 1;
61     uint8_t     num_long_term_ref_pics_sps                  : 6;  //!< range 0..32
62     uint8_t     sps_temporal_mvp_enable_flag                : 1;
63 
64     uint8_t     num_ref_idx_l0_default_active_minus1        : 4;  //!< range 0..15
65     uint8_t     num_ref_idx_l1_default_active_minus1        : 4;  //!< range 0..15
66     int8_t      pic_init_qp_minus26;                              //!< range -62..25
67     uint8_t     dependent_slice_segments_enabled_flag       : 1;
68     uint8_t     cabac_init_present_flag                     : 1;
69     uint8_t     pps_slice_chroma_qp_offsets_present_flag    : 1;
70     uint8_t     weighted_pred_flag                          : 1;
71     uint8_t     weighted_bipred_flag                        : 1;
72     uint8_t     output_flag_present_flag                    : 1;
73     uint8_t     tiles_enabled_flag                          : 1;
74     uint8_t     entropy_coding_sync_enabled_flag            : 1;
75     uint8_t     loop_filter_across_slices_enabled_flag      : 1;
76     uint8_t     deblocking_filter_override_enabled_flag     : 1;
77     uint8_t     pic_disable_deblocking_filter_flag          : 1;
78     uint8_t     lists_modification_present_flag             : 1;
79     uint8_t     slice_segment_header_extension_present_flag : 1;
80     uint8_t     high_precision_offsets_enabled_flag         : 1;
81     uint8_t     chroma_qp_offset_list_enabled_flag          : 1;
82     uint8_t                                                 : 1;
83 
84     int32_t     CurrPicOrderCntVal;
85     int32_t     PicOrderCntValList[CODEC_MAX_NUM_REF_FRAME_HEVC];
86     uint8_t     RefPicSetStCurrBefore[8];
87     uint8_t     RefPicSetStCurrAfter[8];
88     uint8_t     RefPicSetLtCurr[8];
89     uint16_t    RefFieldPicFlag;
90     uint16_t    RefBottomFieldFlag;
91     int8_t      pps_beta_offset_div2;
92     int8_t      pps_tc_offset_div2;
93     uint16_t    StRPSBits;
94 
95     uint8_t     num_tile_columns_minus1;
96     uint8_t     num_tile_rows_minus1;
97     uint16_t    column_width[HEVC_NUM_MAX_TILE_COLUMN];
98     uint16_t    row_height[HEVC_NUM_MAX_TILE_ROW];
99 
100     uint16_t    NumSlices;
101     uint8_t     num_extra_slice_header_bits;
102     int8_t      RefIdxMapping[CODEC_MAX_NUM_REF_FRAME_HEVC];
103 
104     struct
105     {
106         uint8_t     reserve_0;
107         uint16_t    reserve_1;
108         uint32_t    reserve_2;
109         uint32_t    reserve_3;
110     } reserve;
111 } HUC_HEVC_S2L_PIC_BSS, *PHUC_HEVC_S2L_PIC_BSS;
112 
113 typedef struct {
114     uint32_t    BSNALunitDataLocation;
115     uint32_t    SliceBytesInBuffer;
116 
117     struct
118     {
119         uint32_t    reserve_0;
120         uint32_t    reserve_1;
121         uint32_t    reserve_2;
122         uint32_t    reserve_3;
123     } reserve;
124 } HUC_HEVC_S2L_SLICE_BSS, *PHUC_HEVC_S2L_SLICE_BSS;
125 
126 typedef struct {
127     // Platfrom information
128     uint32_t                    ProductFamily;
129     uint16_t                    RevId;
130 
131     // Flag to indicate if create dummy HCP_REF_IDX_STATE or not
132     uint32_t                    DummyRefIdxState;
133 
134     // Picture level DMEM data
135     HUC_HEVC_S2L_PIC_BSS        PictureBss;
136 
137     // Slice level DMEM data
138     HUC_HEVC_S2L_SLICE_BSS      SliceBss[CODECHAL_HEVC_MAX_NUM_SLICES_LVL_6];
139 
140 } HUC_HEVC_S2L_BSS, *PHUC_HEVC_S2L_BSS;
141 
142 //!
143 //! \class    CodechalDecodeHevc
144 //! \brief    Codechal decode HEVC
145 //!
146 class CodechalDecodeHevc : public CodechalDecode
147 {
148 public:
149 
150     typedef struct
151     {
152         PMHW_VDBOX_PIPE_MODE_SELECT_PARAMS   PipeModeSelectParams;
153         PMHW_VDBOX_SURFACE_PARAMS            SurfaceParams;
154         PMHW_VDBOX_PIPE_BUF_ADDR_PARAMS      PipeBufAddrParams;
155         PMHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS  IndObjBaseAddrParams;
156         PMHW_VDBOX_QM_PARAMS                 QmParams;
157         PMHW_VDBOX_HEVC_PIC_STATE            HevcPicState;
158         PMHW_VDBOX_HEVC_TILE_STATE           HevcTileState;
159     } PIC_LONG_FORMAT_MHW_PARAMS;
160 
161     //!
162     //! \brief    Constructor
163     //! \param    [in] hwInterface
164     //!           Hardware interface
165     //! \param    [in] debugInterface
166     //!           Debug interface
167     //! \param    [in] standardInfo
168     //!           The information of decode standard for this instance
169     //!
170     CodechalDecodeHevc(
171         CodechalHwInterface   *hwInterface,
172         CodechalDebugInterface* debugInterface,
173         PCODECHAL_STANDARD_INFO standardInfo);
174 
175     //!
176     //! \brief    Copy constructor
177     //!
178     CodechalDecodeHevc(const CodechalDecodeHevc&) = delete;
179 
180     //!
181     //! \brief    Copy assignment operator
182     //!
183     CodechalDecodeHevc& operator=(const CodechalDecodeHevc&) = delete;
184 
185     //!
186     //! \brief    Destructor
187     //!
188     ~CodechalDecodeHevc ();
189 
190     //!
191     //! \brief    Allocate and initialize HEVC decoder standard
192     //! \param    [in] settings
193     //!           Pointer to CodechalSetting
194     //! \return   MOS_STATUS
195     //!           MOS_STATUS_SUCCESS if success, else fail reason
196     //!
197     MOS_STATUS  AllocateStandard (
198         CodechalSetting *settings) override;
199 
200     //!
201     //! \brief  Set states for each frame to prepare for HEVC decode
202     //! \return MOS_STATUS
203     //!         MOS_STATUS_SUCCESS if success, else fail reason
204     //!
205     MOS_STATUS  SetFrameStates () override;
206 
207     //!
208     //! \brief    HEVC decoder state level function
209     //! \details  State level function for HEVC decoder
210     //!
211     //! \return   MOS_STATUS
212     //!           MOS_STATUS_SUCCESS if success, else fail reason
213     //!
214     MOS_STATUS  DecodeStateLevel () override;
215 
216     //!
217     //! \brief    HEVC decoder primitive level function
218     //! \details  Primitive level function for GEN specific HEVC decoder
219     //!
220     //! \return   MOS_STATUS
221     //!           MOS_STATUS_SUCCESS if success, else fail reason
222     //!
223     MOS_STATUS  DecodePrimitiveLevel () override;
224 
225     //!
226     //! \brief    HEVC decoder downsampling calc function
227     //! \details  calc downsample param for GEN specific HEVC decoder
228     //!
229     //! \param    [in] picParams
230     //!           Pointer to picture parameters
231     //! \param    [out] refSurfWidth
232     //!           Pointer to reference surface width
233     //! \param    [out] refSurfHeight
234     //!           Pointer to reference surface height
235     //! \param    [out] format
236     //!           Pointer to MOS_FORMAT returned
237     //! \param    [out] frameIdx
238     //!           Pointer to frame index
239     //!
240     //! \return   MOS_STATUS
241     //!           MOS_STATUS_SUCCESS if success, else fail reason
242     //!
243     MOS_STATUS  CalcDownsamplingParams (
244         void                        *picParams,
245         uint32_t                    *refSurfWidth,
246         uint32_t                    *refSurfHeight,
247         MOS_FORMAT                  *format,
248         uint8_t                     *frameIdx) override;
249 
250     MOS_STATUS  InitMmcState() override;
251 
252     //!
253     //! \brief    Add S2L picture level commands to command buffer
254     //! \details  Add S2L picture level commands to command buffer in HEVC decode driver
255     //!
256     //! \param    [out] cmdBufferInUse
257     //!           Pointer to Command buffer
258     //!
259     //! \return   MOS_STATUS
260     //!           MOS_STATUS_SUCCESS if success, else fail reason
261     //!
262     MOS_STATUS          AddPictureS2LCmds(
263         PMOS_COMMAND_BUFFER             cmdBufferInUse);
264 
265     //!
266     //! \brief    Send S2L picture level commands
267     //! \details  Send S2L picture level commands in HEVC decode driver
268     //!
269     //! \return   MOS_STATUS
270     //!           MOS_STATUS_SUCCESS if success, else fail reason
271     //!
272     virtual MOS_STATUS  SendPictureS2L ();
273 
274     //!
275     //! \brief    Send S2L Slice level commands
276     //! \details  Send S2L Slice level commands in HEVC decode driver
277     //!
278     //! \param    [out] cmdBuffer
279     //!           Pointer to Command buffer
280     //! \param    [in] hevcSliceState
281     //!           Pointer to HEVC Slice State
282     //!
283     //! \return   MOS_STATUS
284     //!           MOS_STATUS_SUCCESS if success, else fail reason
285     //!
286     virtual MOS_STATUS  SendSliceS2L (
287         PMOS_COMMAND_BUFFER             cmdBuffer,
288         PMHW_VDBOX_HEVC_SLICE_STATE     hevcSliceState);
289 
290     //!
291     //! \brief    Get the Huc Dmem resource size
292     //! \details  Return the Huc Dmem resource size in bytes.
293     //!
294     //! \return   uint32_t
295     //!           the size of Dmem resource
296     //!
297     virtual uint32_t   GetDmemBufferSize();
298 
299     //!
300     //! \brief    Set S2L picture level Dmem parameters
301     //! \details  Set S2L HuC Dmem picture level paramters
302     //!
303     //! \param    [out] hucHevcS2LPicBss
304     //!           Pointer to S2L Dmem picture Bss paramters
305     //!
306     //! \return   MOS_STATUS
307     //!           MOS_STATUS_SUCCESS if success, else fail reason
308     //!
309     virtual MOS_STATUS SetHucDmemS2LPictureBss(
310         PHUC_HEVC_S2L_PIC_BSS           hucHevcS2LPicBss);
311 
312     //!
313     //! \brief    Set S2L Slice level Dmem parameters
314     //! \details  Set S2L HuC Dmem slice related paramters
315     //!
316     //! \param    [out] hucHevcS2LSliceBss
317     //!           Pointer to S2L Dmem Slice Bss paramters
318     //!
319     //! \return   MOS_STATUS
320     //!           MOS_STATUS_SUCCESS if success, else fail reason
321     //!
322     virtual MOS_STATUS SetHucDmemS2LSliceBss(
323         PHUC_HEVC_S2L_SLICE_BSS         hucHevcS2LSliceBss);
324 
325     //!
326     //! \brief    Setup HuC DMEM buffer
327     //! \details  Setup HuC DMEM buffer in HEVC decode driver
328     //!
329     //! \param    [in] dmemBuffer
330     //!           Pointer to HuC DMEM resource buffer
331     //!
332     //! \return   MOS_STATUS
333     //!           MOS_STATUS_SUCCESS if success, else fail reason
334     //!
335     virtual MOS_STATUS  SetHucDmemParams(
336         PMOS_RESOURCE               dmemBuffer);
337 
338     //!
339     //! \brief    Initialize the picture level MHW parameters for long format
340     //! \details  Initialize the picture level MHW parameters for long format in HEVC decode driver
341     //!
342     //! \return   MOS_STATUS
343     //!           MOS_STATUS_SUCCESS if success, else fail reason
344     //!
345     virtual MOS_STATUS  InitPicLongFormatMhwParams();
346 
347     //!
348     //! \brief    Add long format picture level commands to command buffer
349     //! \details  Add long format picture level commands to command buffer in HEVC decode driver
350     //!
351     //! \param    [out] cmdBufferInUse
352     //!           Pointer to Command buffer
353     //! \param    [in] picMhwParams
354     //!           Pointer to the picture level MHW parameters
355     //!
356     //! \return   MOS_STATUS
357     //!           MOS_STATUS_SUCCESS if success, else fail reason
358     //!
359     virtual MOS_STATUS AddPictureLongFormatCmds(
360         PMOS_COMMAND_BUFFER             cmdBufferInUse,
361         PIC_LONG_FORMAT_MHW_PARAMS      *picMhwParams);
362 
363     //!
364     //! \brief    Send long format picture level commands
365     //! \details  Send long format picture level commands in HEVC decode driver
366     //!
367     //! \return   MOS_STATUS
368     //!           MOS_STATUS_SUCCESS if success, else fail reason
369     //!
370     virtual MOS_STATUS  SendPictureLongFormat ();
371 
372     //!
373     //! \brief    Send long format Slice level commands
374     //! \details  Send long format Slice level commands in HEVC decode driver
375     //!
376     //! \param    [out] cmdBuffer
377     //!           Pointer to Command buffer
378     //! \param    [in] hevcSliceState
379     //!           Pointer to HEVC Slice State
380     //!
381     //! \return   MOS_STATUS
382     //!           MOS_STATUS_SUCCESS if success, else fail reason
383     //!
384     MOS_STATUS          SendSliceLongFormat (
385         PMOS_COMMAND_BUFFER             cmdBuffer,
386         PMHW_VDBOX_HEVC_SLICE_STATE     hevcSliceState);
387 
388     //!
389     //! \brief    Determine Decode Phase
390     //! \details  Determine decode phase in hevc decode
391     //!
392     //! \return   MOS_STATUS
393     //!           MOS_STATUS_SUCCESS if success, else fail reason
394     //!
395     MOS_STATUS          DetermineDecodePhase();
396 
397     //!
398     //! \brief    Set Picture Struct
399     //! \details  Set Picture Struct in HEVC decode driver
400     //!
401     //! \return   MOS_STATUS
402     //!           MOS_STATUS_SUCCESS if success, else fail reason
403     //!
404     MOS_STATUS          SetPictureStructs();
405 
406     //!
407     //! \brief    Concatenate the bitstreams and save them to locl buffer if multiple execution call
408     //! \details  Concatenate the bitstreams and save them to locl buffer if multiple execution call in HEVC decode driver
409     //!
410     //! \return   MOS_STATUS
411     //!           MOS_STATUS_SUCCESS if success, else fail reason
412     //!
413     MOS_STATUS          CheckAndCopyBitstream();
414 
415     //!
416     //! \brief    Copy bitstream to local buffer
417     //! \details  Copy bitstream to local buffer in HEVC decode driver
418     //!
419     //! \return   MOS_STATUS
420     //!           MOS_STATUS_SUCCESS if success, else fail reason
421     //!
422     MOS_STATUS          CopyDataSurface();
423 
424     //!
425     //! \brief    Initialize status for bitstream concatenating
426     //! \details  Initialize status for bitstream concatenating in HEVC decode driver
427     //!
428     //! \return   MOS_STATUS
429     //!           MOS_STATUS_SUCCESS if success, else fail reason
430     //!
431     MOS_STATUS          InitializeBitstreamCat ();
432 
433     //!
434     //! \brief    Get all tile information
435     //! \details  Get all tile information in HEVC decode driver
436     //!
437     //! \return   MOS_STATUS
438     //!           MOS_STATUS_SUCCESS if success, else fail reason
439     //!
440     MOS_STATUS          GetAllTileInfo();
441 
442     //!
443     //! \brief    Allocate variable sized resources
444     //! \details  Allocate variable sized resources in HEVC decode driver
445     //! \return   MOS_STATUS
446     //!           MOS_STATUS_SUCCESS if success, else fail reason
447     //!
448     MOS_STATUS          AllocateResourcesVariableSizes();
449 
450     //!
451     //! \brief    Allocate the MV Temporal buffer
452     //!
453     //! \param    [in] hevcMvBuffIndex
454     //!           buff index for unused mv buffer
455     //!
456     //! \return   MOS_STATUS
457     //!           MOS_STATUS_SUCCESS if success, else fail reason
458     //!
459     MOS_STATUS          AllocateMvTemporalBuffer(
460         uint8_t                       hevcMvBuffIndex);
461 
462     //!
463     //! \brief    Allocate fixed sized resources
464     //! \details  Allocate fixed sized resources HEVC decode driver
465     //! \return   MOS_STATUS
466     //!           MOS_STATUS_SUCCESS if success, else fail reason
467     //!
468     MOS_STATUS          AllocateResourcesFixedSizes();
469 
470     //!
471     //! \brief    Get mv buffer index
472     //! \details  Find out an unused MvBuffer and get hte mv buffer index in HEVC decode driver
473     //!
474     //! \param    [in] frameIdx
475     //!           frame idx associated with unused mv buffer
476     //!
477     //! \return   uint8_t
478     //!           MV buffer index if success, else return CODEC_NUM_HEVC_MV_BUFFERS
479     //!
480     uint8_t             GetMvBufferIndex(
481         uint8_t                         frameIdx);
482 
483 #if USE_CODECHAL_DEBUG_TOOL
484     MOS_STATUS DumpPicParams(
485         PCODEC_HEVC_PIC_PARAMS     picParams,
486         void*                      extPicParams);
487 
488     MOS_STATUS DumpSliceParams(
489         PCODEC_HEVC_SLICE_PARAMS     sliceParams,
490         void*                        extSliceParams,
491         uint32_t                     numSlices,
492         bool                         shortFormatInUse);
493 
494     MOS_STATUS DumpIQParams(
495         PCODECHAL_HEVC_IQ_MATRIX_PARAMS matrixData);
496 
497     MOS_STATUS DumpHucS2l(PMHW_VDBOX_HUC_DMEM_STATE_PARAMS hucDmemStateParams);
498 
499 #endif
500 
501     static const uint32_t  m_hucS2lKernelId = 1;             //!< VDBox Huc decode S2L kernel descriptoer
502 
503     // Parameters passed by application
504     uint32_t                        m_minCtbSize;                                    //!< Min Luma Coding Block Size
505     bool                            m_is10BitHevc;                                   //!< Indicate it is 10 bit HEVC
506     bool                            m_is12BitHevc;                                   //!< Indicate it is 12 bit HEVC
507     uint8_t                         m_chromaFormatinProfile;                         //!< Chrama format in profile
508     bool                            m_shortFormatInUse;                              //!< Indicate short format is inuse
509     uint32_t                        m_dataSize;                                      //!< Size of bitstream
510     uint32_t                        m_dataOffset;                                    //!< Offset of bitstream
511     uint32_t                        m_numSlices;                                     //!< Num of slices
512     PCODEC_HEVC_PIC_PARAMS          m_hevcPicParams;                                 //!< Pointer to HEVC picture parameter
513     PCODEC_HEVC_SLICE_PARAMS        m_hevcSliceParams;                               //!< Pointer to HEVC slice parameter
514     PCODECHAL_HEVC_IQ_MATRIX_PARAMS m_hevcIqMatrixParams;                            //!< Pointer to HEVC IQ matrix parameter
515     MOS_SURFACE                     m_destSurface;                                   //!< Handle of render surface
516     PMOS_RESOURCE                   m_presReferences[CODEC_MAX_NUM_REF_FRAME_HEVC];  //!< Pointer to Handle of Reference Frames
517     MOS_RESOURCE                    m_resDataBuffer;                                 //!< Handle of bitstream data surface
518 
519     bool        m_is8BitFrameIn10BitHevc;                                          //!< Indicate 8bit frame in 10bit HEVC stream
520     MOS_SURFACE m_internalNv12RtSurfaces[CODECHAL_NUM_INTERNAL_NV12_RT_HEVC];      //!< Handles of internal NV12 render target
521     uint32_t    m_internalNv12RtIndexMap[CODECHAL_NUM_UNCOMPRESSED_SURFACE_HEVC];  //!< Index map for internal NV12 render targets
522     bool        m_internalNv12RtIndexMapInitilized;                                //!< Indicate the index map of internal NV12 render targets is intialized
523     //! \brief Context for NV12ToP010 Kernel
524     CodechalDecodeNV12ToP010        *m_decodeNV12ToP010 = nullptr;
525 
526     //Track for several row store buffer's max picture width in MB used for buffer allocation in past frames
527     uint32_t m_mfdDeblockingFilterRowStoreScratchBufferPicWidth;  //!< max picture width for deblocking filter row store scratch buffer
528     uint32_t m_metadataLineBufferPicWidth;                        //!< max picture width for meta data line buffer
529     uint32_t m_saoLineBufferPicWidth;                             //!< max picture width for SAO line buffer
530 
531     // Internally maintained
532     MOS_RESOURCE     m_resMfdDeblockingFilterRowStoreScratchBuffer;     //!< Handle of MFD Deblocking Filter Row Store Scratch data surface
533     MOS_RESOURCE     m_resDeblockingFilterTileRowStoreScratchBuffer;    //!< Handle of Deblocking Filter Tile Row Store Scratch data surface
534     MOS_RESOURCE     m_resDeblockingFilterColumnRowStoreScratchBuffer;  //!< Handle of Deblocking Filter Column Row Store Scratch data surface
535     MOS_RESOURCE     m_resMetadataLineBuffer;                           //!< Handle of Metadata Line data buffer
536     MOS_RESOURCE     m_resMetadataTileLineBuffer;                       //!< Handle of Metadata Tile Line data buffer
537     MOS_RESOURCE     m_resMetadataTileColumnBuffer;                     //!< Handle of Metadata Tile Column data buffer
538     MOS_RESOURCE     m_resSaoLineBuffer;                                //!< Handle of SAO Line data buffer
539     MOS_RESOURCE     m_resSaoTileLineBuffer;                            //!< Handle of SAO Tile Line data buffer
540     MOS_RESOURCE     m_resSaoTileColumnBuffer;                          //!< Handle of SAO Tile Column data buffer
541     bool             m_mvBufferProgrammed;                              //!< Indicate mv buffer is programmed
542     MOS_RESOURCE     m_resMvTemporalBuffer[CODECHAL_NUM_UNCOMPRESSED_SURFACE_HEVC];  //!< Handles of MV Temporal data buffer, only use CODEC_NUM_HEVC_MV_BUFFERS normally
543     uint32_t         m_secondLevelBatchBufferIndex;
544     MHW_BATCH_BUFFER m_secondLevelBatchBuffer[CODEC_HEVC_NUM_SECOND_BB];//!< Handle of second level batch buffer
545     uint32_t         m_dmemBufferIdx;                                   //!< Indicate current idx of DMEM buffer to program
546     MOS_RESOURCE     m_resDmemBuffer[CODECHAL_HEVC_NUM_DMEM_BUFFERS];   //!< Handles of DMEM buffer
547     uint32_t         m_dmemBufferSize;                                  //!< Size of DMEM buffer
548     uint32_t         m_dmemTransferSize;                                //!< Transfer size of DMEM data
549     bool             m_dmemBufferProgrammed;                            //!< Indicate DMEM buffer is programmed
550     MOS_RESOURCE     m_resCopyDataBuffer;                               //!< Handle of copied bitstream buffer
551     uint32_t         m_copyDataBufferSize;                              //!< Size of copied bitstream buffer
552     uint32_t         m_copyDataOffset;                                  //!< Offset of copied bitstream
553     bool             m_copyDataBufferInUse;                             //!< Indicate copied bistream is inuse
554     uint32_t         m_estiBytesInBitstream;                            //!< Estimated size of bitstream
555 
556     MOS_RESOURCE m_resSyncObjectWaContextInUse;  //!< signals on the video WA context
557 
558     bool     m_curPicIntra;   //!< Indicate current picture is intra
559     uint32_t m_mvBufferSize;  //!< Size of MV buffer
560 
561     CODEC_PICTURE                m_currPic;                                              //!< Current Picture Struct
562     PCODEC_REF_LIST              m_hevcRefList[CODECHAL_NUM_UNCOMPRESSED_SURFACE_HEVC];  //!< Pointer to reference list
563     uint8_t                      m_hevcMvBufferIndex;                                    //!< Index of MV buffer for current picture
564     CODECHAL_DECODE_HEVC_MV_LIST m_hevcMvList[CODEC_NUM_HEVC_MV_BUFFERS];                //!< Status table of MV buffers
565     bool                         m_frameUsedAsCurRef[CODEC_MAX_NUM_REF_FRAME_HEVC];      //!< Indicate frames used as reference of current picture
566     int8_t                       m_refIdxMapping[CODEC_MAX_NUM_REF_FRAME_HEVC];          //!< Map table of indices of references
567     uint32_t                     m_frameIdx;                                             //!< Decode order index of current frame
568     bool                         m_enableSf2DmaSubmits;                                  //!< Indicate two DMA submits is enabled on short format
569 
570     uint16_t m_tileColWidth[HEVC_NUM_MAX_TILE_COLUMN];  //!< Table of tile column width
571     uint16_t m_tileRowHeight[HEVC_NUM_MAX_TILE_ROW];    //!< Table of tile row height
572 
573     uint32_t m_widthLastMaxAlloced;   //!< Max Picture Width used for buffer allocation in past frames
574     uint32_t m_heightLastMaxAlloced;  //!< Max Picture Height used for buffer allocation in past frames
575     uint32_t m_ctbLog2SizeYMax;       //!< Max CtbLog2 size used for buffer allocation in past frames
576 
577     uint32_t m_hcpDecPhase;  //!< HCP decode phase
578 
579 #ifdef _DECODE_PROCESSING_SUPPORTED
580     // SFC
581     CodechalHevcSfcState         *m_sfcState = nullptr;                                            //!< HEVC SFC State
582 #endif
583     PIC_LONG_FORMAT_MHW_PARAMS      m_picMhwParams;                                         //!< picture parameters
584 
585     bool                         m_dummyReferenceSlot[CODECHAL_MAX_CUR_NUM_REF_FRAME_HEVC];
586 
587     bool m_reportHucStatus = false;
588     bool m_reportHucCriticalError = false;
589 };
590 
591 #endif  // __CODECHAL_DECODER_HEVC_H__
592