# DCU Codec Pipeline Benchmark

DCU编解码性能测试工具 - 用于测试和评估不同编解码器后端的视频处理性能。

## 项目简介

该项目是DCU性能压测工具codecbenchmark的python实现，可作为DCU上MacCodecSDK以及ffmpeg的python api参考

## 主要功能

### 核心特性
- ✅ **多后端支持**：支持 CUDA、CUVID、V4L2、VAAPI 等多种编解码后端
- ✅ **编解码测试**：支持 H264、HEVC、VP9、AVS2、MJPEG 等格式的编解码性能测试
- ✅ **多实例并发**：支持多线程并发测试，评估系统并发处理能力
- ✅ **多分辨率支持**：支持从 720p 到 8K 的多种分辨率测试
- ✅ **位深测试**：支持 8-bit 和 10-bit 位深测试
- ✅ **详细报告**：生成 CSV 格式的性能测试报告

### 支持的编解码器

**解码器：**
- H264 (h264_cuvid/h264_v4l2m2m)
- HEVC (hevc_cuvid/hevc_v4l2m2m)
- VP9 (vp9_cuvid/vp9_v4l2m2m)
- AVS2 (avs2_cuvid/avs2_v4l2m2m)
- MJPEG (mjpeg_cuvid/mjpeg_v4l2m2m)

**编码器：**
- H264_NVENC / H264_VAAPI
- HEVC_NVENC / HEVC_VAAPI
- VP9_NVENC / VP9_VAAPI
- MJPEG_NVENC / MJPEG_VAAPI

## 环境要求

与MacCodec环境要求一致

### 依赖安装

```bash
pip install -r requirements.txt
```

主要依赖：
- ffmpeg-python
- MacCodecSDK

## 项目结构

其中测试视频文件为方便clone测试仅包含一个文件，若想参考codecBenchmark全面测试可将所有文件放入同目录下，并取消代码中的注释
```
dcu-codec-pipeline-py/
├── codecbenchmark-py/
│   ├── video_benchmark/          # 测试视频文件目录
│   │   └── sample_1920x1080_30fps_8bit.h264
│   ├── benchmark_multi_inst.py   # 多实例测试模块
│   ├── video_benchmark.py        # 主测试脚本
│   ├── readme.md                 # 项目说明
│   └── requirements.txt          # 依赖列表
├── video_cuda_decode_benchmark.csv  # 解码测试结果
└── video_cuda_encode_benchmark.csv  # 编码测试结果
```

## 使用方法

### 基本用法

运行解码和编码性能测试：

```bash
# 使用 CUDA 后端，默认 6 线程
python video_benchmark.py

# 指定后端和线程数
python video_benchmark.py -c cuda -n 8
python video_benchmark.py -c vaapi -n 4
python video_benchmark.py -c v4l2 -n 6
```

### 命令行参数

```bash
usage: video_benchmark.py [-h] [-c {cuda,cuvid,v4l2,vaapi}] [-n THREADS]

可选参数:
  -h, --help            显示帮助信息
  -c, --codec           编解码后端类型
                        可选值: cuda, cuvid, v4l2, vaapi
                        默认值: cuda
  -n, --threads         并发进程数量
                        默认值: 6
```

## 测试配置

### 解码测试文件

项目预配置了以下测试文件：
- `sample_1920x1080_30fps_8bit.h264` - 1080p 30fps H264 8bit

### 编码测试配置

支持多种分辨率和格式的编码测试：

| 分辨率 | 格式 | 位深 | 帧数 |
|--------|------|------|------|
| 1280x720 | H264/HEVC | 8-bit | 677 |
| 1920x1080 | H264/HEVC/JPEG | 8-bit | 812-2174 |
| 3840x2160 | H264/HEVC/JPEG | 8-bit | 812 |
| 7680x4320 | H264/HEVC | 8-bit | 77 |
| 1280x720 | HEVC | 10-bit | 677 |
| 1920x1080 | HEVC | 10-bit | 812 |
| 3840x2160 | HEVC | 10-bit | 812 |
| 4096x2160 | JPEG | 8-bit | 1 |
| 8192x4320 | JPEG | 8-bit | 1 |

## 输出结果

### CSV 报告文件

测试完成后会生成两个 CSV 文件：

1. **解码测试报告** (`video_{codec}_decode_benchmark.csv`)
   ```csv
   Decode,Bit Depth,Resolution,Fps/(BMZ 1 Core),Fps/(BMZ 6 Processes)
   H264,8,1920x1080,245.67,1234.56
   ```

2. **编码测试报告** (`video_{codec}_encode_benchmark.csv`)
   ```csv
   Encode,Bit Depth,Resolution,Fps/(BMZ 1 Core)
   H264,8,1920x1080,189.34
   HEVC,10,3840x2160,95.67
   ```

### 性能指标说明

- **Fps/(BMZ 1 Core)**: 单核心/单进程处理的帧率（FPS）
- **Fps/(BMZ N Processes)**: N 个并发进程总处理的帧率（FPS）

## 测试流程

1. **解压测试文件**：自动从 `video_benchmark.zip` 解压测试视频
2. **解码测试**：
   - 单实例解码性能测试
   - 多实例并发解码测试
3. **编码测试**：
   - 将解码后的 YUV 数据重新编码
   - 测试不同格式和分辨率的编码性能
4. **结果聚合**：
   - 统计平均性能数据
   - 生成 CSV 报告
5. **清理临时文件**：自动清理测试过程中生成的临时文件

## 示例输出

```
Processing: sample_1920x1080_30fps_8bit.h264 (Idx: 1)
  -> Single instance decode: 245.67 FPS
  -> Multi instance (6 processes): 1234.56 FPS
Encoding: sample_1920x1080_30fps_8bit.h264 -> H264
  -> Encode performance: 189.34 FPS

Aggregating results...
Benchmark finished.
```

## 注意事项

1. **文件准备**：确保测试视频文件位于 `video_benchmark/` 目录或提供 `video_benchmark.zip`
2. **权限要求**：使用 VAAPI/V4L2 后端时可能需要访问 `/dev/dri/renderD128` 设备文件
3. **性能影响**：多实例测试会占用较多系统资源，建议根据硬件配置调整线程数
4. **日志文件**：测试过程会生成临时日志文件，测试完成后自动清理

## 故障排除

### 常见问题

**问题 1**: `FFmpeg command construction failed`
- 检查 FFmpeg 是否正确安装
- 确认选择的编解码后端是否受支持

**问题 2**: `Unknown encoder for XXX`
- 确认 FFmpeg 编译时启用了相应的编码器
- 检查硬件驱动是否正确安装

**问题 3**: 多实例测试性能异常
- 检查系统资源（GPU、内存）是否充足
- 减少并发线程数 `-n` 参数

### 日志调试

测试过程中的详细日志会保存在：
- 解码日志：`video_benchmark/{filename}.log`
- 多实例日志：`video_benchmark/{filename}_multi.log`
- 编码日志：`video_benchmark/{filename}_encode.log`

## 许可证

本项目仅供性能测试和评估使用。

## 联系方式

如有问题或建议，请提交 Issue 或联系项目维护者。

---

**版本**: 1.0  
**最后更新**: 2026-02-26