mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-06-08 17:19:25 +00:00
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:
parent
3ce2f5c215
commit
f84d9ae2da
|
@ -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)
|
||||
|
|
|
@ -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' ; \
|
||||
|
|
|
@ -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' ; \
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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
|
||||
)
|
||||
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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);
|
||||
|
|
20
gst/gstpad.h
20
gst/gstpad.h
|
@ -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,
|
||||
|
|
|
@ -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
|
||||
|
||||
|
|
|
@ -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
234
gst/gsttag.h
Normal 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
71
gst/gsttaginterface.h
Normal 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
234
gst/gsttaglist.h
Normal 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
71
gst/gsttagsetter.h
Normal 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__ */
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
6
po/.gitignore
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
*.gmo
|
||||
remove-potcdate.sed
|
||||
stamp-po
|
||||
POTFILES
|
||||
cat-id-tbl.c
|
||||
gstreamer-0.7.pot
|
|
@ -1,6 +1,6 @@
|
|||
include ../Rules
|
||||
|
||||
tests_pass = commandline category global
|
||||
tests_pass = commandline category output
|
||||
tests_fail =
|
||||
|
||||
tests_inconsistent = global
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
include ../Rules
|
||||
|
||||
tests_pass = commandline category global
|
||||
tests_pass = commandline category output
|
||||
tests_fail =
|
||||
|
||||
tests_inconsistent = global
|
||||
|
|
Loading…
Reference in a new issue