67525ef7fcfcd75699c9b3a7fcbe4e9991ba13cf
[platform/upstream/gstreamer.git] / tools / gst-element-maker
1 #!/bin/sh
2
3
4 prefix=gst
5 templatedir=element-templates
6
7 while [ "$1" ] ; do
8   case $1 in
9     --help)
10       cat <<-EOF
11 Usage: element-maker [OPTIONS] ELEMENT_NAME BASE_CLASS
12 Create a GStreamer element that subclasses BASE_CLASS.
13 Options:
14   --help             Print this information
15   --prefix PREFIX    Use PREFIX instead of "gst"
16 Example: 'element-maker my_element basetransform' will create the files
17   gstmyelement.c and gstmyelement.h that implement GstMyElement, a
18   subclass of GstBaseTransform, as an element named myelement.
19 EOF
20       exit 0
21       ;;
22     --prefix)
23       shift
24       prefix=$1
25       ;;
26     -*)
27       echo Unknown option: $1
28       exit 1
29       ;;
30     *)
31       if [ "$name" = "" ]; then
32         name=$1
33       elif [ "$class" = "" ]; then
34         class=$1
35       else
36         echo Ignored: $1
37       fi
38   esac
39   shift
40 done
41
42 if [ "$name" = "" -o "$class" = "" ] ; then
43   echo "Usage: element-maker [OPTIONS] ELEMENT_NAME BASE_CLASS"
44   exit 1
45 fi
46
47 if [ ! -f "element-templates/$class" ] ; then
48   echo "Template file for $class not found."
49   exit 1
50 fi
51
52
53 PREFIX=$(echo $prefix | sed -e 's/\(.*\)/\U\1/')
54 NAME=$(echo $name | sed -e 's/\(.*\)/\U\1/')
55 Prefix=$(echo $prefix | sed -e 's/_\(.\)/\U\1/g' -e 's/^\(.\)/\U\1/')
56 Name=$(echo $name | sed -e 's/_\(.\)/\U\1/g' -e 's/^\(.\)/\U\1/')
57
58 GST_IS_REPLACE=${PREFIX}_IS_${NAME}
59 GST_REPLACE=${PREFIX}_${NAME}
60 GST_TYPE_REPLACE=${PREFIX}_TYPE_${NAME}
61 GstReplace=${Prefix}${Name}
62 gst_replace=${prefix}_${name}
63 gstreplace=${prefix}$(echo $name | sed -e 's/_//g')
64 replace=$(echo $name | sed -e 's/_//g')
65
66 if [ "$REAL_NAME" = "" ] ; then
67   REAL_NAME=FIXME
68 fi
69 if [ "$EMAIL_ADDRESS" = "" ] ; then
70   EMAIL_ADDRESS=fixme@example.com
71 fi
72
73
74 pkg=`grep -A 10000 '^% pkg-config' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1`
75 GST_TYPE_BASE_REPLACE=`grep -A 10000 '^% TYPE_CLASS_NAME' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1`
76 GstBaseReplace=`grep -A 10000 '^% ClassName' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1`
77 pads=`grep -A 10000 '^% pads' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1`
78
79 generate ()
80 {
81
82 cat <<-EOF
83 /* GStreamer
84  * Copyright (C) $(date +%Y) $REAL_NAME <$EMAIL_ADDRESS>
85  *
86  * This library is free software; you can redistribute it and/or
87  * modify it under the terms of the GNU Library General Public
88  * License as published by the Free Software Foundation; either
89  * version 2 of the License, or (at your option) any later version.
90  *
91  * This library is distributed in the hope that it will be useful,
92  * but WITHOUT ANY WARRANTY; without even the implied warranty of
93  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
94  * Library General Public License for more details.
95  *
96  * You should have received a copy of the GNU Library General Public
97  * License along with this library; if not, write to the
98  * Free Software Foundation, Inc., 51 Franklin Street, Suite 500,
99  * Boston, MA 02110-1335, USA.
100  */
101 EOF
102
103 cat <<-EOF
104 /**
105  * SECTION:element-$gstreplace
106  *
107  * The $replace element does FIXME stuff.
108  *
109  * <refsect2>
110  * <title>Example launch line</title>
111  * |[
112  * gst-launch -v fakesrc ! $replace ! FIXME ! fakesink
113  * ]|
114  * FIXME Describe what the pipeline does.
115  * </refsect2>
116  */
117 EOF
118
119
120 cat <<EOF
121
122 #ifdef HAVE_CONFIG_H
123 #include "config.h"
124 #endif
125
126 #include <gst/gst.h>
127 EOF
128
129 grep -A 10000 '^% includes' $templatedir/gobject | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
130 grep -A 10000 '^% includes' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
131
132 cat <<EOF
133 #include "gstreplace.h"
134
135 GST_DEBUG_CATEGORY_STATIC (gst_replace_debug);
136 #define GST_CAT_DEFAULT gst_replace_debug
137
138 /* prototypes */
139
140 EOF
141
142 grep -A 10000 '^% prototypes' $templatedir/gobject | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
143 grep -A 10000 '^% prototypes' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
144 for each in $pads
145 do
146   grep -A 10000 '^% prototypes' $templatedir/$each | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
147 done
148
149 cat <<EOF
150
151 enum
152 {
153   PROP_0
154 };
155
156 /* pad templates */
157
158 EOF
159
160 for each in $pads
161 do
162   grep -A 10000 '^% pad-template' $templatedir/$each | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
163 done
164
165 cat <<EOF
166
167 /* class initialization */
168
169 #define DEBUG_INIT(bla) \\
170   GST_DEBUG_CATEGORY_INIT (gst_replace_debug, "replace", 0, \\
171       "debug category for replace element");
172
173 GST_BOILERPLATE_FULL (GstReplace, gst_replace, GstBaseReplace,
174     GST_TYPE_BASE_REPLACE, DEBUG_INIT);
175
176 static void
177 gst_replace_base_init (gpointer g_class)
178 {
179   GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
180
181   GST_DEBUG_CATEGORY_INIT (gst_replace_debug_category, "replace", 0,
182       "replace element");
183
184 EOF
185
186 for each in $pads
187 do
188   grep -A 10000 '^% base-init' $templatedir/$each | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
189 done
190
191 cat <<EOF
192
193   gst_element_class_set_details_simple (element_class, "FIXME Long name",
194       "Generic", "FIXME Description", "$REAL_NAME <$EMAIL_ADDRESS>");
195 }
196
197 static void
198 gst_replace_class_init (GstReplaceClass * klass)
199 {
200 EOF
201 grep -A 10000 '^% declare-class' $templatedir/gobject | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
202 grep -A 10000 '^% declare-class' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
203
204 echo
205
206 grep -A 10000 '^% set-methods' $templatedir/gobject | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
207 grep -A 10000 '^% set-methods' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
208
209 cat <<EOF
210
211 }
212
213 static void
214 gst_replace_init (GstReplace * replace, GstReplaceClass * replace_class)
215 {
216 EOF
217
218 for each in $pads
219 do
220   grep -A 10000 '^% instance-init' $templatedir/$each | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
221 done
222
223
224 cat <<EOF
225 }
226 EOF
227
228
229 grep -A 10000 '^% methods' $templatedir/gobject | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
230 grep -A 10000 '^% methods' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
231 for each in $pads
232 do
233   grep -A 10000 '^% methods' $templatedir/$each | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
234 done
235
236
237 cat <<EOF
238
239 static gboolean
240 plugin_init (GstPlugin * plugin)
241 {
242
243   gst_element_register (plugin, "replace", GST_RANK_NONE,
244       gst_replace_get_type ());
245
246   return TRUE;
247 }
248
249 #ifndef VERSION
250 #define VERSION "0.0.FIXME"
251 #endif
252 #ifndef PACKAGE
253 #define PACKAGE "FIXME_package"
254 #endif
255 #ifndef PACKAGE_NAME
256 #define PACKAGE_NAME "FIXME_package_name"
257 #endif
258 #ifndef GST_PACKAGE_ORIGIN
259 #define GST_PACKAGE_ORIGIN "http://FIXME.org/"
260 #endif
261
262 GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
263     GST_VERSION_MINOR,
264     "replace",
265     "FIXME plugin description",
266     plugin_init, VERSION, "LGPL", PACKAGE_NAME, GST_PACKAGE_ORIGIN)
267
268 EOF
269
270
271 }
272
273 generate_header ()
274 {
275
276 cat <<-EOF
277 /* GStreamer
278  * Copyright (C) $(date +%Y) $REAL_NAME <$EMAIL_ADDRESS>
279  *
280  * This library is free software; you can redistribute it and/or
281  * modify it under the terms of the GNU Library General Public
282  * License as published by the Free Software Foundation; either
283  * version 2 of the License, or (at your option) any later version.
284  *
285  * This library is distributed in the hope that it will be useful,
286  * but WITHOUT ANY WARRANTY; without even the implied warranty of
287  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
288  * Library General Public License for more details.
289  *
290  * You should have received a copy of the GNU Library General Public
291  * License along with this library; if not, write to the
292  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
293  * Boston, MA 02111-1307, USA.
294  */
295
296 EOF
297
298 cat <<EOF
299 #ifndef _GST_REPLACE_H_
300 #define _GST_REPLACE_H_
301
302 EOF
303
304 grep -A 10000 '^% includes' $templatedir/gobject | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
305 grep -A 10000 '^% includes' $templatedir/$class | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
306
307 cat <<EOF
308
309 G_BEGIN_DECLS
310
311 #define GST_TYPE_REPLACE \
312   (gst_replace_get_type())
313 #define GST_REPLACE(obj) \
314   (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_REPLACE,GstReplace))
315 #define GST_REPLACE_CLASS(klass) \
316   (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_REPLACE,GstReplaceClass))
317 #define GST_IS_REPLACE(obj) \
318   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_REPLACE))
319 #define GST_IS_REPLACE_CLASS(obj) \
320   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_REPLACE))
321
322 typedef struct _GstReplace GstReplace;
323 typedef struct _GstReplaceClass GstReplaceClass;
324
325 struct _GstReplace
326 {
327   GstBaseReplace base_replace;
328
329 EOF
330
331 for each in $pads
332 do
333   grep -A 10000 '^% instance-members' $templatedir/$each | tail -n +2|grep -m 1 -B 10000 '^%'|head -n -1
334 done
335
336 cat <<EOF
337 };
338
339 struct _GstReplaceClass
340 {
341   GstBaseReplaceClass base_replace_class;
342 };
343
344 GType gst_replace_get_type (void);
345
346 G_END_DECLS
347
348 #endif
349 EOF
350
351
352 }
353
354
355 generate | sed \
356   -e "s/GST_BASE_REPLACE/$GST_BASE_REPLACE/g" \
357   -e "s/GST_TYPE_BASE_REPLACE/$GST_TYPE_BASE_REPLACE/g" \
358   -e "s/GstBaseReplace/$GstBaseReplace/g" \
359   -e "s/GST_IS_REPLACE/$GST_IS_REPLACE/g" \
360   -e "s/GST_REPLACE/$GST_REPLACE/g" \
361   -e "s/GST_TYPE_REPLACE/$GST_TYPE_REPLACE/g" \
362   -e "s/GstReplace/$GstReplace/g" \
363   -e "s/gst_replace/$gst_replace/g" \
364   -e "s/gstreplace/$gstreplace/g" \
365   -e "s/replace/$replace/g" >$gstreplace.c
366
367 generate_header | sed \
368   -e "s/GST_BASE_REPLACE/$GST_BASE_REPLACE/g" \
369   -e "s/GST_TYPE_BASE_REPLACE/$GST_TYPE_BASE_REPLACE/g" \
370   -e "s/GstBaseReplace/$GstBaseReplace/g" \
371   -e "s/GST_IS_REPLACE/$GST_IS_REPLACE/g" \
372   -e "s/GST_REPLACE/$GST_REPLACE/g" \
373   -e "s/GST_TYPE_REPLACE/$GST_TYPE_REPLACE/g" \
374   -e "s/GstReplace/$GstReplace/g" \
375   -e "s/gst_replace/$gst_replace/g" \
376   -e "s/gstreplace/$gstreplace/g" \
377   -e "s/replace/$replace/g" >$gstreplace.h
378
379 gst-indent $gstreplace.c
380
381 echo pkg is $pkg
382
383 gcc -Wall $(pkg-config --cflags gstreamer-0.10 $pkg) -c -o $gstreplace.o $gstreplace.c
384 gcc -shared -o $gstreplace.so $gstreplace.o $(pkg-config --libs gstreamer-0.10 $pkg)
385
386