blob: b4a48d2628639e84a1c783e8810bc96503221cc5 [file] [log] [blame]
/*
* Copyright (c) 2019, 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_basic_feature.h
//! \brief Defines the common interface for decode badic feature
//! \details The decode basic feature interface is further sub-divided by codec standard,
//! this file is for the base interface which is shared by all codecs.
//!
#ifndef __DECODE_BASIC_FEATURE_H__
#define __DECODE_BASIC_FEATURE_H__
#include "codec_def_decode.h"
#include "decode_allocator.h"
#include "media_feature.h"
#include "codechal_hw.h"
#include "codechal_setting.h"
namespace decode {
class DecodeBasicFeature: public MediaFeature
{
public:
DecodeBasicFeature(DecodeAllocator *allocator, CodechalHwInterface *hwInterface);
virtual ~DecodeBasicFeature();
//!
//! \brief Init decode basic 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 decode basic feature
//! \param [in] params
//! Pointer to DecoderParams
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS Update(void *params);
//!
//! \brief Update decode dest surface
//! \param [in] destSurface
//! Decode render target from DDI
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS UpdateDestSurface(MOS_SURFACE &destSurface);
#ifdef _MMC_SUPPORTED
//!
//! \brief Set MMC state
//! \param [in] isMmcEnabled
//! Flag to indicate if the MMC is enabled
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
MOS_STATUS SetMmcState(bool isMmcEnabled)
{
m_isMmcEnabled = isMmcEnabled;
return MOS_STATUS_SUCCESS;
}
#endif
//!
//! \brief Get MMC state
//! \return bool
//! Return true if MMC enabled
//!
bool IsMmcEnabled()
{
#ifdef _MMC_SUPPORTED
return m_isMmcEnabled;
#else
return false;
#endif
}
uint32_t m_width = 0; //!< Frame width in luma samples
uint32_t m_height = 0; //!< Frame height in luma samples
uint16_t m_picWidthInMb = 0; //!< Picture Width in MB width count
uint16_t m_picHeightInMb = 0; //!< Picture Height in MB height count
uint32_t m_frameNum = 0; //!< Frame number, inc by each codec pipeline
bool m_secondField = false; //!< Indicates if current field is second field(bottom field)
uint16_t m_pictureCodingType = 0; //!< I, P, B or mixed frame
CODEC_PICTURE m_curRenderPic = {0}; //!< picture information of current render target
CODECHAL_STANDARD m_standard = CODECHAL_UNDEFINED; //!< Decode standard
CODECHAL_MODE m_mode = CODECHAL_UNSUPPORTED_MODE; //!< Decode mode
CODECHAL_FUNCTION m_codecFunction = CODECHAL_FUNCTION_INVALID; //!< Decode function
HCP_CHROMA_FORMAT_IDC m_chromaFormat = HCP_CHROMA_FORMAT_YUV420; //!< Chroma format(420, 422 etc)
uint8_t m_bitDepth = 8; //!< Bit depth
bool m_is10Bit = false;
uint32_t m_numSlices = 0; //!< [VLD mode] Number of slices to be decoded
MOS_SURFACE m_destSurface; //!< Decode render target
MOS_BUFFER m_resDataBuffer; //!< Decode input bitstream
uint32_t m_dataOffset = 0;
uint32_t m_dataSize = 0; //!< Size of the bitstream required on this picture
PMOS_SURFACE m_refFrameSurface = nullptr; //!< Handle of reference frame surface
uint32_t m_refSurfaceNum = 0; //!< Number of reference frame surface
bool m_reportFrameCrc = false; //!< Flag to indicate if report frame CRC
bool m_disableDecodeSyncLock = false; //!< Indicates if decode sync lock is disabled
bool m_setMarkerEnabled = false; //!< [SetMarker] Indicates whether or not SetMarker is enabled
PMOS_RESOURCE m_presSetMarker = nullptr; //!< [SetMarker] Resource for SetMarker
bool m_useDummyReference = false; //!< Indicates if use dummy reference
MOS_SURFACE m_dummyReference; //!< Dummy reference surface
CODECHAL_DUMMY_REFERENCE_STATUS m_dummyReferenceStatus = CODECHAL_DUMMY_REFERENCE_INVALID; //!< Indicate the status of dummy reference
constexpr static uint8_t m_invalidFrameIndex = 0xff; //!< Invalid frame index
constexpr static uint8_t m_maxFrameIndex = CODECHAL_NUM_UNCOMPRESSED_SURFACE_HEVC; //!< Max frame index
protected:
//!
//! \brief Set required bitstream size by each codec
//! \param [in] requiredSize
//! required size for current frame
//! \return MOS_STATUS
//! MOS_STATUS_SUCCESS if success, else fail reason
//!
virtual MOS_STATUS SetRequiredBitstreamSize(uint32_t requiredSize) = 0;
CodechalHwInterface * m_hwInterface = nullptr;
DecodeAllocator * m_allocator = nullptr;
#ifdef _MMC_SUPPORTED
bool m_isMmcEnabled = false; //!< Indicate MMC enabled for current picture
#endif
MEDIA_CLASS_DEFINE_END(DecodeBasicFeature)
};
}//decode
#endif // !__DECODE_BASIC_FEATURE_H__