# Stream cameras
This page describes how to connect camera sensors to your reference hardware platform and provides information about available APIs.
## Set up the camera
Tab QCS6490
Tab QCS9075
Tab QCS8275
- *class* tabincludedirective
- ### Connect RB3G2 MIPI CSI on vision mezzanine board
OV9282 and IMX577 are the default camera sensors.
Connect the OV9282 module to CAM0A and the IMX577 module to CAM3 port as shown:


### Set SW2300 DIP switch on interposer board
To use the CAM3 slot of the vision mezzanine board, switch 1 of the SW2300 DIP switch on the interposer board must be set to OFF. This switch is set to OFF by default.
The CAM0A slot of the vision mezzanine board works without any DIP switch setting.

### Connect RB3G2 GMSL cameras on vision mezzanine board
There are two GMSL slots (GMSL1 and GMSL2) on the mezzanine board of Qualcomm’s RB3G2 Vision Kit platform. Two GMSL cameras can be connected to these slots.

The GMSL1 slot can be used without any hardware setting. The CAM3 CSI slot and GMSL2 slot on the vision mezzanine board share the same CSI. To use the GMSL2 slot, switch 1 of the SW2300DIP switch on the interposer board must be set to ON. This switch is set to OFF by default.
See [SW2300 Dip switch on interposer board](https://docs.qualcomm.com/doc/80-70030-17/topic/stream-cameras.html#sw2300-dip).
### Connect RB3G2 MIPI CSI cameras on interposer board
Connect OV9282 module to CAM1 and IMX577 module to CAM2 on the interposer board.

Set CSI1\_DIP\_SW and CSI2\_DIP\_SW to ON to use CAM1/CAM2 on the interposer board as shown in the following image. The switch is set OFF by default.

### Supported resolutions and features
The following table shows the supported resolutions each camera module.
| Resolution | Aspect Ratio | IMX577 (CAM3) | OV9282 (CAM0A) | AR0231 (GMSL) |
| --- | --- | --- | --- | --- |
| 4000 x 3000 | 4:3 | Yes | No | No |
| 3840 x 2160 | 16:9 | Yes | No | No |
| 2976 x 2976 | 1:1 | Yes | No | No |
| 2592 x 1940 | 4:3 | Yes | No | No |
| 2048 x 1536 | 4:3 | Yes | No | No |
| 1920 x 1440 | 4:3 | Yes | No | No |
| 1928 x 1208 | 16:10 | Yes | No | Yes |
| 1920 x 1080 | 16:9 | Yes | No | Yes |
| 1440 x 1080 | 4:3 | Yes | No | Yes |
| 1280 x 720 | 16:9 | Yes | Yes | Yes |
| 1024 x 768 | 4:3 | Yes | Yes | Yes |
| 800 x 600 | 4:3 | Yes | Yes | Yes |
| 640 x 480 | 4:3 | Yes | Yes | Yes |
| 640 x 360 | 16:9 | Yes | Yes | Yes |
| 320 x 240 | 4:3 | Yes | Yes | Yes |
The following table shows the supported features of each camera module.
| Feature | IMX577 (CAM3) | OV9282 (CAM0A) | AR0231 (GMSL) |
| --- | --- | --- | --- |
| SHDR | Yes | No | No |
| LDC | Yes | No | No |
| EIS | Yes | No | No |
- *class* tabincludedirective
- >
>
> This section explains how to connect camera sensors on the QCS9075 reference platform (RB8).
### Connect MIPI CSI cameras on RB8
RB8 will be offered in one kit version called the core kit. This core kit supports only MIPI CSI cameras. The GMSL cameras are supported using a separate add-on GMSL mezzanine board that needs to be connected to core kit.
In the RB8 (core kit + GMSL mezzanine) hardware, there are four MIPI CSI (C/D-PHY) connectors present on the RB8 core kit/main board and four GMSL ports (0 to 3) present on the GMSL mezzanine board.
The following diagram shows the MIPI connectors on the RB8 core kit/main board.

### Connect GMSL cameras on RB8
There are four GMSL ports (0 to 3) present on the GMSL mezzanine board. Each GMSL port connects with a MAX96724 quad GMSL deserializer. Each deserializer is connected to one CSI.
The following diagram shows the GMSL ports on the RB8 device. Note that the GMSL port numbering is not in sequence - It is defined based on the CSI index to which a GMSL port is connected.

Note
In the current release three GMSL ports (0, 2, and 3) are enabled to connect GMSL cameras. Port 1 is not enabled.
- Each GMSL port contains four slots (1 to 4, also referred to as channels) and supports connection of four GMSL cameras on a single port.
- The current release supports OX03f10 Bayer GMSL and OX03f10 YUV GMSL cameras.
- Port-0 supports OX03f10 Bayer GMSL cameras. Port-2 and Port-3 support OX03f10 YUV GMSL cameras. Thus, you can connect four OX03F10 Bayer GMSL cameras on GMSL Port-0, four OX03F10 YUV GMSL cameras on GMSL Port-2 and four OX03F10 YUV GMSL cameras on GMSL Port-3.
Note
In the current release, OX03f10 bayer GMSL cameras connected to Port-0 are not stable on the RB8 hardware due to CSI errors. This will be fixed in the next release.
### Set DIP switches
QCS9075 has four CSI PHYs. Each CSI PHY is routed to connect to either a MIPI camera port or a GMSL camera port controlled using DIP switch present on the core kit/main board.
The switch is different for EVT and DVT/PVT hardware versions:
- DIP switch setting for RB8 EVT hardware: The following diagram shows DIP switches present on the core kit/main board.
>
>
> 
>
> The following table explains the required DIP switch SW2 settings needed to use MIPI and GMSL camera ports.
>
>
>
>
>
>
> | Switch | OFF (default from factory) | ON | Connection when on | Connection when off (default from factory) |
> | --- | --- | --- | --- | --- |
> | SW2 - 1 | HIGH | LOW | CSI0 connected to GMSL mezzanine | CSI0 connected to main board |
> | SW2 - 2 | HIGH | LOW | CSI1 connected to GMSL mezzanine | CSI1 connected to main board |
> | SW2 - 3 | HIGH | LOW | CSI2 connected to GMSL mezzanine | CSI2 connected to main board |
> | SW2 - 4 | HIGH | LOW | CSI3 connected to GMSL mezzanine | CSI3 connected to main board |
- DIP switch setting for RB8 DVT/PVT hardware: The following diagram shows DIP switches present on the core kit/main board.
>
>
> 
>
> The following table explains the required DIP switch SW1 settings needed to use MIPI and GMSL camera ports. On the DIP switch, it is written “ON” to know the switch direction to enable.
>
>
>
>
>
>
> | Switch | Connection when on | Connection when off (default from factory) |
> | --- | --- | --- |
> | SW1 - 5 | CSI0 connected to GMSL mezzanine | CSI0 connected to main board |
> | SW1 - 6 | CSI1 connected to GMSL mezzanine | CSI1 connected to main board |
> | SW1 - 7 | CSI2 connected to GMSL mezzanine | CSI2 connected to main board |
> | SW1 - 8 | CSI3 connected to GMSL mezzanine | CSI3 connected to main board |
### Supported resolutions and features
The following table shows the supported resolutions each camera module on the RB8 platform.
| Resolution | Aspect ratio | 0X3F10 Bayer GMSL | 0X3F10 YUV GMSL | OV9282 (CAM0A) |
| --- | --- | --- | --- | --- |
| 1920 x 1536 | 5:4 | No | Yes | No |
| 1920 x 1440 | 4:3 | No | Yes | No |
| 1928 x 1208 | 16:10 | No | Yes | No |
| 1920 x 1080 | 16:9 | No | Yes | No |
| 1824 x 1536 | 19:16 | Yes | Yes | No |
| 1440 x 1080 | 4:3 | Yes | Yes | No |
| 1280 x 720 | 16:9 | Yes | Yes | Yes |
| 1024 x 768 | 4:3 | Yes | Yes | Yes |
| 800 x 600 | 4:3 | Yes | Yes | Yes |
| 640 x 480 | 4:3 | Yes | Yes | Yes |
| 640 x 360 | 16:9 | Yes | Yes | Yes |
| 320 x 240 | 4:3 | Yes | Yes | Yes |
Advanced features such as SHDR, LDC, and EIS are not supported on QCS9075.
### Concurrent camera support on RB8
The following tables explain the concurrent camera use cases which are supported in the current release.
- RB8 MIPI sensor: The software supports the OV9282 MIPI camera. The following table describes MIPI camera support on the RB8 platform.
>
>
> | MIPI camera | Supported resolution and FPS | CAM0 | CAM1 | CAM2 | CAM3 | Notes |
> | --- | --- | --- | --- | --- | --- | --- |
> | OV9282 | 1280x720, 30 FPS | Supported | Supported | Supported | Supported | Any camera can operate independently.
A maximum of two cameras can operate concurrently with real-time IFE processing.
All four cameras can operate concurrently with the offline IFE feature. |
- RB8 GMSL sensor: The software supports OX03F10 Bayer and OX03F10 YUV GMSL cameras. The following table describes GMSL camera support on the RB8 platform.
>
>
> | GMSL port | Supported resolution and FPS | GMSL sensor | Note |
> | --- | --- | --- | --- |
> | Port-0 | 1824x1536, 30 FPS | 3F10 GMSL Bayer | Four OX03F10 BayerGMSL cameras can be connected on GMSL Port-0.
Any one camera can operate independently.
All four cameras on a single port can operate concurrently using the Per Port Group feature.
**Note:** In the current release, OX03f10 Bayer GMSL cameras connected to Port-0 are not stable on the RB8 hardware due to CSI errors. This will be fixed in the next release. |
> | Port-2 | 1920x1536,30 FPS | 3F10 GMSL YUV | Four OX03F10 YUV GMSL cameras can be connected on GMSL Port-2.
Any one camera can operate independently.
All four cameras on a single port can operate concurrently using the Per Port Group feature. |
> | Port-3 | 1920x1536,30 FPS | 3F10 GMSL YUV | Four OX03F10 YUV GMSL cameras can be connected on GMSL Port-3.
Any one camera can operate independently.
All four cameras on a single port can operate concurrently using the Per Port Group feature. |
> | GMSL concurrency with Port-2 + Port-3
**Note:** Port-0 is not considered for concurrency here as this port is not stable due to CSI errors (a known issue on RB8 for this release). This will be fixed in the next release. | 1920x1536,30 FPS | 3F10 GMSL YUV | Eight OX03F10 YUV GMSL cameras can be connected, four on Port-2 and four on Port-3.
Any one camera from each port can operate independently.
All eight cameras can operate concurrently using the Per Port Group feature. |
- RB8 GMSL sensor + MIPI sensor concurrency: The following GMSL sensor + MIPI sensor concurrency is supported on the RB8 platform.
>
>
> | | CAM0 | CAM1 | GMSL Port-2 | GMSL Port-3 | Notes |
> | --- | --- | --- | --- | --- | --- |
> | **Camera Sensor and supported resolution** | OV9282
1280x720,30 FPS | OV9282
1280x720,30 FPS | OX03F10 YUV GMSL
1920x1080,30 FPS | OX03F10 YUV GMSL
1920x1080,30 FPS | Any camera can operate independently. All four cameras operate concurrently. |
- *class* tabincludedirective
- This section explains how to connect camera sensors to the QCS8275 reference platform (RB4).
### Connect MIPI CSI camera module on RB4
RB4 is offered in the “core” kit. This core kit supports MIPI CSI cameras. GMSL cameras are supported using a separate add-on GMSL mezzanine board that must be connected to the core kit.
The following diagram shows the MIPI connectors on the RB4 core kit/main board.

### Connect GMSL camera module on RB4
There are four GMSL ports (0 to 3) present on the GMSL mezzanine board. Port 3 is a dummy port. GMSL ports 0, 1, and 2 each connect with a MAX96724 quad GMSL deserializer. Each deserializer is connected to one CSI.
The following diagram shows the GMSL ports on the RB4 hardware. Note that GMSL port numbering is not in sequence. It is defined based on the CSI index to which the GMSL port is connected.

Note
In the current release, two GMSL ports (0 and 2) are supported to connect GMSL cameras. Port 1 is not enabled due to a hardware issue. Port 3 is a dummy port.
- Each GMSL port contains four slots (1 to 4, also referred to as channels) and supports connection to four GMSL cameras on single port.
- The current release supports OX03f10 bayer GMSL and OX03f10 YUV GMSL cameras.
- Port-0 supports OX03f10 Bayer GMSL cameras. Port-2 supports OX03f10 YUV GMSL cameras. Thus, you can connect four OX03F10 bayer GMSL cameras on GMSL Port-0, and four OX03F10 YUV GMSL cameras on GMSL Port-2.
### Set DIP switches
QCS8275 has three CSI PHYs. Each CSI PHY is routed to connect to either a MIPI camera port or a GMSL camera port controlled with a DIP switch present on the core kit/main board.
The switch is different for EVT and DVT/PVT hardware versions.
- DIP switch setting on RB4 EVT hardware
>
>
> 
The following table explains the required DIP switch SW2 settings needed to use MIPI cameras and GMSL camera ports.
>
>
> | Switch | OFF (default from factory) | ON | Connection when on | Connection when off (default from factory) |
> | --- | --- | --- | --- | --- |
> | SW2 - 1 | HIGH | LOW | CSI0 connected to GMSL mezzanine | CSI0 connected to main board |
> | SW2 - 2 | HIGH | LOW | CSI1 connected to GMSL mezzanine | CSI1 connected to main board |
> | SW2 - 3 | HIGH | LOW | CSI2 connected to GMSL mezzanine | CSI2 connected to main board |
- DIP switch setting on RB4 DVT/PVT hardware
>
>
> 
The following table explains the required DIP switch SW1 settings needed to use MIPI and GMSL camera ports. On the DIP switch, it is written “ON” to know which direction to enable.
>
>
> | Switch | Connection when ON | Connection when OFF (default from factory) |
> | --- | --- | --- |
> | SW1-5 | CSI0 connected to GMSL mezzanine | CSI0 connected to main board |
> | SW1-6 | CSI1 connected toGMSL mezzanine | CSI1 connected to main board |
> | SW1-7 | CSI2 connected to GMSL mezzanine | CSI2 connected to main board |
### Supported resolutions and features
The following table shows the supported resolutions each camera module on the RB4 platform.
| Resolution | Aspect ratio | 0X3F10 Bayer GMSL | 0X3F10 YUV GMSL | OV9282 (CAM0A) |
| --- | --- | --- | --- | --- |
| 1920 x 1536 | 5:4 | No | Yes | No |
| 1920 x 1440 | 4:3 | No | Yes | No |
| 1928 x 1208 | 16:10 | No | Yes | No |
| 1920 x 1080 | 16:9 | No | Yes | No |
| 1824 x 1536 | 19:16 | Yes | Yes | No |
| 1440 x 1080 | 4:3 | Yes | Yes | No |
| 1280 x 720 | 16:9 | Yes | Yes | Yes |
| 1024 x 768 | 4:3 | Yes | Yes | Yes |
| 800 x 600 | 4:3 | Yes | Yes | Yes |
| 640 x 480 | 4:3 | Yes | Yes | Yes |
| 640 x 360 | 16:9 | Yes | Yes | Yes |
| 320 x 240 | 4:3 | Yes | Yes | Yes |
Advanced features such as SHDR, LDC, and EIS are not supported on QCS8275.
### Concurrent camera support on RB4
The following tables explain the concurrent camera use cases which are supported in the current release.
- RB4 MIPI sensor: The software supports the OV9282 MIPI camera. The following table describes MIPI camera support on the RB4 platform.
| MIPI camera | Supported resolution and FPS | CAM0 | CAM1 | CAM2 | Notes |
| --- | --- | --- | --- | --- | --- |
| OV9282 | 1280x720, 30 FPS | Supported | Supported | Supported | Any camera can operate independently.
A maximum of two cameras can operate concurrently with real-time IFE processing.
All three cameras can operate concurrently using the Offline IFE feature. |
- RB4 GMSL sensor: The software supports OX03F10 bayer and OX03F10 YUV GMSL cameras. The following table describes GMSL camera support on the RB4 platform.
| GMSL port | Supported resolution and FPS | GMSL sensor | Note |
| --- | --- | --- | --- |
| Port-0 | 1824x1536, 30 FPS | 3F10 GMSL Bayer | Four OX03F10 BayerGMSL cameras can be connected on GMSL Port-0.
Any one camera can operate independently.
All four cameras on a single port can operate concurrently using the Per Port Group feature.
Note
In the current release, running four OX03f10 bayer GMSL cameras connected to Port-0 is not stable on the RB4 hardware. This will be fixed in the next release. |
| Port-2 | 1920x1536,30 FPS | 3F10 GMSL YUV | Four OX03F10 YUV GMSL cameras can be connected on GMSL Port-2.
Any one camera can operate independently.
All four cameras on a single port can operate concurrently using the Per Port Group feature.
Note
In the current release, running four OX03f10 bayer GMSL cameras connected to Port-2 is not stable on the RB4 hardware. This will be fixed in the next release. |
| GMSL concurrency with Port-0 + Port-2 | Port-0: 1824x1536, 30 FPS
Port-2: 1920x1536,30 FPS | Port-0: 3F10 GMSL bayer
Port-2: 3F10 GMSL YUV | Four OX03F10 bayer GMSL cameras can be connected on Port-0, and four OX03F10 YUV GMSL cameras can be connected on Port-2.
Any one camera from each port can operate independently.
All eight cameras can operate concurrently using the Per Port Group feature.
Note
In the current release, this concurrency is not stable on the RB4 hardware. This will be fixed in the next release. |
- RB4 GMSL sensor + MIPI sensor concurrency: The following GMSL sensor + MIPI sensor concurrency is supported on the RB4 platform.
| | GMSL Port-0 CAM0 | CAM1 | GMSL Port-2 | Notes |
| --- | --- | --- | --- | --- |
|
**Camera Sensor and supported resolution** | OX03F10 bayer GMSL
1824x1536, 30 FPS | OV9282 MIPI camera
1280x720,30 FPS | OX03F10 YUV GMSL
1920x1080,30 FPS | Any camera can operate independently.
All three cameras operate concurrently. |
|
**Camera Sensor and supported resolution** | OV9282 MIPI camera
1280x720,30 FPS | OV9282 MIPI camera
1280x720,30 FPS | OX03F10 YUV GMSL
1920x1080,30 FPS | Any camera can operate independently.
All three cameras operate concurrently. |
| | | | | |
## Choose the stream API
Qualcomm Linux supports following APIs for camera.
- [GStreamer API](https://docs.qualcomm.com/doc/80-70030-17/topic/stream-cameras.html#gstreamer-api)
GStreamer is an open-source multimedia framework. Qualcomm provides a GStreamer plugin (qtiqmmfsrc) that allows developers to control the camera subsystem in applications.
See [Qualcomm GStreamer plugins](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-50/qim-sdk-plugins.html) for more information.
- [V4L2 API](https://docs.qualcomm.com/doc/80-70030-17/topic/stream-cameras.html#v4l2-api) (QCS6490 and QCS9075 only)
V4L2 is a framework within the Linux kernel that provides support for video capture, video output, and other multimedia devices. Developers can operate the camera using the V4L2 API.
The V4L2 API, which uses the CAMSS driver, is suitable for developers who only need to obtain raw images from the camera.
## Stream camera with the GStreamer API
gst-launch-1.0 is a command-line GStreamer utility used to build and run a GStreamer pipeline.
The pipeline is specified as a collection of elements with properties separated by exclamation marks (!).
### Prerequisites
To use [gst-launch-1.0](https://gstreamer.freedesktop.org/documentation/tools/gst-launch.html?gi-language=c) and GStreamer plugins, QIM-SDK (meta-qcom-qim-product-sdk) must be installed on the device.
See [Qualcomm Linux Build Guide](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-254/introduction.html) for QIM-SDK build and installation information.
Note
Connect to the device console using SSH. See [How To SSH?](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-254/how_to.html#use-ssh) for instructions.
Run the following command in an SSH terminal:
# mount -o rw,remount /usr
Copy to clipboard
### Run camera use cases
Tab QCS6490
Tab QCS9075
Tab QCS8275
- *class* tabincludedirective
- Note
Ensure that MIPI cameras are connected to CSI slots. The OV9282 MIPI camera should be connected to the CAM 0A slot and the IMX577 MPI camera should be be connected to the CAM3 slot.
#### Single camera stream start
1. Run the following command in the device terminal:
gst-launch-1.0 -e qtiqmmfsrc name=camsrc camera=0 ! 'video/x-raw,format=NV12,\
width=1280,height=720,framerate=30/1' ! fakesink
Copy to clipboard
2. This command starts the camera with 720p at 30 FPS configuration. The frame coming from the camera sensor is thrown away by fakesink.
If the gst pipeline status is changed to “PLAYING” as shown below, this indicates that the camera is running.
Since this command dumps camera frames to fakesink, nothing will be saved on the device.
gbm_create_device(187): Info: backend name is: msm_drm
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
Copy to clipboard
To stop the camera, press **CTRL+C**.
#### Video encoding
1. Run the following command in the device terminal:
gst-launch-1.0 -e qtiqmmfsrc name=camsrc camera=0 ! \
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/mux_avc.mp4
Copy to clipboard
This command starts the camera with 720p at 30 FPS configuration and saves it as a video file after h264 video encoding. If the gst pipeline status is changed to “PLAYING”, this indicates the camera is running.
To stop the camera, press **CTRL+C**.
2. `/opt/mux_avc.mp4` is generated on the device. The recorded content can be pulled from the device by running the following scp command on the host PC:
$ scp -r root@[ip-addr]:/opt/mux_avc.mp4 .
Copy to clipboard
#### Video encoding and snapshot
1. Run the following command in the device terminal:
gst-pipeline-app -e qtiqmmfsrc name=camsrc camera=0 ! \
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/mux_avc.mp4 \
camsrc.image_1 ! "image/jpeg,width=1280,height=720,framerate=30/1" \
! multifilesink location=/opt/frame%d.jpg async=false sync=true enable-last-sample=false
Copy to clipboard
2. Press **Enter**. This command will print the following menu and wait for user input.
##################################### MENU #####################################
============================== Pipeline Controls==============================
(0) NULL: Set the pipeline into NULL state
(1) READY: Set the pipeline into READY state
(2) PAUSED: Set the pipeline into PAUSED state
(3) PLAYING: Set the pipeline into PLAYING state
==================================== Other====================================
(p) Plugin Mode: Choose a plugin which to control
(q) Quit : Exit the application
Choose an option:
Copy to clipboard
3. Use the following menu steps to take a snapshot while recording video.
(1) ready -> (3) Playing -> (p)Plugin Mode : Select (8)camerasrc -> (37) capture-image -> (1): still - Snapshot ->(1) Snapshot count ( 'guint' value for arg1)
Copy to clipboard
4. To stop the camera, press **Enter**, press **b** (back), and then press **q** (quit). The recorded video file and snapshot images are saved in `/opt/`. The recorded content can be pulled from the device by running the following scp command on the host PC:
$ scp -r root@[ip-addr]:/opt/ .
Copy to clipboard
#### MIPI multi-camera streaming
QCS6490 has five CSI PHYs to which you can connect five MIPI cameras.
QCS6490 has three IFEs and two IFE Lites. This means you can run three cameras with IFEs and two cameras with IFE Lites.
IFE Lites only support raw dumps from the sensor. You can connect mono cameras to the IFE Lites, dump raw frames, and then convert the output to YUV frames using a CHI node.
To validate five camera concurrency on the RB3 platform:
1. Connect MIPI cameras as described in the following table.
| Slot | Camera sensor |
| --- | --- |
| CAM 0A | OV9282 mono camera |
| CAM 0B | OV9282 mono camera |
| CAM1 | IMX577 bayer camera |
| CAM2 | IMX577 bayer camera |
| CAM3 | IMX577 bayer camera |
2. Run the following GST commands to run all five cameras concurrently.
Note
For OV9282 mono cameras, a separate camera pipeline (RealTimeMonoToYUV) is used. This pipeline uses IFE Lites to dump the raw frame and then convert it to a YUV frame using a CHI node.
Use the GST parameter `ife-direct-stream=1` to use this camera pipeline. Since it runs with an IFE Lite, 2A is not applied on these cameras.
Note
The QCS6490 maximum encode capability is [4K@30](mailto:4K%4030). Thus, the total encode processing from all five cameras has to be under the [4k@30](mailto:4k%4030) limit.
- Cam 0: IMX577
>
>
> gst-launch-1.0 -e qtiqmmfsrc name=camsrc camera=0 ! video/x-raw,format=NV12_Q08C,width=1920,height=1080,\
> framerate=30/1 ! v4l2h264enc capture-io-mode=4 output-io-mode=5 extra-controls="controls,video_bitrate=5000000,\
> video_bitrate_mode=0;" ! queue ! h264parse ! mp4mux ! queue ! filesink location=/opt/Cam_0_1080p.mp4
> Copy to clipboard
- Cam 1: IMX577
>
>
> gst-launch-1.0 -e qtiqmmfsrc name=camsrc camera=1 ! video/x-raw,format=NV12_Q08C,width=1920,height=1080,\
> framerate=30/1 ! v4l2h264enc capture-io-mode=4 output-io-mode=5 extra-controls="controls,video_bitrate=5000000,\
> video_bitrate_mode=0;" ! queue ! h264parse ! mp4mux ! queue ! filesink location=/opt/Cam_1_1080p.mp4
> Copy to clipboard
- Cam 8: IMX577
>
>
> gst-launch-1.0 -e qtiqmmfsrc name=camsrc camera=8 ! video/x-raw,format=NV12_Q08C,width=1920,height=1080,\
> framerate=30/1 ! v4l2h264enc capture-io-mode=4 output-io-mode=5 extra-controls="controls,video_bitrate=5000000,\
> video_bitrate_mode=0;" ! queue ! h264parse ! mp4mux ! queue ! filesink location=/opt/Cam_8_1080p.mp4
> Copy to clipboard
- Cam 2: OV9282
>
>
> gst-launch-1.0 -e qtiqmmfsrc name=camsrc camera=2 ife-direct-stream=1 ! video/x-raw,format=NV12,width=1280,height=720,\
> framerate=30/1 ! v4l2h264enc capture-io-mode=4 output-io-mode=5 extra-controls="controls,video_bitrate=5000000,\
> video_bitrate_mode=0;" ! queue ! h264parse ! mp4mux ! queue ! filesink location=/opt/Cam_2_720p.mp4
> Copy to clipboard
- Cam 3 : OV9282
>
>
> gst-launch-1.0 -e qtiqmmfsrc name=camsrc camera=3 ife-direct-stream=1 ! video/x-raw,format=NV12,width=1280,height=720,\
> framerate=30/1 ! v4l2h264enc capture-io-mode=4 output-io-mode=5 extra-controls="controls,video_bitrate=5000000,\
> video_bitrate_mode=0;" ! queue ! h264parse ! mp4mux ! queue ! filesink location=/opt/Cam_3_720p.mp4
> Copy to clipboard
- *class* tabincludedirective
- Note
Ensure that the camera (MIPI or GMSL) sensor is connected to the RB8 device. You can connect OV9282 MIPI cameras on CSI slots. Connect OX03f10 Bayer GMSL cameras to GMSL Port-0 and OX03f10 YUV GMSL cameras to Port-2 and Port-3.
Note
There are random CSI errors on GMSL Port-0 that stop Bayer GMSL camera streaming. This issue will be fixed in the next GA release.
#### Single camera stream start
Run the following command in the device terminal:
gst-launch-1.0 -e qtiqmmfsrc name=camsrc camera=0 ! 'video/x-raw,format=NV12,\
width=1280,height=720,framerate=30/1' ! fakesink
Copy to clipboard
The following command starts the camera with 720p at 30 FPS configuration. The frame coming from the camera sensor is thrown away by fakesink.
If the gst pipeline status is changed to “PLAYING” as shown below, this indicates that the camera is running.
Since this command dumps camera frames to fakesink, nothing will be saved on the device.
gbm_create_device(187): Info: backend name is: msm_drm
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
Copy to clipboard
To stop the camera, press **CTRL+C**.
#### Video encoding
1. Run the following command in the device terminal:
gst-launch-1.0 -e qtiqmmfsrc name=camsrc camera=0 ! \
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/mux_avc.mp4
Copy to clipboard
This command starts the camera with 720p at 30 FPS configuration and saves it as a video file after h264 video encoding. If the gst pipeline status is changed to “PLAYING”, this indicates the camera is running.
To stop the camera, press **CTRL+C**.
2. `/opt/mux_avc.mp4` is generated on the device. The recorded content can be pulled from the device by running the following scp command on the host PC:
$ scp -r root@[ip-addr]:/opt/mux_avc. mp4 .
Copy to clipboard
#### Video encoding and snapshot
QCS9075 doesn’t have a hardware JPEG encoder. The snapshot use case works using a software JPEG encoder algorithm that runs on the CPU.
1. Run the following command in the device terminal:
>
>
> gst-pipeline-app -e qtiqmmfsrc name=camsrc camera=0 ! video/x-raw,format=NV12,width=1280,height=720,\
> framerate=30/1,interlace-mode=progressive,colorimetry=bt601 ! queue ! v4l2h264enc capture-io-mode=4 \
> output-io-mode=5 extra-controls="controls,video_bitrate_mode=0,video_bitrate=6000000;" ! queue ! \
> h264parse ! mp4mux ! queue ! filesink location="/opt/mux_720_avc.mp4" camsrc.image_1 ! "image/jpeg,\
> width=1280,height=720,framerate=30/1" ! multifilesink location=/opt/frame%d.jpg async=false sync=true \
> enable-last-sample=false
> Copy to clipboard
2. Press **Enter**. This command will print the following menu and wait for user input.
>
>
> ##################################### MENU ########################## ###########
>
> ============================== Pipeline Controls==============================
> (0) NULL: Set the pipeline into NULL state
> (1) READY: Set the pipeline into READY state
> (2) PAUSED: Set the pipeline into PAUSED state
> (3) PLAYING: Set the pipeline into PLAYING state
> ==================================== Other====================================
> (p) Plugin Mode: Choose a plugin which to control
> (q) Quit : Exit the application
>
> Choose an option:
> Copy to clipboard
3. Use the following menu steps to take a snapshot while recording video.
>
>
> (1) ready -> (3) Playing -> (p)Plugin Mode : Select (11)camerasrc ->
> (38) capture-image -> (1): still - Snapshot ->(1) Snapshot count ( 'guint' value for arg1)
> Copy to clipboard
4. To stop the camera, press **Enter**, press **b** (back), and then press **q** (quit). The recorded video file and snapshot images are saved in `/opt/`. The recorded content can be pulled from the device by running the following scp command on the host PC:
>
>
> $ scp -r root@[ip-addr]:/opt/ .
> Copy to clipboard
#### MIPI multi-camera streaming
There are four MIPI CSI slots present on the RB8 main board. Connect OV9282 cameras to MIPI CSI ports. You can run any two OV9282 cameras concurrently out of four cameras.
Run the following GST command in two different terminals with camera = 0, 1 to validate MIPI camera concurrency. Use different file names when saving the encoded file of each camera.
gst-launch-1.0 -e qtiqmmfsrc name=camsrc camera=0 ! \
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/mux_avc.mp4
Copy to clipboard
You can also run all four MIPI cameras concurrently using the offline IFE feature. Refer to [Support multi-camera using offline IFE](https://docs.qualcomm.com/doc/80-70030-17/topic/support-multi-camera-using-offline-IFE.html#offline-ife) for information on four camera validation.
#### GMSL multi-camera streaming
A single GMSL port contains four slots, allowing connection of four GMSL cameras to a single CSI using different virtual channel IDs.
The four cameras connected on one CSI are treated as group. A group of cameras can be run concurrently using the [per port grouping feature](https://docs.qualcomm.com/doc/80-70030-17/topic/support-per-port-grouping.html#per-port-grouping).
- *class* tabincludedirective
- >
>
> Note
>
>
> Ensure that the camera (MIPI or GMSL) sensor is connected to the RB4 device. You can connect OV9282 MIPI cameras on CSI slots.
> Connect OX03f10 bayer GMSL cameras to GMSL Port-0 and OX03f10 YUV GMSL cameras to GMSL Port-2 .
#### Single camera stream start
Run the following command in the device terminal:
gst-launch-1.0 -e qtiqmmfsrc name=camsrc camera=0 ! 'video/x-raw,format=NV12,\
width=1280,height=720,framerate=30/1' ! fakesink
Copy to clipboard
The following command starts the camera with 720p at 30 FPS configuration. The frame coming from the camera sensor is thrown away by fakesink.
If the gst pipeline status is changed to “PLAYING” as shown below, this indicates that the camera is running.
Since this command dumps camera frames to fakesink, nothing will be saved on the device.
gbm_create_device(187): Info: backend name is: msm_drm
Setting pipeline to PAUSED ...
Pipeline is live and does not need PREROLL ...
Setting pipeline to PLAYING ...
New clock: GstSystemClock
Copy to clipboard
To stop the camera, press **CTRL+C**.
#### Video encoding
1. Run the following command in the device terminal:
gst-launch-1.0 -e qtiqmmfsrc name=camsrc camera=0 ! \
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/mux_avc.mp4
Copy to clipboard
This command starts the camera with 720p at 30 FPS configuration and saves it as a video file after h264 video encoding. If the gst pipeline status is changed to “PLAYING”, this indicates the camera is running.
To stop the camera, press **CTRL+C**.
2. `/opt/mux_avc.mp4` is generated on the device. The recorded content can be pulled from the device by running the following scp command on the host PC:
$ scp -r root@[ip-addr]:/opt/mux_avc. mp4 .
Copy to clipboard
#### Video encoding and snapshot
QCS8275 doesn’t have a hardware JPEG encoder. The snapshot use case works using a software JPEG encoder algorithm that runs on the CPU.
1. Run the following command in the device terminal:
>
>
> gst-pipeline-app -e qtiqmmfsrc name=camsrc camera=0 ! video/x-raw,format=NV12,width=1280,height=720,\
> framerate=30/1,interlace-mode=progressive,colorimetry=bt601 ! queue ! v4l2h264enc capture-io-mode=4 \
> output-io-mode=5 extra-controls="controls,video_bitrate_mode=0,video_bitrate=6000000;" ! queue ! \
> h264parse ! mp4mux ! queue ! filesink location="/opt/mux_720_avc.mp4" camsrc.image_1 ! "image/jpeg,\
> width=1280,height=720,framerate=30/1" ! multifilesink location=/opt/frame%d.jpg async=false sync=true \
> enable-last-sample=false
> Copy to clipboard
2. Press **Enter**. This command will print the following menu and wait for user input.
>
>
> ##################################### MENU ########################## ###########
>
> ============================== Pipeline Controls==============================
> (0) NULL: Set the pipeline into NULL state
> (1) READY: Set the pipeline into READY state
> (2) PAUSED: Set the pipeline into PAUSED state
> (3) PLAYING: Set the pipeline into PLAYING state
> ==================================== Other====================================
> (p) Plugin Mode: Choose a plugin which to control
> (q) Quit : Exit the application
>
> Choose an option:
> Copy to clipboard
3. Use the following menu steps to take a snapshot while recording video.
>
>
> (1) ready -> (3) Playing -> (p)Plugin Mode : Select (11)camerasrc ->
> (38) capture-image -> (1): still - Snapshot ->(1) Snapshot count ( 'guint' value for arg1)
> Copy to clipboard
4. To stop the camera, press **Enter**, press **b** (back), and then press **q** (quit). The recorded video file and snapshot images are saved in `/opt/`. The recorded content can be pulled from the device by running the following scp command on the host PC:
>
>
> $ scp -r root@[ip-addr]:/opt/ .
> Copy to clipboard
#### MIPI multi-camera streaming
There are three MIPI CSI slots present on the RB4 main board. Connect OV9282 cameras to MIPI CSI ports. You can run any two OV9282 cameras concurrently.
Run the following GST command in two different terminals with camera = 0, 1 to validate MIPI camera concurrency. Use different file names when saving the encoded file of each camera.
gst-launch-1.0 -e qtiqmmfsrc name=camsrc camera=0 ! \
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/mux_avc.mp4
Copy to clipboard
You can also run all three MIPI cameras concurrently using the offline IFE feature. Refer to [Support multi-camera using offline IFE](https://docs.qualcomm.com/doc/80-70030-17/topic/support-multi-camera-using-offline-IFE.html#offline-ife) for information on three camera validation.
#### GMSL multi-camera streaming
A single GMSL port contains four slots, allowing connection of four GMSL cameras to a single CSI using different virtual channel IDs.
The four cameras connected on one CSI are treated as group. A group of cameras can be run concurrently using the [per port grouping feature](https://docs.qualcomm.com/doc/80-70030-17/topic/support-per-port-grouping.html#per-port-grouping).
### Other GStreamer Samples
The QIM SDK includes [GStreamer sample applications for camera](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-50/camera-sample-applications.html)
and sample applications for [AI/ML and other multimedia applications](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-50/example-applications.html).
Note
Before using the sample applications, ensure that the installation prerequisites for gst- launch-1.0 and GStreamer plugins are met.
See [Multimedia use case examples](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-50/multimedia-use-cases.html) for examples using gst-launch-1.0.
### Stream camera with the V4L2 API
Tab QCS6490
Tab QCS9075
Tab QCS8275
- *class* tabincludedirective
- The V4L2 framework within the Linux kernel supports video devices. It provides an API that allows user space applications to interact with devices such as cameras and video capture cards.
More information on V4L2 is available from [kernel.org](https://www.kernel.org/doc/html/v4.9/media/kapi/v4l2-core.html).
Qualcomm supports the V4L2 interface camera ISP driver for raw frame dump functionality in the upstream kernel.

#### CamSS driver
The Qualcomm camera subsystem (CamSS) driver in the upstream kernel implements the V4L2, media controller, and V4L2 subdev interfaces.
Camera sensors using the V4L2 subdev interface in the kernel are supported.
The CamSS driver consists of:
- CSIPHY module – Handles the physical layer of the CSI2 receivers. A separate camera sensor can be connected to each CSIPHY module.
- CSI Decoder (CSID) module – Handles the protocol and application layers of the CSI2 receivers. A CSID can decode a data stream from any CSIPHY.
- Video Front End (VFE) module – Represents the Image Front End (IFE) that contains Raw Dump Interface (RDI) input interfaces that bypass the image processing pipeline. The VFE also contains the AXI bus interface which writes output data to memory.

The CamSS driver implements the V4L2 interface. Each CSIPHY, CSID, and VFE module is represented by a single V4L2 sub-device.
As shown in the following diagram, each CSIPHY can connect to each CSID. Each CSID can connect to each VFE. Each RDI port has an individual video node.

CamSS V4L2 drivers are in `/drivers/media/platform/qcom/camss`. `` is the directory of the Linux kernel.
The following code snippet shows a v4l2\_subdev\_internal\_ops for the CamSS driver.
static const struct v4l2_subdev_internal_ops csiphy_v4l2_internal_ops = {
.open = csiphy_init_formats,
};
…
static const struct v4l2_subdev_internal_ops csid_v4l2_internal_ops = {
.open = csid_init_formats,
};
…
static const struct v4l2_subdev_internal_ops vfe_v4l2_internal_ops = {
.open = vfe_init_formats,
};
Copy to clipboard
The CamSS driver only uses the open interface to initialize the supported formats. It is called when the subdev device node is opened by an application.
The following code snippet shows a `v4l2_subdev_ops` for the CSID module. The CSIPHY and VFE modules have similar `v4l2_subdev_ops`.
static const struct v4l2_subdev_ops csid_v4l2_ops = {
.core = &csid_core_ops,
.video = &csid_video_ops,
.pad = &csid_pad_ops,
};
…
static const struct v4l2_subdev_core_ops csid_core_ops = {
.s_power = csid_set_power,
.subscribe_event = v4l2_ctrl_subdev_subscribe_event,
.unsubscribe_event = v4l2_event_subdev_unsubscribe,
};
static const struct v4l2_subdev_video_ops csid_video_ops = {
.s_stream = csid_set_stream,
};
static const struct v4l2_subdev_pad_ops csid_pad_ops = {
.enum_mbus_code = csid_enum_mbus_code,
.enum_frame_size = csid_enum_frame_size,
.get_fmt = csid_get_format,
.set_fmt = csid_set_format,
};
Copy to clipboard
These interfaces are called by the V4L2 framework or drivers in various contexts (for example, `ioctl`, `setup_link`, `start_streaming`). For example:
v4l2_subdev_call(subdev, pad, get_fmt, NULL, &fmt);``
Copy to clipboard
The following code snippet shows a `media_device_ops` for the CamSS driver and `media_entity_operations` for the CSIPHY, CSID, and VFE modules.
static const struct media_device_ops camss_media_ops = {
.link_notify = v4l2_pipeline_link_notify,
};
…
static const struct media_entity_operations csiphy_media_ops = {
.link_setup = csiphy_link_setup,
.link_validate = v4l2_subdev_link_validate,
};
…
static const struct media_entity_operations csid_media_ops = {
.link_setup = csid_link_setup,
.link_validate = v4l2_subdev_link_validate,
};
…
static const struct media_entity_operations vfe_media_ops = {
.link_setup = vfe_link_setup,
.link_validate = v4l2_subdev_link_validate,
};
Copy to clipboard
`Camss_media_ops` is registered when the CamSS driver is registered (`camss_probe`). The CSIPHY, CSID, and VFE media entity operation. `link_setup` is called in the context of `media_device_setup_link`.
#### V4L2 sample application - Yavta
This section describes how to capture raw frame data using an application that supports the V4L2 interface.
Note
Connect the IMX577 MIPI camera sensor to the CAM3 slot of the RB3 device.
##### Enable CamSS driver
1. Download upstream kernel source code using the following command.
devtool modify linux-qcom-custom
Copy to clipboard
This downloads the kernel source code to `/build-qcom-wayland/workspace/sources/linux-qcom-custom/`.
2. Apply the following change to enable the CamSS driver in the device tree:
/build-qcom-wayland/workspace/sources/linux-qcom-custom/arch/ arm64/boot/dts/qcom/qcs6490-addons-rb3gen2.dtsi
&camss {
- status = "disabled";
+ status = "okay";
ports {
#address-cells = <1>;
#size-cells = <0>;
csiphy3_ep: endpoint {
};
&cci1 {
- status = "disabled";
+ status = "okay";
};
Copy to clipboard
3. Edit `/layers/meta-qcom-hwe/recipes-kernel/linux/linux-qcom-custom_6.6.bb` to include the patch from step 2:
SRC_URI:append = " file://camss_enable_change.patch"
Copy to clipboard
4. Build the image following the Yocto build instructions in [Build Guide](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-254/build_addn_info.html).
5. Flash the image following the instructions in [Flash Images](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-254/flash_images.html).
##### Disable the camera module
The camera module cannot coexist with the CamSS driver. Move the `camera.ko` module out from `/lib/modules/6.6.*qli*/camera/` to disable automatic loading and then reboot the device.
# mount -o rw,remount /usr
# mv /lib/modules/6.6.*qli*/camera/camera*.ko /
# reboot
Copy to clipboard
##### Build and push the media controller utility and Yavta application
1. Build Yavta and the media controller.
bitbake yavta
Copy to clipboard
2. Push the binaries to the device. In the following example, `` is the directory of the Qualcomm software release.
Note
The version number in the ipk file name may be different in your build. Update the following commands as per the version numbers in your build.
scp /build-qcom-wayland/tmp-glibc/deploy/ipk/armv8-2a/v4l-utils_1.22.1-r0_armv8-2a.ipk root@[ip-addr]:/var/cache/camera/
scp /build-qcom-wayland/tmp-glibc/deploy/ipk/armv8-2a/yavta_0.0-r2_armv8-2a.ipk root@[ip-addr]:/var/cache/camera/
scp /build-qcom-wayland/tmp-glibc/deploy/ipk/armv8-2a/media-ctl_1.22.1-r0_armv8-2a.ipk root@[ip-addr]:/var/cache/camera/
scp /build-qcom-wayland/tmp-glibc/deploy/ipk/armv8-2a/libv4l_1.22.1-r0_armv8-2a.ipk root@[ip-addr]:/var/cache/camera/
Copy to clipboard
##### Create a shell connection to the device
Note
Connect to the device console using SSH. See [How To SSH?](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-254/how_to.html#use-ssh) for instructions.
ssh root@[ip-addr]
Copy to clipboard
##### Install the media-ctl, libv4l, v4l-utils, and yavta packages
# mount -o rw,remount /usr
# opkg --nodeps install /var/cache/camera/media-ctl_1.22.1-r0_armv8-2a.ipk --force-reinstall
# opkg --nodeps install /var/cache/camera/libv4l_1.22.1-r0_armv8-2a.ipk --force-reinstall
# opkg --nodeps install /var/cache/camera/v4l-utils_1.22.1-r0_armv8-2a.ipk --force-reinstall
# opkg --nodeps install /var/cache/camera/yavta_0.0-r2_armv8-2a.ipk --force-reinstall
Copy to clipboard
##### Load the CamSS module
# modprobe qcom-camss
Copy to clipboard
The IMX412 and qcom-camss modules are in the following paths on the device:
- `/lib/modules/*/kernel/drivers/media/i2c/imx412.ko`
- `/lib/modules/*/kernel/drivers/media/platform/qcom/camss/qcom-camss.ko`
The IMX412 module is loaded by default. Verify the qcom\_camss and IMX412 modules are loaded by running the following lsmod command:
# lsmod | grep qcom_camss
# lsmod | grep imx412
Copy to clipboard
##### Check the media node number
Run the following command to print the media device node number for the CamSS driver.
If /dev/media0 does not list the qcom-camss driver, try it with /dev/media1.
# media-ctl -p -d /dev/media0 | grep camss
driver qcom-camss
bus info platform:acaf000.camss
Copy to clipboard
##### Find the sensor name
Run the following command to print the sensor name to the terminal:
# cat /sys/dev/char/81\:*/name | grep imx
imx577 21-001a
Copy to clipboard
##### Configure the media controller
The media controller utility (media-ctrl) is a [V4L2 utility](https://git.linuxtv.org/v4l-utils.git) used to configure camera subsystem subdevices. Use `media-ctl --help` to print usage information.
Note
Replace [x] with the number found via :ref. <Check the media node number>. For example, `# media-ctl -d /dev/media1 --reset`.
1. Reset all links to inactive:
# media-ctl -d /dev/media[x] --reset
Copy to clipboard
2. Configure the camera sensor format and resolution on pipeline nodes:
# media-ctl -d /dev/media[x] -V '"imx577 17-001a":0[fmt:SRGGB10/4056x3040 field:none]'
Copy to clipboard
3. Configure CSIPHY with 4056x3040 resolution:
# media-ctl -d /dev/media[x] -V '"msm_csiphy3":0[fmt:SRGGB10/ 4056x3040]'
# media-ctl -d /dev/media[x] -V '"msm_csiphy3":1[fmt: SRGGB10/4056x3040]'
Copy to clipboard
4. Configure CSID with 4056x3040 resolution:
# media-ctl -d /dev/media[x] -V '"msm_csid0":0[fmt:SRGGB10/4056x3040] '
# media-ctl -d /dev/media[x] -V '"msm_csid0":1[fmt:SRGGB10/ 4056x3040]'
Copy to clipboard
5. Configure ISP with 3840x2160 resolution:
# media-ctl -d /dev/media[x] -V '"msm_vfe0_rdi0":0[fmt:SRGGB10/ 4056x3040]'
# media-ctl -d /dev/media[x] -V '"msm_vfe0_rdi0":1[fmt: SRGGB10/4056x3040]'
Copy to clipboard
6. Link the pipeline:
# media-ctl -d /dev/media[x] -l '"msm_csiphy3":1->"msm_csid0":0[1]'
# media-ctl -d /dev/media[x] -l '"msm_csid0":1->"msm_vfe0_rdi0":0[1]'
Copy to clipboard
##### Capture images
The [Yavta test application](https://git.ideasonboard.org/yavta.git) validates the camera using the V4L2 interface. Run Yavta to capture images:
# yavta -B capture-mplane -c -I -n 5 -f SRGGB10P -s 4056x3040 -F /dev/video0 --capture=5 --file='frame-#.raw'
Copy to clipboard
#### V4L2 sample application - libcamera
libcamera is an open-source software framework. It handles control of the V4L2 camera interface and exposes a native C++ API to upper layers.
The applications and upper-level frameworks run based on the [libcamera framework](https://www.kernel.org/doc/html/v4.9/media/kapi/v4l2-core.html).
See [libcamera architecture](https://libcamera.org/docs.html#libcamera-architecture) for more detail about the libcamera architecture.

libcamera is validated using the [cam utility](https://libcamera.org/getting-started.html#basic-testing-with-cam-utility).
#### Capture raw frame data
The following steps describe how to capture raw frame data with the camera utility app using the V4L2 interface.
Note
Connect the IMX577 MIPI camera sensor to the CAM3 slot of the RB3 device.
##### Enable the CamSS driver
1. Download upstream kernel source code using the following command.
devtool modify linux-qcom-custom
Copy to clipboard
This downloads the kernel source code to `/build-qcom-wayland/workspace/sources/linux-qcom-custom/`.
2. Apply the following change to enable the CamSS driver in the device tree:
/build-qcom-wayland/workspace/sources/linux-qcom-custom/arch/arm64/boot/dts/qcom/qcs6490-addons-rb3gen2.dtsi
&camss {
- status = "disabled";
+ status = "okay";
ports {
#address-cells = <1>;
#size-cells = <0>;
csiphy3_ep: endpoint {
};
&cci1 {
- status = "disabled";
+ status = "okay";
};
Copy to clipboard
3. Edit `/layers/meta-qcom-hwe/recipes-kernel/linux/linux-qcom-custom_6.6.bb` to include the patch from step 2:
SRC_URI:append = " file://camss_enable_change.patch"
Copy to clipboard
4. Build the image following the Yocto build command in [Build Guide](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-254/build_addn_info.html).
5. Flash the image following the instructions in [Flash images](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-254/flash_images.html).
##### Disable the camera module
The camera module cannot coexist with the CamSS driver. Move the camera.ko module out from `/lib/modules/6.6.*qli*/camera/` to disable automatic loading and then reboot the device.
# mount -o rw,remount /usr
# mv /lib/modules/6.6.*qli*/camera/camera*.ko /
# reboot
Copy to clipboard
##### Compile and push libcamera utilities
bitbake libcamera
Copy to clipboard
Push the binaries to the device. In the following example, `` is the directory of the Qualcomm software release.
Note
The version number in the ipk file name may be different in your build. Update the following commands as per the version numbers in your build.
scp /build-qcom-wayland/tmp-glibc/deploy/ipk/armv8-2a/libcamera_202105+git0+acf8d028ed-r0_armv8-2a.ipk root@[ip-addr]:/var/cache/camera/
scp /build-qcom-wayland/tmp-glibc/deploy/ipk/armv8-2a/libevent-pthreads-2.1-7_2.1.12-r0_armv8-2a.ipk root@[ip-addr]:/var/cache/camera/
scp /build-qcom-wayland/tmp-glibc/deploy/ipk/armv8-2a/libevent-2.1-7_2.1.12-r0_armv8-2a.ipk root@[ip-addr]:/var/cache/camera/
Copy to clipboard
##### Create a shell connection to the device
Note
Connect to the device console using SSH. See [How To SSH?](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-254/how_to.html#use-ssh) for instructions.
ssh root@[ip-addr]
Copy to clipboard
##### Install libcamera utilities
# mount -o rw,remount /usr
# opkg --nodeps install /var/cache/camera/libcamera_202105+git0+acf8d028ed-r0_armv8-2a.ipk --force-reinstall
# opkg --nodeps install /var/cache/camera/libevent-pthreads-2.1-7_2.1.12-r0_armv8-2a.ipk --force-reinstall
# opkg --nodeps install /var/cache/camera/libevent-2.1-7_2.1.12-r0_armv8-2a.ipk --force-reinstall
Copy to clipboard
##### Load the CamSS module
# modprobe qcom-camss
Copy to clipboard
The IMX412 and qcom-camss modules are in the following paths on the device:
- `/lib/modules/*/kernel/drivers/media/i2c/imx412.ko`
- `/lib/modules/*/kernel/drivers/media/platform/qcom/camss/qcom-camss.ko`
The IMX412 module is loaded by default. Verify the qcom\_camss and IMX412 modules are loaded by running the following lsmod command:
# lsmod | grep qcom_camss
# lsmod | grep imx412
Copy to clipboard
##### Delete uncalibrated.yaml
# rm -rf /usr/share/libcamera/ipa/simple/uncalibrated.yaml
Copy to clipboard
##### Run the cam utility
# cam -c 1 --capture=10 --file='frame-#.raw'
Copy to clipboard
This runs the utility and captures 10 raw frames in the root directory and saves them into files.
Check the console log messages for information about the resolution and format of the dumped images.
Using camera /base/soc@0/cci@ac4b000/i2c-bus@1/camera@1a as cam0 [0:15:01.067615799] [2155] INFO Camera camera.cpp:945 configuring streams:
(0) 4056x3040-SRGGB10_CSI2P
cam0: Capture 10 frames
Copy to clipboard
- *class* tabincludedirective
- Note
Currently there is an issue with V4l2 applications on QCS9075. It will be fixed in next release.
The V4L2 framework within the Linux kernel supports video devices. It provides an API that allows user space applications to interact with devices such as cameras and video capture cards.
More information on V4L2 is available from [kernel.org](https://www.kernel.org/doc/html/v4.9/media/kapi/v4l2-core.html).
Qualcomm supports the V4L2 interface camera ISP driver for raw frame dump functionality in the upstream kernel.

#### CamSS driver
The Qualcomm camera subsystem (CamSS) driver in the upstream kernel implements the V4L2, media controller, and V4L2 subdev interfaces.
Camera sensors using the V4L2 subdev interface in the kernel are supported.
The CamSS driver consists of:
- CSIPHY module – Handles the physical layer of the CSI2 receivers. A separate camera sensor can be connected to each CSIPHY module.
- CSI Decoder (CSID) module – Handles the protocol and application layers of the CSI2 receivers. A CSID can decode a data stream from any CSIPHY.
- Video Front End (VFE) module – Represents the Image Front End (IFE) that contains Raw Dump Interface (RDI) input interfaces that bypass the image processing pipeline. The VFE also contains the AXI bus interface which writes output data to memory.

The CamSS driver implements the V4L2 interface. Each CSIPHY, CSID, and VFE module is represented by a single V4L2 sub-device.
As shown in the following diagram, each CSIPHY can connect to each CSID. Each CSID can connect to each VFE. Each RDI port has an individual video node.

CamSS V4L2 drivers are in `/drivers/media/platform/qcom/camss`. `` is the directory of the Linux kernel.
The following code snippet shows a v4l2\_subdev\_internal\_ops for the CamSS driver.
static const struct v4l2_subdev_internal_ops csiphy_v4l2_internal_ops = {
.open = csiphy_init_formats,
};
…
static const struct v4l2_subdev_internal_ops csid_v4l2_internal_ops = {
.open = csid_init_formats,
};
…
static const struct v4l2_subdev_internal_ops vfe_v4l2_internal_ops = {
.open = vfe_init_formats,
};
Copy to clipboard
The CamSS driver only uses the open interface to initialize the supported formats. It is called when the subdev device node is opened by an application.
The following code snippet shows a `v4l2_subdev_ops` for the CSID module. The CSIPHY and VFE modules have similar `v4l2_subdev_ops`.
static const struct v4l2_subdev_ops csid_v4l2_ops = {
.core = &csid_core_ops,
.video = &csid_video_ops,
.pad = &csid_pad_ops,
};
…
static const struct v4l2_subdev_core_ops csid_core_ops = {
.s_power = csid_set_power,
.subscribe_event = v4l2_ctrl_subdev_subscribe_event,
.unsubscribe_event = v4l2_event_subdev_unsubscribe,
};
static const struct v4l2_subdev_video_ops csid_video_ops = {
.s_stream = csid_set_stream,
};
static const struct v4l2_subdev_pad_ops csid_pad_ops = {
.enum_mbus_code = csid_enum_mbus_code,
.enum_frame_size = csid_enum_frame_size,
.get_fmt = csid_get_format,
.set_fmt = csid_set_format,
};
Copy to clipboard
These interfaces are called by the V4L2 framework or drivers in various contexts (for example, `ioctl`, `setup_link`, `start_streaming`). For example:
v4l2_subdev_call(subdev, pad, get_fmt, NULL, &fmt);``
Copy to clipboard
The following code snippet shows a `media_device_ops` for the CamSS driver and `media_entity_operations` for the CSIPHY, CSID, and VFE modules.
static const struct media_device_ops camss_media_ops = {
.link_notify = v4l2_pipeline_link_notify,
};
…
static const struct media_entity_operations csiphy_media_ops = {
.link_setup = csiphy_link_setup,
.link_validate = v4l2_subdev_link_validate,
};
…
static const struct media_entity_operations csid_media_ops = {
.link_setup = csid_link_setup,
.link_validate = v4l2_subdev_link_validate,
};
…
static const struct media_entity_operations vfe_media_ops = {
.link_setup = vfe_link_setup,
.link_validate = v4l2_subdev_link_validate,
};
Copy to clipboard
`Camss_media_ops` is registered when the CamSS driver is registered (`camss_probe`). The CSIPHY, CSID, and VFE media entity operation. `link_setup` is called in the context of `media_device_setup_link`.
#### V4L2 sample application - Yavta
This section describes how to capture raw frame data using an application that supports the V4L2 interface.
Note
Connect the IMX577 MIPI camera sensor to the CAM1 slot of the RB8 device.
##### Enable CamSS driver
1. Download upstream kernel source code using the following command.
devtool modify linux-qcom-custom
Copy to clipboard
This downloads the kernel source code to `/build-qcom-wayland/workspace/sources/linux-qcom-custom/`.
2. Apply the following change to enable the CamSS driver in the device tree:
/build-qcom-wayland/workspace/sources/linux-qcom-custom/arch/ arm64/boot/dts/qcom/qcs9075-addons-iq-9075-evk.dts
&camss {
- status = “disabled”;
+ status = “okay”;
};
&cci1 {
- status = “disabled”;
+ status = “okay”;
};
Copy to clipboard
3. Edit `/layers/meta-qcom-hwe/recipes-kernel/linux/linux-qcom-custom_6.6.bb` to include the patch from step 2:
SRC_URI:append = " file://camss_enable_change.patch"
Copy to clipboard
4. Build the image following the Yocto build instructions in [Build Guide](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-254/build_addn_info.html).
5. Flash the image following the instructions in [Flash Images](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-254/flash_images.html).
##### Disable the camera module
The camera module cannot coexist with the CamSS driver. Move the `camera.ko` module out from `/lib/modules/6.6.*qli*/camera/` to disable automatic loading and then reboot the device.
# mount -o rw,remount /usr
# mv /lib/modules/6.6.*qli*/camera/camera*.ko /
# reboot
Copy to clipboard
##### Build and push the media controller utility and Yavta application
1. Build Yavta and the media controller.
bitbake yavta
Copy to clipboard
2. Push the binaries to the device. In the following example, `` is the directory of the Qualcomm software release.
Note
The version number in the ipk file name may be different in your build. Update below commands as per the version numbers in your build.
scp /build-qcom-wayland/tmp-glibc/deploy/ipk/armv8-2a/v4l-utils_1.22.1-r0_armv8-2a.ipk root@[ip-addr]:/var/cache/camera/
scp /build-qcom-wayland/tmp-glibc/deploy/ipk/armv8-2a/yavta_0.0-r2_armv8-2a.ipk root@[ip-addr]:/var/cache/camera/
scp /build-qcom-wayland/tmp-glibc/deploy/ipk/armv8-2a/media-ctl_1.22.1-r0_armv8-2a.ipk root@[ip-addr]:/var/cache/camera/
scp /build-qcom-wayland/tmp-glibc/deploy/ipk/armv8-2a/libv4l_1.22.1-r0_armv8-2a.ipk root@[ip-addr]:/var/cache/camera/
Copy to clipboard
##### Create a shell connection to the device
Note
Connect to the device console using SSH. See [How To SSH?](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-254/how_to.html#use-ssh) for instructions.
ssh root@[ip-addr]
Copy to clipboard
##### Install the media-ctl, libv4l, v4l-utils, and yavta packages
# mount -o rw,remount /usr
# opkg --nodeps install /var/cache/camera/media-ctl_1.22.1-r0_armv8-2a.ipk --force-reinstall
# opkg --nodeps install /var/cache/camera/libv4l_1.22.1-r0_armv8-2a.ipk --force-reinstall
# opkg --nodeps install /var/cache/camera/v4l-utils_1.22.1-r0_armv8-2a.ipk --force-reinstall
# opkg --nodeps install /var/cache/camera/yavta_0.0-r2_armv8-2a.ipk --force-reinstall
Copy to clipboard
##### Load the CamSS module
# modprobe qcom-camss
Copy to clipboard
The IMX412 and qcom-camss modules are in the following paths on the device:
- `/lib/modules/*/kernel/drivers/media/i2c/imx412.ko`
- `/lib/modules/*/kernel/drivers/media/platform/qcom/camss/qcom-camss.ko`
The IMX412 module is loaded by default. Verify the qcom\_camss and IMX412 modules are loaded by running the following lsmod command:
# lsmod | grep qcom_camss
# lsmod | grep imx412
Copy to clipboard
##### Check the media node number
Run the following command to print the media device node number for the CamSS driver.
If /dev/media0 does not list the qcom-camss driver, try it with /dev/media1.
# media-ctl -p -d /dev/media1 | grep camss
driver qcom-camss
bus info platform:acaf000.camss
Copy to clipboard
##### Find the sensor name
Run the following command to print the sensor name to the terminal:
# cat /sys/dev/char/81\:*/name | grep imx
imx577 21-001a
Copy to clipboard
##### Configure the media controller
The media controller utility (media-ctrl) is a [V4L2 utility](https://git.linuxtv.org/v4l-utils.git) used to configure camera subsystem subdevices. Use `media-ctl --help` to print usage information.
Note
Replace [x] with the number found via :ref. <Check the media node number>. For example, `# media-ctl -d /dev/media1 --reset`.
1. Reset all links to inactive:
# media-ctl -d /dev/media[x] --reset
Copy to clipboard
2. Configure the camera sensor format and resolution on pipeline nodes:
# media-ctl -d /dev/media[x] -V '"imx577 21-001a":0[fmt:SRGGB10/ 4056x3040 field:none]'
Copy to clipboard
3. Configure CSIPHY with 4056x3040 resolution:
# media-ctl -d /dev/media[x] -V '"msm_csiphy1":0[fmt:SRGGB10/ 4056x3040]'
# media-ctl -d /dev/media[x] -V '"msm_csiphy1":1[fmt: SRGGB10/ 4056x3040]'
Copy to clipboard
4. Configure CSID with 4056x3040 resolution:
# media-ctl -d /dev/media[x] -V '"msm_csid0":0[fmt:SRGGB10/4056x3040] '
# media-ctl -d /dev/media[x] -V '"msm_csid0":1[fmt:SRGGB10/ 4056x3040]'
Copy to clipboard
5. Configure ISP with 3840x2160 resolution:
# media-ctl -d /dev/media[x] -V '"msm_vfe0_rdi0":0[fmt:SRGGB10/ 4056x3040]'
# media-ctl -d /dev/media[x] -V '"msm_vfe0_rdi0":1[fmt: SRGGB10/ 4056x3040]'
Copy to clipboard
6. Link the pipeline:
# media-ctl -d /dev/media[x] -l '"msm_csiphy1":1->"msm_csid0":0[1]'
# media-ctl -d /dev/media[x] -l '"msm_csid0":1->"msm_vfe0_rdi0":0[1]'
Copy to clipboard
##### Capture images
The [Yavta test application](https://git.ideasonboard.org/yavta.git) validates the camera using the V4L2 interface. Run Yavta to capture images:
# yavta -B capture-mplane -c -I -n 5 -f SRGGB10P -s 4056x3040 -F /dev/video0 --capture=5 --file='frame-#.raw'
Copy to clipboard
#### V4L2 sample application - libcamera
libcamera is an open-source software framework. It handles control of the V4L2 camera interface and exposes a native C++ API to upper layers.
The applications and upper-level frameworks run based on the [libcamera framework](https://www.kernel.org/doc/html/v4.9/media/kapi/v4l2-core.html).
See [libcamera architecture](https://libcamera.org/docs.html#libcamera-architecture) for more detail about the libcamera architecture.

libcamera is validated using the [cam utility](https://libcamera.org/getting-started.html#basic-testing-with-cam-utility).
#### Capture raw frame data
The following steps describe how to capture raw frame data with the camera utility app using the V4L2 interface.
Note
Connect the IMX577 MIPI camera sensor to the CAM1 slot of the RB8 device.
##### Enable the CamSS driver
1. Download upstream kernel source code using the following command.
devtool modify linux-qcom-custom
Copy to clipboard
This downloads the kernel source code to `/build-qcom-wayland/workspace/sources/linux-qcom-custom/`.
2. Apply the following change to enable the CamSS driver in the device tree:
/build-qcom-wayland/workspace/sources/linux-qcom-custom/arch/arm64/boot/dts/qcom/qcs9075-addons-iq-9075-evk.dts
&camss {
- status = “disabled”;
+ status = “okay”;
};
&cci1 {
- status = “disabled”;
+ status = “okay”;
};
Copy to clipboard
3. Edit `/layers/meta-qcom-hwe/recipes-kernel/linux/linux-qcom-custom_6.6.bb` to include the patch from step 2:
SRC_URI:append = " file://camss_enable_change.patch"
Copy to clipboard
4. Build the image following the Yocto build command in [Build Guide](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-254/build_addn_info.html).
5. Flash the image following the instructions in [Flash images](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-254/flash_images.html).
##### Disable the camera module
The camera module cannot coexist with the CamSS driver. Move the camera.ko module out from `/lib/modules/6.6.*qli*/camera/` to disable automatic loading and then reboot the device.
# mount -o rw,remount /usr
# mv /lib/modules/6.6.*qli*/camera/camera*.ko /
# reboot
Copy to clipboard
##### Compile and push libcamera utilities
bitbake libcamera
Copy to clipboard
Push the binaries to the device. In the following example, `` is the directory of the Qualcomm software release.
Note
The version number in the ipk file name may be different in your build. Update the following commands as per the version numbers in your build.
scp /build-qcom-wayland/tmp-glibc/deploy/ipk/armv8-2a/libcamera_202105+git0+acf8d028ed-r0_armv8-2a.ipk root@[ip-addr]:/var/cache/camera/
scp /build-qcom-wayland/tmp-glibc/deploy/ipk/armv8-2a/libevent-pthreads-2.1-7_2.1.12-r0_armv8-2a.ipk root@[ip-addr]:/var/cache/camera/
scp /build-qcom-wayland/tmp-glibc/deploy/ipk/armv8-2a/libevent-2.1-7_2.1.12-r0_armv8-2a.ipk root@[ip-addr]:/var/cache/camera/
Copy to clipboard
##### Create a shell connection to the device
Note
Connect to the device console using SSH. See [How To SSH?](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-254/how_to.html#use-ssh) for instructions.
ssh root@[ip-addr]
Copy to clipboard
##### Install libcamera utilities
# mount -o rw,remount /usr
# opkg --nodeps install /var/cache/camera/libcamera_202105+git0+acf8d028ed-r0_armv8-2a.ipk --force-reinstall
# opkg --nodeps install /var/cache/camera/libevent-pthreads-2.1-7_2.1.12-r0_armv8-2a.ipk --force-reinstall
# opkg --nodeps install /var/cache/camera/libevent-2.1-7_2.1.12-r0_armv8-2a.ipk --force-reinstall
Copy to clipboard
##### Load the CamSS module
# modprobe qcom-camss
Copy to clipboard
The IMX412 and qcom-camss modules are in the following paths on the device:
- `/lib/modules/*/kernel/drivers/media/i2c/imx412.ko`
- `/lib/modules/*/kernel/drivers/media/platform/qcom/camss/qcom-camss.ko`
The IMX412 module is loaded by default. Verify the qcom\_camss and IMX412 modules are loaded by running the following lsmod command:
# lsmod | grep qcom_camss
# lsmod | grep imx412
Copy to clipboard
##### Delete uncalibrated.yaml
# rm -rf /usr/share/libcamera/ipa/simple/uncalibrated.yaml
Copy to clipboard
##### Run the cam utility
# cam -c 1 --capture=10 --file='frame-#.raw'
Copy to clipboard
This runs the utility and captures 10 raw frames in the root directory and saves them into files.
Check the console log messages for information about the resolution and format of the dumped images.
Using camera /base/soc@0/cci@ac4b000/i2c-bus@1/camera@1a as cam0 [0:15:01.067615799] [2155] INFO Camera camera.cpp:945 configuring streams:
(0) 4056x3040-SRGGB10_CSI2P
cam0: Capture 10 frames
Copy to clipboard
Note
Not applicable for this chipset.
## USB camera
Qualcomm Linux devices provide driver support for USB web cameras that adhere to the USB video class (UVC) standard.
The UVC video driver exposes these cameras as V4L2 video devices, which can be accessed through the character device nodes such as /dev/videoX.
See [USB camera configuration](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-8/usb.html?) for an USB camera usage.
The sample application [gst-usb-single-camera-app](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-50/usb-camera.html?) can be used for USB camera validation.
## Network camera
A network camera can be supported with the open source GStreamer plugin.
Getting a camera stream from the network depends on the network protocols supported by the GStreamer plugin.
Developers can use an open source GStreamer plugin (for example, rtspsrc) to handle camera streams from the network and create a pipeline as needed.
See [rtspsrc](https://gstreamer.freedesktop.org/documentation/rtsp/rtspsrc.html?gi-language=c) for plugin details.
The sample application [gst-ai-multistream-inference](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-50/multistream-inference.html?) can also be used for network camera validation.
See ‘Bring up ethernet <[https://docs.qualcomm.com/doc/80-70023-26/topic/bring_up-ethernet.html](https://docs.qualcomm.com/doc/80-70023-26/topic/bring_up-ethernet.html)>`\_ for instructions on setting up an ethernet network connection.
For developing a GStreamer application on the Qualcomm platform, see [Qualcomm Intelligent Multimedia SDK](https://docs.qualcomm.com/bundle/publicresource/topics/80-70023-50/overview.html?).
Last Published: Jun 22, 2026
[Previous Topic
Camera overview](https://docs.qualcomm.com/bundle/publicresource/80-70030-17/topics/camera-overview.md) [Next Topic
Enhance camera output](https://docs.qualcomm.com/bundle/publicresource/80-70030-17/topics/enhance-camera-output.md)
Source: [https://docs.qualcomm.com/doc/80-70030-17/topic/stream-cameras.html](https://docs.qualcomm.com/doc/80-70030-17/topic/stream-cameras.html)