diff --git a/common/BuildGuide.md b/common/BuildGuide.md new file mode 100644 index 0000000000000000000000000000000000000000..c09c74bbfc1ad05cacbdf6e621e9569c2ca96e96 --- /dev/null +++ b/common/BuildGuide.md @@ -0,0 +1,91 @@ +# HiStreamer本地编译验证方法 +每次修改代码,都要编译并烧版本到单板运行验证,效率比较低。HiStreamer代码使用标准C++和posix接口开发,可以跨平台运行,所以也可以在Windows/Linux/Android上编译运行。 + +本文最新版本链接: +https://gitee.com/histreamer/histreamer_dev/blob/master/doc/BuildGuide.md + +## HiStreamer本地开发环境 +### 获取代码 +- histreamer_dev 辅助本地编译验证的代码: + - 这部分代码不属于OH开源代码, 仅给有需要的开发人员参考。 + - 下载方式: + ```shell + git clone git@gitee.com:histreamer/histreamer_dev.git + ``` +> **其它依赖代码在编译时会自动下载:** +> 用CLion打开 histreamer_dev 项目, 它会自动下载下面两个仓, 并可在指定MinGW版本下编译运行: +> 1. test_resource.git (master分支) +> 2. openharmony/multimedia_histreamer.git (develop分支) + +### 上述操作完成后的本地代码目录结构 +``` +code + histreamer_dev + CMakeList.txt + 3rdparty + curl + ffmpeg + sdl + ohos + gtest + mockcpp + adapter + windows + demo + android + linux + windows + histreamer + engine + interface + tests +``` +注: +- ohos目录放的是鸿蒙接口,并且在编译windows/linux/android demo时也需要的文件。 + +## Windows编译运行环境准备 + +#### Windows 编译工具 +- 安装 MinGW 8.1.0 posix seh 版本, 下载解压缩即可 + - [官方链接](https://nchc.dl.sourceforge.net/project/mingw-w64/Toolchains%20targetting%20Win64/Personal%20Builds/mingw-builds/8.1.0/threads-posix/seh/x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z) + +#### CLion 集成开发环境 +- 安装 CLion, 建议用 2021.2.2 版本。 ([官方链接](https://www.jetbrains.com/clion/download/other.html)) +- 打开 CLion 导入 histreamer_dev,它就会根据 CMakeLists.txt 创建项目,可以编译运行。 +#### 命令行 编译 +如果对集成开发环境依赖程度不高,可以使用命令行编译。 +参考 histreamer_dev/build_windows_demo.bat 修改本地编译工具路径,即可运行编译。 +使用下面的命令运行: +```shell +cd build_mingw\bin +histreamer_player.exe +``` +> 注: 需要在构建结果目录build_mingw\bin运行。 + +## Android编译环境 + +#### Android 编译工具 +- 安装 ndk 20.1.5948944, 下载解压缩到 path/to/android_sdk/ndk/20.1.5948944 + - [官方链接](https://github.com/android/ndk/wiki/Unsupported-Downloads) +#### 命令行 编译 + - 执行 build_android_demo.bat 即可编译。 + +>注意: 需要先执行命令把mp3资源拷贝到demo/android/app/src/main/res/raw目录。 +``` +mkdir demo\android\app\src\main\res\raw +copy resource\dream_it_possible.mp3 demo\android\app\src\main\res\raw\dream_it_possible.mp3 /y +``` + +注: +1. NDK配置方法: + - https://developer.android.com/studio/projects/install-ndk + +2. 播放的更多音频文件可以放到如下目录: + /storage/emulated/0/Android/data/ohos.histreamer.demo/files/Music + +## Linux编译环境 + +如果使用的是Linux编译环境,也是可以编译 HiStreamer的Linux Demo并运行的。 + +编译工具用标准的g++就可以,用构建脚本 build.sh 即可编译。 + diff --git "a/common/C++\347\274\226\347\250\213\347\272\246\345\256\232.md" "b/common/C++\347\274\226\347\250\213\347\272\246\345\256\232.md" new file mode 100644 index 0000000000000000000000000000000000000000..875eb227565094190c2efff16bdc7a9342b741a2 --- /dev/null +++ "b/common/C++\347\274\226\347\250\213\347\272\246\345\256\232.md" @@ -0,0 +1,56 @@ +# C++编程约定 + +## 概述 + +总的来说,遵循[C++语言编程规范](https://gitee.com/openharmony/docs/blob/master/zh-cn/contribute/OpenHarmony-cpp-coding-style-guide.md) + +## 开发过程中避免出现codecheck规范问题 + +1. 行宽不要超过120字符,超过换行参数对齐,行尾不要流空格。 + +2. 函数参数不要超过5个。 + +3. 函数不要太长,最多不要超过50行。 + + +## 约定 + +为了风格统一,和便于工具自动化处理。有如下建议: + +1. 指针*和引用&符号跟随类型。 +```c++ +int* p = nullptr; +int& p = i; +const char* const VERSION = "V100"; +``` + +2. 参数尽可能加const的建议有点老,加了const是不能move的。结合具体情况看是否需要const &。 + +3. 未使用的参数告警。 + - 如果该参数确实不需要,就删除。 + - 如果属于误报,就用 UNUSED_VARIABLE(param) 规避,它本质上就是 (void)param; + + +## 典型的codecheck误报告警 (无须修改代码) + +1. 误报大括号位置需要空格(即{左边需要有空格),下面这些场景不需要加空格: +```c++ +std::function func{}; + +AudioPortCapability portCap{0}; + +OnEvent({EVENT_AUDIO_PROGRESS, pts}); + +if (pipeline_->AddFilters({videoDecoder.get()}) == ErrorCode::SUCCESS) +``` +参考编程规范 建议7.1.1 示例。 + +2. 误报使用统一的大括号换行风格,下面这种lambda表达式场景不适用,可以不修改。 +```c++ +if (std::any_of(v2.begin(), v2.end(), [&v1, &cmpFunc](const T& tmp){return cmpFunc(tmp, v1) == 0;})) +``` + +3. 误报使用函数替代宏。 +如果宏不能被替代,则不需要修改代码。 + + diff --git "a/common/GIT\344\275\277\347\224\250\346\226\271\346\263\225.md" "b/common/GIT\344\275\277\347\224\250\346\226\271\346\263\225.md" new file mode 100644 index 0000000000000000000000000000000000000000..651e26ad7657039978b076a693202c1c5c6eefbd --- /dev/null +++ "b/common/GIT\344\275\277\347\224\250\346\226\271\346\263\225.md" @@ -0,0 +1,113 @@ +# GIT使用方法 + +## GIT基础知识 + +### Git基本概念理解。(commit是重点) + +### Git工作模型 +Web上动态的Git CheatSheet:(强烈推荐,不能访问就需要FQ) +http://ndpsoftware.com/git-cheatsheet.html +这个对理解index/workspace/local repository非常有帮助。 + +也可以参考下面的图: +![Git工作模型图](images/git-data-transport-commands.png) + +## Git常用操作(重要 ☆☆☆☆☆) + +1. 更新本地代码为服务器最新代码 +```shell +git fetch +git status +git rebase origin/master +``` +如果git status查看到有本地修改,需要先提交本地修改为commit,再rebase。 +> 注意: 不要用git pull更新代码,它默认执行merge操作,会产生merge节点。这会导致后面代码无法提交。 + +2. 把本地修改代码提交为一个commit +``` +git add -u +git commit -s -m "your commit message" +``` + +3. 把本地 commit 提交到服务器 +``` +git push origin HEAD:your_branch_name +``` + +4. 创建Pull Request到要贡献的仓库. +在gitee网站操作。 + +5. 把指定的commit应用到自己的工作目录。 +``` +git cherry-pick commit_id +``` + +6. 用reset控制本地工作分支。(谨慎使用,避免工作内容丢失,最好先做备份) +``` +git reset [最好别用这个命令,除非你知道在干啥] --hard commit_id +``` +此命令会把当前工作分支切换到指定的commit_id,并改变工作目录内容为对应的内容。它会使得commit_id后面本地工作分支的内容都丢失。 + +> 注: + 1.上述命令假设remote名字为 origin, 如果不是,可以用git remote show查看remote名字. + + +## FAQ + +1. Git回到任意历史版本。(checkout/reset,以及另外一个易混淆的revert) + +2. Git下的冲突解决。 + +3. Git配置和分支图查看。 + +4. Git分支操作。(本地分支/远程分支,分支合并,切换分支) + +5. 二进制文件冲突解决办法:(最终版) +You have to resolve the conflict manually (copying the file over) and then commit the file (no matter if you copied it over or used the local version) like this + +git commit -a -m "Fix merge conflict in test.foo" +Git normally autocommits after merging, but when it detects conflicts it cannot solve by itself, it applies all patches it figured out and leaves the rest for you to resolve and commit manually. The Git Merge Man Page, the Git-SVN Crash Course or this blog entry might shed some light on how it's supposed to work. + +Edit: See the post below, you don't actually have to copy the files yourself, but can use + +git checkout --ours -- path/to/file.txt +git checkout --theirs -- path/to/file.txt +to select the version of the file you want. Copying / editing the file will only be necessary if you want a mix of both versions. + +来源: + +6. Git rebase和 git merge 的区别 +- A) 初始状态 +``` +o--o--o <-- origin_branch + \ + a--b--c <-- mywork +``` +- B) 服务器代码有更新 +``` +o--o--O--o--o--o <-- origin_branch + \ + a--b--c <-- mywork +``` +- C) 如果执行 git merge origin_branch 或者 git pull +``` +o--o--O--o--o--o <-- origin_branch + \ \ + a--b--c--m<-- mywork +``` +产生了一个merge节点m。 +- D) 如果执行git rebase origin_branch +``` +o--o--O--o--o--o <-- origin_branch + \ + a`--b`--c` +``` +把本地提交a,b,c应用到origin_branch的最新位置之后。保持整体是线性的。 + +7. 使用命令行查看和管理分支 +- 配置git lg命令查看分支情况 +``` +git config --global alias.lg "log --graph --pretty=format:'%Cr +ed%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit --date=relative" +``` + diff --git "a/common/Histreamer\345\274\200\345\217\221\344\270\200\346\214\207\347\246\205.md" "b/common/Histreamer\345\274\200\345\217\221\344\270\200\346\214\207\347\246\205.md" new file mode 100644 index 0000000000000000000000000000000000000000..d7fd6a80355823ac336fadbe52b430e41a1b6f8b --- /dev/null +++ "b/common/Histreamer\345\274\200\345\217\221\344\270\200\346\214\207\347\246\205.md" @@ -0,0 +1,110 @@ +## 0. 参与贡献的说明 + +可以认领适合自己难度的issue,开始参与贡献,并把解决issue过程中的输出记录到issue评论中。 + +### 0.1 社区任务难度分级说明 + +任务按照 L0 ~ L3 难度依次递增。 +标签举例: + +- L0_test : 难度低,测试验证即可 +- L1_warningfix : 难度较低,告警修复 +- L1_autotest : 难度较低,自动化测试用例。 + +# 1. 项目 + +任务列表:https://www.kdocs.cn/l/cr6QpSoWsTJu + +Daily测试:https://www.kdocs.cn/l/cuyY47xCwZgO?from=docs&reqtype=kdocs&startTime=1685432492343 + +histreamer主仓:https://gitee.com/openharmony/multimedia_histreamer + +histreamer相关辅助仓:https://gitee.com/histreamer + +环境配置:[https://gitee.com/histreamer/histreamer_dev/blob/master/doc/%E5%B7%A5%E4%BD%9C%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA%E6%8C%87%E5%8D%97.md](https://gitee.com/histreamer/histreamer_dev/blob/master/doc/工作环境搭建指南.md) + +上游framework仓库:https://gitee.com/openharmony/multimedia_player_framework + +# 2. 编译调试 + +## 2.1 配置环境 + +```bash +git config --global user.name "yourname" +git config --global user.email "your-email-address" +git config --global credential.helper store +``` + +## 2.2 下载代码 + +```bash +repo init -u https://gitee.com/openharmony/manifest.git -b master --no-repo-verify +repo sync -c +repo forall -c 'git lfs pull' +``` + +## 2.3 在源码根目录下执行脚本,安装编译器及二进制工具。 + +```cobol +bash build/prebuilts_download.sh +``` + +## 2.4 编译和调试 + +### 2.4.1 编译命令 + +```bash +1. run 'hb clean --all' or 'rm -rf out build/resources/args/*.json'. +2. repo sync(repo sync --force-sync base/startup/init) +3. repo forall -c 'git lfs pull' +4. bash build/prebuilts_download.sh +5. 重新编译:./build.sh --product-name rk3568 --ccache +6. 区分是否第一次编译 +// 第一次编译系统 +./build.sh --product-name rk3568 --ccache(镜像路径:out/rk3568/packages/phone/images) +第一次编译会有问题,根据提示运行以下命令: + +// 后续只需要编译so +./build.sh --product-name rk3568 --ccache --build-target multimedia_histreamer(直接用脚本推到设备) +``` + +### 2.4.2 调试 + +查看sn:hdc_std list targets + +切换到histreamer:hdc shell param set debug.media_service.histreamer 1 + +测试视频:hdc shell setenforce 0 + +抓取日志:hdc hilog > log.txt + +安装hap:hdc install -r entry-default-signed.hap + +RK板子丢失日志,可以执行如下命令试试: + +```bash +hdc shell + +--- 初始命令: +hilog -b X +hilog -b D -D 0xd002b00 +hilog -b D -D 0xd003b00 +hilog -b D -D 0xd002b2b +hilog -Q pidoff +exit + +// OMX: C02b90 +hilog -b D -D 0xd002b90 + +// Gst: C02b2b +hilog -b D -D 0xd002b2b + +// HDI: C02500 +hilog -b D -D 0xd002500 +``` + +蓝区:https://gitee.com/histreamer/multimedia_player_framework/pulls/1/files,可以用来测试音频文件 + +Demo安装到板子:https://gitee.com/histreamer/histreamer_dev/wikis/Test%20Demo/Demo%E5%AE%89%E8%A3%85%E5%88%B0%E6%9D%BF%E5%AD%90 + +如果DevEco Studio无法识别RK,可能是两者用了同一个端口,解决方式是设置一些系统变量HDC_SERVER_PORT,随便设置一个值,例如8392,只要这个值不和别的进程冲突就行。 diff --git a/tools/git_branch_description.txt b/common/git_branch_description.txt similarity index 100% rename from tools/git_branch_description.txt rename to common/git_branch_description.txt diff --git a/oh_compile.md b/common/oh_compile.md similarity index 97% rename from oh_compile.md rename to common/oh_compile.md index f38ee0a6f59ac699a98457c33b379dc79ebbd8c8..8d89bd677d2b3f88ebf5ab2af2e8ce5437810261 100644 --- a/oh_compile.md +++ b/common/oh_compile.md @@ -1,120 +1,120 @@ -## 编译 - -### WSL 2 + Docker 编译 -Windows上开发,可以用 WSL 来编译,从而复用 Windows 上下载的代码。 -使用 Docker 编译,又可以避免复杂的环境配置过程。 - -WSL 下 可以直接使用 Docker,不需要安装 Windows Docker App。 所以使用 Docker 编译是可能的。 - -#### 1. 安装 WSL 环境。 -- 1. 打开设置->安全和更新->开发者选项,选择为“开发人员模式”; - -- 2. Win + R运行control appwiz.cpl指令,在启用或关闭Windows功能中勾选适用于Linux的Windows子系统和虚拟机平台两项启用,重启(注:没有虚拟机平台的,请升级Windows系统,Win10 版本号为 2004(内部版本19041或更高)); - -- 3. 以管理员身份打开PowerShell并运行下面命令开启Windows子系统功能; -``` -dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart -``` - -- 4. 打开Microsoft Store搜索Ubuntu,安装Ubuntu20.04 版本。(不要安装 Ubuntu 22.04, 它不能编译OpenHarmony) - -- 5. 安装完直接打开,设置用户名和密码以及root用户密码。 - -- 6. 将Ubuntu Shell环境修改为bash -执行sudo dpkg-reconfigure dash,选择No,将Ubuntu shell由dash修改为bash - -- 7. 执行下面命令查看 WSL 版本: -``` -wsl -l -v -``` -如果是版本 2,则正常,否则用下面命令升级到2: -``` -wsl.exe --set-version Ubuntu-20.04 2 -``` - -- 8. Ubuntu源改为国内的: -先备份原来的文件: -``` -sudo cp -ra /etc/apt/sources.list /etc/apt/sources.list.bak -``` -然后修改: -``` -sudo vim /etc/apt/sources.list -``` -清除原来内容,添加aliyun源: -``` -deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse -deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse - -deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse -deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse - -deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse -deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse - -deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse -deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse - -deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse -deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse -``` -更新缓存并升级: -``` -sudo apt-get update -sudo apt-get upgrade -``` - -#### 2. 安装 Docker 环境并编译。 - -- 1. 安装 Docker -``` -sudo apt install docker.io -``` -- 2. 启动 Docker -启动docker deamon程序,docker命令才能正常工作。可以在一个命令行窗口启动dockerd,再打开一个新的命令行窗口执行docker命令。 -``` -sudo dockerd -``` -- 3. 拉取OpenHarmony编译的Docker镜像 -参考:[文档](https://gitee.com/openharmony/docs/tree/master/docker) -``` -sudo docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 -``` -- 4. 进入OpenHarmony代码所在目录,启动 Docker -``` -sudo docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 -``` -> 注意: 代码应该直接下载在 WSL的 home路径的某个子目录下。 -> 这样才会把代码和编译结果存放在ext4.vhdk里面, 性能更好,且不容易出错 -> (完整路径类似于: C:\Users\yourname\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdk) -> 不要下载到 /mnt/d/code 这种 /mnt 下的目录,否则编译时因为文件名大小写不区分会报错,而且编译速度非常慢。 - -- 5. 进行编译: -``` -hb set # 在显示的页面中通过键盘上下键选择需要编译的平台,通过回车确定选择,配置一次即可。 -hb build # 增量编译 -hb build -f # 全量编译。 -``` -> 如果编译RK3568版本,则hb set选择 rk3568 产品即可。 - -- 6. Windows访问WSL下的文件 -"此电脑"点右键 -> 映射网络驱动器 -> 输入"\\wsl$",选择使用的WSL系统, 并分配一个盘符给它。 -挂载后如下图这样: -![](images/mount_wsl.png) - -- 7. 编译单个模块 -``` -./build.sh --product-name rk3568 --ccache --build-target multimedia_histreamer -``` -> 注意: 这种方式编译结果在下面目录,没有打包到镜像中,也不在system/lib: -> out\rk3568\multimedia\multimedia_histreamer - -- 9. 编译64位版本 -全编译: -``` -./build.sh --product-name rk3568 --target-cpu arm64 -``` -单模块编译: -``` -./build.sh --product-name rk3568 --ccache --build-target multimedia_histreamer --target-cpu arm64 -``` +## 编译 + +### WSL 2 + Docker 编译 +Windows上开发,可以用 WSL 来编译,从而复用 Windows 上下载的代码。 +使用 Docker 编译,又可以避免复杂的环境配置过程。 + +WSL 下 可以直接使用 Docker,不需要安装 Windows Docker App。 所以使用 Docker 编译是可能的。 + +#### 1. 安装 WSL 环境。 +- 1. 打开设置->安全和更新->开发者选项,选择为“开发人员模式”; + +- 2. Win + R运行control appwiz.cpl指令,在启用或关闭Windows功能中勾选适用于Linux的Windows子系统和虚拟机平台两项启用,重启(注:没有虚拟机平台的,请升级Windows系统,Win10 版本号为 2004(内部版本19041或更高)); + +- 3. 以管理员身份打开PowerShell并运行下面命令开启Windows子系统功能; +``` +dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart +``` + +- 4. 打开Microsoft Store搜索Ubuntu,安装Ubuntu20.04 版本。(不要安装 Ubuntu 22.04, 它不能编译OpenHarmony) + +- 5. 安装完直接打开,设置用户名和密码以及root用户密码。 + +- 6. 将Ubuntu Shell环境修改为bash +执行sudo dpkg-reconfigure dash,选择No,将Ubuntu shell由dash修改为bash + +- 7. 执行下面命令查看 WSL 版本: +``` +wsl -l -v +``` +如果是版本 2,则正常,否则用下面命令升级到2: +``` +wsl.exe --set-version Ubuntu-20.04 2 +``` + +- 8. Ubuntu源改为国内的: +先备份原来的文件: +``` +sudo cp -ra /etc/apt/sources.list /etc/apt/sources.list.bak +``` +然后修改: +``` +sudo vim /etc/apt/sources.list +``` +清除原来内容,添加aliyun源: +``` +deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse + +deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse + +deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse + +deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse + +deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse +deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse +``` +更新缓存并升级: +``` +sudo apt-get update +sudo apt-get upgrade +``` + +#### 2. 安装 Docker 环境并编译。 + +- 1. 安装 Docker +``` +sudo apt install docker.io +``` +- 2. 启动 Docker +启动docker deamon程序,docker命令才能正常工作。可以在一个命令行窗口启动dockerd,再打开一个新的命令行窗口执行docker命令。 +``` +sudo dockerd +``` +- 3. 拉取OpenHarmony编译的Docker镜像 +参考:[文档](https://gitee.com/openharmony/docs/tree/master/docker) +``` +sudo docker pull swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 +``` +- 4. 进入OpenHarmony代码所在目录,启动 Docker +``` +sudo docker run -it -v $(pwd):/home/openharmony swr.cn-south-1.myhuaweicloud.com/openharmony-docker/openharmony-docker:1.0.0 +``` +> 注意: 代码应该直接下载在 WSL的 home路径的某个子目录下。 +> 这样才会把代码和编译结果存放在ext4.vhdk里面, 性能更好,且不容易出错 +> (完整路径类似于: C:\Users\yourname\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04LTS_79rhkp1fndgsc\LocalState\ext4.vhdk) +> 不要下载到 /mnt/d/code 这种 /mnt 下的目录,否则编译时因为文件名大小写不区分会报错,而且编译速度非常慢。 + +- 5. 进行编译: +``` +hb set # 在显示的页面中通过键盘上下键选择需要编译的平台,通过回车确定选择,配置一次即可。 +hb build # 增量编译 +hb build -f # 全量编译。 +``` +> 如果编译RK3568版本,则hb set选择 rk3568 产品即可。 + +- 6. Windows访问WSL下的文件 +"此电脑"点右键 -> 映射网络驱动器 -> 输入"\\wsl$",选择使用的WSL系统, 并分配一个盘符给它。 +挂载后如下图这样: +![](images/mount_wsl.png) + +- 7. 编译单个模块 +``` +./build.sh --product-name rk3568 --ccache --build-target multimedia_histreamer +``` +> 注意: 这种方式编译结果在下面目录,没有打包到镜像中,也不在system/lib: +> out\rk3568\multimedia\multimedia_histreamer + +- 9. 编译64位版本 +全编译: +``` +./build.sh --product-name rk3568 --target-cpu arm64 +``` +单模块编译: +``` +./build.sh --product-name rk3568 --ccache --build-target multimedia_histreamer --target-cpu arm64 +``` diff --git a/oh_source_download.md b/common/oh_source_download.md similarity index 96% rename from oh_source_download.md rename to common/oh_source_download.md index 766393c1b43a33f16650c7fa0bc863a322d81bc2..574d07c0c189d2e2b4ab41ef10a4c12487434521 100644 --- a/oh_source_download.md +++ b/common/oh_source_download.md @@ -1,53 +1,53 @@ -# OpenHarmony代码下载 - -## 环境准备(Ubuntu) -1. 安装工具: -```shell -sudo apt install git -sudo apt install git-lfs -sudo apt install curl -``` -2. 配置git: -```shell -git config --global user.name yourname -git config --global user.email youremail -git config --global credential.helper store -``` -3. 安装repo码云工具: -```shell -wget https://gitee.com/guodongchen/openharmony-doc/raw/master/tools/repo -sudo mv repo /usr/local/bin/repo -sudo chmod a+x /usr/local/bin/repo -``` -4. 安装需要使用的其它工具 -```shell -sudo apt install unzip python-pip -``` -> 备注: python-pip可能不用安装也行,unzip需要安装,执行prebuilts_download.sh需要用到. - -5. 下载OpenHarmony代码 (先把ssh key注册到gitee网站) -```shell -repo init -u ssh://git@gitee.com/openharmony/manifest.git -b master --no-repo-verify --depth=1 -repo sync -c --no-tags -repo forall -c 'git lfs pull' -``` -> 注意: 如果使用WSL, 代码应该直接下载在 WSL的 home路径的某个子目录下。 - -6. 下载编译工具 -```shell -bash build/prebuilts_download.sh -``` - -7. 浅层克隆的仓转换成完整克隆 -使用 --depth=1 之后,变成浅层克隆。 -某个仓(比如 histreamer)转换为完整克隆的方法: -``` -git fetch --unshallow -``` - - -## 参考文章 -https://gitee.com/openharmony/manifest - - -https://gitee.com/openharmony/docs/blob/master/zh-cn/OpenHarmony-Overview_zh.md +# OpenHarmony代码下载 + +## 环境准备(Ubuntu) +1. 安装工具: +```shell +sudo apt install git +sudo apt install git-lfs +sudo apt install curl +``` +2. 配置git: +```shell +git config --global user.name yourname +git config --global user.email youremail +git config --global credential.helper store +``` +3. 安装repo码云工具: +```shell +wget https://gitee.com/guodongchen/openharmony-doc/raw/master/tools/repo +sudo mv repo /usr/local/bin/repo +sudo chmod a+x /usr/local/bin/repo +``` +4. 安装需要使用的其它工具 +```shell +sudo apt install unzip python-pip +``` +> 备注: python-pip可能不用安装也行,unzip需要安装,执行prebuilts_download.sh需要用到. + +5. 下载OpenHarmony代码 (先把ssh key注册到gitee网站) +```shell +repo init -u ssh://git@gitee.com/openharmony/manifest.git -b master --no-repo-verify --depth=1 +repo sync -c --no-tags +repo forall -c 'git lfs pull' +``` +> 注意: 如果使用WSL, 代码应该直接下载在 WSL的 home路径的某个子目录下。 + +6. 下载编译工具 +```shell +bash build/prebuilts_download.sh +``` + +7. 浅层克隆的仓转换成完整克隆 +使用 --depth=1 之后,变成浅层克隆。 +某个仓(比如 histreamer)转换为完整克隆的方法: +``` +git fetch --unshallow +``` + + +## 参考文章 +https://gitee.com/openharmony/manifest + + +https://gitee.com/openharmony/docs/blob/master/zh-cn/OpenHarmony-Overview_zh.md diff --git a/rk3568_upgrade.md b/common/rk3568_upgrade.md similarity index 97% rename from rk3568_upgrade.md rename to common/rk3568_upgrade.md index 3bb126185746734be0dadfde20628e45e8906f11..42a1dd446c751e0c6114993e9da96bcdad6bec25 100644 --- a/rk3568_upgrade.md +++ b/common/rk3568_upgrade.md @@ -1,185 +1,185 @@ -# RK3568 (DAYU200) 升级方法 - -## 设备连线 -参见下图连接 USB线、电源线、耳机线。 -![](images/rk3568_board_prepare.jpg) - -## 版本升级 -### 1. 下载驱动和工具,电脑上安装驱动 -下载地址: -https://gitee.com/hihope_iot/docs -安装驱动: -``` -docs\HiHope_DAYU200\烧写工具及指南\windows\DriverAssitant_v5.1.1\DriverInstall.exe -``` -升级工具在这个路径: -``` -docs\HiHope_DAYU200\烧写工具及指南\windows\RKDevTool.exe -``` - -### 2. 准备好版本 -- 自己编译的版本所在路径: -``` -out\rk3568\packages\phone\images -``` -- 还可以下载服务器构建的版本: -http://ci.openharmony.cn/dailys/dailybuilds - - -### 3. 打开 RKDevTool 工具 -- ①. 确认版本路径正确 -- ②. 让板子进入 Loader 升级模式 (板子默认在MASKROM模式,应该也可以升级) - - a. 单板USB线连接电脑 - - b. 单板上电 - - c. 按住 recover 键 - - d. 按一下 reset 键 - - e. 下图②中的位置,显示 识别到 Loader 模式设备,即可松开 recover键。 -- ③. 点击执行,即可升级。 -![](images/rk3568_upgrade.jpg) - -还可以参考这篇文章: -``` -docs\HiHope_DAYU200\烧写工具及指南\HiHope-DAYU200镜像烧录指南.pdf -``` -以及下面链接: -[OpenHarmony-RK3568开发板操作梳理](https://zhuanlan.zhihu.com/p/505855186) - -### 4. RK3568用最新的升级方式升级64位版本 -- 1. 用 get_rk_images.bat 脚本从服务器下载镜像。 -- 2. 优先选择 Loader 升级模式。所以先按上面第3条讲的方法进入Loader模式。 - - 1) 设备界面上点击重启 - - 2) 按住Recover键 - - 3) 按一下Reset键 - - 4) 检查升级工具,应该已经是Loader模式 -- 3. 升级工具,右键导入配置,选择 config.cfg。(设备分区变化,这个配置文件会变) -- 4. 导入配置后,默认勾选的就是要升级的。默认路径不对,需要改成自己的镜像路径。 -- 5. 点击执行,即可开始升级。 - -## 调试方法 -### 1. 准备好 hdc_std.exe 工具 -可以从下面位置下载: -``` - http://ci.openharmony.cn/dailys/dailybuilds 中的 ohos-sdk 镜像。 -``` -然后把 hdc_std.exe 路径放到 path 环境变量中,并且改名为 hdc.exe。 - -### 2. 打印 log 信息 -执行如下命令: -``` -hdc hilog > log.txt -``` - -### 3. 使能 histreamer -把 FileSource so 拷贝到 system/lib,然后重启设备: -``` -D:\rk3568>hdc wait-for-device shell mount -o remount,rw / - -D:\rk3568>hdc file send libhistreamer_plugin_FileSource.z.so /system/lib -FileTransfer finish, File count = 1, Size:123572 time:38ms rate:3251.89kB/s - -D:\rk3568>hdc shell reboot -``` - -执行如下命令使能histreamer: -``` -hdc shell param set debug.media_service.histreamer 1 -``` -还可以执行下面命令查询: -``` -hdc shell param get debug.media_service.histreamer -``` - -### 4. 安装测试应用 -执行如下命令: -``` -hdc install -r entry-default-signed.hap -``` -桌面多出来 Label 应用就是。 - -点击它,进入 音频 -> API实现,即可播放音乐。 - -### 5. hdc其它命令 -参考: -https://gitee.com/openharmony/developtools_hdc_standard - -``` -D:\rk3568>hdc list targets -7001005458323933328a0xxxxxxx3800 - -``` - -使用下面命令可以重启设备: -``` -hdc shell reboot -``` -重启后,需要重新设置使用 histreamer。 - -使用下面命令可以查看帮助: -``` -D:\rk3568>hdc --help - - OpenHarmony device connector(HDC) ... - ----------------------------------global commands:---------------------------------- - -h/help - Print hdc help - -v/version - Print hdc version - -l 0-5 - Set runtime loglevel - -t connectkey - Use device with given connect key - ----------------------------------component commands:------------------------------- -session commands(on server): - discover - Discover devices listening on TCP via LAN broadcast - list targets [-v] - List all devices status, -v for detail - tconn key - Connect device via key, TCP use ip:port - example:192.168.0.100:10178/192.168.0.100 - USB connect automatic, TCP need to connect manually - - UART connect need connect manually. - Baud Rate can be specified with commas. - key format: [,Baud Rate] - example: tconn COM5,921600 - Default Baud Rate is 921600. - - start [-r] - Start server. If with '-r', will be restart server - kill [-r] - Kill server. If with '-r', will be restart server - -s [ip:]port - Set hdc server listen config - -service commands(on daemon): - target mount - Set /system /vendor partition read-write - target boot [-bootloader|-recovery] - Reboot the device or boot into bootloader\recovery. - smode [-r] - Restart daemon with root permissions, '-r' to cancel root - permissions - tmode usb - Reboot the device, listening on USB - tmode port [port] - Reboot the device, listening on TCP port - -``` - -### 6. 调试时可以使用的方法 -- 1. 可以把频繁打印的log注释掉,然后把log重定向到文件的同时,输出到屏幕。(参见第2条) - -- 2. 运行时抓取log到文件同时输出到屏幕 -``` -hdc hilog | tee log1.txt | grep HiStreamer -``` - -- 3. 杀进程 -``` -hdc shell -# ps -ef | grep media_service -media 2413 1 0 10:35:52 ? 00:00:00 media_service -root 2475 2439 14 10:39:02 pts/0 00:00:00 grep media_service -# kill 2413 -``` - -- 4. dump数据 - - a. 设备上设置dump数据存放路径权限为 777 - ``` - hdc shell - chmod 777 /data/local/tmp - ``` - - b. dump_buffer.h 中打开 DUMP_BUFFER2FILE 开关。 - - c. 设备上执行操作,产生dump文件,然后执行下面命令获取文件: (ok/histreamer_dump_files目录需要存在) - ``` -D:\rk3568\0508>hdc file recv /data/local/tmp/histreamer_dump_files ok -FileTransfer finish, Size:180575 time:17ms rate:10622.06kB/s - ``` +# RK3568 (DAYU200) 升级方法 + +## 设备连线 +参见下图连接 USB线、电源线、耳机线。 +![](images/rk3568_board_prepare.jpg) + +## 版本升级 +### 1. 下载驱动和工具,电脑上安装驱动 +下载地址: +https://gitee.com/hihope_iot/docs +安装驱动: +``` +docs\HiHope_DAYU200\烧写工具及指南\windows\DriverAssitant_v5.1.1\DriverInstall.exe +``` +升级工具在这个路径: +``` +docs\HiHope_DAYU200\烧写工具及指南\windows\RKDevTool.exe +``` + +### 2. 准备好版本 +- 自己编译的版本所在路径: +``` +out\rk3568\packages\phone\images +``` +- 还可以下载服务器构建的版本: +http://ci.openharmony.cn/dailys/dailybuilds + + +### 3. 打开 RKDevTool 工具 +- ①. 确认版本路径正确 +- ②. 让板子进入 Loader 升级模式 (板子默认在MASKROM模式,应该也可以升级) + - a. 单板USB线连接电脑 + - b. 单板上电 + - c. 按住 recover 键 + - d. 按一下 reset 键 + - e. 下图②中的位置,显示 识别到 Loader 模式设备,即可松开 recover键。 +- ③. 点击执行,即可升级。 +![](images/rk3568_upgrade.jpg) + +还可以参考这篇文章: +``` +docs\HiHope_DAYU200\烧写工具及指南\HiHope-DAYU200镜像烧录指南.pdf +``` +以及下面链接: +[OpenHarmony-RK3568开发板操作梳理](https://zhuanlan.zhihu.com/p/505855186) + +### 4. RK3568用最新的升级方式升级64位版本 +- 1. 用 get_rk_images.bat 脚本从服务器下载镜像。 +- 2. 优先选择 Loader 升级模式。所以先按上面第3条讲的方法进入Loader模式。 + - 1) 设备界面上点击重启 + - 2) 按住Recover键 + - 3) 按一下Reset键 + - 4) 检查升级工具,应该已经是Loader模式 +- 3. 升级工具,右键导入配置,选择 config.cfg。(设备分区变化,这个配置文件会变) +- 4. 导入配置后,默认勾选的就是要升级的。默认路径不对,需要改成自己的镜像路径。 +- 5. 点击执行,即可开始升级。 + +## 调试方法 +### 1. 准备好 hdc_std.exe 工具 +可以从下面位置下载: +``` + http://ci.openharmony.cn/dailys/dailybuilds 中的 ohos-sdk 镜像。 +``` +然后把 hdc_std.exe 路径放到 path 环境变量中,并且改名为 hdc.exe。 + +### 2. 打印 log 信息 +执行如下命令: +``` +hdc hilog > log.txt +``` + +### 3. 使能 histreamer +把 FileSource so 拷贝到 system/lib,然后重启设备: +``` +D:\rk3568>hdc wait-for-device shell mount -o remount,rw / + +D:\rk3568>hdc file send libhistreamer_plugin_FileSource.z.so /system/lib +FileTransfer finish, File count = 1, Size:123572 time:38ms rate:3251.89kB/s + +D:\rk3568>hdc shell reboot +``` + +执行如下命令使能histreamer: +``` +hdc shell param set debug.media_service.histreamer 1 +``` +还可以执行下面命令查询: +``` +hdc shell param get debug.media_service.histreamer +``` + +### 4. 安装测试应用 +执行如下命令: +``` +hdc install -r entry-default-signed.hap +``` +桌面多出来 Label 应用就是。 + +点击它,进入 音频 -> API实现,即可播放音乐。 + +### 5. hdc其它命令 +参考: +https://gitee.com/openharmony/developtools_hdc_standard + +``` +D:\rk3568>hdc list targets +7001005458323933328a0xxxxxxx3800 + +``` + +使用下面命令可以重启设备: +``` +hdc shell reboot +``` +重启后,需要重新设置使用 histreamer。 + +使用下面命令可以查看帮助: +``` +D:\rk3568>hdc --help + + OpenHarmony device connector(HDC) ... + +---------------------------------global commands:---------------------------------- + -h/help - Print hdc help + -v/version - Print hdc version + -l 0-5 - Set runtime loglevel + -t connectkey - Use device with given connect key + +---------------------------------component commands:------------------------------- +session commands(on server): + discover - Discover devices listening on TCP via LAN broadcast + list targets [-v] - List all devices status, -v for detail + tconn key - Connect device via key, TCP use ip:port + example:192.168.0.100:10178/192.168.0.100 + USB connect automatic, TCP need to connect manually + + UART connect need connect manually. + Baud Rate can be specified with commas. + key format: [,Baud Rate] + example: tconn COM5,921600 + Default Baud Rate is 921600. + + start [-r] - Start server. If with '-r', will be restart server + kill [-r] - Kill server. If with '-r', will be restart server + -s [ip:]port - Set hdc server listen config + +service commands(on daemon): + target mount - Set /system /vendor partition read-write + target boot [-bootloader|-recovery] - Reboot the device or boot into bootloader\recovery. + smode [-r] - Restart daemon with root permissions, '-r' to cancel root + permissions + tmode usb - Reboot the device, listening on USB + tmode port [port] - Reboot the device, listening on TCP port + +``` + +### 6. 调试时可以使用的方法 +- 1. 可以把频繁打印的log注释掉,然后把log重定向到文件的同时,输出到屏幕。(参见第2条) + +- 2. 运行时抓取log到文件同时输出到屏幕 +``` +hdc hilog | tee log1.txt | grep HiStreamer +``` + +- 3. 杀进程 +``` +hdc shell +# ps -ef | grep media_service +media 2413 1 0 10:35:52 ? 00:00:00 media_service +root 2475 2439 14 10:39:02 pts/0 00:00:00 grep media_service +# kill 2413 +``` + +- 4. dump数据 + - a. 设备上设置dump数据存放路径权限为 777 + ``` + hdc shell + chmod 777 /data/local/tmp + ``` + - b. dump_buffer.h 中打开 DUMP_BUFFER2FILE 开关。 + - c. 设备上执行操作,产生dump文件,然后执行下面命令获取文件: (ok/histreamer_dump_files目录需要存在) + ``` +D:\rk3568\0508>hdc file recv /data/local/tmp/histreamer_dump_files ok +FileTransfer finish, Size:180575 time:17ms rate:10622.06kB/s + ``` diff --git "a/common/\345\246\202\344\275\225\345\206\231\345\245\275\344\273\243\347\240\201.pptx" "b/common/\345\246\202\344\275\225\345\206\231\345\245\275\344\273\243\347\240\201.pptx" new file mode 100644 index 0000000000000000000000000000000000000000..27909ba6fa540dabe2050877e9f85359cae8190e Binary files /dev/null and "b/common/\345\246\202\344\275\225\345\206\231\345\245\275\344\273\243\347\240\201.pptx" differ diff --git "a/common/\345\267\245\344\275\234\347\216\257\345\242\203\346\220\255\345\273\272\346\214\207\345\215\227.md" "b/common/\345\267\245\344\275\234\347\216\257\345\242\203\346\220\255\345\273\272\346\214\207\345\215\227.md" new file mode 100644 index 0000000000000000000000000000000000000000..29623d4fedfc37ae96445e6c7e677280f1847fa2 --- /dev/null +++ "b/common/\345\267\245\344\275\234\347\216\257\345\242\203\346\220\255\345\273\272\346\214\207\345\215\227.md" @@ -0,0 +1,137 @@ +# 工作环境搭建指南 + +为了方便新加入的同事,做了这个总结。 + +## 新入职华为或华为外协的同事 + +- 手机上安装 welink, 便于查看 espace消息和邮件。 + - 访问 w3m.huawei.com 下载 welink 应用,并安装。 + - 登录 welink,工号和初始密码 需要联系对应同事获取。 + +- 加入 Zulip OpenHarmony社区 (Zulip是蓝区及时通信软件) + - 可以找加入Zulip比较早的同事,邀请新同事加入。 + - 新同事在邮箱中收到邀请邮件,点击邮件里面的链接,输入密码完成注册。 + - Windows上安装Zulip + - 启动 Zulip软件,输入下面网址接入: https://zulip.openharmony.cn + - 然后用自己注册Zulip用户的邮箱和密码登录即可。 + +- 注册 gitee.com 账号。用华为邮箱注册,并且 git commit中也使用华为邮箱。这样后面的代码统计分类才是正确的。 + - 注: 如果不是华为或华为外协的同事,是外部开发者,则使用自己的邮箱就可以。 + +- 找管理员加入 gitee.com/histreamer/multimedia_histreamer.git 成为开发者,这样可以不用单独fork自己的个人仓。 + +- 使用蓝版Welink可以在蓝区Windows PC实时交流 + - 下载蓝版Welink: https://www.huaweicloud.com/product/welink-download.html + - 用手机号注册账号 + - 通过验证码:3WLW6SSC 加入OpenHarmony组织 + +## 安装软件 和 编译代码 + +- 安装 CLion + +- 安装指定的 MinGW 版本。 + +- 参考 BuildGuide 描述的方法安装配置,获取代码,编译运行。 + +## 查看设计文档 + +- 安装 Visual Studio Code + +- 在VSCode下安装 Markdown Preview Enhanced 插件。 + +- 安装上述软件后,就可以直接在VSCode中查看和编辑md设计文档。 + +- 了解plantuml用文本画图的方法,请参考:https://plantuml.com/zh/ + +## Harmony编译环境 + +- 官网:https://gitee.com/openharmony/docs/blob/master/zh-cn/device-dev/get-code/sourcecode-acquire.md +- WSL下载及OpenHarmony环境配置:https://blog.csdn.net/qq_32763487/article/details/121531688 +- 官网3516环境搭建:[链接](https://www.openharmony.cn/pages/00010103/#%E5%AE%89%E8%A3%85%E4%BE%9D%E8%B5%96%E5%B7%A5%E5%85%B7) + +## OpenHarmony CI每日编译版本 +- 下载链接: http://ci.openharmony.cn/dailys/dailybuilds + +## RK烧录方法(蓝区) + +- RK编译调试需要下载蓝区全量OH代码,环境搭建可参考上面 **Harmony编译环境** 部分,也可参考如下wiki从头到尾一次性搭建下环境: **https://www.yuque.com/u25440504/ehvzki/ergw6i** + +- 官网:https://gitee.com/hihope_iot/docs/tree/master/HiHope_DAYU200/%E7%83%A7%E5%86%99%E5%B7%A5%E5%85%B7%E5%8F%8A%E6%8C%87%E5%8D%97 + + 驱动工具: https://gitee.com/hihope_iot/docs/tree/master/HiHope_DAYU200/%E7%83%A7%E5%86%99%E5%B7%A5%E5%85%B7%E5%8F%8A%E6%8C%87%E5%8D%97/windows + + 烧录方法见:[HiHope-DAYU200镜像烧录指南.pdf](https://gitee.com/hihope_iot/docs/blob/master/HiHope_DAYU200/%E7%83%A7%E5%86%99%E5%B7%A5%E5%85%B7%E5%8F%8A%E6%8C%87%E5%8D%97/HiHope-DAYU200%E9%95%9C%E5%83%8F%E7%83%A7%E5%BD%95%E6%8C%87%E5%8D%97.pdf) + + **注意:**版本获取见《烧录指南》中的日构建版本获取地址。烧录成功后连接主机USB后即可使用hdc shell命令进行替换so等操作了。 + +- 编译命令: ./build.sh --product-name rk3568 --ccache + +- 蓝区hdc地址: http://ci.openharmony.cn/dailys/dailybuilds 中的 ohos-sdk 镜像。 + +## 测试资源 + +### 测试方法及以往的测试报告 + +https://gitee.com/histreamer/test_resource + +### 测试资源文件和用例运行方法 + +参见下面文章:[测试用例组织和分类运行方法](https://gitee.com/histreamer/multimedia_histreamer/wikis/%E8%87%AA%E5%8A%A8%E5%8C%96%E6%B5%8B%E8%AF%95/%E6%B5%8B%E8%AF%95%E7%94%A8%E4%BE%8B%E7%BB%84%E7%BB%87%E5%92%8C%E5%88%86%E7%B1%BB%E8%BF%90%E8%A1%8C%E6%96%B9%E6%B3%95?sort_id=5467128) + +另外还有一个资源仓库可供参考: +https://gitee.com/cshuteng/test_media_source + + +## 提交代码 + +### 背景介绍 +贡献代码到开源项目,有一些要求: +1. 【签署DCO】表明你贡献的代码是原创的,并且愿意贡献给开源项目。 +2. 【commit签名】表明该commit是你提交的。 + +因此,大家第一次贡献之前,应该做两件事: + +### 贡献代码前的准备工作 + +1. 签署DCO。([在线签署](https://dco.openharmony.cn/sign)) +2. 配置签名工具。 +```shell +# 1) 生成自己的key,填写的名称和email需要与git config配置一模一样。 +gpg --gen-key + +# 2) 运行下面命令配置commit自动签名 (可能不生效) +git config --global commit.gpgsign true +``` +3. 提交代码时增加 -s 参数。 +```shell +git commit -s -am "message" +# 或者修改上一个commit +git commit -s --amend +``` +4. 检查commit是否正确签名,看commit message是否有类似下面内容即可: +```shell +Signed-off-by: Chen Guodong +``` + +### 以后每次提交代码都需要签名 + +记得在 git commit 的时候加 -s 参数。 + +### 如果修改BUILD.gn文件,记得进行格式化 +下面命令可以对当前目录下所有gn文件进行格式化: +```shell +find ./ -name *.gn -exec ~/code/hmf/trunk/prebuilts/build-tools/linux-x86/bin/gn format {} \; +``` +- 注: 把其中的 ~/code/hmf/trunk 改成你的代码根目录。 + +### 创建 Pull Request + +有两种方式: (目前内部开发可以用方式1) +- 方式1:成为仓的开发者,然后按下面方式提交代码: + - 把修改的代码提交到自己的分支比如 br_cgd + - 再在网页上操作,创建Pull Request,合并到master + - 上述两步,也可以合并为 git push origin HEAD:master,自动产生PR。 +- 方式2: 自己fork一个仓库 + - 在自己的仓库中修改 + - 然后网页上创建 PR,合并到主仓。 + diff --git "a/common/\347\244\276\345\214\272\345\273\272\350\256\276.xlsx" "b/common/\347\244\276\345\214\272\345\273\272\350\256\276.xlsx" new file mode 100644 index 0000000000000000000000000000000000000000..46ad14904869d9cdbabb2d9f4028dcb3a547e194 Binary files /dev/null and "b/common/\347\244\276\345\214\272\345\273\272\350\256\276.xlsx" differ diff --git a/design/functions/audio_player_functions.md b/design/functions/audio_player_functions.md index 810bb24a70e79feba9f9f7025e2f41f174756678..9f9d694f41ea635af6709f0063985c730600fbe2 100644 --- a/design/functions/audio_player_functions.md +++ b/design/functions/audio_player_functions.md @@ -76,4 +76,45 @@ Pipeline -> Pipeline : Stop all filters player_framework -> HstPlayer : Reset player_framework -> HstPlayer : Release end +``` + +## Prepare阶段-生成DemuxerPlugin +``` plantuml +participant pipeline +participant DemuxerFilter + +pipeline -> DemuxerFilter: prepare +DemuxerFilter -> DemuxerFilter: ActivatePullMode +activate DemuxerFilter +DemuxerFilter -> DemuxerFilter: MediaTypeFound +activate DemuxerFilter +DemuxerFilter -> DemuxerFilter: InitPlugin +activate DemuxerFilter +DemuxerFilter -> DemuxerFilter: CreatePlugin +activate DemuxerFilter +DemuxerFilter -> PluginManager: CreateDemuxerPlugin +``` + +## Play阶段 +``` plantuml +participant player_framework +participant HiPlayerImpl +participant PipelineCore +participant MediaSourceFilter +participant DemuxerFilter +participant AudioDecodeFilter +participant AudioSinkFilter +participant VideoDecodeFilter +participant VideoSinkFilter + +player_framework -> HiPlayerImpl: Play +HiPlayerImpl -> HiPlayerImpl: DoPlay +activate HiPlayerImpl +HiPlayerImpl -> PipelineCore: Start +PipelineCore -> VideoSinkFilter: Start +PipelineCore -> VideoDecodeFilter: Start +PipelineCore -> AudioSinkFilter: Start +PipelineCore -> AudioDecodeFilter: Start +PipelineCore -> DemuxerFilter: Start +PipelineCore -> MediaSourceFilter: Start ``` \ No newline at end of file diff --git a/design/recorder/01.recorder_overview.md b/design/recorder/01.recorder_overview.md new file mode 100644 index 0000000000000000000000000000000000000000..f212006f4b1d719655e705b60113473c1d6a3ff9 --- /dev/null +++ b/design/recorder/01.recorder_overview.md @@ -0,0 +1,309 @@ +# HiStreamer录制流程设计 + +## 录制场景的状态机 + +```plantuml +[*] -> InitState +InitState -> RecordSettingState : SetVideoSource 或 SetAudioSource +RecordSettingState --> ReadyState : Prepare +ReadyState --> RecordingState : Start +RecordingState --> PauseState : Pause +PauseState --> RecordingState : Resume +RecordingState --> RecordingState : if NextOutputFd exists +RecordingState -up-> InitState : Stop +``` +说明: +- 任意状态,收到OnError事件,进入 ErrorState +- 任意状态,收到Stop/Reset事件,进入 InitState + +## 录制场景运行流程 + +与播放类似: +- HiRecorder负责创建并控制各个Filter节点。 +- 不会影响录制状态的操作,也不受录制状态影响的操作,可以不通过状态机直接生效。 + - 其它所有操作,都要经过状态机控制。(从播放器实际来看,是基本上都走了状态机控制) + +为了简化时序图,下图中省略了状态机。 + +```plantuml +scale 3/4 +participant App +participant HiRecorder +participant Pipeline +participant AudioSourceFilter +participant AudioEncoderFilter +participant VideoSourceFilter +participant VideoEncoderFilter +participant MuxerFilter +participant SinkFilter + +== 初始化 == + +App -> HiRecorder : create +HiRecorder -> Pipeline : create +HiRecorder -> MuxerFilter : create +HiRecorder -> SinkFilter : create +HiRecorder -> Pipeline : LinkFilters({muxer,sink}) + +App -> HiRecorder : SetAudioSource +HiRecorder -> AudioSourceFilter : create +HiRecorder -> AudioEncoderFilter : create +HiRecorder -> Pipeline : LinkFilters({audioSrc,audioEnc}) +HiRecorder -> MuxerFilter : AddTrack("in_audio_1", audioEnc.out) + +App -> HiRecorder : SetVideoSource +HiRecorder -> VideoSourceFilter : create +HiRecorder -> VideoEncoderFilter : create +HiRecorder -> Pipeline : LinkFilters({videoSrc,videoEnc}) +HiRecorder -> MuxerFilter : AddTrack("in_video_1", videoEnc.out) + +== 设置参数: 尽可能直接设置到需要的Filter == +App -> HiRecorder : SetAudioEncoder +HiRecorder -> AudioEncoderFilter : SetAudioCodecType() +App -> HiRecorder : SetAudioSampleRate +HiRecorder -> AudioSourceFilter : SetAudioSampleRate() +App -> HiRecorder : SetAudioChannels +HiRecorder -> AudioSourceFilter : SetAudioChannels() +App -> HiRecorder : SetAudioEncodingBitRate +HiRecorder -> AudioEncoderFilter : SetEncodingBitRate + +App -> HiRecorder : SetVideoEncoder +HiRecorder -> VideoEncoderFilter : SetVideoCodecType() +App -> HiRecorder : SetVideoSize +HiRecorder -> VideoSourceFilter : SetVideoSize +App -> HiRecorder : SetVideoFrameRate +HiRecorder -> VideoSourceFilter : SetVideoFrameRate +App -> HiRecorder : SetVideoEncodingBitRate +HiRecorder -> VideoEncoderFilter : SetEncodingBitRate + +App -> HiRecorder : SetOutputFormat +HiRecorder -> MuxerFilter : SetOutputFormat +App -> HiRecorder : SetMaxDuration +HiRecorder -> MuxerFilter : SetMaxDuration + +App -> HiRecorder : SetOutputPath +HiRecorder -> SinkFilter : SetOutputType(file) +HiRecorder -> SinkFilter : SetParameter(outPath) +App -> HiRecorder : SetOutputFile(fd) +HiRecorder -> SinkFilter : SetOutputType(file) +HiRecorder -> SinkFilter : SetParameter(outFd) +App -> HiRecorder : SetMaxFileSize +HiRecorder -> SinkFilter : SetParameter(maxFileSize) + +== Prepare和协商建链 == + +App -> HiRecorder : Prepare +HiRecorder -> Pipeline : Prepare +Pipeline -> SinkFilter : Prepare +MuxerFilter <- SinkFilter : Activate(push) +Pipeline -> MuxerFilter : Prepare +VideoEncoderFilter <- MuxerFilter : Activate(push) +AudioEncoderFilter <- MuxerFilter : Activate(push) + +Pipeline -> VideoEncoderFilter : Prepare +VideoSourceFilter <- VideoEncoderFilter: Activate(push) +Pipeline -> VideoSourceFilter : Prepare +VideoSourceFilter -> VideoEncoderFilter : Negotiate(caps) +note right : 每个Filter决定向后协商时传递的caps,协商时选择插件 +VideoEncoderFilter -> MuxerFilter : Negotiate(caps) +VideoEncoderFilter -> MuxerFilter : Configure(meta) +VideoSourceFilter -> VideoEncoderFilter : Configure(meta) +note right : 每个Filter决定向后Configure时传递的meta + +Pipeline -> AudioEncoderFilter : Prepare +AudioSourceFilter <- AudioEncoderFilter: Activate(push) +Pipeline -> AudioSourceFilter : Prepare +AudioSourceFilter -> AudioEncoderFilter : Negotiate(caps) +AudioEncoderFilter -> MuxerFilter : Negotiate(caps) +MuxerFilter -> SinkFilter : Negotiate(caps) +note left: Muxer前面所有端口协商完成,再与SinkFilter协商 +MuxerFilter -> SinkFilter : Configure(meta) +AudioEncoderFilter -> MuxerFilter : Configure(meta) +AudioSourceFilter -> AudioEncoderFilter : Configure(meta) + +== 启动录制 == + +App -> HiRecorder : Start +HiRecorder -> Pipeline : Start +Pipeline -> SinkFilter : Start +Pipeline -> MuxerFilter : Start +Pipeline -> VideoEncoderFilter : Start +Pipeline -> VideoSourceFilter : Start +Pipeline -> AudioEncoderFilter : Start +Pipeline -> AudioSourceFilter : Start + +App -> HiRecorder : Pause +HiRecorder -> Pipeline : Pause +Pipeline -> SinkFilter : Pause +Pipeline -> MuxerFilter : Pause +Pipeline -> VideoEncoderFilter : Pause +Pipeline -> VideoSourceFilter : Pause +Pipeline -> AudioEncoderFilter : Pause +Pipeline -> AudioSourceFilter : Pause + +App -> HiRecorder : Resume +HiRecorder -> Pipeline : Resume +Pipeline -> SinkFilter : Resume +Pipeline -> MuxerFilter : Resume +Pipeline -> VideoEncoderFilter : Resume +Pipeline -> VideoSourceFilter : Resume +Pipeline -> AudioEncoderFilter : Resume +Pipeline -> AudioSourceFilter : Resume + +== 停止录制 == + +group App主动停止1: Drain Stop +App -> HiRecorder : Stop(drain) +HiRecorder -> VideoSourceFilter : SendEos +VideoSourceFilter -> VideoEncoderFilter : send EOS buffer +VideoEncoderFilter -> MuxerFilter : send EOS buffer +HiRecorder -> AudioSourceFilter : SendEos +AudioSourceFilter -> AudioEncoderFilter : send EOS buffer +AudioEncoderFilter -> MuxerFilter : send EOS buffer +MuxerFilter -> SinkFilter : send EOS buffer when all tracks get EOS +end + +group App主动停止2: Not Drain Stop +App -> HiRecorder : Stop(not drain) +HiRecorder -> MuxerFilter : SendEos +MuxerFilter -> SinkFilter : send EOS buffer +end + +group 引擎主动停止: Duration/MaxSize Reached +SinkFilter -> Pipeline : OnInfo: MAX_DURATION_REACHED/MAX_FILESIZE_REACHED +Pipeline -> HiRecorder : OnInfo(duration/filesize reached) +HiRecorder -> HiRecorder : Stop(not drain) +end + +SinkFilter -> Pipeline : OnComplete +Pipeline -> HiRecorder : OnComplete +HiRecorder -> SinkFilter : Stop() +HiRecorder -> MuxerFilter : Stop() +HiRecorder -> VideoEncoderFilter : Stop() +HiRecorder -> VideoSourceFilter : Stop() +HiRecorder -> AudioEncoderFilter : Stop() +HiRecorder -> AudioSourceFilter : Stop() + + + +``` +#### 关键类类图 +下面所有类的共同父类: FilterBase +```plantuml +class AudioSourceFilter { + SendEos() + SetAudioSampleRate() + SetAudioChannels() +} + +class AudioEncoderFilter { + SetAudioCodecType() + SetEncodingBitRate() +} + +``` +```plantuml +class VideoSourceFilter { + SendEos() + SetVideoSize() + SetVideoFrameRate() +} + +class VideoEncoderFilter { + SetVideoCodecType() + SetEncodingBitRate() +} + +class MuxerFilter { + AddTrack(name, upstreamPort) + SendEos() + SplitFileBegin() + SplitFileEnd() + SetOutputFormat(mp4/m4a/...) + SetMaxDuration() +} + +class SinkFilter { + NextFileBegin(fd) + SetOutputType(file/stream/...) + SetParameter(maxFileSize/outPath/outFd/nextOutFd) +} + +``` + +## 连续自动录制场景 + +连续自动录制场景, 每次录制文件达到最大值之后,就会启动下一个文件的录制。如果磁盘空间满,则删除最老的文件,继续录制。 + +连续自动录制主要用于监控、行车记录仪场景。它的连续自动体现在应用,从引擎角度,只是提供了SetNextOutputFile()接口给应用设置下一个文件fd。 + + +##### 连续录制场景的时序图 + +```plantuml +participant App +participant HiRecorder +participant Pipeline +participant MuxerFilter +participant SinkFilter + +App -> HiRecorder : SetOutputFile(fd) +App -> HiRecorder : SetMaxFileSize/SetMaxDuration +App -> HiRecorder : Prepare +HiRecorder -> Pipeline : Prepare +App -> HiRecorder : Start +HiRecorder -> Pipeline : Start + +SinkFilter -> Pipeline : OnInfo: MAX_DURATION_REACHED/MAX_FILESIZE_REACHED +Pipeline -> HiRecorder : OnInfo(duration/filesize reached) +HiRecorder -> App : OnInfo(duration/filesize reached) +HiRecorder -> MuxerFilter : SplitFileBegin() +MuxerFilter -> MuxerFilter : SendEos() +note left : 调用自己的 SendEos(), 结束上一个文件的录制 +MuxerFilter -> SinkFilter : EOS buffer +rnote over SinkFilter: 保存老文件 +App -> HiRecorder : SetNextOutputFile(fd) +HiRecorder -> SinkFilter : NextFileBegin(fd) +rnote over SinkFilter: 启动新文件录制 +HiRecorder -> MuxerFilter : SplitFileEnd() +MuxerFilter -> MuxerFilter : WriteNewFileHeader() + +``` + +SinkFilter NextFileBegin(fd): +- fd 必须为 有效值 +- SinkFilter调用插件的 NextFileBegin(fd) +- 插件根据新的 fd,保存新的文件 +- Sink插件可以支持或不支持连续录制(按最新设计,此逻辑不需要Plugin完成?) + +## 开发视图 + +录制相关功能,用 RECORD_SUPPORT 宏控制,便于不需要录制功能的产品裁剪。 + +``` +├─engine # 引擎代码 +│ ├─foundation # 基础工具类, 包括OS适配 +│ ├─pipeline # pipeline框架 +│ │ ├─core # pipeline核心实现 +│ │ ├─factory # filter工厂 +│ │ └─filters # 若干filter节点实现, 录制添加AudioEncoderFilter,VideoEncoderFilter +│ │ ├─codec # 编解码节点实现 +│ │ ├─demux # 解封装节点实现 +│ │ ├─sink # 输出节点实现, 录制添加SinkFilter +│ │ ├─source # 数据源节点实现,录制添加RecorderSourceFilter +│ │ └─muxer # MuxerFilter +│ ├─player # 播放器封装 +│ └─plugin # 插件 +│ ├─common # 插件接口依赖的基础类型定义 +│ ├─core # 插件框架 +│ ├─interface # 插件接口 +│ └─plugins # 若干插件实现 +│ ├─minimp3_adapter # minimp3适配 +│ ├─ffmpeg_adapter # FFMPEG适配(适配成封装解封装、编解码插件) +│ ├─hdi_adapter # HDI适配(适配成输出插件) +│ ├─demuxer # 解封装插件 +│ ├─codec # 编解码插件 +│ ├─sink # 输出插件, 录制添加 OutputSinkPlugin +│ ├─source # 数据源插件, 录制添加AudioSourcePlugin, VideoSourcePlugin +│ └─muxer # MuxerPlugin +``` diff --git a/images/git-data-transport-commands.png b/images/git-data-transport-commands.png new file mode 100644 index 0000000000000000000000000000000000000000..91c44ff3b3714dab572c33e331dc7477014e2b7c Binary files /dev/null and b/images/git-data-transport-commands.png differ diff --git "a/tasks/202206\344\273\273\345\212\241\350\267\237\350\270\252\350\241\250.xlsx" "b/tasks/202206\344\273\273\345\212\241\350\267\237\350\270\252\350\241\250.xlsx" deleted file mode 100644 index f6f54e4f311b9694810c0281a8b600e1f5b085c7..0000000000000000000000000000000000000000 Binary files "a/tasks/202206\344\273\273\345\212\241\350\267\237\350\270\252\350\241\250.xlsx" and /dev/null differ diff --git a/tasks/histreamer_tasks.xlsx b/tasks/histreamer_tasks.xlsx deleted file mode 100644 index bcd2d2544af462edfc619dcfb3b9c544880edf07..0000000000000000000000000000000000000000 Binary files a/tasks/histreamer_tasks.xlsx and /dev/null differ diff --git "a/test/Histream\350\260\203\346\265\213.md" "b/test/Histream\350\260\203\346\265\213.md" new file mode 100644 index 0000000000000000000000000000000000000000..a75826594d7aeb9228aca96083c253e9a7e32f72 --- /dev/null +++ "b/test/Histream\350\260\203\346\265\213.md" @@ -0,0 +1,6 @@ +#
HiStreamer 调测步骤
+1. 拉取主干代码 +2. 产品选择ipcamera_hispark_taurus_linux 执行编译,完成后参考[deveco.ini](https://gitee.com/histreamer/histreamer_dev/tree/master/doc/test/deveco.ini)的配置烧录版本到单板 +3. 参考[nfs共享](https://gitee.com/histreamer/histreamer_dev/tree/master/doc/test/nfs_share.md)步骤(仅针对Ubuntu),将player_sample_new、音乐资源和 [setParam工具](https://gitee.com/histreamer/histreamer_dev/tree/master/doc/test/setParam)拷贝到共享目录 +4. 设置setParam可执行权限,通过串口在单板上执行设置参数的命令 setParam debug.media_service.histreamer 1 ,将player引擎设置为histreamer。 setParam即为共享的工具 +5. 参考[测试文档](https://gitee.com/histreamer/test_resource/tree/master/%E8%BD%AC%E6%B5%8B%E8%AF%95/2021-11-10%20OH3.1.1.1/selftTestResult.xlsx)执行测试 diff --git a/test/README.txt b/test/README.txt new file mode 100644 index 0000000000000000000000000000000000000000..85d2c957915e4d289976b0317934cd0b406f121c --- /dev/null +++ b/test/README.txt @@ -0,0 +1,5 @@ +1. deveco.ini中是烧录配置 +2. cmd.txt中是通过串口写入的boot环境命令 +3. faq.txt中是遇到的问题 +4. nfs_share.md是ubuntu与单板共享的步骤 +5. setParam 是设置sysparam的工具,共享到单板后执行 setParam key value即设置sysparam diff --git a/test/cmd.txt b/test/cmd.txt new file mode 100644 index 0000000000000000000000000000000000000000..36bae6170cf62d2d1d94cd9140e570267083e2f3 --- /dev/null +++ b/test/cmd.txt @@ -0,0 +1,4 @@ +setenv bootargs "mem=128M console=ttyAMA0,115200 root=/dev/mmcblk0p3 rw rootfstype=ext4 rootwait blkdevparts=mmcblk0:1M(boot),9M(kernel),300M(rootfs),300M(userfs)" +setenv bootcmd "mmc read 0x0 0x82000000 0x800 0x4800; mw 0x10FF0044 0x0600; mw 0x120D2010 0x00000000; mw 0x120D2400 0x000000ff; mw 0x120D2010 0x00000000; bootm 0x82000000" +saveenv +reset diff --git a/test/deveco.ini b/test/deveco.ini new file mode 100644 index 0000000000000000000000000000000000000000..c4a26cf6cb01ca978662fb9f0e366b4a44e86c8d --- /dev/null +++ b/test/deveco.ini @@ -0,0 +1,47 @@ +; DevEco Project Configuration File +; Version: 2.0.0 +; Core Version: 2.1.0+279451.b672a187 + +[env] +framework = ohos-sources + +[env:hi3516dv300] +platform = hisilicon +board = hi3516dv300 +build_type = debug +upload_port = /dev/ttyUSB0 +upload_protocol = hiburn-usb +upload_net_server_ip = 192.168.1.2 +upload_net_client_mask = 255.255.255.0 +upload_net_client_gw = 192.168.1.1 +upload_net_client_ip = 192.168.1.3 +debug_client = +debug_extra_cmds = +upload_partitions = + partition:hi3516dv300_fastboot + partition:hi3516dv300_kernel + partition:hi3516dv300_rootfs + partition:hi3516dv300_userfs + +[partition:hi3516dv300_fastboot] +partition_type = fastboot +partition_board = hi3516dv300 +partition_bin = /home/huchang/workspace/hmf/device/hisilicon/hispark_taurus/sdk_liteos/uboot/out/boot/u-boot-hi3516dv300.bin + +[partition:hi3516dv300_kernel] +partition_type = kernel +partition_board = hi3516dv300 +partition_bin = /home/huchang/workspace/hmf/out/hispark_taurus/ipcamera_hispark_taurus_linux/uImage_hi3516dv300_smp + +[partition:hi3516dv300_rootfs] +partition_type = rootfs +partition_board = hi3516dv300 +partition_bin = /home/huchang/workspace/hmf/out/hispark_taurus/ipcamera_hispark_taurus_linux/rootfs_ext4.img +partition_length = 0x12C00000 + +[partition:hi3516dv300_userfs] +partition_type = userfs +partition_board = hi3516dv300 +partition_bin = /home/huchang/workspace/hmf/out/hispark_taurus/ipcamera_hispark_taurus_linux/userfs_ext4.img +partition_length = 0x12C00000 +partition_addr = 0x13600000 diff --git a/test/faq.txt b/test/faq.txt new file mode 100644 index 0000000000000000000000000000000000000000..650e7f6f3be7c05b55f381a0a12bfdf2e025c9a2 --- /dev/null +++ b/test/faq.txt @@ -0,0 +1,3 @@ +串口权限问题: + sudo usermod -aG dialout user + reboot diff --git a/test/nfs_share.md b/test/nfs_share.md new file mode 100644 index 0000000000000000000000000000000000000000..96db3cef1558b8d9b0f588426b4d56e8dcd83cdb --- /dev/null +++ b/test/nfs_share.md @@ -0,0 +1,71 @@ +#
Ubuntu与HI3516间NFS共享文件步骤
+1. Ubuntu上安装nfs服务器 +```bash +sudo apt-get install nfs-kernel-server +``` +2. 在exports中添加要共享的文件目录 +```bash +sudo vim /etc/exports +``` +添加如下内容: +``` +/path/to/share/dir *(rw,sync,no_root_squash,no_subtree_check) +``` +第一个参数是要共享的路径,第二个参数 \*表示允许允许任何ip都可读取该路径,括号里的是共享的具体参数设置。 +将需要共享的文件cp到制定目录,然后修改路径权限为777. 更改目录owner为root(由于串口登录开发板时是root身份,如果共享目录owner非root,则会执行出错????) +``` +chmod -R 777 /path/to/share/dir +sudo chmod -R root:root /path/share/dir +``` +修改共享路径的权限为777. + +重启nfs服务以生效: +```bash +sudo /etc/init.d/nfs-kernel-server restart +``` + +3. 使用网线直连Ubuntu与HI3516,连接后打开Ubuntu的网络设置,打开以太网,设置IPv4方式为手动 地址为 192.168.1.2, 掩码 255.255.255.0 网关 192.168.1.1 + +4. 通过串口连接HI3516开发板(使用picocom 或者 [DevEco Device Tool](https://device.harmonyos.com/cn/docs/ide/user-guides/service_introduction-0000001050166905)的Monitor工具或其他串口工具) + +5. 配置单板ip地址。 在串口中设置开发板参数 +```bash +ifconfig eth0 up +ifconfig eth0 192.168.1.3 mask 255.255.255.0 + +ifconfig //检查一下设置的参数 +``` +上述的配置在单板重启后失效。可以修改本地仓库的 vendor/hisilicon/hispark_taurus_linux/init_configs/etc/init.d/S80network 在最后添加 +```bash +ifconfig eth0 up +ifconfig eth0 192.168.1.3 mask 255.255.255.0 +``` +这样,编译后的版本在启动时会自动配置好ip地址 + + +6. 测试网络连通性: + +在Ubuntu上ping 开发板 +```bash +ping 192.168.1.3 +``` +在开发板上ping Ubuntu +```bash +ping 192.168.1.2 + +// 单板上可能会报错 ping: socket SOCK_DGRAM 1: Permission denied +按照提示输入 +echo 0 9999999 > /proc/sys/net/ipv4/ping_group_range +ping 192.168.1.2 // 再次ping +``` +7. HI3516挂载Ubuntu目录,开发板串口输入 +```bash +mkdir /local/path // 创建映射目录 +// linux内核使用如下命令 +mount -t nfs -o nolock,addr=192.168.1.2 192.168.1.2:/path/to/share/dir /local/path +// liteos内核使用如下命令 +mount 192.168.1.2:/path/to/share/dir /local/path nfs + +cd /local/path +``` + diff --git a/test/player_sample_new b/test/player_sample_new new file mode 100644 index 0000000000000000000000000000000000000000..76b54483aa16eeabfa60d271c4bab7ce78cf1745 Binary files /dev/null and b/test/player_sample_new differ diff --git a/test/setParam b/test/setParam new file mode 100644 index 0000000000000000000000000000000000000000..fab936fb291545a034ae0d038f5f3b50aed70e87 Binary files /dev/null and b/test/setParam differ