blob: 361fb7c79ada4135010669371e3857bb07b67335 [file] [log] [blame]
/*
* Copyright (c) 2017-2020, 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_ddi_decode_base.h
//! \brief Defines base class for DDI media decoder.
//!
#ifndef _MEDIA_DDI_DEC_BASE_H_
#define _MEDIA_DDI_DEC_BASE_H_
#include <stdint.h>
#include <va/va.h>
#include "media_ddi_base.h"
#include "decode_pipeline_adapter.h"
struct DDI_DECODE_CONTEXT;
struct DDI_MEDIA_CONTEXT;
struct DDI_DECODE_CONFIG_ATTR;
struct _CODECHAL_STANDARD_INFO;
class CodechalSetting;
//!
//! \class DdiMediaDecode
//! \brief Ddi media decode
//!
class DdiMediaDecode : public DdiMediaBase
{
public:
//!
//! \brief Constructor
//!
DdiMediaDecode(DDI_DECODE_CONFIG_ATTR *ddiDecodeAttr);
//!
//! \brief Destructor
//!
virtual ~DdiMediaDecode()
{
MOS_FreeMemory(m_ddiDecodeAttr);
m_ddiDecodeAttr = nullptr;
MOS_Delete(m_codechalSettings);
m_codechalSettings = nullptr;
#ifdef _DECODE_PROCESSING_SUPPORTED
MOS_FreeMemory(m_procBuf);
m_procBuf = nullptr;
#endif
}
//! \brief the type conversion to get the DDI_DECODE_CONTEXT
inline operator DDI_DECODE_CONTEXT *()
{
return m_ddiDecodeCtx;
}
//!
//! \brief Free the allocated resource related with the decode context
//! \details Free the private resource related with the decode context.
//! For example: DecodeParams, CodecHal and so on.
//!
//! \param [in] ctx
//! VADriverContextP
//!
virtual void DestroyContext(VADriverContextP ctx);
//!
//! \brief Get ready to decoding process for a target surface
//! \details It begins the decoding process for a specified target surface
//!
//! \param [in] ctx
//! VADriverContextP
//! \param [in] context
//! Already created context for the decoding process
//! \param [in] renderTarget
//! Specified target surface
//!
//! \return VAStatus
//! VA_STATUS_SUCCESS if success, else fail reason
//!
virtual VAStatus BeginPicture(
VADriverContextP ctx,
VAContextID context,
VASurfaceID renderTarget);
//!
//! \brief Send required buffers to decoding process
//! \details It sends needed buffers by the decoding to the driver
//!
//! \param [in] ctx
//! VADriverContextP
//! \param [in] context
//! Already created context for the decoding process
//! \param [in] buffers
//! Pointer to the buffer array
//! \param [in] numBuffers
//! Number of buffers in above array
//!
//! \return VAStatus
//! VA_STATUS_SUCCESS if success, else fail reason
//!
virtual VAStatus RenderPicture(
VADriverContextP ctx,
VAContextID context,
VABufferID * buffers,
int32_t numBuffers)
{
return VA_STATUS_ERROR_UNIMPLEMENTED;
}
//!
//! \brief Init Params setting of EndPicture Function
//! \details The function is used to init EndPicture params
//!
//! \param [in] ctx
//! VADriverContextP
//! \param [in] context
//! Already created context for the process
//!
//! \return VAStatus
//! VA_STATUS_SUCCESS if success
//!
virtual VAStatus InitDecodeParams(
VADriverContextP ctx,
VAContextID context);
//!
//! \brief Get decode format
//! \details The function is used to get decode format
//!
//! \return MOS_FORMAT
//! VA_STATUS_SUCCESS if success
//!
virtual MOS_FORMAT GetFormat();
//!
//! \brief Set common decode param setting for each codec
//! \details Set common decode param setting for each decode class
//!
//! \return VAStatus
//! VA_STATUS_SUCCESS if success
//!
virtual VAStatus SetDecodeParams();
//!
//! \brief Make the end of rendering for a picture
//! \details The driver will flush/submit the decoding processing.
//! This call is non-blocking. The app can start another
//! Begin/Render/End sequence on a different render target
//!
//! \param [in] ctx
//! VADriverContextP
//! \param [in] context
//! Already created context for the process
//!
//! \return VAStatus
//! VA_STATUS_SUCCESS if success, else fail reason
//!
virtual VAStatus EndPicture(
VADriverContextP ctx,
VAContextID context);
//!
//! \brief the first step of Initializing internal structure of DdiMediaDecode
//! \details Initialize and allocate the internal structur of DdiMediaDecode. This
//! is the first step.
//! \param [in] decConfAttr
//! the config attr related with the decoding
//! \return VAStatus
//! VA_STATUS_SUCCESS if success, else fail reason
VAStatus BasicInit(DDI_DECODE_CONFIG_ATTR *decConfAttr);
//!
//! \brief the second step of Initializing internal structure of DdiMediaDecode
//! \details Initialize the internal structure of DdiMediaDecode base on
//! input width/height. It is step two
//!
//! \param [in] picWidth
//! int32_t
//! \param [in] picHeight
//! int32_t
//!
virtual void ContextInit(
int32_t picWidth,
int32_t picHeight);
//!
//! \brief Initialize the back-end CodecHal of DdiMediaDecode
//! \details Initialize the back-end CodecHal of DdiMediaDecode base on
//! the codec attribute. This is the third step of DdiMediDecode context
//! initialiazation.
//!
//! \param [in] mediaCtx
//! DDI_MEDIA_CONTEXT * type
//! \param [in] ptr
//! extra data
//! \return VAStatus
//! VA_STATUS_SUCCESS if success, else fail reason
virtual VAStatus CodecHalInit(
DDI_MEDIA_CONTEXT *mediaCtx,
void *ptr)
{
return VA_STATUS_ERROR_UNIMPLEMENTED;
}
//!
//! \brief Get bit stream buffer index
//! \details Get bit stream buffer index
//!
//! \param [in] bufMgr
//! DDI_CODEC_COM_BUFFER_MGR *bufMgr
//! \param [in] buf
//! DDI_MEDIA_BUFFER *buf
//! \return i
//! buffer index
virtual int32_t GetBitstreamBufIndexFromBuffer(
DDI_CODEC_COM_BUFFER_MGR *bufMgr,
DDI_MEDIA_BUFFER *buf);
//!
//! \brief Allocate slice control buffer
//! \details Allocate slice control buffer
//!
//! \param [in] buf
//! DDI_MEDIA_BUFFER *buf
//! \return VAStatus
//!
virtual VAStatus AllocSliceControlBuffer(
DDI_MEDIA_BUFFER *buf)
{
return VA_STATUS_ERROR_UNIMPLEMENTED;
}
//!
//! \brief Allocate Bs buffer
//! \details Allocate Bs buffer
//!
//! \param [in] bufMgr
//! DDI_CODEC_COM_BUFFER_MGR *bufMgr
//! \param [in] buf
//! DDI_MEDIA_BUFFER *buf
//! \return VAStatus
//!
virtual VAStatus AllocBsBuffer(
DDI_CODEC_COM_BUFFER_MGR *bufMgr,
DDI_MEDIA_BUFFER *buf);
//!
//! \brief Get Picture parameter size
//! \details Get Picture parameter size for each decoder
//!
//! \param [in] bufMgr
//! DDI_CODEC_COM_BUFFER_MGR *bufMgr
//! \return uint8_t*
//!
virtual uint8_t* GetPicParamBuf(
DDI_CODEC_COM_BUFFER_MGR *bufMgr)
{
return (uint8_t*)bufMgr;
}
//!
//! \brief Create buffer in ddi decode context
//! \details Create related decode buffer in ddi decode base class
//!
//! \param [in] type
//! VABufferType type
//! \param [in] size
//! uint32_t size
//! \param [in] numElements
//! uint32_t numElements
//! \param [in] data
//! void data
//! \param [in] bufId
//! VABufferID bufId
//!
virtual VAStatus CreateBuffer(
VABufferType type,
uint32_t size,
uint32_t numElements,
void *data,
VABufferID *bufId);
//!
//! \brief if it is range extention
//!
//! \return true or false
//!
virtual bool IsRextProfile()
{
return false;
}
//! \brief Combine the Bitstream Before decoding execution
//! \details Help to refine and combine the decoded input bitstream if
//! required. It is decided by the flag of IsSliceOverSize.
//! \param [in] mediaCtx
//! DDI_MEDIA_CONTEXT * type
//!
//! \return VAStatus
//! VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus DecodeCombineBitstream(DDI_MEDIA_CONTEXT *mediaCtx);
protected:
//! \brief the decode_config_attr related with Decode_CONTEXT
DDI_DECODE_CONFIG_ATTR *m_ddiDecodeAttr = nullptr;
//! \brief the referred DDI_DECODE_CONTEXT object
//! \details This is allocated when creating one new instance. As it is
//! referred by other component, it should be free explicitly
//! outside of the instance.
DDI_DECODE_CONTEXT *m_ddiDecodeCtx = nullptr;
//! \brief decoded picture buffer flag
bool m_withDpb = true;
//!
//! \brief return the Buffer offset for sliceGroup
//! \details return the Base offset for one given slice_data buffer.
//! It can be applied under the following two scenarios:
//! Multiple slice parameters are included in one slice_param_buf
//! Only one slice parameter is in one slice_param_buf.
//!
//! \param [in] sliceGroup
//! the index of slice_parameter group
//!
//! \return return the base offset
//!
uint32_t GetBsBufOffset(int32_t sliceGroup);
//! \brief Parse the processing buffer if needed.
//! \details Helps to parse the Video-post processing buffer for Decoding
//!
//! \param [in] mediaCtx
//! DDI_MEDIA_CONTEXT * type
//! \param [in] bufAddr
//! the address of passed buf
//!
//! \return VAStatus
//! VA_STATUS_SUCCESS if success, else fail reason
//!
VAStatus ParseProcessingBuffer(
DDI_MEDIA_CONTEXT *mediaCtx,
void *bufAddr);
//!
//! \brief Create the back-end CodecHal of DdiMediaDecode
//! \details Create the back-end CodecHal of DdiMediaDecode base on
//! the codec attribute. This is one common function, which is called by CreateCodecHal.
//!
//! \param [in] mediaCtx
//! DDI_MEDIA_CONTEXT * type
//! \param [in] ptr
//! extra data
//! \param [in] standardInfo
//! CODECHAL_STANDARD_INFO *
//!
//! \return VAStatus
//! VA_STATUS_SUCCESS if success, else fail reason
VAStatus CreateCodecHal(
DDI_MEDIA_CONTEXT *mediaCtx,
void *ptr,
_CODECHAL_STANDARD_INFO *standardInfo);
//!
//! \brief Get dummy reference from DPB
//! \details Get dummy reference from DPB for error concealment
//!
//! \param [in] decodeCtx
//! DDI_DECODE_CONTEXT * type
//!
//! \return void
void GetDummyReferenceFromDPB(
DDI_DECODE_CONTEXT *decodeCtx);
//!
//! \brief Report decode mode
//! \details Report decode mode to UFKEY_INTERNAL
//!
//! \param [in] wMode
//! CODECHAL_MODE
//!
//! \return void
void ReportDecodeMode(
uint16_t wMode);
//! \brief Use EU path to do the scaling
//! \details When VD+SFC are not supported, it will call into VPhal to do scaling
//!
//! \param [in] ctx
//! VADriverContextP * type
//! \param [in] context
//! Already created context for the process
//!
//! \return VAStatus
//! VA_STATUS_SUCCESS if success, else fail reason
VAStatus ExtraDownScaling(
VADriverContextP ctx,
VAContextID context);
//! \brief Init dummy reference
//! \details Init dummy reference for decode
//!
//! \param [in/out] decoder
//! Codechal decoder
//!
//! \return VAStatus
//! VA_STATUS_SUCCESS if success, else fail reason
VAStatus InitDummyReference(CodechalDecode& decoder);
//! \brief Init dummy reference
//! \details Init dummy reference for decode
//!
//! \param [in/out] decoder
//! DecodePipelineAdapter decoder
//!
//! \return VAStatus
//! VA_STATUS_SUCCESS if success, else fail reason
VAStatus InitDummyReference(DecodePipelineAdapter& decoder);
//! \brief the type of decode base class
MOS_SURFACE m_destSurface; //!<Destination Surface structure
uint32_t m_groupIndex; //!<global Group
uint16_t m_picWidthInMB; //!<Picture Width in MB width count
uint16_t m_picHeightInMB; //!<Picture Height in MB height count
uint32_t m_width; //!<Picture Width
uint32_t m_height; //!<Picture Height
bool m_streamOutEnabled; //!<Stream Out enable flag
uint32_t m_sliceParamBufNum; //!<Slice parameter Buffer Number
uint32_t m_sliceCtrlBufNum; //!<Slice control Buffer Number
uint32_t m_decProcessingType; //!<Decode Processing type
CodechalSetting *m_codechalSettings = nullptr; //!<Codechal Settings
#ifdef _DECODE_PROCESSING_SUPPORTED
VAProcPipelineParameterBuffer *m_procBuf = nullptr; //!< Process parameters for vp sfc input
#endif
};
#endif /* _MEDIA_DDI_DEC_BASE_H_ */