# Camera Inputs

Add and tune camera or video inputs in Oden Streamer.

Last validated: 2026-05-05

Camera inputs are configured on video entities in Oden Streamer. Use this page when you need to add a camera, choose the correct input type, or tune the capture settings before configuring encoding and network output.

## Choose an input type

Pick the input type from the source you need to receive. Some entries are only shown when the current Oden build includes the required feature or SDK.

| Task | Input type in Oden | Use when | Key settings |
| --- | --- | --- | --- |
| Receive an IP camera | RTSP | The camera exposes an `rtsp://` stream and hardware decoding is available. | `URL`, `Codec`, `Username`, `Password` |
| Receive RTP video | RTP | A sender transmits H.264, H.265, or MJPEG over UDP to Oden. | `Port`, `Codec` |
| Use a custom GStreamer pipeline | GStreamer Pipeline | You already know the GStreamer source pipeline or need a source not covered by a simpler input. | `Pipeline`, `HW Decode`, `Codec`, `Sync On Sink` |
| Receive SRT | SRT | A sender uses SRT and the build includes GStreamer SRT support. | SRT connection settings, `HW Decode`, `Codec`, pipeline latency |
| Use a USB webcam on Linux | V4L2 | The camera appears as a Video4Linux2 device. | `Device`, `Pixel Format`, `Resolution`, `Frame Rate`, `Controls` |
| Use a Windows capture device | Direct Show | The camera or capture card is exposed through Windows DirectShow. | `Device Name`, `Resolution`, `Pixel Format`, `Capture Rate`, `Frame Rate` |
| Use FLIR or Point Grey cameras | FLIR (Spinnaker) | The camera is supported by the Spinnaker SDK. | `Device`, `Resolution`, `Pixel Format`, `Auto Frame Rate`, exposure, gain, white balance |
| Use GigE Vision cameras | GigE | The camera is discovered on the network as a GigE Vision device. | Camera selection, pixel format, access mode, capture type, GenICam settings |
| Use USB3 Vision cameras | USB3 | The camera is a USB3 Vision device and the internal USB3 capture feature is available. | `Allow Slow Cameras`, camera selection, GenICam settings |
| Use Lucid Arena cameras | Lucid (Arena) | The camera is supported by Lucid Arena. | `Auto Reconnect`, device or `IP`, size, pixel format, frame rate, exposure |
| Use IDS cameras | IDS | The build includes IDS support. | Camera serial, capture rate, exposure, gain, white balance, AOI |
| Use Jetson CSI cameras | Argus | The streamer runs on NVIDIA Jetson with Argus support. | `Camera`, `Mode`, exposure, gain, AWB, denoise, edge enhance, camera crop |
| Capture the desktop | Display Capture | You need a monitor or application output as a video source. | `Cursor`, `Monitor` |
| Use a generated placeholder | Test Source | You need a known signal while configuring layouts or encoders. | `Resolution`, `Pattern` |
| Use an image as video | Image | You need a static `.png`, `.jpg`, or `.jpeg` source. | Image file |
| Reuse another Oden video stream | Clone Stream | Another entity already receives the source and you want to display or process it again. | `Follow Video`, `Focus Region`, sync settings, `Copy To Texture`, hard crop |
| Receive NDI | NDI | The source is published on the network with NDI. | `Source`, `Quality` |
| Receive Spout on Windows | Spout | Another Windows application shares a GPU texture through Spout. | `Source`, `Use Alpha Channel`, `Log Spout Messages` |
| Play a file or URL through FFmpeg | File, HLS, RTMP, or FFmpeg | The source is a media file, HLS playlist, RTMP stream, or custom FFmpeg input. | `URL`, `Input Format`, `HW Acceleration`, `Live Source`, `Loop`, `Auto Start` |
| Use a plugin capture | Plugin video capture | A loaded Oden plugin registers its own video capture type. | Plugin-defined options |

## Add an input

1.  Open the video entity that should receive the camera.
    
2.  Expand **Input** or **Inputs**.
    
3.  If the entity has no input, select **Add Input**.
    
4.  In **Type**, choose the source type from the table above.
    
5.  Configure the source-specific fields.
    
6.  Start the input if it has a **Start** button.
    
7.  Confirm that **Texture** shows a live preview and that the input header reports the expected resolution and frame rate.
    
8.  Set **Id** to a stable, meaningful name and color.
    

> **TIP**
> Keep input names consistent with the physical camera layout, for example `front_left`, `front_center`, and `rear`. This makes later camera-rig, crop, and stream troubleshooting easier.

## Configure common input behavior

Every active video input can show a texture preview. Hover the preview for a larger view, or pop it out if you need to inspect focus or exposure while changing settings.

Most input types also expose image-transfer, crop, vignetting, delay, and visibility controls after the capture-specific fields. Use those controls after the camera is receiving frames.

-   Use **Delay** only to align inputs that are consistently offset from each other.
    
-   Use **Crop** or **Crop and Vignetting** for display and calibration adjustments.
    
-   Use **Save texture** when you need a still image for support, calibration checks, or documentation.
    
-   Use **Visible In Eye** only for stereo setups where a source should appear in one eye.
    

## Configure network cameras

### RTSP

Use **RTSP** for IP cameras that expose a direct RTSP URL.

1.  Set **Type** to **RTSP**.
    
2.  Set **Codec** to match the camera stream.
    
3.  Enter the stream **URL**, for example `rtsp://192.168.0.20:8554/live`.
    
4.  Enter **Username** and **Password** if the camera requires credentials.
    
5.  Enable or disable video and audio receive options when the build exposes separate controls for them.
    
6.  Select **Start**.
    

If the stream does not start, verify the codec first. The dedicated RTSP and RTP inputs are NVDEC-based in the code, so they are only available in builds with the NVIDIA decode path enabled. When using the GStreamer RTSP path, use **Convert To Raw GStreamer Pipeline** after the simple RTSP setup works if you need to inspect or customize the generated pipeline.

### RTP

Use **RTP** when another process sends encoded video directly to a UDP port.

1.  Set **Type** to **RTP**.
    
2.  Select the incoming **Codec**.
    
3.  Set **Port** to the UDP port used by the sender.
    
4.  Select **Start**.
    

If you need RTP with a GStreamer mux, choose **RTP (GStreamer)** instead and set **Listen Port**, **Codec**, and **Mux**.

### GStreamer Pipeline

Use **GStreamer Pipeline** when you need full control over the receive pipeline. Oden sends the pipeline into `odenvideosink`; you can include `! odenvideosink processing-deadline=0` yourself or let Oden append it.

1.  Set **Type** to **GStreamer Pipeline**.
    
2.  Enter the source pipeline in **Pipeline**.
    
3.  Enable **HW Decode** only when the pipeline receives encoded video that should be decoded by Oden.
    
4.  Set **Codec** when **HW Decode** is enabled.
    
5.  Open **Advanced** if you need startup coordination or sink timing.
    
6.  Select **Start**.
    

Use **Exclusive Start** when several pipelines compete for camera, decoder, or network resources during project load. Lower **Exclusive Start Priority** values start earlier, and **Exclusive Start Duration** controls the spacing between starts.

For live sources, keep **Sync On Sink** disabled unless you need the GStreamer timestamps to control presentation. For prerecorded or buffered sources, enabling **Sync On Sink** can make playback timing more stable.

You can also use GStreamer when a camera feed must be shared with another process before it enters Oden. On Jetson, use zero-copy IPC when available so the camera frames stay in GPU memory. For example, a camera process can publish frames through `nvunixfdsink`, and Oden Streamer can receive them through a GStreamer Pipeline input using `nvunixfdsrc`. On JetPack 5, the `nvunixfd` plugin is bundled with the Streamer installer. On JetPack 6 and newer, install DeepStream or build `voysys/nvunixfd` and place the plugin `.so` in the GStreamer plugin path.

```shell
gst-launch-1.0 -e -v videotestsrc is-live=true pattern=smpte ! \
  video/x-raw,format=NV12,width=1280,height=720,framerate=30/1 ! \
  nvvidconv ! \
  "video/x-raw(memory:NVMM),format=UYVY,width=1280,height=720,framerate=30/1" ! \
  nvunixfdsink socket-path=/tmp/nvunixfd.sock
```

```shell
nvunixfdsrc socket-path=/tmp/nvunixfd.sock buffer-timestamp-copy=true ! \
  video/x-raw(memory:NVMM),format=UYVY,width=1280,height=720,framerate=30/1
```

Disable `HW Decode` for this pipeline because the data is raw GPU memory, not encoded video.

On JetPack 6 and newer, the source build path is:

```shell
git clone https://github.com/voysys/nvunixfd.git
cd nvunixfd
make
sudo cp ./*.so /usr/lib/aarch64-linux-gnu/gstreamer-1.0/
```

If the Streamer runs in Docker, the same GStreamer plugin must be available inside the container. Bake it into the image or mount the `.so` from the host.

ROS and ROS 2 can work for proof-of-concept testing, but they add latency and Oden does not ship built-in ROS capture support. Avoid ROS as the production video path unless the added latency has been accepted for the deployment.

### SRT

Use **SRT** when the camera or gateway sends SRT through GStreamer. Set the SRT connection mode and address fields, choose the codec, and start the input. In **Advanced**, increase **Pipeline Latency** if the connection is unstable.

## Configure local capture devices

### V4L2 on Linux

1.  Set **Type** to **V4L2**.
    
2.  Select the **Device**.
    
3.  Select **Pixel Format**.
    
4.  Select or enter **Resolution**.
    
5.  Select or enter **Frame Rate**.
    
6.  Select **Start**.
    

Use **Advanced** when the device needs non-default open behavior:

-   **Blocking Mode** waits for frames and can help cameras that fail with non-blocking reads.
    
-   **Retry Until Success** keeps trying to connect when the camera may not be ready at startup.
    
-   **Use Custom Path** lets you enter a path such as `/dev/v4l/by-id/<device>` or another V4L2 node.
    
-   **Enable Timeouts** and **Max Timeouts** control how many read timeouts are tolerated before the capture stops.
    

After the input starts, open **Controls** to tune camera-specific V4L2 controls such as exposure, brightness, contrast, or menu selections. Use **Reset All Settings** if the camera controls need to return to their defaults.

### Direct Show on Windows

1.  Set **Type** to **Direct Show**.
    
2.  Select **Device Name**.
    
3.  Select **Resolution**.
    
4.  Select **Pixel Format**.
    
5.  Select the available **Capture Rate** range.
    
6.  Set **Frame Rate** when the selected range allows it.
    
7.  Leave **Retry** enabled if the device may disconnect and reconnect.
    

Use **Rescan Devices** after plugging in a new capture device. Use **Rescan And Show All Devices** only when a device is hidden by the recommended-device filter.

> **NOTE**
> If Oden has a dedicated input for a source, prefer that over Direct Show. The Direct Show UI explicitly warns against using it for sources such as NDI and DeckLink when a better dedicated path exists.

## Configure industrial cameras

### FLIR (Spinnaker)

1.  Set **Type** to **FLIR (Spinnaker)**.
    
2.  Enable **Try to Reconnect** if the camera may be unplugged or powered late.
    
3.  Select **Rescan Devices** or **Rescan Devices and Interfaces** if the camera is missing.
    
4.  Select **Device**.
    
5.  Select **Resolution** or enable **Custom Resolution** and set **Width** and **Height**.
    
6.  Select **Pixel Format**.
    
7.  Use **Auto Frame Rate** unless you need to force a lower rate.
    
8.  Select **Start**.
    

Use **Advanced** for sensor tuning:

-   **Center Image**, **Offset X**, and **Offset Y** control where a reduced image area is read from the sensor.
    
-   **Binning** reduces transmitted data while using a larger part of the sensor.
    
-   **Auto Exposure**, **Exposure Time**, **Gain**, and **Auto Exposure Limits** control brightness and frame-rate behavior.
    
-   **Auto WB**, **Red Balance**, and **Blue Balance** control white balance.
    
-   **Buffer Count** should normally stay at its default unless support asks you to change it.
    
-   **Reset on Startup** and **Reset Camera** are recovery tools for cameras stuck in a bad state.
    

### GigE Vision

1.  Set **Type** to **GigE**.
    
2.  Select the discovered camera.
    
3.  Select the pixel format and start the input.
    
4.  Open **Network Settings** when packet loss, multicast, or adapter selection needs tuning.
    

Important GigE settings:

-   **Access Mode** controls whether Oden opens the camera exclusively or monitors an existing stream.
    
-   **Multicast Interface IP** selects the local interface for multicast.
    
-   **Capture Type** chooses the packet capture backend: socket, pcap, or Oden filter driver when available.
    
-   **Restart On Stall** lets Oden reconnect when frame delivery stops.
    
-   **Frame Completion** controls how incomplete frames are handled.
    
-   **Camera Settings** exposes GenICam controls and a device reset command.
    

### USB3 Vision

Use **USB3** for USB3 Vision devices in internal builds that include USB3 capture. Install UsbDk on Windows if Oden reports that it is missing. Select the camera, configure GenICam settings, and start the input. Enable **Allow Slow Cameras** only for devices that cannot meet the expected USB3 throughput.

### Lucid (Arena)

1.  Set **Type** to **Lucid (Arena)**.
    
2.  Leave **Auto Reconnect** enabled for deployed systems.
    
3.  Select **Rescan Devices** if the camera is missing.
    
4.  Select a discovered device or enter the camera **IP**.
    
5.  Set **Width** and **Height**.
    
6.  Select **Pixel Format**.
    
7.  Use **Auto Frame Rate** or set **Frame Rate** manually.
    
8.  Open **Advanced** for offsets, exposure, gain, white balance, and buffer count.
    
9.  Select **Start**.
    

### Argus on Jetson

Use **Argus** for NVIDIA Jetson camera modules. Select the **Camera**, select the sensor **Mode**, and start the input. After the camera starts, tune auto exposure, exposure time, analog and digital gain, exposure compensation, AWB mode, white-balance gain, saturation, optical black, antibanding, denoise, and edge enhance as needed. Use **Camera Crop** before start when the sensor mode supports cropping.

## Configure utility inputs

### Clone Stream

Use **Clone Stream** when one source needs to be reused in another entity. Select the source in **Follow Video**.

Enable **Focus Region** when the clone should expose a smaller focus area for packing or monitoring. Enable **Copy To Texture** when you need independent filtering or hard crop on the clone. Without **Copy To Texture**, the clone uses the original source texture. Use **Hard Crop** only when the clone should produce a physically cropped texture instead of only reporting a focus region.

### Display Capture

Use **Display Capture** to capture a monitor. On Windows, **Cursor** controls whether the pointer is included and **Monitor** selects the display. On Linux, Oden uses an X11 GStreamer capture pipeline.

### Test Source

Use **Test Source** to verify layout, packing, encoding, and network output before connecting real cameras. Set **Resolution** and **Pattern**. Some static patterns can trigger drop detection, so disable drop-sensitive checks when intentionally using a static pattern.

Use **Encoder Test** when you need a harder-to-encode generated source. It renders a colorful noise-based sphere and exposes settings such as noise amount, noise frequency, and animation speed. The extra detail is useful when checking encoder quality, bitrate control, and packet-loss behavior.

### Image

Use **Image** for static visual checks. Select a `.png`, `.jpg`, or `.jpeg` file. Alpha is supported for formats that carry transparency.

### File, HLS, RTMP, and FFmpeg

Use the FFmpeg-backed inputs for prerecorded files, HLS playlists, RTMP streams, or custom FFmpeg input strings. Set `URL` to the file path or stream URL, set `Input Format` when auto-detection is not enough, and choose hardware acceleration only when the deployed GPU and driver have been validated. Enable `Live Source` for sources that should be treated as realtime. Enable `Loop` for prerecorded files used as repeatable tests. Enable `Auto Start` when the source should start as soon as the project opens.

### NDI and Spout

Use **NDI** for network NDI sources. Select the source and set **Quality**.

Use **Spout** on Windows for GPU texture sharing from another application. Select **Source**, then set **Use Alpha Channel** and **Log Spout Messages** only when needed. Open **Info** to inspect whether the transfer path stays on the GPU or goes through CPU memory. Spout is a same-machine Windows GPU sharing path, so validate that the sending application and Oden run on the same GPU when avoiding CPU copies matters.

## Project-file names

In `.vproj` files, the input backend is stored in the `capture` group as `impl`. The value is the snake\_case form of the C++ input enum.

| Oden UI name | `.vproj` `impl` | Notes |
| --- | --- | --- |
| No Input | `unspecified` |  |
| GStreamer Pipeline, RTP (GStreamer), RTSP (GStreamer), SRT, Display Capture, Test Source | `gstreamer` | The subtype is stored in `gui_settings.type` as `pipeline`, `rtp`, `rtsp`, `srt`, `screencap`, or `video_test_src`. |
| RTSP | `rtsp` | Dedicated NVDEC-based RTSP input. |
| RTP | `rtp` | Dedicated NVDEC-based RTP input. |
| FFmpeg, File, HLS, RTMP | `ffmpeg` | The subtype is selected by `input_format` and related FFmpeg settings. |
| V4L2 | `v4l2` | Linux only. |
| Direct Show | `dshow` | Windows only. |
| FLIR (Spinnaker) | `spinnaker` |  |
| GigE | `gig_e` |  |
| USB3 | `usb3` | Internal USB3 capture builds only. |
| Lucid (Arena) | `lucid` |  |
| IDS | `ids` |  |
| Argus | `argus` | Jetson only. |
| Clone Stream | `clone` |  |
| NDI | `ndi` |  |
| Spout | `spout` | Windows only. |
| Image | `image` |  |
| Encoder Test | `encoder_test` |  |
| OpenVR | `open_vr` |  |
| Plugin video capture | `plugin` | Uses plugin `type_id`, `type_name`, and plugin-defined options. |

```libconfig
capture : {
    impl : "gstreamer";
    pipeline : "videotestsrc is-live=true ! video/x-raw,width=1280,height=720,framerate=30/1";
    use_nvdec : false;
};
```

Prefer changing inputs in the Oden UI when possible. When editing `.vproj` files directly, keep the `impl` value, subtype fields, stream width, stream height, and codec settings consistent with the selected source.

## Troubleshoot an input

Use this checklist when an input does not show a live texture.

1.  Confirm the input type is available in the current build. If a build does not include the required feature or SDK, Oden replaces the invalid input with **No Input**.
    
2.  Confirm the camera is visible to the operating system or SDK. Use **Rescan Devices** where available.
    
3.  Confirm codec and pixel format. For encoded network sources, a codec mismatch is a common reason for a black or missing texture.
    
4.  Lower the resolution or frame rate. This helps isolate bandwidth, USB, decoder, or camera exposure limits.
    
5.  Check whether the source is live before Oden starts. Use reconnect settings such as **Retry**, **Retry Until Success**, **Try to Reconnect**, or **Auto Reconnect** for deployed systems.
    
6.  For GStreamer, convert a simplified input to a raw pipeline only after it works. Then inspect or modify the generated pipeline.
    
7.  Save a texture once frames arrive. Use that still image to verify orientation, crop, exposure, and calibration outside the live system.
