blob: e8f3898218b7d525e2de8504241a2daed7458de3 [file]
/*
* Copyright (c) 2018-2023, 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 encode_parameter.h
//! \brief Defines the common interface for encode parameter
//!
#ifndef __ENCODE_BASIC_FEATURE_H__
#define __ENCODE_BASIC_FEATURE_H__
#include "codec_hw_next.h"
#include "codec_def_encode.h"
#include "codechal_setting.h"
#include "encode_tracked_buffer.h"
#include "encode_recycle_resource.h"
#include "media_feature.h"
#include "mhw_vdbox.h"
namespace encode
{
class EncodeBasicFeature:public MediaFeature
{
public:
EncodeBasicFeature(EncodeAllocator *allocator,
CodechalHwInterfaceNext *hwInterface,
TrackedBuffer *trackedBuf,
RecycleResource *recycleBuf);
virtual ~EncodeBasicFeature() { }
//!
//! \brief Init encode parameter
//! \param [in] setting
//! Pointer to CodechalSetting
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS Init(void *setting);
//!
//! \brief Update encode basic feature
//! \param [in] params
//! Pointer to EncoderParams
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS Update(void *params);
//!
//! \brief Update encode basic format
//! \param [in] params
//! Pointer to EncoderParams
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS UpdateFormat(void *params);
//!
//! \brief Reset encode basic feature.
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS Reset(CODEC_REF_LIST *refList);
//!
//! \brief Get the waTable
//! \return The active WA table
//!
MEDIA_WA_TABLE *GetWaTable() { return m_osInterface? m_osInterface->pfnGetWaTable(m_osInterface):nullptr; }
virtual uint32_t GetProfileLevelMaxFrameSize() = 0;
static constexpr uint32_t m_vdencBrcPassNum = 3; //!< Vdenc Brc Number of passes
static constexpr uint32_t m_uncompressedSurfaceNum = 127; //!< Hevc/Av1 uncompressed surface number, 7 bits, 0x7f is invalid one
static constexpr uint32_t m_sizeOfHcpPakFrameStats = 9 * CODECHAL_CACHELINE_SIZE; //!> Size of HEVC PAK frame statistics
static constexpr uint32_t m_hevcPakStatsSSEOffset = 32;
static constexpr uint32_t m_codecHalHevcNumPakSliceBatchBuffers = 3;
uint32_t m_frameWidth = 0; //!< Frame width in luma samples
uint32_t m_frameHeight = 0; //!< Frame height in luma samples
uint32_t m_frameFieldHeight = 0; //!< Frame height in luma samples
uint32_t m_oriFrameHeight = 0; //!< Original frame height
uint32_t m_oriFrameWidth = 0; //!< Original frame width
uint16_t m_frame_crop_bottom_offset = 0; //!< frame_crop_bottom_offset
uint16_t m_frame_mbs_only_flag = 0; //!< frame_mbs_only_flag
uint16_t m_frame_cropping_flag = 0; //!< frame_cropping_flag
uint16_t m_picWidthInMb = 0; //!< Picture Width in MB width count
uint16_t m_picHeightInMb = 0; //!< Picture Height in MB height count
uint16_t m_frameFieldHeightInMb = 0; //!< Frame/field Height in MB
uint32_t m_downscaledWidthInMb4x = 0; //!< Downscale width in Mb 4x
uint32_t m_downscaledHeightInMb4x = 0; //!< Downscale height in Mb 4x
CODEC_PICTURE m_currOriginalPic = {}; //!< Raw.
CODEC_PICTURE m_currReconstructedPic = {}; //!< RECON.
uint16_t m_pictureCodingType = 0; //!< I, P, or B frame
uint32_t m_frameNum = 0; //!< Frame number
bool m_firstField = true; //!< Flag to indicate if it is first field
bool m_resolutionChanged = false; //!< Flag to indicate if resolution is changed
uint32_t m_standard = 0; //!< The encode state's standard
uint32_t m_mode = 0; //!< The encode mode
CODECHAL_FUNCTION m_codecFunction = CODECHAL_FUNCTION_INVALID; //!< The encode state's codec function used
PCODECHAL_NAL_UNIT_PARAMS *m_nalUnitParams = nullptr; //!< The encode nal unit
uint32_t m_NumNalUnits = 0; //!< Number of NAL units in ppNALUnitParams.
bool m_panicEnable = false; //!< Indicate if panic is enabled
bool m_newSeqHeader = false; //!< New sequence header flag
bool m_newPpsHeader = false; //!< New PPS header flag
bool m_newVuiData = false; //!< New VUI data flag
bool m_newSeq = false; //!< New sequence flag
bool m_lastPicInSeq = false; //!< Flag to indicate if it is last picture in sequence
bool m_lastPicInStream = false; //!< Flag to indicate if it is last picture in stream
bool m_picQuant = false; //!< picture quant
bool m_newQmatrixData = false; //!< New Qmatrix data
PCODEC_ENCODER_SLCDATA m_slcData = nullptr; //!< record slice header size & position
uint32_t m_numSlices = 0; //!< Number of slices
uint32_t m_mbDataBufferSize = 0;
TrackedBuffer *m_trackedBuf = nullptr; //!< Encode tracked buffer
RecycleResource *m_recycleBuf = nullptr; //!< Recycle resources
uint32_t m_mbCodeSize = 0; //!< MB code buffer size
uint32_t m_mvDataSize = 0; //!< MV data size
PMOS_RESOURCE m_resMbCodeBuffer = nullptr; //!< Pointer to MOS_RESOURCE of MbCode buffer
PMOS_RESOURCE m_resMvDataBuffer = nullptr; //!< Pointer to MOS_RESOURCE of MvData buffer
bool m_isMbCodeRegistered = false;
uint32_t m_downscaledWidth4x = 0;
uint32_t m_downscaledHeight4x = 0;
PMOS_SURFACE m_4xDSSurface = nullptr;
PMOS_SURFACE m_8xDSSurface = nullptr;
PMOS_SURFACE m_rawSurfaceToPak = nullptr;
PMOS_SURFACE m_rawSurfaceToEnc = nullptr; //!< raw surf to enc
MOS_SURFACE m_rawSurface = {}; //!< Pointer to MOS_SURFACE of raw surface
MOS_SURFACE m_reconSurface = {}; //!< Pointer to MOS_SURFACE of reconstructed surface
MOS_RESOURCE m_resBitstreamBuffer = {}; //!< Pointer to MOS_SURFACE of bitstream surface
PMOS_RESOURCE m_resMetadataBuffer = nullptr;
MetaDataOffset m_metaDataOffset = {};
BSBuffer m_bsBuffer = {}; //!< Bit-stream buffer
uint32_t m_bitstreamSize = 0; //!< Maximum amount of data to be output to presBitstreamBuffer.
bool m_mbQpDataEnabled = false; //!< [AVC & MPEG2] Indicates that psMbQpDataSurface is present.
bool m_mbDisableSkipMapEnabled = false; //!< [AVC] Indicates that psMbDisableSkipMapSurface is present.
MOS_SURFACE m_mbDisableSkipMapSurface = {}; //!< [AVC] MB disable skip map provided by framework
MOS_SURFACE m_mbQpDataSurface = {}; //!< pointer to surface of Mb QP Data
bool m_rgbEncodingEnable = false; //!< Enable RGB encoding
bool m_captureModeEnable = false; //!< Enable Capture mode with display
bool m_predicationNotEqualZero = false; //!< [Predication] Predication mode
bool m_predicationEnabled = false; //!< [Predication] Indicates whether or not Predication is enabled
bool m_setMarkerEnabled = false; //!< [SetMarker] Indicates whether or not SetMarker is enabled
uint64_t m_predicationResOffset = 0; //!< [Predication] Offset for Predication resource
PMOS_RESOURCE m_presPredication = nullptr; //!< [Predication] Resource for predication
PMOS_RESOURCE *m_tempPredicationBuffer = nullptr; //!< [Predication] Temp buffer for Predication
PMOS_RESOURCE m_predicationBuffer = nullptr; //!< [Predication] Internal buffer for predication
uint8_t m_targetUsage =0;
uint8_t m_chromaFormat = HCP_CHROMA_FORMAT_YUV420; //!< Chroma format(420, 422 etc)
uint8_t m_bitDepth = 8; //!< Bit depth
bool m_is10Bit = false;
uint8_t m_outputChromaFormat = (uint8_t)HCP_CHROMA_FORMAT_YUV420; //!< 1: 420 2: 422 3: 444
uint32_t m_currPakSliceIdx = 0; //!< Current pak slice index
bool m_enableTileStitchByHW = false; //!< Enable HW to stitch commands in scalable mode
bool m_lockableResource = false; //!< disable / enable lockable surface
uint8_t m_par65Inter = 0;
uint8_t m_par65Intra = 0;
/*! \brief Specifies motion search modes that will be used.
*
* SubPelMode is only valid when bEnableSubPelMode is true. Following are valid values of SubPelMode:
* 0:Integer mode searching
* 1:Half-pel mode searching
* 2:Reserved
* 3:Quarter-pel mode searching
*/
bool m_bEnableSubPelMode = false;
uint8_t m_SubPelMode = 3;
bool m_dualEncEnable = false;
protected:
//!
//! \brief Update the parameters of tracked buffers
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS UpdateTrackedBufferParameters();
//!
//! \brief Get the buffers from tracked buffer manager
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS GetTrackedBuffers() { return MOS_STATUS_SUCCESS; }
EncodeAllocator *m_allocator = nullptr;
MOS_INTERFACE *m_osInterface = nullptr;
MEDIA_CLASS_DEFINE_END(encode__EncodeBasicFeature)
};
} // namespace encode
#endif // !__ENCODE_BASIC_FEATURE_H__