> ## Documentation Index
> Fetch the complete documentation index at: https://dragonwingdocs.qualcomm.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 启用 EIS 和 LDC

> 在 QCS6490 上使用 GPU 加速的 iWarp 处理来最大限度减少运动模糊并校正镜头畸变。

<div style={{display:'flex',gap:'8px',flexWrap:'wrap',marginBottom:'16px'}}>
  <span style={{background:'#ede9fe',color:'#5b21b6',padding:'2px 10px',borderRadius:'999px',fontSize:'12px',fontWeight:600}}>QCS6490</span>
  <span style={{background:'#f0fdf4',color:'#166534',padding:'2px 10px',borderRadius:'999px',fontSize:'12px',fontWeight:600}}>稳定</span>
</div>

<CardGroup cols={4}>
  <Card title="EIS" icon="clapperboard">图像防抖</Card>
  <Card title="LDC" icon="camera">畸变校正</Card>
  <Card title="iWarp" icon="bolt">GPU 加速</Card>
  <Card title="OpenGL" icon="microchip">OpenGL API</Card>
</CardGroup>

<Note>
  **平台适用范围**<br />
  本节仅适用于 **QCS6490**。<br />
</Note>

***

## 01 · 这是什么？

电子防抖（**EIS**）和镜头畸变校正（**LDC**）是先进的图像增强技术，可实时消除物理伪影和光学畸变。

* **EIS**：通过补偿设备抖动来最大限度减少模糊。它处理来自 IMU 传感器的运动数据（俯仰、偏航和滚转），以生成用于精确 GPU 变形处理的变换矩阵。
* **LDC**：校正鱼眼或广角镜头引入的几何畸变。它使用镜头标定期间生成的静态网格将弯曲的线条映射回直线边缘。

这两项功能均使用运行在 GPU 上的 **iWarp** 库模块，借助 **OpenGL API** 实现高性能图像变形。

***

## 02 · 命令选项

可以使用以下 `qtiqmmfsrc` 参数独立或并发部署 EIS 和 LDC：

| GST 命令选项       | 说明                      |
| :------------- | :---------------------- |
| `eis=1`        | 仅在第一个流上启用 EIS           |
| `eis=2`        | 在两个流上启用 EIS             |
| `ldc=1`        | 在所有活动（1 个或 2 个）流上启用 LDC |
| `eis=1, ldc=1` | 仅在第一个流上启用 EIS 和 LDC     |
| `eis=2, ldc=1` | 在两个流上启用 EIS 和 LDC       |

***

## 03 · 如何修改？

按照以下步骤初始化设备环境并捕获验证日志。

<Note>
  使用 SSH 连接到设备控制台。有关说明，请参阅[如何使用 SSH？](https://dragonwingdocs.qualcomm.com/Linux/devices/iq9075-evk/set-up-the-device#connect-over-ssh)。
</Note>

<Steps>
  <Step title="初始化日志收集">
    监控系统日志以验证管线状态变化和功能初始化。

    ```bash title="On device console" theme={null}
    journalctl -f > /opt/log.txt
    ```
  </Step>

  <Step title="执行 GStreamer 管线">
    从以下各节中选择一个用例并运行相应的命令。
  </Step>

  <Step title="验证功能状态">
    检查日志输出中特定的 CamX 和 cam-server 状态字符串，以确认 GPU 变形节点已激活。
  </Step>
</Steps>

***

## 04 · 功能验证

### EIS 单流用例

使用以下 GStreamer 命令启用此用例：

```bash title="GStreamer (EIS Single Stream)" theme={null}
gst-launch-1.0 -e qtiqmmfsrc name=camsrc eis=1 ! \
video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! \
v4l2h264enc capture-io-mode=4 output-io-mode=5 extra-controls="controls,video_bitrate=6000000,\
video_bitrate_mode=0;" ! h264parse ! mp4mux ! filesink location=/opt/cam_1080p.mp4
```

使用以下日志验证已选择此用例：

```text title="Log Verification (EIS Single Stream)" theme={null}
cam-server[926]: [INFO]: RecorderCameraContext : OpenCamera: EIS on single stream is ON..
cam-server[908]: CamX: [ INFO]908 981 [CHI   ] camxchinodeeisdgv26.cpp:1346 Initialize() m_nodeCaps 131072
cam-server[908]: CamX: [CORE_CFG]908 1796 [CORE      ] camxpipeline.h:3024 SetPipelineStatus() RealTimeFeatureZSLPreviewRawYuvEisIoT_0 status is now PipelineStatus::STREAM_ON
```

***

### 在两个流中的第一个流上启用 EIS 的用例

使用以下 GStreamer 命令启用此用例：

```bash title="GStreamer (EIS on Stream 1/2)" theme={null}
gst-launch-1.0 -e qtiqmmfsrc name=camsrc eis=1 video_0::type=preview ! \
video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! \
v4l2h264enc capture-io-mode=4 output-io-mode=5 \
extra-controls="controls,video_bitrate=6000000,video_bitrate_mode=0;" ! \
h264parse ! mp4mux ! filesink location=/opt/cam_prev.mp4 camsrc. ! \
video/x-raw,format=NV12,width=1280,height=720,framerate=30/1,\
interlace-mode=progressive,colorimetry=bt601 ! v4l2h264enc capture-io-mode=4 \
output-io-mode=5 extra-controls="controls,video_bitrate=6000000,video_bitrate_mode=0;" \
! h264parse ! mp4mux ! filesink location=/opt/cam_vid.mp4
```

使用以下日志验证已选择此用例：

```text title="Log Verification (EIS on Stream 1/2)" theme={null}
cam-server[926]: [INFO]: RecorderCameraContext : OpenCamera: EIS on single stream is ON..
cam-server[926]: CamX: [ INFO]926 988 [CHI   ] camxchinodeeisdgv26.cpp:1346 Initialize() m_nodeCaps 131072
cam-server[926]: CamX: [CORE_CFG]926 2529 [CORE      ] camxpipeline.h:3024 SetPipelineStatus() RealTimeFeatureZSLPreviewRawYuvEisIoT_0 status is now PipelineStatus::STREAM_ON
```

***

### 在两个流上启用 EIS

使用以下 GStreamer 命令启用此用例：

```bash title="GStreamer (EIS Dual Stream)" theme={null}
gst-launch-1.0 -e qtiqmmfsrc name=camsrc eis=2 video_0::type=preview ! \
video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! \
v4l2h264enc capture-io-mode=4 output-io-mode=5 \
extra-controls="controls,video_bitrate=6000000,video_bitrate_mode=0;" ! \
h264parse ! mp4mux ! filesink location=/opt/cam_prev.mp4 camsrc. ! \
video/x-raw,format=NV12,width=1280,height=720,framerate=30/1,\
interlace-mode=progressive,colorimetry=bt601 ! v4l2h264enc capture-io-mode=4 \
output-io-mode=5 extra-controls="controls,video_bitrate=6000000,video_bitrate_mode=0;" \
! h264parse ! mp4mux ! filesink location=/opt/cam_vid.mp4
```

使用以下日志验证已选择此用例：

```text title="Log Verification (EIS Dual Stream)" theme={null}
cam-server[914]: [INFO]: RecorderCameraContext : OpenCamera: EIS on dual stream is ON..
cam-server[914]: CamX: [ INFO]914 960 [CHI   ] camxchinodeeisdgv26.cpp:1346 Initialize() m_nodeCaps 131072
cam-server[914]: CamX: [CORE_CFG]914 2421 [CORE      ] camxpipeline.h:3024 SetPipelineStatus() RealTimeFeatureZSLPreviewRawYuvEisIoT_0 status is now PipelineStatus::STREAM_ON
```

***

### LDC 单流用例

使用以下 GStreamer 命令启用此用例：

```bash title="GStreamer (LDC Single Stream)" theme={null}
gst-launch-1.0 -e qtiqmmfsrc name=camsrc ldc=1 ! \
video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! \
v4l2h264enc capture-io-mode=4 output-io-mode=5 extra-controls="controls,video_bitrate=6000000,\
video_bitrate_mode=0;" ! h264parse ! mp4mux ! filesink location=/opt/cam_1080p.mp4
```

使用以下日志验证已选择此用例：

```text title="Log Verification (LDC Single Stream)" theme={null}
cam-server[926]: [INFO]: RecorderCameraContext : OpenCamera: EIS is disabled cam-server[926]: [INFO]: RecorderCameraContext : OpenCamera: LDC is ON..
cam-server[926]: CamX: [ INFO]926 990 [CHI   ] camxchinodeeisdgv26.cpp:1346 Initialize() m_nodeCaps 524288
cam-server[926]: CamX: [CORE_CFG]926 2132 [CORE      ] camxpipeline.h:3024 SetPipelineStatus() RealTimeFeatureZSLPreviewRawYuvEisIoT_0 status is now PipelineStatus::STREAM_ON
```

***

### 在两个流上启用 LDC 的用例

使用以下 GStreamer 命令启用此用例：

```bash title="GStreamer (LDC Dual Stream)" theme={null}
gst-launch-1.0 -e qtiqmmfsrc name=camsrc ldc=1 video_0::type=preview ! \
video/x-raw,format= NV12,width=1920,height=1080,framerate=30/1 ! \
v4l2h264enc capture-io-mode=4 output-io-mode=5 extra-controls="controls,video_bitrate=6000000,\
video_bitrate_mode=0;" ! h264parse ! mp4mux ! filesink location=/opt/cam_prev.mp4 \
camsrc. ! video/x-raw,format=NV12,width=1280,height=720,\
framerate=30/1,interlace-mode=progressive,colorimetry=bt601 ! v4l2h264enc capture-io-mode=4 \
output-io-mode=5 extra-controls="controls,video_bitrate=6000000,video_bitrate_mode=0;" ! \
h264parse ! mp4mux ! filesink location=/opt/cam_vid.mp4
```

使用以下日志验证已选择此用例：

```text title="Log Verification (LDC Dual Stream)" theme={null}
cam-server[914]: [INFO]: RecorderCameraContext : OpenCamera: EIS is disabled cam-server[914]: [INFO]: RecorderCameraContext : OpenCamera: LDC is ON..
cam-server[914]: CamX: [ INFO]914 966 [CHI   ] camxchinodeeisdgv26.cpp:1346 Initialize() m_nodeCaps 524288
cam-server[914]: CamX: [CORE_CFG]914 1591 [CORE      ] camxpipeline.h:3024 SetPipelineStatus() RealTimeFeatureZSLPreviewRawYuvEisIoT_0 status is now PipelineStatus::STREAM_ON
```

***

### EIS 和 LDC 单流用例

使用以下 GStreamer 命令启用此用例：

```bash title="GStreamer (EIS + LDC Single Stream)" theme={null}
gst-launch-1.0 -e qtiqmmfsrc name=camsrc eis=1 ldc=1 ! \
video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 \
! v4l2h264enc capture-io-mode=4 output-io-mode=5 extra-controls="controls,video_bitrate=6000000,\
video_bitrate_mode=0;" ! h264parse ! mp4mux ! filesink location=/opt/cam_1080p.mp4
```

使用以下日志验证已选择此用例：

```text title="Log Verification (EIS + LDC Single Stream)" theme={null}
cam-server[914]: [INFO]: RecorderCameraContext : OpenCamera: EIS on single stream is ON..
cam-server[914]: [INFO]: RecorderCameraContext : OpenCamera: LDC is ON.. cam-server[914]: CamX: [CORE_CFG]914 2621 [CORE     ] camxpipeline.h:3024 SetPipelineStatus() RealTimeFeatureZSLPreviewRawYuvEisIoT_0 status is now PipelineStatus::STREAM_ON
```

***

### 在两个流中的第一个流上启用 EIS 和 LDC 的用例

使用以下 GStreamer 命令启用此用例：

```bash title="GStreamer (EIS + LDC on Stream 1/2)" theme={null}
gst-launch-1.0 -e qtiqmmfsrc name=camsrc eis=1 ldc=1 video_0::type=preview ! \
video/x-raw,format= NV12,width=1920,height=1080,framerate=30/1 ! \
v4l2h264enc capture-io-mode=4 output-io-mode=5 extra-controls="controls,video_bitrate=6000000,\
video_bitrate_mode=0;" ! h264parse ! mp4mux ! filesink location=/opt/cam_prev.mp4 camsrc. ! \
video/x-raw,format=NV12,width=1280,height=720,framerate=30/1,\
interlace-mode=progressive,colorimetry=bt601 ! v4l2h264enc capture-io-mode=4 \
output-io-mode=5 extra-controls="controls,video_bitrate=6000000,video_bitrate_mode=0;" ! \
h264parse ! mp4mux ! filesink location=/opt/cam_vid.mp4
```

使用以下日志验证已选择此用例：

```text title="Log Verification (EIS + LDC on Stream 1/2)" theme={null}
cam-server[2661]: [INFO]: RecorderCameraContext : OpenCamera: EIS on single stream is ON..
cam-server[2661]: CamX: [ INFO]2661 2663 [CHI        ]
camxchinodeeisdgv26.cpp:1346 Initialize() m_nodeCaps 262144
cam-server[2661]: CamX: [CORE_CFG]2661 2834 [CORE ] camxpipeline.h:3024 SetPipelineStatus() RealTimeFeatureZSLPreviewRawYuvEisIoT_0 status is now PipelineStatus::STREAM_ON
```

***

### 在两个流上启用 EIS 和 LDC 的用例

<Warning>
  目前不支持在两个流上启用 EIS 和 LDC 的用例。
</Warning>

使用以下 GStreamer 命令启用此用例：

```bash title="GStreamer (EIS + LDC Dual Stream)" theme={null}
gst-launch-1.0 -e qtiqmmfsrc name=camsrc eis=2 ldc=1 video_0::type=preview ! \
video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! \
v4l2h264enc capture-io-mode=4 output-io-mode=5 extra-controls="controls,video_bitrate=6000000,\
video_bitrate_mode=0;" ! h264parse ! mp4mux ! filesink location=/opt/cam_prev.mp4 camsrc. ! \
video/x-raw,format=NV12,width=1280,height=720,\
framerate=30/1,interlace-mode=progressive,colorimetry=bt601 ! v4l2h264enc capture-io-mode=4 \
output-io-mode=5 extra-controls="controls,video_bitrate=6000000,video_bitrate_mode=0;" ! \
h264parse ! mp4mux ! filesink location=/opt/cam_vid.mp4
```

使用以下日志验证已选择此用例：

```text title="Log Verification (EIS + LDC Dual Stream)" theme={null}
cam-server[882]: [INFO]: RecorderCameraContext : OpenCamera: EIS on dual stream is ON..
cam-server[882]: CamX: [ INFO]882 977 [CHI   ] camxchinodeeisdgv26.cpp:1346 Initialize() m_nodeCaps 262144
cam-server[882]: CamX: [CORE_CFG]882 1613 [CORE      ] camxpipeline.h:3024 SetPipelineStatus() RealTimeFeatureZSLPreviewRawYuvEisIoT_0 status is now PipelineStatus::STREAM_ON
```
