blob: 3ac32973cc4d4308d4602a3f15f97450113acc58 [file] [log] [blame]
/*
* * Copyright (C) 2018 Intel Corporation. All Rights Reserved.
* *
** 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, sub license, 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 (including the
* * next paragraph) 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 NON-INFRINGEMENT.
* * IN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS 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 VDecAccelVA.h
* @brief LibVA decode accelerator declaration
*/
#ifndef MV_ACCELERATOR_VAAPI_DECODE_H
#define MV_ACCELERATOR_VAAPI_DECODE_H
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <map>
#include <vector>
#include <algorithm>
#include <va/va.h>
#include "DecodeParamBuffer.h"
#include <X11/Xlib.h>
typedef Display* HDISP;
namespace mvaccel
{
/**
* @brief LibVA decode accelerator
*/
class VDecAccelVAImpl
{
public:
VDecAccelVAImpl(void* device);
VDecAccelVAImpl();
virtual ~VDecAccelVAImpl();
// VDecAccel interface
virtual int Open();
virtual void Close();
virtual uint32_t GetSurfaceID(uint32_t index);
bool DecodePicture();
void bind_buffer(uint8_t* base);
protected:
// GfxSurfaceAccess interface
uint32_t get_width(VASurfaceID id);
uint32_t get_height(VASurfaceID id);
uint32_t get_stride(VASurfaceID id);
uint8_t* lock_surface(VASurfaceID id, bool write);
void unlock_surface(VASurfaceID id);
void* get_raw(VASurfaceID id);
void* get_device(VASurfaceID id);
typedef std::vector<VAConfigAttrib> VAConfigAttribArray;
typedef std::vector<VASurfaceAttrib> VASurfaceAttribArray;
// Member functions inherit by children
virtual bool is_config_compatible(DecodeDesc& desc);
virtual bool is_rt_foramt_supported(DecodeDesc& desc);
virtual void prepare_config_attribs(
DecodeDesc& desc,
VAConfigAttribArray& attribs);
virtual void prepare_surface_attribs(
DecodeDesc& desc,
VASurfaceAttribArray& attribs,
bool bDecodeDownsamplingHinted);
// Member fucntions NOT inherit by children
bool is_slice_mode_supported(DecodeDesc& desc);
bool is_encryption_supported(DecodeDesc& desc);
bool is_sfc_config_supported(DecodeDesc& desc);
VAStatus render_picture(VAContextID& vaContextID);
VAStatus query_status();
VAStatus create_surface(
uint32_t width,
uint32_t height,
VASurfaceAttribArray& vaAttribs,
VASurfaceID& vaID);
void delete_surface(VASurfaceID& vaID);
void create_decode_desc();
int check_process_pipeline_caps(DecodeDesc& desc);
int create_resources();
protected:
// VA ID & Handles
VADisplay m_vaDisplay; /**< @brief VA hardware device */
VAProfile m_vaProfile; /**< @brief Video decoder profile */
VAEntrypoint m_vaEntrypoint; /**< @brief VA entry point */
VAConfigID m_vaConfigID; /**< @brief VA decode config id*/
VAContextID m_vaContextID; /**< @brief Video decoder context */
// VASurfaces id and attributes
std::vector<VASurfaceID> m_vaIDs;
VASurfaceAttribArray m_vaSurfAttribs;
uint32_t m_surfaceType; /**< @brief surface type */
// Gfx surface access management
std::map<VASurfaceID, VAImage> m_images; /**< @brief buf pointer */
enum SFC
{
MAX_IN_W,
MAX_IN_H,
MIN_IN_W,
MIN_IN_H,
MAX_OUT_W,
MAX_OUT_H,
MIN_OUT_W,
MIN_OUT_H,
NEW_W,
NEW_H,
};
DecodeDesc m_DecodeDesc; /**< @brief decode discription */
VARectangle m_rectSrc; /**< @brief Rectangle for source input */
VARectangle m_rectSFC; /**< @brief Rectangle for SFC output */
std::vector<uint32_t> m_in4CC; /**< @brief input FOURCC */
std::vector<uint32_t> m_out4CC; /**< @brief output FOURCC */
std::map<SFC,uint32_t> m_sfcSize; /**< @brief SFC sizes */
std::vector<VASurfaceID> m_sfcIDs; /**< @brief sfc surfaces */
VAProcPipelineParameterBuffer m_vaProcBuffer; /**< @brief sfc pipeline buffer */
};
} // namespace mvaccel
#endif // MV_ACCELERATOR_VAAPI_DECODE_H