# qtivcomposer
Source: [https://docs.qualcomm.com/doc/80-70014-50/topic/qtivcomposer.html](https://docs.qualcomm.com/doc/80-70014-50/topic/qtivcomposer.html)
The qtivcomposer plugin uses the GPU hardware to merge/mix multiple input video
streams into single output stream.
The composition of the input buffers (for each stream) within the output buffer is
determined by the pad properties.
The table lists some of the common pad properties of qtivcomposer. For more
information, see [Table : Pad properties of qtivcomposer](https://docs.qualcomm.com/doc/80-70014-50/topic/qtivcomposer.html#qtivcomposer__table_hzl_mcn_myb).
| Property | Usage |
| --- | --- |
| Position | Sets the X and Y axes placement of each input frame within the
output. |
| Crop | Sets the optional crop for the source. |
| Dimensions | Upscales/downscales the frames. |
| Rotate | Rotates the frames at right angles |
|
- Flip-horizontal
- Flip-vertical
| Flips the frames horizontally and vertically. |
| Alpha | Adds the alpha blending value to the frames. |
| Z order | Changes the order of the frames.
By default, the frames are
organized in the order in which the sink pads are created. For
example, sink\_0, and sink\_1. |
The figure shows the GStreamer pipeline using qtivcomposer that is working with multiple
video sources.
Figure : Pipeline with qtivcomposer

The video compositions include, but are not limited to the following:
- Picture-in-picture
- Side-by-side
- Alpha blending
If no composition parameters and dimensions are not specified in the [GstCaps](https://gstreamer.freedesktop.org/documentation/gstreamer/gstcaps.html) source pad, the output video frames
will have the same dimensions as the biggest incoming video stream.
Similarly, if frame rate is not set in GstCaps, it is taken from the stream with highest
frame rate. And if output GstCaps does not have an explicitly set format, the plugin
negotiates the most common format based on the input streams.
The plugin uses Qualcomm IB2C library or Qualcomm^®^ Computer Vision SDK library
for all the composition operations. This library is wrapped inside the custom
GstGlesVideoConverter or GstFcvVideoConverter abstraction layer with APIs to create,
configure, and process the incoming and outgoing buffers. The recommended plugin is
GstGLESVideoConverter.
The output buffers are allocated by a custom buffer pool class called GstImageBufferPool,
which can allocate either GBM or ION buffers depending on the negotiated capabilities
between this and downstream plugins.
- The GBM allocation is done through the QTI libgbm.
- The ION allocation is done through IOCTL commands to the kernel.
## Inheritance chain
[GObject](https://docs.gtk.org/gobject/) → [GstObject](https://gstreamer.freedesktop.org/documentation/gstreamer/gstobject.html?gi-language=c) → [GstElement](https://gstreamer.freedesktop.org/documentation/gstreamer/gstelement.html?gi-language=c) → [GstAggregator](https://gstreamer.freedesktop.org/documentation/base/gstaggregator.html?gi-language=c) → GstVideoComposer
The following tables provide information on pad templates and element properties of
qtivcomposer. For use cases, see [Video composition use cases](https://docs.qualcomm.com/doc/80-70014-50/topic/video-composition.html).
## Pad configuration
| Pad Name | Capabilities | Capabilities | Capabilities |
| --- | --- | --- | --- |
| SINK template: 'sink\_%u'
- Availability: On request
- Direction: sink
| video/x-raw | format: | { (string)NV12, (string)NV21, (string)UYVY, (string)YUY2,
(string)RGBA, (string)BGRA, (string)ARGB, (string)ABGR,
(string)RGBx, (string)BGRx, (string)xRGB, (string)xBGR, (string)RGB,
(string)BGR, (string)GRAY8 } |
| SINK template: 'sink\_%u'
- Availability: On request
- Direction: sink
| video/x-raw | width: | [ 1, 32767 ] |
| SINK template: 'sink\_%u'
- Availability: On request
- Direction: sink
| video/x-raw | height: | [ 1, 32767 ] |
| SINK template: 'sink\_%u'
- Availability: On request
- Direction: sink
| video/x-raw | framerate: | [ 0/1, 255/1 ] |
| SINK template: 'sink\_%u'
- Availability: On request
- Direction: sink
| video/x-raw(memory:GBM) | format: | { (string)NV12, (string)NV21, (string)UYVY, (string)YUY2,
(string)RGBA, (string)BGRA, (string)ARGB, (string)ABGR,
(string)RGBx, (string)BGRx, (string)xRGB, (string)xBGR, (string)RGB,
(string)BGR, (string)GRAY8 } |
| SINK template: 'sink\_%u'
- Availability: On request
- Direction: sink
| video/x-raw(memory:GBM) | width: | [ 1, 32767 ] |
| SINK template: 'sink\_%u'
- Availability: On request
- Direction: sink
| video/x-raw(memory:GBM) | height: | [ 1, 32767 ] |
| SINK template: 'sink\_%u'
- Availability: On request
- Direction: sink
| video/x-raw(memory:GBM) | framerate: | [ 0/1, 255/1 ] |
| SRC template: 'src'
- Availability: Always
- Direction: source
| video/x-raw | format: | { (string)NV12, (string)NV21, (string)UYVY, (string)YUY2,
(string)RGBA, (string)BGRA, (string)ARGB, (string)ABGR,
(string)RGBx, (string)BGRx, (string)xRGB, (string)xBGR, (string)RGB,
(string)BGR, (string)GRAY8 } |
| SRC template: 'src'
- Availability: Always
- Direction: source
| video/x-raw | width: | [ 1, 32767 ] |
| SRC template: 'src'
- Availability: Always
- Direction: source
| video/x-raw | height: | [ 1, 32767 ] |
| SRC template: 'src'
- Availability: Always
- Direction: source
| video/x-raw | framerate: | [ 0/1, 255/1 ] |
| SRC template: 'src'
- Availability: Always
- Direction: source
| video/x-raw(memory:GBM) | format: | { (string)NV12, (string)NV21, (string)UYVY, (string)YUY2,
(string)RGBA, (string)BGRA, (string)ARGB, (string)ABGR,
(string)RGBx, (string)BGRx, (string)xRGB, (string)xBGR, (string)RGB,
(string)BGR, (string)GRAY8 } |
| SRC template: 'src'
- Availability: Always
- Direction: source
| video/x-raw(memory:GBM) | width: | [ 1, 32767 ] |
| SRC template: 'src'
- Availability: Always
- Direction: source
| video/x-raw(memory:GBM) | height: | [ 1, 32767 ] |
| SRC template: 'src'
- Availability: Always
- Direction: source
| video/x-raw(memory:GBM) | framerate: | [ 0/1, 255/1 ] |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| | | | |
| Pad | Property | Description |
| --- | --- | --- |
| 'sink\_%u' | zorder | Z axis order, the default is the order of creation
- flags: readable, writable, changeable in NULL, READY, PAUSED
or PLAYING state, 0x40000000
- Integer. Range: -1 - 2147483647 Default: -1
|
| 'sink\_%u' | crop | The crop rectangle ('<X, Y, WIDTH, HEIGHT >')
- flags: readable, writable, changeable in NULL, READY, PAUSED
or PLAYING state, 0x40000000
- GstValueArray of GValues of type "gint"
|
| 'sink\_%u' | position | The X and Y coordinates of the destination rectangle top left
corner ('<X, Y>')
- flags: readable, writable, changeable in NULL, READY, PAUSED
or PLAYING state, 0x40000000
- GstValueArray of GValues of type "gint"
|
| 'sink\_%u' | dimensions | The destination rectangle width and height, if left as '0' they
will be the same as input dimensions ('<WIDTH, HEIGHT>')
- flags: readable, writable, changeable in NULL, READY, PAUSED
or PLAYING state, 0x40000000
- GstValueArray of GValues of type "gint"
|
| 'sink\_%u' | alpha | Alpha channel value
- flags: readable, writable, changeable in NULL, READY, PAUSED
or PLAYING state, 0x40000000
- Double. Range: 0.0 - 1.0 Default: 1.0
|
| 'sink\_%u' | flip-horizontal | Flip video image horizontally
- flags: readable, writable, changeable in NULL, READY, PAUSED
or PLAYING state, 0x40000000
- Boolean. Default: false
|
| 'sink\_%u' | flip-vertical | Flip video image vertically
- flags: readable, writable, changeable in NULL, READY, PAUSED
or PLAYING state, 0x40000000
- Boolean. Default: false
|
| 'sink\_%u' | rotate | Rotate video image
- flags: readable, writable, changeable in NULL, READY, PAUSED
or PLAYING state, 0x40000000
- Enum "GstVideoComposerRotate" Default: 0, "none"
- (0): none - No rotation
- (1): 90CW - Rotate 90 degrees clockwise
- (2): 90CCW - Rotate 90 degrees
counter-clockwise
- (3): 180 - Rotate 180 degrees
|
| 'sink\_%u' | emit-signals | Send signals to signal data consumption
- flags: readable, writable
- Boolean. Default: false
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
## Element configuration
Table : Element properties of qtivcomposer
| Property | Description |
| --- | --- |
| name | The name of the object
- flags: readable, writable
- String. Default: "videocomposer0"
|
| parent | The parent of the object
- flags: readable, writable
- Object of type "GstObject"
|
| engine | Engine backend used for the conversion operations
- flags: readable, writable
- Enum "GstVideoConverterBackend" Default: 1, "gles"
- (1): gles - Use OpenGLES based video converter
- (2): fcv - Use FastCV based video converter
|
| latency | Additional latency in live mode to allow upstream to take longer
to produce buffers for the current position (in nanoseconds)
- flags: readable, writable
- Unsigned Integer64.
- Range: 0 - 18446744073709551615
- Default: 0
|
| start-time-selection | Decides which start time is output
- flags: readable, writable
- Enum "GstAggregatorStartTimeSelection" Default: 0, "zero"
- (0): zero - Start at 0 running time (default)
- (1): first - Start at first observed input running
time
- (2): set - Set start time with start-time
property
|
| start-time | Start time to use if start-time-selection=set
- flags: readable, writable
- Unsigned Integer64. Range: 0 - 18446744073709551615 Default:
18446744073709551615
|
| background | Background color
- flags: readable, writable, changeable in NULL, READY, PAUSED
or PLAYING state
- Unsigned Integer Range: 0 - 4294967295
- Default: 4286611584
|
**Parent Topic:** [Qualcomm GST plugins](https://docs.qualcomm.com/doc/80-70014-50/topic/qim-sdk-plugins.html)
Last Published: Oct 27, 2025
[Previous Topic
pulsesink](https://docs.qualcomm.com/bundle/publicresource/80-70014-50/topics/pulsesink.md) [Next Topic
qtivsplit](https://docs.qualcomm.com/bundle/publicresource/80-70014-50/topics/qtivsplit.md)