# Develop plugins using Qualcomm IM SDK

Source: [https://docs.qualcomm.com/doc/80-70020-50/topic/develop-plugins-for-sdk.html](https://docs.qualcomm.com/doc/80-70020-50/topic/develop-plugins-for-sdk.html)

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-70020-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

Source: [https://docs.qualcomm.com/doc/80-70020-50/topic/develop-plugins-for-sdk.html](https://docs.qualcomm.com/doc/80-70020-50/topic/develop-plugins-for-sdk.html)

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

### About this task

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

### Procedure

1. Set up the environment:
                
cd $ESDK_ROOTCopy to clipboard

        source environment-setup-armv8-2a-qcom-linuxCopy 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/]Copy to clipboard
2. Download the Qualcomm IM SDK plugin sources.
                
cd $ESDK_ROOTCopy to clipboard

        devtool modify qcom-gstreamer1.0-plugins-oss-mlvdetectionCopy 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-mlvdetectionCopy 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-mlvdetectionCopy 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-mlvdetectionCopy 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-70020-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
                            <var class="keyword varname">oelinux123</var>.
7. On the target device, reconfigure the file system partition to support read and
                    write operations:
                
mount -o remount,rw /Copy to clipboard

        exitCopy 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>:/optCopy 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.ipkCopy 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

Source: [https://docs.qualcomm.com/doc/80-70020-50/topic/develop-plugins-for-sdk.html](https://docs.qualcomm.com/doc/80-70020-50/topic/develop-plugins-for-sdk.html)

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.

### About this task

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

### Procedure

1. Set up the
                    environment:
cd $ESDK_ROOTCopy to clipboard

        source environment-setup-armv8-2a-qcom-linuxCopy 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]$Copy to clipboard
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.bbCopy 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"
            
            #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}"
            ...Copy to clipboard
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
            └── READMECopy 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_ROOTCopy to clipboard

        devtool modify qcom-gstreamer1.0-plugins-oss-sample-mlvclassificationCopy 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-mlvclassificationCopy 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-mlvclassificationCopy 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-mlvclassificationCopy 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/ipkCopy 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-70020-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.ipkCopy to clipboard
11. Sign in to the SSH shell:
                
ssh root@[ip-addr]Copy to clipboard

Note: If prompted for a password, enter <var class="keyword varname">oelinux123</var>.
12. On the target device, reconfigure the file system partition to support
                        *read* and *write*: 
                
mount -o remount,rw /Copy to clipboard

        exitCopy 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.ipkCopy to clipboard

Last Published: Jan 30, 2026

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