qticamsrc is only available in
For more information on QLI images refer to Qualcomm Linux release
qcom-multimedia-proprietary-image For more information on QLI images refer to Qualcomm Linux release
Overview
qticamsrc is a hardware-accelerated GStreamer camera source plugin that provides direct access to Qualcomm’s Camera ISP (Image Signal Processor) capabilities through the camera service. It serves as the primary camera input element in Qualcomm’s GStreamer multimedia stack, enabling applications to acquire live frames from camera hardware and integrate them into multimedia, imaging, and AI processing pipelines.
The plugin exposes Qualcomm camera ISP functionality through a standard GStreamer source interface, allowing applications to capture one or more camera streams in supported output formats while configuring both common capture settings and advanced ISP controls. This enables developers to build pipelines that combine camera acquisition with display, encoding, image capture, or downstream analytics processing.
qticamsrc operates as a client of the camera service, which is responsible for managing the underlying camera Hardware Abstraction Layer (HAL) and coordinating access to camera hardware resources. This client-server design provides a scalable foundation for both multi-client and multi-camera deployments, allowing multiple applications or pipelines to access one or more physical camera devices concurrently, subject to platform capabilities.
The plugin implements a request-pad, multi-output architecture with independently configurable video_%u and image_%u source pads. Each output pad can be configured with its own resolution, pixel format, frame rate, and codec-related settings, allowing a single camera session to produce multiple streams simultaneously. This makes it possible for one camera instance to support concurrent use cases such as:
- live preview,
- high-resolution video recording,
- still-image capture,
- machine learning inference pipelines.
qticamsrc supports multiple output formats to address both video and imaging use cases, including:
- NV12 and NV21,
- Raw Bayer,
- NV12 with UBWC (Universal Bandwidth Compression),
- JPEG output for snapshot capture.
qticamsrc supports multi-camera and multi-client usage models. Multiple plugin instances can be used within the same application to acquire frames from different physical cameras, enabling deployment scenarios such as:
- stereo camera processing,
- side-by-side composition,
- picture-in-picture,
- independent parallel camera streams.
qticamsrc supports dedicated image capture paths with snapshot stream types that include:
- NV12 and NV21,
- Raw Bayer,
- JPEG blob output.
camera service, which centralizes control of the camera HAL and associated ISP resources. This architecture simplifies resource management and enables scalable camera system designs, while the number of concurrently supported cameras and output streams remains dependent on the capabilities of the target Qualcomm chipset and ISP implementation and capabilities.
Typical Usage Patterns
qticamsrc is commonly used in the following scenarios:
Live camera preview
Capturing and streaming YUV frames for real-time display, or forwarding them directly to downstream encoding elements for preview and recording pipelines.Concurrent multi-stream capture
Producing multiple output streams from a single camera session, such as recording video while simultaneously capturing JPEG snapshots, and generating additional streams for AI inference, local storage, or network streaming.High-frame-rate video
Supporting high-frame-rate capture workflows, including pipelines operating above 60 FPS, with super-buffer mode used to reduce per-frame processing overhead in downstream elements.Raw Bayer capture
Acquiring unprocessed sensor data for custom imaging pipelines, computational photography workflows, or computer vision applications that require direct access to raw camera output.Multi-camera and logical-camera workflows
Accessing frames from multiple physical sensors, or working with coordinated camera configurations, for use cases such as stereo imaging, synchronized capture, and composite camera solutions.Still-image capture
Triggering single-shot or burst image capture workflows through GStreamer signals, with support for JPEG and RAW-based snapshot paths depending on platform configuration.Element Hierarchy
Hierarchy
GObjectGstObject
GstElement
qticamsrc
Pad Templates
qticamsrc uses request pads — pads are not present by default and must be explicitly requested before the pipeline transitions to READY.
Video Source Pad Template (video_%u)
Image Source Pad Template (image_%u)
Format availability is determined at runtime from camera static metadata. Resolution ranges and maximum framerate are also dynamically populated from camera static metadata at plugin load time.
Element Properties
Core Camera Properties
Image Quality Properties (changeable in PLAYING)
3A (Auto-Exposure, Auto-White-Balance, Auto-Focus) Properties
Scene and Effect Properties
Advanced ISP / Hardware Properties
Zoom Properties
Frame Rate Control
Metadata Properties
MultiCamera Properties
Operation Mode and ROI
Pad Activation Mode
Video Pad Properties (video_%u)
These properties are set on individual video pads using the GstChildProxy interface (e.g., src.video_0::framerate=60).
Image Pad Properties (image_%u)
Signals
qticamsrc exposes the following GObject signals for programmatic control of image capture and pipeline events.Action Signals (callable via g_signal_emit_by_name)
Notification Signals (emitted by the element)
Camera Event Handling
qticamsrc handles camera service events internally and propagates them as GStreamer element messages and signals:
Internal Architecture Details
qticamsrc is built around a client-server camera architecture in which the GStreamer element acts as a client of the camera service. The camera service manages the underlying camera HAL, stream creation, buffer allocation, and capture control, while qticamsrc exposes those capabilities to the GStreamer pipeline through source pads, camera properties, and control signals.
At a high level, the element:
- opens and configures the selected camera device
- creates and manages video and image output streams
- receives captured frames from the
camera service - wraps camera buffers as
GstBufferobjects - pushes those buffers downstream through the corresponding source pads
- returns buffers to the camera service when downstream processing is complete
qticamsrc to provide zero-copy camera output while keeping ownership of camera buffers and stream resources in the service layer.
Core Internal Components
qticamsrc is organized around four main internal components:
GstQmmfContext — camera session manager
A C++ wrapper around the camera service API. It is the primary interface between the plugin and the camera service, and is responsible for camera open and close operations, stream creation and deletion, image capture requests, translation of plugin properties into camera metadata, and per-frame metadata synchronization.
GstQmmfSrcVideoPad — video output pad implementation
A custom pad implementation used for each video_%u source pad. Each video pad owns its own queue, worker thread, and reusable buffer pool. Frames received from the camera service are queued per pad and then pushed downstream asynchronously.
GstQmmfSrcImagePad — image capture pad implementation
A pad implementation used for each image_%u source pad. It is similar in structure to the video pad implementation, but is used for still-image capture workflows rather than continuous video streaming.
GstQmmfBufferPool — reusable buffer wrapper pool
A lightweight buffer pool used to reuse GstBuffer wrapper objects. The pool does not allocate camera memory itself; instead, it provides reusable GstBuffer shells that are populated with camera-provided DMA-backed memory when frames arrive.
Plugin State Management
The operation ofqticamsrc is closely tied to normal GStreamer state transitions.
NULL → READY
The element opens and initializes the camera device selected by the camera property.
READY → PAUSED
The negotiated pad capabilities are translated into camera stream configuration, and the required streams are prepared through the camera service.
PAUSED → PLAYING
The prepared streams are activated. For video pads, capture requests are submitted and frame delivery begins.
This state-driven design ensures that camera initialization, stream setup, and frame acquisition are aligned with the pipeline lifecycle.
Stream Types
qticamsrc supports two stream types: video streams and image streams.
Video Pads
Video pads (video_%u) produce a continuous stream of buffers at the negotiated frame rate. They are typically used for:
- preview
- video encoding
- display
- streaming
- AI inference
camera service selects an appropriate internal buffer count based on stream properties such as resolution, format, and frame rate. If additional buffering is required, it can be requested through the extra-buffers property.
Video orientation can be adjusted in 90-degree increments through the rotate property.
For high-frame-rate operation, when the negotiated frame rate is 60 FPS or higher, the stream enters HFR mode. In this mode, the super-buffer-mode property becomes available. When enabled, a single GstBuffer may contain multiple captured frames. The number of frames per buffer is computed as:
For example, at 120 FPS, each output buffer contains 2 frames.
By default, video pads begin streaming automatically when the element enters the PLAYING state. This behavior can be changed through video-pads-activation-mode. When configured for signal-based activation, streaming starts and stops only when controlled explicitly through the video-pads-activation signal.
Image Pads
Image pads (image_%u) are used for on-demand image capture. Unlike video pads, they do not stream continuously. Image capture is triggered by the application through the capture-image signal, which specifies:
- the image type
- the number of images to capture
- optional camera metadata
cancel-capture signal.
Image orientation can also be adjusted in 90-degree increments through the rotate property.
The number of simultaneously supported image pads is platform-dependent. All supported platforms allow multiple video pads, while support for multiple image pads depends on chipset capability.
Buffer Handling and Data Flow
When a frame is received from the camera service,qticamsrc obtains a reusable GstBuffer wrapper from the corresponding pad’s GstQmmfBufferPool. The incoming camera buffer is then wrapped as GstFdMemory, and the resulting GstBuffer is queued on the target pad.
Each source pad has its own internal queue and worker thread. The worker thread dequeues buffers and pushes them downstream through the connected GStreamer pad.
This design separates:
- camera callback handling
- buffer wrapping
- downstream
gst_pad_push()execution
qticamsrc are DMA-backed file-descriptor buffers, making them compatible with zero-copy downstream processing when the rest of the pipeline supports FD-backed memory.
Output Buffer Pool Behavior
Each video pad and image pad owns a dedicatedGstQmmfBufferPool. This pool is used only to reuse GstBuffer wrapper objects and reduce the overhead of repeatedly creating and destroying GStreamer buffers.
The pool behaves as follows:
- it maintains a small number of reusable GstBuffer shells
- it does not allocate the actual camera frame memory
- frame memory is attached later when a capture callback is received
- when a buffer is returned to the pool, the wrapper is cleaned by removing attached memory and auxiliary data before reuse
DMA Buffer Lifecycle
The actual frame buffers are allocated and owned by camera service, not byqticamsrc plugin.
When a frame arrives:
- the camera-provided file descriptor is wrapped as
GstFdMemory - the memory is marked with
GST_FD_MEMORY_FLAG_DONT_CLOSE - GStreamer is therefore prevented from closing the underlying file descriptor
- a cleanup callback reconstructs the information needed to identify the original camera buffer
- the buffer is returned to the camera service
- any associated metadata references are released
Metadata Handling
qticamsrc supports attachment of camera metadata to captured frames. When metadata attachment is enabled for a video pad, per-frame camera metadata is matched to the corresponding frame using timestamps before the buffer is pushed downstream.
The element also exposes a range of camera-control properties that map to underlying camera metadata settings, including controls for tuning and capture behavior. These settings provide a GStreamer-facing interface for configuring standard camera parameters and Qualcomm-specific camera features.
Camera Selection and Multi-Instance Behavior
The camera device used by aqticamsrc instance is selected through the camera property. If no camera is specified, the element uses the first detected sensor by default.
Under normal operation, multiple instances of qticamsrc cannot open the same camera ID at the same time. An exception exists through slave mode:
- a primary instance owns the camera and controls its configuration and lifetime
- a secondary instance can access the same camera by enabling the
slaveproperty
- change camera tuning parameters
- modify camera settings
- control camera lifetime
Multi-Camera and Multi-Client Operation
qticamsrc also supports multi-camera workflows, where each plugin instance corresponds to a single physical camera device. This allows applications to instantiate multiple qticamsrc elements to access and process streams from multiple cameras concurrently. For example, a dual-camera configuration can be implemented by creating two separate plugin instances, one for each physical camera. The maximum number of cameras that can be used simultaneously is determined by the hardware capabilities of the target Qualcomm chipset and its ISP capabilities.
Usage
1
Copy files to device
2
Connect to device
Live Camera Preview
This example demonstrates a live camera preview pipeline that captures 1080p frames from the ISP camera usingqticamsrc and renders them to the display using the waylandsink plugin.
Live Camera Preview and Image Capture
This example demonstrates live snapshot capture while a live preview stream continues to run in parallel. Thegst-pipeline-app application is used to trigger the capture signal while the preview pipeline remains active.
Two Streams Use Case
This example demonstrates simultaneous capture of two output streams from the camera source plugin. Both streams are processed in parallel, encoded independently, and then muxed into MP4 output.
Three Stream Use Case
This example demonstrates simultaneous camera capture for three parallel streams: a live preview stream, a 1080p H.264 recording stream muxed into an MP4 file, and a periodic JPEG snapshot capture stream.
Dual Camera Use Case
This example demonstrates a dual-camera pipeline in which each camera produces two output streams. One stream from each camera is composited side-by-side for live display, while the second stream from each camera is encoded independently and saved as an MP4 file.

