K230 nonai 2D API参考#

1. 概述#

1.1 概述#

nonai 2D硬件能实现OSD,画框和CSC功能,本文仅仅描述CSC功能,OSD和画框功能暂未在本文API中实现,后续如有需求可以增加。

VENC模块借助nonai 2D硬件实现了在编码图像上叠加OSD和画框,仅限于编码图像不能单独使用,见《K230_视频编解码_API参考》的1.2.1.4和2.1.14 ~ 2.1.29等章节。

1.2 功能描述#

实现RGB和YUV的相互转换,作为mpp的一个模块,可参与系统绑定功能,在不绑定的情况下可以做单帧处理。

支持如下图像格式的互转:

PIXEL_FORMAT_YUV_SEMIPLANAR_420

PIXEL_FORMAT_YVU_PLANAR_420

PIXEL_FORMAT_YUV_PACKAGE_444

PIXEL_FORMAT_YVU_PLANAR_444

PIXEL_FORMAT_RGB_565

PIXEL_FORMAT_RGB_888

PIXEL_FORMAT_RGB_888_PLANAR

代码示例:

k_nonai_2d_chn_attr attr_2d;
k_video_frame_info input;
k_video_frame_info output;
int ch = 0;

attr_2d.mode = K_NONAI_2D_CALC_MODE_CSC;
attr_2d.dst_fmt = PIXEL_FORMAT_YUV_SEMIPLANAR_420;
kd_mpi_nonai_2d_create_chn(ch, &attr_2d);
kd_mpi_nonai_2d_start_chn(ch);

input.v_frame.pixel_format = PIXEL_FORMAT_RGB_888;
kd_mpi_nonai_2d_send_frame(ch, &input, 1000);
kd_mpi_nonai_2d_get_frame(ch, &output, 1000);

kd_mpi_nonai_2d_stop_chn(ch);
kd_mpi_nonai_2d_destroy_chn(ch);

2. API参考#

2.1 kd_mpi_nonai_2d_create_chn#

【描述】

创建通道。

【语法】

k_s32 kd_mpi_nonai_2d_create_chn(k_u32 chn_num, const k_nonai_2d_chn_attr *attr);

【参数】

参数名称

描述

输入/输出

chn_num

通道号。 取值范围:[0, K_NONAI_2D_MAX_CHN_NUMS]。

输入

attr

通道属性指针。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【芯片差异】

无。

【需求】

  • 头文件:mpi_nonai_2d_api.h,k_type.h,k_module.h,k_sys_comm.h,k_nonai_2d_comm.h

  • 库文件:libvenc.a

【注意】

无。

【举例】

无。

【相关主题】

无。

2.2 kd_mpi_nonai_2d_destory_chn#

【描述】

销毁通道。

【语法】

k_s32 kd_mpi_nonai_2d_destory_chn(k_u32 chn_num);

【参数】

参数名称

描述

输入/输出

chn_num

通道号。 取值范围:[0, K_NONAI_2D_MAX_CHN_NUMS]。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【芯片差异】

无。

【需求】

  • 头文件:mpi_nonai_2d_api.h,k_type.h,k_module.h,k_sys_comm.h,k_nonai_2d_comm.h

  • 库文件:libvenc.a

【注意】

  • 销毁前必须调用kd_mpi_nonai_2d_stop_chn停止接收图像,否则返回失败。

【举例】

无。

【相关主题】

无。

2.3 kd_mpi_nonai_2d_start_chn#

【描述】

开启接收输入图像。

【语法】

k_s32 kd_mpi_nonai_2d_start_chn(k_u32 chn_num);

【参数】

参数名称

描述

输入/输出

chn_num

通道号。 取值范围:[0, K_NONAI_2D_MAX_CHN_NUMS]。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【芯片差异】

无。

【需求】

  • 头文件:mpi_nonai_2d_api.h,k_type.h,k_module.h,k_sys_comm.h,k_nonai_2d_comm.h

  • 库文件:libvenc.a

【注意】

  • 如果通道未创建,则返回失败K_ERR_NONAI_2D_UNEXIST。

  • 如果通道已经开始接收图像,没有停止接收图像前再一次调用此接口指定接收帧数,返回操作不允许。

  • 只有开启接收之后才开始处理帧。

【举例】

无。

【相关主题】

无。

2.4 kd_mpi_nonai_2d_stop_chn#

【描述】

停止接收输入图像。

【语法】

k_s32 kd_mpi_nonai_2d_stop_chn(k_u32 chn_num);

【参数】

参数名称

描述

输入/输出

chn_num

通道号。 取值范围:[0, K_NONAI_2D_MAX_CHN_NUMS]。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【芯片差异】

无。

【需求】

  • 头文件:mpi_nonai_2d_api.h,k_type.h,k_module.h,k_sys_comm.h,k_nonai_2d_comm.h

  • 库文件:libvenc.a

【注意】

  • 如果通道未创建,则返回失败。

  • 此接口并不判断当前是否停止接收,即允许重复停止接收不返回错误。

  • 此接口用于停止接收图像,在通道销毁或复位前必须停止接收图像。

  • 调用此接口仅停止接收原始数据,frame buffer并不会被清除。

【举例】

无。

【相关主题】

无。

2.5 kd_mpi_nonai_2d_get_frame#

【描述】

获取处理后的图像。

【语法】

k_s32 kd_mpi_nonai_2d_get_frame(k_u32 chn_num, k_video_frame_info *frame, k_s32 milli_sec);

【参数】

参数名称

描述

输入/输出

chn_num

通道号。 取值范围:[0, K_NONAI_2D_MAX_CHN_NUMS]。

输入

frame

图像结构体指针.

输出

milli_sec

获取图像超时时间。 取值范围: [-1, +∞] -1:阻塞。 0:非阻塞。 大于0:超时时间

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【芯片差异】

无。

【需求】

  • 头文件:mpi_nonai_2d_api.h,k_type.h,k_module.h,k_sys_comm.h,k_nonai_2d_comm.h

  • 库文件:libvenc.a

【注意】

  • 如果通道未创建,返回失败。

  • 如果frame为空,返回K_ERR_NONAI_2D_NULL_PTR。

  • 如果milli_sec小于-1,返回K_ERR_NONAI_2D_ILLEGAL_PARAM。

【举例】

无。

【相关主题】

无。

2.6 kd_mpi_nonai_2d_release_frame#

【描述】

释放图像缓存。

【语法】

k_s32 kd_mpi_nonai_2d_release_frame(k_u32 chn_num, k_video_frame_info *frame);

【参数】

参数名称

描述

输入/输出

chn_num

通道号。 取值范围:[0, K_NONAI_2D_MAX_CHN_NUMS]。

输入

frame

图像结构体指针。

输出

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【芯片差异】

无。

【需求】

  • 头文件:mpi_nonai_2d_api.h,k_type.h,k_module.h,k_sys_comm.h,k_nonai_2d_comm.h

  • 库文件:libvenc.a

【注意】

  • 如果通道未创建,则返回错误码K_ERR_NONAI_2D_UNEXIST。

  • 如果frame为空,则返回错误码K_ERR_NONAI_2D_NULL_PTR。

【举例】

无。

【相关主题】

无。

2.7 kd_mpi_nonai_2d_send_frame#

【描述】

支持用户发送原始图像进行2D运算。

【语法】

k_s32 kd_mpi_nonai_2d_send_frame(k_u32 chn_num, k_video_frame_info *frame, k_s32 milli_sec);

【参数】

参数名称

描述

输入/输出

chn_num

通道号。 取值范围:[0, K_NONAI_2D_MAX_CHN_NUMS]。

输入

frame

原始图像信息结构指针,参考《K230 系统控制 API参考》。

输入

milli_sec

发送图像超时时间。 取值范围: [-1,+∞] -1:阻塞。 0:非阻塞。 > 0:超时时间。

输入

【返回值】

返回值

描述

0

成功。

非0

失败,参见错误码

【芯片差异】

无。

【需求】

  • 头文件:mpi_nonai_2d_api.h,k_type.h,k_module.h,k_sys_comm.h,k_nonai_2d_comm.h

  • 库文件:libvenc.a

【注意】

  • 此接口支持用户发送图像至通道。

  • 如果milli_sec小于-1,返回K_ERR_NONAI_2D_ILLEGAL_PARAM。

  • 调用该接口发送图像,用户需要保证通道已创建且开启接收输入图像。

【举例】

无。

【相关主题】

无。

3. 数据类型#

该功能模块的相关数据类型定义如下:

3.1 K_NONAI_2D_MAX_CHN_NUMS#

【说明】

定义最大通道个数。

【定义】

#define K_NONAI_2D_MAX_CHN_NUMS  24

【注意事项】

无。

【相关数据类型及接口】

无。

3.2 k_nonai_2d_calc_mode#

【说明】

定义2D运算模式。

【定义】

typedef enum
{
​     K_NONAI_2D_CALC_MODE_CSC = 0,    /* Color space conversion */
​     K_NONAI_2D_CALC_MODE_OSD,      /* On Screen Display */
​     K_NONAI_2D_CALC_MODE_BORDER,     /* Draw border */
​     K_NONAI_2D_CALC_MODE_OSD_BORDER,   /* OSD first, then draw border */
​     K_NONAI_2D_CALC_MODE_BUTT
} k_nonai_2d_calc_mode;

【成员】

成员名称

描述

mode

2D计算模式

【注意事项】

目前仅仅支持CSC模式,其他模式暂未实现。

【相关数据类型及接口】

无。

3.3 k_nonai_2d_chn_attr#

【说明】

定义通道属性。

【定义】

typedef struct
{
​      k_pixel_format dst_fmt;     /* Format of output image */
​      k_nonai_2d_calc_mode mode;
} k_nonai_2d_chn_attr;

【成员】

成员名称

描述

dst_fmt

输出图像的格式,见1.2章节

mode

2D计算模式,见3.2章节

【注意事项】

【相关数据类型及接口】

无。

3.4 k_nonai_2d_color_gamut#

【说明】

定义CSC的颜色类型,默认是BT601。

【定义】

typedef enum
{
​     NONAI_2D_COLOR_GAMUT_BT601 = 0,
​     NONAI_2D_COLOR_GAMUT_BT709,
​     NONAI_2D_COLOR_GAMUT_BT2020,
​     NONAI_2D_COLOR_GAMUT_BUTT
} k_nonai_2d_color_gamut;

【注意事项】

无。

【相关数据类型及接口】

无。

4. MAPI#

4.1概述#

MAPI是在小核调用,用以创建nonai_2d通道。

4.2 kd_mapi_nonai_2d_init#

【描述】

初始化通道。

【语法】

k_s32 kd_mapi_nonai_2d_init(k_u32 chn_num, k_nonai_2d_chn_attr * attr)

【参数】

参数名称

描述

输入/输出

chn_num

NONAI_2D 通道号 取值范围:[0, K_NONAI_2D_MAX_CHN_NUMS]

输入

pst_nonai_2d_attr

NONAI_2D 通道属性指针。 静态属性。

输入

【返回值】

返回值

描述

0

成功

非0

失败,其值为错误码

【芯片差异】

无 。

【需求】

头文件:mapi_nonai_2d_api.h、k_nonai_2d_comm.h 库文件:libmapi.a libipcmsg.a libdatafifo.a

【注意】

  • 调用该接口前需要先初始化kd_mapi_sys_init ()和kd_mapi_media_init ()成功,详见“SYS MAPI”章节。

  • 重复初始化返回成功。

【举例】

无。

【相关主题】

无。

4.3 kd_mapi_nonai_2d_deinit#

【描述】

通道去初始化。

【语法】

k_s32 kd_mapi_nonai_2d_deinit(k_u32 chn_num)

【参数】

参数名称

描述

输入/输出

chn_num

NONAI_2D 通道号 取值范围:[0, K_NONAI_2D_MAX_CHN_NUMS]

输入

【返回值】

返回值

描述

0

成功

非0

失败,其值为错误码

【芯片差异】

无 。

【需求】

头文件:mapi_nonai_2d_api.h、k_nonai_2d_comm.h 库文件:libmapi.a libipcmsg.a libdatafifo.a

【注意】

无。

【举例】

无。

【相关主题】

无。

4.4 kd_mapi_nonai_2d_start#

【描述】

启动通道。

【语法】

k_s32 kd_mapi_nonai_2d_start(k_s32 chn_num);

【参数】

参数名称

描述

输入/输出

chn_num

NONAI_2D 通道号 取值范围:[0, K_NONAI_2D_MAX_CHN_NUMS]

输入

【返回值】

返回值

描述

0

成功

非0

失败,其值为错误码

【芯片差异】

无 。

【需求】

头文件:mapi_nonai_2d_api.h、k_nonai_2d_comm.h 库文件:libmapi.a libipcmsg.a libdatafifo.a

【注意】

无。

【举例】

无。

【相关主题】

4.5 kd_mapi_nonai_2d_stop#

【描述】

停止通道。

【语法】

k_s32 kd_mapi_nonai_2d_stop(k_s32 chn_num);

【参数】

参数名称

描述

输入/输出

chn_num

NONAI_2D 通道号 取值范围:[0, K_NONAI_2D_MAX_CHN_NUMS]

输入

【返回值】

返回值

描述

0

成功

非0

失败,其值为错误码

【芯片差异】

无。

【需求】

头文件:mapi_nonai_2d_api.h、k_nonai_2d_comm.h 库文件:libmapi.a libipcmsg.a libdatafifo.a

【注意】

无。

【举例】

无。

【相关主题】

5. 错误码#

表 41 API 错误码

错误代码

宏定义

描述

0xa0188001

K_ERR_NONAI_2D_INVALID_DEVID

设备ID超出合法范围

0xa0188002

K_ERR_NONAI_2D_INVALID_CHNID

通道ID超出合法范围

0xa0188003

K_ERR_NONAI_2D_ILLEGAL_PARAM

参数超出合法范围

0xa0188004

K_ERR_NONAI_2D_EXIST

试图申请或者创建已经存在的设备、通道或者资源

0xa0188005

K_ERR_NONAI_2D_UNEXIST

试图使用或者销毁不存在的设备、通道或者资源

0xa0188006

K_ERR_NONAI_2D_NULL_PTR

函数参数中有空指针

0xa0188007

K_ERR_NONAI_2D_NOT_CONFIG

使用前未配置

0xa0188008

K_ERR_NONAI_2D_NOT_SUPPORT

不支持的参数或者功能

0xa0188009

K_ERR_NONAI_2D_NOT_PERM

该操作不允许,如试图修改静态配置参数

0xa018800c

K_ERR_NONAI_2D_NOMEM

分配内存失败,如系统内存不足

0xa018800d

K_ERR_NONAI_2D_NOBUF

分配缓存失败,如申请的数据缓冲区太大

0xa018800e

K_ERR_NONAI_2D_BUF_EMPTY

缓冲区中无数据

0xa018800f

K_ERR_NONAI_2D_BUF_FULL

缓冲区中数据满

0xa0188010

K_ERR_NONAI_2D_NOTREADY

系统没有初始化或没有加载相应模块

0xa0188011

K_ERR_NONAI_2D_BADADDR

地址超出合法范围

0xa0188012

K_ERR_NONAI_2D_BUSY

NONAI_2D系统忙

6. 调试信息#

多媒体内存管理和和系统绑定调试信息,请参考《K230 系统控制 API参考》。