gstreamer/tools/gst-element-maker

397 lines
10 KiB
Bash
Executable file

#!/bin/sh
prefix=gst
basedir=`dirname $0`
templatedir=$basedir/element-templates
while [ "$1" ] ; do
case $1 in
--help)
cat <<-EOF
Usage: element-maker [OPTIONS] ELEMENT_NAME BASE_CLASS
Create a GStreamer element that subclasses BASE_CLASS.
Options:
--help Print this information
--prefix PREFIX Use PREFIX instead of "gst"
Example: 'element-maker my_element basetransform' will create the files
gstmyelement.c and gstmyelement.h that implement GstMyElement, a
subclass of GstBaseTransform, as an element named myelement.
EOF
exit 0
;;
--prefix)
shift
prefix=$1
;;
-*)
echo Unknown option: $1
exit 1
;;
*)
if [ "$name" = "" ]; then
name=$1
elif [ "$class" = "" ]; then
class=$1
else
echo Ignored: $1
fi
esac
shift
done
if [ "$name" = "" -o "$class" = "" ] ; then
echo "Usage: element-maker [OPTIONS] ELEMENT_NAME BASE_CLASS"
exit 1
fi
if [ ! -f "$templatedir/$class" ] ; then
echo "Template file for $class not found."
exit 1
fi
PREFIX=$(echo $prefix | sed -e 's/\(.*\)/\U\1/')
NAME=$(echo $name | sed -e 's/\(.*\)/\U\1/')
Prefix=$(echo $prefix | sed -e 's/_\(.\)/\U\1/g' -e 's/^\(.\)/\U\1/')
Name=$(echo $name | sed -e 's/_\(.\)/\U\1/g' -e 's/^\(.\)/\U\1/')
name=$(echo $name | sed -e 's/\(.*\)/\L\1/')
GST_IS_REPLACE=${PREFIX}_IS_${NAME}
GST_REPLACE=${PREFIX}_${NAME}
GST_TYPE_REPLACE=${PREFIX}_TYPE_${NAME}
GstReplace=${Prefix}${Name}
gst_replace=${prefix}_${name}
gstreplace=${prefix}$(echo $name | sed -e 's/_//g')
replace=$(echo $name | sed -e 's/_//g')
if [ "${prefix}" = gst ] ; then
prefixreplace=$replace
else
prefixreplace=$gstreplace
fi
if [ "$REAL_NAME" = "" ] ; then
REAL_NAME=FIXME
fi
if [ "$EMAIL_ADDRESS" = "" ] ; then
EMAIL_ADDRESS=fixme@example.com
fi
pkg=`grep -A 10000 '^% pkg-config' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1`
GST_TYPE_BASE_REPLACE=`grep -A 10000 '^% TYPE_CLASS_NAME' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1`
GstBaseReplace=`grep -A 10000 '^% ClassName' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1`
pads=`grep -A 10000 '^% pads' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1`
generate ()
{
cat <<-EOF
/* GStreamer
* Copyright (C) $(date +%Y) $REAL_NAME <$EMAIL_ADDRESS>
*
* 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.
*/
EOF
cat <<-EOF
/**
* SECTION:element-$gstreplace
*
* The $replace element does FIXME stuff.
*
* <refsect2>
* <title>Example launch line</title>
* |[
* gst-launch -v fakesrc ! $replace ! FIXME ! fakesink
* ]|
* FIXME Describe what the pipeline does.
* </refsect2>
*/
EOF
cat <<EOF
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include <gst/gst.h>
EOF
grep -A 10000 '^% includes' $templatedir/gobject | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
grep -A 10000 '^% includes' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
cat <<EOF
#include "gstreplace.h"
GST_DEBUG_CATEGORY_STATIC (gst_replace_debug_category);
#define GST_CAT_DEFAULT gst_replace_debug_category
/* prototypes */
EOF
grep -A 10000 '^% prototypes' $templatedir/gobject | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
grep -A 10000 '^% prototypes' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
for each in $pads
do
grep -A 10000 '^% prototypes' $templatedir/$each | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
done
cat <<EOF
enum
{
PROP_0
};
/* pad templates */
EOF
for each in $pads
do
grep -A 10000 '^% pad-template' $templatedir/$each | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
done
cat <<EOF
/* class initialization */
G_DEFINE_TYPE_WITH_CODE (GstReplace, gst_replace, GST_TYPE_BASE_REPLACE,
GST_DEBUG_CATEGORY_INIT (gst_replace_debug_category, "prefixreplace", 0,
"debug category for replace element"));
static void
gst_replace_class_init (GstReplaceClass * klass)
{
EOF
grep -A 10000 '^% declare-class' $templatedir/gobject | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
grep -A 10000 '^% declare-class' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
cat <<EOF
/* Setting up pads and setting metadata should be moved to
base_class_init if you intend to subclass this class. */
EOF
for each in $pads
do
grep -A 10000 '^% base-init' $templatedir/$each | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
done
cat <<EOF
gst_element_class_set_static_metadata (GST_ELEMENT_CLASS(klass),
"FIXME Long name", "Generic", "FIXME Description",
"$REAL_NAME <$EMAIL_ADDRESS>");
EOF
grep -A 10000 '^% set-methods' $templatedir/gobject | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
grep -A 10000 '^% set-methods' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
cat <<EOF
}
static void
gst_replace_init (GstReplace *replace)
{
EOF
for each in $pads
do
grep -A 10000 '^% instance-init' $templatedir/$each | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
done
cat <<EOF
}
EOF
grep -A 10000 '^% methods' $templatedir/gobject | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
grep -A 10000 '^% methods' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
for each in $pads
do
grep -A 10000 '^% methods' $templatedir/$each | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
done
cat <<EOF
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, "prefixreplace", GST_RANK_NONE,
GST_TYPE_REPLACE);
}
/* FIXME: these are normally defined by the GStreamer build system.
If you are creating an element to be included in gst-plugins-*,
remove these, as they're always defined. Otherwise, edit as
appropriate for your external plugin package. */
#ifndef VERSION
#define VERSION "0.0.FIXME"
#endif
#ifndef PACKAGE
#define PACKAGE "FIXME_package"
#endif
#ifndef PACKAGE_NAME
#define PACKAGE_NAME "FIXME_package_name"
#endif
#ifndef GST_PACKAGE_ORIGIN
#define GST_PACKAGE_ORIGIN "http://FIXME.org/"
#endif
GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
GST_VERSION_MINOR,
replace,
"FIXME plugin description",
plugin_init, VERSION, "LGPL", PACKAGE_NAME, GST_PACKAGE_ORIGIN)
EOF
}
generate_header ()
{
cat <<-EOF
/* GStreamer
* Copyright (C) $(date +%Y) $REAL_NAME <$EMAIL_ADDRESS>
*
* 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.
*/
EOF
cat <<EOF
#ifndef _GST_REPLACE_H_
#define _GST_REPLACE_H_
EOF
grep -A 10000 '^% includes' $templatedir/gobject | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
grep -A 10000 '^% includes' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
cat <<EOF
G_BEGIN_DECLS
#define GST_TYPE_REPLACE \
(gst_replace_get_type())
#define GST_REPLACE(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_REPLACE,GstReplace))
#define GST_REPLACE_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_REPLACE,GstReplaceClass))
#define GST_IS_REPLACE(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_REPLACE))
#define GST_IS_REPLACE_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_REPLACE))
typedef struct _GstReplace GstReplace;
typedef struct _GstReplaceClass GstReplaceClass;
struct _GstReplace
{
GstBaseReplace base_replace;
EOF
for each in $pads
do
grep -A 10000 '^% instance-members' $templatedir/$each | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
done
cat <<EOF
};
struct _GstReplaceClass
{
GstBaseReplaceClass base_replace_class;
};
GType gst_replace_get_type (void);
G_END_DECLS
#endif
EOF
}
generate | sed \
-e "s/GST_BASE_REPLACE/$GST_BASE_REPLACE/g" \
-e "s/GST_TYPE_BASE_REPLACE/$GST_TYPE_BASE_REPLACE/g" \
-e "s/GstBaseReplace/$GstBaseReplace/g" \
-e "s/GST_IS_REPLACE/$GST_IS_REPLACE/g" \
-e "s/GST_REPLACE/$GST_REPLACE/g" \
-e "s/GST_TYPE_REPLACE/$GST_TYPE_REPLACE/g" \
-e "s/GstReplace/$GstReplace/g" \
-e "s/gst_replace/$gst_replace/g" \
-e "s/gstreplace/$gstreplace/g" \
-e "s/prefixreplace/$prefixreplace/g" \
-e "s/replace/$replace/g" >$gstreplace.c
generate_header | sed \
-e "s/GST_BASE_REPLACE/$GST_BASE_REPLACE/g" \
-e "s/GST_TYPE_BASE_REPLACE/$GST_TYPE_BASE_REPLACE/g" \
-e "s/GstBaseReplace/$GstBaseReplace/g" \
-e "s/GST_IS_REPLACE/$GST_IS_REPLACE/g" \
-e "s/GST_REPLACE/$GST_REPLACE/g" \
-e "s/GST_TYPE_REPLACE/$GST_TYPE_REPLACE/g" \
-e "s/GstReplace/$GstReplace/g" \
-e "s/gst_replace/$gst_replace/g" \
-e "s/gstreplace/$gstreplace/g" \
-e "s/prefixreplace/$prefixreplace/g" \
-e "s/replace/$replace/g" >$gstreplace.h
gst-indent $gstreplace.c
echo pkg is $pkg
gcc -Wall -Werror -fPIC $CPPFLAGS $(pkg-config --cflags gstreamer-1.0 $pkg) -c -o $gstreplace.o $gstreplace.c
if test $? -ne 0; then
exit 1
fi
gcc -shared -o $gstreplace.so $gstreplace.o $(pkg-config --libs gstreamer-1.0 $pkg)
if test $? -ne 0; then
exit 1
fi
gst-inspect-1.0 ./$gstreplace.so