From 2438f5851e8c0d6e98cf45fc50300ca4387bc470 Mon Sep 17 00:00:00 2001 From: Julien Moutte Date: Sun, 6 Nov 2005 21:55:01 +0000 Subject: [PATCH] Enable documentation. Original commit message from CVS: 2005-11-06 Julien MOUTTE * Makefile.am: * autogen.sh: * configure.ac: * docs/Makefile.am: * docs/plugins/.cvsignore: * docs/plugins/Makefile.am: * docs/plugins/gst-plugins-bad-plugins-decl-list.txt: * docs/plugins/gst-plugins-bad-plugins-decl.txt: * docs/plugins/gst-plugins-bad-plugins-docs.sgml: * docs/plugins/gst-plugins-bad-plugins-sections.txt: * docs/plugins/gst-plugins-bad-plugins-undocumented.txt: * docs/plugins/gst-plugins-bad-plugins.args: * docs/plugins/gst-plugins-bad-plugins.hierarchy: * docs/plugins/gst-plugins-bad-plugins.interfaces: * docs/plugins/gst-plugins-bad-plugins.prerequisites: * docs/plugins/gst-plugins-bad-plugins.signals: * docs/plugins/gst-plugins-bad-plugins.types: * docs/plugins/inspect/plugin-dfbvideosink.xml: * docs/version.entities.in: Enable documentation. * examples/Makefile.am: * examples/directfb/Makefile.am: * examples/directfb/decker.ttf: * examples/directfb/dfblogo.png: * examples/directfb/gstdfb.c: (myclock), (dynamic_link), (size_changed), (setup_dynamic_link), (main): Add an example application for DirectFB. --- ChangeLog | 29 + Makefile.am | 4 +- autogen.sh | 2 +- configure.ac | 12 + docs/Makefile.am | 12 + docs/plugins/.gitignore | 18 + docs/plugins/Makefile.am | 113 ++++ .../gst-plugins-bad-plugins-decl-list.txt | 18 + docs/plugins/gst-plugins-bad-plugins-decl.txt | 119 ++++ .../plugins/gst-plugins-bad-plugins-docs.sgml | 25 + .../gst-plugins-bad-plugins-overrides.txt | 0 .../gst-plugins-bad-plugins-sections.txt | 8 + .../gst-plugins-bad-plugins-undocumented.txt | 9 + docs/plugins/gst-plugins-bad-plugins.args | 9 + .../plugins/gst-plugins-bad-plugins.hierarchy | 20 + .../gst-plugins-bad-plugins.interfaces | 2 + .../gst-plugins-bad-plugins.prerequisites | 1 + docs/plugins/gst-plugins-bad-plugins.signals | 1 + docs/plugins/gst-plugins-bad-plugins.types | 1 + docs/plugins/inspect/plugin-dfbvideosink.xml | 20 + docs/version.entities.in | 2 + examples/Makefile.am | 22 +- examples/directfb/Makefile.am | 6 + examples/directfb/decker.ttf | Bin 0 -> 37048 bytes examples/directfb/dfblogo.png | Bin 0 -> 7722 bytes examples/directfb/gstdfb.c | 514 ++++++++++++++++++ 26 files changed, 954 insertions(+), 13 deletions(-) create mode 100644 docs/Makefile.am create mode 100644 docs/plugins/.gitignore create mode 100644 docs/plugins/Makefile.am create mode 100644 docs/plugins/gst-plugins-bad-plugins-decl-list.txt create mode 100644 docs/plugins/gst-plugins-bad-plugins-decl.txt create mode 100644 docs/plugins/gst-plugins-bad-plugins-docs.sgml create mode 100644 docs/plugins/gst-plugins-bad-plugins-overrides.txt create mode 100644 docs/plugins/gst-plugins-bad-plugins-sections.txt create mode 100644 docs/plugins/gst-plugins-bad-plugins-undocumented.txt create mode 100644 docs/plugins/gst-plugins-bad-plugins.args create mode 100644 docs/plugins/gst-plugins-bad-plugins.hierarchy create mode 100644 docs/plugins/gst-plugins-bad-plugins.interfaces create mode 100644 docs/plugins/gst-plugins-bad-plugins.prerequisites create mode 100644 docs/plugins/gst-plugins-bad-plugins.signals create mode 100644 docs/plugins/gst-plugins-bad-plugins.types create mode 100644 docs/plugins/inspect/plugin-dfbvideosink.xml create mode 100644 docs/version.entities.in create mode 100644 examples/directfb/Makefile.am create mode 100644 examples/directfb/decker.ttf create mode 100644 examples/directfb/dfblogo.png create mode 100644 examples/directfb/gstdfb.c diff --git a/ChangeLog b/ChangeLog index ba043a7e5c..eca267601a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,32 @@ +2005-11-06 Julien MOUTTE + + * Makefile.am: + * autogen.sh: + * configure.ac: + * docs/Makefile.am: + * docs/plugins/.cvsignore: + * docs/plugins/Makefile.am: + * docs/plugins/gst-plugins-bad-plugins-decl-list.txt: + * docs/plugins/gst-plugins-bad-plugins-decl.txt: + * docs/plugins/gst-plugins-bad-plugins-docs.sgml: + * docs/plugins/gst-plugins-bad-plugins-sections.txt: + * docs/plugins/gst-plugins-bad-plugins-undocumented.txt: + * docs/plugins/gst-plugins-bad-plugins.args: + * docs/plugins/gst-plugins-bad-plugins.hierarchy: + * docs/plugins/gst-plugins-bad-plugins.interfaces: + * docs/plugins/gst-plugins-bad-plugins.prerequisites: + * docs/plugins/gst-plugins-bad-plugins.signals: + * docs/plugins/gst-plugins-bad-plugins.types: + * docs/plugins/inspect/plugin-dfbvideosink.xml: + * docs/version.entities.in: Enable documentation. + * examples/Makefile.am: + * examples/directfb/Makefile.am: + * examples/directfb/decker.ttf: + * examples/directfb/dfblogo.png: + * examples/directfb/gstdfb.c: (myclock), (dynamic_link), + (size_changed), (setup_dynamic_link), (main): Add an example + application for DirectFB. + 2005-11-06 Julien MOUTTE * ext/directfb/Makefile.am: Add the example application. diff --git a/Makefile.am b/Makefile.am index b98fbf6514..0eccbb0fa2 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,8 @@ +DISTCHECK_CONFIGURE_FLAGS=--enable-gtk-doc + SUBDIRS = \ gst sys ext \ - m4 common + m4 common docs EXTRA_DIST = \ gst-plugins-bad.spec depcomp \ diff --git a/autogen.sh b/autogen.sh index 10835e5b7e..c5da29dd3c 100755 --- a/autogen.sh +++ b/autogen.sh @@ -25,7 +25,7 @@ then fi . common/gst-autogen.sh -CONFIGURE_DEF_OPT='--enable-maintainer-mode --enable-plugin-builddir --enable-debug --enable-DEBUG' +CONFIGURE_DEF_OPT='--enable-maintainer-mode --enable-gtk-doc' autogen_options $@ diff --git a/configure.ac b/configure.ac index e25b82c893..aee90dc0d9 100644 --- a/configure.ac +++ b/configure.ac @@ -427,6 +427,13 @@ GST_CFLAGS="-I\$(top_srcdir)/gst-libs -I\$(top_builddir)/gst-libs $GST_CFLAGS $G AC_SUBST(GST_LIBS) AC_SUBST(GST_CFLAGS) +dnl ###################### +dnl # Checks for gtk-doc # +dnl ###################### + +GTK_DOC_CHECK([1.3]) +AS_PATH_PYTHON([2.1]) + dnl ############################ dnl # Set up some more defines # dnl ############################ @@ -481,12 +488,17 @@ gst/speed/Makefile gst/qtdemux/Makefile gst/tta/Makefile sys/Makefile +examples/Makefile +examples/directfb/Makefile ext/Makefile ext/directfb/Makefile ext/faac/Makefile ext/faad/Makefile ext/gsm/Makefile ext/sdl/Makefile +docs/Makefile +docs/plugins/Makefile +docs/version.entities common/Makefile common/m4/Makefile m4/Makefile diff --git a/docs/Makefile.am b/docs/Makefile.am new file mode 100644 index 0000000000..2b9075b79d --- /dev/null +++ b/docs/Makefile.am @@ -0,0 +1,12 @@ +if ENABLE_GTK_DOC +GTK_DOC_DIRS = plugins +else +GTK_DOC_DIRS = +endif + +SUBDIRS = $(GTK_DOC_DIRS) +DIST_SUBDIRS = plugins + +EXTRA_DIST = \ + random/ChangeLog-0.8 \ + version.entities.in diff --git a/docs/plugins/.gitignore b/docs/plugins/.gitignore new file mode 100644 index 0000000000..2ef1402d13 --- /dev/null +++ b/docs/plugins/.gitignore @@ -0,0 +1,18 @@ +Makefile +Makefile.in + +*-decl.txt +*-decl-list.txt +*-undocumented.txt +*-unused.txt + +*.args +*.hierarchy +*.interfaces +*.prerequisites +*.signals + +html +sgml +xml +*.stamp diff --git a/docs/plugins/Makefile.am b/docs/plugins/Makefile.am new file mode 100644 index 0000000000..3ac322d593 --- /dev/null +++ b/docs/plugins/Makefile.am @@ -0,0 +1,113 @@ +GST_DOC_SCANOBJ = $(top_srcdir)/common/gstdoc-scangobj + +## Process this file with automake to produce Makefile.in + +# The name of the module, e.g. 'glib'. +#DOC_MODULE=gst-plugins-libs-@GST_MAJORMINOR@ +MODULE=gst-plugins-bad +DOC_MODULE=$(MODULE)-plugins + +# for upload.mak +DOC=$(MODULE)-plugins +FORMATS=html +html: html-build.stamp +include $(top_srcdir)/common/upload-doc.mak + +# generated basefiles +#basefiles = \ +## $(DOC_MODULE).types \ +# $(DOC_MODULE)-sections.txt \ +# $(DOC_MODULE)-docs.sgml + +# ugly hack to make -unused.sgml work +#unused-build.stamp: +# BUILDDIR=`pwd` && \ +# cd $(srcdir)/tmpl && \ +# ln -sf gstreamer-libs-unused.sgml \ +# $$BUILDDIR/tmpl/gstreamer-libs-@GST_MAJORMINOR@-unused.sgml +# touch unused-build.stamp + +# these rules are added to create parallel docs using GST_MAJORMINOR +#$(basefiles): gstreamer-libs-@GST_MAJORMINOR@%: gstreamer-libs% +# cp $< $@ + +#CLEANFILES = $(basefiles) + +# The top-level SGML file. Change it if you want. +DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml + +# The directory containing the source code. Relative to $(top_srcdir). +# gtk-doc will search all .c & .h files beneath here for inline comments +# documenting functions and macros. +DOC_SOURCE_DIR = $(top_srcdir) + +# Extra options to supply to gtkdoc-scan. +SCAN_OPTIONS= + +# FIXME : +# there's something wrong with gstreamer-sections.txt not being in the dist +# maybe it doesn't resolve; we're adding it below for now +#EXTRA_DIST = gstreamer.types.in gstreamer.hierarchy $(DOC_MODULE)-sections.txt gstreamer-sections.txt $(DOC_MAIN_SGML_FILE) + +# Extra options to supply to gtkdoc-mkdb. +MKDB_OPTIONS=--sgml-mode + +# Extra options to supply to gtkdoc-fixref. +# FIXME get the location of the installed gstreamer docs +#FIXXREF_OPTIONS=--extra-dir=../gst/html + +# Used for dependencies. +HFILE_GLOB=$(DOC_SOURCE_DIR)/*/*/*.h +CFILE_GLOB=$(DOC_SOURCE_DIR)/*/*/*.c + +# this is a wingo addition +# thomasvs: another nice wingo addition would be an explanation on why +# this is useful ;) + +SCANOBJ_DEPS = + +# Header files to ignore when scanning. +IGNORE_HFILES = +IGNORE_CFILES = + +# we add all .h files of elements that have signals/args we want +# sadly this also pulls in the private methods - maybe we should +# move those around in the source ? +# also, we should add some stuff here conditionally based on whether +# or not the plugin will actually build +# but I'm not sure about that - it might be this Just Works given that +# the registry won't have the element + +# FIXME: not ported yet +# $(top_srcdir)/ext/gnomevfs/gstgnomevfssink.c + +# example code that needs to be converted to xml and placed in xml/ +EXAMPLE_CFILES = \ + $(top_srcdir)/ext/directfb/dfb-example.c + +EXTRA_HFILES = \ + $(top_srcdir)/ext/directfb/dfbvideosink.h + +# Images to copy into HTML directory. +HTML_IMAGES = + +# Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). +content_files = + +# Other files to distribute. +extra_files = + +# CFLAGS and LDFLAGS for compiling scan program. Only needed if your app/lib +# contains GtkObjects/GObjects and you want to document signals and properties. +GTKDOC_CFLAGS = $(GST_BASE_CFLAGS) -I$(top_builddir) +GTKDOC_LIBS = $(SCANOBJ_DEPS) $(GST_BASE_LIBS) + +GTKDOC_CC=$(LIBTOOL) --mode=compile $(CC) +GTKDOC_LD=$(LIBTOOL) --mode=link $(CC) + +# If you need to override some of the declarations, place them in this file +# and uncomment this line. +#DOC_OVERRIDES = $(DOC_MODULE)-overrides.txt +DOC_OVERRIDES = + +include $(top_srcdir)/common/gtk-doc-plugins.mak diff --git a/docs/plugins/gst-plugins-bad-plugins-decl-list.txt b/docs/plugins/gst-plugins-bad-plugins-decl-list.txt new file mode 100644 index 0000000000..ad63ed4bd6 --- /dev/null +++ b/docs/plugins/gst-plugins-bad-plugins-decl-list.txt @@ -0,0 +1,18 @@ +
+dfbvideosink +GST_TYPE_DFBSURFACE +GST_IS_DFBSURFACE +GST_DFBSURFACE +GstDfbSurface +GstDfbVMode +GstDfbVideoSink +gst_dfbsurface_get_type + +GST_DFBVIDEOSINK +GST_IS_DFBVIDEOSINK +GST_TYPE_DFBVIDEOSINK +gst_dfbvideosink_get_type +GST_DFBVIDEOSINK_CLASS +GST_IS_DFBVIDEOSINK_CLASS +
+ diff --git a/docs/plugins/gst-plugins-bad-plugins-decl.txt b/docs/plugins/gst-plugins-bad-plugins-decl.txt new file mode 100644 index 0000000000..4e7cf514c1 --- /dev/null +++ b/docs/plugins/gst-plugins-bad-plugins-decl.txt @@ -0,0 +1,119 @@ + +GST_TYPE_DFBVIDEOSINK +#define GST_TYPE_DFBVIDEOSINK (gst_dfbvideosink_get_type()) + + +GST_DFBVIDEOSINK +#define GST_DFBVIDEOSINK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DFBVIDEOSINK, GstDfbVideoSink)) + + +GST_DFBVIDEOSINK_CLASS +#define GST_DFBVIDEOSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DFBVIDEOSINK, GstDfbVideoSink)) + + +GST_IS_DFBVIDEOSINK +#define GST_IS_DFBVIDEOSINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DFBVIDEOSINK)) + + +GST_IS_DFBVIDEOSINK_CLASS +#define GST_IS_DFBVIDEOSINK_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DFBVIDEOSINK)) + + +GstDfbVideoSink + + +GstDfbVideoSinkClass + + +GST_TYPE_DFBSURFACE +#define GST_TYPE_DFBSURFACE (gst_dfbsurface_get_type()) + + +GST_IS_DFBSURFACE +#define GST_IS_DFBSURFACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DFBSURFACE)) + + +GST_DFBSURFACE +#define GST_DFBSURFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DFBSURFACE, GstDfbSurface)) + + +GstDfbSurface + + +GstDfbSurface +struct _GstDfbSurface { + GstBuffer buffer; /* We extend GstBuffer */ + + IDirectFBSurface *surface; + + gint width; + gint height; + + gboolean locked; + + DFBSurfacePixelFormat pixel_format; + + GstDfbVideoSink *dfbvideosink; +}; + + +GstDfbVMode + + +GstDfbVMode +struct _GstDfbVMode { + gint width; + gint height; + gint bpp; +}; + + +GstDfbVideoSink +struct _GstDfbVideoSink { + /* Our element stuff */ + GstVideoSink videosink; + + GSList *buffer_pool; + + gdouble framerate; + gint video_width, video_height; /* size of incoming video */ + gint out_width, out_height; + + /* Standalone */ + IDirectFB *dfb; + + GSList *vmodes; /* Video modes */ + + gint layer_id; + IDirectFBDisplayLayer *layer; + IDirectFBSurface *primary; + IDirectFBEventBuffer *event_buffer; + GThread *event_thread; + + /* Embedded */ + IDirectFBSurface *ext_surface; + + DFBSurfacePixelFormat pixel_format; + + gboolean hw_scaling; + gboolean backbuffer; + gboolean setup; + gboolean running; +}; + + +GstDfbVideoSinkClass +struct _GstDfbVideoSinkClass { + GstVideoSinkClass parent_class; +}; + + +gst_dfbvideosink_get_type +GType +void + + +gst_dfbsurface_get_type +GType +void + diff --git a/docs/plugins/gst-plugins-bad-plugins-docs.sgml b/docs/plugins/gst-plugins-bad-plugins-docs.sgml new file mode 100644 index 0000000000..44c115fab3 --- /dev/null +++ b/docs/plugins/gst-plugins-bad-plugins-docs.sgml @@ -0,0 +1,25 @@ + + +%version-entities; +]> + + + + GStreamer Bad Plugins &GST_MAJORMINOR; Plugins Reference Manual + + + + gst-plugins-bad Elements + + + + + + gst-plugins-bad Plugins + + + + + diff --git a/docs/plugins/gst-plugins-bad-plugins-overrides.txt b/docs/plugins/gst-plugins-bad-plugins-overrides.txt new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/plugins/gst-plugins-bad-plugins-sections.txt b/docs/plugins/gst-plugins-bad-plugins-sections.txt new file mode 100644 index 0000000000..da82aa0cb4 --- /dev/null +++ b/docs/plugins/gst-plugins-bad-plugins-sections.txt @@ -0,0 +1,8 @@ +
+element-dfbvideosink +GstDfbVideoSink +dfbvideosink + +GstDfbVideoSinkClass +
+ diff --git a/docs/plugins/gst-plugins-bad-plugins-undocumented.txt b/docs/plugins/gst-plugins-bad-plugins-undocumented.txt new file mode 100644 index 0000000000..298053befe --- /dev/null +++ b/docs/plugins/gst-plugins-bad-plugins-undocumented.txt @@ -0,0 +1,9 @@ +75% symbol docs coverage. +3 symbols documented. +0 symbols incomplete. +1 not documented. + + +GstDfbVideoSink + + diff --git a/docs/plugins/gst-plugins-bad-plugins.args b/docs/plugins/gst-plugins-bad-plugins.args new file mode 100644 index 0000000000..91294e2a19 --- /dev/null +++ b/docs/plugins/gst-plugins-bad-plugins.args @@ -0,0 +1,9 @@ + +GstDfbVideoSink::surface +gpointer + +w +Destination surface +Render video frames to this surface. The pointer you pass here has to point to an IDirectFBSurface * interface +NULL + diff --git a/docs/plugins/gst-plugins-bad-plugins.hierarchy b/docs/plugins/gst-plugins-bad-plugins.hierarchy new file mode 100644 index 0000000000..5f18922a3e --- /dev/null +++ b/docs/plugins/gst-plugins-bad-plugins.hierarchy @@ -0,0 +1,20 @@ +GObject + GstObject + GstPad + GstPluginFeature + GstElementFactory + GstTypeFindFactory + GstIndexFactory + GstElement + GstBin + GstPipeline + GstQueue + GstBaseSink + GstVideoSink + GstDfbVideoSink + GstPlugin + GstRegistry + GstPadTemplate + GstSignalObject +GInterface + GstChildProxy diff --git a/docs/plugins/gst-plugins-bad-plugins.interfaces b/docs/plugins/gst-plugins-bad-plugins.interfaces new file mode 100644 index 0000000000..fc9ba12c39 --- /dev/null +++ b/docs/plugins/gst-plugins-bad-plugins.interfaces @@ -0,0 +1,2 @@ +GstBin GstChildProxy +GstPipeline GstChildProxy diff --git a/docs/plugins/gst-plugins-bad-plugins.prerequisites b/docs/plugins/gst-plugins-bad-plugins.prerequisites new file mode 100644 index 0000000000..f526a9f602 --- /dev/null +++ b/docs/plugins/gst-plugins-bad-plugins.prerequisites @@ -0,0 +1 @@ +GstChildProxy GstObject diff --git a/docs/plugins/gst-plugins-bad-plugins.signals b/docs/plugins/gst-plugins-bad-plugins.signals new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/docs/plugins/gst-plugins-bad-plugins.signals @@ -0,0 +1 @@ + diff --git a/docs/plugins/gst-plugins-bad-plugins.types b/docs/plugins/gst-plugins-bad-plugins.types new file mode 100644 index 0000000000..9f4950e70d --- /dev/null +++ b/docs/plugins/gst-plugins-bad-plugins.types @@ -0,0 +1 @@ +#include diff --git a/docs/plugins/inspect/plugin-dfbvideosink.xml b/docs/plugins/inspect/plugin-dfbvideosink.xml new file mode 100644 index 0000000000..83f5fb4e84 --- /dev/null +++ b/docs/plugins/inspect/plugin-dfbvideosink.xml @@ -0,0 +1,20 @@ + + dfbvideosink + DirectFB video sink + ../../ext/directfb/.libs/libgstdfbvideosink.so + libgstdfbvideosink.so + 0.9.4 + LGPL + gst-plugins-bad + GStreamer source release + http://gstreamer.freedesktop.org/ + + + dfbvideosink + DirectFB video sink + Sink/Video + DirectFB video sink + Julien Moutte <julien@moutte.net> + + + diff --git a/docs/version.entities.in b/docs/version.entities.in new file mode 100644 index 0000000000..79a68981d5 --- /dev/null +++ b/docs/version.entities.in @@ -0,0 +1,2 @@ + + diff --git a/examples/Makefile.am b/examples/Makefile.am index 4620963e66..8606cf8a2d 100644 --- a/examples/Makefile.am +++ b/examples/Makefile.am @@ -1,14 +1,14 @@ -if HAVE_GTK -GTK_SUBDIRS=dynparams level $(FT2_SUBDIRS) +#if HAVE_GTK +#GTK_SUBDIRS=dynparams level $(FT2_SUBDIRS) +#else +#GTK_SUBDIRS= +#endif + +if USE_DIRECTFB +DIRECTFB_DIR=directfb else -GTK_SUBDIRS= +DIRECTFB_DIR= endif -if USE_GCONF -GCONF_SUBDIRS=gstplay -else -GCONF_SUBDIRS= -endif - -SUBDIRS=$(GTK_SUBDIRS) $(GCONF_SUBDIRS) switch -DIST_SUBDIRS=capsfilter dynparams indexing gstplay switch level +SUBDIRS=$(GTK_SUBDIRS) $(GCONF_SUBDIRS) $(DIRECTFB_DIR) +DIST_SUBDIRS=capsfilter dynparams indexing gstplay directfb switch level diff --git a/examples/directfb/Makefile.am b/examples/directfb/Makefile.am new file mode 100644 index 0000000000..a9111488af --- /dev/null +++ b/examples/directfb/Makefile.am @@ -0,0 +1,6 @@ +noinst_PROGRAMS = gstdfb + +gstdfb_SOURCES = gstdfb.c +gstdfb_CFLAGS = $(GST_CFLAGS) $(DIRECTFB_CFLAGS) +gstdfb_LDFLAGS = $(GST_LIBS) $(DIRECTFB_LIBS) + diff --git a/examples/directfb/decker.ttf b/examples/directfb/decker.ttf new file mode 100644 index 0000000000000000000000000000000000000000..5e721cfdda3de809db25c6f75b21f02f53487a6f GIT binary patch literal 37048 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 literal 0 HcmV?d00001 diff --git a/examples/directfb/dfblogo.png b/examples/directfb/dfblogo.png new file mode 100644 index 0000000000000000000000000000000000000000..8b7d883365013be7eaa80c1390dda5c6031c4b6c GIT binary patch literal 7722 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 GNBkeoX5w%F literal 0 HcmV?d00001 diff --git a/examples/directfb/gstdfb.c b/examples/directfb/gstdfb.c new file mode 100644 index 0000000000..581142048e --- /dev/null +++ b/examples/directfb/gstdfb.c @@ -0,0 +1,514 @@ +/* + (c) Copyright 2000-2002 convergence integrated media GmbH. + All rights reserved. + + Written by Denis Oliver Kropp , + Andreas Hundt , + Sven Neumann and + Julien Moutte . + + This file is subject to the terms and conditions of the MIT License: + + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without restriction, + including without limitation the rights to use, copy, modify, merge, + publish, distribute, sublicense, and/or sell copies of the Software, + and to permit persons to whom the Software is furnished to do so, + subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +#include +#include +#include +#include +#include + +#include +#include +#include + +/* macro for a safe call to DirectFB functions */ +#define DFBCHECK(x...) \ + { \ + err = x; \ + if (err != DFB_OK) { \ + fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \ + DirectFBErrorFatal( #x, err ); \ + } \ + } + +typedef struct +{ + const gchar *padname; + GstPad *target; + GstElement *bin; +} dyn_link; + +static inline long +myclock () +{ + struct timeval tv; + + gettimeofday (&tv, NULL); + return (tv.tv_sec * 1000 + tv.tv_usec / 1000); +} + +static void +dynamic_link (GstPadTemplate * templ, GstPad * newpad, gpointer data) +{ + dyn_link *connect = (dyn_link *) data; + + if (connect->padname == NULL || + !strcmp (gst_pad_get_name (newpad), connect->padname)) { + gst_pad_link (newpad, connect->target); + } +} + +static void +size_changed (GObject * obj, GParamSpec * pspec, IDirectFBWindow * window) +{ + GstPad *pad = GST_PAD (obj); + GstStructure *s; + GstCaps *caps; + + if (!(caps = gst_pad_get_negotiated_caps (pad))) + return; + + s = gst_caps_get_structure (caps, 0); + if (s) { + gint width, height; + + if (!(gst_structure_get_int (s, "width", &width) && + gst_structure_get_int (s, "height", &height))) + return; + + window->Resize (window, width, height); + } +} + +static void +setup_dynamic_link (GstElement * element, const gchar * padname, + GstPad * target, GstElement * bin) +{ + dyn_link *connect; + + connect = g_new0 (dyn_link, 1); + connect->padname = g_strdup (padname); + connect->target = target; + connect->bin = bin; + + g_signal_connect (G_OBJECT (element), "pad-added", G_CALLBACK (dynamic_link), + connect); +} + +int +main (int argc, char *argv[]) +{ + IDirectFB *dfb; + IDirectFBDisplayLayer *layer; + + IDirectFBImageProvider *provider; + IDirectFBVideoProvider *video_provider; + + IDirectFBSurface *bgsurface; + + IDirectFBWindow *window1; + IDirectFBWindow *window2; + IDirectFBWindow *window3; + IDirectFBSurface *window_surface1; + IDirectFBSurface *window_surface2; + IDirectFBSurface *window_surface3; + + GstElement *pipeline; + + IDirectFBEventBuffer *buffer; + + IDirectFBFont *font; + + DFBDisplayLayerConfig layer_config; + DFBGraphicsDeviceDescription gdesc; + DFBWindowID id1; + DFBWindowID id2; + DFBWindowID id3; + + int fontheight; + int err; + int quit = 0; + + + DFBCHECK (DirectFBInit (&argc, &argv)); + gst_init (&argc, &argv); + DFBCHECK (DirectFBCreate (&dfb)); + + dfb->GetDeviceDescription (dfb, &gdesc); + + DFBCHECK (dfb->GetDisplayLayer (dfb, DLID_PRIMARY, &layer)); + + layer->SetCooperativeLevel (layer, DLSCL_ADMINISTRATIVE); + + if (!((gdesc.blitting_flags & DSBLIT_BLEND_ALPHACHANNEL) && + (gdesc.blitting_flags & DSBLIT_BLEND_COLORALPHA))) { + layer_config.flags = DLCONF_BUFFERMODE; + layer_config.buffermode = DLBM_BACKSYSTEM; + + layer->SetConfiguration (layer, &layer_config); + } + + layer->GetConfiguration (layer, &layer_config); + layer->EnableCursor (layer, 1); + + { + DFBFontDescription desc; + + desc.flags = DFDESC_HEIGHT; + desc.height = layer_config.width / 50; + + DFBCHECK (dfb->CreateFont (dfb, "decker.ttf", &desc, &font)); + font->GetHeight (font, &fontheight); + } + + if (argc < 2 || + dfb->CreateVideoProvider (dfb, argv[1], &video_provider) != DFB_OK) { + video_provider = NULL; + } + + { + DFBSurfaceDescription desc; + + desc.flags = DSDESC_WIDTH | DSDESC_HEIGHT; + desc.width = layer_config.width; + desc.height = layer_config.height; + + DFBCHECK (dfb->CreateSurface (dfb, &desc, &bgsurface)); + + DFBCHECK (bgsurface->SetFont (bgsurface, font)); + + bgsurface->SetColor (bgsurface, 0xCF, 0xCF, 0xFF, 0xFF); + bgsurface->DrawString (bgsurface, + "Move the mouse over a window to activate it.", + -1, 0, 0, DSTF_LEFT | DSTF_TOP); + + bgsurface->SetColor (bgsurface, 0xCF, 0xDF, 0xCF, 0xFF); + bgsurface->DrawString (bgsurface, + "Press left mouse button and drag to move the window.", + -1, 0, fontheight, DSTF_LEFT | DSTF_TOP); + + bgsurface->SetColor (bgsurface, 0xCF, 0xEF, 0x9F, 0xFF); + bgsurface->DrawString (bgsurface, + "Press middle mouse button to raise/lower the window.", + -1, 0, fontheight * 2, DSTF_LEFT | DSTF_TOP); + + bgsurface->SetColor (bgsurface, 0xCF, 0xFF, 0x6F, 0xFF); + bgsurface->DrawString (bgsurface, + "Press right mouse button when you are done.", -1, + 0, fontheight * 3, DSTF_LEFT | DSTF_TOP); + + layer->SetBackgroundImage (layer, bgsurface); + layer->SetBackgroundMode (layer, DLBM_IMAGE); + } + + { + DFBSurfaceDescription sdsc; + DFBWindowDescription desc; + + desc.flags = (DWDESC_POSX | DWDESC_POSY | DWDESC_WIDTH | DWDESC_HEIGHT); + + if (!video_provider) { + desc.caps = DWCAPS_ALPHACHANNEL; + desc.flags |= DWDESC_CAPS; + + sdsc.width = 300; + sdsc.height = 200; + } else { + video_provider->GetSurfaceDescription (video_provider, &sdsc); + + if (sdsc.flags & DSDESC_CAPS) { + desc.flags |= DWDESC_SURFACE_CAPS; + desc.surface_caps = sdsc.caps; + } + } + + desc.posx = 20; + desc.posy = 120; + desc.width = sdsc.width; + desc.height = sdsc.height; + + DFBCHECK (layer->CreateWindow (layer, &desc, &window2)); + window2->GetSurface (window2, &window_surface2); + + window2->SetOpacity (window2, 0xFF); + + window2->GetID (window2, &id2); + + window2->CreateEventBuffer (window2, &buffer); + + if (video_provider) { + video_provider->PlayTo (video_provider, window_surface2, + NULL, NULL, NULL); + } else { + window_surface2->SetColor (window_surface2, 0x00, 0x30, 0x10, 0xc0); + window_surface2->DrawRectangle (window_surface2, + 0, 0, desc.width, desc.height); + window_surface2->SetColor (window_surface2, 0x80, 0xa0, 0x00, 0x90); + window_surface2->FillRectangle (window_surface2, + 1, 1, desc.width - 2, desc.height - 2); + } + + window_surface2->Flip (window_surface2, NULL, 0); + } + + { + DFBWindowDescription desc; + + desc.flags = (DWDESC_POSX | DWDESC_POSY | + DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_CAPS); + desc.posx = 200; + desc.posy = 200; + desc.width = 512; + desc.height = 145; + desc.caps = DWCAPS_ALPHACHANNEL; + + DFBCHECK (layer->CreateWindow (layer, &desc, &window1)); + window1->GetSurface (window1, &window_surface1); + + DFBCHECK (dfb->CreateImageProvider (dfb, "dfblogo.png", &provider)); + provider->RenderTo (provider, window_surface1, NULL); + + window_surface1->SetColor (window_surface1, 0xFF, 0x20, 0x20, 0x90); + window_surface1->DrawRectangle (window_surface1, + 0, 0, desc.width, desc.height); + + window_surface1->Flip (window_surface1, NULL, 0); + + provider->Release (provider); + + window1->AttachEventBuffer (window1, buffer); + + window1->SetOpacity (window1, 0xFF); + + window1->GetID (window1, &id1); + } + + { + DFBWindowDescription desc; + GstElement *src, *decode; + GstElement *v_queue, *v_scale, *cs, *v_sink; + GstElement *a_queue, *conv, *a_sink; + GstPad *v_pad, *a_pad; + + desc.flags = (DWDESC_POSX | DWDESC_POSY | + DWDESC_WIDTH | DWDESC_HEIGHT | DWDESC_CAPS); + desc.posx = 10; + desc.posy = 10; + desc.width = 100; + desc.height = 100; + desc.caps = DWCAPS_ALPHACHANNEL; + + DFBCHECK (layer->CreateWindow (layer, &desc, &window3)); + window3->GetSurface (window3, &window_surface3); + + window3->AttachEventBuffer (window3, buffer); + + window3->SetOpacity (window3, 0xFF); + + window3->GetID (window3, &id3); + + pipeline = gst_pipeline_new ("pipeline"); + + src = gst_element_factory_make ("gnomevfssrc", "src"); + g_object_set (src, "location", argv[1], NULL); + decode = gst_element_factory_make ("decodebin", "decode"); + + v_queue = gst_element_factory_make ("queue", "v_queue"); + v_scale = gst_element_factory_make ("videoscale", "v_scale"); + cs = gst_element_factory_make ("ffmpegcolorspace", "cs"); + v_sink = gst_element_factory_make ("dfbvideosink", "v_sink"); + g_object_set (v_sink, "surface", window_surface3, NULL); + + a_queue = gst_element_factory_make ("queue", "a_queue"); + conv = gst_element_factory_make ("audioconvert", "conv"); + a_sink = gst_element_factory_make ("alsasink", "a_sink"); + + gst_bin_add_many (GST_BIN (pipeline), src, decode, NULL); + gst_bin_add_many (GST_BIN (pipeline), v_queue, v_scale, cs, v_sink, NULL); + gst_bin_add_many (GST_BIN (pipeline), a_queue, conv, a_sink, NULL); + + gst_element_link (src, decode); + gst_element_link_many (v_queue, v_scale, cs, v_sink, NULL); + gst_element_link_many (a_queue, conv, a_sink, NULL); + + v_pad = gst_element_get_pad (v_queue, "sink"); + a_pad = gst_element_get_pad (a_queue, "sink"); + + setup_dynamic_link (decode, NULL, v_pad, NULL); + setup_dynamic_link (decode, NULL, a_pad, NULL); + + /* We want to know when the size is defined */ + g_signal_connect (v_pad, "notify::caps", G_CALLBACK (size_changed), + window3); + + gst_object_unref (a_pad); + gst_object_unref (v_pad); + + gst_element_set_state (pipeline, GST_STATE_PLAYING); + } + + window1->RequestFocus (window1); + window1->RaiseToTop (window1); + + while (!quit) { + static IDirectFBWindow *active = NULL; + static int grabbed = 0; + static int startx = 0; + static int starty = 0; + static int endx = 0; + static int endy = 0; + DFBWindowEvent evt; + + buffer->WaitForEventWithTimeout (buffer, 0, 10); + + while (buffer->GetEvent (buffer, DFB_EVENT (&evt)) == DFB_OK) { + IDirectFBWindow *window; + + if (evt.window_id == id1) + window = window1; + else if (evt.window_id == id3) + window = window3; + else + window = window2; + + if (evt.type == DWET_GOTFOCUS) { + active = window; + } else if (active) { + switch (evt.type) { + + case DWET_BUTTONDOWN: + if (!grabbed && evt.button == DIBI_LEFT) { + grabbed = 1; + startx = evt.cx; + starty = evt.cy; + window->GrabPointer (window); + } + break; + + case DWET_BUTTONUP: + switch (evt.button) { + case DIBI_LEFT: + if (grabbed) { + window->UngrabPointer (window); + grabbed = 0; + } + break; + case DIBI_MIDDLE: + active->RaiseToTop (active); + break; + case DIBI_RIGHT: + quit = DIKS_DOWN; + break; + default: + break; + } + break; + + case DWET_KEYDOWN: + if (grabbed) + break; + switch (evt.key_id) { + case DIKI_RIGHT: + active->Move (active, 1, 0); + break; + case DIKI_LEFT: + active->Move (active, -1, 0); + break; + case DIKI_UP: + active->Move (active, 0, -1); + break; + case DIKI_DOWN: + active->Move (active, 0, 1); + break; + default: + break; + } + break; + + case DWET_LOSTFOCUS: + if (!grabbed && active == window) + active = NULL; + break; + + default: + break; + + } + } + + switch (evt.type) { + + case DWET_MOTION: + endx = evt.cx; + endy = evt.cy; + break; + + case DWET_KEYDOWN: + switch (evt.key_symbol) { + case DIKS_ESCAPE: + case DIKS_SMALL_Q: + case DIKS_CAPITAL_Q: + case DIKS_BACK: + case DIKS_STOP: + quit = 1; + break; + default: + break; + } + break; + + default: + break; + } + } + + if (video_provider) + window_surface2->Flip (window_surface2, NULL, 0); + + if (active) { + if (grabbed) { + active->Move (active, endx - startx, endy - starty); + startx = endx; + starty = endy; + } + active->SetOpacity (active, (sin (myclock () / 300.0) * 85) + 170); + } + } + + if (video_provider) + video_provider->Release (video_provider); + + gst_element_set_state (pipeline, GST_STATE_NULL); + + buffer->Release (buffer); + font->Release (font); + window_surface2->Release (window_surface2); + window_surface1->Release (window_surface1); + window_surface3->Release (window_surface3); + window2->Release (window2); + window1->Release (window1); + window3->Release (window3); + layer->Release (layer); + bgsurface->Release (bgsurface); + dfb->Release (dfb); + + return 42; +}