Merge HEAD from CAPS-MERGE-2 to CAPS-MERGE-3

Original commit message from CVS:
Merge HEAD from CAPS-MERGE-2 to CAPS-MERGE-3
This commit is contained in:
David Schleef 2003-12-18 05:40:34 +00:00
parent 945bc373d1
commit 3754e36428
121 changed files with 2103 additions and 2344 deletions

View file

@ -1,3 +1,23 @@
2003-12-16 Thomas Vander Stichele <thomas at apestaart dot org>
* gst/gst.c:
* gst/gstplugin.c:
rename --enable-segfault to --disable-segtrap
2003-12-15 Thomas Vander Stichele <thomas at apestaart dot org>
* gst/gst.c: (init_popt_callback):
* gst/gstplugin.c: (_gst_plugin_fault_handler_restore),
(_gst_plugin_fault_handler_sighandler),
(_gst_plugin_fault_handler_setup), (gst_plugin_load_file):
Implemented fault handlers for catching SIGSEGV while loading
plug-ins
2003-12-02 Thomas Vander Stichele <thomas at apestaart dot org>
* fix documentation build using docbook2..., works on fc1 and rh9
* fix distcheck on fc1
2003-11-14 Thomas Vander Stichele <thomas at apestaart dot org> 2003-11-14 Thomas Vander Stichele <thomas at apestaart dot org>
* put GST_CACHE_DIR in config.h, as ordered by iain * put GST_CACHE_DIR in config.h, as ordered by iain

View file

@ -24,6 +24,8 @@ all-local: gst-element-check-@GST_MAJORMINOR@.m4
gst-element-check-@GST_MAJORMINOR@.m4: gst-element-check.m4 gst-element-check-@GST_MAJORMINOR@.m4: gst-element-check.m4
cp $(srcdir)/gst-element-check.m4 gst-element-check-@GST_MAJORMINOR@.m4 cp $(srcdir)/gst-element-check.m4 gst-element-check-@GST_MAJORMINOR@.m4
ACLOCAL_AMFLAGS = -I common/m4
aclocaldir = $(datadir)/aclocal aclocaldir = $(datadir)/aclocal
aclocal_DATA = gst-element-check-@GST_MAJORMINOR@.m4 aclocal_DATA = gst-element-check-@GST_MAJORMINOR@.m4

View file

@ -470,7 +470,6 @@ dnl ############################
dnl set license and copyright notice dnl set license and copyright notice
AC_DEFINE(GST_LICENSE, "LGPL", [GStreamer license]) AC_DEFINE(GST_LICENSE, "LGPL", [GStreamer license])
AC_DEFINE(GST_COPYRIGHT, "(c) 1999-2003 The GStreamer Team", [copyright message in plugins])
dnl package name in plugins dnl package name in plugins
AC_ARG_WITH(package-name, AC_ARG_WITH(package-name,
AC_HELP_STRING([--with-package-name],[specify package name to use in plugins]), AC_HELP_STRING([--with-package-name],[specify package name to use in plugins]),
@ -479,7 +478,7 @@ AC_HELP_STRING([--with-package-name],[specify package name to use in plugins]),
no) AC_MSG_ERROR(bad value ${withval} for --with-package-name) ;; no) AC_MSG_ERROR(bad value ${withval} for --with-package-name) ;;
*) GST_PACKAGE="${withval}" ;; *) GST_PACKAGE="${withval}" ;;
esac], esac],
[GST_PACKAGE="Gstreamer"]) dnl Default value [GST_PACKAGE="GStreamer"]) dnl Default value
AC_MSG_NOTICE(Using $GST_PACKAGE as package name) AC_MSG_NOTICE(Using $GST_PACKAGE as package name)
AC_DEFINE_UNQUOTED(GST_PACKAGE, "$GST_PACKAGE", [package name in plugins]) AC_DEFINE_UNQUOTED(GST_PACKAGE, "$GST_PACKAGE", [package name in plugins])
dnl package origin URL dnl package origin URL
@ -602,6 +601,7 @@ tests/seeking/Makefile
tests/sched/Makefile tests/sched/Makefile
tests/threadstate/Makefile tests/threadstate/Makefile
testsuite/Makefile testsuite/Makefile
testsuite/bins/Makefile
testsuite/bytestream/Makefile testsuite/bytestream/Makefile
testsuite/caps/Makefile testsuite/caps/Makefile
testsuite/caps2/Makefile testsuite/caps2/Makefile
@ -617,10 +617,8 @@ testsuite/refcounting/Makefile
testsuite/tags/Makefile testsuite/tags/Makefile
testsuite/threads/Makefile testsuite/threads/Makefile
examples/Makefile examples/Makefile
examples/autoplug/Makefile
examples/cutter/Makefile examples/cutter/Makefile
examples/helloworld/Makefile examples/helloworld/Makefile
examples/helloworld2/Makefile
examples/launch/Makefile examples/launch/Makefile
examples/manual/Makefile examples/manual/Makefile
examples/mixer/Makefile examples/mixer/Makefile

4
debian/control vendored
View file

@ -38,8 +38,8 @@ Recommends: libgstreamer-dev (= ${Source-Version})
Description: Core GStreamer documentation Description: Core GStreamer documentation
Core GStreamer documentation Core GStreamer documentation
. .
Gstreamer Manual GStreamer Manual
Gstreamer Plugin Writers Guide GStreamer Plugin Writers Guide
Various API docs Various API docs
Package: gstreamer-tools Package: gstreamer-tools

4
debian/control.in vendored
View file

@ -38,8 +38,8 @@ Recommends: libgstreamer-dev (= ${Source-Version})
Description: Core GStreamer documentation Description: Core GStreamer documentation
Core GStreamer documentation Core GStreamer documentation
. .
Gstreamer Manual GStreamer Manual
Gstreamer Plugin Writers Guide GStreamer Plugin Writers Guide
Various API docs Various API docs
Package: gstreamer-tools Package: gstreamer-tools

View file

@ -17,10 +17,9 @@
<!ENTITY CVS SYSTEM "cvs.xml"> <!ENTITY CVS SYSTEM "cvs.xml">
<!ENTITY DEVELOPING SYSTEM "developing.xml"> <!ENTITY DEVELOPING SYSTEM "developing.xml">
]> ]>
<article class="faq"> <article class="faq" id="index">
<articleinfo> <articleinfo>
<title>GStreamer FAQ</title> <title>GStreamer FAQ</title>
<abstract> <abstract>

View file

@ -258,7 +258,7 @@ uninstall-local:
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/index.sgml' ; \ echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/index.sgml' ; \
rm -f $(DESTDIR)$(TARGET_DIR)/index.sgml; \ rm -f $(DESTDIR)$(TARGET_DIR)/index.sgml; \
fi) fi)
rmdir -p --ignore-fail-on-non-empty $(DESTDIR)$(TARGET_DIR) if test -d $(DESTDIR)$(TARGET_DIR); then rmdir -p --ignore-fail-on-non-empty $(DESTDIR)$(TARGET_DIR); fi
else else
install-data-local: install-data-local:
uninstall-local: uninstall-local:

View file

@ -83,7 +83,6 @@ well as the object hierarchy that defines elements and bins, along
with some more specialized elements.</para> with some more specialized elements.</para>
&Gst; &Gst;
&GstAutoplug;
&GstBin; &GstBin;
&GstBuffer; &GstBuffer;
&GstConfig; &GstConfig;

View file

@ -1,5 +1,5 @@
<!-- ##### SECTION Title ##### --> <!-- ##### SECTION Title ##### -->
Gstreamer GStreamer
<!-- ##### SECTION Short_Description ##### --> <!-- ##### SECTION Short_Description ##### -->
Media library supporting arbitrary formats and filter graphs. Media library supporting arbitrary formats and filter graphs.
@ -112,14 +112,6 @@ pipeline</ulink> and Microsoft's DirectShow for some background.
@Returns: @Returns:
<!-- ##### FUNCTION gst_init_get_popt_table ##### -->
<para>
</para>
@Returns:
<!-- ##### FUNCTION gst_version ##### --> <!-- ##### FUNCTION gst_version ##### -->
<para> <para>

View file

@ -265,6 +265,7 @@ The basic structure of a buffer.
@offset_end: @offset_end:
@pool: @pool:
@pool_private: @pool_private:
@_gst_reserved:
<!-- ##### FUNCTION gst_buffer_new ##### --> <!-- ##### FUNCTION gst_buffer_new ##### -->
<para> <para>

View file

@ -92,6 +92,7 @@ The bufferpool structure
@buffer_copy: @buffer_copy:
@buffer_free: @buffer_free:
@user_data: @user_data:
@_gst_reserved:
<!-- ##### USER_FUNCTION GstBufferPoolBufferNewFunction ##### --> <!-- ##### USER_FUNCTION GstBufferPoolBufferNewFunction ##### -->
<para> <para>

View file

@ -44,13 +44,6 @@ If a subsystem is disabled in GStreamer, a value is defined in
<!-- ##### MACRO GST_DISABLE_AUTOPLUG ##### -->
<para>
</para>
<!-- ##### MACRO GST_DISABLE_ENUMTYPES ##### --> <!-- ##### MACRO GST_DISABLE_ENUMTYPES ##### -->
<para> <para>

View file

@ -85,6 +85,7 @@ The base structure
@flags: The flags of this GstData @flags: The flags of this GstData
@free: A pointer to a custom free function @free: A pointer to a custom free function
@copy: A pointer to a custom copy function @copy: A pointer to a custom copy function
@_gst_reserved:
<!-- ##### USER_FUNCTION GstDataFreeFunction ##### --> <!-- ##### USER_FUNCTION GstDataFreeFunction ##### -->
<para> <para>

View file

@ -64,6 +64,7 @@ describes the element, mostly for the benefit of editors.
@klass: @klass:
@description: @description:
@author: @author:
@_gst_reserved:
<!-- ##### FUNCTION gst_element_factory_find ##### --> <!-- ##### FUNCTION gst_element_factory_find ##### -->
<para> <para>

View file

@ -785,8 +785,11 @@ Flags for the pad.
</para> </para>
@padlist: @pad:
@Varargs:
@Returns: @Returns:
<!-- # Unused Parameters # -->
@padlist:
<!-- ##### FUNCTION gst_pad_selectv ##### --> <!-- ##### FUNCTION gst_pad_selectv ##### -->
@ -794,9 +797,11 @@ Flags for the pad.
</para> </para>
@padlist:
@Returns:
<!-- # Unused Parameters # -->
@pad: @pad:
@Varargs: @Varargs:
@Returns:
<!-- ##### FUNCTION gst_pad_dispatcher ##### --> <!-- ##### FUNCTION gst_pad_dispatcher ##### -->
@ -1090,6 +1095,7 @@ The realpad object
@intlinkfunc: @intlinkfunc:
@bufferpoolfunc: @bufferpoolfunc:
@probedisp: @probedisp:
@_gst_reserved:
<!-- ##### MACRO GST_RPAD_DIRECTION ##### --> <!-- ##### MACRO GST_RPAD_DIRECTION ##### -->
<para> <para>

View file

@ -69,6 +69,7 @@ The plugin object
@numfeatures: @numfeatures:
@manager: @manager:
@module: @module:
@_gst_reserved:
<!-- ##### USER_FUNCTION GstPluginInitFunc ##### --> <!-- ##### USER_FUNCTION GstPluginInitFunc ##### -->
<para> <para>
@ -96,9 +97,9 @@ loaded will use this variable to initialize the plugin.
@plugin_exit: @plugin_exit:
@version: @version:
@license: @license:
@copyright:
@package: @package:
@origin: @origin:
@_gst_reserved:
<!-- ##### FUNCTION gst_plugin_set_name ##### --> <!-- ##### FUNCTION gst_plugin_set_name ##### -->
<para> <para>

View file

@ -1992,6 +1992,12 @@ to the current function, i.e. "('element')"
@format: printf-style format string @format: printf-style format string
@args...: printf arguments @args...: printf arguments
<!-- ##### MACRO GST_DISABLE_AUTOPLUG ##### -->
<para>
</para>
<!-- ##### MACRO GST_DISABLE_TYPEFIND ##### --> <!-- ##### MACRO GST_DISABLE_TYPEFIND ##### -->
<para> <para>
@ -8950,6 +8956,13 @@ of an element he doesn't need anymore.
@format: @format:
@args...: @args...:
<!-- ##### FUNCTION gst_init_get_popt_table ##### -->
<para>
</para>
@Returns:
<!-- ##### FUNCTION gst_link_get_type ##### --> <!-- ##### FUNCTION gst_link_get_type ##### -->
======= =======

View file

@ -49,6 +49,7 @@ The registry object
@loaded: @loaded:
@plugins: @plugins:
@paths: @paths:
@_gst_reserved:
<!-- ##### FUNCTION gst_registry_load ##### --> <!-- ##### FUNCTION gst_registry_load ##### -->
<para> <para>

View file

@ -4,12 +4,12 @@
if DOC_HTML if DOC_HTML
install-data-local: html install-data-local: html
mkdir -p $(docdir) $(mkinstalldirs) $(DESTDIR)$(docdir)
cp -pr $(HTML_DAT) $(docdir) cp -pr $(HTML_DAT) $(DESTDIR)$(docdir)
uninstall-local: uninstall-local:
for part in $(HTML_DAT); do rm -rf $(docdir)/$$part; done for part in $(HTML_DAT); do rm -rf $(DESTDIR)$(docdir)/$$part; done
rmdir $(docdir) if test -d $(DESTDIR)$(docdir); then rmdir $(DESTDIR)$(docdir); fi
else else
install-data-local: install-data-local:
uninstall-local: uninstall-local:

View file

@ -257,7 +257,7 @@ uninstall-local:
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/index.sgml' ; \ echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/index.sgml' ; \
rm -f $(DESTDIR)$(TARGET_DIR)/index.sgml; \ rm -f $(DESTDIR)$(TARGET_DIR)/index.sgml; \
fi) fi)
rmdir -p --ignore-fail-on-non-empty $(DESTDIR)$(TARGET_DIR) if test -d $(DESTDIR)$(TARGET_DIR); then rmdir -p --ignore-fail-on-non-empty $(DESTDIR)$(TARGET_DIR); fi
else else
install-data-local: install-data-local:
uninstall-local: uninstall-local:

View file

@ -95,7 +95,7 @@ html/index.html: $(BUILDDIR)/$(MAIN) $(PNG_BUILT) $(FIG_SRC)
@echo "*** Generating HTML output ***" @echo "*** Generating HTML output ***"
@-mkdir -p html @-mkdir -p html
@cp -f $(srcdir)/../image-png $(BUILDDIR)/image.entities @cp -f $(srcdir)/../image-png $(BUILDDIR)/image.entities
@cd $(BUILDDIR) && xmlto html -o ../html $(MAIN) @cd $(BUILDDIR) && docbook2html -o ../html -V '%use-id-as-filename%' $(MAIN)
@test "x$(CSS)" != "x" && \ @test "x$(CSS)" != "x" && \
echo "Copying .css files: $(CSS)" && \ echo "Copying .css files: $(CSS)" && \
cp $(srcdir)/$(CSS) html cp $(srcdir)/$(CSS) html
@ -165,8 +165,9 @@ $(BUILDIMAGESDIR)/%.ps: %.png
@cat $< | pngtopnm | pnmtops -noturn > $@ 2> /dev/null @cat $< | pngtopnm | pnmtops -noturn > $@ 2> /dev/null
# make sure xml validates properly # make sure xml validates properly
#check-local: check-local: $(BUILDDIR)/$(MAIN)
# xmllint -noout -valid $(srcdir)/$(MAIN) @cp -f $(srcdir)/../image-png $(BUILDDIR)/image.entities
cd $(BUILDDIR) && xmllint -noout -valid $(MAIN)
### this is a website upload target ### this is a website upload target

View file

@ -14,8 +14,8 @@
<!-- ############ sect1 ############# --> <!-- ############ sect1 ############# -->
<sect1 id="sect1-boiler-source" xreflabel="Getting the Gstreamer Plugin Templates"> <sect1 id="sect1-boiler-source" xreflabel="Getting the GStreamer Plugin Templates">
<title>Getting the Gstreamer Plugin Templates</title> <title>Getting the GStreamer Plugin Templates</title>
<para> <para>
There are currently two ways to develop a new plugin for &GStreamer;: You There are currently two ways to develop a new plugin for &GStreamer;: You
can write the entire plugin by hand, or you can copy an existing plugin can write the entire plugin by hand, or you can copy an existing plugin

View file

@ -38,7 +38,7 @@
<!ENTITY GstLibRef "<emphasis>GStreamer Library Reference</emphasis>"> <!ENTITY GstLibRef "<emphasis>GStreamer Library Reference</emphasis>">
]> ]>
<book id="book-gst-plugin-writers-guide"> <book id="index">
&TITLEPAGE; &TITLEPAGE;
<!-- ############# part ############### --> <!-- ############# part ############### -->

View file

@ -4,7 +4,7 @@ else
GST_LOADSAVE_DIRS = xml typefind GST_LOADSAVE_DIRS = xml typefind
endif endif
SUBDIRS = \ dirs = \
helloworld \ helloworld \
queue \ queue \
queue2 \ queue2 \
@ -17,22 +17,9 @@ SUBDIRS = \
cutter \ cutter \
pingpong \ pingpong \
manual \ manual \
retag \
$(GST_LOADSAVE_DIRS)
DIST_SUBDIRS = helloworld \
queue \
queue2 \
queue3 \
queue4 \
launch \
thread \
plugins \
mixer \
cutter \
pingpong \
manual \
xml \
typefind \
retag retag
SUBDIRS = $(dirs) \
$(GST_LOADSAVE_DIRS)
DIST_SUBDIRS = $(dirs) xml typefind

View file

@ -1,2 +0,0 @@
autoplug
xmlTest.gst

View file

@ -1,4 +0,0 @@
noinst_PROGRAMS = autoplug
autoplug_LDADD = $(GST_LIBS)
autoplug_CFLAGS = $(GST_CFLAGS)

View file

@ -1,152 +0,0 @@
#include <gst/gst.h>
static void
gst_play_have_type (GstElement *typefind, GstCaps *caps, GstElement *pipeline)
{
GstElement *osssink, *videosink, *videoelement, *colorspace;
GstElement *new_element;
GstAutoplug *autoplug;
GstElement *autobin;
GstElement *filesrc;
GstElement *cache;
GST_DEBUG ("GstPipeline: play have type");
gst_element_set_state (pipeline, GST_STATE_PAUSED);
filesrc = gst_bin_get_by_name (GST_BIN (pipeline), "disk_source");
autobin = gst_bin_get_by_name (GST_BIN (pipeline), "autobin");
cache = gst_bin_get_by_name (GST_BIN (autobin), "cache");
/* unlink the typefind from the pipeline and remove it */
gst_element_unlink_pads (cache, "src", typefind, "sink");
gst_bin_remove (GST_BIN (autobin), typefind);
/* and an audio sink */
osssink = gst_element_factory_make ("osssink", "play_audio");
g_assert (osssink != NULL);
videosink = gst_bin_new ("videosink");
/* and an video sink */
videoelement = gst_element_factory_make ("xvideosink", "play_video");
g_assert (videosink != NULL);
colorspace = gst_element_factory_make ("colorspace", "colorspace");
g_assert (colorspace != NULL);
gst_element_link_pads (colorspace, "src", videoelement, "sink");
gst_bin_add (GST_BIN (videosink), colorspace);
gst_bin_add (GST_BIN (videosink), videoelement);
gst_element_add_ghost_pad (videosink,
gst_element_get_pad (colorspace, "sink"), "sink");
autoplug = gst_autoplug_factory_make ("staticrender");
g_assert (autoplug != NULL);
new_element = gst_autoplug_to_renderers (autoplug,
caps,
videosink,
osssink,
NULL);
if (!new_element) {
g_print ("could not autoplug, no suitable codecs found...\n");
exit (-1);
}
gst_element_set_name (new_element, "new_element");
gst_bin_add (GST_BIN (autobin), new_element);
g_object_set (G_OBJECT (cache), "reset", TRUE, NULL);
gst_element_link_pads (cache, "src", new_element, "sink");
gst_element_set_state (pipeline, GST_STATE_PLAYING);
#ifndef GST_DISABLE_LOADSAVE
gst_xml_write_file (GST_ELEMENT (pipeline), fopen ("xmlTest.gst", "w"));
#endif
}
static void
gst_play_cache_empty (GstElement *element, GstElement *pipeline)
{
GstElement *autobin;
GstElement *filesrc;
GstElement *cache;
GstElement *new_element;
fprintf (stderr, "have cache empty\n");
gst_element_set_state (pipeline, GST_STATE_PAUSED);
filesrc = gst_bin_get_by_name (GST_BIN (pipeline), "disk_source");
autobin = gst_bin_get_by_name (GST_BIN (pipeline), "autobin");
cache = gst_bin_get_by_name (GST_BIN (autobin), "cache");
new_element = gst_bin_get_by_name (GST_BIN (autobin), "new_element");
gst_element_unlink_many (filesrc, cache, new_element, NULL);
gst_bin_remove (GST_BIN (autobin), cache);
gst_element_link_pads (filesrc, "src", new_element, "sink");
gst_element_set_state (pipeline, GST_STATE_PLAYING);
fprintf (stderr, "done with cache_empty\n");
}
int main(int argc,char *argv[])
{
GstElement *filesrc;
GstElement *pipeline;
GstElement *autobin;
GstElement *typefind;
GstElement *cache;
g_thread_init(NULL);
gst_init(&argc,&argv);
if (argc != 2) {
g_print("usage: %s <filename>\n", argv[0]);
exit(-1);
}
/* create a new pipeline to hold the elements */
pipeline = gst_pipeline_new("pipeline");
g_assert(pipeline != NULL);
/* create a disk reader */
filesrc = gst_element_factory_make("filesrc", "disk_source");
g_assert(filesrc != NULL);
g_object_set(G_OBJECT(filesrc),"location", argv[1],NULL);
gst_bin_add (GST_BIN (pipeline), filesrc);
autobin = gst_bin_new ("autobin");
cache = gst_element_factory_make ("autoplugcache", "cache");
g_signal_connect (G_OBJECT (cache), "cache_empty", G_CALLBACK (gst_play_cache_empty), pipeline);
typefind = gst_element_factory_make ("typefind", "typefind");
g_signal_connect (G_OBJECT (typefind), "have_type", G_CALLBACK (gst_play_have_type), pipeline);
gst_bin_add (GST_BIN (autobin), cache);
gst_bin_add (GST_BIN (autobin), typefind);
gst_element_link_pads (cache, "src", typefind, "sink");
gst_element_add_ghost_pad (autobin, gst_element_get_pad (cache, "sink"), "sink");
gst_bin_add (GST_BIN( pipeline), autobin);
gst_element_link_pads (filesrc, "src", autobin, "sink");
/* start playing */
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
while (gst_bin_iterate (GST_BIN (pipeline)));
/* stop the pipeline */
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
gst_object_unref (GST_OBJECT (pipeline));
exit(0);
}

View file

@ -422,11 +422,6 @@ GST_PLUGIN_DEFINE (
"0.1", /* The version number of the plugin */ "0.1", /* The version number of the plugin */
"LGPL", /* ieffective license the plugin can be shipped with. Must be "LGPL", /* ieffective license the plugin can be shipped with. Must be
* valid for all libraries it links to, too. */ * valid for all libraries it links to, too. */
"(c) 2003 E. Xamplewriter",
/* Copyright holder for this plugin. This does not include
* the libraries it links to, contrary to the license. This
* field should be considered informational and not legally
* binding */
"my nifty plugin package", "my nifty plugin package",
/* package this plugin belongs to. */ /* package this plugin belongs to. */
"http://www.mydomain.com" "http://www.mydomain.com"

View file

@ -10,7 +10,7 @@ libgstspider_la_CFLAGS = $(GST_CFLAGS)
libgstspider_la_LIBADD = libgstspider_la_LIBADD =
libgstspider_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) libgstspider_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
noinst_HEADERS = gstspider.h gstsearchfuncs.h noinst_HEADERS = gstspider.h gstspideridentity.h gstsearchfuncs.h
noinst_PROGRAMS = spidertest noinst_PROGRAMS = spidertest

View file

@ -593,6 +593,15 @@ gst_spider_plug_from_srcpad (GstSpiderConnection *conn, GstPad *srcpad)
GST_DEBUG ("trying to plug from %s:%s to %s", GST_DEBUG ("trying to plug from %s:%s to %s",
GST_DEBUG_PAD_NAME (srcpad), GST_ELEMENT_NAME (conn->src)); GST_DEBUG_PAD_NAME (srcpad), GST_ELEMENT_NAME (conn->src));
/* see if they match already */
if (gst_pad_link (srcpad, conn->src->sink)) {
GST_DEBUG ("%s:%s and %s:%s can link directly",
GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (conn->src->sink));
gst_pad_unlink (srcpad, conn->src->sink);
gst_spider_create_and_plug (conn, NULL);
return GST_PAD_LINK_OK;
}
/* find a path from src to sink */ /* find a path from src to sink */
plugpath = gst_autoplug_sp (gst_pad_get_caps (srcpad), gst_pad_get_caps (conn->src->sink), spider->factories); plugpath = gst_autoplug_sp (gst_pad_get_caps (srcpad), gst_pad_get_caps (conn->src->sink), spider->factories);
@ -664,7 +673,6 @@ GST_PLUGIN_DEFINE (
plugin_init, plugin_init,
VERSION, VERSION,
GST_LICENSE, GST_LICENSE,
GST_COPYRIGHT,
GST_PACKAGE, GST_PACKAGE,
GST_ORIGIN GST_ORIGIN
) )

View file

@ -335,7 +335,7 @@ gst_aggregator_loop (GstElement *element)
debug = "loop_select"; debug = "loop_select";
pad = gst_pad_select (aggregator->sinkpads); pad = gst_pad_selectv (aggregator->sinkpads);
buf = GST_BUFFER (gst_pad_pull (pad)); buf = GST_BUFFER (gst_pad_pull (pad));
gst_aggregator_push (aggregator, pad, buf, debug); gst_aggregator_push (aggregator, pad, buf, debug);

View file

@ -95,7 +95,6 @@ GST_PLUGIN_DEFINE (
plugin_init, plugin_init,
VERSION, VERSION,
GST_LICENSE, GST_LICENSE,
GST_COPYRIGHT,
GST_PACKAGE, GST_PACKAGE,
GST_ORIGIN GST_ORIGIN
) )

View file

@ -195,7 +195,7 @@ gst_tee_getcaps (GstPad *pad)
pads = gst_element_get_pad_list (GST_ELEMENT (tee)); pads = gst_element_get_pad_list (GST_ELEMENT (tee));
while (pads) { while (pads) {
GstPad *srcpad = GST_PAD_CAST (pads->data); GstPad *srcpad = GST_PAD (pads->data);
GstPad *peer; GstPad *peer;
const GstCaps2 *peercaps; const GstCaps2 *peercaps;
GstCaps2 *newcaps; GstCaps2 *newcaps;

View file

@ -367,16 +367,17 @@ stop_typefinding (GstTypeFindElement *typefind)
if (push_cached_buffers) { if (push_cached_buffers) {
GstBuffer *buffer; GstBuffer *buffer;
guint size = gst_buffer_store_get_size (typefind->store, 0); guint size = gst_buffer_store_get_size (typefind->store, 0);
if (size && (buffer = gst_buffer_store_get_buffer (typefind->store, 0, size))) {
gst_pad_push (typefind->src, GST_DATA (buffer));
} else {
size = 0;
}
GST_LOG_OBJECT (typefind, "seeking back to current position %u", size); GST_LOG_OBJECT (typefind, "seeking back to current position %u", size);
if (!gst_pad_send_event (GST_PAD_PEER (typefind->sink), if (!gst_pad_send_event (GST_PAD_PEER (typefind->sink),
gst_event_new_seek (GST_SEEK_METHOD_SET | GST_FORMAT_BYTES, size))) { gst_event_new_seek (GST_SEEK_METHOD_SET | GST_FORMAT_BYTES, size))) {
GST_WARNING_OBJECT (typefind, "could not seek to required position %u, hope for the best", size); GST_WARNING_OBJECT (typefind, "could not seek to required position %u, hope for the best", size);
} }
if (size && (buffer = gst_buffer_store_get_buffer (typefind->store, 0, size))) {
gst_pad_push (typefind->src, GST_DATA (buffer));
} else {
size = 0;
}
} }
gst_buffer_store_clear (typefind->store); gst_buffer_store_clear (typefind->store);
} }

View file

@ -367,16 +367,17 @@ stop_typefinding (GstTypeFindElement *typefind)
if (push_cached_buffers) { if (push_cached_buffers) {
GstBuffer *buffer; GstBuffer *buffer;
guint size = gst_buffer_store_get_size (typefind->store, 0); guint size = gst_buffer_store_get_size (typefind->store, 0);
if (size && (buffer = gst_buffer_store_get_buffer (typefind->store, 0, size))) {
gst_pad_push (typefind->src, GST_DATA (buffer));
} else {
size = 0;
}
GST_LOG_OBJECT (typefind, "seeking back to current position %u", size); GST_LOG_OBJECT (typefind, "seeking back to current position %u", size);
if (!gst_pad_send_event (GST_PAD_PEER (typefind->sink), if (!gst_pad_send_event (GST_PAD_PEER (typefind->sink),
gst_event_new_seek (GST_SEEK_METHOD_SET | GST_FORMAT_BYTES, size))) { gst_event_new_seek (GST_SEEK_METHOD_SET | GST_FORMAT_BYTES, size))) {
GST_WARNING_OBJECT (typefind, "could not seek to required position %u, hope for the best", size); GST_WARNING_OBJECT (typefind, "could not seek to required position %u, hope for the best", size);
} }
if (size && (buffer = gst_buffer_store_get_buffer (typefind->store, 0, size))) {
gst_pad_push (typefind->src, GST_DATA (buffer));
} else {
size = 0;
}
} }
gst_buffer_store_clear (typefind->store); gst_buffer_store_clear (typefind->store);
} }

View file

@ -55,6 +55,9 @@ static gboolean gst_initialized = FALSE;
static gboolean _gst_initialization_failure = FALSE; static gboolean _gst_initialization_failure = FALSE;
extern gint _gst_trace_on; extern gint _gst_trace_on;
/* set to TRUE when segfaults need to be left as is */
gboolean _gst_disable_segtrap = FALSE;
extern GThreadFunctions gst_thread_dummy_functions; extern GThreadFunctions gst_thread_dummy_functions;
@ -96,6 +99,7 @@ enum {
ARG_PLUGIN_SPEW, ARG_PLUGIN_SPEW,
ARG_PLUGIN_PATH, ARG_PLUGIN_PATH,
ARG_PLUGIN_LOAD, ARG_PLUGIN_LOAD,
ARG_SEGTRAP_DISABLE,
ARG_SCHEDULER, ARG_SCHEDULER,
ARG_REGISTRY ARG_REGISTRY
}; };
@ -122,6 +126,7 @@ static const struct poptOption gstreamer_options[] = {
{"gst-plugin-spew", NUL, POPT_ARG_NONE|POPT_ARGFLAG_STRIP, NULL, ARG_PLUGIN_SPEW, N_("enable verbose plugin loading diagnostics"), NULL}, {"gst-plugin-spew", NUL, POPT_ARG_NONE|POPT_ARGFLAG_STRIP, NULL, ARG_PLUGIN_SPEW, N_("enable verbose plugin loading diagnostics"), NULL},
{"gst-plugin-path", NUL, POPT_ARG_STRING|POPT_ARGFLAG_STRIP, NULL, ARG_PLUGIN_PATH, N_("'" G_SEARCHPATH_SEPARATOR_S "'--separated path list for loading plugins"), "PATHS"}, {"gst-plugin-path", NUL, POPT_ARG_STRING|POPT_ARGFLAG_STRIP, NULL, ARG_PLUGIN_PATH, N_("'" G_SEARCHPATH_SEPARATOR_S "'--separated path list for loading plugins"), "PATHS"},
{"gst-plugin-load", NUL, POPT_ARG_STRING|POPT_ARGFLAG_STRIP, NULL, ARG_PLUGIN_LOAD, N_("comma-separated list of plugins to preload in addition to the list stored in env variable GST_PLUGIN_PATH"), "PLUGINS"}, {"gst-plugin-load", NUL, POPT_ARG_STRING|POPT_ARGFLAG_STRIP, NULL, ARG_PLUGIN_LOAD, N_("comma-separated list of plugins to preload in addition to the list stored in env variable GST_PLUGIN_PATH"), "PLUGINS"},
{"gst-disable-segtrap",NUL, POPT_ARG_NONE|POPT_ARGFLAG_STRIP, NULL, ARG_SEGTRAP_DISABLE,N_("disable trapping of segmentation faults during plugin loading"), NULL},
{"gst-scheduler", NUL, POPT_ARG_STRING|POPT_ARGFLAG_STRIP, NULL, ARG_SCHEDULER, N_("scheduler to use ('"GST_SCHEDULER_DEFAULT_NAME"' is the default)"), "SCHEDULER"}, {"gst-scheduler", NUL, POPT_ARG_STRING|POPT_ARGFLAG_STRIP, NULL, ARG_SCHEDULER, N_("scheduler to use ('"GST_SCHEDULER_DEFAULT_NAME"' is the default)"), "SCHEDULER"},
{"gst-registry", NUL, POPT_ARG_STRING|POPT_ARGFLAG_STRIP, NULL, ARG_REGISTRY, N_("registry to use") , "REGISTRY"}, {"gst-registry", NUL, POPT_ARG_STRING|POPT_ARGFLAG_STRIP, NULL, ARG_REGISTRY, N_("registry to use") , "REGISTRY"},
POPT_TABLEEND POPT_TABLEEND
@ -467,11 +472,10 @@ static GstPluginDesc plugin_desc = {
NULL, NULL,
VERSION, VERSION,
GST_LICENSE, GST_LICENSE,
GST_COPYRIGHT,
GST_PACKAGE, GST_PACKAGE,
GST_ORIGIN, GST_ORIGIN,
GST_STRUCT_PADDING_INIT GST_PADDING_INIT
}; };
/* /*
@ -700,6 +704,9 @@ init_popt_callback (poptContext context, enum poptCallbackReason reason,
case ARG_PLUGIN_LOAD: case ARG_PLUGIN_LOAD:
split_and_iterate (arg, ",", prepare_for_load_plugin_func, NULL); split_and_iterate (arg, ",", prepare_for_load_plugin_func, NULL);
break; break;
case ARG_SEGTRAP_DISABLE:
_gst_disable_segtrap = TRUE;
break;
case ARG_SCHEDULER: case ARG_SCHEDULER:
gst_scheduler_factory_set_default_name (arg); gst_scheduler_factory_set_default_name (arg);
break; break;

View file

@ -891,6 +891,77 @@ gst_bin_get_list (GstBin * bin)
return bin->children; return bin->children;
} }
/**
* gst_bin_get_by_interface:
* @bin: bin to find element in
* @interface: interface to be implemented by interface
*
* Looks for the first element inside the bin that implements the given
* interface. If such an element is found, it returns the element. You can
* cast this element to the given interface afterwards.
* If you want all elements that implement the interface, use
* gst_bin_get_all_by_interface(). The function recurses bins inside bins.
*
* Returns: An element inside the bin implementing the interface.
*/
GstElement *
gst_bin_get_by_interface (GstBin *bin, const GType interface)
{
GList *walk;
g_return_val_if_fail (GST_IS_BIN (bin), NULL);
g_return_val_if_fail (G_TYPE_IS_INTERFACE (interface), NULL);
walk = bin->children;
while (walk) {
if (G_TYPE_CHECK_INSTANCE_TYPE (walk->data, interface))
return GST_ELEMENT (walk->data);
if (GST_IS_BIN (walk->data)) {
GstElement *ret;
ret = gst_bin_get_by_interface (GST_BIN (walk->data), interface);
if (ret)
return ret;
}
walk = g_list_next (walk);
}
return NULL;
}
/**
* gst_bin_get_all_by_interface:
* @bin: bin to find elements in
* @interface: interface to be implemented by interface
*
* Looks for all element inside the bin that implements the given
* interface. You can safely cast all returned elements to the given interface.
* The function recurses bins inside bins. You need to free the list using
* g_list_free() after use.
*
* Returns: An element inside the bin implementing the interface.
*/
GList *
gst_bin_get_all_by_interface (GstBin *bin, const GType interface)
{
GList *walk, *ret = NULL;
g_return_val_if_fail (GST_IS_BIN (bin), NULL);
g_return_val_if_fail (G_TYPE_IS_INTERFACE (interface), NULL);
walk = bin->children;
while (walk) {
if (G_TYPE_CHECK_INSTANCE_TYPE (walk->data, interface))
ret = g_list_prepend (ret, walk->data);
if (GST_IS_BIN (walk->data)) {
ret = g_list_concat (ret,
gst_bin_get_all_by_interface (GST_BIN (walk->data), interface));
}
walk = g_list_next (walk);
}
return ret;
}
/** /**
* gst_bin_sync_children_state: * gst_bin_sync_children_state:
* @bin: #Gstbin to sync state * @bin: #Gstbin to sync state

View file

@ -34,17 +34,8 @@ extern GType _gst_bin_type;
#define GST_IS_BIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_BIN)) #define GST_IS_BIN(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_BIN))
#define GST_IS_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_BIN)) #define GST_IS_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_BIN))
#define GST_BIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_BIN, GstBinClass)) #define GST_BIN_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_BIN, GstBinClass))
#define GST_BIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_BIN, GstBin))
#define GST_BIN_CAST(obj) ((GstBin*)(obj)) #define GST_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_BIN, GstBinClass))
#define GST_BIN_CLASS_CAST(klass) ((GstBinClass*)(klass))
#ifdef GST_TYPE_PARANOID
# define GST_BIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_BIN, GstBin))
# define GST_BIN_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_BIN, GstBinClass))
#else
# define GST_BIN GST_BIN_CAST
# define GST_BIN_CLASS GST_BIN_CLASS_CAST
#endif
typedef void (*GstBinPrePostIterateFunction) (GstBin *bin, gpointer user_data); typedef void (*GstBinPrePostIterateFunction) (GstBin *bin, gpointer user_data);
@ -76,7 +67,7 @@ struct _GstBin {
GstElementState child_states[GST_NUM_STATES]; GstElementState child_states[GST_NUM_STATES];
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstBinClass { struct _GstBinClass {
@ -95,7 +86,7 @@ struct _GstBinClass {
void (*element_added) (GstBin *bin, GstElement *child); void (*element_added) (GstBin *bin, GstElement *child);
void (*element_removed) (GstBin *bin, GstElement *child); void (*element_removed) (GstBin *bin, GstElement *child);
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
GType gst_bin_get_type (void); GType gst_bin_get_type (void);
@ -112,6 +103,8 @@ GstElement* gst_bin_get_by_name (GstBin *bin, const gchar *name);
GstElement* gst_bin_get_by_name_recurse_up (GstBin *bin, const gchar *name); GstElement* gst_bin_get_by_name_recurse_up (GstBin *bin, const gchar *name);
G_CONST_RETURN GList* G_CONST_RETURN GList*
gst_bin_get_list (GstBin *bin); gst_bin_get_list (GstBin *bin);
GstElement* gst_bin_get_by_interface (GstBin *bin, const GType interface);
GList * gst_bin_get_all_by_interface (GstBin *bin, const GType interface);
gboolean gst_bin_iterate (GstBin *bin); gboolean gst_bin_iterate (GstBin *bin);

View file

@ -114,7 +114,7 @@ struct _GstBuffer {
/* pointer to pool private data of parent buffer in case of a subbuffer */ /* pointer to pool private data of parent buffer in case of a subbuffer */
gpointer pool_private; gpointer pool_private;
GST_STRUCT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
/* bufferpools */ /* bufferpools */
@ -139,7 +139,7 @@ struct _GstBufferPool {
gpointer user_data; gpointer user_data;
GST_STRUCT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
/* allocation */ /* allocation */

View file

@ -213,7 +213,7 @@ void gst_caps2_append (GstCaps2 *caps1, GstCaps2 *caps2)
} }
g_ptr_array_free(caps2->structs, TRUE); g_ptr_array_free(caps2->structs, TRUE);
#ifdef USE_POISONING #ifdef USE_POISONING
memset (caps, 0xff, sizeof(GstCaps2)); memset (caps2, 0xff, sizeof(GstCaps2));
#endif #endif
g_free(caps2); g_free(caps2);
} }

View file

@ -600,6 +600,7 @@ gboolean
gst_clock_handle_discont (GstClock *clock, guint64 time) gst_clock_handle_discont (GstClock *clock, guint64 time)
{ {
GstClockTime itime = G_GINT64_CONSTANT (0); GstClockTime itime = G_GINT64_CONSTANT (0);
GstClockClass *cclass = GST_CLOCK_GET_CLASS (clock);;
GST_CAT_DEBUG (GST_CAT_CLOCK, "clock discont %" G_GUINT64_FORMAT GST_CAT_DEBUG (GST_CAT_CLOCK, "clock discont %" G_GUINT64_FORMAT
" %" G_GUINT64_FORMAT " %d", " %" G_GUINT64_FORMAT " %d",
@ -609,21 +610,8 @@ gst_clock_handle_discont (GstClock *clock, guint64 time)
return TRUE; return TRUE;
GST_LOCK (clock); GST_LOCK (clock);
if (clock->accept_discont) { if (cclass->get_internal_time) {
GstClockClass *cclass; itime = cclass->get_internal_time (clock);
cclass = GST_CLOCK_GET_CLASS (clock);
if (cclass->get_internal_time) {
itime = cclass->get_internal_time (clock);
}
}
else {
GST_UNLOCK (clock);
GST_CAT_DEBUG (GST_CAT_CLOCK, "clock discont refused %" G_GUINT64_FORMAT
" %" G_GUINT64_FORMAT,
time, clock->start_time);
return FALSE;
} }
clock->start_time = itime - time; clock->start_time = itime - time;

View file

@ -137,7 +137,7 @@ struct _GstClock {
GCond *active_cond; GCond *active_cond;
gboolean stats; gboolean stats;
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstClockClass { struct _GstClockClass {
@ -159,7 +159,7 @@ struct _GstClockClass {
void (*unschedule) (GstClock *clock, GstClockEntry *entry); void (*unschedule) (GstClock *clock, GstClockEntry *entry);
void (*unlock) (GstClock *clock, GstClockEntry *entry); void (*unlock) (GstClock *clock, GstClockEntry *entry);
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
GType gst_clock_get_type (void); GType gst_clock_get_type (void);

View file

@ -75,7 +75,7 @@ struct _GstData {
GstDataFreeFunction free; /* free the data */ GstDataFreeFunction free; /* free the data */
GstDataCopyFunction copy; /* copy the data */ GstDataCopyFunction copy; /* copy the data */
GST_STRUCT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
/* function used by subclasses only */ /* function used by subclasses only */

View file

@ -1867,7 +1867,7 @@ gst_element_unlink (GstElement *src, GstElement *dest)
srcpads = gst_element_get_pad_list (src); srcpads = gst_element_get_pad_list (src);
while (srcpads) { while (srcpads) {
pad = GST_PAD_CAST (srcpads->data); pad = GST_PAD (srcpads->data);
/* we only care about real src pads */ /* we only care about real src pads */
if (GST_IS_REAL_PAD (pad) && GST_PAD_IS_SRC (pad)) { if (GST_IS_REAL_PAD (pad) && GST_PAD_IS_SRC (pad)) {
@ -1909,7 +1909,7 @@ gst_element_get_random_pad (GstElement *element, GstPadDirection dir)
GList *pads = element->pads; GList *pads = element->pads;
GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "getting a random pad"); GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "getting a random pad");
while (pads) { while (pads) {
GstPad *pad = GST_PAD_CAST (pads->data); GstPad *pad = GST_PAD (pads->data);
GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "checking pad %s:%s", GST_CAT_DEBUG (GST_CAT_ELEMENT_PADS, "checking pad %s:%s",
GST_DEBUG_PAD_NAME (pad)); GST_DEBUG_PAD_NAME (pad));
@ -2522,7 +2522,7 @@ gst_element_pads_activate (GstElement *element, gboolean active)
GList *pads = element->pads; GList *pads = element->pads;
while (pads) { while (pads) {
GstPad *pad = GST_PAD_CAST (pads->data); GstPad *pad = GST_PAD (pads->data);
pads = g_list_next (pads); pads = g_list_next (pads);
if (!GST_IS_REAL_PAD (pad)) if (!GST_IS_REAL_PAD (pad))
@ -3228,10 +3228,10 @@ gst_element_get_managing_bin (GstElement *element)
g_return_val_if_fail (element != NULL, NULL); g_return_val_if_fail (element != NULL, NULL);
bin = GST_BIN (gst_object_get_parent (GST_OBJECT_CAST (element))); bin = GST_BIN (gst_object_get_parent (GST_OBJECT (element)));
while (bin && !GST_FLAG_IS_SET (GST_OBJECT_CAST (bin), GST_BIN_FLAG_MANAGER)) while (bin && !GST_FLAG_IS_SET (GST_OBJECT (bin), GST_BIN_FLAG_MANAGER))
bin = GST_BIN (gst_object_get_parent (GST_OBJECT_CAST (bin))); bin = GST_BIN (gst_object_get_parent (GST_OBJECT (bin)));
return bin; return bin;
} }

View file

@ -45,10 +45,10 @@ struct _GstElementDetails {
gchar *description; /* insights of one form or another */ gchar *description; /* insights of one form or another */
gchar *author; /* who wrote this thing? */ gchar *author; /* who wrote this thing? */
GST_STRUCT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
#define GST_ELEMENT_DETAILS(longname,klass,description,author) \ #define GST_ELEMENT_DETAILS(longname,klass,description,author) \
{ longname, klass, description, author, GST_STRUCT_PADDING_INIT } { longname, klass, description, author, GST_PADDING_INIT }
#define GST_IS_ELEMENT_DETAILS(details) ( \ #define GST_IS_ELEMENT_DETAILS(details) ( \
(details) && ((details)->longname != NULL) && ((details)->klass != NULL) \ (details) && ((details)->longname != NULL) && ((details)->klass != NULL) \
&& ((details)->description != NULL) && ((details)->author != NULL)) && ((details)->description != NULL) && ((details)->author != NULL))
@ -73,20 +73,11 @@ struct _GstElementDetails {
extern GType _gst_element_type; extern GType _gst_element_type;
#define GST_TYPE_ELEMENT (_gst_element_type) #define GST_TYPE_ELEMENT (_gst_element_type)
#define GST_ELEMENT_CAST(obj) ((GstElement*)(obj))
#define GST_ELEMENT_CLASS_CAST(klass) ((GstElementClass*)(klass))
#define GST_IS_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_ELEMENT)) #define GST_IS_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_ELEMENT))
#define GST_IS_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_ELEMENT)) #define GST_IS_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_ELEMENT))
#define GST_ELEMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_ELEMENT, GstElementClass)) #define GST_ELEMENT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_ELEMENT, GstElementClass))
#define GST_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_ELEMENT, GstElement))
#ifdef GST_TYPE_PARANOID #define GST_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_ELEMENT, GstElementClass))
# define GST_ELEMENT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_ELEMENT, GstElement))
# define GST_ELEMENT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_ELEMENT, GstElementClass))
#else
# define GST_ELEMENT GST_ELEMENT_CAST
# define GST_ELEMENT_CLASS GST_ELEMENT_CLASS_CAST
#endif
/* convenience functions */ /* convenience functions */
#ifdef G_HAVE_ISO_VARARGS #ifdef G_HAVE_ISO_VARARGS
@ -184,7 +175,7 @@ struct _GstElement {
GAsyncQueue *prop_value_queue; GAsyncQueue *prop_value_queue;
GMutex *property_mutex; GMutex *property_mutex;
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstElementClass { struct _GstElementClass {
@ -241,7 +232,7 @@ struct _GstElementClass {
GstIndex* (*get_index) (GstElement *element); GstIndex* (*get_index) (GstElement *element);
void (*set_index) (GstElement *element, GstIndex *index); void (*set_index) (GstElement *element, GstIndex *index);
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
void gst_element_class_add_pad_template (GstElementClass *klass, GstPadTemplate *templ); void gst_element_class_add_pad_template (GstElementClass *klass, GstPadTemplate *templ);
@ -408,13 +399,13 @@ struct _GstElementFactory {
GList * interfaces; /* interfaces this element implements */ GList * interfaces; /* interfaces this element implements */
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstElementFactoryClass { struct _GstElementFactoryClass {
GstPluginFeatureClass parent_class; GstPluginFeatureClass parent_class;
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
GType gst_element_factory_get_type (void); GType gst_element_factory_get_type (void);
@ -431,8 +422,8 @@ G_CONST_RETURN gchar * gst_element_factory_get_klass (GstElementFactory *factor
G_CONST_RETURN gchar * gst_element_factory_get_description (GstElementFactory *factory); G_CONST_RETURN gchar * gst_element_factory_get_description (GstElementFactory *factory);
G_CONST_RETURN gchar * gst_element_factory_get_version (GstElementFactory *factory); G_CONST_RETURN gchar * gst_element_factory_get_version (GstElementFactory *factory);
G_CONST_RETURN gchar * gst_element_factory_get_author (GstElementFactory *factory); G_CONST_RETURN gchar * gst_element_factory_get_author (GstElementFactory *factory);
guint gst_element_factory_get_num_padtemplates (GstElementFactory *factory); guint gst_element_factory_get_num_pad_templates (GstElementFactory *factory);
G_CONST_RETURN GList * gst_element_factory_get_padtemplates (GstElementFactory *factory); G_CONST_RETURN GList * gst_element_factory_get_pad_templates (GstElementFactory *factory);
guint gst_element_factory_get_uri_type (GstElementFactory *factory); guint gst_element_factory_get_uri_type (GstElementFactory *factory);
gchar ** gst_element_factory_get_uri_protocols (GstElementFactory *factory); gchar ** gst_element_factory_get_uri_protocols (GstElementFactory *factory);

View file

@ -194,7 +194,7 @@ gst_event_new_seek (GstSeekType type, gint64 offset)
} }
/** /**
* gst_event_new_discontinuousv: * gst_event_new_discontinuous_valist:
* @new_media: A flag indicating a new media type starts * @new_media: A flag indicating a new media type starts
* @format1: The format of the discont value * @format1: The format of the discont value
* @var_args: more discont values and formats * @var_args: more discont values and formats
@ -207,7 +207,7 @@ gst_event_new_seek (GstSeekType type, gint64 offset)
* Returns: A new discontinuous event. * Returns: A new discontinuous event.
*/ */
GstEvent* GstEvent*
gst_event_new_discontinuousv (gboolean new_media, GstFormat format1, va_list var_args) gst_event_new_discontinuous_valist (gboolean new_media, GstFormat format1, va_list var_args)
{ {
GstEvent *event; GstEvent *event;
gint count = 0; gint count = 0;
@ -251,7 +251,7 @@ gst_event_new_discontinuous (gboolean new_media, GstFormat format1, ...)
va_start (var_args, format1); va_start (var_args, format1);
event = gst_event_new_discontinuousv (new_media, format1, var_args); event = gst_event_new_discontinuous_valist (new_media, format1, var_args);
va_end (var_args); va_end (var_args);

View file

@ -186,7 +186,7 @@ struct _GstEvent {
} structure; } structure;
} event_data; } event_data;
GST_STRUCT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
void _gst_event_initialize (void); void _gst_event_initialize (void);
@ -215,7 +215,7 @@ GstEvent* gst_event_new_size (GstFormat format, gint64 value);
/* discontinous event */ /* discontinous event */
GstEvent* gst_event_new_discontinuous (gboolean new_media, GstEvent* gst_event_new_discontinuous (gboolean new_media,
GstFormat format1, ...); GstFormat format1, ...);
GstEvent* gst_event_new_discontinuousv (gboolean new_media, GstEvent* gst_event_new_discontinuous_valist (gboolean new_media,
GstFormat format1, GstFormat format1,
va_list var_args); va_list var_args);
gboolean gst_event_discont_get_value (GstEvent *event, GstFormat format, gint64 *value); gboolean gst_event_discont_get_value (GstEvent *event, GstFormat format, gint64 *value);

View file

@ -168,7 +168,7 @@ struct _GstIndex {
GHashTable *writers; GHashTable *writers;
gint last_id; gint last_id;
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstIndexClass { struct _GstIndexClass {
@ -189,7 +189,7 @@ struct _GstIndexClass {
/* signals */ /* signals */
void (*entry_added) (GstIndex *index, GstIndexEntry *entry); void (*entry_added) (GstIndex *index, GstIndexEntry *entry);
GST_CLASS_PADDING; gpointer _gst_reserved[GST_PADDING];
}; };
GType gst_index_get_type (void); GType gst_index_get_type (void);
@ -253,13 +253,13 @@ struct _GstIndexFactory {
gchar *longdesc; /* long description of the index (well, don't overdo it..) */ gchar *longdesc; /* long description of the index (well, don't overdo it..) */
GType type; /* unique GType of the index */ GType type; /* unique GType of the index */
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstIndexFactoryClass { struct _GstIndexFactoryClass {
GstPluginFeatureClass parent; GstPluginFeatureClass parent;
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
GType gst_index_factory_get_type (void); GType gst_index_factory_get_type (void);

View file

@ -353,7 +353,7 @@ extern gboolean __gst_debug_enabled;
#endif /* G_HAVE_ISO_VARARGS */ #endif /* G_HAVE_ISO_VARARGS */
#else /* GST_DEBUG_ENABLE_DEPRECATED */ #else /* GST_DEBUG_ENABLE_DEPRECATED */
/* This is a workaround so the old debugging stuff of Gstreamer 0.6 works. /* This is a workaround so the old debugging stuff of GStreamer 0.6 works.
This is undocumented and will go when 0.8 comes out. */ This is undocumented and will go when 0.8 comes out. */
#ifdef G_HAVE_ISO_VARARGS #ifdef G_HAVE_ISO_VARARGS

View file

@ -28,19 +28,21 @@
#include "gstinterface.h" #include "gstinterface.h"
#include "gstlog.h" #include "gstlog.h"
static void gst_interface_class_init (GstInterfaceClass *ifklass); static void
static gboolean gst_interface_supported_default (GstInterface *iface, gst_implements_interface_class_init (GstImplementsInterfaceClass *ifklass);
GType iface_type); static gboolean
gst_implements_interface_supported_default (GstImplementsInterface *iface,
GType iface_type);
GType GType
gst_interface_get_type (void) gst_implements_interface_get_type (void)
{ {
static GType gst_interface_type = 0; static GType gst_interface_type = 0;
if (!gst_interface_type) { if (!gst_interface_type) {
static const GTypeInfo gst_interface_info = { static const GTypeInfo gst_interface_info = {
sizeof (GstInterfaceClass), sizeof (GstImplementsInterfaceClass),
(GBaseInitFunc) gst_interface_class_init, (GBaseInitFunc) gst_implements_interface_class_init,
NULL, NULL,
NULL, NULL,
NULL, NULL,
@ -52,7 +54,7 @@ gst_interface_get_type (void)
}; };
gst_interface_type = g_type_register_static (G_TYPE_INTERFACE, gst_interface_type = g_type_register_static (G_TYPE_INTERFACE,
"GstInterface", "GstImplementsInterface",
&gst_interface_info, 0); &gst_interface_info, 0);
g_type_interface_add_prerequisite (gst_interface_type, g_type_interface_add_prerequisite (gst_interface_type,
@ -63,14 +65,14 @@ gst_interface_get_type (void)
} }
static void static void
gst_interface_class_init (GstInterfaceClass *klass) gst_implements_interface_class_init (GstImplementsInterfaceClass *klass)
{ {
klass->supported = gst_interface_supported_default; klass->supported = gst_implements_interface_supported_default;
} }
static gboolean static gboolean
gst_interface_supported_default (GstInterface *interface, gst_implements_interface_supported_default (GstImplementsInterface *interface,
GType iface_type) GType iface_type)
{ {
/* Well, if someone didn't set the virtual function, /* Well, if someone didn't set the virtual function,
* then something is clearly wrong. So big no-no here */ * then something is clearly wrong. So big no-no here */
@ -93,12 +95,12 @@ gst_element_implements_interface (GstElement *element,
{ {
if (G_TYPE_CHECK_INSTANCE_TYPE (G_OBJECT (element), if (G_TYPE_CHECK_INSTANCE_TYPE (G_OBJECT (element),
iface_type)) { iface_type)) {
GstInterface *iface; GstImplementsInterface *iface;
GstInterfaceClass *ifclass; GstImplementsInterfaceClass *ifclass;
iface = G_TYPE_CHECK_INSTANCE_CAST (G_OBJECT (element), iface = G_TYPE_CHECK_INSTANCE_CAST (G_OBJECT (element),
iface_type, GstInterface); iface_type, GstImplementsInterface);
ifclass = GST_INTERFACE_GET_CLASS (iface); ifclass = GST_IMPLEMENTS_INTERFACE_GET_CLASS (iface);
if (ifclass->supported != NULL && if (ifclass->supported != NULL &&
ifclass->supported (iface, iface_type) == TRUE) { ifclass->supported (iface, iface_type) == TRUE) {
@ -110,7 +112,7 @@ gst_element_implements_interface (GstElement *element,
} }
/** /**
* gst_interface_cast: * gst_implements_interface_cast:
* @from: the object (any sort) from which to cast to the interface * @from: the object (any sort) from which to cast to the interface
* @type: the interface type to cast to * @type: the interface type to cast to
* *
@ -118,15 +120,15 @@ gst_element_implements_interface (GstElement *element,
* interface is supported for this specific instance. * interface is supported for this specific instance.
*/ */
GstInterface * gpointer
gst_interface_cast (gpointer from, gst_implements_interface_cast (gpointer from,
GType iface_type) GType iface_type)
{ {
GstInterface *iface; GstImplementsInterface *iface;
/* check cast, give warning+fail if it's invalid */ /* check cast, give warning+fail if it's invalid */
if (!(iface = G_TYPE_CHECK_INSTANCE_CAST (from, iface_type, if (!(iface = G_TYPE_CHECK_INSTANCE_CAST (from, iface_type,
GstInterface))) { GstImplementsInterface))) {
return NULL; return NULL;
} }
@ -142,7 +144,7 @@ gst_interface_cast (gpointer from,
} }
/** /**
* gst_interface_cast: * gst_implements_interface_cast:
* @from: the object (any sort) from which to check from for the interface * @from: the object (any sort) from which to check from for the interface
* @type: the interface type to check for * @type: the interface type to check for
* *
@ -151,17 +153,17 @@ gst_interface_cast (gpointer from,
*/ */
gboolean gboolean
gst_interface_check (gpointer from, gst_implements_interface_check (gpointer from,
GType type) GType type)
{ {
GstInterface *iface; GstImplementsInterface *iface;
/* check cast, return FALSE if it fails, don't give a warning... */ /* check cast, return FALSE if it fails, don't give a warning... */
if (!G_TYPE_CHECK_INSTANCE_TYPE (from, type)) { if (!G_TYPE_CHECK_INSTANCE_TYPE (from, type)) {
return FALSE; return FALSE;
} }
iface = G_TYPE_CHECK_INSTANCE_CAST (from, type, GstInterface); iface = G_TYPE_CHECK_INSTANCE_CAST (from, type, GstImplementsInterface);
/* now, if we're an element (or derivative), is this thing /* now, if we're an element (or derivative), is this thing
* actually implemented for real? */ * actually implemented for real? */

View file

@ -20,57 +20,60 @@
* Boston, MA 02111-1307, USA. * Boston, MA 02111-1307, USA.
*/ */
#ifndef __GST_INTERFACE_H__ #ifndef __GST_IMPLEMENTS_INTERFACE_H__
#define __GST_INTERFACE_H__ #define __GST_IMPLEMENTS_INTERFACE_H__
#include <gst/gstelement.h> #include <gst/gstelement.h>
G_BEGIN_DECLS G_BEGIN_DECLS
#define GST_TYPE_INTERFACE \ #define GST_TYPE_IMPLEMENTS_INTERFACE \
(gst_interface_get_type ()) (gst_implements_interface_get_type ())
#define GST_INTERFACE(obj) \ #define GST_IMPLEMENTS_INTERFACE(obj) \
(GST_INTERFACE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_INTERFACE, GstInterface)) (GST_INTERFACE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_IMPLEMENTS_INTERFACE, \
#define GST_INTERFACE_CLASS(klass) \ GstImplementsInterface))
(G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_INTERFACE, GstInterfaceClass)) #define GST_IMPLEMENTS_INTERFACE_CLASS(klass) \
#define GST_IS_INTERFACE(obj) \ (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_IMPLEMENTS_INTERFACE, \
(GST_INTERFACE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_INTERFACE)) GstImplementsInterfaceClass))
#define GST_IS_INTERFACE_CLASS(klass) \ #define GST_IS_IMPLEMENTS_INTERFACE(obj) \
(G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_INTERFACE)) (GST_INTERFACE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_IMPLEMENTS_INTERFACE))
#define GST_INTERFACE_GET_CLASS(inst) \ #define GST_IS_IMPLEMENTS_INTERFACE_CLASS(klass) \
(G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_INTERFACE, GstInterfaceClass)) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_IMPLEMENTS_INTERFACE))
#define GST_IMPLEMENTS_INTERFACE_GET_CLASS(inst) \
(G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_IMPLEMENTS_INTERFACE, \
GstImplementsInterfaceClass))
typedef struct _GstInterface GstInterface; typedef struct _GstImplementsInterface GstImplementsInterface;
/* This small extra virtual function is here to provide an /* This small extra virtual function is here to provide an
* interface functionality on a per-instance basis rather * interface functionality on a per-instance basis rather
* than a per-class basis, which is the case for glib. * than a per-class basis, which is the case for glib.
*/ */
typedef struct _GstInterfaceClass { typedef struct _GstImplementsInterfaceClass {
GTypeInterface parent; GTypeInterface parent;
/* virtual functions */ /* virtual functions */
gboolean (* supported) (GstInterface *iface, gboolean (* supported) (GstImplementsInterface *iface,
GType iface_type); GType iface_type);
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
} GstInterfaceClass; } GstImplementsInterfaceClass;
#define GST_INTERFACE_CHECK_INSTANCE_CAST(obj, type, cast_t) \ #define GST_IMPLEMENTS_INTERFACE_CHECK_INSTANCE_CAST(obj, type, cast_t) \
((cast_t *) gst_interface_cast ((obj), (type))) ((cast_t *) gst_implements_interface_cast ((obj), (type)))
#define GST_INTERFACE_CHECK_INSTANCE_TYPE(obj, type) \ #define GST_IMPLEMENTS_INTERFACE_CHECK_INSTANCE_TYPE(obj, type) \
(gst_interface_check ((obj), (type))) (gst_implements_interface_check ((obj), (type)))
GType gst_interface_get_type (void); GType gst_implements_interface_get_type (void);
/* wrapper functions to check for functionality implementation */ /* wrapper functions to check for functionality implementation */
gboolean gst_element_implements_interface(GstElement *element, gboolean gst_element_implements_interface (GstElement *element,
GType iface_type); GType iface_type);
GstInterface * gst_interface_cast (gpointer from, gpointer gst_implements_interface_cast (gpointer from,
GType type); GType type);
gboolean gst_interface_check (gpointer from, gboolean gst_implements_interface_check (gpointer from,
GType type); GType type);
G_END_DECLS G_END_DECLS
#endif /* __GST_INTERFACE_H__ */ #endif /* __GST_IMPLEMENTS_INTERFACE_H__ */

View file

@ -35,21 +35,12 @@ G_BEGIN_DECLS
extern GType _gst_object_type; extern GType _gst_object_type;
#define GST_TYPE_OBJECT (_gst_object_type) #define GST_TYPE_OBJECT (_gst_object_type)
#define GST_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_OBJECT)) #define GST_IS_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_OBJECT))
#define GST_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_OBJECT)) #define GST_IS_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_OBJECT))
#define GST_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_OBJECT, GstObjectClass)) #define GST_OBJECT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_OBJECT, GstObjectClass))
#define GST_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_OBJECT, GstObject))
#define GST_OBJECT_CAST(obj) ((GstObject*)(obj)) #define GST_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_OBJECT, GstObjectClass))
#define GST_OBJECT_CLASS_CAST(klass) ((GstObjectClass*)(klass))
#ifdef GST_TYPE_PARANOID
# define GST_OBJECT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_OBJECT, GstObject))
# define GST_OBJECT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_OBJECT, GstObjectClass))
#else
# define GST_OBJECT GST_OBJECT_CAST
# define GST_OBJECT_CLASS GST_OBJECT_CLASS_CAST
#endif
/* make sure we don't change the object size but stil make it compile /* make sure we don't change the object size but stil make it compile
* without libxml */ * without libxml */
@ -77,7 +68,7 @@ struct _GstObject {
guint32 flags; guint32 flags;
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
/* signal_object is used to signal to the whole class */ /* signal_object is used to signal to the whole class */
@ -99,10 +90,10 @@ struct _GstObjectClass {
xmlNodePtr (*save_thyself) (GstObject *object, xmlNodePtr parent); xmlNodePtr (*save_thyself) (GstObject *object, xmlNodePtr parent);
void (*restore_thyself) (GstObject *object, xmlNodePtr self); void (*restore_thyself) (GstObject *object, xmlNodePtr self);
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
#define GST_FLAGS(obj) (GST_OBJECT_CAST (obj)->flags) #define GST_FLAGS(obj) (GST_OBJECT (obj)->flags)
#define GST_FLAG_IS_SET(obj,flag) (GST_FLAGS (obj) & (1<<(flag))) #define GST_FLAG_IS_SET(obj,flag) (GST_FLAGS (obj) & (1<<(flag)))
#define GST_FLAG_SET(obj,flag) G_STMT_START{ (GST_FLAGS (obj) |= (1<<(flag))); }G_STMT_END #define GST_FLAG_SET(obj,flag) G_STMT_START{ (GST_FLAGS (obj) |= (1<<(flag))); }G_STMT_END
#define GST_FLAG_UNSET(obj,flag) G_STMT_START{ (GST_FLAGS (obj) &= ~(1<<(flag))); }G_STMT_END #define GST_FLAG_UNSET(obj,flag) G_STMT_START{ (GST_FLAGS (obj) &= ~(1<<(flag))); }G_STMT_END
@ -114,10 +105,10 @@ struct _GstObjectClass {
#define GST_OBJECT_FLOATING(obj) (GST_FLAG_IS_SET (obj, GST_FLOATING)) #define GST_OBJECT_FLOATING(obj) (GST_FLAG_IS_SET (obj, GST_FLOATING))
/* CR1: object locking - GObject 2.0 doesn't have threadsafe locking */ /* CR1: object locking - GObject 2.0 doesn't have threadsafe locking */
#define GST_LOCK(obj) (g_mutex_lock(GST_OBJECT_CAST(obj)->lock)) #define GST_LOCK(obj) (g_mutex_lock(GST_OBJECT(obj)->lock))
#define GST_TRYLOCK(obj) (g_mutex_trylock(GST_OBJECT_CAST(obj)->lock)) #define GST_TRYLOCK(obj) (g_mutex_trylock(GST_OBJECT(obj)->lock))
#define GST_UNLOCK(obj) (g_mutex_unlock(GST_OBJECT_CAST(obj)->lock)) #define GST_UNLOCK(obj) (g_mutex_unlock(GST_OBJECT(obj)->lock))
#define GST_GET_LOCK(obj) (GST_OBJECT_CAST(obj)->lock) #define GST_GET_LOCK(obj) (GST_OBJECT(obj)->lock)
/* normal GObject stuff */ /* normal GObject stuff */

View file

@ -565,7 +565,7 @@ gst_pad_get_event_masks (GstPad *pad)
g_return_val_if_fail (rpad, FALSE); g_return_val_if_fail (rpad, FALSE);
if (GST_RPAD_EVENTMASKFUNC (rpad)) if (GST_RPAD_EVENTMASKFUNC (rpad))
return GST_RPAD_EVENTMASKFUNC (rpad) (GST_PAD_CAST (pad)); return GST_RPAD_EVENTMASKFUNC (rpad) (GST_PAD (pad));
return NULL; return NULL;
} }
@ -678,7 +678,7 @@ gst_pad_get_query_types (GstPad *pad)
g_return_val_if_fail (rpad, FALSE); g_return_val_if_fail (rpad, FALSE);
if (GST_RPAD_QUERYTYPEFUNC (rpad)) if (GST_RPAD_QUERYTYPEFUNC (rpad))
return GST_RPAD_QUERYTYPEFUNC (rpad) (GST_PAD_CAST (pad)); return GST_RPAD_QUERYTYPEFUNC (rpad) (GST_PAD (pad));
return NULL; return NULL;
} }
@ -888,15 +888,15 @@ gst_pad_unlink (GstPad *srcpad,
(GST_RPAD_DIRECTION (realsink) == GST_PAD_SINK)); (GST_RPAD_DIRECTION (realsink) == GST_PAD_SINK));
if (GST_RPAD_UNLINKFUNC (realsrc)) { if (GST_RPAD_UNLINKFUNC (realsrc)) {
GST_RPAD_UNLINKFUNC (realsrc) (GST_PAD_CAST (realsrc)); GST_RPAD_UNLINKFUNC (realsrc) (GST_PAD (realsrc));
} }
if (GST_RPAD_UNLINKFUNC (realsink)) { if (GST_RPAD_UNLINKFUNC (realsink)) {
GST_RPAD_UNLINKFUNC (realsink) (GST_PAD_CAST (realsink)); GST_RPAD_UNLINKFUNC (realsink) (GST_PAD (realsink));
} }
/* get the schedulers before we unlink */ /* get the schedulers before we unlink */
src_sched = gst_pad_get_scheduler (GST_PAD_CAST (realsrc)); src_sched = gst_pad_get_scheduler (GST_PAD (realsrc));
sink_sched = gst_pad_get_scheduler (GST_PAD_CAST (realsink)); sink_sched = gst_pad_get_scheduler (GST_PAD (realsink));
/* first clear peers */ /* first clear peers */
GST_RPAD_PEER (realsrc) = NULL; GST_RPAD_PEER (realsrc) = NULL;
@ -905,8 +905,8 @@ gst_pad_unlink (GstPad *srcpad,
/* now tell the scheduler */ /* now tell the scheduler */
if (src_sched && src_sched == sink_sched) { if (src_sched && src_sched == sink_sched) {
gst_scheduler_pad_unlink (src_sched, gst_scheduler_pad_unlink (src_sched,
GST_PAD_CAST (realsrc), GST_PAD (realsrc),
GST_PAD_CAST (realsink)); GST_PAD (realsink));
} }
/* hold a reference, as they can go away in the signal handlers */ /* hold a reference, as they can go away in the signal handlers */
@ -933,8 +933,8 @@ gst_pad_check_schedulers (GstRealPad *realsrc, GstRealPad *realsink)
GstScheduler *src_sched, *sink_sched; GstScheduler *src_sched, *sink_sched;
gint num_decoupled = 0; gint num_decoupled = 0;
src_sched = gst_pad_get_scheduler (GST_PAD_CAST (realsrc)); src_sched = gst_pad_get_scheduler (GST_PAD (realsrc));
sink_sched = gst_pad_get_scheduler (GST_PAD_CAST (realsink)); sink_sched = gst_pad_get_scheduler (GST_PAD (realsink));
if (src_sched && sink_sched) { if (src_sched && sink_sched) {
if (GST_FLAG_IS_SET (GST_PAD_PARENT (realsrc), GST_ELEMENT_DECOUPLED)) if (GST_FLAG_IS_SET (GST_PAD_PARENT (realsrc), GST_ELEMENT_DECOUPLED))
@ -1115,13 +1115,13 @@ gst_pad_link_filtered (GstPad *srcpad, GstPad *sinkpad,
g_signal_emit (G_OBJECT (realsink), gst_real_pad_signals[REAL_LINKED], g_signal_emit (G_OBJECT (realsink), gst_real_pad_signals[REAL_LINKED],
0, realsrc); 0, realsrc);
src_sched = gst_pad_get_scheduler (GST_PAD_CAST (realsrc)); src_sched = gst_pad_get_scheduler (GST_PAD (realsrc));
sink_sched = gst_pad_get_scheduler (GST_PAD_CAST (realsink)); sink_sched = gst_pad_get_scheduler (GST_PAD (realsink));
/* now tell the scheduler */ /* now tell the scheduler */
if (src_sched && src_sched == sink_sched) { if (src_sched && src_sched == sink_sched) {
gst_scheduler_pad_link (src_sched, gst_scheduler_pad_link (src_sched,
GST_PAD_CAST (realsrc), GST_PAD_CAST (realsink)); GST_PAD (realsrc), GST_PAD (realsink));
} }
else { else {
GST_CAT_INFO (GST_CAT_PADS, "not telling link to scheduler %s:%s and %s:%s, %p %p", GST_CAT_INFO (GST_CAT_PADS, "not telling link to scheduler %s:%s and %s:%s, %p %p",
@ -1239,7 +1239,7 @@ gst_pad_get_scheduler (GstPad *pad)
GstRealPad *peer = GST_RPAD_PEER (pad); GstRealPad *peer = GST_RPAD_PEER (pad);
if (peer) { if (peer) {
scheduler = gst_element_get_scheduler (gst_pad_get_parent (GST_PAD_CAST (peer))); scheduler = gst_element_get_scheduler (gst_pad_get_parent (GST_PAD (peer)));
} }
} }
else { else {
@ -1984,11 +1984,11 @@ gst_pad_get_caps (GstPad *pad)
GstCaps2 *caps; GstCaps2 *caps;
GST_CAT_DEBUG (GST_CAT_CAPS, "using pad get function"); GST_CAT_DEBUG (GST_CAT_CAPS, "using pad get function");
caps = GST_RPAD_GETCAPSFUNC (realpad) (GST_PAD_CAST (realpad)); caps = GST_RPAD_GETCAPSFUNC (realpad) (GST_PAD (realpad));
if (caps == NULL) { if (caps == NULL) {
g_critical ("pad %s:%s returned NULL caps from getcaps function\n", g_critical ("pad %s:%s returned NULL caps from getcaps function\n",
GST_ELEMENT_NAME(GST_PAD_PARENT(GST_PAD_CAST(realpad))), GST_ELEMENT_NAME(GST_PAD_PARENT(GST_PAD (realpad))),
GST_PAD_NAME(realpad)); GST_PAD_NAME(realpad));
caps = gst_caps2_new_any (); caps = gst_caps2_new_any ();
} }
@ -2477,7 +2477,7 @@ gst_pad_push (GstPad *pad, GstData *data)
if (!gst_probe_dispatcher_dispatch (&peer->probedisp, &data)) if (!gst_probe_dispatcher_dispatch (&peer->probedisp, &data))
return; return;
(peer->chainhandler) (GST_PAD_CAST (peer), data); (peer->chainhandler) (GST_PAD (peer), data);
return; return;
} }
else { else {
@ -2531,7 +2531,7 @@ restart:
GST_DEBUG_FUNCPTR_NAME (peer->gethandler), GST_DEBUG_FUNCPTR_NAME (peer->gethandler),
GST_DEBUG_PAD_NAME (peer)); GST_DEBUG_PAD_NAME (peer));
data = (peer->gethandler) (GST_PAD_CAST (peer)); data = (peer->gethandler) (GST_PAD (peer));
if (data) { if (data) {
if (!gst_probe_dispatcher_dispatch (&peer->probedisp, &data)) if (!gst_probe_dispatcher_dispatch (&peer->probedisp, &data))
@ -2555,7 +2555,7 @@ restart:
} }
/** /**
* gst_pad_select: * gst_pad_selectv:
* @padlist: a #GList of pads. * @padlist: a #GList of pads.
* *
* Waits for a buffer on any of the list of pads. * Waits for a buffer on any of the list of pads.
@ -2564,7 +2564,7 @@ restart:
* Use #gst_pad_pull() to get the buffer. * Use #gst_pad_pull() to get the buffer.
*/ */
GstPad* GstPad*
gst_pad_select (GList *padlist) gst_pad_selectv (GList *padlist)
{ {
GstPad *pad; GstPad *pad;
@ -2574,7 +2574,7 @@ gst_pad_select (GList *padlist)
} }
/** /**
* gst_pad_selectv: * gst_pad_select:
* @pad: a first #GstPad to perform the select on. * @pad: a first #GstPad to perform the select on.
* @...: A NULL-terminated list of more pads to select on. * @...: A NULL-terminated list of more pads to select on.
* *
@ -2584,10 +2584,9 @@ gst_pad_select (GList *padlist)
* Use #gst_pad_pull() to get the buffer. * Use #gst_pad_pull() to get the buffer.
*/ */
GstPad* GstPad*
gst_pad_selectv (GstPad *pad, ...) gst_pad_select (GstPad *pad, ...)
{ {
GstPad *result; GstPad *result;
GList *padlist = NULL;
va_list var_args; va_list var_args;
if (pad == NULL) if (pad == NULL)
@ -2595,15 +2594,39 @@ gst_pad_selectv (GstPad *pad, ...)
va_start (var_args, pad); va_start (var_args, pad);
result = gst_pad_select_valist (pad, var_args);
va_end (var_args);
return result;
}
/**
* gst_pad_select_valist:
* @pad: a first #GstPad to perform the select on.
* @varargs: A va_list of more pads to select on.
*
* Waits for a buffer on the given set of pads.
*
* Returns: the #GstPad that has a buffer available.
* Use #gst_pad_pull() to get the buffer.
*/
GstPad*
gst_pad_select_valist (GstPad *pad, va_list var_args)
{
GstPad *result;
GList *padlist = NULL;
if (pad == NULL)
return NULL;
while (pad) { while (pad) {
padlist = g_list_prepend (padlist, pad); padlist = g_list_prepend (padlist, pad);
pad = va_arg (var_args, GstPad *); pad = va_arg (var_args, GstPad *);
} }
result = gst_pad_select (padlist); result = gst_pad_selectv (padlist);
g_list_free (padlist); g_list_free (padlist);
va_end (var_args);
return result; return result;
} }
@ -2990,7 +3013,7 @@ gst_pad_get_internal_links (GstPad *pad)
rpad = GST_PAD_REALIZE (pad); rpad = GST_PAD_REALIZE (pad);
if (GST_RPAD_INTLINKFUNC (rpad)) if (GST_RPAD_INTLINKFUNC (rpad))
res = GST_RPAD_INTLINKFUNC (rpad) (GST_PAD_CAST (rpad)); res = GST_RPAD_INTLINKFUNC (rpad) (GST_PAD (rpad));
return res; return res;
} }
@ -3016,7 +3039,7 @@ gst_pad_event_default_dispatch (GstPad *pad, GstElement *element,
gst_pad_push (eventpad, GST_DATA (event)); gst_pad_push (eventpad, GST_DATA (event));
} }
else { else {
GstPad *peerpad = GST_PAD_CAST (GST_RPAD_PEER (eventpad)); GstPad *peerpad = GST_PAD (GST_RPAD_PEER (eventpad));
/* we only send the event on one pad, multi-sinkpad elements /* we only send the event on one pad, multi-sinkpad elements
* should implement a handler */ * should implement a handler */
@ -3101,7 +3124,7 @@ gst_pad_dispatcher (GstPad *pad, GstPadDispatcherFunction dispatch,
GstRealPad *int_peer = GST_RPAD_PEER (int_rpad); GstRealPad *int_peer = GST_RPAD_PEER (int_rpad);
if (int_peer) { if (int_peer) {
res = dispatch (GST_PAD_CAST (int_peer), data); res = dispatch (GST_PAD (int_peer), data);
if (res) if (res)
break; break;
} }
@ -3140,7 +3163,7 @@ gst_pad_send_event (GstPad *pad, GstEvent *event)
GST_EVENT_TYPE (event), GST_DEBUG_PAD_NAME (rpad)); GST_EVENT_TYPE (event), GST_DEBUG_PAD_NAME (rpad));
if (GST_RPAD_EVENTHANDLER (rpad)) if (GST_RPAD_EVENTHANDLER (rpad))
success = GST_RPAD_EVENTHANDLER (rpad) (GST_PAD_CAST (rpad), event); success = GST_RPAD_EVENTHANDLER (rpad) (GST_PAD (rpad), event);
else { else {
g_warning ("pad %s:%s has no event handler", GST_DEBUG_PAD_NAME (rpad)); g_warning ("pad %s:%s has no event handler", GST_DEBUG_PAD_NAME (rpad));
gst_event_unref (event); gst_event_unref (event);
@ -3230,7 +3253,7 @@ gst_pad_convert (GstPad *pad,
rpad = GST_PAD_REALIZE (pad); rpad = GST_PAD_REALIZE (pad);
if (GST_RPAD_CONVERTFUNC (rpad)) { if (GST_RPAD_CONVERTFUNC (rpad)) {
return GST_RPAD_CONVERTFUNC (rpad) (GST_PAD_CAST (rpad), src_format, return GST_RPAD_CONVERTFUNC (rpad) (GST_PAD (rpad), src_format,
src_value, dest_format, dest_value); src_value, dest_format, dest_value);
} }
@ -3309,7 +3332,7 @@ gst_pad_query (GstPad *pad, GstQueryType type,
g_return_val_if_fail (rpad, FALSE); g_return_val_if_fail (rpad, FALSE);
if (GST_RPAD_QUERYFUNC (rpad)) if (GST_RPAD_QUERYFUNC (rpad))
return GST_RPAD_QUERYFUNC (rpad) (GST_PAD_CAST (pad), type, format, value); return GST_RPAD_QUERYFUNC (rpad) (GST_PAD (pad), type, format, value);
return FALSE; return FALSE;
} }
@ -3359,7 +3382,7 @@ gst_pad_get_formats (GstPad *pad)
rpad = GST_PAD_REALIZE (pad); rpad = GST_PAD_REALIZE (pad);
if (GST_RPAD_FORMATSFUNC (rpad)) if (GST_RPAD_FORMATSFUNC (rpad))
return GST_RPAD_FORMATSFUNC (rpad) (GST_PAD_CAST (pad)); return GST_RPAD_FORMATSFUNC (rpad) (GST_PAD (pad));
return NULL; return NULL;
} }

View file

@ -40,65 +40,36 @@ extern GType _gst_pad_type;
extern GType _gst_real_pad_type; extern GType _gst_real_pad_type;
extern GType _gst_ghost_pad_type; extern GType _gst_ghost_pad_type;
#define GST_TYPE_PARANOID
/* /*
* Pad base class * Pad base class
*/ */
#define GST_TYPE_PAD (_gst_pad_type) #define GST_TYPE_PAD (_gst_pad_type)
#define GST_PAD_CAST(obj) ((GstPad*)(obj))
#define GST_PAD_CLASS_CAST(klass) ((GstPadClass*)(klass))
#define GST_IS_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PAD)) #define GST_IS_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PAD))
#define GST_IS_PAD_FAST(obj) (G_OBJECT_TYPE(obj) == GST_TYPE_REAL_PAD || \ #define GST_IS_PAD_FAST(obj) (G_OBJECT_TYPE(obj) == GST_TYPE_REAL_PAD || \
G_OBJECT_TYPE(obj) == GST_TYPE_GHOST_PAD) G_OBJECT_TYPE(obj) == GST_TYPE_GHOST_PAD)
#define GST_IS_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PAD)) #define GST_IS_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PAD))
#define GST_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PAD, GstPad))
#ifdef GST_TYPE_PARANOID #define GST_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PAD, GstPadClass))
# define GST_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PAD, GstPad))
# define GST_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PAD, GstPadClass))
#else
# define GST_PAD GST_PAD_CAST
# define GST_PAD_CLASS GST_PAD_CLASS_CAST
#endif
/* /*
* Real Pads * Real Pads
*/ */
#define GST_TYPE_REAL_PAD (_gst_real_pad_type) #define GST_TYPE_REAL_PAD (_gst_real_pad_type)
#define GST_REAL_PAD_CAST(obj) ((GstRealPad*)(obj))
#define GST_REAL_PAD_CLASS_CAST(klass) ((GstRealPadClass*)(klass))
#define GST_IS_REAL_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_REAL_PAD)) #define GST_IS_REAL_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_REAL_PAD))
#define GST_IS_REAL_PAD_FAST(obj) (G_OBJECT_TYPE(obj) == GST_TYPE_REAL_PAD) #define GST_IS_REAL_PAD_FAST(obj) (G_OBJECT_TYPE(obj) == GST_TYPE_REAL_PAD)
#define GST_IS_REAL_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_REAL_PAD)) #define GST_IS_REAL_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_REAL_PAD))
#define GST_REAL_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_REAL_PAD, GstRealPad))
#ifdef GST_TYPE_PARANOID #define GST_REAL_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_REAL_PAD, GstRealPadClass))
# define GST_REAL_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_REAL_PAD, GstRealPad))
# define GST_REAL_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_REAL_PAD, GstRealPadClass))
#else
# define GST_REAL_PAD GST_REAL_PAD_CAST
# define GST_REAL_PAD_CLASS GST_REAL_PAD_CLASS_CAST
#endif
/* /*
* Ghost Pads * Ghost Pads
*/ */
#define GST_TYPE_GHOST_PAD (_gst_ghost_pad_type) #define GST_TYPE_GHOST_PAD (_gst_ghost_pad_type)
#define GST_GHOST_PAD_CAST(obj) ((GstGhostPad*)(obj))
#define GST_GHOST_PAD_CLASS_CAST(klass) ((GstGhostPadClass*)(klass))
#define GST_IS_GHOST_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GHOST_PAD)) #define GST_IS_GHOST_PAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GHOST_PAD))
#define GST_IS_GHOST_PAD_FAST(obj) (G_OBJECT_TYPE(obj) == GST_TYPE_GHOST_PAD) #define GST_IS_GHOST_PAD_FAST(obj) (G_OBJECT_TYPE(obj) == GST_TYPE_GHOST_PAD)
#define GST_IS_GHOST_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GHOST_PAD)) #define GST_IS_GHOST_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GHOST_PAD))
#define GST_GHOST_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GHOST_PAD, GstGhostPad))
#ifdef GST_TYPE_PARANOID #define GST_GHOST_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GHOST_PAD, GstGhostPadClass))
# define GST_GHOST_PAD(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GHOST_PAD, GstGhostPad))
# define GST_GHOST_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GHOST_PAD, GstGhostPadClass))
#else
# define GST_GHOST_PAD GST_GHOST_PAD_CAST
# define GST_GHOST_PAD_CLASS GST_GHOST_PAD_CLASS_CAST
#endif
/*typedef struct _GstPad GstPad; */ /*typedef struct _GstPad GstPad; */
@ -175,13 +146,13 @@ struct _GstPad {
GstPadTemplate *padtemplate; /* the template for this pad */ GstPadTemplate *padtemplate; /* the template for this pad */
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstPadClass { struct _GstPadClass {
GstObjectClass parent_class; GstObjectClass parent_class;
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstRealPad { struct _GstRealPad {
@ -224,7 +195,7 @@ struct _GstRealPad {
GstProbeDispatcher probedisp; GstProbeDispatcher probedisp;
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstRealPadClass { struct _GstRealPadClass {
@ -236,7 +207,7 @@ struct _GstRealPadClass {
void (*linked) (GstPad *pad, GstPad *peer); void (*linked) (GstPad *pad, GstPad *peer);
void (*unlinked) (GstPad *pad, GstPad *peer); void (*unlinked) (GstPad *pad, GstPad *peer);
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstGhostPad { struct _GstGhostPad {
@ -244,13 +215,13 @@ struct _GstGhostPad {
GstRealPad *realpad; GstRealPad *realpad;
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstGhostPadClass { struct _GstGhostPadClass {
GstPadClass parent_class; GstPadClass parent_class;
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
@ -292,7 +263,7 @@ struct _GstGhostPadClass {
#define GST_PAD_REALIZE(pad) (GST_IS_REAL_PAD(pad) ? ((GstRealPad *)(pad)) : GST_GPAD_REALPAD(pad)) #define GST_PAD_REALIZE(pad) (GST_IS_REAL_PAD(pad) ? ((GstRealPad *)(pad)) : GST_GPAD_REALPAD(pad))
#define GST_PAD_DIRECTION(pad) GST_RPAD_DIRECTION(GST_PAD_REALIZE(pad)) #define GST_PAD_DIRECTION(pad) GST_RPAD_DIRECTION(GST_PAD_REALIZE(pad))
#define GST_PAD_CAPS(pad) GST_RPAD_CAPS(GST_PAD_REALIZE(pad)) #define GST_PAD_CAPS(pad) GST_RPAD_CAPS(GST_PAD_REALIZE(pad))
#define GST_PAD_PEER(pad) GST_PAD_CAST(GST_RPAD_PEER(GST_PAD_REALIZE(pad))) #define GST_PAD_PEER(pad) GST_PAD(GST_RPAD_PEER(GST_PAD_REALIZE(pad)))
/* Some check functions (unused?) */ /* Some check functions (unused?) */
#define GST_PAD_IS_LINKED(pad) (GST_PAD_PEER(pad) != NULL) #define GST_PAD_IS_LINKED(pad) (GST_PAD_PEER(pad) != NULL)
@ -337,7 +308,7 @@ struct _GstPadTemplate {
GstPadPresence presence; GstPadPresence presence;
GstCaps2 *caps; GstCaps2 *caps;
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstPadTemplateClass { struct _GstPadTemplateClass {
@ -346,7 +317,7 @@ struct _GstPadTemplateClass {
/* signal callbacks */ /* signal callbacks */
void (*pad_created) (GstPadTemplate *templ, GstPad *pad); void (*pad_created) (GstPadTemplate *templ, GstPad *pad);
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstStaticPadTemplate { struct _GstStaticPadTemplate {
@ -445,8 +416,9 @@ void gst_pad_push (GstPad *pad, GstData *data);
GstData* gst_pad_pull (GstPad *pad); GstData* gst_pad_pull (GstPad *pad);
gboolean gst_pad_send_event (GstPad *pad, GstEvent *event); gboolean gst_pad_send_event (GstPad *pad, GstEvent *event);
gboolean gst_pad_event_default (GstPad *pad, GstEvent *event); gboolean gst_pad_event_default (GstPad *pad, GstEvent *event);
GstPad* gst_pad_select (GList *padlist); GstPad* gst_pad_selectv (GList *padlist);
GstPad* gst_pad_selectv (GstPad *pad, ...); GstPad* gst_pad_select (GstPad *pad, ...);
GstPad* gst_pad_select_valist (GstPad *pad, va_list varargs);
/* convert/query/format functions */ /* convert/query/format functions */

View file

@ -41,13 +41,13 @@ typedef struct _GstPipelineClass GstPipelineClass;
struct _GstPipeline { struct _GstPipeline {
GstBin bin; GstBin bin;
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstPipelineClass { struct _GstPipelineClass {
GstBinClass parent_class; GstBinClass parent_class;
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
GType gst_pipeline_get_type (void); GType gst_pipeline_get_type (void);

View file

@ -24,6 +24,7 @@
#include <sys/stat.h> #include <sys/stat.h>
#include <dirent.h> #include <dirent.h>
#include <unistd.h> #include <unistd.h>
#include <signal.h>
#include "gst_private.h" #include "gst_private.h"
@ -39,6 +40,11 @@
static GModule *main_module = NULL; static GModule *main_module = NULL;
static GList *_gst_plugin_static = NULL; static GList *_gst_plugin_static = NULL;
/* static variables for segfault handling of plugin loading */
static char *_gst_plugin_fault_handler_filename = NULL;
extern gboolean *_gst_disable_segtrap; /* see gst.c */
static gboolean *_gst_plugin_fault_handler_is_setup = FALSE;
/* list of valid licenses. /* list of valid licenses.
* One of these must be specified or the plugin won't be loaded * One of these must be specified or the plugin won't be loaded
* Contact gstreamer-devel@lists.sourceforge.net if your license should be * Contact gstreamer-devel@lists.sourceforge.net if your license should be
@ -168,7 +174,7 @@ gst_plugin_register_func (GstPlugin *plugin, GModule *module, GstPluginDesc *des
} }
if (!desc->license || !desc->description || !desc->package || if (!desc->license || !desc->description || !desc->package ||
!desc->copyright || !desc->origin) { !desc->origin) {
if (GST_CAT_DEFAULT) GST_INFO ("plugin \"%s\" has incorrect GstPluginDesc, not loading", if (GST_CAT_DEFAULT) GST_INFO ("plugin \"%s\" has incorrect GstPluginDesc, not loading",
plugin->filename); plugin->filename);
return FALSE; return FALSE;
@ -194,6 +200,71 @@ gst_plugin_register_func (GstPlugin *plugin, GModule *module, GstPluginDesc *des
return plugin; return plugin;
} }
/**
* _gst_plugin_fault_handler_restore:
* segfault handler restorer
*/
static void
_gst_plugin_fault_handler_restore (void)
{
struct sigaction action;
memset (&action, 0, sizeof (action));
action.sa_handler = SIG_DFL;
sigaction (SIGSEGV, &action, NULL);
}
/**
* _gst_plugin_fault_handler_sighandler:
* segfault handler implementation
*/
static void
_gst_plugin_fault_handler_sighandler (int signum)
{
/* We need to restore the fault handler or we'll keep getting it */
_gst_plugin_fault_handler_restore ();
switch (signum)
{
case SIGSEGV:
g_print ("\nERROR: ");
g_print ("Caught a segmentation fault while loading plugin file:\n");
g_print ("%s\n\n", _gst_plugin_fault_handler_filename);
g_print ("Please either:\n");
g_print ("- remove it and restart.\n");
g_print ("- run with --gst-disable-segtrap and debug.\n");
exit (-1);
break;
default:
g_print ("Caught unhandled signal on plugin loading\n");
break;
}
}
/**
* _gst_plugin_fault_handler_setup:
* sets up the segfault handler
*/
static void
_gst_plugin_fault_handler_setup (void)
{
struct sigaction action;
/* if asked to leave segfaults alone, just return */
if (_gst_disable_segtrap) return;
if (_gst_plugin_fault_handler_is_setup) return;
memset (&action, 0, sizeof (action));
action.sa_handler = _gst_plugin_fault_handler_sighandler;
sigaction (SIGSEGV, &action, NULL);
}
static void
_gst_plugin_fault_handler_setup ();
/** /**
* gst_plugin_load_file: * gst_plugin_load_file:
* @plugin: The plugin to load * @plugin: The plugin to load
@ -201,7 +272,7 @@ gst_plugin_register_func (GstPlugin *plugin, GModule *module, GstPluginDesc *des
* *
* Load the given plugin. * Load the given plugin.
* *
* Returns: a new GstPlugin or NULL, if an error occured * Returns: a new GstPlugin or NULL, if an error occurred.
*/ */
GstPlugin * GstPlugin *
gst_plugin_load_file (const gchar *filename, GError **error) gst_plugin_load_file (const gchar *filename, GError **error)
@ -229,8 +300,8 @@ gst_plugin_load_file (const gchar *filename, GError **error)
GST_PLUGIN_ERROR, GST_PLUGIN_ERROR,
GST_PLUGIN_ERROR_MODULE, GST_PLUGIN_ERROR_MODULE,
"Problem opening file %s\n", "Problem opening file %s\n",
filename); filename);
return FALSE; return NULL;
} }
module = g_module_open (filename, G_MODULE_BIND_LAZY); module = g_module_open (filename, G_MODULE_BIND_LAZY);
@ -278,10 +349,19 @@ gst_plugin_load_file (const gchar *filename, GError **error)
desc->name); desc->name);
} }
/* this is where we load the actual .so, so let's trap SIGSEGV */
_gst_plugin_fault_handler_setup ();
_gst_plugin_fault_handler_filename = plugin->filename;
if (gst_plugin_register_func (plugin, module, desc)) { if (gst_plugin_register_func (plugin, module, desc)) {
/* remove signal handler */
_gst_plugin_fault_handler_restore ();
_gst_plugin_fault_handler_filename = NULL;
GST_INFO ("plugin \"%s\" loaded", plugin->filename); GST_INFO ("plugin \"%s\" loaded", plugin->filename);
return plugin; return plugin;
} else { } else {
/* remove signal handler */
_gst_plugin_fault_handler_restore ();
GST_DEBUG ("gst_plugin_register_func failed for plugin \"%s\"", filename); GST_DEBUG ("gst_plugin_register_func failed for plugin \"%s\"", filename);
/* plugin == NULL */ /* plugin == NULL */
g_set_error (error, g_set_error (error,
@ -327,8 +407,6 @@ gst_plugin_desc_copy (GstPluginDesc *dest, const GstPluginDesc *src)
dest->version = g_strdup (src->version); dest->version = g_strdup (src->version);
g_free (dest->license); g_free (dest->license);
dest->license = g_strdup (src->license); dest->license = g_strdup (src->license);
g_free (dest->copyright);
dest->copyright = g_strdup (src->copyright);
g_free (dest->package); g_free (dest->package);
dest->package = g_strdup (src->package); dest->package = g_strdup (src->package);
g_free (dest->origin); g_free (dest->origin);
@ -343,7 +421,6 @@ gst_plugin_desc_free (GstPluginDesc *desc)
g_free (desc->description); g_free (desc->description);
g_free (desc->version); g_free (desc->version);
g_free (desc->license); g_free (desc->license);
g_free (desc->copyright);
g_free (desc->package); g_free (desc->package);
g_free (desc->origin); g_free (desc->origin);
@ -439,21 +516,6 @@ gst_plugin_get_license (GstPlugin *plugin)
return plugin->desc.license; return plugin->desc.license;
} }
/**
* gst_plugin_get_copyright:
* @plugin: plugin to get the copyright of
*
* get the informal copyright notice of the plugin
*
* Returns: the copyright of the plugin
*/
G_CONST_RETURN gchar*
gst_plugin_get_copyright (GstPlugin *plugin)
{
g_return_val_if_fail (plugin != NULL, NULL);
return plugin->desc.copyright;
}
/** /**
* gst_plugin_get_package: * gst_plugin_get_package:
* @plugin: plugin to get the package of * @plugin: plugin to get the package of

View file

@ -61,11 +61,10 @@ struct _GstPluginDesc {
GstPluginExitFunc plugin_exit; /* pointer to exiting function */ GstPluginExitFunc plugin_exit; /* pointer to exiting function */
gchar *version; /* version of the plugin */ gchar *version; /* version of the plugin */
gchar *license; /* effective license of plugin */ gchar *license; /* effective license of plugin */
gchar *copyright; /* informal copyright notice */
gchar *package; /* package plugin belongs to */ gchar *package; /* package plugin belongs to */
gchar *origin; /* URL to provider of plugin */ gchar *origin; /* URL to provider of plugin */
GST_STRUCT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstPlugin { struct _GstPlugin {
@ -78,10 +77,10 @@ struct _GstPlugin {
gpointer manager; /* managing registry */ gpointer manager; /* managing registry */
GModule * module; /* contains the module if the plugin is loaded */ GModule * module; /* contains the module if the plugin is loaded */
GST_STRUCT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
#define GST_PLUGIN_DEFINE(major,minor,name,description,init,version,license,copyright,package,origin) \ #define GST_PLUGIN_DEFINE(major,minor,name,description,init,version,license,package,origin) \
GstPluginDesc gst_plugin_desc = { \ GstPluginDesc gst_plugin_desc = { \
major, \ major, \
minor, \ minor, \
@ -91,13 +90,12 @@ GstPluginDesc gst_plugin_desc = { \
NULL, \ NULL, \
version, \ version, \
license, \ license, \
copyright, \
package, \ package, \
origin, \ origin, \
GST_STRUCT_PADDING_INIT \ GST_PADDING_INIT \
}; };
#define GST_PLUGIN_DEFINE_STATIC(major,minor,name,description,init,version,license,copyright,package,origin) \ #define GST_PLUGIN_DEFINE_STATIC(major,minor,name,description,init,version,license,package,origin) \
static void GST_GNUC_CONSTRUCTOR \ static void GST_GNUC_CONSTRUCTOR \
_gst_plugin_static_init__ ##init (void) \ _gst_plugin_static_init__ ##init (void) \
{ \ { \
@ -110,10 +108,9 @@ _gst_plugin_static_init__ ##init (void) \
NULL, \ NULL, \
version, \ version, \
license, \ license, \
copyright, \
package, \ package, \
origin, \ origin, \
GST_STRUCT_PADDING_INIT \ GST_PADDING_INIT \
}; \ }; \
_gst_plugin_register_static (&plugin_desc_); \ _gst_plugin_register_static (&plugin_desc_); \
} }
@ -135,7 +132,6 @@ void gst_plugin_set_name (GstPlugin *plugin, const gchar *name);
G_CONST_RETURN gchar* gst_plugin_get_longname (GstPlugin *plugin); G_CONST_RETURN gchar* gst_plugin_get_longname (GstPlugin *plugin);
G_CONST_RETURN gchar* gst_plugin_get_filename (GstPlugin *plugin); G_CONST_RETURN gchar* gst_plugin_get_filename (GstPlugin *plugin);
G_CONST_RETURN gchar* gst_plugin_get_license (GstPlugin *plugin); G_CONST_RETURN gchar* gst_plugin_get_license (GstPlugin *plugin);
G_CONST_RETURN gchar* gst_plugin_get_copyright (GstPlugin *plugin);
G_CONST_RETURN gchar* gst_plugin_get_package (GstPlugin *plugin); G_CONST_RETURN gchar* gst_plugin_get_package (GstPlugin *plugin);
G_CONST_RETURN gchar* gst_plugin_get_origin (GstPlugin *plugin); G_CONST_RETURN gchar* gst_plugin_get_origin (GstPlugin *plugin);
GModule * gst_plugin_get_module (GstPlugin *plugin); GModule * gst_plugin_get_module (GstPlugin *plugin);

View file

@ -50,7 +50,7 @@ struct _GstPluginFeature {
gpointer manager; gpointer manager;
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstPluginFeatureClass { struct _GstPluginFeatureClass {
@ -58,7 +58,7 @@ struct _GstPluginFeatureClass {
void (*unload_thyself) (GstPluginFeature *feature); void (*unload_thyself) (GstPluginFeature *feature);
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
typedef struct { typedef struct {

File diff suppressed because it is too large Load diff

View file

@ -56,43 +56,51 @@ struct _GstQueue {
GstPad *sinkpad; GstPad *sinkpad;
GstPad *srcpad; GstPad *srcpad;
/* the queue of buffers we're keeping our grubby hands on */ /* the queue of data we're keeping our grubby hands on */
GQueue *queue; GQueue *queue;
guint level_buffers; /* number of buffers queued here */ struct {
guint level_bytes; /* number of bytes queued here */ guint buffers; /* no. of buffers */
guint64 level_time; /* amount of time queued here */ guint bytes; /* no. of bytes */
guint64 time; /* amount of time */
} cur_level, /* currently in the queue */
max_size, /* max. amount of data allowed in the queue */
min_treshold; /* min. amount of data required to wake reader */
guint size_buffers; /* size of queue in buffers */ /* whether we leak data, and at which end */
guint size_bytes; /* size of queue in bytes */ gint leaky;
guint64 size_time; /* size of queue in time */
/* number of nanoseconds until a blocked queue 'times out'
* to receive data and returns a filler event. -1 = disable */
guint64 block_timeout;
/* it the queue should fail on possible deadlocks */
gboolean may_deadlock;
gint leaky; /* whether the queue is leaky, and if so at which end */
gint block_timeout; /* microseconds until a blocked queue times out and returns GST_EVENT_FILLER.
* A value of -1 will block forever. */
guint min_threshold_bytes; /* the minimum number of bytes required before
* waking up the reader thread */
gboolean may_deadlock; /* it the queue should fail on possible deadlocks */
gboolean interrupt; gboolean interrupt;
gboolean flush; gboolean flush;
GMutex *qlock; /* lock for queue (vs object lock) */ GMutex *qlock; /* lock for queue (vs object lock) */
GCond *not_empty; /* signals buffers now available for reading */ GCond *item_add; /* signals buffers now available for reading */
GCond *not_full; /* signals space now available for writing */ GCond *item_del; /* signals space now available for writing */
GCond *event_done; /* upstream event signaller */
GTimeVal *timeval; /* the timeout for the queue locking */ GTimeVal *timeval; /* the timeout for the queue locking */
GAsyncQueue *events; /* upstream events get decoupled here */ GQueue *events; /* upstream events get decoupled here */
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstQueueClass { struct _GstQueueClass {
GstElementClass parent_class; GstElementClass parent_class;
/* signal callbacks */ /* signals - 'running' is called from both sides
void (*full) (GstQueue *queue); * which might make it sort of non-useful... */
void (*underrun) (GstQueue *queue);
void (*running) (GstQueue *queue);
void (*overrun) (GstQueue *queue);
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
GType gst_queue_get_type (void); GType gst_queue_get_type (void);

View file

@ -86,7 +86,7 @@ struct _GstRegistry {
GList *paths; GList *paths;
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstRegistryClass { struct _GstRegistryClass {
@ -105,7 +105,7 @@ struct _GstRegistryClass {
/* signals */ /* signals */
void (*plugin_added) (GstRegistry *registry, GstPlugin *plugin); void (*plugin_added) (GstRegistry *registry, GstPlugin *plugin);
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };

View file

@ -799,8 +799,14 @@ gst_scheduler_factory_class_init (GstSchedulerFactoryClass *klass)
factory_parent_class = g_type_class_ref (GST_TYPE_PLUGIN_FEATURE); factory_parent_class = g_type_class_ref (GST_TYPE_PLUGIN_FEATURE);
if (!_default_name) if (!_default_name) {
_default_name = g_strdup (GST_SCHEDULER_DEFAULT_NAME); if (g_getenv ("GST_SCHEDULER")) {
_default_name = g_strdup (g_getenv ("GST_SCHEDULER"));
} else {
_default_name = g_strdup (GST_SCHEDULER_DEFAULT_NAME);
}
}
g_assert (_default_name);
} }
static void static void

View file

@ -72,7 +72,7 @@ struct _GstScheduler {
GList *schedulers; GList *schedulers;
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstSchedulerClass { struct _GstSchedulerClass {
@ -105,7 +105,7 @@ struct _GstSchedulerClass {
void (*object_sync) (GstScheduler *sched, GstClock *clock, GstObject *object, void (*object_sync) (GstScheduler *sched, GstClock *clock, GstObject *object,
GstClockID id); GstClockID id);
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
GType gst_scheduler_get_type (void); GType gst_scheduler_get_type (void);
@ -161,13 +161,13 @@ struct _GstSchedulerFactory {
gchar *longdesc; /* long description of the scheduler (well, don't overdo it..) */ gchar *longdesc; /* long description of the scheduler (well, don't overdo it..) */
GType type; /* unique GType of the scheduler */ GType type; /* unique GType of the scheduler */
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstSchedulerFactoryClass { struct _GstSchedulerFactoryClass {
GstPluginFeatureClass parent; GstPluginFeatureClass parent;
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
GType gst_scheduler_factory_get_type (void); GType gst_scheduler_factory_get_type (void);

View file

@ -45,13 +45,13 @@ struct _GstSystemClock {
GMutex * mutex; GMutex * mutex;
GCond * cond; GCond * cond;
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstSystemClockClass { struct _GstSystemClockClass {
GstClockClass parent_class; GstClockClass parent_class;
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
GType gst_system_clock_get_type (void); GType gst_system_clock_get_type (void);

View file

@ -63,7 +63,7 @@ struct _GstThread {
GMutex *lock; /* thread lock/condititon pairs */ GMutex *lock; /* thread lock/condititon pairs */
GCond *cond; /* used to control the thread */ GCond *cond; /* used to control the thread */
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstThreadClass { struct _GstThreadClass {
@ -72,7 +72,7 @@ struct _GstThreadClass {
/* signals */ /* signals */
void (*shutdown) (GstThread *thread); void (*shutdown) (GstThread *thread);
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
GType gst_thread_get_type (void); GType gst_thread_get_type (void);

View file

@ -67,7 +67,7 @@ struct _GstTypeFind {
guint64 (* get_length) (gpointer data); guint64 (* get_length) (gpointer data);
/* <private> */ /* <private> */
GST_STRUCT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstTypeFindFactory { struct _GstTypeFindFactory {
@ -80,14 +80,14 @@ struct _GstTypeFindFactory {
gpointer user_data; gpointer user_data;
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstTypeFindFactoryClass { struct _GstTypeFindFactoryClass {
GstPluginFeatureClass parent; GstPluginFeatureClass parent;
/* <private> */ /* <private> */
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
/* typefind function interface */ /* typefind function interface */

View file

@ -63,11 +63,8 @@ typedef enum {
#define GST_RANK_MARGINAL 64 #define GST_RANK_MARGINAL 64
#define GST_RANK_NONE 0 #define GST_RANK_NONE 0
#define GST_STRUCT_PADDING gpointer _gst_reserved[4]; #define GST_PADDING 4
#define GST_CLASS_PADDING gpointer _gst_reserved[4]; #define GST_PADDING_INIT { 0 }
#define GST_OBJECT_PADDING gpointer _gst_reserved[4];
#define GST_STRUCT_PADDING_INIT {NULL, NULL, NULL, NULL}
G_END_DECLS G_END_DECLS

View file

@ -73,7 +73,7 @@ struct _GstURIHandlerInterface {
/* we might want to add functions here to query features, someone with gnome-vfs knowledge go ahead */ /* we might want to add functions here to query features, someone with gnome-vfs knowledge go ahead */
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
/* general URI functions */ /* general URI functions */

View file

@ -49,7 +49,7 @@ struct _GstXML {
xmlNsPtr ns; xmlNsPtr ns;
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
typedef struct _GstXMLNs GstXMLNs; typedef struct _GstXMLNs GstXMLNs;
@ -61,7 +61,7 @@ struct _GstXMLClass {
void (*object_loaded) (GstXML *xml, GstObject *object, xmlNodePtr self); void (*object_loaded) (GstXML *xml, GstObject *object, xmlNodePtr self);
void (*object_saved) (GstXML *xml, GstObject *object, xmlNodePtr self); void (*object_saved) (GstXML *xml, GstObject *object, xmlNodePtr self);
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
GType gst_xml_get_type (void); GType gst_xml_get_type (void);

View file

@ -39,11 +39,10 @@ GST_PLUGIN_DEFINE (
GST_VERSION_MAJOR, GST_VERSION_MAJOR,
GST_VERSION_MINOR, GST_VERSION_MINOR,
"gstindexers", "gstindexers",
"Gstremaer core indexers", "GStreamer core indexers",
plugin_init, plugin_init,
VERSION, VERSION,
GST_LICENSE, GST_LICENSE,
GST_COPYRIGHT,
GST_PACKAGE, GST_PACKAGE,
GST_ORIGIN GST_ORIGIN
) )

View file

@ -42,9 +42,10 @@ _ref {_identifier}"."{_identifier}?
_binref {_identifier}[[:space:]]*"."[[:space:]]*"(" _binref {_identifier}[[:space:]]*"."[[:space:]]*"("
/* links */ /* links */
_capschar ("\\".)|([^[:space:]\;!\.\,\(\)\]\[]) _mimechar ([[:alnum:]-])
_mimetype ({_mimechar}+"/"{_mimechar}+)|("\""([^\"]|"\\\"")*"\"")|("'"([^']|"\\\"")*"'")
_capschar ("\\".)|([^[:space:]\;!\,\(\)\]\[])
_capsstring {_capschar}+|("\""([^\"]|"\\\"")*"\"")|("'"([^']|"\\\"")*"'") _capsstring {_capschar}+|("\""([^\"]|"\\\"")*"\"")|("'"([^']|"\\\"")*"'")
_mimetype ({_capschar}+"/"{_capschar}+)|("\""([^\"]|"\\\"")*"\"")|("'"([^']|"\\\"")*"'")
_caps {_mimetype}(","[^!]|{_capsstring})* _caps {_mimetype}(","[^!]|{_capsstring})*
_link ("!"[[:space:]]*{_caps}([[:space:]]*";"[[:space:]]*{_caps})*[[:space:]]*"!")|("!") _link ("!"[[:space:]]*{_caps}([[:space:]]*";"[[:space:]]*{_caps})*[[:space:]]*"!")|("!")

View file

@ -663,9 +663,6 @@ gst_xml_registry_parse_plugin (GMarkupParseContext *context, const gchar *tag, c
else if (!strcmp (tag, "version")) { else if (!strcmp (tag, "version")) {
plugin->desc.version = g_strndup (text, text_len); plugin->desc.version = g_strndup (text, text_len);
} }
else if (!strcmp (tag, "copyright")) {
plugin->desc.copyright = g_strndup (text, text_len);
}
else if (!strcmp (tag, "license")) { else if (!strcmp (tag, "license")) {
plugin->desc.license = g_strndup (text, text_len); plugin->desc.license = g_strndup (text, text_len);
} }
@ -1220,7 +1217,6 @@ gst_xml_registry_save_plugin (GstXMLRegistry *xmlregistry, GstPlugin *plugin)
PUT_ESCAPED ("filename", plugin->filename); PUT_ESCAPED ("filename", plugin->filename);
PUT_ESCAPED ("version", plugin->desc.version); PUT_ESCAPED ("version", plugin->desc.version);
PUT_ESCAPED ("license", plugin->desc.license); PUT_ESCAPED ("license", plugin->desc.license);
PUT_ESCAPED ("copyright", plugin->desc.copyright);
PUT_ESCAPED ("package", plugin->desc.package); PUT_ESCAPED ("package", plugin->desc.package);
PUT_ESCAPED ("origin", plugin->desc.origin); PUT_ESCAPED ("origin", plugin->desc.origin);

View file

@ -34,8 +34,8 @@ GST_DEBUG_CATEGORY_STATIC(debug_scheduler);
typedef struct _GstSchedulerChain GstSchedulerChain; typedef struct _GstSchedulerChain GstSchedulerChain;
#define GST_ELEMENT_THREADSTATE(elem) (cothread*) (GST_ELEMENT_CAST (elem)->sched_private) #define GST_ELEMENT_THREADSTATE(elem) (cothread*) (GST_ELEMENT (elem)->sched_private)
#define GST_RPAD_BUFPEN(pad) (GstData*) (GST_REAL_PAD_CAST(pad)->sched_private) #define GST_RPAD_BUFPEN(pad) (GstData*) (GST_REAL_PAD(pad)->sched_private)
#define GST_ELEMENT_COTHREAD_STOPPING GST_ELEMENT_SCHEDULER_PRIVATE1 #define GST_ELEMENT_COTHREAD_STOPPING GST_ELEMENT_SCHEDULER_PRIVATE1
#define GST_ELEMENT_IS_COTHREAD_STOPPING(element) GST_FLAG_IS_SET((element), GST_ELEMENT_COTHREAD_STOPPING) #define GST_ELEMENT_IS_COTHREAD_STOPPING(element) GST_FLAG_IS_SET((element), GST_ELEMENT_COTHREAD_STOPPING)
@ -74,8 +74,7 @@ struct _GstSchedulerChain {
#define GST_IS_BASIC_SCHEDULER_CLASS(obj) \ #define GST_IS_BASIC_SCHEDULER_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BASIC_SCHEDULER)) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_BASIC_SCHEDULER))
#define GST_BASIC_SCHEDULER_CAST(sched) ((GstBasicScheduler *)(sched)) #define SCHED(element) GST_BASIC_SCHEDULER (GST_ELEMENT_SCHED (element))
#define SCHED(element) GST_BASIC_SCHEDULER_CAST (GST_ELEMENT_SCHED (element))
typedef enum { typedef enum {
GST_BASIC_SCHEDULER_STATE_NONE, GST_BASIC_SCHEDULER_STATE_NONE,
@ -273,7 +272,6 @@ GST_PLUGIN_DEFINE (
plugin_init, plugin_init,
VERSION, VERSION,
GST_LICENSE, GST_LICENSE,
GST_COPYRIGHT,
GST_PACKAGE, GST_PACKAGE,
GST_ORIGIN GST_ORIGIN
) )
@ -281,7 +279,7 @@ GST_PLUGIN_DEFINE (
static int static int
gst_basic_scheduler_loopfunc_wrapper (int argc, char **argv) gst_basic_scheduler_loopfunc_wrapper (int argc, char **argv)
{ {
GstElement *element = GST_ELEMENT_CAST (argv); GstElement *element = GST_ELEMENT (argv);
G_GNUC_UNUSED const gchar *name = GST_ELEMENT_NAME (element); G_GNUC_UNUSED const gchar *name = GST_ELEMENT_NAME (element);
GST_DEBUG("entering loopfunc wrapper of %s", name); GST_DEBUG("entering loopfunc wrapper of %s", name);
@ -315,7 +313,7 @@ static int
gst_basic_scheduler_chain_wrapper (int argc, char **argv) gst_basic_scheduler_chain_wrapper (int argc, char **argv)
{ {
GSList *already_iterated = NULL; GSList *already_iterated = NULL;
GstElement *element = GST_ELEMENT_CAST (argv); GstElement *element = GST_ELEMENT (argv);
G_GNUC_UNUSED const gchar *name = GST_ELEMENT_NAME (element); G_GNUC_UNUSED const gchar *name = GST_ELEMENT_NAME (element);
GST_DEBUG ("entered chain wrapper of element %s", name); GST_DEBUG ("entered chain wrapper of element %s", name);
@ -387,7 +385,7 @@ gst_basic_scheduler_chain_wrapper (int argc, char **argv)
static int static int
gst_basic_scheduler_src_wrapper (int argc, char **argv) gst_basic_scheduler_src_wrapper (int argc, char **argv)
{ {
GstElement *element = GST_ELEMENT_CAST (argv); GstElement *element = GST_ELEMENT (argv);
GList *pads; GList *pads;
GstRealPad *realpad; GstRealPad *realpad;
GstData *data = NULL; GstData *data = NULL;
@ -402,17 +400,17 @@ gst_basic_scheduler_src_wrapper (int argc, char **argv)
if (!GST_IS_REAL_PAD (pads->data)) if (!GST_IS_REAL_PAD (pads->data))
continue; continue;
realpad = GST_REAL_PAD_CAST (pads->data); realpad = GST_REAL_PAD (pads->data);
pads = g_list_next (pads); pads = g_list_next (pads);
if (GST_RPAD_DIRECTION (realpad) == GST_PAD_SRC && GST_PAD_IS_USABLE (realpad)) { if (GST_RPAD_DIRECTION (realpad) == GST_PAD_SRC && GST_PAD_IS_USABLE (realpad)) {
GST_CAT_DEBUG (debug_dataflow, "calling _getfunc for %s:%s", GST_DEBUG_PAD_NAME (realpad)); GST_CAT_DEBUG (debug_dataflow, "calling _getfunc for %s:%s", GST_DEBUG_PAD_NAME (realpad));
g_return_val_if_fail (GST_RPAD_GETFUNC (realpad) != NULL, 0); g_return_val_if_fail (GST_RPAD_GETFUNC (realpad) != NULL, 0);
data = GST_RPAD_GETFUNC (realpad) (GST_PAD_CAST (realpad)); data = GST_RPAD_GETFUNC (realpad) (GST_PAD (realpad));
if (data) { if (data) {
GST_CAT_DEBUG (debug_dataflow, "calling gst_pad_push on pad %s:%s %p", GST_CAT_DEBUG (debug_dataflow, "calling gst_pad_push on pad %s:%s %p",
GST_DEBUG_PAD_NAME (realpad), data); GST_DEBUG_PAD_NAME (realpad), data);
gst_pad_push (GST_PAD_CAST (realpad), data); gst_pad_push (GST_PAD (realpad), data);
} }
} }
} }
@ -604,7 +602,7 @@ gst_basic_scheduler_cothreaded_chain (GstBin * bin, GstSchedulerChain * chain)
while (elements) { while (elements) {
gboolean decoupled; gboolean decoupled;
element = GST_ELEMENT_CAST (elements->data); element = GST_ELEMENT (elements->data);
elements = g_list_next (elements); elements = g_list_next (elements);
decoupled = GST_FLAG_IS_SET (element, GST_ELEMENT_DECOUPLED); decoupled = GST_FLAG_IS_SET (element, GST_ELEMENT_DECOUPLED);
@ -650,7 +648,7 @@ gst_basic_scheduler_cothreaded_chain (GstBin * bin, GstSchedulerChain * chain)
peerpad = GST_PAD_PEER (pad); peerpad = GST_PAD_PEER (pad);
if (peerpad) { if (peerpad) {
GstElement *peerelement = GST_ELEMENT_CAST (GST_PAD_PARENT (peerpad)); GstElement *peerelement = GST_ELEMENT (GST_PAD_PARENT (peerpad));
gboolean different_sched = (peerelement->sched != GST_SCHEDULER (chain->sched)); gboolean different_sched = (peerelement->sched != GST_SCHEDULER (chain->sched));
gboolean peer_decoupled = GST_FLAG_IS_SET (peerelement, GST_ELEMENT_DECOUPLED); gboolean peer_decoupled = GST_FLAG_IS_SET (peerelement, GST_ELEMENT_DECOUPLED);
@ -1043,9 +1041,9 @@ static void
gst_basic_scheduler_setup (GstScheduler *sched) gst_basic_scheduler_setup (GstScheduler *sched)
{ {
/* first create thread context */ /* first create thread context */
if (GST_BASIC_SCHEDULER_CAST (sched)->context == NULL) { if (GST_BASIC_SCHEDULER (sched)->context == NULL) {
GST_DEBUG ("initializing cothread context"); GST_DEBUG ("initializing cothread context");
GST_BASIC_SCHEDULER_CAST (sched)->context = do_cothread_context_init (); GST_BASIC_SCHEDULER (sched)->context = do_cothread_context_init ();
} }
} }
@ -1053,7 +1051,7 @@ static void
gst_basic_scheduler_reset (GstScheduler *sched) gst_basic_scheduler_reset (GstScheduler *sched)
{ {
cothread_context *ctx; cothread_context *ctx;
GList *elements = GST_BASIC_SCHEDULER_CAST (sched)->elements; GList *elements = GST_BASIC_SCHEDULER (sched)->elements;
while (elements) { while (elements) {
GstElement *element = GST_ELEMENT (elements->data); GstElement *element = GST_ELEMENT (elements->data);
@ -1064,11 +1062,11 @@ gst_basic_scheduler_reset (GstScheduler *sched)
elements = g_list_next (elements); elements = g_list_next (elements);
} }
ctx = GST_BASIC_SCHEDULER_CAST (sched)->context; ctx = GST_BASIC_SCHEDULER (sched)->context;
do_cothread_context_destroy (ctx); do_cothread_context_destroy (ctx);
GST_BASIC_SCHEDULER_CAST (sched)->context = NULL; GST_BASIC_SCHEDULER (sched)->context = NULL;
} }
static void static void
@ -1262,8 +1260,8 @@ gst_basic_scheduler_pad_unlink (GstScheduler * sched, GstPad * srcpad, GstPad *
GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad)); GST_DEBUG_PAD_NAME (srcpad), GST_DEBUG_PAD_NAME (sinkpad));
/* we need to have the parent elements of each pad */ /* we need to have the parent elements of each pad */
element1 = GST_ELEMENT_CAST (GST_PAD_PARENT (srcpad)); element1 = GST_ELEMENT (GST_PAD_PARENT (srcpad));
element2 = GST_ELEMENT_CAST (GST_PAD_PARENT (sinkpad)); element2 = GST_ELEMENT (GST_PAD_PARENT (sinkpad));
/* first task is to remove the old chain they belonged to. /* first task is to remove the old chain they belonged to.
* this can be accomplished by taking either of the elements, * this can be accomplished by taking either of the elements,
@ -1391,7 +1389,7 @@ gst_basic_scheduler_iterate (GstScheduler * sched)
GST_DEBUG ("there are %d elements in this chain", chain->num_elements); GST_DEBUG ("there are %d elements in this chain", chain->num_elements);
elements = chain->elements; elements = chain->elements;
while (elements) { while (elements) {
entry = GST_ELEMENT_CAST (elements->data); entry = GST_ELEMENT (elements->data);
elements = g_list_next (elements); elements = g_list_next (elements);
if (GST_FLAG_IS_SET (entry, GST_ELEMENT_DECOUPLED)) { if (GST_FLAG_IS_SET (entry, GST_ELEMENT_DECOUPLED)) {
GST_DEBUG ("entry \"%s\" is DECOUPLED, skipping", GST_DEBUG ("entry \"%s\" is DECOUPLED, skipping",

View file

@ -36,9 +36,9 @@ GST_DEBUG_CATEGORY_STATIC(debug_scheduler);
# define COTHREADS_NAME "" # define COTHREADS_NAME ""
#endif #endif
#define GST_ELEMENT_SCHED_CONTEXT(elem) ((GstOptSchedulerCtx*) (GST_ELEMENT_CAST (elem)->sched_private)) #define GST_ELEMENT_SCHED_CONTEXT(elem) ((GstOptSchedulerCtx*) (GST_ELEMENT (elem)->sched_private))
#define GST_ELEMENT_SCHED_GROUP(elem) (GST_ELEMENT_SCHED_CONTEXT (elem)->group) #define GST_ELEMENT_SCHED_GROUP(elem) (GST_ELEMENT_SCHED_CONTEXT (elem)->group)
#define GST_PAD_BUFLIST(pad) ((GList*) (GST_REAL_PAD_CAST(pad)->sched_private)) #define GST_PAD_BUFLIST(pad) ((GList*) (GST_REAL_PAD(pad)->sched_private))
#define GST_ELEMENT_COTHREAD_STOPPING GST_ELEMENT_SCHEDULER_PRIVATE1 #define GST_ELEMENT_COTHREAD_STOPPING GST_ELEMENT_SCHEDULER_PRIVATE1
#define GST_ELEMENT_IS_COTHREAD_STOPPING(element) GST_FLAG_IS_SET((element), GST_ELEMENT_COTHREAD_STOPPING) #define GST_ELEMENT_IS_COTHREAD_STOPPING(element) GST_FLAG_IS_SET((element), GST_ELEMENT_COTHREAD_STOPPING)
@ -59,8 +59,6 @@ typedef struct _GstOptSchedulerClass GstOptSchedulerClass;
#define GST_IS_OPT_SCHEDULER_CLASS(obj) \ #define GST_IS_OPT_SCHEDULER_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OPT_SCHEDULER)) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_OPT_SCHEDULER))
#define GST_OPT_SCHEDULER_CAST(sched) ((GstOptScheduler *)(sched))
typedef enum { typedef enum {
GST_OPT_SCHEDULER_STATE_NONE, GST_OPT_SCHEDULER_STATE_NONE,
GST_OPT_SCHEDULER_STATE_STOPPED, GST_OPT_SCHEDULER_STATE_STOPPED,
@ -378,7 +376,6 @@ GST_PLUGIN_DEFINE (
plugin_init, plugin_init,
VERSION, VERSION,
GST_LICENSE, GST_LICENSE,
GST_VERSION,
GST_PACKAGE, GST_PACKAGE,
GST_ORIGIN GST_ORIGIN
); );
@ -954,7 +951,7 @@ get_group_schedule_function (int argc, char *argv[])
while (pads) { while (pads) {
GstData *data; GstData *data;
GstPad *pad = GST_PAD_CAST (pads->data); GstPad *pad = GST_PAD (pads->data);
pads = g_list_next (pads); pads = g_list_next (pads);
/* skip sinks and ghostpads */ /* skip sinks and ghostpads */
@ -1247,7 +1244,7 @@ setup_group_scheduler (GstOptScheduler *osched, GstOptSchedulerGroup *group)
static GstElementStateReturn static GstElementStateReturn
gst_opt_scheduler_state_transition (GstScheduler *sched, GstElement *element, gint transition) gst_opt_scheduler_state_transition (GstScheduler *sched, GstElement *element, gint transition)
{ {
GstOptScheduler *osched = GST_OPT_SCHEDULER_CAST (sched); GstOptScheduler *osched = GST_OPT_SCHEDULER (sched);
GstOptSchedulerGroup *group; GstOptSchedulerGroup *group;
GstElementStateReturn res = GST_STATE_SUCCESS; GstElementStateReturn res = GST_STATE_SUCCESS;
@ -1477,7 +1474,7 @@ static void
gst_opt_scheduler_setup (GstScheduler *sched) gst_opt_scheduler_setup (GstScheduler *sched)
{ {
#ifdef USE_COTHREADS #ifdef USE_COTHREADS
GstOptScheduler *osched = GST_OPT_SCHEDULER_CAST (sched); GstOptScheduler *osched = GST_OPT_SCHEDULER (sched);
/* first create thread context */ /* first create thread context */
if (osched->context == NULL) { if (osched->context == NULL) {
@ -1491,7 +1488,7 @@ static void
gst_opt_scheduler_reset (GstScheduler *sched) gst_opt_scheduler_reset (GstScheduler *sched)
{ {
#ifdef USE_COTHREADS #ifdef USE_COTHREADS
GstOptScheduler *osched = GST_OPT_SCHEDULER_CAST (sched); GstOptScheduler *osched = GST_OPT_SCHEDULER (sched);
GSList *chains = osched->chains; GSList *chains = osched->chains;
while (chains) { while (chains) {
@ -1516,7 +1513,7 @@ gst_opt_scheduler_reset (GstScheduler *sched)
static void static void
gst_opt_scheduler_add_element (GstScheduler *sched, GstElement *element) gst_opt_scheduler_add_element (GstScheduler *sched, GstElement *element)
{ {
GstOptScheduler *osched = GST_OPT_SCHEDULER_CAST (sched); GstOptScheduler *osched = GST_OPT_SCHEDULER (sched);
GstOptSchedulerCtx *ctx; GstOptSchedulerCtx *ctx;
const GList *pads; const GList *pads;
@ -1584,14 +1581,14 @@ gst_opt_scheduler_remove_element (GstScheduler *sched, GstElement *element)
static void static void
gst_opt_scheduler_lock_element (GstScheduler *sched, GstElement *element) gst_opt_scheduler_lock_element (GstScheduler *sched, GstElement *element)
{ {
//GstOptScheduler *osched = GST_OPT_SCHEDULER_CAST (sched); //GstOptScheduler *osched = GST_OPT_SCHEDULER (sched);
g_warning ("lock element, implement me"); g_warning ("lock element, implement me");
} }
static void static void
gst_opt_scheduler_unlock_element (GstScheduler *sched, GstElement *element) gst_opt_scheduler_unlock_element (GstScheduler *sched, GstElement *element)
{ {
//GstOptScheduler *osched = GST_OPT_SCHEDULER_CAST (sched); //GstOptScheduler *osched = GST_OPT_SCHEDULER (sched);
g_warning ("unlock element, implement me"); g_warning ("unlock element, implement me");
} }
@ -1625,7 +1622,7 @@ gst_opt_scheduler_interrupt (GstScheduler *sched, GstElement *element)
return FALSE; return FALSE;
#else #else
{ {
GstOptScheduler *osched = GST_OPT_SCHEDULER_CAST (sched); GstOptScheduler *osched = GST_OPT_SCHEDULER (sched);
GST_INFO ( "scheduler set interrupted state"); GST_INFO ( "scheduler set interrupted state");
osched->state = GST_OPT_SCHEDULER_STATE_INTERRUPTED; osched->state = GST_OPT_SCHEDULER_STATE_INTERRUPTED;
@ -1637,7 +1634,7 @@ gst_opt_scheduler_interrupt (GstScheduler *sched, GstElement *element)
static void static void
gst_opt_scheduler_error (GstScheduler *sched, GstElement *element) gst_opt_scheduler_error (GstScheduler *sched, GstElement *element)
{ {
GstOptScheduler *osched = GST_OPT_SCHEDULER_CAST (sched); GstOptScheduler *osched = GST_OPT_SCHEDULER (sched);
GstOptSchedulerGroup *group; GstOptSchedulerGroup *group;
get_group (element, &group); get_group (element, &group);
if (group) if (group)
@ -1650,7 +1647,7 @@ gst_opt_scheduler_error (GstScheduler *sched, GstElement *element)
static void static void
gst_opt_scheduler_pad_link (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad) gst_opt_scheduler_pad_link (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad)
{ {
GstOptScheduler *osched = GST_OPT_SCHEDULER_CAST (sched); GstOptScheduler *osched = GST_OPT_SCHEDULER (sched);
LinkType type = GST_OPT_INVALID; LinkType type = GST_OPT_INVALID;
GstElement *element1, *element2; GstElement *element1, *element2;
@ -1828,7 +1825,7 @@ element_has_link_with_group (GstElement *element, GstOptSchedulerGroup *group, G
/* see if the element has no more links to the peer group */ /* see if the element has no more links to the peer group */
pads = gst_element_get_pad_list (element); pads = gst_element_get_pad_list (element);
while (pads && !linked) { while (pads && !linked) {
GstPad *pad = GST_PAD_CAST (pads->data); GstPad *pad = GST_PAD (pads->data);
pads = g_list_next (pads); pads = g_list_next (pads);
/* we only operate on real pads and on the pad that is not broken */ /* we only operate on real pads and on the pad that is not broken */
@ -1916,7 +1913,7 @@ group_can_reach_group (GstOptSchedulerGroup *group, GstOptSchedulerGroup *target
static void static void
gst_opt_scheduler_pad_unlink (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad) gst_opt_scheduler_pad_unlink (GstScheduler *sched, GstPad *srcpad, GstPad *sinkpad)
{ {
GstOptScheduler *osched = GST_OPT_SCHEDULER_CAST (sched); GstOptScheduler *osched = GST_OPT_SCHEDULER (sched);
GstElement *element1, *element2; GstElement *element1, *element2;
GstOptSchedulerGroup *group1, *group2; GstOptSchedulerGroup *group1, *group2;
@ -2040,7 +2037,7 @@ gst_opt_scheduler_pad_unlink (GstScheduler *sched, GstPad *srcpad, GstPad *sinkp
static void static void
gst_opt_scheduler_pad_select (GstScheduler *sched, GList *padlist) gst_opt_scheduler_pad_select (GstScheduler *sched, GList *padlist)
{ {
//GstOptScheduler *osched = GST_OPT_SCHEDULER_CAST (sched); //GstOptScheduler *osched = GST_OPT_SCHEDULER (sched);
g_warning ("pad select, implement me"); g_warning ("pad select, implement me");
} }
@ -2057,7 +2054,7 @@ static GstSchedulerState
gst_opt_scheduler_iterate (GstScheduler *sched) gst_opt_scheduler_iterate (GstScheduler *sched)
{ {
GstSchedulerState state = GST_SCHEDULER_STATE_STOPPED; GstSchedulerState state = GST_SCHEDULER_STATE_STOPPED;
GstOptScheduler *osched = GST_OPT_SCHEDULER_CAST (sched); GstOptScheduler *osched = GST_OPT_SCHEDULER (sched);
gint iterations = osched->iterations; gint iterations = osched->iterations;
osched->state = GST_OPT_SCHEDULER_STATE_RUNNING; osched->state = GST_OPT_SCHEDULER_STATE_RUNNING;
@ -2121,7 +2118,7 @@ gst_opt_scheduler_iterate (GstScheduler *sched)
static void static void
gst_opt_scheduler_show (GstScheduler *sched) gst_opt_scheduler_show (GstScheduler *sched)
{ {
GstOptScheduler *osched = GST_OPT_SCHEDULER_CAST (sched); GstOptScheduler *osched = GST_OPT_SCHEDULER (sched);
GSList *chains; GSList *chains;
g_print ("iterations: %d\n", osched->iterations); g_print ("iterations: %d\n", osched->iterations);
@ -2164,7 +2161,7 @@ gst_opt_scheduler_get_property (GObject *object, guint prop_id,
g_return_if_fail (GST_IS_OPT_SCHEDULER (object)); g_return_if_fail (GST_IS_OPT_SCHEDULER (object));
osched = GST_OPT_SCHEDULER_CAST (object); osched = GST_OPT_SCHEDULER (object);
switch (prop_id) { switch (prop_id) {
case ARG_ITERATIONS: case ARG_ITERATIONS:
@ -2187,7 +2184,7 @@ gst_opt_scheduler_set_property (GObject *object, guint prop_id,
g_return_if_fail (GST_IS_OPT_SCHEDULER (object)); g_return_if_fail (GST_IS_OPT_SCHEDULER (object));
osched = GST_OPT_SCHEDULER_CAST (object); osched = GST_OPT_SCHEDULER (object);
switch (prop_id) { switch (prop_id) {
case ARG_ITERATIONS: case ARG_ITERATIONS:

View file

@ -31,8 +31,10 @@ Prereq: /sbin/ldconfig
### documentation requirements ### documentation requirements
BuildRequires: openjade BuildRequires: openjade
BuildRequires: python2 BuildRequires: python2
BuildRequires: docbook-style-dsssl docbook-dtd31-sgml BuildRequires: docbook-style-dsssl
BuildRequires: transfig xfig BuildRequires: docbook-utils
BuildRequires: transfig
BuildRequires: xfig
%description %description
GStreamer is a streaming-media framework, based on graphs of filters which GStreamer is a streaming-media framework, based on graphs of filters which
@ -139,15 +141,12 @@ rm -f $RPM_BUILD_ROOT%{_libdir}/*.la
%{_libdir}/libgstcontrol-%{majorminor}.so.* %{_libdir}/libgstcontrol-%{majorminor}.so.*
%dir %{_libdir}/gstreamer-%{majorminor} %dir %{_libdir}/gstreamer-%{majorminor}
%dir %{_localstatedir}/cache/gstreamer-%{majorminor} %dir %{_localstatedir}/cache/gstreamer-%{majorminor}
%{_libdir}/gstreamer-%{majorminor}/libgstautoplugcache*.so*
%{_libdir}/gstreamer-%{majorminor}/libgstautoplugger*.so*
%{_libdir}/gstreamer-%{majorminor}/libgstbasicomega*.so* %{_libdir}/gstreamer-%{majorminor}/libgstbasicomega*.so*
%{_libdir}/gstreamer-%{majorminor}/libgstoptscheduler.so* %{_libdir}/gstreamer-%{majorminor}/libgstoptscheduler.so*
%{_libdir}/gstreamer-%{majorminor}/libgstoptomega*.so* %{_libdir}/gstreamer-%{majorminor}/libgstoptomega*.so*
%{_libdir}/gstreamer-%{majorminor}/libgstbasicgthreadscheduler*.so %{_libdir}/gstreamer-%{majorminor}/libgstbasicgthreadscheduler*.so
%{_libdir}/gstreamer-%{majorminor}/libgstoptgthreadscheduler*.so %{_libdir}/gstreamer-%{majorminor}/libgstoptgthreadscheduler*.so
%{_libdir}/gstreamer-%{majorminor}/libgstelements*.so* %{_libdir}/gstreamer-%{majorminor}/libgstelements*.so*
%{_libdir}/gstreamer-%{majorminor}/libgststaticautoplug*.so*
%{_libdir}/gstreamer-%{majorminor}/libgstgetbits*.so* %{_libdir}/gstreamer-%{majorminor}/libgstgetbits*.so*
%{_libdir}/gstreamer-%{majorminor}/libgstspider*.so* %{_libdir}/gstreamer-%{majorminor}/libgstspider*.so*
%{_libdir}/gstreamer-%{majorminor}/libgstindexers.so* %{_libdir}/gstreamer-%{majorminor}/libgstindexers.so*
@ -208,6 +207,9 @@ rm -f $RPM_BUILD_ROOT%{_libdir}/*.la
%changelog %changelog
* Mon Dec 01 2003 Thomas Vander Stichele <thomas at apestaart dot org>
- changed documentation buildrequires
* Sun Nov 09 2003 Christian Schaller <Uraeus@gnome.org> * Sun Nov 09 2003 Christian Schaller <Uraeus@gnome.org>
- Fix spec to handle new bytestream library - Fix spec to handle new bytestream library

View file

@ -252,6 +252,7 @@ gst_bytestream_peek (GstByteStream *bs, GstBuffer **buf, guint32 len)
GstBuffer *headbuf, *retbuf = NULL; GstBuffer *headbuf, *retbuf = NULL;
g_return_val_if_fail (bs != NULL, 0); g_return_val_if_fail (bs != NULL, 0);
g_return_val_if_fail (buf != NULL, 0);
g_return_val_if_fail (len > 0, 0); g_return_val_if_fail (len > 0, 0);
GST_DEBUG ("peek: asking for %d bytes", len); GST_DEBUG ("peek: asking for %d bytes", len);
@ -323,6 +324,7 @@ gst_bytestream_peek_bytes (GstByteStream *bs, guint8** data, guint32 len)
GstBuffer *headbuf; GstBuffer *headbuf;
g_return_val_if_fail (bs != NULL, 0); g_return_val_if_fail (bs != NULL, 0);
g_return_val_if_fail (data != NULL, 0);
g_return_val_if_fail (len > 0, 0); g_return_val_if_fail (len > 0, 0);
GST_DEBUG ("peek_bytes: asking for %d bytes", len); GST_DEBUG ("peek_bytes: asking for %d bytes", len);
@ -761,7 +763,6 @@ GST_PLUGIN_DEFINE (
plugin_init, plugin_init,
VERSION, VERSION,
GST_LICENSE, GST_LICENSE,
GST_COPYRIGHT,
GST_PACKAGE, GST_PACKAGE,
GST_ORIGIN GST_ORIGIN
) )

View file

@ -48,7 +48,7 @@ struct _GstByteStream {
/* if we are in the seek state (waiting for DISCONT) */ /* if we are in the seek state (waiting for DISCONT) */
gboolean in_seek; gboolean in_seek;
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
GstByteStream* gst_bytestream_new (GstPad *pad); GstByteStream* gst_bytestream_new (GstPad *pad);

View file

@ -227,7 +227,6 @@ GST_PLUGIN_DEFINE (
plugin_init, plugin_init,
VERSION, VERSION,
GST_LICENSE, GST_LICENSE,
GST_COPYRIGHT,
GST_PACKAGE, GST_PACKAGE,
GST_ORIGIN GST_ORIGIN
) )

View file

@ -335,7 +335,7 @@ gst_aggregator_loop (GstElement *element)
debug = "loop_select"; debug = "loop_select";
pad = gst_pad_select (aggregator->sinkpads); pad = gst_pad_selectv (aggregator->sinkpads);
buf = GST_BUFFER (gst_pad_pull (pad)); buf = GST_BUFFER (gst_pad_pull (pad));
gst_aggregator_push (aggregator, pad, buf, debug); gst_aggregator_push (aggregator, pad, buf, debug);

View file

@ -95,7 +95,6 @@ GST_PLUGIN_DEFINE (
plugin_init, plugin_init,
VERSION, VERSION,
GST_LICENSE, GST_LICENSE,
GST_COPYRIGHT,
GST_PACKAGE, GST_PACKAGE,
GST_ORIGIN GST_ORIGIN
) )

File diff suppressed because it is too large Load diff

View file

@ -56,43 +56,51 @@ struct _GstQueue {
GstPad *sinkpad; GstPad *sinkpad;
GstPad *srcpad; GstPad *srcpad;
/* the queue of buffers we're keeping our grubby hands on */ /* the queue of data we're keeping our grubby hands on */
GQueue *queue; GQueue *queue;
guint level_buffers; /* number of buffers queued here */ struct {
guint level_bytes; /* number of bytes queued here */ guint buffers; /* no. of buffers */
guint64 level_time; /* amount of time queued here */ guint bytes; /* no. of bytes */
guint64 time; /* amount of time */
} cur_level, /* currently in the queue */
max_size, /* max. amount of data allowed in the queue */
min_treshold; /* min. amount of data required to wake reader */
guint size_buffers; /* size of queue in buffers */ /* whether we leak data, and at which end */
guint size_bytes; /* size of queue in bytes */ gint leaky;
guint64 size_time; /* size of queue in time */
/* number of nanoseconds until a blocked queue 'times out'
* to receive data and returns a filler event. -1 = disable */
guint64 block_timeout;
/* it the queue should fail on possible deadlocks */
gboolean may_deadlock;
gint leaky; /* whether the queue is leaky, and if so at which end */
gint block_timeout; /* microseconds until a blocked queue times out and returns GST_EVENT_FILLER.
* A value of -1 will block forever. */
guint min_threshold_bytes; /* the minimum number of bytes required before
* waking up the reader thread */
gboolean may_deadlock; /* it the queue should fail on possible deadlocks */
gboolean interrupt; gboolean interrupt;
gboolean flush; gboolean flush;
GMutex *qlock; /* lock for queue (vs object lock) */ GMutex *qlock; /* lock for queue (vs object lock) */
GCond *not_empty; /* signals buffers now available for reading */ GCond *item_add; /* signals buffers now available for reading */
GCond *not_full; /* signals space now available for writing */ GCond *item_del; /* signals space now available for writing */
GCond *event_done; /* upstream event signaller */
GTimeVal *timeval; /* the timeout for the queue locking */ GTimeVal *timeval; /* the timeout for the queue locking */
GAsyncQueue *events; /* upstream events get decoupled here */ GQueue *events; /* upstream events get decoupled here */
GST_OBJECT_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
struct _GstQueueClass { struct _GstQueueClass {
GstElementClass parent_class; GstElementClass parent_class;
/* signal callbacks */ /* signals - 'running' is called from both sides
void (*full) (GstQueue *queue); * which might make it sort of non-useful... */
void (*underrun) (GstQueue *queue);
void (*running) (GstQueue *queue);
void (*overrun) (GstQueue *queue);
GST_CLASS_PADDING gpointer _gst_reserved[GST_PADDING];
}; };
GType gst_queue_get_type (void); GType gst_queue_get_type (void);

View file

@ -195,7 +195,7 @@ gst_tee_getcaps (GstPad *pad)
pads = gst_element_get_pad_list (GST_ELEMENT (tee)); pads = gst_element_get_pad_list (GST_ELEMENT (tee));
while (pads) { while (pads) {
GstPad *srcpad = GST_PAD_CAST (pads->data); GstPad *srcpad = GST_PAD (pads->data);
GstPad *peer; GstPad *peer;
const GstCaps2 *peercaps; const GstCaps2 *peercaps;
GstCaps2 *newcaps; GstCaps2 *newcaps;

View file

@ -367,16 +367,17 @@ stop_typefinding (GstTypeFindElement *typefind)
if (push_cached_buffers) { if (push_cached_buffers) {
GstBuffer *buffer; GstBuffer *buffer;
guint size = gst_buffer_store_get_size (typefind->store, 0); guint size = gst_buffer_store_get_size (typefind->store, 0);
if (size && (buffer = gst_buffer_store_get_buffer (typefind->store, 0, size))) {
gst_pad_push (typefind->src, GST_DATA (buffer));
} else {
size = 0;
}
GST_LOG_OBJECT (typefind, "seeking back to current position %u", size); GST_LOG_OBJECT (typefind, "seeking back to current position %u", size);
if (!gst_pad_send_event (GST_PAD_PEER (typefind->sink), if (!gst_pad_send_event (GST_PAD_PEER (typefind->sink),
gst_event_new_seek (GST_SEEK_METHOD_SET | GST_FORMAT_BYTES, size))) { gst_event_new_seek (GST_SEEK_METHOD_SET | GST_FORMAT_BYTES, size))) {
GST_WARNING_OBJECT (typefind, "could not seek to required position %u, hope for the best", size); GST_WARNING_OBJECT (typefind, "could not seek to required position %u, hope for the best", size);
} }
if (size && (buffer = gst_buffer_store_get_buffer (typefind->store, 0, size))) {
gst_pad_push (typefind->src, GST_DATA (buffer));
} else {
size = 0;
}
} }
gst_buffer_store_clear (typefind->store); gst_buffer_store_clear (typefind->store);
} }

View file

@ -367,16 +367,17 @@ stop_typefinding (GstTypeFindElement *typefind)
if (push_cached_buffers) { if (push_cached_buffers) {
GstBuffer *buffer; GstBuffer *buffer;
guint size = gst_buffer_store_get_size (typefind->store, 0); guint size = gst_buffer_store_get_size (typefind->store, 0);
if (size && (buffer = gst_buffer_store_get_buffer (typefind->store, 0, size))) {
gst_pad_push (typefind->src, GST_DATA (buffer));
} else {
size = 0;
}
GST_LOG_OBJECT (typefind, "seeking back to current position %u", size); GST_LOG_OBJECT (typefind, "seeking back to current position %u", size);
if (!gst_pad_send_event (GST_PAD_PEER (typefind->sink), if (!gst_pad_send_event (GST_PAD_PEER (typefind->sink),
gst_event_new_seek (GST_SEEK_METHOD_SET | GST_FORMAT_BYTES, size))) { gst_event_new_seek (GST_SEEK_METHOD_SET | GST_FORMAT_BYTES, size))) {
GST_WARNING_OBJECT (typefind, "could not seek to required position %u, hope for the best", size); GST_WARNING_OBJECT (typefind, "could not seek to required position %u, hope for the best", size);
} }
if (size && (buffer = gst_buffer_store_get_buffer (typefind->store, 0, size))) {
gst_pad_push (typefind->src, GST_DATA (buffer));
} else {
size = 0;
}
} }
gst_buffer_store_clear (typefind->store); gst_buffer_store_clear (typefind->store);
} }

View file

@ -39,11 +39,10 @@ GST_PLUGIN_DEFINE (
GST_VERSION_MAJOR, GST_VERSION_MAJOR,
GST_VERSION_MINOR, GST_VERSION_MINOR,
"gstindexers", "gstindexers",
"Gstremaer core indexers", "GStreamer core indexers",
plugin_init, plugin_init,
VERSION, VERSION,
GST_LICENSE, GST_LICENSE,
GST_COPYRIGHT,
GST_PACKAGE, GST_PACKAGE,
GST_ORIGIN GST_ORIGIN
) )

View file

@ -108,6 +108,12 @@ stamp-po: $(srcdir)/$(DOMAIN).pot
# otherwise packages like GCC can not be built if only parts of the source # otherwise packages like GCC can not be built if only parts of the source
# have been downloaded. # have been downloaded.
# thomasvs, 11/12/03: this option has been added in gettext 0.12
# if we really need this, then we should add a check for the version,
# but for now it doesn't seem to be worth the hassle, so I'm commenting
# this option to the gettext incantation below
# --msgid-bugs-address='$(MSGID_BUGS_ADDRESS)'
# This target rebuilds $(DOMAIN).pot; it is an expensive operation. # This target rebuilds $(DOMAIN).pot; it is an expensive operation.
# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. # Note that $(DOMAIN).pot is not touched if it doesn't need to be changed.
$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
@ -115,7 +121,7 @@ $(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed
--add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \
--files-from=$(srcdir)/POTFILES.in \ --files-from=$(srcdir)/POTFILES.in \
--copyright-holder='$(COPYRIGHT_HOLDER)' \ --copyright-holder='$(COPYRIGHT_HOLDER)' \
--msgid-bugs-address='$(MSGID_BUGS_ADDRESS)'
test ! -f $(DOMAIN).po || { \ test ! -f $(DOMAIN).po || { \
if test -f $(srcdir)/$(DOMAIN).pot; then \ if test -f $(srcdir)/$(DOMAIN).pot; then \
sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \

View file

@ -6,8 +6,8 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gstreamer-0.7 0.7.0.1\n" "Project-Id-Version: gstreamer-0.7 0.7.0.1\n"
"Report-Msgid-Bugs-To: \"http://bugzilla.gnome.org\"\n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2003-11-22 17:49+0100\n" "POT-Creation-Date: 2003-12-17 21:27-0800\n"
"PO-Revision-Date: 2003-10-08 15:36-0700\n" "PO-Revision-Date: 2003-10-08 15:36-0700\n"
"Last-Translator: David Schleef <ds@schleef.org>\n" "Last-Translator: David Schleef <ds@schleef.org>\n"
"Language-Team: Gnome Translators <i18n@gnome.org>\n" "Language-Team: Gnome Translators <i18n@gnome.org>\n"
@ -15,69 +15,73 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: gst/gst.c:112 #: gst/gst.c:116
msgid "Print the GStreamer version" msgid "Print the GStreamer version"
msgstr "druck die GStreamer Version" msgstr "druck die GStreamer Version"
#: gst/gst.c:113 #: gst/gst.c:117
msgid "Make all warnings fatal" msgid "Make all warnings fatal"
msgstr "macht alle Achtunge toedlich" msgstr "macht alle Achtunge toedlich"
#: gst/gst.c:115 #: gst/gst.c:119
msgid "" msgid ""
"default debug level from 1 (only error) to 5 (anything) or 0 for no output" "default debug level from 1 (only error) to 5 (anything) or 0 for no output"
msgstr "" msgstr ""
#: gst/gst.c:116 #: gst/gst.c:120
msgid "" msgid ""
"colon-seperated list of category_name=level pairs to set specific levels for " "colon-seperated list of category_name=level pairs to set specific levels for "
"the individual categories.\n" "the individual categories.\n"
"Example:GST_AUTOPLUG=5:GST_ELEMENT_*=3" "Example:GST_AUTOPLUG=5:GST_ELEMENT_*=3"
msgstr "" msgstr ""
#: gst/gst.c:117 #: gst/gst.c:121
msgid "disable color debugging output" msgid "disable color debugging output"
msgstr "abschalt Farbe in Fehlersucheausgabe" msgstr "abschalt Farbe in Fehlersucheausgabe"
#: gst/gst.c:118 #: gst/gst.c:122
msgid "disable debugging" msgid "disable debugging"
msgstr "abschalt die Fehlersuche" msgstr "abschalt die Fehlersuche"
#: gst/gst.c:119 #: gst/gst.c:123
msgid "print available debug categories and exit" msgid "print available debug categories and exit"
msgstr "" msgstr ""
#: gst/gst.c:121 #: gst/gst.c:125
msgid "Disable accelerated CPU instructions" msgid "Disable accelerated CPU instructions"
msgstr "" msgstr ""
#: gst/gst.c:122 #: gst/gst.c:126
msgid "enable verbose plugin loading diagnostics" msgid "enable verbose plugin loading diagnostics"
msgstr "" msgstr ""
#: gst/gst.c:123 #: gst/gst.c:127
msgid "'" msgid "'"
msgstr "" msgstr ""
#: gst/gst.c:123 #: gst/gst.c:127
msgid "'--separated path list for loading plugins" msgid "'--separated path list for loading plugins"
msgstr "" msgstr ""
#: gst/gst.c:124 #: gst/gst.c:128
msgid "" msgid ""
"comma-separated list of plugins to preload in addition to the list stored in " "comma-separated list of plugins to preload in addition to the list stored in "
"env variable GST_PLUGIN_PATH" "env variable GST_PLUGIN_PATH"
msgstr "" msgstr ""
#: gst/gst.c:125 #: gst/gst.c:129
msgid "disable trapping of segmentation faults during plugin loading"
msgstr ""
#: gst/gst.c:130
msgid "scheduler to use ('" msgid "scheduler to use ('"
msgstr "" msgstr ""
#: gst/gst.c:125 #: gst/gst.c:130
msgid "' is the default)" msgid "' is the default)"
msgstr "" msgstr ""
#: gst/gst.c:126 #: gst/gst.c:131
msgid "registry to use" msgid "registry to use"
msgstr "" msgstr ""

View file

@ -6,8 +6,8 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: GStreamer 0.7.0.1\n" "Project-Id-Version: GStreamer 0.7.0.1\n"
"Report-Msgid-Bugs-To: \"http://bugzilla.gnome.org\"\n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2003-11-22 17:49+0100\n" "POT-Creation-Date: 2003-12-17 21:27-0800\n"
"PO-Revision-Date: 2003-10-09 14:10-0700\n" "PO-Revision-Date: 2003-10-09 14:10-0700\n"
"Last-Translator: David Schleef <ds@schleef.org>\n" "Last-Translator: David Schleef <ds@schleef.org>\n"
"Language-Team: translators <translation@gnome.org>\n" "Language-Team: translators <translation@gnome.org>\n"
@ -15,68 +15,72 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: gst/gst.c:112 #: gst/gst.c:116
msgid "Print the GStreamer version" msgid "Print the GStreamer version"
msgstr "" msgstr ""
#: gst/gst.c:113 #: gst/gst.c:117
msgid "Make all warnings fatal" msgid "Make all warnings fatal"
msgstr "" msgstr ""
#: gst/gst.c:115 #: gst/gst.c:119
msgid "" msgid ""
"default debug level from 1 (only error) to 5 (anything) or 0 for no output" "default debug level from 1 (only error) to 5 (anything) or 0 for no output"
msgstr "" msgstr ""
#: gst/gst.c:116 #: gst/gst.c:120
msgid "" msgid ""
"colon-seperated list of category_name=level pairs to set specific levels for " "colon-seperated list of category_name=level pairs to set specific levels for "
"the individual categories.\n" "the individual categories.\n"
"Example:GST_AUTOPLUG=5:GST_ELEMENT_*=3" "Example:GST_AUTOPLUG=5:GST_ELEMENT_*=3"
msgstr "" msgstr ""
#: gst/gst.c:117 #: gst/gst.c:121
msgid "disable color debugging output" msgid "disable color debugging output"
msgstr "" msgstr ""
#: gst/gst.c:118 #: gst/gst.c:122
msgid "disable debugging" msgid "disable debugging"
msgstr "" msgstr ""
#: gst/gst.c:119 #: gst/gst.c:123
msgid "print available debug categories and exit" msgid "print available debug categories and exit"
msgstr "" msgstr ""
#: gst/gst.c:121 #: gst/gst.c:125
msgid "Disable accelerated CPU instructions" msgid "Disable accelerated CPU instructions"
msgstr "" msgstr ""
#: gst/gst.c:122 #: gst/gst.c:126
msgid "enable verbose plugin loading diagnostics" msgid "enable verbose plugin loading diagnostics"
msgstr "" msgstr ""
#: gst/gst.c:123 #: gst/gst.c:127
msgid "'" msgid "'"
msgstr "" msgstr ""
#: gst/gst.c:123 #: gst/gst.c:127
msgid "'--separated path list for loading plugins" msgid "'--separated path list for loading plugins"
msgstr "" msgstr ""
#: gst/gst.c:124 #: gst/gst.c:128
msgid "" msgid ""
"comma-separated list of plugins to preload in addition to the list stored in " "comma-separated list of plugins to preload in addition to the list stored in "
"env variable GST_PLUGIN_PATH" "env variable GST_PLUGIN_PATH"
msgstr "" msgstr ""
#: gst/gst.c:125 #: gst/gst.c:129
msgid "disable trapping of segmentation faults during plugin loading"
msgstr ""
#: gst/gst.c:130
msgid "scheduler to use ('" msgid "scheduler to use ('"
msgstr "" msgstr ""
#: gst/gst.c:125 #: gst/gst.c:130
msgid "' is the default)" msgid "' is the default)"
msgstr "" msgstr ""
#: gst/gst.c:126 #: gst/gst.c:131
msgid "registry to use" msgid "registry to use"
msgstr "" msgstr ""

View file

@ -6,8 +6,8 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: GStreamer 0.7.0.1\n" "Project-Id-Version: GStreamer 0.7.0.1\n"
"Report-Msgid-Bugs-To: \"http://bugzilla.gnome.org\"\n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2003-11-22 17:49+0100\n" "POT-Creation-Date: 2003-12-17 21:27-0800\n"
"PO-Revision-Date: 2003-10-09 14:10-0700\n" "PO-Revision-Date: 2003-10-09 14:10-0700\n"
"Last-Translator: David Schleef <ds@schleef.org>\n" "Last-Translator: David Schleef <ds@schleef.org>\n"
"Language-Team: translators <translation@gnome.org>\n" "Language-Team: translators <translation@gnome.org>\n"
@ -15,68 +15,72 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: gst/gst.c:112 #: gst/gst.c:116
msgid "Print the GStreamer version" msgid "Print the GStreamer version"
msgstr "" msgstr ""
#: gst/gst.c:113 #: gst/gst.c:117
msgid "Make all warnings fatal" msgid "Make all warnings fatal"
msgstr "" msgstr ""
#: gst/gst.c:115 #: gst/gst.c:119
msgid "" msgid ""
"default debug level from 1 (only error) to 5 (anything) or 0 for no output" "default debug level from 1 (only error) to 5 (anything) or 0 for no output"
msgstr "" msgstr ""
#: gst/gst.c:116 #: gst/gst.c:120
msgid "" msgid ""
"colon-seperated list of category_name=level pairs to set specific levels for " "colon-seperated list of category_name=level pairs to set specific levels for "
"the individual categories.\n" "the individual categories.\n"
"Example:GST_AUTOPLUG=5:GST_ELEMENT_*=3" "Example:GST_AUTOPLUG=5:GST_ELEMENT_*=3"
msgstr "" msgstr ""
#: gst/gst.c:117 #: gst/gst.c:121
msgid "disable color debugging output" msgid "disable color debugging output"
msgstr "" msgstr ""
#: gst/gst.c:118 #: gst/gst.c:122
msgid "disable debugging" msgid "disable debugging"
msgstr "" msgstr ""
#: gst/gst.c:119 #: gst/gst.c:123
msgid "print available debug categories and exit" msgid "print available debug categories and exit"
msgstr "" msgstr ""
#: gst/gst.c:121 #: gst/gst.c:125
msgid "Disable accelerated CPU instructions" msgid "Disable accelerated CPU instructions"
msgstr "" msgstr ""
#: gst/gst.c:122 #: gst/gst.c:126
msgid "enable verbose plugin loading diagnostics" msgid "enable verbose plugin loading diagnostics"
msgstr "" msgstr ""
#: gst/gst.c:123 #: gst/gst.c:127
msgid "'" msgid "'"
msgstr "" msgstr ""
#: gst/gst.c:123 #: gst/gst.c:127
msgid "'--separated path list for loading plugins" msgid "'--separated path list for loading plugins"
msgstr "" msgstr ""
#: gst/gst.c:124 #: gst/gst.c:128
msgid "" msgid ""
"comma-separated list of plugins to preload in addition to the list stored in " "comma-separated list of plugins to preload in addition to the list stored in "
"env variable GST_PLUGIN_PATH" "env variable GST_PLUGIN_PATH"
msgstr "" msgstr ""
#: gst/gst.c:125 #: gst/gst.c:129
msgid "disable trapping of segmentation faults during plugin loading"
msgstr ""
#: gst/gst.c:130
msgid "scheduler to use ('" msgid "scheduler to use ('"
msgstr "" msgstr ""
#: gst/gst.c:125 #: gst/gst.c:130
msgid "' is the default)" msgid "' is the default)"
msgstr "" msgstr ""
#: gst/gst.c:126 #: gst/gst.c:131
msgid "registry to use" msgid "registry to use"
msgstr "" msgstr ""

View file

@ -6,8 +6,8 @@
msgid "" msgid ""
msgstr "" msgstr ""
"Project-Id-Version: GStreamer 0.7.0.1\n" "Project-Id-Version: GStreamer 0.7.0.1\n"
"Report-Msgid-Bugs-To: \"http://bugzilla.gnome.org\"\n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2003-11-22 17:49+0100\n" "POT-Creation-Date: 2003-12-17 21:27-0800\n"
"PO-Revision-Date: 2003-10-09 14:10-0700\n" "PO-Revision-Date: 2003-10-09 14:10-0700\n"
"Last-Translator: David Schleef <ds@schleef.org>\n" "Last-Translator: David Schleef <ds@schleef.org>\n"
"Language-Team: translators <translation@gnome.org>\n" "Language-Team: translators <translation@gnome.org>\n"
@ -15,68 +15,72 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
#: gst/gst.c:112 #: gst/gst.c:116
msgid "Print the GStreamer version" msgid "Print the GStreamer version"
msgstr "" msgstr ""
#: gst/gst.c:113 #: gst/gst.c:117
msgid "Make all warnings fatal" msgid "Make all warnings fatal"
msgstr "" msgstr ""
#: gst/gst.c:115 #: gst/gst.c:119
msgid "" msgid ""
"default debug level from 1 (only error) to 5 (anything) or 0 for no output" "default debug level from 1 (only error) to 5 (anything) or 0 for no output"
msgstr "" msgstr ""
#: gst/gst.c:116 #: gst/gst.c:120
msgid "" msgid ""
"colon-seperated list of category_name=level pairs to set specific levels for " "colon-seperated list of category_name=level pairs to set specific levels for "
"the individual categories.\n" "the individual categories.\n"
"Example:GST_AUTOPLUG=5:GST_ELEMENT_*=3" "Example:GST_AUTOPLUG=5:GST_ELEMENT_*=3"
msgstr "" msgstr ""
#: gst/gst.c:117 #: gst/gst.c:121
msgid "disable color debugging output" msgid "disable color debugging output"
msgstr "" msgstr ""
#: gst/gst.c:118 #: gst/gst.c:122
msgid "disable debugging" msgid "disable debugging"
msgstr "" msgstr ""
#: gst/gst.c:119 #: gst/gst.c:123
msgid "print available debug categories and exit" msgid "print available debug categories and exit"
msgstr "" msgstr ""
#: gst/gst.c:121 #: gst/gst.c:125
msgid "Disable accelerated CPU instructions" msgid "Disable accelerated CPU instructions"
msgstr "" msgstr ""
#: gst/gst.c:122 #: gst/gst.c:126
msgid "enable verbose plugin loading diagnostics" msgid "enable verbose plugin loading diagnostics"
msgstr "" msgstr ""
#: gst/gst.c:123 #: gst/gst.c:127
msgid "'" msgid "'"
msgstr "" msgstr ""
#: gst/gst.c:123 #: gst/gst.c:127
msgid "'--separated path list for loading plugins" msgid "'--separated path list for loading plugins"
msgstr "" msgstr ""
#: gst/gst.c:124 #: gst/gst.c:128
msgid "" msgid ""
"comma-separated list of plugins to preload in addition to the list stored in " "comma-separated list of plugins to preload in addition to the list stored in "
"env variable GST_PLUGIN_PATH" "env variable GST_PLUGIN_PATH"
msgstr "" msgstr ""
#: gst/gst.c:125 #: gst/gst.c:129
msgid "disable trapping of segmentation faults during plugin loading"
msgstr ""
#: gst/gst.c:130
msgid "scheduler to use ('" msgid "scheduler to use ('"
msgstr "" msgstr ""
#: gst/gst.c:125 #: gst/gst.c:130
msgid "' is the default)" msgid "' is the default)"
msgstr "" msgstr ""
#: gst/gst.c:126 #: gst/gst.c:131
msgid "registry to use" msgid "registry to use"
msgstr "" msgstr ""

View file

@ -1,9 +1,14 @@
noinst_PROGRAMS = test1 test2 noinst_PROGRAMS = test1 test2
test1_SOURCES = test1.c $(top_srcdir)/gst/gstbuffer.c gstmempool.c test1_SOURCES = test1.c gstbuffer.c gstmempool.c
EXTRA_DIST = gstbuffer.h gstmempool.h BUILT_SOURCES = gstbuffer.c
gstbuffer.c:
cp $(top_srcdir)/gst/gstbuffer.c .
EXTRA_DIST = gstmempool.h
LDADD = $(GST_LIBS) LDADD = $(GST_LIBS)
AM_CFLAGS = $(GST_CFLAGS) AM_CFLAGS = $(GST_CFLAGS) -I$(top_srcdir)/gst

View file

@ -1,495 +0,0 @@
/* GStreamer
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
* 2000 Wim Taymans <wtay@chello.be>
*
* gstbuffer.c: Buffer operations
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
/* this file makes too much noise for most debugging sessions */
#define GST_DEBUG_FORCE_DISABLE
#include "gst/gst_private.h"
#include "gstbuffer.h"
#include "gstmempool.h"
GType _gst_buffer_type;
static GstMemPool *_gst_buffer_pool;
static void
gst_buffer_alloc_func (GstMemPool *pool, gpointer data)
{
GstBuffer *buffer = GST_BUFFER (data);
GST_DATA_TYPE(buffer) = _gst_buffer_type;
buffer->lock = g_mutex_new ();
}
static void
gst_buffer_free_func (GstMemPool *pool, gpointer data)
{
GstBuffer *buffer = GST_BUFFER (data);
g_mutex_free (buffer->lock);
}
void
_gst_buffer_initialize (void)
{
int buffersize = sizeof(GstBuffer);
static const GTypeInfo buffer_info = {
0, /* sizeof(class), */
NULL,
NULL,
NULL,
NULL,
NULL,
0, /* sizeof(object), */
0,
NULL,
};
/* round up to the nearest 32 bytes for cache-line and other efficiencies */
buffersize = (((buffersize-1) / 32) + 1) * 32;
_gst_buffer_pool = gst_mem_pool_new ("GstBuffer", buffersize,
buffersize * 32, G_ALLOC_AND_FREE, gst_buffer_alloc_func, gst_buffer_free_func);
_gst_buffer_type = g_type_register_static (G_TYPE_INT, "GstBuffer", &buffer_info, 0);
}
/**
* gst_buffer_new:
*
* Create a new buffer.
*
* Returns: new buffer
*/
GstBuffer*
gst_buffer_new (void)
{
GstBuffer *buffer;
buffer = gst_mem_pool_alloc (_gst_buffer_pool);
GST_CAT_INFO (GST_CAT_BUFFER,"creating new buffer %p",buffer);
#ifdef HAVE_ATOMIC_H
atomic_set (&buffer->refcount, 1);
#else
buffer->refcount = 1;
#endif
buffer->offset = -1;
buffer->flags = 0;
buffer->data = NULL;
buffer->size = 0;
buffer->maxsize = 0;
buffer->timestamp = 0;
buffer->parent = NULL;
buffer->pool = NULL;
buffer->pool_private = NULL;
buffer->free = NULL;
buffer->copy = NULL;
return buffer;
}
/**
* gst_buffer_new_from_pool:
* @pool: the buffer pool to use
*
* Create a new buffer using the specified bufferpool.
*
* Returns: new buffer
*/
GstBuffer*
gst_buffer_new_from_pool (GstBufferPool *pool, guint32 offset, guint32 size)
{
GstBuffer *buffer;
g_return_val_if_fail (pool != NULL, NULL);
g_return_val_if_fail (pool->buffer_new != NULL, NULL);
buffer = pool->buffer_new (pool, offset, size, pool->user_data);
buffer->pool = pool;
buffer->free = pool->buffer_free;
buffer->copy = pool->buffer_copy;
GST_CAT_INFO (GST_CAT_BUFFER,"creating new buffer %p from pool %p (size %x, offset %x)",
buffer, pool, size, offset);
return buffer;
}
/**
* gst_buffer_create_sub:
* @parent: parent buffer
* @offset: offset into parent buffer
* @size: size of new subbuffer
*
* Creates a sub-buffer from the parent at a given offset.
*
* Returns: new buffer
*/
GstBuffer*
gst_buffer_create_sub (GstBuffer *parent,
guint32 offset,
guint32 size)
{
GstBuffer *buffer;
g_return_val_if_fail (parent != NULL, NULL);
g_return_val_if_fail (GST_BUFFER_REFCOUNT(parent) > 0, NULL);
g_return_val_if_fail (size > 0, NULL);
g_return_val_if_fail ((offset+size) <= parent->size, NULL);
buffer = gst_mem_pool_alloc (_gst_buffer_pool);
GST_DATA_TYPE(buffer) = _gst_buffer_type;
GST_CAT_INFO (GST_CAT_BUFFER,"creating new subbuffer %p from parent %p (size %u, offset %u)",
buffer, parent, size, offset);
#ifdef HAVE_ATOMIC_H
atomic_set (&buffer->refcount, 1);
#else
buffer->refcount = 1;
#endif
/* copy flags and type from parent, for lack of better */
buffer->flags = parent->flags;
/* set the data pointer, size, offset, and maxsize */
buffer->data = parent->data + offset;
buffer->size = size;
buffer->maxsize = parent->size - offset;
/* deal with bogus/unknown offsets */
if (parent->offset != -1)
buffer->offset = parent->offset + offset;
else
buffer->offset = -1;
/* again, for lack of better, copy parent's timestamp */
buffer->timestamp = parent->timestamp;
buffer->maxage = parent->maxage;
/* if the parent buffer is a subbuffer itself, use its parent, a real buffer */
if (parent->parent != NULL)
parent = parent->parent;
/* set parentage and reference the parent */
buffer->parent = parent;
gst_buffer_ref (parent);
buffer->pool = NULL;
return buffer;
}
/* FIXME FIXME: how does this overlap with the newly-added gst_buffer_span() ??? */
/**
* gst_buffer_append:
* @buffer: a buffer
* @append: the buffer to append
*
* Creates a new buffer by appending the data of append to the
* existing data of buffer.
*
* Returns: new buffer
*/
GstBuffer*
gst_buffer_append (GstBuffer *buffer,
GstBuffer *append)
{
guint size;
GstBuffer *newbuf;
g_return_val_if_fail (buffer != NULL, NULL);
g_return_val_if_fail (append != NULL, NULL);
g_return_val_if_fail (buffer->pool == NULL, NULL);
g_return_val_if_fail (GST_BUFFER_REFCOUNT(buffer) > 0, NULL);
g_return_val_if_fail (GST_BUFFER_REFCOUNT(append) > 0, NULL);
GST_CAT_INFO (GST_CAT_BUFFER,"appending buffers %p and %p",buffer,append);
GST_BUFFER_LOCK (buffer);
/* the buffer is not used by anyone else */
if (GST_BUFFER_REFCOUNT (buffer) == 1 && buffer->parent == NULL
&& !GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_DONTFREE)) {
/* save the old size */
size = buffer->size;
buffer->size += append->size;
buffer->data = g_realloc (buffer->data, buffer->size);
memcpy(buffer->data + size, append->data, append->size);
GST_BUFFER_UNLOCK (buffer);
}
/* the buffer is used, create a new one */
else {
newbuf = gst_buffer_new ();
newbuf->size = buffer->size+append->size;
newbuf->data = g_malloc (newbuf->size);
memcpy (newbuf->data, buffer->data, buffer->size);
memcpy (newbuf->data+buffer->size, append->data, append->size);
GST_BUFFER_UNLOCK (buffer);
gst_buffer_unref (buffer);
buffer = newbuf;
}
return buffer;
}
/**
* gst_buffer_destroy:
* @buffer: the GstBuffer to destroy
*
* destroy the buffer
*/
void
gst_buffer_destroy (GstBuffer *buffer)
{
g_return_if_fail (buffer != NULL);
GST_CAT_INFO (GST_CAT_BUFFER, "freeing %sbuffer %p",
(buffer->parent?"sub":""),
buffer);
/* free the data only if there is some, DONTFREE isn't set, and not sub */
if (GST_BUFFER_DATA (buffer) &&
!GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_DONTFREE) &&
(buffer->parent == NULL)) {
/* if there's a free function, use it */
if (buffer->free != NULL) {
(buffer->free)(buffer);
} else {
g_free (GST_BUFFER_DATA (buffer));
}
}
/* unreference the parent if there is one */
if (buffer->parent != NULL)
gst_buffer_unref (buffer->parent);
/* remove it entirely from memory */
gst_mem_pool_free (_gst_buffer_pool,buffer);
}
/**
* gst_buffer_ref:
* @buffer: the GstBuffer to reference
*
* Increment the refcount of this buffer.
*/
void
gst_buffer_ref (GstBuffer *buffer)
{
g_return_if_fail (buffer != NULL);
g_return_if_fail (GST_BUFFER_REFCOUNT(buffer) > 0);
GST_CAT_INFO (GST_CAT_BUFFER, "ref buffer %p\n", buffer);
#ifdef HAVE_ATOMIC_H
atomic_inc (&(buffer->refcount));
#else
GST_BUFFER_LOCK (buffer);
buffer->refcount++;
GST_BUFFER_UNLOCK (buffer);
#endif
}
/**
* gst_buffer_unref:
* @buffer: the GstBuffer to unref
*
* Decrement the refcount of this buffer. If the refcount is
* zero, the buffer will be destroyed.
*/
void
gst_buffer_unref (GstBuffer *buffer)
{
gint zero;
g_return_if_fail (buffer != NULL);
g_return_if_fail (GST_BUFFER_REFCOUNT(buffer) > 0);
GST_CAT_INFO (GST_CAT_BUFFER, "unref buffer %p\n", buffer);
#ifdef HAVE_ATOMIC_H
zero = atomic_dec_and_test (&(buffer->refcount));
#else
GST_BUFFER_LOCK (buffer);
buffer->refcount--;
zero = (buffer->refcount == 0);
GST_BUFFER_UNLOCK (buffer);
#endif
/* if we ended up with the refcount at zero, destroy the buffer */
if (zero) {
gst_buffer_destroy (buffer);
}
}
/**
* gst_buffer_copy:
* @buffer: the orignal GstBuffer to make a copy of
*
* Make a full copy of the give buffer, data and all.
*
* Returns: new buffer
*/
GstBuffer *
gst_buffer_copy (GstBuffer *buffer)
{
GstBuffer *newbuf;
g_return_val_if_fail (GST_BUFFER_REFCOUNT(buffer) > 0, NULL);
/* if a copy function exists, use it, else copy the bytes */
if (buffer->copy != NULL) {
newbuf = (buffer->copy)(buffer);
} else {
/* allocate a new buffer */
newbuf = gst_buffer_new();
/* copy the absolute size */
newbuf->size = buffer->size;
/* allocate space for the copy */
newbuf->data = (guchar *)g_malloc (buffer->size);
/* copy the data straight across */
memcpy(newbuf->data,buffer->data,buffer->size);
/* the new maxsize is the same as the size, since we just malloc'd it */
newbuf->maxsize = newbuf->size;
}
newbuf->offset = buffer->offset;
newbuf->timestamp = buffer->timestamp;
newbuf->maxage = buffer->maxage;
/* since we just created a new buffer, so we have no ties to old stuff */
newbuf->parent = NULL;
newbuf->pool = NULL;
return newbuf;
}
/*
* gst_buffer_is_span_fast
* @buf1: first source buffer
* @buf2: second source buffer
*
* Determines whether a gst_buffer_span is free, or requires a memcpy.
*
* Returns: TRUE if the buffers are contiguous, FALSE if a copy would be required.
*/
gboolean
gst_buffer_is_span_fast (GstBuffer *buf1, GstBuffer *buf2)
{
g_return_val_if_fail (GST_BUFFER_REFCOUNT(buf1) > 0, FALSE);
g_return_val_if_fail (GST_BUFFER_REFCOUNT(buf2) > 0, FALSE);
return (buf1->parent && buf2->parent &&
(buf1->parent == buf2->parent) &&
((buf1->data + buf1->size) == buf2->data));
}
/**
* gst_buffer_span:
* @buf1: first source buffer to merge
* @offset: offset in first buffer to start new buffer
* @buf2: second source buffer to merge
* @len: length of new buffer
*
* Create a new buffer that consists of part of buf1 and buf2.
* Logically, buf1 and buf2 are concatenated into a single larger
* buffer, and a new buffer is created at the given offset inside
* this space, with a given length.
*
* If the two source buffers are children of the same larger buffer,
* and are contiguous, the new buffer will be a child of the shared
* parent, and thus no copying is necessary.
*
* Returns: new buffer that spans the two source buffers
*/
/* FIXME need to think about CoW and such... */
GstBuffer *
gst_buffer_span (GstBuffer *buf1, guint32 offset, GstBuffer *buf2, guint32 len)
{
GstBuffer *newbuf;
g_return_val_if_fail (GST_BUFFER_REFCOUNT(buf1) > 0, NULL);
g_return_val_if_fail (GST_BUFFER_REFCOUNT(buf2) > 0, NULL);
/* make sure buf1 has a lower address than buf2 */
if (buf1->data > buf2->data) {
GstBuffer *tmp = buf1;
g_print ("swapping buffers\n");
buf1 = buf2;
buf2 = tmp;
}
/* if the two buffers have the same parent and are adjacent */
if (gst_buffer_is_span_fast(buf1,buf2)) {
/* we simply create a subbuffer of the common parent */
newbuf = gst_buffer_create_sub (buf1->parent, buf1->data - (buf1->parent->data) + offset, len);
}
else {
g_print ("slow path taken in buffer_span\n");
/* otherwise we simply have to brute-force copy the buffers */
newbuf = gst_buffer_new ();
/* put in new size */
newbuf->size = len;
/* allocate space for the copy */
newbuf->data = (guchar *)g_malloc(len);
/* copy the first buffer's data across */
memcpy(newbuf->data, buf1->data + offset, buf1->size - offset);
/* copy the second buffer's data across */
memcpy(newbuf->data + (buf1->size - offset), buf2->data, len - (buf1->size - offset));
if (newbuf->offset != -1)
newbuf->offset = buf1->offset + offset;
newbuf->timestamp = buf1->timestamp;
if (buf2->maxage > buf1->maxage) newbuf->maxage = buf2->maxage;
else newbuf->maxage = buf1->maxage;
}
return newbuf;
}
/**
* gst_buffer_merge:
* @buf1: first source buffer to merge
* @buf2: second source buffer to merge
*
* Create a new buffer that is the concatenation of the two source
* buffers. The original source buffers will not be modified or
* unref'd.
*
* Internally is nothing more than a specialized gst_buffer_span,
* so the same optimizations can occur.
*
* Returns: new buffer that's the concatenation of the source buffers
*/
GstBuffer *
gst_buffer_merge (GstBuffer *buf1, GstBuffer *buf2)
{
/* we're just a specific case of the more general gst_buffer_span() */
return gst_buffer_span (buf1, 0, buf2, buf1->size + buf2->size);
}

View file

@ -1,164 +0,0 @@
/* GStreamer
* Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
* 2000 Wim Taymans <wtay@chello.be>
*
* gstbuffer.h: Header for GstBuffer object
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this library; if not, write to the
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
#ifndef __GST_BUFFER_H__
#define __GST_BUFFER_H__
/* */
/* Define this to add file:line info to each GstBuffer showing */
/* the location in the source code where the buffer was created. */
/* */
/* #define GST_BUFFER_WHERE */
/* */
/* Then in gdb, you can `call gst_buffer_print_live()' to get a list */
/* of allocated GstBuffers and also the file:line where they were */
/* allocated. */
/* */
#include <gst/gstdata.h>
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#ifdef HAVE_ATOMIC_H
#include <asm/atomic.h>
#endif
G_BEGIN_DECLS
extern GType _gst_buffer_type;
#define GST_TYPE_BUFFER (_gst_buffer_type)
#define GST_BUFFER(buf) ((GstBuffer *)(buf))
#define GST_IS_BUFFER(buf) (GST_DATA_TYPE(buf) == GST_TYPE_BUFFER)
#define GST_BUFFER_FLAGS(buf) (GST_BUFFER(buf)->flags)
#define GST_BUFFER_FLAG_IS_SET(buf,flag) (GST_BUFFER_FLAGS(buf) & (1<<(flag)))
#define GST_BUFFER_FLAG_SET(buf,flag) G_STMT_START{ (GST_BUFFER_FLAGS(buf) |= (1<<(flag))); }G_STMT_END
#define GST_BUFFER_FLAG_UNSET(buf,flag) G_STMT_START{ (GST_BUFFER_FLAGS(buf) &= ~(1<<(flag))); }G_STMT_END
#define GST_BUFFER_DATA(buf) (GST_BUFFER(buf)->data)
#define GST_BUFFER_SIZE(buf) (GST_BUFFER(buf)->size)
#define GST_BUFFER_OFFSET(buf) (GST_BUFFER(buf)->offset)
#define GST_BUFFER_MAXSIZE(buf) (GST_BUFFER(buf)->maxsize)
#define GST_BUFFER_TIMESTAMP(buf) (GST_BUFFER(buf)->timestamp)
#define GST_BUFFER_MAXAGE(buf) (GST_BUFFER(buf)->maxage)
#define GST_BUFFER_BUFFERPOOL(buf) (GST_BUFFER(buf)->pool)
#define GST_BUFFER_PARENT(buf) (GST_BUFFER(buf)->parent)
#define GST_BUFFER_POOL_PRIVATE(buf) (GST_BUFFER(buf)->pool_private)
#define GST_BUFFER_COPY_FUNC(buf) (GST_BUFFER(buf)->copy)
#define GST_BUFFER_FREE_FUNC(buf) (GST_BUFFER(buf)->free)
#define GST_BUFFER_LOCK(buf) (g_mutex_lock(GST_BUFFER(buf)->lock))
#define GST_BUFFER_TRYLOCK(buf) (g_mutex_trylock(GST_BUFFER(buf)->lock))
#define GST_BUFFER_UNLOCK(buf) (g_mutex_unlock(GST_BUFFER(buf)->lock))
typedef enum {
GST_BUFFER_READONLY,
GST_BUFFER_ORIGINAL,
GST_BUFFER_DONTFREE,
} GstBufferFlags;
typedef struct _GstBuffer GstBuffer;
typedef void (*GstBufferFreeFunc) (GstBuffer *buf);
typedef GstBuffer *(*GstBufferCopyFunc) (GstBuffer *srcbuf);
struct _GstBuffer {
GstData data_type;
/* locking */
GMutex *lock;
/* refcounting */
#ifdef HAVE_ATOMIC_H
atomic_t refcount;
#define GST_BUFFER_REFCOUNT(buf) (atomic_read(&(GST_BUFFER((buf))->refcount)))
#else
int refcount;
#define GST_BUFFER_REFCOUNT(buf) (GST_BUFFER(buf)->refcount)
#endif
/* flags */
guint16 flags;
/* pointer to data, its size, and offset in original source if known */
guchar *data;
guint32 size;
guint32 maxsize;
guint32 offset;
/* timestamp */
gint64 timestamp;
gint64 maxage;
/* subbuffer support, who's my parent? */
GstBuffer *parent;
/* this is a pointer to the buffer pool (if any) */
GstBufferPool *pool;
gpointer pool_private;
/* utility function pointers */
GstBufferFreeFunc free; /* free the data associated with the buffer */
GstBufferCopyFunc copy; /* copy the data from one buffer to another */
};
/* initialisation */
void _gst_buffer_initialize (void);
/* creating a new buffer from scratch */
GstBuffer* gst_buffer_new (void);
GstBuffer* gst_buffer_new_from_pool (GstBufferPool *pool, guint32 offset, guint32 size);
/* creating a subbuffer */
GstBuffer* gst_buffer_create_sub (GstBuffer *parent, guint32 offset, guint32 size);
/* refcounting */
void gst_buffer_ref (GstBuffer *buffer);
void gst_buffer_unref (GstBuffer *buffer);
/* destroying the buffer */
void gst_buffer_destroy (GstBuffer *buffer);
/* copy buffer */
GstBuffer* gst_buffer_copy (GstBuffer *buffer);
/* merge, span, or append two buffers, intelligently */
GstBuffer* gst_buffer_merge (GstBuffer *buf1, GstBuffer *buf2);
GstBuffer* gst_buffer_span (GstBuffer *buf1,guint32 offset,GstBuffer *buf2,guint32 len);
GstBuffer* gst_buffer_append (GstBuffer *buf, GstBuffer *buf2);
gboolean gst_buffer_is_span_fast (GstBuffer *buf1, GstBuffer *buf2);
G_END_DECLS
#endif /* __GST_BUFFER_H__ */

View file

@ -118,7 +118,7 @@ gst_mem_pool_destroy (GstMemPool *mem_pool)
gpointer gpointer
gst_mem_pool_alloc (GstMemPool *mem_pool) gst_mem_pool_alloc (GstMemPool *mem_pool)
{ {
GstMemPoolElement *pool = NULL; volatile GstMemPoolElement *pool = NULL;
g_return_val_if_fail (mem_pool != NULL, NULL); g_return_val_if_fail (mem_pool != NULL, NULL);
@ -187,7 +187,7 @@ gst_mem_pool_free (GstMemPool *mem_pool, gpointer mem)
:"m" (*mem_pool), "r" (pool), "a" (mem_pool->free)); :"m" (*mem_pool), "r" (pool), "a" (mem_pool->free));
#else #else
g_mutex_lock (mem_pool->chunk_lock); g_mutex_lock (mem_pool->chunk_lock);
pool->link = mem_pool->free; pool->link = (GstMemPoolElement *) mem_pool->free;
mem_pool->free = pool; mem_pool->free = pool;
g_mutex_unlock (mem_pool->chunk_lock); g_mutex_unlock (mem_pool->chunk_lock);
#endif #endif

View file

@ -4,7 +4,7 @@ else
GST_LOADSAVE_DIRS = xml typefind GST_LOADSAVE_DIRS = xml typefind
endif endif
SUBDIRS = \ dirs = \
helloworld \ helloworld \
queue \ queue \
queue2 \ queue2 \
@ -17,22 +17,9 @@ SUBDIRS = \
cutter \ cutter \
pingpong \ pingpong \
manual \ manual \
retag \
$(GST_LOADSAVE_DIRS)
DIST_SUBDIRS = helloworld \
queue \
queue2 \
queue3 \
queue4 \
launch \
thread \
plugins \
mixer \
cutter \
pingpong \
manual \
xml \
typefind \
retag retag
SUBDIRS = $(dirs) \
$(GST_LOADSAVE_DIRS)
DIST_SUBDIRS = $(dirs) xml typefind

View file

@ -1,2 +0,0 @@
autoplug
xmlTest.gst

View file

@ -1,4 +0,0 @@
noinst_PROGRAMS = autoplug
autoplug_LDADD = $(GST_LIBS)
autoplug_CFLAGS = $(GST_CFLAGS)

View file

@ -1,152 +0,0 @@
#include <gst/gst.h>
static void
gst_play_have_type (GstElement *typefind, GstCaps *caps, GstElement *pipeline)
{
GstElement *osssink, *videosink, *videoelement, *colorspace;
GstElement *new_element;
GstAutoplug *autoplug;
GstElement *autobin;
GstElement *filesrc;
GstElement *cache;
GST_DEBUG ("GstPipeline: play have type");
gst_element_set_state (pipeline, GST_STATE_PAUSED);
filesrc = gst_bin_get_by_name (GST_BIN (pipeline), "disk_source");
autobin = gst_bin_get_by_name (GST_BIN (pipeline), "autobin");
cache = gst_bin_get_by_name (GST_BIN (autobin), "cache");
/* unlink the typefind from the pipeline and remove it */
gst_element_unlink_pads (cache, "src", typefind, "sink");
gst_bin_remove (GST_BIN (autobin), typefind);
/* and an audio sink */
osssink = gst_element_factory_make ("osssink", "play_audio");
g_assert (osssink != NULL);
videosink = gst_bin_new ("videosink");
/* and an video sink */
videoelement = gst_element_factory_make ("xvideosink", "play_video");
g_assert (videosink != NULL);
colorspace = gst_element_factory_make ("colorspace", "colorspace");
g_assert (colorspace != NULL);
gst_element_link_pads (colorspace, "src", videoelement, "sink");
gst_bin_add (GST_BIN (videosink), colorspace);
gst_bin_add (GST_BIN (videosink), videoelement);
gst_element_add_ghost_pad (videosink,
gst_element_get_pad (colorspace, "sink"), "sink");
autoplug = gst_autoplug_factory_make ("staticrender");
g_assert (autoplug != NULL);
new_element = gst_autoplug_to_renderers (autoplug,
caps,
videosink,
osssink,
NULL);
if (!new_element) {
g_print ("could not autoplug, no suitable codecs found...\n");
exit (-1);
}
gst_element_set_name (new_element, "new_element");
gst_bin_add (GST_BIN (autobin), new_element);
g_object_set (G_OBJECT (cache), "reset", TRUE, NULL);
gst_element_link_pads (cache, "src", new_element, "sink");
gst_element_set_state (pipeline, GST_STATE_PLAYING);
#ifndef GST_DISABLE_LOADSAVE
gst_xml_write_file (GST_ELEMENT (pipeline), fopen ("xmlTest.gst", "w"));
#endif
}
static void
gst_play_cache_empty (GstElement *element, GstElement *pipeline)
{
GstElement *autobin;
GstElement *filesrc;
GstElement *cache;
GstElement *new_element;
fprintf (stderr, "have cache empty\n");
gst_element_set_state (pipeline, GST_STATE_PAUSED);
filesrc = gst_bin_get_by_name (GST_BIN (pipeline), "disk_source");
autobin = gst_bin_get_by_name (GST_BIN (pipeline), "autobin");
cache = gst_bin_get_by_name (GST_BIN (autobin), "cache");
new_element = gst_bin_get_by_name (GST_BIN (autobin), "new_element");
gst_element_unlink_many (filesrc, cache, new_element, NULL);
gst_bin_remove (GST_BIN (autobin), cache);
gst_element_link_pads (filesrc, "src", new_element, "sink");
gst_element_set_state (pipeline, GST_STATE_PLAYING);
fprintf (stderr, "done with cache_empty\n");
}
int main(int argc,char *argv[])
{
GstElement *filesrc;
GstElement *pipeline;
GstElement *autobin;
GstElement *typefind;
GstElement *cache;
g_thread_init(NULL);
gst_init(&argc,&argv);
if (argc != 2) {
g_print("usage: %s <filename>\n", argv[0]);
exit(-1);
}
/* create a new pipeline to hold the elements */
pipeline = gst_pipeline_new("pipeline");
g_assert(pipeline != NULL);
/* create a disk reader */
filesrc = gst_element_factory_make("filesrc", "disk_source");
g_assert(filesrc != NULL);
g_object_set(G_OBJECT(filesrc),"location", argv[1],NULL);
gst_bin_add (GST_BIN (pipeline), filesrc);
autobin = gst_bin_new ("autobin");
cache = gst_element_factory_make ("autoplugcache", "cache");
g_signal_connect (G_OBJECT (cache), "cache_empty", G_CALLBACK (gst_play_cache_empty), pipeline);
typefind = gst_element_factory_make ("typefind", "typefind");
g_signal_connect (G_OBJECT (typefind), "have_type", G_CALLBACK (gst_play_have_type), pipeline);
gst_bin_add (GST_BIN (autobin), cache);
gst_bin_add (GST_BIN (autobin), typefind);
gst_element_link_pads (cache, "src", typefind, "sink");
gst_element_add_ghost_pad (autobin, gst_element_get_pad (cache, "sink"), "sink");
gst_bin_add (GST_BIN( pipeline), autobin);
gst_element_link_pads (filesrc, "src", autobin, "sink");
/* start playing */
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_PLAYING);
while (gst_bin_iterate (GST_BIN (pipeline)));
/* stop the pipeline */
gst_element_set_state (GST_ELEMENT (pipeline), GST_STATE_NULL);
gst_object_unref (GST_OBJECT (pipeline));
exit(0);
}

View file

@ -422,11 +422,6 @@ GST_PLUGIN_DEFINE (
"0.1", /* The version number of the plugin */ "0.1", /* The version number of the plugin */
"LGPL", /* ieffective license the plugin can be shipped with. Must be "LGPL", /* ieffective license the plugin can be shipped with. Must be
* valid for all libraries it links to, too. */ * valid for all libraries it links to, too. */
"(c) 2003 E. Xamplewriter",
/* Copyright holder for this plugin. This does not include
* the libraries it links to, contrary to the license. This
* field should be considered informational and not legally
* binding */
"my nifty plugin package", "my nifty plugin package",
/* package this plugin belongs to. */ /* package this plugin belongs to. */
"http://www.mydomain.com" "http://www.mydomain.com"

Some files were not shown because too many files have changed in this diff Show more