# Steps to create `superresolution` plugin Source: [https://docs.qualcomm.com/doc/80-70014-15B/topic/steps-to-create-superresolution-plugin.html](https://docs.qualcomm.com/doc/80-70014-15B/topic/steps-to-create-superresolution-plugin.html) 1. Create plugin header "gst-plugins-mlvsuperresolution/mlvsuperresolution.h" - Reference from existing plugin: [gst-plugin-mlvsegmentation/mlvsegmentation.h · imsdk.lnx.2.0.0.r1-rel · CodeLinaro / le / platform / vendor / qcom-opensource / gst-plugins-qti-oss · GitLab](https://git.codelinaro.org/clo/le/platform/vendor/qcom-opensource/gst-plugins-qti-oss/-/blob/imsdk.lnx.2.0.0.r1-rel/gst-plugin-mlvsegmentation/mlvsegmentation.h?ref_type=heads) - Import required headers - Create a structure with data variables required for processing Example for super resolution - Inheritance chain: GObject → GstObject → GstElement → GstBaseTransform - GstBaseTransform is suitable for elements where the output size and capabilities are entirely determined by the input size and capabilities struct _GstMLVideoSuperresolution { GstBaseTransform parent; GstMLInfo *mlinfo; GstVideoInfo *vinfo; GstBufferPool *outpool; GstMLModule *module; gint mdlenum; GstStructure *mlconstants; }; struct _GstMLVideoSuperresolutionClass { GstBaseTransformClass parent; };Copy to clipboard **Note:** The labels variable is not required for superresolution. Make sure to remove the labels variable and its usage in code. 2. Create plugin "gst-plugins-mlvsuperresolution/mlvsuperresolution.c" - Reference from existing plugin: [gst-plugin-mlvsegmentation/mlvsegmentation.c · imsdk.lnx.2.0.0.r1-rel · CodeLinaro / le / platform / vendor / qcom-opensource / gst-plugins-qti-oss · GitLab](https://git.codelinaro.org/clo/le/platform/vendor/qcom-opensource/gst-plugins-qti-oss/-/blob/imsdk.lnx.2.0.0.r1-rel/gst-plugin-mlvsegmentation/mlvsegmentation.c?ref_type=heads) - Import mlvsuperresolution.h and other required headers - Define caps - video formats #define GST_ML_VIDEO_SUPERRESOLUTION_VIDEO_FORMATS "{ RGBA,BGRA, ARGB, ABGR, RGBx, BGRx, xRGB, xBGR, RGB, BGR }"Copy to clipboard - src caps #define GST_ML_VIDEO_SUPERRESOLUTION_SRC_CAPS \ "video/x-raw, " \ "format = (string) " GST_ML_VIDEO_SUPERRESOLUTION_VIDEO_FORMATS "; " \ "video/x-raw(" GST_CAPS_FEATURE_MEMORY_GBM "), " \ "format = (string) " GST_ML_VIDEO_SUPERRESOLUTION_VIDEO_FORMATSCopy to clipboard - sink caps #define GST_ML_VIDEO_SUPERRESOLUTION_SINK_CAPS \ "neural-network/tensors"Copy to clipboard - Implement following functions - Init static gboolean plugin_init(GstPlugin * plugin);Copy to clipboard - To register custom plugin, once registered we can access plugin in reference apps with gst\_element\_factory\_make("plugin-name","plugin-name"); static void gst_ml_video_superresolution_init(GstMLVideoSuperresolution * superresolution); Copy to clipboard - Initializes superresolution with default parameters, allows to control output buffers. On receiving an input buffer, gst\_ml\_video\_superresolution\_prepare\_output\_buffer will be called to allocate output buffer. static void gst_ml_video_superresolution_class_init(GstMLVideoSuperresolutionClass * klass);Copy to clipboard - Initializes callback functions to function pointer, set caps and default properties - Buffer management static GstBufferPool *gst_ml_video_superresolution_create_pool(GstMLVideoSuperresolution * superresolution, GstCaps* caps);Copy to clipboard - Allocates either GBM(Graphics Buffer Manager) or ION Memory depending on negotiated caps static gboolean gst_ml_video_superresolution_decide_allocation (GstBaseTransform * base, GstQuery * query);Copy to clipboard - Ensures appropriate buffer pool configuration based on the caps. static GstFlowReturn gst_ml_video_superresolution_prepare_output_buffer(GstBaseTransform * base, GstBuffer *inbuffer, GstBuffer ** outbuffer);Copy to clipboard - Ensures output buffers is allocated from pool depending on caps - Caps static gboolean gst_ml_video_superresolution_set_caps(GstBaseTransform * base, GstCaps * incaps, GstCaps *outcaps);Copy to clipboard - First, the module is validated, and then the inputs and output capabilities are collected from module caps. static GstCaps *gst_ml_video_superresolution_fixate_caps(GstBaseTransform * base, GstPadDirection direction, GstCaps* incaps, GstCaps * outcaps);Copy to clipboard - Negotiated caps are fixed static gbooleancaps_has_feature (const GstCaps * caps, const gchar * feature);Copy to clipboard - Checks whether specified caps are valid or not like video/x-raw, video/x-text, format, height and width static GstCaps *gst_ml_video_superresolution_src_caps (void);Copy to clipboard - Convert static caps to regular caps static GstCaps *gst_ml_video_superresolution_sink_caps (void);Copy to clipboard - Convert static caps to regular caps - Transform static GstCaps *gst_ml_video_superresolution_transform_caps(GstBaseTransform * base, GstPadDirection direction, GstCaps* caps, GstCaps * filter);Copy to clipboard - Transform sink caps to source caps and vice-versa static GstFlowReturn gst_ml_video_superresolution_transform(GstBaseTransform * base, GstBuffer * inbuffer, GstBuffer *outbuffer);Copy to clipboard - After inference, postprocessing function gst\_ml\_video\_superresolution\_module\_execute will be called based on module. - Property static void gst_ml_video_superresolution_set_property (GObject* object, guint prop_id, -const GValue * value, GParamSpec *pspec);Copy to clipboard - To set plugin properties like module and constant static void gst_ml_video_superresolution_get_property (GObject* object, guint prop_id, GValue * value, GParamSpec * pspec);Copy to clipboard - To read plugin properties like module and constant - De-init static void gst_ml_video_superresolution_finalize (GObject *object);Copy to clipboard - Free all allocated buffers - Display text/bounding boxes (based on use case only, not required for super resolution) static gboolean gst_ml_video__fill_video_output(GstMLVideoDetection * detection, GArray * predictions, GstBuffer * buffer);Copy to clipboard - To overlay result on output frame - Update plugin name in "gst-plugins-mlvsuperresolution/CMakeLists.txt" - Reference from existing plugin: [gst-plugin-mlvsegmentation/CMakeLists.txt · imsdk.lnx.2.0.0.r1-rel · CodeLinaro / le / platform / vendor / qcom-opensource / gst-plugins-qti-oss · GitLab](https://git.codelinaro.org/clo/le/platform/vendor/qcom-opensource/gst-plugins-qti-oss/-/blob/imsdk.lnx.2.0.0.r1-rel/gst-plugin-mlvsegmentation/CMakeLists.txt?ref_type=heads) - Reuse config.h.in from [gst-plugin-mlvsegmentation/config.h.in · imsdk.lnx.2.0.0.r1-rel · CodeLinaro / le / platform / vendor / qcom-opensource / gst-plugins-qti-oss · GitLab](https://git.codelinaro.org/clo/le/platform/vendor/qcom-opensource/gst-plugins-qti-oss/-/blob/imsdk.lnx.2.0.0.r1-rel/gst-plugin-mlvsegmentation/config.h.in?ref_type=heads) Last Published: Jan 21, 2026 [Previous Topic Plugin Directory Structure](https://docs.qualcomm.com/bundle/publicresource/80-70014-15B/topics/plugin-directory-structure.md) [Next Topic Overview of Module](https://docs.qualcomm.com/bundle/publicresource/80-70014-15B/topics/overview-of-module.md)