mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 01:00:37 +00:00
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:
parent
72e3851f87
commit
2438f5851e
26 changed files with 954 additions and 13 deletions
29
ChangeLog
29
ChangeLog
|
@ -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.
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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 $@
|
||||
|
||||
|
|
12
configure.ac
12
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
|
||||
|
|
12
docs/Makefile.am
Normal file
12
docs/Makefile.am
Normal 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
18
docs/plugins/.gitignore
vendored
Normal 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
113
docs/plugins/Makefile.am
Normal 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
|
18
docs/plugins/gst-plugins-bad-plugins-decl-list.txt
Normal file
18
docs/plugins/gst-plugins-bad-plugins-decl-list.txt
Normal 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>
|
||||
|
119
docs/plugins/gst-plugins-bad-plugins-decl.txt
Normal file
119
docs/plugins/gst-plugins-bad-plugins-decl.txt
Normal 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>
|
25
docs/plugins/gst-plugins-bad-plugins-docs.sgml
Normal file
25
docs/plugins/gst-plugins-bad-plugins-docs.sgml
Normal 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>
|
0
docs/plugins/gst-plugins-bad-plugins-overrides.txt
Normal file
0
docs/plugins/gst-plugins-bad-plugins-overrides.txt
Normal file
8
docs/plugins/gst-plugins-bad-plugins-sections.txt
Normal file
8
docs/plugins/gst-plugins-bad-plugins-sections.txt
Normal file
|
@ -0,0 +1,8 @@
|
|||
<SECTION>
|
||||
<FILE>element-dfbvideosink</FILE>
|
||||
GstDfbVideoSink
|
||||
<TITLE>dfbvideosink</TITLE>
|
||||
<SUBSECTION Standard>
|
||||
GstDfbVideoSinkClass
|
||||
</SECTION>
|
||||
|
9
docs/plugins/gst-plugins-bad-plugins-undocumented.txt
Normal file
9
docs/plugins/gst-plugins-bad-plugins-undocumented.txt
Normal file
|
@ -0,0 +1,9 @@
|
|||
75% symbol docs coverage.
|
||||
3 symbols documented.
|
||||
0 symbols incomplete.
|
||||
1 not documented.
|
||||
|
||||
|
||||
GstDfbVideoSink
|
||||
|
||||
|
9
docs/plugins/gst-plugins-bad-plugins.args
Normal file
9
docs/plugins/gst-plugins-bad-plugins.args
Normal 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>
|
20
docs/plugins/gst-plugins-bad-plugins.hierarchy
Normal file
20
docs/plugins/gst-plugins-bad-plugins.hierarchy
Normal 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
|
2
docs/plugins/gst-plugins-bad-plugins.interfaces
Normal file
2
docs/plugins/gst-plugins-bad-plugins.interfaces
Normal file
|
@ -0,0 +1,2 @@
|
|||
GstBin GstChildProxy
|
||||
GstPipeline GstChildProxy
|
1
docs/plugins/gst-plugins-bad-plugins.prerequisites
Normal file
1
docs/plugins/gst-plugins-bad-plugins.prerequisites
Normal file
|
@ -0,0 +1 @@
|
|||
GstChildProxy GstObject
|
1
docs/plugins/gst-plugins-bad-plugins.signals
Normal file
1
docs/plugins/gst-plugins-bad-plugins.signals
Normal file
|
@ -0,0 +1 @@
|
|||
|
1
docs/plugins/gst-plugins-bad-plugins.types
Normal file
1
docs/plugins/gst-plugins-bad-plugins.types
Normal file
|
@ -0,0 +1 @@
|
|||
#include <gst/gst.h>
|
20
docs/plugins/inspect/plugin-dfbvideosink.xml
Normal file
20
docs/plugins/inspect/plugin-dfbvideosink.xml
Normal 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 <julien@moutte.net></author>
|
||||
</element>
|
||||
</elements>
|
||||
</plugin>
|
2
docs/version.entities.in
Normal file
2
docs/version.entities.in
Normal file
|
@ -0,0 +1,2 @@
|
|||
<!ENTITY GST_MAJORMINOR "@GST_MAJORMINOR@">
|
||||
<!ENTITY GST_VERSION "@VERSION@">
|
|
@ -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
|
||||
|
|
6
examples/directfb/Makefile.am
Normal file
6
examples/directfb/Makefile.am
Normal file
|
@ -0,0 +1,6 @@
|
|||
noinst_PROGRAMS = gstdfb
|
||||
|
||||
gstdfb_SOURCES = gstdfb.c
|
||||
gstdfb_CFLAGS = $(GST_CFLAGS) $(DIRECTFB_CFLAGS)
|
||||
gstdfb_LDFLAGS = $(GST_LIBS) $(DIRECTFB_LIBS)
|
||||
|
BIN
examples/directfb/decker.ttf
Normal file
BIN
examples/directfb/decker.ttf
Normal file
Binary file not shown.
BIN
examples/directfb/dfblogo.png
Normal file
BIN
examples/directfb/dfblogo.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.5 KiB |
514
examples/directfb/gstdfb.c
Normal file
514
examples/directfb/gstdfb.c
Normal 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;
|
||||
}
|
Loading…
Reference in a new issue