Files

280 lines
10 KiB
C

/*
* Copyright (c) XMEDIA. All rights reserved.
*/
#ifndef __XMEDIA_VGS_H__
#define __XMEDIA_VGS_H__
#include "xmedia_errcode.h"
#include "xmedia_video_common.h"
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#define XMEDIA_VGS_CLUT_LEN 16
#define XMEDIA_VGS_POINT_NUM 4
typedef struct {
xmedia_video_frame_info img_in;
xmedia_video_frame_info img_out;
} xmedia_vgs_frame_info;
typedef struct {
xmedia_video_point start_point;
xmedia_video_point end_point;
xmedia_u32 thick;
xmedia_u32 color; // 颜色值固定按照ARGB8888解析,alpha固定0xff,RGB用户可配,范围[0x0, 0x00ffffff]
} xmedia_vgs_line_attr;
typedef enum {
XMEDIA_VGS_COVER_TYPE_RECT = 0,
XMEDIA_VGS_COVER_TYPE_QUAD_RANGLE,
XMEDIA_VGS_COVER_TYPE_MAX
} xmedia_vgs_cover_type;
typedef struct {
xmedia_bool is_solid;
xmedia_u32 thick;
xmedia_video_point points[XMEDIA_VGS_POINT_NUM];
} xmedia_vgs_quadrangle_cover;
typedef struct {
xmedia_vgs_cover_type cover_type;
union {
xmedia_video_rect dst_rect;
xmedia_vgs_quadrangle_cover quadrangle;
};
xmedia_u32 color;
} xmedia_vgs_cover_attr;
typedef enum {
XMEDIA_VGS_OSD_REVERT_MODE_RGB = 0,
XMEDIA_VGS_OSD_REVERT_MODE_ALPHA,
XMEDIA_VGS_OSD_REVERT_MODE_BOTH,
XMEDIA_VGS_OSD_REVERT_MODE_MAX
} xmedia_vgs_osd_revert_mode;
typedef struct {
xmedia_video_rect osd_rect;
xmedia_video_pixel_format pixel_fmt;
xmedia_u64 phys_addr;
xmedia_u32 stride;
xmedia_u8 alpha0; // 仅用于位图是ARGB1555的场景, alpha值为0时使用alpha0
xmedia_u8 alpha1; // 仅用于位图是ARGB1555的场景, alpha值为1时使用alpha1
xmedia_bool is_osd_revert;
xmedia_vgs_osd_revert_mode revert_mode;
xmedia_u32 clut[XMEDIA_VGS_CLUT_LEN];
} xmedia_vgs_osd_attr;
typedef struct {
xmedia_video_size dst_img_size;
xmedia_video_point out_block_offset;
} xmedia_vgs_block_info;
/*
* 函数功能: 初始化vgs模块
* 函数参数:
* NA
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NOT_READY - 驱动未加载
*/
xmedia_s32 xmedia_vgs_init(xmedia_void);
/*
* 函数功能: 去初始化vgs模块
* 函数参数:
* NA
* 返回值:
* NA
*/
xmedia_void xmedia_vgs_exit(xmedia_void);
/*
* 函数功能: 创建job
* 函数参数:
* handle - 输出参数, 对应job的有效句柄
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NULL_PTR - 空指针
* XMEDIA_ERRCODE_NOT_INIT - vgs系统没有准备好
* XMEDIA_ERRCODE_BUFFER_EMPTY - 没有空闲的job资源
*/
xmedia_s32 xmedia_vgs_create_job(xmedia_s32 *handle);
/*
* 函数功能: 添加缩放task到指定的job
* 函数参数:
* handle - 输入参数, 对应xmedia_vgs_create_job得到的有效句柄
* frame_info - 输入参数, 输入、输出帧信息
* scale_mode - 输入参数, 缩放模式
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NULL_PTR - 空指针
* XMEDIA_ERRCODE_NOT_INIT - vgs系统没有准备好
* XMEDIA_ERRCODE_BUFFER_EMPTY - 没有空闲的job资源
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_NOT_SUPPORT - 参数配置超出能力范围,不支持
* XMEDIA_ERRCODE_NOT_PERMITTED - 操作不允许(如已经提交的job不可再添加任务)
*/
xmedia_s32 xmedia_vgs_add_task_scale(xmedia_s32 handle, const xmedia_vgs_frame_info *frame_info,
xmedia_video_scale_mode scale_mode);
/*
* 函数功能: 添加画线task到指定的job
* 函数参数:
* handle - 输入参数, 对应xmedia_vgs_create_job得到的有效句柄
* frame_info - 输入参数, 输入、输出帧信息
* line - 输入参数, 线条属性信息
* num - 输入参数, 线条个数
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NULL_PTR - 空指针
* XMEDIA_ERRCODE_NOT_INIT - vgs系统没有准备好
* XMEDIA_ERRCODE_BUFFER_EMPTY - 没有空闲的job资源
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_NOT_SUPPORT - 参数配置超出能力范围,不支持
* XMEDIA_ERRCODE_NOT_PERMITTED - 操作不允许(如已经提交的job不可再添加任务)
*/
xmedia_s32 xmedia_vgs_add_task_line(xmedia_s32 handle, const xmedia_vgs_frame_info *frame_info,
const xmedia_vgs_line_attr *line, xmedia_u32 num);
/*
* 函数功能: 添加遮挡task到指定的job
* 函数参数:
* handle - 输入参数, 对应xmedia_vgs_create_job得到的有效句柄
* frame_info - 输入参数, 输入、输出帧信息
* cover - 输入参数, 遮挡属性信息
* num - 输入参数, 遮挡个数
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NULL_PTR - 空指针
* XMEDIA_ERRCODE_NOT_INIT - vgs系统没有准备好
* XMEDIA_ERRCODE_BUFFER_EMPTY - 没有空闲的job资源
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_NOT_SUPPORT - 参数配置超出能力范围,不支持
* XMEDIA_ERRCODE_NOT_PERMITTED - 操作不允许(如已经提交的job不可再添加任务)
*/
xmedia_s32 xmedia_vgs_add_task_cover(xmedia_s32 handle, const xmedia_vgs_frame_info *frame_info,
const xmedia_vgs_cover_attr *cover, xmedia_u32 num);
/*
* 函数功能: 添加叠加位图task到指定的job
* 函数参数:
* handle - 输入参数, 对应xmedia_vgs_create_job得到的有效句柄
* frame_info - 输入参数, 输入、输出帧信息
* osd - 输入参数, 位图属性信息
* num - 输入参数, 位图个数
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NULL_PTR - 空指针
* XMEDIA_ERRCODE_NOT_INIT - vgs系统没有准备好
* XMEDIA_ERRCODE_BUFFER_EMPTY - 没有空闲的job资源
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_NOT_SUPPORT - 参数配置超出能力范围,不支持
* XMEDIA_ERRCODE_NOT_PERMITTED - 操作不允许(如已经提交的job不可再添加任务)
*/
xmedia_s32 xmedia_vgs_add_task_osd(xmedia_s32 handle, const xmedia_vgs_frame_info *frame_info,
const xmedia_vgs_osd_attr *osd, xmedia_u32 num);
/*
* 函数功能: 添加旋转task到指定的job
* 函数参数:
* handle - 输入参数, 对应xmedia_vgs_create_job得到的有效句柄
* frame_info - 输入参数, 输入、输出帧信息
* rotation - 输入参数, 旋转角度
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NULL_PTR - 空指针
* XMEDIA_ERRCODE_NOT_INIT - vgs系统没有准备好
* XMEDIA_ERRCODE_BUFFER_EMPTY - 没有空闲的job资源
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_NOT_SUPPORT - 参数配置超出能力范围,不支持
* XMEDIA_ERRCODE_NOT_PERMITTED - 操作不允许(如已经提交的job不可再添加任务)
*/
xmedia_s32 xmedia_vgs_add_task_rotation(xmedia_s32 handle, const xmedia_vgs_frame_info *frame_info,
xmedia_video_rotation rotation);
/*
* 函数功能: 添加亮度统计task到指定的job
* 函数参数:
* handle - 输入参数, 对应xmedia_vgs_create_job得到的有效句柄
* frame_info - 输入参数, 输入、输出帧信息
* luma_rect - 输入参数, 亮度统计区域
* num - 输入参数, 区域个数,针对luma_rect和luma_data同时生效
* luma_data - 输出参数, 亮度统计结果
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NULL_PTR - 空指针
* XMEDIA_ERRCODE_NOT_INIT - vgs系统没有准备好
* XMEDIA_ERRCODE_BUFFER_EMPTY - 没有空闲的job资源
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_NOT_SUPPORT - 参数配置超出能力范围,不支持
* XMEDIA_ERRCODE_NOT_PERMITTED - 操作不允许(如已经提交的job不可再添加任务)
*/
xmedia_s32 xmedia_vgs_add_task_luma(xmedia_s32 handle, const xmedia_vgs_frame_info *frame_info,
const xmedia_video_rect *luma_rect, xmedia_u32 num, xmedia_u64 *luma_data);
/*
* 函数功能: 添加block scale task到指定的job
* 函数参数:
* handle - 输入参数, 对应xmedia_vgs_create_job得到的有效句柄
* frame_info - 输入参数, 输入原图(整图)、输出分块帧信息
* block_info - 输入参数, 分块信息
* scale_mode - 输入参数, 缩放模式
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NULL_PTR - 空指针
* XMEDIA_ERRCODE_NOT_INIT - vgs系统没有准备好
* XMEDIA_ERRCODE_BUFFER_EMPTY - 没有空闲的job资源
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_NOT_SUPPORT - 参数配置超出能力范围,不支持
* XMEDIA_ERRCODE_NOT_PERMITTED - 操作不允许(如已经提交的job不可再添加任务)
*/
xmedia_s32 xmedia_vgs_add_task_block_scale(xmedia_s32 handle, const xmedia_vgs_frame_info *frame_info,
const xmedia_vgs_block_info *block_info, xmedia_video_scale_mode scale_mode);
/*
* 函数功能: 提交job
* 函数参数:
* handle - 输入参数, 对应xmedia_vgs_create_job得到的有效句柄
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NOT_INIT - vgs系统没有准备好
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_NOT_PERMITTED - 操作不允许
*/
xmedia_s32 xmedia_vgs_submit_job(xmedia_s32 handle);
/*
* 函数功能: 取消job
* 函数参数:
* handle - 输入参数, 对应xmedia_vgs_create_job得到的有效句柄
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NOT_INIT - vgs系统没有准备好
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_NOT_PERMITTED - 操作不允许
* 注意:异步提交, 接口返回不代表硬件已经完成,可使用xmedia_vgs_wait_job同步
*/
xmedia_s32 xmedia_vgs_cancel_job(xmedia_s32 handle);
/*
* 函数功能: 等待job完成
* 函数参数:
* handle - 输入参数, 对应xmedia_vgs_create_job得到的有效句柄
* 返回值:
* XMEDIA_SUCCESS - 函数执行成功
* XMEDIA_ERRCODE_NOT_INIT - vgs系统没有准备好
* XMEDIA_ERRCODE_INVALID_PARAM - 参数不合法
* XMEDIA_ERRCODE_TIMEOUT - 等待超时
*/
xmedia_s32 xmedia_vgs_wait_job(xmedia_s32 handle, xmedia_u32 timeout);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* __XMEDIA_VGS_H__ */