Terminal showing gst-inspect-1.0 output listing GStreamer plugins on MediaTek Genio Yocto build
mediatekgeniogstreameryoctoembedded linuxbitbakebsp

Adding GStreamer plugins to MediaTek Genio IoT Yocto

Andres Campos ·

The default MediaTek Genio IoT Yocto image includes a minimal GStreamer installation — enough to demonstrate hardware decode and waylandsink but not necessarily everything your application needs. Adding plugins is straightforward once you know which Yocto package owns the element you need, and how to add it to your image cleanly without modifying BSP-owned files.

Key Insights

  • Each GStreamer plugin collection maps to a separate Yocto package — know which package owns the element you need
  • Add plugins via IMAGE_INSTALL:append in your image recipe or local.conf — never modify the BSP image recipe directly
  • MTK hardware plugins (mtkvdec, waylandsink, mtkh265enc) require NDA_BUILD=1 and come from the private BSP layer
  • Use gst-inspect-1.0 on the running board to verify what is installed and what each element accepts
  • For custom or third-party plugins, write a BitBake recipe in your own meta-layer

What GStreamer packages are available?

The IoT Yocto BSP pulls in GStreamer through meta-openembedded. The plugin packages and which elements they contain:

Yocto packageKey elements included
gstreamer1.0gst-launch-1.0, gst-inspect-1.0, core pipeline
gstreamer1.0-plugins-basevideotestsrc, audiotestsrc, videoconvert, audioconvert, alsasrc, alsasink
gstreamer1.0-plugins-goodv4l2src, rtspsrc, rtph264pay, flvdemux, matroska, udpsrc, wavparse, pulsesrc
gstreamer1.0-plugins-badwaylandsink (upstream), nvh264enc (not MTK), codecparsers, dtlssrtpdemux
gstreamer1.0-plugins-uglyx264enc, mpeg2dec, asfdemux — codecs with license restrictions
gstreamer1.0-libavavdec_h264, avdec_hevc, avenc_* — FFmpeg-based software codecs
gstreamer1.0-rtsp-serverGstRTSPServer library for streaming server pipelines
MTK private: gst-plugin-mtkmtkvdec, mtkh265enc, waylandsink (MTK zero-copy version)

The MTK private plugins replace or extend the upstream equivalents. The MTK waylandsink is not the same as the upstream waylandsink in gstreamer1.0-plugins-bad — the MTK version has zero-copy buffer handling with mtkvdec. For setup and pipeline usage, see GStreamer + waylandsink on MediaTek Genio. For what the NDA build unlocks beyond GStreamer, see the dedicated guide.

How do you add plugins to your image?

Option 1: local.conf (fastest for development)

Add to build/conf/local.conf:

IMAGE_INSTALL:append = " gstreamer1.0-plugins-good gstreamer1.0-plugins-ugly gstreamer1.0-libav"

Note the leading space inside the quotes. Without it, the append runs into the previous value without a separator and BitBake treats them as a single invalid package name.

This approach works but is not portable — local.conf is not committed to your layer. Use it for development and iteration.

Option 2: bbappend in your meta-layer (production)

See the Yocto build guide for Genio if you need to set up the build environment first.

Create a bbappend in your custom meta-layer to extend the image recipe:

meta-your-product/
  recipes-extended/
    images/
      genio-iot-image.bbappend

Content of genio-iot-image.bbappend:

IMAGE_INSTALL:append = " \
    gstreamer1.0-plugins-good \
    gstreamer1.0-plugins-ugly \
    gstreamer1.0-libav \
    gstreamer1.0-rtsp-server \
"

This approach is committed to your layer and reproducible across build machines.

Option 3: Add individual elements (smallest image size)

Instead of adding the entire plugin collection, add only the specific element packages you need. GStreamer plugin packages split by element:

IMAGE_INSTALL:append = " \
    gstreamer1.0-plugins-good-flv \
    gstreamer1.0-plugins-good-rtp \
    gstreamer1.0-plugins-good-rtsp \
    gstreamer1.0-plugins-good-v4l2 \
"

This keeps the image smaller, which matters for boards with limited storage.

How do you verify plugins at runtime?

After flashing:

# List all installed plugins
gst-inspect-1.0

# Check a specific element
gst-inspect-1.0 mtkvdec
gst-inspect-1.0 waylandsink
gst-inspect-1.0 flvdemux

# Find elements that handle H.264
gst-inspect-1.0 | grep h264

# Confirm MTK hardware decode is the NDA version (not upstream)
gst-inspect-1.0 mtkvdec | grep "Factory Details"

If an element is missing, the output is:

No such element or plugin 'mtkvdec'

Go back to IMAGE_INSTALL, add the correct package, rebuild, and reflash.

How do you add a custom GStreamer plugin?

If your application requires a GStreamer plugin that has no Yocto recipe:

  1. Create a recipe in your meta-layer:
meta-your-product/
  recipes-multimedia/
    gst-plugin-custom/
      gst-plugin-custom_1.0.bb
  1. Content of the recipe:
SUMMARY = "Custom GStreamer plugin for sensor pre-processing"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://LICENSE;md5=..."

SRC_URI = "git://github.com/your-org/gst-plugin-custom.git;branch=main;protocol=https"
SRCREV = "abc123"

S = "${WORKDIR}/git"

inherit cmake

DEPENDS = "gstreamer1.0 gstreamer1.0-plugins-base"

FILES:${PN} += "${libdir}/gstreamer-1.0/*.so"
  1. Add to IMAGE_INSTALL:
IMAGE_INSTALL:append = " gst-plugin-custom"

What is the GStreamer debugging workflow on Genio?

When a pipeline fails or produces unexpected output:

# Enable full debug logging
GST_DEBUG=5 gst-launch-1.0 videotestsrc ! videoconvert ! waylandsink 2>&1 | head -100

# Debug a specific plugin
GST_DEBUG=mtkvdec:5 gst-launch-1.0 ...

# Log pipeline graph to dot file (visualize in Graphviz)
GST_DEBUG_DUMP_DOT_DIR=/tmp gst-launch-1.0 ...
# Then: dot -Tpng /tmp/*.dot -o pipeline.png

Building a custom IoT Yocto image on MediaTek Genio and need help with GStreamer pipeline design, plugin integration, or BSP customization? ProventusNova specializes in embedded Linux on Genio. See our GStreamer pipeline service or get in touch.

MediaTek Genio Expert Support

Building on MediaTek Genio?

BSP bring-up, GStreamer pipelines, NeuroPilot integration, we've shipped it. Get unblocked fast. One call to scope it, fixed bid to deliver it.

Frequently Asked Questions

Which GStreamer plugin packages are available in the Genio IoT Yocto BSP?

The Genio BSP includes all standard GStreamer packages from meta-openembedded: gstreamer1.0, gstreamer1.0-plugins-base, gstreamer1.0-plugins-good, gstreamer1.0-plugins-bad, gstreamer1.0-plugins-ugly, and gstreamer1.0-libav. The MediaTek-specific plugins (mtkvdec, mtkh265enc, waylandsink) come from meta-mediatek-bsp-private and are only available with NDA_BUILD=1.

How do I add a GStreamer plugin that is not in the default image?

Add the package to IMAGE_INSTALL in your image recipe or local.conf. For a single plugin like gstreamer1.0-plugins-good-flv: IMAGE_INSTALL:append = ' gstreamer1.0-plugins-good-flv'. For all plugins from a collection: IMAGE_INSTALL:append = ' gstreamer1.0-plugins-good'. Note the leading space inside the quotes — this is a BitBake requirement when appending.

How do I check which GStreamer plugins are available on a running Genio board?

Run gst-inspect-1.0 with no arguments to list all installed plugins. To check a specific plugin: gst-inspect-1.0 flvdemux. To search for plugins by element name: gst-inspect-1.0 | grep h264. If a plugin you expect is missing, it was not included in the image build — add its package to IMAGE_INSTALL and rebuild.

How do I add a third-party GStreamer plugin that has no existing Yocto recipe?

Write a BitBake recipe (.bb file) for the plugin in your custom meta-layer. The recipe should inherit autotools or cmake, set SRC_URI to the plugin source, and DEPENDS on gstreamer1.0 and gstreamer1.0-plugins-base. Then add the recipe's package name to IMAGE_INSTALL. For a pure GStreamer plugin written in C, gstreamer-plugin-autotools is a useful BBCLASS to inherit.

Why does gst-launch-1.0 say 'no element' for a plugin that exists on my development machine?

The plugin is not installed in the Yocto image. Each GStreamer plugin is a separate Yocto package that must be explicitly added to IMAGE_INSTALL. The default Genio image includes a minimal set. Run gst-inspect-1.0 <element-name> on the board to confirm; if it returns 'No such element or plugin', add the parent package to your image.

Andrés Campos, Co-Founder & CTO at ProventusNova

Written by

Andrés Campos

Co-Founder & CTO · ProventusNova

8 years deep in embedded systems, from underwater ROVs to edge AI. Andrés leads every technical delivery personally.

Connect on LinkedIn