diff --git a/docs/gst/gstreamer-decl.txt b/docs/gst/gstreamer-decl.txt
index b573634bea..ed9e8a2517 100644
--- a/docs/gst/gstreamer-decl.txt
+++ b/docs/gst/gstreamer-decl.txt
@@ -71,6 +71,11 @@ cothread_context *ctx
cothread_state *thread, cothread_func func,int argc, char **argv
+cothread_getcurrent
+int
+void
+
+
cothread_switch
void
cothread_state *thread
@@ -105,14 +110,6 @@ void
void
void
-
-DEBUG
-#define DEBUG(format, args...) g_print("DEBUG:(%d) " format, getpid() , ##args)
-
-
-DEBUG
-#define DEBUG(format, args...)
-
gst_bin_details
extern GstElementDetails gst_bin_details;
@@ -164,6 +161,7 @@ struct GstBin {
cothread_context *threadcontext;
gboolean use_cothreads;
+ GList *outside_schedules;
};
@@ -506,11 +504,6 @@ void
GstElement *
gchar *name
-
-gst_connection_push
-void
-GstConnection *connection
-
GstElementState
typedef enum {
@@ -568,15 +561,22 @@ typedef enum {
GST_ELEMENT_MULTI_IN = (1 << 4),
GST_ELEMENT_THREAD_SUGGESTED = (1 << 5),
GST_ELEMENT_NO_SEEK = (1 << 6),
+
+ GST_ELEMENT_NEW_LOOPFUNC = (1 << 16),
+ GST_ELEMENT_COTHREAD_STOPPING = (1 << 17),
} GstElementFlags;
GST_ELEMENT_IS_MULTI_IN
-#define GST_ELEMENT_IS_MULTI_IN(obj) (GST_FLAGS(obj) & GST_ELEMENT_MULTI_IN)
+#define GST_ELEMENT_IS_MULTI_IN(obj) (GST_FLAG_IS_SET(obj,GST_ELEMENT_MULTI_IN))
GST_ELEMENT_IS_THREAD_SUGGESTED
-#define GST_ELEMENT_IS_THREAD_SUGGESTED(obj) (GST_FLAGS(obj) & GST_ELEMENT_THREAD_SUGGESTED)
+#define GST_ELEMENT_IS_THREAD_SUGGESTED(obj) (GST_FLAG_IS_SET(obj,GST_ELEMENT_THREAD_SUGGESTED))
+
+
+GST_ELEMENT_IS_COTHREAD_STOPPING
+#define GST_ELEMENT_IS_COTHREAD_STOPPING(obj) (GST_FLAG_IS_SET(obj,GST_ELEMENT_COTHREAD_STOPPING))
GstElement
@@ -618,7 +618,7 @@ struct GstElement {
GstElementDetails
struct GstElementDetails {
gchar *longname; /* long, english name */
- gchar *class; /* type of element, kinda */
+ gchar *klass; /* type of element, kinda */
gchar *description; /* insights of one form or another */
gchar *version; /* version of the element */
gchar *author; /* who wrote this thing? */
@@ -633,8 +633,7 @@ struct GstElementFactory {
GstElementDetails *details; /* pointer to details struct */
- GList *src_types;
- GList *sink_types;
+ GList *padfactories;
};
@@ -742,14 +741,14 @@ gchar *name,GtkType type,GstElementDetails *details
GstElementFactory *elementfactory
-gst_elementfactory_add_src
+gst_elementfactory_unregister
void
-GstElementFactory *elementfactory, guint16 id
+GstElementFactory *elementfactory
-gst_elementfactory_add_sink
+gst_elementfactory_add_pad
void
-GstElementFactory *elementfactory, guint16 id
+GstElementFactory *elementfactory,GstPadFactory *pad
gst_elementfactory_find
@@ -1053,11 +1052,11 @@ GstObject *object
GST_PAD_CONNECTED
-#define GST_PAD_CONNECTED(pad) (pad && (pad)->peer != NULL)
+#define GST_PAD_CONNECTED(pad) ((pad) && (pad)->peer != NULL)
GST_PAD_CAN_PULL
-#define GST_PAD_CAN_PULL(pad) (pad && (pad)->pullfunc != NULL)
+#define GST_PAD_CAN_PULL(pad) ((pad) && (pad)->pullfunc != NULL)
GstPad
@@ -1098,13 +1097,21 @@ typedef enum {
GST_PAD_SINK,
} GstPadDirection;
+
+GstPadFlags
+typedef enum {
+ GST_PAD_DISABLED = (1 << 4),
+} GstPadFlags;
+
GstPad
struct GstPad {
GstObject object;
gchar *name;
- guint16 type;
+ GstCaps *caps;
+
+ cothread_state *threadstate;
GstPadDirection direction;
@@ -1113,15 +1120,35 @@ struct GstPad {
GstBuffer *bufpen;
GstPadChainFunction chainfunc;
+ GstPadPushFunction pushfunc;
GstPadPullFunction pullfunc;
GstPadPullRegionFunction pullregionfunc;
- GstPadPushFunction pushfunc;
GstPadQoSFunction qosfunc;
GstObject *parent;
GList *ghostparents;
};
+
+GstPadPresence
+typedef enum {
+ GST_PAD_ALWAYS,
+ GST_PAD_SOMETIMES,
+} GstPadPresence;
+
+
+GstPadFactory
+
+
+GstPadFactory
+struct GstPadFactory {
+ gchar *nametemplate;
+ GstCapsFactory *caps;
+ GstPadDirection direction;
+ GstPadPresence presence;
+ gpointer priv;
+};
+
gst_pad_get_type
GtkType
@@ -1152,19 +1179,24 @@ GstPad *pad, GstPadChainFunction chain
GstPad *pad, GstPadPullFunction pull
+gst_pad_set_pullregion_function
+void
+GstPad *pad, GstPadPullRegionFunction pullregion
+
+
gst_pad_set_qos_function
void
GstPad *pad, GstPadQoSFunction qos
-gst_pad_get_type_id
-guint16
-GstPad *pad
+gst_pad_set_caps
+void
+GstPad *pad, GstCaps *caps
-gst_pad_set_type_id
-void
-GstPad *pad, guint16 id
+gst_pad_get_caps
+GstCaps *
+GstPad *pad
gst_pad_set_name
@@ -1246,6 +1278,26 @@ GstPad *pad, xmlNodePtr parent
void
xmlNodePtr parent, GstObject *element, GHashTable *elements
+
+gst_padfactory_create
+GstPad *
+GstPadFactory *factory, gchar *name
+
+
+gst_padfactory_get_caps
+GstCaps *
+GstPadFactory *factory
+
+
+gst_padfactory_save_thyself
+xmlNodePtr
+GstPadFactory *pad, xmlNodePtr parent
+
+
+gst_padfactory_load_thyself
+GstPadFactory *
+xmlNodePtr parent
+
gst_pipeline_details
extern GstElementDetails gst_pipeline_details;
@@ -1354,6 +1406,11 @@ GModule *module
gchar *name
+gst_plugin_set_longname
+void
+GstPlugin *plugin, gchar *longname
+
+
gst_plugin_load_all
void
void
@@ -1364,19 +1421,14 @@ void
gchar *name
-gst_library_load
-gboolean
-gchar *name
-
-
gst_plugin_load_absolute
gboolean
gchar *name
-gst_plugin_set_longname
-void
-GstPlugin *plugin, gchar *longname
+gst_library_load
+gboolean
+gchar *name
gst_plugin_add_factory
@@ -1520,8 +1572,8 @@ typedef enum {
GstSrc
struct GstSrc {
- GstElement element;
- gint32 flags;
+ GstElement element;
+ gint32 flags;
};
@@ -1540,16 +1592,6 @@ struct GstSrc {
void
-gst_src_push
-void
-GstSrc *src
-
-
-gst_src_push_region
-void
-GstSrc *src, gulong offset, gulong size
-
-
gst_src_signal_eos
void
GstSrc *src
@@ -1778,7 +1820,7 @@ struct GstType {
gchar *mime; /* MIME type */
gchar *exts; /* space-delimited list of extensions */
- GstTypeFindFunc typefindfunc; /* typefind function */
+ GSList *typefindfuncs; /* typefind functions */
GList *srcs; /* list of src objects for this type */
GList *sinks; /* list of sink objects for type */
@@ -1812,16 +1854,6 @@ gchar *mime
gchar *ext
-gst_type_add_src
-void
-guint16 id, GstElementFactory *src
-
-
-gst_type_add_sink
-void
-guint16 id, GstElementFactory *sink
-
-
gst_type_get_srcs
GList *
guint16 id
@@ -1970,6 +2002,56 @@ const guchar *fname, const guchar *root
GstElement *
GstXML *xml, const guchar *name
+
+GstCaps
+
+
+GstCapsFactoryEntry
+typedef gpointer GstCapsFactoryEntry;
+
+
+GstCapsFactory[]
+typedef GstCapsFactoryEntry GstCapsFactory[];
+
+
+GstCapsListFactory[]
+typedef GstCapsFactory *GstCapsListFactory[];
+
+
+GstCapsDefinition
+typedef enum {
+ GST_CAPS_ALWAYS = 1,
+ GST_CAPS_MAYBE = 2,
+} GstCapsDefinition;
+
+
+GstCaps
+struct GstCaps {
+ guint16 id; /* type id (major type) */
+
+ GstProps *properties; /* properties for this capability */
+};
+
+
+gst_caps_register
+GstCaps *
+GstCapsFactory *factory
+
+
+gst_caps_check_compatibility
+gboolean
+GstCaps *caps1, GstCaps *caps2
+
+
+gst_caps_save_thyself
+xmlNodePtr
+GstCaps *caps, xmlNodePtr parent
+
+
+gst_caps_load_thyself
+GstCaps *
+xmlNodePtr parent
+
GST_BUFFER_POOL
#define GST_BUFFER_POOL(buf) \
@@ -2092,6 +2174,198 @@ void
void
+GST_DEBUG_ENABLED
+#define GST_DEBUG_ENABLED
+
+
+GST_DEBUG_PREFIX
+#define GST_DEBUG_PREFIX(format,args...) \
+"DEBUG(%d:%d)" __PRETTY_FUNCTION__ ":%d" format , getpid() , cothread_getcurrent() , __LINE__ , ## args
+
+
+_debug_function_f
+void
+
+
+
+DEBUG
+#define DEBUG(format,args...) \
+ (_debug_string != NULL) ? \
+ fprintf(stderr,GST_DEBUG_PREFIX("%s: "format , _debug_string , ## args )) : \
+ fprintf(stderr,GST_DEBUG_PREFIX(": "format , ## args ))
+
+
+DEBUG_ENTER
+#define DEBUG_ENTER(format, args...) \
+ fprintf(stderr,GST_DEBUG_PREFIX(format": entering\n" , ## args ))
+
+
+DEBUG_SET_STRING
+#define DEBUG_SET_STRING(format, args...) \
+ gchar *_debug_string = g_strdup_printf(format , ## args )
+
+
+DEBUG_ENTER_STRING
+#define DEBUG_ENTER_STRING DEBUG_ENTER("%s",_debug_string)
+
+
+DEBUG_LEAVE
+#define DEBUG_LEAVE(format, args...) \
+ if (_debug_string != NULL) g_free(_debug_string),\
+ fprintf(stderr,GST_DEBUG_PREFIX(format": leaving\n" , ## args ))
+
+
+DEBUG_LEAVE_STRING
+#define DEBUG_LEAVE_STRING DEBUG_LEAVE("%s",_debug_string)
+
+
+DEBUG
+#define DEBUG(format, args...)
+
+
+DEBUG_ENTER
+#define DEBUG_ENTER(format, args...)
+
+
+DEBUG_LEAVE
+#define DEBUG_LEAVE(format, args...)
+
+
+DEBUG_SET_STRING
+#define DEBUG_SET_STRING(format, args...)
+
+
+DEBUG_ENTER_STRING
+#define DEBUG_ENTER_STRING
+
+
+GST_DEBUG_PAD_NAME
+#define GST_DEBUG_PAD_NAME(pad) \
+ ((pad)->parent != NULL) ? gst_element_get_name(GST_ELEMENT((pad)->parent)) : "''", gst_pad_get_name(pad)
+
+
+GstProps
+
+
+GstPropsFactoryEntry
+typedef gpointer GstPropsFactoryEntry;
+
+
+GstPropsFactory[]
+typedef GstPropsFactoryEntry GstPropsFactory[];
+
+
+GstPropsListFactory[]
+typedef GstPropsFactory *GstPropsListFactory[];
+
+
+GstPropsId
+typedef enum {
+ GST_PROPS_END_ID_NUM = 0,
+ GST_PROPS_LIST_ID_NUM,
+ GST_PROPS_INT_ID_NUM,
+ GST_PROPS_INT_RANGE_ID_NUM,
+ GST_PROPS_FOURCC_ID_NUM,
+ GST_PROPS_BOOL_ID_NUM,
+} GstPropsId;
+
+
+GST_PROPS_LIST_ID
+#define GST_PROPS_LIST_ID GINT_TO_POINTER(GST_PROPS_LIST_ID_NUM)
+
+
+GST_PROPS_INT_ID
+#define GST_PROPS_INT_ID GINT_TO_POINTER(GST_PROPS_INT_ID_NUM)
+
+
+GST_PROPS_INT_RANGE_ID
+#define GST_PROPS_INT_RANGE_ID GINT_TO_POINTER(GST_PROPS_INT_RANGE_ID_NUM)
+
+
+GST_PROPS_FOURCC_ID
+#define GST_PROPS_FOURCC_ID GINT_TO_POINTER(GST_PROPS_FOURCC_ID_NUM)
+
+
+GST_PROPS_BOOL_ID
+#define GST_PROPS_BOOL_ID GINT_TO_POINTER(GST_PROPS_BOOL_ID_NUM)
+
+
+GST_PROPS_LIST
+#define GST_PROPS_LIST(a...) GST_PROPS_LIST_ID,##a,NULL
+
+
+GST_PROPS_INT
+#define GST_PROPS_INT(a) GST_PROPS_INT_ID,(GINT_TO_POINTER(a))
+
+
+GST_PROPS_INT_RANGE
+#define GST_PROPS_INT_RANGE(a,b) GST_PROPS_INT_RANGE_ID,(GINT_TO_POINTER(a)),(GINT_TO_POINTER(b))
+
+
+GST_PROPS_FOURCC
+#define GST_PROPS_FOURCC(a,b,c,d) GST_PROPS_FOURCC_ID,(GINT_TO_POINTER((a)|(b)<<8|(c)<<16|(d)<<24))
+
+
+GST_PROPS_FOURCC_INT
+#define GST_PROPS_FOURCC_INT(a) GST_PROPS_FOURCC_ID,(GINT_TO_POINTER(a))
+
+
+GST_PROPS_BOOLEAN
+#define GST_PROPS_BOOLEAN(a) GST_PROPS_BOOL_ID,(GINT_TO_POINTER(a))
+
+
+GstProps
+struct GstProps {
+ GSList *properties; /* properties for this capability */
+};
+
+
+gst_props_register
+GstProps *
+GstPropsFactory factory
+
+
+gst_props_check_compatibility
+gboolean
+GstProps *props1, GstProps *props2
+
+
+gst_props_save_thyself
+xmlNodePtr
+GstProps *props, xmlNodePtr parent
+
+
+gst_props_load_thyself
+GstProps *
+xmlNodePtr parent
+
+
+GstPropsEntry
+
+
+GstPropsEntry
+struct GstPropsEntry {
+ GQuark propid;
+ GstPropsId propstype;
+
+ union {
+ /* flat values */
+ gboolean bool_data;
+ guint32 fourcc_data;
+ gint int_data;
+
+ /* structured values */
+ struct {
+ GList *entries;
+ } list_data;
+ struct {
+ gint min;
+ gint max;
+ } int_range_data;
+ } data;
+};
+
+
GST_TYPE_ASYNCDISKSRC
#define GST_TYPE_ASYNCDISKSRC \
(gst_asyncdisksrc_get_type())
@@ -2245,7 +2519,7 @@ GstElementFactory *factory
GST_IS_AUDIOSRC_CLASS
#define GST_IS_AUDIOSRC_CLASS(obj) \
- (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIOSRC)))
+ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIOSRC))
GstAudioSrcFlags
@@ -2377,7 +2651,7 @@ void
GST_IS_ESDSINK_CLASS
#define GST_IS_ESDSINK_CLASS(obj) \
- (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_ESDSINK)))
+ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_ESDSINK))
GstEsdSink
@@ -2428,7 +2702,7 @@ void
GST_IS_FAKESINK_CLASS
#define GST_IS_FAKESINK_CLASS(obj) \
- (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_FAKESINK)))
+ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_FAKESINK))
GstFakeSink
@@ -2472,7 +2746,7 @@ void
GST_IS_FAKESRC_CLASS
#define GST_IS_FAKESRC_CLASS(obj) \
- (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_FAKESRC)))
+ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_FAKESRC))
GstFakeSrc
@@ -2516,7 +2790,7 @@ void
GST_IS_FDSINK_CLASS
#define GST_IS_FDSINK_CLASS(obj) \
- (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_FDSINK)))
+ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_FDSINK))
GstFdSink
@@ -2562,7 +2836,7 @@ void
GST_IS_FDSRC_CLASS
#define GST_IS_FDSRC_CLASS(obj) \
- (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_FDSRC)))
+ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_FDSRC))
GstFdSrc
@@ -2614,7 +2888,7 @@ void
GST_IS_HTTPSRC_CLASS
#define GST_IS_HTTPSRC_CLASS(obj) \
- (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_HTTPSRC)))
+ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_HTTPSRC))
GstHttpSrcFlags
@@ -2671,7 +2945,7 @@ void
GST_IS_IDENTITY_CLASS
#define GST_IS_IDENTITY_CLASS(obj) \
- (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_IDENTITY)))
+ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_IDENTITY))
GstIdentity
@@ -2777,7 +3051,7 @@ void
GST_IS_SINESRC_CLASS
#define GST_IS_SINESRC_CLASS(obj) \
- (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_SINESRC)))
+ (GTK_CHECK_CLASS_TYPE((klass),GST_TYPE_SINESRC))
GstSineSrc
diff --git a/docs/gst/gstreamer-sections.txt b/docs/gst/gstreamer-sections.txt
index 372597a03c..a174384068 100644
--- a/docs/gst/gstreamer-sections.txt
+++ b/docs/gst/gstreamer-sections.txt
@@ -30,6 +30,12 @@ gst_init
gst_main
gst_main_quit
DEBUG
+GST_DEBUG_ENABLED
+DEBUG_SET_STRING
+DEBUG_ENTER_STRING
+DEBUG_ENTER
+DEBUG_LEAVE_STRING
+DEBUG_LEAVE
SETUP_STACK
diff --git a/docs/gst/tmpl/gstconnection.sgml b/docs/gst/tmpl/gstconnection.sgml
index 18684738ae..5871a3c1bc 100644
--- a/docs/gst/tmpl/gstconnection.sgml
+++ b/docs/gst/tmpl/gstconnection.sgml
@@ -31,11 +31,3 @@ elements. A connection is typically a bas class for queues.
@Returns:
-
-
-
-
-
-@connection:
-
-
diff --git a/docs/gst/tmpl/gstelement.sgml b/docs/gst/tmpl/gstelement.sgml
index 548466dee7..da1aaf22e2 100644
--- a/docs/gst/tmpl/gstelement.sgml
+++ b/docs/gst/tmpl/gstelement.sgml
@@ -143,6 +143,8 @@ may have.
@GST_ELEMENT_MULTI_IN:
@GST_ELEMENT_THREAD_SUGGESTED:
@GST_ELEMENT_NO_SEEK:
+@GST_ELEMENT_NEW_LOOPFUNC:
+@GST_ELEMENT_COTHREAD_STOPPING:
@@ -174,7 +176,7 @@ describes the element, mostly for the benefit of editors.
@longname:
-@class:
+@klass:
@description:
@version:
@author:
@@ -190,8 +192,7 @@ GstElementDetails struct for the element.
@name:
@type:
@details:
-@src_types:
-@sink_types:
+@padfactories:
@@ -379,24 +380,6 @@ circumstances.
@elementfactory:
-
-
-
-
-
-@elementfactory:
-@id:
-
-
-
-
-
-
-
-@elementfactory:
-@id:
-
-
diff --git a/docs/gst/tmpl/gstpad.sgml b/docs/gst/tmpl/gstpad.sgml
index 0916e37969..460c988f43 100644
--- a/docs/gst/tmpl/gstpad.sgml
+++ b/docs/gst/tmpl/gstpad.sgml
@@ -137,24 +137,6 @@ the function that will be called when a QoS message is sent.
@pull:
-
-
-
-
-
-@pad:
-@Returns:
-
-
-
-
-
-
-
-@pad:
-@id:
-
-
@@ -312,3 +294,8 @@ the function that will be called when a QoS message is sent.
@elements:
+
+
+
+
+
diff --git a/docs/gst/tmpl/gstreamer-unused.sgml b/docs/gst/tmpl/gstreamer-unused.sgml
index 42162c0d59..5b70a5b7d7 100644
--- a/docs/gst/tmpl/gstreamer-unused.sgml
+++ b/docs/gst/tmpl/gstreamer-unused.sgml
@@ -17,6 +17,14 @@
+
+
+
+
+
+@id:
+@sink:
+
@@ -171,13 +179,6 @@
@Returns:
-
-
-
-
-
-@Returns:
-
@@ -185,19 +186,19 @@
@obj:
-
-
-
-
-
-
-
+
@Returns:
+
+
+
+
+
+
@@ -205,6 +206,13 @@
@klass:
+
+
+
+
+
+@Returns:
+
@@ -329,6 +337,14 @@
@pad:
@buf:
+
+
+
+
+
+@id:
+@src:
+
@@ -356,12 +372,6 @@
-
-
-
-
-
-
@@ -369,6 +379,12 @@
@klass:
+
+
+
+
+
+
@@ -403,16 +419,16 @@
@obj:
-
-GstColorSpace
-
-
+
+GstColorSpace
+
+
@@ -471,6 +487,13 @@ GstColorSpace
@obj:
+
+
+
+
+
+@src:
+
@@ -502,6 +525,15 @@ GstGetbits
@obj:
+
+
+
+
+
+@src:
+@offset:
+@size:
+
@@ -703,14 +735,14 @@ This macro unsets the given state on the element.
-
+
@klass:
-
+
@@ -938,6 +970,14 @@ A flag indicating that SSE instructions are supported.
+
+
+
+
+
+@pad:
+@id:
+
@@ -1104,6 +1144,13 @@ This macro checks to see if the given state is set.
@Returns:
+
+
+
+
+
+@connection:
+
@@ -1276,6 +1323,14 @@ Get the size of the current file.
@obj:
+
+
+
+
+
+@elementfactory:
+@id:
+
@@ -1283,6 +1338,14 @@ Get the size of the current file.
@Returns:
+
+
+
+
+
+@pad:
+@Returns:
+
@@ -1366,13 +1429,6 @@ Get the size of the current file.
-
-
-
-
-
-@meta:
-
@@ -1380,6 +1436,13 @@ Get the size of the current file.
@Returns:
+
+
+
+
+
+@meta:
+
@@ -1421,6 +1484,12 @@ Get the size of the current file.
+
+
+
+
+
+
@@ -1428,12 +1497,6 @@ Get the size of the current file.
@obj:
-
-
-
-
-
-
@@ -1511,6 +1574,10 @@ GstElement
@obj:
+
+
+
+
@@ -1518,10 +1585,6 @@ GstElement
@src:
-
-
-
-
@@ -1572,6 +1635,14 @@ GstElement
@fd:
@Returns:
+
+
+
+
+
+@elementfactory:
+@id:
+
@@ -1637,15 +1708,15 @@ GstElement
@name:
@Returns:
-
-
-A flag indicating that MMX instructions are supported.
-
-
-
+
+
+A flag indicating that MMX instructions are supported.
+
+
+
diff --git a/docs/gst/tmpl/gstsrc.sgml b/docs/gst/tmpl/gstsrc.sgml
index cf087070ac..83c82fdab6 100644
--- a/docs/gst/tmpl/gstsrc.sgml
+++ b/docs/gst/tmpl/gstsrc.sgml
@@ -84,24 +84,6 @@ This macro usets the given flags.
@src:
-
-
-
-
-
-@src:
-
-
-
-
-
-
-
-@src:
-@offset:
-@size:
-
-
An eos signal is triggered whenever the GstSrc has reached the end of
diff --git a/docs/gst/tmpl/gsttype.sgml b/docs/gst/tmpl/gsttype.sgml
index ba83cc8229..959ca323db 100644
--- a/docs/gst/tmpl/gsttype.sgml
+++ b/docs/gst/tmpl/gsttype.sgml
@@ -71,7 +71,7 @@ A type
@id:
@mime:
@exts:
-@typefindfunc:
+@typefindfuncs:
@srcs:
@sinks:
@converters:
@@ -112,24 +112,6 @@ The struct with the typefactory information
@Returns:
-
-
-
-
-
-@id:
-@src:
-
-
-
-
-
-
-
-@id:
-@sink:
-
-
diff --git a/gst/elements/gstaudiosink.c b/gst/elements/gstaudiosink.c
index 0a978d1f70..a49b15df46 100644
--- a/gst/elements/gstaudiosink.c
+++ b/gst/elements/gstaudiosink.c
@@ -67,7 +67,10 @@ enum {
/* FILL ME */
};
-static GstCapsFactory audiosink_sink_caps = {
+static GstPadFactory audiosink_sink_factory = {
+ "sink",
+ GST_PAD_FACTORY_SINK,
+ GST_PAD_FACTORY_ALWAYS,
"audio/raw",
"format", GST_PROPS_INT (AFMT_S16_LE),
"depth", GST_PROPS_LIST (
@@ -115,7 +118,7 @@ gst_audiosink_channels_get_type(void) {
static GstSinkClass *parent_class = NULL;
static guint gst_audiosink_signals[LAST_SIGNAL] = { 0 };
-static GstCaps *gst_audiosink_sink_caps = NULL;
+static GstPadTemplate *gst_audiosink_sink_template;
GtkType
gst_audiosink_get_type (void)
@@ -176,9 +179,8 @@ gst_audiosink_class_init (GstAudioSinkClass *klass)
static void
gst_audiosink_init (GstAudioSink *audiosink)
{
- audiosink->sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
+ audiosink->sinkpad = gst_pad_new_from_template (gst_audiosink_sink_template, "sink");
gst_element_add_pad (GST_ELEMENT (audiosink), audiosink->sinkpad);
- gst_pad_set_caps (audiosink->sinkpad, gst_audiosink_sink_caps);
gst_pad_set_chain_function (audiosink->sinkpad, gst_audiosink_chain);
@@ -410,7 +412,8 @@ gst_audiosink_change_state (GstElement *element)
gboolean
gst_audiosink_factory_init (GstElementFactory *factory)
{
- gst_audiosink_sink_caps = gst_caps_register (audiosink_sink_caps);
+ gst_audiosink_sink_template = gst_padtemplate_new (&audiosink_sink_factory);
+ gst_elementfactory_add_padtemplate (factory, gst_audiosink_sink_template);
return TRUE;
}
diff --git a/gst/elements/gsthttpsrc.c b/gst/elements/gsthttpsrc.c
index ff27e7f71f..578da6c4fb 100644
--- a/gst/elements/gsthttpsrc.c
+++ b/gst/elements/gsthttpsrc.c
@@ -122,7 +122,7 @@ static void gst_httpsrc_init(GstHttpSrc *httpsrc) {
httpsrc->bytes_per_read = 4096;
}
-static void gst_httpsrc_push(GstPad *pad) {
+static void gst_httpsrc_pull(GstPad *pad) {
GstHttpSrc *src;
GstBuffer *buf;
glong readbytes;
diff --git a/gst/gstcaps.c b/gst/gstcaps.c
index 80f712f4ca..f51f71b4db 100644
--- a/gst/gstcaps.c
+++ b/gst/gstcaps.c
@@ -45,6 +45,27 @@ get_type_for_mime (gchar *mime)
return typeid;
}
+/**
+ * gst_caps_new:
+ * @mime: the mime type to attach to the capability
+ *
+ * create a new capability with the given mime type
+ *
+ * Returns: a new capability
+ */
+GstCaps*
+gst_caps_new (gchar *mime)
+{
+ GstCaps *caps;
+
+ g_return_val_if_fail (mime != NULL, NULL);
+
+ caps = g_new0 (GstCaps, 1);
+ caps->id = get_type_for_mime (mime);
+
+ return caps;
+}
+
/**
* gst_caps_register:
* @factory: the factory to register
@@ -53,7 +74,7 @@ get_type_for_mime (gchar *mime)
*
* Returns: The registered capability
*/
-GstCaps *
+GstCaps*
gst_caps_register (GstCapsFactory *factory)
{
GstCapsFactoryEntry tag;
diff --git a/gst/gstcaps.h b/gst/gstcaps.h
index 2bf4c0b38c..43339b79e0 100644
--- a/gst/gstcaps.h
+++ b/gst/gstcaps.h
@@ -43,6 +43,7 @@ struct _GstCaps {
/* initialize the subsystem */
void _gst_caps_initialize (void);
+GstCaps* gst_caps_new (gchar *mime);
GstCaps* gst_caps_register (GstCapsFactory *factory);
gboolean gst_caps_check_compatibility (GstCaps *caps1, GstCaps *caps2);
diff --git a/gst/gstelement.h b/gst/gstelement.h
index 1362b2e07d..77ace5c54a 100644
--- a/gst/gstelement.h
+++ b/gst/gstelement.h
@@ -153,7 +153,7 @@ struct _GstElementFactory {
GstElementDetails *details; /* pointer to details struct */
- GList *padfactories;
+ GList *padtemplates;
};
GtkType gst_element_get_type (void);
@@ -196,8 +196,8 @@ GstElementFactory* gst_elementfactory_new (gchar *name,GtkType type,
void gst_elementfactory_register (GstElementFactory *elementfactory);
void gst_elementfactory_unregister (GstElementFactory *elementfactory);
-void gst_elementfactory_add_pad (GstElementFactory *elementfactory,
- GstPadFactory *pad);
+void gst_elementfactory_add_padtemplate (GstElementFactory *elementfactory,
+ GstPadTemplate *pad);
GstElementFactory* gst_elementfactory_find (gchar *name);
GList* gst_elementfactory_get_list (void);
diff --git a/gst/gstelementfactory.c b/gst/gstelementfactory.c
index 8725d16f1f..771f590d52 100644
--- a/gst/gstelementfactory.c
+++ b/gst/gstelementfactory.c
@@ -58,15 +58,15 @@ gst_elementfactory_register (GstElementFactory *elementfactory)
void
gst_elementfactory_unregister (GstElementFactory *factory)
{
- GList *padfactories;
+ GList *padtemplates;
g_return_if_fail (factory != NULL);
- padfactories = factory->padfactories;
+ padtemplates = factory->padtemplates;
- while (padfactories) {
- GstPadFactory *padfactory = (GstPadFactory *)padfactories->data;
- GstCaps *caps = gst_padfactory_get_caps (padfactory);
+ while (padtemplates) {
+ GstPadTemplate *padfactory = (GstPadTemplate *)padtemplates->data;
+ GstCaps *caps = padfactory->caps;
if (caps) {
switch (padfactory->direction) {
@@ -80,7 +80,7 @@ gst_elementfactory_unregister (GstElementFactory *factory)
break;
}
}
- padfactories = g_list_next (padfactories);
+ padtemplates = g_list_next (padtemplates);
}
_gst_elementfactories = g_list_remove (_gst_elementfactories, factory);
@@ -148,7 +148,7 @@ gst_elementfactory_new (gchar *name, GtkType type,
factory->name = g_strdup(name);
factory->type = type;
factory->details = details;
- factory->padfactories = NULL;
+ factory->padtemplates = NULL;
return factory;
}
@@ -224,28 +224,27 @@ gst_elementfactory_make (gchar *factoryname, gchar *name)
}
/**
- * gst_elementfactory_add_pad :
+ * gst_elementfactory_add_padtemplate :
* @elementfactory: factory to add the src id to
- * @pad: the padfactory to add
+ * @template: the padtemplate to add
*
- * Add the given padfactory to this element.
- *
+ * Add the given padtemplate to this elementfactory.
*/
void
-gst_elementfactory_add_pad (GstElementFactory *factory,
- GstPadFactory *padfactory)
+gst_elementfactory_add_padtemplate (GstElementFactory *factory,
+ GstPadTemplate *template)
{
GstCaps *caps;
g_return_if_fail(factory != NULL);
- g_return_if_fail(padfactory != NULL);
+ g_return_if_fail(template != NULL);
- factory->padfactories = g_list_append (factory->padfactories, padfactory);
+ factory->padtemplates = g_list_append (factory->padtemplates, template);
- caps = gst_padfactory_get_caps (padfactory);
+ caps = template->caps;
if (caps) {
- switch (padfactory->direction) {
+ switch (template->direction) {
case GST_PAD_SRC:
_gst_type_add_src (caps->id, factory);
break;
@@ -282,14 +281,14 @@ gst_elementfactory_save_thyself (GstElementFactory *factory,
xmlNewChild(parent,NULL,"author", factory->details->author);
xmlNewChild(parent,NULL,"copyright", factory->details->copyright);
- pads = factory->padfactories;
+ pads = factory->padtemplates;
if (pads) {
while (pads) {
xmlNodePtr subtree;
- GstPadFactory *padfactory = (GstPadFactory *)pads->data;
+ GstPadTemplate *padtemplate = (GstPadTemplate *)pads->data;
- subtree = xmlNewChild(parent, NULL, "padfactory", NULL);
- gst_padfactory_save_thyself(padfactory, subtree);
+ subtree = xmlNewChild(parent, NULL, "padtemplate", NULL);
+ gst_padtemplate_save_thyself(padtemplate, subtree);
pads = g_list_next (pads);
}
@@ -311,7 +310,7 @@ gst_elementfactory_load_thyself (xmlNodePtr parent)
GstElementFactory *factory = g_new0(GstElementFactory, 1);
xmlNodePtr children = parent->childs;
factory->details = g_new0(GstElementDetails, 1);
- factory->padfactories = NULL;
+ factory->padtemplates = NULL;
while (children) {
if (!strcmp(children->name, "name")) {
@@ -335,12 +334,12 @@ gst_elementfactory_load_thyself (xmlNodePtr parent)
if (!strcmp(children->name, "copyright")) {
factory->details->copyright = g_strdup(xmlNodeGetContent(children));
}
- if (!strcmp(children->name, "padfactory")) {
- GstPadFactory *padfactory;
+ if (!strcmp(children->name, "padtemplate")) {
+ GstPadTemplate *template;
- padfactory = gst_padfactory_load_thyself (children);
+ template = gst_padtemplate_load_thyself (children);
- gst_elementfactory_add_pad (factory, padfactory);
+ gst_elementfactory_add_padtemplate (factory, template);
}
children = children->next;
diff --git a/gst/gstpad.c b/gst/gstpad.c
index 779a4d6493..d8cf3c62cf 100644
--- a/gst/gstpad.c
+++ b/gst/gstpad.c
@@ -175,6 +175,31 @@ gst_pad_new (gchar *name,
pad = GST_PAD (gtk_type_new (gst_pad_get_type ()));
pad->name = g_strdup (name);
pad->direction = direction;
+
+ return pad;
+}
+
+/**
+ * gst_pad_new_from_template:
+ * @temp: the pad template to use
+ * @name: the name of the element
+ *
+ * Create a new pad with given name from the given template.
+ *
+ * Returns: new pad
+ */
+GstPad*
+gst_pad_new_from_template (GstPadTemplate *temp,
+ gchar *name)
+{
+ GstPad *pad;
+
+ g_return_val_if_fail (name != NULL, NULL);
+ g_return_val_if_fail (temp != NULL, NULL);
+
+ pad = gst_pad_new (name, temp->direction);
+ pad->caps = temp->caps;
+
return pad;
}
@@ -848,73 +873,65 @@ gst_pad_ghost_save_thyself (GstPad *pad,
return self;
}
-/**
- * gst_padfactory_create:
- * @factory: the pad factory
- * @name: the name of the new pad
- *
- * crrates a new pad form the given factory
- *
- * Returns: the new pad;
- */
-GstPad*
-gst_padfactory_create (GstPadFactory *factory,
- gchar *name)
+GstPadTemplate*
+gst_padtemplate_new (GstPadFactory *factory)
{
- GstPad *newpad;
- GstCaps *caps;
+ GstPadTemplate *new;
+ GstPadFactoryEntry tag;
+ gint i = 0;
- newpad = gst_pad_new (name, factory->direction);
+ g_return_val_if_fail (factory != NULL, NULL);
- caps = gst_padfactory_get_caps (factory);
+ new = g_new0 (GstPadTemplate, 1);
- gst_pad_set_caps (newpad, caps);
+ tag = (*factory)[i++];
+ g_return_val_if_fail (tag != NULL, new);
+ new->name_template = g_strdup ((gchar *)tag);
- return newpad;
+ tag = (*factory)[i++];
+ new->direction = GPOINTER_TO_UINT (tag);
+
+ tag = (*factory)[i++];
+ new->presence = GPOINTER_TO_UINT (tag);
+
+ new->caps = gst_caps_register ((GstCapsFactory *)&(*factory)[i]);
+
+ return new;
}
-GstCaps*
-gst_padfactory_get_caps (GstPadFactory *factory)
+GstPadTemplate*
+gst_padtemplate_create (gchar *name_template,
+ GstPadDirection direction, GstPadPresence presence,
+ GstCaps *caps, ...)
{
- if (factory->priv) {
- return (GstCaps *) factory->priv;
- }
- else if (factory->caps) {
- GstCaps *caps;
-
- caps = gst_caps_register (factory->caps);
-
- factory->priv = caps;
-
- return caps;
- }
- else return NULL;
+ return NULL;
}
+
xmlNodePtr
-gst_padfactory_save_thyself (GstPadFactory *pad, xmlNodePtr parent)
+gst_padtemplate_save_thyself (GstPadTemplate *pad, xmlNodePtr parent)
{
xmlNodePtr subtree;
- xmlNewChild(parent,NULL,"nametemplate", pad->nametemplate);
+ xmlNewChild(parent,NULL,"nametemplate", pad->name_template);
xmlNewChild(parent,NULL,"direction", (pad->direction == GST_PAD_SINK? "sink":"src"));
xmlNewChild(parent,NULL,"presence", (pad->presence == GST_PAD_ALWAYS? "always":"sometimes"));
subtree = xmlNewChild(parent,NULL,"caps", NULL);
- gst_caps_save_thyself (gst_padfactory_get_caps (pad), subtree);
+ gst_caps_save_thyself (pad->caps, subtree);
return parent;
}
-GstPadFactory*
-gst_padfactory_load_thyself (xmlNodePtr parent)
+GstPadTemplate*
+gst_padtemplate_load_thyself (xmlNodePtr parent)
{
xmlNodePtr field = parent->childs;
- GstPadFactory *factory = g_new0 (GstPadFactory, 1);
+ GstPadTemplate *factory = g_new0 (GstPadTemplate, 1);
while (field) {
if (!strcmp(field->name, "nametemplate")) {
- factory->nametemplate = g_strdup(xmlNodeGetContent(field));
+ factory->name_template = g_strdup(xmlNodeGetContent(field));
}
if (!strcmp(field->name, "direction")) {
gchar *value = xmlNodeGetContent(field);
@@ -938,7 +955,7 @@ gst_padfactory_load_thyself (xmlNodePtr parent)
}
}
else if (!strcmp(field->name, "caps")) {
- factory->priv = gst_caps_load_thyself (field);
+ factory->caps = gst_caps_load_thyself (field);
}
field = field->next;
}
diff --git a/gst/gstpad.h b/gst/gstpad.h
index 5c6476bd37..f718106eeb 100644
--- a/gst/gstpad.h
+++ b/gst/gstpad.h
@@ -103,22 +103,30 @@ typedef enum {
GST_PAD_SOMETIMES,
} GstPadPresence;
-typedef struct _GstPadFactory GstPadFactory;
+typedef struct _GstPadTemplate GstPadTemplate;
-/* factory */
-struct _GstPadFactory {
- gchar *nametemplate;
- GstCapsFactory *caps;
+/* template */
+struct _GstPadTemplate {
+ gchar *name_template;
GstPadDirection direction;
GstPadPresence presence;
- gpointer priv;
+ GstCaps *caps;
};
+/* factory */
+typedef gpointer GstPadFactoryEntry;
+typedef GstPadFactoryEntry GstPadFactory[];
+#define GST_PAD_FACTORY_ALWAYS GINT_TO_POINTER(GST_PAD_ALWAYS)
+#define GST_PAD_FACTORY_SOMETIMES GINT_TO_POINTER(GST_PAD_SOMETIMES)
+
+#define GST_PAD_FACTORY_SRC GINT_TO_POINTER(GST_PAD_SRC)
+#define GST_PAD_FACTORY_SINK GINT_TO_POINTER(GST_PAD_SINK)
GtkType gst_pad_get_type (void);
GstPad* gst_pad_new (gchar *name, GstPadDirection direction);
#define gst_pad_destroy(pad) gst_object_destroy (GST_OBJECT (pad))
+GstPad* gst_pad_new_from_template (GstPadTemplate *temp, gchar *name);
GstPadDirection gst_pad_get_direction (GstPad *pad);
@@ -154,12 +162,13 @@ void gst_pad_load_and_connect (xmlNodePtr parent, GstObject *element, GHashTa
/* factory */
-GstPad* gst_padfactory_create (GstPadFactory *factory, gchar *name);
+GstPadTemplate* gst_padtemplate_new (GstPadFactory *factory);
+GstPadTemplate* gst_padtemplate_create (gchar *name_template,
+ GstPadDirection direction, GstPadPresence presence,
+ GstCaps *caps, ...);
-GstCaps* gst_padfactory_get_caps (GstPadFactory *factory);
-
-xmlNodePtr gst_padfactory_save_thyself (GstPadFactory *pad, xmlNodePtr parent);
-GstPadFactory* gst_padfactory_load_thyself (xmlNodePtr parent);
+xmlNodePtr gst_padtemplate_save_thyself (GstPadTemplate *pad, xmlNodePtr parent);
+GstPadTemplate* gst_padtemplate_load_thyself (xmlNodePtr parent);
#ifdef __cplusplus
}
diff --git a/gst/gsttype.c b/gst/gsttype.c
index 7534c8ba92..08d4209235 100644
--- a/gst/gsttype.c
+++ b/gst/gsttype.c
@@ -266,28 +266,26 @@ gst_type_handle_src (guint16 id, GstElementFactory *src, gboolean remove)
g_return_if_fail (type != NULL);
g_return_if_fail (src != NULL);
- g_print ("gsttype: handle src \"%s\" %d\n", src->name, remove);
-
if (remove)
type->srcs = g_list_remove (type->srcs, src);
else
type->srcs = g_list_prepend (type->srcs, src);
// find out if the element has to be indexed in the matrix
- walk = src->padfactories;
+ walk = src->padtemplates;
while (walk) {
- GstPadFactory *factory;
+ GstPadTemplate *template;
- factory = (GstPadFactory *) walk->data;
+ template = (GstPadTemplate *) walk->data;
- if (factory->direction == GST_PAD_SINK) {
+ if (template->direction == GST_PAD_SINK) {
GstType *type2;
GList *converters;
GList *orig;
GstCaps *caps;
- caps = gst_padfactory_get_caps (factory);
+ caps = template->caps;
if (caps)
type2 = gst_type_find_by_id (caps->id);
@@ -353,28 +351,26 @@ gst_type_handle_sink (guint16 id, GstElementFactory *sink, gboolean remove)
g_return_if_fail (type != NULL);
g_return_if_fail (sink != NULL);
- g_print ("gsttype: handle sink \"%s\" %d\n", sink->name, remove);
-
if (remove)
type->sinks = g_list_remove (type->sinks, sink);
else
type->sinks = g_list_prepend (type->sinks, sink);
// find out if the element has to be indexed in the matrix
- walk = sink->padfactories;
+ walk = sink->padtemplates;
while (walk) {
- GstPadFactory *factory;
+ GstPadTemplate *template;
- factory = (GstPadFactory *) walk->data;
+ template = (GstPadTemplate *) walk->data;
- if (factory->direction == GST_PAD_SRC) {
+ if (template->direction == GST_PAD_SRC) {
guint16 id2;
GList *converters;
GList *orig;
GstCaps *caps;
- caps = gst_padfactory_get_caps (factory);
+ caps = template->caps;
if (caps)
id2 = caps->id;
diff --git a/plugins/elements/gstaudiosink.c b/plugins/elements/gstaudiosink.c
index 0a978d1f70..a49b15df46 100644
--- a/plugins/elements/gstaudiosink.c
+++ b/plugins/elements/gstaudiosink.c
@@ -67,7 +67,10 @@ enum {
/* FILL ME */
};
-static GstCapsFactory audiosink_sink_caps = {
+static GstPadFactory audiosink_sink_factory = {
+ "sink",
+ GST_PAD_FACTORY_SINK,
+ GST_PAD_FACTORY_ALWAYS,
"audio/raw",
"format", GST_PROPS_INT (AFMT_S16_LE),
"depth", GST_PROPS_LIST (
@@ -115,7 +118,7 @@ gst_audiosink_channels_get_type(void) {
static GstSinkClass *parent_class = NULL;
static guint gst_audiosink_signals[LAST_SIGNAL] = { 0 };
-static GstCaps *gst_audiosink_sink_caps = NULL;
+static GstPadTemplate *gst_audiosink_sink_template;
GtkType
gst_audiosink_get_type (void)
@@ -176,9 +179,8 @@ gst_audiosink_class_init (GstAudioSinkClass *klass)
static void
gst_audiosink_init (GstAudioSink *audiosink)
{
- audiosink->sinkpad = gst_pad_new ("sink", GST_PAD_SINK);
+ audiosink->sinkpad = gst_pad_new_from_template (gst_audiosink_sink_template, "sink");
gst_element_add_pad (GST_ELEMENT (audiosink), audiosink->sinkpad);
- gst_pad_set_caps (audiosink->sinkpad, gst_audiosink_sink_caps);
gst_pad_set_chain_function (audiosink->sinkpad, gst_audiosink_chain);
@@ -410,7 +412,8 @@ gst_audiosink_change_state (GstElement *element)
gboolean
gst_audiosink_factory_init (GstElementFactory *factory)
{
- gst_audiosink_sink_caps = gst_caps_register (audiosink_sink_caps);
+ gst_audiosink_sink_template = gst_padtemplate_new (&audiosink_sink_factory);
+ gst_elementfactory_add_padtemplate (factory, gst_audiosink_sink_template);
return TRUE;
}
diff --git a/plugins/elements/gsthttpsrc.c b/plugins/elements/gsthttpsrc.c
index ff27e7f71f..578da6c4fb 100644
--- a/plugins/elements/gsthttpsrc.c
+++ b/plugins/elements/gsthttpsrc.c
@@ -122,7 +122,7 @@ static void gst_httpsrc_init(GstHttpSrc *httpsrc) {
httpsrc->bytes_per_read = 4096;
}
-static void gst_httpsrc_push(GstPad *pad) {
+static void gst_httpsrc_pull(GstPad *pad) {
GstHttpSrc *src;
GstBuffer *buf;
glong readbytes;