From f590b7b88d2bf3ce985376f85a65891e73a3617e Mon Sep 17 00:00:00 2001 From: zhengxiaoqing <951929950@qq.com> Date: Mon, 4 Mar 2024 16:55:37 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0libde265?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- thirdparty/libde265/HPKBUILD | 51 +++++++++++ thirdparty/libde265/HPKCHECK | 24 +++++ thirdparty/libde265/README.OpenSource | 11 +++ thirdparty/libde265/README_zh.md | 11 +++ thirdparty/libde265/SHA512SUM | 1 + thirdparty/libde265/docs/hap_integrate.md | 82 ++++++++++++++++++ .../docs/pic/libde265_install_dir.png | Bin 0 -> 14356 bytes .../libde265/docs/pic/libde265_usage.png | Bin 0 -> 18201 bytes 8 files changed, 180 insertions(+) create mode 100644 thirdparty/libde265/HPKBUILD create mode 100644 thirdparty/libde265/HPKCHECK create mode 100644 thirdparty/libde265/README.OpenSource create mode 100644 thirdparty/libde265/README_zh.md create mode 100644 thirdparty/libde265/SHA512SUM create mode 100644 thirdparty/libde265/docs/hap_integrate.md create mode 100644 thirdparty/libde265/docs/pic/libde265_install_dir.png create mode 100644 thirdparty/libde265/docs/pic/libde265_usage.png diff --git a/thirdparty/libde265/HPKBUILD b/thirdparty/libde265/HPKBUILD new file mode 100644 index 00000000..dc07ddac --- /dev/null +++ b/thirdparty/libde265/HPKBUILD @@ -0,0 +1,51 @@ +# Contributor: zhengxiaoqing +# Maintainer: zhengxiaoqing + +pkgname=libde265 +pkgver=v1.0.15 +pkgrel=0 +pkgdesc="libde265 is an open source implementation of the h.265 video codec." +url="https://github.com/strukturag/libde265" +archs=("armeabi-v7a" "arm64-v8a") +license=("GNU Lesser") +depends=() +makedepends=() +source="https://github.com/strukturag/$pkgname/archive/refs/tags/$pkgver.tar.gz" + +downloadpackage=true +autounpack=true +buildtools="cmake" + +builddir=$pkgname-${pkgver:1} +packagename=$builddir.tar.gz + +prepare() { + mkdir -p $builddir/$ARCH-build +} + +build() { + cd $builddir + ${OHOS_SDK}/native/build-tools/cmake/bin/cmake "$@" -DENABLE_ENCODER=ON -DENABLE_SDL=OFF -B$ARCH-build -S./ > $buildlog 2>&1 + $MAKE VERBOSE=1 -C $ARCH-build >> $buildlog 2>&1 + ret=$? + cd $OLDPWD + return $ret +} + +package() { + cd $builddir + $MAKE VERBOSE=1 -C $ARCH-build install >> $buildlog 2>&1 + cd $OLDPWD +} + +check() { + echo "The test must be on an OpenHarmony device!" + # 测试方式 + # 进入构建目录 + # 执行: ./dec265/dec265 ../testdata/girlshy.h265 +} + +# 清理环境 +cleanbuild(){ + rm -rf ${PWD}/$builddir #${PWD}/$packagename +} \ No newline at end of file diff --git a/thirdparty/libde265/HPKCHECK b/thirdparty/libde265/HPKCHECK new file mode 100644 index 00000000..c718d8e9 --- /dev/null +++ b/thirdparty/libde265/HPKCHECK @@ -0,0 +1,24 @@ +# Contributor: zhengxiaoqing +# Maintainer: zhengxiaoqing + +source HPKBUILD > /dev/null 2>&1 # 导入HPKBUILD文件 +logfile=${LYCIUM_THIRDPARTY_ROOT}/${pkgname}/${pkgname}_${ARCH}_${OHOS_SDK_VER}_test.log + +# 在OH环境执行测试的接口 +openharmonycheck() { + res=1 + cd ${builddir}/${ARCH}-build + + # OH环境测试结果与原库在linux测试结果进行比对,实现自动化测试 + # 原库在linux测试结果:nFrames decoded: 75 (316x240 @ 947.57 fps) + # 其中帧率值受硬件条件影响,非固定值,不进行对比 + result=$(./dec265/dec265 ../testdata/girlshy.h265 2>&1) + echo $result > ${logfile} 2>&1 + result1=`echo $result|awk -F '@' '{print $1}'` + if [ "$result1" == "nFrames decoded: 75 (316x240 " ];then + res=0 + fi + cd $OLDPWD + + return $res +} \ No newline at end of file diff --git a/thirdparty/libde265/README.OpenSource b/thirdparty/libde265/README.OpenSource new file mode 100644 index 00000000..9d3b16c5 --- /dev/null +++ b/thirdparty/libde265/README.OpenSource @@ -0,0 +1,11 @@ +[ + { + "Name": "libde265", + "License": "GNU Lesser", + "License File": "README.md", + "Version Number": "v1.0.15", + "Owner": "zhaoxiaoqing17@h-partners.com", + "Upstream URL": "https://github.com/strukturag/libde265", + "Description": "libde265 is an open source implementation of the h.265 video codec." + } +] \ No newline at end of file diff --git a/thirdparty/libde265/README_zh.md b/thirdparty/libde265/README_zh.md new file mode 100644 index 00000000..1ecab505 --- /dev/null +++ b/thirdparty/libde265/README_zh.md @@ -0,0 +1,11 @@ +# libdash三方库说明 +## 功能简介 +libde265用于h265格式视频编解码 +## 使用约束 +- IDE版本:DevEco Studio 3.1 Release +- SDK版本:ohos_sdk_public 4.0.8.1 (API Version 10 Release) +- 三方库版本:v1.0.15 +- 当前适配的功能:支持h265格式的视频解码,暂不支持编码 + +## 集成方式 ++ [应用hap包集成](docs/hap_integrate.md) diff --git a/thirdparty/libde265/SHA512SUM b/thirdparty/libde265/SHA512SUM new file mode 100644 index 00000000..a0cba07e --- /dev/null +++ b/thirdparty/libde265/SHA512SUM @@ -0,0 +1 @@ +df380f1ea6345e20ed1f907df3c7cdaaac44358a6746e29e16699005783ce96524d30fec7bba457c9f9773a6373250aaaf0b9cd41224057b269798117964b8b5 libde265-1.0.15.tar.gz \ No newline at end of file diff --git a/thirdparty/libde265/docs/hap_integrate.md b/thirdparty/libde265/docs/hap_integrate.md new file mode 100644 index 00000000..81a65a8e --- /dev/null +++ b/thirdparty/libde265/docs/hap_integrate.md @@ -0,0 +1,82 @@ +# libde265 集成到应用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 4.0.8.1 (API Version 10 Release)](http://download.ci.openharmony.cn/version/Master_Version/OpenHarmony_4.0.8.1/20230608_091016/version-Master_Version-OpenHarmony_4.0.8.1-20230608_091016-ohos-sdk-full.tar.gz) +- [DevEco Studio 3.1 Release](https://contentcenter-vali-drcn.dbankcdn.cn/pvt_2/DeveloperAlliance_package_901_9/81/v3/tgRUB84wR72nTfE8Ir_xMw/devecostudio-windows-3.1.0.501.zip?HW-CC-KV=V1&HW-CC-Date=20230621T074329Z&HW-CC-Expire=315360000&HW-CC-Sign=22F6787DF6093ECB4D4E08F9379B114280E1F65DA710599E48EA38CB24F3DBF2) +- [准备三方库构建环境](../../../lycium/README.md#1编译环境准备) +- [准备三方库测试环境](../../../lycium/README.md#3ci环境准备) + +## 编译三方库 + +- 下载本仓库 + + ```shell + git clone https://gitee.com/openharmony-sig/tpc_c_cplusplus.git --depth=1 + ``` + +- 三方库目录结构 + + ```shell + tpc_c_cplusplus/thirdparty/libde265 #三方库libde265的目录结构如下 + ├── docs #三方库相关文档的文件夹 + ├── HPKBUILD #构建脚本 + ├── SHA512SUM #三方库校验文件 + ├── README.OpenSource #说明三方库源码的下载地址,版本,license等信息 + ├── README_zh.md + ``` + +- 在lycium目录下编译三方库 + + 编译环境的搭建参考[准备三方库构建环境](../../../lycium/README.md#1编译环境准备) + + ```shell + cd lycium + ./build.sh libde265 + ``` + +- 三方库头文件及生成的库 + + 在lycium目录下会生成usr目录,该目录下存在已编译完成的32位和64位三方库 + + ```shell + libde265/arm64-v8a libde265/armeabi-v7a + ``` + +- [测试三方库](#测试三方库) + +## 应用中使用三方库 + +- 在IDE的cpp目录下新增thirdparty目录,将编译生成的头文件拷贝到该目录下,将编译生成的三方库以及依赖库全部(动态库名字带版本号和不带版本号的都需要)拷贝到工程的libs目录下,如下图所示: +   + +  ![thirdparty_install_dir](pic/libde265_install_dir.png) + +- 在最外层(cpp目录下)CMakeLists.txt中添加如下语句 + + ```shell + #将三方库加入工程中 + target_link_libraries(entry PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libde265/${OHOS_ARCH}/lib/libde265.so) + #将三方库的头文件加入工程中 + target_include_directories(entry PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/thirdparty/libde265/${OHOS_ARCH}/include) + ``` + +## 测试三方库 + +三方库的测试使用原库自带的测试用例来做测试 + +进入到构建目录执行(arm64-v8a-build为构建64位的目录,armeabi-v7a-build为构建32位的目录) +```shell + chmod 777 ./dec265/dec265 #添加权限 + ./dec265/dec265 ../testdata/girlshy.h265 #执行测试用例 +``` +## 参考资料 + +- [润和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) \ No newline at end of file diff --git a/thirdparty/libde265/docs/pic/libde265_install_dir.png b/thirdparty/libde265/docs/pic/libde265_install_dir.png new file mode 100644 index 0000000000000000000000000000000000000000..cf40c1a501f54e7e29d8e9919f3a7f314ea722b8 GIT binary patch literal 14356 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 eMDYM3>