Files

394 lines
15 KiB
C
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#ifndef __XMEDIA_TDE_H__
#define __XMEDIA_TDE_H__
#include "xmedia_errcode.h"
#include "xmedia_video_common.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define XMEDIA_COLOR_COMPONENT_NUM 3
typedef struct {
xmedia_u64 phys_addr[XMEDIA_COLOR_COMPONENT_NUM]; // 0:Y或RGB; 1:UV; 2:U或V
xmedia_u32 stride[XMEDIA_COLOR_COMPONENT_NUM]; // 0:Y或RGB; 1:UV; 2:U或V
xmedia_u32 width;
xmedia_u32 height;
xmedia_video_pixel_format pixel_format;
xmedia_bool is_alpha_ext_1555; // ARGB1555 alpha位扩展8位有效位场景,0:系统默认扩展,1:用户配置
xmedia_u8 alpha0; // ARGB1555 alpha位扩展8位有效位场景,0对应的8位有效位
xmedia_u8 alpha1; // ARGB1555 alpha位扩展8位有效位场景,1对应的8位有效位
xmedia_u64 clut_phys_addr; // 256个argb8888颜色,总内存256*4字节
xmedia_bool clut_reload;
} xmedia_tde_surface;
typedef struct {
xmedia_tde_surface surface;
xmedia_video_rect rect;
} xmedia_tde_surface_info;
typedef struct {
xmedia_video_point start_point;
xmedia_video_point end_point;
xmedia_u32 thick;
xmedia_u32 color; // 颜色值固定按照ARGB8888解析,可配范围[0x0, 0xffffffff]
} xmedia_tde_line_attr;
typedef enum {
XMEDIA_TDE_BLEND_MODE_CLEAR = 0, // fs: 0.0 fd: 0.0
XMEDIA_TDE_BLEND_MODE_SRC, // fs: 1.0 fd: 0.0
XMEDIA_TDE_BLEND_MODE_DST, // fs: 0.0 fd: 1.0
XMEDIA_TDE_BLEND_MODE_SRCOVER, // fs: 1.0 fd: 1.0-sa
XMEDIA_TDE_BLEND_MODE_DSTOVER, // fs: 1.0-da fd: 1.0
XMEDIA_TDE_BLEND_MODE_SRCIN, // fs: da fd: 0.0
XMEDIA_TDE_BLEND_MODE_DSTIN, // fs: 0.0 fd: sa
XMEDIA_TDE_BLEND_MODE_SRCOUT, // fs: 1.0-da fd: 0.0
XMEDIA_TDE_BLEND_MODE_DSTOUT, // fs: 0.0 fd: 1.0-sa
XMEDIA_TDE_BLEND_MODE_SRCATOP, // fs: da fd: 1.0-sa
XMEDIA_TDE_BLEND_MODE_DSTATOP, // fs: 1.0-da fd: sa
XMEDIA_TDE_BLEND_MODE_XOR, // fs: 1.0-da fd: 1.0-sa
XMEDIA_TDE_BLEND_MODE_DARKEN, // alpha取1color取min(s1, s2)
XMEDIA_TDE_BLEND_MODE_LIGHTEN, // alpha取1color取max(s1, s2)
XMEDIA_TDE_BLEND_MODE_MULTIPLY, // As1 * As2/256, Cs1 * Cs2/256
XMEDIA_TDE_BLEND_MODE_SCREEN, // As1 + As2 - As1 * As2/256, Cs1 + Cs2 - Cs1 * Cs2/256
XMEDIA_TDE_BLEND_MODE_MAX
} xmedia_tde_blend_mode;
typedef struct {
xmedia_bool global_alpha_en;
xmedia_bool pixel_alpha_en;
xmedia_bool bg_premulti_en;
xmedia_bool fg_premulti_en;
xmedia_tde_blend_mode blend_mode;
} xmedia_tde_blend_attr;
typedef enum {
XMEDIA_TDE_ROP_MODE_BLACKNESS = 0, // Blackness
XMEDIA_TDE_ROP_MODE_NOTMERGEPEN, // ~(S2 | S1)
XMEDIA_TDE_ROP_MODE_MASKNOTPEN, // ~S2&S1
XMEDIA_TDE_ROP_MODE_NOTCOPYPEN, // ~S2
XMEDIA_TDE_ROP_MODE_MASKPENNOT, // S2&~S1
XMEDIA_TDE_ROP_MODE_NOT, // ~S1
XMEDIA_TDE_ROP_MODE_XORPEN, // S2^S1
XMEDIA_TDE_ROP_MODE_NOTMASKPEN, // ~(S2 & S1)
XMEDIA_TDE_ROP_MODE_MASKPEN, // S2&S1
XMEDIA_TDE_ROP_MODE_NOTXORPEN, // ~(S2^S1)
XMEDIA_TDE_ROP_MODE_NOP, // S1
XMEDIA_TDE_ROP_MODE_MERGENOTPEN, // ~S2|S1
XMEDIA_TDE_ROP_MODE_COPYPEN, // S2
XMEDIA_TDE_ROP_MODE_MERGEPENNOT, // S2|~S1
XMEDIA_TDE_ROP_MODE_MERGEPEN, // S2|S1
XMEDIA_TDE_ROP_MODE_WHITE, // Whiteness
XMEDIA_TDE_ROP_MODE_MAX
} xmedia_tde_rop_mode;
typedef struct {
xmedia_tde_rop_mode alpha_rop;
xmedia_tde_rop_mode color_rop;
} xmedia_tde_rop_attr;
typedef enum {
XMEDIA_TDE_COLORKEY_MODE_FOREGROUND = 0,
XMEDIA_TDE_COLORKEY_MODE_BACKGROUND,
XMEDIA_TDE_COLORKEY_MODE_MAX
} xmedia_tde_colorkey_mode;
typedef struct {
xmedia_u8 component_min;
xmedia_u8 component_max;
xmedia_u8 component_mask;
xmedia_bool is_component_out;
xmedia_bool is_component_ignore;
} xmedia_tde_colorkey_comp;
typedef union {
struct {
xmedia_tde_colorkey_comp alpha;
xmedia_tde_colorkey_comp red;
xmedia_tde_colorkey_comp green;
xmedia_tde_colorkey_comp blue;
} argb_color_key;
struct {
xmedia_tde_colorkey_comp alpha;
xmedia_tde_colorkey_comp y;
xmedia_tde_colorkey_comp cb;
xmedia_tde_colorkey_comp cr;
} yuv_color_key;
struct {
xmedia_tde_colorkey_comp alpha;
xmedia_tde_colorkey_comp clut;
} clut_color_key;
} xmedia_tde_colorkey_value;
typedef struct {
xmedia_tde_colorkey_mode ck_mode;
xmedia_tde_colorkey_value ck_value;
} xmedia_tde_colorkey_attr;
typedef enum {
XMEDIA_TDE_CLIP_MODE_INSIDE = 0,
XMEDIA_TDE_CLIP_MODE_OUTSIDE,
XMEDIA_TDE_CLIP_MODE_MAX
} xmedia_tde_clip_mode;
typedef struct {
xmedia_tde_clip_mode clip_mode;
xmedia_video_rect clip_rect;
} xmedia_tde_clip_attr;
typedef enum {
XMEDIA_TDE_OUT_ALPHA_MODE_NORMAL = 0,
XMEDIA_TDE_OUT_ALPHA_MODE_FROM_BACKGROUND,
XMEDIA_TDE_OUT_ALPHA_MODE_FROM_FOREGROUND,
XMEDIA_TDE_OUT_ALPHA_MODE_FROM_GLOBALALPHA,
XMEDIA_TDE_OUT_ALPHA_MODE_MAX
} xmedia_tde_out_alpha_mode;
typedef struct {
xmedia_bool blend_en;
xmedia_tde_blend_attr blend_attr;
xmedia_bool rop_en;
xmedia_tde_rop_attr rop_attr;
xmedia_bool colorkey_en;
xmedia_tde_colorkey_attr ck_attr;
xmedia_bool clip_en;
xmedia_tde_clip_attr clip_attr;
xmedia_bool mirror_en;
xmedia_bool flip_en;
xmedia_tde_out_alpha_mode alpha_mode;
xmedia_u8 global_alpha;
} xmedia_tde_operation_attr;
/*
* 函数功能: 初始化tde模块
* 函数参数:
* NA
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NOT_READY - 驱动未加载
*/
xmedia_s32 xmedia_tde_init(xmedia_void);
/*
* 函数功能: 去初始化tde模块
* 函数参数:
* NA
* 返回值:
* NA
*/
xmedia_void xmedia_tde_exit(xmedia_void);
/*
* 函数功能: 创建一个工作组(job)
* 函数参数:
* handle - 输出参数, 对应job的有效句柄
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NULL_PTR - 空指针
* XMEDIA_ERRCODE_NOT_INIT - tde模块未初始化
* XMEDIA_ERRCODE_BUFFER_EMPTY - 没有空闲的job资源
*/
xmedia_s32 xmedia_tde_create_job(xmedia_s32 *handle);
/*
* 函数功能: 添加一个或多个画线任务(task)到指定的工作组(job)
* 函数参数:
* handle - 输入参数, 对应xmedia_tde_create_job得到的有效句柄
* dst - 输入参数, 目标surface和目标rect
* line - 输入参数, 线条属性信息
* line_num - 输入参数, 线条个数
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NULL_PTR - 空指针
* XMEDIA_ERRCODE_NOT_INIT - tde模块未初始化
* XMEDIA_ERRCODE_BUFFER_EMPTY - 没有空闲的task资源
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_NOT_SUPPORT - 参数配置超出能力范围,不支持
* XMEDIA_ERRCODE_NOT_PERMITTED - 操作不允许(如已经提交的工作组不可再添加任务)
*/
xmedia_s32 xmedia_tde_add_task_draw_line(xmedia_s32 handle, const xmedia_tde_surface_info *dst,
xmedia_tde_line_attr *line, xmedia_u32 line_num);
/*
* 函数功能: 添加一个快速填充任务(task)到指定的工作组(job)
* 函数参数:
* handle - 输入参数, 对应xmedia_tde_create_job得到的有效句柄
* dst - 输入参数, 目标surface和目标rect
* fill_color - 输入参数, 填充色, 固定按ARGB8888配
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NULL_PTR - 空指针
* XMEDIA_ERRCODE_NOT_INIT - tde模块未初始化
* XMEDIA_ERRCODE_BUFFER_EMPTY - 没有空闲的task资源
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_NOT_SUPPORT - 参数配置超出能力范围,不支持
* XMEDIA_ERRCODE_NOT_PERMITTED - 操作不允许(如已经提交的工作组不可再添加任务)
*/
xmedia_s32 xmedia_tde_add_task_quick_fill(xmedia_s32 handle, const xmedia_tde_surface_info *dst,
xmedia_u32 fill_color);
/*
* 函数功能: 添加一个快速拷贝任务(task)到指定的工作组(job)
* 函数参数:
* handle - 输入参数, 对应xmedia_tde_create_job得到的有效句柄
* src - 输入参数, 源surface和源rect
* dst - 输入参数, 目标surface和目标rect
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NULL_PTR - 空指针
* XMEDIA_ERRCODE_NOT_INIT - tde模块未初始化
* XMEDIA_ERRCODE_BUFFER_EMPTY - 没有空闲的task资源
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_NOT_SUPPORT - 参数配置超出能力范围,不支持
* XMEDIA_ERRCODE_NOT_PERMITTED - 操作不允许(如已经提交的工作组不可再添加任务)
*/
xmedia_s32 xmedia_tde_add_task_quick_copy(xmedia_s32 handle, const xmedia_tde_surface_info *src,
const xmedia_tde_surface_info *dst);
/*
* 函数功能: 添加一个缩放任务(task)到指定的工作组(job)
* 函数参数:
* handle - 输入参数, 对应xmedia_tde_create_job得到的有效句柄
* src - 输入参数, 源surface和源rect
* dst - 输入参数, 目标surface和目标rect
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NULL_PTR - 空指针
* XMEDIA_ERRCODE_NOT_INIT - tde模块未初始化
* XMEDIA_ERRCODE_BUFFER_EMPTY - 没有空闲的task资源
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_NOT_SUPPORT - 参数配置超出能力范围,不支持
* XMEDIA_ERRCODE_NOT_PERMITTED - 操作不允许(如已经提交的工作组不可再添加任务)
*/
xmedia_s32 xmedia_tde_add_task_scale(xmedia_s32 handle, const xmedia_tde_surface_info *src,
const xmedia_tde_surface_info *dst);
/*
* 函数功能: 添加一个旋转任务(task)到指定的工作组(job)
* 函数参数:
* handle - 输入参数, 对应xmedia_tde_create_job得到的有效句柄
* src - 输入参数, 源surface和源rect
* dst - 输入参数, 目标surface和目标rect
* rot - 输入参数, 旋转角度
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NULL_PTR - 空指针
* XMEDIA_ERRCODE_NOT_INIT - tde模块未初始化
* XMEDIA_ERRCODE_BUFFER_EMPTY - 没有空闲的task资源
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_NOT_SUPPORT - 参数配置超出能力范围,不支持
* XMEDIA_ERRCODE_NOT_PERMITTED - 操作不允许(如已经提交的工作组不可再添加任务)
*/
xmedia_s32 xmedia_tde_add_task_rotation(xmedia_s32 handle, const xmedia_tde_surface_info *src,
const xmedia_tde_surface_info *dst, xmedia_video_rotation rot);
/*
* 函数功能: 添加一个单源搬移任务(task)到指定的工作组(job)
* 函数参数:
* handle - 输入参数, 对应xmedia_tde_create_job得到的有效句柄
* src - 输入参数, 源surface和源rect
* dst - 输入参数, 目标surface和目标rect
* fill_color - 输入参数, 可以配ARGB8888格式的填充色当做前景与背景叠加输出到目标位图
* opt - 输入参数, 附加操作集合(alpha blending/rop/colorkey/clip/mirro/flip); opt可以为NULL
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NULL_PTR - 空指针
* XMEDIA_ERRCODE_NOT_INIT - tde模块未初始化
* XMEDIA_ERRCODE_BUFFER_EMPTY - 没有空闲的task资源
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_NOT_SUPPORT - 参数配置超出能力范围,不支持
* XMEDIA_ERRCODE_NOT_PERMITTED - 操作不允许(如已经提交的工作组不可再添加任务)
*/
xmedia_s32 xmedia_tde_add_task_single_blit(xmedia_s32 handle, const xmedia_tde_surface_info *src,
const xmedia_tde_surface_info *dst, xmedia_u32 fill_color, xmedia_tde_operation_attr *opt);
/*
* 函数功能: 添加一个双源搬移任务(task)到指定的工作组(job)
* 函数参数:
* handle - 输入参数, 对应xmedia_tde_create_job得到的有效句柄
* bg - 输入参数, 背景surface和背景rect
* fg - 输入参数, 前景surface和前景rect
* dst - 输入参数, 目标surface和目标rect
* opt - 输入参数, 附加操作集合(alpha blending/rop/colorkey/clip/mirro/flip);不能为NULL
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NULL_PTR - 空指针
* XMEDIA_ERRCODE_NOT_INIT - tde模块未初始化
* XMEDIA_ERRCODE_BUFFER_EMPTY - 没有空闲的task资源
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_NOT_SUPPORT - 参数配置超出能力范围,不支持
* XMEDIA_ERRCODE_NOT_PERMITTED - 操作不允许(如已经提交的工作组不可再添加任务)
*/
xmedia_s32 xmedia_tde_add_task_double_blit(xmedia_s32 handle, const xmedia_tde_surface_info *bg,
const xmedia_tde_surface_info *fg, const xmedia_tde_surface_info *dst, xmedia_tde_operation_attr *opt);
/*
* 函数功能: 提交指定的工作组(job)
* 函数参数:
* handle - 输入参数, 对应xmedia_tde_create_job得到的有效句柄
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NOT_INIT - tde模块未初始化
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_NOT_PERMITTED - 操作不允许
*/
xmedia_s32 xmedia_tde_submit_job(xmedia_s32 handle);
/*
* 函数功能: 取消指定的工作组(job)
* 函数参数:
* handle - 输入参数, 对应xmedia_tde_create_job得到的有效句柄
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NOT_INIT - tde模块未初始化
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_NOT_PERMITTED - 操作不允许
* 注意:异步提交, 接口返回不代表硬件已经完成,可使用xmedia_vgs_wait_job同步
*/
xmedia_s32 xmedia_tde_cancel_job(xmedia_s32 handle);
/*
* 函数功能: 等待指定的工作组(job)完成
* 函数参数:
* handle - 输入参数, 对应xmedia_tde_create_job得到的有效句柄
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NOT_INIT - tde模块未初始化
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_TIMEOUT - 等待超时
*/
xmedia_s32 xmedia_tde_wait_job(xmedia_s32 handle, xmedia_u32 timeout);
/*
* 函数功能: 指定alpha阈值
* 函数参数:
* value - 输入参数, alpha阈值 0~255
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NOT_INIT - tde模块未初始化
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
*/
xmedia_s32 xmedia_tde_set_alpha_threshold_value(xmedia_u8 value);
/*
* 函数功能: 获取alpha阈值
* 函数参数:
* value - 输出参数, alpha阈值 0~255
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NOT_INIT - tde模块未初始化
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
*/
xmedia_s32 xmedia_tde_get_alpha_threshold_value(xmedia_u8 *value);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __XMEDIA_TDE_H__ */