/* * Copyright (c) 2017, 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_base.h //! \brief Defines base class for DDI media encode/decoder/VP //! #ifndef _MEDIA_DDI_BASE_H_ #define _MEDIA_DDI_BASE_H_ #include #include #include #include "media_libva.h" #include "media_libva_util.h" #define SURFACE_STATE_INACTIVE 0 //!< Surface state inactive flag, should be transfer from inactive->inuse->active->inactive #define SURFACE_STATE_ACTIVE_IN_LASTFRAME 1 //!< Surface state active in last frame flag, means surface appears in DPB of last frame and certainly some of them will appear in DPB of current frame. #define SURFACE_STATE_ACTIVE_IN_CURFRAME 64 //!< Surface state active in current frame flag, means surface will be used in current frame. //! //! \class DdiMediaBase //! \brief Ddi media base class //! class DdiMediaBase { public: //! //! \brief Constructor //! DdiMediaBase(){}; //! //! \brief Destructor //! virtual ~DdiMediaBase(){}; //! //! \brief Get ready to process for a target surface //! \details It begins the process (encode/decode/vp) for a specified target surface //! //! \param [in] ctx //! Pointer to VA driver context //! \param [in] context //! Already created context for the 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) = 0; //! //! \brief Send required buffers to for process //! \details It sends needed buffers by the process (encode/decode/vp) to the driver //! //! \param [in] ctx //! Pointer to VA driver context //! \param [in] context //! Already created context for the 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) = 0; //! //! \brief Make the end of rendering for a picture //! \details The driver will start processing the corresponding decoding/encoding/vp for //! given context. This call is non-blocking. The app can start another //! Begin/Render/End sequence on a different render target //! //! \param [in] ctx //! Pointer to VA driver context //! \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) = 0; //! //! \brief Register Render Target Surface //! \details Register surface in render target table //! //! \param [in] rtTbl //! Pointer to DDI_CODEC_RENDER_TARGET_TABLE //! \param [in] surface //! Pointer to DDI_MEDIA_SURFACE //! //! \return VAStatus //! VA_STATUS_SUCCESS if success, else fail reason //! VAStatus RegisterRTSurfaces(DDI_CODEC_RENDER_TARGET_TABLE *rtTbl, DDI_MEDIA_SURFACE *surface); //! //! \brief Unregister Render Target Surface //! \details Unregister surface in render target table //! //! \param [in] rtTbl //! Pointer to DDI_CODEC_RENDER_TARGET_TABLE //! \param [in] surface //! Pointer to DDI_MEDIA_SURFACE //! //! \return VAStatus //! VA_STATUS_SUCCESS if success, else fail reason //! VAStatus UnRegisterRTSurfaces(DDI_CODEC_RENDER_TARGET_TABLE *rtTbl, DDI_MEDIA_SURFACE *surface); protected: //! //! \brief Get Render Target Index //! \details Get surface index in render target table //! //! \param [in] rtTbl //! Pointer to DDI_CODEC_RENDER_TARGET_TABLE //! \param [in] surface //! Pointer to DDI_MEDIA_SURFACE //! //! \return int32_t //! Render target index //! int32_t GetRenderTargetID(DDI_CODEC_RENDER_TARGET_TABLE *rtTbl, DDI_MEDIA_SURFACE *surface); //! //! \brief Clear Reference List //! \details Clear surface state in render target table //! //! \param [in] rtTbl //! Pointer to DDI_CODEC_RENDER_TARGET_TABLE //! \param [in] withDpb //! Dpb flag //! //! \return VAStatus //! VA_STATUS_SUCCESS if success, else fail reason //! VAStatus ClearRefList(DDI_CODEC_RENDER_TARGET_TABLE *rtTbl, bool withDpb); //! //! \brief Update Registered Render Target Surface Flag //! \details Check if surface need to be registered in render target table //! //! \param [in] rtTbl //! Pointer to DDI_CODEC_RENDER_TARGET_TABLE //! \param [in] surface //! Pointer to DDI_MEDIA_SURFACE //! //! \return VAStatus //! VA_STATUS_SUCCESS if success, else fail reason //! VAStatus UpdateRegisteredRTSurfaceFlag(DDI_CODEC_RENDER_TARGET_TABLE *rtTbl, DDI_MEDIA_SURFACE *surface); }; #endif /* _MEDIA_DDI_BASE_H_ */