From 807b64ceba914831d4078b4b6abdbe5ee7bd24fa Mon Sep 17 00:00:00 2001 From: zhongluping <278527840@qq.com> Date: Tue, 9 May 2023 15:30:38 +0800 Subject: [PATCH] add libjpeg-turbo Signed-off-by: zhongluping <278527840@qq.com> --- thirdparty/libjpeg-turbo/HPKBUILD | 49 ++++++++++ thirdparty/libjpeg-turbo/README.OpenSource | 11 +++ thirdparty/libjpeg-turbo/README_zh.md | 17 ++++ thirdparty/libjpeg-turbo/SHA512SUM | 1 + .../libjpeg-turbo/docs/hap_integrate.md | 91 ++++++++++++++++++ .../libjpeg-turbo/docs/pic/jpeg_test.png | Bin 0 -> 28064 bytes 6 files changed, 169 insertions(+) create mode 100644 thirdparty/libjpeg-turbo/HPKBUILD create mode 100755 thirdparty/libjpeg-turbo/README.OpenSource create mode 100755 thirdparty/libjpeg-turbo/README_zh.md create mode 100644 thirdparty/libjpeg-turbo/SHA512SUM create mode 100755 thirdparty/libjpeg-turbo/docs/hap_integrate.md create mode 100755 thirdparty/libjpeg-turbo/docs/pic/jpeg_test.png diff --git a/thirdparty/libjpeg-turbo/HPKBUILD b/thirdparty/libjpeg-turbo/HPKBUILD new file mode 100644 index 00000000..170ec499 --- /dev/null +++ b/thirdparty/libjpeg-turbo/HPKBUILD @@ -0,0 +1,49 @@ + +# Contributor: lpzhong <278527840@qq.com> +# Maintainer: lpzhong <278527840@qq.com> + +pkgname=libjpeg-turbo +pkgver=2.1.91 +pkgrel=0 +pkgdesc="" +url= +archs=("armeabi-v7a" "arm64-v8a") +license=("IJG(Independent JPEG Group) License", "3-clause BSD License", "zlib License") +depends=() +makedepends=() +install=usr +source="https://github.com/${pkgname}/${pkgname}/archive/refs/tags/${pkgver}.tar.gz" + +builddir=${pkgname}-${pkgver} +packagename=${builddir}.tar.gz +patchflag=false +autounpack=true +downloadpackage=true +buildtools="cmake" + +prepare() { + mkdir -p ${builddir}/${ARCH}-build +} + +build() { + cd ${builddir} + ${OHOS_SDK}/native/build-tools/cmake/bin/cmake "$@" -DOHOS_ARCH=${ARCH} -B${ARCH}-build -S./ -L >> `pwd`/${ARCH}-build/build.log 2>&1 + make -j4 -C ${ARCH}-build >> `pwd`/${ARCH}-build/build.log 2>&1 + ret=$? + cd $OLDPWD + return $ret +} + +package() { + cd ${builddir} + make -C ${ARCH}-build install >> `pwd`/${ARCH}-build/build.log 2>&1 + cd ${OLDPWD} +} + +check() { + echo "The test must be on an OpenHarmony device!" +} + +cleanbuild(){ + rm -rf ${PWD}/${builddir} #${PWD}/$packagename +} \ No newline at end of file diff --git a/thirdparty/libjpeg-turbo/README.OpenSource b/thirdparty/libjpeg-turbo/README.OpenSource new file mode 100755 index 00000000..b538b4fe --- /dev/null +++ b/thirdparty/libjpeg-turbo/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "libjpeg-turbo", + "License": "IJG(Independent JPEG Group) License/3-clause BSD License/zlib License", + "License File": "LICENSE.md", + "Version Number": "2.1.91", + "Owner": "zhongluping1@huawei.com", + "Upstream URL": "https://github.com/libjpeg-turbo/libjpeg-turbo", + "Description": "libjpeg-turbo is a JPEG image codec that uses SIMD instructions to accelerate baseline JPEG compression and decompression" + } +] diff --git a/thirdparty/libjpeg-turbo/README_zh.md b/thirdparty/libjpeg-turbo/README_zh.md new file mode 100755 index 00000000..d9d73c78 --- /dev/null +++ b/thirdparty/libjpeg-turbo/README_zh.md @@ -0,0 +1,17 @@ +# libjpeg-turbo 三方库说明 + +## 功能简介 + +libjpeg-turbo是一种JPEG图像编解码器,它使用SIMD指令来加速基准JPEG压缩和解压缩. + +## 使用约束 + +- IDE版本:DevEco Studio 3.1 Beta2 +- SDK版本:ohos_sdk_public 3.2.11.9 (API Version 9 Release) +- 三方库版本:2.1.91 +- 当前适配的功能:支持JPEG图像编解码。 +- [IJG(Independent JPEG Group) License/3-clause BSD License/zlib License](https://github.com/libjpeg-turbo/libjpeg-turbo/blob/main/LICENSE.md) + +## 集成方式 + +- [应用hap包集成](docs/hap_integrate.md) diff --git a/thirdparty/libjpeg-turbo/SHA512SUM b/thirdparty/libjpeg-turbo/SHA512SUM new file mode 100644 index 00000000..15402c87 --- /dev/null +++ b/thirdparty/libjpeg-turbo/SHA512SUM @@ -0,0 +1 @@ +b3e3ba0ba76ef727998270e396c3164c1546dcfc991a69ff507d66e3f03705fce815cfcc3aca9ec8025ff7d1894a52bce708566c817e4b9537754d1534251855 libjpeg-turbo-2.1.91.tar.gz diff --git a/thirdparty/libjpeg-turbo/docs/hap_integrate.md b/thirdparty/libjpeg-turbo/docs/hap_integrate.md new file mode 100755 index 00000000..d563a45b --- /dev/null +++ b/thirdparty/libjpeg-turbo/docs/hap_integrate.md @@ -0,0 +1,91 @@ +# libjpeg-turbo 集成到应用hap + +本库是在RK3568开发板上基于OpenHarmony3.2 Release版本的镜像验证的,如果是从未使用过RK3568,可以先查看[润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld)。 + +## 开发环境 + +- ubuntu20.04 +- [OpenHarmony3.2Release镜像](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fdayu200_standard_arm32.tar.gz) +- [ohos_sdk_public 3.2.11.9 (API Version 9 Release)](https://gitee.com/link?target=https%3A%2F%2Frepo.huaweicloud.com%2Fopenharmony%2Fos%2F3.2-Release%2Fohos-sdk-windows_linux-public.tar.gz) +- [DevEco Studio 3.1 Beta2](https://gitee.com/link?target=https%3A%2F%2Fcontentcenter-vali-drcn.dbankcdn.cn%2Fpvt_2%2FDeveloperAlliance_package_901_9%2Ff3%2Fv3%2FuJyuq3syQ2ak4hE1QZmAug%2Fdevecostudio-windows-3.1.0.400.zip%3FHW-CC-KV%3DV1%26HW-CC-Date%3D20230408T013335Z%26HW-CC-Expire%3D315360000%26HW-CC-Sign%3D96262721EDC9B34E6F62E66884AB7AE2A94C2A7B8C28D6F7FC891F46EB211A70) +- [准备三方库构建环境](../../../tools/README.md#编译环境准备) +- [准备三方库测试环境](../../../tools/README.md#ci环境准备) + +## 编译三方库 + +- 下载本仓库 + + ```shell + git clone https://gitee.com/openharmony-sig/tpc_c_cplusplus.git --depth=1 + ``` + +- 三方库目录结构 + + ```shell + tpc_c_cplusplus/thirdparty/libjpeg-turbo # 三方库libjpeg-turbo的目录结构如下 + ├── docs # 三方库相关文档的文件夹 + ├── HPKBUILD # 构建脚本 + ├── SHA512SUM # 三方库校验文件 + ├── README.OpenSource # 说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md + ``` + +- 将libjpeg-turbo拷贝至tools/main目录下 + + ```shell + cd tpc_c_cplusplus + cp thirdparty/libjpeg-turbo tools/main -rf + ``` + +- 在tools目录下编译三方库 + + 编译环境的搭建参考[准备三方库构建环境](../../../tools/README.md#编译环境准备) + + ```shell + cd tools + ./build.sh libjpeg-turbo + ``` + +- 三方库头文件及生成的库 + + 在tools目录下会生成usr目录,该目录下存在已编译完成的32位和64位三方库 + + ```shell + libjpeg-turbo/arm64-v8a libjpeg-turbo/armeabi-v7a + ``` + +- [测试三方库](#测试三方库) + +## 应用中使用三方库 + +- 在IDE的cpp目录下新增thirdparty目录,将编译生成的库拷贝到该目录下,如下图所示 + +  ![thirdparty_install_dir](../../thirdparty_template/docs/pic/xxx_install_dir.png) + + 其中xxx代表的是库名,本库即为libjpeg-turbo。 + +- 在最外层(cpp目录下)CMakeLists.txt中添加如下语句 + + ```shell + # 将三方库加入工程中 + target_link_libraries(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libjpeg-turbo/${OHOS_ARCH}/lib/libjpeg.a) + # 将三方库的头文件加入工程中 + target_include_directories(entry PRIVATE ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libjpeg-turbo/${OHOS_ARCH}/include) + ``` + + ![libjpeg-turbo_usage](../../thirdparty_template/pic/../docs/pic/xxx_usage.png) + +## 测试三方库 + +三方库的测试使用原库自带的测试用例来做测试,[准备三方库测试环境](../../../tools/README.md#ci环境准备) + +进入到构建目录执行`ctest`运行测试用例(arm64-v8a-build为构建64位的目录,armeabi-v7a-build为构建32位的目录) + + ![libjpeg-turbo_test](pic/jpeg_test.png) + +## 参考资料 + +- [润和RK3568开发板标准系统快速上手](https://gitee.com/openharmony-sig/knowledge_demo_temp/tree/master/docs/rk3568_helloworld) +- [OpenHarmony三方库地址](https://gitee.com/openharmony-tpc) +- [OpenHarmony知识体系](https://gitee.com/openharmony-sig/knowledge) +- [通过DevEco Studio开发一个NAPI工程](https://gitee.com/openharmony-sig/knowledge_demo_temp/blob/master/docs/napi_study/docs/hello_napi.md) diff --git a/thirdparty/libjpeg-turbo/docs/pic/jpeg_test.png b/thirdparty/libjpeg-turbo/docs/pic/jpeg_test.png new file mode 100755 index 0000000000000000000000000000000000000000..f59ff52c23dd0bdbb9624365ce9f1c40ce630f80 GIT binary patch literal 28064 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 HS8`h}H%YFC_0(Ba_BaI2FEF_J{ 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 DlG`Z! literal 0 HcmV?d00001 -- Gitee