For anyone like me struggling with understanding how to get started with plugin build toolchain, “boilerplate” is the magic word you are missing.
Was looking at that documentation which is what led me here, were you able to actually use that? I’ve not been able to get meson to actually complete the boilerplate, and I got the feeling that that template was out of date. At first meson complained that there wasn’t a call to the project() keyword at the start of the build file, which appears to be mandatory, so I added that, and now meson is complaining that the variable gst_version isn’t defined. Tbh I thought that that guide was outdated, have you had luck with it?
I have still have not found a single document that describes a simple route to a simple usable plugin.
I managed to make a new project and compile it in - kind of
For a start, dont use the first suggested gst-template. It is outdated. Somewhere in a comment near the bottom is says to use gst-element-maker from gst-plugins-bad.
That will make a new plugin with a base that you define. It will then compile it and give you the .so file for it.
What I could not understand is how to re-compile it after modifying it.
I was making a videfilter type so I went about integrating it into the gst-plugins-bad/gst/videofilter section
That meant making a whole bunch of code modifications and doing a dirty overwrite of gst-plugins-bad to test it. Just ugly.
If I could find a nice way to re-compile the generated plugin that would be amazing.
Maybe I can have another go at it now I know what I know.
Hello. I recently generated a gstreamer plugin on windows via WSL (but no gcc) and I found this guide to be helpful. I think you need the project-maker tool.
It uses the slightly more modern tool.
- The project maker tool works great
- The app tool works great
- The element tool works but the files are outdated and won’t compile right away
I actually generated a ‘basetransform’ and ‘element’ plugin the other day and fixed them up(triaged more like, I’m not a gstreamer dev) to a compiling state with the intention of posting them here. In my amateur opinion the ‘element’-type might be a lost cause due too being too outdated but the ‘basetransform’-type works, in fact I’m using it for a project myself.
This plugin will compile and run in a test pipeline if you use the project maker tool and put the files in the right place.
- generate a project with the tool and the name “discourseexample”
- put these two files in ./plugins/
- edit *plugin.c in /plugins and meson.build to point to the right files
- compile with meson*
-
GST_PLUGIN_PATH=./builddir/plugins gst-inspect-1.0 discourseexamplebasetransform
gstdiscourseexamplebasetransform.h :
/* GStreamer
* Copyright (C) 2025 FIXME <fixme@example.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
* Boston, MA 02110-1301, USA.
*/
#ifndef _GST_DISCOURSEEXAMPLE_BASETRANSFORM_H_
#define _GST_DISCOURSEEXAMPLE_BASETRANSFORM_H_
#include <gst/base/gstbasetransform.h>
G_BEGIN_DECLS
#define GST_TYPE_DISCOURSEEXAMPLE_BASETRANSFORM (gst_discourseexample_basetransform_get_type())
#define GST_DISCOURSEEXAMPLE_BASETRANSFORM(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DISCOURSEEXAMPLE_BASETRANSFORM,GstDiscourseexampleBasetransform))
#define GST_DISCOURSEEXAMPLE_BASETRANSFORM_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DISCOURSEEXAMPLE_BASETRANSFORM,GstDiscourseexampleBasetransformClass))
#define GST_IS_DISCOURSEEXAMPLE_BASETRANSFORM(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DISCOURSEEXAMPLE_BASETRANSFORM))
#define GST_IS_DISCOURSEEXAMPLE_BASETRANSFORM_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DISCOURSEEXAMPLE_BASETRANSFORM))
typedef struct _GstDiscourseexampleBasetransform GstDiscourseexampleBasetransform;
typedef struct _GstDiscourseexampleBasetransformClass GstDiscourseexampleBasetransformClass;
struct _GstDiscourseexampleBasetransform
{
GstBaseTransform base_discourseexamplebasetransform;
};
struct _GstDiscourseexampleBasetransformClass
{
GstBaseTransformClass base_discourseexamplebasetransform_class;
};
GType gst_discourseexample_basetransform_get_type (void);
G_END_DECLS
#endif
gstdiscourseexamplebasetransform.c :
/* GStreamer
* Copyright (C) 2025 FIXME <fixme@example.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 51 Franklin Street, Suite 500,
* Boston, MA 02110-1335, USA.
*/
/**
* SECTION:element-gstdiscourseexamplebasetransform
*
* The discourseexamplebasetransform element does FIXME stuff.
*
* <refsect2>
* <title>Example launch line</title>
* |[
* gst-launch-1.0 -v fakesrc ! discourseexamplebasetransform ! FIXME ! fakesink
* ]|
* FIXME Describe what the pipeline does.
* </refsect2>
*/
/*
What is this?
This file was autogenerated by a tool called gst-element-maker ( gstreamer/subprojects/gst-plugins-bad/tools$ ./gst-element-maker discourseexample_basetransform basetransform )
https://developer.ridgerun.com/wiki/index.php/Creating_a_New_GStreamer_Element_or_Application_Using_Templates
This info text was written by a human though...
At the time of writing that tool is very outdated and the files as first generated won't actually compile
I "fixed" this file by commenting things out until it did compile. And it does work in a pipeline like:
videotestsrc ! discourseexamplebasetransform ! autovideosink
Unlike the element file I do think this autogenerated file is a decent place to start if you intend to create a plugin
of the basetransform type and I've done so myself. Just be aware that it's probably full of outdated ways of doing things.
P.S. I'm not a gstreamer dev or maintainer or even really a programmer so keep that in mind if you choose to use this. And most importanly
check to see if the actual GStreamer devs have provided any new tools for generating plugin templates.
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <gst/gst.h>
#include <gst/base/gstbasetransform.h>
#include "gstdiscourseexamplebasetransform.h"
GST_DEBUG_CATEGORY_STATIC (gst_discourseexample_basetransform_debug_category);
#define GST_CAT_DEFAULT gst_discourseexample_basetransform_debug_category
#define gst_discourseexample_basetransform_parent_class parent_class
/* prototypes */
static void gst_discourseexample_basetransform_set_property (GObject * object,
guint property_id, const GValue * value, GParamSpec * pspec);
static void gst_discourseexample_basetransform_get_property (GObject * object,
guint property_id, GValue * value, GParamSpec * pspec);
static void gst_discourseexample_basetransform_dispose (GObject * object);
static void gst_discourseexample_basetransform_finalize (GObject * object);
static GstCaps *gst_discourseexample_basetransform_transform_caps (GstBaseTransform * trans,
GstPadDirection direction, GstCaps * caps, GstCaps * filter);
static GstCaps *gst_discourseexample_basetransform_fixate_caps (GstBaseTransform * trans,
GstPadDirection direction, GstCaps * caps, GstCaps * othercaps);
static gboolean gst_discourseexample_basetransform_accept_caps (GstBaseTransform * trans,
GstPadDirection direction, GstCaps * caps);
static gboolean gst_discourseexample_basetransform_set_caps (GstBaseTransform * trans,
GstCaps * incaps, GstCaps * outcaps);
static gboolean gst_discourseexample_basetransform_query (GstBaseTransform * trans,
GstPadDirection direction, GstQuery * query);
static gboolean gst_discourseexample_basetransform_decide_allocation (GstBaseTransform * trans,
GstQuery * query);
static gboolean gst_discourseexample_basetransform_filter_meta (GstBaseTransform * trans,
GstQuery * query, GType api, const GstStructure * params);
static gboolean gst_discourseexample_basetransform_propose_allocation (GstBaseTransform * trans,
GstQuery * decide_query, GstQuery * query);
static gboolean gst_discourseexample_basetransform_transform_size (GstBaseTransform * trans,
GstPadDirection direction, GstCaps * caps, gsize size, GstCaps * othercaps,
gsize * othersize);
static gboolean gst_discourseexample_basetransform_get_unit_size (GstBaseTransform * trans,
GstCaps * caps, gsize * size);
static gboolean gst_discourseexample_basetransform_start (GstBaseTransform * trans);
static gboolean gst_discourseexample_basetransform_stop (GstBaseTransform * trans);
static gboolean gst_discourseexample_basetransform_sink_event (GstBaseTransform * trans,
GstEvent * event);
static gboolean gst_discourseexample_basetransform_src_event (GstBaseTransform * trans,
GstEvent * event);
static GstFlowReturn gst_discourseexample_basetransform_prepare_output_buffer (GstBaseTransform *
trans, GstBuffer * input, GstBuffer ** outbuf);
static gboolean gst_discourseexample_basetransform_copy_metadata (GstBaseTransform * trans,
GstBuffer * input, GstBuffer * outbuf);
static gboolean gst_discourseexample_basetransform_transform_meta (GstBaseTransform * trans,
GstBuffer * outbuf, GstMeta * meta, GstBuffer * inbuf);
static void gst_discourseexample_basetransform_before_transform (GstBaseTransform * trans,
GstBuffer * buffer);
static GstFlowReturn gst_discourseexample_basetransform_transform (GstBaseTransform * trans,
GstBuffer * inbuf, GstBuffer * outbuf);
static GstFlowReturn gst_discourseexample_basetransform_transform_ip (GstBaseTransform * trans,
GstBuffer * buf);
enum
{
PROP_0
};
/* pad templates */
static GstStaticPadTemplate gst_discourseexample_basetransform_sink_template =
GST_STATIC_PAD_TEMPLATE ("sink",
GST_PAD_SINK,
GST_PAD_ALWAYS,
GST_STATIC_CAPS_ANY
);
static GstStaticPadTemplate gst_discourseexample_basetransform_src_template =
GST_STATIC_PAD_TEMPLATE ("src",
GST_PAD_SRC,
GST_PAD_ALWAYS,
GST_STATIC_CAPS_ANY
);
/* class initialization */
G_DEFINE_TYPE_WITH_CODE (GstDiscourseexampleBasetransform, gst_discourseexample_basetransform, GST_TYPE_BASE_TRANSFORM,
GST_DEBUG_CATEGORY_INIT (gst_discourseexample_basetransform_debug_category, "discourseexamplebasetransform", 0,
"debug category for discourseexamplebasetransform element"));
static void
gst_discourseexample_basetransform_class_init (GstDiscourseexampleBasetransformClass * klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GstBaseTransformClass *base_transform_class = GST_BASE_TRANSFORM_CLASS (klass);
/* Setting up pads and setting metadata should be moved to
base_class_init if you intend to subclass this class. */
gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS(klass),
&gst_discourseexample_basetransform_src_template);
gst_element_class_add_static_pad_template (GST_ELEMENT_CLASS(klass),
&gst_discourseexample_basetransform_sink_template);
gst_element_class_set_static_metadata (GST_ELEMENT_CLASS(klass),
"FIXME Basetransform", "Generic", "FIXME Description",
"FIXME <fixme@example.com>");
gobject_class->set_property = gst_discourseexample_basetransform_set_property;
gobject_class->get_property = gst_discourseexample_basetransform_get_property;
gobject_class->dispose = gst_discourseexample_basetransform_dispose;
gobject_class->finalize = gst_discourseexample_basetransform_finalize;
// These are commented out becasue they prevented the file from compiling. Some of them can probably be fixed up.
// base_transform_class->transform_caps = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_transform_caps);
// base_transform_class->fixate_caps = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_fixate_caps);
base_transform_class->accept_caps = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_accept_caps);
// base_transform_class->set_caps = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_set_caps);
base_transform_class->query = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_query);
// base_transform_class->decide_allocation = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_decide_allocation);
// base_transform_class->filter_meta = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_filter_meta);
// base_transform_class->propose_allocation = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_propose_allocation);
// base_transform_class->transform_size = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_transform_size);
// base_transform_class->get_unit_size = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_get_unit_size);
base_transform_class->start = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_start);
base_transform_class->stop = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_stop);
base_transform_class->sink_event = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_sink_event);
base_transform_class->src_event = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_src_event);
// base_transform_class->prepare_output_buffer = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_prepare_output_buffer);
// base_transform_class->copy_metadata = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_copy_metadata);
// base_transform_class->transform_meta = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_transform_meta);
// base_transform_class->before_transform = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_before_transform);
// base_transform_class->transform = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_transform);
// base_transform_class->transform_ip = GST_DEBUG_FUNCPTR (gst_discourseexample_basetransform_transform_ip);
}
static void
gst_discourseexample_basetransform_init (GstDiscourseexampleBasetransform *discourseexamplebasetransform)
{
}
void
gst_discourseexample_basetransform_set_property (GObject * object, guint property_id,
const GValue * value, GParamSpec * pspec)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (object);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "set_property");
switch (property_id) {
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
void
gst_discourseexample_basetransform_get_property (GObject * object, guint property_id,
GValue * value, GParamSpec * pspec)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (object);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "get_property");
switch (property_id) {
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
break;
}
}
void
gst_discourseexample_basetransform_dispose (GObject * object)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (object);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "dispose");
/* clean up as possible. may be called multiple times */
G_OBJECT_CLASS (gst_discourseexample_basetransform_parent_class)->dispose (object);
}
void
gst_discourseexample_basetransform_finalize (GObject * object)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (object);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "finalize");
/* clean up object here */
G_OBJECT_CLASS (gst_discourseexample_basetransform_parent_class)->finalize (object);
}
static GstCaps *
gst_discourseexample_basetransform_transform_caps (GstBaseTransform * trans, GstPadDirection direction,
GstCaps * caps, GstCaps * filter)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
GstCaps *othercaps;
GST_DEBUG_OBJECT (discourseexamplebasetransform, "transform_caps");
othercaps = gst_caps_copy (caps);
/* Copy other caps and modify as appropriate */
/* This works for the simplest cases, where the transform modifies one
* or more fields in the caps structure. It does not work correctly
* if passthrough caps are preferred. */
if (direction == GST_PAD_SRC) {
/* transform caps going upstream */
} else {
/* transform caps going downstream */
}
if (filter) {
GstCaps *intersect;
intersect = gst_caps_intersect (othercaps, filter);
gst_caps_unref (othercaps);
return intersect;
} else {
return othercaps;
}
}
static GstCaps *
gst_discourseexample_basetransform_fixate_caps (GstBaseTransform * trans, GstPadDirection direction,
GstCaps * caps, GstCaps * othercaps)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "fixate_caps");
return NULL;
}
static gboolean
gst_discourseexample_basetransform_accept_caps (GstBaseTransform * trans, GstPadDirection direction,
GstCaps * caps)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "accept_caps");
return TRUE;
}
static gboolean
gst_discourseexample_basetransform_set_caps (GstBaseTransform * trans, GstCaps * incaps,
GstCaps * outcaps)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "set_caps");
return TRUE;
}
static gboolean
gst_discourseexample_basetransform_query (GstBaseTransform * trans, GstPadDirection direction,
GstQuery * query)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
gboolean ret;
GST_DEBUG_OBJECT (discourseexamplebasetransform, "query");
ret = GST_BASE_TRANSFORM_CLASS (parent_class)->query (trans, direction, query);
return ret;
// return TRUE;
}
/* decide allocation query for output buffers */
static gboolean
gst_discourseexample_basetransform_decide_allocation (GstBaseTransform * trans, GstQuery * query)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "decide_allocation");
return TRUE;
}
static gboolean
gst_discourseexample_basetransform_filter_meta (GstBaseTransform * trans, GstQuery * query, GType api,
const GstStructure * params)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "filter_meta");
return TRUE;
}
/* propose allocation query parameters for input buffers */
static gboolean
gst_discourseexample_basetransform_propose_allocation (GstBaseTransform * trans,
GstQuery * decide_query, GstQuery * query)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "propose_allocation");
return TRUE;
}
/* transform size */
static gboolean
gst_discourseexample_basetransform_transform_size (GstBaseTransform * trans, GstPadDirection direction,
GstCaps * caps, gsize size, GstCaps * othercaps, gsize * othersize)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "transform_size");
return TRUE;
}
static gboolean
gst_discourseexample_basetransform_get_unit_size (GstBaseTransform * trans, GstCaps * caps,
gsize * size)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "get_unit_size");
return TRUE;
}
/* states */
static gboolean
gst_discourseexample_basetransform_start (GstBaseTransform * trans)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "start");
return TRUE;
}
static gboolean
gst_discourseexample_basetransform_stop (GstBaseTransform * trans)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "stop");
return TRUE;
}
/* sink and src pad event handlers */
static gboolean
gst_discourseexample_basetransform_sink_event (GstBaseTransform * trans, GstEvent * event)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "sink_event");
return GST_BASE_TRANSFORM_CLASS (gst_discourseexample_basetransform_parent_class)->sink_event (
trans, event);
}
static gboolean
gst_discourseexample_basetransform_src_event (GstBaseTransform * trans, GstEvent * event)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "src_event");
return GST_BASE_TRANSFORM_CLASS (gst_discourseexample_basetransform_parent_class)->src_event (
trans, event);
}
static GstFlowReturn
gst_discourseexample_basetransform_prepare_output_buffer (GstBaseTransform * trans, GstBuffer * input,
GstBuffer ** outbuf)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "prepare_output_buffer");
return GST_FLOW_OK;
}
/* metadata */
static gboolean
gst_discourseexample_basetransform_copy_metadata (GstBaseTransform * trans, GstBuffer * input,
GstBuffer * outbuf)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "copy_metadata");
return TRUE;
}
static gboolean
gst_discourseexample_basetransform_transform_meta (GstBaseTransform * trans, GstBuffer * outbuf,
GstMeta * meta, GstBuffer * inbuf)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "transform_meta");
return TRUE;
}
static void
gst_discourseexample_basetransform_before_transform (GstBaseTransform * trans, GstBuffer * buffer)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "before_transform");
}
/* transform */
static GstFlowReturn
gst_discourseexample_basetransform_transform (GstBaseTransform * trans, GstBuffer * inbuf,
GstBuffer * outbuf)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "transform");
return GST_FLOW_OK;
}
static GstFlowReturn
gst_discourseexample_basetransform_transform_ip (GstBaseTransform * trans, GstBuffer * buf)
{
GstDiscourseexampleBasetransform *discourseexamplebasetransform = GST_DISCOURSEEXAMPLE_BASETRANSFORM (trans);
GST_DEBUG_OBJECT (discourseexamplebasetransform, "transform_ip");
return GST_FLOW_OK;
}
// static gboolean
// plugin_init (GstPlugin * plugin)
// {
// /* FIXME Remember to set the rank if it's an element that is meant
// to be autoplugged by decodebin. */
// return gst_element_register (plugin, "discourseexamplebasetransform", GST_RANK_NONE,
// GST_TYPE_DISCOURSEEXAMPLE_BASETRANSFORM);
// }
\* for any windows user out there this should be done from the x64 native tools command prompt.