blob: 507e375657cc545324ede5073f01ce69debf4bb9 [file] [log] [blame]
/*
* Copyright (c) 2021, Intel Corporation
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included
* in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
* OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
* OTHER DEALINGS IN THE SOFTWARE.
*/
//!
//! \file decode_huc_s2l_xe_m_base_packet.h
//! \brief Defines the implementation of huc S2L packet
//!
#ifndef __DECODE_HUC_S2L_XE_M_BASE_PACKET_H__
#define __DECODE_HUC_S2L_XE_M_BASE_PACKET_H__
#include "media_cmd_packet.h"
#include "decode_huc_g12_base.h"
#include "media_pipeline.h"
#include "codechal_hw.h"
#include "decode_utils.h"
#include "decode_hevc_pipeline.h"
#include "decode_hevc_basic_feature.h"
namespace decode
{
struct HucHevcS2lPicBssXe_M_Base
{
uint32_t pic_width_in_min_cbs_y;
uint32_t pic_height_in_min_cbs_y;
uint8_t log2_min_luma_coding_block_size_minus3;
uint8_t log2_diff_max_min_luma_coding_block_size;
uint16_t chroma_format_idc : 2; //!< range 0..3
uint16_t separate_colour_plane_flag : 1;
uint16_t bit_depth_luma_minus8 : 4;
uint16_t bit_depth_chroma_minus8 : 4;
uint16_t log2_max_pic_order_cnt_lsb_minus4 : 4; //!< range 0..12
uint16_t sample_adaptive_offset_enabled_flag : 1;
uint8_t num_short_term_ref_pic_sets; //!< range 0..64
uint8_t long_term_ref_pics_present_flag : 1;
uint8_t num_long_term_ref_pics_sps : 6; //!< range 0..32
uint8_t sps_temporal_mvp_enable_flag : 1;
uint8_t num_ref_idx_l0_default_active_minus1 : 4; //!< range 0..15
uint8_t num_ref_idx_l1_default_active_minus1 : 4; //!< range 0..15
int8_t pic_init_qp_minus26; //!< range -62..25
uint8_t dependent_slice_segments_enabled_flag : 1;
uint8_t cabac_init_present_flag : 1;
uint8_t pps_slice_chroma_qp_offsets_present_flag : 1;
uint8_t weighted_pred_flag : 1;
uint8_t weighted_bipred_flag : 1;
uint8_t output_flag_present_flag : 1;
uint8_t tiles_enabled_flag : 1;
uint8_t entropy_coding_sync_enabled_flag : 1;
uint8_t loop_filter_across_slices_enabled_flag : 1;
uint8_t deblocking_filter_override_enabled_flag : 1;
uint8_t pic_disable_deblocking_filter_flag : 1;
uint8_t lists_modification_present_flag : 1;
uint8_t slice_segment_header_extension_present_flag : 1;
uint8_t high_precision_offsets_enabled_flag : 1;
uint8_t chroma_qp_offset_list_enabled_flag : 1;
uint8_t : 1;
int32_t CurrPicOrderCntVal;
int32_t PicOrderCntValList[CODEC_MAX_NUM_REF_FRAME_HEVC];
uint8_t RefPicSetStCurrBefore[8];
uint8_t RefPicSetStCurrAfter[8];
uint8_t RefPicSetLtCurr[8];
uint16_t RefFieldPicFlag;
uint16_t RefBottomFieldFlag;
int8_t pps_beta_offset_div2;
int8_t pps_tc_offset_div2;
uint16_t StRPSBits;
uint8_t num_tile_columns_minus1;
uint8_t num_tile_rows_minus1;
uint16_t column_width[HEVC_NUM_MAX_TILE_COLUMN];
uint16_t row_height[HEVC_NUM_MAX_TILE_ROW];
uint16_t NumSlices;
uint8_t num_extra_slice_header_bits;
int8_t RefIdxMapping[CODEC_MAX_NUM_REF_FRAME_HEVC];
struct
{
uint8_t reserve_0;
uint16_t reserve_1;
uint32_t reserve_2;
uint32_t reserve_3;
} reserve;
};
struct HucHevcS2lSliceBssXe_M_Base
{
uint32_t BSNALunitDataLocation;
uint32_t SliceBytesInBuffer;
struct
{
uint32_t reserve_0;
uint32_t reserve_1;
uint32_t reserve_2;
uint32_t reserve_3;
} reserve;
};
class HucS2lPktXe_M_Base : public DecodeHucBasic_G12_Base
{
public:
HucS2lPktXe_M_Base(MediaPipeline *pipeline, MediaTask *task, CodechalHwInterface *hwInterface)
: DecodeHucBasic_G12_Base(pipeline, task, hwInterface)
{
if (pipeline != nullptr)
{
m_statusReport = pipeline->GetStatusReportInstance();
m_hevcPipeline = dynamic_cast<HevcPipeline *>(pipeline);
}
}
virtual ~HucS2lPktXe_M_Base() {}
//!
//! \brief Initialize the media packet, allocate required resources
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS Init() override;
//!
//! \brief Prepare interal parameters, should be invoked for each frame
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS Prepare() override;
//!
//! \brief Calculate Command Size
//!
//! \param [in, out] commandBufferSize
//! requested size
//! \param [in, out] requestedPatchListSize
//! requested size
//! \return MOS_STATUS
//! status
//!
virtual MOS_STATUS CalculateCommandSize(
uint32_t &commandBufferSize,
uint32_t &requestedPatchListSize) override;
//!
//! \brief Get Packet Name
//! \return std::string
//!
virtual std::string GetPacketName() override
{
return "S2L";
}
protected:
//!
//! \brief Calculate Command Buffer Size
//!
//! \return uint32_t
//! Command buffer size calculated
//!
virtual uint32_t CalculateCommandBufferSize();
//!
//! \brief Calculate Patch List Size
//!
//! \return uint32_t
//! Patchlist size calculated
//!
virtual uint32_t CalculatePatchListSize();
virtual void SetImemParameters(MHW_VDBOX_HUC_IMEM_STATE_PARAMS &imemParams) override;
virtual MOS_STATUS AddHucImem(MOS_COMMAND_BUFFER &cmdBuffer) override;
virtual void SetHucPipeModeSelectParameters(MHW_VDBOX_PIPE_MODE_SELECT_PARAMS &pipeModeSelectParams) override;
virtual void SetDmemParameters(MHW_VDBOX_HUC_DMEM_STATE_PARAMS &dmemParams) override;
virtual MOS_STATUS AddHucDmem(MOS_COMMAND_BUFFER &cmdBuffer) override;
virtual void SetRegionParameters(MHW_VDBOX_HUC_VIRTUAL_ADDR_PARAMS &virtualAddrParams) override;
virtual MOS_STATUS AddHucRegion(MOS_COMMAND_BUFFER &cmdBuffer) override;
virtual void SetIndObjParameters(MHW_VDBOX_IND_OBJ_BASE_ADDR_PARAMS &indObjParams) override;
virtual MOS_STATUS AddHucIndObj(MOS_COMMAND_BUFFER &cmdBuffer) override;
virtual void SetStreamObjectParameters(MHW_VDBOX_HUC_STREAM_OBJ_PARAMS &streamObjParams,
CODEC_HEVC_SLICE_PARAMS &sliceParams) override;
virtual MOS_STATUS AddHucStreamObject(MOS_COMMAND_BUFFER &cmdBuffer, CODEC_HEVC_SLICE_PARAMS &sliceParams) override;
virtual MOS_STATUS SetHucDmemPictureBss(HucHevcS2lPicBssXe_M_Base &hucHevcS2LPicBss);
virtual MOS_STATUS SetHucDmemSliceBss(
HucHevcS2lSliceBssXe_M_Base (&hucHevcS2LSliceBss)[CODECHAL_HEVC_MAX_NUM_SLICES_LVL_6]);
MOS_STATUS AddHucCpState(MOS_COMMAND_BUFFER &cmdBuffer, uint32_t index, CODEC_HEVC_SLICE_PARAMS &sliceParams);
#if USE_CODECHAL_DEBUG_TOOL
virtual MOS_STATUS DumpHucS2l();
#endif
static constexpr uint32_t m_vdboxHucHevcS2lKernelDescriptor = 1; //!< Huc HEVC S2L kernel descriptor
HevcPipeline * m_hevcPipeline = nullptr; //!< Pointer to hevc pipeline
HevcBasicFeature * m_hevcBasicFeature = nullptr; //!< Pointer to hevc basic feature
PCODEC_HEVC_PIC_PARAMS m_hevcPicParams = nullptr; //!< Pointer to picture parameter
PCODEC_HEVC_EXT_PIC_PARAMS m_hevcRextPicParams = nullptr; //!< Extended pic params for Rext
PCODEC_HEVC_SLICE_PARAMS m_hevcSliceParams = nullptr; //!< Pointer to slice parameter
PCODEC_HEVC_SCC_PIC_PARAMS m_hevcSccPicParams = nullptr; //!< Pic params for SCC
MOS_BUFFER* m_s2lDmemBuffer = nullptr; //!< Resource of current DMEM buffer
uint32_t m_dmemBufferSize = 0; //!< Size of DMEM buffer
uint32_t m_dmemTransferSize = 0; //!< Transfer size of current DMEM buffer
uint32_t m_pictureStatesSize = 0;
uint32_t m_picturePatchListSize = 0;
uint32_t m_sliceStatesSize = 0;
uint32_t m_slicePatchListSize = 0;
MEDIA_CLASS_DEFINE_END(HucS2lPktXe_M_Base)
};
} // namespace decode
#endif