# Develop plugins using Qualcomm IM SDK

The GStreamer plugins allow you to effectively use and implement the Qualcomm IM SDK functionality. [Download and install eSDK](https://docs.qualcomm.com/bundle/publicresource/topics/80-80022-51/install-sdk.html#download-and-install-esdk) to develop or customize plugins.

Using Qualcomm IM SDK, you can do the following:

- Update or customize the existing plugins for improvements, or make them compatible with the latest version of the GStreamer framework.
- Develop preprocessing and postprocessing plugins for AI/ML models.

## Customize a plugin

Customize a Qualcomm GStreamer plugin and install it on the target device.

As an example, the following procedure uses the `mlvdetection` plugin.

1. Set up the environment:

cd $ESDK_ROOT
        Copy to clipboard

source environment-setup-armv8-2a-qcom-linux
        Copy to clipboard

    The following message is displayed:

SDK environment now set up; additionally you may now run devtool to perform development tasks.
Run devtool --help for further details.
[/local/mnt/workspace/QIMSDK\_ESDK\_6490/]
2. Download the Qualcomm IM SDK plugin sources.

cd $ESDK_ROOT
        Copy to clipboard

devtool modify qcom-gstreamer1.0-plugins-oss-mlvdetection
        Copy to clipboard

    In this command, `qcom-gstreamer1.0-plugins-oss-mlvdetection` is the BitBake recipe that downloads the sources of the plugin.

NOTE: Starting bitbake server...
        Loading cache: 100% |######################################| Time: 0:00:00
        Loaded 9816 entries from dependency cache.
        Parsing recipes: 100% |####################################| Time: 0:00:01
        Parsing of 6700 .bb  files complete (6678 cached, 22 parsed). 9838 targets, 842 skipped, 0 masked, 0 errors.
        NOTE: Resolving any missing task queue dependencies
        Initialising tasks: 100% |#################################| Time: 0:00:55
        Sstate summary: Wanted 10 local 0 mirrors 0 Missed 10 Current 10 (0% match, 50% complete)
        NOTE: Executing Tasks
        NOTE: Tasks Summary: Attempted 93 tasks of which 90 didn't need to be rerun and all succeeded.
        INFO: Source tree extracted to /local/mnt/workspace/QIMSDK_ESDK_6490/workspace/sources/qcom-gstreamer1.0-plugins-oss-mlvdetection
        INFO: Recipe qcom-gstreamer1.0-plugins-oss-mlvdetection now setup to build from /local/mnt/workspace/QIMSDK_ESDK_6490/workspace/sources/qcom-gstreamer1.0-plugins-oss-mlvdetection
        Copy to clipboard

    The plugin source code is downloaded to `$ESDK_ROOT/workspace/sources/qcom-gstreamer1.0-plugins-oss-mlvdetection`.

[/local/mnt/workspace/QIMSDK_ESDK_6490/workspace/sources/qcom-gstreamer1.0-plugins-oss-mlvdetection]$ ls
        CMakeLists.txt    config.h.in    mlvdetection.h    modules
        [/local/mnt/workspace/QIMSDK_ESDK_6490/workspace/sources/qcom-gstreamer1.0-plugins-oss-mlvdetection]$
        Copy to clipboard
3. Perform the required customization and run the following command to rebuild the plugin:

devtool build qcom-gstreamer1.0-plugins-oss-mlvdetection
        Copy to clipboard

    The following message is displayed:

NOTE: Starting bitbake server...
        Loading cache: 100% |################################################| Time: 0:00:00
        Loaded 9816 entries from dependency cache.
        Parsing recipes: 100% |##############################################| Time: 0:00:01
        Parsing of 6700 .bb  files complete (6678 cached, 22 parsed). 9838 targets, 842 skipped, 0 masked, 0 errors.
        NOTE: Resolving any missing task queue dependencies
        Initialising tasks: 100% |###########################################| Time: 0:00:55
        Checking sstate mirror object availability: 100% |###################| Time: 0:01:06
        Sstate Summary: Wanted 264 Local 0 Mirrors 0 Missed 264 Current 255 (0% match, 49% complete)
        Removing 1 stale sstate objects for arch qcs6490_rb3gen2_vision_kit: 100% |################################################| Time: 0:00:12
        Removing 1 stale sstate objects for arch armv8-2a: 100% |##################################################################| Time: 0:00:16
        NOTE: Executing Tasks
        NOTE: qcom-gstreamer1.0-plugins-oss-mlvdetection: compiling from external source tree /local/mnt/workspace/QIMSDK_ESDK_6490/workspace/sources/qcom-gstreamer1.0-plugins-oss-mlvdetection
        NOTE: Task Summary: Attempted 1836 tasks of which 1827 didn't need to be rerun and all succeeded.
        Copy to clipboard
4. To install the application on the target device, generate the plugin installer (ipk):

devtool package qcom-gstreamer1.0-plugins-oss-mlvdetection
        Copy to clipboard

    The installable package is at `ls -1 $ESDK_ROOT/tmp/deploy/ipk/armv8-2a/`.

qcom-gstreamer1.0-plugins-oss-mlvdetection_1.0-r0_armv8-2a.ipk
        qcom-gstreamer1.0-plugins-oss-mlvdetection_dbg_1.0-r0_armv8-2a.ipk
        qcom-gstreamer1.0-plugins-oss-mlvdetection_dev_1.0-r0_armv8-2a.ipk
        qcom-gstreamer1.0-plugins-oss-mlvdetection_src_1.0-r0_armv8-2a.ipk
        [/local/mnt/workspace/QIMSDK_ESDK_6490/workspace/sources/qcom-gstreamer1.0-plugins-oss-mlvdetection]$
        Copy to clipboard
5. Set up a connection with the target device through SSH. For instructions, see [Sign in using SSH](https://docs.qualcomm.com/bundle/publicresource/topics/80-80022-254/how_to.html#use-ssh).

    The development kit is accessible through its configured IP address.
6. Install the compiled reference application on the target device through the SSH shell:

ssh root@[IP Address of the device]
        Copy to clipboard

Note

If prompted for a password, enter *oelinux123*.
7. On the target device, reconfigure the file system partition to support read and write operations:

mount -o remount,rw /
        Copy to clipboard

exit
        Copy to clipboard
8. On the host computer, transfer the application installer to the target device:

cd $ESDK_ROOT/tmp/deploy/ipk/armv8-2a/
        Copy to clipboard

scp qcom-gstreamer1.0-plugins-oss-mlvdetection_1.0-r0_armv8-2a.ipk root@<IP Address of the device>:/opt
        Copy to clipboard
9. Sign in to the SSH shell:

ssh root@[IP Address of the device]
        Copy to clipboard
10. On the target device, install the application:

opkg --force-depends --force-reinstall --force-overwrite install /opt/qcom-gstreamer1.0-plugins-oss-mlvdetection_1.0-r0_armv8-2a.ipk
        Copy to clipboard
11. Verify if the IPK installation is successful:

Installing qcom-gstreamer1.0-plugins-oss-mlvdetection (1.0) on root
        Configuring qcom-gstreamer1.0-plugins-oss-mlvdetection.
        Copy to clipboard

## Create a plugin

Create your own plugin and compile it as part of the Qualcomm IM SDK. Each ML plugin is integrated into the SDK as an independent BitBake recipe.

To update the BitBake files for custom plugin compilation, do the following:

1. Set up the environment:

cd $ESDK_ROOT
        Copy to clipboard

source environment-setup-armv8-2a-qcom-linux
        Copy to clipboard

SDK environment now set up; additionally you may now run devtool to perform development tasks.
Run devtool --help for further details.
[/local/mnt/workspace/Platform\_eSDK\_plus\_QIM]$
2. Create a BitBake file at `$ESDK_ROOT/layers/meta-qcom-qim-product-sdk/recipes-gst/gstreamer/`.

    For example:

$ESDK_ROOT/layers/meta-qcom-qim-product-sdk/recipes-gst/gstreamer/qcom-gstreamer1.0-plugins-oss-sample-mlvclassification.bb
        Copy to clipboard

    1. Copy the contents of the existing plugin to the new file created in step 2.
    2. Update the `SUMMARY`, `SRC_URI`, and `S` variables:

...
inherit cmake pkgconfig

**SUMMARY = "My custom plugin for ML image categorization"**
SECTION= "multimedia"

LICENSE = "BSD-3-Clause-Clear"
LIC\_FILES\_CHKSUM - "file://${COMMON\_LICENSE\_DIR}/${LICENSE};md5=7a43440b65lf4a472ca93716d01033a"

# Dependencies.
DEPENDS := "gstreamer1.0"
DEPENDS += "gstreamer1.0-plugins-base"
DEPENDS += "qcom-gstreamer1.0-plugins-oss-base"
DEPENDS += "cairo"

[\*\*](https://docs.qualcomm.com/doc/80-80022-50/topic/develop-plugins-for-sdk.html#id1)#SRCPROJECT = "git://git.codelinaro.org/clo/le/platform/vendor/qcom-opensource/gst-plugins-qti-oss.git;protocol=https"
#SRCBRANCH  = "imsdk.lnx.2.0.0.r2-rel"
#SRCREV     = "49256b26148d10257959b2b8d55879f72888cb0f"

#SRC\_URI = "${SRCPROJECT};branch=${SRCBRANCH};rev=${SRCREV};subpath=gst-plugin-mlvclassification"
#S = "${WORKDIR}/gst-plugin-mlvclassification"
SRC\_URI += "file://gst-plugin-sample-mlvclassification"
S = "${WORKDIR}/gst-plugin-sample-mlvclassification"\*\*

# Instal directories.
INSTALL\_INCDIR := "${includedir}"
...
3. Create a directory called `files` at `$ESDK_ROOT/layers/meta-qcom-qim-product-sdk/recipes-gst/gstreamer/files`. Under `files`, create the `gst-plugin-sample-mlvclassification` directory, and then copy the Qualcomm IM SDK plugin source code in this directory.

Note

Ensure that the source code is available for the `sample-mlvclassification` plugin.

files
        |
        ├── gst-plugin-sample-mlvclassification
           |
        ├── CMakeLists.txt
        ├── config.h.in
        ├── mlvclassification.c
        ├── mlvclassification.h
        └── modules
            ├── CMakeLists.txt
            ├── ml-vclassification-mobilenet.c
            ├── ml-vclassification-ocr.c
            ├── ml-vclassification-qfr.c
            └── README
        Copy to clipboard
4. To include `qcom-gstreamer1.0-plugins-oss-sample-mlvclassification` in the package group, add it under `RDEPENDS` in the `$ESDK_ROOT/layers/meta-qcom-qim-product-sdk/recipes-gst/packagegroups/packagegroup-qcom-gst.bb` directory.

RDEPENDS:${PN}:qcom-custom-bsp = " \
            ${PN}-dependencies \
            ${PN}-basic \
            . . .
            **qcom-gstreamer1.0-plugins-oss-sample-mlvclassification \\**
        "
        Copy to clipboard
5. To include `qcom-gstreamer1.0-plugins-oss-sample-mlvclassification:do_package_write_ipk` in package group bbclass, add it under `do_package_write_ipk` in the `$ESDK_ROOT/layers/meta-qcom-qim-product-sdk/classes/qimsdk-pkg.bbclass` directory.

GST_PLUGINS = " \
            gstd:do_package_write_ipk \
            gstreamer1.0:do_package_write_ipk \
            . . .
            **qcom-gstreamer1.0-plugins-oss-sample-mlvclassification:do\_package\_write\_ipk \\**
        "
        Copy to clipboard
6. Download the Qualcomm IM SDK plugin sources:

cd $ESDK_ROOT
        Copy to clipboard

devtool modify qcom-gstreamer1.0-plugins-oss-sample-mlvclassification
        Copy to clipboard

    In this command, `qcom-gstreamer1.0-plugins-oss-sample-mlvclassification` is the BitBake recipe that downloads the plugin source.

NOTE: Starting bitbake server ...
        Loading cache: 100% |###################################################################################| Time 0:00:02
        Loaded 9814 entries from dependency cache.
        Parsing recipes: 100% |#################################################################################| Time 0:00:03
        Parsing of 6702 .bb files complete (6670 cached, 32 parsed). 9840 targets, 842 skipped, 0 masked, 0 errors.
        
        Summary: There were 0 WARNING messages.
        NOTE: Resolving any missing task queue dependencies
        Initialising tasks: 100% |##############################################################################| Time 0:00:08
        Sstate summary: Wanted 10 Local 0 Mirrors 0 Missed 10 Current 10 (0% match, 50% complete)
        NOTE: Executing Tasks
        NOTE: Tasks Summary: Attempted 93 tasks of which 90 didn't need to be rerun and all succeeded.
        INFO: Source tree extracted to /local/mnt/workspace/QIMSDK_ESDK_6490/workspace/sources/qcom-gstreamer1.0-plugins-oss-sample-mlvclassification
        INFO: Recipe qcom-gstreamer1.0-plugins-oss-sample-mlvclassification now set up to build from /local/mnt/workspace/QIMSDK_ESDK_6490/workspace/sources/qcom-gstreamer1.0-plugins-oss-sample-mlvclassification
        Copy to clipboard

    The plugin source code is downloaded at `$ESDK_ROOT/workspace/sources/qcom-gstreamer1.0-plugins-oss-sample-mlvclassification`.
7. Perform the required customizations and run the following command to rebuild the plugin:

devtool build qcom-gstreamer1.0-plugins-oss-sample-mlvclassification
        Copy to clipboard

NOTE: Starting bitbake server ...
        Loading cache: 100% |                                      | ETA -:--:--
        Loaded 0 entries from dependency cache.
        ...
        Copy to clipboard
8. To install the application on the target device, generate the plugin installer (ipk):

devtool package qcom-gstreamer1.0-plugins-oss-sample-mlvclassification
        Copy to clipboard

    The installable package is at `$ESDK_ROOT/tmp/deploy/ipk/armv8-2a/`.

NOTE: Starting bitbake server ...
        Loading cache: 100% |###################################################################| ETA 0:00:14
        Loaded 9812 entries from dependency cache.
        Parsing recipes: 100% |#################################################################################| Time 0:00:03
        Parsing of 6702 .bb files complete (6674 cached, 28 parsed). 9840 targets, 842 skipped, 0 masked, 0 errors.
        NOTE: Resolving any missing task queue dependencies
        Initialising tasks: 100% |##############################################################################| Time 0:00:10
        Checking sstate mirror object availability: 100% |######################################################| Time 0:00:00
        Sstate summary: Wanted 262 Local 0 Mirrors 0 Missed 262 Current 259 (0% match, 49% complete)
        NOTE: Executing Tasks
        NOTE: Tasks Summary: Attempted 1847 tasks of which 1847 didn't need to be rerun and all succeeded.
        
        Summary: There were 0 WARNING messages.
        INFO: Your packages are in /local/mnt/workspace/QIMSDK_ESDK_6490/tmp/deploy/ipk
        Copy to clipboard
9. Set up a connection with the target device through SSH. For instructions, see [Sign in using SSH](https://docs.qualcomm.com/bundle/publicresource/topics/80-80022-254/how_to.html#use-ssh).

    Qualcomm Linux is accessible through its configured IP address.
10. On the Qualcomm EVK, install the compiled reference applications:

qcom-gstreamer1.0-plugins-oss-sample-mlvclassification_1.0-r0_armv8-2a.ipk
        Copy to clipboard
11. Sign in to the SSH shell:

ssh root@[ip-addr]
        Copy to clipboard

Note

If prompted for a password, enter *oelinux123*.
12. On the target device, reconfigure the file system partition to support *read* and *write*:

mount -o remount,rw /
        Copy to clipboard

exit
        Copy to clipboard
13. On the host computer, transfer the application installer to the target device:

cd $ESDK_ROOT/tmp/deploy/ipk/armv8-2a/
        Copy to clipboard

scp qcom-gstreamer1.0-plugins-oss-sample-mlvclassification_1.0-r0_armv8-2a.ipk root@<ip_address>:/opt/
        Copy to clipboard
14. In the SSH shell, run the command on the target device to install the application:

opkg --force-depends --force-reinstall --force-overwrite install /opt/qcom-gstreamer1.0-plugins-oss-sample-mlvclassification_1.0-r0_armv8-2a.ipk
        Copy to clipboard

Last Published: May 14, 2026

[Previous Topic
qtismartvencbin](https://docs.qualcomm.com/bundle/publicresource/80-80022-50/topics/qtismartvencbin.md) [Next Topic
Use GStreamer utilities for custom plugins](https://docs.qualcomm.com/bundle/publicresource/80-80022-50/topics/im-sdk-base-uitilities.md)