blob: 98449c876656f0bb05942b54cad7127a3a6a20f3 [file] [log] [blame]
#ifndef __VIDEO_VPP_BASE_H__
#define __VIDEO_VPP_BASE_H__
#include <system/graphics.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <va/va.h>
#include <va/va_drmcommon.h>
#include <va/va_vpp.h>
#include <va/va_android.h>
#include <va/va_tpi.h>
#include <hardware/gralloc.h>
#include <utils/KeyedVector.h>
class VideoVPPBase;
struct FilterConfig {
enum strength {
LOW,
MEDIUM,
HIGH,
};
bool valid;
int type;
float min, max, step, def;
float cur;
};
class VPParameters {
public:
static VPParameters* create(VideoVPPBase *);
~VPParameters();
VAStatus buildfilters();
VAStatus reset(bool start);
void getNR(FilterConfig& NR) { memcpy(&NR, &nr, sizeof(FilterConfig)); }
void setNR(FilterConfig::strength str) { nr.cur = str; }
void getDeblock(FilterConfig &DBK) { memcpy(&DBK, &deblock, sizeof(FilterConfig)); }
void SetDeblock(FilterConfig::strength str) { deblock.cur = str; }
void getSharpen(FilterConfig &SHP) { memcpy(&SHP, &sharpen, sizeof(FilterConfig)); }
void setSharpen(FilterConfig SHP) { sharpen.cur = SHP.cur; }
private:
bool mInitialized;
VADisplay va_display;
VAContextID va_context;
VAStatus vret;
VAProcFilterType supported_filters[VAProcFilterCount];
unsigned int num_supported_filters;
VAProcFilterCap denoise_caps, sharpen_caps, deblock_caps;
VAProcFilterCapColorBalance color_balance_caps[VAProcColorBalanceCount];
unsigned int num_denoise_caps, num_color_balance_caps, num_sharpen_caps, num_deblock_caps;
VAProcFilterParameterBuffer denoise_buf, sharpen_buf, deblock_buf;
VAProcFilterParameterBufferColorBalance balance_buf[VAProcColorBalanceCount];
VABufferID sharpen_buf_id, denoise_buf_id, deblock_buf_id, balance_buf_id;
VABufferID filter_bufs[VAProcFilterCount];
unsigned int num_filter_bufs;
FilterConfig nr;
FilterConfig deblock;
FilterConfig sharpen;
FilterConfig colorbalance[VAProcColorBalanceCount];
VPParameters(VideoVPPBase *);
VPParameters(const VPParameters&);
VPParameters &operator=(const VPParameters&);
VAStatus init();
friend class VideoVPPBase;
};
struct RenderTarget {
enum bufType{
KERNEL_DRM,
ANDROID_GRALLOC,
};
int width;
int height;
int stride;
bufType type;
int format;
int pixel_format;
int handle;
VARectangle rect;
};
class VideoVPPBase {
public:
VideoVPPBase();
~VideoVPPBase();
VAStatus start();
VAStatus stop();
VAStatus perform(RenderTarget Src, RenderTarget Dst, VPParameters *vpp, bool no_wait);
private:
bool mInitialized;
unsigned width, height;
VAStatus vret;
VADisplay va_display;
VAConfigID va_config;
VAContextID va_context;
VABufferID vpp_pipeline_buf;
VAProcPipelineParameterBuffer vpp_param;
VASurfaceAttrib SrcSurfAttrib, DstSurfAttrib;
VASurfaceAttribExternalBuffers SrcSurfExtBuf, DstSurfExtBuf;
VASurfaceID SrcSurf, DstSurf;
VASurfaceAttributeTPI attribs;
VABufferID filter_bufs[VAProcFilterCount];
unsigned int num_filter_bufs;
KeyedVector<int, VASurfaceID> SrcSurfHandleMap;
KeyedVector<int, VASurfaceID> DstSurfHandleMap;
VideoVPPBase(const VideoVPPBase &);
VideoVPPBase &operator=(const VideoVPPBase &);
VAStatus _perform(VASurfaceID SrcSurf, VARectangle SrcRect,
VASurfaceID DstSurf, VARectangle DstRect, bool no_wait);
VAStatus _CreateSurfaceFromGrallocHandle(RenderTarget rt, VASurfaceID *surf);
friend class VPParameters;
};
#endif