/*
* 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     vp_feature_manager.h
//! \brief    Defines the common interface for vp features manager
//! \details  The vp manager is further sub-divided by vp type
//!           this file is for the base interface which is shared by all components.
//!
#ifndef __VP_FEATURE_MANAGER_H__
#define __VP_FEATURE_MANAGER_H__

#include "media_feature_manager.h"
#include "vp_utils.h"
#include "vp_pipeline_common.h"
#include "vp_allocator.h"
#include "vp_obj_factories.h"

namespace vp
{
class SwFilterFeatureHandler;
class VpResourceManager;

class VPFeatureManager : public MediaFeatureManager
{
public:
    //!
    //! \brief  VPFeatureManager constructor
    //! \param  [in] hwInterface
    //!         Pointer to VP_MHWINTERFACE
    //! \param  [in] pOsInterface
    //!         Pointer to MOS INTERFACE
    //!
    VPFeatureManager(PVP_MHWINTERFACE hwInterface);

    //!
    //! \brief  VPFeatureManager deconstructor
    //!
    virtual ~VPFeatureManager() {}

    //!
    //! \brief  Check the conflict between features
    //! \param  [in] params
    //!         encode parameters
    //! \return MOS_STATUS
    //!         MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS CheckFeatures(void *params, bool &bapgFuncSupported);

    //!
    //! \brief  Check the conflict between features
    //! \param  [in] params
    //!         encode parameters
    //! \return MOS_STATUS
    //!         MOS_STATUS_SUCCESS if success, else fail reason
    //!
    virtual MOS_STATUS CheckFeatures(void *params);

protected:
    //!
    //! \brief    Check if HDR are needed
    //! \param    [in] pSrc
    //!           Pointer to input surface of Vebox
    //! \param    [in] pRenderTarget
    //!           Pointer to Render targe surface of VPP BLT
    //! \return   bool
    //!           return true if 2 Passes CSC is needed, otherwise false
    //!
    virtual bool IsHdrNeeded(
        PVPHAL_SURFACE              pSrc,
        PVPHAL_SURFACE              pRenderTarget);

    //!
    //! \brief    Check if 2 passes CSC are needed
    //! \param    [in] pSrc
    //!           Pointer to input surface of Vebox
    //! \param    [in] pRenderTarget
    //!           Pointer to Render targe surface of VPP BLT
    //! \return   bool
    //!           return true if 2 Passes CSC is needed, otherwise false
    //!
    virtual bool Is2PassesCSCNeeded(
        PVPHAL_SURFACE              pSrc,
        PVPHAL_SURFACE              pRenderTarget);

    virtual bool IsVeboxOutFeasible(PVP_PIPELINE_PARAMS params);

    virtual bool IsVeboxInputFormatSupport(PVPHAL_SURFACE pSrcSurface);

    virtual bool IsVeboxRTFormatSupport(
        PVPHAL_SURFACE pSrcSurface,
        PVPHAL_SURFACE pRTSurface);

    virtual bool IsSfcOutputFeasible(PVP_PIPELINE_PARAMS params);

    virtual bool IsOutputFormatSupported(
        PVPHAL_SURFACE              outSurface);

    //!
    //! \brief    Get the aligned the surface height and width unit
    //! \details  According to the format of the surface, get the aligned unit for the surface
    //!           width and height
    //! \param    [in,out] pwWidthAlignUnit
    //!           Pointer to the surface width alignment unit
    //! \param    [in,out] pwHeightAlignUnit
    //!           Pointer to the surface height alignment unit
    //! \param    [in] format
    //!           The format of the surface
    //! \return   void
    //!
    virtual void GetAlignUnit(
        uint16_t        &wWidthAlignUnit,
        uint16_t        &wHeightAlignUnit,
        MOS_FORMAT      format);

    //!
    //! \brief    Align the src/dst surface rectangle and surface width/height
    //! \details  The surface rects and width/height need to be aligned according to the surface format
    //! \param    [in,out] pSurface
    //!           Pointer to the surface
    //! \param    [in] formatForDstRect
    //!           Format for Dst Rect
    //! \return   MOS_STATUS
    //!           Return MOS_STATUS_SUCCESS if successful, otherwise failed
    //!
    virtual MOS_STATUS RectSurfaceAlignment(
        PVPHAL_SURFACE       pSurface,
        MOS_FORMAT           formatForDstRect);

    virtual bool IsSfcInterlacedScalingSupported()
    {
        return false;
    }

    virtual bool IsDiFormatSupported(MOS_FORMAT format);

protected:
    PVP_MHWINTERFACE        m_hwInterface       = nullptr;
    PMOS_INTERFACE          m_pOsInterface      = nullptr;
};

class VpFeatureManagerNext : public MediaFeatureManager
{
public:
    VpFeatureManagerNext(VpInterface& vpInterface);
    virtual ~VpFeatureManagerNext();

    virtual MOS_STATUS Init(void* settings) override;
    virtual MOS_STATUS InitPacketPipe(SwFilterPipe& swFilterPipe,
        PacketPipe& packetPipe);

    //!
    //! \brief    Check whether VEBOX-SFC Format Supported
    //! \details  Check whether VEBOX-SFC Format Supported.
    //! \param    inputFormat
    //!           [in] Format of Input Frame
    //! \param    outputFormat
    //!           [in] Format of Output Frame
    //! \return   bool
    //!           Return true if supported, otherwise failed
    //!
    bool IsVeboxSfcFormatSupported(MOS_FORMAT formatInput, MOS_FORMAT formatOutput);

protected:
    MOS_STATUS CreateHwFilterPipe(SwFilterPipe& swFilterPipe, HwFilterPipe*& pHwFilterPipe);
    MOS_STATUS UpdateResources(HwFilterPipe& hwFilterPipe);

    virtual MOS_STATUS RegisterFeatures();
    MOS_STATUS UnregisterFeatures();

    VpInterface         & m_vpInterface;
    Policy              * m_policy = nullptr;
    std::map<FeatureType, SwFilterFeatureHandler*> m_featureHandler;
    uint32_t           m_isFeatureRegistered = false;
};
}
#endif // !__VP_FEATURE_MANAGER_H__
