AclLite库是对当前开源社区样例中
1.Atlas200DK板载摄像头
2.acl dvpp图像和视频处理
3.acl设备资源、模型推理接口
等重复代码进行封装,为用户提供的一组简易公共接口。
注意:
1.本库仅供当前社区开源样例使用,不覆盖ascend平台应用开发的所有场景,不作为用户应用开发的标准库;
2.本库仅在Atlas200DK和Atlas300(x86)服务器上做了验证;
3.该公共库仅作为一个参考,用户可以根据自身使用习惯和实际业务对性能的要求,根据官方接口文档和现有代码进行二次开发或重构。
| 适配项 | 适配条件 | 备注 |
|---|---|---|
| 适配版本 | CANN>=5.0.4 | 请到CANN社区版下载对应版本软件包 |
| 设备形态 | Atlas200DK/Atlas300(ai1s) | 当前已在Atlas200DK和Atlas300测试通过,产品说明请参考硬件平台 |
| 第三方依赖 | presentagent, ffmpeg | 请参考第三方依赖安装指导(C++样例)完成对应安装 |
-
获取源码包
可以使用以下两种方式下载,请选择其中一种即可
- 命令行下载
# 开发环境,非root用户命令行中执行以下命令下载源码仓。 cd ${HOME} git clone https://github.com/Ascend/samples.git - 压缩包下载
# 1. samples仓右上角选择 【克隆/下载】 下拉框并选择 【下载ZIP】。 # 2. 将ZIP包上传到开发环境中的普通用户家目录中,【例如:${HOME}/ascend-samples-master.zip】。 # 3. 开发环境中,执行以下命令,解压zip包。 cd ${HOME} unzip ascend-samples-master.zip
- 命令行下载
2.进入acllite目录
cd ${HOME}/samples/cplusplus/common/acllite
3.执行编译安装命令。
make
make install
4.确认安装
若安装正常完成,编译生成的libacllite.so将被拷贝到${THIRDPART_PATH}/lib路径下;头文件被拷贝到${THIRDPART_PATH}/include/acllite路径。
-
昇腾AI设备安装开发环境,同时作为运行环境场景:
不需要另外部署。
-
非昇腾AI设备上安装开发环境场景:
- 将libacllite.so拷贝到运行环境的
${THIRDPART_PATH}/lib路径。 - 在运行环境下切换到 root用户,打开
/etc/ld.so.conf.d/mind_so.conf,将${THIRDPART_PATH}/lib追加到文件末尾,保存后退出,执行命令ldconfig。
- 将libacllite.so拷贝到运行环境的
注:开发环境是指编译应用代码的环境;运行环境是指运行应用的昇腾AI设备;两者可以在同一个硬件设备上,也可以是分离的。
AclLite公共库主要根据面向对象原则设计,按处理对象主要分为以下功能模块:
-
资源管理模块,负责对acl推理资源的初始化与释放;
-
模型推理模块,负责对模型资源的初始化,输入输出创建,推理调用,资源释放;
-
图片处理模块,负责对图片类型数据的处理;
-
视频处理模块,负责对视频类型数据的处理;
-
应用及多线程模块,对编码一个简单多线程样例,提供了一套单例模式的应用-线程管理类-线程类接口,简化多线程样例开发;
-
其他文件,主要包括AclLite库中文件的工具函数文件、封装的结构体文件及错误码文件等等。
以下将按模块介绍接口功能及约束,当前仅对用户直接调用接口进行介绍。
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteResource() |
| 功能 | 构造函数,创建一个AclLiteResource对象 |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteResource(int32_t devId, const std::string& aclConfigPath, bool useDefaultCtx = true) |
| 功能 | 构造函数,创建一个AclLiteResource对象,并指定device,config配置文件和线程使用context |
| 参数 | devId:设备id aclConfigPath:config文件路径 useDefaultCtx:是否使用当前线程context |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | ~AclLiteResource() |
| 功能 | 析构函数,销毁AclLiteResource对象 |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError Init() |
| 功能 | 初始化函数,初始化Acl相关资源device、context |
| 参数 | 无 |
| 返回值 | ACLLITE_OK: 初始化成功 其他: 初始化失败 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void Release() |
| 功能 | 资源释放函数,释放Acl相关资源device、context |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | aclrtRunMode GetRunMode() |
| 功能 | 获取设备run mode |
| 参数 | 无 |
| 返回值 | ACL_DEVICE:昇腾AI软件栈运行在Device的Control CPU或板端环境 ACL_HOST:昇腾AI软件栈运行在Host侧 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | aclrtContext GetContext() |
| 功能 | 获取程序运行的context |
| 参数 | 无 |
| 返回值 | Context: nullptr:无效context 非nullptr:有效context |
该模块接口原型定义在AclLiteModel.h文件中,主要负责acl推理资源的初始化与释放。
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteModel() |
| 功能 | 构造函数,创建一个AclLiteModel类对象 |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteModel(const std::string& modelPath) |
| 功能 | 构造函数,创建一个AclLiteModel类对象,并提供待加载模型文件路径 |
| 参数 | modelPath:离线模型路径 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteModel(void *modelAddr, size_t modelSize) |
| 功能 | 构造函数,创建一个AclLiteModel类对象,并提供待加载模型文件内存地址和内存大小 |
| 参数 | modelAddr:离线模型文件内存地址 modelSize:离线模型文件内存大小 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | ~AclLiteModel() |
| 功能 | 析构函数,销毁一个AclLiteModel类对象 |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError Init() |
| 功能 | 初始化函数,需要用户提供好模型文件路径/模型文件内存地址 |
| 参数 | 无 |
| 返回值 | ACLLITE_OK:初始化成功 其他:初始化失败 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError Init(const std::string& modelPath) |
| 功能 | 初始化函数,提供待加载模型文件路径后再调用Init() |
| 参数 | modelPath:离线模型路径 |
| 返回值 | ACLLITE_OK:初始化成功 其他:初始化失败 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError Init(void *modelAddr, size_t modelSize) |
| 功能 | 初始化函数,提供待加载模型文件内存地址和内存大小 |
| 参数 | modelAddr:离线模型文件内存地址 modelSize:离线模型文件内存大小 |
| 返回值 | ACLLITE_OK:初始化成功 其他:初始化失败 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void DestroyResource() |
| 功能 | 资源释放函数,将AclLiteModel类对象相关资源,如模型输入输出、desc等数据成员释放置空 |
| 参数 | 无 |
| 返回值 | 无 |
| 备注 | isReleased_,防止资源多次释放报错而设置的标志位 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError CreateInput(void *input, uint32_t inputsize) |
| 功能 | 创建模型输入(场景:有一个输入的模型) |
| 参数 | input:模型输入数据 input1size:模型输入数据大小 |
| 约束 | 要求数据在device或者dvpp内存中 |
| 返回值 | ACLLITE_OK:创建成功 其他:创建失败 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError CreateInput(void input1, uint32_t input1size, void input2, uint32_t input2size) |
| 功能 | 创建模型输入(场景:有两个输入的模型) |
| 参数 | input1:模型第一个输入数据 input1size:模型第一个输入数据大小 input2:模型第二个输入数据 input2size:模型第二个输入数据大小 |
| 约束 | 要求数据在device或者dvpp内存中 |
| 返回值 | ACLLITE_OK:创建成功 其他:创建失败 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError CreateInput(std::vector& inputData) |
| 功能 | 创建模型输入(场景:有多个输入的模型) |
| 参数 | inputData:模型输入数据vector |
| 返回值 | ACLLITE_OK:创建成功 其他:创建失败 |
| 约束 | 要求数据在device或者dvpp内存中 |
| 备注 | DataInfo数据结构详见 DataInfo |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError Execute(std::vector& inferOutputs, void *data, uint32_t size, uint32_t batchsize = 0) |
| 功能 | 执行模型推理,该接口针对模型只有一个输入的场景,会先用第二、三个参数构建模型输入,再送去推理,支持动态batch特性,默认关闭 |
| 参数 | inferOutputs:模型推理结果 data:模型输入数据 size:模型输入数据大小 batchsize:动态batch模型单次推理batch数 |
| 返回值 | ACLLITE_OK:推理成功 其他:推理失败 |
| 备注 | 推理后结果数据存储在本地,如果是模型串接或再使用dvpp功能场景需要进行拷贝 InferenceOutput数据结构详见InferenceOutput |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError Execute(std::vector& inferOutputs) |
| 功能 | 执行模型推理 |
| 参数 | inferOutputs:模型推理结果 |
| 返回值 | ACLLITE_OK:推理成功 其他:推理失败 |
| 备注 | 推理后结果数据存储在本地,如果是模型串接或再使用dvpp功能场景需要进行拷贝 InferenceOutput数据结构详见InferenceOutput |
| 说明项 | 具体描述 |
|---|---|
| 函数 | size_t GetModelInputSize(int index) |
| 功能 | 获取模型输入数据大小 |
| 参数 | index:索引,标记是模型的第几个输入,index从0开始 |
| 返回值 | 模型输入数据大小 |
| 备注 | size单位为Byte |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void GetModelOutputInfo(vector& modelOutputInfo) |
| 功能 | 获取模型输出数据信息 |
| 参数 | modelOutputInfo:存储模型的输出节点信息 |
| 返回值 | ACLLITE_OK:获取成功 ACLLITE_ERROR:获取失败 |
| 备注 | ModelOutputInfo数据结构详见 ModelOutputInfo |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void DestroyInput() |
| 功能 | 销毁模型输入 |
| 参数 | 无 |
| 返回值 | 无 |
| 备注 | 只释放CreateInput()创建的dataset结构,不会释放输入的数据 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError LoadModelFromFile(const std::string& modelPath) |
| 功能 | 模型加载函数,从文件加载模型 |
| 参数 | modelPath:离线模型路径 |
| 返回值 | ACLLITE_OK:加载成功 其他:加载失败 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError LoadModelFromMem() |
| 功能 | 模型加载函数,从内存加载模型 |
| 参数 | 无 |
| 返回值 | ACLLITE_OK:加载成功 其他:加载失败 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError SetDesc() |
| 功能 | 创建并设置模型desc |
| 参数 | 无 |
| 返回值 | ACLLITE_OK:设置成功 其他:设置失败 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError CreateOutput() |
| 功能 | 创建模型输出 |
| 参数 | 无 |
| 返回值 | ACLLITE_OK:创建成功 其他:创建失败 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError AddDatasetBuffer(aclmdlDataset* dataset, void* buffer, uint32_t bufferSize) |
| 功能 | 创建databuffer并添加到dataset |
| 参数 | dataset:待添加databuffer的dataset buffer:创建databuffer的数据 bufferSize:数据大小 |
| 返回值 | ACLLITE_OK:添加成功 其他:添加失败 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError GetOutputItem(InferenceOutput& out, uint32_t idx) |
| 功能 | 按索引将推理结果取出并拷贝至本地 |
| 参数 | out:拷贝到本地的推理结果 idx:索引 |
| 返回值 | ACLLITE_OK:拷贝成功 其他:拷贝失败 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void Unload() |
| 功能 | 模型卸载函数,卸载已加载模型;如果模型是存放在内存中,则相应内存也一并释放 |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void DestroyDesc() |
| 功能 | 销毁模型desc |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void DestroyOutput() |
| 功能 | 销毁模型输出 |
| 参数 | 无 |
| 返回值 | 无 |
该模块接口原型定义在AclLiteImageProc.h文件中,主要负责图片类型数据的处理。
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteImageProc() |
| 功能 | 构造函数,创建一个AclLiteImageProc对象,便于对图片数据做处理 |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | ~AclLiteImageProc() |
| 功能 | 析构函数,销毁AclLiteImageProc对象 |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError Init() |
| 功能 | AclLiteImageProc对象初始化,指定后续使用dvpp功能所需的stream和channel |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError Resize(ImageData& dest,ImageData& src, uint32_t width, uint32_t height) |
| 功能 | 将图片缩放到指定大小 |
| 参数 | dest: 压缩后的图片 src: 待压缩图片 width: 缩放目标大小的宽度 height: 缩放目标大小的高度 |
| 返回值 | ACLLITE_OK: 缩放成功 其他: 缩放失败 |
| 约束 | 该接口对数据输入输出的相关约束请参考“昇腾社区文档中心”中的“VPC约束说明”请注意选择配套的CANN版本 |
| 备注 | acllite resize()在内部封装了对齐操作,使用的对齐参数为16x2,而对齐可能会使输出的缩放图片size与接口参数不一致,请注意 ImageData数据结构详见ImageData |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError PngD(ImageData& destRgb, ImageData& srcPng) |
| 功能 | 将png图片解码为rgb图片 |
| 参数 | destRgb:解码后的rgb图片 srcPng:待解码的png图片 |
| 返回值 | ACLLITE_OK: 解码成功 其他: 解码失败 |
| 约束 | 该接口对数据输入输出的相关约束请参考“昇腾社区文档中心”中的“pngD功能及约束说明”请注意选择配套的CANN版本 |
| 备注 | acllite PngD()在内部封装了对齐操作,当前使用的对齐参数为128x16,而对齐可能会使输出的解码图片size与原始图片宽高不一致,请注意 ImageData数据结构详见ImageData |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError JpegD(ImageData& destYuv, ImageData& srcJpeg) |
| 功能 | 将jpeg图片解码为yuv图片 |
| 参数 | destYuv:解码后的yuv图片 srcJpeg:待解码的jpeg图片 |
| 返回值 | ACLLITE_OK: 解码成功 其他: 解码失败 |
| 约束 | 该接口对数据输入输出的相关约束请参考“昇腾社区文档中心”中的“JPEGD功能及约束说明”请注意选择配套的CANN版本 |
| 备注 | acllite JpegD()在内部封装了对齐操作,当前使用的对齐参数为128x16,而对齐可能会使输出的解码图片size与原始图片宽高不一致,请注意 ImageData数据结构详见ImageData |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError JpegE(ImageData& destJpeg, ImageData& srcYuv) |
| 功能 | 将yuv图片编码为jpeg图片 |
| 参数 | destJpeg:编码后的jpeg图片 srcYuv:待编码的yuv图片 |
| 返回值 | ACLLITE_OK: 编码成功 其他: 编码失败 |
| 约束 | 该接口对数据输入输出的相关约束请参考“昇腾社区文档中心”中的“JPEGE功能及约束说明”请注意选择配套的CANN版本 |
| 备注 | acllite JpegE()在内部封装了对齐操作,当前使用的对齐参数为16x2,而对齐可能会使输出的编码图片size与原始图片宽高不一致,请注意,请注意 ImageData数据结构详见ImageData |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError Crop(ImageData& dest, ImageData& src, uint32_t ltHorz, uint32_t ltVert, uint32_t rbHorz, uint32_t rbVert) |
| 功能 | 抠图贴图,从原图抠出(ltHorz, ltVert)、(rbHorz, rbVert)两点确定的矩形区域,并贴至贴图区域(0, 0)(rbHorz-ltHorz, ltVert-rbVert) |
| 参数 | dest:抠图贴图后图片数据 src:待处理图片数据 ltHorz:左上点的X坐标 ltVert:左上点的Y坐标 rbHorz:右下点的X坐标 rbVert:右下点的Y坐标 |
| 返回值 | ACLLITE_OK: 处理成功 其他: 处理失败 |
| 约束 | 该接口对数据输入输出的相关约束请参考“昇腾社区文档中心”中的“VPC约束说明”请注意选择配套的CANN版本 |
| 备注 | acllite Crop()在内部封装了对齐操作,会对传入图片的宽高及坐标偏移值做自动化处理,满足VPC功能方面约束 ImageData数据结构详见ImageData |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError CropPaste(ImageData& dest, ImageData& src, uint32_t width, uint32_t height, uint32_t ltHorz, uint32_t ltVert, uint32_t rbHorz, uint32_t rbVert) |
| 功能 | 抠图贴图,从原图抠出(ltHorz, ltVert)、(rbHorz, rbVert)两点确定的矩形区域,并贴至贴图区域(0, 0)(width, height) |
| 参数 | dest:抠图贴图后图片数据 src:待处理图片数据 width:贴图后图片宽 height:贴图后图片高 ltHorz:确定抠图区域的左上点的X坐标 ltVert:确定抠图区域的左上点的Y坐标 rbHorz:确定抠图区域的右下点的X坐标 rbVert:确定抠图区域的右下点的Y坐标 |
| 返回值 | ACLLITE_OK: 处理成功 其他: 处理失败 |
| 约束 | 该接口对数据输入输出的相关约束请参考“昇腾社区文档中心”中的“VPC约束说明 |
| 备注 | 该接口处理完的图片数据,会对传入图片的宽高及坐标偏移值做自动化处理,满足VPC功能方面约束 ImageData数据结构详见ImageData |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError ProportionPaste(ImageData& dest, ImageData& src, uint32_t ltHorz, uint32_t ltVert, uint32_t rbHorz, uint32_t rbVert); |
| 功能 | 等比例贴图, 将原始图片数据在不改变宽高比的情况下,贴至区域(0, 0)(rbHorz-ltHorz, ltVert-rbVert) |
| 参数 | dest:抠图贴图后图片数据 src:待处理图片数据 ltHorz:左上点的X坐标 ltVert:左上点的Y坐标 rbHorz:右下点的X坐标 rbVert:右下点的Y坐标 |
| 返回值 | ACLLITE_OK: 处理成功 其他: 处理失败 |
| 约束 | 该接口对数据输入输出的相关约束请参考“昇腾社区文档中心”中的“VPC约束说明 |
| 备注 | 该接口处理完的图片数据,会对传入图片的宽高及坐标偏移值做自动化处理,满足VPC功能方面约束,因此可能会有绿边产生,介意者需要使用AIPP功能消除 由于是等比例贴图,操作后贴图区域的空白区域会被绿边填充,如原始图片区域为(0,0)(200,100),贴图区域为(0,0)(50,50),则(0,0)(50,25)区域为有效图片数据,(0,25)(50,50)会被绿边填充(该例中dvpp对齐约束先忽略不计,以左上角为原点,x轴往右y轴往下为正方向) ImageData数据结构详见ImageData |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError ProportionPasteCenter(ImageData& dest, ImageData& src, uint32_t width, uint32_t height); |
| 功能 | 中心等比例贴图, 将原始图片数据在不改变宽高比的情况下,贴至贴图区域(width,height)中央 |
| 参数 | dest:抠图贴图后图片数据 src:待处理图片数据 width:贴图区域图片宽 height:贴图区域图片高 |
| 返回值 | ACLLITE_OK: 处理成功 其他: 处理失败 |
| 约束 | 该接口对数据输入输出的相关约束请参考“昇腾社区文档中心”中的“VPC约束说明 |
| 备注 | 该接口处理完的图片数据,会对传入图片的宽高及坐标偏移值做自动化处理,满足VPC功能方面约束,因此可能会有绿边产生,介意者需要使用AIPP功能消除 由于是等比例贴图,操作后贴图区域的空白区域会被绿边填充 ImageData数据结构详见ImageData |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void DestroyResource() |
| 功能 | 销毁AclLiteImageProc类对象的相关资源 |
| 参数 | 无 |
| 返回值 | 无 |
该模块接口负责对视频类型数据的处理。
该类为Atlas200DK板载摄像头、RTSP视频流、mp4文件和H264/H265裸流文件解码及yuv图片编码,该类的原型定义在AclLiteVideoProc.h文件中。
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteVideoProc() |
| 功能 | 构造函数,生成摄像头实例;如果0槽位摄像头可用,则选择0槽位;否则选择槽位1;如果两个摄像头都不可用,只生成实例,不会打开任何摄像头 |
| 参数 | 无,但是正常打开后,会指定分辨率参数:宽为1280,高为720,帧率为15 |
| 返回值 | 无 |
| 约束 | 1. 只支持Atlas200dk设备形态 2. 若使用的RASPBERRY PI V2.1型号的摄像头,摄像头支持设置的帧率范围为:[1-20] 3. 若使用的RASPBERRY PI V1.3型号的摄像头,摄像头支持设置的帧率范围为:[1-15] 4. 摄像头默认分辨率参数设置需要符合驱动要求,当前支持5种分辨率:1920x1080,1280x720,704x576,704x288,352x288 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteVideoProc(uint32_t cameraId, uint32_t width = 1280, uint32_t height = 720, uint32_t fps = 15) |
| 功能 | 构造函数,生成摄像头实例;如果该摄像头不可用,只生成实例,不会打开摄像头 |
| 参数 | cameraId:摄像头id,0 表示CAMERA0槽位的摄像头,1 表示CAMERA1槽位的摄像头 width:摄像头分辨率宽 height:摄像头分辨率高 fps:摄像头帧率 |
| 返回值 | 无 |
| 约束 | 1. 只支持Atlas200dk 2. 若使用的RASPBERRY PI V2.1型号的摄像头,摄像头支持设置的帧率范围为:[1-20] 3. 若使用的RASPBERRY PI V1.3型号的摄像头,摄像头支持设置的帧率范围为:[1-15] 4. 摄像头默认分辨率参数设置需要符合驱动要求,当前支持5种分辨率:1920x1080,1280x720,704x576,704x288,352x288 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteVideoProc(const string& videoPath, aclrtContext context) |
| 功能 | 构造函数,创建等待解码的视频/rtsp流实例 |
| 参数 | videoPath:等待解码的视频文件地址/rtsp流地址 context:解码器使用dvpp vdec功能解码时使用的acl context;可不填,则传入参数视为nullptr,并使用当前线程的context做解码 |
| 返回值 | 无 |
| 约束 | 1. 请参见“昇腾社区文档中心”中“应用开发”手册的VDEC功能及约束,请注意选择对应的CANN版本。 2. 在创建实例前需要初始化acl(aclInit)和设置device(aclrtSetDevice) |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteVideoProc(VencConfig& vencConfig, aclrtContext context) |
| 功能 | 构造函数,创建等待编码的视频实例 |
| 参数 | vencConfig:编码配置文件,VencConfig类型结构体,结构体详见于VencConfig context:解码器使用dvpp venc功能编码时使用的acl context;可不填,则传入参数视为nullptr,并使用当前线程的context做解码 |
| 返回值 | 无 |
| 约束 | 1. 请参见“昇腾社区文档中心”中“应用开发”手册的VENC功能及约束,请注意选择对应的CANN版本。 2. 在创建实例前需要初始化acl(aclInit)和设置device(aclrtSetDevice) |
| 说明项 | 具体描述 |
|---|---|
| 函数 | ~AclLiteVideoProc() |
| 功能 | 析构函数 |
| 参数 | 无 |
| 返回值 | 无 |
| 约束 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError Open() |
| 功能 | 打开摄像头/视频流 |
| 参数 | 无 |
| 返回值 | ACLLITE_OK:打开成功 非ACLLITE_OK:打开失败 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | bool IsOpened() |
| 功能 | 判断摄像头或者视频流是否已经打开 |
| 参数 | 无 |
| 返回值 | true: 已经打开摄像头,或者可以解码视频流 false: 摄像头不可用,或者视频流无法解码 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | uint32_t Get(StreamProperty key) |
| 功能 | 根据key值获取对应属性实际值 |
| 参数 | key:枚举类型StreamProperty,详见AclLiteVideoCapBase类 |
| 返回值 | 属性值 |
| 约束 | 需要根据各构造函数实际生成对象的get(),判断是否支持key值对应属性的获取 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError Set(StreamProperty key, uint32_t value) |
| 功能 | 根据key值设置对应属性实际值 |
| 参数 | key:枚举类型StreamProperty,详见AclLiteVideoCapBase类 value:属性值 |
| 返回值 | ACLLITE_OK:设置成功 非ACLLITE_OK:设置失败 |
| 约束 | 需要根据各构造函数实际生成对象的get(),判断是否支持key值对应属性的设置 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError Read(ImageData& frame) |
| 功能 | 获取要被处理的一帧图像数据; 根据构造函数,目前有以下三种场景: 1.从摄像头读取的一帧数据; 2.从视频文件/rtsp流读入的一帧数据; 3.被dvpp venc处理的一帧数据 |
| 参数 | frame:输入的图像数据和属性,ImageData结构数据,该结构详见ImageData |
| 返回值 | ACLLITE_OK:读入成功 非ACLLITE_OK:读入失败 |
| 约束 | 获取的数据内存为dvpp内存,因为该内存不能在不同的context间传递,所以创建解码器时传入的context和调用Read接口线程的context必须相同,否则图像数据不可用 |
| 备注 | 注意在预处理后处理时,是否存在数据要在dvpp、device与host之间拷贝的场景 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError Close() |
| 功能 | 停止读入图片数据 |
| 参数 | 无 |
| 返回值 | ACLLITE_OK:关闭/停止成功 非ACLLITE_OK:关闭/停止失败 |
该类的原型定义在AclLiteVideoCapBase.h文件中;公共库通过对该类做继承,派生出CameraCapture、VideoCapture、VideoWriter这三个类并对其应有功能进行一定规定,从而使这三个类能够被AclLiteVideoProc整合调用,并提供给用户使用。 CameraCapture类:实现从摄像头读取图片帧; VideoCapture类:实现从视频读取图片帧; VideoWriter类:实现将一个个图片帧写成视频文件。
用户可以通过继承该类,进行二次开发,从而根据自身实际业务场景,完成对视频处理模块的功能定制与增加;甚至公共库更起到抛砖引玉的作用——用户可以参考AclLite这种思路,根据自身使用习惯和需要的功能自行对AscendCL接口进行梳理和封装,从而方便使用。
| 说明项 | 具体描述 |
|---|---|
| 枚举类型 | StreamProperty |
| 功能 | 标记可设置的属性 |
| 参数 | FRAME_WIDTH = 1 // 图像宽 FRAME_HEIGHT = 2 // 图像高 VIDEO_FPS = 3 // 解码帧率 OUTPUT_IMAGE_FORMAT = 4 // 输出图片格式 RTSP_TRANSPORT = 5 // RTSP流传输协议(UDP/TCP) STREAM_FORMAT = 6 // 流格式(H265 MP / H264 BP/MP/HP) |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteVideoCapBase() |
| 功能 | 构造函数,无实现,用户必须在继承类中做实现 |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | virtual ~AclLiteVideoCapBase() |
| 功能 | 析构函数,无实现,用户必须在继承类中做实现 |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | virtual bool IsOpened() |
| 功能 | 纯虚函数,无实现,用户必须在继承类中做实现,该函数旨在确认视频/摄像头等数据来源状态是否正常 |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | virtual AclLiteError Set(StreamProperty key, uint32_t value) |
| 功能 | 纯虚函数,无实现,用户必须在继承类中做实现,该函数旨在为用户提供处理数据时,设置特定属性的值的接口 |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | virtual uint32_t Get(StreamProperty key) |
| 功能 | 纯虚函数,无实现,用户必须在继承类中做实现,该函数旨在为用户提供处理数据时,获取特定属性的值的接口 |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | virtual AclLiteError Read(ImageData& frame) |
| 功能 | 纯虚函数,无实现,用户必须在继承类中做实现,该函数旨在为用户提供数据读入动作的接口 |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | virtual AclLiteError Close() |
| 功能 | 纯虚函数,无实现,用户必须在继承类中做实现。该函数旨在实现视频/摄像头等数据来源的相关资源的正确释放 |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | virtual AclLiteError Open() |
| 功能 | 纯虚函数,无实现,用户必须在继承类中做实现。该函数旨在实现视频/摄像头等数据来源初始化完全,等待读入 |
| 参数 | 无 |
| 返回值 | 无 |
AclLiteApp类为应用管理类,用于创建和管理应用的线程。本类是一个单实例模式的类。该类的原型定义在AclLiteApp.h文件中。
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteApp() AclLiteApp(const AclLiteApp&) = delete AclLiteApp& operator=(const AclLiteApp&) = delete; |
| 功能 | 构造函数 |
| 参数 | 无 |
| 返回值 | 无 |
| 备注 | 由于AclLiteApp类是一个单实例模式的类,所以应用中创建一个实例时,使用GetInstance方法获取类的唯一实例,而不是直接使用构造函数直接创建实例。并且实例禁止拷贝 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | ~AclLiteApp() |
| 功能 | 析构函数,释放应用所有线程 |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | static AclLiteApp& GetInstance() |
| 功能 | 获取全局唯一的AclLiteApp实例 |
| 参数 | 无 |
| 返回值 | AclLiteApp实例 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError Init() |
| 功能 | AclLiteApp实例初始化,并创建第一个线程,线程号为0。这个线程用于处理整个应用的公共事务,例如和其他应用进程的通信、本应用的结束等 |
| 参数 | 无 |
| 返回值 | ACLLITE_OK :初始化成功 非ACLLITE_OK :初始化失败 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | int CreateAclLiteThread(AclLiteThread* thInst, const std::string& instName,aclrtContext context, aclrtRunMode runMode) |
| 功能 | 创建一个AclLite线程,并执行用户提供的业务对象实例Init方法,然后循环等待业务消息。线程为detach,非阻塞接口,所以在调用本接口后,必须有循环等待接口来等待线程结束 |
| 参数 | thInst: 应用的业务线程实例,需要用户在该线程中重载Init方法,实现线程的初始化;重载Process方法,处理接收到的消息 instName: 线程名称。需要使用全局唯一的名称,否则创建失败。用户可以调用GetAclLiteThreadIdByName接口,以线程名为参数,获取线程ID context:线程运行的acl context runMode:应用的runmode,可取值:ACL_DEVICE(昇腾AI软件栈运行在Device的Control CPU或板端环境)/ ACL_HOST(昇腾AI软件栈运行在Host侧) |
| 返回值 | 线程id -1 :创建失败 >0 :创建成功 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | int CreateAclLiteThreadMgr(AclLiteThread* thInst, const string& instName, aclrtContext context, aclrtRunMode runMode) |
| 功能 | 本方法创建AclLite线程对应的管理结构,并实现以下功能: 1.检查用户线程名是否全局唯一 2.设置用户线程的context、run mode、name和id,这样在用户线程中可以使用对应的接口访问这些信息 3.将线程管理对象加入AclLiteApp线程管理表 |
| 参数 | thInst: 应用的业务线程实例,需要用户在该线程中重载Init方法,实现线程的初始化;重载Process方法,处理接收到的消息 instName: 线程名称。需要使用全局唯一的名称,否则创建失败。用户可以调用GetAclLiteThreadIdByName接口,以线程名为参数,获取线程ID context:线程运行的acl context runMode:应用的runmode,可取值:ACL_DEVICE(昇腾AI软件栈运行在Device的Control CPU或板端环境)/ ACL_HOST(昇腾AI软件栈运行在Host侧) |
| 返回值 | 线程id -1 :创建失败 >0 :创建成功 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | bool CheckThreadNameUnique(const std::string& threadName) |
| 功能 | 检查线程名是称否全局唯一 |
| 参数 | threadName:线程名称 |
| 返回值 | true:线程名称唯一 false:线程名称不唯一 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | bool CheckThreadAbnormal() |
| 功能 | 检查是否有状态为不正常的线程存在 |
| 参数 | 无 |
| 返回值 | true:存在状态不正常线程 false:不存在状态不正常线程 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | int GetAclLiteThreadIdByName(const std::string& threadName) |
| 功能 | 根据线程名称获取线程id |
| 参数 | threadName:线程名称 |
| 返回值 | 线程id -1 :无效id >0 :线程名称对应id |
| 说明项 | 具体描述 |
|---|---|
| 函数 | int Start(vector& threadParamTbl) |
| 功能 | 拉起线程表中的所有线程 |
| 参数 | threadParamTbl:线程表 |
| 返回值 | 0:启动成功 非0:创建失败 |
| 备注 | 1.当前,有两种创建线程的方式: (1)使用CreateAclLiteThread接口,传入对应参数,拉起一个线程; (2)构造一个AclLiteThreadParam表,然后传入本方法,一次拉起所有线程. 2.线程创建需要保证时序。例如创建了一个上游线程,需要给下游线程发消息时,需要知道下游线程的id;但是此时若下游线程还未创建,则没有分配线程id,因此消息无法发出。所以上游线程必须在下游线程创建成功后,才能获取下游线程的id。 3.AclLiteThreadParam结构体内容详见AclLiteThreadParam |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void Wait(); |
| 功能 | 阻塞0号线程即主线程;当在main流程中使用CreateAclLiteThread或者start方法创建了业务线程,并且通知各线程工作后,各个线程是detach的,且不会阻塞主线程。这个时候如果主线程执行完所有函数,整个应用将直接退出,各个线程也就无法完成自己的工作。所以在主线程中需要一个阻塞点,保持主线程不会结束,整个应用一直工作 |
| 参数 | 无 |
| 返回值 | 无 |
| 备注 | 本方法使用sleep死循环等待,如需结束应用,必须使用ctrl+c或者kill应用进程的方法 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void Wait(AclLiteMsgProcess msgProcess, void* param) |
| 功能 | AclLiteApp创建时,会拉起一个0号线程,即主线程。该线程有消息队列,由于该线程处于忙等状态,并没有使用该消息队列接收和处理消息;用户可以定义一个消息处理函数,然后调用本wait方法,在本方法中将会轮询0号线程的消息队列,收到消息后,调用msgProcess处理。如果处理返回失败(非0)值,本函数会退出轮询(死循环) |
| 参数 | msgProcess:用户定义的消息处理函数入口 param:传递给消息处理函数的参数 |
| 返回值 | 无 |
| 备注 | AclLiteMsgProcess为需要用户自行实现的主线程消息处理接口,一般旨在判断收到什么信号时,应用开始退出并释放资源。 当前在AclLiteApp.h中,仅定义了该类型函数指针,供用户参考: typedef int (*AclLiteMsgProcess)(uint32_t msgId, shared_ptr msgData, void* userData); |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void WaitEnd() |
| 功能 | 将waitEnd_置为true,Wait接口break退出等待 |
| 参数 | 无 |
| 返回值 | 无 |
| 备注 | waitEnd_表示等待终止 AclLiteApp创建时,会拉起一个0号线程,即主线程,该线程会处于一个忙等状态,且不断查询waitEnd_的值。 当用户需要结束整个app时,可以通过调用该接口,waitEnd_被置为true,当主线程查询到waitEnd_的值为true时,将会给各线程发出退出信号,并释放资源结束应用。 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError SendMessage(int dest, int msgId, shared_ptr data) |
| 功能 | 向目标线程发送消息 |
| 参数 | dest:目的线程id,是线程对应的线程管理对象,在AtlasApp的线程管理表threadList_中的下标 msgId:消息ID,用户在自己的应用中自行定义 data:消息数据,数据类型由用户定义 |
| 返回值 | ACLLITE_OK:发送成功 非ACLLITE_OK:发送失败 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void Exit() |
| 功能 | 通知所有线程结束,在线程都结束后,结束应用 |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void ReleaseThreads() |
| 功能 | 将线程表中线程状态修改为退出,并释放所有线程资源 |
| 参数 | 无 |
| 返回值 | 无 |
AclLiteThread类为抽象类,用户线程对象基类,提供线程对象的公共方法和属性。在使用AclLite库创建线程时,必须以本基类为父类进行重载。本基类提供两个纯虚函数Init()和Process(),用户线程对象必须实现这两个函数。该类的原型定义在AclLiteThread.h文件中。
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteThread() |
| 功能 | 构造函数,创建一个AclLiteThread类对象 |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | ~AclLiteThread() |
| 功能 | 析构函数,销毁一个AclLiteThread类对象 |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | virtual int Init() |
| 功能 | 纯虚函数,需要用户继承AclLiteThread类,定义自己的业务线程对象后,做重载实现该函数,完成自己线程需要的初始化。如果不重载,默认返回ACLLITE_OK |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | virtual int Process(int msgId, shared_ptr msgData) |
| 功能 | 纯虚函数,继承AclLiteThread的线程对象必须对Process()进行重载,以处理收到的消息。当其他线程给本线程发送消息后,本线程的线程管理对象在AclLiteThreadMgr::ThreadEntry的消息轮询就会获取到消息,即收到消息,然后调用本方法,把消息id和消息数据传递本方法处理。用户不感知AclLiteThreadMgr::ThreadEntry方法,不用关注消息的接收以及Process的调用,只需要关注Process本身的实现即可 |
| 参数 | 无 |
| 返回值 | 无 |
| 备注 | 实现后的本方法如果返回失败,会导致线程结束,所以必须根据整体业务慎重考虑返回值 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | int SelfInstanceId() |
| 功能 | 返回线程id |
| 参数 | 无 |
| 返回值 | 线程id -1 :无效id >0 :有效id |
| 备注 | 只有当实例化一个线程对象,并且创建线程后,本接口才能返回正确的值。实例化后创建线程前,是没有线程id的,返回值为INVALID_INSTANCE_ID(-1) |
| 说明项 | 具体描述 |
|---|---|
| 函数 | string& SelfInstanceName() |
| 功能 | 返回线程名称 |
| 参数 | 无 |
| 返回值 | 线程名称: 空字符串:无效名称 非空字符串:有效名称 |
| 备注 | 线程相关的接口,需要线程创建后才有效 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | aclrtContext GetContext() |
| 功能 | 返回线程运行时的context |
| 参数 | 无 |
| 返回值 | context: nullptr:无效context 非nullptr:有效context |
| 备注 | 线程相关的接口,需要线程创建后才有效 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | aclrtRunMode GetRunMode() |
| 功能 | 返回线程运行时的runmode |
| 参数 | 无 |
| 返回值 | run mode: ACL_DEVICE(昇腾AI软件栈运行在Device的Control CPU或板端环境) ACL_HOST(昇腾AI软件栈运行在Host侧) |
| 备注 | 线程相关的接口,需要线程创建后才有效 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError BaseConfig(int instanceId, const string& threadName, aclrtContext context, aclrtRunMode runMode) |
| 功能 | 设置当前线程的线程id,线程名,context和run mode |
| 参数 | instanceId:线程id const string& threadName:线程名 context:线程context aclrtRunMode runMode: 线程run mode |
| 返回值 | ACLLITE_OK:设置成功 非ACLLITE_OK:设置失败 |
| 备注 | 该函数期望仅在AclLiteApp::CreateAclLiteThreadMgr中调用一次,并且禁止在运行中随意调用修改这些属性 |
| 说明项 | 具体描述 |
|---|---|
| 结构体 | AclLiteThreadParam |
| 功能 | 封装一个线程对象相关的属性和运行资源 |
| 数据成员 | threadInst : 指向AclLiteThread对象的指针 threadInstName : 线程名,全局唯一 context : 线程所运行在的context threadInstId : 线程编号,全局唯一 |
该类的原型定义在AclLiteThreadMgr.h文件中。AclLiteThreadMgr类顾名思义是为AclLiteThread配置一个管理线程间消息队列交互的对象,从而保证各业务线程对象之间逻辑上的隔离,使得开发者可以更专注业务线程功能的实现,而不用在AclLiteThread中纠结消息数据的发送与接受以及消息队列的维护。
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteThreadMgr(AclLiteThread* userThreadInstance, const std::string& threadName) |
| 功能 | 构造函数,生成线程对应的线程管理对象 |
| 参数 | userThreadInstance:AclLiteThread线程实例 threadName:线程名称 |
| 返回值 | 无 |
| 约束 | 线程名称全局唯一 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | ~AclLiteThreadMgr() |
| 功能 | 析构函数 |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | static void ThreadEntry(void* data) |
| 功能 | CreateThread方法中创建的线程入口函数。本函数会在线程启动时,根据创建线程传入的context、run mode和用户线程对象实例,设置本线程的context, 调用用户线程实例对象的Init方法,然后轮询是否收到消息,收到后调用用户线程实例的Process函数。如果Process返回失败(非0值),轮询中止,线程结束。 |
| 参数 | arg:线程创建参数,是线程管理对象类型指针,强转为void*类型 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void CreateThread() |
| 功能 | 调用线程入口函数拉起对应线程,并将线程detach |
| 参数 | 无 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError WaitThreadInitEnd() |
| 功能 | 判断AclLiteThread线程实例是否初始化成功 |
| 参数 | 无 |
| 返回值 | ACLLITE_OK:初始化成功 非ACLLITE_OK:初始化失败 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError PushMsgToQueue(shared_ptr& pMessage) |
| 功能 | 将消息数据送入消息队列 |
| 参数 | pMessage:消息数据 |
| 返回值 | ACLLITE_OK:送入成功 非ACLLITE_OK:送入失败 |
| 备注 | AclLiteMessage结构体详见AclLiteMessage |
| 说明项 | 具体描述 |
|---|---|
| 函数 | shared_ptr PopMsgFromQueue() |
| 功能 | 从消息队列弹出消息数据 |
| 参数 | 无 |
| 返回值 | 消息数据: nullptr:无效消息数据 非nullptr:有效消息数据 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteThread* GetUserInstance() |
| 功能 | 获取AclLiteThread线程实例 |
| 参数 | 无 |
| 返回值 | AclLiteThread线程实例: nullptr:无效线程实例 非nullptr:有效线程实例 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | const std::string& GetThreadName() |
| 功能 | 获取AclLiteThread线程名称 |
| 参数 | 无 |
| 返回值 | 线程名称: 空字符串:获取名称失败 非空字符串:实际名称 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void SetStatus(AclLiteThreadStatus status) |
| 功能 | 设置线程实例状态 |
| 参数 | status:要被设置的线程状态 |
| 返回值 | 无 |
| 备注 | AclLiteThreadStatus: THREAD_READY = 0 // 线程就绪 THREAD_RUNNING = 1 // 线程运行 THREAD_EXITING = 2 // 线程退出中 THREAD_EXITED = 3 // 线程退出 THREAD_ERROR = 4 //线程初始化失败 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteThreadStatus GetStatus() |
| 功能 | 获取线程实例状态 |
| 参数 | 无 |
| 返回值 | status: THREAD_READY = 0 // 线程就绪 THREAD_RUNNING = 1 // 线程运行 THREAD_EXITING = 2 // 线程退出中 THREAD_EXITED = 3 // 线程退出 THREAD_ERROR = 4 //线程初始化失败 |
#include <unistd.h>
#include <string>
#include "acllite/AclLiteApp.h"
#include "acllite/AclLiteThread.h"
#include "AclLiteResource.h"
#include <sys/time.h>
#define MSG_APP_START 0
#define MSG_HELLO 1
#define MSG_READ_FRAME 2
#define MSG_APP_EXIT 3
// 继承AclLiteThread类,完成具体业务功能,例如预处理线程类,后处理线程类,只要实现Process逻辑即可。
class HelloThread : public AclLiteThread
{
AclLiteError Init()
{
ACLLITE_LOG_INFO("Hello thread init ok.");
return ACLLITE_OK;
}
AclLiteError Process(int msgId, shared_ptr<void> msgData)
{
shared_ptr<string> str = static_pointer_cast<string>(msgData);
switch(msgId) {
case MSG_APP_START:
SendMessage(SelfInstanceId(), MSG_HELLO, make_shared<string>("hello world"));
break;
case MSG_HELLO:
cout << *str << endl;
SendMessage(g_MainThreadId, MSG_APP_EXIT, nullptr);
break;
default:
ACLLITE_LOG_ERROR("Preprocess thread receive unknow msg %d", msgId);
break;
}
return ACLLITE_OK;
}
};
// 创建线程并将创建的线程保存再线程表中
void CreateTshreads(vector<AclLiteThreadParam>& threadTbl, AclLiteResource& aclDev) {
ACLLITE_LOG_INFO("begin CreateThreadInstance.");
AclLiteThreadParam param;
param.threadInst = new HelloThread();
threadTbl.push_back(param);
for (int i = 0; i < threadTbl.size(); i++) {
threadTbl[i].context = aclDev.GetContext();
threadTbl[i].runMode = aclDev.GetRunMode();
}
ACLLITE_LOG_INFO("end CreateThreadInstance.");
}
// 主线程处理函数,该函数要传递给app.wait函数,在app.wait中会循环调用该函数;
// 所以该函数的逻辑:如果收到的消息是应用退出消息,则设置退出标志位!
int MainThreadProcess(uint32_t msgId,
shared_ptr<void> msgData, void* userData) {
if (msgId == MSG_APP_EXIT) {
AclLiteApp& app = GetAclLiteAppInstance();
app.WaitEnd();
ACLLITE_LOG_INFO("Receive exit message, exit now");
}
return ACLLITE_OK;
}
int main()
{
AclLiteResource aclDev = AclLiteResource();
AclLiteError ret = aclDev.Init();
// 创建线程表,并且创建线程后填充到线程表,后续所有线程都是通过线程表来访问的
vector<AclLiteThreadParam> threadTbl;
ACLLITE_LOG_INFO("before CreateThreadInstance.");
CreateTshreads(threadTbl, aclDev);
// AclLiteAPP是单例模式,直接返回app实例即可
AclLiteApp& app = GetAclLiteAppInstance();
// 启动app,每个线程都启动起来,开始循环等待消息了。
ret = app.Start(threadTbl);
if (ret != ACLLITE_OK) {
ACLLITE_LOG_ERROR("Start app failed, error %d", ret);
app.Exit();
return -1;
}
ret = SendMessage(threadTbl[0].threadInstId, MSG_APP_START, nullptr);
// 在主线程中等待结束消息,如果收到结束消息,结束!
// 原理:主线程会一直阻塞在当前wait函数,直到收到退出消息,会在MainThreadProcess中设置退出标识;wait中检查到退出标识,结束无线循环。
app.Wait(MainThreadProcess, nullptr);
app.Exit();
return -1 ;
}
该文件定义AclLite公共库中使用的工具函数和宏
| 说明项 | 具体描述 |
|---|---|
| 宏 | RGBU8_IMAGE_SIZE(width, height) |
| 功能 | 计算RGB 24bits图片数据大小 |
| 参数 | width:图片宽 height: 图片高 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | RGBF32_IMAGE_SIZE(width, height) |
| 功能 | 计算RGB C3F32图片数据大小 |
| 参数 | width:图片宽 height: 图片高 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | YUV420SP_SIZE(width, height) |
| 功能 | 计算YUVSP420图片数据大小 |
| 参数 | width:图片宽 height: 图片高 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | YUV420SP_CV_MAT_HEIGHT(height) |
| 功能 | 计算YUVSP420 nv12格式图片加载到opencv的mat时,height的数值 |
| 参数 | yuv图片的高 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | SHARED_PTR_DVPP_BUF(buf) |
| 功能 | 新建指向dvpp内存的智能指针 |
| 参数 | buf:dvpp内存的指针 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | SHARED_PTR_DEV_BUF(buf) |
| 功能 | 新建指向device内存的智能指针 |
| 参数 | buf:device内存的指针 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | SHARED_PTR_U8_BUF(buf) |
| 功能 | 新建指向一边拿内存的智能指针 |
| 参数 | buf:指向内存的指针 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | ALIGN_UP(num, align) |
| 功能 | 计算对齐后的数值 |
| 参数 | num:原始数值 align:要对齐的数 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | ALIGN_UP2(num) |
| 功能 | 将数据按2对齐 |
| 参数 | num:原始数值 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | ALIGN_UP16(num) |
| 功能 | 将数据按16对齐 |
| 参数 | num:原始数值 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | ALIGN_UP128(num) |
| 功能 | 将数据按128对齐 |
| 参数 | num:原始数值 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | SIZEOF_ARRAY(array) |
| 功能 | 计算数组中数据的个数 |
| 参数 | array:数组 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | ACLLITE_LOG_ERROR(fmt, ...) |
| 功能 | 打印acl ERROR级别日志到/var/log/npu/slog/host-0/host-xxxx.log |
| 参数 | fmt:打印的日志内容,支持格式化字符串,记录的日志包括函数、文件和行号 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | ACLLITE_LOG_INFO(fmt, ...) |
| 功能 | 打印acl INFO级别日志到/var/log/npu/slog/host-0/host-xxxx.log |
| 参数 | fmt:打印的日志内容,支持格式化字符串,记录的日志包括函数、文件和行号 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | ACLLITE_LOG_WARNING(fmt, ...) |
| 功能 | 打印acl WARNING级别日志到/var/log/npu/slog/host-0/host-xxxx.log |
| 参数 | fmt:打印的日志内容,支持格式化字符串,记录的日志包括函数、文件和行号 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | ACLLITE_LOG_DEBUG(fmt, ...) |
| 功能 | 打印acl DEBUG级别日志到/var/log/npu/slog/host-0/host-xxxx.log |
| 参数 | fmt:打印的日志内容,支持格式化字符串,记录的日志包括函数、文件和行号 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | TIME_START(X) |
| 功能 | 时间戳起点 |
| 参数 | X:待测量函数名 |
| 备注 | TIME_START(X)与TIME_END(X)需要搭配使用,以同一X为一组;再辅以TIME_XXX_SHOW(X)系列宏打印 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | TIME_END(X) |
| 功能 | 时间戳终点 |
| 参数 | X:待测量函数名 |
| 备注 | TIME_START(X)与TIME_END(X)需要搭配使用,以同一X为一组;再辅以TIME_XXX_SHOW(X)系列宏打印 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | TIME_USEC(X) |
| 功能 | 以微秒计算耗时 |
| 参数 | X:待测量函数名 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | TIME_USEC_SHOW(X) |
| 功能 | 以微秒打印耗时 |
| 参数 | X:待测量函数名 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | TIME_MSEC(X) |
| 功能 | 以毫秒计算耗时 |
| 参数 | X:待测量函数名 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | TIME_MSEC_SHOW(X) |
| 功能 | 以毫秒打印耗时 |
| 参数 | X:待测量函数名 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | TIME_SEC(X) |
| 功能 | 以秒计算耗时 |
| 参数 | X:待测量函数名 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | TIME_SEC_SHOW(X) |
| 功能 | 以秒打印耗时 |
| 参数 | X:待测量函数名 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | TIME_MINUTE(X) |
| 功能 | 以分钟计算耗时 |
| 参数 | X:待测量函数名 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | TIME_MINUTE_SHOW(X) |
| 功能 | 以分钟打印耗时 |
| 参数 | X:待测量函数名 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | TIME_HOUR(X) |
| 功能 | 以小时计算耗时 |
| 参数 | X:待测量函数名 |
| 说明项 | 具体描述 |
|---|---|
| 宏 | TIME_HOUR(X) |
| 功能 | 以小时打印耗时 |
| 参数 | X:待测量函数名 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | bool IsDirectory(const std::string &path) |
| 功能 | 判断字符串是否为有效的文件夹路径 |
| 参数 | path:输入的字符串 |
| 返回值 | true:有效路径 false:无效路径 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void* CopyDataToDevice(const void* data, uint32_t size, aclrtRunMode curRunMode, MemoryType memType) |
| 功能 | 将数据拷贝到device侧/dvpp内存 |
| 参数 | data:待拷贝数据 size:待拷贝数据大小 curRunMode:程序runmode memType:目标侧内存类型 |
| 返回值 | 目标侧内存指针: nullptr:拷贝失败 非nullptr拷贝成功 |
| 备注 | aclrtRunMode取值见官方文档; MemoryType取值见MemoryType,本接口中,一般取值为MEMORY_DEVICE/MEMORY_DVPP |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError CopyDataToDeviceEx(void* dest, uint32_t destSize, const void* src, uint32_t srcSize, aclrtRunMode runMode) |
| 功能 | 将数据拷贝到device侧 |
| 参数 | dest:目标内存 destSize:目标内存大小 src:待拷贝内存 srcSize:待拷贝内存大小 curRunMode:程序run mode |
| 返回值 | ACLLITE_OK:拷贝成功 非ACLLITE_OK:拷贝失败 |
| 备注 | aclrtRunMode取值见官方文档 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void* CopyDataToHost(const void* data, uint32_t size, aclrtRunMode curRunMode, MemoryType memType) |
| 功能 | 将数据拷贝到host侧/一般内存上 |
| 参数 | data:待拷贝数据 size:待拷贝数据大小 curRunMode:程序runmode memType:目标侧内存类型 |
| 返回值 | 目标侧内存指针: nullptr:拷贝失败 非nullptr拷贝成功 |
| 备注 | aclrtRunMode取值见官方文档; MemoryType取值见MemoryType,本接口中,一般取值为MEMORY_NORMAL/MEMORY_HOST |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError CopyDataToHostEx(void* dest, uint32_t destSize, const void* src, uint32_t srcSize, aclrtRunMode runMode); |
| 功能 | 将数据拷贝到host侧 |
| 参数 | dest:目标内存 destSize:目标内存大小 src:待拷贝内存 srcSize:待拷贝内存大小 curRunMode:程序run mode |
| 返回值 | ACLLITE_OK:拷贝成功 非ACLLITE_OK:拷贝失败 |
| 备注 | aclrtRunMode取值见官方文档 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void* CopyData(const void* data, uint32_t size, aclrtMemcpyKind policy, MemoryType memType) |
| 功能 | 数据拷贝 |
| 参数 | data:待拷贝数据 size:待拷贝数据大小 policy:内存拷贝种类 memType:目标侧内存类型 |
| 返回值 | 目标侧内存指针 |
| 备注 | aclrtMemcpyKind取值见官方文档 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError ReadPng(ImageData& image, const std::string& fileName) |
| 功能 | 读取png图片 |
| 参数 | image:存放被读取图片数据 fileName:被读取的图片文件路径 |
| 返回值 | ACLLITE_OK:读取成功 非ACLLITE_OK:读取失败 |
| 约束 | 只支持baseline不支持渐进式的Png图片 |
| 备注 | ImageData数据结构详见ImageData |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError ReadJpeg(ImageData& image, const std::string& fileName) |
| 功能 | 读取jpeg图片 |
| 参数 | image:存放被读取图片数据 fileName:被读取的图片文件路径 |
| 返回值 | ACLLITE_OK:读取成功 非ACLLITE_OK:读取失败 |
| 约束 | 只支持baseline不支持渐进式的jpeg图片 |
| 备注 | ImageData数据结构详见ImageData |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void GetAllFiles(const std::string &pathList, std::vectorstd::string &fileVec) |
| 功能 | 获取某路径文件下所有文件的文件名 |
| 参数 | pathList:文件路径 fileVec:存放文件名的向量 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void SaveBinFile(const std::string& filename, const void* data, uint32_t size) |
| 功能 | 将数据存为二进制文件 |
| 参数 | filename:文件名 data:待保存数据 size:待保存数据大小 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError ReadBinFile(const std::string& filename, void*& data, uint32_t& size) |
| 功能 | 读取二进制文件 |
| 参数 | filename:文件名 data:待读取数据 size:待读取数据大小 |
| 返回值 | ACLLITE_OK:读取成功 非ACLLITE_OK:读取失败 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError CopyImageToLocal(ImageData& destImage, ImageData& srcImage, aclrtRunMode curRunMode); |
| 功能 | 将ImageData类型数据拷贝到本地 |
| 参数 | destImage:拷贝后的数据 srcImage: 待拷贝数据 curRunMode:程序run mode |
| 返回值 | ACLLITE_OK:拷贝成功 非ACLLITE_OK:拷贝失败 |
| 备注 | aclrtRunMode取值见官方文档 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | AclLiteError CopyImageToDevice(ImageData& destImage, ImageData& srcImage, aclrtRunMode curRunMode, MemoryType memType); |
| 功能 | 将ImageData类型数据拷贝到本地拷贝到device/dvpp |
| 参数 | destImage:拷贝后的数据 srcImage: 待拷贝数据 curRunMode:程序run mode memType:目标侧内存类型 |
| 返回值 | ACLLITE_OK:拷贝成功 非ACLLITE_OK:拷贝失败 |
| 备注 | aclrtRunMode取值见官方文档; MemoryType取值见MemoryType,本接口中,一般取值为MEMORY_DEVICE/MEMORY_DVPP |
| 说明项 | 具体描述 |
|---|---|
| 函数 | bool IsIpAddrWithPort(const std::string& addrStr) |
| 功能 | 判断ip是否形如:<1-255>.<0-255>.<0-255>.<0-255>:<port> |
| 参数 | addrStr:字符串,待判断ip |
| 返回值 | true:格式正确 false:格式错误 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void ParseIpAddr(std::string& ip, std::string& port, const std::string& addr) |
| 功能 | 将形如:<1-255>.<0-255>.<0-255>.<0-255>:<port>拆成ip和port两个字符串变量 |
| 参数 | ip:拆后的字符串变量,ip部分 port:拆后的字符串变量,port部分 addr:字符串变量,完整地址 |
| 返回值 | 无 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | bool IsVideoFile(const std::string& path) |
| 功能 | 判断字符串是否为MP4文件 |
| 参数 | path:待判断字符串 |
| 返回值 | true:是MP4 false:不是MP4 |
| 备注 | 该函数仅校验文件名,并非真的对文件性质做判断 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | bool IsRtspAddr(const std::string &str) |
| 功能 | 判断字符串是否为rtsp流格式,形如:rtsp://...... |
| 参数 | str:待判断字符串 |
| 返回值 | true:是rtsp流 false:不是rtsp流 |
| 备注 | 该函数仅校验文件名,并非真的对文件性质做判断 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | bool IsDigitStr(const std::string& str) |
| 功能 | 判断字符串是否为数字字符串 |
| 参数 | str:待判断字符串 |
| 返回值 | true:是数字字符串 false:不是数字字符串 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | bool IsPathExist(const std::string &path) |
| 功能 | 判断文件路径是否存在 |
| 参数 | path:待判断字符串 |
| 返回值 | true:路径存在 false:路径不存在 |
| 说明项 | 具体描述 |
|---|---|
| 函数 | bool ReadConfig(std::map<std::string, std::string>& config, const char* configFile) |
| 功能 | 读取配置文件,并将解析结果保存到map中 |
| 参数 | config:保存解析结果的map configFile:待读取的文件路径 |
| 返回值 | true:读取成功 false:读取失败 |
| 约束 | 配置项名称唯一且格式如下: [baseconf] presenter_server_ip=xxx.xxx.x.xxx |
| 说明项 | 具体描述 |
|---|---|
| 函数 | void PrintConfig(const std::map<std::string, std::string> & m) |
| 功能 | 打印配置项 |
| 参数 | m:待打印配置项map |
| 返回值 | 无 |
该文件定义AclLite公共库中使用的结构体和枚举变量
| 说明项 | 具体描述 |
|---|---|
| 枚举类型 | MemoryType |
| 功能 | 标记不同类型的内存 |
| 可选值 | MEMORY_NORMAL = 0 // 一般内存,用new/delete申请/释放 MEMORY_HOST // host侧内存,用aclrtMallocHost/aclrtFreeHost申请/释放 MEMORY_DEVICE // device侧内存,用aclrtMalloc/aclrtFree申请/释放 MEMORY_DVPP // dvpp内存,用acldvppMalloc/acldvppFree申请/释放 MEMORY_INVALID_TYPE // 无效内存类型 |
| 说明项 | 具体描述 |
|---|---|
| 枚举类型 | CopyDirection |
| 功能 | 标记拷贝方向 |
| 可选值 | TO_DEVICE = 0 // 往device侧 TO_HOST // 往host侧 INVALID_COPY_DIRECT // 无效拷贝方向 |
| 说明项 | 具体描述 |
|---|---|
| 枚举类型 | CameraId |
| 功能 | 标记Atlas200DK摄像头 |
| 可选值 | CAMERA_ID_0 = 0 // 0号槽位摄像头 CAMERA_ID_1 // 1号槽位摄像头 INVALID_COPY_DIRECT // 无效槽位 |
| 说明项 | 具体描述 |
|---|---|
| 枚举类型 | VencStatus |
| 功能 | venc业务线程的状态 |
| 可选值 | STATUS_VENC_INIT = 0 // 初始化 STATUS_VENC_WORK // 工作中 STATUS_VENC_FINISH // 业务完成 STATUS_VENC_EXIT // 线程退出 STATUS_VENC_ERROR // 初始化失败/编码报错等报错状态 |
| 说明项 | 具体描述 |
|---|---|
| 结构体 | VencConfig |
| 功能 | 存放VencHelper初始化所需参数 |
| 数据成员 | maxWidth : 宽 maxHeight : 高 outFile : 编码输出文件 format : 待编码图片格式 enType : 编码文件流格式 context :线程运行context runMode : 线程运行run mode |
| 约束 | format:PIXEL_FORMAT_YUV_SEMIPLANAR_420 / PIXEL_FORMAT_YVU_SEMIPLANAR_420 enType:H265_MAIN_LEVEL / H264_BASELINE_LEVEL / H264_MAIN_LEVEL / H264_HIGH_LEVEL |
| 说明项 | 具体描述 |
|---|---|
| 结构体 | ImageData |
| 功能 | 封装图片数据及图片参数的数据结构 |
| 数据成员 | format : 图片格式 width : 图片宽 height : 图片高 alignWidth : 对齐后宽 alignHeight : 对齐后高 size : 图片数据大小 data : 图片数据 |
| 说明项 | 具体描述 |
|---|---|
| 结构体 | Resolution |
| 功能 | 分辨率 |
| 数据成员 | width:宽 height:高 |
| 说明项 | 具体描述 |
|---|---|
| 结构体 | Rect |
| 功能 | 矩形框坐标点 |
| 数据成员 | ltX:左上点的X坐标 ltY:左上点的Y坐标 rbX:右下点的X坐标 rbY:右下点的Y坐标 |
| 说明项 | 具体描述 |
|---|---|
| 结构体 | BBox |
| 功能 | BoundingBox数据 |
| 数据成员 | rect:矩形框左边点 score:置信度 text:类别标签 |
| 备注 |
| 说明项 | 具体描述 |
|---|---|
| 结构体 | AclLiteMessage |
| 功能 | 消息数据 |
| 数据成员 | dest:目标线程id msgId:消息Id data:消息数据 |
| 说明项 | 具体描述 |
|---|---|
| 结构体 | DataInfo |
| 功能 | 数据信息,存储数据内容及数据大小,用来生成模型输入输出 |
| 数据成员 | data:数据 size:数据大小 |
| 备注 |
| 说明项 | 具体描述 |
|---|---|
| 结构体 | ModelOutputInfo |
| 功能 | 模型输出节点数据信息,存储模型每个输出节点的具体信息 |
| 数据成员 | name:模型输出的输出算子名称、算子输出边下标、top名称或输出名称 dims:模型输出维度信息的指针 format:输出的Format dataType:输出的数据类型 |
| 备注 |
| 说明项 | 具体描述 |
|---|---|
| 结构体 | InferenceOutput |
| 功能 | 存放模型推理结果数据 |
| 数据成员 | data:结果数据 size:数据大小 |
该文件定义AclLite公共库中使用的错误码,详见文件。
该文件定义了一个模板类ThreadSafeQueue,旨在为用户提供在多线程场景下,可以直接复用的数据安全队列,详见文件。