# RV1106 WebRTC 视频推流 v1.0.1

本项目在 Luckfox Pico RV1106 上采集 SC3336 摄像头画面，经 RGA 缩放、RKMPI H.264
硬件编码后，通过 libdatachannel 推送到现有 WebRTC 网页。当前版本只处理视频，音频尚未接入。

## v1.0.1 内容

- 修复 RV1106/Chromium DTLS ClientHello 兼容问题，统一使用 mbedTLS 3.6.6。
- 修复 RKMPI 编码包边界读取、RGA CMA 缩放和浏览器重复进入问题。
- 设备端发送紧凑 H.264 offer，适配现有信令服务器和 `client.html`。
- 接入 Rockchip AIQ，加载 SC3336 IQ 并运行 AE、AWB、CCM 等 ISP 3A 算法。
- 部署包加入 `librkaiq.so`、`device.config` 和完整动态库依赖，可直接运行程序。
- 增加可离线编译的第三方源码、`.gitignore` 和构建清理脚本。

## 目录说明

- `app/`：轻量入口、原生 launcher、配置加载、信号处理和运行生命周期管理。
- `driver/`：摄像头、ISP、MPP、RGA 等硬件适配；`driver/gpio/` 为后续引脚控制预留。
- `modules/webrtc/`：WebRTC 推流、信令和视频管线。
- `modules/time_sync/`：设备时间同步；后续 MQTT 等功能按同级模块加入。
- `iqfiles/`：当前 SC3336 模组的 IQ 样本，仅供源码留档和板端核对。
- `cmake/`：RV1106 工具链、SDK 媒体库查找和 libdatachannel 补丁。
- `third_party/src/`：可离线编译的 curl 8.6.0、mbedTLS 3.6.6、
  libdatachannel 0.21.2 及其子模块源码。
- `third_party/build_deps.sh`：交叉编译第三方依赖。
- `scripts/build.sh`：编译依赖、主程序并生成部署目录和 tar 包。
- `scripts/clean.sh`：清除所有构建/安装产物，但保留 `third_party/src/`。

## 解压源码包

在 Ubuntu 虚拟机中执行：

```sh
tar -xzf webrtcpushv1.0.1.tar.gz
cd webrtcpushv1.0.1
```

## 编译环境

建议使用项目原虚拟机环境 Ubuntu 22.04，并准备完整的 Luckfox Pico SDK：

```text
/home/lmy/rv1106sdk/luckfox-pico
```

换到其他用户名或路径时，通过环境变量指定 SDK：

```sh
export RV1106_SDK=/你的路径/luckfox-pico
```

需要的主机工具包括 `bash`、`cmake`、`make`、`git`、`pkg-config`、`python3`
和 SDK 自带的 `arm-rockchip830-linux-uclibcgnueabihf` 工具链。

完整编译：

```sh
cd /path/to/webrtcpush
bash scripts/build.sh
```

编译结果：

```text
build-mbedtls-3.6.6/webrtcpush
build-mbedtls-3.6.6/deploy/
build-mbedtls-3.6.6/webrtcpush_deploy.tar
build-mbedtls-3.6.6/webrtcpush_deploy.tar.gz
```

清理构建产物：

```sh
bash scripts/clean.sh
```

该命令不会删除随项目交付的第三方源码。

## ISP 与偏黄问题

当前硬件配置、驱动和 IQ 文件名均指向 **SC3336**。如果传感器实际是 SC2336，不能混用
SC3336 IQ 文件，需要换成与真实传感器和镜头/IRCUT 模组完全匹配的 IQ。

摄像头模式默认在打开 `/dev/video11` 前启动 Rockchip AIQ：

```text
enumStaticMetasByPhyId -> init -> prepare -> start
```

AIQ 会从 `--iq-dir` 中按枚举到的 sensor entity 选择 IQ 文件，并持续运行 AE、AWB、CCM
等 3A 算法。默认 IQ 目录为 `/oem/usr/share/iqfiles`。没有 AIQ 时，即使 ISP 节点能输出
NV12，也可能使用默认增益而明显偏黄。

诊断时可用 `--no-isp` 禁用 AIQ，但不建议正常推流使用。白天仍偏黄时还要检查 IRCUT
是否实际切到可见光滤镜位置；IQ/AWB 无法补偿错误的物理滤镜状态。

## 板端部署和运行

把 `deployv1.0.1.tar.gz` 传到开发板 `/root` 后，用 BusyBox 解包：

```sh
cd /root
tar -xaf deployv1.0.1.tar.gz
cd deployv1.0.1
chmod +x webrtcpush
```

如果目标固件的 BusyBox 无法通过 `-a` 自动解压 gzip，使用管道解压同一个文件：

```sh
cd /root
gzip -dc deployv1.0.1.tar.gz | tar -xf -
cd deployv1.0.1
chmod +x webrtcpush
```

编辑程序同目录下的 `device.config`：

```json
{
  "deviceid": "CN010200000000",
  "push_frame": 24,
  "bitrate": 3000,
  "resolution": "1080x720",
  "gop": 48
}
```

`resolution` 支持 `1080p`、`720p`、`360p` 或显式的 `宽x高`。程序默认使用
SC3336、`/dev/video11`、2304x1296 NV12 输入、RGA 缩放和 baseline profile。
直接启动：

```sh
./webrtcpush
```

浏览器拉流地址中的 `dev` 就是 `deviceid`：

```text
https://jywy.yd-ss.com/client.html?dev=CN010200000000
```

设备端保持在线并发送紧凑 H.264 offer，网页端回答；
网页退出后设备端会重建会话，允许下一位浏览器重新进入。

后台运行：

```sh
cd /root/deployv1.0.1
nohup ./webrtcpush >/tmp/webrtcpush.log 2>&1 &
```

查看日志和停止程序：

```sh
tail -f /tmp/webrtcpush.log
killall webrtcpush
```

## IQ 文件

源码包中的 `iqfiles/sc3336_CMK-OT2119-PC1_30IRC-F16.json` 来自当前开发板：

```text
/oem/usr/share/iqfiles/sc3336_CMK-OT2119-PC1_30IRC-F16.json
```

`deployv1.0.1.tar.gz` 不重复携带 IQ 文件，程序默认直接读取板上的 `/oem/usr/share/iqfiles`。
部署前建议保留板上原文件并核对 SHA256，不要把此文件用于不同传感器或不同镜头模组。
