Enable documentation.

Original commit message from CVS:
2005-11-06  Julien MOUTTE  <julien@moutte.net>

* 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.
This commit is contained in:
Julien Moutte 2005-11-06 21:55:01 +00:00
parent 72e3851f87
commit 2438f5851e
26 changed files with 954 additions and 13 deletions

View file

@ -1,3 +1,32 @@
2005-11-06 Julien MOUTTE <julien@moutte.net>
* 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 <julien@moutte.net>
* ext/directfb/Makefile.am: Add the example application.

View file

@ -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 \

View file

@ -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 $@

View file

@ -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

12
docs/Makefile.am Normal file
View file

@ -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

18
docs/plugins/.gitignore vendored Normal file
View file

@ -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

113
docs/plugins/Makefile.am Normal file
View file

@ -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

View file

@ -0,0 +1,18 @@
<SECTION>
<FILE>dfbvideosink</FILE>
GST_TYPE_DFBSURFACE
GST_IS_DFBSURFACE
GST_DFBSURFACE
GstDfbSurface
GstDfbVMode
<TITLE>GstDfbVideoSink</TITLE>
gst_dfbsurface_get_type
<SUBSECTION Standard>
GST_DFBVIDEOSINK
GST_IS_DFBVIDEOSINK
GST_TYPE_DFBVIDEOSINK
gst_dfbvideosink_get_type
GST_DFBVIDEOSINK_CLASS
GST_IS_DFBVIDEOSINK_CLASS
</SECTION>

View file

@ -0,0 +1,119 @@
<MACRO>
<NAME>GST_TYPE_DFBVIDEOSINK</NAME>
#define GST_TYPE_DFBVIDEOSINK (gst_dfbvideosink_get_type())
</MACRO>
<MACRO>
<NAME>GST_DFBVIDEOSINK</NAME>
#define GST_DFBVIDEOSINK(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DFBVIDEOSINK, GstDfbVideoSink))
</MACRO>
<MACRO>
<NAME>GST_DFBVIDEOSINK_CLASS</NAME>
#define GST_DFBVIDEOSINK_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_DFBVIDEOSINK, GstDfbVideoSink))
</MACRO>
<MACRO>
<NAME>GST_IS_DFBVIDEOSINK</NAME>
#define GST_IS_DFBVIDEOSINK(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DFBVIDEOSINK))
</MACRO>
<MACRO>
<NAME>GST_IS_DFBVIDEOSINK_CLASS</NAME>
#define GST_IS_DFBVIDEOSINK_CLASS(obj) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_DFBVIDEOSINK))
</MACRO>
<STRUCT>
<NAME>GstDfbVideoSink</NAME>
</STRUCT>
<STRUCT>
<NAME>GstDfbVideoSinkClass</NAME>
</STRUCT>
<MACRO>
<NAME>GST_TYPE_DFBSURFACE</NAME>
#define GST_TYPE_DFBSURFACE (gst_dfbsurface_get_type())
</MACRO>
<MACRO>
<NAME>GST_IS_DFBSURFACE</NAME>
#define GST_IS_DFBSURFACE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_DFBSURFACE))
</MACRO>
<MACRO>
<NAME>GST_DFBSURFACE</NAME>
#define GST_DFBSURFACE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_DFBSURFACE, GstDfbSurface))
</MACRO>
<STRUCT>
<NAME>GstDfbSurface</NAME>
</STRUCT>
<STRUCT>
<NAME>GstDfbSurface</NAME>
struct _GstDfbSurface {
GstBuffer buffer; /* We extend GstBuffer */
IDirectFBSurface *surface;
gint width;
gint height;
gboolean locked;
DFBSurfacePixelFormat pixel_format;
GstDfbVideoSink *dfbvideosink;
};
</STRUCT>
<STRUCT>
<NAME>GstDfbVMode</NAME>
</STRUCT>
<STRUCT>
<NAME>GstDfbVMode</NAME>
struct _GstDfbVMode {
gint width;
gint height;
gint bpp;
};
</STRUCT>
<STRUCT>
<NAME>GstDfbVideoSink</NAME>
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;
};
</STRUCT>
<STRUCT>
<NAME>GstDfbVideoSinkClass</NAME>
struct _GstDfbVideoSinkClass {
GstVideoSinkClass parent_class;
};
</STRUCT>
<FUNCTION>
<NAME>gst_dfbvideosink_get_type</NAME>
<RETURNS>GType </RETURNS>
void
</FUNCTION>
<FUNCTION>
<NAME>gst_dfbsurface_get_type</NAME>
<RETURNS>GType </RETURNS>
void
</FUNCTION>

View file

@ -0,0 +1,25 @@
<?xml version="1.0"?>
<!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.1.2//EN"
"http://www.oasis-open.org/docbook/xml/4.1.2/docbookx.dtd" [
<!ENTITY % version-entities SYSTEM "version.entities">
%version-entities;
]>
<book id="index" xmlns:xi="http://www.w3.org/2003/XInclude">
<bookinfo>
<title>GStreamer Bad Plugins &GST_MAJORMINOR; Plugins Reference Manual</title>
</bookinfo>
<chapter>
<title>gst-plugins-bad Elements</title>
<xi:include href="xml/element-dfbvideosink.xml" />
</chapter>
<chapter>
<title>gst-plugins-bad Plugins</title>
<xi:include href="xml/plugin-dfbvideosink.xml" />
</chapter>
</book>

View file

@ -0,0 +1,8 @@
<SECTION>
<FILE>element-dfbvideosink</FILE>
GstDfbVideoSink
<TITLE>dfbvideosink</TITLE>
<SUBSECTION Standard>
GstDfbVideoSinkClass
</SECTION>

View file

@ -0,0 +1,9 @@
75% symbol docs coverage.
3 symbols documented.
0 symbols incomplete.
1 not documented.
GstDfbVideoSink

View file

@ -0,0 +1,9 @@
<ARG>
<NAME>GstDfbVideoSink::surface</NAME>
<TYPE>gpointer</TYPE>
<RANGE></RANGE>
<FLAGS>w</FLAGS>
<NICK>Destination surface</NICK>
<BLURB>Render video frames to this surface. The pointer you pass here has to point to an IDirectFBSurface * interface</BLURB>
<DEFAULT>NULL</DEFAULT>
</ARG>

View file

@ -0,0 +1,20 @@
GObject
GstObject
GstPad
GstPluginFeature
GstElementFactory
GstTypeFindFactory
GstIndexFactory
GstElement
GstBin
GstPipeline
GstQueue
GstBaseSink
GstVideoSink
GstDfbVideoSink
GstPlugin
GstRegistry
GstPadTemplate
GstSignalObject
GInterface
GstChildProxy

View file

@ -0,0 +1,2 @@
GstBin GstChildProxy
GstPipeline GstChildProxy

View file

@ -0,0 +1 @@
GstChildProxy GstObject

View file

@ -0,0 +1 @@

View file

@ -0,0 +1 @@
#include <gst/gst.h>

View file

@ -0,0 +1,20 @@
<plugin>
<name>dfbvideosink</name>
<description>DirectFB video sink</description>
<filename>../../ext/directfb/.libs/libgstdfbvideosink.so</filename>
<basename>libgstdfbvideosink.so</basename>
<version>0.9.4</version>
<license>LGPL</license>
<source>gst-plugins-bad</source>
<package>GStreamer source release</package>
<origin>http://gstreamer.freedesktop.org/</origin>
<elements>
<element>
<name>dfbvideosink</name>
<longname>DirectFB video sink</longname>
<class>Sink/Video</class>
<description>DirectFB video sink</description>
<author>Julien Moutte &lt;julien@moutte.net&gt;</author>
</element>
</elements>
</plugin>

2
docs/version.entities.in Normal file
View file

@ -0,0 +1,2 @@
<!ENTITY GST_MAJORMINOR "@GST_MAJORMINOR@">
<!ENTITY GST_VERSION "@VERSION@">

View file

@ -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

View file

@ -0,0 +1,6 @@
noinst_PROGRAMS = gstdfb
gstdfb_SOURCES = gstdfb.c
gstdfb_CFLAGS = $(GST_CFLAGS) $(DIRECTFB_CFLAGS)
gstdfb_LDFLAGS = $(GST_LIBS) $(DIRECTFB_LIBS)

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

514
examples/directfb/gstdfb.c Normal file
View file

@ -0,0 +1,514 @@
/*
(c) Copyright 2000-2002 convergence integrated media GmbH.
All rights reserved.
Written by Denis Oliver Kropp <dok@directfb.org>,
Andreas Hundt <andi@fischlustig.de>,
Sven Neumann <neo@directfb.org> and
Julien Moutte <julien@moutte.net>.
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 <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <time.h>
#include <directfb.h>
#include <gst/gst.h>
#include <string.h>
/* 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;
}