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

Original commit message from CVS:
Merge HEAD from CAPS-MERGE-1 to CAPS-MERGE-2
This commit is contained in:
David Schleef 2003-11-29 07:04:28 +00:00
parent 3ce2f5c215
commit f84d9ae2da
28 changed files with 718 additions and 701 deletions

View file

@ -26,7 +26,7 @@ dnl - library source changed -> increment REVISION
dnl - interfaces added/removed/changed -> increment CURRENT, REVISION = 0
dnl - interfaces added -> increment AGE
dnl - interfaces removed -> AGE = 0
AS_LIBTOOL(GST, 3, 0, 0)
AS_LIBTOOL(GST, 4, 0, 0)
AC_CONFIG_SRCDIR([gst/gst.c])
AM_CONFIG_HEADER(config.h)
@ -378,8 +378,6 @@ GST_SUBSYSTEM_DISABLE(GST_DEBUG,[debugging subsystem])
translit(dnm, m, l) AM_CONDITIONAL(GST_DISABLE_LOADSAVE, true)
GST_SUBSYSTEM_DISABLE(LOADSAVE,[pipeline XML load/save])
translit(dnm, m, l) AM_CONDITIONAL(GST_DISABLE_AUTOPLUG, true)
GST_SUBSYSTEM_DISABLE(AUTOPLUG,[autoplugger subsystem])
translit(dnm, m, l) AM_CONDITIONAL(GST_DISABLE_PARSE, true)
GST_SUBSYSTEM_DISABLE(PARSE,[command-line parser])
translit(dnm, m, l) AM_CONDITIONAL(GST_DISABLE_TRACE, true)

View file

@ -214,14 +214,21 @@ distclean-local: clean
if DOC_HTML
install-data-local:
$(mkinstalldirs) $(DESTDIR)$(TARGET_DIR)
(installfiles=`echo $(srcdir)/html/*.html $(srcdir)/html/*.png`; \
if test "$$installfiles" = '$(srcdir)/html/*.html'; \
(installfiles=`echo ./html/*.html`; \
if test "$$installfiles" = './html/*.html'; \
then echo '-- Nothing to install' ; \
else \
for i in $$installfiles; do \
echo '-- Installing '$$i ; \
$(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \
done; \
pngfiles=`echo ./html/*.png`; \
if test "$$pngfiles" != './html/*.png'; then \
for i in $$pngfiles; do \
echo '-- Installing '$$i ; \
$(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \
done; \
fi; \
echo '-- Installing $(srcdir)/html/$(DOC_MODULE).devhelp' ; \
$(INSTALL_DATA) $(srcdir)/html/$(DOC_MODULE).devhelp \
$(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp; \
@ -229,8 +236,8 @@ install-data-local:
$(INSTALL_DATA) $(srcdir)/html/index.sgml $(DESTDIR)$(TARGET_DIR); \
fi)
uninstall-local:
(installfiles=`echo $(srcdir)/html/*.html $(srcdir)/html/*.png`; \
if test "$$installfiles" = '$(srcdir)/html/*.html'; \
(installfiles=`echo ./html/*.html`; \
if test "$$installfiles" = './html/*.html'; \
then echo '-- Nothing to uninstall' ; \
else \
for i in $$installfiles; do \
@ -238,6 +245,14 @@ uninstall-local:
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/'$$rmfile ; \
rm -f $(DESTDIR)$(TARGET_DIR)/$$rmfile; \
done; \
pngfiles=`echo ./html/*.png`; \
if test "$$pngfiles" != './html/*.png'; then \
for i in $$pngfiles; do \
rmfile=`basename $$i` ; \
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/'$$rmfile ; \
rm -f $(DESTDIR)$(TARGET_DIR)/$$rmfile; \
done; \
fi; \
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE).devhelp' ; \
rm -f $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp; \
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/index.sgml' ; \

View file

@ -212,24 +212,31 @@ distclean-local: clean
if DOC_HTML
install-data-local:
$(mkinstalldirs) $(DESTDIR)$(TARGET_DIR)
(installfiles=`echo $(srcdir)/html/*.html $(srcdir)/html/*.png`; \
if test "$$installfiles" = '$(srcdir)/html/*.html'; \
$(mkinstalldirs) $(DESTDIR)$(TARGET_DIR)
(installfiles=`echo ./html/*.html`; \
if test "$$installfiles" = './html/*.html'; \
then echo '-- Nothing to install' ; \
else \
for i in $$installfiles; do \
echo '-- Installing '$$i ; \
$(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \
done; \
echo '-- Installing $(srcdir)/html/$(DOC_MODULE).devhelp' ; \
$(INSTALL_DATA) $(srcdir)/html/$(DOC_MODULE).devhelp \
$(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp; \
pngfiles=`echo ./html/*.png`; \
if test "$$pngfiles" != './html/*.png'; then \
for i in $$pngfiles; do \
echo '-- Installing '$$i ; \
$(INSTALL_DATA) $$i $(DESTDIR)$(TARGET_DIR); \
done; \
fi; \
echo '-- Installing $(srcdir)/html/$(DOC_MODULE).devhelp' ; \
$(INSTALL_DATA) $(srcdir)/html/$(DOC_MODULE).devhelp \
$(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp; \
echo '-- Installing $(srcdir)/html/index.sgml' ; \
$(INSTALL_DATA) $(srcdir)/html/index.sgml $(DESTDIR)$(TARGET_DIR); \
fi)
fi)
uninstall-local:
(installfiles=`echo $(srcdir)/html/*.html $(srcdir)/html/*.png`; \
if test "$$installfiles" = '$(srcdir)/html/*.html'; \
(installfiles=`echo ./html/*.html`; \
if test "$$installfiles" = './html/*.html'; \
then echo '-- Nothing to uninstall' ; \
else \
for i in $$installfiles; do \
@ -237,6 +244,14 @@ uninstall-local:
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/'$$rmfile ; \
rm -f $(DESTDIR)$(TARGET_DIR)/$$rmfile; \
done; \
pngfiles=`echo ./html/*.png`; \
if test "$$pngfiles" != './html/*.png'; then \
for i in $$pngfiles; do \
rmfile=`basename $$i` ; \
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/'$$rmfile ; \
rm -f $(DESTDIR)$(TARGET_DIR)/$$rmfile; \
done; \
fi; \
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE).devhelp' ; \
rm -f $(DESTDIR)$(TARGET_DIR)/$(DOC_MODULE)-@GST_MAJORMINOR@.devhelp; \
echo '-- Uninstalling $(DESTDIR)$(TARGET_DIR)/index.sgml' ; \

View file

@ -94,7 +94,7 @@ $(BUILDDIR)/$(MAIN): $(XML) $(CSS)
html/index.html: $(BUILDDIR)/$(MAIN) $(PNG_BUILT) $(FIG_SRC)
@echo "*** Generating HTML output ***"
@-mkdir -p html
@cp $(srcdir)/../image-png $(BUILDDIR)/image.entities
@cp -f $(srcdir)/../image-png $(BUILDDIR)/image.entities
@cd $(BUILDDIR) && xmlto html -o ../html $(MAIN)
@test "x$(CSS)" != "x" && \
echo "Copying .css files: $(CSS)" && \
@ -106,7 +106,7 @@ html/index.html: $(BUILDDIR)/$(MAIN) $(PNG_BUILT) $(FIG_SRC)
$(DOC).ps: $(BUILDDIR)/$(MAIN) $(EPS_BUILT) $(PNG_SRC) $(FIG_SRC)
@echo "*** Generating PS output ***"
@cp $(srcdir)/../image-eps $(BUILDDIR)/image.entities
@cp -f $(srcdir)/../image-eps $(BUILDDIR)/image.entities
# export LC_PAPER=$(PAPER_LOCALE) && cd $(BUILDDIR) && xmlto ps -o .. $(MAIN)
export LC_PAPER=$(PAPER_LOCALE) && cd $(BUILDDIR) && docbook2ps -o .. $(MAIN)
@ -116,7 +116,7 @@ $(DOC).pdf: $(DOC).ps
#$(DOC).pdf: $(MAIN) $(PDF) $(FIG_SRC)
# @echo "*** Generating PDF output ***"
# @cp $(srcdir)/../image-pdf image.entities
# @cp -f $(srcdir)/../image-pdf image.entities
# @export LC_PAPER=$(PAPER_LOCALE) && xmlto pdf $(MAIN)
# @rm image.entities

View file

@ -460,7 +460,7 @@
<!-- ############ type ############# -->
<row>
<entry morerows="0">video/avi</entry>
<entry morerows="0">video/x-msvideo</entry>
<entry morerows="0">
Video data compressed using the AVI encoding scheme.
</entry>

View file

@ -57,9 +57,9 @@ audio stream, even when it is compressed.
Another problem is that many media types can be defined in multiple ways. For
example, MJPEG video can be defined as 'video/jpeg', 'video/mjpeg',
'image/jpeg', 'video/avi' with a compression of (fourcc) MJPG, etc. None of
these is really official, since there isn't an official mimetype for encoded
MJPEG video.
'image/jpeg', 'video/x-msvideo' with a compression of (fourcc) MJPG, etc.
None of these is really official, since there isn't an official mimetype
for encoded MJPEG video.
The main focus of this document is to propose a standardized set of MIME types
and properties that will be used by the GStreamer plugins.
@ -86,7 +86,7 @@ Container formats
-----------------
1 - AVI (Microsoft RIFF/AVI)
MIME type: video/avi
MIME type: video/x-msvideo
Properties:
Parser: avidemux
Formatter: avimux
@ -104,7 +104,7 @@ Container formats
Formatter:
4 - ASF (Microsoft)
MIME type: video/x-asf
MIME type: video/x-ms-asf
Properties:
Parser: asfdemux
Formatter:

View file

@ -1,617 +0,0 @@
/* GStreamer
* Copyright (C) 2001 RidgeRun, Inc. (www.ridgerun.com)
*
* gstautoplugger.c: Data for the dynamic autopluggerger
*
* 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.
*/
#ifdef HAVE_CONFIG_H
# include "config.h"
#endif
#include <gst/gst.h>
GstElementDetails gst_autoplugger_details = GST_ELEMENT_DETAILS (
"Dynamic autoplugger",
"Generic",
"Magic element that converts from any type to any other",
"Erik Walthinsen <omega@temple-baptist.com>"
);
#define GST_TYPE_AUTOPLUGGER \
(gst_autoplugger_get_type())
#define GST_AUTOPLUGGER(obj) \
(G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUTOPLUGGER,GstAutoplugger))
#define GST_AUTOPLUGGER_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUTOPLUGGER,GstAutopluggerClass))
#define GST_IS_AUTOPLUGGER(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUTOPLUGGER))
#define GST_IS_AUTOPLUGGER_CLASS(obj) \
(G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUTOPLUGGER))
typedef struct _GstAutoplugger GstAutoplugger;
typedef struct _GstAutopluggerClass GstAutopluggerClass;
struct _GstAutoplugger {
GstBin bin;
gint paused;
GstElement *cache;
gboolean cache_first_buffer;
GstPad *cache_sinkpad, *cache_srcpad;
GstElement *typefind;
GstPad *typefind_sinkpad;
GstPad *sinkpadpeer, *srcpadpeer;
GstCaps2 *sinkcaps, *srccaps;
GstCaps2 *sinktemplatecaps;
GstAutoplug *autoplug;
GstElement *autobin;
gboolean disable_nocaps;
};
struct _GstAutopluggerClass {
GstBinClass parent_class;
};
/* signals and args */
enum {
LAST_SIGNAL
};
enum {
ARG_0,
};
static void gst_autoplugger_class_init (GstAutopluggerClass *klass);
static void gst_autoplugger_init (GstAutoplugger *queue);
static void gst_autoplugger_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec);
static void gst_autoplugger_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec);
/*static GstElementStateReturn gst_autoplugger_change_state (GstElement *element);*/
/*
static void gst_autoplugger_external_sink_caps_changed (GstPad *pad, GstCaps2 *caps, GstAutoplugger *autoplugger);
static void gst_autoplugger_external_src_caps_changed (GstPad *pad, GstCaps2 *caps, GstAutoplugger *autoplugger);
*/
static void gst_autoplugger_external_sink_caps_nego_failed (GstPad *pad, gboolean *result, GstAutoplugger *autoplugger);
static void gst_autoplugger_external_src_caps_nego_failed (GstPad *pad, gboolean *result, GstAutoplugger *autoplugger);
/* defined but not used
static void gst_autoplugger_external_sink_linked (GstPad *pad, GstPad *peerpad, GstAutoplugger *autoplugger);
static void gst_autoplugger_external_src_linked (GstPad *pad, GstPad *peerpad, GstAutoplugger *autoplugger);
*/
static void gst_autoplugger_cache_first_buffer (GstElement *element,GstBuffer *buf,GstAutoplugger *autoplugger);
static void gst_autoplugger_cache_empty (GstElement *element, GstAutoplugger *autoplugger);
static void gst_autoplugger_type_find_have_type (GstElement *element, GstCaps2 *caps, GstAutoplugger *autoplugger);
static GstElementClass *parent_class = NULL;
/*static guint gst_autoplugger_signals[LAST_SIGNAL] = { 0 };*/
GType
gst_autoplugger_get_type(void) {
static GType autoplugger_type = 0;
if (!autoplugger_type) {
static const GTypeInfo autoplugger_info = {
sizeof(GstAutopluggerClass),
NULL,
NULL,
(GClassInitFunc)gst_autoplugger_class_init,
NULL,
NULL,
sizeof(GstAutoplugger),
0,
(GInstanceInitFunc)gst_autoplugger_init,
};
autoplugger_type = g_type_register_static (GST_TYPE_BIN, "GstAutoplugger", &autoplugger_info, 0);
}
return autoplugger_type;
}
static void
gst_autoplugger_class_init (GstAutopluggerClass *klass)
{
GObjectClass *gobject_class;
GstElementClass *gstelement_class;
gobject_class = (GObjectClass*)klass;
gstelement_class = (GstElementClass*)klass;
parent_class = g_type_class_ref (GST_TYPE_ELEMENT);
/*
gst_autoplugger_signals[_EMPTY] =
g_signal_new ("_empty", G_OBJECT_TYPE(gobject_class), G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (GstAutopluggerClass, _empty), NULL, NULL,
g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0);
*/
/*
g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_BUFFER_COUNT,
g_param_spec_int("buffer_count","buffer_count","buffer_count",
0,G_MAXINT,0,G_PARAM_READABLE)); * CHECKME! *
g_object_class_install_property(G_OBJECT_CLASS(klass), ARG_RESET,
g_param_spec_boolean("reset","reset","reset",
FALSE,G_PARAM_WRITABLE)); * CHECKME! *
*/
gobject_class->set_property = gst_autoplugger_set_property;
gobject_class->get_property = gst_autoplugger_get_property;
/* gstelement_class->change_state = gst_autoplugger_change_state; */
gst_element_class_set_details (gstelement_class, &gst_autoplugger_details);
}
static void
gst_autoplugger_init (GstAutoplugger *autoplugger)
{
/* create the autoplugger cache, which is the fundamental unit of the autopluggerger */
/* FIXME we need to find a way to set element's name before _init */
/* FIXME ... so we can name the subelements uniquely */
autoplugger->cache = gst_element_factory_make("autoplugcache", "unnamed_autoplugcache");
g_return_if_fail (autoplugger->cache != NULL);
GST_DEBUG ("turning on caps nego proxying in cache");
g_object_set(G_OBJECT(autoplugger->cache),"caps_proxy",TRUE,NULL);
/* attach signals to the cache */
g_signal_connect (G_OBJECT (autoplugger->cache), "first_buffer",
G_CALLBACK (gst_autoplugger_cache_first_buffer), autoplugger);
/* add the cache to self */
gst_bin_add (GST_BIN(autoplugger), autoplugger->cache);
/* get the cache's pads so we can attach stuff to them */
autoplugger->cache_sinkpad = gst_element_get_pad (autoplugger->cache, "sink");
autoplugger->cache_srcpad = gst_element_get_pad (autoplugger->cache, "src");
/* attach handlers to the typefind pads */
/* FIXME "caps_changed" no longer exists
g_signal_connect (G_OBJECT (autoplugger->cache_sinkpad), "caps_changed",
G_CALLBACK (gst_autoplugger_external_sink_caps_changed), autoplugger);
g_signal_connect (G_OBJECT (autoplugger->cache_srcpad), "caps_changed",
G_CALLBACK (gst_autoplugger_external_src_caps_changed), autoplugger);
*/
g_signal_connect (G_OBJECT (autoplugger->cache_sinkpad), "caps_nego_failed",
G_CALLBACK (gst_autoplugger_external_sink_caps_nego_failed), autoplugger);
g_signal_connect (G_OBJECT (autoplugger->cache_srcpad), "caps_nego_failed",
G_CALLBACK (gst_autoplugger_external_src_caps_nego_failed), autoplugger);
/* g_signal_connect (G_OBJECT (autoplugger->cache_sinkpad), "linked", */
/* gst_autoplugger_external_sink_linked, autoplugger);*/
/* g_signal_connect (G_OBJECT (autoplugger->cache_srcpad), "linked", */
/* gst_autoplugger_external_src_linked, autoplugger); */
/* ghost both of these pads to the outside world */
gst_element_add_ghost_pad (GST_ELEMENT(autoplugger), autoplugger->cache_sinkpad, "sink");
gst_element_add_ghost_pad (GST_ELEMENT(autoplugger), autoplugger->cache_srcpad, "src");
}
/* defined but not used
G_GNUC_UNUSED static void
gst_autoplugger_external_sink_linked(GstPad *pad, GstPad *peerpad, GstAutoplugger *autoplugger)
{
GstPadTemplate *peertemplate;
GstCaps2 *peercaps, *peertemplatecaps;
GST_INFO ("have cache:sink linked");*/
/* autoplugger->sinkpadpeer = peerpad; */
/*
if (autoplugger->sinkpadpeer) {
peercaps = GST_PAD_CAPS(autoplugger->sinkpadpeer);
if (peercaps)
GST_INFO ("there are some caps on this pad's peer: %s",
gst_caps2_get_mime(peercaps));
peertemplate = GST_PAD_PAD_TEMPLATE(autoplugger->sinkpadpeer);
if (peertemplate) {
peertemplatecaps = GST_PAD_TEMPLATE_CAPS(peertemplate);
if (peertemplatecaps) {
GST_INFO ("there are some caps on this pad's peer's padtemplate %s",
gst_caps2_get_mime(peertemplatecaps));
}
}
}
}
G_GNUC_UNUSED static void
gst_autoplugger_external_src_linked(GstPad *pad, GstPad *peerpad, GstAutoplugger *autoplugger)
{
GstPadTemplate *peertemplate;
GstCaps2 *peercaps, *peertemplatecaps;
GST_INFO ("have cache:src linked");*/
/* autoplugger->srcpadpeer = peerpad; */
/*
if (autoplugger->srcpadpeer) {
peercaps = GST_PAD_CAPS(autoplugger->srcpadpeer);
if (peercaps)
GST_INFO ("there are some caps on this pad's peer: %s",
gst_caps2_get_mime(peercaps));
peertemplate = GST_PAD_PAD_TEMPLATE(autoplugger->srcpadpeer);
if (peertemplate) {
peertemplatecaps = GST_PAD_TEMPLATE_CAPS(peertemplate);
if (peertemplatecaps) {
GST_INFO ("there are some caps on this pad's peer's padtemplate %s",
gst_caps2_get_mime(peertemplatecaps));
autoplugger->sinktemplatecaps = peertemplatecaps;*/
/* GST_DEBUG ("turning on caps nego proxying in cache"); */
/* gtk_object_set(G_OBJECT(autoplugger->cache),"caps_proxy",TRUE,NULL);*/
/* }
}
}
}*/
/*
static void
gst_autoplugger_external_sink_caps_changed(GstPad *pad, GstCaps2 *caps, GstAutoplugger *autoplugger)
{
GST_INFO ("have cache:sink caps of %s\n",gst_caps2_get_mime(caps));
autoplugger->sinkcaps = caps;
}
static void
gst_autoplugger_external_src_caps_changed(GstPad *pad, GstCaps2 *caps, GstAutoplugger *autoplugger)
{
GST_INFO ("have cache:src caps of %s\n",gst_caps2_get_mime(caps));
autoplugger->srccaps = caps;
}
*/
static gboolean
gst_autoplugger_autoplug(GstAutoplugger *autoplugger,GstPad *srcpad,GstCaps2 *srccaps,GstCaps2 *sinkcaps)
{
GstPad *sinkpad;
sinkpad = GST_PAD(GST_PAD_PEER(srcpad));
GST_DEBUG ("unlinking %s:%s and %s:%s to autoplug between them",
GST_DEBUG_PAD_NAME(srcpad),GST_DEBUG_PAD_NAME(sinkpad));
GST_DEBUG ("srcpadcaps are of type %s",gst_caps2_get_mime(srccaps));
GST_DEBUG ("sinkpadcaps are of type %s",gst_caps2_get_mime(sinkcaps));
/* unlink the pads */
GST_DEBUG ("unlinking the pads that will be joined by an autobin");
gst_pad_unlink(srcpad,sinkpad);
if (!autoplugger->autoplug) {
autoplugger->autoplug = gst_autoplug_factory_make("static");
g_return_val_if_fail(autoplugger->autoplug != NULL, FALSE);
}
GST_DEBUG ("building autoplugged bin between caps");
autoplugger->autobin = gst_autoplug_to_caps(autoplugger->autoplug,
srccaps,sinkcaps,NULL);
g_return_val_if_fail(autoplugger->autobin != NULL, FALSE);
gst_bin_add(GST_BIN(autoplugger),autoplugger->autobin);
gst_scheduler_show(GST_ELEMENT_SCHED(autoplugger));
/* FIXME this is a hack */
/* GST_DEBUG ("copying failed caps to srcpad %s:%s to ensure renego",GST_DEBUG_PAD_NAME(autoplugger->cache_srcpad)); */
/* gst_pad_set_caps(srcpad,srccaps); */
if (GST_PAD_CAPS(srcpad) == NULL) GST_DEBUG ("no caps on cache:src!");
/* attach the autoplugged bin */
GST_DEBUG ("attaching the autoplugged bin between the two pads");
gst_pad_link(srcpad,gst_element_get_pad(autoplugger->autobin,"sink"));
gst_scheduler_show(GST_ELEMENT_SCHED(autoplugger));
gst_pad_link(gst_element_get_pad(autoplugger->autobin,"src_00"),sinkpad);
gst_scheduler_show(GST_ELEMENT_SCHED(autoplugger));
/* FIXME try to force the renego */
/* GST_DEBUG ("trying to force everyone to nego"); */
/* gst_pad_renegotiate(gst_element_get_pad(autoplugger->autobin,"sink")); */
/* gst_pad_renegotiate(sinkpad); */
return TRUE;
}
static void
gst_autoplugger_external_sink_caps_nego_failed(GstPad *pad, gboolean *result, GstAutoplugger *autoplugger)
{
GstPad *srcpad_peer;
GstPadTemplate *srcpad_peer_template;
GstCaps2 *srcpad_peer_caps;
GstPad *sinkpad_peer;
GstCaps2 *sinkpad_peer_caps;
GST_INFO ("have caps nego failure on sinkpad %s:%s!!!",GST_DEBUG_PAD_NAME(pad));
autoplugger->paused++;
if (autoplugger->paused == 1)
/* try to PAUSE the whole thing */
gst_element_set_state(GST_ELEMENT_SCHED(autoplugger)->parent,GST_STATE_PAUSED);
srcpad_peer = GST_PAD(GST_PAD_PEER(autoplugger->cache_srcpad));
g_return_if_fail(srcpad_peer != NULL);
srcpad_peer_template = GST_PAD_PAD_TEMPLATE(srcpad_peer);
g_return_if_fail(srcpad_peer_template != NULL);
srcpad_peer_caps = GST_PAD_TEMPLATE_CAPS(srcpad_peer_template);
g_return_if_fail(srcpad_peer_caps != NULL);
sinkpad_peer = GST_PAD(GST_PAD_PEER(pad));
g_return_if_fail(sinkpad_peer != NULL);
sinkpad_peer_caps = GST_PAD_CAPS(sinkpad_peer);
g_return_if_fail(sinkpad_peer_caps != NULL);
if (gst_autoplugger_autoplug(autoplugger,autoplugger->cache_srcpad,sinkpad_peer_caps,srcpad_peer_caps))
*result = TRUE;
autoplugger->paused--;
if (autoplugger->paused == 0)
/* try to PLAY the whole thing */
gst_element_set_state(GST_ELEMENT_SCHED(autoplugger)->parent,GST_STATE_PLAYING);
GST_INFO ("done dealing with caps nego failure on sinkpad %s:%s",GST_DEBUG_PAD_NAME(pad));
}
static void
gst_autoplugger_external_src_caps_nego_failed(GstPad *pad, gboolean *result, GstAutoplugger *autoplugger)
{
GstCaps2 *srcpad_caps;
GstPad *srcpad_peer;
GstPadTemplate *srcpad_peer_template;
GstCaps2 *srcpad_peer_caps;
GST_INFO ("have caps nego failure on srcpad %s:%s!!!",GST_DEBUG_PAD_NAME(pad));
autoplugger->paused++;
if (autoplugger->paused == 1)
/* try to PAUSE the whole thing */
gst_element_set_state(GST_ELEMENT_SCHED(autoplugger)->parent,GST_STATE_PAUSED);
srcpad_caps = GST_PAD_CAPS(autoplugger->cache_srcpad);
srcpad_peer = GST_PAD(GST_PAD_PEER(autoplugger->cache_srcpad));
g_return_if_fail(srcpad_peer != NULL);
srcpad_peer_template = GST_PAD_PAD_TEMPLATE(srcpad_peer);
g_return_if_fail(srcpad_peer_template != NULL);
srcpad_peer_caps = GST_PAD_TEMPLATE_CAPS(srcpad_peer_template);
g_return_if_fail(srcpad_peer_caps != NULL);
if (gst_autoplugger_autoplug(autoplugger,autoplugger->cache_srcpad,srcpad_caps,srcpad_peer_caps))
*result = TRUE;
autoplugger->paused--;
if (autoplugger->paused == 0)
/* try to PLAY the whole thing */
gst_element_set_state(GST_ELEMENT_SCHED(autoplugger)->parent,GST_STATE_PLAYING);
autoplugger->disable_nocaps = TRUE;
GST_INFO ("done dealing with caps nego failure on srcpad %s:%s",GST_DEBUG_PAD_NAME(pad));
}
static void
gst_autoplugger_cache_empty(GstElement *element, GstAutoplugger *autoplugger)
{
GstPad *cache_sinkpad_peer,*cache_srcpad_peer;
GST_INFO ("autoplugger cache has hit empty, we can now remove it");
autoplugger->paused++;
if (autoplugger->paused == 1)
/* try to PAUSE the whole thing */
gst_element_set_state(GST_ELEMENT_SCHED(autoplugger)->parent,GST_STATE_PAUSED);
/* unlink the cache from its peers */
GST_DEBUG ("unlinking autoplugcache from its peers");
cache_sinkpad_peer = GST_PAD (GST_PAD_PEER(autoplugger->cache_sinkpad));
cache_srcpad_peer = GST_PAD (GST_PAD_PEER(autoplugger->cache_srcpad));
gst_pad_unlink(cache_sinkpad_peer,autoplugger->cache_sinkpad);
gst_pad_unlink(autoplugger->cache_srcpad,cache_srcpad_peer);
/* remove the cache from self */
GST_DEBUG ("removing the cache from the autoplugger");
gst_bin_remove (GST_BIN(autoplugger), autoplugger->cache);
/* link the two pads */
GST_DEBUG ("relinking the autoplugcache's former peers");
gst_pad_link(cache_sinkpad_peer,cache_srcpad_peer);
autoplugger->paused--;
if (autoplugger->paused == 0)
/* try to PLAY the whole thing */
gst_element_set_state(GST_ELEMENT_SCHED(autoplugger)->parent,GST_STATE_PLAYING);
/* xmlSaveFile("autoplugger.gst", gst_xml_write(GST_ELEMENT_SCHED(autoplugger)->parent)); */
GST_INFO ("autoplugger_cache_empty finished");
}
static void
gst_autoplugger_type_find_have_type(GstElement *element, GstCaps2 *caps, GstAutoplugger *autoplugger)
{
GST_INFO ("typefind claims to have a type: %s",gst_caps2_get_mime(caps));
gst_scheduler_show(GST_ELEMENT_SCHED(autoplugger));
autoplugger->paused++;
if (autoplugger->paused == 1)
/* try to PAUSE the whole thing */
gst_element_set_state(GST_ELEMENT_SCHED(autoplugger)->parent,GST_STATE_PAUSED);
/* first unlink the typefind and shut it down */
GST_DEBUG ("unlinking typefind from the cache");
gst_pad_unlink(autoplugger->cache_srcpad,autoplugger->typefind_sinkpad);
gst_bin_remove(GST_BIN(autoplugger),autoplugger->typefind);
/* FIXME FIXME now we'd compare caps and see if we need to autoplug something in the middle, but for */
/* now we're going to just relink where we left off */
/* FIXME FIXME FIXME!!!: this should really be done in the caps failure!!! */
/*
if (!autoplugger->autoplug) {
autoplugger->autoplug = gst_autoplug_factory_make("static");
}
autoplugger->autobin = gst_autoplug_to_caps(autoplugger->autoplug,
caps,autoplugger->sinktemplatecaps,NULL);
g_return_if_fail(autoplugger->autobin != NULL);
gst_bin_add(GST_BIN(autoplugger),autoplugger->autobin);
* * re-attach the srcpad's original peer to the cache *
* GST_DEBUG ("relinking the cache to the downstream peer"); *
* gst_pad_link(autoplugger->cache_srcpad,autoplugger->srcpadpeer); *
* attach the autoplugged bin *
GST_DEBUG ("attaching the autoplugged bin between cache and downstream peer");
gst_pad_link(autoplugger->cache_srcpad,gst_element_get_pad(autoplugger->autobin,"sink"));
gst_pad_link(gst_element_get_pad(autoplugger->autobin,"src_00"),autoplugger->srcpadpeer);
*/
/* FIXME set the caps on the new link
* GST_DEBUG ("forcing caps on the typefound pad");
* gst_pad_set_caps(autoplugger->cache_srcpad,caps);
* reattach the original outside srcpad
*/
GST_DEBUG ("re-attaching downstream peer to autoplugcache");
gst_pad_link(autoplugger->cache_srcpad,autoplugger->srcpadpeer);
/* now reset the autoplugcache */
GST_DEBUG ("resetting the cache to send first buffer(s) again");
g_object_set(G_OBJECT(autoplugger->cache),"reset",TRUE,NULL);
/* attach the cache_empty handler */
/* FIXME this is the wrong place, it shouldn't be done until we get successful caps nego! */
g_signal_connect (G_OBJECT(autoplugger->cache),"cache_empty",
G_CALLBACK (gst_autoplugger_cache_empty), autoplugger);
autoplugger->paused--;
if (autoplugger->paused == 0)
/* try to PLAY the whole thing */
gst_element_set_state(GST_ELEMENT_SCHED(autoplugger)->parent,GST_STATE_PLAYING);
GST_INFO ("typefind_have_type finished");
gst_scheduler_show(GST_ELEMENT_SCHED(autoplugger));
}
static void
gst_autoplugger_cache_first_buffer(GstElement *element,GstBuffer *buf,GstAutoplugger *autoplugger)
{
GST_INFO ("have first buffer through cache");
autoplugger->cache_first_buffer = TRUE;
/* if there are no established caps, worry */
if (!autoplugger->sinkcaps) {
GST_INFO ("have no caps for the buffer, Danger Will Robinson!");
if (autoplugger->disable_nocaps) {
GST_DEBUG ("not dealing with lack of caps this time");
return;
}
gst_scheduler_show(GST_ELEMENT_SCHED(autoplugger));
autoplugger->paused++;
if (autoplugger->paused == 1)
/* try to PAUSE the whole thing */
gst_element_set_state(GST_ELEMENT_SCHED(autoplugger)->parent,GST_STATE_PAUSED);
/* detach the srcpad */
GST_DEBUG ("unlinking cache from its downstream peer");
autoplugger->srcpadpeer = GST_PAD(GST_PAD_PEER(autoplugger->cache_srcpad));
gst_pad_unlink(autoplugger->cache_srcpad,autoplugger->srcpadpeer);
/* instantiate the typefind and set up the signal handlers */
if (!autoplugger->typefind) {
GST_DEBUG ("creating typefind and setting signal handler");
autoplugger->typefind = gst_element_factory_make("typefind","unnamed_type_find");
autoplugger->typefind_sinkpad = gst_element_get_pad(autoplugger->typefind,"sink");
g_signal_connect (G_OBJECT(autoplugger->typefind),"have_type",
G_CALLBACK (gst_autoplugger_type_find_have_type), autoplugger);
}
/* add it to self and attach it */
GST_DEBUG ("adding typefind to self and linking to cache");
gst_bin_add(GST_BIN(autoplugger),autoplugger->typefind);
gst_pad_link(autoplugger->cache_srcpad,autoplugger->typefind_sinkpad);
/* bring the typefind into playing state */
GST_DEBUG ("setting typefind state to PLAYING");
gst_element_set_state(autoplugger->cache,GST_STATE_PLAYING);
autoplugger->paused--;
if (autoplugger->paused == 0)
/* try to PLAY the whole thing */
gst_element_set_state(GST_ELEMENT_SCHED(autoplugger)->parent,GST_STATE_PLAYING);
GST_INFO ("here we go into nothingness, hoping the typefind will return us to safety");
gst_scheduler_show(GST_ELEMENT_SCHED(autoplugger));
} else {
/* * attach the cache_empty handler, since the cache simply isn't needed *
* g_signal_connect (G_OBJECT(autoplugger->cache),"cache_empty",
* gst_autoplugger_cache_empty,autoplugger);
*/
}
}
static void
gst_autoplugger_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
{
GstAutoplugger *autoplugger;
autoplugger = GST_AUTOPLUGGER (object);
switch (prop_id) {
default:
break;
}
}
static void
gst_autoplugger_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
{
GstAutoplugger *autoplugger;
autoplugger = GST_AUTOPLUGGER (object);
switch (prop_id) {
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
}
}
static gboolean
plugin_init (GstPlugin *plugin)
{
if (!gst_element_register (plugin, "autoplugger", GST_RANK_NONE, GST_TYPE_AUTOPLUGGER))
return FALSE;
return TRUE;
}
GST_PLUGIN_DEFINE (
GST_VERSION_MAJOR,
GST_VERSION_MINOR,
"autoplugger",
"magic element that converts from any type tom any other",
plugin_init,
VERSION,
GST_LICENSE,
GST_COPYRIGHT,
GST_PACKAGE,
GST_ORIGIN
)

View file

@ -182,7 +182,7 @@ gst_aggregator_request_new_pad (GstElement *element, GstPadTemplate *templ, cons
g_return_val_if_fail (GST_IS_AGGREGATOR (element), NULL);
if (templ->direction != GST_PAD_SINK) {
g_warning ("gstaggregator: request new pad that is not a SRC pad\n");
g_warning ("gstaggregator: request new pad that is not a sink pad\n");
return NULL;
}

View file

@ -78,8 +78,8 @@ void gst_init_with_popt_table (int *argc, char **argv[],
gboolean gst_init_check_with_popt_table (int *argc, char **argv[],
const struct poptOption
*popt_options);
const struct
poptOption* gst_init_get_popt_table (void);
G_CONST_RETURN struct poptOption*
gst_init_get_popt_table (void);
void gst_use_threads (gboolean use_threads);
gboolean gst_has_threads (void);

View file

@ -110,7 +110,8 @@ void gst_bin_remove_many (GstBin *bin, GstElement *element_1, ...);
/* retrieve a single element or the list of children */
GstElement* gst_bin_get_by_name (GstBin *bin, const gchar *name);
GstElement* gst_bin_get_by_name_recurse_up (GstBin *bin, const gchar *name);
const GList* gst_bin_get_list (GstBin *bin);
G_CONST_RETURN GList*
gst_bin_get_list (GstBin *bin);
gboolean gst_bin_iterate (GstBin *bin);

View file

@ -310,7 +310,8 @@ GstPad* gst_element_get_static_pad (GstElement *element, const gchar *name);
GstPad* gst_element_get_request_pad (GstElement *element, const gchar *name);
void gst_element_release_request_pad (GstElement *element, GstPad *pad);
const GList* gst_element_get_pad_list (GstElement *element);
G_CONST_RETURN GList*
gst_element_get_pad_list (GstElement *element);
GstPad* gst_element_get_compatible_pad (GstElement *element, GstPad *pad);
GstPad* gst_element_get_compatible_pad_filtered (GstElement *element, GstPad *pad,
const GstCaps2 *filtercaps);
@ -338,14 +339,17 @@ gboolean gst_element_link_pads_filtered (GstElement *src, const gchar *srcpadn
void gst_element_unlink_pads (GstElement *src, const gchar *srcpadname,
GstElement *dest, const gchar *destpadname);
const GstEventMask* gst_element_get_event_masks (GstElement *element);
G_CONST_RETURN GstEventMask*
gst_element_get_event_masks (GstElement *element);
gboolean gst_element_send_event (GstElement *element, GstEvent *event);
gboolean gst_element_seek (GstElement *element, GstSeekType seek_type,
guint64 offset);
const GstQueryType* gst_element_get_query_types (GstElement *element);
G_CONST_RETURN GstQueryType*
gst_element_get_query_types (GstElement *element);
gboolean gst_element_query (GstElement *element, GstQueryType type,
GstFormat *format, gint64 *value);
const GstFormat* gst_element_get_formats (GstElement *element);
G_CONST_RETURN GstFormat*
gst_element_get_formats (GstElement *element);
gboolean gst_element_convert (GstElement *element,
GstFormat src_format, gint64 src_value,
GstFormat *dest_format, gint64 *dest_value);
@ -367,7 +371,7 @@ GstElementStateReturn gst_element_set_state (GstElement *element, GstElementSta
void gst_element_wait_state_change (GstElement *element);
const gchar* gst_element_state_get_name (GstElementState state);
G_CONST_RETURN gchar* gst_element_state_get_name (GstElementState state);
GstElementFactory* gst_element_get_factory (GstElement *element);

View file

@ -86,9 +86,10 @@ GstFormat gst_format_get_by_nick (const gchar *nick);
gboolean gst_formats_contains (const GstFormat *formats, GstFormat format);
/* query for format details */
const GstFormatDefinition*
G_CONST_RETURN GstFormatDefinition*
gst_format_get_details (GstFormat format);
const GList* gst_format_get_definitions (void);
G_CONST_RETURN GList*
gst_format_get_definitions (void);
G_END_DECLS

View file

@ -180,7 +180,8 @@ void gst_debug_log_default (GstDebugCategory * category,
gchar * message,
gpointer unused) G_GNUC_NO_INSTRUMENT;
const gchar * gst_debug_level_get_name (GstDebugLevel level);
G_CONST_RETURN gchar *
gst_debug_level_get_name (GstDebugLevel level);
void gst_debug_add_log_function (GstLogFunction func,
gpointer data);
@ -268,9 +269,11 @@ void gst_debug_category_set_threshold (GstDebugCategory * category,
GstDebugLevel level);
void gst_debug_category_reset_threshold (GstDebugCategory * category);
GstDebugLevel gst_debug_category_get_threshold (GstDebugCategory * category);
const gchar * gst_debug_category_get_name (GstDebugCategory * category);
G_CONST_RETURN gchar *
gst_debug_category_get_name (GstDebugCategory * category);
guint gst_debug_category_get_color (GstDebugCategory * category);
const gchar * gst_debug_category_get_description (GstDebugCategory * category);
G_CONST_RETURN gchar *
gst_debug_category_get_description (GstDebugCategory * category);
GSList * gst_debug_get_all_categories (void);
gchar * gst_debug_construct_term_color (guint colorinfo);
@ -379,7 +382,8 @@ extern gboolean __gst_debug_enabled;
/********** function pointer stuff **********/
void* _gst_debug_register_funcptr (void * ptr,
gchar * ptrname);
const gchar* _gst_debug_nameof_funcptr (void * ptr);
G_CONST_RETURN gchar*
_gst_debug_nameof_funcptr (void * ptr);
#define GST_DEBUG_FUNCPTR(ptr) (_gst_debug_register_funcptr((void *)(ptr), #ptr) , ptr)
#define GST_DEBUG_FUNCPTR_NAME(ptr) _gst_debug_nameof_funcptr((void *)ptr)

View file

@ -125,7 +125,8 @@ GType gst_object_get_type (void);
/* name routines */
void gst_object_set_name (GstObject *object, const gchar *name);
const gchar* gst_object_get_name (GstObject *object);
G_CONST_RETURN gchar*
gst_object_get_name (GstObject *object);
/* parentage routines */
void gst_object_set_parent (GstObject *object, GstObject *parent);

View file

@ -425,7 +425,7 @@ GstPad* gst_pad_custom_new (GType type, const gchar *name, GstPadDirection d
GstPad* gst_pad_custom_new_from_template (GType type, GstPadTemplate *templ, const gchar *name);
void gst_pad_set_name (GstPad *pad, const gchar *name);
const gchar* gst_pad_get_name (GstPad *pad);
G_CONST_RETURN gchar* gst_pad_get_name (GstPad *pad);
GstPadDirection gst_pad_get_direction (GstPad *pad);
@ -455,8 +455,10 @@ void gst_pad_set_chain_function (GstPad *pad, GstPadChainFunction chain);
void gst_pad_set_get_function (GstPad *pad, GstPadGetFunction get);
void gst_pad_set_event_function (GstPad *pad, GstPadEventFunction event);
void gst_pad_set_event_mask_function (GstPad *pad, GstPadEventMaskFunction mask_func);
const GstEventMask* gst_pad_get_event_masks (GstPad *pad);
const GstEventMask* gst_pad_get_event_masks_default (GstPad *pad);
G_CONST_RETURN GstEventMask*
gst_pad_get_event_masks (GstPad *pad);
G_CONST_RETURN GstEventMask*
gst_pad_get_event_masks_default (GstPad *pad);
/* pad links */
void gst_pad_set_link_function (GstPad *pad, GstPadLinkFunction link);
@ -498,8 +500,10 @@ GstPad* gst_pad_selectv (GstPad *pad, ...);
/* convert/query/format functions */
void gst_pad_set_formats_function (GstPad *pad,
GstPadFormatsFunction formats);
const GstFormat* gst_pad_get_formats (GstPad *pad);
const GstFormat* gst_pad_get_formats_default (GstPad *pad);
G_CONST_RETURN GstFormat*
gst_pad_get_formats (GstPad *pad);
G_CONST_RETURN GstFormat*
gst_pad_get_formats_default (GstPad *pad);
void gst_pad_set_convert_function (GstPad *pad, GstPadConvertFunction convert);
gboolean gst_pad_convert (GstPad *pad,
@ -511,8 +515,10 @@ gboolean gst_pad_convert_default (GstPad *pad,
void gst_pad_set_query_function (GstPad *pad, GstPadQueryFunction query);
void gst_pad_set_query_type_function (GstPad *pad, GstPadQueryTypeFunction type_func);
const GstQueryType* gst_pad_get_query_types (GstPad *pad);
const GstQueryType* gst_pad_get_query_types_default (GstPad *pad);
G_CONST_RETURN GstQueryType*
gst_pad_get_query_types (GstPad *pad);
G_CONST_RETURN GstQueryType*
gst_pad_get_query_types_default (GstPad *pad);
gboolean gst_pad_query (GstPad *pad, GstQueryType type,
GstFormat *format, gint64 *value);
gboolean gst_pad_query_default (GstPad *pad, GstQueryType type,

View file

@ -86,9 +86,9 @@ GstQueryType gst_query_type_get_by_nick (const gchar *nick);
gboolean gst_query_types_contains (const GstQueryType *types, GstQueryType type);
/* query for query details */
const GstQueryTypeDefinition*
G_CONST_RETURN GstQueryTypeDefinition*
gst_query_type_get_details (GstQueryType type);
const GList* gst_query_type_get_definitions (void);
G_CONST_RETURN GList* gst_query_type_get_definitions (void);
G_END_DECLS

View file

@ -181,7 +181,7 @@ GstScheduler* gst_scheduler_factory_create (GstSchedulerFactory *factory, GstE
GstScheduler* gst_scheduler_factory_make (const gchar *name, GstElement *parent);
void gst_scheduler_factory_set_default_name (const gchar* name);
const gchar* gst_scheduler_factory_get_default_name (void);
G_CONST_RETURN gchar* gst_scheduler_factory_get_default_name (void);
G_END_DECLS

234
gst/gsttag.h Normal file
View file

@ -0,0 +1,234 @@
/* GStreamer
* Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
*
* gsttag.h: Header for tag support
*
* 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_TAG_H__
#define __GST_TAG_H__
#include <gst/gststructure.h>
#include <gst/gstevent.h>
G_BEGIN_DECLS
typedef enum {
GST_TAG_MERGE_UNDEFINED,
GST_TAG_MERGE_REPLACE_ALL,
GST_TAG_MERGE_REPLACE,
GST_TAG_MERGE_APPEND,
GST_TAG_MERGE_PREPEND,
GST_TAG_MERGE_KEEP,
GST_TAG_MERGE_KEEP_ALL,
/* add more */
GST_TAG_MERGE_COUNT
} GstTagMergeMode;
#define GST_TAG_MODE_IS_VALID(mode) (((mode) > GST_TAG_MERGE_UNDEFINED) && ((mode) < GST_TAG_MERGE_COUNT))
typedef GstStructure GstTagList;
#define GST_TAG_LIST(x) ((GstTagList *) (x))
#define GST_IS_TAG_LIST(x) (gst_is_tag_list (GST_TAG_LIST (x)))
typedef void (* GstTagForeachFunc) (const GstTagList *list, const gchar *tag, gpointer user_data);
typedef void (* GstTagMergeFunc) (GValue *dest, const GValue *src);
/* initialize tagging system */
void _gst_tag_initialize (void);
void gst_tag_register (gchar * name,
GType type,
gchar * nick,
gchar * blurb,
GstTagMergeFunc func);
/* some default merging functions */
void gst_tag_merge_use_first (GValue * dest,
const GValue * values);
void gst_tag_merge_strings_with_comma (GValue * dest,
const GValue * values);
/* basic tag support */
gboolean gst_tag_exists (const gchar * tag);
GType gst_tag_get_type (const gchar * tag);
G_CONST_RETURN gchar *
gst_tag_get_nick (const gchar * tag);
G_CONST_RETURN gchar *
gst_tag_get_description (const gchar * tag);
gboolean gst_tag_is_fixed (const gchar * tag);
/* tag lists */
GstTagList * gst_tag_list_new (void);
gboolean gst_is_tag_list (gconstpointer p);
GstTagList * gst_tag_list_copy (const GstTagList * list);
void gst_tag_list_insert (GstTagList * into,
const GstTagList * from,
GstTagMergeMode mode);
GstTagList * gst_tag_list_merge (const GstTagList * list1,
const GstTagList * list2,
GstTagMergeMode mode);
void gst_tag_list_free (GstTagList * list);
guint gst_tag_list_get_tag_size (const GstTagList * list,
const gchar * tag);
void gst_tag_list_add (GstTagList * list,
GstTagMergeMode mode,
const gchar * tag,
...);
void gst_tag_list_add_valist (GstTagList * list,
GstTagMergeMode mode,
const gchar * tag,
va_list var_args);
void gst_tag_list_remove_tag (GstTagList * list,
const gchar * tag);
void gst_tag_list_foreach (GstTagList * list,
GstTagForeachFunc func,
gpointer user_data);
G_CONST_RETURN GValue *
gst_tag_list_get_value_index (const GstTagList * list,
const gchar * tag,
guint index);
gboolean gst_tag_list_copy_value (GValue * dest,
const GstTagList * list,
const gchar * tag);
/* simplifications (FIXME: do we want them?) */
gboolean gst_tag_list_get_char (const GstTagList * list,
const gchar * tag,
gchar * value);
gboolean gst_tag_list_get_char_index (const GstTagList * list,
const gchar * tag,
guint index,
gchar * value);
gboolean gst_tag_list_get_uchar (const GstTagList * list,
const gchar * tag,
guchar * value);
gboolean gst_tag_list_get_uchar_index (const GstTagList * list,
const gchar * tag,
guint index,
guchar * value);
gboolean gst_tag_list_get_boolean (const GstTagList * list,
const gchar * tag,
gboolean * value);
gboolean gst_tag_list_get_boolean_index (const GstTagList * list,
const gchar * tag,
guint index,
gboolean * value);
gboolean gst_tag_list_get_int (const GstTagList * list,
const gchar * tag,
gint * value);
gboolean gst_tag_list_get_int_index (const GstTagList * list,
const gchar * tag,
guint index,
gint * value);
gboolean gst_tag_list_get_uint (const GstTagList * list,
const gchar * tag,
guint * value);
gboolean gst_tag_list_get_uint_index (const GstTagList * list,
const gchar * tag,
guint index,
guint * value);
gboolean gst_tag_list_get_long (const GstTagList * list,
const gchar * tag,
glong * value);
gboolean gst_tag_list_get_long_index (const GstTagList * list,
const gchar * tag,
guint index,
glong * value);
gboolean gst_tag_list_get_ulong (const GstTagList * list,
const gchar * tag,
gulong * value);
gboolean gst_tag_list_get_ulong_index (const GstTagList * list,
const gchar * tag,
guint index,
gulong * value);
gboolean gst_tag_list_get_int64 (const GstTagList * list,
const gchar * tag,
gint64 * value);
gboolean gst_tag_list_get_int64_index (const GstTagList * list,
const gchar * tag,
guint index,
gint64 * value);
gboolean gst_tag_list_get_uint64 (const GstTagList * list,
const gchar * tag,
guint64 * value);
gboolean gst_tag_list_get_uint64_index (const GstTagList * list,
const gchar * tag,
guint index,
guint64 * value);
gboolean gst_tag_list_get_float (const GstTagList * list,
const gchar * tag,
gfloat * value);
gboolean gst_tag_list_get_float_index (const GstTagList * list,
const gchar * tag,
guint index,
gfloat * value);
gboolean gst_tag_list_get_double (const GstTagList * list,
const gchar * tag,
gdouble * value);
gboolean gst_tag_list_get_double_index (const GstTagList * list,
const gchar * tag,
guint index,
gdouble * value);
gboolean gst_tag_list_get_string (const GstTagList * list,
const gchar * tag,
gchar ** value);
gboolean gst_tag_list_get_string_index (const GstTagList * list,
const gchar * tag,
guint index,
gchar ** value);
gboolean gst_tag_list_get_pointer (const GstTagList * list,
const gchar * tag,
gpointer * value);
gboolean gst_tag_list_get_pointer_index (const GstTagList * list,
const gchar * tag,
guint index,
gpointer * value);
/* tag events */
GstEvent * gst_event_new_tag (GstTagList * list);
GstTagList * gst_event_tag_get_list (GstEvent * tag_event);
/* GStreamer core tags (need to be discussed) */
#define GST_TAG_TITLE "title"
#define GST_TAG_ARTIST "artist"
#define GST_TAG_ALBUM "album"
#define GST_TAG_DATE "date"
#define GST_TAG_GENRE "genre"
#define GST_TAG_COMMENT "comment"
#define GST_TAG_TRACK_NUMBER "track-number"
#define GST_TAG_TRACK_COUNT "track-count"
#define GST_TAG_LOCATION "location"
#define GST_TAG_DESCRIPTION "description"
#define GST_TAG_VERSION "version"
#define GST_TAG_ISRC "isrc"
#define GST_TAG_ORGANIZATION "organization"
#define GST_TAG_COPYRIGHT "copyright"
#define GST_TAG_CONTACT "contact"
#define GST_TAG_LICENSE "license"
#define GST_TAG_PERFORMER "performer"
#define GST_TAG_DURATION "duration"
#define GST_TAG_CODEC "codec"
#define GST_TAG_BITRATE "bitrate"
#define GST_TAG_MINIMUM_BITRATE "minimum-bitrate"
#define GST_TAG_MAXIMUM_BITRATE "maximum-bitrate"
G_END_DECLS
#endif /* __GST_EVENT_H__ */

71
gst/gsttaginterface.h Normal file
View file

@ -0,0 +1,71 @@
/* GStreamer
* Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
*
* gsttaginterface.h: Interfaces for tagging
*
* 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_TAG_INTERFACE_H__
#define __GST_TAG_INTERFACE_H__
#include <gst/gst.h>
G_BEGIN_DECLS
#define GST_TYPE_TAG_SETTER (gst_tag_setter_get_type ())
#define GST_TAG_SETTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TAG_SETTER, GstTagSetter))
#define GST_TAG_SETTER_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), GST_TYPE_TAG_SETTER, GstTagSetter))
#define GST_IS_TAG_SETTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TAG_SETTER))
#define GST_TAG_SETTER_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GST_TYPE_TAG_SETTER, GstTagSetterIFace))
typedef struct _GstTagSetter GstTagSetter; /* Dummy typedef */
typedef struct _GstTagSetterIFace GstTagSetterIFace;
/* use an empty interface here to allow detection of elements using user-set
tags */
struct _GstTagSetterIFace
{
GTypeInterface g_iface;
/* signals */
/* virtual table */
};
GType gst_tag_setter_get_type (void) G_GNUC_CONST;
void gst_tag_setter_merge (GstTagSetter * setter,
const GstTagList * list,
GstTagMergeMode mode);
void gst_tag_setter_add (GstTagSetter * setter,
GstTagMergeMode mode,
const gchar * tag,
...);
void gst_tag_setter_add_valist (GstTagSetter * setter,
GstTagMergeMode mode,
const gchar * tag,
va_list var_args);
G_CONST_RETURN GstTagList *
gst_tag_setter_get_list (GstTagSetter * setter);
void gst_tag_setter_set_merge_mode (GstTagSetter * setter,
GstTagMergeMode mode);
GstTagMergeMode gst_tag_setter_get_merge_mode (GstTagSetter * setter);
G_END_DECLS
#endif /* __GST_TAG_INTERFACE_H__ */

234
gst/gsttaglist.h Normal file
View file

@ -0,0 +1,234 @@
/* GStreamer
* Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
*
* gsttag.h: Header for tag support
*
* 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_TAG_H__
#define __GST_TAG_H__
#include <gst/gststructure.h>
#include <gst/gstevent.h>
G_BEGIN_DECLS
typedef enum {
GST_TAG_MERGE_UNDEFINED,
GST_TAG_MERGE_REPLACE_ALL,
GST_TAG_MERGE_REPLACE,
GST_TAG_MERGE_APPEND,
GST_TAG_MERGE_PREPEND,
GST_TAG_MERGE_KEEP,
GST_TAG_MERGE_KEEP_ALL,
/* add more */
GST_TAG_MERGE_COUNT
} GstTagMergeMode;
#define GST_TAG_MODE_IS_VALID(mode) (((mode) > GST_TAG_MERGE_UNDEFINED) && ((mode) < GST_TAG_MERGE_COUNT))
typedef GstStructure GstTagList;
#define GST_TAG_LIST(x) ((GstTagList *) (x))
#define GST_IS_TAG_LIST(x) (gst_is_tag_list (GST_TAG_LIST (x)))
typedef void (* GstTagForeachFunc) (const GstTagList *list, const gchar *tag, gpointer user_data);
typedef void (* GstTagMergeFunc) (GValue *dest, const GValue *src);
/* initialize tagging system */
void _gst_tag_initialize (void);
void gst_tag_register (gchar * name,
GType type,
gchar * nick,
gchar * blurb,
GstTagMergeFunc func);
/* some default merging functions */
void gst_tag_merge_use_first (GValue * dest,
const GValue * values);
void gst_tag_merge_strings_with_comma (GValue * dest,
const GValue * values);
/* basic tag support */
gboolean gst_tag_exists (const gchar * tag);
GType gst_tag_get_type (const gchar * tag);
G_CONST_RETURN gchar *
gst_tag_get_nick (const gchar * tag);
G_CONST_RETURN gchar *
gst_tag_get_description (const gchar * tag);
gboolean gst_tag_is_fixed (const gchar * tag);
/* tag lists */
GstTagList * gst_tag_list_new (void);
gboolean gst_is_tag_list (gconstpointer p);
GstTagList * gst_tag_list_copy (const GstTagList * list);
void gst_tag_list_insert (GstTagList * into,
const GstTagList * from,
GstTagMergeMode mode);
GstTagList * gst_tag_list_merge (const GstTagList * list1,
const GstTagList * list2,
GstTagMergeMode mode);
void gst_tag_list_free (GstTagList * list);
guint gst_tag_list_get_tag_size (const GstTagList * list,
const gchar * tag);
void gst_tag_list_add (GstTagList * list,
GstTagMergeMode mode,
const gchar * tag,
...);
void gst_tag_list_add_valist (GstTagList * list,
GstTagMergeMode mode,
const gchar * tag,
va_list var_args);
void gst_tag_list_remove_tag (GstTagList * list,
const gchar * tag);
void gst_tag_list_foreach (GstTagList * list,
GstTagForeachFunc func,
gpointer user_data);
G_CONST_RETURN GValue *
gst_tag_list_get_value_index (const GstTagList * list,
const gchar * tag,
guint index);
gboolean gst_tag_list_copy_value (GValue * dest,
const GstTagList * list,
const gchar * tag);
/* simplifications (FIXME: do we want them?) */
gboolean gst_tag_list_get_char (const GstTagList * list,
const gchar * tag,
gchar * value);
gboolean gst_tag_list_get_char_index (const GstTagList * list,
const gchar * tag,
guint index,
gchar * value);
gboolean gst_tag_list_get_uchar (const GstTagList * list,
const gchar * tag,
guchar * value);
gboolean gst_tag_list_get_uchar_index (const GstTagList * list,
const gchar * tag,
guint index,
guchar * value);
gboolean gst_tag_list_get_boolean (const GstTagList * list,
const gchar * tag,
gboolean * value);
gboolean gst_tag_list_get_boolean_index (const GstTagList * list,
const gchar * tag,
guint index,
gboolean * value);
gboolean gst_tag_list_get_int (const GstTagList * list,
const gchar * tag,
gint * value);
gboolean gst_tag_list_get_int_index (const GstTagList * list,
const gchar * tag,
guint index,
gint * value);
gboolean gst_tag_list_get_uint (const GstTagList * list,
const gchar * tag,
guint * value);
gboolean gst_tag_list_get_uint_index (const GstTagList * list,
const gchar * tag,
guint index,
guint * value);
gboolean gst_tag_list_get_long (const GstTagList * list,
const gchar * tag,
glong * value);
gboolean gst_tag_list_get_long_index (const GstTagList * list,
const gchar * tag,
guint index,
glong * value);
gboolean gst_tag_list_get_ulong (const GstTagList * list,
const gchar * tag,
gulong * value);
gboolean gst_tag_list_get_ulong_index (const GstTagList * list,
const gchar * tag,
guint index,
gulong * value);
gboolean gst_tag_list_get_int64 (const GstTagList * list,
const gchar * tag,
gint64 * value);
gboolean gst_tag_list_get_int64_index (const GstTagList * list,
const gchar * tag,
guint index,
gint64 * value);
gboolean gst_tag_list_get_uint64 (const GstTagList * list,
const gchar * tag,
guint64 * value);
gboolean gst_tag_list_get_uint64_index (const GstTagList * list,
const gchar * tag,
guint index,
guint64 * value);
gboolean gst_tag_list_get_float (const GstTagList * list,
const gchar * tag,
gfloat * value);
gboolean gst_tag_list_get_float_index (const GstTagList * list,
const gchar * tag,
guint index,
gfloat * value);
gboolean gst_tag_list_get_double (const GstTagList * list,
const gchar * tag,
gdouble * value);
gboolean gst_tag_list_get_double_index (const GstTagList * list,
const gchar * tag,
guint index,
gdouble * value);
gboolean gst_tag_list_get_string (const GstTagList * list,
const gchar * tag,
gchar ** value);
gboolean gst_tag_list_get_string_index (const GstTagList * list,
const gchar * tag,
guint index,
gchar ** value);
gboolean gst_tag_list_get_pointer (const GstTagList * list,
const gchar * tag,
gpointer * value);
gboolean gst_tag_list_get_pointer_index (const GstTagList * list,
const gchar * tag,
guint index,
gpointer * value);
/* tag events */
GstEvent * gst_event_new_tag (GstTagList * list);
GstTagList * gst_event_tag_get_list (GstEvent * tag_event);
/* GStreamer core tags (need to be discussed) */
#define GST_TAG_TITLE "title"
#define GST_TAG_ARTIST "artist"
#define GST_TAG_ALBUM "album"
#define GST_TAG_DATE "date"
#define GST_TAG_GENRE "genre"
#define GST_TAG_COMMENT "comment"
#define GST_TAG_TRACK_NUMBER "track-number"
#define GST_TAG_TRACK_COUNT "track-count"
#define GST_TAG_LOCATION "location"
#define GST_TAG_DESCRIPTION "description"
#define GST_TAG_VERSION "version"
#define GST_TAG_ISRC "isrc"
#define GST_TAG_ORGANIZATION "organization"
#define GST_TAG_COPYRIGHT "copyright"
#define GST_TAG_CONTACT "contact"
#define GST_TAG_LICENSE "license"
#define GST_TAG_PERFORMER "performer"
#define GST_TAG_DURATION "duration"
#define GST_TAG_CODEC "codec"
#define GST_TAG_BITRATE "bitrate"
#define GST_TAG_MINIMUM_BITRATE "minimum-bitrate"
#define GST_TAG_MAXIMUM_BITRATE "maximum-bitrate"
G_END_DECLS
#endif /* __GST_EVENT_H__ */

71
gst/gsttagsetter.h Normal file
View file

@ -0,0 +1,71 @@
/* GStreamer
* Copyright (C) 2003 Benjamin Otte <in7y118@public.uni-hamburg.de>
*
* gsttaginterface.h: Interfaces for tagging
*
* 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_TAG_INTERFACE_H__
#define __GST_TAG_INTERFACE_H__
#include <gst/gst.h>
G_BEGIN_DECLS
#define GST_TYPE_TAG_SETTER (gst_tag_setter_get_type ())
#define GST_TAG_SETTER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TAG_SETTER, GstTagSetter))
#define GST_TAG_SETTER_CLASS(obj) (G_TYPE_CHECK_CLASS_CAST ((obj), GST_TYPE_TAG_SETTER, GstTagSetter))
#define GST_IS_TAG_SETTER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TAG_SETTER))
#define GST_TAG_SETTER_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), GST_TYPE_TAG_SETTER, GstTagSetterIFace))
typedef struct _GstTagSetter GstTagSetter; /* Dummy typedef */
typedef struct _GstTagSetterIFace GstTagSetterIFace;
/* use an empty interface here to allow detection of elements using user-set
tags */
struct _GstTagSetterIFace
{
GTypeInterface g_iface;
/* signals */
/* virtual table */
};
GType gst_tag_setter_get_type (void) G_GNUC_CONST;
void gst_tag_setter_merge (GstTagSetter * setter,
const GstTagList * list,
GstTagMergeMode mode);
void gst_tag_setter_add (GstTagSetter * setter,
GstTagMergeMode mode,
const gchar * tag,
...);
void gst_tag_setter_add_valist (GstTagSetter * setter,
GstTagMergeMode mode,
const gchar * tag,
va_list var_args);
G_CONST_RETURN GstTagList *
gst_tag_setter_get_list (GstTagSetter * setter);
void gst_tag_setter_set_merge_mode (GstTagSetter * setter,
GstTagMergeMode mode);
GstTagMergeMode gst_tag_setter_get_merge_mode (GstTagSetter * setter);
G_END_DECLS
#endif /* __GST_TAG_INTERFACE_H__ */

View file

@ -86,7 +86,7 @@ struct _GstAllocTrace {
};
gboolean gst_alloc_trace_available (void);
const GList* gst_alloc_trace_list (void);
G_CONST_RETURN GList* gst_alloc_trace_list (void);
GstAllocTrace* _gst_alloc_trace_register (const gchar *name);
int gst_alloc_trace_live_all (void);

View file

@ -74,13 +74,13 @@ void gst_value_set_double_range (GValue *value, double start, double end);
double gst_value_get_double_range_min (const GValue *value);
double gst_value_get_double_range_max (const GValue *value);
const GstCaps2 *gst_value_get_caps (const GValue *value);
G_CONST_RETURN GstCaps2 *gst_value_get_caps (const GValue *value);
void gst_value_set_caps (GValue *calue, const GstCaps2 *caps);
void gst_value_list_prepend_value (GValue *value, const GValue *prepend_value);
void gst_value_list_append_value (GValue *value, const GValue *prepend_value);
guint gst_value_list_get_size (const GValue *value);
const GValue *gst_value_list_get_value (const GValue *value, guint index);
G_CONST_RETURN GValue *gst_value_list_get_value (const GValue *value, guint index);
void gst_value_list_concat (GValue *dest, const GValue *value1, const GValue *value2);
void _gst_value_initialize (void);

View file

@ -795,23 +795,6 @@ gst_xml_registry_parse_scheduler_factory (GMarkupParseContext *context, const gc
return TRUE;
}
#if 0
static gboolean
gst_xml_registry_parse_autoplug_factory (GMarkupParseContext *context, const gchar *tag, const gchar *text,
gsize text_len, GstXMLRegistry *registry, GError **error)
{
GstAutoplugFactory *factory = GST_AUTOPLUG_FACTORY (registry->current_feature);
if (!strcmp (tag, "name")) {
registry->current_feature->name = g_strndup (text, text_len);
}
else if (!strcmp (tag, "longdesc")) {
factory->longdesc = g_strndup (text, text_len);
}
return TRUE;
}
#endif
static gboolean
gst_xml_registry_parse_index_factory (GMarkupParseContext *context, const gchar *tag, const gchar *text,
gsize text_len, GstXMLRegistry *registry, GError **error)
@ -937,11 +920,6 @@ gst_xml_registry_start_element (GMarkupParseContext *context,
xmlregistry->parser = gst_xml_registry_parse_scheduler_factory;
GST_SCHEDULER_FACTORY (feature)->type = 0;
}
#if 0
else if (GST_IS_AUTOPLUG_FACTORY (feature)) {
xmlregistry->parser = gst_xml_registry_parse_autoplug_factory;
}
#endif
else if (GST_IS_INDEX_FACTORY (feature)) {
xmlregistry->parser = gst_xml_registry_parse_index_factory;
}
@ -1539,11 +1517,6 @@ gst_xml_registry_save_feature (GstXMLRegistry *xmlregistry, GstPluginFeature *fe
else if (GST_IS_SCHEDULER_FACTORY (feature)) {
PUT_ESCAPED ("longdesc", GST_SCHEDULER_FACTORY (feature)->longdesc);
}
#if 0
else if (GST_IS_AUTOPLUG_FACTORY (feature)) {
PUT_ESCAPED ("longdesc", GST_AUTOPLUG_FACTORY (feature)->longdesc);
}
#endif
else if (GST_IS_INDEX_FACTORY (feature)) {
PUT_ESCAPED ("longdesc", GST_INDEX_FACTORY (feature)->longdesc);
}

View file

@ -182,7 +182,7 @@ gst_aggregator_request_new_pad (GstElement *element, GstPadTemplate *templ, cons
g_return_val_if_fail (GST_IS_AGGREGATOR (element), NULL);
if (templ->direction != GST_PAD_SINK) {
g_warning ("gstaggregator: request new pad that is not a SRC pad\n");
g_warning ("gstaggregator: request new pad that is not a sink pad\n");
return NULL;
}

6
po/.gitignore vendored Normal file
View file

@ -0,0 +1,6 @@
*.gmo
remove-potcdate.sed
stamp-po
POTFILES
cat-id-tbl.c
gstreamer-0.7.pot

View file

@ -1,6 +1,6 @@
include ../Rules
tests_pass = commandline category global
tests_pass = commandline category output
tests_fail =
tests_inconsistent = global

View file

@ -1,6 +1,6 @@
include ../Rules
tests_pass = commandline category global
tests_pass = commandline category output
tests_fail =
tests_inconsistent = global