# Qualcomm Linux migration

This guide aids you in migrating your software to Qualcomm^®^ Linux^®^ 1.4. It details the behavioral changes in the 1.4 release compared to the 1.3 release, focusing on key updates and improvements. This is particularly relevant if you’re a current developer looking to update your existing software to the latest Qualcomm Linux release.

If you’re new to Qualcomm Linux and using the latest release, there’s no need to migrate your software.

With the 1.4 release, Qualcomm Linux has upgraded to the latest long-term support (LTS) version of Yocto 5.0, known as Yocto `scarthgap`. Additionally, the generic buffer management (GBM) memory manager and Weston drivers have transitioned to upstream versions, replacing the downstream versions used in 1.3 and earlier releases.

For the list of new features, enhancements, and limitations of the latest release, see [*Qualcomm Linux 1.4 Release Notes*](https://docs.qualcomm.com/bundle/publicresource/topics/RNO-250403001134/ReleaseNote.html).

## Changes in Yocto

The changes in Yocto for the 1.4 release are as follows:

- The Yocto release has been upgraded from `kirkstone` (v4.0.22) to `scarthgap` (v5.0.6). For the features and enhancements of `scarthgap`, see [Release notes for 5.0 (scarthgap)](https://docs.yoctoproject.org/5.0.6/singleindex.html#release-notes-for-5-0-scarthgap).
- The GNU Compiler Collection (GCC) compiler has been upgraded to v13.2. To avoid compatibility issues, recompile any prebuilt applications with the latest 1.4 release.

## Changes in memory manager

In the 1.4 release, the upstream [`libgbm` package](https://git.openembedded.org/openembedded-core/tree/meta/recipes-graphics/mesa?h=scarthgap&amp;id=00a662c5e28235fb64348aab4ce9aeb5e7f95d06) for memory management replaces the downstream variant.
This change affects the memory formats and GBM functionality across display, graphics, video, and camera modules.

For the list of formats supported by the upstream GBM, see the [`mesa` repository](https://gitlab.freedesktop.org/mesa/mesa/-/blob/main/src/gbm/main/gbm.h).

## Changes in display

In the 1.4 release, the display stack of the QCS6490 and QCS5430 system-on-chip (SoC) platforms has migrated to a fully upstream solution, eliminating the need for the proprietary Snapdragon^®^ Display Manager (SDM) backend. The QCS8275 and QCS9075 SoC platforms already use an upstream display solution.

Due to this migration, some features that depend on the SDM component aren’t available by default. If you need these features, you can switch the display stack to the downstream implementation.

To enable these features, use the information in the following table:

| Feature | Enable in 1.4 |
| --- | --- |
| Embedded DisplayPort (eDP) support | Enable the downstream path as described in [*Qualcomm Linux Display Guide - Addendum*](https://docs.qualcomm.com/bundle/resource/topics/80-70018-18A/configure.html#enable-sdm-and-downstream-display-drivers). |
| TypeC over DisplayPort (DP) | Enable the downstream path as described in [*Qualcomm Linux Display Guide - Addendum*](https://docs.qualcomm.com/bundle/resource/topics/80-70018-18A/configure.html#enable-sdm-and-downstream-display-drivers). |
| Prebuild modetest binary | In the `libdrm_2.4.120.bb` file, enable the `install-test-programs` option. For more information, see [*Qualcomm Linux Display Guide*](https://docs.qualcomm.com/bundle/publicresource/topics/80-70018-18/debug.html#generate-the-drm-mode-test-binary). |

## Changes in camera

In the 1.4 release, the buffer management utility uses the upstream GBM component instead of the downstream component. Therefore, change the Qualcomm Intelligent Multimedia (QIM) commands that invoke camera buffer management.

The default format for raw buffers is now `memory:GBM`. You needn’t specify the memory format in the `gst` commands.

**Pipeline example**

- The pipeline for the 1.3 release is as follows:

gst-launch-1.0 qtiqmmfsrc name=camsrc video_0::type=preview ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1,compression=ubwc ! waylandsink fullscreen=true async=true sync=false
    Copy to clipboard

- The pipeline for the 1.4 release is as follows:

gst-launch-1.0 -e qtiqmmfsrc name=camsrc video_1::type=preview ! video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1,interlace-mode=progressive,colorimetry=bt601 ! waylandsink fullscreen=true sync=false
    Copy to clipboard

For more information about changes in the plugins, see [Changes in QIM SDK](https://docs.qualcomm.com/doc/80-70018-150/topic/introduction.html#qim-sdk).

## Changes in video

To manage buffers for video encoding or decoding, the 1.4 release supports direct memory access (DMA) Export mode (4), DMA Import mode (5), and Memory Map (MMAP) mode (2). Select the appropriate mode based on your specific use case.

**Example**

When you encode in camera, it already produces DMA buffers. In this case, do the following:

> 
> 
> - Set the encoder input to DMA Import mode (5). This mode ensures that the camera buffer file descriptor (FD) is used directly, without allocating new buffer at video driver-side and copying the content.
> - Set the encoder output to DMA Import mode (5). This mode ensures that the video driver allocates output buffers.

The video pipeline for this example is as follows:

gst-launch-1.0 qtiqmmfsrc ! video/x-raw,format=NV12,width=1920,height=1080,framerate=30/1 ! v4l2h264enc output-io-mode=5 capture-io-mode=4 ! h264parse ! mp4mux ! filesink location=/opt/cam_enc.mp4
    Copy to clipboard

In this pipeline, the `output-io-mode` is DMA Import mode (5), indicating input to the encoder, and the `capture-io-mode` is DMA Export mode (4), indicating output to the encoder.

## Changes in QIM SDK

In the QIM SDK 1.4 release, the behavior of the `waylandsink`, `qtiqmmfsrc`, `v4l2h264dec`, and `v4l2h264enc` plugins has changed due to the upstream migration of the memory manager component. For more details, see [Changes in memory manager](https://docs.qualcomm.com/doc/80-70018-150/topic/introduction.html#memory-manager).

To reflect the changes in the QIM SDK plugins and the upstream GBM alignment, update the sample applications as follows.

### waylandsink plugin

Earlier versions of the QIM SDK used a downstream version of the `waylandsink` plugin, which included `x,y,width,height` coordinates as extra arguments. In later releases, this functionality is not available due to the switch to the upstream `waylandsink` plugin. Applications should now use the `qtivcomposer` plugin for this functionality.

The plugin changes and the corresponding actions you must take are as follows:

| Change | Change | Action |
| --- | --- | --- |
| 1.3 | 1.4 | Action |
| Has `x,y,width,height` coordinates. | Provides functionality through the `qtivcomposer` plugin. | Use the `qtivcomposer` plugin for composition. |
|  |  |  |

**Pipeline example**

- The pipeline for the 1.3 release is as follows:

gst-launch-1.0 -e qtivcomposer name=mixer sink_0::position="<0, 0>" sink_0::dimensions="<1280, 720>" sink_1::position="<590, 310>" sink_1::dimensions="<640, 360>" mixer. ! queue ! waylandsink enable-last-sample=false sync=true fullscreen=true filesrc location=/opt/mux1.mp4 ! qtdemux ! queue ! h264parse ! v4l2h264dec capture-io-mode=5 output-io-mode=5 ! mixer. filesrc location=/opt/mux1.mp4 ! qtdemux ! queue ! h264parse ! v4l2h264dec capture-io-mode=5 output-io-mode=5 ! mixer.
    Copy to clipboard

- The pipeline for the 1.4 release is as follows:

gst-launch-1.0 -e qtivcomposer name=mixer sink_0::position="<0, 0>" sink_0::dimensions="<1280, 720>" sink_1::position="<590, 310>" sink_1::dimensions="<640, 360>" mixer. ! queue ! waylandsink fullscreen=true filesrc location=/opt/mux1.mp4 ! qtdemux ! queue ! h264parse ! v4l2h264dec capture-io-mode=4 output-io-mode=4 ! video/x-raw, format=NV12 ! mixer. filesrc location=/opt/mux1.mp4 ! qtdemux ! queue ! h264parse ! v4l2h264dec capture-io-mode=4 output-io-mode=4 ! video/x-raw, format=NV12 ! mixer.
    Copy to clipboard

### qtiqmmfsrc plugin

From the 1.4 release, the `qtiqmmfsrc` plugin doesn’t support the compression field for universal bandwidth compressed (UBWC) NV12. Instead, the clients must use the new format specifically designed for UBWC compressed NV12 images.

The plugin changes and the corresponding actions you must take are as follows:

| Change | Change | Action |
| --- | --- | --- |
| 1.3 | 1.4 | Action |
| `format=NV12`<br><br><br>`compression=ubwc` | Added `format=NV12_Q08C` | <ul class="simple"><br><li><p>Change the format from <code class="docutils literal notranslate"><span class="pre">format=NV12</span></code> to <code class="docutils literal notranslate"><span class="pre">format=NV12_Q08C</span></code>.</p></li><br><li><p>Remove the <code class="docutils literal notranslate"><span class="pre">compression=ubwc</span></code> parameter.</p></li><br></ul> |
|  |  |  |

**Pipeline example**

- The pipeline for the 1.3 release is as follows:

gst-launch-1.0 qtiqmmfsrc name=camsrc video_0::type=preview ! video/x-raw\(memory:GBM\),format=NV12,width=1920,height=1080,framerate=30/1,compression=ubwc ! v4l2h264enc output-io-mode=5 capture-io-mode=5 ! h264parse ! filesink location=/opt/video.h264
    Copy to clipboard

- The pipeline for the 1.4 release is as follows:

gst-launch-1.0 -ev qtiqmmfsrc name=camsrc video_0::type=preview ! video/x-raw,format=NV12_Q08C,width=1920,height=1080,framerate=30/1 ! queue ! v4l2h264enc output-io-mode=5 capture-io-mode=4 ! h264parse ! filesink location=/opt/video.h264
    Copy to clipboard

### v4l2h264enc and v4l2h264dec plugins

In the earlier releases, the GST framework managed the application buffers. From the 1.4 release, the `v4l2` drivers support buffer management internally.

To add this enhancement to the driver, do the following:

- For applications using the camera source with the `v4l2h264enc` plugin, change the pipeline configuration from `output-io-mode=5`/ `capture-io-mode=5` to `output-io-mode=5`/ `capture-io-mode=4`.
- For applications using the filesource with the `v4l2h264dec` plugin, change the pipeline configuration from `output-io-mode=5`/ `capture-io-mode=5` to `output-io-mode=4`/ `capture-io-mode=4`.

The plugin changes and the corresponding actions you must take are as follows:

| Use case | Change | Change | Action |
| --- | --- | --- | --- |
| Use case | 1.3 | 1.4 | Action |
| Video encode | `format=NV12`<br><br><br>`compression=ubwc` | Added `format=NV12_Q08C` | <ul class="simple"><br><li><p>Change the format from <code class="docutils literal notranslate"><span class="pre">format=NV12</span></code> to <code class="docutils literal notranslate"><span class="pre">format=NV12_Q08C</span></code>.</p></li><br><li><p>Remove the <code class="docutils literal notranslate"><span class="pre">compression=ubwc</span></code> parameter.</p></li><br></ul> |
| Video encode | `output-io-mode=5` and `capture-io-mode=5` | Updated to `output-io-mode=5` and `capture-io-mode=4` | Change the modes to `output-io-mode=5` and `capture-io-mode=4`. |
| Video decode | `output-io-mode=5` and `capture-io-mode=5` | <ul class="simple"><br><li><p>Added caps and <code class="docutils literal notranslate"><span class="pre">format=NV12</span></code></p></li><br><li><p>Updated to <code class="docutils literal notranslate"><span class="pre">output-io-mode=4</span></code> and <code class="docutils literal notranslate"><span class="pre">capture-io-mode=4</span></code></p></li><br></ul> | <ul class="simple"><br><li><p>Add <code class="docutils literal notranslate"><span class="pre">video/x-raw,format=NV12</span></code>.</p></li><br><li><p>Change the modes to <code class="docutils literal notranslate"><span class="pre">output-io-mode=4</span></code> and <code class="docutils literal notranslate"><span class="pre">capture-io-mode=4</span></code>.</p></li><br></ul> |
|  |  |  |  |

**Pipeline example**

- The video decoder pipeline for the 1.3 release is as follows:

gst-launch-1.0 -e filesrc location=/opt/mux1.mp4 ! qtdemux ! queue ! h264parse ! v4l2h264dec capture-io-mode=5 output-io-mode=5 !  waylandsink fullscreen=true
    Copy to clipboard

- The video decoder pipeline for the 1.4 release is as follows:

gst-launch-1.0 -e filesrc location=/opt/mux1.mp4 ! qtdemux ! queue ! h264parse ! v4l2h264dec capture-io-mode=4 output-io-mode=4 ! video/x-raw,format=NV12 ! waylandsink fullscreen=true
    Copy to clipboard

- The video encoder pipeline for the 1.3 release is as follows:

gst-launch-1.0 -e qtiqmmfsrc name=camsrc video_0::type=preview ! video/x-raw\(memory:GBM\),format=NV12,width=3840,height=2160,framerate=30/1,compression=ubwc,interlace-mode=progressive,colorimetry=bt601 ! queue ! v4l2h264enc capture-io-mode=5 output-io-mode=5 ! queue ! h264parse ! mp4mux ! queue ! filesink location="/opt/mux1.mp4"
    Copy to clipboard

- The video encoder pipeline for the 1.4 release is as follows:

gst-launch-1.0 -e qtiqmmfsrc name=camsrc video_0::type=preview ! video/x-raw,format=NV12_Q08C,width=3840,height=2160,framerate=30/1,interlace-mode=progressive,colorimetry=bt601 ! queue ! v4l2h264enc capture-io-mode=4 output-io-mode=5 ! queue ! h264parse ! mp4mux ! queue ! filesink location="/opt/mux1.mp4"
    Copy to clipboard

## Next steps

- To update over-the-air (OTA) for Qualcomm Linux, see [*Qualcomm Linux Yocto Guide*](https://docs.qualcomm.com/bundle/publicresource/topics/80-70018-27/qualcomm_linux_software_components.html#ota-update-for-qualcomm-linux).
- To learn more about the new features, enhancements, and limitations of the Qualcomm Intelligent Multimedia Product (QIMP) SDK, see [*Qualcomm Linux QIMP SDK Release Notes*](https://docs.qualcomm.com/bundle/publicresource/topics/80-70018-52/qimp_sdk_release_1_4.html).
- To learn more about the new features, enhancements, and limitations of the latest release, see [*Qualcomm Linux 1.4 Release Notes*](https://docs.qualcomm.com/bundle/publicresource/topics/RNO-250403001134/ReleaseNote.html).

Last Published: Apr 10, 2025

[Next Topic
References](https://docs.qualcomm.com/bundle/publicresource/80-70018-150/topics/references.md)

Source: [https://docs.qualcomm.com/doc/80-70018-150/topic/introduction.html](https://docs.qualcomm.com/doc/80-70018-150/topic/introduction.html)