blob: 54458095b3091e5666c8325f0388e1d390ae7039 [file] [log] [blame]
/*
* Copyright (c) 2020-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 media_sfc_interface.h
//! \brief Common interface and structure used in sfc interface
//! \details Common interface and structure used in sfc interface which are platform independent
//!
#ifndef __MEDIA_SFC_INTERFACE_H__
#define __MEDIA_SFC_INTERFACE_H__
#include "mos_os_specific.h"
#include "codec_def_decode_jpeg.h"
#include "media_common_defs.h"
class MediaSfcRender;
class MediaMemComp;
struct VEBOX_SFC_PARAMS
{
// Input
struct
{
PMOS_SURFACE surface;
MEDIA_CSPACE colorSpace; //!< Color Space
uint32_t chromaSiting; //!< ChromaSiting
RECT rcSrc; //!< rectangle on input surface before scaling.
MEDIA_ROTATION rotation; //!< rotation setting
} input;
// Output
struct
{
PMOS_SURFACE surface;
MEDIA_CSPACE colorSpace; //!< Color Space
uint32_t chromaSiting; //!< ChromaSiting
RECT rcDst; //!< rectangle on output surface after scaling.
} output;
};
struct SCALABILITY_PARAMS
{
int32_t numPipe = 1; //!< Number of pipes for scalability
int32_t curPipe = 0; //!< Current pipe index
// Scalability parameters for HCP-to-SFC mode
uint32_t engineMode = 0; //!< 0 - single, 1 - left most column, 2 - right most column, 3 - middle column
uint32_t tileType = 0; //!< Real tile = 0, virtual tile = 1
uint32_t srcStartX = 0; //!< Source surface column horizontal start position in pixel
uint32_t srcEndX = 0; //!< Source surface column horizontal end position in pixel
uint32_t dstStartX = 0; //!< Output surface column horizontal start position in pixel
uint32_t dstEndX = 0; //!< Output surface column horizontal end position in pixel
};
struct FIELD_PARAMS
{
bool isFieldToInterleaved = false; //!< true if input being field frame and output being interlaved frame.
bool isBottomField = false; //!< true if input frame being bottom field. Valid only when true == isFieldToInterleaved.
bool isBottomFirst = false; //!< true if output frame being interlaved frame with bottom first.
//!< Valid only when true == isFieldToInterleaved.
};
struct VIDEO_PARAMS
{
CODECHAL_STANDARD codecStandard;
union
{
struct
{
CodecDecodeJpegChromaType jpegChromaType;
} jpeg;
struct
{
bool deblockingEnabled;
} avc, vp8;
struct
{
uint32_t lcuSize;
} hevc;
struct
{
uint32_t lcuSize;
bool lossless;
bool superResInuse;
bool intraBC;
uint32_t tileCols;
uint32_t tileRows;
} av1;
};
FIELD_PARAMS fieldParams = {};
// scalability parameters
SCALABILITY_PARAMS scalabilityParams = {};
};
struct VDBOX_SFC_PARAMS
{
// Input
struct
{
uint32_t width; //!< Effective width of SFC input, which may
//!< be smaller than frame width.
uint32_t height; //!< Effective height of SFC input, which may
//!< be smaller than frame height.
MOS_FORMAT format; //!< Format of SFC input
MEDIA_CSPACE colorSpace; //!< Color Space
uint32_t chromaSiting; //!< ChromaSiting
bool mirrorEnabled; //!< Is mirror needed.
} input;
// Output
struct
{
PMOS_SURFACE surface;
PMOS_BUFFER histogramBuf; //!< Histogram output buffer
MEDIA_CSPACE colorSpace; //!< Color Space
uint32_t chromaSiting; //!< ChromaSiting
RECT rcDst; //!< rectangle on output surface after scaling.
} output;
VIDEO_PARAMS videoParams; //!< standard related params.
CODECHAL_SCALING_MODE scalingMode;
};
union MEDIA_SFC_INTERFACE_MODE
{
struct
{
uint32_t veboxSfcEnabled : 1;
uint32_t vdboxSfcEnabled : 1;
};
uint32_t value = 3;
};
class MediaSfcInterface
{
public:
//!
//! \brief MediaSfcInterface constructor
//! \details Initialize the MediaSfcInterface members.
//! \param osInterface
//! [in] Pointer to MOS_INTERFACE.
//! \param mmc
//! [in] Pointer to MediaMemComp.
//!
MediaSfcInterface(PMOS_INTERFACE osInterface, MediaMemComp *mmc = nullptr);
virtual ~MediaSfcInterface();
virtual void Destroy();
//!
//! \brief Check whether the Parameter for VDBOX-SFC supported
//! \details Only valid when MEDIA_SFC_INTERFACE_MODE::vdboxSfcEnabled being 1.
//! \param param
//! [in] Pointer to VDBOX_SFC_PARAMS.
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if supported, otherwise failed
//!
MOS_STATUS IsParameterSupported(VDBOX_SFC_PARAMS &param);
//!
//! \brief Check whether the Parameter for VEBOX-SFC supported
//! \details Only valid when MEDIA_SFC_INTERFACE_MODE::veboxSfcEnabled being 1.
//! \param param
//! [in] Pointer to VEBOX_SFC_PARAMS.
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if supported, otherwise failed
//!
MOS_STATUS IsParameterSupported(VEBOX_SFC_PARAMS &param);
//!
//! \brief Render Vdbox-SFC States
//! \details Only valid when MEDIA_SFC_INTERFACE_MODE::vdboxSfcEnabled being 1.
//! \param cmdBuffer
//! [in/out] Command Buffer to be Filled.
//! \param param
//! [in] Pointer to VDBOX_SFC_PARAMS.
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if supported, otherwise failed
//!
MOS_STATUS Render(MOS_COMMAND_BUFFER *cmdBuffer, VDBOX_SFC_PARAMS &param);
//!
//! \brief Render Vebox-SFC States
//! \details Only valid when MEDIA_SFC_INTERFACE_MODE::veboxSfcEnabled being 1.
//! \param param
//! [in] Pointer to VEBOX_SFC_PARAMS.
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if supported, otherwise failed
//!
MOS_STATUS Render(VEBOX_SFC_PARAMS &param);
//!
//! \brief MediaSfcInterface initialize
//! \details Initialize the MediaSfcInterface.
//! \param mode
//! [in] 1: VEBOX-SFC only, 2: VDBOX-SFC only, 3: Both VEBOX-SFC and VDBOX-SFC.
//! \return MOS_STATUS
//! Return MOS_STATUS_SUCCESS if successful, otherwise failed
//!
virtual MOS_STATUS Initialize(MEDIA_SFC_INTERFACE_MODE mode);
protected:
PMOS_INTERFACE m_osInterface = nullptr;
MediaSfcRender *m_sfcRender = nullptr;
MediaMemComp *m_mmc = nullptr;
};
#endif // __MEDIA_SFC_INTERFACE_H__